├── .eslintignore
├── .eslintrc
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
└── workflows
│ ├── build.yml
│ └── test.yml
├── .gitignore
├── LICENSE
├── README.md
├── SimpleInstaBot.svg
├── _config.yml
├── package.json
├── public
├── electron.js
├── entitlements.mac.plist
├── index.html
├── preload.js
└── store.js
├── screenshot.jpg
├── scripts
└── icon-gen.mjs
├── src
├── 10178-c-bot.json
├── 13680-robot-call.json
├── 13682-heart.json
├── 14470-phone-running.json
├── App.jsx
├── icon.svg
├── index.css
└── index.jsx
└── yarn.lock
/.eslintignore:
--------------------------------------------------------------------------------
1 | /dist
2 | /build
3 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "airbnb",
3 | "plugins": [
4 | "react-hooks"
5 | ],
6 | "env": {
7 | "node": true,
8 | "browser": true
9 | },
10 | "rules": {
11 | "no-await-in-loop": 0,
12 | "react/prop-types": 0,
13 | "react/forbid-prop-types": 0,
14 | "arrow-parens": 0,
15 | "react-hooks/rules-of-hooks": "error",
16 | "react-hooks/exhaustive-deps": "warn",
17 | "import/no-extraneous-dependencies": ["error", {
18 | "devDependencies": true,
19 | "optionalDependencies": false
20 | }],
21 | "jsx-a11y/control-has-associated-label": 0,
22 |
23 | "no-console": 0,
24 | "object-curly-newline": 0,
25 | "max-len": 0,
26 | "react/jsx-one-expression-per-line": 0,
27 | "react/no-multi-comp": 0,
28 | "jsx-a11y/click-events-have-key-events": 0,
29 | "jsx-a11y/accessible-emoji": 0,
30 | "no-multiple-empty-lines": ["error", { "max": 2, "maxBOF": 0, "maxEOF": 0 }],
31 | "no-promise-executor-return": 0,
32 | "react/function-component-definition": 0
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: mifi
2 | custom: ["https://paypal.me/mifino/usd", "https://mifi.no/thanks"]
3 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help me improve the bot
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **To Reproduce**
11 | Share your setting and describe what the bot is doing before you receive the error
12 |
13 | **Screenshots**
14 | If applicable, add screenshots to help explain your problem.
15 |
16 | **Desktop (please complete the following information):**
17 | - OS: [e.g. iOS]
18 | - Browser [e.g. chrome, safari]
19 | - Version [e.g. 22]
20 |
21 | **Additional context**
22 | Add any other context about the problem here.
23 |
24 | **Provide me with HTML**
25 |
26 | Did you receive an error while the bot is running?
27 |
28 | To make it easier for me to understand why it's failing, please copy and share with me the HTML of the button (or even better the whole page) and share it, by following these instructions:
29 |
30 | - Make sure you run the command after getting the error message
31 | - make sure that you open the dev tools **on the correct window (the instagram page)**
32 |
33 | Use Option + ⌘ + J (on macOS), or Shift + CTRL + J (on Windows/Linux) to open devtools.
34 |
35 | Using the Web Inspector (F12), go to the Elements tab, right click on the tag in your code and select Copy->Copy outerHTML. Then paste that here
36 |
37 | If you feel it's private information you can instead email to simpleinstabot@yankee.no
38 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build/release
2 |
3 | on:
4 | push:
5 | tags:
6 | - 'v*'
7 | workflow_dispatch:
8 |
9 |
10 | jobs:
11 | release:
12 | runs-on: ${{ matrix.os }}
13 |
14 | strategy:
15 | matrix:
16 | os: [macos-latest, ubuntu-latest, windows-latest]
17 |
18 | steps:
19 | # Windows fix. See https://github.com/actions/checkout/issues/226
20 | - run: git config --global core.autocrlf false
21 |
22 | - name: Check out Git repository
23 | uses: actions/checkout@v1
24 |
25 | - name: Install Node.js, NPM and Yarn
26 | uses: actions/setup-node@v1
27 | with:
28 | node-version: 16
29 |
30 | - name: Prepare for app notarization
31 | if: startsWith(matrix.os, 'macos')
32 | # Import Apple API key for app notarization on macOS
33 | run: |
34 | mkdir -p ~/private_keys/
35 | echo '${{ secrets.api_key }}' > ~/private_keys/AuthKey_${{ secrets.api_key_id }}.p8
36 |
37 | - name: Build/release Electron app
38 | uses: samuelmeuli/action-electron-builder@v1
39 | with:
40 | # GitHub token, automatically provided to the action
41 | # (No need to define this secret in the repo settings)
42 | github_token: ${{ secrets.github_token }}
43 |
44 | # If the commit is tagged with a version (e.g. "v1.0.0"),
45 | # release the app after building
46 | release: ${{ startsWith(github.ref, 'refs/tags/v') }}
47 |
48 | mac_certs: ${{ secrets.mac_certs }}
49 | mac_certs_password: ${{ secrets.mac_certs_password }}
50 | env:
51 | # macOS notarization API key
52 | API_KEY_ID: ${{ secrets.api_key_id }}
53 | API_KEY_ISSUER_ID: ${{ secrets.api_key_issuer_id }}
54 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Tests
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | test:
7 | runs-on: ubuntu-latest
8 |
9 | steps:
10 | - uses: actions/checkout@v3
11 |
12 | - uses: actions/setup-node@v3
13 | with:
14 | node-version: 16
15 |
16 | - run: yarn
17 | - run: npm run lint
18 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 | /dist
14 |
15 | # misc
16 | .DS_Store
17 | .env.local
18 | .env.development.local
19 | .env.test.local
20 | .env.production.local
21 |
22 | npm-debug.log*
23 | yarn-debug.log*
24 | yarn-error.log*
25 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Mikael Finstad
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SimpleInstaBot 🤖
2 |
3 | Use a robot to attract more followers. Now as a simple desktop app!
4 |
5 | [](https://www.youtube.com/watch?v=xkjOozYU3aA)
6 |
7 | [](https://discord.gg/Rh3KT9zyhj) [](https://paypal.me/mifino/usd)
8 |
9 | ## How does it work?
10 |
11 | It runs as a desktop application on your computer and will every day follow up to 150 users (configurable). You choose a list of Instagram users whose market you want to target. The bot navigates to each of these, finds the last people to have followed them and then follows each of them. Then after 5 days (also configurable), it will unfollow the users. Simple and effective.
12 |
13 | The bot will remember every user it has followed, so if you quit the app and open it later, it will still clean up by unfollowing users that it previously followed.
14 |
15 | You can find logs and data in your "App Data" folder. See [userData](https://www.electronjs.org/docs/api/app#appgetpathname). For example on Mac OS:
16 | ```
17 | Library/Application\ Support/SimpleInstaBot/followed.json
18 | ```
19 |
20 | ## Features
21 |
22 | What makes it different from other bots?
23 |
24 | - Free and open source
25 | - No viruses or fishy business, guaranteed to not store your password! (See the code for yourself)
26 | - Simple, easy to use
27 | - Effective: Follow/unfollow is proven very effective. By only doing follow/unfollow, the bot avoids all those awkward situations where a bot comments "Awesome!" on a post depicting a tragic events.
28 | - Secure: Never stores your username or password
29 | - Safe: Runs on your own computer, to reduce the risk of being banned. Instagram is known to crack down on paid Instagram bot services and cloud and VPN IPs
30 | - Automatic rate limiting
31 | - Uses a normal browser to mimic the behavior of a normal user (does not use private APIs easily detectable by Instagram)
32 | - Randomized timed behavior
33 | - Simulates human behavior of sleeping at night, and usage in the day time
34 | - Change browser signature to avoid being identified
35 | - Passes bot tests: https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html and https://arh.antoinevastel.com/bots/areyouheadless
36 | - Runs on all major desktop platforms
37 | - Multiple modes of operation: Unfollow only, Unfollow non-mutual followers, Unfollow unknown followed accounts, Unfollow user specified list of accounts.
38 |
39 | ## Download
40 |
41 | - [Mac OS X](https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-mac.dmg)
42 | - [Windows](https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-win.exe)
43 | - [Linux (x64) AppImage](https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-linux-x86_64.AppImage)
44 | - [Linux (x64) tar.tz](https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-linux-x64.tar.bz2)
45 | - [Linux (armv7l) (Raspberry Pi) tar.tz](https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-linux-armv7l.tar.bz2)
46 |
47 | NOTE: After installing you may need to bypass "Untrusted app" dialogs. This is because Microsoft requires a costly certificate to remove this dialog (I'm not going to pay for that.) Alternatively, try to Google `windows run untrusted app`.
48 |
49 | ## A word of warning
50 |
51 | Many people are getting `Action Blocked` message these days with this bot as well as other bots (it seems even people just manually following using the app) Instagram is tightening their rules by not allowing promiscuous behavior like following and liking strangers' photos as much as before, and imposing temp blocks when they think you crossed the limit.
52 |
53 | **You use this app at your own risk! I have had great success with this app but I am not responsible for any consequences it may have for your Instagram account.**
54 |
55 | ## Tips to avoid ban
56 |
57 | I advise you to follow these guidelines:
58 |
59 | - Run the bot on the same internet connection (e.g. WiFi) as you normally use your phone with the Instagram mobile app. It will reduce the chance of being flagged
60 | - Use conservative parameters (max follows/unfollows per day 150 and max 20 per hour, maybe even start lower, and work your way up)
61 |
62 | ## Multiple accounts
63 |
64 | To run the bot on multiple accounts at the same time, run it with the command line argument `--root` to specify a unique path for each instance:
65 |
66 | ```
67 | /path/to/SimpleInstaBot --root ~/Desktop/account1
68 | /path/to/SimpleInstaBot --root ~/Desktop/account2
69 | ```
70 |
71 | ## API / programmatic bot
72 |
73 | SimpleInstaBot is built on [instauto](https://github.com/mifi/instauto) - you can instead use that if you want to program your own headless bot.
74 |
75 | ## How to run on Raspberry PI
76 |
77 | ```bash
78 | # SSH into your PI
79 | ssh pi@ip.of.pi
80 |
81 | # Download the Raspberry Pi binary
82 | wget https://github.com/mifi/SimpleInstaBot/releases/latest/download/SimpleInstaBot-linux-armv7l.tar.bz2
83 |
84 | # Extract it
85 | tar xvf SimpleInstaBot-linux-armv7l.tar.bz2
86 | cd SimpleInstaBot-linux-armv7l
87 |
88 | # run it
89 | DISPLAY=:0 ./simpleinstabot
90 |
91 | # or:
92 | DISPLAY=:0 ./simpleinstabot --no-sandbox
93 | ```
94 |
95 | ## Troubleshooting
96 |
97 | - Follow button not found: switch your Instagram account into English as stated in the [instauto](https://www.npmjs.com/package/instauto) troubleshooting page
98 |
99 | ## FAQ
100 |
101 | - Q: Can I run it on multiple accounts at the same time?
102 | - A: Yes, with the command line argument `--root` (see [multiple accounts](#multiple-accounts))
103 |
104 | ## Donate 🙈
105 |
106 | This project is maintained by me alone. The project will always remain free and open source, but if it's useful for you, consider supporting me. :) It will give me extra motivation to improve it.
107 |
108 | [Paypal](https://paypal.me/mifino/usd) | [crypto](https://mifi.no/thanks)
109 |
110 | ## Credits
111 |
112 | Animations by:
113 | - https://lottiefiles.com/juanmakes
114 | - https://lottiefiles.com/user/180952
115 | - https://lottiefiles.com/aanhamdani
116 |
117 | Icons made by [Freepik](https://www.flaticon.com/authors/freepik) from [www.flaticon.com](https://www.flaticon.com/)
118 |
119 | ## See also
120 | - https://github.com/mifi/instauto - Programmatic Instagram bot API
121 | - https://instagrambot.github.io/
122 | - https://socialmanager.tools/
123 | - https://gramup.me/
124 |
125 | ## Releasing
126 |
127 | ```
128 | npm version patch && git push && git push --tags
129 | ```
130 | Wait for github actions and go to https://github.com/mifi/SimpleInstaBot/releases
131 |
132 | ---
133 |
134 | Made with ❤️ in [🇳🇴](https://www.youtube.com/watch?v=uQIv8Vo9_Jc)
135 |
136 | [More apps by mifi.no](https://mifi.no/)
137 |
138 | Follow me on [GitHub](https://github.com/mifi/), [YouTube](https://www.youtube.com/channel/UC6XlvVH63g0H54HSJubURQA), [IG](https://www.instagram.com/mifi.no/), [Twitter](https://twitter.com/mifi_no) for more awesome content!
139 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-architect
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simpleinstabot",
3 | "productName": "SimpleInstaBot",
4 | "description": "Simple Instagram bot",
5 | "version": "1.11.2",
6 | "license": "MIT",
7 | "author": {
8 | "name": "Mikael Finstad",
9 | "email": "finstaden@gmail.com",
10 | "url": "https://mifi.no"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "https://github.com/mifi/SimpleInstaBot.git"
15 | },
16 | "main": "public/electron.js",
17 | "homepage": "./",
18 | "dependencies": {
19 | "@electron/remote": "^2.0.8",
20 | "electron-is-dev": "^2.0.0",
21 | "electron-store": "^5.1.1",
22 | "filenamify": "^4.2.0",
23 | "fs-extra": "^8.1.0",
24 | "instauto": "^9.2.1",
25 | "lodash": "^4.17.21",
26 | "moment": "^2.29.4",
27 | "puppeteer-core": "^15.4.0",
28 | "puppeteer-in-electron": "^3.0.5",
29 | "yargs-parser": "^21.0.1"
30 | },
31 | "scripts": {
32 | "start:frontend": "BROWSER=none PORT=3001 react-scripts start",
33 | "start:electron": "wait-on http://localhost:3001 && electron .",
34 | "start": "concurrently -k \"npm run start:frontend\" \"npm run start:electron\"",
35 | "icon-gen": "mkdirp icon-build && node scripts/icon-gen.mjs",
36 | "build": "yarn icon-gen && react-scripts build",
37 | "test": "react-scripts test",
38 | "eject": "react-scripts eject",
39 | "lint": "eslint --ext .jsx --ext .js .",
40 | "pack-mac": "electron-builder --mac",
41 | "prepack-mac": "yarn build",
42 | "pack-win": "electron-builder --win",
43 | "prepack-win": "yarn build",
44 | "pack-linux": "electron-builder --linux",
45 | "prepack-linux": "yarn build",
46 | "postinstall": "electron-builder install-app-deps"
47 | },
48 | "eslintConfig": {
49 | "extends": "react-app"
50 | },
51 | "browserslist": {
52 | "production": [
53 | "electron 19.0"
54 | ],
55 | "development": [
56 | "electron 19.0"
57 | ]
58 | },
59 | "devDependencies": {
60 | "concurrently": "^4.1.0",
61 | "electron": "^19.1.8",
62 | "electron-builder": "^23.1.0",
63 | "electron-builder-notarize": "^1.5.0",
64 | "electron-devtools-installer": "^3.2.0",
65 | "eslint": "^7.32.0 || ^8.2.0",
66 | "eslint-config-airbnb": "^19.0.4",
67 | "eslint-plugin-import": "^2.25.3",
68 | "eslint-plugin-jsx-a11y": "^6.5.1",
69 | "eslint-plugin-react": "^7.28.0",
70 | "eslint-plugin-react-hooks": "^4.3.0",
71 | "evergreen-ui": "^6.10.3",
72 | "json5": "^2.2.2",
73 | "mkdirp": "^1.0.4",
74 | "react": "^18.2.0",
75 | "react-dom": "^18.2.0",
76 | "react-icons": "^4.4.0",
77 | "react-lottie-player": "^1.4.3",
78 | "react-scripts": "5.0.1",
79 | "sharp": "^0.30.7",
80 | "sweetalert2": "^11.4.23",
81 | "sweetalert2-react-content": "^5.0.1",
82 | "wait-on": "^6.0.1"
83 | },
84 | "build": {
85 | "files": [
86 | "build/**/*"
87 | ],
88 | "appId": "no.mifi.simpleinstabot",
89 | "artifactName": "${productName}-${os}.${ext}",
90 | "afterSign": "electron-builder-notarize",
91 | "mac": {
92 | "hardenedRuntime": true,
93 | "target": "dmg",
94 | "icon": "icon-build/app-512.png"
95 | },
96 | "win": {
97 | "target": "portable",
98 | "icon": "icon-build/app-512.png"
99 | },
100 | "linux": {
101 | "artifactName": "${productName}-${os}-${arch}.${ext}",
102 | "icon": "icon-build/app-512.png",
103 | "target": [
104 | {
105 | "arch": "x64",
106 | "target": "AppImage"
107 | },
108 | {
109 | "arch": "x64",
110 | "target": "tar.bz2"
111 | },
112 | {
113 | "arch": "armv7l",
114 | "target": "tar.bz2"
115 | },
116 | {
117 | "arch": "arm64",
118 | "target": "tar.bz2"
119 | }
120 | ]
121 | }
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/public/electron.js:
--------------------------------------------------------------------------------
1 | const { app, BrowserWindow, powerSaveBlocker } = require('electron'); // eslint-disable-line import/no-extraneous-dependencies
2 | const isDev = require('electron-is-dev');
3 | const path = require('path');
4 | const pie = require('puppeteer-in-electron');
5 | const puppeteer = require('puppeteer-core');
6 | const { join } = require('path');
7 | const assert = require('assert');
8 | const fs = require('fs-extra');
9 | const filenamify = require('filenamify');
10 | const yargsParser = require('yargs-parser');
11 |
12 | const Instauto = require('instauto');
13 | const moment = require('moment');
14 | const electronRemote = require('@electron/remote/main'); // todo migrate away from this
15 |
16 |
17 | // Keep a global reference of the window object, if you don't, the window will
18 | // be closed automatically when the JavaScript object is garbage collected.
19 | let mainWindow;
20 |
21 | let instautoDb;
22 | let instauto;
23 | let instautoWindow;
24 | let logger = console;
25 |
26 | let powerSaveBlockerId;
27 |
28 | // Must be called before electron is ready
29 | // NOTE: It will listen to a TCP port. could be an issue
30 | const pieConnectPromise = (async () => {
31 | await pie.initialize(app);
32 | return pie.connect(app, puppeteer);
33 | })();
34 |
35 | pieConnectPromise.catch(console.error);
36 |
37 | electronRemote.initialize();
38 |
39 | function parseCliArgs() {
40 | const ignoreFirstArgs = isDev ? 2 : 1;
41 | // production: First arg is the app executable
42 | // dev: First 2 args are electron and the electron.js
43 | const argsWithoutAppName = process.argv.length > ignoreFirstArgs ? process.argv.slice(ignoreFirstArgs) : [];
44 |
45 | return yargsParser(argsWithoutAppName);
46 | }
47 |
48 | const args = parseCliArgs();
49 | console.log('CLI arguments', args);
50 | const { root: customRootPath } = args;
51 |
52 | if (customRootPath) {
53 | console.log('Using custom root', customRootPath);
54 | // must happen before 'ready' event
55 | app.setPath('userData', join(customRootPath, 'electron'));
56 | }
57 |
58 | function getFilePath(rel) {
59 | return join(customRootPath || app.getPath('userData'), rel);
60 | }
61 |
62 | const cookiesPath = getFilePath('cookies.json');
63 |
64 | async function checkHaveCookies() {
65 | return fs.pathExists(cookiesPath);
66 | }
67 |
68 | async function deleteCookies() {
69 | try {
70 | await fs.unlink(cookiesPath);
71 | } catch (err) {
72 | logger.log('No cookies to delete', err);
73 | }
74 | }
75 |
76 | async function initInstautoDb(usernameIn) {
77 | const username = usernameIn && filenamify(usernameIn);
78 | const followedDbPath = getFilePath(username ? `${username}-followed.json` : 'followed.json');
79 | const unfollowedDbPath = getFilePath(username ? `${username}-unfollowed.json` : 'followed.json');
80 | const likedPhotosDbPath = getFilePath(username ? `${username}-liked-photos.json` : 'followed.json');
81 |
82 | // Migrate any old paths if we have new version (with username) now:
83 | if (username) {
84 | await fs.move(getFilePath('followed.json'), followedDbPath).catch(() => {});
85 | await fs.move(getFilePath('unfollowed.json'), unfollowedDbPath).catch(() => {});
86 | await fs.move(getFilePath('liked-photos.json'), likedPhotosDbPath).catch(() => {});
87 | }
88 |
89 | instautoDb = await Instauto.JSONDB({
90 | followedDbPath,
91 | unfollowedDbPath,
92 | likedPhotosDbPath,
93 | });
94 | }
95 |
96 | function getInstautoData() {
97 | const dayMs = 24 * 60 * 60 * 1000;
98 |
99 | if (!instautoDb) return undefined;
100 |
101 | return {
102 | numTotalFollowedUsers: instautoDb.getTotalFollowedUsers(),
103 | numTotalUnfollowedUsers: instautoDb.getTotalUnfollowedUsers(),
104 | numFollowedLastDay: instautoDb.getFollowedLastTimeUnit(dayMs).length,
105 | numUnfollowedLastDay: instautoDb.getUnfollowedLastTimeUnit(dayMs).length,
106 | numTotalLikedPhotos: instautoDb.getTotalLikedPhotos(),
107 | numLikedLastDay: instautoDb.getLikedPhotosLastTimeUnit(dayMs).length,
108 | };
109 | }
110 |
111 | async function initInstauto({
112 | userAgent,
113 | username,
114 | password,
115 | dontUnfollowUntilDaysElapsed,
116 | maxFollowsPerHour,
117 | maxFollowsPerDay,
118 | maxLikesPerDay,
119 | followUserRatioMin,
120 | followUserRatioMax,
121 | followUserMaxFollowers,
122 | followUserMaxFollowing,
123 | followUserMinFollowers,
124 | followUserMinFollowing,
125 | excludeUsers,
126 | dryRun,
127 | logger: loggerArg,
128 | }) {
129 | instautoWindow = new BrowserWindow({
130 | x: 0,
131 | y: 0,
132 | webPreferences: {
133 | partition: 'instauto', // So that we have a separate session
134 | backgroundThrottling: false,
135 | },
136 | });
137 |
138 | const { session } = instautoWindow.webContents;
139 | await session.clearStorageData(); // we store cookies etc separately
140 |
141 | const browser = { // TODO improve API in instauto to accept page instead of browser?
142 | newPage: async () => {
143 | const pieBrowser = await pieConnectPromise;
144 | return pie.getPage(pieBrowser, instautoWindow);
145 | },
146 | };
147 |
148 | const options = {
149 | // Testing
150 | // randomizeUserAgent: false,
151 | // userAgent: 'Mozilla/5.0 (Linux; Android 9; RMX1971) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.136 Mobile Safari/537.36',
152 |
153 | userAgent,
154 |
155 | cookiesPath,
156 |
157 | username,
158 | password,
159 |
160 | maxFollowsPerHour,
161 | maxFollowsPerDay,
162 | maxLikesPerDay,
163 | followUserRatioMin,
164 | followUserRatioMax,
165 | followUserMaxFollowers,
166 | followUserMaxFollowing,
167 | followUserMinFollowers,
168 | followUserMinFollowing,
169 | dontUnfollowUntilTimeElapsed: dontUnfollowUntilDaysElapsed * 24 * 60 * 60 * 1000,
170 | excludeUsers,
171 | dryRun,
172 |
173 | logger: loggerArg,
174 | };
175 |
176 | mainWindow.focus();
177 |
178 | instauto = await Instauto(instautoDb, browser, options);
179 | logger = loggerArg;
180 |
181 | powerSaveBlockerId = powerSaveBlocker.start('prevent-display-sleep');
182 | }
183 |
184 | function cleanupInstauto() {
185 | if (powerSaveBlockerId != null) powerSaveBlocker.stop(powerSaveBlockerId);
186 |
187 | if (instautoWindow) {
188 | instautoWindow.destroy();
189 | instautoWindow = undefined;
190 | }
191 | // TODO deinit more?
192 | instautoDb = undefined;
193 | instauto = undefined;
194 | logger = console;
195 | }
196 |
197 | async function runBotNormalMode({
198 | usernames, ageInDays, skipPrivate, runAtHour, maxLikesPerUser, maxFollowsTotal, instantStart, enableFollowUnfollow,
199 | }) {
200 | assert(instauto);
201 |
202 | function getMsUntilNextRun() {
203 | // const now = moment('2018-08-26T13:00:00+02:00');
204 | const now = moment();
205 | const isAfterHour = now.hour() >= runAtHour;
206 | const nextRunTime = now.clone().startOf('day').add(runAtHour, 'hours');
207 | if (isAfterHour) nextRunTime.add(1, 'day');
208 | return (1 + ((Math.random() - 0.5) * 0.1)) * nextRunTime.diff(now);
209 | }
210 |
211 | async function sleepUntilNextDay() {
212 | const msUntilNextRun = getMsUntilNextRun();
213 | logger.log(`Sleeping ${msUntilNextRun / (60 * 60 * 1000)} hours (waiting until ${runAtHour}:00)...`);
214 | await new Promise(resolve => setTimeout(resolve, msUntilNextRun));
215 | logger.log('Done sleeping, running...');
216 | }
217 |
218 | if (!instantStart) await sleepUntilNextDay();
219 |
220 | for (;;) {
221 | try {
222 | // Leave room for some follows too
223 | const unfollowLimit = Math.floor(maxFollowsTotal * (2 / 3));
224 | let unfollowedCount = 0;
225 | if (enableFollowUnfollow) {
226 | unfollowedCount = await instauto.unfollowOldFollowed({ ageInDays, limit: unfollowLimit });
227 | if (unfollowedCount > 0) await instauto.sleep(10 * 60 * 1000);
228 | }
229 |
230 | const likingEnabled = maxLikesPerUser != null && maxLikesPerUser >= 1;
231 |
232 | await instauto.followUsersFollowers({
233 | usersToFollowFollowersOf: usernames,
234 | maxFollowsTotal: Math.max(0, maxFollowsTotal - unfollowedCount),
235 | skipPrivate,
236 | enableLikeImages: likingEnabled,
237 | enableFollow: enableFollowUnfollow,
238 | likeImagesMax: likingEnabled ? maxLikesPerUser : undefined,
239 | });
240 |
241 | logger.log('Done running');
242 |
243 | await instauto.sleep(30000);
244 | } catch (err) {
245 | logger.error(err);
246 | }
247 |
248 | await sleepUntilNextDay();
249 | }
250 | }
251 |
252 | async function runBotUnfollowAllUnknown({ limit } = {}) {
253 | await instauto.unfollowAllUnknown({ limit });
254 | }
255 |
256 | async function runBotUnfollowNonMutualFollowers({ limit } = {}) {
257 | await instauto.unfollowNonMutualFollowers({ limit });
258 | }
259 |
260 | async function runBotUnfollowOldFollowed({ ageInDays, limit } = {}) {
261 | await instauto.unfollowOldFollowed({ ageInDays, limit });
262 | }
263 |
264 | async function runBotUnfollowUserList({ usersToUnfollow, limit } = {}) {
265 | await instauto.safelyUnfollowUserList(usersToUnfollow, limit);
266 | }
267 |
268 | async function runBotFollowUserList({ users, limit, skipPrivate } = {}) {
269 | await instauto.safelyFollowUserList({ users, limit, skipPrivate });
270 | }
271 |
272 | // for easier development testing
273 | async function runTestCode() {
274 | // console.log(await instauto.doesUserFollowMe('mifi.no'));
275 | }
276 |
277 | function createWindow() {
278 | // Create the browser window.
279 | mainWindow = new BrowserWindow({
280 | width: 800,
281 | height: 700,
282 | webPreferences: {
283 | contextIsolation: false, // todo
284 | nodeIntegration: true, // todo
285 | preload: path.join(__dirname, 'preload.js'),
286 | // https://github.com/electron/electron/issues/5107
287 | webSecurity: !isDev,
288 | backgroundThrottling: false, // Attempt to fix https://github.com/mifi/SimpleInstaBot/issues/37
289 | },
290 | title: `SimpleInstaBot ${app.getVersion()}`,
291 | });
292 |
293 | electronRemote.enable(mainWindow.webContents);
294 |
295 | const url = new URL(isDev ? 'http://localhost:3001' : `file://${path.join(__dirname, '../build/index.html')}`);
296 |
297 | url.searchParams.append('data', JSON.stringify({ isDev }));
298 |
299 | mainWindow.loadURL(url.toString());
300 |
301 | if (isDev) {
302 | const { default: installExtension, REACT_DEVELOPER_TOOLS } = require('electron-devtools-installer'); // eslint-disable-line global-require,import/no-extraneous-dependencies
303 |
304 | installExtension(REACT_DEVELOPER_TOOLS)
305 | .then(name => console.log(`Added Extension: ${name}`))
306 | .catch(err => console.log('An error occurred: ', err));
307 | }
308 |
309 | // Open the DevTools.
310 | // mainWindow.webContents.openDevTools()
311 |
312 | // Emitted when the window is closed.
313 | mainWindow.on('closed', () => {
314 | // Dereference the window object, usually you would store windows
315 | // in an array if your app supports multi windows, this is the time
316 | // when you should delete the corresponding element.
317 | mainWindow = null;
318 | });
319 | }
320 |
321 | // This method will be called when Electron has finished
322 | // initialization and is ready to create browser windows.
323 | // Some APIs can only be used after this event occurs.
324 | app.on('ready', createWindow);
325 |
326 | // Quit when all windows are closed.
327 | app.on('window-all-closed', () => {
328 | app.quit();
329 | });
330 |
331 | app.on('activate', () => {
332 | // On macOS it's common to re-create a window in the app when the
333 | // dock icon is clicked and there are no other windows open.
334 | if (mainWindow === null) {
335 | createWindow();
336 | }
337 | });
338 |
339 | module.exports = {
340 | initInstauto,
341 | initInstautoDb,
342 | getInstautoData,
343 | runBotNormalMode,
344 | runBotUnfollowAllUnknown,
345 | runBotUnfollowNonMutualFollowers,
346 | runBotUnfollowOldFollowed,
347 | runBotUnfollowUserList,
348 | runBotFollowUserList,
349 | runTestCode,
350 | cleanupInstauto,
351 | checkHaveCookies,
352 | deleteCookies,
353 | };
354 |
--------------------------------------------------------------------------------
/public/entitlements.mac.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.cs.allow-jit
6 |
7 | com.apple.security.cs.allow-unsigned-executable-memory
8 |
9 | com.apple.security.cs.allow-dyld-environment-variables
10 |
11 |
12 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
20 |
21 |
22 | You need to enable JavaScript to run this app.
23 |
24 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/public/preload.js:
--------------------------------------------------------------------------------
1 | const preloadConfig = JSON.parse(new URL(window.location).searchParams.get('data'));
2 |
3 | window.isDev = preloadConfig.isDev;
4 |
--------------------------------------------------------------------------------
/public/store.js:
--------------------------------------------------------------------------------
1 | const Store = require('electron-store');
2 |
3 | const defaults = {
4 | skipPrivate: true,
5 | currentUsername: undefined,
6 | usersToFollowFollowersOf: ['@lostleblanc', '@samkolder', '@bomkanari'],
7 |
8 | userAgent: '',
9 | maxFollowsPerHour: 20,
10 | maxFollowsPerDay: 150,
11 | maxLikesPerDay: 50,
12 | enableFollowUnfollow: true,
13 | maxLikesPerUser: 2,
14 | followUserRatioMin: 0.2,
15 | followUserRatioMax: 4.0,
16 | followUserMaxFollowers: null,
17 | followUserMaxFollowing: null,
18 | followUserMinFollowers: null,
19 | followUserMinFollowing: 10,
20 | dontUnfollowUntilDaysElapsed: 5,
21 | runAtHour: 10,
22 | };
23 |
24 | const store = new Store({
25 | defaults,
26 | });
27 |
28 | module.exports = { store, defaults };
29 |
--------------------------------------------------------------------------------
/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mifi/SimpleInstaBot/516bde325f2a09af827294dc59605a4c0692a065/screenshot.jpg
--------------------------------------------------------------------------------
/scripts/icon-gen.mjs:
--------------------------------------------------------------------------------
1 | import sharp from 'sharp';
2 |
3 | const svg2png = (from, to, width, height) => sharp(from)
4 | .png()
5 | .resize(width, height, {
6 | fit: sharp.fit.contain,
7 | background: { r: 0, g: 0, b: 0, alpha: 0 },
8 | })
9 | .toFile(to);
10 |
11 | await svg2png('src/icon.svg', './icon-build/app-512.png', 512, 512);
12 |
--------------------------------------------------------------------------------
/src/10178-c-bot.json:
--------------------------------------------------------------------------------
1 | {"v":"5.5.9","fr":29.9700012207031,"ip":1.00000004073083,"op":124.000005050624,"w":320,"h":260,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[100]},{"t":113.000004602584,"s":[1]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[161,130,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-46,-49],[-19,-51]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.556862745098,0.286274509804,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":140.000005702317,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"tolottify Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[160,130,0],"ix":2},"a":{"a":0,"k":[160,130,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.75,0],[0,0]],"o":[[0,0],[5.75,0],[0,0]],"v":[[-9.562,-1.5],[0.188,1.5],[9.562,-1.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":63,"s":[156.938,96.5],"to":[0.01,-0.5],"ti":[-0.01,0.5]},{"t":75.0000030548126,"s":[156.998,93.501]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.456,0],[-1.019,-5.16],[0,0],[7.113,0],[1.056,-6.821]],"o":[[1.02,-5.16],[5.455,0],[0,0],[-1.055,-6.821],[-7.114,0],[0,0]],"v":[[-11.019,6.033],[0.001,-3.033],[11.02,6.033],[14.057,6.033],[0.001,-6.033],[-14.057,6.033]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[184.249,70.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.277,0],[1.208,4.909],[0,0],[-6.94,0],[-1.26,6.578]],"o":[[-1.208,4.909],[-5.277,0],[0,0],[1.259,6.578],[6.939,0],[0,0]],"v":[[10.913,-5.783],[0,2.783],[-10.913,-5.783],[-13.988,-5.783],[0,5.783],[13.988,-5.783]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[184.25,87.217],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[5.277,0],[1.208,4.909],[0,0],[-6.94,0],[-1.26,6.578]],"o":[[-1.208,4.909],[-5.277,0],[0,0],[1.259,6.578],[6.939,0],[0,0]],"v":[[10.913,-5.783],[0,2.783],[-10.913,-5.783],[-13.988,-5.783],[0,5.783],[13.988,-5.783]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[129.25,87.217],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.455,0],[-1.02,-5.16],[0,0],[7.112,0],[1.056,-6.821]],"o":[[1.02,-5.16],[5.455,0],[0,0],[-1.056,-6.821],[-7.112,0],[0,0]],"v":[[-11.02,6.033],[0,-3.033],[11.02,6.033],[14.058,6.033],[0,-6.033],[-14.058,6.033]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[129.25,70.533],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[129.25,78.75],"ix":2},"a":{"a":0,"k":[129.25,78.75],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":100,"s":[0]},{"t":113.000004602584,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.821,0],[0.733,0.318],[0.537,0.577],[0.3,0.78],[0,0.925],[-0.196,0.665],[-0.364,0.549],[-0.497,0.399],[-0.606,0.215],[-0.682,0],[-0.687,-0.284],[-0.503,-0.514],[-0.254,-0.705],[0,0],[0.549,0.364],[0.693,0],[0.462,-0.231],[0.347,-0.416],[0.19,-0.566],[0,-0.659],[-0.191,-0.548],[-0.341,-0.398],[-0.467,-0.219],[-0.567,0],[-0.549,0.358],[-0.336,0.669],[0,0],[0.508,-0.52],[0.705,-0.278]],"o":[[-0.866,0],[-0.734,-0.318],[-0.538,-0.578],[-0.301,-0.78],[0,-0.739],[0.197,-0.665],[0.364,-0.548],[0.497,-0.399],[0.607,-0.214],[0.798,0],[0.689,0.283],[0.502,0.515],[0,0],[-0.301,-0.659],[-0.55,-0.364],[-0.544,0],[-0.463,0.231],[-0.346,0.417],[-0.191,0.566],[0,0.659],[0.19,0.549],[0.34,0.399],[0.468,0.219],[0.716,0],[0.548,-0.358],[0,0],[-0.266,0.705],[-0.51,0.52],[-0.706,0.277]],"v":[[0.373,6.5],[-2.027,6.023],[-3.934,4.68],[-5.191,2.643],[-5.642,0.086],[-5.347,-2.02],[-4.506,-3.84],[-3.215,-5.261],[-1.56,-6.18],[0.373,-6.5],[2.6,-6.075],[4.386,-4.88],[5.521,-3.051],[3.494,-2.479],[2.219,-4.013],[0.356,-4.559],[-1.152,-4.212],[-2.366,-3.242],[-3.171,-1.768],[-3.458,0.069],[-3.171,1.88],[-2.374,3.301],[-1.161,4.229],[0.391,4.558],[2.289,4.021],[3.615,2.479],[5.642,3.05],[4.482,4.888],[2.662,6.084]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.681999954523,0.702000038297,0.717999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.458,36.24],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.875,6.355],[8.664,0],[5.816,3.408],[0,-14.376],[-26.086,0],[0,20.849]],"o":[[-5.826,3.443],[-8.614,0],[-14.795,6.375],[0,20.849],[26.083,0],[0,-14.424]],"v":[[22.23,-35.53],[-0.124,-29.971],[-22.378,-35.469],[-47.23,-2.221],[0.001,35.53],[47.23,-2.221]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.234999997008,0.238999998803,0.255000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[157.125,84.47],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.135,7.358],[11.833,0],[5.647,5.985],[0,-14.604],[-28.503,0],[0,22.782]],"o":[[-5.684,5.89],[-11.948,0],[-14.325,7.33],[0,22.782],[28.502,0],[0,-14.489]],"v":[[28.12,-37.829],[0.25,-27.997],[-27.781,-38.003],[-51.609,-3.247],[0,38.003],[51.608,-3.247]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.184000007779,0.187999994615,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.75,82.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.072,17.525],[12.078,12.743],[-1.073,-17.525],[-12.078,-12.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[223,54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-1.072,17.525],[-12.079,12.743],[1.073,-17.525],[12.079,-12.743]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[91,54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-30.79],[38.521,0],[0,30.79],[-38.522,0]],"o":[[0,30.79],[-38.522,0],[0,-30.79],[38.521,0]],"v":[[69.75,0],[0,55.75],[-69.75,0],[0,-55.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.902000038297,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.75,72.25],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[9.342,-17.458],[-16.44,0],[-12.446,9.231],[18.638,0]],"o":[[11.923,7.605],[18.317,0],[-9.621,-15.944],[-19.676,0]],"v":[[-45.442,8.505],[-1.98,20.667],[45.442,5.785],[0.77,-20.667]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.73,111.333],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[157,74.25],"to":[-1.138,0.083],"ti":[0.186,-0.062]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[150.172,74.748],"to":[-0.129,0.043],"ti":[-1.763,0.053]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[150.172,74.67],"to":[0.781,-0.023],"ti":[-0.292,0.007]},{"t":38.0000015477717,"s":[155.883,74.62]}],"ix":2},"a":{"a":0,"k":[157,74.25],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[-6.025]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[-6.025]},{"t":38.0000015477717,"s":[-1.153]}],"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"head","np":11,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.013],[1.013,0],[0,1.013],[-1.013,0]],"o":[[0,1.013],[-1.013,0],[0,-1.013],[1.013,0]],"v":[[1.833,-0.001],[0,1.833],[-1.833,-0.001],[0,-1.834]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[170.499,159.751],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[100]},{"t":89.0000036250443,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.013],[1.013,0],[0,1.013],[-1.012,0]],"o":[[0,1.013],[-1.012,0],[0,-1.013],[1.013,0]],"v":[[1.833,-0.001],[0,1.833],[-1.833,-0.001],[0,-1.834]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.499,159.751],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":74,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":105.000004276738,"s":[1]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.013],[1.012,0],[0,1.013],[-1.013,0]],"o":[[0,1.013],[-1.013,0],[0,-1.013],[1.012,0]],"v":[[1.834,-0.001],[0.001,1.833],[-1.833,-0.001],[0.001,-1.834]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.556999954523,0.286000001197,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.499,159.751],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":89,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[100]},{"t":119.000004846969,"s":[2]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[160.499,159.751],"ix":2},"a":{"a":0,"k":[160.499,159.751],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,10.357],[29.641,0],[0,-32.77],[-4.22,-8.475]],"o":[[4.219,-8.475],[0,-32.77],[-29.639,0],[0,10.357],[0,0]],"v":[[47.042,43.95],[53.667,15.384],[-0.001,-43.95],[-53.667,15.384],[-47.042,43.95]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.902000038297,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.501,134.616],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.121,-59.054]],"o":[[0,0],[0,0]],"v":[[20.86,-30.328],[-8.739,30.328]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[104.14,154.828],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.201,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.385,5.103],[5.199,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-11.096],[-9.875,1.971],[-9.838,1.971],[0,11.096],[9.836,1.971],[9.875,1.971],[9.875,-11.096]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.902000038297,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.709,220.529],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.2,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.384,5.103],[5.2,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-11.096],[-9.875,1.971],[-9.837,1.971],[0,11.096],[9.837,1.971],[9.875,1.971],[9.875,-11.096]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.902000038297,0.902000038297,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.375,220.529],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.201,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.385,5.103],[5.199,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-41.062],[-9.875,31.938],[-9.838,31.938],[0,41.062],[9.836,31.938],[9.875,31.938],[9.875,-41.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.709,190.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.2,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.384,5.103],[5.2,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-41.062],[-9.875,31.938],[-9.837,31.938],[0,41.062],[9.837,31.938],[9.875,31.938],[9.875,-41.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.375,190.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.201,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.385,5.103],[5.199,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-41.062],[-9.875,31.938],[-9.838,31.938],[0,41.062],[9.836,31.938],[9.875,31.938],[9.875,-41.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.709,190.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.2,0],[-0.384,5.103],[0,0],[0,0]],"o":[[0,0],[0,0],[0.384,5.103],[5.2,0],[0,0],[0,0],[0,0]],"v":[[-9.875,-41.062],[-9.875,31.938],[-9.837,31.938],[0,41.062],[9.837,31.938],[9.875,31.938],[9.875,-41.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.375,190.562],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[{"i":[[0,0],[-7.791,-3.137],[-2.143,-2.91],[1.05,-17.169]],"o":[[0,0],[2.751,1.108],[12.848,17.446],[0,0]],"v":[[-26.372,13.616],[-10.003,14.14],[-2.457,19.982],[11.424,71.365]],"c":false}]},{"t":33.0000013441176,"s":[{"i":[[0,0],[-8.327,-4.979],[-1.481,-2.011],[-3.091,38.468]],"o":[[0,0],[1.833,1.096],[12.848,17.446],[0,0]],"v":[[-26.372,13.616],[-7.495,15.382],[-2.457,19.982],[24.924,-1.635]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.816000007181,0.838999968884,0.859000052658,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[219.167,110.167],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"waving hand","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":140.000005702317,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/src/13680-robot-call.json:
--------------------------------------------------------------------------------
1 | {"v":"4.12.2","fr":29.9700012207031,"ip":0,"op":240.0000097754,"w":400,"h":400,"nm":"Robot","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"Mouth - Teeth","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[31,61],[31,31.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.5,31.5],[0.5,61]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-30.5,61],[-30.5,31.5]],"c":false},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.279],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p279_1_0p333_0"],"t":73,"s":[100],"e":[0]},{"t":84.0000034213901}],"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":4,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":60.0000024438501,"op":360.000014663101,"st":60.0000024438501,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Mouth - Shape","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[120,30],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p478_1_0p167_0p167"],"t":60,"s":[51],"e":[0]},{"t":80.0000032584668}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p478_1_0p167_0p167"],"t":60,"s":[52],"e":[100]},{"t":80.0000032584668}],"ix":2},"o":{"a":0,"k":-90,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.101,45.862],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":60.0000024438501,"op":360.000014663101,"st":60.0000024438501,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Eyes - Flash","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":131,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[100],"e":[0]},{"t":151.000006150356}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-39.75,-15.5],[-19.75,-5.5],[-39,3.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[40.5,3.75],[19.75,-6.25],[39.75,-15.5]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48.0000019550801,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Eyes - Closed","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":99,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":103,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":104,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":176,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":177,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":181,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":182,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":186,"s":[100],"e":[0]},{"t":187.000007616666}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-40,-5.5],[-20,-5.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[20,-5.5],[40,-5.5]],"c":false},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48.0000019550801,"op":348.000014174331,"st":48.0000019550801,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Eyes - Open","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":93,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":94,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":98,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":99,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":103,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":104,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":108,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":109,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":131,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":151,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":171,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":172,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":176,"s":[0],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":177,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":181,"s":[100],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":182,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":186,"s":[0],"e":[100]},{"t":187.000007616666}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[-30,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"d":1,"ty":"el","s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[30,0],"ix":3},"nm":"Ellipse Path 2","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.679],"y":[0.796]},"o":{"x":[0.322],"y":[0]},"n":["0p679_0p796_0p322_0"],"t":48,"s":[0],"e":[12.432]},{"i":{"x":[0.503],"y":[1]},"o":{"x":[0.358],"y":[-0.774]},"n":["0p503_1_0p358_-0p774"],"t":66,"s":[12.432],"e":[10]},{"t":78.0000031770051}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48.0000019550801,"op":348.000014174331,"st":48.0000019550801,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Head","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,278,0],"ix":2,"x":"var $bm_rt;\n$bm_rt = wiggle(10, effect('Wiggle Amount')('Slider'));"},"a":{"a":0,"k":[0,88,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":21,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":90,"s":[100,100,100],"e":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":180,"s":[100,100,100],"e":[100,100,100]},{"t":270.000010997325}],"ix":6}},"ao":0,"ef":[{"ty":5,"nm":"Wiggle Amount","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":130,"s":[0],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":131,"s":[3],"e":[3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":150,"s":[3],"e":[0]},{"t":161.000006557664}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[180,130],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.133,22.017],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[50],"e":[100]},{"t":44.0000017921567}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":20,"s":[50],"e":[0]},{"t":44.0000017921567}],"ix":2},"o":{"a":0,"k":121,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":21.0000008553475,"op":300.00001221925,"st":-5.00000020365417,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Antena - Radio","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-1,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":130,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.5,-23],[-0.5,-73]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-0.5,-23],[-0.5,-84.75]],"c":false}]},{"t":146.000005946702}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":136.4,"s":[10],"e":[0]},{"t":146.000005946702}],"ix":5},"lc":2,"lj":2,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"rp","c":{"a":0,"k":5,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":3,"tr":{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":45,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.105],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p105_1_0p333_0"],"t":130,"s":[0],"e":[100]},{"t":140.133755707765}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0_1_0p333_0"],"t":138,"s":[0],"e":[100]},{"t":146.000005946702}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":3,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":130.000005295009,"op":151.000006150356,"st":130.000005295009,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Antena - Stem","parent":10,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0.5,10.5],[1,37]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[0],"e":[100]},{"t":21.0000008553475}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Antena - Tip","parent":7,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-80,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.211,0.667],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0.167,0]},"n":["0p211_1_0p167_0p167","0p667_1_0p167_0"],"t":0,"s":[0,20],"e":[20,20]},{"t":20.0000008146167}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.211],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"n":["0p211_1_0p167_0p167"],"t":0,"s":[0],"e":[10]},{"t":20.0000008146167}],"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0}]}
--------------------------------------------------------------------------------
/src/13682-heart.json:
--------------------------------------------------------------------------------
1 | {"v":"5.1.1","fr":29.9700012207031,"ip":0,"op":150.000006109625,"w":300,"h":300,"nm":"Heart Animated","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Parent","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[150,150,0],"e":[150,155,0],"to":[0,0.83333331346512,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":30,"s":[150,155,0],"e":[150,150,0],"to":[0,0,0],"ti":[0,0.83333331346512,0]},{"t":60.0000024438501}],"ix":2,"x":"var $bm_rt;\n$bm_rt = loopOut('cycle', 0);"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":181.000007372281,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Traces above 12","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":300,"ix":10},"p":{"a":0,"k":[0,-22,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":123,"s":[0],"e":[100]},{"t":132.993755416946}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":128.006,"s":[0],"e":[100]},{"t":138.000005620855}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":123,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":128,"s":[10],"e":[0]},{"t":137.990005620448}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":123.000005009893,"op":274.000011160249,"st":123.000005009893,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Traces above 11","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":240,"ix":10},"p":{"a":0,"k":[0,-20,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":126,"s":[0],"e":[100]},{"t":135.993755539139}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":131.006,"s":[0],"e":[100]},{"t":141.000005743048}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":126,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":131,"s":[10],"e":[0]},{"t":140.99000574264}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":126.000005132085,"op":277.000011282441,"st":126.000005132085,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Traces above 10","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[0,-6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":129,"s":[0],"e":[100]},{"t":138.993755661332}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":134.006,"s":[0],"e":[100]},{"t":144.00000586524}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":129,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":134,"s":[10],"e":[0]},{"t":143.990005864833}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":129.000005254278,"op":280.000011404634,"st":129.000005254278,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Traces above 9","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":120,"ix":10},"p":{"a":0,"k":[0,-20,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":126,"s":[0],"e":[100]},{"t":135.993755539139}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":131.006,"s":[0],"e":[100]},{"t":141.000005743048}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":126,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":131,"s":[10],"e":[0]},{"t":140.99000574264}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":126.000005132085,"op":277.000011282441,"st":126.000005132085,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Traces above 8","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":60,"ix":10},"p":{"a":0,"k":[0,-22,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":123,"s":[0],"e":[100]},{"t":132.993755416946}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":128.006,"s":[0],"e":[100]},{"t":138.000005620855}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":123,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":128,"s":[10],"e":[0]},{"t":137.990005620448}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":123.000005009893,"op":274.000011160249,"st":123.000005009893,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Traces above 7","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,2,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":120,"s":[0],"e":[100]},{"t":129.993755294754}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":125.006,"s":[0],"e":[100]},{"t":135.000005498663}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":120,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":125,"s":[10],"e":[0]},{"t":134.990005498255}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":120.0000048877,"op":271.000011038056,"st":120.0000048877,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Traces above 6","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":300,"ix":10},"p":{"a":0,"k":[0,-22,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":51,"s":[0],"e":[100]},{"t":60.9937524843264}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":56.006,"s":[0],"e":[100]},{"t":66.0000026882351}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":51,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":56,"s":[10],"e":[0]},{"t":65.9900026878278}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0000020772726,"op":202.000008227629,"st":51.0000020772726,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Traces above 5","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":240,"ix":10},"p":{"a":0,"k":[0,-20,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":54,"s":[0],"e":[100]},{"t":63.9937526065189}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":59.006,"s":[0],"e":[100]},{"t":69.0000028104276}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":54,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":59,"s":[10],"e":[0]},{"t":68.9900028100203}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":54.0000021994651,"op":205.000008349821,"st":54.0000021994651,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Traces above 4","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[0,-6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":57,"s":[0],"e":[100]},{"t":66.9937527287114}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":62.006,"s":[0],"e":[100]},{"t":72.0000029326201}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":57,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":62,"s":[10],"e":[0]},{"t":71.9900029322128}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":57.0000023216576,"op":208.000008472014,"st":57.0000023216576,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Traces above 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":120,"ix":10},"p":{"a":0,"k":[0,-20,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":54,"s":[0],"e":[100]},{"t":63.9937526065189}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":59.006,"s":[0],"e":[100]},{"t":69.0000028104276}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":54,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":59,"s":[10],"e":[0]},{"t":68.9900028100203}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":54.0000021994651,"op":205.000008349821,"st":54.0000021994651,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Traces above 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":60,"ix":10},"p":{"a":0,"k":[0,-22,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":51,"s":[0],"e":[100]},{"t":60.9937524843264}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":56.006,"s":[0],"e":[100]},{"t":66.0000026882351}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":51,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":56,"s":[10],"e":[0]},{"t":65.9900026878278}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0000020772726,"op":202.000008227629,"st":51.0000020772726,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Traces above","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,2,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-85.562],[0,-127.562]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":48,"s":[0],"e":[100]},{"t":57.9937523621339}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p833_0p333_0"],"t":53.006,"s":[0],"e":[100]},{"t":63.0000025660426}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":48,"s":[0],"e":[10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.431],"y":[0]},"n":["0p667_1_0p431_0"],"t":53,"s":[10],"e":[0]},{"t":62.9900025656353}],"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48.0000019550801,"op":199.000008105436,"st":48.0000019550801,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Heart","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1.5,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.838,-33.403],[0,19.513],[-22.794,0],[0,0],[-22.795,0],[0,-19.513]],"o":[[-55.838,-33.403],[0,-19.513],[22.794,0],[0,0],[22.795,0],[0,19.513]],"v":[[-1.5,61.5],[-73.654,-26.805],[-34.959,-65.5],[-1.5,-42.349],[31.959,-65.5],[70.654,-26.805]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[50]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[50],"e":[100]},{"t":30.0000012219251}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.141176477075,0.482352942228,0.631372570992,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Stroke","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.838,-33.403],[0,19.513],[-22.794,0],[0,0],[-22.795,0],[0,-19.513]],"o":[[-55.838,-33.403],[0,-19.513],[22.794,0],[0,0],[22.795,0],[0,19.513]],"v":[[-1.5,61.5],[-73.654,-26.805],[-34.959,-65.5],[-1.5,-42.349],[31.959,-65.5],[70.654,-26.805]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.141176477075,0.482352942228,0.627451002598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.491,0.491],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p491_1_0p333_0","0p491_1_0p333_0"],"t":33.999,"s":[0,0],"e":[100,100]},{"t":55.0000022401959}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fills 3","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.838,-33.403],[0,19.513],[-22.794,0],[0,0],[-22.795,0],[0,-19.513]],"o":[[-55.838,-33.403],[0,-19.513],[22.794,0],[0,0],[22.795,0],[0,19.513]],"v":[[-1.5,61.5],[-73.654,-26.805],[-34.959,-65.5],[-1.5,-42.349],[31.959,-65.5],[70.654,-26.805]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.529411792755,0.717647075653,0.796078443527,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.491,0.491],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p491_1_0p333_0","0p491_1_0p333_0"],"t":27,"s":[0,0],"e":[100,100]},{"t":48.0000019550801}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fills 2","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[55.838,-33.403],[0,19.513],[-22.794,0],[0,0],[-22.795,0],[0,-19.513]],"o":[[-55.838,-33.403],[0,-19.513],[22.794,0],[0,0],[22.795,0],[0,19.513]],"v":[[-1.5,61.5],[-73.654,-26.805],[-34.959,-65.5],[-1.5,-42.349],[31.959,-65.5],[70.654,-26.805]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.73417788744,0.882435560226,0.944209575653,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.491,0.491],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"n":["0p491_1_0p333_0","0p491_1_0p333_0"],"t":20,"s":[0,0],"e":[100,100]},{"t":40.9987516699133}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Fill 1","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":151.000006150356,"st":0,"bm":0}],"markers":[]}
--------------------------------------------------------------------------------
/src/App.jsx:
--------------------------------------------------------------------------------
1 | import React, { memo, useState, useEffect, useRef, useCallback } from 'react';
2 | import { Paragraph, ResetIcon, LogOutIcon, StopIcon, PlayIcon, SettingsIcon, ListIcon, IssueIcon, TickIcon, Dialog, Tooltip, IconButton, HelpIcon, Button, TextInputField, SideSheet, TagInput, Checkbox, Badge, Label, Textarea } from 'evergreen-ui';
3 | import Swal from 'sweetalert2';
4 | import moment from 'moment';
5 | import isEqual from 'lodash/isEqual';
6 | import Lottie from 'react-lottie-player';
7 | import withReactContent from 'sweetalert2-react-content';
8 | import JSON5 from 'json5';
9 |
10 | import runningLottie from './14470-phone-running.json';
11 | import robotLottie from './10178-c-bot.json';
12 | import robotDizzyLottie from './13680-robot-call.json';
13 | import loveLottie from './13682-heart.json';
14 |
15 | const { isDev } = window;
16 |
17 | const electron = window.require('@electron/remote');
18 |
19 | const { initInstautoDb, initInstauto, runBotNormalMode, runBotUnfollowAllUnknown, runBotUnfollowNonMutualFollowers, runBotUnfollowOldFollowed, runBotUnfollowUserList, runBotFollowUserList, cleanupInstauto, checkHaveCookies, deleteCookies, getInstautoData, runTestCode } = electron.require('./electron');
20 | const { store: configStore, defaults: configDefaults } = electron.require('./store');
21 |
22 | const ReactSwal = withReactContent(Swal);
23 |
24 | const cleanupAccounts = (accounts) => accounts.map(user => user.replace(/^@/g, ''));
25 |
26 | function safeSetConfig(key, val) {
27 | configStore.set(key, val !== undefined ? val : null);
28 | }
29 |
30 |
31 | function onTroubleshootingClick() {
32 | Swal.fire({
33 | title: 'Troubleshooting',
34 | html: `
35 |
36 | Check that all @account names are correct.
37 | Check logs for any error
38 | Try to log out and then log back in
39 | Check that your firewall allows the app (listen to port)
40 | Restart the app
41 |
42 | `,
43 | });
44 | }
45 |
46 | const StatisticsBanner = memo(({ data: { numFollowedLastDay, numTotalFollowedUsers, numUnfollowedLastDay, numTotalUnfollowedUsers, numLikedLastDay, numTotalLikedPhotos } }) => {
47 | const headingStyle = { marginBottom: 5, color: '#7c3c21' };
48 | const statStyle = { minWidth: 30, paddingRight: 5, fontWeight: 400, fontSize: 24, color: '#303960' };
49 | return (
50 |
51 |
52 |
Followed users
53 |
{numFollowedLastDay}
Last 24h
54 |
{numTotalFollowedUsers}
Total
55 |
56 |
57 |
58 |
Unfollowed users
59 |
{numUnfollowedLastDay}
Last 24h
60 |
{numTotalUnfollowedUsers}
Total
61 |
62 |
63 |
64 |
Liked photos
65 |
{numLikedLastDay}
Last 24h
66 |
{numTotalLikedPhotos}
Total
67 |
68 |
69 | );
70 | });
71 |
72 | const AdvancedSettings = memo(({
73 | advancedSettings, onChange, dryRun, setDryRun, instantStart, setInstantStart, onClose,
74 | }) => {
75 | const [advancedSettingsTxt, setAdvancedSettingsTxt] = useState();
76 | const [advancedSettingsParsed, setAdvancedSettingsParsed] = useState(advancedSettings);
77 |
78 | const onTextareaChange = useCallback((e) => {
79 | const { value } = e.target;
80 | setAdvancedSettingsTxt(value);
81 | try {
82 | setAdvancedSettingsParsed(JSON5.parse(value));
83 | } catch (err) {
84 | setAdvancedSettingsParsed();
85 | console.error(err);
86 | }
87 | }, []);
88 |
89 | const tooHighWarning = 'NOTE: setting this too high may cause Action Blocked';
90 | const optsData = {
91 | dontUnfollowUntilDaysElapsed: {
92 | description: 'Automatically unfollow auto-followed users after this number of days',
93 | },
94 | followUserMinFollowing: {
95 | description: 'Skip users who follow less users than this',
96 | },
97 | followUserMinFollowers: {
98 | description: 'Skip users who have less followers than this',
99 | },
100 | followUserMaxFollowers: {
101 | description: 'Skip users who have more followers than this',
102 | },
103 | followUserMaxFollowing: {
104 | description: 'Skip users who are following more than this',
105 | },
106 | followUserRatioMin: {
107 | description: 'Skip users that have a followers/following ratio lower than this',
108 | },
109 | followUserRatioMax: {
110 | description: 'Skip users that have a followers/following ratio higher than this',
111 | },
112 | maxFollowsPerHour: {
113 | description: `Limit follow and unfollow operations per hour. ${tooHighWarning}`,
114 | },
115 | maxFollowsPerDay: {
116 | description: `Limit follow and unfollow operations over 24 hours. ${tooHighWarning}`,
117 | },
118 | maxLikesPerUser: {
119 | description: 'Like up to this number of photos on each user\'s profile. Set to 0 to deactivate liking photos',
120 | },
121 | enableFollowUnfollow: {
122 | description: 'Enable follow/unfollow users? (can be disabled if you only want to like photos)',
123 | },
124 | maxLikesPerDay: {
125 | description: `Limit total photo likes per 24 hours. ${tooHighWarning}`,
126 | },
127 | runAtHour: {
128 | description: 'Repeat at this hour (24hr based) every day',
129 | },
130 | userAgent: {
131 | description: 'Set the browser\'s user agent to this value',
132 | },
133 | };
134 |
135 | const onResetClick = useCallback(() => {
136 | setAdvancedSettingsTxt();
137 | setAdvancedSettingsParsed(advancedSettings);
138 | }, [advancedSettings]);
139 |
140 | const onSaveClick = useCallback(() => {
141 | if (!advancedSettingsParsed) return;
142 |
143 | onChange(advancedSettingsParsed);
144 | setAdvancedSettingsTxt();
145 |
146 | onClose();
147 | }, [advancedSettingsParsed, onChange, onClose]);
148 |
149 | const formatValue = (value) => (value ? String(value) : 'unset');
150 |
151 | return (
152 | <>
153 |
159 |
160 | {Object.entries(advancedSettingsParsed || advancedSettings).map(([key, value]) => {
161 | const defaultValue = configDefaults[key];
162 | const hasChanged = !isEqual(defaultValue, value);
163 |
164 | return (
165 |
166 |
{key}
167 |
168 |
{formatValue(value)}
169 | {hasChanged && (
170 | <>
171 |
172 |
default {formatValue(defaultValue)}
173 | >
174 | )}
175 |
{optsData[key].description}
176 |
177 | );
178 | })}
179 |
180 |
186 | Change settings here (JSON):
187 |
188 |
198 |
199 | {!advancedSettingsParsed && The JSON has a syntax error, please fix. }
200 |
201 |
202 | setDryRun(e.target.checked)}
206 | />
207 |
208 | setInstantStart(e.target.checked)}
212 | />
213 |
214 |
215 | Save & Close
216 |
217 | >
218 | );
219 | });
220 |
221 | const LogView = memo(({ logs, style, fontSize } = {}) => {
222 | const logViewRef = useRef();
223 | useEffect(() => {
224 | if (logViewRef.current) logViewRef.current.scrollTop = logViewRef.current.scrollHeight;
225 | }, [logs]);
226 |
227 | return (
228 |
229 | {logs.map(({ args, level, time }, i) => {
230 | const color = {
231 | warn: '#f37121',
232 | error: '#d92027',
233 | }[level] || 'rgba(0,0,0,0.6)';
234 |
235 | return (
236 | // eslint-disable-next-line react/no-array-index-key
237 |
238 | {moment(time).format('LT')}
239 |
240 | {args.map(arg => String(arg)).join(' ')}
241 |
242 |
243 | );
244 | })}
245 |
246 | );
247 | });
248 |
249 | const AccountsList = memo(({ hasWarning, accounts, setAccounts, label, placeholder, tooltip }) => {
250 | const onChange = useCallback((newVal) => {
251 | // Some people try hashtags
252 | setAccounts(newVal.filter((v) => !v.startsWith('#')));
253 | }, [setAccounts]);
254 |
255 | return (
256 | <>
257 |
258 | {label}Press ENTER between each account
259 |
260 | {tooltip && (
261 |
262 |
263 |
264 | )}
265 |
272 | >
273 | );
274 | });
275 |
276 | const AccountsListDialog = ({ isShown, onCloseComplete, onConfirm, label }) => {
277 | const [accounts, setAccounts] = useState([]);
278 |
279 | return (
280 | onConfirm(accounts)}>
281 |
282 |
283 | );
284 | };
285 |
286 | const App = memo(() => {
287 | const [advancedSettings, setAdvancedSettings] = useState(() => ({
288 | userAgent: configStore.get('userAgent'),
289 | maxFollowsPerDay: configStore.get('maxFollowsPerDay'),
290 | maxFollowsPerHour: configStore.get('maxFollowsPerHour'),
291 | maxLikesPerDay: configStore.get('maxLikesPerDay'),
292 | maxLikesPerUser: configStore.get('maxLikesPerUser'),
293 | enableFollowUnfollow: configStore.get('enableFollowUnfollow'),
294 | followUserRatioMin: configStore.get('followUserRatioMin'),
295 | followUserRatioMax: configStore.get('followUserRatioMax'),
296 | followUserMaxFollowers: configStore.get('followUserMaxFollowers'),
297 | followUserMaxFollowing: configStore.get('followUserMaxFollowing'),
298 | followUserMinFollowers: configStore.get('followUserMinFollowers'),
299 | followUserMinFollowing: configStore.get('followUserMinFollowing'),
300 | dontUnfollowUntilDaysElapsed: configStore.get('dontUnfollowUntilDaysElapsed'),
301 | runAtHour: configStore.get('runAtHour'),
302 | }));
303 |
304 | function setAdvancedSetting(key, value) {
305 | setAdvancedSettings(s => ({ ...s, [key]: value }));
306 | }
307 |
308 | useEffect(() => safeSetConfig('userAgent', advancedSettings.userAgent), [advancedSettings.userAgent]);
309 | useEffect(() => safeSetConfig('maxFollowsPerDay', advancedSettings.maxFollowsPerDay), [advancedSettings.maxFollowsPerDay]);
310 | useEffect(() => safeSetConfig('maxFollowsPerHour', advancedSettings.maxFollowsPerHour), [advancedSettings.maxFollowsPerHour]);
311 | useEffect(() => safeSetConfig('maxLikesPerDay', advancedSettings.maxLikesPerDay), [advancedSettings.maxLikesPerDay]);
312 | useEffect(() => safeSetConfig('maxLikesPerUser', advancedSettings.maxLikesPerUser), [advancedSettings.maxLikesPerUser]);
313 | useEffect(() => safeSetConfig('enableFollowUnfollow', advancedSettings.enableFollowUnfollow), [advancedSettings.enableFollowUnfollow]);
314 | useEffect(() => safeSetConfig('followUserRatioMin', advancedSettings.followUserRatioMin), [advancedSettings.followUserRatioMin]);
315 | useEffect(() => safeSetConfig('followUserRatioMax', advancedSettings.followUserRatioMax), [advancedSettings.followUserRatioMax]);
316 | useEffect(() => safeSetConfig('followUserMaxFollowers', advancedSettings.followUserMaxFollowers), [advancedSettings.followUserMaxFollowers]);
317 | useEffect(() => safeSetConfig('followUserMaxFollowing', advancedSettings.followUserMaxFollowing), [advancedSettings.followUserMaxFollowing]);
318 | useEffect(() => safeSetConfig('followUserMinFollowers', advancedSettings.followUserMinFollowers), [advancedSettings.followUserMinFollowers]);
319 | useEffect(() => safeSetConfig('followUserMinFollowing', advancedSettings.followUserMinFollowing), [advancedSettings.followUserMinFollowing]);
320 | useEffect(() => safeSetConfig('dontUnfollowUntilDaysElapsed', advancedSettings.dontUnfollowUntilDaysElapsed), [advancedSettings.dontUnfollowUntilDaysElapsed]);
321 | useEffect(() => safeSetConfig('runAtHour', advancedSettings.runAtHour), [advancedSettings.runAtHour]);
322 |
323 | const [haveCookies, setHaveCookies] = useState(false);
324 | const [dryRun, setDryRun] = useState(isDev);
325 | const [running, setRunning] = useState(false);
326 | const [advancedVisible, setAdvancedVisible] = useState(false);
327 | const [logsVisible, setLogsVisible] = useState(false);
328 | const [username, setUsername] = useState('');
329 | const [password, setPassword] = useState('');
330 |
331 | const [skipPrivate, setSkipPrivate] = useState(configStore.get('skipPrivate'));
332 | const [usersToFollowFollowersOf, setUsersToFollowFollowersOf] = useState(configStore.get('usersToFollowFollowersOf'));
333 |
334 | const [currentUsername, setCurrentUsername] = useState(configStore.get('currentUsername'));
335 | useEffect(() => (currentUsername ? safeSetConfig('currentUsername', currentUsername) : configStore.delete('currentUsername')), [currentUsername]);
336 |
337 | const [instantStart, setInstantStart] = useState(true);
338 |
339 | // Testing
340 | // useEffect(() => isDev && setRunning(true), []);
341 |
342 | const [shouldPlayAnimations, setSouldPlayAnimations] = useState(true);
343 |
344 | const [unfollowUserListDialogShown, setUnfollowUserListDialogShown] = useState(false);
345 | const [followUserListDialogShown, setFollowUserListDialogShown] = useState(false);
346 |
347 | useEffect(() => {
348 | if (running) {
349 | const t = setTimeout(() => {
350 | setSouldPlayAnimations(false);
351 | }, isDev ? 5000 : 60000);
352 |
353 | return () => clearTimeout(t);
354 | }
355 | return undefined;
356 | }, [running]);
357 |
358 | const [logs, setLogs] = useState([]);
359 |
360 | const [instautoData, setInstautoData] = useState();
361 |
362 | useEffect(() => safeSetConfig('skipPrivate', skipPrivate), [skipPrivate]);
363 | useEffect(() => safeSetConfig('usersToFollowFollowersOf', usersToFollowFollowersOf), [usersToFollowFollowersOf]);
364 |
365 | const fewUsersToFollowFollowersOf = usersToFollowFollowersOf.length < 5;
366 |
367 | async function updateCookiesState() {
368 | setHaveCookies(await checkHaveCookies());
369 | }
370 |
371 | const refreshInstautoData = useCallback(() => {
372 | setInstautoData(getInstautoData());
373 | }, []);
374 |
375 | const isLoggedIn = !!(currentUsername && haveCookies);
376 |
377 | useEffect(() => {
378 | (async () => {
379 | if (!isLoggedIn) return;
380 | await initInstautoDb(currentUsername);
381 | refreshInstautoData();
382 | })().catch(console.error);
383 | }, [currentUsername, isLoggedIn, refreshInstautoData]);
384 |
385 | useEffect(() => {
386 | updateCookiesState();
387 | }, []);
388 |
389 | const onLogoutClick = useCallback(async () => {
390 | await deleteCookies();
391 | await updateCookiesState();
392 | setCurrentUsername();
393 | cleanupInstauto();
394 |
395 | refreshInstautoData();
396 | }, [refreshInstautoData]);
397 |
398 | const startInstautoAction = useCallback(async (instautoAction) => {
399 | if (running) {
400 | const result = await Swal.fire({
401 | title: 'Are you sure?',
402 | text: 'This will terminate the bot and you will lose any log text. Note that the bot will still remember which users it has followed, and will unfollow them in the future.',
403 | icon: 'warning',
404 | showCancelButton: true,
405 | confirmButtonText: 'Stop the bot',
406 | cancelButtonText: 'Leave it running',
407 | });
408 | if (result.value) electron.app.quit();
409 | return;
410 | }
411 |
412 | if (usersToFollowFollowersOf.length < 1) {
413 | await Swal.fire({ icon: 'error', text: 'Please add at least 1 account to the list!' });
414 | return;
415 | }
416 |
417 | if (!isLoggedIn && (username.length < 1 || password.length < 1)) {
418 | await Swal.fire({ icon: 'error', text: 'Please enter your username and password' });
419 | return;
420 | }
421 |
422 | if (fewUsersToFollowFollowersOf) {
423 | const { value } = await Swal.fire({ icon: 'warning', text: 'We recommended to provide at least 5 users', showCancelButton: true, confirmButtonText: 'Run anyway' });
424 | if (!value) return;
425 | }
426 |
427 |
428 | setLogs([]);
429 | setRunning(true);
430 |
431 | function log(level, ...args) {
432 | console[level](...args);
433 | setLogs((l) => [...l, { time: new Date(), level, args }]);
434 | }
435 |
436 | const logger = {
437 | log: (...args) => log('log', ...args),
438 | error: (...args) => log('error', ...args),
439 | warn: (...args) => log('warn', ...args),
440 | info: (...args) => log('info', ...args),
441 | debug: (...args) => log('debug', ...args),
442 | };
443 |
444 | try {
445 | if (isLoggedIn) {
446 | await initInstautoDb(currentUsername);
447 | } else {
448 | await deleteCookies(); // Maybe they had cookies but not yet any currentUsername (old version)
449 | setCurrentUsername(username);
450 | await initInstautoDb(username);
451 | }
452 | refreshInstautoData();
453 |
454 | await initInstauto({
455 | userAgent: advancedSettings.userAgent,
456 | dontUnfollowUntilDaysElapsed: advancedSettings.dontUnfollowUntilDaysElapsed,
457 | maxFollowsPerHour: advancedSettings.maxFollowsPerHour,
458 | maxFollowsPerDay: advancedSettings.maxFollowsPerDay,
459 | maxLikesPerDay: advancedSettings.maxLikesPerDay,
460 | followUserRatioMin: advancedSettings.followUserRatioMin,
461 | followUserRatioMax: advancedSettings.followUserRatioMax,
462 | followUserMaxFollowers: advancedSettings.followUserMaxFollowers,
463 | followUserMaxFollowing: advancedSettings.followUserMaxFollowing,
464 | followUserMinFollowers: advancedSettings.followUserMinFollowers,
465 | followUserMinFollowing: advancedSettings.followUserMinFollowing,
466 |
467 | excludeUsers: [],
468 |
469 | dryRun,
470 |
471 | username,
472 | password,
473 |
474 | logger,
475 | });
476 |
477 | await instautoAction();
478 | } catch (err) {
479 | logger.error('Failed to run', err);
480 | await ReactSwal.fire({
481 | icon: 'error',
482 | title: 'Failed to run',
483 | html: (
484 |
485 | Try the troubleshooting button. Error:
486 |
{err.message}
487 |
488 | ),
489 | });
490 | if (!isDev) await onLogoutClick();
491 | } finally {
492 | setRunning(false);
493 | cleanupInstauto();
494 | }
495 | }, [advancedSettings, currentUsername, dryRun, fewUsersToFollowFollowersOf, isLoggedIn, onLogoutClick, password, refreshInstautoData, running, username, usersToFollowFollowersOf.length]);
496 |
497 | const onStartPress = useCallback(async () => {
498 | await startInstautoAction(async () => {
499 | await runBotNormalMode({
500 | usernames: cleanupAccounts(usersToFollowFollowersOf),
501 | ageInDays: advancedSettings.dontUnfollowUntilDaysElapsed,
502 | skipPrivate,
503 | runAtHour: advancedSettings.runAtHour,
504 | enableFollowUnfollow: advancedSettings.enableFollowUnfollow,
505 | maxLikesPerUser: advancedSettings.maxLikesPerUser,
506 | maxFollowsTotal: advancedSettings.maxFollowsPerDay, // This could be improved in the future
507 | instantStart,
508 | });
509 | });
510 | }, [advancedSettings.dontUnfollowUntilDaysElapsed, advancedSettings.enableFollowUnfollow, advancedSettings.maxFollowsPerDay, advancedSettings.maxLikesPerUser, advancedSettings.runAtHour, instantStart, skipPrivate, startInstautoAction, usersToFollowFollowersOf]);
511 |
512 | const onUnfollowNonMutualFollowersPress = useCallback(async () => {
513 | await startInstautoAction(async () => runBotUnfollowNonMutualFollowers());
514 | }, [startInstautoAction]);
515 |
516 | const onUnfollowAllUnknownPress = useCallback(async () => {
517 | await startInstautoAction(async () => runBotUnfollowAllUnknown());
518 | }, [startInstautoAction]);
519 |
520 | const onUnfollowOldFollowedPress = useCallback(async () => {
521 | await startInstautoAction(async () => runBotUnfollowOldFollowed({ ageInDays: advancedSettings.dontUnfollowUntilDaysElapsed }));
522 | }, [advancedSettings.dontUnfollowUntilDaysElapsed, startInstautoAction]);
523 |
524 | const onUnfollowUserList = useCallback(async (accounts) => {
525 | const accountsCleaned = cleanupAccounts(accounts);
526 | if (accountsCleaned.length === 0) return;
527 | setUnfollowUserListDialogShown(false);
528 | await startInstautoAction(async () => runBotUnfollowUserList({ usersToUnfollow: accountsCleaned }));
529 | }, [startInstautoAction]);
530 |
531 | const onFollowUserList = useCallback(async (accounts) => {
532 | const accountsCleaned = cleanupAccounts(accounts);
533 | if (accountsCleaned.length === 0) return;
534 | setFollowUserListDialogShown(false);
535 | await startInstautoAction(async () => runBotFollowUserList({ users: accountsCleaned, skipPrivate }));
536 | }, [skipPrivate, startInstautoAction]);
537 |
538 | const onRunTestCode = useCallback(async () => {
539 | await startInstautoAction(async () => runTestCode());
540 | }, [startInstautoAction]);
541 |
542 | const onDonateClick = () => electron.shell.openExternal('https://mifi.no/thanks');
543 |
544 | return (
545 | <>
546 |
547 |
548 | {running ? (
549 |
550 |
556 |
557 |
Your bot is running
558 |
559 |
560 |
Leave the app running on your computer and keep it connected to power and prevent it from sleeping and the bot will work for you while you are doing more useful things.
561 |
Please don't close/minimize the other window 🤖
562 |
563 |
564 |
565 |
No ads. No tracking. Just open source love.
566 | I built this for free for everyone to enjoy, but it needs constant updates to make sure it works whenever Instagram changes something.
567 |
❤️ Consider supporting my work
568 |
569 |
570 |
571 |
572 | ) : (
573 |
574 |
575 |
576 |
577 |
583 |
584 |
585 | {isLoggedIn ? (
586 |
587 |
Your bot is logged in and ready to go!
588 |
Log out
589 |
590 | ) : (
591 |
592 | setUsername(e.target.value)}
596 | label="Instagram username"
597 | autoCapitalize="off"
598 | autoCorrect="off"
599 | spellCheck={false}
600 | />
601 |
602 | setPassword(e.target.value)}
606 | type="password"
607 | label="Password"
608 | description="We do not store your password"
609 | />
610 |
611 | )}
612 |
613 |
614 |
615 |
618 |
619 |
620 | setSkipPrivate(!e.target.checked)}
624 | />
625 |
626 |
627 |
628 | 0}
631 | onChange={e => setAdvancedSetting('maxLikesPerUser', e.target.checked ? 2 : 0)}
632 | />
633 |
634 |
635 |
636 |
637 |
638 | When you press the Start button the bot will start immediately, then repeat every day at {advancedSettings.runAtHour}:00 until the app is stopped.
639 | To avoid temporary blocks, please run the bot on the same internet/WiFi as you normally use your Instagram app. Do not use a VPN.
640 |
641 |
642 | )}
643 |
644 |
645 | {running ? (
646 | Stop bot
647 | ) : (
648 | <>
649 |
650 | Start bot
651 |
652 |
653 |
654 | Unfollow only
655 |
656 |
657 | Unfollow non-mutual
658 |
659 |
660 | Unfollow unknown
661 |
662 |
663 | setUnfollowUserListDialogShown(true)}>Unfollow list...
664 |
665 |
666 | setFollowUserListDialogShown(true)}>Follow list...
667 |
668 | {isDev && (
669 | onRunTestCode()}>Run test code
670 | )}
671 | >
672 | )}
673 |
674 |
675 |
676 | setAdvancedVisible(true)}>Show advanced settings
677 | {logs.length > 0 && setLogsVisible(true)}>Logs }
678 | Troubleshooting
679 |
680 |
681 | {instautoData && !running &&
}
682 |
683 |
684 | electron.shell.openExternal('https://mifi.no/')}>More apps by mifi.no
685 |
692 |
693 |
694 |
695 |
696 | setAdvancedVisible(false)}>
697 |
698 |
Advanced settings
699 |
700 |
setAdvancedVisible(false)} />
701 |
702 |
703 |
704 | setLogsVisible(false)}>
705 |
706 |
Logs from last run
707 |
708 |
709 |
710 |
711 |
712 | setUnfollowUserListDialogShown(false)} onConfirm={onUnfollowUserList} />
713 | setFollowUserListDialogShown(false)} onConfirm={onFollowUserList} />
714 | >
715 | );
716 | });
717 |
718 | export default App;
719 |
--------------------------------------------------------------------------------
/src/icon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
5 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
6 | sans-serif;
7 | -webkit-font-smoothing: antialiased;
8 | -moz-osx-font-smoothing: grayscale;
9 | }
10 |
11 | code {
12 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
13 | monospace;
14 | }
15 |
16 | h1, h2, h3 {
17 | text-transform: uppercase;
18 | font-weight: 500;
19 | }
--------------------------------------------------------------------------------
/src/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { createRoot } from 'react-dom/client';
3 |
4 | import './index.css';
5 | import App from './App';
6 |
7 | const container = document.getElementById('root');
8 | const root = createRoot(container);
9 | root.render( );
10 |
--------------------------------------------------------------------------------