@adminide-stack/yantra-mobile 12.0.69-alpha.9 → 12.0.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (522) hide show
  1. package/lib/components/GatewayConnector/GatewayConnector.js +2 -2
  2. package/lib/components/GatewayConnector/GatewayConnector.js.map +1 -1
  3. package/lib/components/KeyboardComposerDock.js +8 -1
  4. package/lib/components/KeyboardComposerDock.js.map +1 -1
  5. package/lib/components/NavigationHeader/NavigationHeader.js +2 -2
  6. package/lib/components/NavigationHeader/NavigationHeader.js.map +1 -1
  7. package/lib/config/env-config.js +4 -0
  8. package/lib/config/env-config.js.map +1 -1
  9. package/lib/contexts/ChatLiveStreamContext.js +4 -1
  10. package/lib/contexts/ChatLiveStreamContext.js.map +1 -1
  11. package/lib/features/agent-chat/NativeAgentChat.js +2 -0
  12. package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
  13. package/lib/features/apps/AppsCatalog.js +2 -2
  14. package/lib/features/apps/AppsCatalog.js.map +1 -1
  15. package/lib/features/audio-input/MicErrorBoundary.js +2 -2
  16. package/lib/features/audio-input/MicErrorBoundary.js.map +1 -1
  17. package/lib/features/canvas/AudioEditorExperience.js +308 -0
  18. package/lib/features/canvas/AudioEditorExperience.js.map +1 -0
  19. package/lib/features/canvas/CanvasAgentChatPane.js +310 -0
  20. package/lib/features/canvas/CanvasAgentChatPane.js.map +1 -0
  21. package/lib/features/canvas/CanvasBoardsGrid.js +414 -0
  22. package/lib/features/canvas/CanvasBoardsGrid.js.map +1 -0
  23. package/lib/features/canvas/CanvasChatResultCard.js +113 -0
  24. package/lib/features/canvas/CanvasChatResultCard.js.map +1 -0
  25. package/lib/features/canvas/CanvasEditToolsPanel.js +179 -0
  26. package/lib/features/canvas/CanvasEditToolsPanel.js.map +1 -0
  27. package/lib/features/canvas/CanvasExperience.js +859 -0
  28. package/lib/features/canvas/CanvasExperience.js.map +1 -0
  29. package/lib/features/canvas/CanvasGeneratePanel.js +514 -0
  30. package/lib/features/canvas/CanvasGeneratePanel.js.map +1 -0
  31. package/lib/features/canvas/CanvasLibrarySheet.js +355 -0
  32. package/lib/features/canvas/CanvasLibrarySheet.js.map +1 -0
  33. package/lib/features/canvas/CanvasLooksPanel.js +184 -0
  34. package/lib/features/canvas/CanvasLooksPanel.js.map +1 -0
  35. package/lib/features/canvas/CanvasTasksPanel.js +138 -0
  36. package/lib/features/canvas/CanvasTasksPanel.js.map +1 -0
  37. package/lib/features/canvas/CanvasTemplatesPanel.js +226 -0
  38. package/lib/features/canvas/CanvasTemplatesPanel.js.map +1 -0
  39. package/lib/features/canvas/CanvasToolDock.js +423 -0
  40. package/lib/features/canvas/CanvasToolDock.js.map +1 -0
  41. package/lib/features/canvas/FrameExtractorExperience.js +242 -0
  42. package/lib/features/canvas/FrameExtractorExperience.js.map +1 -0
  43. package/lib/features/canvas/ImageEditorExperience.js +491 -0
  44. package/lib/features/canvas/ImageEditorExperience.js.map +1 -0
  45. package/lib/features/canvas/InfluencerStudioExperience.js +288 -0
  46. package/lib/features/canvas/InfluencerStudioExperience.js.map +1 -0
  47. package/lib/features/canvas/MoodboardExperience.js +205 -0
  48. package/lib/features/canvas/MoodboardExperience.js.map +1 -0
  49. package/lib/features/canvas/NativeCanvasViewer.js +929 -0
  50. package/lib/features/canvas/NativeCanvasViewer.js.map +1 -0
  51. package/lib/features/canvas/PromoContextFields.js +150 -0
  52. package/lib/features/canvas/PromoContextFields.js.map +1 -0
  53. package/lib/features/canvas/SetStudioExperience.js +323 -0
  54. package/lib/features/canvas/SetStudioExperience.js.map +1 -0
  55. package/lib/features/canvas/VideoClipsExperience.js +175 -0
  56. package/lib/features/canvas/VideoClipsExperience.js.map +1 -0
  57. package/lib/features/canvas/VideoEditExperience.js +824 -0
  58. package/lib/features/canvas/VideoEditExperience.js.map +1 -0
  59. package/lib/features/canvas/VideoEditorExperience.js +3050 -0
  60. package/lib/features/canvas/VideoEditorExperience.js.map +1 -0
  61. package/lib/features/canvas/VideoGeneratorExperience.js +415 -0
  62. package/lib/features/canvas/VideoGeneratorExperience.js.map +1 -0
  63. package/lib/features/canvas/aiEdit.js +53 -0
  64. package/lib/features/canvas/aiEdit.js.map +1 -0
  65. package/lib/features/canvas/canvasAgentChat.js +76 -0
  66. package/lib/features/canvas/canvasAgentChat.js.map +1 -0
  67. package/lib/features/canvas/canvasBoardsCatalog.js +59 -0
  68. package/lib/features/canvas/canvasBoardsCatalog.js.map +1 -0
  69. package/lib/features/canvas/canvasBoardsSnapshot.js +14 -1
  70. package/lib/features/canvas/canvasBoardsSnapshot.js.map +1 -1
  71. package/lib/features/canvas/canvasChatDisplay.js +38 -0
  72. package/lib/features/canvas/canvasChatDisplay.js.map +1 -0
  73. package/lib/features/canvas/canvasChatTemplates.js +219 -0
  74. package/lib/features/canvas/canvasChatTemplates.js.map +1 -0
  75. package/lib/features/canvas/canvasCore.js +138 -1
  76. package/lib/features/canvas/canvasCore.js.map +1 -1
  77. package/lib/features/canvas/canvasEditOps.js +224 -0
  78. package/lib/features/canvas/canvasEditOps.js.map +1 -0
  79. package/lib/features/canvas/canvasTasks.js +187 -0
  80. package/lib/features/canvas/canvasTasks.js.map +1 -0
  81. package/lib/features/canvas/designPromptTemplates.js +3084 -0
  82. package/lib/features/canvas/designPromptTemplates.js.map +1 -0
  83. package/lib/features/canvas/editTools.js +54 -0
  84. package/lib/features/canvas/editTools.js.map +1 -0
  85. package/lib/features/canvas/extendVideo.js +5 -0
  86. package/lib/features/canvas/extendVideo.js.map +1 -0
  87. package/lib/features/canvas/frameExtract.js +33 -0
  88. package/lib/features/canvas/frameExtract.js.map +1 -0
  89. package/lib/features/canvas/generationModels.js +201 -0
  90. package/lib/features/canvas/generationModels.js.map +1 -0
  91. package/lib/features/canvas/influencer/influencerPipeline.js +170 -0
  92. package/lib/features/canvas/influencer/influencerPipeline.js.map +1 -0
  93. package/lib/features/canvas/influencer/productReel.js +72 -0
  94. package/lib/features/canvas/influencer/productReel.js.map +1 -0
  95. package/lib/features/canvas/influencer/reelPlan.js +159 -0
  96. package/lib/features/canvas/influencer/reelPlan.js.map +1 -0
  97. package/lib/features/canvas/moodboardCore.js +13 -0
  98. package/lib/features/canvas/moodboardCore.js.map +1 -0
  99. package/lib/features/canvas/promoProjectImport.js +99 -0
  100. package/lib/features/canvas/promoProjectImport.js.map +1 -0
  101. package/lib/features/canvas/promoVideo.js +312 -0
  102. package/lib/features/canvas/promoVideo.js.map +1 -0
  103. package/lib/features/canvas/recorder/CameraRecorderExperience.js +109 -0
  104. package/lib/features/canvas/recorder/CameraRecorderExperience.js.map +1 -0
  105. package/lib/features/canvas/sessionIdentity.js +28 -1
  106. package/lib/features/canvas/sessionIdentity.js.map +1 -1
  107. package/lib/features/canvas/set/SetViewportWebView.js +133 -0
  108. package/lib/features/canvas/set/SetViewportWebView.js.map +1 -0
  109. package/lib/features/canvas/set/cameraPath.js +194 -0
  110. package/lib/features/canvas/set/cameraPath.js.map +1 -0
  111. package/lib/features/canvas/set/setProject.js +24 -0
  112. package/lib/features/canvas/set/setProject.js.map +1 -0
  113. package/lib/features/canvas/storageLibrary.js +184 -0
  114. package/lib/features/canvas/storageLibrary.js.map +1 -0
  115. package/lib/features/canvas/studioCatalog.js +129 -0
  116. package/lib/features/canvas/studioCatalog.js.map +1 -0
  117. package/lib/features/canvas/studioLooks.js +189 -0
  118. package/lib/features/canvas/studioLooks.js.map +1 -0
  119. package/lib/features/canvas/surfaceIndex.js +63 -1
  120. package/lib/features/canvas/surfaceIndex.js.map +1 -1
  121. package/lib/features/canvas/templateImport/invideoNative.js +221 -0
  122. package/lib/features/canvas/templateImport/invideoNative.js.map +1 -0
  123. package/lib/features/canvas/templateImport/loadTemplate.js +43 -0
  124. package/lib/features/canvas/templateImport/loadTemplate.js.map +1 -0
  125. package/lib/features/canvas/templateImport/renderConfig.js +93 -0
  126. package/lib/features/canvas/templateImport/renderConfig.js.map +1 -0
  127. package/lib/features/canvas/useStudioCatalogTemplates.js +134 -0
  128. package/lib/features/canvas/useStudioCatalogTemplates.js.map +1 -0
  129. package/lib/features/canvas/video3d.js +109 -0
  130. package/lib/features/canvas/video3d.js.map +1 -0
  131. package/lib/features/canvas/videoClips.js +42 -0
  132. package/lib/features/canvas/videoClips.js.map +1 -0
  133. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js +120 -0
  134. package/lib/features/canvas/videoEditor/agent/AgentCutPane.js.map +1 -0
  135. package/lib/features/canvas/videoEditor/agent/agentLoop.js +69 -0
  136. package/lib/features/canvas/videoEditor/agent/agentLoop.js.map +1 -0
  137. package/lib/features/canvas/videoEditor/agent/brainClient.js +45 -0
  138. package/lib/features/canvas/videoEditor/agent/brainClient.js.map +1 -0
  139. package/lib/features/canvas/videoEditor/agent/cutTools.js +129 -0
  140. package/lib/features/canvas/videoEditor/agent/cutTools.js.map +1 -0
  141. package/lib/features/canvas/videoEditor/editorModel.js +346 -0
  142. package/lib/features/canvas/videoEditor/editorModel.js.map +1 -0
  143. package/lib/features/canvas/videoEditor/exportRenderer.js +214 -0
  144. package/lib/features/canvas/videoEditor/exportRenderer.js.map +1 -0
  145. package/lib/features/canvas/videoEditor/filters.js +41 -0
  146. package/lib/features/canvas/videoEditor/filters.js.map +1 -0
  147. package/lib/features/canvas/videoEditor/mediaActions.js +57 -0
  148. package/lib/features/canvas/videoEditor/mediaActions.js.map +1 -0
  149. package/lib/features/canvas/videoEditor/remoteMediaClient.js +129 -0
  150. package/lib/features/canvas/videoEditor/remoteMediaClient.js.map +1 -0
  151. package/lib/features/canvas/videoEditor/solidColorPng.js +115 -0
  152. package/lib/features/canvas/videoEditor/solidColorPng.js.map +1 -0
  153. package/lib/features/canvas/videoEditor/videoEditOps.js +191 -0
  154. package/lib/features/canvas/videoEditor/videoEditOps.js.map +1 -0
  155. package/lib/features/canvas/videoEditor/videoProjectsStore.js +82 -0
  156. package/lib/features/canvas/videoEditor/videoProjectsStore.js.map +1 -0
  157. package/lib/features/canvas/videoRenderer.js +8 -0
  158. package/lib/features/canvas/videoRenderer.js.map +1 -0
  159. package/lib/features/canvas/withRemoteSafeArea.js +2 -2
  160. package/lib/features/canvas/withRemoteSafeArea.js.map +1 -1
  161. package/lib/features/characters/characterStudioProps.js +14 -0
  162. package/lib/features/characters/characterStudioProps.js.map +1 -0
  163. package/lib/features/chat/ChatCodeBlock.js +7 -3
  164. package/lib/features/chat/ChatCodeBlock.js.map +1 -1
  165. package/lib/features/chat/ChatTranscript.js +7 -3
  166. package/lib/features/chat/ChatTranscript.js.map +1 -1
  167. package/lib/features/chat/ChatWidgetCard.js +13 -0
  168. package/lib/features/chat/ChatWidgetCard.js.map +1 -0
  169. package/lib/features/chat/ConnectorConnectCard.js +164 -0
  170. package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
  171. package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
  172. package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
  173. package/lib/features/chat/MessageActionBar.js.map +1 -1
  174. package/lib/features/chat/QueuedFollowUps.js +71 -0
  175. package/lib/features/chat/QueuedFollowUps.js.map +1 -0
  176. package/lib/features/chat/chatWidgets.js +37 -0
  177. package/lib/features/chat/chatWidgets.js.map +1 -0
  178. package/lib/features/chat/connectorConnect.js +179 -0
  179. package/lib/features/chat/connectorConnect.js.map +1 -0
  180. package/lib/features/chat/connectorConnectHandbacks.js +55 -0
  181. package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
  182. package/lib/features/design/DesignEditorExperience.js +643 -0
  183. package/lib/features/design/DesignEditorExperience.js.map +1 -0
  184. package/lib/features/design/DesignExperience.js +444 -0
  185. package/lib/features/design/DesignExperience.js.map +1 -0
  186. package/lib/features/design/designCore.js +298 -0
  187. package/lib/features/design/designCore.js.map +1 -0
  188. package/lib/features/design/designIndex.js +150 -0
  189. package/lib/features/design/designIndex.js.map +1 -0
  190. package/lib/features/design/exportDesign.js +133 -0
  191. package/lib/features/design/exportDesign.js.map +1 -0
  192. package/lib/features/job-search/ApplicationsPanel.js +907 -0
  193. package/lib/features/job-search/ApplicationsPanel.js.map +1 -0
  194. package/lib/features/job-search/ContactsPanel.js +627 -0
  195. package/lib/features/job-search/ContactsPanel.js.map +1 -0
  196. package/lib/features/job-search/InsightsPanel.js +299 -0
  197. package/lib/features/job-search/InsightsPanel.js.map +1 -0
  198. package/lib/features/job-search/InterviewPanel.js +637 -0
  199. package/lib/features/job-search/InterviewPanel.js.map +1 -0
  200. package/lib/features/job-search/JdPastePrompt.js +130 -0
  201. package/lib/features/job-search/JdPastePrompt.js.map +1 -0
  202. package/lib/features/job-search/JobCard.js +199 -0
  203. package/lib/features/job-search/JobCard.js.map +1 -0
  204. package/lib/features/job-search/JobDetailSheet.js +255 -0
  205. package/lib/features/job-search/JobDetailSheet.js.map +1 -0
  206. package/lib/features/job-search/JobSearchAgentChatPane.js +377 -0
  207. package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -0
  208. package/lib/features/job-search/JobSearchExperience.js +1324 -0
  209. package/lib/features/job-search/JobSearchExperience.js.map +1 -0
  210. package/lib/features/job-search/JobSearchLocationField.js +231 -0
  211. package/lib/features/job-search/JobSearchLocationField.js.map +1 -0
  212. package/lib/features/job-search/ProfilePanel.js +679 -0
  213. package/lib/features/job-search/ProfilePanel.js.map +1 -0
  214. package/lib/features/job-search/RepliesPanel.js +344 -0
  215. package/lib/features/job-search/RepliesPanel.js.map +1 -0
  216. package/lib/features/job-search/SavedPanel.js +297 -0
  217. package/lib/features/job-search/SavedPanel.js.map +1 -0
  218. package/lib/features/job-search/chat/widgetContent.js +29 -0
  219. package/lib/features/job-search/chat/widgetContent.js.map +1 -0
  220. package/lib/features/job-search/cvText.js +91 -0
  221. package/lib/features/job-search/cvText.js.map +1 -0
  222. package/lib/features/job-search/jobAgentSwipe.js +7 -0
  223. package/lib/features/job-search/jobAgentSwipe.js.map +1 -0
  224. package/lib/features/job-search/jobSearchClient.js +184 -0
  225. package/lib/features/job-search/jobSearchClient.js.map +1 -0
  226. package/lib/features/job-search/jobSearchExec.js +14 -0
  227. package/lib/features/job-search/jobSearchExec.js.map +1 -0
  228. package/lib/features/job-search/jobSearchRuntime.js +50 -0
  229. package/lib/features/job-search/jobSearchRuntime.js.map +1 -0
  230. package/lib/features/job-search/jobSearchTheme.js +44 -0
  231. package/lib/features/job-search/jobSearchTheme.js.map +1 -0
  232. package/lib/features/job-search/savedJobs.js +85 -0
  233. package/lib/features/job-search/savedJobs.js.map +1 -0
  234. package/lib/features/job-search/searchHistory.js +117 -0
  235. package/lib/features/job-search/searchHistory.js.map +1 -0
  236. package/lib/features/job-search/types.js +36 -0
  237. package/lib/features/job-search/types.js.map +1 -0
  238. package/lib/features/job-search/useJobSearchSession.js +558 -0
  239. package/lib/features/job-search/useJobSearchSession.js.map +1 -0
  240. package/lib/features/messaging/ChatComponents.js +529 -0
  241. package/lib/features/messaging/ChatComponents.js.map +1 -0
  242. package/lib/features/messaging/ChatInviteDeepLink.js +116 -0
  243. package/lib/features/messaging/ChatInviteDeepLink.js.map +1 -0
  244. package/lib/features/messaging/ContactsScreen.js +288 -0
  245. package/lib/features/messaging/ContactsScreen.js.map +1 -0
  246. package/lib/features/messaging/ConversationListScreen.js +147 -0
  247. package/lib/features/messaging/ConversationListScreen.js.map +1 -0
  248. package/lib/features/messaging/MessageActions.js +290 -0
  249. package/lib/features/messaging/MessageActions.js.map +1 -0
  250. package/lib/features/messaging/NativeChatExperience.js +189 -0
  251. package/lib/features/messaging/NativeChatExperience.js.map +1 -0
  252. package/lib/features/messaging/RegistrationScreen.js +11 -14
  253. package/lib/features/messaging/RegistrationScreen.js.map +1 -1
  254. package/lib/features/messaging/ThreadScreen.js +215 -0
  255. package/lib/features/messaging/ThreadScreen.js.map +1 -0
  256. package/lib/features/messaging/chatInviteLink.js +52 -0
  257. package/lib/features/messaging/chatInviteLink.js.map +1 -0
  258. package/lib/features/messaging/chatModel.js +278 -0
  259. package/lib/features/messaging/chatModel.js.map +1 -0
  260. package/lib/features/messaging/chatOperations.js +106 -1
  261. package/lib/features/messaging/chatOperations.js.map +1 -1
  262. package/lib/features/messaging/emojiCatalog.js +60 -0
  263. package/lib/features/messaging/emojiCatalog.js.map +1 -0
  264. package/lib/features/messaging/emojiKeywords.js +1592 -0
  265. package/lib/features/messaging/emojiKeywords.js.map +1 -0
  266. package/lib/features/messaging/nativeChatChannelQuery.js +27 -0
  267. package/lib/features/messaging/nativeChatChannelQuery.js.map +1 -0
  268. package/lib/features/messaging/phoneNumbers.js +52 -1
  269. package/lib/features/messaging/phoneNumbers.js.map +1 -1
  270. package/lib/features/messaging/sha256.js +68 -0
  271. package/lib/features/messaging/sha256.js.map +1 -0
  272. package/lib/features/messaging/useChatData.js +421 -0
  273. package/lib/features/messaging/useChatData.js.map +1 -0
  274. package/lib/features/messaging/useContactMatches.js +191 -0
  275. package/lib/features/messaging/useContactMatches.js.map +1 -0
  276. package/lib/features/messaging/usePhoneVerification.js +12 -12
  277. package/lib/features/messaging/usePhoneVerification.js.map +1 -1
  278. package/lib/features/messaging/yantraChatOrg.js +8 -3
  279. package/lib/features/messaging/yantraChatOrg.js.map +1 -1
  280. package/lib/features/resume/AnnotateModal.js +100 -0
  281. package/lib/features/resume/AnnotateModal.js.map +1 -0
  282. package/lib/features/resume/AnnotationBar.js +69 -0
  283. package/lib/features/resume/AnnotationBar.js.map +1 -0
  284. package/lib/features/resume/ExportSheet.js +105 -0
  285. package/lib/features/resume/ExportSheet.js.map +1 -0
  286. package/lib/features/resume/ResumeAgentChatPane.js +95 -0
  287. package/lib/features/resume/ResumeAgentChatPane.js.map +1 -0
  288. package/lib/features/resume/ResumeEditor.js +676 -0
  289. package/lib/features/resume/ResumeEditor.js.map +1 -0
  290. package/lib/features/resume/ResumeExperience.js +235 -0
  291. package/lib/features/resume/ResumeExperience.js.map +1 -0
  292. package/lib/features/resume/ResumeListPanel.js +262 -0
  293. package/lib/features/resume/ResumeListPanel.js.map +1 -0
  294. package/lib/features/resume/ResumeToolbar.js +236 -0
  295. package/lib/features/resume/ResumeToolbar.js.map +1 -0
  296. package/lib/features/resume/annotations.js +17 -0
  297. package/lib/features/resume/annotations.js.map +1 -0
  298. package/lib/features/resume/documentCss.js +52 -0
  299. package/lib/features/resume/documentCss.js.map +1 -0
  300. package/lib/features/resume/draft.js +89 -0
  301. package/lib/features/resume/draft.js.map +1 -0
  302. package/lib/features/resume/exportResume.js +43 -0
  303. package/lib/features/resume/exportResume.js.map +1 -0
  304. package/lib/features/resume/pickResumePhoto.js +22 -0
  305. package/lib/features/resume/pickResumePhoto.js.map +1 -0
  306. package/lib/features/resume/renderResume.js +121 -0
  307. package/lib/features/resume/renderResume.js.map +1 -0
  308. package/lib/features/resume/resumeClient.js +69 -0
  309. package/lib/features/resume/resumeClient.js.map +1 -0
  310. package/lib/features/resume/resumeExec.js +14 -0
  311. package/lib/features/resume/resumeExec.js.map +1 -0
  312. package/lib/features/resume/resumeIndex.js +244 -0
  313. package/lib/features/resume/resumeIndex.js.map +1 -0
  314. package/lib/features/resume/resumeRuntime.js +50 -0
  315. package/lib/features/resume/resumeRuntime.js.map +1 -0
  316. package/lib/features/resume/resumeTheme.js +34 -0
  317. package/lib/features/resume/resumeTheme.js.map +1 -0
  318. package/lib/features/resume/resumeToolbox.js +49 -0
  319. package/lib/features/resume/resumeToolbox.js.map +1 -0
  320. package/lib/features/resume/templates.js +90 -0
  321. package/lib/features/resume/templates.js.map +1 -0
  322. package/lib/features/resume/types.js +10 -0
  323. package/lib/features/resume/types.js.map +1 -0
  324. package/lib/features/resume/useResumeSession.js +183 -0
  325. package/lib/features/resume/useResumeSession.js.map +1 -0
  326. package/lib/features/shopping/DealsPanel.js +254 -0
  327. package/lib/features/shopping/DealsPanel.js.map +1 -0
  328. package/lib/features/shopping/HistoryPanel.js +147 -0
  329. package/lib/features/shopping/HistoryPanel.js.map +1 -0
  330. package/lib/features/shopping/OrdersPanel.js +157 -0
  331. package/lib/features/shopping/OrdersPanel.js.map +1 -0
  332. package/lib/features/shopping/ProductCard.js +326 -0
  333. package/lib/features/shopping/ProductCard.js.map +1 -0
  334. package/lib/features/shopping/ProductDetailSheet.js +313 -0
  335. package/lib/features/shopping/ProductDetailSheet.js.map +1 -0
  336. package/lib/features/shopping/ProductFilterBar.js +153 -0
  337. package/lib/features/shopping/ProductFilterBar.js.map +1 -0
  338. package/lib/features/shopping/ProductPhoto.js +27 -0
  339. package/lib/features/shopping/ProductPhoto.js.map +1 -0
  340. package/lib/features/shopping/SavedPanel.js +139 -0
  341. package/lib/features/shopping/SavedPanel.js.map +1 -0
  342. package/lib/features/shopping/ShoppingAgentChatPane.js +436 -0
  343. package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -0
  344. package/lib/features/shopping/ShoppingExperience.js +888 -0
  345. package/lib/features/shopping/ShoppingExperience.js.map +1 -0
  346. package/lib/features/shopping/TrendingSections.js +199 -0
  347. package/lib/features/shopping/TrendingSections.js.map +1 -0
  348. package/lib/features/shopping/WatchlistPanel.js +148 -0
  349. package/lib/features/shopping/WatchlistPanel.js.map +1 -0
  350. package/lib/features/shopping/catalog.js +238 -0
  351. package/lib/features/shopping/catalog.js.map +1 -0
  352. package/lib/features/shopping/chat/ShoppingChatResultCard.js +175 -0
  353. package/lib/features/shopping/chat/ShoppingChatResultCard.js.map +1 -0
  354. package/lib/features/shopping/chat/streamAssistantReply.js +34 -0
  355. package/lib/features/shopping/chat/streamAssistantReply.js.map +1 -0
  356. package/lib/features/shopping/chat/widgetContent.js +233 -0
  357. package/lib/features/shopping/chat/widgetContent.js.map +1 -0
  358. package/lib/features/shopping/hooks/useTrendingProducts.js +162 -0
  359. package/lib/features/shopping/hooks/useTrendingProducts.js.map +1 -0
  360. package/lib/features/shopping/productImage.js +42 -0
  361. package/lib/features/shopping/productImage.js.map +1 -0
  362. package/lib/features/shopping/savedProducts.js +84 -0
  363. package/lib/features/shopping/savedProducts.js.map +1 -0
  364. package/lib/features/shopping/services/catalogActions.js +166 -0
  365. package/lib/features/shopping/services/catalogActions.js.map +1 -0
  366. package/lib/features/shopping/services/parsePriceCheckIntent.js +58 -0
  367. package/lib/features/shopping/services/parsePriceCheckIntent.js.map +1 -0
  368. package/lib/features/shopping/services/parseShoppingIntent.js +67 -0
  369. package/lib/features/shopping/services/parseShoppingIntent.js.map +1 -0
  370. package/lib/features/shopping/services/productAvailability.js +25 -0
  371. package/lib/features/shopping/services/productAvailability.js.map +1 -0
  372. package/lib/features/shopping/services/productFilters.js +72 -0
  373. package/lib/features/shopping/services/productFilters.js.map +1 -0
  374. package/lib/features/shopping/services/retailerUrl.js +75 -0
  375. package/lib/features/shopping/services/retailerUrl.js.map +1 -0
  376. package/lib/features/shopping/services/shoppingChatReply.js +46 -0
  377. package/lib/features/shopping/services/shoppingChatReply.js.map +1 -0
  378. package/lib/features/shopping/services/shoppingProductSearch.js +336 -0
  379. package/lib/features/shopping/services/shoppingProductSearch.js.map +1 -0
  380. package/lib/features/shopping/services/shoppingSearchConnectorClient.js +41 -0
  381. package/lib/features/shopping/services/shoppingSearchConnectorClient.js.map +1 -0
  382. package/lib/features/shopping/shopAgentSwipe.js +7 -0
  383. package/lib/features/shopping/shopAgentSwipe.js.map +1 -0
  384. package/lib/features/shopping/shoppingCart.js +116 -0
  385. package/lib/features/shopping/shoppingCart.js.map +1 -0
  386. package/lib/features/shopping/shoppingExec.js +14 -0
  387. package/lib/features/shopping/shoppingExec.js.map +1 -0
  388. package/lib/features/shopping/shoppingHistoryStore.js +176 -0
  389. package/lib/features/shopping/shoppingHistoryStore.js.map +1 -0
  390. package/lib/features/shopping/shoppingRuntime.js +63 -0
  391. package/lib/features/shopping/shoppingRuntime.js.map +1 -0
  392. package/lib/features/shopping/timeAgo.js +14 -0
  393. package/lib/features/shopping/timeAgo.js.map +1 -0
  394. package/lib/features/shopping/useShoppingSearch.js +262 -0
  395. package/lib/features/shopping/useShoppingSearch.js.map +1 -0
  396. package/lib/features/travel/BookHeaderGlow.js +48 -0
  397. package/lib/features/travel/BookHeaderGlow.js.map +1 -0
  398. package/lib/features/travel/BookingsPanel.js +29 -0
  399. package/lib/features/travel/BookingsPanel.js.map +1 -0
  400. package/lib/features/travel/DiscoverPanel.js +155 -0
  401. package/lib/features/travel/DiscoverPanel.js.map +1 -0
  402. package/lib/features/travel/FlightCompareBar.js +86 -0
  403. package/lib/features/travel/FlightCompareBar.js.map +1 -0
  404. package/lib/features/travel/FlightDealsBoard.js +100 -0
  405. package/lib/features/travel/FlightDealsBoard.js.map +1 -0
  406. package/lib/features/travel/HistoryPanel.js +82 -0
  407. package/lib/features/travel/HistoryPanel.js.map +1 -0
  408. package/lib/features/travel/PopularDestinations.js +144 -0
  409. package/lib/features/travel/PopularDestinations.js.map +1 -0
  410. package/lib/features/travel/SavedPanel.js +27 -0
  411. package/lib/features/travel/SavedPanel.js.map +1 -0
  412. package/lib/features/travel/TravelAgentChatPane.js +303 -0
  413. package/lib/features/travel/TravelAgentChatPane.js.map +1 -0
  414. package/lib/features/travel/TravelBookHero.js +425 -0
  415. package/lib/features/travel/TravelBookHero.js.map +1 -0
  416. package/lib/features/travel/TravelDatesField.js +234 -0
  417. package/lib/features/travel/TravelDatesField.js.map +1 -0
  418. package/lib/features/travel/TravelDetailSheet.js +106 -0
  419. package/lib/features/travel/TravelDetailSheet.js.map +1 -0
  420. package/lib/features/travel/TravelExperience.js +624 -0
  421. package/lib/features/travel/TravelExperience.js.map +1 -0
  422. package/lib/features/travel/TravelGuestsField.js +85 -0
  423. package/lib/features/travel/TravelGuestsField.js.map +1 -0
  424. package/lib/features/travel/TravelLanding.js +318 -0
  425. package/lib/features/travel/TravelLanding.js.map +1 -0
  426. package/lib/features/travel/TravelLocationField.js +179 -0
  427. package/lib/features/travel/TravelLocationField.js.map +1 -0
  428. package/lib/features/travel/TravelPropertyCard.js +266 -0
  429. package/lib/features/travel/TravelPropertyCard.js.map +1 -0
  430. package/lib/features/travel/TravelPropertyPhoto.js +22 -0
  431. package/lib/features/travel/TravelPropertyPhoto.js.map +1 -0
  432. package/lib/features/travel/TravelRailFlyout.js +79 -0
  433. package/lib/features/travel/TravelRailFlyout.js.map +1 -0
  434. package/lib/features/travel/TravelResultsMap.js +126 -0
  435. package/lib/features/travel/TravelResultsMap.js.map +1 -0
  436. package/lib/features/travel/WorkspacePanel.js +148 -0
  437. package/lib/features/travel/WorkspacePanel.js.map +1 -0
  438. package/lib/features/travel/appNav.js +244 -0
  439. package/lib/features/travel/appNav.js.map +1 -0
  440. package/lib/features/travel/calendarDays.js +50 -0
  441. package/lib/features/travel/calendarDays.js.map +1 -0
  442. package/lib/features/travel/catalog.js +72 -0
  443. package/lib/features/travel/catalog.js.map +1 -0
  444. package/lib/features/travel/chat/TravelChatResultCard.js +107 -0
  445. package/lib/features/travel/chat/TravelChatResultCard.js.map +1 -0
  446. package/lib/features/travel/chat/widgetContent.js +107 -0
  447. package/lib/features/travel/chat/widgetContent.js.map +1 -0
  448. package/lib/features/travel/flightDeals.js +65 -0
  449. package/lib/features/travel/flightDeals.js.map +1 -0
  450. package/lib/features/travel/mapCoordinates.js +36 -0
  451. package/lib/features/travel/mapCoordinates.js.map +1 -0
  452. package/lib/features/travel/parseTravelIntent.js +303 -0
  453. package/lib/features/travel/parseTravelIntent.js.map +1 -0
  454. package/lib/features/travel/savedStays.js +66 -0
  455. package/lib/features/travel/savedStays.js.map +1 -0
  456. package/lib/features/travel/services/flightDealsBoard.js +111 -0
  457. package/lib/features/travel/services/flightDealsBoard.js.map +1 -0
  458. package/lib/features/travel/services/flightSearchConnectorClient.js +42 -0
  459. package/lib/features/travel/services/flightSearchConnectorClient.js.map +1 -0
  460. package/lib/features/travel/services/geocodeLocation.js +79 -0
  461. package/lib/features/travel/services/geocodeLocation.js.map +1 -0
  462. package/lib/features/travel/services/placePredictions.js +113 -0
  463. package/lib/features/travel/services/placePredictions.js.map +1 -0
  464. package/lib/features/travel/services/resolveOriginCity.js +27 -0
  465. package/lib/features/travel/services/resolveOriginCity.js.map +1 -0
  466. package/lib/features/travel/services/resortifiConnectorClient.js +76 -0
  467. package/lib/features/travel/services/resortifiConnectorClient.js.map +1 -0
  468. package/lib/features/travel/services/travelFlightSearch.js +289 -0
  469. package/lib/features/travel/services/travelFlightSearch.js.map +1 -0
  470. package/lib/features/travel/services/travelPropertySearch.js +377 -0
  471. package/lib/features/travel/services/travelPropertySearch.js.map +1 -0
  472. package/lib/features/travel/travelAgentSwipe.js +7 -0
  473. package/lib/features/travel/travelAgentSwipe.js.map +1 -0
  474. package/lib/features/travel/travelExec.js +14 -0
  475. package/lib/features/travel/travelExec.js.map +1 -0
  476. package/lib/features/travel/travelHistoryStore.js +108 -0
  477. package/lib/features/travel/travelHistoryStore.js.map +1 -0
  478. package/lib/features/travel/travelRuntime.js +62 -0
  479. package/lib/features/travel/travelRuntime.js.map +1 -0
  480. package/lib/features/travel/types.js +9 -0
  481. package/lib/features/travel/types.js.map +1 -0
  482. package/lib/features/travel/useTravelSearch.js +330 -0
  483. package/lib/features/travel/useTravelSearch.js.map +1 -0
  484. package/lib/features/travel/workspaceContent.js +548 -0
  485. package/lib/features/travel/workspaceContent.js.map +1 -0
  486. package/lib/hooks/useCdecliChannel.js +128 -6
  487. package/lib/hooks/useCdecliChannel.js.map +1 -1
  488. package/lib/hooks/useChatApi.js +4 -2
  489. package/lib/hooks/useChatApi.js.map +1 -1
  490. package/lib/hooks/useChatStream.js +77 -63
  491. package/lib/hooks/useChatStream.js.map +1 -1
  492. package/lib/hooks/useHostConnectorCard.js +24 -0
  493. package/lib/hooks/useHostConnectorCard.js.map +1 -0
  494. package/lib/hooks/useObtainSystemToken.js +23 -5
  495. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  496. package/lib/hooks/webViewRetentionPolicy.js +1 -0
  497. package/lib/hooks/webViewRetentionPolicy.js.map +1 -1
  498. package/lib/index.js +1 -1
  499. package/lib/index.js.map +1 -1
  500. package/lib/screens/Chat/index.js +51 -22
  501. package/lib/screens/Chat/index.js.map +1 -1
  502. package/lib/screens/ChatNative/index.js +13 -2
  503. package/lib/screens/ChatNative/index.js.map +1 -1
  504. package/lib/screens/Home/HomeScreen.js +3 -3
  505. package/lib/screens/Home/HomeScreen.js.map +1 -1
  506. package/lib/screens/Home/components/ChatHistoryLanding.js +32 -32
  507. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  508. package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
  509. package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
  510. package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
  511. package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
  512. package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
  513. package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
  514. package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
  515. package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
  516. package/lib/screens/WebBuilder/WebViewWithNavigation.js +2 -2
  517. package/lib/screens/WebBuilder/WebViewWithNavigation.js.map +1 -1
  518. package/lib/services/brainQuickReply.js +38 -1
  519. package/lib/services/brainQuickReply.js.map +1 -1
  520. package/lib/state/chatThreadMerge.js +6 -1
  521. package/lib/state/chatThreadMerge.js.map +1 -1
  522. package/package.json +6 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emojiKeywords.js","sources":["../../../src/features/messaging/emojiKeywords.ts"],"sourcesContent":["/**\n * Emoji search index for the Tapback picker: one emoji per line, then its words.\n * GENERATED by tools/gen-emoji-keywords.mjs from emojilib - do not edit by hand.\n */\n// prettier-ignore\nexport const EMOJI_KEYWORDS_SOURCE = `\n😀 grinning face smile happy joy grin\n😃 smiley face happy joy haha smile funny\n😄 smile face happy joy funny haha laugh like\n😁 grin face happy smile joy kawaii\n😆 laughing happy joy lol satisfied haha face glad xd laugh\n😅 sweat smile face hot happy laugh relief\n😂 joy face cry tears weep happy happytears haha\n🤣 rofl face rolling floor laughing lol haha\n☺️ relaxed face blush massage happiness\n😊 blush face smile happy flushed crush embarrassed shy joy\n😇 innocent face angel heaven halo\n🙂 slightly smiling face smile\n🙃 upside down face flipped silly smile\n😉 wink face happy mischievous secret smile eye\n😌 relieved face relaxed phew massage happiness\n😍 heart eyes face love like affection valentines infatuation crush\n🥰 smiling face with three hearts love like affection valentines infatuation crush adore\n😘 kissing heart face love like affection valentines infatuation kiss\n😗 kissing love like face 3 valentines infatuation kiss\n😙 kissing smiling eyes face affection valentines infatuation kiss\n😚 kissing closed eyes face love like affection valentines infatuation kiss\n😋 yum happy joy tongue smile face silly yummy nom delicious savouring\n😛 stuck out tongue face prank childish playful mischievous smile\n😝 stuck out tongue closed eyes face prank playful mischievous smile\n😜 stuck out tongue winking eye face prank childish playful mischievous smile wink\n🤪 zany face goofy crazy\n🤨 raised eyebrow face distrust scepticism disapproval disbelief surprise\n🧐 monocle face stuffy wealthy\n🤓 nerd face nerdy geek dork\n😎 sunglasses face cool smile summer beach sunglass\n🤩 star struck face smile starry eyes grinning\n🥳 partying face celebration woohoo\n😏 smirk face smile mean prank smug sarcasm\n😒 unamused indifference bored serious sarcasm unimpressed skeptical dubious\n😞 disappointed face sad upset depressed\n😔 pensive face sad depressed upset\n😟 worried face concern nervous\n😕 confused face indifference huh weird hmmm\n🙁 slightly frowning face disappointed sad upset\n☹ frowning face sad upset frown\n😣 persevere face sick no upset oops\n😖 confounded face confused sick unwell oops\n😫 tired face sick whine upset frustrated\n😩 weary face tired sleepy sad frustrated upset\n🥺 pleading face begging mercy\n😢 cry face tears sad depressed upset\n😭 sob face cry tears sad upset depressed\n😤 triumph face gas phew proud pride\n😠 angry mad face annoyed frustrated\n😡 rage angry mad hate despise\n🤬 symbols over mouth face swearing cursing cussing profanity expletive\n🤯 exploding head face shocked mind blown\n😳 flushed face blush shy flattered\n🥵 hot face feverish heat red sweating\n🥶 cold face blue freezing frozen frostbite icicles\n😱 scream face munch scared omg\n😨 fearful face scared terrified nervous oops huh\n😰 cold sweat face nervous\n😥 disappointed relieved face phew sweat nervous\n😓 sweat face hot sad tired exercise\n🤗 hugs face smile hug\n🤔 thinking face hmmm think consider\n🤭 hand over mouth face whoops shock surprise\n🤫 shushing face quiet shhh\n🤥 lying face lie pinocchio\n😶 no mouth face hellokitty\n😐 neutral face indifference meh\n😑 expressionless face indifferent meh deadpan\n😬 grimacing face grimace teeth\n🙄 roll eyes face eyeroll frustrated\n😯 hushed face woo shh\n😦 frowning face aw what\n😧 anguished face stunned nervous\n😮 open mouth face surprise impressed wow whoa\n😲 astonished face xox surprised poisoned\n😴 sleeping face tired sleepy night zzz\n🤤 drooling face\n😪 sleepy face tired rest nap\n😵 dizzy face spent unconscious xox\n🤐 zipper mouth face sealed secret\n🥴 woozy face dizzy intoxicated tipsy wavy\n🤢 nauseated face vomit gross green sick ill\n🤮 vomiting face sick\n🤧 sneezing face gesundheit sneeze sick allergy\n😷 mask face sick ill disease\n🤒 face with thermometer sick temperature cold fever\n🤕 face with head bandage injured clumsy hurt\n🤑 money mouth face rich dollar\n🤠 cowboy hat face cowgirl\n😈 smiling imp devil horns\n👿 imp devil angry horns\n👹 japanese ogre monster red mask halloween scary creepy devil demon\n👺 japanese goblin red evil mask monster scary creepy\n🤡 clown face\n💩 poop hankey shitface fail turd shit\n👻 ghost halloween spooky scary\n💀 skull dead skeleton creepy death\n☠ skull and crossbones poison danger deadly scary death pirate evil\n👽 alien ufo paul weird\n👾 space invader game arcade play\n🤖 robot computer machine bot\n🎃 jack o lantern halloween light pumpkin creepy fall\n😺 smiley cat animal cats happy smile\n😸 smile cat animal cats\n😹 joy cat animal cats haha happy tears\n😻 heart eyes cat animal love like affection cats valentines\n😼 smirk cat animal cats\n😽 kissing cat animal cats kiss\n🙀 scream cat animal cats munch scared\n😿 crying cat face animal tears weep sad cats upset cry\n😾 pouting cat animal cats\n🤲 palms up hands gesture cupped prayer\n👐 open hands fingers butterfly\n🙌 raised hands gesture hooray yea celebration\n👏 clap hands praise applause congrats yay\n🤝 handshake agreement shake\n👍 thumbsup yes awesome good agree accept cool hand like\n👎 1 thumbsdown no dislike hand\n👊 facepunch angry violence fist hit attack hand\n✊ fist fingers hand grasp\n🤛 fist left hand fistbump\n🤜 fist right hand fistbump\n🤞 crossed fingers good lucky\n✌ v fingers ohyeah hand peace victory two\n🤟 love you hand fingers gesture\n🤘 metal hand fingers\n👌 ok hand fingers limbs perfect okay\n👈 point left direction fingers hand\n👉 point right fingers hand direction\n☝ point up hand fingers direction\n👇 point down fingers hand direction\n👆 point up 2 fingers hand direction\n✋ raised hand fingers stop highfive palm ban\n🤚 raised back of hand fingers backhand\n🖐 raised hand with fingers splayed palm\n🖖 vulcan salute hand fingers spock\n👋 wave hands gesture goodbye solong farewell hello hi palm\n🤙 call me hand hands gesture\n💪 muscle arm flex hand summer strong biceps\n🖕 fu hand fingers rude middle flipping\n✍ writing hand stationery write compose\n🙏 pray please hope wish namaste highfive\n🦶 foot kick stomp\n🦵 leg kick limb\n💍 ring wedding propose marriage valentines diamond fashion jewelry gem engagement\n💄 lipstick female girl fashion woman\n💋 kiss face lips love like affection valentines\n👄 lips mouth kiss\n🦷 tooth teeth dentist\n👅 tongue mouth playful\n👂 ear face hear sound listen\n👃 nose smell sniff\n👣 footprints feet tracking walking beach\n👁 eye face look see watch stare\n👀 eyes look watch stalk peek see\n🧠 brain smart intelligent\n🗣 speaking head user person human sing say talk\n👤 bust in silhouette user person human\n👥 busts in silhouette user person human group team\n👶 baby child boy girl toddler\n👧 girl female woman teenager\n🧒 child young\n👦 boy man male guy teenager\n👩 woman female girls lady\n🧑 adult person\n👨 man mustache father dad guy classy sir moustache\n👱‍♀️ blonde woman female girl person\n👱 blonde man male boy guy person\n🧔 bearded person bewhiskered\n👵 older woman human female women lady old elder senior\n🧓 older adult human elder senior\n👴 older man human male men old elder senior\n👲 man with gua pi mao male boy chinese\n🧕 woman with headscarf female hijab mantilla tichel\n👳‍♀️ woman with turban female indian hinduism arabs\n👳 man with turban male indian hinduism arabs\n👮‍♀️ policewoman woman police law legal enforcement arrest 911 female\n👮 policeman man police law legal enforcement arrest 911\n👷‍♀️ construction worker woman female human wip build labor\n👷 construction worker man male human wip guy build labor\n💂‍♀️ guardswoman uk gb british female royal woman\n💂 guardsman uk gb british male guy royal\n🕵️‍♀️ female detective human spy woman\n🕵 male detective human spy\n👩‍⚕️ woman health worker doctor nurse therapist healthcare human\n👨‍⚕️ man health worker doctor nurse therapist healthcare human\n👩‍🌾 woman farmer rancher gardener human\n👨‍🌾 man farmer rancher gardener human\n👩‍🍳 woman cook chef human\n👨‍🍳 man cook chef human\n👩‍🎓 woman student graduate human\n👨‍🎓 man student graduate human\n👩‍🎤 woman singer rockstar entertainer human\n👨‍🎤 man singer rockstar entertainer human\n👩‍🏫 woman teacher instructor professor human\n👨‍🏫 man teacher instructor professor human\n👩‍🏭 woman factory worker assembly industrial human\n👨‍🏭 man factory worker assembly industrial human\n👩‍💻 woman technologist coder developer engineer programmer software human laptop computer\n👨‍💻 man technologist coder developer engineer programmer software human laptop computer\n👩‍💼 woman office worker business manager human\n👨‍💼 man office worker business manager human\n👩‍🔧 woman mechanic plumber human wrench\n👨‍🔧 man mechanic plumber human wrench\n👩‍🔬 woman scientist biologist chemist engineer physicist human\n👨‍🔬 man scientist biologist chemist engineer physicist human\n👩‍🎨 woman artist painter human\n👨‍🎨 man artist painter human\n👩‍🚒 woman firefighter fireman human\n👨‍🚒 man firefighter fireman human\n👩‍✈️ woman pilot aviator plane human\n👨‍✈️ man pilot aviator plane human\n👩‍🚀 woman astronaut space rocket human\n👨‍🚀 man astronaut space rocket human\n👩‍⚖️ woman judge justice court human\n👨‍⚖️ man judge justice court human\n👰 bride with veil couple marriage wedding woman\n🤵 man in tuxedo couple marriage wedding groom\n👸 princess girl woman female blond crown royal queen\n🤴 prince boy man male crown royal king\n🦸‍♀️ woman superhero female good heroine superpowers\n🦸‍♂️ man superhero male good hero superpowers\n🦹‍♀️ woman supervillain female evil bad criminal heroine superpowers\n🦹‍♂️ man supervillain male evil bad criminal hero superpowers\n🤶 mrs claus woman female xmas\n🎅 santa festival man male xmas\n🧙‍♀️ sorceress woman female mage witch\n🧙‍♂️ wizard man male mage sorcerer\n🧝‍♀️ woman elf female\n🧝‍♂️ man elf male\n🧛‍♀️ woman vampire female\n🧛‍♂️ man vampire male dracula\n🧟‍♀️ woman zombie female undead\n🧟‍♂️ man zombie male dracula undead\n🧞‍♀️ woman genie female\n🧞‍♂️ man genie male\n🧜‍♀️ mermaid woman female merwoman ariel\n🧜‍♂️ merman man male triton\n🧚‍♀️ woman fairy female\n🧚‍♂️ man fairy male\n👼 angel heaven wings halo\n🤰 pregnant woman baby\n🤱 breastfeeding nursing baby\n🙇‍♀️ bowing woman female girl\n🙇 bowing man male boy\n💁 tipping hand woman female girl human information\n💁‍♂️ tipping hand man male boy human information\n🙅 no good woman female girl nope\n🙅‍♂️ no good man male boy nope\n🙆 ok woman women girl female pink human\n🙆‍♂️ ok man men boy male blue human\n🙋 raising hand woman female girl\n🙋‍♂️ raising hand man male boy\n🤦‍♀️ woman facepalming female girl disbelief\n🤦‍♂️ man facepalming male boy disbelief\n🤷 woman shrugging female girl confused indifferent doubt\n🤷‍♂️ man shrugging male boy confused indifferent doubt\n🙎 pouting woman female girl\n🙎‍♂️ pouting man male boy\n🙍 frowning woman female girl sad depressed discouraged unhappy\n🙍‍♂️ frowning man male boy sad depressed discouraged unhappy\n💇 haircut woman female girl\n💇‍♂️ haircut man male boy\n💆 massage woman female girl head\n💆‍♂️ massage man male boy head\n🧖‍♀️ woman in steamy room female spa steamroom sauna\n🧖‍♂️ man in steamy room male spa steamroom sauna\n💅 nail care beauty manicure finger fashion\n🤳 selfie camera phone\n💃 dancer female girl woman fun\n🕺 man dancing male boy fun dancer\n👯 dancing women female bunny girls\n👯‍♂️ dancing men male bunny boys\n🕴 business suit levitating levitate hover jump\n🚶‍♀️ walking woman human feet steps female\n🚶 walking man human feet steps\n🏃‍♀️ running woman walking exercise race female\n🏃 running man walking exercise race\n👫 couple pair people human love date dating like affection valentines marriage\n👭 two women holding hands pair friendship couple love like female people human\n👬 two men holding hands pair couple love like bromance friendship people human\n💑 couple with heart woman man pair love like affection human dating valentines marriage\n👩‍❤️‍👩 couple with heart woman pair love like affection human dating valentines marriage\n👨‍❤️‍👨 couple with heart man pair love like affection human dating valentines marriage\n💏 couplekiss man woman pair valentines love like dating marriage\n👩‍❤️‍💋‍👩 couplekiss woman pair valentines love like dating marriage\n👨‍❤️‍💋‍👨 couplekiss man pair valentines love like dating marriage\n👪 family man woman boy home parents child mom dad father mother people human\n👨‍👩‍👧 family man woman girl home parents people human child\n👨‍👩‍👧‍👦 family man woman girl boy home parents people human children\n👨‍👩‍👦‍👦 family man woman boy home parents people human children\n👨‍👩‍👧‍👧 family man woman girl home parents people human children\n👩‍👩‍👦 family woman boy home parents people human children\n👩‍👩‍👧 family woman girl home parents people human children\n👩‍👩‍👧‍👦 family woman girl boy home parents people human children\n👩‍👩‍👦‍👦 family woman boy home parents people human children\n👩‍👩‍👧‍👧 family woman girl home parents people human children\n👨‍👨‍👦 family man boy home parents people human children\n👨‍👨‍👧 family man girl home parents people human children\n👨‍👨‍👧‍👦 family man girl boy home parents people human children\n👨‍👨‍👦‍👦 family man boy home parents people human children\n👨‍👨‍👧‍👧 family man girl home parents people human children\n👩‍👦 family woman boy home parent people human child\n👩‍👧 family woman girl home parent people human child\n👩‍👧‍👦 family woman girl boy home parent people human children\n👩‍👦‍👦 family woman boy home parent people human children\n👩‍👧‍👧 family woman girl home parent people human children\n👨‍👦 family man boy home parent people human child\n👨‍👧 family man girl home parent people human child\n👨‍👧‍👦 family man girl boy home parent people human children\n👨‍👦‍👦 family man boy home parent people human children\n👨‍👧‍👧 family man girl home parent people human children\n🧶 yarn ball crochet knit\n🧵 thread needle sewing spool string\n🧥 coat jacket\n🥼 labcoat doctor experiment scientist chemist\n👚 womans clothes fashion female\n👕 tshirt fashion cloth casual shirt tee\n👖 jeans fashion shopping\n👔 necktie shirt suitup formal fashion cloth business\n👗 dress clothes fashion shopping\n👙 bikini swimming female woman girl fashion beach summer\n👘 kimono dress fashion women female japanese\n🥿 flat shoe ballet slipper\n👠 high heel fashion shoes female pumps stiletto\n👡 sandal shoes fashion\n👢 boot shoes fashion\n👞 mans shoe fashion male\n👟 athletic shoe shoes sports sneakers\n🥾 hiking boot backpacking camping\n🧦 socks stockings clothes\n🧤 gloves hands winter clothes\n🧣 scarf neck winter clothes\n🎩 tophat magic gentleman classy circus\n🧢 billed hat cap baseball\n👒 womans hat fashion accessories female lady spring\n🎓 mortar board school college degree university graduation cap hat legal learn education\n⛑ rescue worker helmet construction build\n👑 crown king kod leader royalty lord\n👝 pouch bag accessories shopping\n👛 purse fashion accessories money sales shopping\n👜 handbag fashion accessory accessories shopping\n💼 briefcase business documents work law legal job career\n🎒 school satchel student education bag backpack\n🧳 luggage packing travel\n👓 eyeglasses fashion accessories eyesight nerdy dork geek\n🕶 dark sunglasses face cool accessories\n🥽 goggles eyes protection safety\n🌂 closed umbrella weather rain drizzle\n🐶 dog animal friend nature woof puppy pet faithful\n🐱 cat animal meow nature pet kitten\n🐭 mouse animal nature rodent\n🐹 hamster animal nature\n🐰 rabbit animal nature pet spring magic bunny\n🦊 fox face animal nature\n🐻 bear animal nature wild\n🐼 panda face animal nature\n🐨 koala animal nature\n🐯 tiger animal cat danger wild nature roar\n🦁 lion animal nature\n🐮 cow beef ox animal nature moo milk\n🐷 pig animal oink nature\n🐽 pig nose animal oink\n🐸 frog animal nature croak toad\n🐵 monkey face animal nature circus\n🙈 see no evil monkey animal nature haha\n🙉 hear no evil animal monkey nature\n🙊 speak no evil monkey animal nature omg\n🐒 monkey animal nature banana circus\n🐔 chicken animal cluck nature bird\n🐧 penguin animal nature\n🐦 bird animal nature fly tweet spring\n🐤 baby chick animal chicken bird\n🐣 hatching chick animal chicken egg born baby bird\n🐥 hatched chick animal chicken baby bird\n🦆 duck animal nature bird mallard\n🦅 eagle animal nature bird\n🦉 owl animal nature bird hoot\n🦇 bat animal nature blind vampire\n🐺 wolf animal nature wild\n🐗 boar animal nature\n🐴 horse animal brown nature\n🦄 unicorn animal nature mystical\n🐝 honeybee animal insect nature bug spring honey\n🐛 bug animal insect nature worm\n🦋 butterfly animal insect nature caterpillar\n🐌 snail slow animal shell\n🐚 shell nature sea beach\n🐞 beetle animal insect nature ladybug\n🐜 ant animal insect nature bug\n🦟 mosquito animal nature insect malaria\n🦗 grasshopper animal cricket chirp\n🕷 spider animal arachnid\n🕸 spider web animal insect arachnid silk\n🦂 scorpion animal arachnid\n🐢 turtle animal slow nature tortoise\n🐍 snake animal evil nature hiss python\n🦎 lizard animal nature reptile\n🦖 t rex animal nature dinosaur tyrannosaurus extinct\n🦕 sauropod animal nature dinosaur brachiosaurus brontosaurus diplodocus extinct\n🐙 octopus animal creature ocean sea nature beach\n🦑 squid animal nature ocean sea\n🦐 shrimp animal ocean nature seafood\n🦞 lobster animal nature bisque claws seafood\n🦀 crab animal crustacean\n🐡 blowfish animal nature food sea ocean\n🐠 tropical fish animal swim ocean beach nemo\n🐟 fish animal food nature\n🐬 dolphin animal nature fish sea ocean flipper fins beach\n🐳 whale animal nature sea ocean\n🐋 whale2 animal nature sea ocean\n🦈 shark animal nature fish sea ocean jaws fins beach\n🐊 crocodile animal nature reptile lizard alligator\n🐅 tiger2 animal nature roar\n🐆 leopard animal nature\n🦓 zebra animal nature stripes safari\n🦍 gorilla animal nature circus\n🐘 elephant animal nature nose th circus\n🦛 hippopotamus animal nature\n🦏 rhinoceros animal nature horn\n🐪 dromedary camel animal hot desert hump\n🦒 giraffe animal nature spots safari\n🦘 kangaroo animal nature australia joey hop marsupial\n🐫 camel animal nature hot desert hump\n🐃 water buffalo animal nature ox cow\n🐂 ox animal cow beef\n🐄 cow2 beef ox animal nature moo milk\n🐎 racehorse animal gamble luck\n🐖 pig2 animal nature\n🐏 ram animal sheep nature\n🐑 sheep animal nature wool shipit\n🦙 llama animal nature alpaca\n🐐 goat animal nature\n🦌 deer animal nature horns venison\n🐕 dog2 animal nature friend doge pet faithful\n🐩 poodle dog animal 101 nature pet\n🐈 cat2 animal meow pet cats\n🐓 rooster animal nature chicken\n🦃 turkey animal bird\n🦚 peacock animal nature peahen bird\n🦜 parrot animal nature bird pirate talk\n🦢 swan animal nature bird\n🕊 dove animal bird\n🐇 rabbit2 animal nature pet magic spring\n🦝 raccoon animal nature\n🦡 badger animal nature honey\n🐀 rat animal mouse rodent\n🐁 mouse2 animal nature rodent\n🐿 chipmunk animal nature rodent squirrel\n🦔 hedgehog animal nature spiny\n🐾 paw prints animal tracking footprints dog cat pet feet\n🐉 dragon animal myth nature chinese green\n🐲 dragon face animal myth nature chinese green\n🌵 cactus vegetable plant nature\n🎄 christmas tree festival vacation december xmas celebration\n🌲 evergreen tree plant nature\n🌳 deciduous tree plant nature\n🌴 palm tree plant vegetable nature summer beach mojito tropical\n🌱 seedling plant nature grass lawn spring\n🌿 herb vegetable plant medicine weed grass lawn\n☘ shamrock vegetable plant nature irish clover\n🍀 four leaf clover vegetable plant nature lucky irish\n🎍 bamboo plant nature vegetable panda\n🎋 tanabata tree plant nature branch summer\n🍃 leaves nature plant tree vegetable grass lawn spring\n🍂 fallen leaf nature plant vegetable leaves\n🍁 maple leaf nature plant vegetable ca fall\n🌾 ear of rice nature plant\n🌺 hibiscus plant vegetable flowers beach\n🌻 sunflower nature plant fall\n🌹 rose flowers valentines love spring\n🥀 wilted flower plant nature\n🌷 tulip flowers plant nature summer spring\n🌼 blossom nature flowers yellow\n🌸 cherry blossom nature plant spring flower\n💐 bouquet flowers nature spring\n🍄 mushroom plant vegetable\n🌎 earth americas globe world usa international\n🌍 earth africa globe world international\n🌏 earth asia globe world east international\n🌕 full moon nature yellow twilight planet space night evening sleep\n🌖 waning gibbous moon nature twilight planet space night evening sleep\n🌗 last quarter moon nature twilight planet space night evening sleep\n🌘 waning crescent moon nature twilight planet space night evening sleep\n🌑 new moon nature twilight planet space night evening sleep\n🌒 waxing crescent moon nature twilight planet space night evening sleep\n🌓 first quarter moon nature twilight planet space night evening sleep\n🌔 waxing gibbous moon nature night sky gray twilight planet space evening sleep\n🌚 new moon with face nature twilight planet space night evening sleep\n🌝 full moon with face nature twilight planet space night evening sleep\n🌛 first quarter moon with face nature twilight planet space night evening sleep\n🌜 last quarter moon with face nature twilight planet space night evening sleep\n🌞 sun with face nature morning sky\n🌙 crescent moon night sleep sky evening magic\n⭐ star night yellow\n🌟 star2 night sparkle awesome good magic\n💫 dizzy star sparkle shoot magic\n✨ sparkles stars shine shiny cool awesome good magic\n☄ comet space\n☀️ sunny weather nature brightness summer beach spring\n🌤 sun behind small cloud weather\n⛅ partly sunny weather nature cloudy morning fall spring\n🌥 sun behind large cloud weather\n🌦 sun behind rain cloud weather\n☁️ cloud weather sky\n🌧 cloud with rain weather\n⛈ cloud with lightning and rain weather\n🌩 cloud with lightning weather thunder\n⚡ zap thunder weather fast\n🔥 fire hot cook flame\n💥 boom bomb explode explosion collision blown\n❄️ snowflake winter season cold weather christmas xmas\n🌨 cloud with snow weather\n⛄ snowman winter season cold weather christmas xmas frozen\n☃ snowman with snow winter season cold weather christmas xmas frozen\n🌬 wind face gust air\n💨 dash wind air fast shoo fart smoke puff\n🌪 tornado weather cyclone twister\n🌫 fog weather\n☂ open umbrella weather spring\n☔ umbrella rainy weather spring\n💧 droplet water drip faucet spring\n💦 sweat drops water drip oops\n🌊 ocean sea water wave nature tsunami disaster\n🍏 green apple fruit nature\n🍎 apple fruit mac school\n🍐 pear fruit nature food\n🍊 tangerine food fruit nature orange\n🍋 lemon fruit nature\n🍌 banana fruit food monkey\n🍉 watermelon fruit food picnic summer\n🍇 grapes fruit food wine\n🍓 strawberry fruit food nature\n🍈 melon fruit nature food\n🍒 cherries food fruit\n🍑 peach fruit nature food\n🥭 mango fruit food tropical\n🍍 pineapple fruit nature food\n🥥 coconut fruit nature food palm\n🥝 kiwi fruit food\n🍅 tomato fruit vegetable nature food\n🍆 eggplant vegetable nature food aubergine\n🥑 avocado fruit food\n🥦 broccoli fruit food vegetable\n🥬 leafy greens food vegetable plant cabbage kale lettuce\n🥒 cucumber fruit food pickle\n🌶 hot pepper food spicy chilli chili\n🌽 corn food vegetable plant\n🥕 carrot vegetable food orange\n🥔 potato food tuber vegatable starch\n🍠 sweet potato food nature\n🥐 croissant food bread french\n🥯 bagel food bread bakery schmear\n🍞 bread food wheat breakfast toast\n🥖 baguette bread food french\n🥨 pretzel food bread twisted\n🧀 cheese food chadder\n🥚 egg food chicken breakfast\n🍳 fried egg food breakfast kitchen\n🥞 pancakes food breakfast flapjacks hotcakes\n🥓 bacon food breakfast pork pig meat\n🥩 steak food cow meat cut chop lambchop porkchop\n🍗 poultry leg food meat drumstick bird chicken turkey\n🍖 meat on bone good food drumstick\n🦴 bone skeleton\n🌭 hotdog food frankfurter\n🍔 hamburger meat beef cheeseburger mcdonalds\n🍟 fries chips snack\n🍕 pizza food party\n🥪 sandwich food lunch bread\n🥙 stuffed flatbread food gyro\n🌮 taco food mexican\n🌯 burrito food mexican\n🥗 green salad food healthy lettuce\n🥘 shallow pan of food cooking casserole paella\n🥫 canned food soup\n🍝 spaghetti food italian noodle\n🍜 ramen food japanese noodle chopsticks\n🍲 stew food meat soup\n🍛 curry food spicy hot indian\n🍣 sushi food fish japanese rice\n🍱 bento food japanese box\n🍤 fried shrimp food animal appetizer summer\n🍙 rice ball food japanese\n🍚 rice food china asian\n🍘 rice cracker food japanese\n🍥 fish cake food japan sea beach narutomaki pink swirl kamaboko surimi ramen\n🥠 fortune cookie food prophecy\n🥮 moon cake food autumn\n🍢 oden food japanese\n🍡 dango food dessert sweet japanese barbecue meat\n🍧 shaved ice hot dessert summer\n🍨 ice cream food hot dessert\n🍦 icecream food hot dessert summer\n🥧 pie food dessert pastry\n🧁 cupcake food dessert bakery sweet\n🍰 cake food dessert\n🎂 birthday food dessert cake\n🍮 custard dessert food\n🍭 lollipop food snack candy sweet\n🍬 candy snack dessert sweet lolly\n🍫 chocolate bar food snack dessert sweet\n🍿 popcorn food films snack\n🍩 doughnut food dessert snack sweet donut\n🥟 dumpling food empanada pierogi potsticker\n🍪 cookie food snack oreo chocolate sweet dessert\n🌰 chestnut food squirrel\n🥜 peanuts food nut\n🍯 honey pot bees sweet kitchen\n🥛 milk glass beverage drink cow\n🍼 baby bottle food container milk\n☕ coffee beverage caffeine latte espresso\n🍵 tea drink bowl breakfast green british\n🥤 cup with straw drink soda\n🍶 sake wine drink drunk beverage japanese alcohol booze\n🍺 beer relax beverage drink drunk party pub summer alcohol booze\n🍻 beers relax beverage drink drunk party pub summer alcohol booze\n🥂 clinking glasses beverage drink party alcohol celebrate cheers wine champagne toast\n🍷 wine glass drink beverage drunk alcohol booze\n🥃 tumbler glass drink beverage drunk alcohol liquor booze bourbon scotch whisky shot\n🍸 cocktail drink drunk alcohol beverage booze mojito\n🍹 tropical drink beverage cocktail summer beach alcohol booze mojito\n🍾 champagne drink wine bottle celebration\n🥄 spoon cutlery kitchen tableware\n🍴 fork and knife cutlery kitchen\n🍽 plate with cutlery food eat meal lunch dinner restaurant\n🥣 bowl with spoon food breakfast cereal oatmeal porridge\n🥡 takeout box food leftovers\n🥢 chopsticks food\n🧂 salt condiment shaker\n⚽ soccer sports football\n🏀 basketball sports balls nba\n🏈 football sports balls nfl\n⚾ baseball sports balls\n🥎 softball sports balls\n🎾 tennis sports balls green\n🏐 volleyball sports balls\n🏉 rugby football sports team\n🥏 flying disc sports frisbee ultimate\n🎱 8ball pool hobby game luck magic\n⛳ golf sports business flag hole summer\n🏌️‍♀️ golfing woman sports business female\n🏌 golfing man sports business\n🏓 ping pong sports pingpong\n🏸 badminton sports\n🥅 goal net sports\n🏒 ice hockey sports\n🏑 field hockey sports\n🥍 lacrosse sports ball stick\n🏏 cricket sports\n🎿 ski sports winter cold snow\n⛷ skier sports winter snow\n🏂 snowboarder sports winter\n🤺 person fencing sports sword\n🤼‍♀️ women wrestling sports wrestlers\n🤼‍♂️ men wrestling sports wrestlers\n🤸‍♀️ woman cartwheeling gymnastics\n🤸‍♂️ man cartwheeling gymnastics\n🤾‍♀️ woman playing handball sports\n🤾‍♂️ man playing handball sports\n⛸ ice skate sports\n🥌 curling stone sports\n🛹 skateboard board\n🛷 sled sleigh luge toboggan\n🏹 bow and arrow sports\n🎣 fishing pole and fish food hobby summer\n🥊 boxing glove sports fighting\n🥋 martial arts uniform judo karate taekwondo\n🚣‍♀️ rowing woman sports hobby water ship female\n🚣 rowing man sports hobby water ship\n🧗‍♀️ climbing woman sports hobby female rock\n🧗‍♂️ climbing man sports hobby male rock\n🏊‍♀️ swimming woman sports exercise human athlete water summer female\n🏊 swimming man sports exercise human athlete water summer\n🤽‍♀️ woman playing water polo sports pool\n🤽‍♂️ man playing water polo sports pool\n🧘‍♀️ woman in lotus position female meditation yoga serenity zen mindfulness\n🧘‍♂️ man in lotus position male meditation yoga serenity zen mindfulness\n🏄‍♀️ surfing woman sports ocean sea summer beach female\n🏄 surfing man sports ocean sea summer beach\n⛹️‍♀️ basketball woman sports human female\n⛹ basketball man sports human\n🏋️‍♀️ weight lifting woman sports training exercise female\n🏋 weight lifting man sports training exercise\n🚴‍♀️ biking woman sports bike exercise hipster female\n🚴 biking man sports bike exercise hipster\n🚵‍♀️ mountain biking woman transportation sports human race bike female\n🚵 mountain biking man transportation sports human race bike\n🏇 horse racing animal betting competition gambling luck\n🏆 trophy win award contest place ftw ceremony\n🎽 running shirt with sash play pageant\n🏅 medal sports award winning\n🎖 medal military award winning army\n🥇 1st place medal award winning first\n🥈 2nd place medal award second\n🥉 3rd place medal award third\n🎗 reminder ribbon sports cause support awareness\n🏵 rosette flower decoration military\n🎫 ticket event concert pass\n🎟 tickets sports concert entrance\n🎭 performing arts acting theater drama\n🎨 art design paint draw colors\n🎪 circus tent festival carnival party\n🤹‍♀️ woman juggling juggle balance skill multitask\n🤹‍♂️ man juggling juggle balance skill multitask\n🎤 microphone sound music pa sing talkshow\n🎧 headphones music score gadgets\n🎼 musical score treble clef compose\n🎹 musical keyboard piano instrument compose\n🥁 drum music instrument drumsticks snare\n🎷 saxophone music instrument jazz blues\n🎺 trumpet music brass\n🎸 guitar music instrument\n🎻 violin music instrument orchestra symphony\n🎬 clapper movie film record\n🎮 video game play console ps4 controller\n🎯 dart game play bar target bullseye\n🎲 game die dice random tabletop play luck\n♟ chess pawn expendable\n🎰 slot machine bet gamble vegas luck casino\n🧩 jigsaw interlocking puzzle piece\n🎳 bowling sports fun play\n🚗 red car transportation vehicle\n🚕 taxi uber vehicle cars transportation\n🚙 blue car transportation vehicle\n🚌 bus car vehicle transportation\n🚎 trolleybus bart transportation vehicle\n🏎 racing car sports race fast formula f1\n🚓 police car vehicle cars transportation law legal enforcement\n🚑 ambulance health 911 hospital\n🚒 fire engine transportation cars vehicle\n🚐 minibus vehicle car transportation\n🚚 truck cars transportation\n🚛 articulated lorry vehicle cars transportation express\n🚜 tractor vehicle car farming agriculture\n🛴 kick scooter vehicle razor\n🏍 motorcycle race sports fast\n🚲 bike sports bicycle exercise hipster\n🛵 motor scooter vehicle vespa sasha\n🚨 rotating light police ambulance 911 emergency alert error pinged law legal\n🚔 oncoming police car vehicle law legal enforcement 911\n🚍 oncoming bus vehicle transportation\n🚘 oncoming automobile car vehicle transportation\n🚖 oncoming taxi vehicle cars uber\n🚡 aerial tramway transportation vehicle ski\n🚠 mountain cableway transportation vehicle ski\n🚟 suspension railway vehicle transportation\n🚃 railway car transportation vehicle\n🚋 train transportation vehicle carriage public travel\n🚝 monorail transportation vehicle\n🚄 bullettrain side transportation vehicle\n🚅 bullettrain front transportation vehicle speed fast public travel\n🚈 light rail transportation vehicle\n🚞 mountain railway transportation vehicle\n🚂 steam locomotive transportation vehicle train\n🚆 train2 transportation vehicle\n🚇 metro transportation mrt underground tube\n🚊 tram transportation vehicle\n🚉 station transportation vehicle public\n🛸 flying saucer transportation vehicle ufo\n🚁 helicopter transportation vehicle fly\n🛩 small airplane flight transportation fly vehicle\n✈️ airplane vehicle transportation flight fly\n🛫 flight departure airport landing\n🛬 flight arrival airport boarding\n⛵ sailboat ship summer transportation water sailing\n🛥 motor boat ship\n🚤 speedboat ship transportation vehicle summer\n⛴ ferry boat ship yacht\n🛳 passenger ship yacht cruise ferry\n🚀 rocket launch ship staffmode nasa fly\n🛰 artificial satellite communication gps orbit spaceflight nasa iss\n💺 seat sit airplane transport bus flight fly\n🛶 canoe boat paddle water ship\n⚓ anchor ship ferry sea boat\n🚧 construction wip progress caution warning\n⛽ fuelpump petroleum\n🚏 busstop transportation wait\n🚦 vertical traffic light transportation driving\n🚥 traffic light transportation signal\n🚢 ship transportation titanic deploy\n🎡 ferris wheel photo carnival londoneye\n🎢 roller coaster carnival playground photo fun\n🎠 carousel horse photo carnival\n🏗 building construction wip working progress\n🌁 foggy photo mountain\n🗼 tokyo tower photo japanese\n🏭 factory building industry pollution smoke\n⛲ fountain photo summer water fresh\n🎑 rice scene photo japan asia tsukimi\n⛰ mountain photo nature environment\n🏔 mountain snow photo nature environment winter cold\n🗻 mount fuji photo mountain nature japanese\n🌋 volcano photo nature disaster\n🗾 japan nation country japanese asia\n🏕 camping photo outdoors tent\n⛺ tent photo camping outdoors\n🏞 national park photo environment nature\n🛣 motorway road cupertino interstate highway\n🛤 railway track train transportation\n🌅 sunrise morning view vacation photo\n🌄 sunrise over mountains view vacation photo\n🏜 desert photo warm saharah\n🏖 beach umbrella weather summer sunny sand mojito\n🏝 desert island photo tropical mojito\n🌇 city sunrise photo dawn\n🌆 city sunset photo evening sky buildings\n🏙 cityscape photo urban\n🌃 night with stars evening city downtown\n🌉 bridge at night photo sanfrancisco\n🌌 milky way photo space stars\n🌠 stars night photo\n🎇 sparkler stars night shine\n🎆 fireworks photo festival carnival congratulations\n🌈 rainbow nature happy photo sky spring\n🏘 houses buildings photo\n🏰 european castle building royalty history\n🏯 japanese castle photo building\n🏟 stadium photo place sports concert venue\n🗽 statue of liberty american newyork\n🏠 house building home\n🏡 house with garden home plant nature\n🏚 derelict house abandon evict broken building\n🏢 office building bureau work\n🏬 department store building shopping mall\n🏣 post office building envelope communication\n🏤 european post office building email\n🏥 hospital building health surgery doctor\n🏦 bank building money sales cash business enterprise\n🏨 hotel building accomodation checkin\n🏪 convenience store building shopping groceries\n🏫 school building student education learn teach\n🏩 love hotel like affection dating\n💒 wedding love like affection couple marriage bride groom\n🏛 classical building art culture history\n⛪ church building religion christ\n🕌 mosque islam worship minaret\n🕍 synagogue judaism worship temple jewish\n🕋 kaaba mecca mosque islam\n⛩ shinto shrine temple japan kyoto\n⌚ watch time accessories\n📱 iphone technology apple gadgets dial\n📲 calling iphone incoming\n💻 computer technology laptop screen display monitor\n⌨ keyboard technology computer type input text\n🖥 desktop computer technology computing screen\n🖨 printer paper ink\n🖱 computer mouse click\n🖲 trackball technology trackpad\n🕹 joystick game play\n🗜 clamp tool\n💽 minidisc technology record data disk 90s\n💾 floppy disk oldschool technology save 90s 80s\n💿 cd technology dvd disk disc 90s\n📀 dvd cd disk disc\n📼 vhs record video oldschool 90s 80s\n📷 camera gadgets photography\n📸 camera flash photography gadgets\n📹 video camera film record\n🎥 movie camera film record\n📽 film projector video tape record movie\n🎞 film strip movie\n📞 telephone receiver technology communication dial\n☎️ phone technology communication dial telephone\n📟 pager bbcall oldschool 90s\n📠 fax communication technology\n📺 tv technology program oldschool show television\n📻 radio communication music podcast program\n🎙 studio microphone sing recording artist talkshow\n🎚 level slider scale\n🎛 control knobs dial\n🧭 compass magnetic navigation orienteering\n⏱ stopwatch time deadline\n⏲ timer clock alarm\n⏰ alarm clock time wake\n🕰 mantelpiece clock time\n⏳ hourglass flowing sand oldschool time countdown\n⌛ hourglass time clock oldschool limit exam quiz test\n📡 satellite communication future radio space\n🔋 battery power energy sustain\n🔌 electric plug charger power\n💡 bulb light electricity idea\n🔦 flashlight dark camping sight night\n🕯 candle fire wax\n🧯 fire extinguisher quench\n🗑 wastebasket bin trash rubbish garbage toss\n🛢 oil drum barrell\n💸 money with wings dollar bills payment sale\n💵 dollar money sales bill currency\n💴 yen money sales japanese dollar currency\n💶 euro money sales dollar currency\n💷 pound british sterling money sales bills uk england currency\n💰 moneybag dollar payment coins sale\n💳 credit card money sales dollar bill payment shopping\n💎 gem blue ruby diamond jewelry\n⚖ balance scale law fairness weight\n🧰 toolbox tools diy fix maintainer mechanic\n🔧 wrench tools diy ikea fix maintainer\n🔨 hammer tools build create\n⚒ hammer and pick tools build create\n🛠 hammer and wrench tools build create\n⛏ pick tools dig\n🔩 nut and bolt handy tools fix\n⚙ gear cog\n🧱 brick bricks\n⛓ chains lock arrest\n🧲 magnet attraction magnetic\n🔫 gun violence weapon pistol revolver\n💣 bomb boom explode explosion terrorism\n🧨 firecracker dynamite boom explode explosion explosive\n🔪 hocho knife blade cutlery kitchen weapon\n🗡 dagger weapon\n⚔ crossed swords weapon\n🛡 shield protection security\n🚬 smoking kills tobacco cigarette joint smoke\n⚰ coffin vampire dead die death rip graveyard cemetery casket funeral box\n⚱ funeral urn dead die death rip ashes\n🏺 amphora vase jar\n🔮 crystal ball disco party magic circus\n📿 prayer beads dhikr religious\n🧿 nazar amulet bead charm\n💈 barber hair salon style\n⚗ alembic distilling science experiment chemistry\n🔭 telescope stars space zoom science astronomy\n🔬 microscope laboratory experiment zoomin science study\n🕳 hole embarrassing\n💊 pill health medicine doctor pharmacy drug\n💉 syringe health hospital drugs blood medicine needle doctor nurse\n🧬 dna biologist genetics life\n🦠 microbe amoeba bacteria germs\n🧫 petri dish bacteria biology culture lab\n🧪 test tube chemistry experiment lab science\n🌡 thermometer weather temperature hot cold\n🧹 broom cleaning sweeping witch\n🧺 basket laundry\n🧻 toilet paper roll\n🏷 label sale tag\n🔖 bookmark favorite label save\n🚽 toilet restroom wc washroom bathroom potty\n🚿 shower clean water bathroom\n🛁 bathtub clean shower bathroom\n🛀 bath clean shower bathroom\n🧼 soap bar bathing cleaning lather\n🧽 sponge absorbing cleaning porous\n🧴 lotion bottle moisturizer sunscreen\n🔑 key lock door password\n🗝 old key lock door password\n🛋 couch and lamp read chill\n🛌 sleeping bed rest\n🛏 bed sleep rest\n🚪 door house entry exit\n🛎 bellhop bell service\n🧸 teddy bear plush stuffed\n🖼 framed picture photography\n🗺 world map location direction\n⛱ parasol on ground weather summer\n🗿 moyai rock moai\n🛍 shopping mall buy purchase\n🛒 shopping cart trolley\n🎈 balloon party celebration birthday circus\n🎏 flags fish japanese koinobori carp banner\n🎀 ribbon decoration pink girl bowtie\n🎁 gift present birthday christmas xmas\n🎊 confetti ball festival party birthday circus\n🎉 tada party congratulations birthday magic circus celebration\n🎎 dolls japanese toy kimono\n🎐 wind chime nature ding spring bell\n🎌 crossed flags japanese nation country border\n🏮 izakaya lantern light paper halloween spooky\n🧧 red envelope gift\n✉️ email letter postal inbox communication\n📩 envelope with arrow email communication\n📨 incoming envelope email inbox\n📧 e mail communication inbox\n💌 love letter email like affection envelope valentines\n📮 postbox email letter envelope\n📪 mailbox closed email communication inbox\n📫 mailbox email inbox communication\n📬 mailbox with mail email inbox communication\n📭 mailbox with no mail email inbox\n📦 package mail gift cardboard box moving\n📯 postal horn instrument music\n📥 inbox tray email documents\n📤 outbox tray inbox email\n📜 scroll documents ancient history paper\n📃 page with curl documents office paper\n📑 bookmark tabs favorite save order tidy\n🧾 receipt accounting expenses\n📊 bar chart graph presentation stats\n📈 chart with upwards trend graph presentation stats recovery business economics money sales good success\n📉 chart with downwards trend graph presentation stats recession business economics money sales bad failure\n📄 page facing up documents office paper information\n📅 date calendar schedule\n📆 calendar schedule date planning\n🗓 spiral calendar date schedule planning\n📇 card index business stationery\n🗃 card file box business stationery\n🗳 ballot box election vote\n🗄 file cabinet filing organizing\n📋 clipboard stationery documents\n🗒 spiral notepad memo stationery\n📁 file folder documents business office\n📂 open file folder documents load\n🗂 card index dividers organizing business stationery\n🗞 newspaper roll press headline\n📰 newspaper press headline\n📓 notebook stationery record notes paper study\n📕 closed book read library knowledge textbook learn\n📗 green book read library knowledge study\n📘 blue book read library knowledge learn study\n📙 orange book read library knowledge textbook study\n📔 notebook with decorative cover classroom notes record paper study\n📒 ledger notes paper\n📚 books literature library study\n📖 open book read library knowledge literature learn study\n🧷 safety pin diaper\n🔗 link rings url\n📎 paperclip documents stationery\n🖇 paperclips documents stationery\n✂️ scissors stationery cut\n📐 triangular ruler stationery math architect sketch\n📏 straight ruler stationery calculate length math school drawing architect sketch\n🧮 abacus calculation\n📌 pushpin stationery mark here\n📍 round pushpin stationery location map here\n🔐 closed lock with key security privacy\n🔒 lock security password padlock\n🔓 unlock privacy security\n🔏 lock with ink pen security secret\n🖊 pen stationery writing write\n🖋 fountain pen stationery writing write\n✒️ black nib pen stationery writing write\n📝 memo write documents stationery pencil paper writing legal exam quiz test study compose\n✏️ pencil2 stationery write paper writing school study\n🖍 crayon drawing creativity\n🖌 paintbrush drawing creativity art\n🔍 mag search zoom find detective\n🔎 mag right search zoom find detective\n❤️ heart love like valentines\n🧡 orange heart love like affection valentines\n💛 yellow heart love like affection valentines\n💚 green heart love like affection valentines\n💙 blue heart love like affection valentines\n💜 purple heart love like affection valentines\n🖤 black heart evil\n💔 broken heart sad sorry break heartbreak\n❣ heavy heart exclamation decoration love\n💕 two hearts love like affection valentines heart\n💞 revolving hearts love like affection valentines\n💓 heartbeat love like affection valentines pink heart\n💗 heartpulse like love affection valentines pink\n💖 sparkling heart love like affection valentines\n💘 cupid love like heart affection valentines\n💝 gift heart love valentines\n💟 heart decoration love like\n☮ peace symbol hippie\n✝ latin cross christianity\n☪ star and crescent islam\n🕉 om hinduism buddhism sikhism jainism\n☸ wheel of dharma hinduism buddhism sikhism jainism\n✡ star of david judaism\n🔯 six pointed star religion jewish hexagram\n🕎 menorah hanukkah candles jewish\n☯ yin yang balance\n☦ orthodox cross suppedaneum religion\n🛐 place of worship religion church temple prayer\n⛎ ophiuchus sign constellation astrology\n♈ aries sign zodiac astrology\n♉ taurus sign zodiac astrology\n♊ gemini sign zodiac astrology\n♋ cancer sign zodiac astrology\n♌ leo sign zodiac astrology\n♍ virgo sign zodiac astrology\n♎ libra sign zodiac astrology\n♏ scorpius sign zodiac astrology scorpio\n♐ sagittarius sign zodiac astrology\n♑ capricorn sign zodiac astrology\n♒ aquarius sign zodiac astrology\n♓ pisces sign zodiac astrology\n🆔 id words\n⚛ atom symbol science physics chemistry\n🈳 u7a7a kanji japanese chinese empty sky\n🈹 u5272 cut divide chinese kanji\n☢ radioactive nuclear danger\n☣ biohazard danger\n📴 mobile phone off mute silence quiet\n📳 vibration mode phone\n🈶 u6709 chinese have kanji\n🈚 u7121 nothing chinese kanji japanese\n🈸 u7533 chinese japanese kanji\n🈺 u55b6 japanese\n🈷️ u6708 chinese month moon japanese kanji\n✴️ eight pointed black star shape polygon\n🆚 vs words\n🉑 accept ok good chinese kanji agree yes\n💮 white flower japanese spring\n🉐 ideograph advantage chinese kanji obtain get circle\n㊙️ secret privacy chinese sshh kanji\n㊗️ congratulations chinese kanji japanese\n🈴 u5408 japanese chinese join kanji\n🈵 u6e80 full chinese japanese kanji\n🈲 u7981 kanji japanese chinese forbidden limit restricted\n🅰️ a alphabet letter\n🅱️ b alphabet letter\n🆎 ab alphabet\n🆑 cl alphabet words\n🅾️ o2 alphabet letter\n🆘 sos help words emergency 911\n⛔ no entry limit security privacy bad denied stop circle\n📛 name badge fire forbid\n🚫 no entry sign forbid stop limit denied disallow circle\n❌ x no delete remove cancel red\n⭕ o circle round\n🛑 stop sign\n💢 anger angry mad\n♨️ hotsprings bath warm relax\n🚷 no pedestrians rules crossing walking circle\n🚯 do not litter trash bin garbage circle\n🚳 no bicycles cyclist prohibited circle\n🚱 non potable water drink faucet tap circle\n🔞 underage 18 drink pub night minor circle\n📵 no mobile phones iphone mute circle\n❗ exclamation danger surprise punctuation wow warning\n❕ grey exclamation surprise punctuation gray wow warning\n❓ question doubt confused\n❔ grey question doubts gray huh confused\n‼️ bangbang exclamation surprise\n⁉️ interrobang wat punctuation surprise\n💯 100 score perfect numbers century exam quiz test pass hundred\n🔅 low brightness sun afternoon warm summer\n🔆 high brightness sun light\n🔱 trident weapon spear\n⚜ fleur de lis decorative scout\n〽️ part alternation mark graph presentation stats business economics bad\n⚠️ warning exclamation wip alert error problem issue\n🚸 children crossing school warning danger sign driving\n🔰 beginner badge shield\n♻️ recycle arrow environment garbage trash\n🈯 u6307 chinese point kanji\n💹 chart graph presentation stats\n❇️ sparkle stars awesome good fireworks\n✳️ eight spoked asterisk star sparkle\n❎ negative squared cross mark x no deny\n✅ white check mark ok agree vote election answer tick\n💠 diamond shape with a dot inside jewel blue gem crystal fancy\n🌀 cyclone weather swirl blue cloud vortex spiral whirlpool spin tornado hurricane typhoon\n➿ loop tape cassette\n🌐 globe with meridians earth international world internet interweb i18n\nⓂ️ m alphabet letter\n🏧 atm money sales cash payment bank\n💤 zzz sleepy tired dream\n🈂️ sa japanese katakana\n🛂 passport control custom\n🛃 customs passport border\n🛄 baggage claim airport transport\n🛅 left luggage travel\n♿ wheelchair disabled a11y accessibility\n🚭 no smoking cigarette smell smoke\n🚾 wc toilet restroom\n🅿️ parking cars alphabet letter\n🚰 potable water liquid restroom cleaning faucet\n🚹 mens toilet restroom wc gender male\n🚺 womens woman female toilet loo restroom gender\n🚼 baby symbol child\n🚻 restroom toilet refresh wc gender\n🚮 put litter in its place sign human info\n🎦 cinema record film movie curtain stage theater\n📶 signal strength reception phone internet connection wifi bluetooth bars\n🈁 koko here katakana japanese destination\n🆖 ng words shape icon\n🆗 ok good agree yes\n🆙 up above high\n🆒 cool words\n🆕 new words start\n🆓 free words\n0️⃣ zero 0 numbers null\n1️⃣ one numbers 1\n2️⃣ two numbers 2 prime\n3️⃣ three 3 numbers prime\n4️⃣ four 4 numbers\n5️⃣ five 5 numbers prime\n6️⃣ six 6 numbers\n7️⃣ seven 7 numbers prime\n8️⃣ eight 8 numbers\n9️⃣ nine numbers 9\n🔟 keycap ten numbers 10\n*⃣ asterisk star keycap\n🔢 1234 numbers\n⏏️ eject button\n▶️ arrow forward right direction play\n⏸ pause button\n⏭ next track button forward\n⏹ stop button\n⏺ record button\n⏯ play or pause button\n⏮ previous track button backward\n⏩ fast forward play speed continue\n⏪ rewind play\n🔀 twisted rightwards arrows shuffle music random\n🔁 repeat loop record\n🔂 repeat one loop\n◀️ arrow backward left direction\n🔼 arrow up small triangle direction point forward top\n🔽 arrow down small direction bottom\n⏫ arrow double up direction top\n⏬ arrow double down direction bottom\n➡️ arrow right next\n⬅️ arrow left previous back\n⬆️ arrow up continue top direction\n⬇️ arrow down direction bottom\n↗️ arrow upper right point direction diagonal northeast\n↘️ arrow lower right direction diagonal southeast\n↙️ arrow lower left direction diagonal southwest\n↖️ arrow upper left point direction diagonal northwest\n↕️ arrow up down direction way vertical\n↔️ left right arrow shape direction horizontal sideways\n🔄 arrows counterclockwise sync cycle\n↪️ arrow right hook return rotate direction\n↩️ leftwards arrow with hook back return undo enter\n⤴️ arrow heading up direction top\n⤵️ arrow heading down direction bottom\n#️⃣ hash symbol twitter\nℹ️ information source alphabet letter\n🔤 abc alphabet\n🔡 abcd alphabet\n🔠 capital abcd alphabet words\n🔣 symbols music note ampersand percent glyphs characters\n🎵 musical note score tone sound\n🎶 notes music score\n〰️ wavy dash draw line moustache mustache squiggle scribble\n➰ curly loop scribble draw shape squiggle\n✔️ heavy check mark ok nike answer yes tick\n🔃 arrows clockwise sync cycle round repeat\n➕ heavy plus sign math calculation addition more increase\n➖ heavy minus sign math calculation subtract less\n➗ heavy division sign divide math calculation\n✖️ heavy multiplication x math calculation\n♾ infinity forever\n💲 heavy dollar sign money sales payment currency buck\n💱 currency exchange money sales dollar travel\n©️ copyright ip license circle law legal\n®️ registered alphabet circle\n™️ tm trademark brand law legal\n🔚 end words arrow\n🔙 back arrow words return\n🔛 on arrow words\n🔝 top words\n🔜 soon arrow words\n☑️ ballot box with check ok agree confirm vote election yes tick\n🔘 radio button input old music circle\n⚪ white circle shape round\n⚫ black circle shape button round\n🔴 red circle shape error danger\n🔵 large blue circle shape icon button\n🔸 small orange diamond shape jewel gem\n🔹 small blue diamond shape jewel gem\n🔶 large orange diamond shape jewel gem\n🔷 large blue diamond shape jewel gem\n🔺 small red triangle shape direction up top\n▪️ black small square shape icon\n▫️ white small square shape icon\n⬛ black large square shape icon button\n⬜ white large square shape icon stone button\n🔻 small red triangle down shape direction bottom\n◼️ black medium square shape button icon\n◻️ white medium square shape stone icon\n◾ black medium small square icon shape button\n◽ white medium small square shape stone icon button\n🔲 black square button shape input frame\n🔳 white square button shape input\n🔈 speaker sound volume silence broadcast\n🔉 sound volume speaker broadcast\n🔊 loud sound volume noise noisy speaker broadcast\n🔇 mute sound volume silence quiet\n📣 mega sound speaker volume\n📢 loudspeaker volume sound\n🔔 bell sound notification christmas xmas chime\n🔕 no bell sound volume mute quiet silent\n🃏 black joker poker cards game play magic\n🀄 mahjong game play chinese kanji\n♠️ spades poker cards suits magic\n♣️ clubs poker cards magic suits\n♥️ hearts poker cards magic suits\n♦️ diamonds poker cards magic suits\n🎴 flower playing cards game sunset red\n💭 thought balloon bubble cloud speech thinking dream\n🗯 right anger bubble caption speech thinking mad\n💬 speech balloon bubble words message talk chatting\n🗨 left speech bubble words message talk chatting\n🕐 clock1 time late early schedule\n🕑 clock2 time late early schedule\n🕒 clock3 time late early schedule\n🕓 clock4 time late early schedule\n🕔 clock5 time late early schedule\n🕕 clock6 time late early schedule dawn dusk\n🕖 clock7 time late early schedule\n🕗 clock8 time late early schedule\n🕘 clock9 time late early schedule\n🕙 clock10 time late early schedule\n🕚 clock11 time late early schedule\n🕛 clock12 time noon midnight midday late early schedule\n🕜 clock130 time late early schedule\n🕝 clock230 time late early schedule\n🕞 clock330 time late early schedule\n🕟 clock430 time late early schedule\n🕠 clock530 time late early schedule\n🕡 clock630 time late early schedule\n🕢 clock730 time late early schedule\n🕣 clock830 time late early schedule\n🕤 clock930 time late early schedule\n🕥 clock1030 time late early schedule\n🕦 clock1130 time late early schedule\n🕧 clock1230 time late early schedule\n🏳 white flag losing loser lost surrender fail\n🏴 black flag pirate\n🏴‍☠️ pirate flag skull crossbones banner\n🏁 checkered flag contest finishline race gokart\n🚩 triangular flag on post mark milestone place\n🏳️‍🌈 rainbow flag pride gay lgbt glbt queer homosexual lesbian bisexual transgender\n🇺🇳 united nations un flag banner\n🇦🇫 afghanistan af flag nation country banner\n🇦🇽 aland islands flag nation country banner\n🇦🇱 albania al flag nation country banner\n🇩🇿 algeria dz flag nation country banner\n🇦🇸 american samoa ws flag nation country banner\n🇦🇩 andorra ad flag nation country banner\n🇦🇴 angola ao flag nation country banner\n🇦🇮 anguilla ai flag nation country banner\n🇦🇶 antarctica aq flag nation country banner\n🇦🇬 antigua barbuda flag nation country banner\n🇦🇷 argentina ar flag nation country banner\n🇦🇲 armenia am flag nation country banner\n🇦🇼 aruba aw flag nation country banner\n🇦🇺 australia au flag nation country banner\n🇦🇹 austria at flag nation country banner\n🇦🇿 azerbaijan az flag nation country banner\n🇧🇸 bahamas bs flag nation country banner\n🇧🇭 bahrain bh flag nation country banner\n🇧🇩 bangladesh bd flag nation country banner\n🇧🇧 barbados bb flag nation country banner\n🇧🇾 belarus by flag nation country banner\n🇧🇪 belgium be flag nation country banner\n🇧🇿 belize bz flag nation country banner\n🇧🇯 benin bj flag nation country banner\n🇧🇲 bermuda bm flag nation country banner\n🇧🇹 bhutan bt flag nation country banner\n🇧🇴 bolivia bo flag nation country banner\n🇧🇶 caribbean netherlands bonaire flag nation country banner\n🇧🇦 bosnia herzegovina flag nation country banner\n🇧🇼 botswana bw flag nation country banner\n🇧🇷 brazil br flag nation country banner\n🇮🇴 british indian ocean territory flag nation country banner\n🇻🇬 british virgin islands bvi flag nation country banner\n🇧🇳 brunei bn darussalam flag nation country banner\n🇧🇬 bulgaria bg flag nation country banner\n🇧🇫 burkina faso flag nation country banner\n🇧🇮 burundi bi flag nation country banner\n🇨🇻 cape verde cabo flag nation country banner\n🇰🇭 cambodia kh flag nation country banner\n🇨🇲 cameroon cm flag nation country banner\n🇨🇦 canada ca flag nation country banner\n🇮🇨 canary islands flag nation country banner\n🇰🇾 cayman islands flag nation country banner\n🇨🇫 central african republic flag nation country banner\n🇹🇩 chad td flag nation country banner\n🇨🇱 chile flag nation country banner\n🇨🇳 cn china chinese prc flag country nation banner\n🇨🇽 christmas island flag nation country banner\n🇨🇨 cocos islands keeling flag nation country banner\n🇨🇴 colombia co flag nation country banner\n🇰🇲 comoros km flag nation country banner\n🇨🇬 congo brazzaville flag nation country banner\n🇨🇩 congo kinshasa democratic republic flag nation country banner\n🇨🇰 cook islands flag nation country banner\n🇨🇷 costa rica flag nation country banner\n🇭🇷 croatia hr flag nation country banner\n🇨🇺 cuba cu flag nation country banner\n🇨🇼 curacao flag nation country banner\n🇨🇾 cyprus cy flag nation country banner\n🇨🇿 czech republic cz flag nation country banner\n🇩🇰 denmark dk flag nation country banner\n🇩🇯 djibouti dj flag nation country banner\n🇩🇲 dominica dm flag nation country banner\n🇩🇴 dominican republic flag nation country banner\n🇪🇨 ecuador ec flag nation country banner\n🇪🇬 egypt eg flag nation country banner\n🇸🇻 el salvador flag nation country banner\n🇬🇶 equatorial guinea gn flag nation country banner\n🇪🇷 eritrea er flag nation country banner\n🇪🇪 estonia ee flag nation country banner\n🇪🇹 ethiopia et flag nation country banner\n🇪🇺 eu european union flag banner\n🇫🇰 falkland islands malvinas flag nation country banner\n🇫🇴 faroe islands flag nation country banner\n🇫🇯 fiji fj flag nation country banner\n🇫🇮 finland fi flag nation country banner\n🇫🇷 fr banner flag nation france french country\n🇬🇫 french guiana flag nation country banner\n🇵🇫 french polynesia flag nation country banner\n🇹🇫 french southern territories flag nation country banner\n🇬🇦 gabon ga flag nation country banner\n🇬🇲 gambia gm flag nation country banner\n🇬🇪 georgia ge flag nation country banner\n🇩🇪 de german nation flag country banner\n🇬🇭 ghana gh flag nation country banner\n🇬🇮 gibraltar gi flag nation country banner\n🇬🇷 greece gr flag nation country banner\n🇬🇱 greenland gl flag nation country banner\n🇬🇩 grenada gd flag nation country banner\n🇬🇵 guadeloupe gp flag nation country banner\n🇬🇺 guam gu flag nation country banner\n🇬🇹 guatemala gt flag nation country banner\n🇬🇬 guernsey gg flag nation country banner\n🇬🇳 guinea gn flag nation country banner\n🇬🇼 guinea bissau gw flag nation country banner\n🇬🇾 guyana gy flag nation country banner\n🇭🇹 haiti ht flag nation country banner\n🇭🇳 honduras hn flag nation country banner\n🇭🇰 hong kong flag nation country banner\n🇭🇺 hungary hu flag nation country banner\n🇮🇸 iceland is flag nation country banner\n🇮🇳 india in flag nation country banner\n🇮🇩 indonesia flag nation country banner\n🇮🇷 iran islamic republic flag nation country banner\n🇮🇶 iraq iq flag nation country banner\n🇮🇪 ireland ie flag nation country banner\n🇮🇲 isle of man flag nation country banner\n🇮🇱 israel il flag nation country banner\n🇮🇹 it italy flag nation country banner\n🇨🇮 cote divoire ivory coast flag nation country banner\n🇯🇲 jamaica jm flag nation country banner\n🇯🇵 jp japanese nation flag country banner\n🇯🇪 jersey je flag nation country banner\n🇯🇴 jordan jo flag nation country banner\n🇰🇿 kazakhstan kz flag nation country banner\n🇰🇪 kenya ke flag nation country banner\n🇰🇮 kiribati ki flag nation country banner\n🇽🇰 kosovo xk flag nation country banner\n🇰🇼 kuwait kw flag nation country banner\n🇰🇬 kyrgyzstan kg flag nation country banner\n🇱🇦 laos lao democratic republic flag nation country banner\n🇱🇻 latvia lv flag nation country banner\n🇱🇧 lebanon lb flag nation country banner\n🇱🇸 lesotho ls flag nation country banner\n🇱🇷 liberia lr flag nation country banner\n🇱🇾 libya ly flag nation country banner\n🇱🇮 liechtenstein li flag nation country banner\n🇱🇹 lithuania lt flag nation country banner\n🇱🇺 luxembourg lu flag nation country banner\n🇲🇴 macau macao flag nation country banner\n🇲🇰 macedonia flag nation country banner\n🇲🇬 madagascar mg flag nation country banner\n🇲🇼 malawi mw flag nation country banner\n🇲🇾 malaysia my flag nation country banner\n🇲🇻 maldives mv flag nation country banner\n🇲🇱 mali ml flag nation country banner\n🇲🇹 malta mt flag nation country banner\n🇲🇭 marshall islands flag nation country banner\n🇲🇶 martinique mq flag nation country banner\n🇲🇷 mauritania mr flag nation country banner\n🇲🇺 mauritius mu flag nation country banner\n🇾🇹 mayotte yt flag nation country banner\n🇲🇽 mexico mx flag nation country banner\n🇫🇲 micronesia federated states flag nation country banner\n🇲🇩 moldova republic flag nation country banner\n🇲🇨 monaco mc flag nation country banner\n🇲🇳 mongolia mn flag nation country banner\n🇲🇪 montenegro me flag nation country banner\n🇲🇸 montserrat ms flag nation country banner\n🇲🇦 morocco ma flag nation country banner\n🇲🇿 mozambique mz flag nation country banner\n🇲🇲 myanmar mm flag nation country banner\n🇳🇦 namibia na flag nation country banner\n🇳🇷 nauru nr flag nation country banner\n🇳🇵 nepal np flag nation country banner\n🇳🇱 netherlands nl flag nation country banner\n🇳🇨 new caledonia flag nation country banner\n🇳🇿 new zealand flag nation country banner\n🇳🇮 nicaragua ni flag nation country banner\n🇳🇪 niger ne flag nation country banner\n🇳🇬 nigeria flag nation country banner\n🇳🇺 niue nu flag nation country banner\n🇳🇫 norfolk island flag nation country banner\n🇲🇵 northern mariana islands flag nation country banner\n🇰🇵 north korea nation flag country banner\n🇳🇴 norway no flag nation country banner\n🇴🇲 oman flag nation country banner\n🇵🇰 pakistan pk flag nation country banner\n🇵🇼 palau pw flag nation country banner\n🇵🇸 palestinian territories palestine flag nation country banner\n🇵🇦 panama pa flag nation country banner\n🇵🇬 papua new guinea flag nation country banner\n🇵🇾 paraguay py flag nation country banner\n🇵🇪 peru pe flag nation country banner\n🇵🇭 philippines ph flag nation country banner\n🇵🇳 pitcairn islands flag nation country banner\n🇵🇱 poland pl flag nation country banner\n🇵🇹 portugal pt flag nation country banner\n🇵🇷 puerto rico flag nation country banner\n🇶🇦 qatar qa flag nation country banner\n🇷🇪 reunion flag nation country banner\n🇷🇴 romania ro flag nation country banner\n🇷🇺 ru russian federation flag nation country banner\n🇷🇼 rwanda rw flag nation country banner\n🇧🇱 st barthelemy saint flag nation country banner\n🇸🇭 st helena saint ascension tristan cunha flag nation country banner\n🇰🇳 st kitts nevis saint flag nation country banner\n🇱🇨 st lucia saint flag nation country banner\n🇵🇲 st pierre miquelon saint flag nation country banner\n🇻🇨 st vincent grenadines saint flag nation country banner\n🇼🇸 samoa ws flag nation country banner\n🇸🇲 san marino flag nation country banner\n🇸🇹 sao tome principe flag nation country banner\n🇸🇦 saudi arabia flag nation country banner\n🇸🇳 senegal sn flag nation country banner\n🇷🇸 serbia rs flag nation country banner\n🇸🇨 seychelles sc flag nation country banner\n🇸🇱 sierra leone flag nation country banner\n🇸🇬 singapore sg flag nation country banner\n🇸🇽 sint maarten dutch flag nation country banner\n🇸🇰 slovakia sk flag nation country banner\n🇸🇮 slovenia si flag nation country banner\n🇸🇧 solomon islands flag nation country banner\n🇸🇴 somalia so flag nation country banner\n🇿🇦 south africa flag nation country banner\n🇬🇸 south georgia sandwich islands flag nation country banner\n🇰🇷 kr south korea nation flag country banner\n🇸🇸 south sudan sd flag nation country banner\n🇪🇸 es spain flag nation country banner\n🇱🇰 sri lanka flag nation country banner\n🇸🇩 sudan sd flag nation country banner\n🇸🇷 suriname sr flag nation country banner\n🇸🇿 swaziland sz flag nation country banner\n🇸🇪 sweden se flag nation country banner\n🇨🇭 switzerland ch flag nation country banner\n🇸🇾 syria syrian arab republic flag nation country banner\n🇹🇼 taiwan tw flag nation country banner\n🇹🇯 tajikistan tj flag nation country banner\n🇹🇿 tanzania united republic flag nation country banner\n🇹🇭 thailand th flag nation country banner\n🇹🇱 timor leste flag nation country banner\n🇹🇬 togo tg flag nation country banner\n🇹🇰 tokelau tk flag nation country banner\n🇹🇴 tonga to flag nation country banner\n🇹🇹 trinidad tobago flag nation country banner\n🇹🇳 tunisia tn flag nation country banner\n🇹🇷 tr turkey flag nation country banner\n🇹🇲 turkmenistan flag nation country banner\n🇹🇨 turks caicos islands flag nation country banner\n🇹🇻 tuvalu flag nation country banner\n🇺🇬 uganda ug flag nation country banner\n🇺🇦 ukraine ua flag nation country banner\n🇦🇪 united arab emirates flag nation country banner\n🇬🇧 uk united kingdom great britain northern ireland flag nation country banner british english england\n🏴󠁧󠁢󠁥󠁮󠁧󠁿 england flag english\n🏴󠁧󠁢󠁳󠁣󠁴󠁿 scotland flag scottish\n🏴󠁧󠁢󠁷󠁬󠁳󠁿 wales flag welsh\n🇺🇸 us united states america flag nation country banner\n🇻🇮 us virgin islands flag nation country banner\n🇺🇾 uruguay uy flag nation country banner\n🇺🇿 uzbekistan uz flag nation country banner\n🇻🇺 vanuatu vu flag nation country banner\n🇻🇦 vatican city flag nation country banner\n🇻🇪 venezuela ve bolivarian republic flag nation country banner\n🇻🇳 vietnam viet nam flag nation country banner\n🇼🇫 wallis futuna flag nation country banner\n🇪🇭 western sahara flag nation country banner\n🇾🇪 yemen ye flag nation country banner\n🇿🇲 zambia zm flag nation country banner\n🇿🇼 zimbabwe zw flag nation country banner\n🥲 smiling face with tear happy sad grateful touched\n😮‍💨 face exhaling sigh relief tired exhale\n🥸 disguised face disguise glasses mustache incognito\n🥱 yawning face yawn tired sleepy bored\n🤌 pinched fingers italian what gesture\n🤏 pinching hand small tiny little\n🦾 mechanical arm robot strong prosthetic\n🫶 heart hands love support\n🫡 saluting face salute respect yes\n🫠 melting face melt hot embarrassed\n🫢 face with open eyes and hand over mouth shock surprise gasp\n🫣 face with peeking eye peek shy scared\n🫥 dotted line face invisible hidden\n🤍 white heart love pure\n🤎 brown heart love\n❤️‍🔥 heart on fire love passion burning\n❤️‍🩹 mending heart healing recovery love\n🫐 blueberries fruit berry\n🧃 beverage box juice drink\n🧋 bubble tea boba drink milk\n`;\n"],"names":[],"mappings":"AAKO,MAAM,qBAAwB,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA"}
