diff --git a/.prettierignore b/.prettierignore index d001e1440..f1efec296 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,6 +6,7 @@ pnpm-lock.yaml /packages/app-builder/.cache/ /packages/app-builder/build/ /packages/app-builder/public/build/ +/packages/app-builder/public/img/ /packages/app-builder/src/utils/routes/routes.ts # marble-api diff --git a/packages/app-builder/.env.local b/packages/app-builder/.env.local index a127ff3d6..42bbf939d 100644 --- a/packages/app-builder/.env.local +++ b/packages/app-builder/.env.local @@ -4,8 +4,8 @@ NODE_ENV=development SESSION_SECRET=SESSION_SECRET SESSION_MAX_AGE=43200 -MARBLE_API_DOMAIN=http://127.0.0.1:8080 -MARBLE_APP_DOMAIN=http://127.0.0.1:3000 +MARBLE_API_DOMAIN=http://localhost:8080 +MARBLE_APP_DOMAIN=http://localhost:3000 FIREBASE_AUTH_EMULATOR=true FIREBASE_AUTH_EMULATOR_HOST=http://localhost:9099 diff --git a/packages/app-builder/README.md b/packages/app-builder/README.md index b8fedd852..47f269786 100644 --- a/packages/app-builder/README.md +++ b/packages/app-builder/README.md @@ -52,7 +52,7 @@ Then, it depends on the use case. For simple cases, you can directly consume the ```typescript const { apiClient } = await authenticator.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const decisions = await apiClient.listDecisions(); diff --git a/packages/app-builder/package.json b/packages/app-builder/package.json index 73b8726f3..290d22781 100644 --- a/packages/app-builder/package.json +++ b/packages/app-builder/package.json @@ -41,6 +41,7 @@ "@conform-to/zod": "^0.9.1", "@hookform/devtools": "^4.3.1", "@hookform/resolvers": "^3.3.4", + "@lottiefiles/react-lottie-player": "^3.5.3", "@radix-ui/react-accordion": "^1.1.2", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-checkbox": "^1.0.4", diff --git a/packages/app-builder/public/img/login_background.svg b/packages/app-builder/public/img/login_background.svg deleted file mode 100644 index 6b1ff4732..000000000 --- a/packages/app-builder/public/img/login_background.svg +++ /dev/null @@ -1,2573 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/app-builder/public/img/lottie/login_hero.json b/packages/app-builder/public/img/lottie/login_hero.json new file mode 100644 index 000000000..e2b015feb --- /dev/null +++ b/packages/app-builder/public/img/lottie/login_hero.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"krikrak","k":"","d":"hero contrast","tc":""},"fr":30,"ip":0,"op":900,"w":640,"h":580,"nm":"anim-hero","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Decline","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Bold","t":"Decline","j":2,"tr":0,"lh":15.6,"ls":0,"fc":[0.824,0.216,0.118]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[216,20,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":[80,30]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.21568627451,0.117647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Review","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Bold","t":"Review","j":2,"tr":0,"lh":15.6,"ls":0,"fc":[0.973,0.729,0.012]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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":[80,30]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549021244,0.729411780834,0.011764706112,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":5,"nm":"Approved","parent":6,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Bold","t":"Approved","j":2,"tr":0,"lh":15.6,"ls":0,"fc":[0.078,0.667,0.373]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[40,20,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":[80,30]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":20},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078431372549,0.666666666667,0.372549019608,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":901,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Status OUTRO","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":290,"op":381,"st":290,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Status CCR-NOK","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":180,"op":301,"st":180,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Status IP-NOK","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":100,"op":191,"st":100,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Status LTA-MID","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":20,"op":111,"st":20,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Status INTRO","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":0,"op":41,"st":-80,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Initialize...","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":10,"s":[30]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"t":10,"s":[20]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,100]},{"t":10,"s":[100,100,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Bold","t":"Initialize...","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":0,"k":[0.035294119269,0.027450980619,0.215686276555,1]}}}]},"ip":0,"op":91,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToError","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[20]},{"t":120,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":110,"s":[100,100,100]},{"t":120,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Check Credit Rating","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[100]},{"t":120,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[20]},{"t":120,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":110,"s":[100,100,100]},{"t":120,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Check Credit Rating","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]}}}]},"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[10]},{"t":120,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,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","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4,-4],[4,4]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[4,-4],[-4,4]],"c":false}},"nm":"Path 2","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":15,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"t":10,"s":[16,16]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529411765,0.21568627451,0.117647058824,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_5","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToError","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Black Listed IP","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Regular","t":"Black Listed IP","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]}}}]},"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[10]},{"t":90,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0}]},{"id":"comp_6","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToReview","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Large Transaction Amount 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Large Transaction Amount","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]}}}]},"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[10]},{"t":90,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0}]},{"id":"comp_7","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,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","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,3],[0,4.938]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-5.062],[0,1]],"c":false}},"nm":"Path 2","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":15,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1.671,1.671]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"t":10,"s":[16,16]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549021244,0.729411780834,0.011764706112,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_8","layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Initialize...","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[30]},{"t":110,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":100,"s":[20]},{"t":110,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":100,"s":[100,100,100]},{"t":110,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Bold","t":"Initialize...","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":0,"k":[0.035294119269,0.027450980619,0.215686276555,1]}}}]},"ip":0,"op":121,"st":0,"bm":0}]},{"id":"comp_9","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Status OUTRO","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":260,"op":351,"st":260,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Status CCR-OK","refId":"comp_10","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":180,"op":301,"st":180,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Status IP-OK","refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":100,"op":191,"st":100,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Status LTA-MID","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":20,"op":111,"st":20,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Status INTRO","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":0,"op":41,"st":-80,"bm":0}]},{"id":"comp_10","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToValide","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Check Credit Rating","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Check Credit Rating","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]}}}]},"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[10]},{"t":90,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0}]},{"id":"comp_11","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,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","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-4.938,-0.688],[-1.188,2.812],[4.938,-2.875]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":5,"s":[0]},{"t":15,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[20,20,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"t":10,"s":[16,16]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078431375325,0.666666686535,0.372549027205,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_12","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToValide","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Black Listed IP","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Black Listed IP","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]}}}]},"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[10]},{"t":90,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0}]},{"id":"comp_13","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Status OUTRO","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":290,"op":381,"st":290,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Status CCR-MID","refId":"comp_14","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":180,"op":301,"st":180,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Status IP-NOK","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":100,"op":191,"st":100,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Status LTA-OK","refId":"comp_15","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":20,"op":111,"st":20,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Status INTRO","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":0,"op":41,"st":-80,"bm":0}]},{"id":"comp_14","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToReview","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[20]},{"t":120,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":110,"s":[100,100,100]},{"t":120,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Check Credit Rating","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[100]},{"t":120,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[20]},{"t":120,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":110,"s":[100,100,100]},{"t":120,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Check Credit Rating","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]}}}]},"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":110,"s":[10]},{"t":120,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":110,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":120,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.972549080849,0.729411780834,0.011764707044,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":121,"st":0,"bm":0}]},{"id":"comp_15","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"MiniStatus-ToValide","refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":233.5},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[0]}]}},"a":{"a":0,"k":[20,20,0]},"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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"w":40,"h":40,"ip":40,"op":340,"st":40,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Large Transaction Amount 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[100]},{"t":90,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":128},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[20]},{"t":90,"s":[10]}]}},"a":{"a":0,"k":[0,-1,0]},"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]},"t":0,"s":[100,0,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]},"t":10,"s":[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]},"t":80,"s":[100,100,100]},{"t":90,"s":[100,0,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"sz":[235.25,16.25],"ps":[-118.25,-8.125],"s":14,"f":"JetBrainsMonoRoman-Medium","t":"Large Transaction Amount","j":0,"tr":0,"lh":16.8,"ls":-2,"fc":[0.031,0.024,0.176]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"k":0},"ne":{"k":0},"a":{"k":100},"b":1,"sh":0,"s":{"k":0},"e":{"k":100},"o":{"k":0}},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.031372550875,0.023529412225,0.176470592618,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]}}}]},"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line ->","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-128,-20.125],[-128,19.875]],"c":true}]},{"t":45,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[128,-20.125],[128,19.875]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[2]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[16]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[16]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941185236,0.313725501299,0.980392158031,1]},"o":{"a":0,"k":20},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[8]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[8]},{"t":45,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 3","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Back 3D 2","sr":1,"ks":{"o":{"a":0,"k":15},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128,-20],[-128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[10]},{"t":90,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[128,20,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,20],[98,20],[-98,20],[-128,20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[98,-20],[128,-20],[-128,-20],[-98,-20]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":0},"hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":55,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":91,"st":0,"bm":0}]},{"id":"comp_16","layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Line 2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[25,10,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","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[-25,0]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[25,0]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":270,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[25,0]],"c":false}]},{"t":284,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[25,0],[25,0]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.321568638086,0.282352954149,0.956862747669,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":3}},{"n":"g","nm":"gap","v":{"a":0,"k":45}},{"n":"o","nm":"offset","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[80]},{"t":284,"s":[-160]}]}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Line","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[25,10,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","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[-25,0]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[25,0]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":270,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-25,0],[25,0]],"c":false}]},{"t":284,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[25,0],[25,0]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":2}},{"n":"g","nm":"gap","v":{"a":0,"k":6}},{"n":"o","nm":"offset","v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[80]},{"t":284,"s":[-160]}]}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"BackLine","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[25,10,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","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25,0],[25,0],[-25,0],[-25,0]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25,-10],[25,10],[-25,10],[-25,-10]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":270,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25,-10],[25,10],[-25,10],[-25,-10]],"c":true}]},{"t":284,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[25,0],[25,0],[-25,0],[-25,0]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[10]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":270,"s":[10]},{"t":284,"s":[0]}]},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_17","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--Item-Out--01","refId":"comp_18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":39,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[150]},{"t":39,"s":[65]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"ItemList--Item-Out--02","refId":"comp_20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":34.2001953125,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[235]},{"t":34.2001953125,"s":[150]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"ItemList--Item--03","refId":"comp_21","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":29.400390625,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[320]},{"t":29.400390625,"s":[235]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"t":24.599609375,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[405]},{"t":24.599609375,"s":[320]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[10]},{"t":19.7998046875,"s":[25]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[490]},{"t":19.7998046875,"s":[405]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":15,"s":[10]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[575]},{"t":15,"s":[490]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_18","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.972549019608,0.729411764706,0.011764705882,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Transaction #8762","ln":"8762","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #8762","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Need Manual Review","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,51,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Need Manual Review","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.973,0.729,0.012]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_19","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Bank Icon","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[35,35,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":[2,8]},"p":{"a":0,"k":[-4,0]},"r":{"a":0,"k":0},"nm":"Col-Right","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Col-Center","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,8]},"p":{"a":0,"k":[4,0]},"r":{"a":0,"k":0},"nm":"Col-Left","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 2","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.011,2]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Columns","bm":0,"hd":false},{"ty":"gr","it":[{"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":[[0,-10],[-11,-2],[11,-2]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":3},"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 2","bm":0,"hd":false},{"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,6],[-7,6],[-10,10],[10,10]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":4},"hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":40},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_20","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.078431372549,0.666666666667,0.372549019608,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Transaction #5733","ln":"5733","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #5733","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Validated","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,51,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Validated","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.078,0.667,0.373]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_21","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Skeleton","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,0]},"a":{"a":0,"k":[0,0,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.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[40,40]},{"t":10,"s":[0,0]}]},"p":{"a":0,"k":[-100,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":3,"s":[160,15]},{"t":13,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[20,-12],"to":[13.333,0],"ti":[-13.333,0]},{"t":13,"s":[100,-12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":6,"s":[120,15]},{"t":16,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[0,12],"to":[16.667,0],"ti":[-16.667,0]},{"t":16,"s":[100,12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.706,0.706,0.706,0.234,0.815,0.815,0.815,0.468,0.924,0.924,0.924,0.734,0.815,0.815,0.815,1,0.706,0.706,0.706]}},"s":{"a":0,"k":[-143,-35]},"e":{"a":0,"k":[-286,35]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Transaction #9876","ln":"9876","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #9876","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Declined","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[0]},{"t":265,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[30]},{"t":265,"s":[51]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Declined","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.824,0.216,0.118]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Processing...","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[30]},{"t":265,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[51]},{"t":265,"s":[63]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Processing...","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"i":{"x":[0.761,0.761],"y":[1,1]},"o":{"x":[0.161,0.161],"y":[0,0]},"t":15,"s":[40,40]},{"i":{"x":[0,0],"y":[12.152,12.152]},"o":{"x":[1,1],"y":[-13.257,-13.257]},"t":255,"s":[40,40]},{"t":265,"s":[40,40]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":258,"s":[1,1,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":260,"s":[0.823529422283,0.215686276555,0.117647059262,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":262,"s":[1,1,1,1]},{"t":265,"s":[0.823529422283,0.215686276555,0.117647059262,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_22","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Skeleton","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[-100,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[160,15]},"p":{"a":0,"k":[20,-12]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[120,15]},"p":{"a":0,"k":[0,12]},"r":{"a":0,"k":15},"nm":"Rectangle Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.706,0.706,0.706,0.234,0.815,0.815,0.815,0.468,0.924,0.924,0.924,0.734,0.815,0.815,0.815,1,0.706,0.706,0.706]}},"s":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-143,-35],"to":[95.333,0],"ti":[-95.333,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[429,-35],"to":[0,0],"ti":[0,0]},{"t":90,"s":[429,-35]}],"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"e":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-286,35],"to":[71.5,0],"ti":[-71.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[143,35],"to":[0,0],"ti":[0,0]},{"t":90,"s":[143,35]}],"x":"var $bm_rt;\n$bm_rt = loopOut('cycle');"},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_23","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--Item-Out--03","refId":"comp_24","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":39,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[150]},{"t":39,"s":[65]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"ItemList--Item-Out--01","refId":"comp_18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":34.2001953125,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[235]},{"t":34.2001953125,"s":[150]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"ItemList--Item--02","refId":"comp_25","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":29.400390625,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[320]},{"t":29.400390625,"s":[235]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"t":24.599609375,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[405]},{"t":24.599609375,"s":[320]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[10]},{"t":19.7998046875,"s":[25]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[490]},{"t":19.7998046875,"s":[405]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":15,"s":[10]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[575]},{"t":15,"s":[490]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_24","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[40,40]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.215686276555,0.117647059262,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Transaction #9876","ln":"9876","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #9876","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Declined","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,51,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Declined","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.824,0.216,0.118]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_25","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Skeleton","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,0]},"a":{"a":0,"k":[0,0,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.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[40,40]},{"t":10,"s":[0,0]}]},"p":{"a":0,"k":[-100,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":3,"s":[160,15]},{"t":13,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[20,-12],"to":[13.333,0],"ti":[-13.333,0]},{"t":13,"s":[100,-12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":6,"s":[120,15]},{"t":16,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[0,12],"to":[16.667,0],"ti":[-16.667,0]},{"t":16,"s":[100,12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.706,0.706,0.706,0.234,0.815,0.815,0.815,0.468,0.924,0.924,0.924,0.734,0.815,0.815,0.815,1,0.706,0.706,0.706]}},"s":{"a":0,"k":[-143,-35]},"e":{"a":0,"k":[-286,35]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Transaction #5733","ln":"5733","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #5733","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Validated","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[0]},{"t":265,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[30]},{"t":265,"s":[51]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Validated","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.078,0.667,0.373]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Processing...","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[30]},{"t":265,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":255,"s":[51]},{"t":265,"s":[63]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Processing...","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"i":{"x":[0.761,0.761],"y":[1,1]},"o":{"x":[0.161,0.161],"y":[0,0]},"t":15,"s":[40,40]},{"i":{"x":[0,0],"y":[12.152,12.152]},"o":{"x":[1,1],"y":[-13.257,-13.257]},"t":255,"s":[40,40]},{"t":265,"s":[40,40]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":265,"s":[0.078431375325,0.666666686535,0.372549027205,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Win Efffect","refId":"comp_26","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[42.5,35,0]},"a":{"a":0,"k":[40,40,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":80,"h":80,"ip":255,"op":286,"st":255,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_26","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[40,40,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","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0.25],[17.25,-26.375]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0.25],[0,-31.375]],"c":false}},"nm":"Path 11","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[-16.125,-26.75]],"c":false}},"nm":"Path 2","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[-28.25,-14.75]],"c":false}},"nm":"Path 3","hd":false},{"ind":4,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[-31.875,0]],"c":false}},"nm":"Path 12","hd":false},{"ind":5,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[-28.125,13.5]],"c":false}},"nm":"Path 4","hd":false},{"ind":6,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[-18.125,28.125]],"c":false}},"nm":"Path 5","hd":false},{"ind":7,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[0,31.5]],"c":false}},"nm":"Path 6","hd":false},{"ind":8,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[16,28]],"c":false}},"nm":"Path 7","hd":false},{"ind":9,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[28.75,14.75]],"c":false}},"nm":"Path 8","hd":false},{"ind":10,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[31.875,0]],"c":false}},"nm":"Path 9","hd":false},{"ind":11,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,0],[27.875,-13.125]],"c":false}},"nm":"Path 10","hd":false},{"ty":"st","c":{"a":0,"k":[0.078431372549,0.666666666667,0.372549019608,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":3},"lc":2,"lj":2,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":2}},{"n":"g","nm":"gap","v":{"a":0,"k":10}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":30,"s":[100]}]},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10,"s":[0]},{"t":30,"s":[100]}]},"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":30,"s":[180]}]},"m":1,"nm":"Trim Paths 1","hd":false}],"ip":0,"op":31,"st":0,"bm":0}]},{"id":"comp_27","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"ItemList--Item-Out--02","refId":"comp_20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":39,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[120]},{"t":39,"s":[35]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":40,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"ItemList--Item-Out--03","refId":"comp_24","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[100]},{"t":34.2001953125,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[205]},{"t":34.2001953125,"s":[120]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"ItemList--Item--01","refId":"comp_28","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50]},{"t":29.400390625,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[290]},{"t":29.400390625,"s":[205]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[25]},{"t":24.599609375,"s":[50]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[375]},{"t":24.599609375,"s":[290]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[10]},{"t":19.7998046875,"s":[25]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[460]},{"t":19.7998046875,"s":[375]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"ItemList--Skeleton","refId":"comp_22","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"t":15,"s":[10]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":143},"y":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[545]},{"t":15,"s":[460]}]}},"a":{"a":0,"k":[143,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":70,"ip":0,"op":300,"st":0,"bm":0}]},{"id":"comp_28","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Skeleton","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,0]},"a":{"a":0,"k":[0,0,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.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[40,40]},{"t":10,"s":[0,0]}]},"p":{"a":0,"k":[-100,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":3,"s":[160,15]},{"t":13,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[20,-12],"to":[13.333,0],"ti":[-13.333,0]},{"t":13,"s":[100,-12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":6,"s":[120,15]},{"t":16,"s":[0,15]}]},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[0,12],"to":[16.667,0],"ti":[-16.667,0]},{"t":16,"s":[100,12]}]},"r":{"a":0,"k":15},"nm":"Rectangle Path 2","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":5,"k":{"a":0,"k":[0,0.706,0.706,0.706,0.234,0.815,0.815,0.815,0.468,0.924,0.924,0.924,0.734,0.815,0.815,0.815,1,0.706,0.706,0.706]}},"s":{"a":0,"k":[-143,-35]},"e":{"a":0,"k":[-286,35]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Transaction #8762","ln":"8762","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[84.75,29,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Transaction #8762","j":0,"tr":0,"lh":18,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":5,"nm":"Need Manual Review","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":260,"s":[0]},{"t":270,"s":[100]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":260,"s":[30]},{"t":270,"s":[51]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Need Manual Review","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.973,0.729,0.012]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":5,"nm":"Processing...","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":260,"s":[30]},{"t":270,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":84.75},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":260,"s":[51]},{"t":270,"s":[63]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"JetBrainsMonoRoman-Medium","t":"Processing...","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.035,0.027,0.216]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"ItemList--IconBank","refId":"comp_19","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[35,35,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":70,"h":70,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Base Circle","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[43,35,0]},"a":{"a":0,"k":[0,0,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,0],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":0,"s":[0,0]},{"i":{"x":[0.761,0.761],"y":[1,1]},"o":{"x":[0.161,0.161],"y":[0,0]},"t":15,"s":[40,40]},{"i":{"x":[0,0],"y":[12.152,12.152]},"o":{"x":[1,1],"y":[-13.257,-13.257]},"t":260,"s":[40,40]},{"t":270,"s":[40,40]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":260,"s":[0.352941176471,0.313725490196,0.980392156863,1]},{"t":270,"s":[0.972549021244,0.729411780834,0.011764706112,1]}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[143,35,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":[286,70]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0}]}],"fonts":{"list":[{"fName":"JetBrainsMonoRoman-Medium","fFamily":"JetBrains Mono","fStyle":"Regular","ascent":72.9995727539062},{"fName":"JetBrainsMonoRoman-Bold","fFamily":"JetBrains Mono","fStyle":"Regular","ascent":72.9995727539062},{"fName":"JetBrainsMonoRoman-Regular","fFamily":"JetBrains Mono","fStyle":"Regular","ascent":72.9995727539062},{"fName":"JetBrainsMonoRoman-SemiBold","fFamily":"JetBrains Mono","fStyle":"Regular","ascent":72.9995727539062}]},"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Labels","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,443,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Cadre","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,204,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","ks":{"a":0,"k":{"i":[[0,0],[0,3],[-2.906,0],[0,0]],"o":[[0,0],[0,-3],[2.906,0],[0,0]],"v":[[-128,-10.625],[-128,-15],[-123,-20],[-118.625,-20]],"c":false}},"nm":"Path 1","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[3,0],[0,2.906],[0,0]],"o":[[0,0],[-3,0],[0,-2.906],[0,0]],"v":[[-118.625,19.938],[-123,19.938],[-128,14.938],[-128,10.562]],"c":false}},"nm":"Path 2","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,-3],[2.906,0],[0,0]],"o":[[0,0],[0,3],[-2.906,0],[0,0]],"v":[[128.062,10.562],[128.062,14.938],[123.062,19.938],[118.688,19.938]],"c":false}},"nm":"Path 3","hd":false},{"ind":3,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3,0],[0,-2.906],[0,0]],"o":[[0,0],[3,0],[0,2.906],[0,0]],"v":[[118.688,-20.062],[123.062,-20.062],[128.062,-15.062],[128.062,-10.688]],"c":false}},"nm":"Path 4","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.823529481888,0.215686291456,0.117647066712,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":220,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":240,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":320,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":520,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":540,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":599,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":620,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":820,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"t":840,"s":[0.823529481888,0.215686291456,0.117647066712,1]}]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Back 3D 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,204,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","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":600,"op":900,"st":600,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Status--NOK--03","parent":3,"tt":1,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":600,"op":900,"st":600,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Back 3D 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,204,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","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":300,"op":600,"st":300,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Status--OK--02","parent":5,"tt":1,"refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":300,"op":600,"st":300,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Back 3D","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,204,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","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[128,-20],[128,20],[-128,20],[-128,-20]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Status--MID--01","parent":7,"tt":1,"refId":"comp_13","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[128,20,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":256,"h":40,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Mask Numbers","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[468,375,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":[70,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":5,"nm":"0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9","parent":9,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":-12},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-418]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[-80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":220,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":240,"s":[-226]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":300,"s":[-226]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":320,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":360,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":380,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":440,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":460,"s":[-81]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":520,"s":[-81]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":540,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":599,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":620,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":660,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":680,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":740,"s":[-273]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":760,"s":[-418]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":820,"s":[-418]},{"t":840,"s":[-418]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":40,"f":"JetBrainsMonoRoman-SemiBold","t":"0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r0\r1\r2\r3\r4\r5\r6\r7\r8\r9","j":2,"tr":0,"lh":48,"ls":0,"fc":[0.353,0.314,0.98]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"a":0,"k":0},"ne":{"a":0,"k":0},"a":{"a":0,"k":100},"b":1,"rn":0,"sh":1,"r":1},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.823529481888,0.215686291456,0.117647066712,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":220,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":240,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":320,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":520,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":540,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":599,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":620,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":820,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"t":840,"s":[0.823529481888,0.215686291456,0.117647066712,1]}]}}}]},"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Mask Numbers 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[468,375,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":[70,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":5,"nm":"0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 10","parent":11,"tt":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":12},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-850]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":20,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[-176]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-176]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[-465]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":220,"s":[-465]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":240,"s":[-226]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":300,"s":[-226]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":320,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":360,"s":[14]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":380,"s":[-465]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":440,"s":[-465]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":460,"s":[-225]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":520,"s":[-225]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":540,"s":[-81]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":599,"s":[-81]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":620,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":660,"s":[15]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":680,"s":[-321]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":740,"s":[-321]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":760,"s":[-562]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":820,"s":[-562]},{"t":840,"s":[-850]}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":40,"f":"JetBrainsMonoRoman-SemiBold","t":"0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r0\r1\r2\r3\r4\r5\r6\r7\r8\r9\r0\r1\r2\r3\r4\r5\r6\r7\r8\r9","j":2,"tr":0,"lh":48,"ls":0,"fc":[0.353,0.314,0.98]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[{"nm":"Animator 1","s":{"t":0,"xe":{"a":0,"k":0},"ne":{"a":0,"k":0},"a":{"a":0,"k":100},"b":1,"rn":0,"sh":1,"r":1},"a":{"fc":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.823529481888,0.215686291456,0.117647066712,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":220,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":240,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":300,"s":[0.972549080849,0.729411780834,0.011764707044,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":320,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":520,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":540,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":599,"s":[0.078431375325,0.666666686535,0.372549027205,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":620,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":820,"s":[0.352941185236,0.313725501299,0.980392158031,1]},{"t":840,"s":[0.823529481888,0.215686291456,0.117647066712,1]}]}}}]},"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Cursor","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":60,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":80,"s":[-60.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":140,"s":[-60.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":160,"s":[35.625]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":220,"s":[35.625]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":240,"s":[13.375]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":300,"s":[13.375]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":320,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":360,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":380,"s":[35.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":440,"s":[35.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":460,"s":[-87.25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":520,"s":[-87.25]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":540,"s":[-123.5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":599,"s":[-123.5]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":620,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":660,"s":[-128]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":680,"s":[51.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":740,"s":[51.875]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":760,"s":[97.625]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":820,"s":[97.625]},{"t":840,"s":[119.25]}]},"y":{"a":0,"k":0}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[9,9]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 1","bm":0,"hd":false}],"ip":0,"op":901,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"ActiveLine 2","parent":29,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,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","ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-127.937,-2.5],[-127.903,2.5],[-128.062,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-127.903,-2.5],[-127.903,2.5],[-128.062,2.5],[-128.062,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-58.966,-2.5],[-58.875,2.5],[-128.034,2.5],[-128.125,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":140,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-58.937,-2.5],[-58.875,2.5],[-128.034,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":160,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[38.063,-2.5],[38.125,2.5],[-128.034,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":220,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[38.063,-2.5],[38.125,2.5],[-128.034,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":240,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.063,-2.5],[16.125,2.5],[-128.034,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":300,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[16.063,-2.5],[16.125,2.5],[-128.034,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":320,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128.403,-2.5],[-128.403,2.5],[-128.062,2.5],[-128.062,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":360,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128.437,-2.5],[-128.403,2.5],[-128.062,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":380,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[38.063,-2.5],[38.063,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":440,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[38.063,-2.5],[38.063,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":460,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-84.937,-2.5],[-84.937,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":520,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-84.937,-2.5],[-84.937,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":540,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-123.937,-2.5],[-123.937,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":599,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-123.937,-2.5],[-123.903,2.5],[-128.062,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":620,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128.437,-2.5],[-128.437,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":660,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-128.437,-2.5],[-128.437,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":680,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[54.063,-2.5],[54.063,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":740,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[54.063,-2.5],[54.063,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":760,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[99.563,-2.5],[99.563,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":820,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[99.563,-2.5],[99.563,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]},{"t":840,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[121.563,-2.5],[121.563,2.5],[-128.097,2.5],[-128.097,-2.5]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":3},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":90},"p":{"a":0,"k":[490,265,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":605,"op":905,"st":605,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[320,204,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":600,"op":900,"st":600,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"Compo-ItemList--03","refId":"comp_17","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[150,290,0]},"a":{"a":0,"k":[143,320,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":640,"ip":600,"op":900,"st":600,"bm":0},{"ddd":0,"ind":18,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":90},"p":{"a":0,"k":[490,265,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":305,"op":605,"st":305,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[320,204,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":300,"op":600,"st":300,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"Compo-ItemList--02","refId":"comp_23","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[150,290,0]},"a":{"a":0,"k":[143,320,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":640,"ip":300,"op":600,"st":300,"bm":0},{"ddd":0,"ind":21,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":90},"p":{"a":0,"k":[490,265,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":5,"op":305,"st":5,"bm":0},{"ddd":0,"ind":22,"ty":0,"nm":"Line","refId":"comp_16","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[320,204,0]},"a":{"a":0,"k":[25,10,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":50,"h":20,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":0,"nm":"Compo-ItemList--01","refId":"comp_27","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[150,290,0]},"a":{"a":0,"k":[143,290,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":286,"h":580,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":5,"nm":"Rules & Checks","parent":25,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-130,-1,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Rules & Checks","j":0,"tr":0,"lh":18,"ls":-2,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,155,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"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":[[-143,15],[-143,-25],[143,-25],[143,15]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[286,50]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.353,0.314,0.98,0.5,0.333,0.294,0.965,1,0.314,0.275,0.949]}},"s":{"a":0,"k":[-142.353,0]},"e":{"a":0,"k":[143.335,0]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,185,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"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":[[143,-15],[-143,-15],[-143,55],[143,55]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[286,110]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":5,"nm":"Score calculation","parent":30,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-130,-1,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":15,"f":"JetBrainsMonoRoman-Medium","t":"Score calculation","j":0,"tr":0,"lh":18,"ls":-2,"fc":[1,1,1]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":28,"ty":5,"nm":"/100","sr":1,"ks":{"o":{"a":0,"k":20},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,388,0]},"a":{"a":0,"k":[-30,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"t":{"d":{"k":[{"s":{"s":20,"f":"JetBrainsMonoRoman-Medium","t":"/100","j":2,"tr":0,"lh":24,"ls":0,"fc":[0.353,0.314,0.98]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":29,"ty":4,"nm":"BackLine","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,475.5,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":[256,5]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"nm":"Rectangle Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":5},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.352941176471,0.313725490196,0.980392156863,1]},"o":{"a":0,"k":20},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":30,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,315,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"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":[[143,-25],[-143,-25],[-143,15],[143,15]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[286,50]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"gf","o":{"a":0,"k":100},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.353,0.314,0.98,0.5,0.333,0.294,0.965,1,0.314,0.275,0.949]}},"s":{"a":0,"k":[-142.353,0]},"e":{"a":0,"k":[143.335,0]},"t":1,"nm":"Gradient Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":31,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[490,392.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"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":[[143,-63],[-143,-63],[-143,102],[143,102]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[286,205]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":8},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle 1","bm":0,"hd":false}],"ip":0,"op":900,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"P","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.4,1.8],[-1.867,3.267],[0,4.334],[1.866,3.234],[3.4,1.8],[4.666,0],[0,0],[0,0]],"o":[[0,0],[0,0],[4.666,0],[3.4,-1.8],[1.866,-3.266],[0,-4.466],[-1.867,-3.233],[-3.4,-1.8],[0,0],[0,0],[0,0]],"v":[[18.7,0],[18.7,-29.5],[32.5,-29.5],[44.6,-32.2],[52.5,-39.8],[55.3,-51.2],[52.5,-62.75],[44.6,-70.3],[32.5,-73],[8.8,-73],[8.8,0]],"c":true}},"nm":"P","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.3,-2.333],[0,-3.933],[2.3,-2.366],[3.8,0],[0,0]],"o":[[0,0],[3.8,0],[2.3,2.334],[0,3.934],[-2.3,2.367],[0,0],[0,0]],"v":[[18.7,-64.2],[32.5,-64.2],[41.65,-60.7],[45.1,-51.3],[41.65,-41.85],[32.5,-38.3],[18.7,-38.3]],"c":true}},"nm":"P","hd":false}],"nm":"P","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"r","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.967,2.134],[-3.734,0],[-2.034,-2.2],[0,-4],[0,0],[0,0],[0,0],[3.4,3.667],[5.666,0],[2.633,-2.433],[0,-4.333],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-4.2],[1.966,-2.133],[3.933,0],[2.033,2.2],[0,0],[0,0],[0,0],[0,-6.2],[-3.4,-3.666],[-4.667,0],[-2.634,2.434],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.4,0],[20.4,-34.7],[23.35,-44.2],[31.9,-47.4],[40.85,-44.1],[43.9,-34.8],[43.9,-31.7],[53.9,-31.7],[53.9,-35.7],[48.8,-50.5],[35.2,-56],[24.25,-52.35],[20.3,-42.2],[22.6,-44.5],[20.3,-44.5],[20.3,-55],[10.5,-55],[10.5,0]],"c":true}},"nm":"r","hd":false}],"nm":"r","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"o","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.267,1.7],[-1.767,3.167],[0,4.334],[0,0],[1.766,3.134],[3.266,1.7],[4.533,0],[3.3,-1.7],[1.766,-3.166],[0,-4.333],[0,0],[-1.767,-3.166],[-3.3,-1.7],[-4.467,0]],"o":[[3.266,-1.7],[1.766,-3.166],[0,0],[0,-4.333],[-1.767,-3.133],[-3.267,-1.7],[-4.467,0],[-3.3,1.7],[-1.767,3.167],[0,0],[0,4.334],[1.766,3.167],[3.3,1.7],[4.533,0]],"v":[[41.7,-1.75],[49.25,-9.05],[51.9,-20.3],[51.9,-34.8],[49.25,-46],[41.7,-53.25],[30,-55.8],[18.35,-53.25],[10.75,-45.95],[8.1,-34.7],[8.1,-20.3],[10.75,-9.05],[18.35,-1.75],[30,0.8]],"c":true}},"nm":"o","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.133,2.1],[0,4.067],[0,0],[-2.134,2.1],[-3.734,0],[-2.1,-2.1],[0,-4.066],[0,0],[2.1,-2.1],[3.8,0]],"o":[[-2.134,-2.1],[0,0],[0,-4.066],[2.133,-2.1],[3.8,0],[2.1,2.1],[0,0],[0,4.067],[-2.1,2.1],[-3.734,0]],"v":[[21.2,-11.05],[18,-20.3],[18,-34.7],[21.2,-43.95],[30,-47.1],[38.85,-43.95],[42,-34.7],[42,-20.3],[38.85,-11.05],[30,-7.9]],"c":true}},"nm":"o","hd":false}],"nm":"o","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"c","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.934,3.434],[-0.2,5.934],[0,0],[2.1,-1.833],[3.6,0],[2.233,2.134],[0,4],[0,0],[-2.234,2.1],[-3.8,0],[-2.1,-1.8],[-0.2,-3.333],[0,0],[3.933,3.434],[6.466,0],[3.366,-1.7],[1.833,-3.133],[0,-4.466],[0,0],[-1.834,-3.166],[-3.367,-1.7],[-4.467,0]],"o":[[3.933,-3.433],[0,0],[-0.2,3.267],[-2.1,1.834],[-3.8,0],[-2.234,-2.133],[0,0],[0,-4],[2.233,-2.1],[3.6,0],[2.1,1.8],[0,0],[-0.2,-5.933],[-3.934,-3.433],[-4.467,0],[-3.367,1.7],[-1.834,3.134],[0,0],[0,4.4],[1.833,3.167],[3.366,1.7],[6.466,0]],"v":[[46,-4.15],[52.2,-18.2],[42.4,-18.2],[38.95,-10.55],[30.4,-7.8],[21.35,-11],[18,-20.2],[18,-34.9],[21.35,-44.05],[30.4,-47.2],[38.95,-44.5],[42.4,-36.8],[52.2,-36.8],[46,-50.85],[30.4,-56],[18.65,-53.45],[10.85,-46.2],[8.1,-34.8],[8.1,-20.2],[10.85,-8.85],[18.65,-1.55],[30.4,1]],"c":true}},"nm":"c","hd":false}],"nm":"c","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"e","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.967,2.734],[-0.667,4.667],[0,0],[2.033,-1.166],[3.333,0],[2.1,2.2],[0,4.267],[0,0],[0,0],[0,0],[1.8,3.167],[3.3,1.734],[4.4,0],[3.3,-1.733],[1.8,-3.166],[0,-4.333],[0,0],[-1.8,-3.2],[-3.3,-1.733],[-4.4,0]],"o":[[3.966,-2.733],[0,0],[-0.467,2.334],[-2.034,1.167],[-3.934,0],[-2.1,-2.2],[0,0],[0,0],[0,0],[0,-4.333],[-1.8,-3.166],[-3.3,-1.733],[-4.4,0],[-3.3,1.734],[-1.8,3.167],[0,0],[0,4.267],[1.8,3.2],[3.3,1.733],[5.8,0]],"v":[[44.65,-3.1],[51.6,-14.2],[41.8,-14.2],[38.05,-8.95],[30,-7.2],[20.95,-10.5],[17.8,-20.2],[17.8,-25.1],[51.9,-25.1],[51.9,-34.8],[49.2,-46.05],[41.55,-53.4],[30,-56],[18.45,-53.4],[10.8,-46.05],[8.1,-34.8],[8.1,-20.2],[10.8,-9],[18.45,-1.6],[30,1]],"c":true}},"nm":"e","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.1,2.267],[-3.934,0],[-2.067,-2.233],[0,-4.2],[0,0]],"o":[[0,0],[0,0],[0,-4.2],[2.1,-2.266],[4,0],[2.066,2.234],[0,0],[0,0]],"v":[[43,-32.2],[17.8,-32.2],[17.8,-34.8],[20.95,-44.5],[30,-47.9],[39.1,-44.55],[42.2,-34.9],[42.2,-31.4]],"c":true}},"nm":"e","hd":false}],"nm":"e","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"s","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.334,2.9],[0,5.134],[2.8,2.6],[6,0.867],[0,0],[0,3.8],[-1.634,1.234],[-3,0],[0,0],[-1.6,-1],[0,-1.666],[0,0],[3.466,2.567],[5.733,0],[0,0],[3.3,-2.666],[0,-5.066],[-2.7,-2.566],[-5.534,-0.933],[0,0],[-1.6,-1.3],[0,-2.266],[1.7,-1.366],[3.4,0],[0,0],[1.866,1.134],[0,2],[0,0],[-1.667,-2.233],[-3,-1.2],[-3.867,0]],"o":[[6.733,0],[3.333,-2.9],[0,-4.8],[-2.8,-2.6],[0,0],[-5.467,-0.933],[0,-2.266],[1.633,-1.233],[0,0],[2.866,0],[1.6,1],[0,0],[0,-4.2],[-3.467,-2.566],[0,0],[-6.267,0],[-3.3,2.667],[0,4.534],[2.7,2.567],[0,0],[3,0.467],[1.6,1.3],[0,2.267],[-1.7,1.367],[0,0],[-2.867,0],[-1.867,-1.133],[0,0],[0,3.067],[1.666,2.234],[3,1.2],[0,0]],"v":[[32.4,0.8],[47.5,-3.55],[52.5,-15.6],[48.3,-26.7],[35.1,-31.9],[27.6,-33.1],[19.4,-40.2],[21.85,-45.45],[28.8,-47.3],[32.6,-47.3],[39.3,-45.8],[41.7,-41.8],[51.8,-41.8],[46.6,-51.95],[32.8,-55.8],[29,-55.8],[14.65,-51.8],[9.7,-40.2],[13.75,-29.55],[26.1,-24.3],[33.5,-23.2],[40.4,-20.55],[42.8,-15.2],[40.25,-9.75],[32.6,-7.7],[28.4,-7.7],[21.3,-9.4],[18.5,-14.1],[8.4,-14.1],[10.9,-6.15],[17.9,-1],[28.2,0.8]],"c":true}},"nm":"s","hd":false}],"nm":"s","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"i","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[55.6,0],[55.6,-9],[37.5,-9],[37.5,-55],[10.3,-55],[10.3,-46],[27.6,-46],[27.6,-9],[8.3,-9],[8.3,0]],"c":true}},"nm":"i","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.334,1.167],[0,2],[1.333,1.2],[2.266,0],[1.333,-1.2],[0,-2.066],[-1.334,-1.166],[-2.267,0]],"o":[[1.333,-1.166],[0,-2.066],[-1.334,-1.2],[-2.267,0],[-1.334,1.2],[0,2],[1.333,1.167],[2.266,0]],"v":[[37,-66.45],[39,-71.2],[37,-76.1],[31.6,-77.9],[26.2,-76.1],[24.2,-71.2],[26.2,-66.45],[31.6,-64.7]],"c":true}},"nm":"i","hd":false}],"nm":"i","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"n","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.067,2.167],[-3.6,0],[-2,-2],[0,-3.8],[0,0],[0,0],[0,0],[3.266,3.467],[5.466,0],[2.633,-2.433],[0,-4.333],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-4.066],[2.066,-2.166],[3.466,0],[2,2],[0,0],[0,0],[0,0],[0,-5.866],[-3.267,-3.466],[-4.6,0],[-2.634,2.434],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.7,0],[18.7,-34.8],[21.8,-44.15],[30.3,-47.4],[38.5,-44.4],[41.5,-35.7],[41.5,0],[51.4,0],[51.4,-36.8],[46.5,-50.8],[33.4,-56],[22.55,-52.35],[18.6,-42.2],[20.9,-44.5],[18.6,-44.5],[18.6,-55],[8.8,-55],[8.8,0]],"c":true}},"nm":"n","hd":false}],"nm":"n","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"g","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.2,2.966],[0,5.066],[0,0],[0,0],[0,0],[0,0],[0,0],[2.666,2.367],[4.466,0],[3.266,-3.7],[0,-6.333],[0,0],[-3.267,-3.733],[-5.667,0],[-2.667,2.4],[0,4.067],[0,0],[0,0],[0,0],[0,0],[1.3,-1.267],[2.8,0],[0,0],[0,0]],"o":[[5.666,0],[3.2,-2.967],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-4.133],[-2.667,-2.366],[-5.667,0],[-3.267,3.7],[0,0],[0,6.334],[3.266,3.734],[4.466,0],[2.666,-2.4],[0,0],[0,0],[0,0],[0,0],[0,2.666],[-1.3,1.266],[0,0],[0,0],[0,0]],"v":[[33,18],[46.3,13.55],[51.1,1.5],[51.1,-55],[41.3,-55],[41.4,-44.5],[39.4,-44.5],[41.4,-42.7],[37.4,-52.45],[26.7,-56],[13.3,-50.45],[8.4,-35.4],[8.4,-24.1],[13.3,-9],[26.7,-3.4],[37.4,-7],[41.4,-16.7],[39.4,-14.9],[41.4,-14.9],[41.2,-4.8],[41.2,1.4],[39.25,7.3],[33.1,9.2],[15.9,9.2],[15.9,18]],"c":true}},"nm":"g","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2,2.167],[0,4.067],[0,0],[-2,2.167],[-3.667,0],[-2.034,-2.2],[0,-4],[0,0],[2.033,-2.233],[3.6,0]],"o":[[-2,-2.166],[0,0],[0,-4.066],[2,-2.166],[3.6,0],[2.033,2.2],[0,0],[0,3.934],[-2.034,2.234],[-3.667,0]],"v":[[21.3,-15.25],[18.3,-24.6],[18.3,-34.8],[21.3,-44.15],[29.8,-47.4],[38.25,-44.1],[41.3,-34.8],[41.3,-24.6],[38.25,-15.35],[29.8,-12]],"c":true}},"nm":"g","hd":false}],"nm":"g","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":".","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.567,1.533],[0,2.534],[1.566,1.567],[2.6,0],[1.566,-1.566],[0,-2.666],[-1.567,-1.533],[-2.6,0]],"o":[[1.566,-1.533],[0,-2.666],[-1.567,-1.566],[-2.6,0],[-1.567,1.567],[0,2.534],[1.566,1.533],[2.6,0]],"v":[[36.25,-1.3],[38.6,-7.4],[36.25,-13.75],[30,-16.1],[23.75,-13.75],[21.4,-7.4],[23.75,-1.3],[30,1]],"c":true}},"nm":".","hd":false}],"nm":".","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"N","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.1,2.767],[0.133,2.5],[0.133,1.667],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.1,-2.8],[-0.167,-2.533],[-0.2,-1.8],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-2.466],[-0.1,-2.766],[-0.134,-2.5],[0,0],[0,0],[0,0],[0,0],[0,0],[0,2.4],[0.1,2.8],[0.166,2.534],[0,0],[0,0],[0,0],[0,0]],"v":[[17.9,0],[17.9,-39.6],[17.75,-47.45],[17.4,-55.35],[17,-61.6],[38.6,0],[51.5,0],[51.5,-73],[42.1,-73],[42.1,-33.7],[42.25,-25.9],[42.65,-17.9],[43.2,-11.4],[21.4,-73],[8.5,-73],[8.5,0]],"c":true}},"nm":"N","hd":false}],"nm":"N","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"d","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.734,2.6],[0,4.534],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2.733,2.634],[4.666,0],[3.333,-3.7],[0,-6.4],[0,0],[-3.367,-3.7],[-5.4,0]],"o":[[2.733,-2.6],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-4.466],[-2.734,-2.633],[-5.467,0],[-3.334,3.7],[0,0],[0,6.334],[3.366,3.7],[4.666,0]],"v":[[37.4,-2.9],[41.5,-13.6],[39.3,-10.3],[41.4,-10.3],[41.4,0],[51.2,0],[51.2,-73],[41.3,-73],[41.3,-57.2],[41.5,-44.7],[39.3,-44.7],[41.5,-41.4],[37.4,-52.05],[26.3,-56],[13.1,-50.45],[8.1,-35.3],[8.1,-19.6],[13.15,-4.55],[26.3,1]],"c":true}},"nm":"d","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.1,2.167],[0,4.067],[0,0],[-2.1,2.167],[-3.667,0],[-2.034,-2.233],[0,-3.933],[0,0],[2.033,-2.233],[3.6,0]],"o":[[-2.1,-2.166],[0,0],[0,-4.066],[2.1,-2.166],[3.6,0],[2.033,2.234],[0,0],[0,3.934],[-2.034,2.234],[-3.667,0]],"v":[[21.15,-10.85],[18,-20.2],[18,-34.8],[21.15,-44.15],[29.8,-47.4],[38.25,-44.05],[41.3,-34.8],[41.3,-20.2],[38.25,-10.95],[29.8,-7.6]],"c":true}},"nm":"d","hd":false}],"nm":"d","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":" ","size":13,"style":"Regular","w":60,"data":{},"fFamily":"JetBrains Mono"},{"ch":"M","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.266,3.934],[0.4,3.534],[0.466,3.267],[0,0],[0,0],[0,0],[0.4,-3.733],[0.233,-3.933],[0,-4.066],[0,0],[0,0],[0,0],[0,0],[0,0],[0.5,-2.033],[0.2,-1.066],[0.466,2.034],[0.733,2.2],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-4.533],[-0.267,-3.933],[-0.4,-3.533],[0,0],[0,0],[0,0],[-0.467,3.467],[-0.4,3.734],[-0.234,3.934],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.667,2.267],[-0.5,2.034],[-0.267,-1.066],[-0.467,-2.033],[0,0],[0,0],[0,0],[0,0]],"v":[[16.6,0],[16.6,-33.5],[16.2,-46.2],[15.2,-57.4],[13.9,-67.6],[25.4,-31.8],[34.6,-31.8],[46,-67.8],[44.7,-57],[43.75,-45.5],[43.4,-33.5],[43.4,0],[52.9,0],[52.9,-73],[40.3,-73],[33,-49.6],[31.25,-43.15],[30.2,-38.5],[29.1,-43.15],[27.3,-49.5],[19.7,-73],[7.1,-73],[7.1,0]],"c":true}},"nm":"M","hd":false}],"nm":"M","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"a","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.1,2.367],[0,4],[0,0],[0,0],[0,0],[0,0],[0,0],[3.733,3.267],[6.466,0],[3.166,-1.333],[1.9,-2.366],[0.266,-3.2],[0,0],[-2.1,1.367],[-3.134,0],[-1.967,-1.766],[0,-3.2],[0,0],[0,0],[3.433,-2.966],[0,-5.2],[-3.3,-2.966],[-5.8,0]],"o":[[3.1,-2.366],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-5.666],[-3.734,-3.266],[-3.934,0],[-3.167,1.334],[-1.9,2.367],[0,0],[0.466,-2.2],[2.1,-1.366],[3.466,0],[1.966,1.767],[0,0],[0,0],[-5.934,0],[-3.434,2.967],[0,5.067],[3.3,2.967],[5.066,0]],"v":[[37.15,-2.55],[41.8,-12.1],[40.1,-10.2],[41.7,-10.2],[41.7,0],[51.4,0],[51.4,-37.7],[45.8,-51.1],[30.5,-56],[19.85,-54],[12.25,-48.45],[9,-40.1],[18.7,-40.1],[22.55,-45.45],[30.4,-47.5],[38.55,-44.85],[41.5,-37.4],[41.5,-32.2],[25.5,-32.2],[11.45,-27.75],[6.3,-15.5],[11.25,-3.45],[24.9,1]],"c":true}},"nm":"a","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2,1.667],[0,2.934],[-1.7,1.6],[-2.934,0],[0,0],[0,0],[2.6,-2.033],[4.066,0]],"o":[[-2,-1.666],[0,-2.8],[1.7,-1.6],[0,0],[0,0],[0,3.2],[-2.6,2.034],[-3.6,0]],"v":[[19.2,-9.2],[16.2,-16.1],[18.75,-22.7],[25.7,-25.1],[41.5,-25.1],[41.5,-17.6],[37.6,-9.75],[27.6,-6.7]],"c":true}},"nm":"a","hd":false}],"nm":"a","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"u","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.934,3.8],[0,6.534],[0,0],[0,0],[0,0],[2.066,-2.2],[3.6,0],[2.033,2.2],[0,3.934],[0,0],[0,0],[0,0],[-3.867,-3.8],[-6.467,0]],"o":[[3.933,-3.8],[0,0],[0,0],[0,0],[0,3.934],[-2.067,2.2],[-3.534,0],[-2.034,-2.2],[0,0],[0,0],[0,0],[0,6.534],[3.866,3.8],[6.466,0]],"v":[[45.5,-4.7],[51.4,-20.2],[51.4,-55],[41.5,-55],[41.5,-20.2],[38.4,-11],[29.9,-7.7],[21.55,-11],[18.5,-20.2],[18.5,-55],[8.6,-55],[8.6,-20.2],[14.4,-4.7],[29.9,1]],"c":true}},"nm":"u","hd":false}],"nm":"u","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"l","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.233,1.3],[0,2.2],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.367,-2.4],[-2.5,-1.333],[-3.267,0]],"o":[[0,0],[0,0],[-2.134,0],[-1.234,-1.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,3.267],[1.366,2.4],[2.5,1.334],[0,0]],"v":[[55.2,0],[55.2,-9],[38.5,-9],[33.45,-10.95],[31.6,-16.2],[31.6,-73],[2.9,-73],[2.9,-64],[21.7,-64],[21.7,-16.1],[23.75,-7.6],[29.55,-2],[38.2,0]],"c":true}},"nm":"l","hd":false}],"nm":"l","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"R","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.534,3.567],[0,4.867],[1.833,3.167],[3.366,1.767],[4.466,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.333,-1.4],[2.533,-3.566],[0,-4.266],[-1.834,-3.166],[-3.367,-1.766],[0,0],[0,0],[0,0]],"v":[[18.7,0],[18.7,-30.5],[29.7,-30.5],[43.3,0],[54.8,0],[39.7,-31.7],[50,-39.15],[53.8,-51.8],[51.05,-62.95],[43.25,-70.35],[31.5,-73],[8.8,-73],[8.8,0]],"c":true}},"nm":"R","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.2,-2.266],[0,-3.8],[2.2,-2.266],[3.666,0],[0,0]],"o":[[0,0],[3.666,0],[2.2,2.267],[0,3.734],[-2.2,2.267],[0,0],[0,0]],"v":[[18.7,-64.2],[31.5,-64.2],[40.3,-60.8],[43.6,-51.7],[40.3,-42.7],[31.5,-39.3],[18.7,-39.3]],"c":true}},"nm":"R","hd":false}],"nm":"R","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"v","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.466,-2.066],[0.333,-1.133],[0.533,2.067],[0.666,2.134],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.734,2.134],[-0.467,2.067],[-0.267,-1.133],[-0.534,-2.066],[0,0],[0,0],[0,0],[0,0]],"v":[[36.4,0],[55.5,-55],[45.2,-55],[33.2,-18.9],[31.4,-12.6],[30.2,-7.8],[29,-12.6],[27.2,-18.9],[14.8,-55],[4.5,-55],[23.6,0]],"c":true}},"nm":"v","hd":false}],"nm":"v","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"w","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.234,2],[-0.067,1.134],[0,0],[-0.267,-2],[-0.267,-1.866],[0,0],[0,0],[0,0],[0,0],[0,0],[0.233,-1.866],[0.133,-1.266],[0,0],[0.233,1.867],[0.333,1.6],[0,0],[0,0],[0,0],[0.2,-1.866],[0.133,-1.266],[0,0],[0.2,1.867],[0.2,1.6],[0,0],[0,0],[0,0]],"o":[[0,0],[0.333,-1.866],[0.233,-2],[0,0],[0.133,1.134],[0.266,2],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.2,1.6],[-0.234,1.867],[0,0],[-0.067,-1.266],[-0.234,-1.866],[0,0],[0,0],[0,0],[-0.334,1.6],[-0.2,1.867],[0,0],[-0.067,-1.266],[-0.2,-1.866],[0,0],[0,0],[0,0],[0,0]],"v":[[22.5,0],[28.4,-36.9],[29.25,-42.7],[29.7,-47.4],[30.1,-47.4],[30.7,-42.7],[31.5,-36.9],[37.2,0],[47.8,0],[56.9,-55],[48.9,-55],[43.4,-17.4],[42.75,-12.2],[42.2,-7.5],[41.8,-7.5],[41.35,-12.2],[40.5,-17.4],[34.7,-55],[25.3,-55],[19.5,-17.4],[18.7,-12.2],[18.2,-7.5],[17.8,-7.5],[17.4,-12.2],[16.8,-17.4],[11.5,-55],[3.1,-55],[11.8,0]],"c":true}},"nm":"w","hd":false}],"nm":"w","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"T","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[35,0],[35,-64],[54.7,-64],[54.7,-73],[5.3,-73],[5.3,-64],[25,-64],[25,0]],"c":true}},"nm":"T","hd":false}],"nm":"T","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"t","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.033,1.134],[0,1.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.834,-2.733],[-4.667,0]],"o":[[0,0],[0,0],[-1.734,0],[-1.034,-1.133],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,4.534],[2.833,2.734],[0,0]],"v":[[51.2,0],[51.2,-9],[36.2,-9],[32.05,-10.7],[30.5,-15.1],[30.5,-46],[52.2,-46],[52.2,-55],[30.5,-55],[30.5,-70.5],[20.5,-70.5],[20.5,-55],[5.2,-55],[5.2,-46],[20.5,-46],[20.5,-15],[24.75,-4.1],[36,0]],"c":true}},"nm":"t","hd":false}],"nm":"t","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"#","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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]],"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]],"v":[[15.6,0],[19.4,-20.5],[34.9,-20.5],[31.1,0],[38.6,0],[42.4,-20.5],[53,-20.5],[53,-27.5],[43.6,-27.5],[46.9,-45.5],[56.5,-45.5],[56.5,-52.5],[48.1,-52.5],[51.9,-73],[44.4,-73],[40.6,-52.5],[25.1,-52.5],[28.9,-73],[21.4,-73],[17.6,-52.5],[7,-52.5],[7,-45.5],[16.4,-45.5],[13.1,-27.5],[3.5,-27.5],[3.5,-20.5],[11.9,-20.5],[8.1,0]],"c":true}},"nm":"#","hd":false},{"ind":1,"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":[[23.9,-45.5],[39.4,-45.5],[36.1,-27.5],[20.6,-27.5]],"c":true}},"nm":"#","hd":false}],"nm":"#","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"8","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.534,1.633],[-1.967,2.934],[0,3.8],[2.966,3.667],[5,1.934],[0,0],[1.766,2.134],[0,2.6],[-2.3,1.967],[-3.667,0],[-2.3,-1.966],[0,-3.133],[1.833,-2.166],[3,-1.133],[0,0],[2.933,-3.633],[0,-4.466],[-1.967,-2.933],[-3.567,-1.633],[-4.734,0]],"o":[[3.533,-1.633],[1.966,-2.933],[0,-4.466],[-2.967,-3.666],[0,0],[-2.867,-1.066],[-1.767,-2.133],[0,-3.133],[2.3,-1.966],[3.666,0],[2.3,1.967],[0,2.534],[-1.834,2.167],[0,0],[-4.867,1.867],[-2.934,3.634],[0,3.8],[1.966,2.934],[3.566,1.633],[4.8,0]],"v":[[42.5,-1.45],[50.75,-8.3],[53.7,-18.4],[49.25,-30.6],[37.3,-39],[27.2,-42.9],[20.25,-47.7],[17.6,-54.8],[21.05,-62.45],[30,-65.4],[38.95,-62.45],[42.4,-54.8],[39.65,-47.75],[32.4,-42.8],[22.4,-38.8],[10.7,-30.55],[6.3,-18.4],[9.25,-8.3],[17.55,-1.45],[30,1]],"c":true}},"nm":"8","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.566,2.2],[0,3.6],[-1.7,2.267],[-3.067,1.267],[0,0],[-2.734,3.267],[0,3.867],[1.866,2.834],[3.333,1.634],[4.333,0],[3.3,-1.633],[1.9,-2.833],[0,-3.666],[-2.7,-3.233],[-5.267,-2.066],[0,0],[-1.767,-2.3],[0,-2.8],[2.566,-2.2],[4.2,0]],"o":[[-2.567,-2.2],[0,-2.733],[1.7,-2.266],[0,0],[5.333,-2.066],[2.733,-3.266],[0,-3.666],[-1.867,-2.833],[-3.334,-1.633],[-4.334,0],[-3.3,1.634],[-1.9,2.834],[0,3.867],[2.7,3.234],[0,0],[3.066,1.267],[1.766,2.3],[0,3.534],[-2.567,2.2],[-4.2,0]],"v":[[19.85,-11],[16,-19.7],[18.55,-27.2],[25.7,-32.5],[35.9,-36.5],[48,-44.5],[52.1,-55.2],[49.3,-64.95],[41.5,-71.65],[30,-74.1],[18.55,-71.65],[10.75,-64.95],[7.9,-55.2],[11.95,-44.55],[23.9,-36.6],[34.1,-32.6],[41.35,-27.25],[44,-19.6],[40.15,-11],[30,-7.7]],"c":true}},"nm":"8","hd":false}],"nm":"8","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"7","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[29.2,0],[54.8,-63.9],[54.8,-73],[7.6,-73],[7.6,-52.2],[17.5,-52.2],[17.5,-64.1],[44.5,-64.1],[18.3,0]],"c":true}},"nm":"7","hd":false}],"nm":"7","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"6","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.534,1.966],[-2,3.567],[0,4.734],[1.666,3.3],[3,1.867],[4,0],[2.2,-1.1],[1.266,-1.866],[0,0],[0,0],[0,0],[0,0],[1.166,-3.4],[0,-3.133],[-2,-3.533],[-3.6,-2],[-4.8,0]],"o":[[3.533,-1.966],[2,-3.566],[0,-4.466],[-1.667,-3.3],[-3,-1.866],[-2.867,0],[-2.2,1.1],[0,0],[0,0],[0,0],[0,0],[-2.134,3.734],[-1.167,3.4],[0,4.667],[2,3.534],[3.6,2],[4.8,0]],"v":[[42.6,-1.95],[50.9,-10.25],[53.9,-22.7],[51.4,-34.35],[44.4,-42.1],[33.9,-44.9],[26.3,-43.25],[21.1,-38.8],[20.7,-39.1],[40.6,-73],[29.8,-73],[12.8,-43.1],[7.85,-32.4],[6.1,-22.6],[9.1,-10.3],[17.5,-2],[30.1,1]],"c":true}},"nm":"6","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.566,2.7],[0,4.467],[-1.167,2.2],[-2.134,1.234],[-2.734,0],[-2.1,-1.233],[-1.167,-2.2],[0,-3],[2.566,-2.7],[4.2,0]],"o":[[-2.567,-2.7],[0,-3],[1.166,-2.2],[2.133,-1.233],[2.8,0],[2.1,1.234],[1.166,2.2],[0,4.467],[-2.567,2.7],[-4.2,0]],"v":[[19.85,-11.75],[16,-22.5],[17.75,-30.3],[22.7,-35.45],[30,-37.3],[37.35,-35.45],[42.25,-30.3],[44,-22.5],[40.15,-11.75],[30,-7.7]],"c":true}},"nm":"6","hd":false}],"nm":"6","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"2","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,3.767],[0,3.6],[1.833,3.2],[3.3,1.734],[4.6,0],[3.333,-1.766],[1.9,-3.266],[0.066,-4.466],[0,0],[-2.267,2.334],[-3.867,0],[-2.234,-2.266],[0,-3.866],[1.466,-2.766],[3.266,-3.466],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[4.533,-4.8],[2,-3.766],[0,-4.333],[-1.834,-3.2],[-3.3,-1.733],[-4.467,0],[-3.334,1.767],[-1.9,3.267],[0,0],[0,-4],[2.266,-2.333],[3.8,0],[2.233,2.267],[0,2.734],[-1.467,2.767],[0,0],[0,0],[0,0]],"v":[[52.8,0],[52.8,-9],[20.5,-9],[38.9,-28.8],[48.7,-41.65],[51.7,-52.7],[48.95,-64],[41.25,-71.4],[29.4,-74],[17.7,-71.35],[9.85,-63.8],[6.9,-52.2],[16.8,-52.2],[20.2,-61.7],[29.4,-65.2],[38.45,-61.8],[41.8,-52.6],[39.6,-44.35],[32.5,-35],[8.9,-9.5],[8.9,0]],"c":true}},"nm":"2","hd":false}],"nm":"2","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"V","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.6,-2.866],[0.266,-1.6],[0.566,2.867],[0.8,3.134],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.734,3.2],[-0.6,2.867],[-0.267,-1.6],[-0.567,-2.866],[0,0],[0,0],[0,0],[0,0]],"v":[[36.6,0],[55.4,-73],[45.2,-73],[33.5,-23.9],[31.5,-14.8],[30.2,-8.1],[28.95,-14.8],[26.9,-23.8],[14.8,-73],[4.6,-73],[23.3,0]],"c":true}},"nm":"V","hd":false}],"nm":"V","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"5","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.867,3.767],[0,6.534],[0,0],[3.3,3.7],[5.933,-0.066],[2.466,-1.8],[0,-3.133],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.834,1.234],[-2.467,0],[-2.034,-2.133],[0,-3.933],[0,0],[2.033,-2.133],[4,0],[2.033,1.5],[0.333,2.8],[0,0],[-3.867,-3.133],[-6.134,0]],"o":[[3.866,-3.766],[0,0],[0,-6.533],[-3.3,-3.7],[-4.2,0],[-2.467,1.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.866,-2.066],[1.833,-1.233],[3.933,0],[2.033,2.134],[0,0],[0,3.934],[-2.034,2.134],[-3.534,0],[-2.034,-1.5],[0,0],[0.6,5.4],[3.866,3.134],[7,0]],"v":[[46.1,-4.65],[51.9,-20.1],[51.9,-27.2],[46.95,-42.55],[33.1,-48],[23.1,-45.3],[19.4,-37.9],[22.2,-40.5],[19.4,-40.5],[19.7,-64],[49.3,-64],[49.3,-73],[10.2,-73],[9.7,-32.7],[19.5,-32.7],[23.55,-37.65],[30,-39.5],[38.95,-36.3],[42,-27.2],[42,-20.1],[38.95,-11],[29.9,-7.8],[21.55,-10.05],[18,-16.5],[8.1,-16.5],[14.8,-3.7],[29.8,1]],"c":true}},"nm":"5","hd":false}],"nm":"5","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"3","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.4,1.766],[-1.867,3.134],[0,4.2],[0,0],[4,3.8],[6.8,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.167,-2.166],[0,-3.933],[0,0],[2.166,-2.266],[3.933,0],[2.2,2.167],[0,3.867],[0,0],[-1.834,-3.133],[-3.367,-1.766],[-4.467,0]],"o":[[3.4,-1.766],[1.866,-3.133],[0,0],[0,-6.466],[-4,-3.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.933,0],[2.166,2.167],[0,0],[0,3.667],[-2.167,2.267],[-3.934,0],[-2.2,-2.166],[0,0],[0,4.2],[1.833,3.134],[3.366,1.766],[4.466,0]],"v":[[40.8,-1.65],[48.7,-9],[51.5,-20],[51.5,-25.1],[45.5,-40.5],[29.3,-46.2],[29.3,-42.8],[49.1,-64.1],[49.1,-73],[9.8,-73],[9.8,-64.2],[38,-64.2],[21,-45.8],[21,-37.5],[29.1,-37.5],[38.25,-34.25],[41.5,-25.1],[41.5,-20],[38.25,-11.1],[29.1,-7.7],[19.9,-10.95],[16.6,-20],[6.7,-20],[9.45,-9],[17.25,-1.65],[29,1]],"c":true}},"nm":"3","hd":false}],"nm":"3","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"D","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.467,1.834],[-1.934,3.334],[0,4.467],[0,0],[1.933,3.3],[3.466,1.834],[4.8,0],[0,0],[0,0]],"o":[[4.8,0],[3.466,-1.833],[1.933,-3.333],[0,0],[0,-4.466],[-1.934,-3.3],[-3.467,-1.833],[0,0],[0,0],[0,0]],"v":[[28.4,0],[40.8,-2.75],[48.9,-10.5],[51.8,-22.2],[51.8,-50.9],[48.9,-62.55],[40.8,-70.25],[28.4,-73],[8.8,-73],[8.8,0]],"c":true}},"nm":"D","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.4,-2.366],[0,-4.133],[0,0],[2.4,-2.4],[4.2,0],[0,0]],"o":[[0,0],[4.2,0],[2.4,2.367],[0,0],[0,4.134],[-2.4,2.4],[0,0],[0,0]],"v":[[18.7,-64.2],[28.4,-64.2],[38.3,-60.65],[41.9,-50.9],[41.9,-22.2],[38.3,-12.4],[28.4,-8.8],[18.7,-8.8]],"c":true}},"nm":"D","hd":false}],"nm":"D","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"9","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.2,3.4],[0,3.2],[2,3.5],[3.6,2],[4.8,0],[3.6,-1.966],[2,-3.566],[0,-4.733],[-1.7,-3.333],[-2.967,-1.866],[-4,0],[-2.167,1.067],[-1.267,1.867],[0,0],[0,0]],"o":[[0,0],[2.133,-3.733],[1.2,-3.4],[0,-4.666],[-2,-3.5],[-3.6,-2],[-4.667,0],[-3.6,1.967],[-2,3.567],[0,4.4],[1.7,3.334],[2.966,1.867],[2.866,0],[2.166,-1.066],[0,0],[0,0],[0,0]],"v":[[30.5,0],[47.1,-29.9],[52.1,-40.6],[53.9,-50.5],[50.9,-62.75],[42.5,-71],[29.9,-74],[17.5,-71.05],[9.1,-62.75],[6.1,-50.3],[8.65,-38.7],[15.65,-30.9],[26.1,-28.1],[33.65,-29.7],[38.8,-34.1],[39.2,-33.8],[19.5,0]],"c":true}},"nm":"9","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.6,2.734],[0,4.467],[-2.6,2.7],[-4.134,0],[-2.6,-2.7],[0,-4.466],[2.6,-2.733],[4.133,0]],"o":[[-2.6,-2.733],[0,-4.466],[2.6,-2.7],[4.133,0],[2.6,2.7],[0,4.467],[-2.6,2.734],[-4.134,0]],"v":[[19.9,-39.7],[16,-50.5],[19.9,-61.25],[30,-65.3],[40.1,-61.25],[44,-50.5],[40.1,-39.7],[30,-35.6]],"c":true}},"nm":"9","hd":false}],"nm":"9","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"L","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[55.2,0],[55.2,-9],[22.7,-9],[22.7,-73],[12.8,-73],[12.8,0]],"c":true}},"nm":"L","hd":false}],"nm":"L","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"A","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[14.7,0],[19.3,-19],[40.7,-19],[45.3,0],[55.4,0],[36.6,-73],[23.5,-73],[4.6,0]],"c":true}},"nm":"A","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.6,2.8],[-0.134,1],[-0.6,-2.8],[-0.934,-4],[0,0],[0,0]],"o":[[0.933,-3.933],[0.6,-2.8],[0.133,1],[0.6,2.8],[0,0],[0,0],[0,0]],"v":[[26.6,-49.1],[28.9,-59.2],[30,-64.9],[31.1,-59.2],[33.4,-49],[38.7,-27.2],[21.3,-27.2]],"c":true}},"nm":"A","hd":false}],"nm":"A","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"m","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.967,1.167],[-1.8,0],[-1.034,-1.166],[0,-2.2],[0,0],[0,0],[0,0],[-1,1.167],[-1.8,0],[-0.967,-1.166],[0,-2.2],[0,0],[0,0],[0,0],[2.066,2.634],[3.333,0],[1.766,-1.9],[0,-2.933],[0,0],[0,0],[0,0],[1.866,2.367],[2.866,0],[1.733,-1.9],[0,-2.933],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-2.2],[0.966,-1.166],[1.8,0],[1.033,1.167],[0,0],[0,0],[0,0],[0,-2.2],[1,-1.166],[1.866,0],[0.966,1.167],[0,0],[0,0],[0,0],[0,-4.2],[-2.067,-2.633],[-2.867,0],[-1.767,1.9],[0,0],[0,0],[0,0],[0,-3.8],[-1.867,-2.366],[-2.8,0],[-1.734,1.9],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[14.7,0],[14.7,-41.7],[16.15,-46.75],[20.3,-48.5],[24.55,-46.75],[26.1,-41.7],[26.1,0],[33.9,0],[33.9,-41.7],[35.4,-46.75],[39.6,-48.5],[43.85,-46.75],[45.3,-41.7],[45.3,0],[54.3,0],[54.3,-41.8],[51.2,-52.05],[43.1,-56],[36.15,-53.15],[33.5,-45.9],[35.2,-48.2],[31.2,-48.2],[33.9,-43.2],[31.1,-52.45],[24,-56],[17.2,-53.15],[14.6,-45.9],[16.1,-48.2],[14.2,-48.2],[14.2,-55],[5.7,-55],[5.7,0]],"c":true}},"nm":"m","hd":false}],"nm":"m","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"C","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.267,1.733],[-1.8,3.167],[0,4.334],[0,0],[2.1,-2.133],[3.733,0],[2.133,2.134],[0,4],[0,0],[-2.134,2.1],[-3.8,0],[-2.1,-2.133],[0,-4],[0,0],[1.8,3.167],[3.266,1.734],[4.466,0],[3.3,-1.7],[1.8,-3.133],[0,-4.466],[0,0],[-1.8,-3.166],[-3.3,-1.7],[-4.467,0]],"o":[[3.266,-1.733],[1.8,-3.166],[0,0],[0,4],[-2.1,2.134],[-3.8,0],[-2.134,-2.133],[0,0],[0,-4],[2.133,-2.1],[3.733,0],[2.1,2.134],[0,0],[0,-4.333],[-1.8,-3.166],[-3.267,-1.733],[-4.467,0],[-3.3,1.7],[-1.8,3.134],[0,0],[0,4.4],[1.8,3.167],[3.3,1.7],[4.466,0]],"v":[[42,-1.6],[49.6,-8.95],[52.3,-20.2],[42.3,-20.2],[39.15,-11],[30.4,-7.8],[21.5,-11],[18.3,-20.2],[18.3,-52.9],[21.5,-62.05],[30.4,-65.2],[39.15,-62],[42.3,-52.8],[52.3,-52.8],[49.6,-64.05],[42,-71.4],[30.4,-74],[18.75,-71.45],[11.1,-64.2],[8.4,-52.8],[8.4,-20.2],[11.1,-8.85],[18.75,-1.55],[30.4,1]],"c":true}},"nm":"C","hd":false}],"nm":"C","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"h","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.067,2.234],[-3.6,0],[-2,-2.066],[0,-3.8],[0,0],[0,0],[0,0],[3.266,3.467],[5.466,0],[2.633,-2.433],[0,-4.333],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-4.066],[2.066,-2.233],[3.466,0],[2,2.067],[0,0],[0,0],[0,0],[0,-5.866],[-3.267,-3.466],[-4.6,0],[-2.634,2.434],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[18.7,0],[18.7,-34.8],[21.8,-44.25],[30.3,-47.6],[38.5,-44.5],[41.5,-35.7],[41.5,0],[51.4,0],[51.4,-36.8],[46.5,-50.8],[33.4,-56],[22.55,-52.35],[18.6,-42.2],[20.9,-44.5],[18.6,-44.5],[18.7,-55],[18.7,-73],[8.8,-73],[8.8,0]],"c":true}},"nm":"h","hd":false}],"nm":"h","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"k","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[19,0],[19,-24.1],[29.2,-24.1],[44.6,0],[56,0],[37.7,-28.7],[55.7,-55],[44.5,-55],[29.2,-32.6],[19,-32.6],[19,-73],[9.1,-73],[9.1,0]],"c":true}},"nm":"k","hd":false}],"nm":"k","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"B","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.3,1.667],[-1.8,3.067],[0,4.134],[3.466,3.434],[5.666,-0.066],[0,0],[-3.1,2.934],[0,5],[1.766,2.834],[3.233,1.5],[4.533,0],[0,0],[0,0]],"o":[[4.533,0],[3.3,-1.666],[1.8,-3.066],[0,-5.8],[-3.467,-3.433],[0,0],[5.266,0.067],[3.1,-2.933],[0,-3.933],[-1.767,-2.833],[-3.234,-1.5],[0,0],[0,0],[0,0]],"v":[[31.4,0],[43.15,-2.5],[50.8,-9.6],[53.5,-20.4],[48.3,-34.25],[34.6,-39.3],[34.6,-37.9],[47.15,-42.2],[51.8,-54.1],[49.15,-64.25],[41.65,-70.75],[30,-73],[8.9,-73],[8.9,0]],"c":true}},"nm":"B","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.334,-2.4],[0,-3.866],[2.333,-2.166],[4.066,0],[0,0]],"o":[[0,0],[4.066,0],[2.333,2.4],[0,3.734],[-2.334,2.167],[0,0],[0,0]],"v":[[18.6,-33.8],[30.5,-33.8],[40.1,-30.2],[43.6,-20.8],[40.1,-11.95],[30.5,-8.7],[18.6,-8.7]],"c":true}},"nm":"B","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.1,-1.966],[0,-3.466],[2.133,-1.966],[3.733,0],[0,0]],"o":[[0,0],[3.733,0],[2.1,1.967],[0,3.4],[-2.134,1.967],[0,0],[0,0]],"v":[[18.6,-64.3],[30,-64.3],[38.75,-61.35],[41.9,-53.2],[38.7,-45.15],[29.9,-42.2],[18.6,-42.2]],"c":true}},"nm":"B","hd":false}],"nm":"B","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"I","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[49.9,0],[49.9,-9],[35,-9],[35,-64],[49.9,-64],[49.9,-73],[10.1,-73],[10.1,-64],[25,-64],[25,-9],[10.1,-9],[10.1,0]],"c":true}},"nm":"I","hd":false}],"nm":"I","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"I","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[51,0],[51,-11.3],[36.3,-11.3],[36.3,-61.7],[51,-61.7],[51,-73],[9,-73],[9,-61.7],[23.7,-61.7],[23.7,-11.3],[9,-11.3],[9,0]],"c":true}},"nm":"I","hd":false}],"nm":"I","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"n","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.767,1.867],[-3.134,0],[-1.734,-1.8],[0,-3.333],[0,0],[0,0],[0,0],[3.233,3.6],[5.4,0],[2.633,-2.566],[0,-4.466],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-3.466],[1.766,-1.866],[3.066,0],[1.733,1.8],[0,0],[0,0],[0,0],[0,-6.066],[-3.234,-3.6],[-4.6,0],[-2.634,2.567],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.2,0],[20.2,-34.4],[22.85,-42.4],[30.2,-45.2],[37.4,-42.5],[40,-34.8],[40,0],[52.5,0],[52.5,-36.1],[47.65,-50.6],[34.7,-56],[23.85,-52.15],[19.9,-41.6],[23.3,-44.5],[19.9,-44.5],[19.9,-55],[7.7,-55],[7.7,0]],"c":true}},"nm":"n","hd":false}],"nm":"n","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"i","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[55.8,0],[55.8,-11.3],[38.9,-11.3],[38.9,-55],[9.6,-55],[9.6,-43.7],[26.4,-43.7],[26.4,-11.3],[7.6,-11.3],[7.6,0]],"c":true}},"nm":"i","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.467,1.3],[0,2.2],[1.466,1.3],[2.533,0],[1.466,-1.3],[0,-2.2],[-1.467,-1.3],[-2.534,0]],"o":[[1.466,-1.3],[0,-2.2],[-1.467,-1.3],[-2.534,0],[-1.467,1.3],[0,2.2],[1.466,1.3],[2.533,0]],"v":[[37.8,-66.15],[40,-71.4],[37.8,-76.65],[31.8,-78.6],[25.8,-76.65],[23.6,-71.4],[25.8,-66.15],[31.8,-64.2]],"c":true}},"nm":"i","hd":false}],"nm":"i","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"t","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0.9,1.034],[0,1.6],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.034,-2.966],[-5.134,0]],"o":[[0,0],[0,0],[-1.6,0],[-0.9,-1.033],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,5.067],[3.033,2.967],[0,0]],"v":[[51.9,0],[51.9,-11.3],[36.9,-11.3],[33.15,-12.85],[31.8,-16.8],[31.8,-43.7],[52.9,-43.7],[52.9,-55],[31.8,-55],[31.8,-70.5],[19.2,-70.5],[19.2,-55],[4.3,-55],[4.3,-43.7],[19.2,-43.7],[19.2,-16.5],[23.75,-4.45],[36,0]],"c":true}},"nm":"t","hd":false}],"nm":"t","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"a","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3,2.4],[0,4.067],[0,0],[0,0],[0,0],[0,0],[0,0],[3.933,3.334],[6.8,0],[3.3,-1.4],[1.9,-2.533],[0.2,-3.466],[0,0],[-1.834,1.2],[-2.867,0],[-1.767,-1.466],[0,-2.666],[0,0],[0,0],[3.7,-2.966],[0,-5.4],[-3.267,-3],[-5.667,0]],"o":[[3,-2.4],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-5.8],[-3.934,-3.333],[-4.334,0],[-3.3,1.4],[-1.9,2.534],[0,0],[0.2,-2],[1.833,-1.2],[3.066,0],[1.766,1.467],[0,0],[0,0],[-6.734,0],[-3.7,2.967],[0,5.067],[3.266,3],[5.066,0]],"v":[[36,-2.6],[40.5,-12.3],[38.4,-9.3],[40.4,-9.3],[40.4,0],[52.5,0],[52.5,-37.3],[46.6,-51],[30.5,-56],[19.05,-53.9],[11.25,-48],[8.1,-39],[20,-39],[23.05,-43.8],[30.1,-45.6],[37.35,-43.4],[40,-37.2],[40,-32.6],[26.8,-32.6],[11.15,-28.15],[5.6,-15.6],[10.5,-3.5],[23.9,1]],"c":true}},"nm":"a","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.733,1.467],[0,2.6],[-1.6,1.434],[-2.8,0],[0,0],[0,0],[2.233,-1.8],[3.533,0]],"o":[[-1.734,-1.466],[0,-2.466],[1.6,-1.433],[0,0],[0,0],[0,2.867],[-2.234,1.8],[-3.134,0]],"v":[[20.7,-10.5],[18.1,-16.6],[20.5,-22.45],[27.1,-24.6],[40,-24.6],[40,-18],[36.65,-11],[28,-8.3]],"c":true}},"nm":"a","hd":false}],"nm":"a","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"l","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.166,1.234],[0,2.067],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.534,-2.7],[-2.7,-1.466],[-3.6,0]],"o":[[0,0],[0,0],[-2,0],[-1.167,-1.233],[0,0],[0,0],[0,0],[0,0],[0,0],[0,3.534],[1.533,2.7],[2.7,1.467],[0,0]],"v":[[55.9,0],[55.9,-11.3],[39.8,-11.3],[35.05,-13.15],[33.3,-18.1],[33.3,-73],[2.7,-73],[2.7,-61.7],[20.8,-61.7],[20.8,-17.8],[23.1,-8.45],[29.45,-2.2],[38.9,0]],"c":true}},"nm":"l","hd":false}],"nm":"l","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"z","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[52.2,0],[52.2,-11],[22.1,-11],[51.1,-43.7],[51.1,-55],[8.7,-55],[8.7,-44],[36.5,-44],[7.8,-11.3],[7.8,0]],"c":true}},"nm":"z","hd":false}],"nm":"z","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"e","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.1,2.834],[-0.934,4.734],[0,0],[1.733,-0.966],[2.8,0],[1.866,1.967],[0,3.867],[0,0],[0,0],[0,0],[1.9,3.234],[3.433,1.8],[4.6,0],[3.466,-1.8],[1.9,-3.233],[0,-4.333],[0,0],[-1.9,-3.233],[-3.467,-1.8],[-4.667,0]],"o":[[4.1,-2.833],[0,0],[-0.467,1.867],[-1.734,0.967],[-3.667,0],[-1.867,-1.966],[0,0],[0,0],[0,0],[0,-4.333],[-1.9,-3.233],[-3.434,-1.8],[-4.667,0],[-3.467,1.8],[-1.9,3.234],[0,0],[0,4.334],[1.9,3.234],[3.466,1.8],[5.866,0]],"v":[[45.05,-3.25],[52.6,-14.6],[40.3,-14.6],[37,-10.35],[30.2,-8.9],[21.9,-11.85],[19.1,-20.6],[19.1,-24.5],[53,-24.5],[53,-34.4],[50.15,-45.75],[42.15,-53.3],[30.1,-56],[17.9,-53.3],[9.85,-45.75],[7,-34.4],[7,-20.6],[9.85,-9.25],[17.9,-1.7],[30.1,1]],"c":true}},"nm":"e","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.867,2.067],[-3.6,0],[-1.8,-2.033],[0,-3.8],[0,0]],"o":[[0,0],[0,0],[0,-3.8],[1.866,-2.066],[3.6,0],[1.8,2.034],[0,0],[0,0]],"v":[[41.8,-32.5],[19.1,-32.3],[19.1,-34.4],[21.9,-43.2],[30.1,-46.3],[38.2,-43.25],[40.9,-34.5],[40.9,-31.5]],"c":true}},"nm":"e","hd":false}],"nm":"e","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":".","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.7,1.666],[0,2.867],[1.7,1.7],[2.866,0],[1.7,-1.7],[0,-2.866],[-1.7,-1.666],[-2.867,0]],"o":[[1.7,-1.666],[0,-2.866],[-1.7,-1.7],[-2.867,0],[-1.7,1.7],[0,2.867],[1.7,1.666],[2.866,0]],"v":[[36.85,-1.5],[39.4,-8.3],[36.85,-15.15],[30,-17.7],[23.15,-15.15],[20.6,-8.3],[23.15,-1.5],[30,1]],"c":true}},"nm":".","hd":false}],"nm":".","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"B","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.2,1.634],[-1.734,3.067],[0,4.134],[3.466,3.467],[5.733,-0.133],[0,0],[-3.1,2.934],[0,5.067],[1.7,2.834],[3.166,1.5],[4.466,0],[0,0],[0,0]],"o":[[4.466,0],[3.2,-1.633],[1.733,-3.066],[0,-5.866],[-3.467,-3.466],[0,0],[5.333,0.067],[3.1,-2.933],[0,-3.933],[-1.7,-2.833],[-3.167,-1.5],[0,0],[0,0],[0,0]],"v":[[31.5,0],[43,-2.45],[50.4,-9.5],[53,-20.3],[47.8,-34.3],[34,-39.3],[34,-37.8],[46.65,-42.1],[51.3,-54.1],[48.75,-64.25],[41.45,-70.75],[30,-73],[9.3,-73],[9.3,0]],"c":true}},"nm":"B","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.434,-2.5],[0,-4],[2.433,-2.233],[4.2,0],[0,0]],"o":[[0,0],[4.2,0],[2.433,2.5],[0,3.867],[-2.434,2.234],[0,0],[0,0]],"v":[[18.1,-34.1],[30.5,-34.1],[40.45,-30.35],[44.1,-20.6],[40.45,-11.45],[30.5,-8.1],[18.1,-8.1]],"c":true}},"nm":"B","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.2,-2.066],[0,-3.533],[2.233,-2.066],[3.866,0],[0,0]],"o":[[0,0],[3.866,0],[2.2,2.067],[0,3.534],[-2.234,2.067],[0,0],[0,0]],"v":[[18.1,-64.9],[30,-64.9],[39.1,-61.8],[42.4,-53.4],[39.05,-45],[29.9,-41.9],[18.1,-41.9]],"c":true}},"nm":"B","hd":false}],"nm":"B","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"l","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.266,1.3],[0,2.267],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.334,-2.333],[-2.4,-1.266],[-3.2,0]],"o":[[0,0],[0,0],[-2.134,0],[-1.267,-1.3],[0,0],[0,0],[0,0],[0,0],[0,0],[0,3.134],[1.333,2.334],[2.4,1.267],[0,0]],"v":[[55,0],[55,-8.2],[38,-8.2],[32.9,-10.15],[31,-15.5],[31,-73],[3,-73],[3,-64.8],[22,-64.8],[22,-15.5],[24,-7.3],[29.6,-1.9],[38,0]],"c":true}},"nm":"l","hd":false}],"nm":"l","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"a","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.1,2.334],[0,4],[0,0],[0,0],[0,0],[0,0],[0,0],[3.666,3.267],[6.333,0],[3.1,-1.3],[1.9,-2.333],[0.333,-3.066],[0,0],[-2.2,1.4],[-3.2,0],[-2.034,-1.866],[0,-3.333],[0,0],[0,0],[3.333,-2.933],[0,-5.133],[-3.334,-2.966],[-5.8,0]],"o":[[3.1,-2.333],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-5.6],[-3.667,-3.266],[-3.8,0],[-3.1,1.3],[-1.9,2.334],[0,0],[0.533,-2.266],[2.2,-1.4],[3.6,0],[2.033,1.867],[0,0],[0,0],[-5.667,0],[-3.334,2.934],[0,5.067],[3.333,2.967],[5.133,0]],"v":[[37.55,-2.5],[42.2,-12],[40.7,-10.5],[42.2,-10.5],[42.2,0],[51,0],[51,-37.8],[45.5,-51.1],[30.5,-56],[20.15,-54.05],[12.65,-48.6],[9.3,-40.5],[18.3,-40.5],[22.4,-46],[30.5,-48.1],[38.95,-45.3],[42,-37.5],[42,-32],[25,-32],[11.5,-27.6],[6.5,-15.5],[11.5,-3.45],[25.2,1]],"c":true}},"nm":"a","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.1,1.767],[0,3.067],[-1.734,1.667],[-3,0],[0,0],[0,0],[2.733,-2.133],[4.266,0]],"o":[[-2.1,-1.766],[0,-2.866],[1.733,-1.666],[0,0],[0,0],[0,3.334],[-2.734,2.134],[-3.734,0]],"v":[[18.65,-8.75],[15.5,-16],[18.1,-22.8],[25.2,-25.3],[42,-25.3],[42,-17.5],[37.9,-9.3],[27.4,-6.1]],"c":true}},"nm":"a","hd":false}],"nm":"a","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"c","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.867,3.4],[-0.2,5.867],[0,0],[2.166,-1.933],[3.733,0],[2.333,2.267],[0,4.134],[0,0],[-2.334,2.234],[-3.934,0],[-2.167,-1.9],[-0.2,-3.533],[0,0],[3.866,3.4],[6.333,0],[3.3,-1.666],[1.8,-3.133],[0,-4.4],[0,0],[-1.8,-3.166],[-3.3,-1.666],[-4.4,0]],"o":[[3.866,-3.4],[0,0],[-0.2,3.467],[-2.167,1.934],[-3.934,0],[-2.334,-2.266],[0,0],[0,-4.133],[2.333,-2.233],[3.733,0],[2.166,1.9],[0,0],[-0.2,-5.866],[-3.867,-3.4],[-4.4,0],[-3.3,1.667],[-1.8,3.134],[0,0],[0,4.334],[1.8,3.167],[3.3,1.666],[6.333,0]],"v":[[45.7,-4.1],[51.8,-18],[42.8,-18],[39.25,-9.9],[30.4,-7],[21,-10.4],[17.5,-20],[17.5,-35.1],[21,-44.65],[30.4,-48],[39.25,-45.15],[42.8,-37],[51.8,-37],[45.7,-50.9],[30.4,-56],[18.85,-53.5],[11.2,-46.3],[8.5,-35],[8.5,-20],[11.2,-8.75],[18.85,-1.5],[30.4,1]],"c":true}},"nm":"c","hd":false}],"nm":"c","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"k","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[18.5,0],[18.5,-24.5],[29.2,-24.5],[45.2,0],[55.7,0],[36.9,-28.8],[55.4,-55],[45.1,-55],[29.1,-32.3],[18.5,-32.3],[18.5,-73],[9.5,-73],[9.5,0]],"c":true}},"nm":"k","hd":false}],"nm":"k","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":" ","size":14,"style":"Regular","w":60,"data":{},"fFamily":"JetBrains Mono"},{"ch":"L","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[55,0],[55,-8.2],[22,-8.2],[22,-73],[13,-73],[13,0]],"c":true}},"nm":"L","hd":false}],"nm":"L","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"i","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[55.5,0],[55.5,-8.2],[37,-8.2],[37,-55],[10.5,-55],[10.5,-46.8],[28,-46.8],[28,-8.2],[8.5,-8.2],[8.5,0]],"c":true}},"nm":"i","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.267,1.134],[0,1.934],[1.266,1.167],[2.2,0],[1.266,-1.166],[0,-2],[-1.267,-1.133],[-2.2,0]],"o":[[1.266,-1.133],[0,-2],[-1.267,-1.166],[-2.2,0],[-1.267,1.167],[0,1.934],[1.266,1.134],[2.2,0]],"v":[[36.7,-66.6],[38.6,-71.2],[36.7,-75.95],[31.5,-77.7],[26.3,-75.95],[24.4,-71.2],[26.3,-66.6],[31.5,-64.9]],"c":true}},"nm":"i","hd":false}],"nm":"i","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"s","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.234,2.9],[0,5.067],[2.7,2.534],[5.933,0.934],[0,0],[0,4],[-1.7,1.3],[-3.134,0],[0,0],[-1.7,-1.033],[0,-1.733],[0,0],[3.366,2.5],[5.6,0],[0,0],[3.233,-2.666],[0,-5],[-2.6,-2.533],[-5.467,-0.933],[0,0],[-1.634,-1.366],[0,-2.333],[1.733,-1.433],[3.533,0],[0,0],[1.966,1.167],[0,2.067],[0,0],[-1.634,-2.2],[-2.934,-1.166],[-3.734,0]],"o":[[6.533,0],[3.233,-2.9],[0,-4.8],[-2.7,-2.533],[0,0],[-5.667,-0.933],[0,-2.4],[1.7,-1.3],[0,0],[2.933,0],[1.7,1.034],[0,0],[0,-4.133],[-3.367,-2.5],[0,0],[-6.067,0],[-3.234,2.667],[0,4.467],[2.6,2.534],[0,0],[3.066,0.467],[1.633,1.367],[0,2.4],[-1.734,1.434],[0,0],[-2.934,0],[-1.967,-1.166],[0,0],[0,3],[1.633,2.2],[2.933,1.166],[0,0]],"v":[[32.5,0.8],[47.15,-3.55],[52,-15.5],[47.95,-26.5],[35,-31.7],[27.6,-32.9],[19.1,-40.3],[21.65,-45.85],[28.9,-47.8],[32.7,-47.8],[39.65,-46.25],[42.2,-42.1],[51.4,-42.1],[46.35,-52.05],[32.9,-55.8],[29.1,-55.8],[15.15,-51.8],[10.3,-40.3],[14.2,-29.8],[26.3,-24.6],[33.7,-23.4],[40.75,-20.65],[43.2,-15.1],[40.6,-9.35],[32.7,-7.2],[28.5,-7.2],[21.15,-8.95],[18.2,-13.8],[9,-13.8],[11.45,-6],[18.3,-0.95],[28.3,0.8]],"c":true}},"nm":"s","hd":false}],"nm":"s","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"t","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[1.1,1.167],[0,1.867],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.734,-2.633],[-4.534,0]],"o":[[0,0],[0,0],[-1.8,0],[-1.1,-1.166],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,4.4],[2.733,2.634],[0,0]],"v":[[51,0],[51,-8.2],[36,-8.2],[31.65,-9.95],[30,-14.5],[30,-46.8],[52,-46.8],[52,-55],[30,-55],[30,-70.5],[21,-70.5],[21,-55],[5.5,-55],[5.5,-46.8],[21,-46.8],[21,-14.5],[25.1,-3.95],[36,0]],"c":true}},"nm":"t","hd":false}],"nm":"t","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"e","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.9,2.7],[-0.6,4.6],[0,0],[2.133,-1.233],[3.466,0],[2.2,2.3],[0,4.334],[0,0],[0,0],[0,0],[1.766,3.134],[3.233,1.734],[4.333,0],[3.233,-1.733],[1.766,-3.133],[0,-4.266],[0,0],[-1.767,-3.166],[-3.234,-1.733],[-4.334,0]],"o":[[3.9,-2.7],[0,0],[-0.467,2.467],[-2.134,1.234],[-4.067,0],[-2.2,-2.3],[0,0],[0,0],[0,0],[0,-4.266],[-1.767,-3.133],[-3.234,-1.733],[-4.334,0],[-3.234,1.734],[-1.767,3.134],[0,0],[0,4.2],[1.766,3.167],[3.233,1.733],[5.8,0]],"v":[[44.55,-3.05],[51.3,-14],[42.3,-14],[38.4,-8.45],[30,-6.6],[20.6,-10.05],[17.3,-20],[17.3,-25.3],[51.5,-25.3],[51.5,-35],[48.85,-46.1],[41.35,-53.4],[30,-56],[18.65,-53.4],[11.15,-46.1],[8.5,-35],[8.5,-20],[11.15,-8.95],[18.65,-1.6],[30,1]],"c":true}},"nm":"e","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-2.2,2.334],[-4.067,0],[-2.167,-2.333],[0,-4.333],[0,0]],"o":[[0,0],[0,0],[0,-4.333],[2.2,-2.333],[4.133,0],[2.166,2.334],[0,0],[0,0]],"v":[[43.4,-32.1],[17.3,-32.1],[17.3,-35],[20.6,-45],[30,-48.5],[39.45,-45],[42.7,-35],[42.7,-31.3]],"c":true}},"nm":"e","hd":false}],"nm":"e","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"d","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.734,2.434],[0,4.2],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2.733,2.467],[4.533,0],[3.333,-3.666],[0,-6.333],[0,0],[-3.367,-3.666],[-5.467,0]],"o":[[2.733,-2.433],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-4.133],[-2.734,-2.466],[-5.534,0],[-3.334,3.667],[0,0],[0,6.267],[3.366,3.667],[4.533,0]],"v":[[37.7,-2.65],[41.8,-12.6],[40,-10.5],[41.8,-10.5],[41.8,0],[50.8,0],[50.8,-73],[41.8,-73],[41.8,-57],[42,-44.5],[40,-44.5],[41.8,-42.4],[37.7,-52.3],[26.8,-56],[13.5,-50.5],[8.5,-35.5],[8.5,-19.4],[13.55,-4.5],[26.8,1]],"c":true}},"nm":"d","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.2,2.267],[0,4.267],[0,0],[-2.2,2.267],[-3.8,0],[-2.134,-2.333],[0,-4.133],[0,0],[2.133,-2.333],[3.733,0]],"o":[[-2.2,-2.266],[0,0],[0,-4.266],[2.2,-2.266],[3.733,0],[2.133,2.334],[0,0],[0,4.134],[-2.134,2.334],[-3.8,0]],"v":[[20.8,-10.2],[17.5,-20],[17.5,-35],[20.8,-44.8],[29.8,-48.2],[38.6,-44.7],[41.8,-35],[41.8,-20],[38.6,-10.3],[29.8,-6.8]],"c":true}},"nm":"d","hd":false}],"nm":"d","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"I","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[49.5,0],[49.5,-8.2],[34.6,-8.2],[34.6,-64.8],[49.5,-64.8],[49.5,-73],[10.5,-73],[10.5,-64.8],[25.4,-64.8],[25.4,-8.2],[10.5,-8.2],[10.5,0]],"c":true}},"nm":"I","hd":false}],"nm":"I","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"P","size":14,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-3.334,1.767],[-1.834,3.234],[0,4.334],[1.833,3.2],[3.333,1.767],[4.533,0],[0,0],[0,0]],"o":[[0,0],[0,0],[4.533,0],[3.333,-1.766],[1.833,-3.233],[0,-4.4],[-1.834,-3.2],[-3.334,-1.766],[0,0],[0,0],[0,0]],"v":[[18.2,0],[18.2,-30],[32.7,-30],[44.5,-32.65],[52.25,-40.15],[55,-51.5],[52.25,-62.9],[44.5,-70.35],[32.7,-73],[9.2,-73],[9.2,0]],"c":true}},"nm":"P","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.367,-2.4],[0,-4.133],[2.366,-2.433],[3.933,0],[0,0]],"o":[[0,0],[3.933,0],[2.366,2.4],[0,4.067],[-2.367,2.434],[0,0],[0,0]],"v":[[18.2,-64.9],[32.7,-64.9],[42.15,-61.3],[45.7,-51.5],[42.15,-41.75],[32.7,-38.1],[18.2,-38.1]],"c":true}},"nm":"P","hd":false}],"nm":"P","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"A","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[16.3,0],[20.3,-17.7],[39.7,-17.7],[43.7,0],[56.5,0],[38,-73],[21.9,-73],[3.5,0]],"c":true}},"nm":"A","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-0.5,2.634],[-0.2,1.2],[-0.534,-2.633],[-0.734,-3.266],[0,0],[0,0]],"o":[[0.8,-3.2],[0.5,-2.633],[0.2,1.2],[0.533,2.634],[0,0],[0,0],[0,0]],"v":[[27,-47.6],[28.95,-56.35],[30,-62.1],[31.1,-56.35],[33,-47.5],[37.4,-27.9],[22.6,-27.9]],"c":true}},"nm":"A","hd":false}],"nm":"A","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"p","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-2.867,-3.1],[-4.8,0],[-2.667,1.733],[-1.5,3.167],[0,4.267],[0,0],[3.266,3.8],[5.466,0],[2.866,-3.066],[0,-5.4],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,5.334],[2.866,3.1],[3.666,0],[2.666,-1.733],[1.5,-3.166],[0,0],[0,-6.4],[-3.267,-3.8],[-4.8,0],[-2.867,3.067],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[20.2,18],[20.2,2.6],[19.9,-9.9],[22.7,-9.9],[19.2,-16.3],[23.5,-3.65],[35,1],[44.5,-1.6],[50.75,-8.95],[53,-20.1],[53,-35],[48.1,-50.3],[35,-56],[23.5,-51.4],[19.2,-38.7],[22.7,-45.1],[19.9,-45.1],[19.9,-55],[7.7,-55],[7.7,18]],"c":true}},"nm":"p","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.8,1.934],[0,3.534],[0,0],[-1.8,1.934],[-3.2,0],[-1.767,-1.866],[0,-3.466],[0,0],[1.766,-1.866],[3.2,0]],"o":[[-1.8,-1.933],[0,0],[0,-3.533],[1.8,-1.933],[3.2,0],[1.766,1.867],[0,0],[0,3.467],[-1.767,1.867],[-3.2,0]],"v":[[22.9,-12.7],[20.2,-20.9],[20.2,-34.1],[22.9,-42.3],[30.4,-45.2],[37.85,-42.4],[40.5,-34.4],[40.5,-20.6],[37.85,-12.6],[30.4,-9.8]],"c":true}},"nm":"p","hd":false}],"nm":"p","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"r","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.767,1.934],[-3.334,0],[-1.767,-1.866],[0,-3.466],[0,0],[0,0],[0,0],[3.4,3.734],[5.666,0],[2.733,-2.566],[0,-4.466],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,-3.8],[1.766,-1.933],[3.333,0],[1.766,1.867],[0,0],[0,0],[0,0],[0,-6.333],[-3.4,-3.733],[-4.734,0],[-2.734,2.567],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[21.8,0],[21.8,-33.7],[24.45,-42.3],[32.1,-45.2],[39.75,-42.4],[42.4,-34.4],[42.4,-30.8],[55.5,-30.8],[55.5,-35.3],[50.4,-50.4],[36.8,-56],[25.6,-52.15],[21.5,-41.6],[24.9,-44.5],[21.5,-44.5],[21.5,-55],[9.3,-55],[9.3,0]],"c":true}},"nm":"r","hd":false}],"nm":"r","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"o","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.434,1.766],[-1.867,3.234],[0,4.4],[0,0],[1.866,3.234],[3.433,1.767],[4.733,0],[3.466,-1.766],[1.866,-3.233],[0,-4.4],[0,0],[-1.867,-3.233],[-3.467,-1.766],[-4.667,0]],"o":[[3.433,-1.766],[1.866,-3.233],[0,0],[0,-4.333],[-1.867,-3.233],[-3.434,-1.766],[-4.667,0],[-3.467,1.767],[-1.867,3.234],[0,0],[0,4.4],[1.866,3.234],[3.466,1.766],[4.733,0]],"v":[[42.25,-1.75],[50.2,-9.25],[53,-20.7],[53,-34.4],[50.2,-45.75],[42.25,-53.25],[30,-55.9],[17.8,-53.25],[9.8,-45.75],[7,-34.3],[7,-20.7],[9.8,-9.25],[17.8,-1.75],[30,0.9]],"c":true}},"nm":"o","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.866,1.834],[0,3.467],[0,0],[-1.867,1.8],[-3.267,0],[-1.834,-1.8],[0,-3.533],[0,0],[1.833,-1.833],[3.333,0]],"o":[[-1.867,-1.833],[0,0],[0,-3.533],[1.866,-1.8],[3.333,0],[1.833,1.8],[0,0],[0,3.467],[-1.834,1.834],[-3.267,0]],"v":[[22.3,-12.75],[19.5,-20.7],[19.5,-34.3],[22.3,-42.3],[30,-45],[37.75,-42.3],[40.5,-34.3],[40.5,-20.7],[37.75,-12.75],[30,-10]],"c":true}},"nm":"o","hd":false}],"nm":"o","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"v","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0.466,-2.133],[0.333,-1.266],[0.5,2.134],[0.666,2],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-0.6,1.934],[-0.467,2.134],[-0.267,-1.266],[-0.5,-2.133],[0,0],[0,0],[0,0],[0,0]],"v":[[38,0],[56.8,-55],[43.9,-55],[33,-21.5],[31.4,-15.4],[30.2,-10.3],[29.05,-15.4],[27.3,-21.6],[16.2,-55],[3.2,-55],[22.1,0]],"c":true}},"nm":"v","hd":false}],"nm":"v","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"d","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-2.8,3.067],[0,5.4],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[2.8,3.1],[4.933,0],[3.333,-3.8],[0,-6.466],[0,0],[-3.334,-3.8],[-5.334,0]],"o":[[2.8,-3.066],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,-5.333],[-2.8,-3.1],[-5.334,0],[-3.334,3.8],[0,0],[0,6.4],[3.333,3.8],[4.933,0]],"v":[[36.6,-3.6],[40.8,-16.3],[37.3,-9.9],[40.1,-9.9],[40.1,0],[52.3,0],[52.3,-73],[39.8,-73],[39.8,-57.6],[40.2,-45.1],[37.3,-45.1],[40.8,-38.7],[36.6,-51.35],[25,-56],[12,-50.3],[7,-34.9],[7,-20],[12,-4.7],[25,1]],"c":true}},"nm":"d","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.8,1.867],[0,3.467],[0,0],[-1.8,1.867],[-3.2,0],[-1.767,-1.933],[0,-3.533],[0,0],[1.766,-1.933],[3.2,0]],"o":[[-1.8,-1.866],[0,0],[0,-3.466],[1.8,-1.866],[3.2,0],[1.766,1.934],[0,0],[0,3.534],[-1.767,1.934],[-3.2,0]],"v":[[22.2,-12.6],[19.5,-20.6],[19.5,-34.4],[22.2,-42.4],[29.7,-45.2],[37.15,-42.3],[39.8,-34.1],[39.8,-20.9],[37.15,-12.7],[29.7,-9.8]],"c":true}},"nm":"d","hd":false}],"nm":"d","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"R","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.434,3.667],[0,4.8],[2,3.234],[3.566,1.8],[4.866,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[4.133,-1.533],[2.433,-3.666],[0,-4.4],[-2,-3.233],[-3.567,-1.8],[0,0],[0,0],[0,0]],"v":[[20.1,0],[20.1,-29],[29,-29],[41.7,0],[55.7,0],[41.2,-30.8],[51.05,-38.6],[54.7,-51.3],[51.7,-62.75],[43.35,-70.3],[30.7,-73],[7.6,-73],[7.6,0]],"c":true}},"nm":"R","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2,-1.966],[0,-3.466],[2,-1.933],[3.533,0],[0,0]],"o":[[0,0],[3.533,0],[2,1.967],[0,3.4],[-2,1.934],[0,0],[0,0]],"v":[[20.1,-62],[30.7,-62],[39,-59.05],[42,-50.9],[39,-42.9],[30.7,-40],[20.1,-40]],"c":true}},"nm":"R","hd":false}],"nm":"R","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"w","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.234,2.3],[-0.2,1.467],[0,0],[-0.3,-2.3],[-0.267,-1.866],[0,0],[0,0],[0,0],[0,0],[0,0],[0.233,-2.333],[0.133,-1.6],[0,0],[0.266,2.367],[0.266,1.934],[0,0],[0,0],[0,0],[0.233,-2.3],[0.2,-1.533],[0,0],[0.166,2.334],[0.266,1.934],[0,0],[0,0],[0,0]],"o":[[0,0],[0.333,-1.866],[0.233,-2.3],[0,0],[0.133,1.467],[0.3,2.3],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.2,1.934],[-0.234,2.334],[0,0],[-0.134,-1.533],[-0.267,-2.366],[0,0],[0,0],[0,0],[-0.267,2],[-0.234,2.3],[0,0],[-0.134,-1.533],[-0.167,-2.333],[0,0],[0,0],[0,0],[0,0]],"v":[[23.3,0],[28.3,-33.9],[29.15,-40.15],[29.8,-45.8],[30.2,-45.8],[30.85,-40.15],[31.7,-33.9],[36.5,0],[49.4,0],[58,-55],[48.3,-55],[43.5,-21.3],[42.85,-14.9],[42.3,-9],[41.8,-9],[41.2,-14.85],[40.4,-21.3],[35.3,-55],[24.9,-55],[19.6,-21.3],[18.85,-14.85],[18.2,-9.1],[17.7,-9.1],[17.25,-14.9],[16.6,-21.3],[12,-55],[2,-55],[10.4,0]],"c":true}},"nm":"w","hd":false}],"nm":"w","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"D","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-3.634,1.9],[-2,3.434],[0,4.6],[0,0],[2,3.4],[3.633,1.867],[4.933,0],[0,0],[0,0]],"o":[[4.933,0],[3.633,-1.9],[2,-3.433],[0,0],[0,-4.666],[-2,-3.4],[-3.634,-1.866],[0,0],[0,0],[0,0]],"v":[[29.2,0],[42.05,-2.85],[50.5,-10.85],[53.5,-22.9],[53.5,-50.2],[50.5,-62.3],[42.05,-70.2],[29.2,-73],[7.5,-73],[7.5,0]],"c":true}},"nm":"D","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-2.134,-2.1],[0,-3.533],[0,0],[2.133,-2.133],[3.6,0],[0,0]],"o":[[0,0],[3.6,0],[2.133,2.1],[0,0],[0,3.534],[-2.134,2.134],[0,0],[0,0]],"v":[[20,-61.8],[29.2,-61.8],[37.8,-58.65],[41,-50.2],[41,-22.9],[37.8,-14.4],[29.2,-11.2],[20,-11.2]],"c":true}},"nm":"D","hd":false}],"nm":"D","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"c","size":13,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.134,3.567],[-0.2,6.134],[0,0],[1.933,-1.566],[3.2,0],[1.933,1.867],[0,3.4],[0,0],[-1.934,1.834],[-3.334,0],[-1.934,-1.566],[-0.2,-2.866],[0,0],[4.133,3.567],[6.933,0],[3.5,-1.766],[1.933,-3.2],[0,-4.466],[0,0],[-1.934,-3.233],[-3.5,-1.766],[-4.667,0]],"o":[[4.133,-3.566],[0,0],[-0.2,2.867],[-1.934,1.567],[-3.334,0],[-1.934,-1.866],[0,0],[0,-3.4],[1.933,-1.833],[3.2,0],[1.933,1.567],[0,0],[-0.2,-6.133],[-4.134,-3.566],[-4.667,0],[-3.5,1.767],[-1.934,3.2],[0,0],[0,4.4],[1.933,3.234],[3.5,1.766],[6.933,0]],"v":[[46.9,-4.35],[53.4,-18.9],[41.2,-18.9],[38,-12.25],[30.3,-9.9],[22.4,-12.7],[19.5,-20.6],[19.5,-34.5],[22.4,-42.35],[30.3,-45.1],[38,-42.75],[41.2,-36.1],[53.4,-36.1],[46.9,-50.65],[30.3,-56],[18.05,-53.35],[9.9,-45.9],[7,-34.4],[7,-20.6],[9.9,-9.15],[18.05,-1.65],[30.3,1]],"c":true}},"nm":"c","hd":false}],"nm":"c","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"/","size":20,"style":"Regular","w":60,"data":{"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":[[17.5,11],[52.9,-83],[42.5,-83],[7.1,11]],"c":true}},"nm":"/","hd":false}],"nm":"/","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"1","size":20,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[54.3,0],[54.3,-9],[38.3,-9],[38.3,-73],[25.4,-73],[8.8,-60.7],[8.8,-49.9],[28.4,-64.6],[28.4,-9],[8.8,-9],[8.8,0]],"c":true}},"nm":"1","hd":false}],"nm":"1","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"0","size":20,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.334,1.766],[-1.834,3.267],[0,4.334],[0,0],[1.833,3.234],[3.3,1.767],[4.6,0],[3.333,-1.766],[1.833,-3.233],[0,-4.4],[0,0],[-1.834,-3.266],[-3.334,-1.766],[-4.534,0]],"o":[[3.333,-1.766],[1.833,-3.266],[0,0],[0,-4.4],[-1.834,-3.233],[-3.3,-1.766],[-4.534,0],[-3.334,1.767],[-1.834,3.234],[0,0],[0,4.334],[1.833,3.267],[3.333,1.766],[4.533,0]],"v":[[41.8,-1.65],[49.55,-9.2],[52.3,-20.6],[52.3,-52.4],[49.55,-63.85],[41.85,-71.35],[30,-74],[18.2,-71.35],[10.45,-63.85],[7.7,-52.4],[7.7,-20.6],[10.45,-9.2],[18.2,-1.65],[30,1]],"c":true}},"nm":"0","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.333,2.434],[0,3.867],[0,0],[-2.334,2.434],[-3.867,0],[-2.334,-2.433],[0,-3.866],[0,0],[2.333,-2.433],[3.866,0]],"o":[[-2.334,-2.433],[0,0],[0,-3.866],[2.333,-2.433],[3.866,0],[2.333,2.434],[0,0],[0,3.867],[-2.334,2.434],[-3.867,0]],"v":[[20.7,-11.15],[17.2,-20.6],[17.2,-52.4],[20.7,-61.85],[30,-65.5],[39.3,-61.85],[42.8,-52.4],[42.8,-20.6],[39.3,-11.15],[30,-7.5]],"c":true}},"nm":"0","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.134,1.167],[0,1.934],[1.133,1.134],[1.866,0],[1.133,-1.133],[0,-1.866],[-1.134,-1.166],[-1.867,0]],"o":[[1.133,-1.166],[0,-1.866],[-1.134,-1.133],[-1.867,0],[-1.134,1.134],[0,1.934],[1.133,1.167],[1.866,0]],"v":[[34.5,-32.15],[36.2,-36.8],[34.5,-41.3],[30,-43],[25.5,-41.3],[23.8,-36.8],[25.5,-32.15],[30,-30.4]],"c":true}},"nm":"0","hd":false}],"nm":"0","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"S","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.434,1.7],[-1.867,3.067],[0,4.067],[2.8,3.767],[4.866,1.467],[0,0],[1.5,1.867],[0,2.6],[-2.2,1.934],[-3.6,0],[-2.134,-1.933],[0,-3.4],[0,0],[3.933,3.567],[6.6,0],[3.966,-3.566],[0,-6],[-2.867,-3.6],[-5.067,-1.533],[0,0],[-1.467,-2.1],[0,-2.733],[2.333,-2.1],[4,0],[2.5,2.1],[0,3.467],[0,0],[-1.934,-3.066],[-3.534,-1.666],[-4.734,0]],"o":[[3.433,-1.7],[1.866,-3.066],[0,-5.066],[-2.8,-3.766],[0,0],[-2.667,-0.8],[-1.5,-1.866],[0,-3.266],[2.2,-1.933],[3.666,0],[2.133,1.934],[0,0],[0,-6],[-3.934,-3.566],[-6.6,0],[-3.967,3.567],[0,4.867],[2.866,3.6],[0,0],[2.533,0.734],[1.466,2.1],[0,3.467],[-2.334,2.1],[-4.134,0],[-2.5,-2.1],[0,0],[0,4.067],[1.933,3.067],[3.533,1.666],[4.666,0]],"v":[[42.45,-1.55],[50.4,-8.7],[53.2,-19.4],[49,-32.65],[37.5,-40.5],[26.9,-43.8],[20.65,-47.8],[18.4,-54.5],[21.7,-62.3],[30.4,-65.2],[39.1,-62.3],[42.3,-54.3],[52.2,-54.3],[46.3,-68.65],[30.5,-74],[14.65,-68.65],[8.7,-54.3],[13,-41.6],[24.9,-33.9],[35.2,-30.8],[41.2,-26.55],[43.4,-19.3],[39.9,-10.95],[30.4,-7.8],[20.45,-10.95],[16.7,-19.3],[6.8,-19.3],[9.7,-8.6],[17.9,-1.5],[30.3,1]],"c":true}},"nm":"S","hd":false}],"nm":"S","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"&","size":15,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-4.867,6.134],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.733,1.934],[0,1.667],[-0.7,1.2],[-1.334,0.667],[-1.734,0],[-1.4,-0.733],[-0.767,-1.333],[0,-1.866],[0,0],[1.533,2.567],[2.866,1.434],[3.933,0],[2.733,-1.333],[1.533,-2.433],[0,-3.2],[-0.967,-2.5],[-2.067,-2.8],[0,0],[1.933,-2.566],[0,-3.733],[0,0],[-3.167,-3.033],[-5.6,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.334,-1.8],[-0.734,-1.933],[0,-1.666],[0.7,-1.2],[1.333,-0.666],[2,0],[1.4,0.734],[0.766,1.334],[0,0],[0,-3.6],[-1.534,-2.566],[-2.867,-1.433],[-3.667,0],[-2.734,1.334],[-1.534,2.434],[0,2.467],[0.966,2.5],[0,0],[-3.6,0.867],[-1.934,2.567],[0,0],[0,5.334],[3.166,3.034],[6.666,0]],"v":[[40.4,-8.2],[46.2,0],[56.8,0],[45.2,-16],[56.4,-36],[46.3,-36],[39.6,-23.9],[23.3,-46.5],[20.2,-52.1],[19.1,-57.5],[20.15,-61.8],[23.2,-64.6],[27.8,-65.6],[32.9,-64.5],[36.15,-61.4],[37.3,-56.6],[46.9,-56.6],[44.6,-65.85],[38,-71.85],[27.8,-74],[18.2,-72],[11.8,-66.35],[9.5,-57.9],[10.95,-50.45],[15.5,-42.5],[16.4,-42.4],[8.1,-37.25],[5.2,-27.8],[5.2,-16.1],[9.95,-3.55],[23.1,1]],"c":true}},"nm":"&","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[1.533,1.5],[0,2.667],[0,0],[-0.967,1.3],[-1.867,0.4],[0,0],[1.966,-1.4],[2.2,0]],"o":[[-1.534,-1.5],[0,0],[0,-2.133],[0.966,-1.3],[0,0],[-1.4,2.4],[-1.967,1.4],[-2.8,0]],"v":[[17.2,-9.85],[14.9,-16.1],[14.9,-27.8],[16.35,-32.95],[20.6,-35.5],[35,-15.4],[29.95,-9.7],[23.7,-7.6]],"c":true}},"nm":"&","hd":false}],"nm":"&","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"0","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.367,1.8],[-1.867,3.234],[0,4.334],[0,0],[1.833,3.234],[3.366,1.767],[4.666,0],[3.4,-1.766],[1.833,-3.233],[0,-4.4],[0,0],[-1.867,-3.233],[-3.367,-1.8],[-4.6,0]],"o":[[3.366,-1.8],[1.866,-3.233],[0,0],[0,-4.4],[-1.834,-3.233],[-3.367,-1.766],[-4.6,0],[-3.4,1.767],[-1.834,3.234],[0,0],[0,4.334],[1.866,3.234],[3.366,1.8],[4.6,0]],"v":[[41.95,-1.7],[49.8,-9.25],[52.6,-20.6],[52.6,-52.4],[49.85,-63.85],[42.05,-71.35],[30,-74],[18,-71.35],[10.15,-63.85],[7.4,-52.4],[7.4,-20.6],[10.2,-9.25],[18.05,-1.7],[30,1]],"c":true}},"nm":"0","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.233,2.267],[0,3.667],[0,0],[-2.234,2.267],[-3.734,0],[-2.234,-2.266],[0,-3.666],[0,0],[2.233,-2.266],[3.733,0]],"o":[[-2.234,-2.266],[0,0],[0,-3.666],[2.233,-2.266],[3.733,0],[2.233,2.267],[0,0],[0,3.667],[-2.234,2.267],[-3.734,0]],"v":[[21.05,-11.7],[17.7,-20.6],[17.7,-52.4],[21.05,-61.3],[30,-64.7],[38.95,-61.3],[42.3,-52.4],[42.3,-20.6],[38.95,-11.7],[30,-8.3]],"c":true}},"nm":"0","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.167,1.2],[0,1.934],[1.166,1.134],[1.866,0],[1.166,-1.166],[0,-1.866],[-1.167,-1.2],[-1.867,0]],"o":[[1.166,-1.2],[0,-1.933],[-1.167,-1.133],[-1.867,0],[-1.167,1.167],[0,1.934],[1.166,1.2],[1.866,0]],"v":[[34.55,-32.1],[36.3,-36.8],[34.55,-41.4],[30,-43.1],[25.45,-41.35],[23.7,-36.8],[25.45,-32.1],[30,-30.3]],"c":true}},"nm":"0","hd":false}],"nm":"0","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"\r","size":40,"style":"Regular","w":0,"fFamily":"JetBrains Mono"},{"ch":"1","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[54.6,0],[54.6,-9.8],[38.9,-9.8],[38.9,-73],[25.3,-73],[8.6,-60.8],[8.6,-49.1],[28.1,-63.6],[28.1,-9.8],[8.7,-9.8],[8.7,0]],"c":true}},"nm":"1","hd":false}],"nm":"1","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"2","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-2,3.767],[0,3.667],[1.866,3.2],[3.333,1.734],[4.6,0],[3.4,-1.8],[1.9,-3.3],[0.133,-4.533],[0,0],[-2.167,2.234],[-3.734,0],[-2.1,-2.166],[0,-3.8],[1.4,-2.633],[2.933,-3.2],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[4.4,-4.733],[2,-3.766],[0,-4.4],[-1.867,-3.2],[-3.334,-1.733],[-4.6,0],[-3.4,1.8],[-1.9,3.3],[0,0],[0,-3.866],[2.166,-2.233],[3.666,0],[2.1,2.167],[0,2.534],[-1.4,2.634],[0,0],[0,0],[0,0]],"v":[[53.1,0],[53.1,-9.8],[21.4,-9.8],[39.4,-28.7],[49,-41.45],[52,-52.6],[49.2,-64],[41.4,-71.4],[29.5,-74],[17.5,-71.3],[9.55,-63.65],[6.5,-51.9],[17.3,-51.9],[20.55,-61.05],[29.4,-64.4],[38.05,-61.15],[41.2,-52.2],[39.1,-44.45],[32.6,-35.7],[8.5,-10.2],[8.5,0]],"c":true}},"nm":"2","hd":false}],"nm":"2","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"3","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.434,1.733],[-1.867,3.167],[0,4.2],[0,0],[4.066,3.8],[6.933,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.067,-2.033],[0,-3.733],[0,0],[2.066,-2.133],[3.8,0],[2.1,2.067],[0,3.667],[0,0],[-1.834,-3.166],[-3.4,-1.733],[-4.6,0]],"o":[[3.433,-1.733],[1.866,-3.166],[0,0],[0,-6.4],[-4.067,-3.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[3.8,0],[2.066,2.034],[0,0],[0,3.534],[-2.067,2.134],[-3.734,0],[-2.1,-2.066],[0,0],[0,4.2],[1.833,3.167],[3.4,1.733],[4.6,0]],"v":[[41.15,-1.6],[49.1,-8.95],[51.9,-20],[51.9,-25.3],[45.8,-40.6],[29.3,-46.3],[29.3,-42.4],[49.4,-63.6],[49.4,-73],[9.6,-73],[9.6,-63.5],[37.6,-63.5],[21,-45.9],[21,-36.9],[29.2,-36.9],[38,-33.85],[41.1,-25.2],[41.1,-20],[38,-11.5],[29.2,-8.3],[20.45,-11.4],[17.3,-20],[6.5,-20],[9.25,-8.95],[17.1,-1.6],[29.1,1]],"c":true}},"nm":"3","hd":false}],"nm":"3","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"4","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[49.9,0],[49.9,-42],[39.1,-42],[39.1,-24.9],[16.9,-24.9],[16.9,-28.8],[45.1,-73],[33.2,-73],[6.4,-31.4],[6.4,-15.2],[39.1,-15.2],[39.1,0]],"c":true}},"nm":"4","hd":false}],"nm":"4","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"5","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.934,3.8],[0,6.467],[0,0],[3.3,3.634],[5.933,0],[2.466,-1.8],[0,-3.133],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.734,1.1],[-2.4,0],[-1.934,-2.033],[0,-3.733],[0,0],[1.966,-2.033],[3.8,0],[1.933,1.467],[0.333,2.667],[0,0],[-3.934,-3.233],[-6.334,0]],"o":[[3.933,-3.8],[0,0],[0,-6.6],[-3.3,-3.633],[-4.134,0],[-2.467,1.8],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.8,-1.933],[1.733,-1.1],[3.8,0],[1.933,2.034],[0,0],[0,3.667],[-1.967,2.034],[-3.4,0],[-1.934,-1.466],[0,0],[0.466,5.467],[3.933,3.234],[7.066,0]],"v":[[46.3,-4.7],[52.2,-20.1],[52.2,-27.2],[47.25,-42.55],[33.4,-48],[23.5,-45.3],[19.8,-37.9],[22.7,-40.5],[19.9,-40.5],[20.1,-63.2],[49.6,-63.2],[49.6,-73],[9.8,-73],[9.3,-32.7],[20,-32.7],[23.8,-37.25],[30,-38.9],[38.6,-35.85],[41.5,-27.2],[41.5,-20.1],[38.55,-11.55],[29.9,-8.5],[21.9,-10.7],[18.5,-16.9],[7.8,-16.9],[14.4,-3.85],[29.8,1]],"c":true}},"nm":"5","hd":false}],"nm":"5","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"6","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.6,1.966],[-2.034,3.567],[0,4.734],[1.666,3.3],[2.966,1.867],[3.933,0],[2.2,-1.1],[1.266,-1.933],[0,0],[0,0],[0,0],[0,0],[1.166,-3.4],[0,-3.133],[-2.034,-3.6],[-3.634,-2],[-4.867,0]],"o":[[3.6,-1.966],[2.033,-3.566],[0,-4.4],[-1.667,-3.3],[-2.967,-1.866],[-2.867,0],[-2.2,1.1],[0,0],[0,0],[0,0],[0,0],[-2.2,3.867],[-1.167,3.4],[0,4.734],[2.033,3.6],[3.633,2],[4.8,0]],"v":[[42.7,-1.95],[51.15,-10.25],[54.2,-22.7],[51.7,-34.25],[44.75,-42],[34.4,-44.8],[26.8,-43.15],[21.6,-38.6],[21.1,-39],[41.1,-73],[29.4,-73],[12.6,-43.6],[7.55,-32.7],[5.8,-22.9],[8.85,-10.4],[17.35,-2],[30.1,1]],"c":true}},"nm":"6","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.5,2.6],[0,4.267],[-1.134,2.1],[-2.034,1.2],[-2.667,0],[-2,-1.2],[-1.134,-2.1],[0,-2.866],[2.5,-2.6],[4,0]],"o":[[-2.5,-2.6],[0,-2.866],[1.133,-2.1],[2.033,-1.2],[2.733,0],[2,1.2],[1.133,2.1],[0,4.267],[-2.5,2.6],[-4,0]],"v":[[20.25,-12.2],[16.5,-22.5],[18.2,-29.95],[22.95,-34.9],[30,-36.7],[37.1,-34.9],[41.8,-29.95],[43.5,-22.5],[39.75,-12.2],[30,-8.3]],"c":true}},"nm":"6","hd":false}],"nm":"6","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"7","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","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":[[29.3,0],[55.1,-63.3],[55.1,-73],[7.3,-73],[7.3,-51.5],[18,-51.5],[18,-63.4],[43.9,-63.4],[17.5,0]],"c":true}},"nm":"7","hd":false}],"nm":"7","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"8","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-3.6,1.633],[-2,2.934],[0,3.934],[2.9,3.6],[5,2],[0,0],[1.733,2.067],[0,2.534],[-2.2,1.934],[-3.534,0],[-2.167,-1.9],[0,-3],[1.733,-2.066],[2.8,-1.133],[0,0],[2.9,-3.566],[0,-4.4],[-2,-2.933],[-3.6,-1.666],[-4.8,0]],"o":[[3.6,-1.633],[2,-2.933],[0,-4.333],[-2.9,-3.6],[0,0],[-2.667,-1.066],[-1.734,-2.066],[0,-2.933],[2.2,-1.933],[3.533,0],[2.166,1.9],[0,2.534],[-1.734,2.067],[0,0],[-4.8,1.934],[-2.9,3.567],[0,3.867],[2,2.934],[3.6,1.666],[4.8,0]],"v":[[42.6,-1.45],[51,-8.3],[54,-18.6],[49.65,-30.5],[37.8,-38.9],[27.3,-43],[20.7,-47.7],[18.1,-54.6],[21.4,-61.9],[30,-64.8],[38.55,-61.95],[41.8,-54.6],[39.2,-47.7],[32.4,-42.9],[21.9,-38.8],[10.35,-30.55],[6,-18.6],[9,-8.4],[17.4,-1.5],[30,1]],"c":true}},"nm":"8","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.5,2.134],[0,3.4],[-1.7,2.234],[-2.867,1.134],[0,0],[-2.667,3.2],[0,3.934],[1.9,2.867],[3.366,1.634],[4.4,0],[3.366,-1.633],[1.9,-2.866],[0,-3.666],[-2.634,-3.166],[-5.067,-2.066],[0,0],[-1.767,-2.233],[0,-2.666],[2.5,-2.133],[4,0]],"o":[[-2.5,-2.133],[0,-2.6],[1.7,-2.233],[0,0],[5.066,-2],[2.666,-3.2],[0,-3.666],[-1.9,-2.866],[-3.367,-1.633],[-4.4,0],[-3.367,1.634],[-1.9,2.867],[0,3.934],[2.633,3.167],[0,0],[2.866,1.134],[1.766,2.234],[0,3.4],[-2.5,2.134],[-4,0]],"v":[[20.25,-11.5],[16.5,-19.8],[19.05,-27.05],[25.9,-32.1],[36.8,-36.6],[48.4,-44.4],[52.4,-55.1],[49.55,-64.9],[41.65,-71.65],[30,-74.1],[18.35,-71.65],[10.45,-64.9],[7.6,-55.1],[11.55,-44.45],[23.1,-36.6],[33.9,-32.2],[40.85,-27.15],[43.5,-19.8],[39.75,-11.5],[30,-8.3]],"c":true}},"nm":"8","hd":false}],"nm":"8","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"},{"ch":"9","size":40,"style":"Regular","w":60,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.2,3.434],[0,3.2],[2.033,3.567],[3.666,2],[4.8,0],[3.633,-2],[2.033,-3.566],[0,-4.733],[-1.7,-3.366],[-2.967,-1.866],[-3.867,0],[-2.167,1.1],[-1.267,1.934],[0,0],[0,0]],"o":[[0,0],[2.2,-3.8],[1.2,-3.433],[0,-4.666],[-2.034,-3.566],[-3.667,-2],[-4.734,0],[-3.634,2],[-2.034,3.567],[0,4.334],[1.7,3.367],[2.966,1.867],[2.866,0],[2.166,-1.1],[0,0],[0,0],[0,0]],"v":[[31,0],[47.3,-29.5],[52.4,-40.35],[54.2,-50.3],[51.15,-62.65],[42.6,-71],[29.9,-74],[17.35,-71],[8.85,-62.65],[5.8,-50.2],[8.35,-38.65],[15.35,-30.8],[25.6,-28],[33.15,-29.65],[38.3,-34.2],[38.8,-33.8],[19,0]],"c":true}},"nm":"9","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.5,2.6],[0,4.267],[-2.5,2.634],[-4,0],[-2.5,-2.633],[0,-4.266],[2.5,-2.6],[4,0]],"o":[[-2.5,-2.6],[0,-4.266],[2.5,-2.633],[4,0],[2.5,2.634],[0,4.267],[-2.5,2.6],[-4,0]],"v":[[20.25,-40.1],[16.5,-50.4],[20.25,-60.75],[30,-64.7],[39.75,-60.75],[43.5,-50.4],[39.75,-40.1],[30,-36.2]],"c":true}},"nm":"9","hd":false}],"nm":"9","bm":0,"hd":false}]},"fFamily":"JetBrains Mono"}]} \ No newline at end of file diff --git a/packages/app-builder/public/locales/en/auth.json b/packages/app-builder/public/locales/en/auth.json new file mode 100644 index 000000000..669f9075a --- /dev/null +++ b/packages/app-builder/public/locales/en/auth.json @@ -0,0 +1,25 @@ +{ + "great_rules_right_tools": "Great rules are built with the right tools.", + "marble_description": "Marble is a real time rule engine for fraud and compliance monitoring, designed for fintech companies and financial institutions.", + "sign_in.google": "Sign in with Google", + "errors.no_account": "No Marble account found for this address.", + "sign_in.email": "Email", + "sign_in.password": "Password", + "sign_in": "Sign in", + "sign_up": "Sign up", + "sign_in.dont_have_an_account": "Don't have an account ? {{signUp}}.", + "sign_in.forgot_password": "Forgot password?", + "sign_in.errors.user_not_found": "No user account found for this address.", + "sign_in.errors.wrong_password_error": "Wrong password.", + "sign_in.errors.invalid_login_credentials": "Invalid login credentials.", + "sign_up.description": "before creating your account, make sure an admin has added you to your organization.", + "sign_up.already_have_an_account_sign_up": "Already have an account ? {{signIn}}.", + "sign_up.errors.weak_password_error": "Password is too weak. It should be at least 6 characters long.", + "sign_up.errors.email_already_exists": "This email is already in use. Please sign in or reset your password.", + "email-verification.description": "Please check your email and click on the link to verify your account. After verifying your email, you will need to login again.", + "email-verification.resend": "resend verification email", + "email-verification.wrong_place": "Wrong place ? go back to {{signIn}}.", + "reset-password.send": "send reset password email", + "reset-password.email_sent": "An email has been sent to you with a link to reset your password.", + "reset-password.wrong_place": "Wrong place ? go back to {{signIn}}." +} diff --git a/packages/app-builder/public/locales/en/common.json b/packages/app-builder/public/locales/en/common.json index e7b58bead..4c414d722 100644 --- a/packages/app-builder/public/locales/en/common.json +++ b/packages/app-builder/public/locales/en/common.json @@ -1,6 +1,5 @@ { "auth.logout": "Log out", - "auth.login": "Login", "search": "Search", "error_one": "{{count}} error", "error_other": "{{count}} errors", @@ -10,6 +9,7 @@ "errors.not_found": "This page could not be found.", "errors.edit.forbidden_not_draft": "You can only edit a draft version of a scenario.", "errors.list.duplicate_list_name": "A list with this name already exist", + "errors.list.duplicate_email": "This email is already used", "errors.data.duplicate_field_name": "A field with this name already exist", "errors.data.duplicate_table_name": "A table with this name already exist", "errors.data.duplicate_link_name": "A link with this name already exist", diff --git a/packages/app-builder/public/locales/en/login.json b/packages/app-builder/public/locales/en/login.json deleted file mode 100644 index 71443a423..000000000 --- a/packages/app-builder/public/locales/en/login.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "title": "Login to your account", - "help.no_account": "Don’t have an account?", - "help.contact_us": "Contact us", - "sign_in.google": "Sign in with Google", - "errors.no_account": "No Marble account found for this address.", - "sign_in_with_email.email": "Email", - "sign_in_with_email.password": "Password", - "sign_in_with_email.sign_in": "Sign in", - "sign_in_with_email.errors.user_not_found": "No user account found for this address.", - "sign_in_with_email.errors.wrong_password_error": "Wrong password.", - "sign_in_with_email.errors.invalid_login_credentials": "Invalid login credentials." -} diff --git a/packages/app-builder/public/locales/fr/common.json b/packages/app-builder/public/locales/fr/common.json index b1cd756ac..5329b0830 100644 --- a/packages/app-builder/public/locales/fr/common.json +++ b/packages/app-builder/public/locales/fr/common.json @@ -1,6 +1,5 @@ { "auth.logout": "Se déconnecter", - "auth.login": "Connexion", "cancel": "Annuler", "error_one": "erreur", "error_other": "erreurs", diff --git a/packages/app-builder/public/locales/fr/login.json b/packages/app-builder/public/locales/fr/login.json index 9552b2f85..eafa30067 100644 --- a/packages/app-builder/public/locales/fr/login.json +++ b/packages/app-builder/public/locales/fr/login.json @@ -1,7 +1,4 @@ { - "title": "Connectez-vous à votre compte", - "help.no_account": "Vous n'avez pas de compte ?", - "help.contact_us": "Contactez-nous", "sign_in.google": "Connectez-vous avec Google", "errors.no_account": "Aucun compte Marble trouvé pour cette adresse." } diff --git a/packages/app-builder/src/components/Auth/AuthError.tsx b/packages/app-builder/src/components/Auth/AuthError.tsx new file mode 100644 index 000000000..7b670a61c --- /dev/null +++ b/packages/app-builder/src/components/Auth/AuthError.tsx @@ -0,0 +1,31 @@ +import { type AuthErrors } from '@app-builder/models'; +import clsx from 'clsx'; +import { type ParseKeys } from 'i18next'; +import { useTranslation } from 'react-i18next'; + +import { authI18n } from './auth-i18n'; + +const errorLabels: Record> = { + NoAccount: 'auth:errors.no_account', + Unknown: 'common:errors.unknown', +}; + +export function AuthError({ + error, + className, +}: { + error: AuthErrors; + className?: string; +}) { + const { t } = useTranslation(authI18n); + return ( +

