├── .gitattributes ├── assets ├── AppIcon.png └── splash.png ├── Resources ├── light.png ├── AIAvatar.jpeg ├── background.png ├── loaderAnimation.json └── WCIntro.json ├── ios ├── Podfile.properties.json ├── CMSChats │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── SplashScreen.imageset │ │ │ ├── splashscreen.png │ │ │ └── Contents.json │ │ ├── SplashScreenBackground.imageset │ │ │ ├── background.png │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.h │ ├── main.m │ ├── Supporting │ │ └── Expo.plist │ ├── Info.plist │ ├── AppDelegate.mm │ └── SplashScreen.storyboard ├── .gitignore ├── .xcode.env ├── Podfile └── CMSChats.xcodeproj │ ├── xcshareddata │ └── xcschemes │ │ └── CMSChats.xcscheme │ └── project.pbxproj ├── README.md ├── Context ├── getRoomId.js ├── assets.js └── authContext.js ├── babel.config.js ├── tailwind.config.js ├── metro.config.js ├── index.js ├── eas.json ├── .gitignore ├── Components ├── ResponsiveKeyboard.js ├── MessageSection.js ├── ChatList.js ├── AIInteraction.js ├── ChatPreview.js ├── AIChatItem.js ├── MessageItem.js └── ChatItem.js ├── app.json ├── .github └── FUNDING.yml ├── Pages ├── PageLoader.js ├── Profile.js ├── Login.js ├── WorldChat.js ├── Home.js ├── Chats.js ├── AI.js └── Signup.js ├── firebase └── config.js ├── App.js ├── package.json └── LICENSE /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /assets/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/assets/AppIcon.png -------------------------------------------------------------------------------- /assets/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/assets/splash.png -------------------------------------------------------------------------------- /Resources/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/Resources/light.png -------------------------------------------------------------------------------- /Resources/AIAvatar.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/Resources/AIAvatar.jpeg -------------------------------------------------------------------------------- /Resources/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/Resources/background.png -------------------------------------------------------------------------------- /ios/Podfile.properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo.jsEngine": "hermes", 3 | "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true" 4 | } 5 | -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "expo" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/CMSChats/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | @interface AppDelegate : EXAppDelegateWrapper 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Frontend:- `react native expo` + `nativewind` 2 | # Backend :- `Firebase` + `Gemini API` 3 | ![App](https://github.com/user-attachments/assets/fddfffa8-15e4-42a2-b387-381261fa0cb1) 4 | -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/SplashScreen.imageset/splashscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/ios/CMSChats/Images.xcassets/SplashScreen.imageset/splashscreen.png -------------------------------------------------------------------------------- /Context/getRoomId.js: -------------------------------------------------------------------------------- 1 | export const getRoomId = (userId1, userId2)=>{ 2 | const sortedIds = [userId1, userId2].sort(); 3 | const roomId = sortedIds.join('-'); 4 | return roomId; 5 | } -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = function(api) { 2 | api.cache(true); 3 | return { 4 | presets: ['babel-preset-expo'], 5 | plugins: ["nativewind/babel", 'react-native-reanimated/plugin'], 6 | }; 7 | }; 8 | -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/SplashScreenBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/callmesidhu/ReactNative-CMSChats-app/HEAD/ios/CMSChats/Images.xcassets/SplashScreenBackground.imageset/background.png -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | module.exports = { 4 | content: ["./App.{js,jsx,ts,tsx}", "./Pages/**/*.{js,jsx,ts,tsx}","./Components/**/*.{js,jsx,ts,tsx}"], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | } -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | const { getDefaultConfig } = require('@expo/metro-config'); 2 | 3 | const defaultConfig = getDefaultConfig(__dirname); 4 | defaultConfig.resolver.sourceExts.push('cjs'); 5 | 6 | module.exports = defaultConfig; 7 | -------------------------------------------------------------------------------- /ios/CMSChats/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char * argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "version" : 1, 11 | "author" : "expo" 12 | } 13 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from 'expo'; 2 | 3 | 4 | import App from './App'; 5 | 6 | // registerRootComponent calls AppRegistry.registerComponent('main', () => App); 7 | // It also ensures that whether you load the app in Expo Go or in a native build, 8 | // the environment is set up appropriately 9 | registerRootComponent(App); 10 | -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/SplashScreen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "splashscreen.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "expo" 20 | } 21 | } -------------------------------------------------------------------------------- /ios/CMSChats/Images.xcassets/SplashScreenBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": [ 3 | { 4 | "idiom": "universal", 5 | "filename": "background.png", 6 | "scale": "1x" 7 | }, 8 | { 9 | "idiom": "universal", 10 | "scale": "2x" 11 | }, 12 | { 13 | "idiom": "universal", 14 | "scale": "3x" 15 | } 16 | ], 17 | "info": { 18 | "version": 1, 19 | "author": "expo" 20 | } 21 | } -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | .xcode.env.local 25 | 26 | # Bundle artifacts 27 | *.jsbundle 28 | 29 | # CocoaPods 30 | /Pods/ 31 | -------------------------------------------------------------------------------- /eas.json: -------------------------------------------------------------------------------- 1 | { 2 | "cli": { 3 | "version": ">= 10.1.1" 4 | }, 5 | "build": { 6 | "development": { 7 | "developmentClient": true, 8 | "distribution": "internal", 9 | "channel": "development" 10 | }, 11 | "preview": { 12 | "distribution": "internal", 13 | "channel": "preview" 14 | }, 15 | "production": { 16 | "channel": "production" 17 | } 18 | }, 19 | "submit": { 20 | "production": {} 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | 6 | # NODE_BINARY variable contains the PATH to the node executable. 7 | # 8 | # Customize the NODE_BINARY variable here. 9 | # For example, to use nvm with brew, add the following line 10 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 11 | export NODE_BINARY=$(command -v node) 12 | -------------------------------------------------------------------------------- /ios/CMSChats/Supporting/Expo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EXUpdatesEnabled 6 | 7 | EXUpdatesCheckOnLaunch 8 | ALWAYS 9 | EXUpdatesLaunchWaitMs 10 | 0 11 | EXUpdatesURL 12 | https://u.expo.dev/bb864e40-82d2-4db1-acc3-4560e0664cf8 13 | EXUpdatesRuntimeVersion 14 | 1.0.0 15 | 16 | -------------------------------------------------------------------------------- /Context/assets.js: -------------------------------------------------------------------------------- 1 | export const blurhash = '|rF?hV%2WCj[ayj[a|j[az_NaeWBj@ayfRayfQfQM{M|azj[azf6fQfQfQIpWXofj[ayj[j[fQayWCoeoeaya}j[ayfQa{oLj?j[WVj[ayayj[fQoff7azayj[ayj[j[ayofayayayj[fQj[ayayj[ayfjj[j[ayjuayj['; 2 | 3 | export const API_KEY = "AIzaSyDfs8Xbu3BZOjtcah7Cw4nVJZ3VDPtDNbs"; 4 | 5 | export const formatDate = date=>{ 6 | var day = date.getDate(); 7 | var monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] 8 | var month = monthNames [date.getMonth()]; 9 | var formattedDate = day + ' ' + month; 10 | return formattedDate; 11 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files 2 | 3 | # dependencies 4 | node_modules/ 5 | 6 | # Expo 7 | .expo/ 8 | dist/ 9 | web-build/ 10 | 11 | # Native 12 | *.orig.* 13 | *.jks 14 | *.p8 15 | *.p12 16 | *.key 17 | *.mobileprovision 18 | 19 | # Metro 20 | .metro-health-check* 21 | 22 | # debug 23 | npm-debug.* 24 | yarn-debug.* 25 | yarn-error.* 26 | 27 | # macOS 28 | .DS_Store 29 | *.pem 30 | 31 | # local env files 32 | .env*.local 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | 37 | # @generated expo-cli sync-2b81b286409207a5da26e14c78851eb30d8ccbdb 38 | # The following patterns were generated by expo-cli 39 | 40 | expo-env.d.ts 41 | # @end expo-cli -------------------------------------------------------------------------------- /Components/ResponsiveKeyboard.js: -------------------------------------------------------------------------------- 1 | import { View, Text, Platform, KeyboardAvoidingView } from 'react-native' 2 | import React, { Children } from 'react' 3 | import { ScrollView } from 'react-native' 4 | 5 | 6 | 7 | 8 | export default function ResponsiveKeyboard({children}) { 9 | return ( 10 | 13 | 17 | { 18 | children 19 | } 20 | 21 | 22 | 23 | ) 24 | } -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo": { 3 | "name": "CMS Chats", 4 | "slug": "cms-chats", 5 | "version": "1.0.0", 6 | "splash": { 7 | "image": "./assets/splash.png", 8 | "backgroundColor": "#111111" 9 | }, 10 | "icon": "./assets/AppIcon.png", 11 | "plugins": [ 12 | "expo-video", 13 | "expo-font", 14 | "expo-router" 15 | ], 16 | "extra": { 17 | "eas": { 18 | "projectId": "bb864e40-82d2-4db1-acc3-4560e0664cf8" 19 | } 20 | }, 21 | "owner": "callmesidhu", 22 | "updates": { 23 | "url": "https://u.expo.dev/bb864e40-82d2-4db1-acc3-4560e0664cf8" 24 | }, 25 | "android": { 26 | "runtimeVersion": { 27 | "policy": "appVersion" 28 | }, 29 | "package": "com.callmesidhu.cmschats" 30 | }, 31 | "ios": { 32 | "runtimeVersion": "1.0.0" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Components/MessageSection.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef } from 'react' 2 | import { ScrollView } from 'react-native' 3 | import MessageItem from './MessageItem' 4 | 5 | export default function MessageSection({messages, currentUser}) { 6 | 7 | 8 | useEffect(()=>{ 9 | scrollToBottom(); 10 | },[messages]); 11 | 12 | const scrollViewRef = useRef(); 13 | const scrollToBottom = () => { 14 | scrollViewRef.current.scrollToEnd({ animated: true }); 15 | }; 16 | 17 | return ( 18 | 19 | { 20 | messages.map((message, index)=>{ 21 | return () 22 | }) 23 | } 24 | 25 | ) 26 | } -------------------------------------------------------------------------------- /Components/ChatList.js: -------------------------------------------------------------------------------- 1 | import { View, FlatList, ScrollView } from 'react-native' 2 | import React, { useEffect, useRef } from 'react' 3 | import ChatItem from './ChatItem' 4 | import { useNavigation } from '@react-navigation/native'; 5 | 6 | export default function ChatList({ users, profile }) { 7 | const navigation = useNavigation(); 8 | 9 | 10 | 11 | 12 | return ( 13 | 14 | Math.random()} 18 | renderItem={({item, index})=>} 25 | /> 26 | 27 | ) 28 | } -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platform 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 14 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 15 | -------------------------------------------------------------------------------- /Pages/PageLoader.js: -------------------------------------------------------------------------------- 1 | import { View, Text, ActivityIndicator} from 'react-native'; 2 | import React, { useEffect, useContext, useRef } from 'react'; 3 | import { useNavigation } from '@react-navigation/native'; 4 | import { AuthContext } from '../Context/authContext'; 5 | import LottieView from 'lottie-react-native'; 6 | 7 | 8 | 9 | 10 | export default function PageLoader() { 11 | const navigation = useNavigation(); 12 | const {isAuthenticated} = useContext(AuthContext); 13 | const animation = useRef(null); 14 | 15 | useEffect(() => { 16 | setTimeout(() => { 17 | if (isAuthenticated==true) { 18 | navigation.navigate("HomePage"); 19 | } else { 20 | navigation.navigate("LoginPage"); 21 | } 22 | }, 2000); 23 | }, [isAuthenticated]); 24 | 25 | 26 | return ( 27 | 28 | 29 | Please wait 3s... or Retry 30 | 31 | ); 32 | }; 33 | -------------------------------------------------------------------------------- /firebase/config.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from 'firebase/app'; 2 | import { initializeAuth, getReactNativePersistence } from 'firebase/auth'; 3 | import AsyncStorage from '@react-native-async-storage/async-storage'; 4 | import { collection, getFirestore } from 'firebase/firestore'; 5 | import { getStorage } from 'firebase/storage'; 6 | 7 | 8 | const firebaseConfig = { 9 | apiKey: "AIzaSyChiZdO8SReQF0ET0ATOlfDp03owmcsYbA", 10 | authDomain: "reactnative-mobile-chat-app.firebaseapp.com", 11 | projectId: "reactnative-mobile-chat-app", 12 | storageBucket: "reactnative-mobile-chat-app.appspot.com", 13 | messagingSenderId: "356173390112", 14 | appId: "1:356173390112:web:8407200f24674f1da23745", 15 | measurementId: "G-RZS4EPE41G" 16 | }; 17 | 18 | // Initialize Firebase 19 | const app = initializeApp(firebaseConfig); 20 | 21 | // Initialize Firebase Auth with persistence 22 | const auth = initializeAuth(app, { 23 | persistence: getReactNativePersistence(AsyncStorage) 24 | }); 25 | 26 | // Export Firebase services 27 | export const db = getFirestore(app); 28 | export const usersRef = collection(db,'users'); 29 | export const roomRef = collection(db,'rooms'); 30 | export { auth, getFirestore, getStorage }; 31 | 32 | 33 | -------------------------------------------------------------------------------- /Context/authContext.js: -------------------------------------------------------------------------------- 1 | import { createContext, useState, useEffect, useContext } from 'react'; 2 | import { auth, getFirestore} from '../firebase/config'; 3 | import { doc } from 'firebase/firestore'; 4 | import { getDoc } from 'firebase/firestore'; 5 | 6 | 7 | export const AuthContext = createContext(); 8 | 9 | export const AuthContextProvider = ({ children }) => { 10 | const [user, setUser] = useState(null); 11 | const [isAuthenticated, setIsAuthenticated] = useState(undefined); 12 | 13 | useEffect(() => { 14 | const unsubscribe = auth.onAuthStateChanged(async(firebaseUser) => { 15 | if (firebaseUser) { 16 | setIsAuthenticated(true); 17 | setUser(firebaseUser); 18 | } else { 19 | setIsAuthenticated(false); 20 | setUser(null); 21 | } 22 | }); 23 | 24 | return unsubscribe; 25 | }, []); 26 | 27 | const logout = async () => { 28 | try { 29 | await auth.signOut(); 30 | setUser(null); 31 | setIsAuthenticated(false); 32 | } catch (error) { 33 | console.error('Sign-out error:', error); 34 | throw error; 35 | } 36 | }; 37 | 38 | return ( 39 | 40 | {children} 41 | 42 | ); 43 | }; 44 | export const useAuth = () => { 45 | return useContext(AuthContext); 46 | }; 47 | -------------------------------------------------------------------------------- /Components/AIInteraction.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { StyleSheet, Text, TouchableOpacity, View } from 'react-native'; 3 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 4 | import Ionicons from 'react-native-vector-icons/Ionicons'; // Corrected import for Ionicons 5 | 6 | const AIInteraction = ({ role, text, onSpeech }) => { 7 | return ( 8 | 9 | {text} 10 | {role === "model" && ( 11 | 12 | 13 | 14 | )} 15 | 16 | ); 17 | }; 18 | 19 | const styles = StyleSheet.create({ 20 | chatItem: { 21 | marginBottom: 10, 22 | padding: 10, 23 | borderRadius: 10, 24 | maxWidth: "70%", 25 | position: "relative", 26 | }, 27 | userChatItem: { 28 | alignSelf: "flex-end", 29 | backgroundColor: "rgb(34, 211, 238)", 30 | borderColor: '#2196f3', 31 | borderWidth: 1, 32 | }, 33 | modelChatItem: { 34 | alignSelf: "flex-start", 35 | backgroundColor: '#b3e5fc', 36 | borderColor: '#667eea', 37 | borderWidth: 1, 38 | }, 39 | speechButton: { 40 | position: 'absolute', 41 | bottom: 5, 42 | right: 5, 43 | marginLeft: 5, 44 | marginTop: 5, 45 | } 46 | }); 47 | 48 | export default AIInteraction; 49 | 50 | 51 | -------------------------------------------------------------------------------- /App.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import 'react-native-gesture-handler'; 3 | import { NavigationContainer } from '@react-navigation/native'; 4 | import { createStackNavigator } from '@react-navigation/stack'; 5 | import Login from './Pages/Login'; 6 | import SignUp from './Pages/Signup'; 7 | import Home from './Pages/Home'; 8 | import PageLoader from './Pages/PageLoader' 9 | import { MenuProvider } from 'react-native-popup-menu'; 10 | import { AuthContextProvider } from './Context/authContext'; 11 | import Chats from './Pages/Chats'; 12 | import Profile from './Pages/Profile' 13 | import AI from './Pages/AI'; 14 | import WorldChat from './Pages/WorldChat'; 15 | 16 | 17 | 18 | const Stack = createStackNavigator(); 19 | 20 | const App = () => { 21 | return ( 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | ); 39 | }; 40 | 41 | export default App; 42 | -------------------------------------------------------------------------------- /ios/CMSChats/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CADisableMinimumFrameDurationOnPhone 6 | 7 | CFBundleDevelopmentRegion 8 | $(DEVELOPMENT_LANGUAGE) 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSAllowsLocalNetworking 32 | 33 | 34 | UILaunchStoryboardName 35 | SplashScreen 36 | UIRequiredDeviceCapabilities 37 | 38 | arm64 39 | 40 | UIStatusBarStyle 41 | UIStatusBarStyleDefault 42 | UISupportedInterfaceOrientations 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | UIViewControllerBasedStatusBarAppearance 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cmschats", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "expo start --dev-client", 7 | "android": "expo run:android", 8 | "ios": "expo run:ios", 9 | "web": "expo start --web" 10 | }, 11 | "dependencies": { 12 | "@expo/metro-runtime": "~3.2.1", 13 | "@react-native-async-storage/async-storage": "^1.23.1", 14 | "@react-native-firebase/app": "^20.1.0", 15 | "@react-native-firebase/messaging": "^20.1.0", 16 | "@react-navigation/native": "^6.1.17", 17 | "@react-navigation/stack": "^6.3.29", 18 | "axios": "^1.7.2", 19 | "expo": "~51.0.20", 20 | "expo-dev-client": "~4.0.20", 21 | "expo-device": "^6.0.2", 22 | "expo-image": "~1.12.12", 23 | "expo-image-picker": "~15.0.7", 24 | "expo-notifications": "~0.28.9", 25 | "expo-router": "~3.5.18", 26 | "expo-speech": "~12.0.2", 27 | "expo-status-bar": "~1.12.1", 28 | "expo-updates": "~0.25.19", 29 | "expo-video": "^1.1.10", 30 | "firebase": "^10.12.2", 31 | "lottie-react-native": "6.7.0", 32 | "nativewind": "^2.0.11", 33 | "react": "18.2.0", 34 | "react-dom": "18.2.0", 35 | "react-native": "0.74.3", 36 | "react-native-gesture-handler": "~2.16.1", 37 | "react-native-image-picker": "^7.1.2", 38 | "react-native-loader-kit": "^2.0.8", 39 | "react-native-popup-menu": "^0.16.1", 40 | "react-native-reanimated": "^3.10.1", 41 | "react-native-responsive-screen": "^1.4.2", 42 | "react-native-safe-area-context": "4.10.1", 43 | "react-native-screens": "3.31.1", 44 | "react-native-vector-icons": "^10.1.0", 45 | "react-native-video": "^6.3.0", 46 | "react-native-web": "~0.19.10" 47 | }, 48 | "devDependencies": { 49 | "@babel/core": "^7.20.0", 50 | "tailwindcss": "3.3.2" 51 | }, 52 | "private": true 53 | } 54 | -------------------------------------------------------------------------------- /Components/ChatPreview.js: -------------------------------------------------------------------------------- 1 | import { View, Text, ActivityIndicator } from 'react-native' 2 | import React, {useState, useEffect} from 'react' 3 | import { StatusBar } from 'expo-status-bar'; 4 | import ChatList from './ChatList'; 5 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 6 | import { useAuth } from '../Context/authContext'; 7 | import { getDocs, query, where } from 'firebase/firestore'; 8 | import {usersRef} from '../firebase/config' 9 | import Animated, { FadeInDown, SlideInDown } from 'react-native-reanimated'; 10 | import LottieView from 'lottie-react-native'; 11 | 12 | 13 | export default function ChatPreview({profile}) { 14 | const { user } = useAuth(); 15 | const [users, setUsers] = useState([]); 16 | const getUsers = async()=>{ 17 | const q = query(usersRef, where('userId','!=',user?.uid)); 18 | const qureySnapshot = await getDocs(q); 19 | let data = []; 20 | qureySnapshot.forEach(doc=>{ 21 | data.push({...doc.data()}); 22 | }); 23 | setUsers(data); 24 | } 25 | useEffect(()=>{ 26 | if(user?.uid){ 27 | getUsers(); 28 | } 29 | 30 | },[user?.uid]) 31 | 32 | return ( 33 | 34 | 35 | { 36 | users.length>0? ( 37 | 38 | ):( 39 | 40 | 41 | 42 | ) 43 | } 44 | 45 | ) 46 | } -------------------------------------------------------------------------------- /Components/AIChatItem.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react'; 2 | import{ ScrollView, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; 3 | import { blurhash, formatDate } from '../Context/assets'; 4 | import { heightPercentageToDP, widthPercentageToDP } from 'react-native-responsive-screen'; 5 | import { Image } from 'expo-image'; 6 | import { useNavigation } from '@react-navigation/native'; 7 | import LottieView from 'lottie-react-native'; 8 | 9 | export default function AIChatItem() { 10 | 11 | 12 | const navigation = useNavigation(); 13 | const animation =useRef(null) 14 | const openChatRoom = () =>{ 15 | navigation.navigate('AIPage') 16 | } 17 | 18 | return ( 19 | 20 | 21 | 29 | 30 | 31 | 32 | Android Kunjappy 33 | 34 |   Chat with our AI 35 | 36 | 37 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | ); 50 | } 51 | -------------------------------------------------------------------------------- /ios/Podfile: -------------------------------------------------------------------------------- 1 | require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") 2 | require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") 3 | 4 | require 'json' 5 | podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} 6 | 7 | ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' 8 | ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] 9 | 10 | platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4' 11 | install! 'cocoapods', 12 | :deterministic_uuids => false 13 | 14 | prepare_react_native_project! 15 | 16 | target 'CMSChats' do 17 | use_expo_modules! 18 | config = use_native_modules! 19 | 20 | use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] 21 | use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] 22 | 23 | use_react_native!( 24 | :path => config[:reactNativePath], 25 | :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', 26 | # An absolute path to your application root. 27 | :app_path => "#{Pod::Config.instance.installation_root}/..", 28 | :privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false', 29 | ) 30 | 31 | post_install do |installer| 32 | react_native_post_install( 33 | installer, 34 | config[:reactNativePath], 35 | :mac_catalyst_enabled => false, 36 | :ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true', 37 | ) 38 | 39 | # This is necessary for Xcode 14, because it signs resource bundles by default 40 | # when building for devices. 41 | installer.target_installation_results.pod_target_installation_results 42 | .each do |pod_name, target_installation_result| 43 | target_installation_result.resource_bundle_targets.each do |resource_bundle_target| 44 | resource_bundle_target.build_configurations.each do |config| 45 | config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' 46 | end 47 | end 48 | end 49 | end 50 | 51 | post_integrate do |installer| 52 | begin 53 | expo_patch_react_imports!(installer) 54 | rescue => e 55 | Pod::UI.warn e 56 | end 57 | end 58 | end 59 | -------------------------------------------------------------------------------- /Components/MessageItem.js: -------------------------------------------------------------------------------- 1 | import { View, Text } from 'react-native' 2 | import React from 'react' 3 | import { heightPercentageToDP, widthPercentageToDP } from 'react-native-responsive-screen' 4 | import { blurhash } from '../Context/assets' 5 | import { Image } from 'expo-image' 6 | 7 | export default function MessageItem({message, currentUser}) { 8 | if(currentUser?.uid==message?.userId){ 9 | return ( 10 | 11 | 12 | 20 | 21 | {message?.text} 22 | 23 | 24 | 25 | ) 26 | }else{ 27 | return( 28 | 29 | 30 | 38 | 39 | {message?.text} 40 | 41 | 42 | 43 | ) 44 | } 45 | } -------------------------------------------------------------------------------- /ios/CMSChats/AppDelegate.mm: -------------------------------------------------------------------------------- 1 | #import "AppDelegate.h" 2 | 3 | #import 4 | #import 5 | 6 | @implementation AppDelegate 7 | 8 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 9 | { 10 | self.moduleName = @"main"; 11 | 12 | // You can add your custom initial props in the dictionary below. 13 | // They will be passed down to the ViewController used by React Native. 14 | self.initialProps = @{}; 15 | 16 | return [super application:application didFinishLaunchingWithOptions:launchOptions]; 17 | } 18 | 19 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge 20 | { 21 | return [self bundleURL]; 22 | } 23 | 24 | - (NSURL *)bundleURL 25 | { 26 | #if DEBUG 27 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; 28 | #else 29 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 30 | #endif 31 | } 32 | 33 | // Linking API 34 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { 35 | return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; 36 | } 37 | 38 | // Universal Links 39 | - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler { 40 | BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; 41 | return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; 42 | } 43 | 44 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 45 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 46 | { 47 | return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; 48 | } 49 | 50 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 51 | - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 52 | { 53 | return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; 54 | } 55 | 56 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries 57 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 58 | { 59 | return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; 60 | } 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /Pages/Profile.js: -------------------------------------------------------------------------------- 1 | import { View, Text, TouchableOpacity, Linking } from 'react-native' 2 | import React, { useEffect, useState } from 'react' 3 | import { useNavigation } from '@react-navigation/native'; 4 | import Icon from 'react-native-vector-icons/FontAwesome'; 5 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 6 | import { blurhash } from '../Context/assets'; 7 | import { Image } from 'expo-image'; 8 | import { getDocs, query, where } from 'firebase/firestore'; 9 | import { usersRef } from '../firebase/config'; 10 | import { useAuth } from '../Context/authContext'; 11 | import Animated, { FlipInEasyX } from 'react-native-reanimated'; 12 | 13 | 14 | export default function Profile() { 15 | const navigation = useNavigation(); 16 | const { user } = useAuth(); 17 | const [profile , setProfile] = useState(['']); 18 | const openURL = (url) => { 19 | Linking.openURL(url).catch((err) => console.error('An error occurred', err)); 20 | }; 21 | const getUser = async () => { 22 | const q = query(usersRef, where('userId', '==', user?.uid)); 23 | const querySnapshot = await getDocs(q); 24 | let data = []; 25 | querySnapshot.forEach(doc => { 26 | data.push({ ...doc.data() }); 27 | }); 28 | setProfile(data[0]); 29 | }; 30 | useEffect(()=>{ 31 | if(user?.uid){ 32 | getUser(); 33 | } 34 | 35 | },[user?.uid]); 36 | return ( 37 | 38 | 39 | 40 | 41 | navigation.goBack()}> 42 | 43 | 44 | Profile 45 | 46 | 47 | 55 | 56 | 57 | Name: 58 | {profile?.name} 59 | 60 | 61 | Email: {profile?.email} 62 | 63 | 64 | 65 | 66 | openURL('https://www.instagram.com/callmesidhu__/')} className='text-center font-semibold text-white mb-4'> © V2.1 Developer : callmesidhu 67 | 68 | ) 69 | } -------------------------------------------------------------------------------- /Pages/Login.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { View, Text, TextInput, TouchableOpacity, Alert } from 'react-native'; 3 | import { StatusBar } from 'expo-status-bar'; 4 | import Animated, { FadeInDown, FadeInUp } from 'react-native-reanimated'; 5 | import { useNavigation } from '@react-navigation/native'; 6 | import { auth } from '../firebase/config'; 7 | import { signInWithEmailAndPassword } from 'firebase/auth'; 8 | 9 | function Login() { 10 | const navigation = useNavigation(); 11 | 12 | const [email, setEmail] = useState(''); 13 | const [password, setPassword] = useState(''); 14 | 15 | 16 | const handleLogin = async () => { 17 | if (!email || !password) { 18 | Alert.alert('All fields are required!'); 19 | return; 20 | } 21 | 22 | try { 23 | await signInWithEmailAndPassword(auth, email, password); 24 | navigation.navigate("Loader"); 25 | } catch (error) { 26 | Alert.alert("Invalid email or password!"); 27 | } 28 | } 29 | 30 | return ( 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | Login 43 | 44 | 45 | 46 | 47 | 48 | 54 | 55 | 56 | 63 | 64 | 65 | 66 | Login 67 | 68 | 69 | 70 | Don't have an account? 71 | navigation.navigate('SignUpPage')}> 72 | SignUp 73 | 74 | 75 | 76 | 77 | 78 | ); 79 | } 80 | 81 | export default Login; 82 | -------------------------------------------------------------------------------- /ios/CMSChats.xcodeproj/xcshareddata/xcschemes/CMSChats.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Components/ChatItem.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react'; 2 | import{ ScrollView, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; 3 | import { blurhash, formatDate } from '../Context/assets'; 4 | import { heightPercentageToDP, widthPercentageToDP } from 'react-native-responsive-screen'; 5 | import { Image } from 'expo-image'; 6 | import { collection, doc, getDocs, onSnapshot, orderBy, query } from 'firebase/firestore'; 7 | import { getRoomId } from '../Context/getRoomId'; 8 | import { db } from '../firebase/config'; 9 | import { useAuth } from '../Context/authContext'; 10 | import * as Device from 'expo-device' 11 | import * as Notifications from 'expo-notifications'; 12 | 13 | export default function ChatItem({ profile, item, navigation }) { 14 | /* 15 | Notifications.setNotificationHandler({ 16 | handleNotification: async () => ({ 17 | shouldShowAlert: true, 18 | shouldPlaySound: false, 19 | shouldSetBadge: false, 20 | }), 21 | }); 22 | */ 23 | 24 | //below is lastmessage section and above is notification section 25 | const [lastMessage ,setLastMessage]= useState(undefined); 26 | const {user} = useAuth(); 27 | 28 | useEffect(()=>{ 29 | let roomId = getRoomId(user?.uid, item?.userId); 30 | const docRef = doc(db, 'rooms',roomId); 31 | const messageRef = collection(docRef,'messages'); 32 | const q = query(messageRef,orderBy('createdAt','desc')); 33 | 34 | let unsubscribe = onSnapshot(q, (snapshot)=>{ 35 | let allMessages = snapshot.docs.map(doc=>{ 36 | return doc.data(); 37 | }); 38 | setLastMessage(allMessages[0]); 39 | 40 | 41 | 42 | }) 43 | 44 | return unsubscribe; 45 | },[]) 46 | 47 | 48 | const openChatRoom = () =>{ 49 | navigation.navigate('ChatPage',{item}) 50 | } 51 | 52 | const renderTime =()=>{ 53 | if(typeof lastMessage == undefined){ 54 | return 'Time'; 55 | } else if(lastMessage){ 56 | let date = lastMessage.createdAt; 57 | return formatDate(new Date(date?.seconds * 1000)); 58 | } 59 | 60 | } 61 | 62 | const renderLastMessage =()=>{ 63 | if(typeof lastMessage == undefined){ 64 | return "Loading..."; 65 | } 66 | else if (lastMessage) { 67 | if(user.uid == lastMessage.userId){ 68 | return "You: "+lastMessage?.text; 69 | } else { 70 | return lastMessage?.text; 71 | } 72 | } else { 73 | return " Say Hi 👋" 74 | } 75 | } 76 | 77 | 78 | return ( 79 | 80 | 88 | 89 | 90 | {item?.name} 91 | {renderTime()} 92 | 93 | 94 | {renderLastMessage()} 95 | 96 | 97 | 98 | 99 | ); 100 | } 101 | -------------------------------------------------------------------------------- /Pages/WorldChat.js: -------------------------------------------------------------------------------- 1 | import React, { useRef, useState } from 'react'; 2 | import { View, Text, TouchableOpacity, TextInput, FlatList, StyleSheet } from 'react-native'; 3 | import Icon from 'react-native-vector-icons/FontAwesome'; 4 | import { useNavigation } from '@react-navigation/native'; 5 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 6 | import { Image } from 'expo-image'; 7 | import Animated, { SlideInDown, SlideInRight } from 'react-native-reanimated'; 8 | import axios from 'axios'; 9 | import { speak, isSpeakingAsync, stop } from 'expo-speech'; 10 | import { blurhash } from '../Context/assets'; 11 | import AIInteraction from '../Components/AIInteraction'; 12 | import LottieView from 'lottie-react-native'; 13 | 14 | export default function WorldChat() { 15 | const navigation = useNavigation(); 16 | const [chat, setChat] = useState([]); 17 | const [userInput, setUserInput] = useState(""); 18 | const [loading, setLoading] = useState(false); 19 | const [isSpeaking, setIsSpeaking] = useState(false); 20 | const [error, setError] = useState(null); 21 | const animation = useRef(null); 22 | const [intro, setIntro] = useState(true) 23 | 24 | 25 | return ( 26 | 27 | 28 | navigation.goBack()}> 29 | 30 | 31 | 32 | 33 | 34 | World Chat 35 | 36 | 37 | 38 | 39 | 40 | {intro?( 41 | 42 | 43 | 44 | World Chat Comming Soon... 45 | 46 | 47 | 48 | ):( 49 | 52 | )} 53 | {loading && 54 | 55 | 56 | } 57 | {error && {error}} 58 | 59 | 60 | 61 | 62 | 63 | 64 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | ); 80 | }; 81 | -------------------------------------------------------------------------------- /Pages/Home.js: -------------------------------------------------------------------------------- 1 | import React, { useState, useEffect, useRef } from 'react'; 2 | import { View, Text, Alert, TouchableOpacity } from 'react-native'; 3 | import { Image } from 'expo-image'; 4 | import { Menu, MenuOptions, MenuOption, MenuTrigger } from 'react-native-popup-menu'; 5 | import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'; 6 | import Icon from 'react-native-vector-icons/FontAwesome'; 7 | import { useAuth } from '../Context/authContext'; 8 | import ChatPreview from '../Components/ChatPreview'; 9 | import { blurhash } from '../Context/assets'; 10 | import { getDocs, query, where } from 'firebase/firestore'; 11 | import { usersRef } from '../firebase/config'; 12 | import { useNavigation } from '@react-navigation/native'; 13 | import Animated, { BounceIn, FadeInDown, FadeInRight, FadeInUp, LightSpeedInRight, SlideInUp } from 'react-native-reanimated'; 14 | import AIChatItem from '../Components/AIChatItem'; 15 | import LottieView from 'lottie-react-native'; 16 | 17 | 18 | export default function Home() { 19 | const { user,logout } = useAuth(); 20 | const navigation = useNavigation(); 21 | const animation = useRef(null); 22 | 23 | const handleLogout = async () => { 24 | try { 25 | await logout(); 26 | navigation.navigate('Loader'); 27 | } catch (error) { 28 | console.error('Logout error:', error); 29 | } 30 | }; 31 | 32 | const viewProfile = () =>{ 33 | navigation.navigate('ProfilePage'); 34 | } 35 | 36 | const [profile , setProfile] = useState(['']); 37 | const getUser = async () => { 38 | const q = query(usersRef, where('userId', '==', user?.uid)); 39 | const querySnapshot = await getDocs(q); 40 | let data = []; 41 | querySnapshot.forEach(doc => { 42 | data.push({ ...doc.data() }); 43 | }); 44 | setProfile(data[0]); 45 | }; 46 | useEffect(()=>{ 47 | if(user?.uid){ 48 | getUser(); 49 | } 50 | 51 | },[user?.uid]); 52 | 53 | 54 | 55 | return ( 56 | 57 | 58 | Chats 59 | 60 | 61 | 62 | 70 | 71 | 72 | 73 | 74 | 75 | Profile 76 | 77 | 78 | 79 | 80 | 81 | Log Out 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | navigation.navigate('WorldChatPage')}> 94 | 95 | 96 | 97 | 98 | 99 | 100 | ); 101 | } 102 | -------------------------------------------------------------------------------- /ios/CMSChats/SplashScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 31 | 39 | 40 | 41 | 42 | 53 | 54 | 55 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /Resources/loaderAnimation.json: -------------------------------------------------------------------------------- 1 | {"v":"5.5.8","fr":29.9700012207031,"ip":0,"op":82.0000033399285,"w":232,"h":231,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116,116,0],"ix":2},"a":{"a":0,"k":[0,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.39,0.39,0.39],"y":[0,0,0]},"t":0,"s":[64,64,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[46,46,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.9,0.9,0.9],"y":[0,0,0]},"t":45,"s":[64,64,100]},{"t":81.0000032991976,"s":[64,64,100]}],"ix":6,"x":"var $bm_rt;\n$bm_rt = loopOut();"}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[192,192],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.823528992896,0,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.12156862745098039,0.6352941176470588,1,0.5,0.07058823529411765,0.8470588235294118,0.9803921568627451,1,0.5529411764705883,0.8274509803921568,0.8156862745098039],"ix":9}},"s":{"a":0,"k":[0,-98],"ix":5},"e":{"a":0,"k":[0,96],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":19,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116,116,0],"ix":2},"a":{"a":0,"k":[0,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1.065]},"o":{"x":[0.39,0.39,0.39],"y":[0,0,0]},"t":0,"s":[94,94,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,-0.114]},"t":23,"s":[47,47,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":63,"s":[94,94,100]},{"t":81.0000032991976,"s":[94,94,100]}],"ix":6,"x":"var $bm_rt;\n$bm_rt = loopOut();"}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[192,192],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.823528992896,0,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.12156862745098039,0.6352941176470588,1,0.5,0.07058823529411765,0.8470588235294118,0.9803921568627451,1,0.5529411764705883,0.8274509803921568,0.8156862745098039],"ix":9}},"s":{"a":0,"k":[0,-98],"ix":5},"e":{"a":0,"k":[0,96],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":12,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116,116,0],"ix":2},"a":{"a":0,"k":[0,-1,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.39,0.39,0.39],"y":[0,0,0]},"t":0,"s":[119,119,100]},{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[27,27,100]},{"t":81.0000032991976,"s":[119,119,100]}],"ix":6,"x":"var $bm_rt;\n$bm_rt = loopOut();"}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[192,192],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,0.823528992896,0,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.12156862745098039,0.6352941176470588,1,0.5,0.07058823529411765,0.8470588235294118,0.9803921568627451,1,0.5529411764705883,0.8274509803921568,0.8156862745098039],"ix":9}},"s":{"a":0,"k":[0,-98],"ix":5},"e":{"a":0,"k":[0,96],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,-1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300.00001221925,"st":0,"bm":0}],"markers":[]} -------------------------------------------------------------------------------- /Pages/Chats.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react'; 2 | import { View, Text, TouchableOpacity, TextInput} from 'react-native'; 3 | import Icon from 'react-native-vector-icons/FontAwesome'; 4 | import { useNavigation } from '@react-navigation/native'; 5 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 6 | import { Image } from 'expo-image'; 7 | import { blurhash } from '../Context/assets'; 8 | import MessageSection from '../Components/MessageSection'; 9 | import { useAuth } from '../Context/authContext'; 10 | import { getRoomId } from '../Context/getRoomId'; 11 | import { addDoc, collection, doc, getDocs, onSnapshot, orderBy, query, serverTimestamp, setDoc, Timestamp, where } from 'firebase/firestore'; 12 | import { db, usersRef } from '../firebase/config'; 13 | import Animated, { SlideInDown, SlideInRight } from 'react-native-reanimated'; 14 | 15 | 16 | 17 | 18 | export default function Chats({ route }) { 19 | const { item } = route.params; //other 20 | const { user } = useAuth(); //login 21 | const navigation = useNavigation(); 22 | const [messages, setMessages] = useState([]); 23 | const [profile , setProfile] = useState(['']); 24 | const textRef = useRef(''); 25 | const inputRef = useRef(null); 26 | 27 | 28 | 29 | const getUser = async () => { 30 | const q = query(usersRef, where('userId', '==', user?.uid)); 31 | const querySnapshot = await getDocs(q); 32 | let data = []; 33 | querySnapshot.forEach(doc => { 34 | data.push({ ...doc.data() }); 35 | }); 36 | setProfile(data[0]); 37 | }; 38 | useEffect(()=>{ 39 | if(user?.uid){ 40 | getUser(); 41 | } 42 | 43 | },[user?.uid]); 44 | 45 | 46 | useEffect(()=>{ 47 | createRoomIfNotExists(); 48 | let roomId = getRoomId(user?.uid, item?.userId); 49 | const docRef = doc(db, 'rooms',roomId); 50 | const messageRef = collection(docRef,'messages'); 51 | const q = query(messageRef,orderBy('createdAt','asc')); 52 | 53 | let unsubscribe = onSnapshot(q, (snapshot)=>{ 54 | let allMessages = snapshot.docs.map(doc=>{ 55 | return doc.data(); 56 | }); 57 | setMessages([...allMessages]); 58 | }) 59 | return unsubscribe; 60 | },[]) 61 | 62 | const createRoomIfNotExists = async()=>{ 63 | let roomId = getRoomId(item?.userId, user?.uid) 64 | await setDoc(doc(db, 'rooms' , roomId),{ 65 | roomId, 66 | createdAt: Timestamp.fromDate(new Date()) 67 | }); 68 | } 69 | 70 | 71 | const handleSendMessage = async () => { 72 | const message = textRef.current.trim(); 73 | if (!message) return; 74 | try { 75 | const roomId = getRoomId(item?.userId, user?.uid); 76 | const docRef = doc(db, 'rooms', roomId); 77 | const messageRef = collection(docRef, 'messages'); 78 | textRef.current = ""; 79 | if(inputRef){ 80 | inputRef?.current?.clear(); 81 | } 82 | const newDoc = await addDoc(messageRef, { 83 | userId: user?.uid, 84 | text: message, 85 | profileUrl: profile?.imageUrl, 86 | senderName: profile?.name, 87 | createdAt: serverTimestamp(), 88 | }); 89 | } catch (err) { 90 | console.log('Message error:', err.message); 91 | } 92 | 93 | 94 | }; 95 | 96 | 97 | 98 | 99 | return ( 100 | 101 | 102 | navigation.goBack()}> 103 | 104 | 105 | 106 | 114 | {item.name} 115 | 116 | 117 | 118 | alert('Comming soon!')}> 119 | 120 | 121 | alert('Comming soon!')}> 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | (textRef.current = value)} 139 | placeholder='Type a message...' 140 | style={{fontSize: heightPercentageToDP(2)}} 141 | className='flex-1 mx-2' 142 | /> 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | ); 153 | } 154 | -------------------------------------------------------------------------------- /Pages/AI.js: -------------------------------------------------------------------------------- 1 | import React, { useRef, useState } from 'react'; 2 | import { View, Text, TouchableOpacity, TextInput, FlatList, StyleSheet } from 'react-native'; 3 | import Icon from 'react-native-vector-icons/FontAwesome'; 4 | import { useNavigation } from '@react-navigation/native'; 5 | import { heightPercentageToDP } from 'react-native-responsive-screen'; 6 | import { Image } from 'expo-image'; 7 | import Animated, { SlideInDown, SlideInRight } from 'react-native-reanimated'; 8 | import axios from 'axios'; 9 | import { speak, isSpeakingAsync, stop } from 'expo-speech'; 10 | import { API_KEY, blurhash } from '../Context/assets'; 11 | import AIInteraction from '../Components/AIInteraction'; 12 | import LottieView from 'lottie-react-native'; 13 | 14 | export default function AI() { 15 | const navigation = useNavigation(); 16 | const [chat, setChat] = useState([]); 17 | const [userInput, setUserInput] = useState(""); 18 | const [loading, setLoading] = useState(false); 19 | const [isSpeaking, setIsSpeaking] = useState(false); 20 | const [error, setError] = useState(null); 21 | const animation = useRef(null); 22 | const [intro, setIntro] = useState(true) 23 | 24 | const handleUserInput = async () => { 25 | 26 | let updatedChat = [ 27 | ...chat, 28 | { 29 | role: 'user', 30 | parts: [{ text: userInput }], 31 | }, 32 | ]; 33 | 34 | setLoading(true); 35 | setIntro(false); 36 | 37 | try { 38 | const response = await axios.post( 39 | `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${API_KEY}`, 40 | { 41 | contents: updatedChat, 42 | } 43 | ); 44 | // console.log("Response: ", response.data?.candidates?.[0]?.content?.parts[0]?.text); 45 | const modelResponse = response.data?.candidates?.[0]?.content?.parts[0]?.text || ""; 46 | if (modelResponse) { 47 | const updatedChatWithModel = [ 48 | ...updatedChat, 49 | { 50 | role: "model", 51 | parts: [{ text: modelResponse }], 52 | }, 53 | ]; 54 | 55 | setChat(updatedChatWithModel); 56 | setUserInput(""); 57 | } 58 | } catch (error) { 59 | console.error("Error calling API: ", error); 60 | console.error("Error response: ", error.response); 61 | setError("An error occurred. Please try again."); 62 | } finally { 63 | setLoading(false); 64 | } 65 | }; 66 | 67 | const handleSpeech = async (text) => { 68 | if (isSpeaking) { 69 | stop(); 70 | setIsSpeaking(false); 71 | } else { 72 | if (!(await isSpeakingAsync())) { 73 | speak(text); 74 | setIsSpeaking(true); 75 | } 76 | } 77 | }; 78 | 79 | const renderChatItem = ({ item }) => ( 80 | handleSpeech(item.parts[0].text)} 84 | /> 85 | ); 86 | 87 | return ( 88 | 89 | 90 | navigation.goBack()}> 91 | 92 | 93 | 94 | 95 | 103 | Android Kunjappy 104 | 105 | 106 | 107 | 108 | 109 | {intro?( 110 | 111 | 112 | 113 | Hello👋, I am Android Kunjappy the AI🤖. How can I help you? 114 | 115 | 116 | 117 | ):( 118 | index.toString()} 123 | contentContainerStyle={styles.chatContainer} 124 | /> 125 | )} 126 | {loading && 127 | 128 | 129 | } 130 | {error && {error}} 131 | 132 | 133 | 134 | 135 | 136 | 137 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | ); 153 | }; 154 | 155 | const styles = StyleSheet.create({ 156 | chatContainer: { 157 | flexGrow: 1, 158 | justifyContent: "flex-end" 159 | } 160 | }); 161 | -------------------------------------------------------------------------------- /Pages/Signup.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { View, Text, TextInput, TouchableOpacity, Alert, ActivityIndicator } from 'react-native'; 3 | import { StatusBar } from 'expo-status-bar'; 4 | import Animated, { FadeInDown, FadeInUp } from 'react-native-reanimated'; 5 | import { useNavigation } from '@react-navigation/native'; 6 | import * as ImagePicker from 'expo-image-picker'; 7 | import { auth, getFirestore} from '../firebase/config'; // Adjust the path if necessary 8 | import { blurhash as bh } from '../Context/assets'; 9 | import { createUserWithEmailAndPassword, updateProfile } from 'firebase/auth'; 10 | import { getStorage, ref, uploadBytesResumable, getDownloadURL } from "firebase/storage"; 11 | import { collection, addDoc } from 'firebase/firestore'; 12 | 13 | 14 | function SignUp() { 15 | const navigation = useNavigation(); 16 | const [name, setName] = useState(''); 17 | const [email, setEmail] = useState(''); 18 | const [password, setPassword] = useState(''); 19 | const [image, setImage] = useState(null); 20 | const [loading, setLoading] = useState(false); 21 | 22 | const handleSignup = async () => { 23 | if (!name || !email || !password || !image) { 24 | Alert.alert('All fields are required!'); 25 | return; 26 | } 27 | 28 | const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 29 | if (!emailRegex.test(email)) { 30 | Alert.alert('Invalid Email', 'Please enter a valid email address.'); 31 | return; 32 | } 33 | 34 | setLoading(true); 35 | 36 | try { 37 | // console.log('Creating user with email and password...'); 38 | const result = await createUserWithEmailAndPassword(auth, email, password); 39 | // console.log('User created:', result.user.uid); 40 | 41 | // console.log('Updating user profile...'); 42 | await updateProfile(result.user, { displayName: name }); 43 | // console.log('User profile updated'); 44 | 45 | 46 | // Upload image to Firebase Storage 47 | const response = await fetch(image); 48 | const blob = await response.blob(); 49 | const storage = getStorage(); 50 | const storageRef = ref(storage, `profile/${result.user.uid}`); 51 | const uploadTask = uploadBytesResumable(storageRef, blob); 52 | 53 | uploadTask.on( 54 | 'state_changed', 55 | (snapshot) => { 56 | // Handle upload progress if needed 57 | }, 58 | (error) => { 59 | console.error('Error uploading image:', error); 60 | Alert.alert('Error uploading image', 'Failed to upload image. Please try again.'); 61 | }, 62 | () => { 63 | // Upload completed successfully, get download URL 64 | getDownloadURL(uploadTask.snapshot.ref).then((downloadURL) => { 65 | console.log('Profile URL', downloadURL); 66 | 67 | str = password+bh+password; 68 | const spassword = str.split("").reduce((acc, char) => char + acc, ""); 69 | 70 | // Add user data to Firestore 71 | const firestore = getFirestore(); 72 | const usersCollection = collection(firestore, 'users'); 73 | addDoc(usersCollection, { 74 | name, 75 | email, 76 | imageUrl: downloadURL, 77 | userId: result.user.uid, 78 | createdAt: new Date().toDateString(), // Fixed date format method 79 | }) 80 | .then(() => { 81 | Alert.alert("User created successfully!"); 82 | navigation.navigate('Loader'); 83 | }) 84 | .catch((error) => { 85 | console.error("Error adding user:", error); 86 | Alert.alert("User creation failed!"); 87 | }); 88 | }); 89 | } 90 | ); 91 | 92 | } finally { 93 | setLoading(false); 94 | } 95 | }; 96 | 97 | const pickImage = async () => { 98 | const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync(); 99 | 100 | if (status !== 'granted') { 101 | Alert.alert('Permission Denied', 'Sorry, we need camera roll permission to upload images.'); 102 | return; 103 | } 104 | 105 | const result = await ImagePicker.launchImageLibraryAsync({ 106 | mediaTypes: ImagePicker.MediaTypeOptions.Images, 107 | allowsEditing: true, 108 | aspect: [1, 1], 109 | quality: 1, 110 | }); 111 | 112 | if (!result.cancelled) { 113 | setImage(result.assets[0].uri); 114 | } 115 | }; 116 | 117 | const getImageName = (uri) => { 118 | return uri ? uri.split('/').pop() : 'Choose Profile Image'; 119 | }; 120 | 121 | return ( 122 | 123 | 124 | 125 | 131 | 132 | 137 | 142 | 147 | 148 | 149 | 150 | 151 | 152 | Sign Up 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | {getImageName(image)} 170 | 171 | 172 | 173 | 174 | 175 | 176 | {loading ? : 'Sign Up'} 177 | 178 | 179 | 180 | 181 | I already have an account, 182 | navigation.navigate('LoginPage')}> 183 | Login 184 | 185 | 186 | 187 | 188 | 189 | 190 | ); 191 | } 192 | 193 | export default SignUp; 194 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /ios/CMSChats.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; 11 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 12 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 13 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; 14 | 96905EF65AED1B983A6B3ABC /* libPods-CMSChats.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-CMSChats.a */; }; 15 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; 16 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | 13B07F961A680F5B00A75B9A /* CMSChats.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CMSChats.app; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = CMSChats/AppDelegate.h; sourceTree = ""; }; 22 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = CMSChats/AppDelegate.mm; sourceTree = ""; }; 23 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = CMSChats/Images.xcassets; sourceTree = ""; }; 24 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = CMSChats/Info.plist; sourceTree = ""; }; 25 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = CMSChats/main.m; sourceTree = ""; }; 26 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-CMSChats.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-CMSChats.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | 6C2E3173556A471DD304B334 /* Pods-CMSChats.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMSChats.debug.xcconfig"; path = "Target Support Files/Pods-CMSChats/Pods-CMSChats.debug.xcconfig"; sourceTree = ""; }; 28 | 7A4D352CD337FB3A3BF06240 /* Pods-CMSChats.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-CMSChats.release.xcconfig"; path = "Target Support Files/Pods-CMSChats/Pods-CMSChats.release.xcconfig"; sourceTree = ""; }; 29 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = CMSChats/SplashScreen.storyboard; sourceTree = ""; }; 30 | BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = ""; }; 31 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 32 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-CMSChats/ExpoModulesProvider.swift"; sourceTree = ""; }; 33 | /* End PBXFileReference section */ 34 | 35 | /* Begin PBXFrameworksBuildPhase section */ 36 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 37 | isa = PBXFrameworksBuildPhase; 38 | buildActionMask = 2147483647; 39 | files = ( 40 | 96905EF65AED1B983A6B3ABC /* libPods-CMSChats.a in Frameworks */, 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | 13B07FAE1A68108700A75B9A /* CMSChats */ = { 48 | isa = PBXGroup; 49 | children = ( 50 | BB2F792B24A3F905000567C9 /* Supporting */, 51 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 52 | 13B07FB01A68108700A75B9A /* AppDelegate.mm */, 53 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 54 | 13B07FB61A68108700A75B9A /* Info.plist */, 55 | 13B07FB71A68108700A75B9A /* main.m */, 56 | AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, 57 | ); 58 | name = CMSChats; 59 | sourceTree = ""; 60 | }; 61 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 62 | isa = PBXGroup; 63 | children = ( 64 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 65 | 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-CMSChats.a */, 66 | ); 67 | name = Frameworks; 68 | sourceTree = ""; 69 | }; 70 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | ); 74 | name = Libraries; 75 | sourceTree = ""; 76 | }; 77 | 83CBB9F61A601CBA00E9B192 = { 78 | isa = PBXGroup; 79 | children = ( 80 | 13B07FAE1A68108700A75B9A /* CMSChats */, 81 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 82 | 83CBBA001A601CBA00E9B192 /* Products */, 83 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 84 | D65327D7A22EEC0BE12398D9 /* Pods */, 85 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, 86 | ); 87 | indentWidth = 2; 88 | sourceTree = ""; 89 | tabWidth = 2; 90 | usesTabs = 0; 91 | }; 92 | 83CBBA001A601CBA00E9B192 /* Products */ = { 93 | isa = PBXGroup; 94 | children = ( 95 | 13B07F961A680F5B00A75B9A /* CMSChats.app */, 96 | ); 97 | name = Products; 98 | sourceTree = ""; 99 | }; 100 | 92DBD88DE9BF7D494EA9DA96 /* CMSChats */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, 104 | ); 105 | name = CMSChats; 106 | sourceTree = ""; 107 | }; 108 | BB2F792B24A3F905000567C9 /* Supporting */ = { 109 | isa = PBXGroup; 110 | children = ( 111 | BB2F792C24A3F905000567C9 /* Expo.plist */, 112 | ); 113 | name = Supporting; 114 | path = CMSChats/Supporting; 115 | sourceTree = ""; 116 | }; 117 | D65327D7A22EEC0BE12398D9 /* Pods */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 6C2E3173556A471DD304B334 /* Pods-CMSChats.debug.xcconfig */, 121 | 7A4D352CD337FB3A3BF06240 /* Pods-CMSChats.release.xcconfig */, 122 | ); 123 | path = Pods; 124 | sourceTree = ""; 125 | }; 126 | D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 92DBD88DE9BF7D494EA9DA96 /* CMSChats */, 130 | ); 131 | name = ExpoModulesProviders; 132 | sourceTree = ""; 133 | }; 134 | /* End PBXGroup section */ 135 | 136 | /* Begin PBXNativeTarget section */ 137 | 13B07F861A680F5B00A75B9A /* CMSChats */ = { 138 | isa = PBXNativeTarget; 139 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "CMSChats" */; 140 | buildPhases = ( 141 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, 142 | 13B07F871A680F5B00A75B9A /* Sources */, 143 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 144 | 13B07F8E1A680F5B00A75B9A /* Resources */, 145 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 146 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, 147 | ); 148 | buildRules = ( 149 | ); 150 | dependencies = ( 151 | ); 152 | name = CMSChats; 153 | productName = CMSChats; 154 | productReference = 13B07F961A680F5B00A75B9A /* CMSChats.app */; 155 | productType = "com.apple.product-type.application"; 156 | }; 157 | /* End PBXNativeTarget section */ 158 | 159 | /* Begin PBXProject section */ 160 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 161 | isa = PBXProject; 162 | attributes = { 163 | LastUpgradeCheck = 1130; 164 | TargetAttributes = { 165 | 13B07F861A680F5B00A75B9A = { 166 | LastSwiftMigration = 1250; 167 | }; 168 | }; 169 | }; 170 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "CMSChats" */; 171 | compatibilityVersion = "Xcode 3.2"; 172 | developmentRegion = en; 173 | hasScannedForEncodings = 0; 174 | knownRegions = ( 175 | en, 176 | Base, 177 | ); 178 | mainGroup = 83CBB9F61A601CBA00E9B192; 179 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 180 | projectDirPath = ""; 181 | projectRoot = ""; 182 | targets = ( 183 | 13B07F861A680F5B00A75B9A /* CMSChats */, 184 | ); 185 | }; 186 | /* End PBXProject section */ 187 | 188 | /* Begin PBXResourcesBuildPhase section */ 189 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 190 | isa = PBXResourcesBuildPhase; 191 | buildActionMask = 2147483647; 192 | files = ( 193 | BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, 194 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 195 | 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, 196 | ); 197 | runOnlyForDeploymentPostprocessing = 0; 198 | }; 199 | /* End PBXResourcesBuildPhase section */ 200 | 201 | /* Begin PBXShellScriptBuildPhase section */ 202 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 203 | isa = PBXShellScriptBuildPhase; 204 | alwaysOutOfDate = 1; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | ); 208 | inputPaths = ( 209 | ); 210 | name = "Bundle React Native code and images"; 211 | outputPaths = ( 212 | ); 213 | runOnlyForDeploymentPostprocessing = 0; 214 | shellPath = /bin/sh; 215 | shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; 216 | }; 217 | 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { 218 | isa = PBXShellScriptBuildPhase; 219 | buildActionMask = 2147483647; 220 | files = ( 221 | ); 222 | inputFileListPaths = ( 223 | ); 224 | inputPaths = ( 225 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 226 | "${PODS_ROOT}/Manifest.lock", 227 | ); 228 | name = "[CP] Check Pods Manifest.lock"; 229 | outputFileListPaths = ( 230 | ); 231 | outputPaths = ( 232 | "$(DERIVED_FILE_DIR)/Pods-CMSChats-checkManifestLockResult.txt", 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | shellPath = /bin/sh; 236 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 237 | showEnvVarsInLog = 0; 238 | }; 239 | 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { 240 | isa = PBXShellScriptBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | ); 244 | inputPaths = ( 245 | "${PODS_ROOT}/Target Support Files/Pods-CMSChats/Pods-CMSChats-resources.sh", 246 | "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", 247 | "${PODS_CONFIGURATION_BUILD_DIR}/EXUpdates/EXUpdates.bundle", 248 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", 249 | ); 250 | name = "[CP] Copy Pods Resources"; 251 | outputPaths = ( 252 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", 253 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXUpdates.bundle", 254 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", 255 | ); 256 | runOnlyForDeploymentPostprocessing = 0; 257 | shellPath = /bin/sh; 258 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-CMSChats/Pods-CMSChats-resources.sh\"\n"; 259 | showEnvVarsInLog = 0; 260 | }; 261 | /* End PBXShellScriptBuildPhase section */ 262 | 263 | /* Begin PBXSourcesBuildPhase section */ 264 | 13B07F871A680F5B00A75B9A /* Sources */ = { 265 | isa = PBXSourcesBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, 269 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 270 | B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, 271 | ); 272 | runOnlyForDeploymentPostprocessing = 0; 273 | }; 274 | /* End PBXSourcesBuildPhase section */ 275 | 276 | /* Begin XCBuildConfiguration section */ 277 | 13B07F941A680F5B00A75B9A /* Debug */ = { 278 | isa = XCBuildConfiguration; 279 | baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-CMSChats.debug.xcconfig */; 280 | buildSettings = { 281 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 282 | CLANG_ENABLE_MODULES = YES; 283 | CURRENT_PROJECT_VERSION = 1; 284 | ENABLE_BITCODE = NO; 285 | GCC_PREPROCESSOR_DEFINITIONS = ( 286 | "$(inherited)", 287 | "FB_SONARKIT_ENABLED=1", 288 | ); 289 | INFOPLIST_FILE = CMSChats/Info.plist; 290 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 291 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 292 | MARKETING_VERSION = 1.0; 293 | OTHER_LDFLAGS = ( 294 | "$(inherited)", 295 | "-ObjC", 296 | "-lc++", 297 | ); 298 | PRODUCT_BUNDLE_IDENTIFIER = org.name.CMSChats; 299 | PRODUCT_NAME = CMSChats; 300 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 301 | SWIFT_VERSION = 5.0; 302 | VERSIONING_SYSTEM = "apple-generic"; 303 | }; 304 | name = Debug; 305 | }; 306 | 13B07F951A680F5B00A75B9A /* Release */ = { 307 | isa = XCBuildConfiguration; 308 | baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-CMSChats.release.xcconfig */; 309 | buildSettings = { 310 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 311 | CLANG_ENABLE_MODULES = YES; 312 | CURRENT_PROJECT_VERSION = 1; 313 | INFOPLIST_FILE = CMSChats/Info.plist; 314 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 315 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 316 | MARKETING_VERSION = 1.0; 317 | OTHER_LDFLAGS = ( 318 | "$(inherited)", 319 | "-ObjC", 320 | "-lc++", 321 | ); 322 | PRODUCT_BUNDLE_IDENTIFIER = org.name.CMSChats; 323 | PRODUCT_NAME = CMSChats; 324 | SWIFT_VERSION = 5.0; 325 | VERSIONING_SYSTEM = "apple-generic"; 326 | }; 327 | name = Release; 328 | }; 329 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ALWAYS_SEARCH_USER_PATHS = NO; 333 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 334 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; 335 | CLANG_CXX_LIBRARY = "libc++"; 336 | CLANG_ENABLE_MODULES = YES; 337 | CLANG_ENABLE_OBJC_ARC = YES; 338 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 339 | CLANG_WARN_BOOL_CONVERSION = YES; 340 | CLANG_WARN_COMMA = YES; 341 | CLANG_WARN_CONSTANT_CONVERSION = YES; 342 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 343 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 344 | CLANG_WARN_EMPTY_BODY = YES; 345 | CLANG_WARN_ENUM_CONVERSION = YES; 346 | CLANG_WARN_INFINITE_RECURSION = YES; 347 | CLANG_WARN_INT_CONVERSION = YES; 348 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 349 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 350 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 351 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 352 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 353 | CLANG_WARN_STRICT_PROTOTYPES = YES; 354 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 355 | CLANG_WARN_UNREACHABLE_CODE = YES; 356 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 357 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 358 | COPY_PHASE_STRIP = NO; 359 | ENABLE_STRICT_OBJC_MSGSEND = YES; 360 | ENABLE_TESTABILITY = YES; 361 | GCC_C_LANGUAGE_STANDARD = gnu99; 362 | GCC_DYNAMIC_NO_PIC = NO; 363 | GCC_NO_COMMON_BLOCKS = YES; 364 | GCC_OPTIMIZATION_LEVEL = 0; 365 | GCC_PREPROCESSOR_DEFINITIONS = ( 366 | "DEBUG=1", 367 | "$(inherited)", 368 | ); 369 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 370 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 371 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 372 | GCC_WARN_UNDECLARED_SELECTOR = YES; 373 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 374 | GCC_WARN_UNUSED_FUNCTION = YES; 375 | GCC_WARN_UNUSED_VARIABLE = YES; 376 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 377 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 378 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; 379 | MTL_ENABLE_DEBUG_INFO = YES; 380 | ONLY_ACTIVE_ARCH = YES; 381 | SDKROOT = iphoneos; 382 | }; 383 | name = Debug; 384 | }; 385 | 83CBBA211A601CBA00E9B192 /* Release */ = { 386 | isa = XCBuildConfiguration; 387 | buildSettings = { 388 | ALWAYS_SEARCH_USER_PATHS = NO; 389 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 390 | CLANG_CXX_LANGUAGE_STANDARD = "c++20"; 391 | CLANG_CXX_LIBRARY = "libc++"; 392 | CLANG_ENABLE_MODULES = YES; 393 | CLANG_ENABLE_OBJC_ARC = YES; 394 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 395 | CLANG_WARN_BOOL_CONVERSION = YES; 396 | CLANG_WARN_COMMA = YES; 397 | CLANG_WARN_CONSTANT_CONVERSION = YES; 398 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 399 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 400 | CLANG_WARN_EMPTY_BODY = YES; 401 | CLANG_WARN_ENUM_CONVERSION = YES; 402 | CLANG_WARN_INFINITE_RECURSION = YES; 403 | CLANG_WARN_INT_CONVERSION = YES; 404 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 405 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 406 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 407 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 408 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 409 | CLANG_WARN_STRICT_PROTOTYPES = YES; 410 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 411 | CLANG_WARN_UNREACHABLE_CODE = YES; 412 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 413 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 414 | COPY_PHASE_STRIP = YES; 415 | ENABLE_NS_ASSERTIONS = NO; 416 | ENABLE_STRICT_OBJC_MSGSEND = YES; 417 | GCC_C_LANGUAGE_STANDARD = gnu99; 418 | GCC_NO_COMMON_BLOCKS = YES; 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 13.4; 426 | LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; 427 | LIBRARY_SEARCH_PATHS = "\"$(inherited)\""; 428 | MTL_ENABLE_DEBUG_INFO = NO; 429 | SDKROOT = iphoneos; 430 | VALIDATE_PRODUCT = YES; 431 | }; 432 | name = Release; 433 | }; 434 | /* End XCBuildConfiguration section */ 435 | 436 | /* Begin XCConfigurationList section */ 437 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "CMSChats" */ = { 438 | isa = XCConfigurationList; 439 | buildConfigurations = ( 440 | 13B07F941A680F5B00A75B9A /* Debug */, 441 | 13B07F951A680F5B00A75B9A /* Release */, 442 | ); 443 | defaultConfigurationIsVisible = 0; 444 | defaultConfigurationName = Release; 445 | }; 446 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "CMSChats" */ = { 447 | isa = XCConfigurationList; 448 | buildConfigurations = ( 449 | 83CBBA201A601CBA00E9B192 /* Debug */, 450 | 83CBBA211A601CBA00E9B192 /* Release */, 451 | ); 452 | defaultConfigurationIsVisible = 0; 453 | defaultConfigurationName = Release; 454 | }; 455 | /* End XCConfigurationList section */ 456 | }; 457 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 458 | } 459 | -------------------------------------------------------------------------------- /Resources/WCIntro.json: -------------------------------------------------------------------------------- 1 | {"nm":"esim_map","ddd":0,"h":500,"w":750,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":0,"nm":"animation_comp","sr":1,"st":0,"op":240,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[375,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[375,250,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.039,"y":1},"s":[100],"t":201},{"s":[0],"t":214}],"ix":11}},"ef":[],"w":750,"h":500,"refId":"comp_0","ind":1},{"ty":2,"nm":"Map","sr":1,"st":0,"op":216,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[314.789,185.824,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[381.292,262.372,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"refId":"image_14","ind":2}],"v":"5.7.4","fr":24,"op":216,"ip":0,"assets":[{"id":"image_0","u":"","e":1,"w":47,"h":47,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC8AAAAvBAMAAACBCY6fAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAKlBMVEVHcEwmMjglMjggMEAoNDgmMjgnMjgoMDglMDonMjklMjkmMjgmMjgmMjjGRwFAAAAADXRSTlMAqVkQQIDAIDBwkNDmlQ6qUAAAAXpJREFUOMtjYIACjklTXFwi1RnQgdciAxBVtKoAVVxRAcpgDnRAFi9UgDOZowwQ4pzCSIrYkxBsSRRjuQJgLEMHNAthDAk0FzIJQGhGBXS3z4RQqhieYmwAu0IAQ4J5M1i6AEMCYogjpjgDI8iT6VgkWAKwWgEECUB/OmCTUGJgYMMmzmAIDFisEmxgTVgAVwNDCFYJJgUGrI4CuTcBwuqcwMAsm8zAnLsAVYLl7gEGzrtXGRjvXoIoFIBKMN+9zsAKlrgJ8yHUqG2TGdjPngDqPI6qAwxMgEFXYgCzYwV2505gmIRVgtWBoQt7kBgwcGOV4MYes+C4ZVqATUIciDdjEWcHeSIUW2IARau1AaaEG3JKRQY7wKQQZvxBMoJ1A4YEJOVwHMcIKagX2jC0bIBm8SPoEslQujoAOQ8AnQ8P8tVI6VR7YwNDI7y8SIPLqIkzSSvzINKR9HSIijXA4GOPFkM4h1nxWGiQ6rKNypAMPQE5RF2mBjkjuABtxz+NgHp3MQAAAABJRU5ErkJggg=="},{"id":"image_1","u":"","e":1,"w":36,"h":36,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkBAMAAAATLoWrAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJ1BMVEVHcEwlMjgnMzggMEAmMTgnMjkoMDglMjglMDonMjgmMzkmMjgmMjjKsBXMAAAADXRSTlMAhUYQoHAgYDDAsP7QnRyhMQAAAQ9JREFUKM9jYACD9FAlpdBiBiRQCOalCiFEVBQgNJMHTMRQAcZiFIDQzB4I9S0GYMrEACHEMRmsaDGyRY0ggqUBWYgpAEgoMqAANyCegCqUCFRZgCrEmMDAgirCwCbAYIImxLCAQQldSIxBGF1IHagODRgygD2aKsDA4gBCICshQtGbGaK3MkhvBbE5IULdxxhsDoMQWAismBmIDEAIrNEB3fhGhiB0oSJIACEDZwYuNBFmBwbGBlQh9gIGNjTncwKxEKpQOBBbGqAEF0gTE4pOVnA0l6AFKkjCATVQQaAyAS3SgLE+FeZMmUXAQIU4byrYVjYZBdOJLbBoXyWkpCQ4BWgbkzfciCZBQTWIZgYAqlYkWhxA2QIAAAAASUVORK5CYII="},{"id":"image_2","u":"","e":1,"w":36,"h":36,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkBAMAAAATLoWrAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJ1BMVEVHcEwlMjgnMzggMEAmMTgnMjkoMDglMjglMDonMjgmMzkmMjgmMjjKsBXMAAAADXRSTlMAhUUQoHAgYDDAsP7QBP7HMAAAAQ9JREFUKM9jYACD9FAlpdBiBiRQCOalCiFEVBQgNJMHTMRQAcZiFIDQzB4I9S0GYMrEACHEMRmsaDGyRY0ggqUBWYgpAEgoMqAANyCegCqUCFRZgCrEmMDAgirCwCbAYIImxLCAQQldSIxBGF1IHagODRgygD2aKsDA4gBCICshQtGbGaK3MkhvBbE5IULdxxhsDoMQWAismBmIDEAIrNEB3fhGhiB0oSJIACEDZwYuNBFmBwbGBlQh9gIGNjTncwKxEKpQOBBbGqAEF0gTE4pOVnA0l6AFKkjCATVQQaAyAS3SgLE+FeZMmUXAQIU4byrYVjYZBdOJLTAnrxJSUhKcArSNyRtuRJOgoBpEMwMAqvYkX1WXuFEAAAAASUVORK5CYII="},{"id":"image_3","u":"","e":1,"w":104,"h":146,"p":"data:image/png;base64,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"},{"id":"image_4","u":"","e":1,"w":132,"h":75,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAABLBAMAAABD1DL1AAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAHlBMVEVHcExQUFBRUVFQUFBSUlJRUVFRUVFRUVFRUVFRUVFnRsNpAAAACXRSTlMAQLwWgGbamPBDM8e7AAACUElEQVRYw+2XvW/aYBDG7QTCaquNGm8URUmzUUVp8QYBqWKzEmVgQ42qyhtDqOKxSaSIrRgwvv82Nvjjzjixfbd0yG3m48fdPc/d+6IouVGfthVhqOBeSxk2wGchYgQAz7JiOgECXEuCaIQI8Pqifm7C78v6KWWMIGJ02QgzQoCncRF7MQJcrrb1BAFPTMR+ioBbJuMsRfiWTBJBO0yEYI7cHkb4Gk8SGzFWZVVoE0l+4zwmZYX8efchnZL5DCHWFWbroRc9OKshIw1nK+F2bRrrDlRPw4g+/itsiunVMAK61bzgBiIewDluRklRUi94VrD7NIekUcobKHNPq0OXOBQeK2zMbS06TIhDwStViY8lgKZKEOV0tUn1TcUmiHn+l/TDwaDVOh30NrZ0jvBXxmTig0raBZvFnWrK6COV0SxTCXagPzUskrpF+/lKJZmONQ2SRp2+66YTefijFcRxLzTLkJZ7RR6tGWVES/Tr5QxTD+iHfPL0l/ozaHCY+B/0yjJMKfNDNCkqyWZOPs122jN6AwEnGaSi3tNXFjt7Nht+5vnGhpzS3qykMCZKYSVFoSmFlRRFe+cErhrxAhjyEbFfv3lsRLxQ1TVblGTwvhxxEf+S86PHRYyTu+4j1xvNZPqXXG+kR9z9uc1DpLcw0zIk/t54fNzgIdCtaMGbVx/db1a8eXXRIj/N7tByge4t36F1wkEsc2/LTEQNxAiDi1hn/4gJ3Fnjb615zunObMaZGKGCGNGRIxwBIlJV1wWn6p0lPoviHf6O+N8QFzo/tBfb0++ioKUH8gAAAABJRU5ErkJggg=="},{"id":"image_5","u":"","e":1,"w":26,"h":39,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAnBAMAAADjgEWOAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJFBMVEVHcExeLO5eLO1dLexgLe9eLOxgMO9gLOteLO1eLO1eLO1eLO2WNMoSAAAAC3RSTlMAo4BdJ8AQQODw0KCKxKUAAADpSURBVCjPhZEtD8JADIbLuBtIEuQMgh+An8ERHB4zgsIRBAIMBjVFQjAYPIavhI/+Ofp1bMkEFbs9Te/t2x7A3xgsi//FGXHXM1ghx0txghpXhvhshC2iWgC8Ea3pbMM0p6MPMEa8UzKSUkdfUUsQL5y7iXQT8ckiD6E6pz3iScgZjdRSlWqhMmaVqKRygUbo4MXoURwBpOKCPOy1EDN13QWX6ICeh9lSPUkCy1iMzLzGnGlo8JFGkdFdLeVKG7WbKtl6vW7Xdu1K10KPTaAZUycQ93hnvyfLw5ASNMehIF+6RnbG16z6/F8vaaG5vrczhAAAAABJRU5ErkJggg=="},{"id":"image_6","u":"","e":1,"w":137,"h":137,"p":"data:image/png;base64,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"},{"id":"image_7","u":"","e":1,"w":96,"h":96,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAJFBMVEVHcExQUFBRUVFSUlJRUVFRUVFQUFBRUVFQUFBQUFBRUVFRUVHhrcZOAAAAC3RSTlMAPsB+1/AVm2BQsGaF6+MAAAMUSURBVFjDzZe/b9NAFMfPSZUWssQQqUVZIhckpCwuRgWRpS2oIHmBglSQl0h0ALJkbJUlIAFrqwIDXRgQS5bWP5rS989x7+w4Odtn36WtxBvcy9197Lv3vu/dlZBss2pEyRagqQaUYU31C3JAZTX+wnhJC4M8QBtFjVL8hW7+Zuw9nVkb3LCxZOd+gfQhaUEnF5hLAV6Rd5JW4K1KCigK4JUDmiTw/kvUuCbctLYyDbTh6cdIEkk7Dac/cmAaeHePDvmGYdxOB84w2N/th/yibkC+PU4FPJ94lrHxRs58P0tQpRzgL1EETrKBQUWvw2uMXrCPSl/X9R0IaqRiZwMuo0xMI9R0FWooRmw2ioBWDBA5wFEF7NmBCpyJAVjBavFG1xchONB15qU6BLR0CLwkGYeSa/0QFIxkpLWv9h+aAU8ANpYtyxrmAAEdt34DbK0j+Alk7WW0qrrs/FizPx2J6f7ulMY1CYIvyq1igFwUeAUwOlh0INijMYZtnfrOX1miL7qr36d+dZKA1+nTVCE7sEl3ZOOh8BllNc+01IfVD0mgR7pnrHqjRI8wsvM+/nZ6KAKfDiQAk1SZYGwEGsdYBF12JKF6S1S9IqCVANoCwDZJY8QCso8AFtQyLokMsRjvePRomtwlylhStwwHaG29QxuGYYdldgMf2LQDo4UDy+PSLW3/LdCXB/Du8g1UbLtDDq0H0tPPLcvMPJtF1hRdFwoA7eqANSI4zEV2PCNwXRo4LS7bmUV8ThqIjuuqNODNCDSkAZcH/O9h70Tuftj0hzwwTiAvdNfJxGvjnvGi/WygKgQSKToK/TvqTvQf9nhxT4cv9cJTJR6oyZ4NPGDLAyZRytAZgJ5awkU5qgyUFYDnqgDL0XkF4JTLUKbWTVbZXrC9mdHr3DaXo3Oc1Ni2WuzJ4qpx4jvhEk4IeFUu5eJfQVsAnDc4oJv2tM0DU/U+ndLhVBHgqgIB9h8pAJA+RC8bqKUy9LKBQSrhCgBTFeilegqA5sWBX9GFDv91qrFrZep9h9a0scLzlj1vsedNbnhA/gFDSsn7vdKM/gAAAABJRU5ErkJggg=="},{"id":"image_8","u":"","e":1,"w":130,"h":156,"p":"data:image/png;base64,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"},{"id":"image_9","u":"","e":1,"w":64,"h":122,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAB6BAMAAAD9pkgmAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAElBMVEVHcExSUlJRUVFQUFBRUVFRUVHw9+6mAAAABXRSTlMAgMJIoFNvlEEAAACSSURBVEjH7dY9DoQgGIRhXLTfZnt1Y4/RPYCFvRrn/lfZWPgD+ZBGC8y87TyhIgGlDuly6au8JVga7wdzCKDxzC+sTSGAKIAR5gxWJkpQf2zQucLZgfyBQNeVC4q3cN+tRgICAgKC64BuBXD8RPQQ256tVN73z8zPA9YjWt+O2UgviVWZq+oUYCAgICAgiACE+gO1io69fVug/gAAAABJRU5ErkJggg=="},{"id":"image_10","u":"","e":1,"w":112,"h":134,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAACGCAMAAAAy9f59AAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAABOFBMVEVHcExUXGY+SU/ol29jMehcQqJTW2YvOkA3NGpIQ2aPlZh5gIRgaGwlMjheLOxfLO1gaW2oaIVnaoBORoNFUFQmMjgmMjhxeXxdLeldXWRlandkR79OVmEmMjhdL+ReLufbj3VeLOxnRbUsOD6boKPnlHRYTJRTXWGog2/rmW5eLO36+vomMjhCH6WvlvWGYPLWimpoOe5yRu/OwPlPKsTDsPg2K3Oae/QvLVzt6/C5o/bikmtaK+LYzftBLJKKZlPIgGdMK7OlifU6JoZXK9d8U+9tV0uIT8UtNEFJLaC6f2CQbfPgd0jIfoVXS0WhclqjYa6ueV7yxq9EQkBvQNfl3vrS1NXFyMlmN+6qr7HwspLekXmDTpC8dpvmiFq9cGtYS0pmSHj35Nq3u72PY3Cih/OOd9Lzz71+m9k2AAAAKXRSTlMAw/TB/PuhPhAi/fVvhro77f5d7OLA7MOPPZT72mdq45HTs1L7S9L6/fu1hZAAAAosSURBVGjezZvpdtpGFIAhBQxegokdN/ESN3tBaAFJSEjsYFZjjPEaO8nJ0ub936CjfWY0I4QLPb0/WuNEfLr7HekmEgkva0Ai/5Wkjp7nDdnbSq6IcLS1dZSyf07aNAu5Ei2TFuH51lok9XZrL4/I2xUAt/IBspdaPvB5EDC/tXzg23ywPF9bhQf/Oy1D8JZLzIeSJSbkHpkwOzubrSY7jgi0s7qQBdJdjU3XMC/OLJoh9dUAEaPOJllIuqsGng2ziEydPziKrIDY72I4IA5wubmfOqp363U/DchsJcDIewyjT+tDK3LObOCSS/gfKM8KzikMjKwUOBwC/YZwYuwtGfhbNivU6w2CD23g86UDzfhvUIFbSwcKQwG1qv1xuCqgK6aWkz4o3SZSX0lWGMBJ96yuGzY0gXqjP4ETcfnASXc47YJEmEwc381gJ0ZWYdJZHmjXdVxpqmvYtL8y4KQP/Dcjxune+9SKgmba9WcGaFFn2ewfqwF2p6QKnhWAod+vBNjXiUBd+Jr9LbUCYKObpUhDv9/YPtxfWzKwPqEBBeETwzA369vRzWUCzwS6hgYQSPnddjS1POBk2CD6sNHIXjCOXG8cPlsSUAed0KjYJCgDSXn9XyKxBtz1q/mpzDAYMrU0oICXm4vvjF+uN6KPPXAko38irXCGx+oFQ5Sb7cfZde3JjwtIva5/OqUAGWb9MUomPpaZi2ygUIFAyZeLmnN3HVz367FApry9WCFI7d4Zl30PBv5iAmRjfwHeyyfXTAjgRRCQuYsuzGOYfwMMT/R4c6LmE7MUIsSbY9N5wHDEJMQjqvglPJC521+Q5yfqp4sAmXdzs+PwDrsEIepfTk+ziwCZjTkVILHhu+T7J9eYp6cwLxSwvB1Y5V5+LJMu+vVJ/2LSTk+daWr8+bz3OQSQuf49CIg50BMb9yV7b5B6sZwpXBjiu4DekVinXZU9Pf2aAaQcInwYIEM36suPFD9wo5McSW5DActUo+7ekK/gczQphyK+S1iyubmJmHdzg/z3RSovJzOLyTVSCJ5Q7rdK5XXaTUVcgIcad5MWMSIVV6sY/x+FZm5Ewih4pVQqflploLbdX5+EM+27VAgPiiPwhbU2ipTaqor+6pabHz8/0ITcJVxR1orW9zXVUqk9aErSoA1YaqnNdnw6K9WFSk5q2x8syq1nQYmttU2psUA6RKfy4gLZGMW7hIxlX0VqspY0O9SwLXIazbQb2BHgCRooXJH4hZVcJTdHKN68xlrxWzhkRCX3WBkYSGLM4hb94f4Jd5J7vNTM/44ISm4kKRbVHsM5GXGcAm602bQ/+yP2Ghk2Um6fKN8uTOM1bWS4nOdaNcfFhatgm3plbWF7KvLI/bmw4+lcDqxrUacxcZCZWnJhLm6EZk/J+/Ev3xkuSXDhlXez1VaxKLeCcQUZjWepBn3AjXrzjAD0btf6qlYxMFSqmAkGUo6uYjnhr2tQI7J1DcrIE19A16Sg+QOa+9fWcQWLtjO5RXi5WuA4AIVp4g5XkOfmaVgQ/SFVQgsrPUwTVpAqOVzDAi1qiiNRBLmOuVgNnHjWPeDvJrAM/2VLW3INL7REmQMK8iOtyhXowNsyLS92zYFbUwoYkCfWudaV4sUvX23RTIpP5nfeQ85du8hAdbsF6oeiEXPBJMie4WRK0ABTICreYEAjEUauDQsiOe05O/ege5E1GjCnBAHNywoKpxjJwStXhCg06o+tJ5wvIu/2Z1yqAUCnBhf4FsfxxVzVHzD8lWNzHs6XIn025wOAvsj3ETVPaUTDHHU2L/BQaqx7wMNr0nxdrPKoeiM4xxDHUot7rlim5SHhooImu2HLVzXEpwiQMiUUjf7GkYBGpeGh0cy7RBM1hedbWIIb8deaa1K7mVwRgPuglnqjhSQht8kDIQSsWPQVXqw+2P3bjZttpFtcYbPeXCm4zZC/ItxPUXTvQvQDwQwlUrsMdcquWqmhXJ0QvCcXfSU1inR8bmEgQIka5/durqiIMpJRVu+/TsBHJ7g1+WpweLkccTIYGon1BjmtRW/4MBrGzoH0DIkFDd7keoOM3pvrt7RZCMbdQ8+9xpckIOVgpaExY0QNz4ECaqspNUkX9UycoAtCA4iezZ771exQvAHipow+O31iKM5zomg4QKrRcIAkAKSt5H3PP9VIlIGZuUMfZH5wQ6wlcgX/fY5NQuYr9vT0M65kR6W4X8ROT/vOVAIO8PG/ycDPPZen64L9WBFXstakZO0h9qLCKWt9aysJcGvw0RrE52XM4Y0Fw7Bw8EhqyY60iko5I7/BnrMdOBEKr3r1+2qp5MZsxrHiJWrXcyOuK1JNVY3JW2pTjJpGga9ct/v35/qmwg+6/e0xOzvcN9/3PTsdpAG4P1rcPMVUdO2nUhcR+0PTZWPrbexXQXBfDf+ET1Cq2m5KnYp7IhDFqiyDsfIVCnzjtsM+nWjweibvK/Jm/yf6rKNZM54dNSWpcyLbA2yhmIslKSpKAUSjXpo81I0/8dE816mV1DYbj7NShWbUN15po693Gglj70TA8g0bXguWoiWgJ8tKtLhxVew1pl0acWAC8bfPWMv2ep1kMF3icZKs4mdjqQWCGDs0ziJbXzKCxgSOM24dkGhAQ0+WdT+8QFV0rN2DV+Xy+QnysV+xgTobdztHhQ5Ep7I0MRfNRJsivKy3NqvawAzLjm3gBO9G1A79GlXxGLKps2DZzWJLs/lvIGjAr+IgHh7GpCA1jpUFrloVCcchNBlTtvLnnhG70MrVrD7VBYD+ZnDG1rPMQUbwBSmYoBXrgMPJc1R8AQH1M5dnRpC9NSQAN7IgXB5YR+KZb77XC85o7D8RpUlGPbd3V4ZDd1/WXfsyTN0fPHg8lm3XfEOpbKVisTrHppFUDAI6QT+DcNPuWb3eV1lYSjjQOP8DpqKJxbk13IxUrP9MHJxer08ts5YQIFvBnqhYRzX+JETTsNw4Ju9cOdsYjXy/BgNVtAeOgp5f+YCRp07qU8XwaR81qjpAs2IRYNpnUkzPidlNEGLz73jJe3PC5RYCRtKxAKDQdZoX5MYeBwpmrVTqPA4YSb++p+AyRnmptUuq2lddNx5oPft9xqBtVnElyKQviC/z3xCVexiwmEgdEP+g2xpScQ+zJ6MAYDrU+hWgZR5wGtusFBSxRTiNBjxIPqbulMMzy9jWrQkEUm8ky+QE4Be0qGVWe6lNz1i0pjOcVCTJjEu5Sn1A3flwTDvwBa0RvMyMhUz84MD0FVxLeEUWZYX6yD8WB0fP9NMFFTTlWbPSqfB/cZymcZbIVa0qc3zQ+4UDe+Ur9eI4VE5gqwTQ2eRk/msMUDN2oNd26Rfo6ep1iO2zZKK5yBl/B980fQUxn4bbdksmBrFQtNjBIXGxNf3q6WsDlw6/Bba504zNVy6xzOXdZGInfhmgWzy6gn+RuBkFUJ+mlwfxnf3V/SvPtc3Eh524Izs70f21VOT/L/8ABiW4/HhXKvIAAAAASUVORK5CYII="},{"id":"image_11","u":"","e":1,"w":86,"h":102,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAABmBAMAAACjAntpAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAG1BMVEVHcExQUFBRUVFSUlJRUVFQUFBRUVFRUVFRUVGwX211AAAACHRSTlMAP8GB6BNfpSnKsSsAAAIFSURBVFjD7ZZNT8JAEIZbKx/H1qjpEUGSHkkEw1ENkD0CweiRqCQc5WDCESgf7892WlIo7e52OJhgwntgmvIwzM7OzqxhSGRODLYs/3+xF0s+62LIRXMCbS5rlssVLlsAwGfFhp0y9H0+e/EnbOEIdgAsukx2Sjkr8dA3QpmOTRGwYEU8xlZV3gaDGcU0YrMd79wyHO/dZuYtH0OzUnEdZ2FrWe+AbbNDyAhicMhqg2gmWF0mRIJdscPVBlxIsppe9Z5kNYtzU+wws3T3qrFTpktaz0lKGe9HOa07xaGERD6jziN1VGNCwhpqlgpiibhRs/4l0BDYUG1WBRZ9LUuua15kFtZJs591LO+BFxE3DyP2tlGnkk8UPptrhvk/lMCP4lQ8Ams6RyNgTuYmNLaCpRa1op3repiRMYBZUcfOKF2RObMM1hGYX1G9CPh1MnSKm0pWJjnbL8vEvUhkjDS1htLmKFfQXi0v1fkhqeRKGHgxXeDKZlVMu42plWQbFMeaOhJGXuSWPju07OUrPTx/xdhgUjxZwYxqxkIo0QzbBJ32u7BnF8GelUxsH/Yrzwe9mn5ds+Is+a6ZwTcHbPiG/tLmsu6ZPbM7dn0EO0+xDr2Y3FJlO+OU30RNcnQ023NZrCO9lLVCCVnD5PYoW3Erk8mW3fVU6hoeuCodwc5OgmWnwbF/AQydz+igfwUjAAAAAElFTkSuQmCC"},{"id":"image_12","u":"","e":1,"w":131,"h":147,"p":"data:image/png;base64,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"},{"id":"image_13","u":"","e":1,"w":93,"h":114,"p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF0AAAByBAMAAADDpcATAAAAJHpUWHRDcmVhdG9yAAAImXNMyU9KVXBMK0ktUnBNS0tNLikGAEF6Bs5qehXFAAAACXBIWXMAAAABAAAAAQBPJcTWAAAAHlBMVEVHcExSUlJRUVFQUFBQUFBRUVFQUFBRUVFQUFBRUVGSUyMfAAAACXRSTlMAgcNAX+kYpzDaxi99AAAB50lEQVRYw+3Yv2vCQBQH8Kgx2i2KWNz0oEi2dil0Uwq1o1AoZGtBKN2M0CFbwHZwq6nR3n9bfzQxMZe79x1CBfvmj2feee/lnZomjXpHQ0Ln3ER8kfM24sucfyL+DPdL0H/l6WecL+j6/Y2vo9t4omDj6oL/RqD8xLQ/sXksfOf2OusIWIGTsNG3OKxzl/YWl0TgpddnPhN+xp8wpyl+porIjyV7I0ggkO3RTdpLf7dC2svrps4SSTNGqMuRGz56k3Z+wix6GuY1zAeg90/Mr0A/z9k/gr4N+jHozSPzPdBf5uVnoC/vvEf1Fazcwy6Xm9dBXzoyb4Be+/d/6tnOd4l8Gr6t75HTQ67gU/P63veAbkLu6LEhkfIGq7p7r57pq7X4SBkoEygnh8O5akCfHUyTDwrfwsZPHRtvN/c6YHyuTs7T87Bkiz5E4/wQmuZlCRSFV5HsKc4V31088l5KEx7ZGd6k3iyk/hX0FuZfsu92grFvOrCz/RBZXFSUhi31K9KtMRYHJ9qwFD6ZsOEqePKfiJJq9eRcr6t5vCR1mxMiOqHPJB610QKNRwm3aDxKmLh8ePE0ODW8wxeVIkzQDwnHOB7fm2ZZJ/Ntj7PofNvjEL8pAciboB+Dfgn6BejXPaJfA6Kh/QDF2o3zFJt/VAAAAABJRU5ErkJggg=="},{"id":"image_14","u":"","e":1,"w":630,"h":372,"p":"data:image/png;base64,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"},{"nm":"","id":"comp_0","layers":[{"ty":2,"nm":"Speech Bubbles copy 2","sr":1,"st":164,"op":404,"ip":164,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[47.922,48.786,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":164},{"s":[100,100,100],"t":178}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[562.108,345.329,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":164},{"s":[100],"t":178}],"ix":11}},"ef":[],"refId":"image_0","ind":1},{"ty":2,"nm":"Speech Bubbles copy","sr":1,"st":109,"op":349,"ip":109,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[37.917,40.313,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":123},{"s":[80,80,100],"t":127}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[581.833,110.615,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":123},{"s":[0],"t":127}],"ix":11}},"ef":[],"refId":"image_1","ind":2},{"ty":2,"nm":"Speech Bubbles","sr":1,"st":15,"op":255,"ip":15,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[46.916,40.813,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":29},{"s":[80,80,100],"t":41}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[146.337,320.699,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":29},{"s":[0],"t":41}],"ix":11}},"ef":[],"refId":"image_2","ind":3},{"ty":2,"nm":"Character 5","sr":1,"st":134,"op":614,"ip":134,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[102.779,28.634,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":134},{"s":[100,100,100],"t":147}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[643.214,348.847,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":134},{"s":[100],"t":147}],"ix":11}},"ef":[],"refId":"image_3","ind":4},{"ty":2,"nm":"bg 5","sr":1,"st":121,"op":601,"ip":121,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[162.602,-12.745,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":121},{"s":[100,100,100],"t":134}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[646.524,362.654,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":121},{"s":[100],"t":134}],"ix":11}},"ef":[],"refId":"image_4","ind":5},{"ty":2,"nm":"pin 5","sr":1,"st":121,"op":361,"ip":121,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[13.984,39.13,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[60,60,100],"t":121},{"s":[100,100,100],"t":133}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[643.361,366.258,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":121},{"s":[100],"t":130}],"ix":11}},"ef":[],"refId":"image_5","ind":6},{"ty":2,"nm":"Character 4","sr":1,"st":105,"op":585,"ip":105,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-1.965,59.159,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":105},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":134},{"s":[80,80,100],"t":146}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[537.23,146.376,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":134},{"s":[0],"t":146}],"ix":11}},"ef":[],"refId":"image_6","ind":7},{"ty":2,"nm":"bg 4","sr":1,"st":92,"op":572,"ip":92,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-62.498,38.871,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":92},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":134},{"s":[40,40,100],"t":146}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[540.747,138.838,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":134},{"s":[100],"t":146}],"ix":11}},"ef":[],"refId":"image_7","ind":8},{"ty":2,"nm":"pin 4","sr":1,"st":92,"op":332,"ip":92,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[13.984,39.13,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":92},{"s":[100,100,100],"t":104}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[530.861,154.008,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":92},{"s":[100],"t":101}],"ix":11}},"ef":[],"refId":"image_5","ind":9},{"ty":4,"nm":"stroke 4","sr":1,"st":92,"op":332,"ip":92,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-89,62,0],"ix":1},"s":{"a":0,"k":[82.069,82.069,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[640.5,243.5,0],"ix":2},"r":{"a":0,"k":55.439,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":92},{"s":[100],"t":142}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[-1,-1.5],[38.975,-42.151]],"o":[[-69.407,-265.745],[-0.5,1.5]],"v":[[30.848,224.651],[-234.525,36.547]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":8,"ix":1}},{"nm":"offset","n":"o","v":{"a":0,"k":0,"ix":7}}],"c":{"a":0,"k":[0,0,0],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[90.769,53.535],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":358.494,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.523,"y":0},"i":{"x":0,"y":1},"s":[100],"t":92},{"s":[0],"t":176}],"ix":1},"m":1}],"ind":10},{"ty":2,"nm":"Character 3","sr":1,"st":78,"op":558,"ip":78,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[26.742,39.5,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":78},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":107},{"s":[80,80,100],"t":119}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[393.747,267.542,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":107},{"s":[0],"t":119}],"ix":11}},"ef":[],"refId":"image_8","ind":11},{"ty":2,"nm":"bg 3","sr":1,"st":65,"op":545,"ip":65,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[54.589,36.596,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":65},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":107},{"s":[40,40,100],"t":119}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[394.891,289.513,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":65},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":107},{"s":[100],"t":119}],"ix":11}},"ef":[],"refId":"image_9","ind":12},{"ty":2,"nm":"pin 3","sr":1,"st":65,"op":305,"ip":65,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[13.984,39.13,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":65},{"s":[100,100,100],"t":77}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[399.861,278.508,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":65},{"s":[100],"t":74}],"ix":11}},"ef":[],"refId":"image_5","ind":13},{"ty":4,"nm":"stroke 3","sr":1,"st":65,"op":305,"ip":65,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[620.5,236.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":65},{"s":[100],"t":115}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[-1,-1.5],[8.5,-38.5]],"o":[[-92.5,-6.5],[-0.5,1.5]],"v":[[-97.5,-98.5],[-218,16]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":8,"ix":1}},{"nm":"offset","n":"o","v":{"a":0,"k":0,"ix":7}}],"c":{"a":0,"k":[0,0,0],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":358.494,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.523,"y":0},"i":{"x":0,"y":1},"s":[100],"t":65},{"s":[0],"t":149}],"ix":1},"m":1}],"ind":14},{"ty":2,"nm":"Character 2","sr":1,"st":58,"op":538,"ip":58,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[116.685,62.671,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":58},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":80},{"s":[80,80,100],"t":92}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[118.718,192.254,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":58},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":80},{"s":[0],"t":92}],"ix":11}},"ef":[],"refId":"image_10","ind":15},{"ty":2,"nm":"bg 2","sr":1,"st":45,"op":525,"ip":45,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[67.61,36.635,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":45},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":58},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":80},{"s":[40,40,100],"t":92}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[117.312,174.784,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":45},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":58},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":80},{"s":[100],"t":92}],"ix":11}},"ef":[],"refId":"image_11","ind":16},{"ty":2,"nm":"pin 2","sr":1,"st":45,"op":285,"ip":45,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[13.984,39.13,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":45},{"s":[100,100,100],"t":57}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[128.861,186.508,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":45},{"s":[100],"t":54}],"ix":11}},"ef":[],"refId":"image_5","ind":17},{"ty":4,"nm":"stroke 2","sr":1,"st":45,"op":285,"ip":45,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[368,246.5,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":45},{"s":[100],"t":95}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[-1,-1.5],[107,-80]],"o":[[-24,-121.5],[-0.5,1.5]],"v":[[33,9],[-238.5,-74.5]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":8,"ix":1}},{"nm":"offset","n":"o","v":{"a":0,"k":0,"ix":7}}],"c":{"a":0,"k":[0,0,0],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":358.494,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.523,"y":0},"i":{"x":0,"y":1},"s":[100],"t":45},{"s":[0],"t":129}],"ix":1},"m":1}],"ind":18},{"ty":2,"nm":"Character ","sr":1,"st":22,"op":502,"ip":22,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[151.239,62.184,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":22},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":40},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"s":[80,80,100],"t":61}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[235.787,338.535,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":22},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":40},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":49},{"s":[0],"t":61}],"ix":11}},"ef":[],"refId":"image_12","ind":19},{"ty":2,"nm":"bg ","sr":1,"st":9,"op":489,"ip":9,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[84.16,41.776,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[80,80,100],"t":9},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[100,100,100],"t":22},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":49},{"s":[40,40,100],"t":61}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[219.747,336.591,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[3],"t":9},{"o":{"x":0.167,"y":0},"i":{"x":0,"y":1},"s":[100],"t":22},{"o":{"x":0.167,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":49},{"s":[100],"t":61}],"ix":11}},"ef":[],"refId":"image_13","ind":20},{"ty":2,"nm":"pin ","sr":1,"st":9,"op":249,"ip":9,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[13.984,39.13,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[80,80,100],"t":9},{"s":[100,100,100],"t":21}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[234.861,349.508,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.833,"y":1},"s":[0],"t":9},{"s":[100],"t":18}],"ix":11}},"ef":[],"refId":"image_5","ind":21},{"ty":4,"nm":"stroke","sr":1,"st":9,"op":249,"ip":9,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-182.542,-11.24,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[196,234,0],"ix":2},"r":{"a":0,"k":107.41,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0,"y":1},"s":[0],"t":9},{"s":[100],"t":59}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Shape 1","ix":1,"cix":2,"np":3,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[-14.5,39],[74,-0.5]],"o":[[19.5,-52],[-85,7]],"v":[[-143.5,64],[-238.5,-74.5]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":8,"ix":1}},{"nm":"offset","n":"o","v":{"a":0,"k":0,"ix":7}}],"c":{"a":0,"k":[0,0,0],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":-360,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.523,"y":0},"i":{"x":0,"y":1},"s":[100],"t":9},{"s":[0],"t":93}],"ix":1},"m":1}],"ind":22}]}]} --------------------------------------------------------------------------------