@@ -0,0 +1,27 @@
1
+ import {SortEnum,RoomType}from'common';import {YANTRA_CHAT_ORG_MONGO_ID,isYantraChatOrgKey}from'./yantraChatOrg.js';const NATIVE_CHAT_LIST_PAGE_SIZE = 20;
2
+ const NATIVE_CHAT_CHANNELS_QUERY_VARS = {
3
+ criteria: {
4
+ type: RoomType.Direct,
5
+ organization: YANTRA_CHAT_ORG_MONGO_ID
6
+ },
7
+ limit: NATIVE_CHAT_LIST_PAGE_SIZE,
8
+ skip: 0,
9
+ sort: {
10
+ key: "updatedAt",
11
+ value: SortEnum.Desc
12
+ }
13
+ };
14
+ const ACCOUNT_OBJECT_ID = /^[a-f0-9]{24}$/i;
15
+ function isMongoAccountId(value) {
16
+ return Boolean(value && ACCOUNT_OBJECT_ID.test(value));
17
+ }
18
+ function isNativeMessengerChannel(channel) {
19
+ var _a;
20
+ if (!channel) return false;
21
+ if (!channel.id) return false;
22
+ const t = String((_a = channel.type) != null ? _a : "").toUpperCase();
23
+ if (t === RoomType.Aiassistant || t === "AIASSISTANT") return false;
24
+ if (t !== RoomType.Direct && t !== "DIRECT") return false;
25
+ if (channel.orgName && !isYantraChatOrgKey(channel.orgName)) return false;
26
+ return true;
27
+ }export{NATIVE_CHAT_CHANNELS_QUERY_VARS,NATIVE_CHAT_LIST_PAGE_SIZE,isMongoAccountId,isNativeMessengerChannel};//# sourceMappingURL=nativeChatChannelQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nativeChatChannelQuery.js","sources":["../../../src/features/messaging/nativeChatChannelQuery.ts"],"sourcesContent":["import { RoomType, SortEnum } from 'common';\nimport type { WireChannel } from './chatModel';\nimport { isYantraChatOrgKey, YANTRA_CHAT_ORG_MONGO_ID } from './yantraChatOrg';\n\n/**\n * Variables for the native Messages list (`ChatChannels` / `channelsByUser`).\n *\n * messenger-box's createDirectChannel stores DMs with `organization` = the chat\n * org ObjectId and NO `orgName`, so filtering on orgName matches nothing. Do not\n * switch Apollo org context for this query — Home and other apps stay on the default org.\n */\n/** Conversations fetched per page on the Messages list. */\nexport const NATIVE_CHAT_LIST_PAGE_SIZE = 20;\n\n/** First page; later pages reuse these vars with a larger `skip`. */\nexport const NATIVE_CHAT_CHANNELS_QUERY_VARS = {\n criteria: {\n type: RoomType.Direct,\n organization: YANTRA_CHAT_ORG_MONGO_ID,\n },\n limit: NATIVE_CHAT_LIST_PAGE_SIZE,\n skip: 0,\n sort: { key: 'updatedAt' as const, value: SortEnum.Desc },\n};\n\nconst ACCOUNT_OBJECT_ID = /^[a-f0-9]{24}$/i;\n\nexport function isMongoAccountId(value: string | null | undefined): boolean {\n return Boolean(value && ACCOUNT_OBJECT_ID.test(value));\n}\n\n/** Defense-in-depth filter on list rows returned from the server. */\nexport function isNativeMessengerChannel(\n channel: Pick<WireChannel, 'id' | 'type' | 'orgName'> | null | undefined,\n): boolean {\n if (!channel) return false;\n if (!channel.id) return false;\n const t = String(channel.type ?? '').toUpperCase();\n if (t === RoomType.Aiassistant || t === 'AIASSISTANT') return false;\n if (t !== RoomType.Direct && t !== 'DIRECT') return false;\n if (channel.orgName && !isYantraChatOrgKey(channel.orgName)) return false;\n return true;\n}\n"],"names":[],"mappings":"oHAYO,MAAM,0BAA6B,GAAA;AAGnC,MAAM,+BAAkC,GAAA;AAAA,EAC7C,QAAU,EAAA;AAAA,IACR,MAAM,QAAS,CAAA,MAAA;AAAA,IACf,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,KAAO,EAAA,0BAAA;AAAA,EACP,IAAM,EAAA,CAAA;AAAA,EACN,IAAM,EAAA;AAAA,IACJ,GAAK,EAAA,WAAA;AAAA,IACL,OAAO,QAAS,CAAA;AAAA;AAEpB;AACA,MAAM,iBAAoB,GAAA,iBAAA;AACnB,SAAS,iBAAiB,KAA2C,EAAA;AAC1E,EAAA,OAAO,OAAQ,CAAA,KAAA,IAAS,iBAAkB,CAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AACvD;AAGO,SAAS,yBAAyB,OAAmF,EAAA;AAjC5H,EAAA,IAAA,EAAA;AAkCE,EAAI,IAAA,CAAC,SAAgB,OAAA,KAAA;AACrB,EAAI,IAAA,CAAC,OAAQ,CAAA,EAAA,EAAW,OAAA,KAAA;AACxB,EAAA,MAAM,IAAI,MAAO,CAAA,CAAA,EAAA,GAAA,OAAA,CAAQ,SAAR,IAAgB,GAAA,EAAA,GAAA,EAAE,EAAE,WAAY,EAAA;AACjD,EAAA,IAAI,CAAM,KAAA,QAAA,CAAS,WAAe,IAAA,CAAA,KAAM,eAAsB,OAAA,KAAA;AAC9D,EAAA,IAAI,CAAM,KAAA,QAAA,CAAS,MAAU,IAAA,CAAA,KAAM,UAAiB,OAAA,KAAA;AACpD,EAAA,IAAI,QAAQ,OAAW,IAAA,CAAC,mBAAmB,OAAQ,CAAA,OAAO,GAAU,OAAA,KAAA;AACpE,EAAO,OAAA,IAAA;AACT"}
@@ -91,6 +91,57 @@ function toE164(raw, defaultRegion) {
91
91
  if (digits.startsWith("0")) return null;
92
92
  return `+${digits}`;
93
93
  }