+ {t(errorLabels[error])} +

+ ); +} diff --git a/packages/app-builder/src/components/Auth/ResetPassword.tsx b/packages/app-builder/src/components/Auth/ResetPassword.tsx new file mode 100644 index 000000000..c27c0f10b --- /dev/null +++ b/packages/app-builder/src/components/Auth/ResetPassword.tsx @@ -0,0 +1,95 @@ +import { + FormControl, + FormError, + FormField, + FormItem, + FormLabel, +} from '@app-builder/components/Form'; +import { useSendPasswordResetEmail } from '@app-builder/services/auth/auth.client'; +import { clientServices } from '@app-builder/services/init.client'; +import { zodResolver } from '@hookform/resolvers/zod'; +import * as Sentry from '@sentry/remix'; +import { FormProvider, useForm, useFormContext } from 'react-hook-form'; +import toast from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import { ClientOnly } from 'remix-utils/client-only'; +import { Button, Input } from 'ui-design-system'; +import * as z from 'zod'; + +const resetPasswordFormSchema = z.object({ + email: z.string().email(), +}); +type ResetPasswordFormValues = z.infer; + +export function ResetPassword() { + const { t } = useTranslation(['auth', 'common']); + + const formMethods = useForm>({ + resolver: zodResolver(resetPasswordFormSchema), + defaultValues: { + email: '', + }, + }); + const { control } = formMethods; + + const children = ( + <> + ( + + {t('auth:sign_in.email')} + + + + + + )} + /> + + + ); + + return ( + + {children}}> + {() => {children}} + + + ); +} + +function ResetPasswordForm(props: React.ComponentPropsWithoutRef<'form'>) { + return
; +} + +function ClientResetPasswordForm({ children }: { children: React.ReactNode }) { + const { t } = useTranslation(['auth', 'common']); + + const sendPasswordResetEmail = useSendPasswordResetEmail( + clientServices.authenticationClientService, + ); + + const { handleSubmit } = useFormContext(); + + const handleResetPassword = handleSubmit(async ({ email }) => { + try { + await sendPasswordResetEmail(email); + toast.success(t('auth:reset-password.email_sent')); + } catch (error) { + Sentry.captureException(error); + toast.error(t('common:errors.unknown')); + } + }); + + return ( + { + void handleResetPassword(e); + }} + > + {children} + + ); +} diff --git a/packages/app-builder/src/components/Auth/SendEmailVerification.tsx b/packages/app-builder/src/components/Auth/SendEmailVerification.tsx new file mode 100644 index 000000000..8cbf5c896 --- /dev/null +++ b/packages/app-builder/src/components/Auth/SendEmailVerification.tsx @@ -0,0 +1,61 @@ +import { useResendEmailVerification } from '@app-builder/services/auth/auth.client'; +import { clientServices } from '@app-builder/services/init.client'; +import { getRoute } from '@app-builder/utils/routes'; +import { useNavigate } from '@remix-run/react'; +import * as Sentry from '@sentry/remix'; +import toast from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import { ClientOnly } from 'remix-utils/client-only'; +import { useHydrated } from 'remix-utils/use-hydrated'; +import { Button } from 'ui-design-system'; + +function SendEmailVerificationButton({ onClick }: { onClick?: () => void }) { + const { t } = useTranslation(['auth']); + const isHydrated = useHydrated(); + + return ( + + ); +} + +function ClientSendEmailVerificationButton() { + const { t } = useTranslation(['common']); + + const resendEmailVerification = useResendEmailVerification( + clientServices.authenticationClientService, + ); + + const navigate = useNavigate(); + async function onSendClick() { + try { + const logout = () => navigate(getRoute('/ressources/auth/logout')); + await resendEmailVerification(logout); + } catch (error) { + Sentry.captureException(error); + toast.error(t('common:errors.unknown')); + } + } + + return ( + { + void onSendClick(); + }} + /> + ); +} + +export function SendEmailVerification() { + return ( + }> + {() => } + + ); +} diff --git a/packages/app-builder/src/routes/ressources+/auth+/login-with-email.tsx b/packages/app-builder/src/components/Auth/SignInWithEmailAndPassword.tsx similarity index 64% rename from packages/app-builder/src/routes/ressources+/auth+/login-with-email.tsx rename to packages/app-builder/src/components/Auth/SignInWithEmailAndPassword.tsx index cbb2989c4..10b08dd39 100644 --- a/packages/app-builder/src/routes/ressources+/auth+/login-with-email.tsx +++ b/packages/app-builder/src/components/Auth/SignInWithEmailAndPassword.tsx @@ -6,17 +6,18 @@ import { FormLabel, } from '@app-builder/components/Form'; import { + EmailUnverified, InvalidLoginCredentials, useEmailAndPasswordSignIn, UserNotFoundError, WrongPasswordError, } from '@app-builder/services/auth/auth.client'; +import { type AuthPayload } from '@app-builder/services/auth/auth.server'; import { clientServices } from '@app-builder/services/init.client'; -import { serverServices } from '@app-builder/services/init.server'; import { getRoute } from '@app-builder/utils/routes'; import { zodResolver } from '@hookform/resolvers/zod'; -import { type ActionFunctionArgs, redirect } from '@remix-run/node'; -import { useFetcher } from '@remix-run/react'; +import { useNavigate } from '@remix-run/react'; +import * as Sentry from '@sentry/remix'; import { FormProvider, useForm, useFormContext } from 'react-hook-form'; import toast from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; @@ -24,18 +25,6 @@ import { ClientOnly } from 'remix-utils/client-only'; import { Button, Input } from 'ui-design-system'; import * as z from 'zod'; -export function loader() { - return redirect('/login-with-email'); -} - -export async function action({ request }: ActionFunctionArgs) { - const { authService } = serverServices; - return await authService.authenticate(request, { - successRedirect: '/home', - failureRedirect: '/login-with-email', - }); -} - const emailAndPasswordFormSchema = z.object({ credentials: z.object({ email: z.string().email(), @@ -44,8 +33,12 @@ const emailAndPasswordFormSchema = z.object({ }); type EmailAndPasswordFormValues = z.infer; -export function SignInWithEmail() { - const { t } = useTranslation(['login', 'common']); +export function SignInWithEmailAndPassword({ + signIn, +}: { + signIn: (authPayload: AuthPayload) => void; +}) { + const { t } = useTranslation(['auth', 'common']); const formMethods = useForm>({ resolver: zodResolver(emailAndPasswordFormSchema), @@ -62,7 +55,7 @@ export function SignInWithEmail() { name="credentials.email" render={({ field }) => ( - {t('login:sign_in_with_email.email')} + {t('auth:sign_in.email')} @@ -75,7 +68,7 @@ export function SignInWithEmail() { name="credentials.password" render={({ field }) => ( - {t('login:sign_in_with_email.password')} + {t('auth:sign_in.password')} @@ -88,34 +81,43 @@ export function SignInWithEmail() { name="credentials" render={() => } /> - + ); return ( {children}} + fallback={ + + {children} + + } > {() => ( - {children} + + {children} + )} ); } -function SignInWithEmailForm(props: React.ComponentPropsWithoutRef<'form'>) { - return ; +function SignInWithEmailAndPasswordForm( + props: React.ComponentPropsWithoutRef<'form'>, +) { + return ; } -function ClientSignInWithEmailForm({ +function ClientSignInWithEmailAndPasswordForm({ children, + signIn, }: { children: React.ReactNode; + signIn: (authPayload: AuthPayload) => void; }) { - const { t } = useTranslation(['login', 'common']); - const fetcher = useFetcher(); + const { t } = useTranslation(['auth', 'common']); const emailAndPasswordSignIn = useEmailAndPasswordSignIn( clientServices.authenticationClientService, @@ -123,6 +125,7 @@ function ClientSignInWithEmailForm({ const { handleSubmit, setError } = useFormContext(); + const navigate = useNavigate(); const handleEmailSignIn = handleSubmit( async ({ credentials: { email, password } }) => { @@ -132,19 +135,15 @@ function ClientSignInWithEmailForm({ if (!result) return; const { idToken, csrf } = result; if (!idToken) return; - fetcher.submit( - { idToken, csrf }, - { - method: 'POST', - action: getRoute('/ressources/auth/login-with-email'), - }, - ); + signIn({ idToken, csrf }); } catch (error) { - if (error instanceof UserNotFoundError) { + if (error instanceof EmailUnverified) { + navigate(getRoute('/email-verification')); + } else if (error instanceof UserNotFoundError) { setError( 'credentials.email', { - message: t('login:sign_in_with_email.errors.user_not_found'), + message: t('auth:sign_in.errors.user_not_found'), }, { shouldFocus: true }, ); @@ -152,20 +151,16 @@ function ClientSignInWithEmailForm({ setError( 'credentials.password', { - message: t( - 'login:sign_in_with_email.errors.wrong_password_error', - ), + message: t('auth:sign_in.errors.wrong_password_error'), }, { shouldFocus: true }, ); } else if (error instanceof InvalidLoginCredentials) { setError('credentials', { - message: t( - 'login:sign_in_with_email.errors.invalid_login_credentials', - ), + message: t('auth:sign_in.errors.invalid_login_credentials'), }); } else { - //TODO(sentry): colect unexpected errors + Sentry.captureException(error); toast.error(t('common:errors.unknown')); } } @@ -173,12 +168,12 @@ function ClientSignInWithEmailForm({ ); return ( - { void handleEmailSignIn(e); }} > {children} - + ); } diff --git a/packages/app-builder/src/routes/ressources+/auth+/login.tsx b/packages/app-builder/src/components/Auth/SignInWithGoogle.tsx similarity index 61% rename from packages/app-builder/src/routes/ressources+/auth+/login.tsx rename to packages/app-builder/src/components/Auth/SignInWithGoogle.tsx index 4a819dcb2..799747c51 100644 --- a/packages/app-builder/src/routes/ressources+/auth+/login.tsx +++ b/packages/app-builder/src/components/Auth/SignInWithGoogle.tsx @@ -1,27 +1,12 @@ import { useGoogleSignIn } from '@app-builder/services/auth/auth.client'; +import { type AuthPayload } from '@app-builder/services/auth/auth.server'; import { clientServices } from '@app-builder/services/init.client'; -import { serverServices } from '@app-builder/services/init.server'; -import { getRoute } from '@app-builder/utils/routes'; -import { type ActionFunctionArgs, redirect } from '@remix-run/node'; -import { useFetcher } from '@remix-run/react'; import { useTranslation } from 'react-i18next'; import { ClientOnly } from 'remix-utils/client-only'; import { Logo } from 'ui-icons'; -export function loader() { - return redirect('/login'); -} - -export async function action({ request }: ActionFunctionArgs) { - const { authService } = serverServices; - return await authService.authenticate(request, { - successRedirect: '/home', - failureRedirect: '/login', - }); -} - function SignInWithGoogleButton({ onClick }: { onClick?: () => void }) { - const { t } = useTranslation(['login']); + const { t } = useTranslation(['auth']); return ( ); } -function ClientSignInWithGoogle() { - const fetcher = useFetcher(); - +function ClientSignInWithGoogle({ + signIn, +}: { + signIn: (authPayload: AuthPayload) => void; +}) { const googleSignIn = useGoogleSignIn( clientServices.authenticationClientService, ); @@ -52,10 +39,7 @@ function ClientSignInWithGoogle() { if (!result) return; const { idToken, csrf } = result; if (!idToken) return; - fetcher.submit( - { idToken, csrf }, - { method: 'POST', action: getRoute('/ressources/auth/login') }, - ); + signIn({ idToken, csrf }); }; return ( @@ -67,10 +51,14 @@ function ClientSignInWithGoogle() { ); } -export function SignInWithGoogle() { +export function SignInWithGoogle({ + signIn, +}: { + signIn: (authPayload: AuthPayload) => void; +}) { return ( }> - {() => } + {() => } ); } diff --git a/packages/app-builder/src/components/Auth/SignUpWithEmailAndPassword.tsx b/packages/app-builder/src/components/Auth/SignUpWithEmailAndPassword.tsx new file mode 100644 index 000000000..f07e9bf8a --- /dev/null +++ b/packages/app-builder/src/components/Auth/SignUpWithEmailAndPassword.tsx @@ -0,0 +1,159 @@ +import { + FormControl, + FormError, + FormField, + FormItem, + FormLabel, +} from '@app-builder/components/Form'; +import { + EmailExistsError, + useEmailAndPasswordSignUp, + WeakPasswordError, +} from '@app-builder/services/auth/auth.client'; +import { clientServices } from '@app-builder/services/init.client'; +import { zodResolver } from '@hookform/resolvers/zod'; +import * as Sentry from '@sentry/remix'; +import { FormProvider, useForm, useFormContext } from 'react-hook-form'; +import toast from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import { ClientOnly } from 'remix-utils/client-only'; +import { Button, Input } from 'ui-design-system'; +import * as z from 'zod'; + +const emailAndPasswordFormSchema = z.object({ + credentials: z.object({ + email: z.string().email(), + password: z.string().min(1, 'Required'), + }), +}); +type EmailAndPasswordFormValues = z.infer; + +export function SignUpWithEmailAndPassword({ signUp }: { signUp: () => void }) { + const { t } = useTranslation(['auth', 'common']); + + const formMethods = useForm>({ + resolver: zodResolver(emailAndPasswordFormSchema), + defaultValues: { + credentials: { email: '', password: '' }, + }, + }); + const { control } = formMethods; + + const children = ( + <> + ( + + {t('auth:sign_in.email')} + + + + + + )} + /> + ( + + {t('auth:sign_in.password')} + + + + + + )} + /> + } + /> + + + ); + + return ( + + + {children} + + } + > + {() => ( + + {children} + + )} + + + ); +} + +function SignUpWithEmailAndPasswordForm( + props: React.ComponentPropsWithoutRef<'form'>, +) { + return ; +} + +function ClientSignUpWithEmailAndPasswordForm({ + children, + signUp, +}: { + children: React.ReactNode; + signUp: () => void; +}) { + const { t } = useTranslation(['auth', 'common']); + + const emailAndPasswordSignUp = useEmailAndPasswordSignUp( + clientServices.authenticationClientService, + ); + + const { handleSubmit, setError } = + useFormContext(); + + const handleEmailSignIn = handleSubmit( + async ({ credentials: { email, password } }) => { + try { + await emailAndPasswordSignUp(email, password); + signUp(); + } catch (error) { + if (error instanceof EmailExistsError) { + setError( + 'credentials.email', + { + message: t('auth:sign_up.errors.email_already_exists'), + }, + { shouldFocus: true }, + ); + } else if (error instanceof WeakPasswordError) { + setError( + 'credentials.password', + { + message: t('auth:sign_up.errors.weak_password_error'), + }, + { shouldFocus: true }, + ); + } else { + Sentry.captureException(error); + toast.error(t('common:errors.unknown')); + } + } + }, + ); + + return ( + { + void handleEmailSignIn(e); + }} + > + {children} + + ); +} diff --git a/packages/app-builder/src/components/Auth/auth-i18n.ts b/packages/app-builder/src/components/Auth/auth-i18n.ts new file mode 100644 index 000000000..05f2a64f5 --- /dev/null +++ b/packages/app-builder/src/components/Auth/auth-i18n.ts @@ -0,0 +1,3 @@ +import { type Namespace } from 'i18next'; + +export const authI18n = ['auth', 'common'] satisfies Namespace; diff --git a/packages/app-builder/src/components/Form/OldFormField.tsx b/packages/app-builder/src/components/Form/OldFormField.tsx index 1a77c9fff..0c3f47ea1 100644 --- a/packages/app-builder/src/components/Form/OldFormField.tsx +++ b/packages/app-builder/src/components/Form/OldFormField.tsx @@ -176,7 +176,7 @@ const FormError = React.forwardRef< ref={ref} id={formMessageId} className={clsx( - 'text-s font-medium text-red-100 transition-opacity duration-200 ease-in-out', + 'text-s text-left font-medium text-red-100 transition-opacity duration-200 ease-in-out', className, )} {...props} diff --git a/packages/app-builder/src/entry.client.tsx b/packages/app-builder/src/entry.client.tsx index 8b69ef9e1..25f8a1cb3 100644 --- a/packages/app-builder/src/entry.client.tsx +++ b/packages/app-builder/src/entry.client.tsx @@ -21,6 +21,13 @@ Sentry.init({ // Replay is only available in the client new Sentry.Replay(), ], + beforeSend: (event, hint) => { + if (getClientEnv('ENV') === 'development') { + console.error(hint.originalException || hint.syntheticException); + return null; // this drops the event and nothing will be sent to sentry + } + return event; + }, // Set tracesSampleRate to 1.0 to capture 100% // of transactions for performance monitoring. diff --git a/packages/app-builder/src/infra/firebase.ts b/packages/app-builder/src/infra/firebase.ts index a36780254..4a43929c8 100644 --- a/packages/app-builder/src/infra/firebase.ts +++ b/packages/app-builder/src/infra/firebase.ts @@ -6,8 +6,11 @@ import { import { type Auth, connectAuthEmulator, + createUserWithEmailAndPassword, getAuth, GoogleAuthProvider, + sendEmailVerification, + sendPasswordResetEmail, signInWithEmailAndPassword, signInWithPopup, } from 'firebase/auth'; @@ -18,6 +21,9 @@ export type FirebaseClientWrapper = { googleAuthProvider: GoogleAuthProvider; signInWithOAuth: typeof signInWithPopup; signInWithEmailAndPassword: typeof signInWithEmailAndPassword; + createUserWithEmailAndPassword: typeof createUserWithEmailAndPassword; + sendEmailVerification: typeof sendEmailVerification; + sendPasswordResetEmail: typeof sendPasswordResetEmail; }; export function initializeFirebaseClient({ @@ -44,5 +50,8 @@ export function initializeFirebaseClient({ googleAuthProvider, signInWithOAuth: signInWithPopup, signInWithEmailAndPassword: signInWithEmailAndPassword, + createUserWithEmailAndPassword: createUserWithEmailAndPassword, + sendEmailVerification: sendEmailVerification, + sendPasswordResetEmail: sendPasswordResetEmail, }; } diff --git a/packages/app-builder/src/models/auth-errors.ts b/packages/app-builder/src/models/auth-errors.ts index dca90a958..7b8741f7c 100644 --- a/packages/app-builder/src/models/auth-errors.ts +++ b/packages/app-builder/src/models/auth-errors.ts @@ -9,7 +9,7 @@ export function adaptAuthErrors(error: unknown): AuthErrors { error instanceof HttpError && error.status === 401 && typeof error.data === 'string' && - error.data?.includes('unknown user') + error.data?.includes('ErrUnknownUser') ) return 'NoAccount'; diff --git a/packages/app-builder/src/models/inbox.ts b/packages/app-builder/src/models/inbox.ts new file mode 100644 index 000000000..0ebe8a995 --- /dev/null +++ b/packages/app-builder/src/models/inbox.ts @@ -0,0 +1,17 @@ +import { type InboxUserDto, type InboxUserRole } from 'marble-api'; + +export interface InboxUser { + id: string; + inboxId: string; + userId: string; + role: InboxUserRole; +} + +export function adaptInboxUser(inboxUser: InboxUserDto): InboxUser { + return { + id: inboxUser.id, + inboxId: inboxUser.inbox_id, + userId: inboxUser.user_id, + role: inboxUser.role, + }; +} diff --git a/packages/app-builder/src/models/toast-session.ts b/packages/app-builder/src/models/toast-session.ts index e9f4480e4..4c636a617 100644 --- a/packages/app-builder/src/models/toast-session.ts +++ b/packages/app-builder/src/models/toast-session.ts @@ -8,6 +8,7 @@ export const toastMessageScema = z.object({ 'common:empty_scenario_iteration_list', 'common:errors.edit.forbidden_not_draft', 'common:errors.list.duplicate_list_name', + 'common:errors.list.duplicate_email', 'common:errors.data.duplicate_field_name', 'common:errors.data.duplicate_table_name', 'common:errors.data.duplicate_link_name', diff --git a/packages/app-builder/src/repositories/AuthenticationRepository.ts b/packages/app-builder/src/repositories/AuthenticationRepository.ts index 7eaa6d5d0..bb8818da2 100644 --- a/packages/app-builder/src/repositories/AuthenticationRepository.ts +++ b/packages/app-builder/src/repositories/AuthenticationRepository.ts @@ -1,4 +1,6 @@ import { type FirebaseClientWrapper } from '@app-builder/infra/firebase'; +import { getClientEnv } from '@app-builder/utils/environment.client'; +import { getRoute } from '@app-builder/utils/routes'; export interface AuthenticationClientRepository { googleSignIn: (locale: string) => Promise; @@ -6,17 +8,27 @@ export interface AuthenticationClientRepository { locale: string, email: string, password: string, - ) => Promise; + ) => Promise< + { idToken: string; emailVerified: true } | { emailVerified: false } + >; + emailAndPassswordSignUp: ( + locale: string, + email: string, + password: string, + ) => Promise; + resendEmailVerification: ( + locale: string, + logout: () => void, + ) => Promise; + sendPasswordResetEmail: (locale: string, email: string) => Promise; firebaseIdToken: () => Promise; } -export function getAuthenticationClientRepository({ - clientAuth, - googleAuthProvider, - signInWithOAuth, - signInWithEmailAndPassword, -}: FirebaseClientWrapper): AuthenticationClientRepository { +export function getAuthenticationClientRepository( + firebaseClient: FirebaseClientWrapper, +): AuthenticationClientRepository { function getClientAuth(locale: string) { + const clientAuth = firebaseClient.clientAuth; if (locale) { clientAuth.languageCode = locale; } else { @@ -27,7 +39,10 @@ export function getAuthenticationClientRepository({ async function googleSignIn(locale: string) { const auth = getClientAuth(locale); - const credential = await signInWithOAuth(auth, googleAuthProvider); + const credential = await firebaseClient.signInWithOAuth( + auth, + firebaseClient.googleAuthProvider, + ); return credential.user.getIdToken(); } @@ -37,24 +52,92 @@ export function getAuthenticationClientRepository({ password: string, ) { const auth = getClientAuth(locale); - const credential = await signInWithEmailAndPassword(auth, email, password); - return credential.user.getIdToken(); + const credential = await firebaseClient.signInWithEmailAndPassword( + auth, + email, + password, + ); + if (!credential.user.emailVerified) { + return { emailVerified: false as const }; + } + return { + idToken: await credential.user.getIdToken(), + emailVerified: true as const, + }; + } + + const emailVerificationActionCodeSettings = { + url: new URL(getRoute('/sign-in'), getClientEnv('MARBLE_APP_DOMAIN')).href, + }; + + async function emailAndPassswordSignUp( + locale: string, + email: string, + password: string, + ) { + const auth = getClientAuth(locale); + const credential = await firebaseClient.createUserWithEmailAndPassword( + auth, + email, + password, + ); + + await firebaseClient.sendEmailVerification( + credential.user, + emailVerificationActionCodeSettings, + ); + } + + async function resendEmailVerification(locale: string, logout: () => void) { + const auth = getClientAuth(locale); + if (!auth.currentUser) { + logout(); + return; + } + + await firebaseClient.sendEmailVerification( + auth.currentUser, + emailVerificationActionCodeSettings, + ); + } + + const passwordResetEmailActionCodeSettings = { + url: new URL(getRoute('/sign-in'), getClientEnv('MARBLE_APP_DOMAIN')).href, + }; + + async function sendPasswordResetEmail(locale: string, email: string) { + const auth = getClientAuth(locale); + + await firebaseClient.sendPasswordResetEmail( + auth, + email, + passwordResetEmailActionCodeSettings, + ); } const firebaseIdToken = () => { // Prefer onAuthStateChanged https://github.com/firebase/firebase-js-sdk/issues/7348#issuecomment-1579320535 // currentUser is not reliable when firebase app is initialising return new Promise((resolve, reject) => { - const unsubscribe = clientAuth.onAuthStateChanged((user) => { - unsubscribe(); - if (user) { - void user.getIdToken().then(resolve); - } else { - reject(new Error('No authenticated user, no token')); - } - }); + const unsubscribe = firebaseClient.clientAuth.onAuthStateChanged( + (user) => { + unsubscribe(); + if (user) { + void user.getIdToken().then(resolve); + } else { + reject(new Error('No authenticated user, no token')); + } + }, + ); }); }; - return { googleSignIn, emailAndPasswordSignIn, firebaseIdToken }; + return { + googleSignIn, + emailAndPasswordSignIn, + emailAndPassswordSignUp, + resendEmailVerification, + sendPasswordResetEmail, + firebaseIdToken, + }; } diff --git a/packages/app-builder/src/repositories/InboxRepository.ts b/packages/app-builder/src/repositories/InboxRepository.ts new file mode 100644 index 000000000..69a98fcf5 --- /dev/null +++ b/packages/app-builder/src/repositories/InboxRepository.ts @@ -0,0 +1,16 @@ +import { type MarbleApi } from '@app-builder/infra/marble-api'; +import { adaptInboxUser, type InboxUser } from '@app-builder/models/inbox'; + +export interface InboxRepository { + listAllInboxUsers(): Promise; +} + +export function getInboxRepository() { + return (marbleApiClient: MarbleApi): InboxRepository => ({ + listAllInboxUsers: async () => { + const { inbox_users } = await marbleApiClient.listAllInboxUsers(); + + return inbox_users.map(adaptInboxUser); + }, + }); +} diff --git a/packages/app-builder/src/repositories/init.server.ts b/packages/app-builder/src/repositories/init.server.ts index 54a553b7f..ef5d5b0fb 100644 --- a/packages/app-builder/src/repositories/init.server.ts +++ b/packages/app-builder/src/repositories/init.server.ts @@ -4,6 +4,7 @@ import { getCaseRepository } from './CaseRepository'; import { getDataModelRepository } from './DataModelRepository'; import { getDecisionRepository } from './DecisionRepository'; import { getEditorRepository } from './EditorRepository'; +import { getInboxRepository } from './InboxRepository'; import { getMarbleAPIRepository } from './MarbleAPIRepository'; import { getOrganizationRepository } from './OrganizationRepository'; import { getScenarioRepository } from './ScenarioRepository'; @@ -32,6 +33,7 @@ export function makeServerRepositories({ ), marbleAPIClient: getMarbleAPIRepository(getMarbleAPIClient), userRepository: getUserRepository(), + inboxRepository: getInboxRepository(), editorRepository: getEditorRepository(), decisionRepository: getDecisionRepository(), caseRepository: getCaseRepository(), diff --git a/packages/app-builder/src/root.tsx b/packages/app-builder/src/root.tsx index 155f79cc8..9fd6e4707 100644 --- a/packages/app-builder/src/root.tsx +++ b/packages/app-builder/src/root.tsx @@ -5,6 +5,7 @@ import { type MetaFunction, } from '@remix-run/node'; import { + Link, Links, LiveReload, Meta, @@ -32,6 +33,7 @@ import { getSegmentScript } from './services/segment/segment.server'; import { SegmentScript } from './services/segment/SegmentScript'; import tailwindStyles from './tailwind.css'; import { getClientEnvVars } from './utils/environment.server'; +import { getRoute } from './utils/routes'; export const links: LinksFunction = () => [ { rel: 'preload', href: logosSVGSpriteHref, as: 'image' }, @@ -122,14 +124,14 @@ export function ErrorBoundary() {
- + - +
diff --git a/packages/app-builder/src/routes/_auth+/_layout.tsx b/packages/app-builder/src/routes/_auth+/_layout.tsx new file mode 100644 index 000000000..a21dd0cbe --- /dev/null +++ b/packages/app-builder/src/routes/_auth+/_layout.tsx @@ -0,0 +1,58 @@ +import { authI18n } from '@app-builder/components/Auth/auth-i18n'; +import { Player } from '@lottiefiles/react-lottie-player'; +import { Outlet } from '@remix-run/react'; +import { Trans, useTranslation } from 'react-i18next'; +import { Logo } from 'ui-icons'; + +export const handle = { + i18n: authI18n, +}; + +export default function AuthLayout() { + const { t } = useTranslation(handle.i18n); + + return ( +
+
+
+
+

+ , + }} + /> +

+

+ {t('auth:marble_description')} +

+
+
+ +
+
+
+
+ + + +
+
+
+
+ ); +} diff --git a/packages/app-builder/src/routes/_auth+/email-verification.tsx b/packages/app-builder/src/routes/_auth+/email-verification.tsx new file mode 100644 index 000000000..53f3eaea1 --- /dev/null +++ b/packages/app-builder/src/routes/_auth+/email-verification.tsx @@ -0,0 +1,49 @@ +import { authI18n } from '@app-builder/components/Auth/auth-i18n'; +import { SendEmailVerification } from '@app-builder/components/Auth/SendEmailVerification'; +import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; +import { type LoaderFunctionArgs } from '@remix-run/node'; +import { Link } from '@remix-run/react'; +import { Trans, useTranslation } from 'react-i18next'; + +export const handle = { + i18n: authI18n, +}; + +export async function loader({ request }: LoaderFunctionArgs) { + const { authService } = serverServices; + await authService.isAuthenticated(request, { + successRedirect: getRoute('/scenarios/'), + }); + return null; +} + +export default function SignUp() { + const { t } = useTranslation(handle.i18n); + + return ( +
+

+ +

+ +

+ + ), + }} + values={{ + signIn: t('auth:sign_in'), + }} + /> +

+
+ ); +} diff --git a/packages/app-builder/src/routes/_auth+/forgot-password.tsx b/packages/app-builder/src/routes/_auth+/forgot-password.tsx new file mode 100644 index 000000000..92c2aba2c --- /dev/null +++ b/packages/app-builder/src/routes/_auth+/forgot-password.tsx @@ -0,0 +1,36 @@ +import { authI18n } from '@app-builder/components/Auth/auth-i18n'; +import { ResetPassword } from '@app-builder/components/Auth/ResetPassword'; +import { getRoute } from '@app-builder/utils/routes'; +import { Link } from '@remix-run/react'; +import { Trans, useTranslation } from 'react-i18next'; + +export const handle = { + i18n: authI18n, +}; + +export default function ForgotPassword() { + const { t } = useTranslation(handle.i18n); + + return ( +
+ +

+ + ), + }} + values={{ + signIn: t('auth:sign_in'), + }} + /> +

+
+ ); +} diff --git a/packages/app-builder/src/routes/_auth+/sign-in.tsx b/packages/app-builder/src/routes/_auth+/sign-in.tsx new file mode 100644 index 000000000..659552cf5 --- /dev/null +++ b/packages/app-builder/src/routes/_auth+/sign-in.tsx @@ -0,0 +1,99 @@ +import { authI18n } from '@app-builder/components/Auth/auth-i18n'; +import { AuthError } from '@app-builder/components/Auth/AuthError'; +import { SignInWithEmailAndPassword } from '@app-builder/components/Auth/SignInWithEmailAndPassword'; +import { SignInWithGoogle } from '@app-builder/components/Auth/SignInWithGoogle'; +import { type AuthPayload } from '@app-builder/services/auth/auth.server'; +import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; +import { + type ActionFunctionArgs, + json, + type LoaderFunctionArgs, +} from '@remix-run/node'; +import { Link, useFetcher, useLoaderData } from '@remix-run/react'; +import { Trans, useTranslation } from 'react-i18next'; + +export const handle = { + i18n: authI18n, +}; + +export async function loader({ request }: LoaderFunctionArgs) { + const { + authService, + authSessionService: { getSession }, + } = serverServices; + await authService.isAuthenticated(request, { + successRedirect: getRoute('/scenarios/'), + }); + const session = await getSession(request); + const error = session.get('authError'); + + return json({ + authError: error?.message, + }); +} + +export async function action({ request }: ActionFunctionArgs) { + const { authService } = serverServices; + return await authService.authenticate(request, { + successRedirect: getRoute('/scenarios/'), + failureRedirect: getRoute('/sign-in'), + }); +} + +export default function Login() { + const { t } = useTranslation(handle.i18n); + const { authError } = useLoaderData(); + + const fetcher = useFetcher(); + const signIn = (authPayload: AuthPayload) => + fetcher.submit(authPayload, { + method: 'POST', + action: getRoute('/sign-in'), + }); + + return ( +
+
+ +
+ +
+
+ or +
+
+ +
+ +

+ + ), + }} + values={{ + signUp: t('auth:sign_up'), + }} + /> +

+ + {t('auth:sign_in.forgot_password')} + +
+ {authError ? : null} +
+ ); +} diff --git a/packages/app-builder/src/routes/_auth+/sign-up.tsx b/packages/app-builder/src/routes/_auth+/sign-up.tsx new file mode 100644 index 000000000..945a8bd9f --- /dev/null +++ b/packages/app-builder/src/routes/_auth+/sign-up.tsx @@ -0,0 +1,64 @@ +import { Callout } from '@app-builder/components'; +import { authI18n } from '@app-builder/components/Auth/auth-i18n'; +import { AuthError } from '@app-builder/components/Auth/AuthError'; +import { SignUpWithEmailAndPassword } from '@app-builder/components/Auth/SignUpWithEmailAndPassword'; +import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; +import { json, type LoaderFunctionArgs } from '@remix-run/node'; +import { Link, useLoaderData, useNavigate } from '@remix-run/react'; +import { Trans, useTranslation } from 'react-i18next'; + +export const handle = { + i18n: authI18n, +}; + +export async function loader({ request }: LoaderFunctionArgs) { + const { + authService, + authSessionService: { getSession }, + } = serverServices; + await authService.isAuthenticated(request, { + successRedirect: getRoute('/scenarios/'), + }); + const session = await getSession(request); + const error = session.get('authError'); + + return json({ + authError: error?.message, + }); +} + +export default function SignUp() { + const { t } = useTranslation(handle.i18n); + const { authError } = useLoaderData(); + + const navigate = useNavigate(); + const signUp = () => navigate(getRoute('/email-verification')); + + return ( +
+ + {t('auth:sign_up.description')} + + +

+ + ), + }} + values={{ + signIn: t('auth:sign_in'), + }} + /> +

+ {authError ? : null} +
+ ); +} diff --git a/packages/app-builder/src/routes/_builder+/$.tsx b/packages/app-builder/src/routes/_builder+/$.tsx index 68f0674c2..a53c181ba 100644 --- a/packages/app-builder/src/routes/_builder+/$.tsx +++ b/packages/app-builder/src/routes/_builder+/$.tsx @@ -1,10 +1,11 @@ import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; import { type LoaderFunctionArgs } from '@remix-run/node'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; return authService.isAuthenticated(request, { - successRedirect: '/scenarios', - failureRedirect: '/login', + successRedirect: getRoute('/scenarios/'), + failureRedirect: getRoute('/sign-in'), }); } diff --git a/packages/app-builder/src/routes/_builder+/_layout.tsx b/packages/app-builder/src/routes/_builder+/_layout.tsx index 4358ac7f3..9f096223a 100644 --- a/packages/app-builder/src/routes/_builder+/_layout.tsx +++ b/packages/app-builder/src/routes/_builder+/_layout.tsx @@ -31,7 +31,7 @@ import { Icon, Logo } from 'ui-icons'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { user, organization } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const [organizationDetail, orgUsers, orgTags] = await Promise.all([ @@ -54,8 +54,8 @@ export default function Builder() { useLoaderData(); useSegmentIdentification(user); - // Refresh is done in the client because it needs to be done in the browser - // This is only added here to prevent "auto login" on /login pages... (/logout do not trigger logout from Firebase) + // Refresh is done in the JSX because it needs to be done in the browser + // This is only added here to prevent "auto sign-in" on /sign-in pages... (/logout do not trigger logout from Firebase) useRefreshToken(); const [expanded, setExpanded] = useState(true); diff --git a/packages/app-builder/src/routes/_builder+/api.tsx b/packages/app-builder/src/routes/_builder+/api.tsx index a8fd0592b..37bf8b4ea 100644 --- a/packages/app-builder/src/routes/_builder+/api.tsx +++ b/packages/app-builder/src/routes/_builder+/api.tsx @@ -1,6 +1,7 @@ import { Page } from '@app-builder/components'; import { serverServices } from '@app-builder/services/init.server'; import { downloadBlob } from '@app-builder/utils/download-blob'; +import { getRoute } from '@app-builder/utils/routes'; import { json, type LinksFunction, @@ -24,7 +25,7 @@ export const links: LinksFunction = () => export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { dataModelRepository } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const openapi = await dataModelRepository.getOpenApiSpec(); diff --git a/packages/app-builder/src/routes/_builder+/cases+/$caseId.tsx b/packages/app-builder/src/routes/_builder+/cases+/$caseId.tsx index 55198d3e8..b2010b03f 100644 --- a/packages/app-builder/src/routes/_builder+/cases+/$caseId.tsx +++ b/packages/app-builder/src/routes/_builder+/cases+/$caseId.tsx @@ -39,7 +39,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const { user, cases, apiClient } = await authService.isAuthenticated( request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }, ); diff --git a/packages/app-builder/src/routes/_builder+/cases+/_index.tsx b/packages/app-builder/src/routes/_builder+/cases+/_index.tsx index 96b7fdd9f..f8af66024 100644 --- a/packages/app-builder/src/routes/_builder+/cases+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/cases+/_index.tsx @@ -10,7 +10,7 @@ import { Icon } from 'ui-icons'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const { inboxes } = await apiClient.listInboxes({ withCaseCount: false }); diff --git a/packages/app-builder/src/routes/_builder+/cases+/inboxes.$inboxId.tsx b/packages/app-builder/src/routes/_builder+/cases+/inboxes.$inboxId.tsx index 61da6578c..a78f950cd 100644 --- a/packages/app-builder/src/routes/_builder+/cases+/inboxes.$inboxId.tsx +++ b/packages/app-builder/src/routes/_builder+/cases+/inboxes.$inboxId.tsx @@ -37,7 +37,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const inboxId = fromParams(params, 'inboxId'); diff --git a/packages/app-builder/src/routes/_builder+/cases+/inboxes._layout.tsx b/packages/app-builder/src/routes/_builder+/cases+/inboxes._layout.tsx index 9e2358ced..dd1748351 100644 --- a/packages/app-builder/src/routes/_builder+/cases+/inboxes._layout.tsx +++ b/packages/app-builder/src/routes/_builder+/cases+/inboxes._layout.tsx @@ -18,7 +18,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const { inboxes } = await apiClient.listInboxes({ withCaseCount: false }); diff --git a/packages/app-builder/src/routes/_builder+/data.tsx b/packages/app-builder/src/routes/_builder+/data.tsx index d887238a5..f8a87b3cb 100644 --- a/packages/app-builder/src/routes/_builder+/data.tsx +++ b/packages/app-builder/src/routes/_builder+/data.tsx @@ -37,7 +37,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { dataModelRepository } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const dataModel = await dataModelRepository.getDataModel(); diff --git a/packages/app-builder/src/routes/_builder+/decisions+/$decisionId.tsx b/packages/app-builder/src/routes/_builder+/decisions+/$decisionId.tsx index 32783616f..85c407e3a 100644 --- a/packages/app-builder/src/routes/_builder+/decisions+/$decisionId.tsx +++ b/packages/app-builder/src/routes/_builder+/decisions+/$decisionId.tsx @@ -13,6 +13,7 @@ import { ScorePanel } from '@app-builder/components/Decisions/Score'; import { TriggerObjectDetail } from '@app-builder/components/Decisions/TriggerObjectDetail'; import { isNotFoundHttpError } from '@app-builder/models'; import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { @@ -35,7 +36,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const decisionId = fromParams(params, 'decisionId'); diff --git a/packages/app-builder/src/routes/_builder+/decisions+/_index.tsx b/packages/app-builder/src/routes/_builder+/decisions+/_index.tsx index 79e3a254e..47e49abd4 100644 --- a/packages/app-builder/src/routes/_builder+/decisions+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/decisions+/_index.tsx @@ -45,7 +45,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { decision, scenario } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedFilterQuery = await parseQuerySafe( diff --git a/packages/app-builder/src/routes/_builder+/lists+/$listId.tsx b/packages/app-builder/src/routes/_builder+/lists+/$listId.tsx index 5992538b6..2a4c70004 100644 --- a/packages/app-builder/src/routes/_builder+/lists+/$listId.tsx +++ b/packages/app-builder/src/routes/_builder+/lists+/$listId.tsx @@ -9,6 +9,7 @@ import { EditList } from '@app-builder/routes/ressources+/lists+/edit'; import { NewListValue } from '@app-builder/routes/ressources+/lists+/value_create'; import { DeleteListValue } from '@app-builder/routes/ressources+/lists+/value_delete'; import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { Link, useLoaderData, useRouteError } from '@remix-run/react'; @@ -28,7 +29,7 @@ import { Icon } from 'ui-icons'; export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const listId = fromParams(params, 'listId'); diff --git a/packages/app-builder/src/routes/_builder+/lists+/_index.tsx b/packages/app-builder/src/routes/_builder+/lists+/_index.tsx index 95a1695e4..804c86ccf 100644 --- a/packages/app-builder/src/routes/_builder+/lists+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/lists+/_index.tsx @@ -22,7 +22,7 @@ import { Icon } from 'ui-icons'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const { custom_lists } = await apiClient.listCustomLists(); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_index.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_index.tsx index d22612fd5..19796f79f 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_index.tsx @@ -16,7 +16,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarioId = fromParams(params, 'scenarioId'); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_layout.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_layout.tsx index 88617d3ac..e99f91255 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_layout.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/_layout.tsx @@ -1,6 +1,6 @@ import { ErrorComponent } from '@app-builder/components'; import { serverServices } from '@app-builder/services/init.server'; -import { type RouteID } from '@app-builder/utils/routes'; +import { getRoute, type RouteID } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { json, @@ -18,7 +18,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarioId = fromParams(params, 'scenarioId'); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_index.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_index.tsx index 996adcc10..f7af7f1b8 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_index.tsx @@ -1,10 +1,21 @@ import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; import { type LoaderFunctionArgs } from '@remix-run/node'; -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; + const { scenarioId, iterationId } = params; + if (!scenarioId || !iterationId) { + return { + redirect: getRoute('/scenarios/'), + }; + } + return authService.isAuthenticated(request, { - successRedirect: './trigger', - failureRedirect: '/login', + successRedirect: getRoute('/scenarios/:scenarioId/i/:iterationId/trigger', { + scenarioId, + iterationId, + }), + failureRedirect: getRoute('/sign-in'), }); } diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_layout.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_layout.tsx index e9281c5ca..d967cc49a 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_layout.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/_layout.tsx @@ -35,7 +35,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { scenario } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarioId = fromParams(params, 'scenarioId'); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/decision.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/decision.tsx index c27eb85ab..020882db4 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/decision.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/decision.tsx @@ -24,6 +24,7 @@ import { useGetScenarioErrorMessage, } from '@app-builder/services/validation'; import { parseFormSafe } from '@app-builder/utils/input-validation'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { zodResolver } from '@hookform/resolvers/zod'; import { type ActionFunctionArgs, json } from '@remix-run/node'; @@ -85,7 +86,7 @@ function getFormSchema(t: TFunction) { export async function action({ request, params }: ActionFunctionArgs) { const { authService, i18nextService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const t = await i18nextService.getFixedT(request, 'scenarios'); const parsedForm = await parseFormSafe(request, getFormSchema(t)); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/rules.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/rules.tsx index ec4a17636..1a70c364f 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/rules.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/rules.tsx @@ -10,6 +10,7 @@ import { useGetScenarioErrorMessage, } from '@app-builder/services/validation'; import { formatNumber } from '@app-builder/utils/format'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams, fromUUID, useParam } from '@app-builder/utils/short-uuid'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { useLoaderData, useNavigate } from '@remix-run/react'; @@ -31,7 +32,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarioIterationId = fromParams(params, 'iterationId'); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/trigger.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/trigger.tsx index aa92ab4df..72cb937a5 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/trigger.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_edit-view+/trigger.tsx @@ -53,7 +53,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const { apiClient, editor, organization } = await authService.isAuthenticated( request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }, ); @@ -98,7 +98,7 @@ export async function action({ request, params }: ActionFunctionArgs) { } = serverServices; const session = await getSession(request); const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); try { diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_layout.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_layout.tsx index cde989992..b86d6745c 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_layout.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/_layout.tsx @@ -3,6 +3,7 @@ import { EditorModeContextProvider } from '@app-builder/services/editor'; import { CurrentScenarioIterationContextProvider } from '@app-builder/services/editor/current-scenario-iteration'; import { serverServices } from '@app-builder/services/init.server'; import { CurrentScenarioValidationContextProvider } from '@app-builder/services/validation/current-scenario-validation'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { Outlet, useLoaderData } from '@remix-run/react'; @@ -16,7 +17,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { scenario } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const iterationId = fromParams(params, 'iterationId'); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/rules.$ruleId.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/rules.$ruleId.tsx index 3f377efc4..81a2d0180 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/rules.$ruleId.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/$scenarioId+/i+/$iterationId+/rules.$ruleId.tsx @@ -39,6 +39,7 @@ import { useGetScenarioErrorMessage, } from '@app-builder/services/validation'; import { formatNumber } from '@app-builder/utils/format'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams, fromUUID, useParam } from '@app-builder/utils/short-uuid'; import { type ActionFunctionArgs, @@ -61,7 +62,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient, editor } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarioId = fromParams(params, 'scenarioId'); @@ -104,7 +105,7 @@ export async function action({ request, params }: ActionFunctionArgs) { const session = await getSession(request); const { editor } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = editRuleFormSchema.safeParse(formValuesRaw); diff --git a/packages/app-builder/src/routes/_builder+/scenarios+/_index.tsx b/packages/app-builder/src/routes/_builder+/scenarios+/_index.tsx index 938b644ff..a6e43bdd1 100644 --- a/packages/app-builder/src/routes/_builder+/scenarios+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/scenarios+/_index.tsx @@ -17,7 +17,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { scenario } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const scenarios = await scenario.listScenarios(); diff --git a/packages/app-builder/src/routes/_builder+/scheduled-executions.tsx b/packages/app-builder/src/routes/_builder+/scheduled-executions.tsx index 29d90f35d..f80625798 100644 --- a/packages/app-builder/src/routes/_builder+/scheduled-executions.tsx +++ b/packages/app-builder/src/routes/_builder+/scheduled-executions.tsx @@ -5,6 +5,7 @@ import { ScheduledExecutionsList, } from '@app-builder/components'; import { serverServices } from '@app-builder/services/init.server'; +import { getRoute } from '@app-builder/utils/routes'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { useLoaderData, useRouteError } from '@remix-run/react'; import { captureRemixErrorBoundaryError } from '@sentry/remix'; @@ -19,7 +20,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const { scheduled_executions } = await apiClient.listScheduledExecutions({}); diff --git a/packages/app-builder/src/routes/_builder+/settings+/_index.tsx b/packages/app-builder/src/routes/_builder+/settings+/_index.tsx index e79ad0152..24fb94941 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/_index.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/_index.tsx @@ -11,7 +11,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { user } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); if (!isAdmin(user)) { return redirect(getRoute('/')); diff --git a/packages/app-builder/src/routes/_builder+/settings+/_layout.tsx b/packages/app-builder/src/routes/_builder+/settings+/_layout.tsx index 0dee7a499..c701c3628 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/_layout.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/_layout.tsx @@ -15,7 +15,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); return null; } diff --git a/packages/app-builder/src/routes/_builder+/settings+/inboxes.$inboxId.tsx b/packages/app-builder/src/routes/_builder+/settings+/inboxes.$inboxId.tsx index 99265425e..076e34a17 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/inboxes.$inboxId.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/inboxes.$inboxId.tsx @@ -6,6 +6,7 @@ import { UpdateInboxUser } from '@app-builder/routes/ressources+/settings+/inbox import { UpdateInbox } from '@app-builder/routes/ressources+/settings+/inboxes+/update'; import { serverServices } from '@app-builder/services/init.server'; import { useOrganizationUsers } from '@app-builder/services/organization/organization-users'; +import { getRoute } from '@app-builder/utils/routes'; import { fromParams } from '@app-builder/utils/short-uuid'; import { json, type LoaderFunctionArgs } from '@remix-run/node'; import { useLoaderData } from '@remix-run/react'; @@ -26,7 +27,7 @@ export const handle = { export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient, cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const inboxId = fromParams(params, 'inboxId'); diff --git a/packages/app-builder/src/routes/_builder+/settings+/inboxes._index.tsx b/packages/app-builder/src/routes/_builder+/settings+/inboxes._index.tsx index e9da2ea6e..3e89f5fcf 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/inboxes._index.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/inboxes._index.tsx @@ -17,7 +17,7 @@ import { Table, useTable } from 'ui-design-system'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient, user } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); if (!isAdmin(user)) { return redirect(getRoute('/')); diff --git a/packages/app-builder/src/routes/_builder+/settings+/tags.tsx b/packages/app-builder/src/routes/_builder+/settings+/tags.tsx index 7073dbc3e..868357c41 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/tags.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/tags.tsx @@ -17,7 +17,7 @@ import { Table, useTable } from 'ui-design-system'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { organization, user } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); if (!isAdmin(user)) { return redirect(getRoute('/')); diff --git a/packages/app-builder/src/routes/_builder+/settings+/users.tsx b/packages/app-builder/src/routes/_builder+/settings+/users.tsx index 2978f7231..fab8b20de 100644 --- a/packages/app-builder/src/routes/_builder+/settings+/users.tsx +++ b/packages/app-builder/src/routes/_builder+/settings+/users.tsx @@ -10,7 +10,6 @@ import { json, type LoaderFunctionArgs, redirect } from '@remix-run/node'; import { useLoaderData } from '@remix-run/react'; import { createColumnHelper, getCoreRowModel } from '@tanstack/react-table'; import clsx from 'clsx'; -import { type InboxUserDto } from 'marble-api'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import * as R from 'remeda'; @@ -18,46 +17,40 @@ import { Table, useTable } from 'ui-design-system'; export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; - const { apiClient, organization, user } = await authService.isAuthenticated( - request, - { - failureRedirect: '/login', - }, - ); + const { user, inbox } = await authService.isAuthenticated(request, { + failureRedirect: getRoute('/sign-in'), + }); if (!isAdmin(user)) { return redirect(getRoute('/')); } - const { inbox_users } = await apiClient.listAllInboxUsers(); - const org = await organization.getCurrentOrganization(); + const inboxUsers = await inbox.listAllInboxUsers(); + + const inboxUsersByUserId = R.pipe( + inboxUsers, + R.groupBy(({ userId }) => userId), + R.mapValues((value) => + R.pipe( + value, + R.groupBy((v) => v.role), + R.mapValues((v) => v.length), + R.toPairs, + ), + ), + ); - return json({ inboxUsers: inbox_users, org, user }); + return json({ inboxUsersByUserId, user }); } const columnHelper = createColumnHelper(); export default function Users() { const { t } = useTranslation(['settings', 'cases']); - const { inboxUsers, org, user } = useLoaderData(); + const { inboxUsersByUserId, user } = useLoaderData(); const { orgUsers } = useOrganizationUsers(); - const inboxUsersByUserId = useMemo( - () => - R.pipe( - inboxUsers as InboxUserDto[], - R.groupBy((user) => user.user_id), - R.mapValues((value) => - R.pipe( - value, - R.groupBy((v) => v.role), - ), - ), - ), - [inboxUsers], - ); - - const columns = useMemo(() => { - const columns = [ + const columns = useMemo( + () => [ columnHelper.accessor((row) => `${row.firstName} ${row.lastName}`, { id: 'name', header: t('settings:users.name'), @@ -75,21 +68,25 @@ export default function Users() { id: 'role', header: t('settings:users.role'), size: 100, - cell: ({ getValue }) => t(tKeyForUserRole(getValue())), + cell: ({ getValue }) => t(tKeyForUserRole(getValue())), }), columnHelper.accessor((row) => row.userId, { id: 'inbox_user_role', header: t('settings:users.inbox_user_role'), size: 200, cell: ({ getValue }) => { - const inboxUsers = inboxUsersByUserId[getValue()]; + const inboxUsers = inboxUsersByUserId[getValue()]; if (!inboxUsers) return null; - return Object.keys(inboxUsers) - .map((role) => { - const count = inboxUsers[role].length; - return t(tKeyForInboxUserRole(role), { count }); - }) - .join(', '); + + return ( +
    + {inboxUsers.map(([role, count]) => { + return ( +
  • {t(tKeyForInboxUserRole(role), { count })}
  • + ); + })} +
+ ); }, }), columnHelper.display({ @@ -107,9 +104,9 @@ export default function Users() { ); }, }), - ]; - return columns; - }, [inboxUsersByUserId, t, user.actorIdentity.userId]); + ], + [inboxUsersByUserId, t, user.actorIdentity.userId], + ); const { table, getBodyProps, rows, getContainerProps } = useTable({ data: orgUsers, @@ -125,7 +122,7 @@ export default function Users() { {t('settings:users')} - + diff --git a/packages/app-builder/src/routes/_builder+/upload+/$objectType.tsx b/packages/app-builder/src/routes/_builder+/upload+/$objectType.tsx index 04f34828c..49cd62f4b 100644 --- a/packages/app-builder/src/routes/_builder+/upload+/$objectType.tsx +++ b/packages/app-builder/src/routes/_builder+/upload+/$objectType.tsx @@ -27,7 +27,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient, user, dataModelRepository } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); if (!user.permissions.canIngestData) { diff --git a/packages/app-builder/src/routes/_index.tsx b/packages/app-builder/src/routes/_index.tsx index 4adceec62..4c6b757f8 100644 --- a/packages/app-builder/src/routes/_index.tsx +++ b/packages/app-builder/src/routes/_index.tsx @@ -1,5 +1,5 @@ import { redirect } from '@remix-run/node'; export function loader() { - return redirect('/login'); + return redirect('/sign-in'); } diff --git a/packages/app-builder/src/routes/healthcheck.ts b/packages/app-builder/src/routes/healthcheck.ts index 785e3bf07..18a3d036e 100644 --- a/packages/app-builder/src/routes/healthcheck.ts +++ b/packages/app-builder/src/routes/healthcheck.ts @@ -7,7 +7,7 @@ async function isServerLive(request: LoaderFunctionArgs['request']) { 'NO_HOST'; const url = new URL('/', `http://${host}`); - return fetch(url.toString(), { method: 'HEAD' }).then((r) => { + return fetch(url.href, { method: 'HEAD' }).then((r) => { if (!r.ok) return Promise.reject(r); }); } diff --git a/packages/app-builder/src/routes/login-with-email.tsx b/packages/app-builder/src/routes/login-with-email.tsx deleted file mode 100644 index b0885d8cd..000000000 --- a/packages/app-builder/src/routes/login-with-email.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { type AuthErrors } from '@app-builder/models'; -import { serverServices } from '@app-builder/services/init.server'; -import { json, type LoaderFunctionArgs } from '@remix-run/node'; -import { useLoaderData } from '@remix-run/react'; -import { type Namespace, type ParseKeys } from 'i18next'; -import { useTranslation } from 'react-i18next'; -import { Logo } from 'ui-icons'; - -import { SignInWithEmail } from './ressources+/auth+/login-with-email'; -import { LanguagePicker } from './ressources+/user+/language'; - -export async function loader({ request }: LoaderFunctionArgs) { - const { - authService, - authSessionService: { getSession }, - } = serverServices; - await authService.isAuthenticated(request, { - successRedirect: '/home', - }); - const session = await getSession(request); - const error = session.get('authError'); - - return json({ - authError: error?.message, - }); -} - -export const handle = { - i18n: ['login', 'common'] satisfies Namespace, -}; - -const errorLabels: Record> = { - NoAccount: 'login:errors.no_account', - Unknown: 'common:errors.unknown', -}; - -export default function LoginWithEmail() { - const { t } = useTranslation(handle.i18n); - const { authError } = useLoaderData(); - - return ( -
-
-
- -
-
-

{t('login:title')}

- -
- -
- - {authError ? ( -

- {t(errorLabels[authError])} -

- ) : null} - -

- {t('login:help.no_account')} {t('login:help.contact_us')} -

-
- -
-
- ); -} diff --git a/packages/app-builder/src/routes/login.tsx b/packages/app-builder/src/routes/login.tsx deleted file mode 100644 index f0493eecc..000000000 --- a/packages/app-builder/src/routes/login.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { type AuthErrors } from '@app-builder/models'; -import { serverServices } from '@app-builder/services/init.server'; -import { json, type LoaderFunctionArgs } from '@remix-run/node'; -import { useLoaderData } from '@remix-run/react'; -import { type Namespace, type ParseKeys } from 'i18next'; -import { useTranslation } from 'react-i18next'; -import { Logo } from 'ui-icons'; - -import { SignInWithGoogle } from './ressources+/auth+/login'; -import { LanguagePicker } from './ressources+/user+/language'; - -export async function loader({ request }: LoaderFunctionArgs) { - const { - authService, - authSessionService: { getSession }, - } = serverServices; - await authService.isAuthenticated(request, { - successRedirect: '/home', - }); - const session = await getSession(request); - const error = session.get('authError'); - - return json({ - authError: error?.message, - }); -} - -export const handle = { - i18n: ['login', 'common'] satisfies Namespace, -}; - -const errorLabels: Record> = { - NoAccount: 'login:errors.no_account', - Unknown: 'common:errors.unknown', -}; - -export default function Login() { - const { t } = useTranslation(handle.i18n); - const { authError } = useLoaderData(); - - return ( -
-
-
- -
-
-

{t('login:title')}

- -
- -
- - {authError ? ( -

- {t(errorLabels[authError])} -

- ) : null} - -

- {t('login:help.no_account')} {t('login:help.contact_us')} -

-
- -
-
- ); -} diff --git a/packages/app-builder/src/routes/ressources+/auth+/logout.tsx b/packages/app-builder/src/routes/ressources+/auth+/logout.tsx index bd10e3425..d066d59ce 100644 --- a/packages/app-builder/src/routes/ressources+/auth+/logout.tsx +++ b/packages/app-builder/src/routes/ressources+/auth+/logout.tsx @@ -5,9 +5,9 @@ import { } from '@remix-run/node'; export async function loader({ request }: LoaderFunctionArgs) { - await serverServices.authService.logout(request, { redirectTo: '/login' }); + await serverServices.authService.logout(request, { redirectTo: '/sign-in' }); } export async function action({ request }: ActionFunctionArgs) { - await serverServices.authService.logout(request, { redirectTo: '/login' }); + await serverServices.authService.logout(request, { redirectTo: '/sign-in' }); } diff --git a/packages/app-builder/src/routes/ressources+/auth+/refresh.tsx b/packages/app-builder/src/routes/ressources+/auth+/refresh.tsx index 90dc3ca47..1c3a1366e 100644 --- a/packages/app-builder/src/routes/ressources+/auth+/refresh.tsx +++ b/packages/app-builder/src/routes/ressources+/auth+/refresh.tsx @@ -7,7 +7,7 @@ import { useFetcher, useNavigate } from '@remix-run/react'; import { useAuthenticityToken } from 'remix-utils/csrf/react'; export function loader() { - return redirect(getRoute('/login')); + return redirect(getRoute('/sign-in')); } export async function action({ request }: ActionFunctionArgs) { diff --git a/packages/app-builder/src/routes/ressources+/cases+/add-comment.tsx b/packages/app-builder/src/routes/ressources+/cases+/add-comment.tsx index 68630da19..d51059777 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/add-comment.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/add-comment.tsx @@ -27,7 +27,7 @@ export async function action({ request }: ActionFunctionArgs) { const session = await getSession(request); const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/cases+/add-to-case.tsx b/packages/app-builder/src/routes/ressources+/cases+/add-to-case.tsx index 73de5911b..b35f45bf8 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/add-to-case.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/add-to-case.tsx @@ -54,7 +54,7 @@ const addToCaseFormSchema = z.discriminatedUnion('newCase', [ export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const inboxes = await apiClient.listInboxes({ withCaseCount: false }); @@ -69,7 +69,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = addToCaseFormSchema.safeParse(await request.json()); diff --git a/packages/app-builder/src/routes/ressources+/cases+/create-case.tsx b/packages/app-builder/src/routes/ressources+/cases+/create-case.tsx index bbf22e47e..9aef3961f 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/create-case.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/create-case.tsx @@ -32,7 +32,7 @@ const createCaseFormSchema = z.object({ export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const inboxes = await apiClient.listInboxes({ withCaseCount: false }); @@ -47,7 +47,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = createCaseFormSchema.safeParse(await request.json()); diff --git a/packages/app-builder/src/routes/ressources+/cases+/edit-inbox.tsx b/packages/app-builder/src/routes/ressources+/cases+/edit-inbox.tsx index f638e99c1..9114568fc 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/edit-inbox.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/edit-inbox.tsx @@ -22,7 +22,7 @@ const schema = z.object({ export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const inboxes = await apiClient.listInboxes({ withCaseCount: false }); @@ -32,7 +32,7 @@ export async function loader({ request }: LoaderFunctionArgs) { export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/cases+/edit-name.tsx b/packages/app-builder/src/routes/ressources+/cases+/edit-name.tsx index c8ad1ea60..006394b3d 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/edit-name.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/edit-name.tsx @@ -16,7 +16,7 @@ const schema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/cases+/edit-status.tsx b/packages/app-builder/src/routes/ressources+/cases+/edit-status.tsx index 6572788f6..a1add94e9 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/edit-status.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/edit-status.tsx @@ -34,7 +34,7 @@ type Schema = z.infer; export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/cases+/edit-tags.tsx b/packages/app-builder/src/routes/ressources+/cases+/edit-tags.tsx index 9715b8a4b..4d35860b5 100644 --- a/packages/app-builder/src/routes/ressources+/cases+/edit-tags.tsx +++ b/packages/app-builder/src/routes/ressources+/cases+/edit-tags.tsx @@ -26,7 +26,7 @@ const schema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { cases } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/data+/createField.tsx b/packages/app-builder/src/routes/ressources+/data+/createField.tsx index 89a268dbe..b2e85830e 100644 --- a/packages/app-builder/src/routes/ressources+/data+/createField.tsx +++ b/packages/app-builder/src/routes/ressources+/data+/createField.tsx @@ -58,7 +58,7 @@ const REQUIRED_OPTIONS = [ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedData = createFieldFormSchema.safeParse(await request.json()); diff --git a/packages/app-builder/src/routes/ressources+/data+/createLink.tsx b/packages/app-builder/src/routes/ressources+/data+/createLink.tsx index 65f5dda80..1928fa2ef 100644 --- a/packages/app-builder/src/routes/ressources+/data+/createLink.tsx +++ b/packages/app-builder/src/routes/ressources+/data+/createLink.tsx @@ -42,7 +42,7 @@ const createLinkFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, createLinkFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/data+/createTable.tsx b/packages/app-builder/src/routes/ressources+/data+/createTable.tsx index 383364ebb..ad78e24b5 100644 --- a/packages/app-builder/src/routes/ressources+/data+/createTable.tsx +++ b/packages/app-builder/src/routes/ressources+/data+/createTable.tsx @@ -36,7 +36,7 @@ const createTableFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, createTableFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/data+/editField.tsx b/packages/app-builder/src/routes/ressources+/data+/editField.tsx index 9766253cf..317c49ea2 100644 --- a/packages/app-builder/src/routes/ressources+/data+/editField.tsx +++ b/packages/app-builder/src/routes/ressources+/data+/editField.tsx @@ -33,7 +33,7 @@ const editFieldFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedData = editFieldFormSchema.safeParse(await request.json()); diff --git a/packages/app-builder/src/routes/ressources+/data+/editTable.tsx b/packages/app-builder/src/routes/ressources+/data+/editTable.tsx index c52f5b784..7beb1811a 100644 --- a/packages/app-builder/src/routes/ressources+/data+/editTable.tsx +++ b/packages/app-builder/src/routes/ressources+/data+/editTable.tsx @@ -31,7 +31,7 @@ const editTableFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, editTableFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/lists+/create.tsx b/packages/app-builder/src/routes/ressources+/lists+/create.tsx index 3f726c5e0..1e38be3bd 100644 --- a/packages/app-builder/src/routes/ressources+/lists+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/lists+/create.tsx @@ -33,7 +33,7 @@ const createListFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, createListFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/lists+/delete.tsx b/packages/app-builder/src/routes/ressources+/lists+/delete.tsx index b73a71721..a9b563023 100644 --- a/packages/app-builder/src/routes/ressources+/lists+/delete.tsx +++ b/packages/app-builder/src/routes/ressources+/lists+/delete.tsx @@ -20,7 +20,7 @@ const deleteListFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, deleteListFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/lists+/edit.tsx b/packages/app-builder/src/routes/ressources+/lists+/edit.tsx index a99bbeac2..c14cb5317 100644 --- a/packages/app-builder/src/routes/ressources+/lists+/edit.tsx +++ b/packages/app-builder/src/routes/ressources+/lists+/edit.tsx @@ -32,7 +32,7 @@ const editListFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, editListFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/lists+/value_create.tsx b/packages/app-builder/src/routes/ressources+/lists+/value_create.tsx index a9c92dee3..e0a6cbd5b 100644 --- a/packages/app-builder/src/routes/ressources+/lists+/value_create.tsx +++ b/packages/app-builder/src/routes/ressources+/lists+/value_create.tsx @@ -31,7 +31,7 @@ const addValueFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, addValueFormSchema); if (!parsedForm.success) { diff --git a/packages/app-builder/src/routes/ressources+/lists+/value_delete.tsx b/packages/app-builder/src/routes/ressources+/lists+/value_delete.tsx index ce29c6a38..ebf408155 100644 --- a/packages/app-builder/src/routes/ressources+/lists+/value_delete.tsx +++ b/packages/app-builder/src/routes/ressources+/lists+/value_delete.tsx @@ -22,7 +22,7 @@ const deleteValueFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, deleteValueFormSchema); if (!parsedForm.success) { diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/create_draft.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/create_draft.tsx index dd10c0676..8cc56dbdb 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/create_draft.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/create_draft.tsx @@ -21,7 +21,7 @@ const createDraftIterationFormSchema = z.object({ export async function action({ request, params }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe( diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/create.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/create.tsx index b29852d21..3e20f226f 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/create.tsx @@ -15,7 +15,7 @@ export const handle = { export async function action({ request, params }: ActionFunctionArgs) { const { authService, i18nextService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const t = await i18nextService.getFixedT(request, 'scenarios'); const scenarioId = fromParams(params, 'scenarioId'); diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/delete.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/delete.tsx index c4200e650..7c9c15603 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/delete.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/delete.tsx @@ -23,7 +23,7 @@ const deleteRuleFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, deleteRuleFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/duplicate.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/duplicate.tsx index 15ddb213c..dca49cc3b 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/duplicate.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/rules+/duplicate.tsx @@ -24,7 +24,7 @@ export async function action({ request }: ActionFunctionArgs) { const { authService, i18nextService } = serverServices; const t = await i18nextService.getFixedT(request, 'scenarios'); const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, duplicateRuleFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/validate-with-given-trigger-or-rule.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/validate-with-given-trigger-or-rule.tsx index 7b5f52738..224ff51fe 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/validate-with-given-trigger-or-rule.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/$scenarioId+/$iterationId+/validate-with-given-trigger-or-rule.tsx @@ -15,7 +15,7 @@ import { useCallback } from 'react'; export async function action({ request, params }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const body = (await request.json()) as { diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/create.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/create.tsx index bf951a3e5..0d73979f5 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/create.tsx @@ -23,7 +23,7 @@ export const handle = { export async function loader({ request }: LoaderFunctionArgs) { const { authService } = serverServices; const { dataModelRepository } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const dataModel = await dataModelRepository.getDataModel(); @@ -41,7 +41,7 @@ const createScenarioFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const parsedForm = await parseFormSafe(request, createScenarioFormSchema); if (!parsedForm.success) { diff --git a/packages/app-builder/src/routes/ressources+/scenarios+/deployment.tsx b/packages/app-builder/src/routes/ressources+/scenarios+/deployment.tsx index da25482ff..b3f60a2bc 100644 --- a/packages/app-builder/src/routes/ressources+/scenarios+/deployment.tsx +++ b/packages/app-builder/src/routes/ressources+/scenarios+/deployment.tsx @@ -49,7 +49,7 @@ const formSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); type Errors = Record< diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/create.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/create.tsx index 668bd6cb8..e07171716 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/create.tsx @@ -36,7 +36,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/delete.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/delete.tsx index 594f7c118..019a8e76c 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/delete.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/delete.tsx @@ -22,7 +22,7 @@ const deleteInboxFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await parseForm(request, deleteInboxFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.create.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.create.tsx index b6175dcd7..cf88a6eef 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.create.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.create.tsx @@ -37,7 +37,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.delete.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.delete.tsx index 1319c7fcb..51fec0471 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.delete.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.delete.tsx @@ -24,7 +24,7 @@ const deleteInboxUserFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await parseForm(request, deleteInboxUserFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.update.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.update.tsx index 8760f84bb..27f45a76f 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.update.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/inbox-users.update.tsx @@ -37,7 +37,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/update.tsx b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/update.tsx index 486732900..be75ef086 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/inboxes+/update.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/inboxes+/update.tsx @@ -37,7 +37,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); diff --git a/packages/app-builder/src/routes/ressources+/settings+/tags+/create.tsx b/packages/app-builder/src/routes/ressources+/settings+/tags+/create.tsx index dfb303588..fba54de9e 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/tags+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/tags+/create.tsx @@ -40,7 +40,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); const submission = parse(formData, { schema: createTagFormSchema }); diff --git a/packages/app-builder/src/routes/ressources+/settings+/tags+/delete.tsx b/packages/app-builder/src/routes/ressources+/settings+/tags+/delete.tsx index 74000870c..bbb8193d2 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/tags+/delete.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/tags+/delete.tsx @@ -22,7 +22,7 @@ const deleteTagFormSchema = z.object({ export async function action({ request }: ActionFunctionArgs) { const { authService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await parseForm(request, deleteTagFormSchema); diff --git a/packages/app-builder/src/routes/ressources+/settings+/tags+/update.tsx b/packages/app-builder/src/routes/ressources+/settings+/tags+/update.tsx index 3c0598f76..07ca7de85 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/tags+/update.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/tags+/update.tsx @@ -36,7 +36,7 @@ export async function action({ request }: ActionFunctionArgs) { toastSessionService: { getSession, commitSession }, } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); const formData = await request.formData(); const submission = parse(formData, { schema: updateTagFormSchema }); diff --git a/packages/app-builder/src/routes/ressources+/settings+/users+/create.tsx b/packages/app-builder/src/routes/ressources+/settings+/users+/create.tsx index 021a6bc2b..3b84e58b9 100644 --- a/packages/app-builder/src/routes/ressources+/settings+/users+/create.tsx +++ b/packages/app-builder/src/routes/ressources+/settings+/users+/create.tsx @@ -3,6 +3,8 @@ import { FormField } from '@app-builder/components/Form/FormField'; import { FormInput } from '@app-builder/components/Form/FormInput'; import { FormLabel } from '@app-builder/components/Form/FormLabel'; import { FormSelect } from '@app-builder/components/Form/FormSelect'; +import { setToastMessage } from '@app-builder/components/MarbleToaster'; +import { isStatusConflictHttpError } from '@app-builder/models'; import { serverServices } from '@app-builder/services/init.server'; import { getRoute } from '@app-builder/utils/routes'; import { conform, useForm } from '@conform-to/react'; @@ -12,6 +14,7 @@ import { useFetcher, useNavigation } from '@remix-run/react'; import { type Namespace, type ParseKeys } from 'i18next'; import { useEffect, useId, useState } from 'react'; import { useTranslation } from 'react-i18next'; +import { AuthenticityTokenInput } from 'remix-utils/csrf/react'; import { Button, Modal, Select } from 'ui-design-system'; import { Icon } from 'ui-icons'; import { z } from 'zod'; @@ -29,10 +32,12 @@ const createUserFormSchema = z.object({ }); export async function action({ request }: ActionFunctionArgs) { - const { authService } = serverServices; + const { authService, csrfService } = serverServices; const { apiClient } = await authService.isAuthenticated(request, { - failureRedirect: '/login', + failureRedirect: getRoute('/sign-in'), }); + await csrfService.validate(request); + const formData = await request.formData(); const submission = parse(formData, { schema: createUserFormSchema }); @@ -48,9 +53,25 @@ export async function action({ request }: ActionFunctionArgs) { role: submission.value.role, organization_id: submission.value.organizationId, }); + return redirect(getRoute('/settings/users')); } catch (error) { - return json(submission); + const { getSession, commitSession } = serverServices.toastSessionService; + const session = await getSession(request); + if (isStatusConflictHttpError(error)) { + setToastMessage(session, { + type: 'error', + messageKey: 'common:errors.list.duplicate_email', + }); + } else { + setToastMessage(session, { + type: 'error', + messageKey: 'common:errors.unknown', + }); + } + return json(submission, { + headers: { 'Set-Cookie': await commitSession(session) }, + }); } } @@ -115,6 +136,7 @@ const CreateUserContent = ({ orgId }: { orgId: string }) => { {t('settings:users.new_user')}
+
{ try { - const idToken = + const result = await authenticationClientRepository.emailAndPasswordSignIn( language, email, password, ); - return { idToken, csrf }; + if (!result.emailVerified) { + throw new EmailUnverified(); + } + return { idToken: result.idToken, csrf }; } catch (error) { if (error instanceof FirebaseError) { switch (error.code) { - case 'auth/user-not-found': + case AuthErrorCodes.USER_DELETED: throw new UserNotFoundError(); - case 'auth/wrong-password': + case AuthErrorCodes.INVALID_PASSWORD: throw new WrongPasswordError(); - case 'auth/invalid-login-credentials': + case AuthErrorCodes.INVALID_LOGIN_CREDENTIALS: throw new InvalidLoginCredentials(); } } @@ -70,10 +74,75 @@ export function useEmailAndPasswordSignIn({ }; } +export class EmailUnverified extends Error {} export class UserNotFoundError extends Error {} export class WrongPasswordError extends Error {} export class InvalidLoginCredentials extends Error {} +export function useEmailAndPasswordSignUp({ + authenticationClientRepository, +}: AuthenticationClientService) { + const { + i18n: { language }, + } = useTranslation(); + const csrf = useAuthenticityToken(); + + return async (email: string, password: string) => { + try { + const idToken = + await authenticationClientRepository.emailAndPassswordSignUp( + language, + email, + password, + ); + return { idToken, csrf }; + } catch (error) { + if (error instanceof FirebaseError) { + switch (error.code) { + case AuthErrorCodes.EMAIL_EXISTS: + throw new EmailExistsError(); + case AuthErrorCodes.WEAK_PASSWORD: + throw new WeakPasswordError(); + } + } + throw error; + } + }; +} + +export class EmailExistsError extends Error {} +export class WeakPasswordError extends Error {} + +export function useResendEmailVerification({ + authenticationClientRepository, +}: AuthenticationClientService) { + const { + i18n: { language }, + } = useTranslation(); + + return async (logout: () => void) => { + await authenticationClientRepository.resendEmailVerification( + language, + logout, + ); + }; +} + +export function useSendPasswordResetEmail({ + authenticationClientRepository, +}: AuthenticationClientService) { + const { + i18n: { language }, + } = useTranslation(); + + return async (email: string) => { + await authenticationClientRepository.sendPasswordResetEmail( + language, + email, + ); + }; +} + export function useBackendInfo({ authenticationClientRepository, }: AuthenticationClientService) { diff --git a/packages/app-builder/src/services/auth/auth.server.ts b/packages/app-builder/src/services/auth/auth.server.ts index dfdba7e1c..6293c2502 100644 --- a/packages/app-builder/src/services/auth/auth.server.ts +++ b/packages/app-builder/src/services/auth/auth.server.ts @@ -9,6 +9,7 @@ import { type CaseRepository } from '@app-builder/repositories/CaseRepository'; import { type DataModelRepository } from '@app-builder/repositories/DataModelRepository'; import { type DecisionRepository } from '@app-builder/repositories/DecisionRepository'; import { type EditorRepository } from '@app-builder/repositories/EditorRepository'; +import { type InboxRepository } from '@app-builder/repositories/InboxRepository'; import { type MarbleAPIRepository } from '@app-builder/repositories/MarbleAPIRepository'; import { type OrganizationRepository } from '@app-builder/repositories/OrganizationRepository'; import { type ScenarioRepository } from '@app-builder/repositories/ScenarioRepository'; @@ -33,6 +34,7 @@ interface AuthenticatedInfo { organization: OrganizationRepository; scenario: ScenarioRepository; user: CurrentUser; + inbox: InboxRepository; } export interface AuthenticationServerService { @@ -70,9 +72,16 @@ export interface AuthenticationServerService { ): Promise; } +const schema = z.object({ + idToken: z.string(), + csrf: z.string(), +}); +export type AuthPayload = z.infer; + export function makeAuthenticationServerService( marbleAPIClient: MarbleAPIRepository, userRepository: (marbleApiClient: MarbleApi) => UserRepository, + inboxRepository: (marbleApiClient: MarbleApi) => InboxRepository, editorRepository: (marbleApiClient: MarbleApi) => EditorRepository, decisionRepository: (marbleApiClient: MarbleApi) => DecisionRepository, caseRepository: (marbleApiClient: MarbleApi) => CaseRepository, @@ -108,12 +117,7 @@ export function makeAuthenticationServerService( let redirectUrl = options.failureRedirect; try { - const { idToken } = await parseForm( - request, - z.object({ - idToken: z.string(), - }), - ); + const { idToken } = await parseForm(request, schema); await csrfService.validate(request); const marbleToken = await marbleApi.postToken( @@ -243,6 +247,7 @@ export function makeAuthenticationServerService( organization: organizationRepository(apiClient, user.organizationId), dataModelRepository: dataModelRepository(apiClient), user, + inbox: inboxRepository(apiClient), }; } diff --git a/packages/app-builder/src/services/i18n/i18next.d.ts b/packages/app-builder/src/services/i18n/i18next.d.ts index 22de6ad1e..8a523b569 100644 --- a/packages/app-builder/src/services/i18n/i18next.d.ts +++ b/packages/app-builder/src/services/i18n/i18next.d.ts @@ -1,11 +1,11 @@ import type api from '../../../public/locales/en/api.json'; +import type auth from '../../../public/locales/en/auth.json'; import type cases from '../../../public/locales/en/cases.json'; import type common from '../../../public/locales/en/common.json'; import type data from '../../../public/locales/en/data.json'; import type decisions from '../../../public/locales/en/decisions.json'; import type filters from '../../../public/locales/en/filters.json'; import type lists from '../../../public/locales/en/lists.json'; -import type login from '../../../public/locales/en/login.json'; import type navigation from '../../../public/locales/en/navigation.json'; import type scenarios from '../../../public/locales/en/scenarios.json'; import type scheduledExecution from '../../../public/locales/en/scheduledExecution.json'; @@ -25,7 +25,7 @@ declare module 'i18next' { filters: typeof filters; navigation: typeof navigation; lists: typeof lists; - login: typeof login; + auth: typeof auth; scenarios: typeof scenarios; scheduledExecution: typeof scheduledExecution; settings: typeof settings; diff --git a/packages/app-builder/src/services/init.server.ts b/packages/app-builder/src/services/init.server.ts index b6151c2a9..ed4f69468 100644 --- a/packages/app-builder/src/services/init.server.ts +++ b/packages/app-builder/src/services/init.server.ts @@ -29,6 +29,7 @@ function makeServerServices(repositories: ServerRepositories) { authService: makeAuthenticationServerService( repositories.marbleAPIClient, repositories.userRepository, + repositories.inboxRepository, repositories.editorRepository, repositories.decisionRepository, repositories.caseRepository, diff --git a/packages/app-builder/src/utils/routes/routes.ts b/packages/app-builder/src/utils/routes/routes.ts index 0f0c097f2..904ea9982 100644 --- a/packages/app-builder/src/utils/routes/routes.ts +++ b/packages/app-builder/src/utils/routes/routes.ts @@ -4,6 +4,32 @@ export const routes = [ "path": "", "file": "root.tsx", "children": [ + { + "id": "routes/_auth+/_layout", + "file": "routes/_auth+/_layout.tsx", + "children": [ + { + "id": "routes/_auth+/email-verification", + "path": "email-verification", + "file": "routes/_auth+/email-verification.tsx" + }, + { + "id": "routes/_auth+/forgot-password", + "path": "forgot-password", + "file": "routes/_auth+/forgot-password.tsx" + }, + { + "id": "routes/_auth+/sign-in", + "path": "sign-in", + "file": "routes/_auth+/sign-in.tsx" + }, + { + "id": "routes/_auth+/sign-up", + "path": "sign-up", + "file": "routes/_auth+/sign-up.tsx" + } + ] + }, { "id": "routes/_builder+/_layout", "file": "routes/_builder+/_layout.tsx", @@ -184,26 +210,6 @@ export const routes = [ "path": "healthcheck", "file": "routes/healthcheck.ts" }, - { - "id": "routes/login-with-email", - "path": "login-with-email", - "file": "routes/login-with-email.tsx" - }, - { - "id": "routes/login", - "path": "login", - "file": "routes/login.tsx" - }, - { - "id": "routes/ressources+/auth+/login-with-email", - "path": "ressources/auth/login-with-email", - "file": "routes/ressources+/auth+/login-with-email.tsx" - }, - { - "id": "routes/ressources+/auth+/login", - "path": "ressources/auth/login", - "file": "routes/ressources+/auth+/login.tsx" - }, { "id": "routes/ressources+/auth+/logout", "path": "ressources/auth/logout", diff --git a/packages/app-builder/src/utils/routes/types.ts b/packages/app-builder/src/utils/routes/types.ts index 58b80d6b5..78212eb57 100644 --- a/packages/app-builder/src/utils/routes/types.ts +++ b/packages/app-builder/src/utils/routes/types.ts @@ -1,5 +1,9 @@ export type RoutePath = | '/' + | '/email-verification' + | '/forgot-password' + | '/sign-in' + | '/sign-up' | '/*' | '/api' | '/cases/:caseId' @@ -27,10 +31,6 @@ export type RoutePath = | '/settings/users' | '/upload/:objectType' | '/healthcheck' - | '/login-with-email' - | '/login' - | '/ressources/auth/login-with-email' - | '/ressources/auth/login' | '/ressources/auth/logout' | '/ressources/auth/refresh' | '/ressources/cases/add-comment' @@ -74,6 +74,11 @@ export type RoutePath = export type RouteID = | 'root' + | 'routes/_auth+/_layout' + | 'routes/_auth+/email-verification' + | 'routes/_auth+/forgot-password' + | 'routes/_auth+/sign-in' + | 'routes/_auth+/sign-up' | 'routes/_builder+/_layout' | 'routes/_builder+/$' | 'routes/_builder+/api' @@ -107,10 +112,6 @@ export type RouteID = | 'routes/_builder+/upload+/$objectType' | 'routes/_index' | 'routes/healthcheck' - | 'routes/login-with-email' - | 'routes/login' - | 'routes/ressources+/auth+/login-with-email' - | 'routes/ressources+/auth+/login' | 'routes/ressources+/auth+/logout' | 'routes/ressources+/auth+/refresh' | 'routes/ressources+/cases+/add-comment' diff --git a/packages/ui-design-system/src/Collapsible/Collapsible.tsx b/packages/ui-design-system/src/Collapsible/Collapsible.tsx index a04eca9dc..a3aa7e7a1 100644 --- a/packages/ui-design-system/src/Collapsible/Collapsible.tsx +++ b/packages/ui-design-system/src/Collapsible/Collapsible.tsx @@ -35,14 +35,17 @@ const CollapsibleTitle = forwardRef( 'group flex cursor-pointer items-center justify-between gap-4 p-4 font-semibold lg:p-6', className, )} + asChild {...props} > - {children} - +
+ {children} + +
); }, diff --git a/packages/ui-icons/src/generated/logos-svg-sprite.svg b/packages/ui-icons/src/generated/logos-svg-sprite.svg index 05ac0a771..9ee467016 100644 --- a/packages/ui-icons/src/generated/logos-svg-sprite.svg +++ b/packages/ui-icons/src/generated/logos-svg-sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/packages/ui-icons/svgs/logos/logo-standard.svg b/packages/ui-icons/svgs/logos/logo-standard.svg index 8245f6792..4e19990a9 100644 --- a/packages/ui-icons/svgs/logos/logo-standard.svg +++ b/packages/ui-icons/svgs/logos/logo-standard.svg @@ -1,5 +1,5 @@ - + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6cfb4a6a..2326ea04a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,6 +53,9 @@ importers: '@hookform/resolvers': specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.49.2) + '@lottiefiles/react-lottie-player': + specifier: ^3.5.3 + version: 3.5.3(react@18.2.0) '@radix-ui/react-accordion': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) @@ -97,13 +100,13 @@ importers: version: 1.0.7(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) '@remix-run/node': specifier: ^2.4.1 - version: 2.4.1 + version: 2.4.1(typescript@5.3.3) '@remix-run/react': specifier: ^2.4.1 - version: 2.4.1(react-dom@18.2.0)(react@18.2.0) + version: 2.4.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@remix-run/serve': specifier: ^2.4.1 - version: 2.4.1 + version: 2.4.1(typescript@5.3.3) '@segment/snippet': specifier: ^5.2.0 version: 5.2.0 @@ -239,7 +242,7 @@ importers: version: link:../eslint-config '@remix-run/dev': specifier: ^2.4.1 - version: 2.4.1(@remix-run/serve@2.4.1) + version: 2.4.1(@remix-run/serve@2.4.1)(typescript@5.3.3)(vite@5.0.11) '@segment/analytics-next': specifier: ^1.62.0 version: 1.62.0 @@ -475,7 +478,7 @@ importers: version: 9.3.3 '@testing-library/jest-dom': specifier: ^6.2.0 - version: 6.2.0 + version: 6.2.0(vitest@1.1.3) '@testing-library/react': specifier: 14.1.2 version: 14.1.2(react-dom@18.2.0)(react@18.2.0) @@ -2411,7 +2414,6 @@ packages: cpu: [ppc64] os: [aix] requiresBuild: true - dev: true optional: true /@esbuild/android-arm64@0.17.6: @@ -2436,7 +2438,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-arm@0.17.6: @@ -2461,7 +2462,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/android-x64@0.17.6: @@ -2486,7 +2486,6 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: true optional: true /@esbuild/darwin-arm64@0.17.6: @@ -2511,7 +2510,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/darwin-x64@0.17.6: @@ -2536,7 +2534,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-arm64@0.17.6: @@ -2561,7 +2558,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/freebsd-x64@0.17.6: @@ -2586,7 +2582,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm64@0.17.6: @@ -2611,7 +2606,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-arm@0.17.6: @@ -2636,7 +2630,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ia32@0.17.6: @@ -2661,7 +2654,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-loong64@0.17.6: @@ -2686,7 +2678,6 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-mips64el@0.17.6: @@ -2711,7 +2702,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-ppc64@0.17.6: @@ -2736,7 +2726,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-riscv64@0.17.6: @@ -2761,7 +2750,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-s390x@0.17.6: @@ -2786,7 +2774,6 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/linux-x64@0.17.6: @@ -2811,7 +2798,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@esbuild/netbsd-x64@0.17.6: @@ -2836,7 +2822,6 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: true optional: true /@esbuild/openbsd-x64@0.17.6: @@ -2861,7 +2846,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: true optional: true /@esbuild/sunos-x64@0.17.6: @@ -2886,7 +2870,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: true optional: true /@esbuild/win32-arm64@0.17.6: @@ -2911,7 +2894,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-ia32@0.17.6: @@ -2936,7 +2918,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@esbuild/win32-x64@0.17.6: @@ -2961,7 +2942,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): @@ -3702,6 +3682,15 @@ packages: resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} dev: true + /@lottiefiles/react-lottie-player@3.5.3(react@18.2.0): + resolution: {integrity: sha512-6pGbiTMjGnPddR1ur8M/TIDCiogZMc1aKIUbMEKXKAuNeYwZ2hvqwBJ+w5KRm88ccdcU88C2cGyLVsboFlSdVQ==} + peerDependencies: + react: 16 - 18 + dependencies: + lottie-web: 5.12.2 + react: 18.2.0 + dev: false + /@lukeed/csprng@1.1.0: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -4938,7 +4927,7 @@ packages: dependencies: '@babel/runtime': 7.23.5 - /@remix-run/dev@2.4.1(@remix-run/serve@2.4.1): + /@remix-run/dev@2.4.1(@remix-run/serve@2.4.1)(typescript@5.3.3)(vite@5.0.11): resolution: {integrity: sha512-T8GLCKpZ8AX/NCJ+vyMmcTq328xo9stvDSXG2hSJx7njz4Q9sC25miQLXPRb3Lx/Sdf4YlJhWQpR6uq5pnXCZg==} engines: {node: '>=18.0.0'} hasBin: true @@ -4964,10 +4953,10 @@ packages: '@babel/types': 7.23.6 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.4.1 + '@remix-run/node': 2.4.1(typescript@5.3.3) '@remix-run/router': 1.14.1 - '@remix-run/serve': 2.4.1 - '@remix-run/server-runtime': 2.4.1 + '@remix-run/serve': 2.4.1(typescript@5.3.3) + '@remix-run/server-runtime': 2.4.1(typescript@5.3.3) '@types/mdx': 2.0.10 '@vanilla-extract/integration': 6.2.4 arg: 5.0.2 @@ -5007,6 +4996,8 @@ packages: set-cookie-parser: 2.6.0 tar-fs: 2.1.1 tsconfig-paths: 4.2.0 + typescript: 5.3.3 + vite: 5.0.11 ws: 7.5.9 transitivePeerDependencies: - '@types/node' @@ -5022,7 +5013,7 @@ packages: - ts-node - utf-8-validate - /@remix-run/express@2.4.1(express@4.18.2): + /@remix-run/express@2.4.1(express@4.18.2)(typescript@5.3.3): resolution: {integrity: sha512-BTFfKrETeU3zn18YvaWs78i+vyvckG/BeR/A7hSYyJTaRfpw9r5OWq/wGM6jaObG7u4ut64lcY9adhvyV7BBeQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -5032,10 +5023,11 @@ packages: typescript: optional: true dependencies: - '@remix-run/node': 2.4.1 + '@remix-run/node': 2.4.1(typescript@5.3.3) express: 4.18.2 + typescript: 5.3.3 - /@remix-run/node@2.4.1: + /@remix-run/node@2.4.1(typescript@5.3.3): resolution: {integrity: sha512-TENt5OiTnjZmoayqpEiU0207JIFF7TbagQ4UT0dFI9oKQrNQJvkDd2JQBEldd8TLDuSYxU8iu7+CXZ/kl3O35w==} engines: {node: '>=18.0.0'} peerDependencies: @@ -5044,7 +5036,7 @@ packages: typescript: optional: true dependencies: - '@remix-run/server-runtime': 2.4.1 + '@remix-run/server-runtime': 2.4.1(typescript@5.3.3) '@remix-run/web-fetch': 4.4.2 '@remix-run/web-file': 3.1.0 '@remix-run/web-stream': 1.1.0 @@ -5052,8 +5044,9 @@ packages: cookie-signature: 1.2.1 source-map-support: 0.5.21 stream-slice: 0.1.2 + typescript: 5.3.3 - /@remix-run/react@2.4.1(react-dom@18.2.0)(react@18.2.0): + /@remix-run/react@2.4.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3): resolution: {integrity: sha512-6qfLpijD96fKd276/MOtarf/SkFmWDKXTXzpMQzYTiRXofUDezRGG3VqbkopD1O+jl4BjTuKQvI+7YfLcfGx8w==} engines: {node: '>=18.0.0'} peerDependencies: @@ -5065,24 +5058,25 @@ packages: optional: true dependencies: '@remix-run/router': 1.14.1 - '@remix-run/server-runtime': 2.4.1 + '@remix-run/server-runtime': 2.4.1(typescript@5.3.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-router: 6.21.1(react@18.2.0) react-router-dom: 6.21.1(react-dom@18.2.0)(react@18.2.0) + typescript: 5.3.3 dev: false /@remix-run/router@1.14.1: resolution: {integrity: sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow==} engines: {node: '>=14.0.0'} - /@remix-run/serve@2.4.1: + /@remix-run/serve@2.4.1(typescript@5.3.3): resolution: {integrity: sha512-GvIDkPjbMv6U8KJKyxhnTiwZpGXoO/IwJ9tN+b9RwTufMPL9Vi19p/uxptdeHDtCDXb4CRz+Id0izZD/CUrV2A==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - '@remix-run/express': 2.4.1(express@4.18.2) - '@remix-run/node': 2.4.1 + '@remix-run/express': 2.4.1(express@4.18.2)(typescript@5.3.3) + '@remix-run/node': 2.4.1(typescript@5.3.3) chokidar: 3.5.3 compression: 1.7.4 express: 4.18.2 @@ -5093,7 +5087,7 @@ packages: - supports-color - typescript - /@remix-run/server-runtime@2.4.1: + /@remix-run/server-runtime@2.4.1(typescript@5.3.3): resolution: {integrity: sha512-aQyBa0U8Db4E9sv2sruMfPDBYB4jlqvZ43YvkaZ1BGjUzi84ssfmaHdWgX/QveB6hi61RABTi6v8DV548kmRQg==} engines: {node: '>=18.0.0'} peerDependencies: @@ -5108,13 +5102,14 @@ packages: cookie: 0.5.0 set-cookie-parser: 2.6.0 source-map: 0.7.4 + typescript: 5.3.3 /@remix-run/v1-route-convention@0.1.4(@remix-run/dev@2.4.1): resolution: {integrity: sha512-fVTr9YlNLWfaiM/6Y56sOtcY8x1bBJQHY0sDWO5+Z/vjJ2Ni7fe2fwrzs1jUFciMPXqBQdFGePnkuiYLz3cuUA==} peerDependencies: '@remix-run/dev': ^1.15.0 || ^2.0.0 dependencies: - '@remix-run/dev': 2.4.1(@remix-run/serve@2.4.1) + '@remix-run/dev': 2.4.1(@remix-run/serve@2.4.1)(typescript@5.3.3)(vite@5.0.11) minimatch: 7.4.6 dev: false @@ -5297,7 +5292,6 @@ packages: cpu: [arm] os: [android] requiresBuild: true - dev: true optional: true /@rollup/rollup-android-arm64@4.9.4: @@ -5305,7 +5299,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: true optional: true /@rollup/rollup-darwin-arm64@4.9.4: @@ -5313,7 +5306,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: true optional: true /@rollup/rollup-darwin-x64@4.9.4: @@ -5321,7 +5313,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-arm-gnueabihf@4.9.4: @@ -5329,7 +5320,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-arm64-gnu@4.9.4: @@ -5337,7 +5327,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-arm64-musl@4.9.4: @@ -5345,7 +5334,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-riscv64-gnu@4.9.4: @@ -5353,7 +5341,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-x64-gnu@4.9.4: @@ -5361,7 +5348,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-linux-x64-musl@4.9.4: @@ -5369,7 +5355,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: true optional: true /@rollup/rollup-win32-arm64-msvc@4.9.4: @@ -5377,7 +5362,6 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: true optional: true /@rollup/rollup-win32-ia32-msvc@4.9.4: @@ -5385,7 +5369,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: true optional: true /@rollup/rollup-win32-x64-msvc@4.9.4: @@ -5393,7 +5376,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: true optional: true /@segment/analytics-core@1.4.0: @@ -5623,8 +5605,8 @@ packages: '@remix-run/react': 1.x || 2.x react: 16.x || 17.x || 18.x dependencies: - '@remix-run/node': 2.4.1 - '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0) + '@remix-run/node': 2.4.1(typescript@5.3.3) + '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) '@sentry/cli': 2.24.1 '@sentry/core': 7.92.0 '@sentry/node': 7.92.0 @@ -7474,6 +7456,7 @@ packages: /@swagger-api/apidom-ns-json-schema-draft-4@0.91.0: resolution: {integrity: sha512-oVxUVucnPSjcmUaYkTHAaqCGLbkgFEDWePGs+sqJj7WxhfJxLS+A8oFkvtXfTmfBel2ESQ7AFlReb/zhCpUfOg==} + requiresBuild: true dependencies: '@babel/runtime-corejs3': 7.23.7 '@swagger-api/apidom-ast': 0.91.0 @@ -7885,7 +7868,7 @@ packages: pretty-format: 27.5.1 dev: true - /@testing-library/jest-dom@6.2.0: + /@testing-library/jest-dom@6.2.0(vitest@1.1.3): resolution: {integrity: sha512-+BVQlJ9cmEn5RDMUS8c2+TU6giLvzaHZ8sU/x0Jj7fk+6/46wPdwlgOPcpxS17CjcanBi/3VmGMqVr2rmbUmNw==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} peerDependencies: @@ -7911,6 +7894,7 @@ packages: dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 + vitest: 1.1.3(@vitest/ui@1.1.3) dev: true /@testing-library/react@14.1.2(react-dom@18.2.0)(react@18.2.0): @@ -10489,7 +10473,6 @@ packages: '@esbuild/win32-arm64': 0.19.11 '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -12767,6 +12750,10 @@ packages: dependencies: js-tokens: 4.0.0 + /lottie-web@5.12.2: + resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + dev: false + /loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: @@ -15270,7 +15257,7 @@ packages: peerDependencies: '@remix-run/dev': ^1.15.0 || ^2 dependencies: - '@remix-run/dev': 2.4.1(@remix-run/serve@2.4.1) + '@remix-run/dev': 2.4.1(@remix-run/serve@2.4.1)(typescript@5.3.3)(vite@5.0.11) '@remix-run/v1-route-convention': 0.1.4(@remix-run/dev@2.4.1) fs-extra: 11.2.0 minimatch: 5.1.6 @@ -15285,8 +15272,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-i18next: ^13.0.0 || ^14.0.0 dependencies: - '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0) - '@remix-run/server-runtime': 2.4.1 + '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + '@remix-run/server-runtime': 2.4.1(typescript@5.3.3) accept-language-parser: 1.5.0 i18next: 23.7.16 intl-parse-accept-language: 1.0.0 @@ -15332,8 +15319,8 @@ packages: zod: optional: true dependencies: - '@remix-run/node': 2.4.1 - '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0) + '@remix-run/node': 2.4.1(typescript@5.3.3) + '@remix-run/react': 2.4.1(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) crypto-js: 4.2.0 react: 18.2.0 type-fest: 4.9.0 @@ -15500,7 +15487,6 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.9.4 '@rollup/rollup-win32-x64-msvc': 4.9.4 fsevents: 2.3.3 - dev: true /rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} @@ -17239,7 +17225,6 @@ packages: rollup: 4.9.4 optionalDependencies: fsevents: 2.3.3 - dev: true /vitest@1.1.3(@vitest/ui@1.1.3): resolution: {integrity: sha512-2l8om1NOkiA90/Y207PsEvJLYygddsOyr81wLQ20Ra8IlLKbyQncWsGZjnbkyG2KwwuTXLQjEPOJuxGMG8qJBQ==}