94
+ function regionFromE164(e164) {
95
+ var _a;
96
+ if (!e164 || !e164.startsWith("+")) return null;
97
+ const digits = e164.slice(1);
98
+ let best = null;
99
+ for (const [region, cc] of Object.entries(CALLING_CODES)) {
100
+ if (digits.startsWith(cc) && (!best || cc.length > best.len)) best = {
101
+ region,
102
+ len: cc.length
103
+ };
104
+ }
105
+ return (_a = best == null ? void 0 : best.region) != null ? _a : null;
106
+ }
107
+ function contactE164s(phoneNumbers, defaultRegion) {
108
+ const regions = Array.isArray(defaultRegion) ? defaultRegion : [defaultRegion];
109
+ const seen = /* @__PURE__ */ new Set();
110
+ for (const raw of phoneNumbers) {
111
+ for (const region of regions) {
112
+ const e164 = toE164(raw, region);
113
+ if (e164) seen.add(e164);
114
+ }
115
+ }
116
+ return Array.from(seen);
117
+ }
118
+ function normalizeContacts(contacts, defaultRegion, viewerE164) {
119
+ var _a, _b, _c;
120
+ const mine = new Set(viewerE164 ? contactE164s([viewerE164], defaultRegion) : []);
121
+ const out = [];
122
+ for (const c of contacts) {
123
+ const e164 = contactE164s((_a = c.phoneNumbers) != null ? _a : [], defaultRegion);
124
+ if (!e164.length || e164.some((n) => mine.has(n))) continue;
125
+ out.push({
126
+ id: c.id,
127
+ displayName: c.displayName,
128
+ imageUri: (_b = c.imageUri) != null ? _b : null,
129
+ e164,
130
+ rawNumbers: ((_c = c.phoneNumbers) != null ? _c : []).map((n) => n.trim()).filter(Boolean)
131
+ });
132
+ }
133
+ return out;
134
+ }
135
+ function collectLookupNumbers(contacts, limit = 1e3) {
136
+ const seen = /* @__PURE__ */ new Set();
137
+ for (const c of contacts) {
138
+ for (const n of c.e164) {
139
+ seen.add(n);
140
+ if (seen.size >= limit) return Array.from(seen);
141
+ }
142
+ }
143
+ return Array.from(seen);
144
+ }
94
145
  function formatPhoneNumber(input, defaultRegion) {
95
146
  return toE164(input, defaultRegion);
96
147
  }
@@ -99,4 +150,4 @@ function isValidPhoneNumber(phoneNumber) {
99
150
  if (!phoneNumber.startsWith("+")) return false;
100
151
  const digits = phoneNumber.slice(1).replace(/\D/g, "");
101
152
  return digits.length >= MIN_E164_DIGITS && digits.length <= MAX_E164_DIGITS;
102
- }export{formatPhoneNumber,isValidPhoneNumber,toE164};//# sourceMappingURL=phoneNumbers.js.map
153
+ }export{collectLookupNumbers,contactE164s,formatPhoneNumber,isValidPhoneNumber,normalizeContacts,regionFromE164,toE164};//# sourceMappingURL=phoneNumbers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"phoneNumbers.js","sources":["../../../src/features/messaging/phoneNumbers.ts"],"sourcesContent":["/**\n * Turning what the address book gives you into something matchable.\n *\n * This lives in the REMOTE, not the host, on purpose: it is pure logic with no\n * native dependency, it is where contact-matching actually goes wrong, and\n * keeping it here means a normalisation bug is a surface deploy rather than an\n * App Store release. The `contacts` seam hands over RAW strings plus a region\n * hint precisely so this can own the problem.\n *\n * Deliberately NOT libphonenumber. That library is ~500KB and every byte ships\n * in the remote bundle on every cold launch. What follows handles the cases\n * that actually occur in an address book; anything it cannot confidently place\n * is DROPPED rather than guessed, because a wrong match shows someone a\n * stranger's name attached to their friend's number, which is far worse than\n * simply not finding them.\n */\n\n/** National trunk prefixes stripped before applying a country code. */\nconst TRUNK_PREFIXES: Record<string, string> = {\n // The overwhelmingly common case: a single leading 0.\n DEFAULT: '0',\n // Italy is the notable exception - the leading 0 is part of the number.\n IT: '',\n};\n\n/** Country calling codes for the regions a device is likely to report. */\nconst CALLING_CODES: Record<string, string> = {\n US: '1',\n CA: '1',\n GB: '44',\n IE: '353',\n FR: '33',\n DE: '49',\n ES: '34',\n IT: '39',\n NL: '31',\n BE: '32',\n CH: '41',\n AT: '43',\n SE: '46',\n NO: '47',\n DK: '45',\n FI: '358',\n PL: '48',\n PT: '351',\n GR: '30',\n CZ: '420',\n RO: '40',\n HU: '36',\n UA: '380',\n RU: '7',\n TR: '90',\n IL: '972',\n AE: '971',\n SA: '966',\n QA: '974',\n KW: '965',\n IN: '91',\n PK: '92',\n BD: '880',\n LK: '94',\n NP: '977',\n CN: '86',\n JP: '81',\n KR: '82',\n TW: '886',\n HK: '852',\n SG: '65',\n MY: '60',\n TH: '66',\n VN: '84',\n PH: '63',\n ID: '62',\n AU: '61',\n NZ: '64',\n ZA: '27',\n NG: '234',\n KE: '254',\n EG: '20',\n GH: '233',\n BR: '55',\n MX: '52',\n AR: '54',\n CL: '56',\n CO: '57',\n PE: '51',\n};\n\n/** Longest calling code is 4 digits; shortest E.164 subscriber part is ~4. */\nconst MIN_E164_DIGITS = 7;\nconst MAX_E164_DIGITS = 15;\n\n/**\n * Normalise one raw address-book string to E.164 (`+<digits>`), or null.\n *\n * Returns null rather than a best guess whenever the result would be\n * speculative - see the file header for why a miss beats a wrong match.\n */\nexport function toE164(raw: string, defaultRegion?: string | null): string | null {\n if (typeof raw !== 'string') return null;\n\n // Strip everything a human might type: spaces, dashes, dots, parens,\n // and the invisible bidi marks iOS inserts around RTL-locale numbers.\n const cleaned = raw.replace(/[\\s\\-().‎‏؜]/g, '');\n if (!cleaned) return null;\n\n // Extensions are not diallable identity - \"555123456x89\" is one person.\n const withoutExt = cleaned.split(/[,;xX#]/)[0];\n if (!withoutExt) return null;\n\n let digits: string;\n if (withoutExt.startsWith('+')) {\n digits = withoutExt.slice(1).replace(/\\D/g, '');\n } else if (withoutExt.startsWith('00')) {\n // The international prefix used across most of Europe and Asia.\n digits = withoutExt.slice(2).replace(/\\D/g, '');\n } else {\n const region = (defaultRegion ?? '').toUpperCase();\n const cc = CALLING_CODES[region];\n // No region and no international prefix: the number is meaningless\n // without knowing where it was dialled from. Drop it.\n if (!cc) return null;\n\n let national = withoutExt.replace(/\\D/g, '');\n const trunk = region in TRUNK_PREFIXES ? TRUNK_PREFIXES[region] : TRUNK_PREFIXES.DEFAULT;\n if (trunk && national.startsWith(trunk)) national = national.slice(trunk.length);\n\n // A number that already begins with its own country code and is\n // plausibly full-length is international-without-the-plus, not a\n // national number that happens to start with those digits.\n digits =\n national.startsWith(cc) && national.length >= MIN_E164_DIGITS + cc.length - 1 ? national : cc + national;\n }\n\n if (digits.length < MIN_E164_DIGITS || digits.length > MAX_E164_DIGITS) return null;\n // A leading zero after the country code means the trunk prefix survived.\n if (digits.startsWith('0')) return null;\n\n return `+${digits}`;\n}\n\n/**\n * Region implied by an E.164 number's calling code (longest match wins), or null.\n * `+1` resolves to US, which parses identically to CA.\n */\nexport function regionFromE164(e164: string | null | undefined): string | null {\n if (!e164 || !e164.startsWith('+')) return null;\n const digits = e164.slice(1);\n let best: { region: string; len: number } | null = null;\n for (const [region, cc] of Object.entries(CALLING_CODES)) {\n if (digits.startsWith(cc) && (!best || cc.length > best.len)) best = { region, len: cc.length };\n }\n return best?.region ?? null;\n}\n\n/**\n * Every distinct E.164 number a contact has, in address-book order.\n *\n * De-duplicated because the same person routinely appears with the same number\n * written two ways (\"+1 555…\" and \"(555) …\"), and matching the same number\n * twice would show them twice in the results.\n */\nexport function contactE164s(\n phoneNumbers: readonly string[],\n defaultRegion?: string | null | readonly (string | null | undefined)[],\n): string[] {\n // A number saved without a country code is ambiguous, so each candidate region\n // contributes an interpretation. The server only matches verified member numbers,\n // so extra candidates cannot produce a match that is not real.\n const regions = Array.isArray(defaultRegion) ? defaultRegion : [defaultRegion as string | null | undefined];\n const seen = new Set<string>();\n for (const raw of phoneNumbers) {\n for (const region of regions) {\n const e164 = toE164(raw, region);\n if (e164) seen.add(e164);\n }\n }\n return Array.from(seen);\n}\n\nexport interface NormalizedContact {\n /** The device's stable id, echoed back so a match can be re-attached. */\n id: string;\n displayName: string;\n imageUri?: string | null;\n /** Distinct E.164 candidates; never empty (contacts without any are dropped). */\n e164: string[];\n /** Numbers exactly as saved in the address book, for display and SMS. */\n rawNumbers?: string[];\n}\n\n/**\n * Normalise a whole address book, dropping anything unmatchable.\n *\n * Also drops the viewer's OWN number, so nobody is offered a chat with\n * themselves - which happens on essentially every real device, because people\n * save their own contact card.\n */\nexport function normalizeContacts(\n contacts: ReadonlyArray<{ id: string; displayName: string; phoneNumbers: string[]; imageUri?: string | null }>,\n defaultRegion?: string | null | readonly (string | null | undefined)[],\n viewerE164?: string | null,\n): NormalizedContact[] {\n const mine = new Set(viewerE164 ? contactE164s([viewerE164], defaultRegion) : []);\n const out: NormalizedContact[] = [];\n for (const c of contacts) {\n const e164 = contactE164s(c.phoneNumbers ?? [], defaultRegion);\n // Any interpretation equal to the viewer's own number means this is their own card.\n if (!e164.length || e164.some((n) => mine.has(n))) continue;\n out.push({\n id: c.id,\n displayName: c.displayName,\n imageUri: c.imageUri ?? null,\n e164,\n rawNumbers: (c.phoneNumbers ?? []).map((n) => n.trim()).filter(Boolean),\n });\n }\n return out;\n}\n\n/**\n * The full set of numbers to ask the server about, capped.\n *\n * Address books of several thousand entries are ordinary, and the cap keeps one\n * request from becoming megabytes. Callers page through the rest.\n */\nexport function collectLookupNumbers(contacts: readonly NormalizedContact[], limit = 1000): string[] {\n const seen = new Set<string>();\n for (const c of contacts) {\n for (const n of c.e164) {\n seen.add(n);\n if (seen.size >= limit) return Array.from(seen);\n }\n }\n return Array.from(seen);\n}\n\n/**\n * Format a phone number string (user input) to E.164 format.\n * Used by the registration screen to normalize phone input before verification.\n */\nexport function formatPhoneNumber(input: string, defaultRegion?: string): string | null {\n return toE164(input, defaultRegion);\n}\n\n/**\n * Validate if a phone number string is a valid E.164 number.\n * Returns true if the number can be normalized to E.164 format.\n */\nexport function isValidPhoneNumber(phoneNumber: string | null): boolean {\n if (!phoneNumber) return false;\n if (!phoneNumber.startsWith('+')) return false;\n const digits = phoneNumber.slice(1).replace(/\\D/g, '');\n return digits.length >= MIN_E164_DIGITS && digits.length <= MAX_E164_DIGITS;\n}\n"],"names":[],"mappings":"AAkBA,MAAM,cAAyC,GAAA;AAAA;AAAA,EAE7C,OAAS,EAAA,GAAA;AAAA;AAAA,EAET,EAAI,EAAA;AACN,CAAA;AAGA,MAAM,aAAwC,GAAA;AAAA,EAC5C,EAAI,EAAA,GAAA;AAAA,EACJ,EAAI,EAAA,GAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,GAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,KAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA,IAAA;AAAA,EACJ,EAAI,EAAA;AACN,CAAA;AAGA,MAAM,eAAkB,GAAA,CAAA;AACxB,MAAM,eAAkB,GAAA,EAAA;AAQR,SAAA,MAAA,CAAO,KAAa,aAA8C,EAAA;AAChF,EAAI,IAAA,OAAO,GAAQ,KAAA,QAAA,EAAiB,OAAA,IAAA;AAIpC,EAAA,MAAM,OAAU,GAAA,GAAA,CAAI,OAAQ,CAAA,eAAA,EAAiB,EAAE,CAAA;AAC/C,EAAI,IAAA,CAAC,SAAgB,OAAA,IAAA;AAGrB,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,KAAM,CAAA,SAAS,EAAE,CAAC,CAAA;AAC7C,EAAI,IAAA,CAAC,YAAmB,OAAA,IAAA;AACxB,EAAI,IAAA,MAAA;AACJ,EAAI,IAAA,UAAA,CAAW,UAAW,CAAA,GAAG,CAAG,EAAA;AAC9B,IAAA,MAAA,GAAS,WAAW,KAAM,CAAA,CAAC,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,GACrC,MAAA,IAAA,UAAA,CAAW,UAAW,CAAA,IAAI,CAAG,EAAA;AAEtC,IAAA,MAAA,GAAS,WAAW,KAAM,CAAA,CAAC,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,GACzC,MAAA;AACL,IAAM,MAAA,MAAA,GAAA,CAAU,aAAiB,IAAA,IAAA,GAAA,aAAA,GAAA,EAAA,EAAI,WAAY,EAAA;AACjD,IAAM,MAAA,EAAA,GAAK,cAAc,MAAM,CAAA;AAG/B,IAAI,IAAA,CAAC,IAAW,OAAA,IAAA;AAChB,IAAA,IAAI,QAAW,GAAA,UAAA,CAAW,OAAQ,CAAA,KAAA,EAAO,EAAE,CAAA;AAC3C,IAAA,MAAM,QAAQ,MAAU,IAAA,cAAA,GAAiB,cAAe,CAAA,MAAM,IAAI,cAAe,CAAA,OAAA;AACjF,IAAI,IAAA,KAAA,IAAS,SAAS,UAAW,CAAA,KAAK,GAAc,QAAA,GAAA,QAAA,CAAS,KAAM,CAAA,KAAA,CAAM,MAAM,CAAA;AAK/E,IAAS,MAAA,GAAA,QAAA,CAAS,UAAW,CAAA,EAAE,CAAK,IAAA,QAAA,CAAS,MAAU,IAAA,eAAA,GAAkB,EAAG,CAAA,MAAA,GAAS,CAAI,GAAA,QAAA,GAAW,EAAK,GAAA,QAAA;AAAA;AAE3G,EAAA,IAAI,OAAO,MAAS,GAAA,eAAA,IAAmB,MAAO,CAAA,MAAA,GAAS,iBAAwB,OAAA,IAAA;AAE/E,EAAA,IAAI,MAAO,CAAA,UAAA,CAAW,GAAG,CAAA,EAAU,OAAA,IAAA;AACnC,EAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AACnB;AAyGgB,SAAA,iBAAA,CAAkB,OAAe,aAAuC,EAAA;AACtF,EAAO,OAAA,MAAA,CAAO,OAAO,aAAa,CAAA;AACpC;AAMO,SAAS,mBAAmB,WAAqC,EAAA;AACtE,EAAI,IAAA,CAAC,aAAoB,OAAA,KAAA;AACzB,EAAA,IAAI,CAAC,WAAA,CAAY,UAAW,CAAA,GAAG,GAAU,OAAA,KAAA;AACzC,EAAA,MAAM,SAAS,WAAY,CAAA,KAAA,CAAM,CAAC,CAAE,CAAA,OAAA,CAAQ,OAAO,EAAE,CAAA;AACrD,EAAA,OAAO,MAAO,CAAA,MAAA,IAAU,eAAmB,IAAA,MAAA,CAAO,MAAU,IAAA,eAAA;AAC9D"}
1
+ {"version":3,"file":"phoneNumbers.js","sources":["../../../src/features/messaging/phoneNumbers.ts"],"sourcesContent":["/**\n * Turning what the address book gives you into something matchable.\n *\n * This lives in the REMOTE, not the host, on purpose: it is pure logic with no\n * native dependency, it is where contact-matching actually goes wrong, and\n * keeping it here means a normalisation bug is a surface deploy rather than an\n * App Store release. The `contacts` seam hands over RAW strings plus a region\n * hint precisely so this can own the problem.\n *\n * Deliberately NOT libphonenumber. That library is ~500KB and every byte ships\n * in the remote bundle on every cold launch. What follows handles the cases\n * that actually occur in an address book; anything it cannot confidently place\n * is DROPPED rather than guessed, because a wrong match shows someone a\n * stranger's name attached to their friend's number, which is far worse than\n * simply not finding them.\n */\n\n/** National trunk prefixes stripped before applying a country code. */\nconst TRUNK_PREFIXES: Record<string, string> = {\n // The overwhelmingly common case: a single leading 0.\n DEFAULT: '0',\n // Italy is the notable exception - the leading 0 is part of the number.\n IT: '',\n};\n\n/** Country calling codes for the regions a device is likely to report. */\nconst CALLING_CODES: Record<string, string> = {\n US: '1',\n CA: '1',\n GB: '44',\n IE: '353',\n FR: '33',\n DE: '49',\n ES: '34',\n IT: '39',\n NL: '31',\n BE: '32',\n CH: '41',\n AT: '43',\n SE: '46',\n NO: '47',\n DK: '45',\n FI: '358',\n PL: '48',\n PT: '351',\n GR: '30',\n CZ: '420',\n RO: '40',\n HU: '36',\n UA: '380',\n RU: '7',\n TR: '90',\n IL: '972',\n AE: '971',\n SA: '966',\n QA: '974',\n KW: '965',\n IN: '91',\n PK: '92',\n BD: '880',\n LK: '94',\n NP: '977',\n CN: '86',\n JP: '81',\n KR: '82',\n TW: '886',\n HK: '852',\n SG: '65',\n MY: '60',\n TH: '66',\n VN: '84',\n PH: '63',\n ID: '62',\n AU: '61',\n NZ: '64',\n ZA: '27',\n NG: '234',\n KE: '254',\n EG: '20',\n GH: '233',\n BR: '55',\n MX: '52',\n AR: '54',\n CL: '56',\n CO: '57',\n PE: '51',\n};\n\n/** Longest calling code is 4 digits; shortest E.164 subscriber part is ~4. */\nconst MIN_E164_DIGITS = 7;\nconst MAX_E164_DIGITS = 15;\n\n/**\n * Normalise one raw address-book string to E.164 (`+<digits>`), or null.\n *\n * Returns null rather than a best guess whenever the result would be\n * speculative - see the file header for why a miss beats a wrong match.\n */\nexport function toE164(raw: string, defaultRegion?: string | null): string | null {\n if (typeof raw !== 'string') return null;\n\n // Strip everything a human might type: spaces, dashes, dots, parens,\n // and the invisible bidi marks iOS inserts around RTL-locale numbers.\n const cleaned = raw.replace(/[\\s\\-().‎‏؜]/g, '');\n if (!cleaned) return null;\n\n // Extensions are not diallable identity - \"555123456x89\" is one person.\n const withoutExt = cleaned.split(/[,;xX#]/)[0];\n if (!withoutExt) return null;\n\n let digits: string;\n if (withoutExt.startsWith('+')) {\n digits = withoutExt.slice(1).replace(/\\D/g, '');\n } else if (withoutExt.startsWith('00')) {\n // The international prefix used across most of Europe and Asia.\n digits = withoutExt.slice(2).replace(/\\D/g, '');\n } else {\n const region = (defaultRegion ?? '').toUpperCase();\n const cc = CALLING_CODES[region];\n // No region and no international prefix: the number is meaningless\n // without knowing where it was dialled from. Drop it.\n if (!cc) return null;\n\n let national = withoutExt.replace(/\\D/g, '');\n const trunk = region in TRUNK_PREFIXES ? TRUNK_PREFIXES[region] : TRUNK_PREFIXES.DEFAULT;\n if (trunk && national.startsWith(trunk)) national = national.slice(trunk.length);\n\n // A number that already begins with its own country code and is\n // plausibly full-length is international-without-the-plus, not a\n // national number that happens to start with those digits.\n digits =\n national.startsWith(cc) && national.length >= MIN_E164_DIGITS + cc.length - 1 ? national : cc + national;\n }\n\n if (digits.length < MIN_E164_DIGITS || digits.length > MAX_E164_DIGITS) return null;\n // A leading zero after the country code means the trunk prefix survived.\n if (digits.startsWith('0')) return null;\n\n return `+${digits}`;\n}\n\n/**\n * Region implied by an E.164 number's calling code (longest match wins), or null.\n * `+1` resolves to US, which parses identically to CA.\n */\nexport function regionFromE164(e164: string | null | undefined): string | null {\n if (!e164 || !e164.startsWith('+')) return null;\n const digits = e164.slice(1);\n let best: { region: string; len: number } | null = null;\n for (const [region, cc] of Object.entries(CALLING_CODES)) {\n if (digits.startsWith(cc) && (!best || cc.length > best.len)) best = { region, len: cc.length };\n }\n return best?.region ?? null;\n}\n\n/**\n * Every distinct E.164 number a contact has, in address-book order.\n *\n * De-duplicated because the same person routinely appears with the same number\n * written two ways (\"+1 555…\" and \"(555) …\"), and matching the same number\n * twice would show them twice in the results.\n */\nexport function contactE164s(\n phoneNumbers: readonly string[],\n defaultRegion?: string | null | readonly (string | null | undefined)[],\n): string[] {\n // A number saved without a country code is ambiguous, so each candidate region\n // contributes an interpretation. The server only matches verified member numbers,\n // so extra candidates cannot produce a match that is not real.\n const regions = Array.isArray(defaultRegion) ? defaultRegion : [defaultRegion as string | null | undefined];\n const seen = new Set<string>();\n for (const raw of phoneNumbers) {\n for (const region of regions) {\n const e164 = toE164(raw, region);\n if (e164) seen.add(e164);\n }\n }\n return Array.from(seen);\n}\n\nexport interface NormalizedContact {\n /** The device's stable id, echoed back so a match can be re-attached. */\n id: string;\n displayName: string;\n imageUri?: string | null;\n /** Distinct E.164 candidates; never empty (contacts without any are dropped). */\n e164: string[];\n /** Numbers exactly as saved in the address book, for display and SMS. */\n rawNumbers?: string[];\n}\n\n/**\n * Normalise a whole address book, dropping anything unmatchable.\n *\n * Also drops the viewer's OWN number, so nobody is offered a chat with\n * themselves - which happens on essentially every real device, because people\n * save their own contact card.\n */\nexport function normalizeContacts(\n contacts: ReadonlyArray<{ id: string; displayName: string; phoneNumbers: string[]; imageUri?: string | null }>,\n defaultRegion?: string | null | readonly (string | null | undefined)[],\n viewerE164?: string | null,\n): NormalizedContact[] {\n const mine = new Set(viewerE164 ? contactE164s([viewerE164], defaultRegion) : []);\n const out: NormalizedContact[] = [];\n for (const c of contacts) {\n const e164 = contactE164s(c.phoneNumbers ?? [], defaultRegion);\n // Any interpretation equal to the viewer's own number means this is their own card.\n if (!e164.length || e164.some((n) => mine.has(n))) continue;\n out.push({\n id: c.id,\n displayName: c.displayName,\n imageUri: c.imageUri ?? null,\n e164,\n rawNumbers: (c.phoneNumbers ?? []).map((n) => n.trim()).filter(Boolean),\n });\n }\n return out;\n}\n\n/**\n * The full set of numbers to ask the server about, capped.\n *\n * Address books of several thousand entries are ordinary, and the cap keeps one\n * request from becoming megabytes. Callers page through the rest.\n */\nexport function collectLookupNumbers(contacts: readonly NormalizedContact[], limit = 1000): string[] {\n const seen = new Set<string>();\n for (const c of contacts) {\n for (const n of c.e164) {\n seen.add(n);\n if (seen.size >= limit) return Array.from(seen);\n }\n }\n return Array.from(seen);\n}\n\n/**\n * Format a phone number string (user input) to E.164 format.\n * Used by the registration screen to normalize phone input before verification.\n */\nexport function formatPhoneNumber(input: string, defaultRegion?: string): string | null {\n return toE164(input, defaultRegion);\n}\n\n/**\n * Validate if a phone number string is a valid E.164 number.\n * Returns true if the number can be normalized to E.164 format.\n */\nexport function isValidPhoneNumber(phoneNumber: string | null): boolean {\n if (!phoneNumber) return false;\n if (!phoneNumber.startsWith('+')) return false;\n const digits = phoneNumber.slice(1).replace(/\\D/g, '');\n return digits.length >= MIN_E164_DIGITS && digits.length <= MAX_E164_DIGITS;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ const K = new Uint32Array([1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298]);
2
+ function utf8Bytes(str) {
3
+ const out = [];
4
+ for (let i = 0; i < str.length; i += 1) {
5
+ let c = str.charCodeAt(i);
6
+ if (c < 128) {
7
+ out.push(c);
8
+ } else if (c < 2048) {
9
+ out.push(192 | c >> 6, 128 | c & 63);
10
+ } else if (c >= 55296 && c <= 56319 && i + 1 < str.length) {
11
+ const lo = str.charCodeAt(i + 1);
12
+ c = 65536 + (c - 55296 << 10) + (lo - 56320);
13
+ i += 1;
14
+ out.push(240 | c >> 18, 128 | c >> 12 & 63, 128 | c >> 6 & 63, 128 | c & 63);
15
+ } else {
16
+ out.push(224 | c >> 12, 128 | c >> 6 & 63, 128 | c & 63);
17
+ }
18
+ }
19
+ return new Uint8Array(out);
20
+ }
21
+ const rotr = (x, n) => x >>> n | x << 32 - n;
22
+ function sha256(message) {
23
+ const bytes = utf8Bytes(message);
24
+ const bitLen = bytes.length * 8;
25
+ const padded = new Uint8Array((bytes.length + 8 >> 6) + 1 << 6);
26
+ padded.set(bytes);
27
+ padded[bytes.length] = 128;
28
+ const dv = new DataView(padded.buffer);
29
+ dv.setUint32(padded.length - 4, bitLen >>> 0, false);
30
+ const h = new Uint32Array([1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225]);
31
+ const w = new Uint32Array(64);
32
+ for (let off = 0; off < padded.length; off += 64) {
33
+ for (let i = 0; i < 16; i += 1) w[i] = dv.getUint32(off + i * 4, false);
34
+ for (let i = 16; i < 64; i += 1) {
35
+ const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ w[i - 15] >>> 3;
36
+ const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ w[i - 2] >>> 10;
37
+ w[i] = w[i - 16] + s0 + w[i - 7] + s1 >>> 0;
38
+ }
39
+ let [a, b, c, d, e, f, g, hh] = h;
40
+ for (let i = 0; i < 64; i += 1) {
41
+ const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
42
+ const ch = e & f ^ ~e & g;
43
+ const t1 = hh + S1 + ch + K[i] + w[i] >>> 0;
44
+ const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
45
+ const maj = a & b ^ a & c ^ b & c;
46
+ const t2 = S0 + maj >>> 0;
47
+ hh = g;
48
+ g = f;
49
+ f = e;
50
+ e = d + t1 >>> 0;
51
+ d = c;
52
+ c = b;
53
+ b = a;
54
+ a = t1 + t2 >>> 0;
55
+ }
56
+ h[0] = h[0] + a >>> 0;
57
+ h[1] = h[1] + b >>> 0;
58
+ h[2] = h[2] + c >>> 0;
59
+ h[3] = h[3] + d >>> 0;
60
+ h[4] = h[4] + e >>> 0;
61
+ h[5] = h[5] + f >>> 0;
62
+ h[6] = h[6] + g >>> 0;
63
+ h[7] = h[7] + hh >>> 0;
64
+ }
65
+ let hex = "";
66
+ for (let i = 0; i < 8; i += 1) hex += h[i].toString(16).padStart(8, "0");
67
+ return hex;
68
+ }export{sha256};//# sourceMappingURL=sha256.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha256.js","sources":["../../../src/features/messaging/sha256.ts"],"sourcesContent":["/**\n * SHA-256, in plain JavaScript.\n *\n * The chat remote hashes phone numbers before sending them, so the server never\n * receives a plaintext address book. It cannot use `node:crypto` (not in React\n * Native) and it cannot use `expo-crypto` (a native module - a federated remote\n * adds zero native code, and routing it through a host seam would mean an app\n * build every time the hashing changed). So: ~60 lines of arithmetic, no\n * dependency, fixable over the air.\n *\n * Speed is adequate for the job. A 2000-entry address book is ~2000 hashes of a\n * ~13-byte input, which is a single block each - milliseconds in total, done\n * once per contact sync rather than per render.\n *\n * `sha256.test.ts` checks it against the published NIST vectors AND against\n * Node's own crypto over a spread of inputs, because a subtly wrong hash here\n * would not crash - it would silently match nobody, which is the hardest kind\n * of bug to see.\n */\n\n/** First 32 bits of the fractional parts of the cube roots of the first 64 primes. */\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98,\n 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8,\n 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819,\n 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7,\n 0xc67178f2,\n]);\n\n/** UTF-8 bytes. Phone numbers are ASCII, but names and junk input may not be. */\nfunction utf8Bytes(str: string): Uint8Array {\n const out: number[] = [];\n for (let i = 0; i < str.length; i += 1) {\n let c = str.charCodeAt(i);\n if (c < 0x80) {\n out.push(c);\n } else if (c < 0x800) {\n out.push(0xc0 | (c >> 6), 0x80 | (c & 0x3f));\n } else if (c >= 0xd800 && c <= 0xdbff && i + 1 < str.length) {\n // Surrogate pair -> one code point.\n const lo = str.charCodeAt(i + 1);\n c = 0x10000 + ((c - 0xd800) << 10) + (lo - 0xdc00);\n i += 1;\n out.push(0xf0 | (c >> 18), 0x80 | ((c >> 12) & 0x3f), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n } else {\n out.push(0xe0 | (c >> 12), 0x80 | ((c >> 6) & 0x3f), 0x80 | (c & 0x3f));\n }\n }\n return new Uint8Array(out);\n}\n\nconst rotr = (x: number, n: number) => (x >>> n) | (x << (32 - n));\n\n/** Lowercase hex digest of the UTF-8 bytes of `message`. */\nexport function sha256(message: string): string {\n const bytes = utf8Bytes(message);\n const bitLen = bytes.length * 8;\n\n // Pad to a multiple of 64 bytes: 0x80, zeros, then the length as a 64-bit\n // big-endian integer.\n const padded = new Uint8Array((((bytes.length + 8) >> 6) + 1) << 6);\n padded.set(bytes);\n padded[bytes.length] = 0x80;\n // Lengths beyond 2^32 bits cannot occur here, so the high word stays zero.\n const dv = new DataView(padded.buffer);\n dv.setUint32(padded.length - 4, bitLen >>> 0, false);\n\n const h = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const w = new Uint32Array(64);\n\n for (let off = 0; off < padded.length; off += 64) {\n for (let i = 0; i < 16; i += 1) w[i] = dv.getUint32(off + i * 4, false);\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, hh] = h;\n for (let i = 0; i < 64; i += 1) {\n const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const t1 = (hh + S1 + ch + K[i] + w[i]) >>> 0;\n const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const t2 = (S0 + maj) >>> 0;\n hh = g;\n g = f;\n f = e;\n e = (d + t1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (t1 + t2) >>> 0;\n }\n h[0] = (h[0] + a) >>> 0;\n h[1] = (h[1] + b) >>> 0;\n h[2] = (h[2] + c) >>> 0;\n h[3] = (h[3] + d) >>> 0;\n h[4] = (h[4] + e) >>> 0;\n h[5] = (h[5] + f) >>> 0;\n h[6] = (h[6] + g) >>> 0;\n h[7] = (h[7] + hh) >>> 0;\n }\n\n let hex = '';\n for (let i = 0; i < 8; i += 1) hex += h[i].toString(16).padStart(8, '0');\n return hex;\n}\n"],"names":[],"mappings":"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"}