From d8bd57901e33a7057e26e782e295099ffcc0da89 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Wed, 6 Sep 2017 23:04:13 -0700 Subject: Removing webapp --- webapp/utils/channel_intro_messages.jsx | 389 --------- webapp/utils/channel_utils.jsx | 325 ------- webapp/utils/commons.jsx | 20 - webapp/utils/constants.jsx | 1004 --------------------- webapp/utils/delayed_action.jsx | 31 - webapp/utils/emoji.jsx | 15 - webapp/utils/emoticons.jsx | 66 -- webapp/utils/event_types.jsx | 8 - webapp/utils/file_utils.jsx | 24 - webapp/utils/global_event_emitter.jsx | 27 - webapp/utils/latinise.jsx | 1003 --------------------- webapp/utils/license_utils.jsx | 39 - webapp/utils/markdown.jsx | 270 ------ webapp/utils/post_utils.jsx | 127 --- webapp/utils/syntax_highlighting.jsx | 171 ---- webapp/utils/team_utils.jsx | 27 - webapp/utils/text_formatting.jsx | 504 ----------- webapp/utils/url.jsx | 29 - webapp/utils/user_agent.jsx | 115 --- webapp/utils/utils.jsx | 1441 ------------------------------- 20 files changed, 5635 deletions(-) delete mode 100644 webapp/utils/channel_intro_messages.jsx delete mode 100644 webapp/utils/channel_utils.jsx delete mode 100644 webapp/utils/commons.jsx delete mode 100644 webapp/utils/constants.jsx delete mode 100644 webapp/utils/delayed_action.jsx delete mode 100644 webapp/utils/emoji.jsx delete mode 100644 webapp/utils/emoticons.jsx delete mode 100644 webapp/utils/event_types.jsx delete mode 100644 webapp/utils/file_utils.jsx delete mode 100644 webapp/utils/global_event_emitter.jsx delete mode 100644 webapp/utils/latinise.jsx delete mode 100644 webapp/utils/license_utils.jsx delete mode 100644 webapp/utils/markdown.jsx delete mode 100644 webapp/utils/post_utils.jsx delete mode 100644 webapp/utils/syntax_highlighting.jsx delete mode 100644 webapp/utils/team_utils.jsx delete mode 100644 webapp/utils/text_formatting.jsx delete mode 100644 webapp/utils/url.jsx delete mode 100644 webapp/utils/user_agent.jsx delete mode 100644 webapp/utils/utils.jsx (limited to 'webapp/utils') diff --git a/webapp/utils/channel_intro_messages.jsx b/webapp/utils/channel_intro_messages.jsx deleted file mode 100644 index f85b0cf87..000000000 --- a/webapp/utils/channel_intro_messages.jsx +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import * as Utils from './utils.jsx'; -import ChannelInviteModal from 'components/channel_invite_modal'; -import EditChannelHeaderModal from 'components/edit_channel_header_modal.jsx'; -import ToggleModalButton from 'components/toggle_modal_button.jsx'; -import UserProfile from 'components/user_profile.jsx'; -import ChannelStore from 'stores/channel_store.jsx'; -import UserStore from 'stores/user_store.jsx'; -import TeamStore from 'stores/team_store.jsx'; -import Constants from 'utils/constants.jsx'; -import * as GlobalActions from 'actions/global_actions.jsx'; -import ProfilePicture from 'components/profile_picture.jsx'; - -import {showManagementOptions} from './channel_utils.jsx'; - -import React from 'react'; -import {FormattedMessage, FormattedHTMLMessage, FormattedDate} from 'react-intl'; - -export function createChannelIntroMessage(channel, fullWidthIntro) { - let centeredIntro = ''; - if (!fullWidthIntro) { - centeredIntro = 'channel-intro--centered'; - } - - if (channel.type === Constants.DM_CHANNEL) { - return createDMIntroMessage(channel, centeredIntro); - } else if (channel.type === Constants.GM_CHANNEL) { - return createGMIntroMessage(channel, centeredIntro); - } else if (ChannelStore.isDefault(channel)) { - return createDefaultIntroMessage(channel, centeredIntro); - } else if (channel.name === Constants.OFFTOPIC_CHANNEL) { - return createOffTopicIntroMessage(channel, centeredIntro); - } else if (channel.type === 'O' || channel.type === 'P') { - return createStandardIntroMessage(channel, centeredIntro); - } - return null; -} - -export function createGMIntroMessage(channel, centeredIntro) { - const profiles = UserStore.getProfileListInChannel(channel.id, true); - - if (profiles.length > 0) { - const pictures = []; - let names = ''; - for (let i = 0; i < profiles.length; i++) { - const profile = profiles[i]; - - pictures.push( - - ); - - if (i === profiles.length - 1) { - names += Utils.displayUsernameForUser(profile); - } else if (i === profiles.length - 2) { - names += Utils.displayUsernameForUser(profile) + ' and '; - } else { - names += Utils.displayUsernameForUser(profile) + ', '; - } - } - - return ( -
-
- {pictures} -
-

- -

- {createSetHeaderButton(channel)} -
- ); - } - - return ( -
-

- -

-
- ); -} - -export function createDMIntroMessage(channel, centeredIntro) { - var teammate = Utils.getDirectTeammate(channel.id); - - if (teammate) { - var teammateName = teammate.username; - if (teammate.nickname.length > 0) { - teammateName = teammate.nickname; - } - - return ( -
-
- -
-
- - - -
-

- -

- {createSetHeaderButton(channel)} -
- ); - } - - return ( -
-

- -

-
- ); -} - -export function createOffTopicIntroMessage(channel, centeredIntro) { - var uiType = ( - - ); - - const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel(); - const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam(); - const isSystemAdmin = UserStore.isSystemAdminForCurrentUser(); - - let setHeaderButton = createSetHeaderButton(channel); - if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) { - setHeaderButton = null; - } - - return ( -
- - {createInviteChannelMemberButton(channel, uiType)} - {setHeaderButton} -
- ); -} - -export function createDefaultIntroMessage(channel, centeredIntro) { - let inviteModalLink = ( - - - - - ); - - const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel(); - const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam(); - const isSystemAdmin = UserStore.isSystemAdminForCurrentUser(); - - if (global.window.mm_license.IsLicensed === 'true') { - if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - inviteModalLink = null; - } else if (global.window.mm_config.RestrictTeamInvite === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - inviteModalLink = null; - } - } - - let setHeaderButton = createSetHeaderButton(channel); - if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) { - setHeaderButton = null; - } - - return ( -
- - {inviteModalLink} - {setHeaderButton} -
-
- ); -} - -export function createStandardIntroMessage(channel, centeredIntro) { - var uiName = channel.display_name; - var creatorName = Utils.displayUsername(channel.creator_id); - var uiType; - var memberMessage; - - if (channel.type === 'P') { - uiType = ( - - ); - memberMessage = ( - - ); - } else { - uiType = ( - - ); - memberMessage = ( - - ); - } - - const date = ( - - ); - - var createMessage; - if (creatorName === '') { - createMessage = ( - - ); - } else { - createMessage = ( - - - - ); - } - - var purposeMessage = ''; - if (channel.purpose && channel.purpose !== '') { - purposeMessage = ( - - - - ); - } - - const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel(); - const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam(); - const isSystemAdmin = UserStore.isSystemAdminForCurrentUser(); - - let setHeaderButton = createSetHeaderButton(channel); - if (!showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin)) { - setHeaderButton = null; - } - - return ( -
-

- -

-

- {createMessage} - {memberMessage} - {purposeMessage} -
-

- {createInviteChannelMemberButton(channel, uiType)} - {setHeaderButton} -
- ); -} - -function createInviteChannelMemberButton(channel, uiType) { - return ( - - - - - ); -} - -function createSetHeaderButton(channel) { - return ( - - - - - ); -} diff --git a/webapp/utils/channel_utils.jsx b/webapp/utils/channel_utils.jsx deleted file mode 100644 index d9887ff89..000000000 --- a/webapp/utils/channel_utils.jsx +++ /dev/null @@ -1,325 +0,0 @@ - -import Constants from 'utils/constants.jsx'; -const Preferences = Constants.Preferences; - -import * as Utils from 'utils/utils.jsx'; - -import UserStore from 'stores/user_store.jsx'; -import ChannelStore from 'stores/channel_store.jsx'; -import TeamStore from 'stores/team_store.jsx'; -import PreferenceStore from 'stores/preference_store.jsx'; -import LocalizationStore from 'stores/localization_store.jsx'; - -/** - * Returns list of sorted channels grouped by type. Favorites here is considered as separated type. - * - * Example: { - * publicChannels: [...], - * privateChannels: [...], - * directAndGroupChannels: [...], - * favoriteChannels: [...] - * } - */ -export function buildDisplayableChannelList(persistentChannels) { - const missingDirectChannels = createMissingDirectChannels(persistentChannels); - - const channels = persistentChannels. - concat(missingDirectChannels). - map(completeDirectChannelInfo). - filter(isNotDeletedChannel). - sort(sortChannelsByDisplayName); - - const favoriteChannels = channels.filter(isFavoriteChannel); - const notFavoriteChannels = channels.filter(not(isFavoriteChannel)); - const directAndGroupChannels = notFavoriteChannels.filter(orX(andX(isGroupChannel, isGroupChannelVisible), andX(isDirectChannel, isDirectChannelVisible))); - - return { - favoriteChannels, - publicChannels: notFavoriteChannels.filter(isOpenChannel), - privateChannels: notFavoriteChannels.filter(isPrivateChannel), - directAndGroupChannels - }; -} - -export function isFavoriteChannel(channel) { - return PreferenceStore.getBool(Preferences.CATEGORY_FAVORITE_CHANNEL, channel.id); -} - -export function isFavoriteChannelId(channelId) { - return PreferenceStore.getBool(Preferences.CATEGORY_FAVORITE_CHANNEL, channelId); -} - -export function isNotDeletedChannel(channel) { - return channel.delete_at === 0; -} - -export function isOpenChannel(channel) { - return channel.type === Constants.OPEN_CHANNEL; -} - -export function isPrivateChannel(channel) { - return channel.type === Constants.PRIVATE_CHANNEL; -} - -export function isGroupChannel(channel) { - return channel.type === Constants.GM_CHANNEL; -} - -export function isGroupChannelVisible(channel) { - return PreferenceStore.getBool(Preferences.CATEGORY_GROUP_CHANNEL_SHOW, channel.id); -} - -export function isDirectChannel(channel) { - return channel.type === Constants.DM_CHANNEL; -} - -export function isDirectChannelVisible(channel) { - const channelId = Utils.getUserIdFromChannelName(channel); - - return PreferenceStore.getBool(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW, channelId); -} - -export function completeDirectChannelInfo(channel) { - if (!isDirectChannel(channel)) { - return channel; - } - - const dmChannelClone = JSON.parse(JSON.stringify(channel)); - const teammateId = Utils.getUserIdFromChannelName(channel); - - return Object.assign(dmChannelClone, { - display_name: Utils.displayUsername(teammateId), - teammate_id: teammateId, - status: UserStore.getStatus(teammateId) || 'offline' - }); -} - -const defaultPrefix = 'D'; // fallback for future types -const typeToPrefixMap = {[Constants.OPEN_CHANNEL]: 'A', [Constants.PRIVATE_CHANNEL]: 'B', [Constants.DM_CHANNEL]: 'C', [Constants.GM_CHANNEL]: 'C'}; - -export function sortChannelsByDisplayName(a, b) { - const locale = LocalizationStore.getLocale(); - - if (a.type !== b.type && typeToPrefixMap[a.type] !== typeToPrefixMap[b.type]) { - return (typeToPrefixMap[a.type] || defaultPrefix).localeCompare((typeToPrefixMap[b.type] || defaultPrefix), locale); - } - - const aDisplayName = getChannelDisplayName(a); - const bDisplayName = getChannelDisplayName(b); - - if (aDisplayName !== null && bDisplayName !== null && aDisplayName !== bDisplayName) { - return aDisplayName.localeCompare(bDisplayName, locale, {numeric: true}); - } - - return a.name.localeCompare(b.name, locale, {numeric: true}); -} - -const MAX_CHANNEL_NAME_LENGTH = 64; - -export function getChannelDisplayName(channel) { - if (channel.type !== Constants.GM_CHANNEL) { - return channel.display_name; - } - - const currentUser = UserStore.getCurrentUser(); - - if (currentUser) { - let displayName = channel.display_name; - if (displayName.length >= MAX_CHANNEL_NAME_LENGTH) { - displayName += '...'; - } - displayName = displayName.replace(currentUser.username + ', ', '').replace(currentUser.username, '').trim(); - if (displayName[displayName.length - 1] === ',') { - return displayName.slice(0, -1); - } - return displayName; - } - - return channel.display_name; -} - -export function showCreateOption(channelType, isTeamAdmin, isSystemAdmin) { - if (global.window.mm_license.IsLicensed !== 'true') { - return true; - } - - if (channelType === Constants.OPEN_CHANNEL) { - if (global.window.mm_config.RestrictPublicChannelCreation === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } else if (global.window.mm_config.RestrictPublicChannelCreation === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - } else if (channelType === Constants.PRIVATE_CHANNEL) { - if (global.window.mm_config.RestrictPrivateChannelCreation === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } else if (global.window.mm_config.RestrictPrivateChannelCreation === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - } - - return true; -} - -export function showManagementOptions(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) { - if (global.window.mm_license.IsLicensed !== 'true') { - // policies are only enforced in enterprise editions - return true; - } - - if (channel.type === Constants.OPEN_CHANNEL) { - if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPublicChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } - } else if (channel.type === Constants.PRIVATE_CHANNEL) { - if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelManagement === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } - } - - return true; -} - -export function showDeleteOptionForCurrentUser(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) { - if (global.window.mm_license.IsLicensed !== 'true') { - // policies are only enforced in enterprise editions - return true; - } - - if (ChannelStore.isDefault(channel)) { - // can't delete default channels, no matter who you are - return false; - } - - if (channel.type === Constants.OPEN_CHANNEL) { - if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPublicChannelDeletion === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } - } else if (channel.type === Constants.PRIVATE_CHANNEL) { - if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelDeletion === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } - } - - return true; -} - -export function canManageMembers(channel, isChannelAdmin, isTeamAdmin, isSystemAdmin) { - if (global.window.mm_license.IsLicensed !== 'true') { - return true; - } - - if (channel.type === Constants.PRIVATE_CHANNEL) { - if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_CHANNEL_ADMIN && !(isChannelAdmin || isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_TEAM_ADMIN && !(isTeamAdmin || isSystemAdmin)) { - return false; - } - if (global.window.mm_config.RestrictPrivateChannelManageMembers === Constants.PERMISSIONS_SYSTEM_ADMIN && !isSystemAdmin) { - return false; - } - } - - return true; -} - -export function buildGroupChannelName(channelId) { - const profiles = UserStore.getProfileListInChannel(channelId, true); - let displayName = ''; - for (let i = 0; i < profiles.length; i++) { - displayName += Utils.displayUsernameForUser(profiles[i]); - if (i !== profiles.length - 1) { - displayName += ', '; - } - } - - return displayName; -} - -export function getCountsStateFromStores(team = TeamStore.getCurrent(), teamMembers = TeamStore.getMyTeamMembers(), unreadCounts = ChannelStore.getUnreadCounts()) { - let mentionCount = 0; - let messageCount = 0; - - teamMembers.forEach((member) => { - if (member.team_id !== TeamStore.getCurrentId()) { - mentionCount += (member.mention_count || 0); - messageCount += (member.msg_count || 0); - } - }); - - Object.keys(unreadCounts).forEach((chId) => { - const channel = ChannelStore.get(chId); - - if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL || channel.team_id === team.id)) { - messageCount += unreadCounts[chId].msgs; - mentionCount += unreadCounts[chId].mentions; - } - }); - - return {mentionCount, messageCount}; -} - -/* - * not exported helpers - */ - -function createMissingDirectChannels(channels) { - const directChannelsDisplayPreferences = PreferenceStore.getCategory(Preferences.CATEGORY_DIRECT_CHANNEL_SHOW); - - return Array. - from(directChannelsDisplayPreferences). - filter((entry) => entry[1] === 'true'). - map((entry) => entry[0]). - filter((teammateId) => !channels.some(Utils.isDirectChannelForUser.bind(null, teammateId))). - map(createFakeChannelCurried(UserStore.getCurrentId())); -} - -function createFakeChannel(userId, otherUserId) { - return { - name: Utils.getDirectChannelName(userId, otherUserId), - last_post_at: 0, - total_msg_count: 0, - type: Constants.DM_CHANNEL, - fake: true - }; -} - -function createFakeChannelCurried(userId) { - return (otherUserId) => createFakeChannel(userId, otherUserId); -} - -function not(f) { - return (...args) => !f(...args); -} - -function orX(...fns) { - return (...args) => fns.some((f) => f(...args)); -} - -function andX(...fns) { - return (...args) => fns.every((f) => f(...args)); -} diff --git a/webapp/utils/commons.jsx b/webapp/utils/commons.jsx deleted file mode 100644 index 224653df7..000000000 --- a/webapp/utils/commons.jsx +++ /dev/null @@ -1,20 +0,0 @@ -export function getDistanceBW2Points(point1, point2, xAttr = 'x', yAttr = 'y') { - return Math.sqrt(Math.pow(point1[xAttr] - point2[xAttr], 2) + Math.pow(point1[yAttr] - point2[yAttr], 2)); -} - -/** - * Funtion to return nearest point of given pivot point. - * It return two points one nearest and other nearest but having both coorditanes smaller than the given point's coordinates. - */ -export function getNearestPoint(pivotPoint, points, xAttr = 'x', yAttr = 'y') { - var nearestPoint = {}; - for (const point of points) { - if (typeof nearestPoint[xAttr] === 'undefined' || typeof nearestPoint[yAttr] === 'undefined') { - nearestPoint = point; - } else if (getDistanceBW2Points(point, pivotPoint, xAttr, yAttr) < getDistanceBW2Points(nearestPoint, pivotPoint, xAttr, yAttr)) { - // Check for bestImage - nearestPoint = point; - } - } - return nearestPoint; -} diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx deleted file mode 100644 index 0741299fd..000000000 --- a/webapp/utils/constants.jsx +++ /dev/null @@ -1,1004 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -/* eslint-disable no-magic-numbers */ - -import keyMirror from 'key-mirror'; - -import audioIcon from 'images/icons/audio.png'; -import videoIcon from 'images/icons/video.png'; -import excelIcon from 'images/icons/excel.png'; -import pptIcon from 'images/icons/ppt.png'; -import pdfIcon from 'images/icons/pdf.png'; -import codeIcon from 'images/icons/code.png'; -import wordIcon from 'images/icons/word.png'; -import patchIcon from 'images/icons/patch.png'; -import genericIcon from 'images/icons/generic.png'; - -import logoImage from 'images/logo_compact.png'; -import logoWebhook from 'images/webhook_icon.jpg'; - -import solarizedDarkCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/solarized-dark.css'; -import solarizedDarkIcon from 'images/themes/code_themes/solarized-dark.png'; - -import solarizedLightCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/solarized-light.css'; -import solarizedLightIcon from 'images/themes/code_themes/solarized-light.png'; - -import githubCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/github.css'; -import githubIcon from 'images/themes/code_themes/github.png'; - -import monokaiCSS from '!!file-loader?name=files/code_themes/[hash].[ext]!highlight.js/styles/monokai.css'; -import monokaiIcon from 'images/themes/code_themes/monokai.png'; - -import defaultThemeImage from 'images/themes/organization.png'; -import mattermostDarkThemeImage from 'images/themes/mattermost_dark.png'; -import mattermostThemeImage from 'images/themes/mattermost.png'; -import windows10ThemeImage from 'images/themes/windows_dark.png'; - -export const Preferences = { - CATEGORY_DIRECT_CHANNEL_SHOW: 'direct_channel_show', - CATEGORY_GROUP_CHANNEL_SHOW: 'group_channel_show', - CATEGORY_DISPLAY_SETTINGS: 'display_settings', - CATEGORY_ADVANCED_SETTINGS: 'advanced_settings', - TUTORIAL_STEP: 'tutorial_step', - CHANNEL_DISPLAY_MODE: 'channel_display_mode', - CHANNEL_DISPLAY_MODE_CENTERED: 'centered', - CHANNEL_DISPLAY_MODE_FULL_SCREEN: 'full', - CHANNEL_DISPLAY_MODE_DEFAULT: 'full', - MESSAGE_DISPLAY: 'message_display', - MESSAGE_DISPLAY_CLEAN: 'clean', - MESSAGE_DISPLAY_COMPACT: 'compact', - MESSAGE_DISPLAY_DEFAULT: 'clean', - COLLAPSE_DISPLAY: 'collapse_previews', - COLLAPSE_DISPLAY_DEFAULT: 'false', - USE_MILITARY_TIME: 'use_military_time', - CATEGORY_THEME: 'theme', - CATEGORY_FLAGGED_POST: 'flagged_post', - CATEGORY_NOTIFICATIONS: 'notifications', - CATEGORY_FAVORITE_CHANNEL: 'favorite_channel', - EMAIL_INTERVAL: 'email_interval', - INTERVAL_IMMEDIATE: 30, // "immediate" is a 30 second interval - INTERVAL_FIFTEEN_MINUTES: 15 * 60, - INTERVAL_HOUR: 60 * 60, - INTERVAL_NEVER: 0 -}; - -export const ActionTypes = keyMirror({ - RECEIVED_ERROR: null, - - CLICK_CHANNEL: null, - CREATE_CHANNEL: null, - CREATE_POST: null, - CREATE_COMMENT: null, - POST_DELETED: null, - POST_UPDATED: null, - REMOVE_POST: null, - - RECEIVED_CHANNELS: null, - RECEIVED_CHANNEL: null, - RECEIVED_CHANNEL_MEMBER: null, - RECEIVED_MORE_CHANNELS: null, - RECEIVED_CHANNEL_STATS: null, - RECEIVED_MY_CHANNEL_MEMBERS: null, - RECEIVED_MEMBERS_IN_CHANNEL: null, - - FOCUS_POST: null, - RECEIVED_POSTS: null, - RECEIVED_FOCUSED_POST: null, - RECEIVED_POST: null, - RECEIVED_EDIT_POST: null, - RECEIVED_SEARCH: null, - RECEIVED_SEARCH_TERM: null, - SELECT_POST: null, - RECEIVED_POST_SELECTED: null, - RECEIVED_MENTION_DATA: null, - RECEIVED_ADD_MENTION: null, - RECEIVED_POST_PINNED: null, - RECEIVED_POST_UNPINNED: null, - INCREASE_POST_VISIBILITY: null, - LOADING_POSTS: null, - - RECEIVED_PROFILES: null, - RECEIVED_PROFILES_IN_TEAM: null, - RECEIVED_PROFILES_NOT_IN_TEAM: null, - RECEIVED_PROFILE: null, - RECEIVED_PROFILES_IN_CHANNEL: null, - RECEIVED_PROFILES_NOT_IN_CHANNEL: null, - RECEIVED_PROFILES_WITHOUT_TEAM: null, - RECEIVED_ME: null, - RECEIVED_SESSIONS: null, - RECEIVED_AUDITS: null, - RECEIVED_TEAMS: null, - RECEIVED_STATUSES: null, - RECEIVED_PREFERENCE: null, - RECEIVED_PREFERENCES: null, - DELETED_PREFERENCES: null, - RECEIVED_FILE_INFOS: null, - RECEIVED_ANALYTICS: null, - - RECEIVED_INCOMING_WEBHOOKS: null, - RECEIVED_INCOMING_WEBHOOK: null, - UPDATED_INCOMING_WEBHOOK: null, - REMOVED_INCOMING_WEBHOOK: null, - RECEIVED_OUTGOING_WEBHOOKS: null, - RECEIVED_OUTGOING_WEBHOOK: null, - UPDATED_OUTGOING_WEBHOOK: null, - REMOVED_OUTGOING_WEBHOOK: null, - RECEIVED_COMMANDS: null, - RECEIVED_COMMAND: null, - UPDATED_COMMAND: null, - REMOVED_COMMAND: null, - RECEIVED_OAUTHAPPS: null, - RECEIVED_OAUTHAPP: null, - REMOVED_OAUTHAPP: null, - - RECEIVED_CUSTOM_EMOJIS: null, - RECEIVED_CUSTOM_EMOJI: null, - UPDATED_CUSTOM_EMOJI: null, - REMOVED_CUSTOM_EMOJI: null, - - RECEIVED_REACTIONS: null, - ADDED_REACTION: null, - REMOVED_REACTION: null, - - RECEIVED_MSG: null, - - RECEIVED_TEAM: null, - RECEIVED_MY_TEAM: null, - CREATED_TEAM: null, - UPDATE_TEAM: null, - - RECEIVED_CONFIG: null, - RECEIVED_LOGS: null, - RECEIVED_SERVER_AUDITS: null, - RECEIVED_SERVER_COMPLIANCE_REPORTS: null, - RECEIVED_ALL_TEAMS: null, - RECEIVED_ALL_TEAM_LISTINGS: null, - RECEIVED_MY_TEAM_MEMBERS: null, - RECEIVED_MY_TEAMS_UNREAD: null, - RECEIVED_MEMBERS_IN_TEAM: null, - RECEIVED_TEAM_STATS: null, - - RECEIVED_LOCALE: null, - - UPDATE_OPEN_GRAPH_METADATA: null, - RECIVED_OPEN_GRAPH_METADATA: null, - - SHOW_SEARCH: null, - - USER_TYPING: null, - - TOGGLE_ACCOUNT_SETTINGS_MODAL: null, - TOGGLE_SHORTCUTS_MODAL: null, - TOGGLE_IMPORT_THEME_MODAL: null, - TOGGLE_INVITE_MEMBER_MODAL: null, - TOGGLE_LEAVE_TEAM_MODAL: null, - TOGGLE_DELETE_POST_MODAL: null, - TOGGLE_GET_POST_LINK_MODAL: null, - TOGGLE_GET_TEAM_INVITE_LINK_MODAL: null, - TOGGLE_GET_PUBLIC_LINK_MODAL: null, - TOGGLE_DM_MODAL: null, - TOGGLE_QUICK_SWITCH_MODAL: null, - TOGGLE_CHANNEL_HEADER_UPDATE_MODAL: null, - TOGGLE_CHANNEL_PURPOSE_UPDATE_MODAL: null, - TOGGLE_CHANNEL_NAME_UPDATE_MODAL: null, - TOGGLE_LEAVE_PRIVATE_CHANNEL_MODAL: null, - - SUGGESTION_PRETEXT_CHANGED: null, - SUGGESTION_RECEIVED_SUGGESTIONS: null, - SUGGESTION_CLEAR_SUGGESTIONS: null, - SUGGESTION_COMPLETE_WORD: null, - SUGGESTION_SELECT_NEXT: null, - SUGGESTION_SELECT_PREVIOUS: null, - - BROWSER_CHANGE_FOCUS: null, - - EMOJI_POSTED: null, - - RECEIVED_PLUGIN_COMPONENTS: null -}); - -export const WebrtcActionTypes = keyMirror({ - INITIALIZE: null, - NOTIFY: null, - CHANGED: null, - ANSWER: null, - DECLINE: null, - CANCEL: null, - NO_ANSWER: null, - BUSY: null, - FAILED: null, - UNSUPPORTED: null, - MUTED: null, - IN_PROGRESS: null, - DISABLED: null, - RHS: null -}); - -export const UserStatuses = { - OFFLINE: 'offline', - AWAY: 'away', - ONLINE: 'online' -}; - -export const UserSearchOptions = { - ALLOW_INACTIVE: 'allow_inactive', - WITHOUT_TEAM: 'without_team' -}; - -export const SocketEvents = { - POSTED: 'posted', - POST_EDITED: 'post_edited', - POST_DELETED: 'post_deleted', - POST_UPDATED: 'post_updated', - CHANNEL_CREATED: 'channel_created', - CHANNEL_DELETED: 'channel_deleted', - CHANNEL_UPDATED: 'channel_updated', - CHANNEL_VIEWED: 'channel_viewed', - DIRECT_ADDED: 'direct_added', - NEW_USER: 'new_user', - ADDED_TO_TEAM: 'added_to_team', - LEAVE_TEAM: 'leave_team', - UPDATE_TEAM: 'update_team', - USER_ADDED: 'user_added', - USER_REMOVED: 'user_removed', - USER_UPDATED: 'user_updated', - MEMBERROLE_UPDATED: 'memberrole_updated', - TYPING: 'typing', - PREFERENCE_CHANGED: 'preference_changed', - PREFERENCES_CHANGED: 'preferences_changed', - PREFERENCES_DELETED: 'preferences_deleted', - EPHEMERAL_MESSAGE: 'ephemeral_message', - STATUS_CHANGED: 'status_change', - HELLO: 'hello', - WEBRTC: 'webrtc', - REACTION_ADDED: 'reaction_added', - REACTION_REMOVED: 'reaction_removed', - EMOJI_ADDED: 'emoji_added' -}; - -export const TutorialSteps = { - INTRO_SCREENS: 0, - POST_POPOVER: 1, - CHANNEL_POPOVER: 2, - MENU_POPOVER: 3 -}; - -export const PostTypes = { - JOIN_LEAVE: 'system_join_leave', - JOIN_CHANNEL: 'system_join_channel', - LEAVE_CHANNEL: 'system_leave_channel', - ADD_TO_CHANNEL: 'system_add_to_channel', - REMOVE_FROM_CHANNEL: 'system_remove_from_channel', - ADD_REMOVE: 'system_add_remove', - HEADER_CHANGE: 'system_header_change', - DISPLAYNAME_CHANGE: 'system_displayname_change', - PURPOSE_CHANGE: 'system_purpose_change', - CHANNEL_DELETED: 'system_channel_deleted', - EPHEMERAL: 'system_ephemeral', - REMOVE_LINK_PREVIEW: 'remove_link_preview' -}; - -export const StatTypes = keyMirror({ - TOTAL_USERS: null, - TOTAL_PUBLIC_CHANNELS: null, - TOTAL_PRIVATE_GROUPS: null, - TOTAL_POSTS: null, - TOTAL_TEAMS: null, - TOTAL_FILE_POSTS: null, - TOTAL_HASHTAG_POSTS: null, - TOTAL_IHOOKS: null, - TOTAL_OHOOKS: null, - TOTAL_COMMANDS: null, - TOTAL_SESSIONS: null, - POST_PER_DAY: null, - USERS_WITH_POSTS_PER_DAY: null, - RECENTLY_ACTIVE_USERS: null, - NEWLY_CREATED_USERS: null, - TOTAL_WEBSOCKET_CONNECTIONS: null, - TOTAL_MASTER_DB_CONNECTIONS: null, - TOTAL_READ_DB_CONNECTIONS: null, - DAILY_ACTIVE_USERS: null, - MONTHLY_ACTIVE_USERS: null -}); - -export const ErrorPageTypes = { - LOCAL_STORAGE: 'local_storage', - OAUTH_MISSING_CODE: 'oauth_missing_code', - PAGE_NOT_FOUND: 'page_not_found', - PERMALINK_NOT_FOUND: 'permalink_not_found' -}; - -export const JobTypes = { - DATA_RETENTION: 'data_retention', - ELASTICSEARCH_POST_INDEXING: 'elasticsearch_post_indexing' -}; - -export const JobStatuses = { - PENDING: 'pending', - IN_PROGRESS: 'in_progress', - SUCCESS: 'success', - ERROR: 'error', - CANCEL_REQUESTED: 'cancel_requested', - CANCELED: 'canceled' -}; - -export const ErrorBarTypes = { - LICENSE_EXPIRING: 'error_bar.license_expiring', - LICENSE_EXPIRED: 'error_bar.license_expired', - LICENSE_PAST_GRACE: 'error_bar.past_grace', - PREVIEW_MODE: 'error_bar.preview_mode', - SITE_URL: 'error_bar.site_url', - WEBSOCKET_PORT_ERROR: 'channel_loader.socketError' -}; - -export const Constants = { - Preferences, - SocketEvents, - ActionTypes, - WebrtcActionTypes, - UserStatuses, - UserSearchOptions, - TutorialSteps, - PostTypes, - ErrorPageTypes, - ErrorBarTypes, - - MAX_POST_VISIBILITY: 1000000, - - IGNORE_POST_TYPES: [PostTypes.JOIN_LEAVE, PostTypes.JOIN_CHANNEL, PostTypes.LEAVE_CHANNEL, PostTypes.REMOVE_FROM_CHANNEL, PostTypes.ADD_TO_CHANNEL, PostTypes.ADD_REMOVE], - - PayloadSources: keyMirror({ - SERVER_ACTION: null, - VIEW_ACTION: null - }), - - StatTypes, - STAT_MAX_ACTIVE_USERS: 20, - STAT_MAX_NEW_USERS: 20, - - UserUpdateEvents: { - USERNAME: 'username', - FULLNAME: 'fullname', - NICKNAME: 'nickname', - EMAIL: 'email', - LANGUAGE: 'language', - POSITION: 'position' - }, - - ScrollTypes: { - FREE: 1, - BOTTOM: 2, - SIDEBBAR_OPEN: 3, - NEW_MESSAGE: 4, - POST: 5 - }, - - SPECIAL_MENTIONS: ['all', 'channel', 'here'], - NOTIFY_ALL_MEMBERS: 5, - CHARACTER_LIMIT: 4000, - IMAGE_TYPES: ['jpg', 'gif', 'bmp', 'png', 'jpeg'], - AUDIO_TYPES: ['mp3', 'wav', 'wma', 'm4a', 'flac', 'aac', 'ogg'], - VIDEO_TYPES: ['mp4', 'avi', 'webm', 'mkv', 'wmv', 'mpg', 'mov', 'flv'], - PRESENTATION_TYPES: ['ppt', 'pptx'], - SPREADSHEET_TYPES: ['xlsx', 'csv'], - WORD_TYPES: ['doc', 'docx'], - CODE_TYPES: ['as', 'applescript', 'osascript', 'scpt', 'bash', 'sh', 'zsh', 'clj', 'boot', 'cl2', 'cljc', 'cljs', 'cljs.hl', 'cljscm', 'cljx', 'hic', 'coffee', '_coffee', 'cake', 'cjsx', 'cson', 'iced', 'cpp', 'c', 'cc', 'h', 'c++', 'h++', 'hpp', 'cs', 'csharp', 'css', 'd', 'di', 'dart', 'delphi', 'dpr', 'dfm', 'pas', 'pascal', 'freepascal', 'lazarus', 'lpr', 'lfm', 'diff', 'django', 'jinja', 'dockerfile', 'docker', 'erl', 'f90', 'f95', 'fsharp', 'fs', 'gcode', 'nc', 'go', 'groovy', 'handlebars', 'hbs', 'html.hbs', 'html.handlebars', 'hs', 'hx', 'java', 'jsp', 'js', 'jsx', 'json', 'jl', 'kt', 'ktm', 'kts', 'less', 'lisp', 'lua', 'mk', 'mak', 'md', 'mkdown', 'mkd', 'matlab', 'm', 'mm', 'objc', 'obj-c', 'ml', 'perl', 'pl', 'php', 'php3', 'php4', 'php5', 'php6', 'ps', 'ps1', 'pp', 'py', 'gyp', 'r', 'ruby', 'rb', 'gemspec', 'podspec', 'thor', 'irb', 'rs', 'scala', 'scm', 'sld', 'scss', 'st', 'sql', 'swift', 'tex', 'txt', 'vbnet', 'vb', 'bas', 'vbs', 'v', 'veo', 'xml', 'html', 'xhtml', 'rss', 'atom', 'xsl', 'plist', 'yaml'], - PDF_TYPES: ['pdf'], - PATCH_TYPES: ['patch'], - SVG_TYPES: ['svg'], - ICON_FROM_TYPE: { - audio: audioIcon, - video: videoIcon, - spreadsheet: excelIcon, - presentation: pptIcon, - pdf: pdfIcon, - code: codeIcon, - word: wordIcon, - patch: patchIcon, - other: genericIcon - }, - ICON_NAME_FROM_TYPE: { - audio: 'audio', - video: 'video', - spreadsheet: 'excel', - presentation: 'ppt', - pdf: 'pdf', - code: 'code', - word: 'word', - patch: 'patch', - other: 'generic' - }, - MAX_DISPLAY_FILES: 5, - MAX_UPLOAD_FILES: 5, - THUMBNAIL_WIDTH: 128, - THUMBNAIL_HEIGHT: 100, - PROFILE_WIDTH: 128, - PROFILE_HEIGHT: 128, - WEB_VIDEO_WIDTH: 640, - WEB_VIDEO_HEIGHT: 480, - MOBILE_VIDEO_WIDTH: 480, - MOBILE_VIDEO_HEIGHT: 360, - MOBILE_SCREEN_WIDTH: 768, - SCROLL_DELAY: 2000, - SCROLL_PAGE_FRACTION: 3, - DEFAULT_CHANNEL: 'town-square', - DEFAULT_CHANNEL_UI_NAME: 'Town Square', - OFFTOPIC_CHANNEL: 'off-topic', - OFFTOPIC_CHANNEL_UI_NAME: 'Off-Topic', - GITLAB_SERVICE: 'gitlab', - GOOGLE_SERVICE: 'google', - OFFICE365_SERVICE: 'office365', - EMAIL_SERVICE: 'email', - LDAP_SERVICE: 'ldap', - SAML_SERVICE: 'saml', - USERNAME_SERVICE: 'username', - SIGNIN_CHANGE: 'signin_change', - PASSWORD_CHANGE: 'password_change', - SIGNIN_VERIFIED: 'verified', - SESSION_EXPIRED: 'expired', - POST_CHUNK_SIZE: 60, - PROFILE_CHUNK_SIZE: 100, - POST_FOCUS_CONTEXT_RADIUS: 10, - POST_LOADING: 'loading', - POST_FAILED: 'failed', - POST_DELETED: 'deleted', - POST_UPDATED: 'updated', - SYSTEM_MESSAGE_PREFIX: 'system_', - SYSTEM_MESSAGE_PROFILE_IMAGE: logoImage, - RESERVED_TEAM_NAMES: [ - 'signup', - 'login', - 'admin', - 'channel', - 'post', - 'api', - 'oauth' - ], - RESERVED_USERNAMES: [ - 'valet', - 'all', - 'channel', - 'here', - 'matterbot' - ], - MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - MAX_DMS: 20, - MAX_USERS_IN_GM: 8, - MIN_USERS_IN_GM: 3, - MAX_CHANNEL_POPOVER_COUNT: 100, - DM_CHANNEL: 'D', - GM_CHANNEL: 'G', - OPEN_CHANNEL: 'O', - PRIVATE_CHANNEL: 'P', - INVITE_TEAM: 'I', - OPEN_TEAM: 'O', - MAX_POST_LEN: 4000, - EMOJI_SIZE: 16, - EMOJI_ICON_SVG: " ", - UNREAD_ICON_SVG: "", - MEMBERS_ICON_SVG: " ", - TEAM_INFO_SVG: " ", - FLAG_FILLED_ICON_SVG: " ", - FLAG_ICON_SVG: " ", - ATTACHMENT_ICON_SVG: " ", - MATTERMOST_ICON_SVG: " ", - ONLINE_AVATAR_SVG: " ", - AWAY_AVATAR_SVG: " ", - OFFLINE_AVATAR_SVG: " ", - ONLINE_ICON_SVG: "
", - AWAY_ICON_SVG: "
", - OFFLINE_ICON_SVG: "", - MENU_ICON: " ", - COMMENT_ICON: " ", - REPLY_ICON: " ", - SCROLL_BOTTOM_ICON: " ", - VIDEO_ICON: " ", - PIN_ICON_SVG: " ", - LEAVE_TEAM_SVG: " ", - SEARCH_ICON_SVG: " ", - MENTIONS_ICON_SVG: " ", - MENU_ICON_SVG: " ", - INFO_ICON_SVG: " ", - MESSAGE_ICON_SVG: " ", - SWITCH_CHANNEL_ICON_SVG: " ", - GLOBE_ICON_SVG: " ", - LOCK_ICON_SVG: " ", - THEMES: { - default: { - type: 'Mattermost', - sidebarBg: '#145dbf', - sidebarText: '#ffffff', - sidebarUnreadText: '#ffffff', - sidebarTextHoverBg: '#4578bf', - sidebarTextActiveBorder: '#579eff', - sidebarTextActiveColor: '#ffffff', - sidebarHeaderBg: '#1153ab', - sidebarHeaderTextColor: '#ffffff', - onlineIndicator: '#06d6a0', - awayIndicator: '#ffbc42', - mentionBj: '#ffffff', - mentionColor: '#145dbf', - centerChannelBg: '#ffffff', - centerChannelColor: '#3d3c40', - newMessageSeparator: '#ff8800', - linkColor: '#2389d7', - buttonBg: '#166de0', - buttonColor: '#ffffff', - errorTextColor: '#fd5960', - mentionHighlightBg: '#ffe577', - mentionHighlightLink: '#166de0', - codeTheme: 'github', - image: mattermostThemeImage - }, - organization: { - type: 'Organization', - sidebarBg: '#2071a7', - sidebarText: '#ffffff', - sidebarUnreadText: '#ffffff', - sidebarTextHoverBg: '#136197', - sidebarTextActiveBorder: '#7ab0d6', - sidebarTextActiveColor: '#ffffff', - sidebarHeaderBg: '#2f81b7', - sidebarHeaderTextColor: '#ffffff', - onlineIndicator: '#7dbe00', - awayIndicator: '#dcbd4e', - mentionBj: '#fbfbfb', - mentionColor: '#2071f7', - centerChannelBg: '#f2f4f8', - centerChannelColor: '#333333', - newMessageSeparator: '#ff8800', - linkColor: '#2f81b7', - buttonBg: '#1dacfc', - buttonColor: '#ffffff', - errorTextColor: '#a94442', - mentionHighlightBg: '#f3e197', - mentionHighlightLink: '#2f81b7', - codeTheme: 'github', - image: defaultThemeImage - }, - mattermostDark: { - type: 'Mattermost Dark', - sidebarBg: '#1b2c3e', - sidebarText: '#ffffff', - sidebarUnreadText: '#ffffff', - sidebarTextHoverBg: '#4a5664', - sidebarTextActiveBorder: '#66b9a7', - sidebarTextActiveColor: '#ffffff', - sidebarHeaderBg: '#1b2c3e', - sidebarHeaderTextColor: '#ffffff', - onlineIndicator: '#65dcc8', - awayIndicator: '#c1b966', - mentionBj: '#b74a4a', - mentionColor: '#ffffff', - centerChannelBg: '#2f3e4e', - centerChannelColor: '#dddddd', - newMessageSeparator: '#5de5da', - linkColor: '#a4ffeb', - buttonBg: '#4cbba4', - buttonColor: '#ffffff', - errorTextColor: '#ff6461', - mentionHighlightBg: '#984063', - mentionHighlightLink: '#a4ffeb', - codeTheme: 'solarized-dark', - image: mattermostDarkThemeImage - }, - windows10: { - type: 'Windows Dark', - sidebarBg: '#171717', - sidebarText: '#ffffff', - sidebarUnreadText: '#ffffff', - sidebarTextHoverBg: '#302e30', - sidebarTextActiveBorder: '#196caf', - sidebarTextActiveColor: '#ffffff', - sidebarHeaderBg: '#1f1f1f', - sidebarHeaderTextColor: '#ffffff', - onlineIndicator: '#399fff', - awayIndicator: '#c1b966', - mentionBj: '#0177e7', - mentionColor: '#ffffff', - centerChannelBg: '#1f1f1f', - centerChannelColor: '#dddddd', - newMessageSeparator: '#cc992d', - linkColor: '#0d93ff', - buttonBg: '#0177e7', - buttonColor: '#ffffff', - errorTextColor: '#ff6461', - mentionHighlightBg: '#784098', - mentionHighlightLink: '#a4ffeb', - codeTheme: 'monokai', - image: windows10ThemeImage - } - }, - THEME_ELEMENTS: [ - { - group: 'sidebarElements', - id: 'sidebarBg', - uiName: 'Sidebar BG' - }, - { - group: 'sidebarElements', - id: 'sidebarText', - uiName: 'Sidebar Text' - }, - { - group: 'sidebarElements', - id: 'sidebarHeaderBg', - uiName: 'Sidebar Header BG' - }, - { - group: 'sidebarElements', - id: 'sidebarHeaderTextColor', - uiName: 'Sidebar Header Text' - }, - { - group: 'sidebarElements', - id: 'sidebarUnreadText', - uiName: 'Sidebar Unread Text' - }, - { - group: 'sidebarElements', - id: 'sidebarTextHoverBg', - uiName: 'Sidebar Text Hover BG' - }, - { - group: 'sidebarElements', - id: 'sidebarTextActiveBorder', - uiName: 'Sidebar Text Active Border' - }, - { - group: 'sidebarElements', - id: 'sidebarTextActiveColor', - uiName: 'Sidebar Text Active Color' - }, - { - group: 'sidebarElements', - id: 'onlineIndicator', - uiName: 'Online Indicator' - }, - { - group: 'sidebarElements', - id: 'awayIndicator', - uiName: 'Away Indicator' - }, - { - group: 'sidebarElements', - id: 'mentionBj', - uiName: 'Mention Jewel BG' - }, - { - group: 'sidebarElements', - id: 'mentionColor', - uiName: 'Mention Jewel Text' - }, - { - group: 'centerChannelElements', - id: 'centerChannelBg', - uiName: 'Center Channel BG' - }, - { - group: 'centerChannelElements', - id: 'centerChannelColor', - uiName: 'Center Channel Text' - }, - { - group: 'centerChannelElements', - id: 'newMessageSeparator', - uiName: 'New Message Separator' - }, - { - group: 'centerChannelElements', - id: 'errorTextColor', - uiName: 'Error Text Color' - }, - { - group: 'centerChannelElements', - id: 'mentionHighlightBg', - uiName: 'Mention Highlight BG' - }, - { - group: 'linkAndButtonElements', - id: 'linkColor', - uiName: 'Link Color' - }, - { - group: 'centerChannelElements', - id: 'mentionHighlightLink', - uiName: 'Mention Highlight Link' - }, - { - group: 'linkAndButtonElements', - id: 'buttonBg', - uiName: 'Button BG' - }, - { - group: 'linkAndButtonElements', - id: 'buttonColor', - uiName: 'Button Text' - }, - { - group: 'centerChannelElements', - id: 'codeTheme', - uiName: 'Code Theme', - themes: [ - { - id: 'solarized-dark', - uiName: 'Solarized Dark', - cssURL: solarizedDarkCSS, - iconURL: solarizedDarkIcon - }, - { - id: 'solarized-light', - uiName: 'Solarized Light', - cssURL: solarizedLightCSS, - iconURL: solarizedLightIcon - }, - { - id: 'github', - uiName: 'GitHub', - cssURL: githubCSS, - iconURL: githubIcon - }, - { - id: 'monokai', - uiName: 'Monokai', - cssURL: monokaiCSS, - iconURL: monokaiIcon - } - ] - } - ], - DEFAULT_CODE_THEME: 'github', - KeyCodes: { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - SHIFT: 16, - CTRL: 17, - ALT: 18, - CAPS_LOCK: 20, - ESCAPE: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - INSERT: 45, - DELETE: 46, - ZERO: 48, - ONE: 49, - TWO: 50, - THREE: 51, - FOUR: 52, - FIVE: 53, - SIX: 54, - SEVEN: 55, - EIGHT: 56, - NINE: 57, - A: 65, - B: 66, - C: 67, - D: 68, - E: 69, - F: 70, - G: 71, - H: 72, - I: 73, - J: 74, - K: 75, - L: 76, - M: 77, - N: 78, - O: 79, - P: 80, - Q: 81, - R: 82, - S: 83, - T: 84, - U: 85, - V: 86, - W: 87, - X: 88, - Y: 89, - Z: 90, - CMD: 91, - MENU: 93, - NUMPAD_0: 96, - NUMPAD_1: 97, - NUMPAD_2: 98, - NUMPAD_3: 99, - NUMPAD_4: 100, - NUMPAD_5: 101, - NUMPAD_6: 102, - NUMPAD_7: 103, - NUMPAD_8: 104, - NUMPAD_9: 105, - MULTIPLY: 106, - ADD: 107, - SUBTRACT: 109, - DECIMAL: 110, - DIVIDE: 111, - F1: 112, - F2: 113, - F3: 114, - F4: 115, - F5: 116, - F6: 117, - F7: 118, - F8: 119, - F9: 120, - F10: 121, - F11: 122, - F12: 123, - NUM_LOCK: 144, - SEMICOLON: 186, - EQUAL: 187, - COMMA: 188, - DASH: 189, - PERIOD: 190, - FORWARD_SLASH: 191, - TILDE: 192, - OPEN_BRACKET: 219, - BACK_SLASH: 220, - CLOSE_BRACKET: 221 - }, - CODE_PREVIEW_MAX_FILE_SIZE: 500000, // 500 KB - HighlightedLanguages: { - actionscript: {name: 'ActionScript', extensions: ['as'], aliases: ['as', 'as3']}, - applescript: {name: 'AppleScript', extensions: ['applescript', 'osascript', 'scpt']}, - bash: {name: 'Bash', extensions: ['bash', 'sh', 'zsh']}, - clojure: {name: 'Clojure', extensions: ['clj', 'boot', 'cl2', 'cljc', 'cljs', 'cljs.hl', 'cljscm', 'cljx', 'hic']}, - coffeescript: {name: 'CoffeeScript', extensions: ['coffee', '_coffee', 'cake', 'cjsx', 'cson', 'iced'], aliases: ['coffee', 'coffee-script']}, - cpp: {name: 'C/C++', extensions: ['cpp', 'c', 'cc', 'h', 'c++', 'h++', 'hpp'], aliases: ['c++']}, - cs: {name: 'C#', extensions: ['cs', 'csharp'], aliases: ['c#', 'csharp']}, - css: {name: 'CSS', extensions: ['css']}, - d: {name: 'D', extensions: ['d', 'di'], aliases: ['dlang']}, - dart: {name: 'Dart', extensions: ['dart']}, - delphi: {name: 'Delphi', extensions: ['delphi', 'dpr', 'dfm', 'pas', 'pascal', 'freepascal', 'lazarus', 'lpr', 'lfm']}, - diff: {name: 'Diff', extensions: ['diff', 'patch'], aliases: ['patch', 'udiff']}, - django: {name: 'Django', extensions: ['django', 'jinja']}, - dockerfile: {name: 'Dockerfile', extensions: ['dockerfile', 'docker'], aliases: ['docker']}, - erlang: {name: 'Erlang', extensions: ['erl'], aliases: ['erl']}, - fortran: {name: 'Fortran', extensions: ['f90', 'f95']}, - fsharp: {name: 'F#', extensions: ['fsharp', 'fs']}, - gcode: {name: 'G-Code', extensions: ['gcode', 'nc']}, - go: {name: 'Go', extensions: ['go'], aliases: ['golang']}, - groovy: {name: 'Groovy', extensions: ['groovy']}, - handlebars: {name: 'Handlebars', extensions: ['handlebars', 'hbs', 'html.hbs', 'html.handlebars'], aliases: ['hbs', 'mustache']}, - haskell: {name: 'Haskell', extensions: ['hs'], aliases: ['hs']}, - haxe: {name: 'Haxe', extensions: ['hx']}, - java: {name: 'Java', extensions: ['java', 'jsp']}, - javascript: {name: 'JavaScript', extensions: ['js', 'jsx'], aliases: ['js']}, - json: {name: 'JSON', extensions: ['json']}, - julia: {name: 'Julia', extensions: ['jl'], aliases: ['jl']}, - kotlin: {name: 'Kotlin', extensions: ['kt', 'ktm', 'kts']}, - less: {name: 'Less', extensions: ['less']}, - lisp: {name: 'Lisp', extensions: ['lisp']}, - lua: {name: 'Lua', extensions: ['lua']}, - makefile: {name: 'Makefile', extensions: ['mk', 'mak'], aliases: ['make', 'mf', 'gnumake', 'bsdmake']}, - markdown: {name: 'Markdown', extensions: ['md', 'mkdown', 'mkd'], aliases: ['md', 'mkd']}, - matlab: {name: 'Matlab', extensions: ['matlab', 'm'], aliases: ['m']}, - objectivec: {name: 'Objective C', extensions: ['mm', 'objc', 'obj-c'], aliases: ['objective_c', 'objc']}, - ocaml: {name: 'OCaml', extensions: ['ml']}, - perl: {name: 'Perl', extensions: ['perl', 'pl'], aliases: ['pl']}, - php: {name: 'PHP', extensions: ['php', 'php3', 'php4', 'php5', 'php6'], aliases: ['php3', 'php4', 'php5']}, - powershell: {name: 'PowerShell', extensions: ['ps', 'ps1'], aliases: ['posh']}, - puppet: {name: 'Puppet', extensions: ['pp'], aliases: ['pp']}, - python: {name: 'Python', extensions: ['py', 'gyp'], aliases: ['py']}, - r: {name: 'R', extensions: ['r'], aliases: ['r', 's']}, - ruby: {name: 'Ruby', extensions: ['ruby', 'rb', 'gemspec', 'podspec', 'thor', 'irb'], aliases: ['rb']}, - rust: {name: 'Rust', extensions: ['rs'], aliases: ['rs']}, - scala: {name: 'Scala', extensions: ['scala']}, - scheme: {name: 'Scheme', extensions: ['scm', 'sld']}, - scss: {name: 'SCSS', extensions: ['scss']}, - smalltalk: {name: 'Smalltalk', extensions: ['st'], aliases: ['st', 'squeak']}, - sql: {name: 'SQL', extensions: ['sql']}, - swift: {name: 'Swift', extensions: ['swift']}, - tex: {name: 'TeX', extensions: ['tex'], aliases: ['latex']}, - text: {name: 'Text', extensions: ['txt']}, - vbnet: {name: 'VB.Net', extensions: ['vbnet', 'vb', 'bas'], aliases: ['vb', 'visualbasic']}, - vbscript: {name: 'VBScript', extensions: ['vbs']}, - verilog: {name: 'Verilog', extensions: ['v', 'veo']}, - xml: {name: 'HTML, XML', extensions: ['xml', 'html', 'xhtml', 'rss', 'atom', 'xsl', 'plist']}, - yaml: {name: 'YAML', extensions: ['yaml'], aliases: ['yml']} - }, - PostsViewJumpTypes: { - BOTTOM: 1, - POST: 2, - SIDEBAR_OPEN: 3 - }, - NotificationPrefs: { - MENTION: 'mention' - }, - Integrations: { - COMMAND: 'commands', - INCOMING_WEBHOOK: 'incoming_webhooks', - OUTGOING_WEBHOOK: 'outgoing_webhooks', - OAUTH_APP: 'oauth2-apps' - }, - FeatureTogglePrefix: 'feature_enabled_', - PRE_RELEASE_FEATURES: { - MARKDOWN_PREVIEW: { - label: 'markdown_preview', // github issue: https://github.com/mattermost/platform/pull/1389 - description: 'Show markdown preview option in message input box' - }, - EMBED_PREVIEW: { - label: 'embed_preview', - description: 'Show preview snippet of links below message' - }, - WEBRTC_PREVIEW: { - label: 'webrtc_preview', - description: 'Enable WebRTC one on one calls' - } - }, - OVERLAY_TIME_DELAY_SMALL: 100, - OVERLAY_TIME_DELAY: 400, - WEBRTC_TIME_DELAY: 750, - WEBRTC_CLEAR_ERROR_DELAY: 15000, - DEFAULT_MAX_USERS_PER_TEAM: 50, - MIN_TEAMNAME_LENGTH: 2, - DEFAULT_MAX_CHANNELS_PER_TEAM: 2000, - DEFAULT_MAX_NOTIFICATIONS_PER_CHANNEL: 1000, - MAX_TEAMNAME_LENGTH: 15, - MAX_TEAMDESCRIPTION_LENGTH: 50, - MIN_CHANNELNAME_LENGTH: 2, - MAX_CHANNELNAME_LENGTH: 22, - MIN_USERNAME_LENGTH: 3, - MAX_USERNAME_LENGTH: 22, - MAX_NICKNAME_LENGTH: 22, - MIN_PASSWORD_LENGTH: 5, - MAX_PASSWORD_LENGTH: 64, - MAX_POSITION_LENGTH: 35, - MIN_TRIGGER_LENGTH: 1, - MAX_TRIGGER_LENGTH: 128, - MAX_SITENAME_LENGTH: 30, - TIME_SINCE_UPDATE_INTERVAL: 30000, - MIN_HASHTAG_LINK_LENGTH: 3, - CHANNEL_SCROLL_ADJUSTMENT: 100, - EMOJI_PATH: '/static/emoji', - RECENT_EMOJI_KEY: 'recentEmojis', - DEFAULT_WEBHOOK_LOGO: logoWebhook, - MHPNS: 'https://push.mattermost.com', - MTPNS: 'http://push-test.mattermost.com', - BOT_NAME: 'BOT', - MAX_PREV_MSGS: 100, - POST_COLLAPSE_TIMEOUT: 1000 * 60 * 5, // five minutes - PERMISSIONS_ALL: 'all', - PERMISSIONS_CHANNEL_ADMIN: 'channel_admin', - PERMISSIONS_TEAM_ADMIN: 'team_admin', - PERMISSIONS_SYSTEM_ADMIN: 'system_admin', - PERMISSIONS_DELETE_POST_ALL: 'all', - PERMISSIONS_DELETE_POST_TEAM_ADMIN: 'team_admin', - PERMISSIONS_DELETE_POST_SYSTEM_ADMIN: 'system_admin', - ALLOW_EDIT_POST_ALWAYS: 'always', - ALLOW_EDIT_POST_NEVER: 'never', - ALLOW_EDIT_POST_TIME_LIMIT: 'time_limit', - DEFAULT_POST_EDIT_TIME_LIMIT: 300, - MENTION_CHANNELS: 'mention.channels', - MENTION_MORE_CHANNELS: 'mention.morechannels', - MENTION_MEMBERS: 'mention.members', - MENTION_NONMEMBERS: 'mention.nonmembers', - MENTION_SPECIAL: 'mention.special', - DEFAULT_NOTIFICATION_DURATION: 5000, - STATUS_INTERVAL: 60000, - AUTOCOMPLETE_TIMEOUT: 100, - ANIMATION_TIMEOUT: 1000, - SEARCH_TIMEOUT_MILLISECONDS: 100, - DIAGNOSTICS_SEGMENT_KEY: 'fwb7VPbFeQ7SKp3wHm1RzFUuXZudqVok', - TEST_ID_COUNT: 0, - CENTER: 'center', - RHS: 'rhs', - RHS_ROOT: 'rhsroot', - TEAMMATE_NAME_DISPLAY: { - SHOW_USERNAME: 'username', - SHOW_NICKNAME_FULLNAME: 'nickname_full_name', - SHOW_FULLNAME: 'full_name' - }, - SEARCH_POST: 'searchpost' -}; - -export default Constants; diff --git a/webapp/utils/delayed_action.jsx b/webapp/utils/delayed_action.jsx deleted file mode 100644 index 3d64df51d..000000000 --- a/webapp/utils/delayed_action.jsx +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -export default class DelayedAction { - constructor(action) { - this.action = action; - - this.timer = -1; - - // bind fire since it doesn't get passed the correct this value with setTimeout - this.fire = this.fire.bind(this); - } - - fire() { - this.action(); - - this.timer = -1; - } - - fireAfter(timeout) { - if (this.timer >= 0) { - window.clearTimeout(this.timer); - } - - this.timer = window.setTimeout(this.fire, timeout); - } - - cancel() { - window.clearTimeout(this.timer); - } -} diff --git a/webapp/utils/emoji.jsx b/webapp/utils/emoji.jsx deleted file mode 100644 index 36205d127..000000000 --- a/webapp/utils/emoji.jsx +++ /dev/null @@ -1,15 +0,0 @@ -// This file is automatically generated via `make emojis`. Do not modify it manually. - -/* eslint-disable */ - -export const Emojis = [{"aliases":["grinning"],"filename":"1f600","category":"people"},{"aliases":["smiley"],"filename":"1f603","category":"people"},{"aliases":["smile"],"filename":"1f604","category":"people"},{"aliases":["grin"],"filename":"1f601","category":"people"},{"aliases":["laughing","satisfied"],"filename":"1f606","category":"people"},{"aliases":["sweat_smile"],"filename":"1f605","category":"people"},{"aliases":["joy"],"filename":"1f602","category":"people"},{"aliases":["rofl"],"filename":"1f923","category":"people"},{"aliases":["relaxed"],"filename":"263a-fe0f","category":"people"},{"aliases":["blush"],"filename":"1f60a","category":"people"},{"aliases":["innocent"],"filename":"1f607","category":"people"},{"aliases":["slightly_smiling_face"],"filename":"1f642","category":"people"},{"aliases":["upside_down_face"],"filename":"1f643","category":"people"},{"aliases":["wink"],"filename":"1f609","category":"people"},{"aliases":["relieved"],"filename":"1f60c","category":"people"},{"aliases":["heart_eyes"],"filename":"1f60d","category":"people"},{"aliases":["kissing_heart"],"filename":"1f618","category":"people"},{"aliases":["kissing"],"filename":"1f617","category":"people"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619","category":"people"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a","category":"people"},{"aliases":["yum"],"filename":"1f60b","category":"people"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c","category":"people"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d","category":"people"},{"aliases":["stuck_out_tongue"],"filename":"1f61b","category":"people"},{"aliases":["money_mouth_face"],"filename":"1f911","category":"people"},{"aliases":["hugs"],"filename":"1f917","category":"people"},{"aliases":["nerd_face"],"filename":"1f913","category":"people"},{"aliases":["sunglasses"],"filename":"1f60e","category":"people"},{"aliases":["clown_face"],"filename":"1f921","category":"people"},{"aliases":["cowboy_hat_face"],"filename":"1f920","category":"people"},{"aliases":["smirk"],"filename":"1f60f","category":"people"},{"aliases":["unamused"],"filename":"1f612","category":"people"},{"aliases":["disappointed"],"filename":"1f61e","category":"people"},{"aliases":["pensive"],"filename":"1f614","category":"people"},{"aliases":["worried"],"filename":"1f61f","category":"people"},{"aliases":["confused"],"filename":"1f615","category":"people"},{"aliases":["slightly_frowning_face"],"filename":"1f641","category":"people"},{"aliases":["frowning_face"],"filename":"2639-fe0f","category":"people"},{"aliases":["persevere"],"filename":"1f623","category":"people"},{"aliases":["confounded"],"filename":"1f616","category":"people"},{"aliases":["tired_face"],"filename":"1f62b","category":"people"},{"aliases":["weary"],"filename":"1f629","category":"people"},{"aliases":["triumph"],"filename":"1f624","category":"people"},{"aliases":["angry"],"filename":"1f620","category":"people"},{"aliases":["rage","pout"],"filename":"1f621","category":"people"},{"aliases":["no_mouth"],"filename":"1f636","category":"people"},{"aliases":["neutral_face"],"filename":"1f610","category":"people"},{"aliases":["expressionless"],"filename":"1f611","category":"people"},{"aliases":["hushed"],"filename":"1f62f","category":"people"},{"aliases":["frowning"],"filename":"1f626","category":"people"},{"aliases":["anguished"],"filename":"1f627","category":"people"},{"aliases":["open_mouth"],"filename":"1f62e","category":"people"},{"aliases":["astonished"],"filename":"1f632","category":"people"},{"aliases":["dizzy_face"],"filename":"1f635","category":"people"},{"aliases":["flushed"],"filename":"1f633","category":"people"},{"aliases":["scream"],"filename":"1f631","category":"people"},{"aliases":["fearful"],"filename":"1f628","category":"people"},{"aliases":["cold_sweat"],"filename":"1f630","category":"people"},{"aliases":["cry"],"filename":"1f622","category":"people"},{"aliases":["disappointed_relieved"],"filename":"1f625","category":"people"},{"aliases":["drooling_face"],"filename":"1f924","category":"people"},{"aliases":["sob"],"filename":"1f62d","category":"people"},{"aliases":["sweat"],"filename":"1f613","category":"people"},{"aliases":["sleepy"],"filename":"1f62a","category":"people"},{"aliases":["sleeping"],"filename":"1f634","category":"people"},{"aliases":["roll_eyes"],"filename":"1f644","category":"people"},{"aliases":["thinking"],"filename":"1f914","category":"people"},{"aliases":["lying_face"],"filename":"1f925","category":"people"},{"aliases":["grimacing"],"filename":"1f62c","category":"people"},{"aliases":["zipper_mouth_face"],"filename":"1f910","category":"people"},{"aliases":["nauseated_face"],"filename":"1f922","category":"people"},{"aliases":["sneezing_face"],"filename":"1f927","category":"people"},{"aliases":["mask"],"filename":"1f637","category":"people"},{"aliases":["face_with_thermometer"],"filename":"1f912","category":"people"},{"aliases":["face_with_head_bandage"],"filename":"1f915","category":"people"},{"aliases":["smiling_imp"],"filename":"1f608","category":"people"},{"aliases":["imp"],"filename":"1f47f","category":"people"},{"aliases":["japanese_ogre"],"filename":"1f479","category":"people"},{"aliases":["japanese_goblin"],"filename":"1f47a","category":"people"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9","category":"people"},{"aliases":["ghost"],"filename":"1f47b","category":"people"},{"aliases":["skull"],"filename":"1f480","category":"people"},{"aliases":["skull_and_crossbones"],"filename":"2620-fe0f","category":"people"},{"aliases":["alien"],"filename":"1f47d","category":"people"},{"aliases":["space_invader"],"filename":"1f47e","category":"people"},{"aliases":["robot"],"filename":"1f916","category":"people"},{"aliases":["jack_o_lantern"],"filename":"1f383","category":"people"},{"aliases":["smiley_cat"],"filename":"1f63a","category":"people"},{"aliases":["smile_cat"],"filename":"1f638","category":"people"},{"aliases":["joy_cat"],"filename":"1f639","category":"people"},{"aliases":["heart_eyes_cat"],"filename":"1f63b","category":"people"},{"aliases":["smirk_cat"],"filename":"1f63c","category":"people"},{"aliases":["kissing_cat"],"filename":"1f63d","category":"people"},{"aliases":["scream_cat"],"filename":"1f640","category":"people"},{"aliases":["crying_cat_face"],"filename":"1f63f","category":"people"},{"aliases":["pouting_cat"],"filename":"1f63e","category":"people"},{"aliases":["open_hands"],"filename":"1f450","category":"people"},{"aliases":["raised_hands"],"filename":"1f64c","category":"people"},{"aliases":["clap"],"filename":"1f44f","category":"people"},{"aliases":["pray"],"filename":"1f64f","category":"people"},{"aliases":["handshake"],"filename":"1f91d","category":"people"},{"aliases":["+1","thumbsup"],"filename":"1f44d","category":"people"},{"aliases":["-1","thumbsdown"],"filename":"1f44e","category":"people"},{"aliases":["fist_oncoming","facepunch","punch"],"filename":"1f44a","category":"people"},{"aliases":["fist_raised","fist"],"filename":"270a","category":"people"},{"aliases":["fist_left"],"filename":"1f91b","category":"people"},{"aliases":["fist_right"],"filename":"1f91c","category":"people"},{"aliases":["crossed_fingers"],"filename":"1f91e","category":"people"},{"aliases":["v"],"filename":"270c-fe0f","category":"people"},{"aliases":["metal"],"filename":"1f918","category":"people"},{"aliases":["ok_hand"],"filename":"1f44c","category":"people"},{"aliases":["point_left"],"filename":"1f448","category":"people"},{"aliases":["point_right"],"filename":"1f449","category":"people"},{"aliases":["point_up_2"],"filename":"1f446","category":"people"},{"aliases":["point_down"],"filename":"1f447","category":"people"},{"aliases":["point_up"],"filename":"261d-fe0f","category":"people"},{"aliases":["hand","raised_hand"],"filename":"270b","category":"people"},{"aliases":["raised_back_of_hand"],"filename":"1f91a","category":"people"},{"aliases":["raised_hand_with_fingers_splayed"],"filename":"1f590","category":"people"},{"aliases":["vulcan_salute"],"filename":"1f596","category":"people"},{"aliases":["wave"],"filename":"1f44b","category":"people"},{"aliases":["call_me_hand"],"filename":"1f919","category":"people"},{"aliases":["muscle"],"filename":"1f4aa","category":"people"},{"aliases":["middle_finger","fu"],"filename":"1f595","category":"people"},{"aliases":["writing_hand"],"filename":"270d-fe0f","category":"people"},{"aliases":["selfie"],"filename":"1f933","category":"people"},{"aliases":["nail_care"],"filename":"1f485","category":"people"},{"aliases":["ring"],"filename":"1f48d","category":"people"},{"aliases":["lipstick"],"filename":"1f484","category":"people"},{"aliases":["kiss"],"filename":"1f48b","category":"people"},{"aliases":["lips"],"filename":"1f444","category":"people"},{"aliases":["tongue"],"filename":"1f445","category":"people"},{"aliases":["ear"],"filename":"1f442","category":"people"},{"aliases":["nose"],"filename":"1f443","category":"people"},{"aliases":["footprints"],"filename":"1f463","category":"people"},{"aliases":["eye"],"filename":"1f441","category":"people"},{"aliases":["eyes"],"filename":"1f440","category":"people"},{"aliases":["speaking_head"],"filename":"1f5e3","category":"people"},{"aliases":["bust_in_silhouette"],"filename":"1f464","category":"people"},{"aliases":["busts_in_silhouette"],"filename":"1f465","category":"people"},{"aliases":["baby"],"filename":"1f476","category":"people"},{"aliases":["boy"],"filename":"1f466","category":"people"},{"aliases":["girl"],"filename":"1f467","category":"people"},{"aliases":["man"],"filename":"1f468","category":"people"},{"aliases":["woman"],"filename":"1f469","category":"people"},{"aliases":["blonde_woman"],"filename":"1f471-200d-2640-fe0f","category":"people"},{"aliases":["blonde_man","person_with_blond_hair"],"filename":"1f471","category":"people"},{"aliases":["older_man"],"filename":"1f474","category":"people"},{"aliases":["older_woman"],"filename":"1f475","category":"people"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472","category":"people"},{"aliases":["woman_with_turban"],"filename":"1f473-200d-2640-fe0f","category":"people"},{"aliases":["man_with_turban"],"filename":"1f473","category":"people"},{"aliases":["policewoman"],"filename":"1f46e-200d-2640-fe0f","category":"people"},{"aliases":["policeman","cop"],"filename":"1f46e","category":"people"},{"aliases":["construction_worker_woman"],"filename":"1f477-200d-2640-fe0f","category":"people"},{"aliases":["construction_worker_man","construction_worker"],"filename":"1f477","category":"people"},{"aliases":["guardswoman"],"filename":"1f482-200d-2640-fe0f","category":"people"},{"aliases":["guardsman"],"filename":"1f482","category":"people"},{"aliases":["female_detective"],"filename":"1f575-fe0f-200d-2640-fe0f","category":"people"},{"aliases":["male_detective","detective"],"filename":"1f575-fe0f","category":"people"},{"aliases":["woman_health_worker"],"filename":"1f469-200d-2695-fe0f","category":"people"},{"aliases":["man_health_worker"],"filename":"1f468-200d-2695-fe0f","category":"people"},{"aliases":["woman_farmer"],"filename":"1f469-200d-1f33e","category":"people"},{"aliases":["man_farmer"],"filename":"1f468-200d-1f33e","category":"people"},{"aliases":["woman_cook"],"filename":"1f469-200d-1f373","category":"people"},{"aliases":["man_cook"],"filename":"1f468-200d-1f373","category":"people"},{"aliases":["woman_student"],"filename":"1f469-200d-1f393","category":"people"},{"aliases":["man_student"],"filename":"1f468-200d-1f393","category":"people"},{"aliases":["woman_singer"],"filename":"1f469-200d-1f3a4","category":"people"},{"aliases":["man_singer"],"filename":"1f468-200d-1f3a4","category":"people"},{"aliases":["woman_teacher"],"filename":"1f469-200d-1f3eb","category":"people"},{"aliases":["man_teacher"],"filename":"1f468-200d-1f3eb","category":"people"},{"aliases":["woman_factory_worker"],"filename":"1f469-200d-1f3ed","category":"people"},{"aliases":["man_factory_worker"],"filename":"1f468-200d-1f3ed","category":"people"},{"aliases":["woman_technologist"],"filename":"1f469-200d-1f4bb","category":"people"},{"aliases":["man_technologist"],"filename":"1f468-200d-1f4bb","category":"people"},{"aliases":["woman_office_worker"],"filename":"1f469-200d-1f4bc","category":"people"},{"aliases":["man_office_worker"],"filename":"1f468-200d-1f4bc","category":"people"},{"aliases":["woman_mechanic"],"filename":"1f469-200d-1f527","category":"people"},{"aliases":["man_mechanic"],"filename":"1f468-200d-1f527","category":"people"},{"aliases":["woman_scientist"],"filename":"1f469-200d-1f52c","category":"people"},{"aliases":["man_scientist"],"filename":"1f468-200d-1f52c","category":"people"},{"aliases":["woman_artist"],"filename":"1f469-200d-1f3a8","category":"people"},{"aliases":["man_artist"],"filename":"1f468-200d-1f3a8","category":"people"},{"aliases":["woman_firefighter"],"filename":"1f469-200d-1f692","category":"people"},{"aliases":["man_firefighter"],"filename":"1f468-200d-1f692","category":"people"},{"aliases":["woman_pilot"],"filename":"1f469-200d-2708-fe0f","category":"people"},{"aliases":["man_pilot"],"filename":"1f468-200d-2708-fe0f","category":"people"},{"aliases":["woman_astronaut"],"filename":"1f469-200d-1f680","category":"people"},{"aliases":["man_astronaut"],"filename":"1f468-200d-1f680","category":"people"},{"aliases":["woman_judge"],"filename":"1f469-200d-2696-fe0f","category":"people"},{"aliases":["man_judge"],"filename":"1f468-200d-2696-fe0f","category":"people"},{"aliases":["mrs_claus"],"filename":"1f936","category":"people"},{"aliases":["santa"],"filename":"1f385","category":"people"},{"aliases":["princess"],"filename":"1f478","category":"people"},{"aliases":["prince"],"filename":"1f934","category":"people"},{"aliases":["bride_with_veil"],"filename":"1f470","category":"people"},{"aliases":["man_in_tuxedo"],"filename":"1f935","category":"people"},{"aliases":["angel"],"filename":"1f47c","category":"people"},{"aliases":["pregnant_woman"],"filename":"1f930","category":"people"},{"aliases":["bowing_woman"],"filename":"1f647-200d-2640-fe0f","category":"people"},{"aliases":["bowing_man","bow"],"filename":"1f647","category":"people"},{"aliases":["tipping_hand_woman","information_desk_person"],"filename":"1f481","category":"people"},{"aliases":["tipping_hand_man"],"filename":"1f481-200d-2642-fe0f","category":"people"},{"aliases":["no_good_woman","no_good","ng_woman"],"filename":"1f645","category":"people"},{"aliases":["no_good_man","ng_man"],"filename":"1f645-200d-2642-fe0f","category":"people"},{"aliases":["ok_woman"],"filename":"1f646","category":"people"},{"aliases":["ok_man"],"filename":"1f646-200d-2642-fe0f","category":"people"},{"aliases":["raising_hand_woman","raising_hand"],"filename":"1f64b","category":"people"},{"aliases":["raising_hand_man"],"filename":"1f64b-200d-2642-fe0f","category":"people"},{"aliases":["woman_facepalming"],"filename":"1f926-200d-2640-fe0f","category":"people"},{"aliases":["man_facepalming"],"filename":"1f926-200d-2642-fe0f","category":"people"},{"aliases":["woman_shrugging"],"filename":"1f937-200d-2640-fe0f","category":"people"},{"aliases":["man_shrugging"],"filename":"1f937-200d-2642-fe0f","category":"people"},{"aliases":["pouting_woman","person_with_pouting_face"],"filename":"1f64e","category":"people"},{"aliases":["pouting_man"],"filename":"1f64e-200d-2642-fe0f","category":"people"},{"aliases":["frowning_woman","person_frowning"],"filename":"1f64d","category":"people"},{"aliases":["frowning_man"],"filename":"1f64d-200d-2642-fe0f","category":"people"},{"aliases":["haircut_woman","haircut"],"filename":"1f487","category":"people"},{"aliases":["haircut_man"],"filename":"1f487-200d-2642-fe0f","category":"people"},{"aliases":["massage_woman","massage"],"filename":"1f486","category":"people"},{"aliases":["massage_man"],"filename":"1f486-200d-2642-fe0f","category":"people"},{"aliases":["business_suit_levitating"],"filename":"1f574","category":"people"},{"aliases":["dancer"],"filename":"1f483","category":"people"},{"aliases":["man_dancing"],"filename":"1f57a","category":"people"},{"aliases":["dancing_women","dancers"],"filename":"1f46f","category":"people"},{"aliases":["dancing_men"],"filename":"1f46f-200d-2642-fe0f","category":"people"},{"aliases":["walking_woman"],"filename":"1f6b6-200d-2640-fe0f","category":"people"},{"aliases":["walking_man","walking"],"filename":"1f6b6","category":"people"},{"aliases":["running_woman"],"filename":"1f3c3-200d-2640-fe0f","category":"people"},{"aliases":["running_man","runner","running"],"filename":"1f3c3","category":"people"},{"aliases":["couple"],"filename":"1f46b","category":"people"},{"aliases":["two_women_holding_hands"],"filename":"1f46d","category":"people"},{"aliases":["two_men_holding_hands"],"filename":"1f46c","category":"people"},{"aliases":["couple_with_heart_woman_man","couple_with_heart"],"filename":"1f491","category":"people"},{"aliases":["couple_with_heart_woman_woman"],"filename":"1f469-200d-2764-fe0f-200d-1f469","category":"people"},{"aliases":["couple_with_heart_man_man"],"filename":"1f468-200d-2764-fe0f-200d-1f468","category":"people"},{"aliases":["couplekiss_man_woman"],"filename":"1f48f","category":"people"},{"aliases":["couplekiss_woman_woman"],"filename":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","category":"people"},{"aliases":["couplekiss_man_man"],"filename":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","category":"people"},{"aliases":["family_man_woman_boy","family"],"filename":"1f46a","category":"people"},{"aliases":["family_man_woman_girl"],"filename":"1f468-200d-1f469-200d-1f467","category":"people"},{"aliases":["family_man_woman_girl_boy"],"filename":"1f468-200d-1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_woman_boy_boy"],"filename":"1f468-200d-1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_woman_girl_girl"],"filename":"1f468-200d-1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_woman_woman_boy"],"filename":"1f469-200d-1f469-200d-1f466","category":"people"},{"aliases":["family_woman_woman_girl"],"filename":"1f469-200d-1f469-200d-1f467","category":"people"},{"aliases":["family_woman_woman_girl_boy"],"filename":"1f469-200d-1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_woman_woman_boy_boy"],"filename":"1f469-200d-1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_woman_woman_girl_girl"],"filename":"1f469-200d-1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_man_man_boy"],"filename":"1f468-200d-1f468-200d-1f466","category":"people"},{"aliases":["family_man_man_girl"],"filename":"1f468-200d-1f468-200d-1f467","category":"people"},{"aliases":["family_man_man_girl_boy"],"filename":"1f468-200d-1f468-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_man_boy_boy"],"filename":"1f468-200d-1f468-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_man_girl_girl"],"filename":"1f468-200d-1f468-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_woman_boy"],"filename":"1f469-200d-1f466","category":"people"},{"aliases":["family_woman_girl"],"filename":"1f469-200d-1f467","category":"people"},{"aliases":["family_woman_girl_boy"],"filename":"1f469-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_woman_boy_boy"],"filename":"1f469-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_woman_girl_girl"],"filename":"1f469-200d-1f467-200d-1f467","category":"people"},{"aliases":["family_man_boy"],"filename":"1f468-200d-1f466","category":"people"},{"aliases":["family_man_girl"],"filename":"1f468-200d-1f467","category":"people"},{"aliases":["family_man_girl_boy"],"filename":"1f468-200d-1f467-200d-1f466","category":"people"},{"aliases":["family_man_boy_boy"],"filename":"1f468-200d-1f466-200d-1f466","category":"people"},{"aliases":["family_man_girl_girl"],"filename":"1f468-200d-1f467-200d-1f467","category":"people"},{"aliases":["womans_clothes"],"filename":"1f45a","category":"people"},{"aliases":["shirt","tshirt"],"filename":"1f455","category":"people"},{"aliases":["jeans"],"filename":"1f456","category":"people"},{"aliases":["necktie"],"filename":"1f454","category":"people"},{"aliases":["dress"],"filename":"1f457","category":"people"},{"aliases":["bikini"],"filename":"1f459","category":"people"},{"aliases":["kimono"],"filename":"1f458","category":"people"},{"aliases":["high_heel"],"filename":"1f460","category":"people"},{"aliases":["sandal"],"filename":"1f461","category":"people"},{"aliases":["boot"],"filename":"1f462","category":"people"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e","category":"people"},{"aliases":["athletic_shoe"],"filename":"1f45f","category":"people"},{"aliases":["womans_hat"],"filename":"1f452","category":"people"},{"aliases":["tophat"],"filename":"1f3a9","category":"people"},{"aliases":["mortar_board"],"filename":"1f393","category":"people"},{"aliases":["crown"],"filename":"1f451","category":"people"},{"aliases":["rescue_worker_helmet"],"filename":"26d1","category":"people"},{"aliases":["school_satchel"],"filename":"1f392","category":"people"},{"aliases":["pouch"],"filename":"1f45d","category":"people"},{"aliases":["purse"],"filename":"1f45b","category":"people"},{"aliases":["handbag"],"filename":"1f45c","category":"people"},{"aliases":["briefcase"],"filename":"1f4bc","category":"people"},{"aliases":["eyeglasses"],"filename":"1f453","category":"people"},{"aliases":["dark_sunglasses"],"filename":"1f576","category":"people"},{"aliases":["closed_umbrella"],"filename":"1f302","category":"people"},{"aliases":["open_umbrella"],"filename":"2602-fe0f","category":"people"},{"aliases":["dog"],"filename":"1f436","category":"nature"},{"aliases":["cat"],"filename":"1f431","category":"nature"},{"aliases":["mouse"],"filename":"1f42d","category":"nature"},{"aliases":["hamster"],"filename":"1f439","category":"nature"},{"aliases":["rabbit"],"filename":"1f430","category":"nature"},{"aliases":["fox_face"],"filename":"1f98a","category":"nature"},{"aliases":["bear"],"filename":"1f43b","category":"nature"},{"aliases":["panda_face"],"filename":"1f43c","category":"nature"},{"aliases":["koala"],"filename":"1f428","category":"nature"},{"aliases":["tiger"],"filename":"1f42f","category":"nature"},{"aliases":["lion"],"filename":"1f981","category":"nature"},{"aliases":["cow"],"filename":"1f42e","category":"nature"},{"aliases":["pig"],"filename":"1f437","category":"nature"},{"aliases":["pig_nose"],"filename":"1f43d","category":"nature"},{"aliases":["frog"],"filename":"1f438","category":"nature"},{"aliases":["monkey_face"],"filename":"1f435","category":"nature"},{"aliases":["see_no_evil"],"filename":"1f648","category":"nature"},{"aliases":["hear_no_evil"],"filename":"1f649","category":"nature"},{"aliases":["speak_no_evil"],"filename":"1f64a","category":"nature"},{"aliases":["monkey"],"filename":"1f412","category":"nature"},{"aliases":["chicken"],"filename":"1f414","category":"nature"},{"aliases":["penguin"],"filename":"1f427","category":"nature"},{"aliases":["bird"],"filename":"1f426","category":"nature"},{"aliases":["baby_chick"],"filename":"1f424","category":"nature"},{"aliases":["hatching_chick"],"filename":"1f423","category":"nature"},{"aliases":["hatched_chick"],"filename":"1f425","category":"nature"},{"aliases":["duck"],"filename":"1f986","category":"nature"},{"aliases":["eagle"],"filename":"1f985","category":"nature"},{"aliases":["owl"],"filename":"1f989","category":"nature"},{"aliases":["bat"],"filename":"1f987","category":"nature"},{"aliases":["wolf"],"filename":"1f43a","category":"nature"},{"aliases":["boar"],"filename":"1f417","category":"nature"},{"aliases":["horse"],"filename":"1f434","category":"nature"},{"aliases":["unicorn"],"filename":"1f984","category":"nature"},{"aliases":["bee","honeybee"],"filename":"1f41d","category":"nature"},{"aliases":["bug"],"filename":"1f41b","category":"nature"},{"aliases":["butterfly"],"filename":"1f98b","category":"nature"},{"aliases":["snail"],"filename":"1f40c","category":"nature"},{"aliases":["shell"],"filename":"1f41a","category":"nature"},{"aliases":["beetle"],"filename":"1f41e","category":"nature"},{"aliases":["ant"],"filename":"1f41c","category":"nature"},{"aliases":["spider"],"filename":"1f577","category":"nature"},{"aliases":["spider_web"],"filename":"1f578","category":"nature"},{"aliases":["turtle"],"filename":"1f422","category":"nature"},{"aliases":["snake"],"filename":"1f40d","category":"nature"},{"aliases":["lizard"],"filename":"1f98e","category":"nature"},{"aliases":["scorpion"],"filename":"1f982","category":"nature"},{"aliases":["crab"],"filename":"1f980","category":"nature"},{"aliases":["squid"],"filename":"1f991","category":"nature"},{"aliases":["octopus"],"filename":"1f419","category":"nature"},{"aliases":["shrimp"],"filename":"1f990","category":"nature"},{"aliases":["tropical_fish"],"filename":"1f420","category":"nature"},{"aliases":["fish"],"filename":"1f41f","category":"nature"},{"aliases":["blowfish"],"filename":"1f421","category":"nature"},{"aliases":["dolphin","flipper"],"filename":"1f42c","category":"nature"},{"aliases":["shark"],"filename":"1f988","category":"nature"},{"aliases":["whale"],"filename":"1f433","category":"nature"},{"aliases":["whale2"],"filename":"1f40b","category":"nature"},{"aliases":["crocodile"],"filename":"1f40a","category":"nature"},{"aliases":["leopard"],"filename":"1f406","category":"nature"},{"aliases":["tiger2"],"filename":"1f405","category":"nature"},{"aliases":["water_buffalo"],"filename":"1f403","category":"nature"},{"aliases":["ox"],"filename":"1f402","category":"nature"},{"aliases":["cow2"],"filename":"1f404","category":"nature"},{"aliases":["deer"],"filename":"1f98c","category":"nature"},{"aliases":["dromedary_camel"],"filename":"1f42a","category":"nature"},{"aliases":["camel"],"filename":"1f42b","category":"nature"},{"aliases":["elephant"],"filename":"1f418","category":"nature"},{"aliases":["rhinoceros"],"filename":"1f98f","category":"nature"},{"aliases":["gorilla"],"filename":"1f98d","category":"nature"},{"aliases":["racehorse"],"filename":"1f40e","category":"nature"},{"aliases":["pig2"],"filename":"1f416","category":"nature"},{"aliases":["goat"],"filename":"1f410","category":"nature"},{"aliases":["ram"],"filename":"1f40f","category":"nature"},{"aliases":["sheep"],"filename":"1f411","category":"nature"},{"aliases":["dog2"],"filename":"1f415","category":"nature"},{"aliases":["poodle"],"filename":"1f429","category":"nature"},{"aliases":["cat2"],"filename":"1f408","category":"nature"},{"aliases":["rooster"],"filename":"1f413","category":"nature"},{"aliases":["turkey"],"filename":"1f983","category":"nature"},{"aliases":["dove"],"filename":"1f54a","category":"nature"},{"aliases":["rabbit2"],"filename":"1f407","category":"nature"},{"aliases":["mouse2"],"filename":"1f401","category":"nature"},{"aliases":["rat"],"filename":"1f400","category":"nature"},{"aliases":["chipmunk"],"filename":"1f43f","category":"nature"},{"aliases":["feet","paw_prints"],"filename":"1f43e","category":"nature"},{"aliases":["dragon"],"filename":"1f409","category":"nature"},{"aliases":["dragon_face"],"filename":"1f432","category":"nature"},{"aliases":["cactus"],"filename":"1f335","category":"nature"},{"aliases":["christmas_tree"],"filename":"1f384","category":"nature"},{"aliases":["evergreen_tree"],"filename":"1f332","category":"nature"},{"aliases":["deciduous_tree"],"filename":"1f333","category":"nature"},{"aliases":["palm_tree"],"filename":"1f334","category":"nature"},{"aliases":["seedling"],"filename":"1f331","category":"nature"},{"aliases":["herb"],"filename":"1f33f","category":"nature"},{"aliases":["shamrock"],"filename":"2618-fe0f","category":"nature"},{"aliases":["four_leaf_clover"],"filename":"1f340","category":"nature"},{"aliases":["bamboo"],"filename":"1f38d","category":"nature"},{"aliases":["tanabata_tree"],"filename":"1f38b","category":"nature"},{"aliases":["leaves"],"filename":"1f343","category":"nature"},{"aliases":["fallen_leaf"],"filename":"1f342","category":"nature"},{"aliases":["maple_leaf"],"filename":"1f341","category":"nature"},{"aliases":["mushroom"],"filename":"1f344","category":"nature"},{"aliases":["ear_of_rice"],"filename":"1f33e","category":"nature"},{"aliases":["bouquet"],"filename":"1f490","category":"nature"},{"aliases":["tulip"],"filename":"1f337","category":"nature"},{"aliases":["rose"],"filename":"1f339","category":"nature"},{"aliases":["wilted_flower"],"filename":"1f940","category":"nature"},{"aliases":["sunflower"],"filename":"1f33b","category":"nature"},{"aliases":["blossom"],"filename":"1f33c","category":"nature"},{"aliases":["cherry_blossom"],"filename":"1f338","category":"nature"},{"aliases":["hibiscus"],"filename":"1f33a","category":"nature"},{"aliases":["earth_americas"],"filename":"1f30e","category":"nature"},{"aliases":["earth_africa"],"filename":"1f30d","category":"nature"},{"aliases":["earth_asia"],"filename":"1f30f","category":"nature"},{"aliases":["full_moon"],"filename":"1f315","category":"nature"},{"aliases":["waning_gibbous_moon"],"filename":"1f316","category":"nature"},{"aliases":["last_quarter_moon"],"filename":"1f317","category":"nature"},{"aliases":["waning_crescent_moon"],"filename":"1f318","category":"nature"},{"aliases":["new_moon"],"filename":"1f311","category":"nature"},{"aliases":["waxing_crescent_moon"],"filename":"1f312","category":"nature"},{"aliases":["first_quarter_moon"],"filename":"1f313","category":"nature"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314","category":"nature"},{"aliases":["new_moon_with_face"],"filename":"1f31a","category":"nature"},{"aliases":["full_moon_with_face"],"filename":"1f31d","category":"nature"},{"aliases":["sun_with_face"],"filename":"1f31e","category":"nature"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b","category":"nature"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c","category":"nature"},{"aliases":["crescent_moon"],"filename":"1f319","category":"nature"},{"aliases":["dizzy"],"filename":"1f4ab","category":"nature"},{"aliases":["star"],"filename":"2b50-fe0f","category":"nature"},{"aliases":["star2"],"filename":"1f31f","category":"nature"},{"aliases":["sparkles"],"filename":"2728","category":"nature"},{"aliases":["zap"],"filename":"26a1-fe0f","category":"nature"},{"aliases":["fire"],"filename":"1f525","category":"nature"},{"aliases":["boom","collision"],"filename":"1f4a5","category":"nature"},{"aliases":["comet"],"filename":"2604-fe0f","category":"nature"},{"aliases":["sunny"],"filename":"2600-fe0f","category":"nature"},{"aliases":["sun_behind_small_cloud"],"filename":"1f324","category":"nature"},{"aliases":["partly_sunny"],"filename":"26c5-fe0f","category":"nature"},{"aliases":["sun_behind_large_cloud"],"filename":"1f325","category":"nature"},{"aliases":["sun_behind_rain_cloud"],"filename":"1f326","category":"nature"},{"aliases":["rainbow"],"filename":"1f308","category":"nature"},{"aliases":["cloud"],"filename":"2601-fe0f","category":"nature"},{"aliases":["cloud_with_rain"],"filename":"1f327","category":"nature"},{"aliases":["cloud_with_lightning_and_rain"],"filename":"26c8","category":"nature"},{"aliases":["cloud_with_lightning"],"filename":"1f329","category":"nature"},{"aliases":["cloud_with_snow"],"filename":"1f328","category":"nature"},{"aliases":["snowman_with_snow"],"filename":"2603-fe0f","category":"nature"},{"aliases":["snowman"],"filename":"26c4-fe0f","category":"nature"},{"aliases":["snowflake"],"filename":"2744-fe0f","category":"nature"},{"aliases":["wind_face"],"filename":"1f32c","category":"nature"},{"aliases":["dash"],"filename":"1f4a8","category":"nature"},{"aliases":["tornado"],"filename":"1f32a","category":"nature"},{"aliases":["fog"],"filename":"1f32b","category":"nature"},{"aliases":["ocean"],"filename":"1f30a","category":"nature"},{"aliases":["droplet"],"filename":"1f4a7","category":"nature"},{"aliases":["sweat_drops"],"filename":"1f4a6","category":"nature"},{"aliases":["umbrella"],"filename":"2614-fe0f","category":"nature"},{"aliases":["green_apple"],"filename":"1f34f","category":"foods"},{"aliases":["apple"],"filename":"1f34e","category":"foods"},{"aliases":["pear"],"filename":"1f350","category":"foods"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a","category":"foods"},{"aliases":["lemon"],"filename":"1f34b","category":"foods"},{"aliases":["banana"],"filename":"1f34c","category":"foods"},{"aliases":["watermelon"],"filename":"1f349","category":"foods"},{"aliases":["grapes"],"filename":"1f347","category":"foods"},{"aliases":["strawberry"],"filename":"1f353","category":"foods"},{"aliases":["melon"],"filename":"1f348","category":"foods"},{"aliases":["cherries"],"filename":"1f352","category":"foods"},{"aliases":["peach"],"filename":"1f351","category":"foods"},{"aliases":["pineapple"],"filename":"1f34d","category":"foods"},{"aliases":["kiwi_fruit"],"filename":"1f95d","category":"foods"},{"aliases":["avocado"],"filename":"1f951","category":"foods"},{"aliases":["tomato"],"filename":"1f345","category":"foods"},{"aliases":["eggplant"],"filename":"1f346","category":"foods"},{"aliases":["cucumber"],"filename":"1f952","category":"foods"},{"aliases":["carrot"],"filename":"1f955","category":"foods"},{"aliases":["corn"],"filename":"1f33d","category":"foods"},{"aliases":["hot_pepper"],"filename":"1f336","category":"foods"},{"aliases":["potato"],"filename":"1f954","category":"foods"},{"aliases":["sweet_potato"],"filename":"1f360","category":"foods"},{"aliases":["chestnut"],"filename":"1f330","category":"foods"},{"aliases":["peanuts"],"filename":"1f95c","category":"foods"},{"aliases":["honey_pot"],"filename":"1f36f","category":"foods"},{"aliases":["croissant"],"filename":"1f950","category":"foods"},{"aliases":["bread"],"filename":"1f35e","category":"foods"},{"aliases":["baguette_bread"],"filename":"1f956","category":"foods"},{"aliases":["cheese"],"filename":"1f9c0","category":"foods"},{"aliases":["egg"],"filename":"1f95a","category":"foods"},{"aliases":["fried_egg"],"filename":"1f373","category":"foods"},{"aliases":["bacon"],"filename":"1f953","category":"foods"},{"aliases":["pancakes"],"filename":"1f95e","category":"foods"},{"aliases":["fried_shrimp"],"filename":"1f364","category":"foods"},{"aliases":["poultry_leg"],"filename":"1f357","category":"foods"},{"aliases":["meat_on_bone"],"filename":"1f356","category":"foods"},{"aliases":["pizza"],"filename":"1f355","category":"foods"},{"aliases":["hotdog"],"filename":"1f32d","category":"foods"},{"aliases":["hamburger"],"filename":"1f354","category":"foods"},{"aliases":["fries"],"filename":"1f35f","category":"foods"},{"aliases":["stuffed_flatbread"],"filename":"1f959","category":"foods"},{"aliases":["taco"],"filename":"1f32e","category":"foods"},{"aliases":["burrito"],"filename":"1f32f","category":"foods"},{"aliases":["green_salad"],"filename":"1f957","category":"foods"},{"aliases":["shallow_pan_of_food"],"filename":"1f958","category":"foods"},{"aliases":["spaghetti"],"filename":"1f35d","category":"foods"},{"aliases":["ramen"],"filename":"1f35c","category":"foods"},{"aliases":["stew"],"filename":"1f372","category":"foods"},{"aliases":["fish_cake"],"filename":"1f365","category":"foods"},{"aliases":["sushi"],"filename":"1f363","category":"foods"},{"aliases":["bento"],"filename":"1f371","category":"foods"},{"aliases":["curry"],"filename":"1f35b","category":"foods"},{"aliases":["rice"],"filename":"1f35a","category":"foods"},{"aliases":["rice_ball"],"filename":"1f359","category":"foods"},{"aliases":["rice_cracker"],"filename":"1f358","category":"foods"},{"aliases":["oden"],"filename":"1f362","category":"foods"},{"aliases":["dango"],"filename":"1f361","category":"foods"},{"aliases":["shaved_ice"],"filename":"1f367","category":"foods"},{"aliases":["ice_cream"],"filename":"1f368","category":"foods"},{"aliases":["icecream"],"filename":"1f366","category":"foods"},{"aliases":["cake"],"filename":"1f370","category":"foods"},{"aliases":["birthday"],"filename":"1f382","category":"foods"},{"aliases":["custard"],"filename":"1f36e","category":"foods"},{"aliases":["lollipop"],"filename":"1f36d","category":"foods"},{"aliases":["candy"],"filename":"1f36c","category":"foods"},{"aliases":["chocolate_bar"],"filename":"1f36b","category":"foods"},{"aliases":["popcorn"],"filename":"1f37f","category":"foods"},{"aliases":["doughnut"],"filename":"1f369","category":"foods"},{"aliases":["cookie"],"filename":"1f36a","category":"foods"},{"aliases":["milk_glass"],"filename":"1f95b","category":"foods"},{"aliases":["baby_bottle"],"filename":"1f37c","category":"foods"},{"aliases":["coffee"],"filename":"2615-fe0f","category":"foods"},{"aliases":["tea"],"filename":"1f375","category":"foods"},{"aliases":["sake"],"filename":"1f376","category":"foods"},{"aliases":["beer"],"filename":"1f37a","category":"foods"},{"aliases":["beers"],"filename":"1f37b","category":"foods"},{"aliases":["clinking_glasses"],"filename":"1f942","category":"foods"},{"aliases":["wine_glass"],"filename":"1f377","category":"foods"},{"aliases":["tumbler_glass"],"filename":"1f943","category":"foods"},{"aliases":["cocktail"],"filename":"1f378","category":"foods"},{"aliases":["tropical_drink"],"filename":"1f379","category":"foods"},{"aliases":["champagne"],"filename":"1f37e","category":"foods"},{"aliases":["spoon"],"filename":"1f944","category":"foods"},{"aliases":["fork_and_knife"],"filename":"1f374","category":"foods"},{"aliases":["plate_with_cutlery"],"filename":"1f37d","category":"foods"},{"aliases":["soccer"],"filename":"26bd-fe0f","category":"activity"},{"aliases":["basketball"],"filename":"1f3c0","category":"activity"},{"aliases":["football"],"filename":"1f3c8","category":"activity"},{"aliases":["baseball"],"filename":"26be-fe0f","category":"activity"},{"aliases":["tennis"],"filename":"1f3be","category":"activity"},{"aliases":["volleyball"],"filename":"1f3d0","category":"activity"},{"aliases":["rugby_football"],"filename":"1f3c9","category":"activity"},{"aliases":["8ball"],"filename":"1f3b1","category":"activity"},{"aliases":["ping_pong"],"filename":"1f3d3","category":"activity"},{"aliases":["badminton"],"filename":"1f3f8","category":"activity"},{"aliases":["goal_net"],"filename":"1f945","category":"activity"},{"aliases":["ice_hockey"],"filename":"1f3d2","category":"activity"},{"aliases":["field_hockey"],"filename":"1f3d1","category":"activity"},{"aliases":["cricket"],"filename":"1f3cf","category":"activity"},{"aliases":["golf"],"filename":"26f3-fe0f","category":"activity"},{"aliases":["bow_and_arrow"],"filename":"1f3f9","category":"activity"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3","category":"activity"},{"aliases":["boxing_glove"],"filename":"1f94a","category":"activity"},{"aliases":["martial_arts_uniform"],"filename":"1f94b","category":"activity"},{"aliases":["ice_skate"],"filename":"26f8","category":"activity"},{"aliases":["ski"],"filename":"1f3bf","category":"activity"},{"aliases":["skier"],"filename":"26f7","category":"activity"},{"aliases":["snowboarder"],"filename":"1f3c2","category":"activity"},{"aliases":["weight_lifting_woman"],"filename":"1f3cb-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["weight_lifting_man"],"filename":"1f3cb-fe0f","category":"activity"},{"aliases":["person_fencing"],"filename":"1f93a","category":"activity"},{"aliases":["women_wrestling"],"filename":"1f93c-200d-2640-fe0f","category":"activity"},{"aliases":["men_wrestling"],"filename":"1f93c-200d-2642-fe0f","category":"activity"},{"aliases":["woman_cartwheeling"],"filename":"1f938-200d-2640-fe0f","category":"activity"},{"aliases":["man_cartwheeling"],"filename":"1f938-200d-2642-fe0f","category":"activity"},{"aliases":["basketball_woman"],"filename":"26f9-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["basketball_man"],"filename":"26f9-fe0f","category":"activity"},{"aliases":["woman_playing_handball"],"filename":"1f93e-200d-2640-fe0f","category":"activity"},{"aliases":["man_playing_handball"],"filename":"1f93e-200d-2642-fe0f","category":"activity"},{"aliases":["golfing_woman"],"filename":"1f3cc-fe0f-200d-2640-fe0f","category":"activity"},{"aliases":["golfing_man"],"filename":"1f3cc-fe0f","category":"activity"},{"aliases":["surfing_woman"],"filename":"1f3c4-200d-2640-fe0f","category":"activity"},{"aliases":["surfing_man","surfer"],"filename":"1f3c4","category":"activity"},{"aliases":["swimming_woman"],"filename":"1f3ca-200d-2640-fe0f","category":"activity"},{"aliases":["swimming_man","swimmer"],"filename":"1f3ca","category":"activity"},{"aliases":["woman_playing_water_polo"],"filename":"1f93d-200d-2640-fe0f","category":"activity"},{"aliases":["man_playing_water_polo"],"filename":"1f93d-200d-2642-fe0f","category":"activity"},{"aliases":["rowing_woman"],"filename":"1f6a3-200d-2640-fe0f","category":"activity"},{"aliases":["rowing_man","rowboat"],"filename":"1f6a3","category":"activity"},{"aliases":["horse_racing"],"filename":"1f3c7","category":"activity"},{"aliases":["biking_woman"],"filename":"1f6b4-200d-2640-fe0f","category":"activity"},{"aliases":["biking_man","bicyclist"],"filename":"1f6b4","category":"activity"},{"aliases":["mountain_biking_woman"],"filename":"1f6b5-200d-2640-fe0f","category":"activity"},{"aliases":["mountain_biking_man","mountain_bicyclist"],"filename":"1f6b5","category":"activity"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd","category":"activity"},{"aliases":["medal_sports"],"filename":"1f3c5","category":"activity"},{"aliases":["medal_military"],"filename":"1f396","category":"activity"},{"aliases":["1st_place_medal"],"filename":"1f947","category":"activity"},{"aliases":["2nd_place_medal"],"filename":"1f948","category":"activity"},{"aliases":["3rd_place_medal"],"filename":"1f949","category":"activity"},{"aliases":["trophy"],"filename":"1f3c6","category":"activity"},{"aliases":["rosette"],"filename":"1f3f5","category":"activity"},{"aliases":["reminder_ribbon"],"filename":"1f397","category":"activity"},{"aliases":["ticket"],"filename":"1f3ab","category":"activity"},{"aliases":["tickets"],"filename":"1f39f","category":"activity"},{"aliases":["circus_tent"],"filename":"1f3aa","category":"activity"},{"aliases":["woman_juggling"],"filename":"1f939-200d-2640-fe0f","category":"activity"},{"aliases":["man_juggling"],"filename":"1f939-200d-2642-fe0f","category":"activity"},{"aliases":["performing_arts"],"filename":"1f3ad","category":"activity"},{"aliases":["art"],"filename":"1f3a8","category":"activity"},{"aliases":["clapper"],"filename":"1f3ac","category":"activity"},{"aliases":["microphone"],"filename":"1f3a4","category":"activity"},{"aliases":["headphones"],"filename":"1f3a7","category":"activity"},{"aliases":["musical_score"],"filename":"1f3bc","category":"activity"},{"aliases":["musical_keyboard"],"filename":"1f3b9","category":"activity"},{"aliases":["drum"],"filename":"1f941","category":"activity"},{"aliases":["saxophone"],"filename":"1f3b7","category":"activity"},{"aliases":["trumpet"],"filename":"1f3ba","category":"activity"},{"aliases":["guitar"],"filename":"1f3b8","category":"activity"},{"aliases":["violin"],"filename":"1f3bb","category":"activity"},{"aliases":["game_die"],"filename":"1f3b2","category":"activity"},{"aliases":["dart"],"filename":"1f3af","category":"activity"},{"aliases":["bowling"],"filename":"1f3b3","category":"activity"},{"aliases":["video_game"],"filename":"1f3ae","category":"activity"},{"aliases":["slot_machine"],"filename":"1f3b0","category":"activity"},{"aliases":["car","red_car"],"filename":"1f697","category":"places"},{"aliases":["taxi"],"filename":"1f695","category":"places"},{"aliases":["blue_car"],"filename":"1f699","category":"places"},{"aliases":["bus"],"filename":"1f68c","category":"places"},{"aliases":["trolleybus"],"filename":"1f68e","category":"places"},{"aliases":["racing_car"],"filename":"1f3ce","category":"places"},{"aliases":["police_car"],"filename":"1f693","category":"places"},{"aliases":["ambulance"],"filename":"1f691","category":"places"},{"aliases":["fire_engine"],"filename":"1f692","category":"places"},{"aliases":["minibus"],"filename":"1f690","category":"places"},{"aliases":["truck"],"filename":"1f69a","category":"places"},{"aliases":["articulated_lorry"],"filename":"1f69b","category":"places"},{"aliases":["tractor"],"filename":"1f69c","category":"places"},{"aliases":["kick_scooter"],"filename":"1f6f4","category":"places"},{"aliases":["bike"],"filename":"1f6b2","category":"places"},{"aliases":["motor_scooter"],"filename":"1f6f5","category":"places"},{"aliases":["motorcycle"],"filename":"1f3cd","category":"places"},{"aliases":["rotating_light"],"filename":"1f6a8","category":"places"},{"aliases":["oncoming_police_car"],"filename":"1f694","category":"places"},{"aliases":["oncoming_bus"],"filename":"1f68d","category":"places"},{"aliases":["oncoming_automobile"],"filename":"1f698","category":"places"},{"aliases":["oncoming_taxi"],"filename":"1f696","category":"places"},{"aliases":["aerial_tramway"],"filename":"1f6a1","category":"places"},{"aliases":["mountain_cableway"],"filename":"1f6a0","category":"places"},{"aliases":["suspension_railway"],"filename":"1f69f","category":"places"},{"aliases":["railway_car"],"filename":"1f683","category":"places"},{"aliases":["train"],"filename":"1f68b","category":"places"},{"aliases":["mountain_railway"],"filename":"1f69e","category":"places"},{"aliases":["monorail"],"filename":"1f69d","category":"places"},{"aliases":["bullettrain_side"],"filename":"1f684","category":"places"},{"aliases":["bullettrain_front"],"filename":"1f685","category":"places"},{"aliases":["light_rail"],"filename":"1f688","category":"places"},{"aliases":["steam_locomotive"],"filename":"1f682","category":"places"},{"aliases":["train2"],"filename":"1f686","category":"places"},{"aliases":["metro"],"filename":"1f687","category":"places"},{"aliases":["tram"],"filename":"1f68a","category":"places"},{"aliases":["station"],"filename":"1f689","category":"places"},{"aliases":["helicopter"],"filename":"1f681","category":"places"},{"aliases":["small_airplane"],"filename":"1f6e9","category":"places"},{"aliases":["airplane"],"filename":"2708-fe0f","category":"places"},{"aliases":["flight_departure"],"filename":"1f6eb","category":"places"},{"aliases":["flight_arrival"],"filename":"1f6ec","category":"places"},{"aliases":["rocket"],"filename":"1f680","category":"places"},{"aliases":["artificial_satellite"],"filename":"1f6f0","category":"places"},{"aliases":["seat"],"filename":"1f4ba","category":"places"},{"aliases":["canoe"],"filename":"1f6f6","category":"places"},{"aliases":["boat","sailboat"],"filename":"26f5-fe0f","category":"places"},{"aliases":["motor_boat"],"filename":"1f6e5","category":"places"},{"aliases":["speedboat"],"filename":"1f6a4","category":"places"},{"aliases":["passenger_ship"],"filename":"1f6f3","category":"places"},{"aliases":["ferry"],"filename":"26f4","category":"places"},{"aliases":["ship"],"filename":"1f6a2","category":"places"},{"aliases":["anchor"],"filename":"2693-fe0f","category":"places"},{"aliases":["construction"],"filename":"1f6a7","category":"places"},{"aliases":["fuelpump"],"filename":"26fd-fe0f","category":"places"},{"aliases":["busstop"],"filename":"1f68f","category":"places"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6","category":"places"},{"aliases":["traffic_light"],"filename":"1f6a5","category":"places"},{"aliases":["world_map"],"filename":"1f5fa","category":"places"},{"aliases":["moyai"],"filename":"1f5ff","category":"places"},{"aliases":["statue_of_liberty"],"filename":"1f5fd","category":"places"},{"aliases":["fountain"],"filename":"26f2-fe0f","category":"places"},{"aliases":["tokyo_tower"],"filename":"1f5fc","category":"places"},{"aliases":["european_castle"],"filename":"1f3f0","category":"places"},{"aliases":["japanese_castle"],"filename":"1f3ef","category":"places"},{"aliases":["stadium"],"filename":"1f3df","category":"places"},{"aliases":["ferris_wheel"],"filename":"1f3a1","category":"places"},{"aliases":["roller_coaster"],"filename":"1f3a2","category":"places"},{"aliases":["carousel_horse"],"filename":"1f3a0","category":"places"},{"aliases":["parasol_on_ground"],"filename":"26f1","category":"places"},{"aliases":["beach_umbrella"],"filename":"1f3d6","category":"places"},{"aliases":["desert_island"],"filename":"1f3dd","category":"places"},{"aliases":["mountain"],"filename":"26f0","category":"places"},{"aliases":["mountain_snow"],"filename":"1f3d4","category":"places"},{"aliases":["mount_fuji"],"filename":"1f5fb","category":"places"},{"aliases":["volcano"],"filename":"1f30b","category":"places"},{"aliases":["desert"],"filename":"1f3dc","category":"places"},{"aliases":["camping"],"filename":"1f3d5","category":"places"},{"aliases":["tent"],"filename":"26fa-fe0f","category":"places"},{"aliases":["railway_track"],"filename":"1f6e4","category":"places"},{"aliases":["motorway"],"filename":"1f6e3","category":"places"},{"aliases":["building_construction"],"filename":"1f3d7","category":"places"},{"aliases":["factory"],"filename":"1f3ed","category":"places"},{"aliases":["house"],"filename":"1f3e0","category":"places"},{"aliases":["house_with_garden"],"filename":"1f3e1","category":"places"},{"aliases":["houses"],"filename":"1f3d8","category":"places"},{"aliases":["derelict_house"],"filename":"1f3da","category":"places"},{"aliases":["office"],"filename":"1f3e2","category":"places"},{"aliases":["department_store"],"filename":"1f3ec","category":"places"},{"aliases":["post_office"],"filename":"1f3e3","category":"places"},{"aliases":["european_post_office"],"filename":"1f3e4","category":"places"},{"aliases":["hospital"],"filename":"1f3e5","category":"places"},{"aliases":["bank"],"filename":"1f3e6","category":"places"},{"aliases":["hotel"],"filename":"1f3e8","category":"places"},{"aliases":["convenience_store"],"filename":"1f3ea","category":"places"},{"aliases":["school"],"filename":"1f3eb","category":"places"},{"aliases":["love_hotel"],"filename":"1f3e9","category":"places"},{"aliases":["wedding"],"filename":"1f492","category":"places"},{"aliases":["classical_building"],"filename":"1f3db","category":"places"},{"aliases":["church"],"filename":"26ea-fe0f","category":"places"},{"aliases":["mosque"],"filename":"1f54c","category":"places"},{"aliases":["synagogue"],"filename":"1f54d","category":"places"},{"aliases":["kaaba"],"filename":"1f54b","category":"places"},{"aliases":["shinto_shrine"],"filename":"26e9","category":"places"},{"aliases":["japan"],"filename":"1f5fe","category":"places"},{"aliases":["rice_scene"],"filename":"1f391","category":"places"},{"aliases":["national_park"],"filename":"1f3de","category":"places"},{"aliases":["sunrise"],"filename":"1f305","category":"places"},{"aliases":["sunrise_over_mountains"],"filename":"1f304","category":"places"},{"aliases":["stars"],"filename":"1f320","category":"places"},{"aliases":["sparkler"],"filename":"1f387","category":"places"},{"aliases":["fireworks"],"filename":"1f386","category":"places"},{"aliases":["city_sunrise"],"filename":"1f307","category":"places"},{"aliases":["city_sunset"],"filename":"1f306","category":"places"},{"aliases":["cityscape"],"filename":"1f3d9","category":"places"},{"aliases":["night_with_stars"],"filename":"1f303","category":"places"},{"aliases":["milky_way"],"filename":"1f30c","category":"places"},{"aliases":["bridge_at_night"],"filename":"1f309","category":"places"},{"aliases":["foggy"],"filename":"1f301","category":"places"},{"aliases":["watch"],"filename":"231a-fe0f","category":"objects"},{"aliases":["iphone"],"filename":"1f4f1","category":"objects"},{"aliases":["calling"],"filename":"1f4f2","category":"objects"},{"aliases":["computer"],"filename":"1f4bb","category":"objects"},{"aliases":["keyboard"],"filename":"2328-fe0f","category":"objects"},{"aliases":["desktop_computer"],"filename":"1f5a5","category":"objects"},{"aliases":["printer"],"filename":"1f5a8","category":"objects"},{"aliases":["computer_mouse"],"filename":"1f5b1","category":"objects"},{"aliases":["trackball"],"filename":"1f5b2","category":"objects"},{"aliases":["joystick"],"filename":"1f579","category":"objects"},{"aliases":["clamp"],"filename":"1f5dc","category":"objects"},{"aliases":["minidisc"],"filename":"1f4bd","category":"objects"},{"aliases":["floppy_disk"],"filename":"1f4be","category":"objects"},{"aliases":["cd"],"filename":"1f4bf","category":"objects"},{"aliases":["dvd"],"filename":"1f4c0","category":"objects"},{"aliases":["vhs"],"filename":"1f4fc","category":"objects"},{"aliases":["camera"],"filename":"1f4f7","category":"objects"},{"aliases":["camera_flash"],"filename":"1f4f8","category":"objects"},{"aliases":["video_camera"],"filename":"1f4f9","category":"objects"},{"aliases":["movie_camera"],"filename":"1f3a5","category":"objects"},{"aliases":["film_projector"],"filename":"1f4fd","category":"objects"},{"aliases":["film_strip"],"filename":"1f39e","category":"objects"},{"aliases":["telephone_receiver"],"filename":"1f4de","category":"objects"},{"aliases":["phone","telephone"],"filename":"260e-fe0f","category":"objects"},{"aliases":["pager"],"filename":"1f4df","category":"objects"},{"aliases":["fax"],"filename":"1f4e0","category":"objects"},{"aliases":["tv"],"filename":"1f4fa","category":"objects"},{"aliases":["radio"],"filename":"1f4fb","category":"objects"},{"aliases":["studio_microphone"],"filename":"1f399","category":"objects"},{"aliases":["level_slider"],"filename":"1f39a","category":"objects"},{"aliases":["control_knobs"],"filename":"1f39b","category":"objects"},{"aliases":["stopwatch"],"filename":"23f1","category":"objects"},{"aliases":["timer_clock"],"filename":"23f2","category":"objects"},{"aliases":["alarm_clock"],"filename":"23f0","category":"objects"},{"aliases":["mantelpiece_clock"],"filename":"1f570","category":"objects"},{"aliases":["hourglass"],"filename":"231b-fe0f","category":"objects"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3","category":"objects"},{"aliases":["satellite"],"filename":"1f4e1","category":"objects"},{"aliases":["battery"],"filename":"1f50b","category":"objects"},{"aliases":["electric_plug"],"filename":"1f50c","category":"objects"},{"aliases":["bulb"],"filename":"1f4a1","category":"objects"},{"aliases":["flashlight"],"filename":"1f526","category":"objects"},{"aliases":["candle"],"filename":"1f56f","category":"objects"},{"aliases":["wastebasket"],"filename":"1f5d1","category":"objects"},{"aliases":["oil_drum"],"filename":"1f6e2","category":"objects"},{"aliases":["money_with_wings"],"filename":"1f4b8","category":"objects"},{"aliases":["dollar"],"filename":"1f4b5","category":"objects"},{"aliases":["yen"],"filename":"1f4b4","category":"objects"},{"aliases":["euro"],"filename":"1f4b6","category":"objects"},{"aliases":["pound"],"filename":"1f4b7","category":"objects"},{"aliases":["moneybag"],"filename":"1f4b0","category":"objects"},{"aliases":["credit_card"],"filename":"1f4b3","category":"objects"},{"aliases":["gem"],"filename":"1f48e","category":"objects"},{"aliases":["balance_scale"],"filename":"2696-fe0f","category":"objects"},{"aliases":["wrench"],"filename":"1f527","category":"objects"},{"aliases":["hammer"],"filename":"1f528","category":"objects"},{"aliases":["hammer_and_pick"],"filename":"2692","category":"objects"},{"aliases":["hammer_and_wrench"],"filename":"1f6e0","category":"objects"},{"aliases":["pick"],"filename":"26cf","category":"objects"},{"aliases":["nut_and_bolt"],"filename":"1f529","category":"objects"},{"aliases":["gear"],"filename":"2699-fe0f","category":"objects"},{"aliases":["chains"],"filename":"26d3","category":"objects"},{"aliases":["gun"],"filename":"1f52b","category":"objects"},{"aliases":["bomb"],"filename":"1f4a3","category":"objects"},{"aliases":["hocho","knife"],"filename":"1f52a","category":"objects"},{"aliases":["dagger"],"filename":"1f5e1","category":"objects"},{"aliases":["crossed_swords"],"filename":"2694-fe0f","category":"objects"},{"aliases":["shield"],"filename":"1f6e1","category":"objects"},{"aliases":["smoking"],"filename":"1f6ac","category":"objects"},{"aliases":["coffin"],"filename":"26b0-fe0f","category":"objects"},{"aliases":["funeral_urn"],"filename":"26b1-fe0f","category":"objects"},{"aliases":["amphora"],"filename":"1f3fa","category":"objects"},{"aliases":["crystal_ball"],"filename":"1f52e","category":"objects"},{"aliases":["prayer_beads"],"filename":"1f4ff","category":"objects"},{"aliases":["barber"],"filename":"1f488","category":"objects"},{"aliases":["alembic"],"filename":"2697-fe0f","category":"objects"},{"aliases":["telescope"],"filename":"1f52d","category":"objects"},{"aliases":["microscope"],"filename":"1f52c","category":"objects"},{"aliases":["hole"],"filename":"1f573","category":"objects"},{"aliases":["pill"],"filename":"1f48a","category":"objects"},{"aliases":["syringe"],"filename":"1f489","category":"objects"},{"aliases":["thermometer"],"filename":"1f321","category":"objects"},{"aliases":["toilet"],"filename":"1f6bd","category":"objects"},{"aliases":["potable_water"],"filename":"1f6b0","category":"objects"},{"aliases":["shower"],"filename":"1f6bf","category":"objects"},{"aliases":["bathtub"],"filename":"1f6c1","category":"objects"},{"aliases":["bath"],"filename":"1f6c0","category":"objects"},{"aliases":["bellhop_bell"],"filename":"1f6ce","category":"objects"},{"aliases":["key"],"filename":"1f511","category":"objects"},{"aliases":["old_key"],"filename":"1f5dd","category":"objects"},{"aliases":["door"],"filename":"1f6aa","category":"objects"},{"aliases":["couch_and_lamp"],"filename":"1f6cb","category":"objects"},{"aliases":["bed"],"filename":"1f6cf","category":"objects"},{"aliases":["sleeping_bed"],"filename":"1f6cc","category":"objects"},{"aliases":["framed_picture"],"filename":"1f5bc","category":"objects"},{"aliases":["shopping"],"filename":"1f6cd","category":"objects"},{"aliases":["shopping_cart"],"filename":"1f6d2","category":"objects"},{"aliases":["gift"],"filename":"1f381","category":"objects"},{"aliases":["balloon"],"filename":"1f388","category":"objects"},{"aliases":["flags"],"filename":"1f38f","category":"objects"},{"aliases":["ribbon"],"filename":"1f380","category":"objects"},{"aliases":["confetti_ball"],"filename":"1f38a","category":"objects"},{"aliases":["tada"],"filename":"1f389","category":"objects"},{"aliases":["dolls"],"filename":"1f38e","category":"objects"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee","category":"objects"},{"aliases":["wind_chime"],"filename":"1f390","category":"objects"},{"aliases":["email","envelope"],"filename":"2709-fe0f","category":"objects"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9","category":"objects"},{"aliases":["incoming_envelope"],"filename":"1f4e8","category":"objects"},{"aliases":["e-mail"],"filename":"1f4e7","category":"objects"},{"aliases":["love_letter"],"filename":"1f48c","category":"objects"},{"aliases":["inbox_tray"],"filename":"1f4e5","category":"objects"},{"aliases":["outbox_tray"],"filename":"1f4e4","category":"objects"},{"aliases":["package"],"filename":"1f4e6","category":"objects"},{"aliases":["label"],"filename":"1f3f7","category":"objects"},{"aliases":["mailbox_closed"],"filename":"1f4ea","category":"objects"},{"aliases":["mailbox"],"filename":"1f4eb","category":"objects"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec","category":"objects"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed","category":"objects"},{"aliases":["postbox"],"filename":"1f4ee","category":"objects"},{"aliases":["postal_horn"],"filename":"1f4ef","category":"objects"},{"aliases":["scroll"],"filename":"1f4dc","category":"objects"},{"aliases":["page_with_curl"],"filename":"1f4c3","category":"objects"},{"aliases":["page_facing_up"],"filename":"1f4c4","category":"objects"},{"aliases":["bookmark_tabs"],"filename":"1f4d1","category":"objects"},{"aliases":["bar_chart"],"filename":"1f4ca","category":"objects"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8","category":"objects"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9","category":"objects"},{"aliases":["spiral_notepad"],"filename":"1f5d2","category":"objects"},{"aliases":["spiral_calendar"],"filename":"1f5d3","category":"objects"},{"aliases":["calendar"],"filename":"1f4c6","category":"objects"},{"aliases":["date"],"filename":"1f4c5","category":"objects"},{"aliases":["card_index"],"filename":"1f4c7","category":"objects"},{"aliases":["card_file_box"],"filename":"1f5c3","category":"objects"},{"aliases":["ballot_box"],"filename":"1f5f3","category":"objects"},{"aliases":["file_cabinet"],"filename":"1f5c4","category":"objects"},{"aliases":["clipboard"],"filename":"1f4cb","category":"objects"},{"aliases":["file_folder"],"filename":"1f4c1","category":"objects"},{"aliases":["open_file_folder"],"filename":"1f4c2","category":"objects"},{"aliases":["card_index_dividers"],"filename":"1f5c2","category":"objects"},{"aliases":["newspaper_roll"],"filename":"1f5de","category":"objects"},{"aliases":["newspaper"],"filename":"1f4f0","category":"objects"},{"aliases":["notebook"],"filename":"1f4d3","category":"objects"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4","category":"objects"},{"aliases":["ledger"],"filename":"1f4d2","category":"objects"},{"aliases":["closed_book"],"filename":"1f4d5","category":"objects"},{"aliases":["green_book"],"filename":"1f4d7","category":"objects"},{"aliases":["blue_book"],"filename":"1f4d8","category":"objects"},{"aliases":["orange_book"],"filename":"1f4d9","category":"objects"},{"aliases":["books"],"filename":"1f4da","category":"objects"},{"aliases":["book","open_book"],"filename":"1f4d6","category":"objects"},{"aliases":["bookmark"],"filename":"1f516","category":"objects"},{"aliases":["link"],"filename":"1f517","category":"objects"},{"aliases":["paperclip"],"filename":"1f4ce","category":"objects"},{"aliases":["paperclips"],"filename":"1f587","category":"objects"},{"aliases":["triangular_ruler"],"filename":"1f4d0","category":"objects"},{"aliases":["straight_ruler"],"filename":"1f4cf","category":"objects"},{"aliases":["pushpin"],"filename":"1f4cc","category":"objects"},{"aliases":["round_pushpin"],"filename":"1f4cd","category":"objects"},{"aliases":["scissors"],"filename":"2702-fe0f","category":"objects"},{"aliases":["pen"],"filename":"1f58a","category":"objects"},{"aliases":["fountain_pen"],"filename":"1f58b","category":"objects"},{"aliases":["black_nib"],"filename":"2712-fe0f","category":"objects"},{"aliases":["paintbrush"],"filename":"1f58c","category":"objects"},{"aliases":["crayon"],"filename":"1f58d","category":"objects"},{"aliases":["memo","pencil"],"filename":"1f4dd","category":"objects"},{"aliases":["pencil2"],"filename":"270f-fe0f","category":"objects"},{"aliases":["mag"],"filename":"1f50d","category":"objects"},{"aliases":["mag_right"],"filename":"1f50e","category":"objects"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f","category":"objects"},{"aliases":["closed_lock_with_key"],"filename":"1f510","category":"objects"},{"aliases":["lock"],"filename":"1f512","category":"objects"},{"aliases":["unlock"],"filename":"1f513","category":"objects"},{"aliases":["heart"],"filename":"2764-fe0f","category":"symbols"},{"aliases":["yellow_heart"],"filename":"1f49b","category":"symbols"},{"aliases":["green_heart"],"filename":"1f49a","category":"symbols"},{"aliases":["blue_heart"],"filename":"1f499","category":"symbols"},{"aliases":["purple_heart"],"filename":"1f49c","category":"symbols"},{"aliases":["black_heart"],"filename":"1f5a4","category":"symbols"},{"aliases":["broken_heart"],"filename":"1f494","category":"symbols"},{"aliases":["heavy_heart_exclamation"],"filename":"2763-fe0f","category":"symbols"},{"aliases":["two_hearts"],"filename":"1f495","category":"symbols"},{"aliases":["revolving_hearts"],"filename":"1f49e","category":"symbols"},{"aliases":["heartbeat"],"filename":"1f493","category":"symbols"},{"aliases":["heartpulse"],"filename":"1f497","category":"symbols"},{"aliases":["sparkling_heart"],"filename":"1f496","category":"symbols"},{"aliases":["cupid"],"filename":"1f498","category":"symbols"},{"aliases":["gift_heart"],"filename":"1f49d","category":"symbols"},{"aliases":["heart_decoration"],"filename":"1f49f","category":"symbols"},{"aliases":["peace_symbol"],"filename":"262e-fe0f","category":"symbols"},{"aliases":["latin_cross"],"filename":"271d-fe0f","category":"symbols"},{"aliases":["star_and_crescent"],"filename":"262a-fe0f","category":"symbols"},{"aliases":["om"],"filename":"1f549","category":"symbols"},{"aliases":["wheel_of_dharma"],"filename":"2638-fe0f","category":"symbols"},{"aliases":["star_of_david"],"filename":"2721-fe0f","category":"symbols"},{"aliases":["six_pointed_star"],"filename":"1f52f","category":"symbols"},{"aliases":["menorah"],"filename":"1f54e","category":"symbols"},{"aliases":["yin_yang"],"filename":"262f-fe0f","category":"symbols"},{"aliases":["orthodox_cross"],"filename":"2626-fe0f","category":"symbols"},{"aliases":["place_of_worship"],"filename":"1f6d0","category":"symbols"},{"aliases":["ophiuchus"],"filename":"26ce","category":"symbols"},{"aliases":["aries"],"filename":"2648-fe0f","category":"symbols"},{"aliases":["taurus"],"filename":"2649-fe0f","category":"symbols"},{"aliases":["gemini"],"filename":"264a-fe0f","category":"symbols"},{"aliases":["cancer"],"filename":"264b-fe0f","category":"symbols"},{"aliases":["leo"],"filename":"264c-fe0f","category":"symbols"},{"aliases":["virgo"],"filename":"264d-fe0f","category":"symbols"},{"aliases":["libra"],"filename":"264e-fe0f","category":"symbols"},{"aliases":["scorpius"],"filename":"264f-fe0f","category":"symbols"},{"aliases":["sagittarius"],"filename":"2650-fe0f","category":"symbols"},{"aliases":["capricorn"],"filename":"2651-fe0f","category":"symbols"},{"aliases":["aquarius"],"filename":"2652-fe0f","category":"symbols"},{"aliases":["pisces"],"filename":"2653-fe0f","category":"symbols"},{"aliases":["id"],"filename":"1f194","category":"symbols"},{"aliases":["atom_symbol"],"filename":"269b-fe0f","category":"symbols"},{"aliases":["accept"],"filename":"1f251","category":"symbols"},{"aliases":["radioactive"],"filename":"2622-fe0f","category":"symbols"},{"aliases":["biohazard"],"filename":"2623-fe0f","category":"symbols"},{"aliases":["mobile_phone_off"],"filename":"1f4f4","category":"symbols"},{"aliases":["vibration_mode"],"filename":"1f4f3","category":"symbols"},{"aliases":["u6709"],"filename":"1f236","category":"symbols"},{"aliases":["u7121"],"filename":"1f21a-fe0f","category":"symbols"},{"aliases":["u7533"],"filename":"1f238","category":"symbols"},{"aliases":["u55b6"],"filename":"1f23a","category":"symbols"},{"aliases":["u6708"],"filename":"1f237-fe0f","category":"symbols"},{"aliases":["eight_pointed_black_star"],"filename":"2734-fe0f","category":"symbols"},{"aliases":["vs"],"filename":"1f19a","category":"symbols"},{"aliases":["white_flower"],"filename":"1f4ae","category":"symbols"},{"aliases":["ideograph_advantage"],"filename":"1f250","category":"symbols"},{"aliases":["secret"],"filename":"3299-fe0f","category":"symbols"},{"aliases":["congratulations"],"filename":"3297-fe0f","category":"symbols"},{"aliases":["u5408"],"filename":"1f234","category":"symbols"},{"aliases":["u6e80"],"filename":"1f235","category":"symbols"},{"aliases":["u5272"],"filename":"1f239","category":"symbols"},{"aliases":["u7981"],"filename":"1f232","category":"symbols"},{"aliases":["a"],"filename":"1f170-fe0f","category":"symbols"},{"aliases":["b"],"filename":"1f171-fe0f","category":"symbols"},{"aliases":["ab"],"filename":"1f18e","category":"symbols"},{"aliases":["cl"],"filename":"1f191","category":"symbols"},{"aliases":["o2"],"filename":"1f17e-fe0f","category":"symbols"},{"aliases":["sos"],"filename":"1f198","category":"symbols"},{"aliases":["x"],"filename":"274c","category":"symbols"},{"aliases":["o"],"filename":"2b55-fe0f","category":"symbols"},{"aliases":["stop_sign"],"filename":"1f6d1","category":"symbols"},{"aliases":["no_entry"],"filename":"26d4-fe0f","category":"symbols"},{"aliases":["name_badge"],"filename":"1f4db","category":"symbols"},{"aliases":["no_entry_sign"],"filename":"1f6ab","category":"symbols"},{"aliases":["100"],"filename":"1f4af","category":"symbols"},{"aliases":["anger"],"filename":"1f4a2","category":"symbols"},{"aliases":["hotsprings"],"filename":"2668-fe0f","category":"symbols"},{"aliases":["no_pedestrians"],"filename":"1f6b7","category":"symbols"},{"aliases":["do_not_litter"],"filename":"1f6af","category":"symbols"},{"aliases":["no_bicycles"],"filename":"1f6b3","category":"symbols"},{"aliases":["non-potable_water"],"filename":"1f6b1","category":"symbols"},{"aliases":["underage"],"filename":"1f51e","category":"symbols"},{"aliases":["no_mobile_phones"],"filename":"1f4f5","category":"symbols"},{"aliases":["no_smoking"],"filename":"1f6ad","category":"symbols"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757-fe0f","category":"symbols"},{"aliases":["grey_exclamation"],"filename":"2755","category":"symbols"},{"aliases":["question"],"filename":"2753","category":"symbols"},{"aliases":["grey_question"],"filename":"2754","category":"symbols"},{"aliases":["bangbang"],"filename":"203c-fe0f","category":"symbols"},{"aliases":["interrobang"],"filename":"2049-fe0f","category":"symbols"},{"aliases":["low_brightness"],"filename":"1f505","category":"symbols"},{"aliases":["high_brightness"],"filename":"1f506","category":"symbols"},{"aliases":["part_alternation_mark"],"filename":"303d-fe0f","category":"symbols"},{"aliases":["warning"],"filename":"26a0-fe0f","category":"symbols"},{"aliases":["children_crossing"],"filename":"1f6b8","category":"symbols"},{"aliases":["trident"],"filename":"1f531","category":"symbols"},{"aliases":["fleur_de_lis"],"filename":"269c-fe0f","category":"symbols"},{"aliases":["beginner"],"filename":"1f530","category":"symbols"},{"aliases":["recycle"],"filename":"267b-fe0f","category":"symbols"},{"aliases":["white_check_mark"],"filename":"2705","category":"symbols"},{"aliases":["u6307"],"filename":"1f22f-fe0f","category":"symbols"},{"aliases":["chart"],"filename":"1f4b9","category":"symbols"},{"aliases":["sparkle"],"filename":"2747-fe0f","category":"symbols"},{"aliases":["eight_spoked_asterisk"],"filename":"2733-fe0f","category":"symbols"},{"aliases":["negative_squared_cross_mark"],"filename":"274e","category":"symbols"},{"aliases":["globe_with_meridians"],"filename":"1f310","category":"symbols"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0","category":"symbols"},{"aliases":["m"],"filename":"24c2-fe0f","category":"symbols"},{"aliases":["cyclone"],"filename":"1f300","category":"symbols"},{"aliases":["zzz"],"filename":"1f4a4","category":"symbols"},{"aliases":["atm"],"filename":"1f3e7","category":"symbols"},{"aliases":["wc"],"filename":"1f6be","category":"symbols"},{"aliases":["wheelchair"],"filename":"267f-fe0f","category":"symbols"},{"aliases":["parking"],"filename":"1f17f-fe0f","category":"symbols"},{"aliases":["u7a7a"],"filename":"1f233","category":"symbols"},{"aliases":["sa"],"filename":"1f202-fe0f","category":"symbols"},{"aliases":["passport_control"],"filename":"1f6c2","category":"symbols"},{"aliases":["customs"],"filename":"1f6c3","category":"symbols"},{"aliases":["baggage_claim"],"filename":"1f6c4","category":"symbols"},{"aliases":["left_luggage"],"filename":"1f6c5","category":"symbols"},{"aliases":["mens"],"filename":"1f6b9","category":"symbols"},{"aliases":["womens"],"filename":"1f6ba","category":"symbols"},{"aliases":["baby_symbol"],"filename":"1f6bc","category":"symbols"},{"aliases":["restroom"],"filename":"1f6bb","category":"symbols"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae","category":"symbols"},{"aliases":["cinema"],"filename":"1f3a6","category":"symbols"},{"aliases":["signal_strength"],"filename":"1f4f6","category":"symbols"},{"aliases":["koko"],"filename":"1f201","category":"symbols"},{"aliases":["symbols"],"filename":"1f523","category":"symbols"},{"aliases":["information_source"],"filename":"2139-fe0f","category":"symbols"},{"aliases":["abc"],"filename":"1f524","category":"symbols"},{"aliases":["abcd"],"filename":"1f521","category":"symbols"},{"aliases":["capital_abcd"],"filename":"1f520","category":"symbols"},{"aliases":["ng"],"filename":"1f196","category":"symbols"},{"aliases":["ok"],"filename":"1f197","category":"symbols"},{"aliases":["up"],"filename":"1f199","category":"symbols"},{"aliases":["cool"],"filename":"1f192","category":"symbols"},{"aliases":["new"],"filename":"1f195","category":"symbols"},{"aliases":["free"],"filename":"1f193","category":"symbols"},{"aliases":["zero"],"filename":"0030-fe0f-20e3","category":"symbols"},{"aliases":["one"],"filename":"0031-fe0f-20e3","category":"symbols"},{"aliases":["two"],"filename":"0032-fe0f-20e3","category":"symbols"},{"aliases":["three"],"filename":"0033-fe0f-20e3","category":"symbols"},{"aliases":["four"],"filename":"0034-fe0f-20e3","category":"symbols"},{"aliases":["five"],"filename":"0035-fe0f-20e3","category":"symbols"},{"aliases":["six"],"filename":"0036-fe0f-20e3","category":"symbols"},{"aliases":["seven"],"filename":"0037-fe0f-20e3","category":"symbols"},{"aliases":["eight"],"filename":"0038-fe0f-20e3","category":"symbols"},{"aliases":["nine"],"filename":"0039-fe0f-20e3","category":"symbols"},{"aliases":["keycap_ten"],"filename":"1f51f","category":"symbols"},{"aliases":["1234"],"filename":"1f522","category":"symbols"},{"aliases":["hash"],"filename":"0023-fe0f-20e3","category":"symbols"},{"aliases":["asterisk"],"filename":"002a-fe0f-20e3","category":"symbols"},{"aliases":["arrow_forward"],"filename":"25b6-fe0f","category":"symbols"},{"aliases":["pause_button"],"filename":"23f8","category":"symbols"},{"aliases":["play_or_pause_button"],"filename":"23ef","category":"symbols"},{"aliases":["stop_button"],"filename":"23f9","category":"symbols"},{"aliases":["record_button"],"filename":"23fa","category":"symbols"},{"aliases":["next_track_button"],"filename":"23ed","category":"symbols"},{"aliases":["previous_track_button"],"filename":"23ee","category":"symbols"},{"aliases":["fast_forward"],"filename":"23e9","category":"symbols"},{"aliases":["rewind"],"filename":"23ea","category":"symbols"},{"aliases":["arrow_double_up"],"filename":"23eb","category":"symbols"},{"aliases":["arrow_double_down"],"filename":"23ec","category":"symbols"},{"aliases":["arrow_backward"],"filename":"25c0-fe0f","category":"symbols"},{"aliases":["arrow_up_small"],"filename":"1f53c","category":"symbols"},{"aliases":["arrow_down_small"],"filename":"1f53d","category":"symbols"},{"aliases":["arrow_right"],"filename":"27a1-fe0f","category":"symbols"},{"aliases":["arrow_left"],"filename":"2b05-fe0f","category":"symbols"},{"aliases":["arrow_up"],"filename":"2b06-fe0f","category":"symbols"},{"aliases":["arrow_down"],"filename":"2b07-fe0f","category":"symbols"},{"aliases":["arrow_upper_right"],"filename":"2197-fe0f","category":"symbols"},{"aliases":["arrow_lower_right"],"filename":"2198-fe0f","category":"symbols"},{"aliases":["arrow_lower_left"],"filename":"2199-fe0f","category":"symbols"},{"aliases":["arrow_upper_left"],"filename":"2196-fe0f","category":"symbols"},{"aliases":["arrow_up_down"],"filename":"2195-fe0f","category":"symbols"},{"aliases":["left_right_arrow"],"filename":"2194-fe0f","category":"symbols"},{"aliases":["arrow_right_hook"],"filename":"21aa-fe0f","category":"symbols"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9-fe0f","category":"symbols"},{"aliases":["arrow_heading_up"],"filename":"2934-fe0f","category":"symbols"},{"aliases":["arrow_heading_down"],"filename":"2935-fe0f","category":"symbols"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500","category":"symbols"},{"aliases":["repeat"],"filename":"1f501","category":"symbols"},{"aliases":["repeat_one"],"filename":"1f502","category":"symbols"},{"aliases":["arrows_counterclockwise"],"filename":"1f504","category":"symbols"},{"aliases":["arrows_clockwise"],"filename":"1f503","category":"symbols"},{"aliases":["musical_note"],"filename":"1f3b5","category":"symbols"},{"aliases":["notes"],"filename":"1f3b6","category":"symbols"},{"aliases":["heavy_plus_sign"],"filename":"2795","category":"symbols"},{"aliases":["heavy_minus_sign"],"filename":"2796","category":"symbols"},{"aliases":["heavy_division_sign"],"filename":"2797","category":"symbols"},{"aliases":["heavy_multiplication_x"],"filename":"2716-fe0f","category":"symbols"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2","category":"symbols"},{"aliases":["currency_exchange"],"filename":"1f4b1","category":"symbols"},{"aliases":["tm"],"filename":"2122-fe0f","category":"symbols"},{"aliases":["copyright"],"filename":"00a9-fe0f","category":"symbols"},{"aliases":["registered"],"filename":"00ae-fe0f","category":"symbols"},{"aliases":["wavy_dash"],"filename":"3030-fe0f","category":"symbols"},{"aliases":["curly_loop"],"filename":"27b0","category":"symbols"},{"aliases":["loop"],"filename":"27bf","category":"symbols"},{"aliases":["end"],"filename":"1f51a","category":"symbols"},{"aliases":["back"],"filename":"1f519","category":"symbols"},{"aliases":["on"],"filename":"1f51b","category":"symbols"},{"aliases":["top"],"filename":"1f51d","category":"symbols"},{"aliases":["soon"],"filename":"1f51c","category":"symbols"},{"aliases":["heavy_check_mark"],"filename":"2714-fe0f","category":"symbols"},{"aliases":["ballot_box_with_check"],"filename":"2611-fe0f","category":"symbols"},{"aliases":["radio_button"],"filename":"1f518","category":"symbols"},{"aliases":["white_circle"],"filename":"26aa-fe0f","category":"symbols"},{"aliases":["black_circle"],"filename":"26ab-fe0f","category":"symbols"},{"aliases":["red_circle"],"filename":"1f534","category":"symbols"},{"aliases":["large_blue_circle"],"filename":"1f535","category":"symbols"},{"aliases":["small_red_triangle"],"filename":"1f53a","category":"symbols"},{"aliases":["small_red_triangle_down"],"filename":"1f53b","category":"symbols"},{"aliases":["small_orange_diamond"],"filename":"1f538","category":"symbols"},{"aliases":["small_blue_diamond"],"filename":"1f539","category":"symbols"},{"aliases":["large_orange_diamond"],"filename":"1f536","category":"symbols"},{"aliases":["large_blue_diamond"],"filename":"1f537","category":"symbols"},{"aliases":["white_square_button"],"filename":"1f533","category":"symbols"},{"aliases":["black_square_button"],"filename":"1f532","category":"symbols"},{"aliases":["black_small_square"],"filename":"25aa-fe0f","category":"symbols"},{"aliases":["white_small_square"],"filename":"25ab-fe0f","category":"symbols"},{"aliases":["black_medium_small_square"],"filename":"25fe-fe0f","category":"symbols"},{"aliases":["white_medium_small_square"],"filename":"25fd-fe0f","category":"symbols"},{"aliases":["black_medium_square"],"filename":"25fc-fe0f","category":"symbols"},{"aliases":["white_medium_square"],"filename":"25fb-fe0f","category":"symbols"},{"aliases":["black_large_square"],"filename":"2b1b-fe0f","category":"symbols"},{"aliases":["white_large_square"],"filename":"2b1c-fe0f","category":"symbols"},{"aliases":["speaker"],"filename":"1f508","category":"symbols"},{"aliases":["mute"],"filename":"1f507","category":"symbols"},{"aliases":["sound"],"filename":"1f509","category":"symbols"},{"aliases":["loud_sound"],"filename":"1f50a","category":"symbols"},{"aliases":["bell"],"filename":"1f514","category":"symbols"},{"aliases":["no_bell"],"filename":"1f515","category":"symbols"},{"aliases":["mega"],"filename":"1f4e3","category":"symbols"},{"aliases":["loudspeaker"],"filename":"1f4e2","category":"symbols"},{"aliases":["eye_speech_bubble"],"filename":"1f441-200d-1f5e8","category":"symbols"},{"aliases":["speech_balloon"],"filename":"1f4ac","category":"symbols"},{"aliases":["thought_balloon"],"filename":"1f4ad","category":"symbols"},{"aliases":["right_anger_bubble"],"filename":"1f5ef","category":"symbols"},{"aliases":["spades"],"filename":"2660-fe0f","category":"symbols"},{"aliases":["clubs"],"filename":"2663-fe0f","category":"symbols"},{"aliases":["hearts"],"filename":"2665-fe0f","category":"symbols"},{"aliases":["diamonds"],"filename":"2666-fe0f","category":"symbols"},{"aliases":["black_joker"],"filename":"1f0cf","category":"symbols"},{"aliases":["flower_playing_cards"],"filename":"1f3b4","category":"symbols"},{"aliases":["mahjong"],"filename":"1f004-fe0f","category":"symbols"},{"aliases":["clock1"],"filename":"1f550","category":"symbols"},{"aliases":["clock2"],"filename":"1f551","category":"symbols"},{"aliases":["clock3"],"filename":"1f552","category":"symbols"},{"aliases":["clock4"],"filename":"1f553","category":"symbols"},{"aliases":["clock5"],"filename":"1f554","category":"symbols"},{"aliases":["clock6"],"filename":"1f555","category":"symbols"},{"aliases":["clock7"],"filename":"1f556","category":"symbols"},{"aliases":["clock8"],"filename":"1f557","category":"symbols"},{"aliases":["clock9"],"filename":"1f558","category":"symbols"},{"aliases":["clock10"],"filename":"1f559","category":"symbols"},{"aliases":["clock11"],"filename":"1f55a","category":"symbols"},{"aliases":["clock12"],"filename":"1f55b","category":"symbols"},{"aliases":["clock130"],"filename":"1f55c","category":"symbols"},{"aliases":["clock230"],"filename":"1f55d","category":"symbols"},{"aliases":["clock330"],"filename":"1f55e","category":"symbols"},{"aliases":["clock430"],"filename":"1f55f","category":"symbols"},{"aliases":["clock530"],"filename":"1f560","category":"symbols"},{"aliases":["clock630"],"filename":"1f561","category":"symbols"},{"aliases":["clock730"],"filename":"1f562","category":"symbols"},{"aliases":["clock830"],"filename":"1f563","category":"symbols"},{"aliases":["clock930"],"filename":"1f564","category":"symbols"},{"aliases":["clock1030"],"filename":"1f565","category":"symbols"},{"aliases":["clock1130"],"filename":"1f566","category":"symbols"},{"aliases":["clock1230"],"filename":"1f567","category":"symbols"},{"aliases":["white_flag"],"filename":"1f3f3-fe0f","category":"flags"},{"aliases":["black_flag"],"filename":"1f3f4","category":"flags"},{"aliases":["checkered_flag"],"filename":"1f3c1","category":"flags"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9","category":"flags"},{"aliases":["rainbow_flag"],"filename":"1f3f3-fe0f-200d-1f308","category":"flags"},{"aliases":["afghanistan"],"filename":"1f1e6-1f1eb","category":"flags"},{"aliases":["aland_islands"],"filename":"1f1e6-1f1fd","category":"flags"},{"aliases":["albania"],"filename":"1f1e6-1f1f1","category":"flags"},{"aliases":["algeria"],"filename":"1f1e9-1f1ff","category":"flags"},{"aliases":["american_samoa"],"filename":"1f1e6-1f1f8","category":"flags"},{"aliases":["andorra"],"filename":"1f1e6-1f1e9","category":"flags"},{"aliases":["angola"],"filename":"1f1e6-1f1f4","category":"flags"},{"aliases":["anguilla"],"filename":"1f1e6-1f1ee","category":"flags"},{"aliases":["antarctica"],"filename":"1f1e6-1f1f6","category":"flags"},{"aliases":["antigua_barbuda"],"filename":"1f1e6-1f1ec","category":"flags"},{"aliases":["argentina"],"filename":"1f1e6-1f1f7","category":"flags"},{"aliases":["armenia"],"filename":"1f1e6-1f1f2","category":"flags"},{"aliases":["aruba"],"filename":"1f1e6-1f1fc","category":"flags"},{"aliases":["australia"],"filename":"1f1e6-1f1fa","category":"flags"},{"aliases":["austria"],"filename":"1f1e6-1f1f9","category":"flags"},{"aliases":["azerbaijan"],"filename":"1f1e6-1f1ff","category":"flags"},{"aliases":["bahamas"],"filename":"1f1e7-1f1f8","category":"flags"},{"aliases":["bahrain"],"filename":"1f1e7-1f1ed","category":"flags"},{"aliases":["bangladesh"],"filename":"1f1e7-1f1e9","category":"flags"},{"aliases":["barbados"],"filename":"1f1e7-1f1e7","category":"flags"},{"aliases":["belarus"],"filename":"1f1e7-1f1fe","category":"flags"},{"aliases":["belgium"],"filename":"1f1e7-1f1ea","category":"flags"},{"aliases":["belize"],"filename":"1f1e7-1f1ff","category":"flags"},{"aliases":["benin"],"filename":"1f1e7-1f1ef","category":"flags"},{"aliases":["bermuda"],"filename":"1f1e7-1f1f2","category":"flags"},{"aliases":["bhutan"],"filename":"1f1e7-1f1f9","category":"flags"},{"aliases":["bolivia"],"filename":"1f1e7-1f1f4","category":"flags"},{"aliases":["caribbean_netherlands"],"filename":"1f1e7-1f1f6","category":"flags"},{"aliases":["bosnia_herzegovina"],"filename":"1f1e7-1f1e6","category":"flags"},{"aliases":["botswana"],"filename":"1f1e7-1f1fc","category":"flags"},{"aliases":["brazil"],"filename":"1f1e7-1f1f7","category":"flags"},{"aliases":["british_indian_ocean_territory"],"filename":"1f1ee-1f1f4","category":"flags"},{"aliases":["british_virgin_islands"],"filename":"1f1fb-1f1ec","category":"flags"},{"aliases":["brunei"],"filename":"1f1e7-1f1f3","category":"flags"},{"aliases":["bulgaria"],"filename":"1f1e7-1f1ec","category":"flags"},{"aliases":["burkina_faso"],"filename":"1f1e7-1f1eb","category":"flags"},{"aliases":["burundi"],"filename":"1f1e7-1f1ee","category":"flags"},{"aliases":["cape_verde"],"filename":"1f1e8-1f1fb","category":"flags"},{"aliases":["cambodia"],"filename":"1f1f0-1f1ed","category":"flags"},{"aliases":["cameroon"],"filename":"1f1e8-1f1f2","category":"flags"},{"aliases":["canada","ca"],"filename":"1f1e8-1f1e6","category":"flags"},{"aliases":["canary_islands"],"filename":"1f1ee-1f1e8","category":"flags"},{"aliases":["cayman_islands"],"filename":"1f1f0-1f1fe","category":"flags"},{"aliases":["central_african_republic"],"filename":"1f1e8-1f1eb","category":"flags"},{"aliases":["chad"],"filename":"1f1f9-1f1e9","category":"flags"},{"aliases":["chile"],"filename":"1f1e8-1f1f1","category":"flags"},{"aliases":["cn"],"filename":"1f1e8-1f1f3","category":"flags"},{"aliases":["christmas_island"],"filename":"1f1e8-1f1fd","category":"flags"},{"aliases":["cocos_islands"],"filename":"1f1e8-1f1e8","category":"flags"},{"aliases":["colombia"],"filename":"1f1e8-1f1f4","category":"flags"},{"aliases":["comoros"],"filename":"1f1f0-1f1f2","category":"flags"},{"aliases":["congo_brazzaville"],"filename":"1f1e8-1f1ec","category":"flags"},{"aliases":["congo_kinshasa"],"filename":"1f1e8-1f1e9","category":"flags"},{"aliases":["cook_islands"],"filename":"1f1e8-1f1f0","category":"flags"},{"aliases":["costa_rica"],"filename":"1f1e8-1f1f7","category":"flags"},{"aliases":["cote_divoire"],"filename":"1f1e8-1f1ee","category":"flags"},{"aliases":["croatia"],"filename":"1f1ed-1f1f7","category":"flags"},{"aliases":["cuba"],"filename":"1f1e8-1f1fa","category":"flags"},{"aliases":["curacao"],"filename":"1f1e8-1f1fc","category":"flags"},{"aliases":["cyprus"],"filename":"1f1e8-1f1fe","category":"flags"},{"aliases":["czech_republic"],"filename":"1f1e8-1f1ff","category":"flags"},{"aliases":["denmark"],"filename":"1f1e9-1f1f0","category":"flags"},{"aliases":["djibouti"],"filename":"1f1e9-1f1ef","category":"flags"},{"aliases":["dominica"],"filename":"1f1e9-1f1f2","category":"flags"},{"aliases":["dominican_republic"],"filename":"1f1e9-1f1f4","category":"flags"},{"aliases":["ecuador"],"filename":"1f1ea-1f1e8","category":"flags"},{"aliases":["egypt"],"filename":"1f1ea-1f1ec","category":"flags"},{"aliases":["el_salvador"],"filename":"1f1f8-1f1fb","category":"flags"},{"aliases":["equatorial_guinea"],"filename":"1f1ec-1f1f6","category":"flags"},{"aliases":["eritrea"],"filename":"1f1ea-1f1f7","category":"flags"},{"aliases":["estonia"],"filename":"1f1ea-1f1ea","category":"flags"},{"aliases":["ethiopia"],"filename":"1f1ea-1f1f9","category":"flags"},{"aliases":["eu","european_union"],"filename":"1f1ea-1f1fa","category":"flags"},{"aliases":["falkland_islands"],"filename":"1f1eb-1f1f0","category":"flags"},{"aliases":["faroe_islands"],"filename":"1f1eb-1f1f4","category":"flags"},{"aliases":["fiji"],"filename":"1f1eb-1f1ef","category":"flags"},{"aliases":["finland"],"filename":"1f1eb-1f1ee","category":"flags"},{"aliases":["fr"],"filename":"1f1eb-1f1f7","category":"flags"},{"aliases":["french_guiana"],"filename":"1f1ec-1f1eb","category":"flags"},{"aliases":["french_polynesia"],"filename":"1f1f5-1f1eb","category":"flags"},{"aliases":["french_southern_territories"],"filename":"1f1f9-1f1eb","category":"flags"},{"aliases":["gabon"],"filename":"1f1ec-1f1e6","category":"flags"},{"aliases":["gambia"],"filename":"1f1ec-1f1f2","category":"flags"},{"aliases":["georgia"],"filename":"1f1ec-1f1ea","category":"flags"},{"aliases":["de"],"filename":"1f1e9-1f1ea","category":"flags"},{"aliases":["ghana"],"filename":"1f1ec-1f1ed","category":"flags"},{"aliases":["gibraltar"],"filename":"1f1ec-1f1ee","category":"flags"},{"aliases":["greece"],"filename":"1f1ec-1f1f7","category":"flags"},{"aliases":["greenland"],"filename":"1f1ec-1f1f1","category":"flags"},{"aliases":["grenada"],"filename":"1f1ec-1f1e9","category":"flags"},{"aliases":["guadeloupe"],"filename":"1f1ec-1f1f5","category":"flags"},{"aliases":["guam"],"filename":"1f1ec-1f1fa","category":"flags"},{"aliases":["guatemala"],"filename":"1f1ec-1f1f9","category":"flags"},{"aliases":["guernsey"],"filename":"1f1ec-1f1ec","category":"flags"},{"aliases":["guinea"],"filename":"1f1ec-1f1f3","category":"flags"},{"aliases":["guinea_bissau"],"filename":"1f1ec-1f1fc","category":"flags"},{"aliases":["guyana"],"filename":"1f1ec-1f1fe","category":"flags"},{"aliases":["haiti"],"filename":"1f1ed-1f1f9","category":"flags"},{"aliases":["honduras"],"filename":"1f1ed-1f1f3","category":"flags"},{"aliases":["hong_kong"],"filename":"1f1ed-1f1f0","category":"flags"},{"aliases":["hungary"],"filename":"1f1ed-1f1fa","category":"flags"},{"aliases":["iceland"],"filename":"1f1ee-1f1f8","category":"flags"},{"aliases":["india"],"filename":"1f1ee-1f1f3","category":"flags"},{"aliases":["indonesia"],"filename":"1f1ee-1f1e9","category":"flags"},{"aliases":["iran"],"filename":"1f1ee-1f1f7","category":"flags"},{"aliases":["iraq"],"filename":"1f1ee-1f1f6","category":"flags"},{"aliases":["ireland"],"filename":"1f1ee-1f1ea","category":"flags"},{"aliases":["isle_of_man"],"filename":"1f1ee-1f1f2","category":"flags"},{"aliases":["israel"],"filename":"1f1ee-1f1f1","category":"flags"},{"aliases":["it"],"filename":"1f1ee-1f1f9","category":"flags"},{"aliases":["jamaica"],"filename":"1f1ef-1f1f2","category":"flags"},{"aliases":["jp"],"filename":"1f1ef-1f1f5","category":"flags"},{"aliases":["crossed_flags"],"filename":"1f38c","category":"flags"},{"aliases":["jersey"],"filename":"1f1ef-1f1ea","category":"flags"},{"aliases":["jordan"],"filename":"1f1ef-1f1f4","category":"flags"},{"aliases":["kazakhstan"],"filename":"1f1f0-1f1ff","category":"flags"},{"aliases":["kenya"],"filename":"1f1f0-1f1ea","category":"flags"},{"aliases":["kiribati"],"filename":"1f1f0-1f1ee","category":"flags"},{"aliases":["kosovo"],"filename":"1f1fd-1f1f0","category":"flags"},{"aliases":["kuwait"],"filename":"1f1f0-1f1fc","category":"flags"},{"aliases":["kyrgyzstan"],"filename":"1f1f0-1f1ec","category":"flags"},{"aliases":["laos"],"filename":"1f1f1-1f1e6","category":"flags"},{"aliases":["latvia"],"filename":"1f1f1-1f1fb","category":"flags"},{"aliases":["lebanon"],"filename":"1f1f1-1f1e7","category":"flags"},{"aliases":["lesotho"],"filename":"1f1f1-1f1f8","category":"flags"},{"aliases":["liberia"],"filename":"1f1f1-1f1f7","category":"flags"},{"aliases":["libya"],"filename":"1f1f1-1f1fe","category":"flags"},{"aliases":["liechtenstein"],"filename":"1f1f1-1f1ee","category":"flags"},{"aliases":["lithuania"],"filename":"1f1f1-1f1f9","category":"flags"},{"aliases":["luxembourg"],"filename":"1f1f1-1f1fa","category":"flags"},{"aliases":["macau"],"filename":"1f1f2-1f1f4","category":"flags"},{"aliases":["macedonia"],"filename":"1f1f2-1f1f0","category":"flags"},{"aliases":["madagascar"],"filename":"1f1f2-1f1ec","category":"flags"},{"aliases":["malawi"],"filename":"1f1f2-1f1fc","category":"flags"},{"aliases":["malaysia"],"filename":"1f1f2-1f1fe","category":"flags"},{"aliases":["maldives"],"filename":"1f1f2-1f1fb","category":"flags"},{"aliases":["mali"],"filename":"1f1f2-1f1f1","category":"flags"},{"aliases":["malta"],"filename":"1f1f2-1f1f9","category":"flags"},{"aliases":["marshall_islands"],"filename":"1f1f2-1f1ed","category":"flags"},{"aliases":["martinique"],"filename":"1f1f2-1f1f6","category":"flags"},{"aliases":["mauritania"],"filename":"1f1f2-1f1f7","category":"flags"},{"aliases":["mauritius"],"filename":"1f1f2-1f1fa","category":"flags"},{"aliases":["mayotte"],"filename":"1f1fe-1f1f9","category":"flags"},{"aliases":["mexico"],"filename":"1f1f2-1f1fd","category":"flags"},{"aliases":["micronesia"],"filename":"1f1eb-1f1f2","category":"flags"},{"aliases":["moldova"],"filename":"1f1f2-1f1e9","category":"flags"},{"aliases":["monaco"],"filename":"1f1f2-1f1e8","category":"flags"},{"aliases":["mongolia"],"filename":"1f1f2-1f1f3","category":"flags"},{"aliases":["montenegro"],"filename":"1f1f2-1f1ea","category":"flags"},{"aliases":["montserrat"],"filename":"1f1f2-1f1f8","category":"flags"},{"aliases":["morocco"],"filename":"1f1f2-1f1e6","category":"flags"},{"aliases":["mozambique"],"filename":"1f1f2-1f1ff","category":"flags"},{"aliases":["myanmar"],"filename":"1f1f2-1f1f2","category":"flags"},{"aliases":["namibia"],"filename":"1f1f3-1f1e6","category":"flags"},{"aliases":["nauru"],"filename":"1f1f3-1f1f7","category":"flags"},{"aliases":["nepal"],"filename":"1f1f3-1f1f5","category":"flags"},{"aliases":["netherlands"],"filename":"1f1f3-1f1f1","category":"flags"},{"aliases":["new_caledonia"],"filename":"1f1f3-1f1e8","category":"flags"},{"aliases":["new_zealand"],"filename":"1f1f3-1f1ff","category":"flags"},{"aliases":["nicaragua"],"filename":"1f1f3-1f1ee","category":"flags"},{"aliases":["niger"],"filename":"1f1f3-1f1ea","category":"flags"},{"aliases":["nigeria"],"filename":"1f1f3-1f1ec","category":"flags"},{"aliases":["niue"],"filename":"1f1f3-1f1fa","category":"flags"},{"aliases":["norfolk_island"],"filename":"1f1f3-1f1eb","category":"flags"},{"aliases":["northern_mariana_islands"],"filename":"1f1f2-1f1f5","category":"flags"},{"aliases":["north_korea"],"filename":"1f1f0-1f1f5","category":"flags"},{"aliases":["norway"],"filename":"1f1f3-1f1f4","category":"flags"},{"aliases":["oman"],"filename":"1f1f4-1f1f2","category":"flags"},{"aliases":["pakistan","pk"],"filename":"1f1f5-1f1f0","category":"flags"},{"aliases":["palau"],"filename":"1f1f5-1f1fc","category":"flags"},{"aliases":["palestinian_territories"],"filename":"1f1f5-1f1f8","category":"flags"},{"aliases":["panama"],"filename":"1f1f5-1f1e6","category":"flags"},{"aliases":["papua_new_guinea"],"filename":"1f1f5-1f1ec","category":"flags"},{"aliases":["paraguay"],"filename":"1f1f5-1f1fe","category":"flags"},{"aliases":["peru"],"filename":"1f1f5-1f1ea","category":"flags"},{"aliases":["philippines"],"filename":"1f1f5-1f1ed","category":"flags"},{"aliases":["pitcairn_islands"],"filename":"1f1f5-1f1f3","category":"flags"},{"aliases":["poland"],"filename":"1f1f5-1f1f1","category":"flags"},{"aliases":["portugal"],"filename":"1f1f5-1f1f9","category":"flags"},{"aliases":["puerto_rico"],"filename":"1f1f5-1f1f7","category":"flags"},{"aliases":["qatar"],"filename":"1f1f6-1f1e6","category":"flags"},{"aliases":["reunion"],"filename":"1f1f7-1f1ea","category":"flags"},{"aliases":["romania"],"filename":"1f1f7-1f1f4","category":"flags"},{"aliases":["ru"],"filename":"1f1f7-1f1fa","category":"flags"},{"aliases":["rwanda"],"filename":"1f1f7-1f1fc","category":"flags"},{"aliases":["st_barthelemy"],"filename":"1f1e7-1f1f1","category":"flags"},{"aliases":["st_helena"],"filename":"1f1f8-1f1ed","category":"flags"},{"aliases":["st_kitts_nevis"],"filename":"1f1f0-1f1f3","category":"flags"},{"aliases":["st_lucia"],"filename":"1f1f1-1f1e8","category":"flags"},{"aliases":["st_pierre_miquelon"],"filename":"1f1f5-1f1f2","category":"flags"},{"aliases":["st_vincent_grenadines"],"filename":"1f1fb-1f1e8","category":"flags"},{"aliases":["samoa"],"filename":"1f1fc-1f1f8","category":"flags"},{"aliases":["san_marino"],"filename":"1f1f8-1f1f2","category":"flags"},{"aliases":["sao_tome_principe"],"filename":"1f1f8-1f1f9","category":"flags"},{"aliases":["saudi_arabia"],"filename":"1f1f8-1f1e6","category":"flags"},{"aliases":["senegal"],"filename":"1f1f8-1f1f3","category":"flags"},{"aliases":["serbia"],"filename":"1f1f7-1f1f8","category":"flags"},{"aliases":["seychelles"],"filename":"1f1f8-1f1e8","category":"flags"},{"aliases":["sierra_leone"],"filename":"1f1f8-1f1f1","category":"flags"},{"aliases":["singapore"],"filename":"1f1f8-1f1ec","category":"flags"},{"aliases":["sint_maarten"],"filename":"1f1f8-1f1fd","category":"flags"},{"aliases":["slovakia"],"filename":"1f1f8-1f1f0","category":"flags"},{"aliases":["slovenia"],"filename":"1f1f8-1f1ee","category":"flags"},{"aliases":["solomon_islands"],"filename":"1f1f8-1f1e7","category":"flags"},{"aliases":["somalia"],"filename":"1f1f8-1f1f4","category":"flags"},{"aliases":["south_africa","za"],"filename":"1f1ff-1f1e6","category":"flags"},{"aliases":["south_georgia_south_sandwich_islands"],"filename":"1f1ec-1f1f8","category":"flags"},{"aliases":["kr"],"filename":"1f1f0-1f1f7","category":"flags"},{"aliases":["south_sudan"],"filename":"1f1f8-1f1f8","category":"flags"},{"aliases":["es"],"filename":"1f1ea-1f1f8","category":"flags"},{"aliases":["sri_lanka"],"filename":"1f1f1-1f1f0","category":"flags"},{"aliases":["sudan"],"filename":"1f1f8-1f1e9","category":"flags"},{"aliases":["suriname"],"filename":"1f1f8-1f1f7","category":"flags"},{"aliases":["swaziland"],"filename":"1f1f8-1f1ff","category":"flags"},{"aliases":["sweden"],"filename":"1f1f8-1f1ea","category":"flags"},{"aliases":["switzerland"],"filename":"1f1e8-1f1ed","category":"flags"},{"aliases":["syria"],"filename":"1f1f8-1f1fe","category":"flags"},{"aliases":["taiwan"],"filename":"1f1f9-1f1fc","category":"flags"},{"aliases":["tajikistan"],"filename":"1f1f9-1f1ef","category":"flags"},{"aliases":["tanzania"],"filename":"1f1f9-1f1ff","category":"flags"},{"aliases":["thailand"],"filename":"1f1f9-1f1ed","category":"flags"},{"aliases":["timor_leste"],"filename":"1f1f9-1f1f1","category":"flags"},{"aliases":["togo"],"filename":"1f1f9-1f1ec","category":"flags"},{"aliases":["tokelau"],"filename":"1f1f9-1f1f0","category":"flags"},{"aliases":["tonga"],"filename":"1f1f9-1f1f4","category":"flags"},{"aliases":["trinidad_tobago"],"filename":"1f1f9-1f1f9","category":"flags"},{"aliases":["tunisia"],"filename":"1f1f9-1f1f3","category":"flags"},{"aliases":["tr"],"filename":"1f1f9-1f1f7","category":"flags"},{"aliases":["turkmenistan"],"filename":"1f1f9-1f1f2","category":"flags"},{"aliases":["turks_caicos_islands"],"filename":"1f1f9-1f1e8","category":"flags"},{"aliases":["tuvalu"],"filename":"1f1f9-1f1fb","category":"flags"},{"aliases":["uganda"],"filename":"1f1fa-1f1ec","category":"flags"},{"aliases":["ukraine"],"filename":"1f1fa-1f1e6","category":"flags"},{"aliases":["united_arab_emirates"],"filename":"1f1e6-1f1ea","category":"flags"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7","category":"flags"},{"aliases":["us"],"filename":"1f1fa-1f1f8","category":"flags"},{"aliases":["us_virgin_islands"],"filename":"1f1fb-1f1ee","category":"flags"},{"aliases":["uruguay"],"filename":"1f1fa-1f1fe","category":"flags"},{"aliases":["uzbekistan"],"filename":"1f1fa-1f1ff","category":"flags"},{"aliases":["vanuatu"],"filename":"1f1fb-1f1fa","category":"flags"},{"aliases":["vatican_city"],"filename":"1f1fb-1f1e6","category":"flags"},{"aliases":["venezuela"],"filename":"1f1fb-1f1ea","category":"flags"},{"aliases":["vietnam"],"filename":"1f1fb-1f1f3","category":"flags"},{"aliases":["wallis_futuna"],"filename":"1f1fc-1f1eb","category":"flags"},{"aliases":["western_sahara"],"filename":"1f1ea-1f1ed","category":"flags"},{"aliases":["yemen"],"filename":"1f1fe-1f1ea","category":"flags"},{"aliases":["zambia"],"filename":"1f1ff-1f1f2","category":"flags"},{"aliases":["zimbabwe"],"filename":"1f1ff-1f1fc","category":"flags"},{"aliases":["bowtie"],"filename":"bowtie","category":"custom"},{"aliases":["feelsgood"],"filename":"feelsgood","category":"custom"},{"aliases":["finnadie"],"filename":"finnadie","category":"custom"},{"aliases":["goberserk"],"filename":"goberserk","category":"custom"},{"aliases":["godmode"],"filename":"godmode","category":"custom"},{"aliases":["hurtrealbad"],"filename":"hurtrealbad","category":"custom"},{"aliases":["neckbeard"],"filename":"neckbeard","category":"custom"},{"aliases":["octocat"],"filename":"octocat","category":"custom"},{"aliases":["rage1"],"filename":"rage1","category":"custom"},{"aliases":["rage2"],"filename":"rage2","category":"custom"},{"aliases":["rage3"],"filename":"rage3","category":"custom"},{"aliases":["rage4"],"filename":"rage4","category":"custom"},{"aliases":["shipit","squirrel"],"filename":"shipit","category":"custom"},{"aliases":["suspect"],"filename":"suspect","category":"custom"},{"aliases":["trollface"],"filename":"trollface","category":"custom"},{"aliases":["mattermost"],"filename":"mattermost","category":"custom"}]; - -export const EmojiIndicesByAlias = new Map([["grinning",0],["smiley",1],["smile",2],["grin",3],["laughing",4],["satisfied",4],["sweat_smile",5],["joy",6],["rofl",7],["relaxed",8],["blush",9],["innocent",10],["slightly_smiling_face",11],["upside_down_face",12],["wink",13],["relieved",14],["heart_eyes",15],["kissing_heart",16],["kissing",17],["kissing_smiling_eyes",18],["kissing_closed_eyes",19],["yum",20],["stuck_out_tongue_winking_eye",21],["stuck_out_tongue_closed_eyes",22],["stuck_out_tongue",23],["money_mouth_face",24],["hugs",25],["nerd_face",26],["sunglasses",27],["clown_face",28],["cowboy_hat_face",29],["smirk",30],["unamused",31],["disappointed",32],["pensive",33],["worried",34],["confused",35],["slightly_frowning_face",36],["frowning_face",37],["persevere",38],["confounded",39],["tired_face",40],["weary",41],["triumph",42],["angry",43],["rage",44],["pout",44],["no_mouth",45],["neutral_face",46],["expressionless",47],["hushed",48],["frowning",49],["anguished",50],["open_mouth",51],["astonished",52],["dizzy_face",53],["flushed",54],["scream",55],["fearful",56],["cold_sweat",57],["cry",58],["disappointed_relieved",59],["drooling_face",60],["sob",61],["sweat",62],["sleepy",63],["sleeping",64],["roll_eyes",65],["thinking",66],["lying_face",67],["grimacing",68],["zipper_mouth_face",69],["nauseated_face",70],["sneezing_face",71],["mask",72],["face_with_thermometer",73],["face_with_head_bandage",74],["smiling_imp",75],["imp",76],["japanese_ogre",77],["japanese_goblin",78],["hankey",79],["poop",79],["shit",79],["ghost",80],["skull",81],["skull_and_crossbones",82],["alien",83],["space_invader",84],["robot",85],["jack_o_lantern",86],["smiley_cat",87],["smile_cat",88],["joy_cat",89],["heart_eyes_cat",90],["smirk_cat",91],["kissing_cat",92],["scream_cat",93],["crying_cat_face",94],["pouting_cat",95],["open_hands",96],["raised_hands",97],["clap",98],["pray",99],["handshake",100],["+1",101],["thumbsup",101],["-1",102],["thumbsdown",102],["fist_oncoming",103],["facepunch",103],["punch",103],["fist_raised",104],["fist",104],["fist_left",105],["fist_right",106],["crossed_fingers",107],["v",108],["metal",109],["ok_hand",110],["point_left",111],["point_right",112],["point_up_2",113],["point_down",114],["point_up",115],["hand",116],["raised_hand",116],["raised_back_of_hand",117],["raised_hand_with_fingers_splayed",118],["vulcan_salute",119],["wave",120],["call_me_hand",121],["muscle",122],["middle_finger",123],["fu",123],["writing_hand",124],["selfie",125],["nail_care",126],["ring",127],["lipstick",128],["kiss",129],["lips",130],["tongue",131],["ear",132],["nose",133],["footprints",134],["eye",135],["eyes",136],["speaking_head",137],["bust_in_silhouette",138],["busts_in_silhouette",139],["baby",140],["boy",141],["girl",142],["man",143],["woman",144],["blonde_woman",145],["blonde_man",146],["person_with_blond_hair",146],["older_man",147],["older_woman",148],["man_with_gua_pi_mao",149],["woman_with_turban",150],["man_with_turban",151],["policewoman",152],["policeman",153],["cop",153],["construction_worker_woman",154],["construction_worker_man",155],["construction_worker",155],["guardswoman",156],["guardsman",157],["female_detective",158],["male_detective",159],["detective",159],["woman_health_worker",160],["man_health_worker",161],["woman_farmer",162],["man_farmer",163],["woman_cook",164],["man_cook",165],["woman_student",166],["man_student",167],["woman_singer",168],["man_singer",169],["woman_teacher",170],["man_teacher",171],["woman_factory_worker",172],["man_factory_worker",173],["woman_technologist",174],["man_technologist",175],["woman_office_worker",176],["man_office_worker",177],["woman_mechanic",178],["man_mechanic",179],["woman_scientist",180],["man_scientist",181],["woman_artist",182],["man_artist",183],["woman_firefighter",184],["man_firefighter",185],["woman_pilot",186],["man_pilot",187],["woman_astronaut",188],["man_astronaut",189],["woman_judge",190],["man_judge",191],["mrs_claus",192],["santa",193],["princess",194],["prince",195],["bride_with_veil",196],["man_in_tuxedo",197],["angel",198],["pregnant_woman",199],["bowing_woman",200],["bowing_man",201],["bow",201],["tipping_hand_woman",202],["information_desk_person",202],["tipping_hand_man",203],["no_good_woman",204],["no_good",204],["ng_woman",204],["no_good_man",205],["ng_man",205],["ok_woman",206],["ok_man",207],["raising_hand_woman",208],["raising_hand",208],["raising_hand_man",209],["woman_facepalming",210],["man_facepalming",211],["woman_shrugging",212],["man_shrugging",213],["pouting_woman",214],["person_with_pouting_face",214],["pouting_man",215],["frowning_woman",216],["person_frowning",216],["frowning_man",217],["haircut_woman",218],["haircut",218],["haircut_man",219],["massage_woman",220],["massage",220],["massage_man",221],["business_suit_levitating",222],["dancer",223],["man_dancing",224],["dancing_women",225],["dancers",225],["dancing_men",226],["walking_woman",227],["walking_man",228],["walking",228],["running_woman",229],["running_man",230],["runner",230],["running",230],["couple",231],["two_women_holding_hands",232],["two_men_holding_hands",233],["couple_with_heart_woman_man",234],["couple_with_heart",234],["couple_with_heart_woman_woman",235],["couple_with_heart_man_man",236],["couplekiss_man_woman",237],["couplekiss_woman_woman",238],["couplekiss_man_man",239],["family_man_woman_boy",240],["family",240],["family_man_woman_girl",241],["family_man_woman_girl_boy",242],["family_man_woman_boy_boy",243],["family_man_woman_girl_girl",244],["family_woman_woman_boy",245],["family_woman_woman_girl",246],["family_woman_woman_girl_boy",247],["family_woman_woman_boy_boy",248],["family_woman_woman_girl_girl",249],["family_man_man_boy",250],["family_man_man_girl",251],["family_man_man_girl_boy",252],["family_man_man_boy_boy",253],["family_man_man_girl_girl",254],["family_woman_boy",255],["family_woman_girl",256],["family_woman_girl_boy",257],["family_woman_boy_boy",258],["family_woman_girl_girl",259],["family_man_boy",260],["family_man_girl",261],["family_man_girl_boy",262],["family_man_boy_boy",263],["family_man_girl_girl",264],["womans_clothes",265],["shirt",266],["tshirt",266],["jeans",267],["necktie",268],["dress",269],["bikini",270],["kimono",271],["high_heel",272],["sandal",273],["boot",274],["mans_shoe",275],["shoe",275],["athletic_shoe",276],["womans_hat",277],["tophat",278],["mortar_board",279],["crown",280],["rescue_worker_helmet",281],["school_satchel",282],["pouch",283],["purse",284],["handbag",285],["briefcase",286],["eyeglasses",287],["dark_sunglasses",288],["closed_umbrella",289],["open_umbrella",290],["dog",291],["cat",292],["mouse",293],["hamster",294],["rabbit",295],["fox_face",296],["bear",297],["panda_face",298],["koala",299],["tiger",300],["lion",301],["cow",302],["pig",303],["pig_nose",304],["frog",305],["monkey_face",306],["see_no_evil",307],["hear_no_evil",308],["speak_no_evil",309],["monkey",310],["chicken",311],["penguin",312],["bird",313],["baby_chick",314],["hatching_chick",315],["hatched_chick",316],["duck",317],["eagle",318],["owl",319],["bat",320],["wolf",321],["boar",322],["horse",323],["unicorn",324],["bee",325],["honeybee",325],["bug",326],["butterfly",327],["snail",328],["shell",329],["beetle",330],["ant",331],["spider",332],["spider_web",333],["turtle",334],["snake",335],["lizard",336],["scorpion",337],["crab",338],["squid",339],["octopus",340],["shrimp",341],["tropical_fish",342],["fish",343],["blowfish",344],["dolphin",345],["flipper",345],["shark",346],["whale",347],["whale2",348],["crocodile",349],["leopard",350],["tiger2",351],["water_buffalo",352],["ox",353],["cow2",354],["deer",355],["dromedary_camel",356],["camel",357],["elephant",358],["rhinoceros",359],["gorilla",360],["racehorse",361],["pig2",362],["goat",363],["ram",364],["sheep",365],["dog2",366],["poodle",367],["cat2",368],["rooster",369],["turkey",370],["dove",371],["rabbit2",372],["mouse2",373],["rat",374],["chipmunk",375],["feet",376],["paw_prints",376],["dragon",377],["dragon_face",378],["cactus",379],["christmas_tree",380],["evergreen_tree",381],["deciduous_tree",382],["palm_tree",383],["seedling",384],["herb",385],["shamrock",386],["four_leaf_clover",387],["bamboo",388],["tanabata_tree",389],["leaves",390],["fallen_leaf",391],["maple_leaf",392],["mushroom",393],["ear_of_rice",394],["bouquet",395],["tulip",396],["rose",397],["wilted_flower",398],["sunflower",399],["blossom",400],["cherry_blossom",401],["hibiscus",402],["earth_americas",403],["earth_africa",404],["earth_asia",405],["full_moon",406],["waning_gibbous_moon",407],["last_quarter_moon",408],["waning_crescent_moon",409],["new_moon",410],["waxing_crescent_moon",411],["first_quarter_moon",412],["moon",413],["waxing_gibbous_moon",413],["new_moon_with_face",414],["full_moon_with_face",415],["sun_with_face",416],["first_quarter_moon_with_face",417],["last_quarter_moon_with_face",418],["crescent_moon",419],["dizzy",420],["star",421],["star2",422],["sparkles",423],["zap",424],["fire",425],["boom",426],["collision",426],["comet",427],["sunny",428],["sun_behind_small_cloud",429],["partly_sunny",430],["sun_behind_large_cloud",431],["sun_behind_rain_cloud",432],["rainbow",433],["cloud",434],["cloud_with_rain",435],["cloud_with_lightning_and_rain",436],["cloud_with_lightning",437],["cloud_with_snow",438],["snowman_with_snow",439],["snowman",440],["snowflake",441],["wind_face",442],["dash",443],["tornado",444],["fog",445],["ocean",446],["droplet",447],["sweat_drops",448],["umbrella",449],["green_apple",450],["apple",451],["pear",452],["tangerine",453],["orange",453],["mandarin",453],["lemon",454],["banana",455],["watermelon",456],["grapes",457],["strawberry",458],["melon",459],["cherries",460],["peach",461],["pineapple",462],["kiwi_fruit",463],["avocado",464],["tomato",465],["eggplant",466],["cucumber",467],["carrot",468],["corn",469],["hot_pepper",470],["potato",471],["sweet_potato",472],["chestnut",473],["peanuts",474],["honey_pot",475],["croissant",476],["bread",477],["baguette_bread",478],["cheese",479],["egg",480],["fried_egg",481],["bacon",482],["pancakes",483],["fried_shrimp",484],["poultry_leg",485],["meat_on_bone",486],["pizza",487],["hotdog",488],["hamburger",489],["fries",490],["stuffed_flatbread",491],["taco",492],["burrito",493],["green_salad",494],["shallow_pan_of_food",495],["spaghetti",496],["ramen",497],["stew",498],["fish_cake",499],["sushi",500],["bento",501],["curry",502],["rice",503],["rice_ball",504],["rice_cracker",505],["oden",506],["dango",507],["shaved_ice",508],["ice_cream",509],["icecream",510],["cake",511],["birthday",512],["custard",513],["lollipop",514],["candy",515],["chocolate_bar",516],["popcorn",517],["doughnut",518],["cookie",519],["milk_glass",520],["baby_bottle",521],["coffee",522],["tea",523],["sake",524],["beer",525],["beers",526],["clinking_glasses",527],["wine_glass",528],["tumbler_glass",529],["cocktail",530],["tropical_drink",531],["champagne",532],["spoon",533],["fork_and_knife",534],["plate_with_cutlery",535],["soccer",536],["basketball",537],["football",538],["baseball",539],["tennis",540],["volleyball",541],["rugby_football",542],["8ball",543],["ping_pong",544],["badminton",545],["goal_net",546],["ice_hockey",547],["field_hockey",548],["cricket",549],["golf",550],["bow_and_arrow",551],["fishing_pole_and_fish",552],["boxing_glove",553],["martial_arts_uniform",554],["ice_skate",555],["ski",556],["skier",557],["snowboarder",558],["weight_lifting_woman",559],["weight_lifting_man",560],["person_fencing",561],["women_wrestling",562],["men_wrestling",563],["woman_cartwheeling",564],["man_cartwheeling",565],["basketball_woman",566],["basketball_man",567],["woman_playing_handball",568],["man_playing_handball",569],["golfing_woman",570],["golfing_man",571],["surfing_woman",572],["surfing_man",573],["surfer",573],["swimming_woman",574],["swimming_man",575],["swimmer",575],["woman_playing_water_polo",576],["man_playing_water_polo",577],["rowing_woman",578],["rowing_man",579],["rowboat",579],["horse_racing",580],["biking_woman",581],["biking_man",582],["bicyclist",582],["mountain_biking_woman",583],["mountain_biking_man",584],["mountain_bicyclist",584],["running_shirt_with_sash",585],["medal_sports",586],["medal_military",587],["1st_place_medal",588],["2nd_place_medal",589],["3rd_place_medal",590],["trophy",591],["rosette",592],["reminder_ribbon",593],["ticket",594],["tickets",595],["circus_tent",596],["woman_juggling",597],["man_juggling",598],["performing_arts",599],["art",600],["clapper",601],["microphone",602],["headphones",603],["musical_score",604],["musical_keyboard",605],["drum",606],["saxophone",607],["trumpet",608],["guitar",609],["violin",610],["game_die",611],["dart",612],["bowling",613],["video_game",614],["slot_machine",615],["car",616],["red_car",616],["taxi",617],["blue_car",618],["bus",619],["trolleybus",620],["racing_car",621],["police_car",622],["ambulance",623],["fire_engine",624],["minibus",625],["truck",626],["articulated_lorry",627],["tractor",628],["kick_scooter",629],["bike",630],["motor_scooter",631],["motorcycle",632],["rotating_light",633],["oncoming_police_car",634],["oncoming_bus",635],["oncoming_automobile",636],["oncoming_taxi",637],["aerial_tramway",638],["mountain_cableway",639],["suspension_railway",640],["railway_car",641],["train",642],["mountain_railway",643],["monorail",644],["bullettrain_side",645],["bullettrain_front",646],["light_rail",647],["steam_locomotive",648],["train2",649],["metro",650],["tram",651],["station",652],["helicopter",653],["small_airplane",654],["airplane",655],["flight_departure",656],["flight_arrival",657],["rocket",658],["artificial_satellite",659],["seat",660],["canoe",661],["boat",662],["sailboat",662],["motor_boat",663],["speedboat",664],["passenger_ship",665],["ferry",666],["ship",667],["anchor",668],["construction",669],["fuelpump",670],["busstop",671],["vertical_traffic_light",672],["traffic_light",673],["world_map",674],["moyai",675],["statue_of_liberty",676],["fountain",677],["tokyo_tower",678],["european_castle",679],["japanese_castle",680],["stadium",681],["ferris_wheel",682],["roller_coaster",683],["carousel_horse",684],["parasol_on_ground",685],["beach_umbrella",686],["desert_island",687],["mountain",688],["mountain_snow",689],["mount_fuji",690],["volcano",691],["desert",692],["camping",693],["tent",694],["railway_track",695],["motorway",696],["building_construction",697],["factory",698],["house",699],["house_with_garden",700],["houses",701],["derelict_house",702],["office",703],["department_store",704],["post_office",705],["european_post_office",706],["hospital",707],["bank",708],["hotel",709],["convenience_store",710],["school",711],["love_hotel",712],["wedding",713],["classical_building",714],["church",715],["mosque",716],["synagogue",717],["kaaba",718],["shinto_shrine",719],["japan",720],["rice_scene",721],["national_park",722],["sunrise",723],["sunrise_over_mountains",724],["stars",725],["sparkler",726],["fireworks",727],["city_sunrise",728],["city_sunset",729],["cityscape",730],["night_with_stars",731],["milky_way",732],["bridge_at_night",733],["foggy",734],["watch",735],["iphone",736],["calling",737],["computer",738],["keyboard",739],["desktop_computer",740],["printer",741],["computer_mouse",742],["trackball",743],["joystick",744],["clamp",745],["minidisc",746],["floppy_disk",747],["cd",748],["dvd",749],["vhs",750],["camera",751],["camera_flash",752],["video_camera",753],["movie_camera",754],["film_projector",755],["film_strip",756],["telephone_receiver",757],["phone",758],["telephone",758],["pager",759],["fax",760],["tv",761],["radio",762],["studio_microphone",763],["level_slider",764],["control_knobs",765],["stopwatch",766],["timer_clock",767],["alarm_clock",768],["mantelpiece_clock",769],["hourglass",770],["hourglass_flowing_sand",771],["satellite",772],["battery",773],["electric_plug",774],["bulb",775],["flashlight",776],["candle",777],["wastebasket",778],["oil_drum",779],["money_with_wings",780],["dollar",781],["yen",782],["euro",783],["pound",784],["moneybag",785],["credit_card",786],["gem",787],["balance_scale",788],["wrench",789],["hammer",790],["hammer_and_pick",791],["hammer_and_wrench",792],["pick",793],["nut_and_bolt",794],["gear",795],["chains",796],["gun",797],["bomb",798],["hocho",799],["knife",799],["dagger",800],["crossed_swords",801],["shield",802],["smoking",803],["coffin",804],["funeral_urn",805],["amphora",806],["crystal_ball",807],["prayer_beads",808],["barber",809],["alembic",810],["telescope",811],["microscope",812],["hole",813],["pill",814],["syringe",815],["thermometer",816],["toilet",817],["potable_water",818],["shower",819],["bathtub",820],["bath",821],["bellhop_bell",822],["key",823],["old_key",824],["door",825],["couch_and_lamp",826],["bed",827],["sleeping_bed",828],["framed_picture",829],["shopping",830],["shopping_cart",831],["gift",832],["balloon",833],["flags",834],["ribbon",835],["confetti_ball",836],["tada",837],["dolls",838],["izakaya_lantern",839],["lantern",839],["wind_chime",840],["email",841],["envelope",841],["envelope_with_arrow",842],["incoming_envelope",843],["e-mail",844],["love_letter",845],["inbox_tray",846],["outbox_tray",847],["package",848],["label",849],["mailbox_closed",850],["mailbox",851],["mailbox_with_mail",852],["mailbox_with_no_mail",853],["postbox",854],["postal_horn",855],["scroll",856],["page_with_curl",857],["page_facing_up",858],["bookmark_tabs",859],["bar_chart",860],["chart_with_upwards_trend",861],["chart_with_downwards_trend",862],["spiral_notepad",863],["spiral_calendar",864],["calendar",865],["date",866],["card_index",867],["card_file_box",868],["ballot_box",869],["file_cabinet",870],["clipboard",871],["file_folder",872],["open_file_folder",873],["card_index_dividers",874],["newspaper_roll",875],["newspaper",876],["notebook",877],["notebook_with_decorative_cover",878],["ledger",879],["closed_book",880],["green_book",881],["blue_book",882],["orange_book",883],["books",884],["book",885],["open_book",885],["bookmark",886],["link",887],["paperclip",888],["paperclips",889],["triangular_ruler",890],["straight_ruler",891],["pushpin",892],["round_pushpin",893],["scissors",894],["pen",895],["fountain_pen",896],["black_nib",897],["paintbrush",898],["crayon",899],["memo",900],["pencil",900],["pencil2",901],["mag",902],["mag_right",903],["lock_with_ink_pen",904],["closed_lock_with_key",905],["lock",906],["unlock",907],["heart",908],["yellow_heart",909],["green_heart",910],["blue_heart",911],["purple_heart",912],["black_heart",913],["broken_heart",914],["heavy_heart_exclamation",915],["two_hearts",916],["revolving_hearts",917],["heartbeat",918],["heartpulse",919],["sparkling_heart",920],["cupid",921],["gift_heart",922],["heart_decoration",923],["peace_symbol",924],["latin_cross",925],["star_and_crescent",926],["om",927],["wheel_of_dharma",928],["star_of_david",929],["six_pointed_star",930],["menorah",931],["yin_yang",932],["orthodox_cross",933],["place_of_worship",934],["ophiuchus",935],["aries",936],["taurus",937],["gemini",938],["cancer",939],["leo",940],["virgo",941],["libra",942],["scorpius",943],["sagittarius",944],["capricorn",945],["aquarius",946],["pisces",947],["id",948],["atom_symbol",949],["accept",950],["radioactive",951],["biohazard",952],["mobile_phone_off",953],["vibration_mode",954],["u6709",955],["u7121",956],["u7533",957],["u55b6",958],["u6708",959],["eight_pointed_black_star",960],["vs",961],["white_flower",962],["ideograph_advantage",963],["secret",964],["congratulations",965],["u5408",966],["u6e80",967],["u5272",968],["u7981",969],["a",970],["b",971],["ab",972],["cl",973],["o2",974],["sos",975],["x",976],["o",977],["stop_sign",978],["no_entry",979],["name_badge",980],["no_entry_sign",981],["100",982],["anger",983],["hotsprings",984],["no_pedestrians",985],["do_not_litter",986],["no_bicycles",987],["non-potable_water",988],["underage",989],["no_mobile_phones",990],["no_smoking",991],["exclamation",992],["heavy_exclamation_mark",992],["grey_exclamation",993],["question",994],["grey_question",995],["bangbang",996],["interrobang",997],["low_brightness",998],["high_brightness",999],["part_alternation_mark",1000],["warning",1001],["children_crossing",1002],["trident",1003],["fleur_de_lis",1004],["beginner",1005],["recycle",1006],["white_check_mark",1007],["u6307",1008],["chart",1009],["sparkle",1010],["eight_spoked_asterisk",1011],["negative_squared_cross_mark",1012],["globe_with_meridians",1013],["diamond_shape_with_a_dot_inside",1014],["m",1015],["cyclone",1016],["zzz",1017],["atm",1018],["wc",1019],["wheelchair",1020],["parking",1021],["u7a7a",1022],["sa",1023],["passport_control",1024],["customs",1025],["baggage_claim",1026],["left_luggage",1027],["mens",1028],["womens",1029],["baby_symbol",1030],["restroom",1031],["put_litter_in_its_place",1032],["cinema",1033],["signal_strength",1034],["koko",1035],["symbols",1036],["information_source",1037],["abc",1038],["abcd",1039],["capital_abcd",1040],["ng",1041],["ok",1042],["up",1043],["cool",1044],["new",1045],["free",1046],["zero",1047],["one",1048],["two",1049],["three",1050],["four",1051],["five",1052],["six",1053],["seven",1054],["eight",1055],["nine",1056],["keycap_ten",1057],["1234",1058],["hash",1059],["asterisk",1060],["arrow_forward",1061],["pause_button",1062],["play_or_pause_button",1063],["stop_button",1064],["record_button",1065],["next_track_button",1066],["previous_track_button",1067],["fast_forward",1068],["rewind",1069],["arrow_double_up",1070],["arrow_double_down",1071],["arrow_backward",1072],["arrow_up_small",1073],["arrow_down_small",1074],["arrow_right",1075],["arrow_left",1076],["arrow_up",1077],["arrow_down",1078],["arrow_upper_right",1079],["arrow_lower_right",1080],["arrow_lower_left",1081],["arrow_upper_left",1082],["arrow_up_down",1083],["left_right_arrow",1084],["arrow_right_hook",1085],["leftwards_arrow_with_hook",1086],["arrow_heading_up",1087],["arrow_heading_down",1088],["twisted_rightwards_arrows",1089],["repeat",1090],["repeat_one",1091],["arrows_counterclockwise",1092],["arrows_clockwise",1093],["musical_note",1094],["notes",1095],["heavy_plus_sign",1096],["heavy_minus_sign",1097],["heavy_division_sign",1098],["heavy_multiplication_x",1099],["heavy_dollar_sign",1100],["currency_exchange",1101],["tm",1102],["copyright",1103],["registered",1104],["wavy_dash",1105],["curly_loop",1106],["loop",1107],["end",1108],["back",1109],["on",1110],["top",1111],["soon",1112],["heavy_check_mark",1113],["ballot_box_with_check",1114],["radio_button",1115],["white_circle",1116],["black_circle",1117],["red_circle",1118],["large_blue_circle",1119],["small_red_triangle",1120],["small_red_triangle_down",1121],["small_orange_diamond",1122],["small_blue_diamond",1123],["large_orange_diamond",1124],["large_blue_diamond",1125],["white_square_button",1126],["black_square_button",1127],["black_small_square",1128],["white_small_square",1129],["black_medium_small_square",1130],["white_medium_small_square",1131],["black_medium_square",1132],["white_medium_square",1133],["black_large_square",1134],["white_large_square",1135],["speaker",1136],["mute",1137],["sound",1138],["loud_sound",1139],["bell",1140],["no_bell",1141],["mega",1142],["loudspeaker",1143],["eye_speech_bubble",1144],["speech_balloon",1145],["thought_balloon",1146],["right_anger_bubble",1147],["spades",1148],["clubs",1149],["hearts",1150],["diamonds",1151],["black_joker",1152],["flower_playing_cards",1153],["mahjong",1154],["clock1",1155],["clock2",1156],["clock3",1157],["clock4",1158],["clock5",1159],["clock6",1160],["clock7",1161],["clock8",1162],["clock9",1163],["clock10",1164],["clock11",1165],["clock12",1166],["clock130",1167],["clock230",1168],["clock330",1169],["clock430",1170],["clock530",1171],["clock630",1172],["clock730",1173],["clock830",1174],["clock930",1175],["clock1030",1176],["clock1130",1177],["clock1230",1178],["white_flag",1179],["black_flag",1180],["checkered_flag",1181],["triangular_flag_on_post",1182],["rainbow_flag",1183],["afghanistan",1184],["aland_islands",1185],["albania",1186],["algeria",1187],["american_samoa",1188],["andorra",1189],["angola",1190],["anguilla",1191],["antarctica",1192],["antigua_barbuda",1193],["argentina",1194],["armenia",1195],["aruba",1196],["australia",1197],["austria",1198],["azerbaijan",1199],["bahamas",1200],["bahrain",1201],["bangladesh",1202],["barbados",1203],["belarus",1204],["belgium",1205],["belize",1206],["benin",1207],["bermuda",1208],["bhutan",1209],["bolivia",1210],["caribbean_netherlands",1211],["bosnia_herzegovina",1212],["botswana",1213],["brazil",1214],["british_indian_ocean_territory",1215],["british_virgin_islands",1216],["brunei",1217],["bulgaria",1218],["burkina_faso",1219],["burundi",1220],["cape_verde",1221],["cambodia",1222],["cameroon",1223],["canada",1224],["ca",1224],["canary_islands",1225],["cayman_islands",1226],["central_african_republic",1227],["chad",1228],["chile",1229],["cn",1230],["christmas_island",1231],["cocos_islands",1232],["colombia",1233],["comoros",1234],["congo_brazzaville",1235],["congo_kinshasa",1236],["cook_islands",1237],["costa_rica",1238],["cote_divoire",1239],["croatia",1240],["cuba",1241],["curacao",1242],["cyprus",1243],["czech_republic",1244],["denmark",1245],["djibouti",1246],["dominica",1247],["dominican_republic",1248],["ecuador",1249],["egypt",1250],["el_salvador",1251],["equatorial_guinea",1252],["eritrea",1253],["estonia",1254],["ethiopia",1255],["eu",1256],["european_union",1256],["falkland_islands",1257],["faroe_islands",1258],["fiji",1259],["finland",1260],["fr",1261],["french_guiana",1262],["french_polynesia",1263],["french_southern_territories",1264],["gabon",1265],["gambia",1266],["georgia",1267],["de",1268],["ghana",1269],["gibraltar",1270],["greece",1271],["greenland",1272],["grenada",1273],["guadeloupe",1274],["guam",1275],["guatemala",1276],["guernsey",1277],["guinea",1278],["guinea_bissau",1279],["guyana",1280],["haiti",1281],["honduras",1282],["hong_kong",1283],["hungary",1284],["iceland",1285],["india",1286],["indonesia",1287],["iran",1288],["iraq",1289],["ireland",1290],["isle_of_man",1291],["israel",1292],["it",1293],["jamaica",1294],["jp",1295],["crossed_flags",1296],["jersey",1297],["jordan",1298],["kazakhstan",1299],["kenya",1300],["kiribati",1301],["kosovo",1302],["kuwait",1303],["kyrgyzstan",1304],["laos",1305],["latvia",1306],["lebanon",1307],["lesotho",1308],["liberia",1309],["libya",1310],["liechtenstein",1311],["lithuania",1312],["luxembourg",1313],["macau",1314],["macedonia",1315],["madagascar",1316],["malawi",1317],["malaysia",1318],["maldives",1319],["mali",1320],["malta",1321],["marshall_islands",1322],["martinique",1323],["mauritania",1324],["mauritius",1325],["mayotte",1326],["mexico",1327],["micronesia",1328],["moldova",1329],["monaco",1330],["mongolia",1331],["montenegro",1332],["montserrat",1333],["morocco",1334],["mozambique",1335],["myanmar",1336],["namibia",1337],["nauru",1338],["nepal",1339],["netherlands",1340],["new_caledonia",1341],["new_zealand",1342],["nicaragua",1343],["niger",1344],["nigeria",1345],["niue",1346],["norfolk_island",1347],["northern_mariana_islands",1348],["north_korea",1349],["norway",1350],["oman",1351],["pakistan",1352],["pk",1352],["palau",1353],["palestinian_territories",1354],["panama",1355],["papua_new_guinea",1356],["paraguay",1357],["peru",1358],["philippines",1359],["pitcairn_islands",1360],["poland",1361],["portugal",1362],["puerto_rico",1363],["qatar",1364],["reunion",1365],["romania",1366],["ru",1367],["rwanda",1368],["st_barthelemy",1369],["st_helena",1370],["st_kitts_nevis",1371],["st_lucia",1372],["st_pierre_miquelon",1373],["st_vincent_grenadines",1374],["samoa",1375],["san_marino",1376],["sao_tome_principe",1377],["saudi_arabia",1378],["senegal",1379],["serbia",1380],["seychelles",1381],["sierra_leone",1382],["singapore",1383],["sint_maarten",1384],["slovakia",1385],["slovenia",1386],["solomon_islands",1387],["somalia",1388],["south_africa",1389],["za",1389],["south_georgia_south_sandwich_islands",1390],["kr",1391],["south_sudan",1392],["es",1393],["sri_lanka",1394],["sudan",1395],["suriname",1396],["swaziland",1397],["sweden",1398],["switzerland",1399],["syria",1400],["taiwan",1401],["tajikistan",1402],["tanzania",1403],["thailand",1404],["timor_leste",1405],["togo",1406],["tokelau",1407],["tonga",1408],["trinidad_tobago",1409],["tunisia",1410],["tr",1411],["turkmenistan",1412],["turks_caicos_islands",1413],["tuvalu",1414],["uganda",1415],["ukraine",1416],["united_arab_emirates",1417],["gb",1418],["uk",1418],["us",1419],["us_virgin_islands",1420],["uruguay",1421],["uzbekistan",1422],["vanuatu",1423],["vatican_city",1424],["venezuela",1425],["vietnam",1426],["wallis_futuna",1427],["western_sahara",1428],["yemen",1429],["zambia",1430],["zimbabwe",1431],["bowtie",1432],["feelsgood",1433],["finnadie",1434],["goberserk",1435],["godmode",1436],["hurtrealbad",1437],["neckbeard",1438],["octocat",1439],["rage1",1440],["rage2",1441],["rage3",1442],["rage4",1443],["shipit",1444],["squirrel",1444],["suspect",1445],["trollface",1446],["mattermost",1447]]); - -export const EmojiIndicesByUnicode = new Map([["1f600",0],["1f600-fe0f",0],["1f603",1],["1f603-fe0f",1],["1f604",2],["1f604-fe0f",2],["1f601",3],["1f601-fe0f",3],["1f606",4],["1f606-fe0f",4],["1f605",5],["1f605-fe0f",5],["1f602",6],["1f602-fe0f",6],["1f923",7],["1f923-fe0f",7],["263a-fe0f",8],["1f60a",9],["1f60a-fe0f",9],["1f607",10],["1f607-fe0f",10],["1f642",11],["1f642-fe0f",11],["1f643",12],["1f643-fe0f",12],["1f609",13],["1f609-fe0f",13],["1f60c",14],["1f60c-fe0f",14],["1f60d",15],["1f60d-fe0f",15],["1f618",16],["1f618-fe0f",16],["1f617",17],["1f617-fe0f",17],["1f619",18],["1f619-fe0f",18],["1f61a",19],["1f61a-fe0f",19],["1f60b",20],["1f60b-fe0f",20],["1f61c",21],["1f61c-fe0f",21],["1f61d",22],["1f61d-fe0f",22],["1f61b",23],["1f61b-fe0f",23],["1f911",24],["1f911-fe0f",24],["1f917",25],["1f917-fe0f",25],["1f913",26],["1f913-fe0f",26],["1f60e",27],["1f60e-fe0f",27],["1f921",28],["1f921-fe0f",28],["1f920",29],["1f920-fe0f",29],["1f60f",30],["1f60f-fe0f",30],["1f612",31],["1f612-fe0f",31],["1f61e",32],["1f61e-fe0f",32],["1f614",33],["1f614-fe0f",33],["1f61f",34],["1f61f-fe0f",34],["1f615",35],["1f615-fe0f",35],["1f641",36],["1f641-fe0f",36],["2639-fe0f",37],["1f623",38],["1f623-fe0f",38],["1f616",39],["1f616-fe0f",39],["1f62b",40],["1f62b-fe0f",40],["1f629",41],["1f629-fe0f",41],["1f624",42],["1f624-fe0f",42],["1f620",43],["1f620-fe0f",43],["1f621",44],["1f621-fe0f",44],["1f636",45],["1f636-fe0f",45],["1f610",46],["1f610-fe0f",46],["1f611",47],["1f611-fe0f",47],["1f62f",48],["1f62f-fe0f",48],["1f626",49],["1f626-fe0f",49],["1f627",50],["1f627-fe0f",50],["1f62e",51],["1f62e-fe0f",51],["1f632",52],["1f632-fe0f",52],["1f635",53],["1f635-fe0f",53],["1f633",54],["1f633-fe0f",54],["1f631",55],["1f631-fe0f",55],["1f628",56],["1f628-fe0f",56],["1f630",57],["1f630-fe0f",57],["1f622",58],["1f622-fe0f",58],["1f625",59],["1f625-fe0f",59],["1f924",60],["1f924-fe0f",60],["1f62d",61],["1f62d-fe0f",61],["1f613",62],["1f613-fe0f",62],["1f62a",63],["1f62a-fe0f",63],["1f634",64],["1f634-fe0f",64],["1f644",65],["1f644-fe0f",65],["1f914",66],["1f914-fe0f",66],["1f925",67],["1f925-fe0f",67],["1f62c",68],["1f62c-fe0f",68],["1f910",69],["1f910-fe0f",69],["1f922",70],["1f922-fe0f",70],["1f927",71],["1f927-fe0f",71],["1f637",72],["1f637-fe0f",72],["1f912",73],["1f912-fe0f",73],["1f915",74],["1f915-fe0f",74],["1f608",75],["1f608-fe0f",75],["1f47f",76],["1f47f-fe0f",76],["1f479",77],["1f479-fe0f",77],["1f47a",78],["1f47a-fe0f",78],["1f4a9",79],["1f4a9-fe0f",79],["1f47b",80],["1f47b-fe0f",80],["1f480",81],["1f480-fe0f",81],["2620-fe0f",82],["1f47d",83],["1f47d-fe0f",83],["1f47e",84],["1f47e-fe0f",84],["1f916",85],["1f916-fe0f",85],["1f383",86],["1f383-fe0f",86],["1f63a",87],["1f63a-fe0f",87],["1f638",88],["1f638-fe0f",88],["1f639",89],["1f639-fe0f",89],["1f63b",90],["1f63b-fe0f",90],["1f63c",91],["1f63c-fe0f",91],["1f63d",92],["1f63d-fe0f",92],["1f640",93],["1f640-fe0f",93],["1f63f",94],["1f63f-fe0f",94],["1f63e",95],["1f63e-fe0f",95],["1f450",96],["1f450-fe0f",96],["1f64c",97],["1f64c-fe0f",97],["1f44f",98],["1f44f-fe0f",98],["1f64f",99],["1f64f-fe0f",99],["1f91d",100],["1f91d-fe0f",100],["1f44d",101],["1f44d-fe0f",101],["1f44e",102],["1f44e-fe0f",102],["1f44a",103],["1f44a-fe0f",103],["270a",104],["270a-fe0f",104],["1f91b",105],["1f91b-fe0f",105],["1f91c",106],["1f91c-fe0f",106],["1f91e",107],["1f91e-fe0f",107],["270c-fe0f",108],["1f918",109],["1f918-fe0f",109],["1f44c",110],["1f44c-fe0f",110],["1f448",111],["1f448-fe0f",111],["1f449",112],["1f449-fe0f",112],["1f446",113],["1f446-fe0f",113],["1f447",114],["1f447-fe0f",114],["261d-fe0f",115],["270b",116],["270b-fe0f",116],["1f91a",117],["1f91a-fe0f",117],["1f590",118],["1f590-fe0f",118],["1f596",119],["1f596-fe0f",119],["1f44b",120],["1f44b-fe0f",120],["1f919",121],["1f919-fe0f",121],["1f4aa",122],["1f4aa-fe0f",122],["1f595",123],["1f595-fe0f",123],["270d-fe0f",124],["1f933",125],["1f933-fe0f",125],["1f485",126],["1f485-fe0f",126],["1f48d",127],["1f48d-fe0f",127],["1f484",128],["1f484-fe0f",128],["1f48b",129],["1f48b-fe0f",129],["1f444",130],["1f444-fe0f",130],["1f445",131],["1f445-fe0f",131],["1f442",132],["1f442-fe0f",132],["1f443",133],["1f443-fe0f",133],["1f463",134],["1f463-fe0f",134],["1f441",135],["1f441-fe0f",135],["1f440",136],["1f440-fe0f",136],["1f5e3",137],["1f5e3-fe0f",137],["1f464",138],["1f464-fe0f",138],["1f465",139],["1f465-fe0f",139],["1f476",140],["1f476-fe0f",140],["1f466",141],["1f466-fe0f",141],["1f467",142],["1f467-fe0f",142],["1f468",143],["1f468-fe0f",143],["1f469",144],["1f469-fe0f",144],["1f471-200d-2640-fe0f",145],["1f471",146],["1f471-fe0f",146],["1f471-200d-2642-fe0f",146],["1f474",147],["1f474-fe0f",147],["1f475",148],["1f475-fe0f",148],["1f472",149],["1f472-fe0f",149],["1f473-200d-2640-fe0f",150],["1f473",151],["1f473-fe0f",151],["1f473-200d-2642-fe0f",151],["1f46e-200d-2640-fe0f",152],["1f46e",153],["1f46e-fe0f",153],["1f46e-200d-2642-fe0f",153],["1f477-200d-2640-fe0f",154],["1f477",155],["1f477-fe0f",155],["1f477-200d-2642-fe0f",155],["1f482-200d-2640-fe0f",156],["1f482",157],["1f482-fe0f",157],["1f482-200d-2642-fe0f",157],["1f575-fe0f-200d-2640-fe0f",158],["1f575-200d-2640-fe0f-fe0f",158],["1f575-fe0f",159],["1f575-fe0f-200d-2642-fe0f",159],["1f469-200d-2695-fe0f",160],["1f468-200d-2695-fe0f",161],["1f469-200d-1f33e",162],["1f469-200d-1f33e-fe0f",162],["1f468-200d-1f33e",163],["1f468-200d-1f33e-fe0f",163],["1f469-200d-1f373",164],["1f469-200d-1f373-fe0f",164],["1f468-200d-1f373",165],["1f468-200d-1f373-fe0f",165],["1f469-200d-1f393",166],["1f469-200d-1f393-fe0f",166],["1f468-200d-1f393",167],["1f468-200d-1f393-fe0f",167],["1f469-200d-1f3a4",168],["1f469-200d-1f3a4-fe0f",168],["1f468-200d-1f3a4",169],["1f468-200d-1f3a4-fe0f",169],["1f469-200d-1f3eb",170],["1f469-200d-1f3eb-fe0f",170],["1f468-200d-1f3eb",171],["1f468-200d-1f3eb-fe0f",171],["1f469-200d-1f3ed",172],["1f469-200d-1f3ed-fe0f",172],["1f468-200d-1f3ed",173],["1f468-200d-1f3ed-fe0f",173],["1f469-200d-1f4bb",174],["1f469-200d-1f4bb-fe0f",174],["1f468-200d-1f4bb",175],["1f468-200d-1f4bb-fe0f",175],["1f469-200d-1f4bc",176],["1f469-200d-1f4bc-fe0f",176],["1f468-200d-1f4bc",177],["1f468-200d-1f4bc-fe0f",177],["1f469-200d-1f527",178],["1f469-200d-1f527-fe0f",178],["1f468-200d-1f527",179],["1f468-200d-1f527-fe0f",179],["1f469-200d-1f52c",180],["1f469-200d-1f52c-fe0f",180],["1f468-200d-1f52c",181],["1f468-200d-1f52c-fe0f",181],["1f469-200d-1f3a8",182],["1f469-200d-1f3a8-fe0f",182],["1f468-200d-1f3a8",183],["1f468-200d-1f3a8-fe0f",183],["1f469-200d-1f692",184],["1f469-200d-1f692-fe0f",184],["1f468-200d-1f692",185],["1f468-200d-1f692-fe0f",185],["1f469-200d-2708-fe0f",186],["1f468-200d-2708-fe0f",187],["1f469-200d-1f680",188],["1f469-200d-1f680-fe0f",188],["1f468-200d-1f680",189],["1f468-200d-1f680-fe0f",189],["1f469-200d-2696-fe0f",190],["1f468-200d-2696-fe0f",191],["1f936",192],["1f936-fe0f",192],["1f385",193],["1f385-fe0f",193],["1f478",194],["1f478-fe0f",194],["1f934",195],["1f934-fe0f",195],["1f470",196],["1f470-fe0f",196],["1f935",197],["1f935-fe0f",197],["1f47c",198],["1f47c-fe0f",198],["1f930",199],["1f930-fe0f",199],["1f647-200d-2640-fe0f",200],["1f647",201],["1f647-fe0f",201],["1f647-200d-2642-fe0f",201],["1f481",202],["1f481-fe0f",202],["1f481-200d-2640-fe0f",202],["1f481-200d-2642-fe0f",203],["1f645",204],["1f645-fe0f",204],["1f645-200d-2640-fe0f",204],["1f645-200d-2642-fe0f",205],["1f646",206],["1f646-fe0f",206],["1f646-200d-2640-fe0f",206],["1f646-200d-2642-fe0f",207],["1f64b",208],["1f64b-fe0f",208],["1f64b-200d-2640-fe0f",208],["1f64b-200d-2642-fe0f",209],["1f926-200d-2640-fe0f",210],["1f926-200d-2642-fe0f",211],["1f937-200d-2640-fe0f",212],["1f937-200d-2642-fe0f",213],["1f64e",214],["1f64e-fe0f",214],["1f64e-200d-2640-fe0f",214],["1f64e-200d-2642-fe0f",215],["1f64d",216],["1f64d-fe0f",216],["1f64d-200d-2640-fe0f",216],["1f64d-200d-2642-fe0f",217],["1f487",218],["1f487-fe0f",218],["1f487-200d-2640-fe0f",218],["1f487-200d-2642-fe0f",219],["1f486",220],["1f486-fe0f",220],["1f486-200d-2640-fe0f",220],["1f486-200d-2642-fe0f",221],["1f574",222],["1f574-fe0f",222],["1f483",223],["1f483-fe0f",223],["1f57a",224],["1f57a-fe0f",224],["1f46f",225],["1f46f-fe0f",225],["1f46f-200d-2640-fe0f",225],["1f46f-200d-2642-fe0f",226],["1f6b6-200d-2640-fe0f",227],["1f6b6",228],["1f6b6-fe0f",228],["1f6b6-200d-2642-fe0f",228],["1f3c3-200d-2640-fe0f",229],["1f3c3",230],["1f3c3-fe0f",230],["1f3c3-200d-2642-fe0f",230],["1f46b",231],["1f46b-fe0f",231],["1f46d",232],["1f46d-fe0f",232],["1f46c",233],["1f46c-fe0f",233],["1f491",234],["1f491-fe0f",234],["1f469-200d-2764-fe0f-200d-1f469",235],["1f469-200d-2764-200d-1f469-fe0f",235],["1f468-200d-2764-fe0f-200d-1f468",236],["1f468-200d-2764-200d-1f468-fe0f",236],["1f48f",237],["1f48f-fe0f",237],["1f469-200d-2764-fe0f-200d-1f48b-200d-1f469",238],["1f469-200d-2764-200d-1f48b-200d-1f469-fe0f",238],["1f468-200d-2764-fe0f-200d-1f48b-200d-1f468",239],["1f468-200d-2764-200d-1f48b-200d-1f468-fe0f",239],["1f46a",240],["1f46a-fe0f",240],["1f468-200d-1f469-200d-1f467",241],["1f468-200d-1f469-200d-1f467-fe0f",241],["1f468-200d-1f469-200d-1f467-200d-1f466",242],["1f468-200d-1f469-200d-1f467-200d-1f466-fe0f",242],["1f468-200d-1f469-200d-1f466-200d-1f466",243],["1f468-200d-1f469-200d-1f466-200d-1f466-fe0f",243],["1f468-200d-1f469-200d-1f467-200d-1f467",244],["1f468-200d-1f469-200d-1f467-200d-1f467-fe0f",244],["1f469-200d-1f469-200d-1f466",245],["1f469-200d-1f469-200d-1f466-fe0f",245],["1f469-200d-1f469-200d-1f467",246],["1f469-200d-1f469-200d-1f467-fe0f",246],["1f469-200d-1f469-200d-1f467-200d-1f466",247],["1f469-200d-1f469-200d-1f467-200d-1f466-fe0f",247],["1f469-200d-1f469-200d-1f466-200d-1f466",248],["1f469-200d-1f469-200d-1f466-200d-1f466-fe0f",248],["1f469-200d-1f469-200d-1f467-200d-1f467",249],["1f469-200d-1f469-200d-1f467-200d-1f467-fe0f",249],["1f468-200d-1f468-200d-1f466",250],["1f468-200d-1f468-200d-1f466-fe0f",250],["1f468-200d-1f468-200d-1f467",251],["1f468-200d-1f468-200d-1f467-fe0f",251],["1f468-200d-1f468-200d-1f467-200d-1f466",252],["1f468-200d-1f468-200d-1f467-200d-1f466-fe0f",252],["1f468-200d-1f468-200d-1f466-200d-1f466",253],["1f468-200d-1f468-200d-1f466-200d-1f466-fe0f",253],["1f468-200d-1f468-200d-1f467-200d-1f467",254],["1f468-200d-1f468-200d-1f467-200d-1f467-fe0f",254],["1f469-200d-1f466",255],["1f469-200d-1f466-fe0f",255],["1f469-200d-1f467",256],["1f469-200d-1f467-fe0f",256],["1f469-200d-1f467-200d-1f466",257],["1f469-200d-1f467-200d-1f466-fe0f",257],["1f469-200d-1f466-200d-1f466",258],["1f469-200d-1f466-200d-1f466-fe0f",258],["1f469-200d-1f467-200d-1f467",259],["1f469-200d-1f467-200d-1f467-fe0f",259],["1f468-200d-1f466",260],["1f468-200d-1f466-fe0f",260],["1f468-200d-1f467",261],["1f468-200d-1f467-fe0f",261],["1f468-200d-1f467-200d-1f466",262],["1f468-200d-1f467-200d-1f466-fe0f",262],["1f468-200d-1f466-200d-1f466",263],["1f468-200d-1f466-200d-1f466-fe0f",263],["1f468-200d-1f467-200d-1f467",264],["1f468-200d-1f467-200d-1f467-fe0f",264],["1f45a",265],["1f45a-fe0f",265],["1f455",266],["1f455-fe0f",266],["1f456",267],["1f456-fe0f",267],["1f454",268],["1f454-fe0f",268],["1f457",269],["1f457-fe0f",269],["1f459",270],["1f459-fe0f",270],["1f458",271],["1f458-fe0f",271],["1f460",272],["1f460-fe0f",272],["1f461",273],["1f461-fe0f",273],["1f462",274],["1f462-fe0f",274],["1f45e",275],["1f45e-fe0f",275],["1f45f",276],["1f45f-fe0f",276],["1f452",277],["1f452-fe0f",277],["1f3a9",278],["1f3a9-fe0f",278],["1f393",279],["1f393-fe0f",279],["1f451",280],["1f451-fe0f",280],["26d1",281],["26d1-fe0f",281],["1f392",282],["1f392-fe0f",282],["1f45d",283],["1f45d-fe0f",283],["1f45b",284],["1f45b-fe0f",284],["1f45c",285],["1f45c-fe0f",285],["1f4bc",286],["1f4bc-fe0f",286],["1f453",287],["1f453-fe0f",287],["1f576",288],["1f576-fe0f",288],["1f302",289],["1f302-fe0f",289],["2602-fe0f",290],["1f436",291],["1f436-fe0f",291],["1f431",292],["1f431-fe0f",292],["1f42d",293],["1f42d-fe0f",293],["1f439",294],["1f439-fe0f",294],["1f430",295],["1f430-fe0f",295],["1f98a",296],["1f98a-fe0f",296],["1f43b",297],["1f43b-fe0f",297],["1f43c",298],["1f43c-fe0f",298],["1f428",299],["1f428-fe0f",299],["1f42f",300],["1f42f-fe0f",300],["1f981",301],["1f981-fe0f",301],["1f42e",302],["1f42e-fe0f",302],["1f437",303],["1f437-fe0f",303],["1f43d",304],["1f43d-fe0f",304],["1f438",305],["1f438-fe0f",305],["1f435",306],["1f435-fe0f",306],["1f648",307],["1f648-fe0f",307],["1f649",308],["1f649-fe0f",308],["1f64a",309],["1f64a-fe0f",309],["1f412",310],["1f412-fe0f",310],["1f414",311],["1f414-fe0f",311],["1f427",312],["1f427-fe0f",312],["1f426",313],["1f426-fe0f",313],["1f424",314],["1f424-fe0f",314],["1f423",315],["1f423-fe0f",315],["1f425",316],["1f425-fe0f",316],["1f986",317],["1f986-fe0f",317],["1f985",318],["1f985-fe0f",318],["1f989",319],["1f989-fe0f",319],["1f987",320],["1f987-fe0f",320],["1f43a",321],["1f43a-fe0f",321],["1f417",322],["1f417-fe0f",322],["1f434",323],["1f434-fe0f",323],["1f984",324],["1f984-fe0f",324],["1f41d",325],["1f41d-fe0f",325],["1f41b",326],["1f41b-fe0f",326],["1f98b",327],["1f98b-fe0f",327],["1f40c",328],["1f40c-fe0f",328],["1f41a",329],["1f41a-fe0f",329],["1f41e",330],["1f41e-fe0f",330],["1f41c",331],["1f41c-fe0f",331],["1f577",332],["1f577-fe0f",332],["1f578",333],["1f578-fe0f",333],["1f422",334],["1f422-fe0f",334],["1f40d",335],["1f40d-fe0f",335],["1f98e",336],["1f98e-fe0f",336],["1f982",337],["1f982-fe0f",337],["1f980",338],["1f980-fe0f",338],["1f991",339],["1f991-fe0f",339],["1f419",340],["1f419-fe0f",340],["1f990",341],["1f990-fe0f",341],["1f420",342],["1f420-fe0f",342],["1f41f",343],["1f41f-fe0f",343],["1f421",344],["1f421-fe0f",344],["1f42c",345],["1f42c-fe0f",345],["1f988",346],["1f988-fe0f",346],["1f433",347],["1f433-fe0f",347],["1f40b",348],["1f40b-fe0f",348],["1f40a",349],["1f40a-fe0f",349],["1f406",350],["1f406-fe0f",350],["1f405",351],["1f405-fe0f",351],["1f403",352],["1f403-fe0f",352],["1f402",353],["1f402-fe0f",353],["1f404",354],["1f404-fe0f",354],["1f98c",355],["1f98c-fe0f",355],["1f42a",356],["1f42a-fe0f",356],["1f42b",357],["1f42b-fe0f",357],["1f418",358],["1f418-fe0f",358],["1f98f",359],["1f98f-fe0f",359],["1f98d",360],["1f98d-fe0f",360],["1f40e",361],["1f40e-fe0f",361],["1f416",362],["1f416-fe0f",362],["1f410",363],["1f410-fe0f",363],["1f40f",364],["1f40f-fe0f",364],["1f411",365],["1f411-fe0f",365],["1f415",366],["1f415-fe0f",366],["1f429",367],["1f429-fe0f",367],["1f408",368],["1f408-fe0f",368],["1f413",369],["1f413-fe0f",369],["1f983",370],["1f983-fe0f",370],["1f54a",371],["1f54a-fe0f",371],["1f407",372],["1f407-fe0f",372],["1f401",373],["1f401-fe0f",373],["1f400",374],["1f400-fe0f",374],["1f43f",375],["1f43f-fe0f",375],["1f43e",376],["1f43e-fe0f",376],["1f409",377],["1f409-fe0f",377],["1f432",378],["1f432-fe0f",378],["1f335",379],["1f335-fe0f",379],["1f384",380],["1f384-fe0f",380],["1f332",381],["1f332-fe0f",381],["1f333",382],["1f333-fe0f",382],["1f334",383],["1f334-fe0f",383],["1f331",384],["1f331-fe0f",384],["1f33f",385],["1f33f-fe0f",385],["2618-fe0f",386],["1f340",387],["1f340-fe0f",387],["1f38d",388],["1f38d-fe0f",388],["1f38b",389],["1f38b-fe0f",389],["1f343",390],["1f343-fe0f",390],["1f342",391],["1f342-fe0f",391],["1f341",392],["1f341-fe0f",392],["1f344",393],["1f344-fe0f",393],["1f33e",394],["1f33e-fe0f",394],["1f490",395],["1f490-fe0f",395],["1f337",396],["1f337-fe0f",396],["1f339",397],["1f339-fe0f",397],["1f940",398],["1f940-fe0f",398],["1f33b",399],["1f33b-fe0f",399],["1f33c",400],["1f33c-fe0f",400],["1f338",401],["1f338-fe0f",401],["1f33a",402],["1f33a-fe0f",402],["1f30e",403],["1f30e-fe0f",403],["1f30d",404],["1f30d-fe0f",404],["1f30f",405],["1f30f-fe0f",405],["1f315",406],["1f315-fe0f",406],["1f316",407],["1f316-fe0f",407],["1f317",408],["1f317-fe0f",408],["1f318",409],["1f318-fe0f",409],["1f311",410],["1f311-fe0f",410],["1f312",411],["1f312-fe0f",411],["1f313",412],["1f313-fe0f",412],["1f314",413],["1f314-fe0f",413],["1f31a",414],["1f31a-fe0f",414],["1f31d",415],["1f31d-fe0f",415],["1f31e",416],["1f31e-fe0f",416],["1f31b",417],["1f31b-fe0f",417],["1f31c",418],["1f31c-fe0f",418],["1f319",419],["1f319-fe0f",419],["1f4ab",420],["1f4ab-fe0f",420],["2b50-fe0f",421],["1f31f",422],["1f31f-fe0f",422],["2728",423],["2728-fe0f",423],["26a1-fe0f",424],["1f525",425],["1f525-fe0f",425],["1f4a5",426],["1f4a5-fe0f",426],["2604-fe0f",427],["2600-fe0f",428],["1f324",429],["1f324-fe0f",429],["26c5-fe0f",430],["1f325",431],["1f325-fe0f",431],["1f326",432],["1f326-fe0f",432],["1f308",433],["1f308-fe0f",433],["2601-fe0f",434],["1f327",435],["1f327-fe0f",435],["26c8",436],["26c8-fe0f",436],["1f329",437],["1f329-fe0f",437],["1f328",438],["1f328-fe0f",438],["2603-fe0f",439],["26c4-fe0f",440],["2744-fe0f",441],["1f32c",442],["1f32c-fe0f",442],["1f4a8",443],["1f4a8-fe0f",443],["1f32a",444],["1f32a-fe0f",444],["1f32b",445],["1f32b-fe0f",445],["1f30a",446],["1f30a-fe0f",446],["1f4a7",447],["1f4a7-fe0f",447],["1f4a6",448],["1f4a6-fe0f",448],["2614-fe0f",449],["1f34f",450],["1f34f-fe0f",450],["1f34e",451],["1f34e-fe0f",451],["1f350",452],["1f350-fe0f",452],["1f34a",453],["1f34a-fe0f",453],["1f34b",454],["1f34b-fe0f",454],["1f34c",455],["1f34c-fe0f",455],["1f349",456],["1f349-fe0f",456],["1f347",457],["1f347-fe0f",457],["1f353",458],["1f353-fe0f",458],["1f348",459],["1f348-fe0f",459],["1f352",460],["1f352-fe0f",460],["1f351",461],["1f351-fe0f",461],["1f34d",462],["1f34d-fe0f",462],["1f95d",463],["1f95d-fe0f",463],["1f951",464],["1f951-fe0f",464],["1f345",465],["1f345-fe0f",465],["1f346",466],["1f346-fe0f",466],["1f952",467],["1f952-fe0f",467],["1f955",468],["1f955-fe0f",468],["1f33d",469],["1f33d-fe0f",469],["1f336",470],["1f336-fe0f",470],["1f954",471],["1f954-fe0f",471],["1f360",472],["1f360-fe0f",472],["1f330",473],["1f330-fe0f",473],["1f95c",474],["1f95c-fe0f",474],["1f36f",475],["1f36f-fe0f",475],["1f950",476],["1f950-fe0f",476],["1f35e",477],["1f35e-fe0f",477],["1f956",478],["1f956-fe0f",478],["1f9c0",479],["1f9c0-fe0f",479],["1f95a",480],["1f95a-fe0f",480],["1f373",481],["1f373-fe0f",481],["1f953",482],["1f953-fe0f",482],["1f95e",483],["1f95e-fe0f",483],["1f364",484],["1f364-fe0f",484],["1f357",485],["1f357-fe0f",485],["1f356",486],["1f356-fe0f",486],["1f355",487],["1f355-fe0f",487],["1f32d",488],["1f32d-fe0f",488],["1f354",489],["1f354-fe0f",489],["1f35f",490],["1f35f-fe0f",490],["1f959",491],["1f959-fe0f",491],["1f32e",492],["1f32e-fe0f",492],["1f32f",493],["1f32f-fe0f",493],["1f957",494],["1f957-fe0f",494],["1f958",495],["1f958-fe0f",495],["1f35d",496],["1f35d-fe0f",496],["1f35c",497],["1f35c-fe0f",497],["1f372",498],["1f372-fe0f",498],["1f365",499],["1f365-fe0f",499],["1f363",500],["1f363-fe0f",500],["1f371",501],["1f371-fe0f",501],["1f35b",502],["1f35b-fe0f",502],["1f35a",503],["1f35a-fe0f",503],["1f359",504],["1f359-fe0f",504],["1f358",505],["1f358-fe0f",505],["1f362",506],["1f362-fe0f",506],["1f361",507],["1f361-fe0f",507],["1f367",508],["1f367-fe0f",508],["1f368",509],["1f368-fe0f",509],["1f366",510],["1f366-fe0f",510],["1f370",511],["1f370-fe0f",511],["1f382",512],["1f382-fe0f",512],["1f36e",513],["1f36e-fe0f",513],["1f36d",514],["1f36d-fe0f",514],["1f36c",515],["1f36c-fe0f",515],["1f36b",516],["1f36b-fe0f",516],["1f37f",517],["1f37f-fe0f",517],["1f369",518],["1f369-fe0f",518],["1f36a",519],["1f36a-fe0f",519],["1f95b",520],["1f95b-fe0f",520],["1f37c",521],["1f37c-fe0f",521],["2615-fe0f",522],["1f375",523],["1f375-fe0f",523],["1f376",524],["1f376-fe0f",524],["1f37a",525],["1f37a-fe0f",525],["1f37b",526],["1f37b-fe0f",526],["1f942",527],["1f942-fe0f",527],["1f377",528],["1f377-fe0f",528],["1f943",529],["1f943-fe0f",529],["1f378",530],["1f378-fe0f",530],["1f379",531],["1f379-fe0f",531],["1f37e",532],["1f37e-fe0f",532],["1f944",533],["1f944-fe0f",533],["1f374",534],["1f374-fe0f",534],["1f37d",535],["1f37d-fe0f",535],["26bd-fe0f",536],["1f3c0",537],["1f3c0-fe0f",537],["1f3c8",538],["1f3c8-fe0f",538],["26be-fe0f",539],["1f3be",540],["1f3be-fe0f",540],["1f3d0",541],["1f3d0-fe0f",541],["1f3c9",542],["1f3c9-fe0f",542],["1f3b1",543],["1f3b1-fe0f",543],["1f3d3",544],["1f3d3-fe0f",544],["1f3f8",545],["1f3f8-fe0f",545],["1f945",546],["1f945-fe0f",546],["1f3d2",547],["1f3d2-fe0f",547],["1f3d1",548],["1f3d1-fe0f",548],["1f3cf",549],["1f3cf-fe0f",549],["26f3-fe0f",550],["1f3f9",551],["1f3f9-fe0f",551],["1f3a3",552],["1f3a3-fe0f",552],["1f94a",553],["1f94a-fe0f",553],["1f94b",554],["1f94b-fe0f",554],["26f8",555],["26f8-fe0f",555],["1f3bf",556],["1f3bf-fe0f",556],["26f7",557],["26f7-fe0f",557],["1f3c2",558],["1f3c2-fe0f",558],["1f3cb-fe0f-200d-2640-fe0f",559],["1f3cb-200d-2640-fe0f-fe0f",559],["1f3cb-fe0f",560],["1f3cb-fe0f-200d-2642-fe0f",560],["1f93a",561],["1f93a-fe0f",561],["1f93c-200d-2640-fe0f",562],["1f93c-200d-2642-fe0f",563],["1f938-200d-2640-fe0f",564],["1f938-200d-2642-fe0f",565],["26f9-fe0f-200d-2640-fe0f",566],["26f9-200d-2640-fe0f-fe0f",566],["26f9-fe0f",567],["26f9-fe0f-200d-2642-fe0f",567],["1f93e-200d-2640-fe0f",568],["1f93e-200d-2642-fe0f",569],["1f3cc-fe0f-200d-2640-fe0f",570],["1f3cc-200d-2640-fe0f-fe0f",570],["1f3cc-fe0f",571],["1f3cc-fe0f-200d-2642-fe0f",571],["1f3c4-200d-2640-fe0f",572],["1f3c4",573],["1f3c4-fe0f",573],["1f3c4-200d-2642-fe0f",573],["1f3ca-200d-2640-fe0f",574],["1f3ca",575],["1f3ca-fe0f",575],["1f3ca-200d-2642-fe0f",575],["1f93d-200d-2640-fe0f",576],["1f93d-200d-2642-fe0f",577],["1f6a3-200d-2640-fe0f",578],["1f6a3",579],["1f6a3-fe0f",579],["1f6a3-200d-2642-fe0f",579],["1f3c7",580],["1f3c7-fe0f",580],["1f6b4-200d-2640-fe0f",581],["1f6b4",582],["1f6b4-fe0f",582],["1f6b4-200d-2642-fe0f",582],["1f6b5-200d-2640-fe0f",583],["1f6b5",584],["1f6b5-fe0f",584],["1f6b5-200d-2642-fe0f",584],["1f3bd",585],["1f3bd-fe0f",585],["1f3c5",586],["1f3c5-fe0f",586],["1f396",587],["1f396-fe0f",587],["1f947",588],["1f947-fe0f",588],["1f948",589],["1f948-fe0f",589],["1f949",590],["1f949-fe0f",590],["1f3c6",591],["1f3c6-fe0f",591],["1f3f5",592],["1f3f5-fe0f",592],["1f397",593],["1f397-fe0f",593],["1f3ab",594],["1f3ab-fe0f",594],["1f39f",595],["1f39f-fe0f",595],["1f3aa",596],["1f3aa-fe0f",596],["1f939-200d-2640-fe0f",597],["1f939-200d-2642-fe0f",598],["1f3ad",599],["1f3ad-fe0f",599],["1f3a8",600],["1f3a8-fe0f",600],["1f3ac",601],["1f3ac-fe0f",601],["1f3a4",602],["1f3a4-fe0f",602],["1f3a7",603],["1f3a7-fe0f",603],["1f3bc",604],["1f3bc-fe0f",604],["1f3b9",605],["1f3b9-fe0f",605],["1f941",606],["1f941-fe0f",606],["1f3b7",607],["1f3b7-fe0f",607],["1f3ba",608],["1f3ba-fe0f",608],["1f3b8",609],["1f3b8-fe0f",609],["1f3bb",610],["1f3bb-fe0f",610],["1f3b2",611],["1f3b2-fe0f",611],["1f3af",612],["1f3af-fe0f",612],["1f3b3",613],["1f3b3-fe0f",613],["1f3ae",614],["1f3ae-fe0f",614],["1f3b0",615],["1f3b0-fe0f",615],["1f697",616],["1f697-fe0f",616],["1f695",617],["1f695-fe0f",617],["1f699",618],["1f699-fe0f",618],["1f68c",619],["1f68c-fe0f",619],["1f68e",620],["1f68e-fe0f",620],["1f3ce",621],["1f3ce-fe0f",621],["1f693",622],["1f693-fe0f",622],["1f691",623],["1f691-fe0f",623],["1f692",624],["1f692-fe0f",624],["1f690",625],["1f690-fe0f",625],["1f69a",626],["1f69a-fe0f",626],["1f69b",627],["1f69b-fe0f",627],["1f69c",628],["1f69c-fe0f",628],["1f6f4",629],["1f6f4-fe0f",629],["1f6b2",630],["1f6b2-fe0f",630],["1f6f5",631],["1f6f5-fe0f",631],["1f3cd",632],["1f3cd-fe0f",632],["1f6a8",633],["1f6a8-fe0f",633],["1f694",634],["1f694-fe0f",634],["1f68d",635],["1f68d-fe0f",635],["1f698",636],["1f698-fe0f",636],["1f696",637],["1f696-fe0f",637],["1f6a1",638],["1f6a1-fe0f",638],["1f6a0",639],["1f6a0-fe0f",639],["1f69f",640],["1f69f-fe0f",640],["1f683",641],["1f683-fe0f",641],["1f68b",642],["1f68b-fe0f",642],["1f69e",643],["1f69e-fe0f",643],["1f69d",644],["1f69d-fe0f",644],["1f684",645],["1f684-fe0f",645],["1f685",646],["1f685-fe0f",646],["1f688",647],["1f688-fe0f",647],["1f682",648],["1f682-fe0f",648],["1f686",649],["1f686-fe0f",649],["1f687",650],["1f687-fe0f",650],["1f68a",651],["1f68a-fe0f",651],["1f689",652],["1f689-fe0f",652],["1f681",653],["1f681-fe0f",653],["1f6e9",654],["1f6e9-fe0f",654],["2708-fe0f",655],["1f6eb",656],["1f6eb-fe0f",656],["1f6ec",657],["1f6ec-fe0f",657],["1f680",658],["1f680-fe0f",658],["1f6f0",659],["1f6f0-fe0f",659],["1f4ba",660],["1f4ba-fe0f",660],["1f6f6",661],["1f6f6-fe0f",661],["26f5-fe0f",662],["1f6e5",663],["1f6e5-fe0f",663],["1f6a4",664],["1f6a4-fe0f",664],["1f6f3",665],["1f6f3-fe0f",665],["26f4",666],["26f4-fe0f",666],["1f6a2",667],["1f6a2-fe0f",667],["2693-fe0f",668],["1f6a7",669],["1f6a7-fe0f",669],["26fd-fe0f",670],["1f68f",671],["1f68f-fe0f",671],["1f6a6",672],["1f6a6-fe0f",672],["1f6a5",673],["1f6a5-fe0f",673],["1f5fa",674],["1f5fa-fe0f",674],["1f5ff",675],["1f5ff-fe0f",675],["1f5fd",676],["1f5fd-fe0f",676],["26f2-fe0f",677],["1f5fc",678],["1f5fc-fe0f",678],["1f3f0",679],["1f3f0-fe0f",679],["1f3ef",680],["1f3ef-fe0f",680],["1f3df",681],["1f3df-fe0f",681],["1f3a1",682],["1f3a1-fe0f",682],["1f3a2",683],["1f3a2-fe0f",683],["1f3a0",684],["1f3a0-fe0f",684],["26f1",685],["26f1-fe0f",685],["1f3d6",686],["1f3d6-fe0f",686],["1f3dd",687],["1f3dd-fe0f",687],["26f0",688],["26f0-fe0f",688],["1f3d4",689],["1f3d4-fe0f",689],["1f5fb",690],["1f5fb-fe0f",690],["1f30b",691],["1f30b-fe0f",691],["1f3dc",692],["1f3dc-fe0f",692],["1f3d5",693],["1f3d5-fe0f",693],["26fa-fe0f",694],["1f6e4",695],["1f6e4-fe0f",695],["1f6e3",696],["1f6e3-fe0f",696],["1f3d7",697],["1f3d7-fe0f",697],["1f3ed",698],["1f3ed-fe0f",698],["1f3e0",699],["1f3e0-fe0f",699],["1f3e1",700],["1f3e1-fe0f",700],["1f3d8",701],["1f3d8-fe0f",701],["1f3da",702],["1f3da-fe0f",702],["1f3e2",703],["1f3e2-fe0f",703],["1f3ec",704],["1f3ec-fe0f",704],["1f3e3",705],["1f3e3-fe0f",705],["1f3e4",706],["1f3e4-fe0f",706],["1f3e5",707],["1f3e5-fe0f",707],["1f3e6",708],["1f3e6-fe0f",708],["1f3e8",709],["1f3e8-fe0f",709],["1f3ea",710],["1f3ea-fe0f",710],["1f3eb",711],["1f3eb-fe0f",711],["1f3e9",712],["1f3e9-fe0f",712],["1f492",713],["1f492-fe0f",713],["1f3db",714],["1f3db-fe0f",714],["26ea-fe0f",715],["1f54c",716],["1f54c-fe0f",716],["1f54d",717],["1f54d-fe0f",717],["1f54b",718],["1f54b-fe0f",718],["26e9",719],["26e9-fe0f",719],["1f5fe",720],["1f5fe-fe0f",720],["1f391",721],["1f391-fe0f",721],["1f3de",722],["1f3de-fe0f",722],["1f305",723],["1f305-fe0f",723],["1f304",724],["1f304-fe0f",724],["1f320",725],["1f320-fe0f",725],["1f387",726],["1f387-fe0f",726],["1f386",727],["1f386-fe0f",727],["1f307",728],["1f307-fe0f",728],["1f306",729],["1f306-fe0f",729],["1f3d9",730],["1f3d9-fe0f",730],["1f303",731],["1f303-fe0f",731],["1f30c",732],["1f30c-fe0f",732],["1f309",733],["1f309-fe0f",733],["1f301",734],["1f301-fe0f",734],["231a-fe0f",735],["1f4f1",736],["1f4f1-fe0f",736],["1f4f2",737],["1f4f2-fe0f",737],["1f4bb",738],["1f4bb-fe0f",738],["2328-fe0f",739],["1f5a5",740],["1f5a5-fe0f",740],["1f5a8",741],["1f5a8-fe0f",741],["1f5b1",742],["1f5b1-fe0f",742],["1f5b2",743],["1f5b2-fe0f",743],["1f579",744],["1f579-fe0f",744],["1f5dc",745],["1f5dc-fe0f",745],["1f4bd",746],["1f4bd-fe0f",746],["1f4be",747],["1f4be-fe0f",747],["1f4bf",748],["1f4bf-fe0f",748],["1f4c0",749],["1f4c0-fe0f",749],["1f4fc",750],["1f4fc-fe0f",750],["1f4f7",751],["1f4f7-fe0f",751],["1f4f8",752],["1f4f8-fe0f",752],["1f4f9",753],["1f4f9-fe0f",753],["1f3a5",754],["1f3a5-fe0f",754],["1f4fd",755],["1f4fd-fe0f",755],["1f39e",756],["1f39e-fe0f",756],["1f4de",757],["1f4de-fe0f",757],["260e-fe0f",758],["1f4df",759],["1f4df-fe0f",759],["1f4e0",760],["1f4e0-fe0f",760],["1f4fa",761],["1f4fa-fe0f",761],["1f4fb",762],["1f4fb-fe0f",762],["1f399",763],["1f399-fe0f",763],["1f39a",764],["1f39a-fe0f",764],["1f39b",765],["1f39b-fe0f",765],["23f1",766],["23f1-fe0f",766],["23f2",767],["23f2-fe0f",767],["23f0",768],["23f0-fe0f",768],["1f570",769],["1f570-fe0f",769],["231b-fe0f",770],["23f3",771],["23f3-fe0f",771],["1f4e1",772],["1f4e1-fe0f",772],["1f50b",773],["1f50b-fe0f",773],["1f50c",774],["1f50c-fe0f",774],["1f4a1",775],["1f4a1-fe0f",775],["1f526",776],["1f526-fe0f",776],["1f56f",777],["1f56f-fe0f",777],["1f5d1",778],["1f5d1-fe0f",778],["1f6e2",779],["1f6e2-fe0f",779],["1f4b8",780],["1f4b8-fe0f",780],["1f4b5",781],["1f4b5-fe0f",781],["1f4b4",782],["1f4b4-fe0f",782],["1f4b6",783],["1f4b6-fe0f",783],["1f4b7",784],["1f4b7-fe0f",784],["1f4b0",785],["1f4b0-fe0f",785],["1f4b3",786],["1f4b3-fe0f",786],["1f48e",787],["1f48e-fe0f",787],["2696-fe0f",788],["1f527",789],["1f527-fe0f",789],["1f528",790],["1f528-fe0f",790],["2692",791],["2692-fe0f",791],["1f6e0",792],["1f6e0-fe0f",792],["26cf",793],["26cf-fe0f",793],["1f529",794],["1f529-fe0f",794],["2699-fe0f",795],["26d3",796],["26d3-fe0f",796],["1f52b",797],["1f52b-fe0f",797],["1f4a3",798],["1f4a3-fe0f",798],["1f52a",799],["1f52a-fe0f",799],["1f5e1",800],["1f5e1-fe0f",800],["2694-fe0f",801],["1f6e1",802],["1f6e1-fe0f",802],["1f6ac",803],["1f6ac-fe0f",803],["26b0-fe0f",804],["26b1-fe0f",805],["1f3fa",806],["1f3fa-fe0f",806],["1f52e",807],["1f52e-fe0f",807],["1f4ff",808],["1f4ff-fe0f",808],["1f488",809],["1f488-fe0f",809],["2697-fe0f",810],["1f52d",811],["1f52d-fe0f",811],["1f52c",812],["1f52c-fe0f",812],["1f573",813],["1f573-fe0f",813],["1f48a",814],["1f48a-fe0f",814],["1f489",815],["1f489-fe0f",815],["1f321",816],["1f321-fe0f",816],["1f6bd",817],["1f6bd-fe0f",817],["1f6b0",818],["1f6b0-fe0f",818],["1f6bf",819],["1f6bf-fe0f",819],["1f6c1",820],["1f6c1-fe0f",820],["1f6c0",821],["1f6c0-fe0f",821],["1f6ce",822],["1f6ce-fe0f",822],["1f511",823],["1f511-fe0f",823],["1f5dd",824],["1f5dd-fe0f",824],["1f6aa",825],["1f6aa-fe0f",825],["1f6cb",826],["1f6cb-fe0f",826],["1f6cf",827],["1f6cf-fe0f",827],["1f6cc",828],["1f6cc-fe0f",828],["1f5bc",829],["1f5bc-fe0f",829],["1f6cd",830],["1f6cd-fe0f",830],["1f6d2",831],["1f6d2-fe0f",831],["1f381",832],["1f381-fe0f",832],["1f388",833],["1f388-fe0f",833],["1f38f",834],["1f38f-fe0f",834],["1f380",835],["1f380-fe0f",835],["1f38a",836],["1f38a-fe0f",836],["1f389",837],["1f389-fe0f",837],["1f38e",838],["1f38e-fe0f",838],["1f3ee",839],["1f3ee-fe0f",839],["1f390",840],["1f390-fe0f",840],["2709-fe0f",841],["1f4e9",842],["1f4e9-fe0f",842],["1f4e8",843],["1f4e8-fe0f",843],["1f4e7",844],["1f4e7-fe0f",844],["1f48c",845],["1f48c-fe0f",845],["1f4e5",846],["1f4e5-fe0f",846],["1f4e4",847],["1f4e4-fe0f",847],["1f4e6",848],["1f4e6-fe0f",848],["1f3f7",849],["1f3f7-fe0f",849],["1f4ea",850],["1f4ea-fe0f",850],["1f4eb",851],["1f4eb-fe0f",851],["1f4ec",852],["1f4ec-fe0f",852],["1f4ed",853],["1f4ed-fe0f",853],["1f4ee",854],["1f4ee-fe0f",854],["1f4ef",855],["1f4ef-fe0f",855],["1f4dc",856],["1f4dc-fe0f",856],["1f4c3",857],["1f4c3-fe0f",857],["1f4c4",858],["1f4c4-fe0f",858],["1f4d1",859],["1f4d1-fe0f",859],["1f4ca",860],["1f4ca-fe0f",860],["1f4c8",861],["1f4c8-fe0f",861],["1f4c9",862],["1f4c9-fe0f",862],["1f5d2",863],["1f5d2-fe0f",863],["1f5d3",864],["1f5d3-fe0f",864],["1f4c6",865],["1f4c6-fe0f",865],["1f4c5",866],["1f4c5-fe0f",866],["1f4c7",867],["1f4c7-fe0f",867],["1f5c3",868],["1f5c3-fe0f",868],["1f5f3",869],["1f5f3-fe0f",869],["1f5c4",870],["1f5c4-fe0f",870],["1f4cb",871],["1f4cb-fe0f",871],["1f4c1",872],["1f4c1-fe0f",872],["1f4c2",873],["1f4c2-fe0f",873],["1f5c2",874],["1f5c2-fe0f",874],["1f5de",875],["1f5de-fe0f",875],["1f4f0",876],["1f4f0-fe0f",876],["1f4d3",877],["1f4d3-fe0f",877],["1f4d4",878],["1f4d4-fe0f",878],["1f4d2",879],["1f4d2-fe0f",879],["1f4d5",880],["1f4d5-fe0f",880],["1f4d7",881],["1f4d7-fe0f",881],["1f4d8",882],["1f4d8-fe0f",882],["1f4d9",883],["1f4d9-fe0f",883],["1f4da",884],["1f4da-fe0f",884],["1f4d6",885],["1f4d6-fe0f",885],["1f516",886],["1f516-fe0f",886],["1f517",887],["1f517-fe0f",887],["1f4ce",888],["1f4ce-fe0f",888],["1f587",889],["1f587-fe0f",889],["1f4d0",890],["1f4d0-fe0f",890],["1f4cf",891],["1f4cf-fe0f",891],["1f4cc",892],["1f4cc-fe0f",892],["1f4cd",893],["1f4cd-fe0f",893],["2702-fe0f",894],["1f58a",895],["1f58a-fe0f",895],["1f58b",896],["1f58b-fe0f",896],["2712-fe0f",897],["1f58c",898],["1f58c-fe0f",898],["1f58d",899],["1f58d-fe0f",899],["1f4dd",900],["1f4dd-fe0f",900],["270f-fe0f",901],["1f50d",902],["1f50d-fe0f",902],["1f50e",903],["1f50e-fe0f",903],["1f50f",904],["1f50f-fe0f",904],["1f510",905],["1f510-fe0f",905],["1f512",906],["1f512-fe0f",906],["1f513",907],["1f513-fe0f",907],["2764-fe0f",908],["1f49b",909],["1f49b-fe0f",909],["1f49a",910],["1f49a-fe0f",910],["1f499",911],["1f499-fe0f",911],["1f49c",912],["1f49c-fe0f",912],["1f5a4",913],["1f5a4-fe0f",913],["1f494",914],["1f494-fe0f",914],["2763-fe0f",915],["1f495",916],["1f495-fe0f",916],["1f49e",917],["1f49e-fe0f",917],["1f493",918],["1f493-fe0f",918],["1f497",919],["1f497-fe0f",919],["1f496",920],["1f496-fe0f",920],["1f498",921],["1f498-fe0f",921],["1f49d",922],["1f49d-fe0f",922],["1f49f",923],["1f49f-fe0f",923],["262e-fe0f",924],["271d-fe0f",925],["262a-fe0f",926],["1f549",927],["1f549-fe0f",927],["2638-fe0f",928],["2721-fe0f",929],["1f52f",930],["1f52f-fe0f",930],["1f54e",931],["1f54e-fe0f",931],["262f-fe0f",932],["2626-fe0f",933],["1f6d0",934],["1f6d0-fe0f",934],["26ce",935],["26ce-fe0f",935],["2648-fe0f",936],["2649-fe0f",937],["264a-fe0f",938],["264b-fe0f",939],["264c-fe0f",940],["264d-fe0f",941],["264e-fe0f",942],["264f-fe0f",943],["2650-fe0f",944],["2651-fe0f",945],["2652-fe0f",946],["2653-fe0f",947],["1f194",948],["1f194-fe0f",948],["269b-fe0f",949],["1f251",950],["1f251-fe0f",950],["2622-fe0f",951],["2623-fe0f",952],["1f4f4",953],["1f4f4-fe0f",953],["1f4f3",954],["1f4f3-fe0f",954],["1f236",955],["1f236-fe0f",955],["1f21a-fe0f",956],["1f238",957],["1f238-fe0f",957],["1f23a",958],["1f23a-fe0f",958],["1f237-fe0f",959],["2734-fe0f",960],["1f19a",961],["1f19a-fe0f",961],["1f4ae",962],["1f4ae-fe0f",962],["1f250",963],["1f250-fe0f",963],["3299-fe0f",964],["3297-fe0f",965],["1f234",966],["1f234-fe0f",966],["1f235",967],["1f235-fe0f",967],["1f239",968],["1f239-fe0f",968],["1f232",969],["1f232-fe0f",969],["1f170-fe0f",970],["1f171-fe0f",971],["1f18e",972],["1f18e-fe0f",972],["1f191",973],["1f191-fe0f",973],["1f17e-fe0f",974],["1f198",975],["1f198-fe0f",975],["274c",976],["274c-fe0f",976],["2b55-fe0f",977],["1f6d1",978],["1f6d1-fe0f",978],["26d4-fe0f",979],["1f4db",980],["1f4db-fe0f",980],["1f6ab",981],["1f6ab-fe0f",981],["1f4af",982],["1f4af-fe0f",982],["1f4a2",983],["1f4a2-fe0f",983],["2668-fe0f",984],["1f6b7",985],["1f6b7-fe0f",985],["1f6af",986],["1f6af-fe0f",986],["1f6b3",987],["1f6b3-fe0f",987],["1f6b1",988],["1f6b1-fe0f",988],["1f51e",989],["1f51e-fe0f",989],["1f4f5",990],["1f4f5-fe0f",990],["1f6ad",991],["1f6ad-fe0f",991],["2757-fe0f",992],["2755",993],["2755-fe0f",993],["2753",994],["2753-fe0f",994],["2754",995],["2754-fe0f",995],["203c-fe0f",996],["2049-fe0f",997],["1f505",998],["1f505-fe0f",998],["1f506",999],["1f506-fe0f",999],["303d-fe0f",1000],["26a0-fe0f",1001],["1f6b8",1002],["1f6b8-fe0f",1002],["1f531",1003],["1f531-fe0f",1003],["269c-fe0f",1004],["1f530",1005],["1f530-fe0f",1005],["267b-fe0f",1006],["2705",1007],["2705-fe0f",1007],["1f22f-fe0f",1008],["1f4b9",1009],["1f4b9-fe0f",1009],["2747-fe0f",1010],["2733-fe0f",1011],["274e",1012],["274e-fe0f",1012],["1f310",1013],["1f310-fe0f",1013],["1f4a0",1014],["1f4a0-fe0f",1014],["24c2-fe0f",1015],["1f300",1016],["1f300-fe0f",1016],["1f4a4",1017],["1f4a4-fe0f",1017],["1f3e7",1018],["1f3e7-fe0f",1018],["1f6be",1019],["1f6be-fe0f",1019],["267f-fe0f",1020],["1f17f-fe0f",1021],["1f233",1022],["1f233-fe0f",1022],["1f202-fe0f",1023],["1f6c2",1024],["1f6c2-fe0f",1024],["1f6c3",1025],["1f6c3-fe0f",1025],["1f6c4",1026],["1f6c4-fe0f",1026],["1f6c5",1027],["1f6c5-fe0f",1027],["1f6b9",1028],["1f6b9-fe0f",1028],["1f6ba",1029],["1f6ba-fe0f",1029],["1f6bc",1030],["1f6bc-fe0f",1030],["1f6bb",1031],["1f6bb-fe0f",1031],["1f6ae",1032],["1f6ae-fe0f",1032],["1f3a6",1033],["1f3a6-fe0f",1033],["1f4f6",1034],["1f4f6-fe0f",1034],["1f201",1035],["1f201-fe0f",1035],["1f523",1036],["1f523-fe0f",1036],["2139-fe0f",1037],["1f524",1038],["1f524-fe0f",1038],["1f521",1039],["1f521-fe0f",1039],["1f520",1040],["1f520-fe0f",1040],["1f196",1041],["1f196-fe0f",1041],["1f197",1042],["1f197-fe0f",1042],["1f199",1043],["1f199-fe0f",1043],["1f192",1044],["1f192-fe0f",1044],["1f195",1045],["1f195-fe0f",1045],["1f193",1046],["1f193-fe0f",1046],["0030-fe0f-20e3",1047],["0030-20e3-fe0f",1047],["0031-fe0f-20e3",1048],["0031-20e3-fe0f",1048],["0032-fe0f-20e3",1049],["0032-20e3-fe0f",1049],["0033-fe0f-20e3",1050],["0033-20e3-fe0f",1050],["0034-fe0f-20e3",1051],["0034-20e3-fe0f",1051],["0035-fe0f-20e3",1052],["0035-20e3-fe0f",1052],["0036-fe0f-20e3",1053],["0036-20e3-fe0f",1053],["0037-fe0f-20e3",1054],["0037-20e3-fe0f",1054],["0038-fe0f-20e3",1055],["0038-20e3-fe0f",1055],["0039-fe0f-20e3",1056],["0039-20e3-fe0f",1056],["1f51f",1057],["1f51f-fe0f",1057],["1f522",1058],["1f522-fe0f",1058],["0023-fe0f-20e3",1059],["0023-20e3-fe0f",1059],["002a-fe0f-20e3",1060],["002a-20e3-fe0f",1060],["25b6-fe0f",1061],["23f8",1062],["23f8-fe0f",1062],["23ef",1063],["23ef-fe0f",1063],["23f9",1064],["23f9-fe0f",1064],["23fa",1065],["23fa-fe0f",1065],["23ed",1066],["23ed-fe0f",1066],["23ee",1067],["23ee-fe0f",1067],["23e9",1068],["23e9-fe0f",1068],["23ea",1069],["23ea-fe0f",1069],["23eb",1070],["23eb-fe0f",1070],["23ec",1071],["23ec-fe0f",1071],["25c0-fe0f",1072],["1f53c",1073],["1f53c-fe0f",1073],["1f53d",1074],["1f53d-fe0f",1074],["27a1-fe0f",1075],["2b05-fe0f",1076],["2b06-fe0f",1077],["2b07-fe0f",1078],["2197-fe0f",1079],["2198-fe0f",1080],["2199-fe0f",1081],["2196-fe0f",1082],["2195-fe0f",1083],["2194-fe0f",1084],["21aa-fe0f",1085],["21a9-fe0f",1086],["2934-fe0f",1087],["2935-fe0f",1088],["1f500",1089],["1f500-fe0f",1089],["1f501",1090],["1f501-fe0f",1090],["1f502",1091],["1f502-fe0f",1091],["1f504",1092],["1f504-fe0f",1092],["1f503",1093],["1f503-fe0f",1093],["1f3b5",1094],["1f3b5-fe0f",1094],["1f3b6",1095],["1f3b6-fe0f",1095],["2795",1096],["2795-fe0f",1096],["2796",1097],["2796-fe0f",1097],["2797",1098],["2797-fe0f",1098],["2716-fe0f",1099],["1f4b2",1100],["1f4b2-fe0f",1100],["1f4b1",1101],["1f4b1-fe0f",1101],["2122-fe0f",1102],["00a9-fe0f",1103],["00ae-fe0f",1104],["3030-fe0f",1105],["27b0",1106],["27b0-fe0f",1106],["27bf",1107],["27bf-fe0f",1107],["1f51a",1108],["1f51a-fe0f",1108],["1f519",1109],["1f519-fe0f",1109],["1f51b",1110],["1f51b-fe0f",1110],["1f51d",1111],["1f51d-fe0f",1111],["1f51c",1112],["1f51c-fe0f",1112],["2714-fe0f",1113],["2611-fe0f",1114],["1f518",1115],["1f518-fe0f",1115],["26aa-fe0f",1116],["26ab-fe0f",1117],["1f534",1118],["1f534-fe0f",1118],["1f535",1119],["1f535-fe0f",1119],["1f53a",1120],["1f53a-fe0f",1120],["1f53b",1121],["1f53b-fe0f",1121],["1f538",1122],["1f538-fe0f",1122],["1f539",1123],["1f539-fe0f",1123],["1f536",1124],["1f536-fe0f",1124],["1f537",1125],["1f537-fe0f",1125],["1f533",1126],["1f533-fe0f",1126],["1f532",1127],["1f532-fe0f",1127],["25aa-fe0f",1128],["25ab-fe0f",1129],["25fe-fe0f",1130],["25fd-fe0f",1131],["25fc-fe0f",1132],["25fb-fe0f",1133],["2b1b-fe0f",1134],["2b1c-fe0f",1135],["1f508",1136],["1f508-fe0f",1136],["1f507",1137],["1f507-fe0f",1137],["1f509",1138],["1f509-fe0f",1138],["1f50a",1139],["1f50a-fe0f",1139],["1f514",1140],["1f514-fe0f",1140],["1f515",1141],["1f515-fe0f",1141],["1f4e3",1142],["1f4e3-fe0f",1142],["1f4e2",1143],["1f4e2-fe0f",1143],["1f441-200d-1f5e8",1144],["1f441-200d-1f5e8-fe0f",1144],["1f4ac",1145],["1f4ac-fe0f",1145],["1f4ad",1146],["1f4ad-fe0f",1146],["1f5ef",1147],["1f5ef-fe0f",1147],["2660-fe0f",1148],["2663-fe0f",1149],["2665-fe0f",1150],["2666-fe0f",1151],["1f0cf",1152],["1f0cf-fe0f",1152],["1f3b4",1153],["1f3b4-fe0f",1153],["1f004-fe0f",1154],["1f550",1155],["1f550-fe0f",1155],["1f551",1156],["1f551-fe0f",1156],["1f552",1157],["1f552-fe0f",1157],["1f553",1158],["1f553-fe0f",1158],["1f554",1159],["1f554-fe0f",1159],["1f555",1160],["1f555-fe0f",1160],["1f556",1161],["1f556-fe0f",1161],["1f557",1162],["1f557-fe0f",1162],["1f558",1163],["1f558-fe0f",1163],["1f559",1164],["1f559-fe0f",1164],["1f55a",1165],["1f55a-fe0f",1165],["1f55b",1166],["1f55b-fe0f",1166],["1f55c",1167],["1f55c-fe0f",1167],["1f55d",1168],["1f55d-fe0f",1168],["1f55e",1169],["1f55e-fe0f",1169],["1f55f",1170],["1f55f-fe0f",1170],["1f560",1171],["1f560-fe0f",1171],["1f561",1172],["1f561-fe0f",1172],["1f562",1173],["1f562-fe0f",1173],["1f563",1174],["1f563-fe0f",1174],["1f564",1175],["1f564-fe0f",1175],["1f565",1176],["1f565-fe0f",1176],["1f566",1177],["1f566-fe0f",1177],["1f567",1178],["1f567-fe0f",1178],["1f3f3-fe0f",1179],["1f3f4",1180],["1f3f4-fe0f",1180],["1f3c1",1181],["1f3c1-fe0f",1181],["1f6a9",1182],["1f6a9-fe0f",1182],["1f3f3-fe0f-200d-1f308",1183],["1f3f3-200d-1f308-fe0f",1183],["1f1e6-1f1eb",1184],["1f1e6-1f1eb-fe0f",1184],["1f1e6-1f1fd",1185],["1f1e6-1f1fd-fe0f",1185],["1f1e6-1f1f1",1186],["1f1e6-1f1f1-fe0f",1186],["1f1e9-1f1ff",1187],["1f1e9-1f1ff-fe0f",1187],["1f1e6-1f1f8",1188],["1f1e6-1f1f8-fe0f",1188],["1f1e6-1f1e9",1189],["1f1e6-1f1e9-fe0f",1189],["1f1e6-1f1f4",1190],["1f1e6-1f1f4-fe0f",1190],["1f1e6-1f1ee",1191],["1f1e6-1f1ee-fe0f",1191],["1f1e6-1f1f6",1192],["1f1e6-1f1f6-fe0f",1192],["1f1e6-1f1ec",1193],["1f1e6-1f1ec-fe0f",1193],["1f1e6-1f1f7",1194],["1f1e6-1f1f7-fe0f",1194],["1f1e6-1f1f2",1195],["1f1e6-1f1f2-fe0f",1195],["1f1e6-1f1fc",1196],["1f1e6-1f1fc-fe0f",1196],["1f1e6-1f1fa",1197],["1f1e6-1f1fa-fe0f",1197],["1f1e6-1f1f9",1198],["1f1e6-1f1f9-fe0f",1198],["1f1e6-1f1ff",1199],["1f1e6-1f1ff-fe0f",1199],["1f1e7-1f1f8",1200],["1f1e7-1f1f8-fe0f",1200],["1f1e7-1f1ed",1201],["1f1e7-1f1ed-fe0f",1201],["1f1e7-1f1e9",1202],["1f1e7-1f1e9-fe0f",1202],["1f1e7-1f1e7",1203],["1f1e7-1f1e7-fe0f",1203],["1f1e7-1f1fe",1204],["1f1e7-1f1fe-fe0f",1204],["1f1e7-1f1ea",1205],["1f1e7-1f1ea-fe0f",1205],["1f1e7-1f1ff",1206],["1f1e7-1f1ff-fe0f",1206],["1f1e7-1f1ef",1207],["1f1e7-1f1ef-fe0f",1207],["1f1e7-1f1f2",1208],["1f1e7-1f1f2-fe0f",1208],["1f1e7-1f1f9",1209],["1f1e7-1f1f9-fe0f",1209],["1f1e7-1f1f4",1210],["1f1e7-1f1f4-fe0f",1210],["1f1e7-1f1f6",1211],["1f1e7-1f1f6-fe0f",1211],["1f1e7-1f1e6",1212],["1f1e7-1f1e6-fe0f",1212],["1f1e7-1f1fc",1213],["1f1e7-1f1fc-fe0f",1213],["1f1e7-1f1f7",1214],["1f1e7-1f1f7-fe0f",1214],["1f1ee-1f1f4",1215],["1f1ee-1f1f4-fe0f",1215],["1f1fb-1f1ec",1216],["1f1fb-1f1ec-fe0f",1216],["1f1e7-1f1f3",1217],["1f1e7-1f1f3-fe0f",1217],["1f1e7-1f1ec",1218],["1f1e7-1f1ec-fe0f",1218],["1f1e7-1f1eb",1219],["1f1e7-1f1eb-fe0f",1219],["1f1e7-1f1ee",1220],["1f1e7-1f1ee-fe0f",1220],["1f1e8-1f1fb",1221],["1f1e8-1f1fb-fe0f",1221],["1f1f0-1f1ed",1222],["1f1f0-1f1ed-fe0f",1222],["1f1e8-1f1f2",1223],["1f1e8-1f1f2-fe0f",1223],["1f1e8-1f1e6",1224],["1f1e8-1f1e6-fe0f",1224],["1f1ee-1f1e8",1225],["1f1ee-1f1e8-fe0f",1225],["1f1f0-1f1fe",1226],["1f1f0-1f1fe-fe0f",1226],["1f1e8-1f1eb",1227],["1f1e8-1f1eb-fe0f",1227],["1f1f9-1f1e9",1228],["1f1f9-1f1e9-fe0f",1228],["1f1e8-1f1f1",1229],["1f1e8-1f1f1-fe0f",1229],["1f1e8-1f1f3",1230],["1f1e8-1f1f3-fe0f",1230],["1f1e8-1f1fd",1231],["1f1e8-1f1fd-fe0f",1231],["1f1e8-1f1e8",1232],["1f1e8-1f1e8-fe0f",1232],["1f1e8-1f1f4",1233],["1f1e8-1f1f4-fe0f",1233],["1f1f0-1f1f2",1234],["1f1f0-1f1f2-fe0f",1234],["1f1e8-1f1ec",1235],["1f1e8-1f1ec-fe0f",1235],["1f1e8-1f1e9",1236],["1f1e8-1f1e9-fe0f",1236],["1f1e8-1f1f0",1237],["1f1e8-1f1f0-fe0f",1237],["1f1e8-1f1f7",1238],["1f1e8-1f1f7-fe0f",1238],["1f1e8-1f1ee",1239],["1f1e8-1f1ee-fe0f",1239],["1f1ed-1f1f7",1240],["1f1ed-1f1f7-fe0f",1240],["1f1e8-1f1fa",1241],["1f1e8-1f1fa-fe0f",1241],["1f1e8-1f1fc",1242],["1f1e8-1f1fc-fe0f",1242],["1f1e8-1f1fe",1243],["1f1e8-1f1fe-fe0f",1243],["1f1e8-1f1ff",1244],["1f1e8-1f1ff-fe0f",1244],["1f1e9-1f1f0",1245],["1f1e9-1f1f0-fe0f",1245],["1f1e9-1f1ef",1246],["1f1e9-1f1ef-fe0f",1246],["1f1e9-1f1f2",1247],["1f1e9-1f1f2-fe0f",1247],["1f1e9-1f1f4",1248],["1f1e9-1f1f4-fe0f",1248],["1f1ea-1f1e8",1249],["1f1ea-1f1e8-fe0f",1249],["1f1ea-1f1ec",1250],["1f1ea-1f1ec-fe0f",1250],["1f1f8-1f1fb",1251],["1f1f8-1f1fb-fe0f",1251],["1f1ec-1f1f6",1252],["1f1ec-1f1f6-fe0f",1252],["1f1ea-1f1f7",1253],["1f1ea-1f1f7-fe0f",1253],["1f1ea-1f1ea",1254],["1f1ea-1f1ea-fe0f",1254],["1f1ea-1f1f9",1255],["1f1ea-1f1f9-fe0f",1255],["1f1ea-1f1fa",1256],["1f1ea-1f1fa-fe0f",1256],["1f1eb-1f1f0",1257],["1f1eb-1f1f0-fe0f",1257],["1f1eb-1f1f4",1258],["1f1eb-1f1f4-fe0f",1258],["1f1eb-1f1ef",1259],["1f1eb-1f1ef-fe0f",1259],["1f1eb-1f1ee",1260],["1f1eb-1f1ee-fe0f",1260],["1f1eb-1f1f7",1261],["1f1eb-1f1f7-fe0f",1261],["1f1ec-1f1eb",1262],["1f1ec-1f1eb-fe0f",1262],["1f1f5-1f1eb",1263],["1f1f5-1f1eb-fe0f",1263],["1f1f9-1f1eb",1264],["1f1f9-1f1eb-fe0f",1264],["1f1ec-1f1e6",1265],["1f1ec-1f1e6-fe0f",1265],["1f1ec-1f1f2",1266],["1f1ec-1f1f2-fe0f",1266],["1f1ec-1f1ea",1267],["1f1ec-1f1ea-fe0f",1267],["1f1e9-1f1ea",1268],["1f1e9-1f1ea-fe0f",1268],["1f1ec-1f1ed",1269],["1f1ec-1f1ed-fe0f",1269],["1f1ec-1f1ee",1270],["1f1ec-1f1ee-fe0f",1270],["1f1ec-1f1f7",1271],["1f1ec-1f1f7-fe0f",1271],["1f1ec-1f1f1",1272],["1f1ec-1f1f1-fe0f",1272],["1f1ec-1f1e9",1273],["1f1ec-1f1e9-fe0f",1273],["1f1ec-1f1f5",1274],["1f1ec-1f1f5-fe0f",1274],["1f1ec-1f1fa",1275],["1f1ec-1f1fa-fe0f",1275],["1f1ec-1f1f9",1276],["1f1ec-1f1f9-fe0f",1276],["1f1ec-1f1ec",1277],["1f1ec-1f1ec-fe0f",1277],["1f1ec-1f1f3",1278],["1f1ec-1f1f3-fe0f",1278],["1f1ec-1f1fc",1279],["1f1ec-1f1fc-fe0f",1279],["1f1ec-1f1fe",1280],["1f1ec-1f1fe-fe0f",1280],["1f1ed-1f1f9",1281],["1f1ed-1f1f9-fe0f",1281],["1f1ed-1f1f3",1282],["1f1ed-1f1f3-fe0f",1282],["1f1ed-1f1f0",1283],["1f1ed-1f1f0-fe0f",1283],["1f1ed-1f1fa",1284],["1f1ed-1f1fa-fe0f",1284],["1f1ee-1f1f8",1285],["1f1ee-1f1f8-fe0f",1285],["1f1ee-1f1f3",1286],["1f1ee-1f1f3-fe0f",1286],["1f1ee-1f1e9",1287],["1f1ee-1f1e9-fe0f",1287],["1f1ee-1f1f7",1288],["1f1ee-1f1f7-fe0f",1288],["1f1ee-1f1f6",1289],["1f1ee-1f1f6-fe0f",1289],["1f1ee-1f1ea",1290],["1f1ee-1f1ea-fe0f",1290],["1f1ee-1f1f2",1291],["1f1ee-1f1f2-fe0f",1291],["1f1ee-1f1f1",1292],["1f1ee-1f1f1-fe0f",1292],["1f1ee-1f1f9",1293],["1f1ee-1f1f9-fe0f",1293],["1f1ef-1f1f2",1294],["1f1ef-1f1f2-fe0f",1294],["1f1ef-1f1f5",1295],["1f1ef-1f1f5-fe0f",1295],["1f38c",1296],["1f38c-fe0f",1296],["1f1ef-1f1ea",1297],["1f1ef-1f1ea-fe0f",1297],["1f1ef-1f1f4",1298],["1f1ef-1f1f4-fe0f",1298],["1f1f0-1f1ff",1299],["1f1f0-1f1ff-fe0f",1299],["1f1f0-1f1ea",1300],["1f1f0-1f1ea-fe0f",1300],["1f1f0-1f1ee",1301],["1f1f0-1f1ee-fe0f",1301],["1f1fd-1f1f0",1302],["1f1fd-1f1f0-fe0f",1302],["1f1f0-1f1fc",1303],["1f1f0-1f1fc-fe0f",1303],["1f1f0-1f1ec",1304],["1f1f0-1f1ec-fe0f",1304],["1f1f1-1f1e6",1305],["1f1f1-1f1e6-fe0f",1305],["1f1f1-1f1fb",1306],["1f1f1-1f1fb-fe0f",1306],["1f1f1-1f1e7",1307],["1f1f1-1f1e7-fe0f",1307],["1f1f1-1f1f8",1308],["1f1f1-1f1f8-fe0f",1308],["1f1f1-1f1f7",1309],["1f1f1-1f1f7-fe0f",1309],["1f1f1-1f1fe",1310],["1f1f1-1f1fe-fe0f",1310],["1f1f1-1f1ee",1311],["1f1f1-1f1ee-fe0f",1311],["1f1f1-1f1f9",1312],["1f1f1-1f1f9-fe0f",1312],["1f1f1-1f1fa",1313],["1f1f1-1f1fa-fe0f",1313],["1f1f2-1f1f4",1314],["1f1f2-1f1f4-fe0f",1314],["1f1f2-1f1f0",1315],["1f1f2-1f1f0-fe0f",1315],["1f1f2-1f1ec",1316],["1f1f2-1f1ec-fe0f",1316],["1f1f2-1f1fc",1317],["1f1f2-1f1fc-fe0f",1317],["1f1f2-1f1fe",1318],["1f1f2-1f1fe-fe0f",1318],["1f1f2-1f1fb",1319],["1f1f2-1f1fb-fe0f",1319],["1f1f2-1f1f1",1320],["1f1f2-1f1f1-fe0f",1320],["1f1f2-1f1f9",1321],["1f1f2-1f1f9-fe0f",1321],["1f1f2-1f1ed",1322],["1f1f2-1f1ed-fe0f",1322],["1f1f2-1f1f6",1323],["1f1f2-1f1f6-fe0f",1323],["1f1f2-1f1f7",1324],["1f1f2-1f1f7-fe0f",1324],["1f1f2-1f1fa",1325],["1f1f2-1f1fa-fe0f",1325],["1f1fe-1f1f9",1326],["1f1fe-1f1f9-fe0f",1326],["1f1f2-1f1fd",1327],["1f1f2-1f1fd-fe0f",1327],["1f1eb-1f1f2",1328],["1f1eb-1f1f2-fe0f",1328],["1f1f2-1f1e9",1329],["1f1f2-1f1e9-fe0f",1329],["1f1f2-1f1e8",1330],["1f1f2-1f1e8-fe0f",1330],["1f1f2-1f1f3",1331],["1f1f2-1f1f3-fe0f",1331],["1f1f2-1f1ea",1332],["1f1f2-1f1ea-fe0f",1332],["1f1f2-1f1f8",1333],["1f1f2-1f1f8-fe0f",1333],["1f1f2-1f1e6",1334],["1f1f2-1f1e6-fe0f",1334],["1f1f2-1f1ff",1335],["1f1f2-1f1ff-fe0f",1335],["1f1f2-1f1f2",1336],["1f1f2-1f1f2-fe0f",1336],["1f1f3-1f1e6",1337],["1f1f3-1f1e6-fe0f",1337],["1f1f3-1f1f7",1338],["1f1f3-1f1f7-fe0f",1338],["1f1f3-1f1f5",1339],["1f1f3-1f1f5-fe0f",1339],["1f1f3-1f1f1",1340],["1f1f3-1f1f1-fe0f",1340],["1f1f3-1f1e8",1341],["1f1f3-1f1e8-fe0f",1341],["1f1f3-1f1ff",1342],["1f1f3-1f1ff-fe0f",1342],["1f1f3-1f1ee",1343],["1f1f3-1f1ee-fe0f",1343],["1f1f3-1f1ea",1344],["1f1f3-1f1ea-fe0f",1344],["1f1f3-1f1ec",1345],["1f1f3-1f1ec-fe0f",1345],["1f1f3-1f1fa",1346],["1f1f3-1f1fa-fe0f",1346],["1f1f3-1f1eb",1347],["1f1f3-1f1eb-fe0f",1347],["1f1f2-1f1f5",1348],["1f1f2-1f1f5-fe0f",1348],["1f1f0-1f1f5",1349],["1f1f0-1f1f5-fe0f",1349],["1f1f3-1f1f4",1350],["1f1f3-1f1f4-fe0f",1350],["1f1f4-1f1f2",1351],["1f1f4-1f1f2-fe0f",1351],["1f1f5-1f1f0",1352],["1f1f5-1f1f0-fe0f",1352],["1f1f5-1f1fc",1353],["1f1f5-1f1fc-fe0f",1353],["1f1f5-1f1f8",1354],["1f1f5-1f1f8-fe0f",1354],["1f1f5-1f1e6",1355],["1f1f5-1f1e6-fe0f",1355],["1f1f5-1f1ec",1356],["1f1f5-1f1ec-fe0f",1356],["1f1f5-1f1fe",1357],["1f1f5-1f1fe-fe0f",1357],["1f1f5-1f1ea",1358],["1f1f5-1f1ea-fe0f",1358],["1f1f5-1f1ed",1359],["1f1f5-1f1ed-fe0f",1359],["1f1f5-1f1f3",1360],["1f1f5-1f1f3-fe0f",1360],["1f1f5-1f1f1",1361],["1f1f5-1f1f1-fe0f",1361],["1f1f5-1f1f9",1362],["1f1f5-1f1f9-fe0f",1362],["1f1f5-1f1f7",1363],["1f1f5-1f1f7-fe0f",1363],["1f1f6-1f1e6",1364],["1f1f6-1f1e6-fe0f",1364],["1f1f7-1f1ea",1365],["1f1f7-1f1ea-fe0f",1365],["1f1f7-1f1f4",1366],["1f1f7-1f1f4-fe0f",1366],["1f1f7-1f1fa",1367],["1f1f7-1f1fa-fe0f",1367],["1f1f7-1f1fc",1368],["1f1f7-1f1fc-fe0f",1368],["1f1e7-1f1f1",1369],["1f1e7-1f1f1-fe0f",1369],["1f1f8-1f1ed",1370],["1f1f8-1f1ed-fe0f",1370],["1f1f0-1f1f3",1371],["1f1f0-1f1f3-fe0f",1371],["1f1f1-1f1e8",1372],["1f1f1-1f1e8-fe0f",1372],["1f1f5-1f1f2",1373],["1f1f5-1f1f2-fe0f",1373],["1f1fb-1f1e8",1374],["1f1fb-1f1e8-fe0f",1374],["1f1fc-1f1f8",1375],["1f1fc-1f1f8-fe0f",1375],["1f1f8-1f1f2",1376],["1f1f8-1f1f2-fe0f",1376],["1f1f8-1f1f9",1377],["1f1f8-1f1f9-fe0f",1377],["1f1f8-1f1e6",1378],["1f1f8-1f1e6-fe0f",1378],["1f1f8-1f1f3",1379],["1f1f8-1f1f3-fe0f",1379],["1f1f7-1f1f8",1380],["1f1f7-1f1f8-fe0f",1380],["1f1f8-1f1e8",1381],["1f1f8-1f1e8-fe0f",1381],["1f1f8-1f1f1",1382],["1f1f8-1f1f1-fe0f",1382],["1f1f8-1f1ec",1383],["1f1f8-1f1ec-fe0f",1383],["1f1f8-1f1fd",1384],["1f1f8-1f1fd-fe0f",1384],["1f1f8-1f1f0",1385],["1f1f8-1f1f0-fe0f",1385],["1f1f8-1f1ee",1386],["1f1f8-1f1ee-fe0f",1386],["1f1f8-1f1e7",1387],["1f1f8-1f1e7-fe0f",1387],["1f1f8-1f1f4",1388],["1f1f8-1f1f4-fe0f",1388],["1f1ff-1f1e6",1389],["1f1ff-1f1e6-fe0f",1389],["1f1ec-1f1f8",1390],["1f1ec-1f1f8-fe0f",1390],["1f1f0-1f1f7",1391],["1f1f0-1f1f7-fe0f",1391],["1f1f8-1f1f8",1392],["1f1f8-1f1f8-fe0f",1392],["1f1ea-1f1f8",1393],["1f1ea-1f1f8-fe0f",1393],["1f1f1-1f1f0",1394],["1f1f1-1f1f0-fe0f",1394],["1f1f8-1f1e9",1395],["1f1f8-1f1e9-fe0f",1395],["1f1f8-1f1f7",1396],["1f1f8-1f1f7-fe0f",1396],["1f1f8-1f1ff",1397],["1f1f8-1f1ff-fe0f",1397],["1f1f8-1f1ea",1398],["1f1f8-1f1ea-fe0f",1398],["1f1e8-1f1ed",1399],["1f1e8-1f1ed-fe0f",1399],["1f1f8-1f1fe",1400],["1f1f8-1f1fe-fe0f",1400],["1f1f9-1f1fc",1401],["1f1f9-1f1fc-fe0f",1401],["1f1f9-1f1ef",1402],["1f1f9-1f1ef-fe0f",1402],["1f1f9-1f1ff",1403],["1f1f9-1f1ff-fe0f",1403],["1f1f9-1f1ed",1404],["1f1f9-1f1ed-fe0f",1404],["1f1f9-1f1f1",1405],["1f1f9-1f1f1-fe0f",1405],["1f1f9-1f1ec",1406],["1f1f9-1f1ec-fe0f",1406],["1f1f9-1f1f0",1407],["1f1f9-1f1f0-fe0f",1407],["1f1f9-1f1f4",1408],["1f1f9-1f1f4-fe0f",1408],["1f1f9-1f1f9",1409],["1f1f9-1f1f9-fe0f",1409],["1f1f9-1f1f3",1410],["1f1f9-1f1f3-fe0f",1410],["1f1f9-1f1f7",1411],["1f1f9-1f1f7-fe0f",1411],["1f1f9-1f1f2",1412],["1f1f9-1f1f2-fe0f",1412],["1f1f9-1f1e8",1413],["1f1f9-1f1e8-fe0f",1413],["1f1f9-1f1fb",1414],["1f1f9-1f1fb-fe0f",1414],["1f1fa-1f1ec",1415],["1f1fa-1f1ec-fe0f",1415],["1f1fa-1f1e6",1416],["1f1fa-1f1e6-fe0f",1416],["1f1e6-1f1ea",1417],["1f1e6-1f1ea-fe0f",1417],["1f1ec-1f1e7",1418],["1f1ec-1f1e7-fe0f",1418],["1f1fa-1f1f8",1419],["1f1fa-1f1f8-fe0f",1419],["1f1fb-1f1ee",1420],["1f1fb-1f1ee-fe0f",1420],["1f1fa-1f1fe",1421],["1f1fa-1f1fe-fe0f",1421],["1f1fa-1f1ff",1422],["1f1fa-1f1ff-fe0f",1422],["1f1fb-1f1fa",1423],["1f1fb-1f1fa-fe0f",1423],["1f1fb-1f1e6",1424],["1f1fb-1f1e6-fe0f",1424],["1f1fb-1f1ea",1425],["1f1fb-1f1ea-fe0f",1425],["1f1fb-1f1f3",1426],["1f1fb-1f1f3-fe0f",1426],["1f1fc-1f1eb",1427],["1f1fc-1f1eb-fe0f",1427],["1f1ea-1f1ed",1428],["1f1ea-1f1ed-fe0f",1428],["1f1fe-1f1ea",1429],["1f1fe-1f1ea-fe0f",1429],["1f1ff-1f1f2",1430],["1f1ff-1f1f2-fe0f",1430],["1f1ff-1f1fc",1431],["1f1ff-1f1fc-fe0f",1431]]); - -export const CategoryNames = ["people","nature","foods","activity","places","objects","symbols","flags","custom"]; - -export const EmojiIndicesByCategory = new Map([["people",[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290]],["nature",[291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449]],["foods",[450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535]],["activity",[536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615]],["places",[616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734]],["objects",[735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907]],["symbols",[908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178]],["flags",[1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,1279,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,1294,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,1370,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,1416,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431]],["custom",[1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447]]]); - -/* eslint-enable */ \ No newline at end of file diff --git a/webapp/utils/emoticons.jsx b/webapp/utils/emoticons.jsx deleted file mode 100644 index 8a10e254e..000000000 --- a/webapp/utils/emoticons.jsx +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import EmojiStore from 'stores/emoji_store.jsx'; - -export const emoticonPatterns = { - slightly_smiling_face: /(^|\s)(:-?\))(?=$|\s)/g, // :) - wink: /(^|\s)(;-?\))(?=$|\s)/g, // ;) - open_mouth: /(^|\s)(:o)(?=$|\s)/gi, // :o - scream: /(^|\s)(:-o)(?=$|\s)/gi, // :-o - smirk: /(^|\s)(:-?])(?=$|\s)/g, // :] - smile: /(^|\s)(:-?d)(?=$|\s)/gi, // :D - stuck_out_tongue_closed_eyes: /(^|\s)(x-d)(?=$|\s)/gi, // x-d - stuck_out_tongue: /(^|\s)(:-?p)(?=$|\s)/gi, // :p - rage: /(^|\s)(:-?[[@])(?=$|\s)/g, // :@ - slightly_frowning_face: /(^|\s)(:-?\()(?=$|\s)/g, // :( - cry: /(^|\s)(:['’]-?\(|:'\(|:'\()(?=$|\s)/g, // :`( - confused: /(^|\s)(:-?\/)(?=$|\s)/g, // :/ - confounded: /(^|\s)(:-?s)(?=$|\s)/gi, // :s - neutral_face: /(^|\s)(:-?\|)(?=$|\s)/g, // :| - flushed: /(^|\s)(:-?\$)(?=$|\s)/g, // :$ - mask: /(^|\s)(:-x)(?=$|\s)/gi, // :-x - heart: /(^|\s)(<3|<3)(?=$|\s)/g, // <3 - broken_heart: /(^|\s)(<\/3|</3)(?=$|\s)/g, // `, - originalText: fullMatch - }); - - return prefix + alias; - } - - return fullMatch; - } - - // match named emoticons like :goat: - output = output.replace(EMOJI_PATTERN, (fullMatch, matchText, name) => replaceEmoticonWithToken(fullMatch, '', matchText, name)); - - // match text smilies like :D - for (const name of Object.keys(emoticonPatterns)) { - const pattern = emoticonPatterns[name]; - - // this might look a bit funny, but since the name isn't contained in the actual match - // like with the named emoticons, we need to add it in manually - output = output.replace(pattern, (fullMatch, prefix, matchText) => replaceEmoticonWithToken(fullMatch, prefix, matchText, name)); - } - - return output; -} diff --git a/webapp/utils/event_types.jsx b/webapp/utils/event_types.jsx deleted file mode 100644 index 1d43f4290..000000000 --- a/webapp/utils/event_types.jsx +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import keyMirror from 'key-mirror'; - -export default keyMirror({ - POST_LIST_SCROLL_CHANGE: null -}); diff --git a/webapp/utils/file_utils.jsx b/webapp/utils/file_utils.jsx deleted file mode 100644 index 42feb11be..000000000 --- a/webapp/utils/file_utils.jsx +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import * as UserAgent from 'utils/user_agent'; - -export function canUploadFiles() { - if (window.mm_config.EnableFileAttachments === 'false') { - return false; - } - - if (UserAgent.isMobileApp() && window.mm_license.IsLicensed === 'true' && window.mm_license.Compliance === 'true') { - return window.mm_config.EnableMobileFileUpload !== 'false'; - } - - return true; -} - -export function canDownloadFiles() { - if (UserAgent.isMobileApp() && window.mm_license.IsLicensed === 'true' && window.mm_license.Compliance === 'true') { - return window.mm_config.EnableMobileFileDownload !== 'false'; - } - - return true; -} diff --git a/webapp/utils/global_event_emitter.jsx b/webapp/utils/global_event_emitter.jsx deleted file mode 100644 index 0d231d2a2..000000000 --- a/webapp/utils/global_event_emitter.jsx +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; -import EventEmitter from 'events'; - -import EventTypes from 'utils/event_types.jsx'; - -class GlobalEventEmitterClass extends EventEmitter { - constructor() { - super(); - this.dispatchToken = AppDispatcher.register(this.handleEventPayload); - } - - handleEventPayload = (payload) => { - const {type, value, ...args} = payload.action; //eslint-disable-line no-use-before-define - - switch (type) { - case EventTypes.POST_LIST_SCROLL_CHANGE: - this.emit(type, value, args); - break; - } - } -} - -const GlobalEventEmitter = new GlobalEventEmitterClass(); -export default GlobalEventEmitter; diff --git a/webapp/utils/latinise.jsx b/webapp/utils/latinise.jsx deleted file mode 100644 index 5c0059ff1..000000000 --- a/webapp/utils/latinise.jsx +++ /dev/null @@ -1,1003 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. -// Credit to http://semplicewebsites.com/removing-accents-javascript - -var latinMap = { - Á: 'A', // LATIN CAPITAL LETTER A WITH ACUTE - Ă: 'A', // LATIN CAPITAL LETTER A WITH BREVE - Ắ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND ACUTE - Ặ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW - Ằ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND GRAVE - Ẳ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE - Ẵ: 'A', // LATIN CAPITAL LETTER A WITH BREVE AND TILDE - Ǎ: 'A', // LATIN CAPITAL LETTER A WITH CARON - Â: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX - Ấ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE - Ậ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW - Ầ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE - Ẩ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE - Ẫ: 'A', // LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE - Ä: 'A', // LATIN CAPITAL LETTER A WITH DIAERESIS - Ǟ: 'A', // LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON - Ȧ: 'A', // LATIN CAPITAL LETTER A WITH DOT ABOVE - Ǡ: 'A', // LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON - Ạ: 'A', // LATIN CAPITAL LETTER A WITH DOT BELOW - Ȁ: 'A', // LATIN CAPITAL LETTER A WITH DOUBLE GRAVE - À: 'A', // LATIN CAPITAL LETTER A WITH GRAVE - Ả: 'A', // LATIN CAPITAL LETTER A WITH HOOK ABOVE - Ȃ: 'A', // LATIN CAPITAL LETTER A WITH INVERTED BREVE - Ā: 'A', // LATIN CAPITAL LETTER A WITH MACRON - Ą: 'A', // LATIN CAPITAL LETTER A WITH OGONEK - Å: 'A', // LATIN CAPITAL LETTER A WITH RING ABOVE - Ǻ: 'A', // LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE - Ḁ: 'A', // LATIN CAPITAL LETTER A WITH RING BELOW - Ⱥ: 'A', // LATIN CAPITAL LETTER A WITH STROKE - Ã: 'A', // LATIN CAPITAL LETTER A WITH TILDE - Ꜳ: 'AA', // LATIN CAPITAL LETTER AA - Æ: 'AE', // LATIN CAPITAL LETTER AE - Ǽ: 'AE', // LATIN CAPITAL LETTER AE WITH ACUTE - Ǣ: 'AE', // LATIN CAPITAL LETTER AE WITH MACRON - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER AFRICAN D' (Ɖ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ALPHA' (Ɑ) - Ꜵ: 'AO', // LATIN CAPITAL LETTER AO - Ꜷ: 'AU', // LATIN CAPITAL LETTER AU - Ꜹ: 'AV', // LATIN CAPITAL LETTER AV - Ꜻ: 'AV', // LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR - Ꜽ: 'AY', // LATIN CAPITAL LETTER AY - Ḃ: 'B', // LATIN CAPITAL LETTER B WITH DOT ABOVE - Ḅ: 'B', // LATIN CAPITAL LETTER B WITH DOT BELOW - Ɓ: 'B', // LATIN CAPITAL LETTER B WITH HOOK - Ḇ: 'B', // LATIN CAPITAL LETTER B WITH LINE BELOW - Ƀ: 'B', // LATIN CAPITAL LETTER B WITH STROKE - Ƃ: 'B', // LATIN CAPITAL LETTER B WITH TOPBAR - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER BROKEN L' (Ꝇ) - Ć: 'C', // LATIN CAPITAL LETTER C WITH ACUTE - Č: 'C', // LATIN CAPITAL LETTER C WITH CARON - Ç: 'C', // LATIN CAPITAL LETTER C WITH CEDILLA - Ḉ: 'C', // LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE - Ĉ: 'C', // LATIN CAPITAL LETTER C WITH CIRCUMFLEX - Ċ: 'C', // LATIN CAPITAL LETTER C WITH DOT ABOVE - Ƈ: 'C', // LATIN CAPITAL LETTER C WITH HOOK - Ȼ: 'C', // LATIN CAPITAL LETTER C WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CON' (Ꝯ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CUATRILLO' (Ꜭ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER CUATRILLO WITH COMMA' (Ꜯ) - Ď: 'D', // LATIN CAPITAL LETTER D WITH CARON - Ḑ: 'D', // LATIN CAPITAL LETTER D WITH CEDILLA - Ḓ: 'D', // LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW - Ḋ: 'D', // LATIN CAPITAL LETTER D WITH DOT ABOVE - Ḍ: 'D', // LATIN CAPITAL LETTER D WITH DOT BELOW - Ɗ: 'D', // LATIN CAPITAL LETTER D WITH HOOK - Ḏ: 'D', // LATIN CAPITAL LETTER D WITH LINE BELOW - Dz: 'D', // LATIN CAPITAL LETTER D WITH SMALL LETTER Z - Dž: 'D', // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON - Đ: 'D', // LATIN CAPITAL LETTER D WITH STROKE - Ƌ: 'D', // LATIN CAPITAL LETTER D WITH TOPBAR - DZ: 'DZ', // LATIN CAPITAL LETTER DZ - DŽ: 'DZ', // LATIN CAPITAL LETTER DZ WITH CARON - É: 'E', // LATIN CAPITAL LETTER E WITH ACUTE - Ĕ: 'E', // LATIN CAPITAL LETTER E WITH BREVE - Ě: 'E', // LATIN CAPITAL LETTER E WITH CARON - Ȩ: 'E', // LATIN CAPITAL LETTER E WITH CEDILLA - Ḝ: 'E', // LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE - Ê: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX - Ế: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE - Ệ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW - Ề: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE - Ể: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE - Ễ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE - Ḙ: 'E', // LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW - Ë: 'E', // LATIN CAPITAL LETTER E WITH DIAERESIS - Ė: 'E', // LATIN CAPITAL LETTER E WITH DOT ABOVE - Ẹ: 'E', // LATIN CAPITAL LETTER E WITH DOT BELOW - Ȅ: 'E', // LATIN CAPITAL LETTER E WITH DOUBLE GRAVE - È: 'E', // LATIN CAPITAL LETTER E WITH GRAVE - Ẻ: 'E', // LATIN CAPITAL LETTER E WITH HOOK ABOVE - Ȇ: 'E', // LATIN CAPITAL LETTER E WITH INVERTED BREVE - Ē: 'E', // LATIN CAPITAL LETTER E WITH MACRON - Ḗ: 'E', // LATIN CAPITAL LETTER E WITH MACRON AND ACUTE - Ḕ: 'E', // LATIN CAPITAL LETTER E WITH MACRON AND GRAVE - Ę: 'E', // LATIN CAPITAL LETTER E WITH OGONEK - Ɇ: 'E', // LATIN CAPITAL LETTER E WITH STROKE - Ẽ: 'E', // LATIN CAPITAL LETTER E WITH TILDE - Ḛ: 'E', // LATIN CAPITAL LETTER E WITH TILDE BELOW - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EGYPTOLOGICAL AIN' (Ꜥ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF' (Ꜣ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ENG' (Ŋ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ESH' (Ʃ) - Ꝫ: 'ET', // LATIN CAPITAL LETTER ET - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER ETH' (Ð) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH' (Ʒ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH REVERSED' (Ƹ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER EZH WITH CARON' (Ǯ) - Ḟ: 'F', // LATIN CAPITAL LETTER F WITH DOT ABOVE - Ƒ: 'F', // LATIN CAPITAL LETTER F WITH HOOK - Ǵ: 'G', // LATIN CAPITAL LETTER G WITH ACUTE - Ğ: 'G', // LATIN CAPITAL LETTER G WITH BREVE - Ǧ: 'G', // LATIN CAPITAL LETTER G WITH CARON - Ģ: 'G', // LATIN CAPITAL LETTER G WITH CEDILLA - Ĝ: 'G', // LATIN CAPITAL LETTER G WITH CIRCUMFLEX - Ġ: 'G', // LATIN CAPITAL LETTER G WITH DOT ABOVE - Ɠ: 'G', // LATIN CAPITAL LETTER G WITH HOOK - Ḡ: 'G', // LATIN CAPITAL LETTER G WITH MACRON - Ǥ: 'G', // LATIN CAPITAL LETTER G WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER GAMMA' (Ɣ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER GLOTTAL STOP' (Ɂ) - Ḫ: 'H', // LATIN CAPITAL LETTER H WITH BREVE BELOW - Ȟ: 'H', // LATIN CAPITAL LETTER H WITH CARON - Ḩ: 'H', // LATIN CAPITAL LETTER H WITH CEDILLA - Ĥ: 'H', // LATIN CAPITAL LETTER H WITH CIRCUMFLEX - Ⱨ: 'H', // LATIN CAPITAL LETTER H WITH DESCENDER - Ḧ: 'H', // LATIN CAPITAL LETTER H WITH DIAERESIS - Ḣ: 'H', // LATIN CAPITAL LETTER H WITH DOT ABOVE - Ḥ: 'H', // LATIN CAPITAL LETTER H WITH DOT BELOW - Ħ: 'H', // LATIN CAPITAL LETTER H WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HALF H' (Ⱶ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HENG' (Ꜧ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER HWAIR' (Ƕ) - Í: 'I', // LATIN CAPITAL LETTER I WITH ACUTE - Ĭ: 'I', // LATIN CAPITAL LETTER I WITH BREVE - Ǐ: 'I', // LATIN CAPITAL LETTER I WITH CARON - Î: 'I', // LATIN CAPITAL LETTER I WITH CIRCUMFLEX - Ï: 'I', // LATIN CAPITAL LETTER I WITH DIAERESIS - Ḯ: 'I', // LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE - İ: 'I', // LATIN CAPITAL LETTER I WITH DOT ABOVE - Ị: 'I', // LATIN CAPITAL LETTER I WITH DOT BELOW - Ȉ: 'I', // LATIN CAPITAL LETTER I WITH DOUBLE GRAVE - Ì: 'I', // LATIN CAPITAL LETTER I WITH GRAVE - Ỉ: 'I', // LATIN CAPITAL LETTER I WITH HOOK ABOVE - Ȋ: 'I', // LATIN CAPITAL LETTER I WITH INVERTED BREVE - Ī: 'I', // LATIN CAPITAL LETTER I WITH MACRON - Į: 'I', // LATIN CAPITAL LETTER I WITH OGONEK - Ɨ: 'I', // LATIN CAPITAL LETTER I WITH STROKE - Ĩ: 'I', // LATIN CAPITAL LETTER I WITH TILDE - Ḭ: 'I', // LATIN CAPITAL LETTER I WITH TILDE BELOW - Ꝺ: 'D', // LATIN CAPITAL LETTER INSULAR D - Ꝼ: 'F', // LATIN CAPITAL LETTER INSULAR F - Ᵹ: 'G', // LATIN CAPITAL LETTER INSULAR G - Ꞃ: 'R', // LATIN CAPITAL LETTER INSULAR R - Ꞅ: 'S', // LATIN CAPITAL LETTER INSULAR S - Ꞇ: 'T', // LATIN CAPITAL LETTER INSULAR T - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER IOTA' (Ɩ) - Ꝭ: 'IS', // LATIN CAPITAL LETTER IS - Ĵ: 'J', // LATIN CAPITAL LETTER J WITH CIRCUMFLEX - Ɉ: 'J', // LATIN CAPITAL LETTER J WITH STROKE - Ḱ: 'K', // LATIN CAPITAL LETTER K WITH ACUTE - Ǩ: 'K', // LATIN CAPITAL LETTER K WITH CARON - Ķ: 'K', // LATIN CAPITAL LETTER K WITH CEDILLA - Ⱪ: 'K', // LATIN CAPITAL LETTER K WITH DESCENDER - Ꝃ: 'K', // LATIN CAPITAL LETTER K WITH DIAGONAL STROKE - Ḳ: 'K', // LATIN CAPITAL LETTER K WITH DOT BELOW - Ƙ: 'K', // LATIN CAPITAL LETTER K WITH HOOK - Ḵ: 'K', // LATIN CAPITAL LETTER K WITH LINE BELOW - Ꝁ: 'K', // LATIN CAPITAL LETTER K WITH STROKE - Ꝅ: 'K', // LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE - Ĺ: 'L', // LATIN CAPITAL LETTER L WITH ACUTE - Ƚ: 'L', // LATIN CAPITAL LETTER L WITH BAR - Ľ: 'L', // LATIN CAPITAL LETTER L WITH CARON - Ļ: 'L', // LATIN CAPITAL LETTER L WITH CEDILLA - Ḽ: 'L', // LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW - Ḷ: 'L', // LATIN CAPITAL LETTER L WITH DOT BELOW - Ḹ: 'L', // LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON - Ⱡ: 'L', // LATIN CAPITAL LETTER L WITH DOUBLE BAR - Ꝉ: 'L', // LATIN CAPITAL LETTER L WITH HIGH STROKE - Ḻ: 'L', // LATIN CAPITAL LETTER L WITH LINE BELOW - Ŀ: 'L', // LATIN CAPITAL LETTER L WITH MIDDLE DOT - Ɫ: 'L', // LATIN CAPITAL LETTER L WITH MIDDLE TILDE - Lj: 'L', // LATIN CAPITAL LETTER L WITH SMALL LETTER J - Ł: 'L', // LATIN CAPITAL LETTER L WITH STROKE - LJ: 'LJ', // LATIN CAPITAL LETTER LJ - Ḿ: 'M', // LATIN CAPITAL LETTER M WITH ACUTE - Ṁ: 'M', // LATIN CAPITAL LETTER M WITH DOT ABOVE - Ṃ: 'M', // LATIN CAPITAL LETTER M WITH DOT BELOW - Ɱ: 'M', // LATIN CAPITAL LETTER M WITH HOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER MIDDLE-WELSH LL' (Ỻ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER MIDDLE-WELSH V' (Ỽ) - Ń: 'N', // LATIN CAPITAL LETTER N WITH ACUTE - Ň: 'N', // LATIN CAPITAL LETTER N WITH CARON - Ņ: 'N', // LATIN CAPITAL LETTER N WITH CEDILLA - Ṋ: 'N', // LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW - Ṅ: 'N', // LATIN CAPITAL LETTER N WITH DOT ABOVE - Ṇ: 'N', // LATIN CAPITAL LETTER N WITH DOT BELOW - Ǹ: 'N', // LATIN CAPITAL LETTER N WITH GRAVE - Ɲ: 'N', // LATIN CAPITAL LETTER N WITH LEFT HOOK - Ṉ: 'N', // LATIN CAPITAL LETTER N WITH LINE BELOW - Ƞ: 'N', // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG - Nj: 'N', // LATIN CAPITAL LETTER N WITH SMALL LETTER J - Ñ: 'N', // LATIN CAPITAL LETTER N WITH TILDE - NJ: 'NJ', // LATIN CAPITAL LETTER NJ - Ó: 'O', // LATIN CAPITAL LETTER O WITH ACUTE - Ŏ: 'O', // LATIN CAPITAL LETTER O WITH BREVE - Ǒ: 'O', // LATIN CAPITAL LETTER O WITH CARON - Ô: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX - Ố: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE - Ộ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW - Ồ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE - Ổ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE - Ỗ: 'O', // LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE - Ö: 'O', // LATIN CAPITAL LETTER O WITH DIAERESIS - Ȫ: 'O', // LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON - Ȯ: 'O', // LATIN CAPITAL LETTER O WITH DOT ABOVE - Ȱ: 'O', // LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON - Ọ: 'O', // LATIN CAPITAL LETTER O WITH DOT BELOW - Ő: 'O', // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE - Ȍ: 'O', // LATIN CAPITAL LETTER O WITH DOUBLE GRAVE - Ò: 'O', // LATIN CAPITAL LETTER O WITH GRAVE - Ỏ: 'O', // LATIN CAPITAL LETTER O WITH HOOK ABOVE - Ơ: 'O', // LATIN CAPITAL LETTER O WITH HORN - Ớ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND ACUTE - Ợ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW - Ờ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND GRAVE - Ở: 'O', // LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE - Ỡ: 'O', // LATIN CAPITAL LETTER O WITH HORN AND TILDE - Ȏ: 'O', // LATIN CAPITAL LETTER O WITH INVERTED BREVE - Ꝋ: 'O', // LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY - Ꝍ: 'O', // LATIN CAPITAL LETTER O WITH LOOP - Ō: 'O', // LATIN CAPITAL LETTER O WITH MACRON - Ṓ: 'O', // LATIN CAPITAL LETTER O WITH MACRON AND ACUTE - Ṑ: 'O', // LATIN CAPITAL LETTER O WITH MACRON AND GRAVE - Ɵ: 'O', // LATIN CAPITAL LETTER O WITH MIDDLE TILDE - Ǫ: 'O', // LATIN CAPITAL LETTER O WITH OGONEK - Ǭ: 'O', // LATIN CAPITAL LETTER O WITH OGONEK AND MACRON - Ø: 'O', // LATIN CAPITAL LETTER O WITH STROKE - Ǿ: 'O', // LATIN CAPITAL LETTER O WITH STROKE AND ACUTE - Õ: 'O', // LATIN CAPITAL LETTER O WITH TILDE - Ṍ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND ACUTE - Ṏ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS - Ȭ: 'O', // LATIN CAPITAL LETTER O WITH TILDE AND MACRON - Ƣ: 'OI', // LATIN CAPITAL LETTER OI - Ꝏ: 'OO', // LATIN CAPITAL LETTER OO - Ɛ: 'E', // LATIN CAPITAL LETTER OPEN E - Ɔ: 'O', // LATIN CAPITAL LETTER OPEN O - Ȣ: 'OU', // LATIN CAPITAL LETTER OU - Ṕ: 'P', // LATIN CAPITAL LETTER P WITH ACUTE - Ṗ: 'P', // LATIN CAPITAL LETTER P WITH DOT ABOVE - Ꝓ: 'P', // LATIN CAPITAL LETTER P WITH FLOURISH - Ƥ: 'P', // LATIN CAPITAL LETTER P WITH HOOK - Ꝕ: 'P', // LATIN CAPITAL LETTER P WITH SQUIRREL TAIL - Ᵽ: 'P', // LATIN CAPITAL LETTER P WITH STROKE - Ꝑ: 'P', // LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER - Ꝙ: 'Q', // LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE - Ꝗ: 'Q', // LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER R ROTUNDA' (Ꝛ) - Ŕ: 'R', // LATIN CAPITAL LETTER R WITH ACUTE - Ř: 'R', // LATIN CAPITAL LETTER R WITH CARON - Ŗ: 'R', // LATIN CAPITAL LETTER R WITH CEDILLA - Ṙ: 'R', // LATIN CAPITAL LETTER R WITH DOT ABOVE - Ṛ: 'R', // LATIN CAPITAL LETTER R WITH DOT BELOW - Ṝ: 'R', // LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON - Ȑ: 'R', // LATIN CAPITAL LETTER R WITH DOUBLE GRAVE - Ȓ: 'R', // LATIN CAPITAL LETTER R WITH INVERTED BREVE - Ṟ: 'R', // LATIN CAPITAL LETTER R WITH LINE BELOW - Ɍ: 'R', // LATIN CAPITAL LETTER R WITH STROKE - Ɽ: 'R', // LATIN CAPITAL LETTER R WITH TAIL - Ꜿ: 'C', // LATIN CAPITAL LETTER REVERSED C WITH DOT - Ǝ: 'E', // LATIN CAPITAL LETTER REVERSED E - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER RUM ROTUNDA' (Ꝝ) - Ś: 'S', // LATIN CAPITAL LETTER S WITH ACUTE - Ṥ: 'S', // LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE - Š: 'S', // LATIN CAPITAL LETTER S WITH CARON - Ṧ: 'S', // LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE - Ş: 'S', // LATIN CAPITAL LETTER S WITH CEDILLA - Ŝ: 'S', // LATIN CAPITAL LETTER S WITH CIRCUMFLEX - Ș: 'S', // LATIN CAPITAL LETTER S WITH COMMA BELOW - Ṡ: 'S', // LATIN CAPITAL LETTER S WITH DOT ABOVE - Ṣ: 'S', // LATIN CAPITAL LETTER S WITH DOT BELOW - Ṩ: 'S', // LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SALTILLO' (Ꞌ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SCHWA' (Ə) - ẞ: 'SS', // LATIN CAPITAL LETTER SHARP S - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL' (Ɋ) - Ť: 'T', // LATIN CAPITAL LETTER T WITH CARON - Ţ: 'T', // LATIN CAPITAL LETTER T WITH CEDILLA - Ṱ: 'T', // LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW - Ț: 'T', // LATIN CAPITAL LETTER T WITH COMMA BELOW - Ⱦ: 'T', // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE - Ṫ: 'T', // LATIN CAPITAL LETTER T WITH DOT ABOVE - Ṭ: 'T', // LATIN CAPITAL LETTER T WITH DOT BELOW - Ƭ: 'T', // LATIN CAPITAL LETTER T WITH HOOK - Ṯ: 'T', // LATIN CAPITAL LETTER T WITH LINE BELOW - Ʈ: 'T', // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK - Ŧ: 'T', // LATIN CAPITAL LETTER T WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN' (Þ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN WITH STROKE' (Ꝥ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER' (Ꝧ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE FIVE' (Ƽ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE SIX' (Ƅ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TONE TWO' (Ƨ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TRESILLO' (Ꜫ) - Ɐ: 'A', // LATIN CAPITAL LETTER TURNED A - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER TURNED INSULAR G' (Ꝿ) - Ꞁ: 'L', // LATIN CAPITAL LETTER TURNED L - Ɯ: 'M', // LATIN CAPITAL LETTER TURNED M - Ʌ: 'V', // LATIN CAPITAL LETTER TURNED V - Ꜩ: 'TZ', // LATIN CAPITAL LETTER TZ - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER U BAR' (Ʉ) - Ú: 'U', // LATIN CAPITAL LETTER U WITH ACUTE - Ŭ: 'U', // LATIN CAPITAL LETTER U WITH BREVE - Ǔ: 'U', // LATIN CAPITAL LETTER U WITH CARON - Û: 'U', // LATIN CAPITAL LETTER U WITH CIRCUMFLEX - Ṷ: 'U', // LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW - Ü: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS - Ǘ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE - Ǚ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON - Ǜ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE - Ǖ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON - Ṳ: 'U', // LATIN CAPITAL LETTER U WITH DIAERESIS BELOW - Ụ: 'U', // LATIN CAPITAL LETTER U WITH DOT BELOW - Ű: 'U', // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE - Ȕ: 'U', // LATIN CAPITAL LETTER U WITH DOUBLE GRAVE - Ù: 'U', // LATIN CAPITAL LETTER U WITH GRAVE - Ủ: 'U', // LATIN CAPITAL LETTER U WITH HOOK ABOVE - Ư: 'U', // LATIN CAPITAL LETTER U WITH HORN - Ứ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND ACUTE - Ự: 'U', // LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW - Ừ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND GRAVE - Ử: 'U', // LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE - Ữ: 'U', // LATIN CAPITAL LETTER U WITH HORN AND TILDE - Ȗ: 'U', // LATIN CAPITAL LETTER U WITH INVERTED BREVE - Ū: 'U', // LATIN CAPITAL LETTER U WITH MACRON - Ṻ: 'U', // LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS - Ų: 'U', // LATIN CAPITAL LETTER U WITH OGONEK - Ů: 'U', // LATIN CAPITAL LETTER U WITH RING ABOVE - Ũ: 'U', // LATIN CAPITAL LETTER U WITH TILDE - Ṹ: 'U', // LATIN CAPITAL LETTER U WITH TILDE AND ACUTE - Ṵ: 'U', // LATIN CAPITAL LETTER U WITH TILDE BELOW - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER UPSILON' (Ʊ) - Ꝟ: 'V', // LATIN CAPITAL LETTER V WITH DIAGONAL STROKE - Ṿ: 'V', // LATIN CAPITAL LETTER V WITH DOT BELOW - Ʋ: 'V', // LATIN CAPITAL LETTER V WITH HOOK - Ṽ: 'V', // LATIN CAPITAL LETTER V WITH TILDE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER VEND' (Ꝩ) - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER VISIGOTHIC Z' (Ꝣ) - Ꝡ: 'VY', // LATIN CAPITAL LETTER VY - Ẃ: 'W', // LATIN CAPITAL LETTER W WITH ACUTE - Ŵ: 'W', // LATIN CAPITAL LETTER W WITH CIRCUMFLEX - Ẅ: 'W', // LATIN CAPITAL LETTER W WITH DIAERESIS - Ẇ: 'W', // LATIN CAPITAL LETTER W WITH DOT ABOVE - Ẉ: 'W', // LATIN CAPITAL LETTER W WITH DOT BELOW - Ẁ: 'W', // LATIN CAPITAL LETTER W WITH GRAVE - Ⱳ: 'W', // LATIN CAPITAL LETTER W WITH HOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER WYNN' (Ƿ) - Ẍ: 'X', // LATIN CAPITAL LETTER X WITH DIAERESIS - Ẋ: 'X', // LATIN CAPITAL LETTER X WITH DOT ABOVE - Ý: 'Y', // LATIN CAPITAL LETTER Y WITH ACUTE - Ŷ: 'Y', // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX - Ÿ: 'Y', // LATIN CAPITAL LETTER Y WITH DIAERESIS - Ẏ: 'Y', // LATIN CAPITAL LETTER Y WITH DOT ABOVE - Ỵ: 'Y', // LATIN CAPITAL LETTER Y WITH DOT BELOW - Ỳ: 'Y', // LATIN CAPITAL LETTER Y WITH GRAVE - Ƴ: 'Y', // LATIN CAPITAL LETTER Y WITH HOOK - Ỷ: 'Y', // LATIN CAPITAL LETTER Y WITH HOOK ABOVE - Ỿ: 'Y', // LATIN CAPITAL LETTER Y WITH LOOP - Ȳ: 'Y', // LATIN CAPITAL LETTER Y WITH MACRON - Ɏ: 'Y', // LATIN CAPITAL LETTER Y WITH STROKE - Ỹ: 'Y', // LATIN CAPITAL LETTER Y WITH TILDE - // CANNOT FIND APPROXIMATION FOR 'LATIN CAPITAL LETTER YOGH' (Ȝ) - Ź: 'Z', // LATIN CAPITAL LETTER Z WITH ACUTE - Ž: 'Z', // LATIN CAPITAL LETTER Z WITH CARON - Ẑ: 'Z', // LATIN CAPITAL LETTER Z WITH CIRCUMFLEX - Ⱬ: 'Z', // LATIN CAPITAL LETTER Z WITH DESCENDER - Ż: 'Z', // LATIN CAPITAL LETTER Z WITH DOT ABOVE - Ẓ: 'Z', // LATIN CAPITAL LETTER Z WITH DOT BELOW - Ȥ: 'Z', // LATIN CAPITAL LETTER Z WITH HOOK - Ẕ: 'Z', // LATIN CAPITAL LETTER Z WITH LINE BELOW - Ƶ: 'Z', // LATIN CAPITAL LETTER Z WITH STROKE - IJ: 'IJ', // LATIN CAPITAL LIGATURE IJ - Œ: 'OE', // LATIN CAPITAL LIGATURE OE - // CANNOT FIND APPROXIMATION FOR 'LATIN CROSS' (✝) - // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER ARCHAIC M' (ꟿ) - // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER I LONGA' (ꟾ) - // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER INVERTED M' (ꟽ) - // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER REVERSED F' (ꟻ) - // CANNOT FIND APPROXIMATION FOR 'LATIN EPIGRAPHIC LETTER REVERSED P' (ꟼ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER AIN' (ᴥ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER ALVEOLAR CLICK' (ǂ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BIDENTAL PERCUSSIVE' (ʭ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BILABIAL CLICK' (ʘ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER BILABIAL PERCUSSIVE' (ʬ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER DENTAL CLICK' (ǀ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER GLOTTAL STOP' (ʔ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER GLOTTAL STOP WITH STROKE' (ʡ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER INVERTED GLOTTAL STOP' (ʖ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE' (ƾ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER LATERAL CLICK' (ǁ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER PHARYNGEAL VOICED FRICATIVE' (ʕ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER RETROFLEX CLICK' (ǃ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER REVERSED ESH LOOP' (ƪ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE' (ʢ) - ᴀ: 'A', // LATIN LETTER SMALL CAPITAL A - ᴁ: 'AE', // LATIN LETTER SMALL CAPITAL AE - ʙ: 'B', // LATIN LETTER SMALL CAPITAL B - ᴃ: 'B', // LATIN LETTER SMALL CAPITAL BARRED B - ᴄ: 'C', // LATIN LETTER SMALL CAPITAL C - ᴅ: 'D', // LATIN LETTER SMALL CAPITAL D - ᴇ: 'E', // LATIN LETTER SMALL CAPITAL E - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL ETH' (ᴆ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL EZH' (ᴣ) - ꜰ: 'F', // LATIN LETTER SMALL CAPITAL F - ɢ: 'G', // LATIN LETTER SMALL CAPITAL G - ʛ: 'G', // LATIN LETTER SMALL CAPITAL G WITH HOOK - ʜ: 'H', // LATIN LETTER SMALL CAPITAL H - ɪ: 'I', // LATIN LETTER SMALL CAPITAL I - ʁ: 'R', // LATIN LETTER SMALL CAPITAL INVERTED R - ᴊ: 'J', // LATIN LETTER SMALL CAPITAL J - ᴋ: 'K', // LATIN LETTER SMALL CAPITAL K - ʟ: 'L', // LATIN LETTER SMALL CAPITAL L - ᴌ: 'L', // LATIN LETTER SMALL CAPITAL L WITH STROKE - ᴍ: 'M', // LATIN LETTER SMALL CAPITAL M - ɴ: 'N', // LATIN LETTER SMALL CAPITAL N - ᴏ: 'O', // LATIN LETTER SMALL CAPITAL O - ɶ: 'OE', // LATIN LETTER SMALL CAPITAL OE - ᴐ: 'O', // LATIN LETTER SMALL CAPITAL OPEN O - ᴕ: 'OU', // LATIN LETTER SMALL CAPITAL OU - ᴘ: 'P', // LATIN LETTER SMALL CAPITAL P - ʀ: 'R', // LATIN LETTER SMALL CAPITAL R - ᴎ: 'N', // LATIN LETTER SMALL CAPITAL REVERSED N - ᴙ: 'R', // LATIN LETTER SMALL CAPITAL REVERSED R - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER SMALL CAPITAL RUM' (ꝶ) - ꜱ: 'S', // LATIN LETTER SMALL CAPITAL S - ᴛ: 'T', // LATIN LETTER SMALL CAPITAL T - ⱻ: 'E', // LATIN LETTER SMALL CAPITAL TURNED E - ᴚ: 'R', // LATIN LETTER SMALL CAPITAL TURNED R - ᴜ: 'U', // LATIN LETTER SMALL CAPITAL U - ᴠ: 'V', // LATIN LETTER SMALL CAPITAL V - ᴡ: 'W', // LATIN LETTER SMALL CAPITAL W - ʏ: 'Y', // LATIN LETTER SMALL CAPITAL Y - ᴢ: 'Z', // LATIN LETTER SMALL CAPITAL Z - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER STRETCHED C' (ʗ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER TWO WITH STROKE' (ƻ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER VOICED LARYNGEAL SPIRANT' (ᴤ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER WYNN' (ƿ) - // CANNOT FIND APPROXIMATION FOR 'LATIN LETTER YR' (Ʀ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL CAPITAL LETTER I WITH STROKE' (ᵻ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL CAPITAL LETTER U WITH STROKE' (ᵾ) - á: 'a', // LATIN SMALL LETTER A WITH ACUTE - ă: 'a', // LATIN SMALL LETTER A WITH BREVE - ắ: 'a', // LATIN SMALL LETTER A WITH BREVE AND ACUTE - ặ: 'a', // LATIN SMALL LETTER A WITH BREVE AND DOT BELOW - ằ: 'a', // LATIN SMALL LETTER A WITH BREVE AND GRAVE - ẳ: 'a', // LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE - ẵ: 'a', // LATIN SMALL LETTER A WITH BREVE AND TILDE - ǎ: 'a', // LATIN SMALL LETTER A WITH CARON - â: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX - ấ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE - ậ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW - ầ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE - ẩ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE - ẫ: 'a', // LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE - ä: 'a', // LATIN SMALL LETTER A WITH DIAERESIS - ǟ: 'a', // LATIN SMALL LETTER A WITH DIAERESIS AND MACRON - ȧ: 'a', // LATIN SMALL LETTER A WITH DOT ABOVE - ǡ: 'a', // LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON - ạ: 'a', // LATIN SMALL LETTER A WITH DOT BELOW - ȁ: 'a', // LATIN SMALL LETTER A WITH DOUBLE GRAVE - à: 'a', // LATIN SMALL LETTER A WITH GRAVE - ả: 'a', // LATIN SMALL LETTER A WITH HOOK ABOVE - ȃ: 'a', // LATIN SMALL LETTER A WITH INVERTED BREVE - ā: 'a', // LATIN SMALL LETTER A WITH MACRON - ą: 'a', // LATIN SMALL LETTER A WITH OGONEK - ᶏ: 'a', // LATIN SMALL LETTER A WITH RETROFLEX HOOK - ẚ: 'a', // LATIN SMALL LETTER A WITH RIGHT HALF RING - å: 'a', // LATIN SMALL LETTER A WITH RING ABOVE - ǻ: 'a', // LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE - ḁ: 'a', // LATIN SMALL LETTER A WITH RING BELOW - ⱥ: 'a', // LATIN SMALL LETTER A WITH STROKE - ã: 'a', // LATIN SMALL LETTER A WITH TILDE - ꜳ: 'aa', // LATIN SMALL LETTER AA - æ: 'ae', // LATIN SMALL LETTER AE - ǽ: 'ae', // LATIN SMALL LETTER AE WITH ACUTE - ǣ: 'ae', // LATIN SMALL LETTER AE WITH MACRON - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ALPHA' (ɑ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK' (ᶐ) - ꜵ: 'ao', // LATIN SMALL LETTER AO - ꜷ: 'au', // LATIN SMALL LETTER AU - ꜹ: 'av', // LATIN SMALL LETTER AV - ꜻ: 'av', // LATIN SMALL LETTER AV WITH HORIZONTAL BAR - ꜽ: 'ay', // LATIN SMALL LETTER AY - ḃ: 'b', // LATIN SMALL LETTER B WITH DOT ABOVE - ḅ: 'b', // LATIN SMALL LETTER B WITH DOT BELOW - ɓ: 'b', // LATIN SMALL LETTER B WITH HOOK - ḇ: 'b', // LATIN SMALL LETTER B WITH LINE BELOW - ᵬ: 'b', // LATIN SMALL LETTER B WITH MIDDLE TILDE - ᶀ: 'b', // LATIN SMALL LETTER B WITH PALATAL HOOK - ƀ: 'b', // LATIN SMALL LETTER B WITH STROKE - ƃ: 'b', // LATIN SMALL LETTER B WITH TOPBAR - ɵ: 'o', // LATIN SMALL LETTER BARRED O - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER BOTTOM HALF O' (ᴗ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER BROKEN L' (ꝇ) - ć: 'c', // LATIN SMALL LETTER C WITH ACUTE - č: 'c', // LATIN SMALL LETTER C WITH CARON - ç: 'c', // LATIN SMALL LETTER C WITH CEDILLA - ḉ: 'c', // LATIN SMALL LETTER C WITH CEDILLA AND ACUTE - ĉ: 'c', // LATIN SMALL LETTER C WITH CIRCUMFLEX - ɕ: 'c', // LATIN SMALL LETTER C WITH CURL - ċ: 'c', // LATIN SMALL LETTER C WITH DOT ABOVE - ƈ: 'c', // LATIN SMALL LETTER C WITH HOOK - ȼ: 'c', // LATIN SMALL LETTER C WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED OMEGA' (ɷ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED OPEN E' (ʚ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CLOSED REVERSED OPEN E' (ɞ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CON' (ꝯ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CUATRILLO' (ꜭ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER CUATRILLO WITH COMMA' (ꜯ) - ď: 'd', // LATIN SMALL LETTER D WITH CARON - ḑ: 'd', // LATIN SMALL LETTER D WITH CEDILLA - ḓ: 'd', // LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW - ȡ: 'd', // LATIN SMALL LETTER D WITH CURL - ḋ: 'd', // LATIN SMALL LETTER D WITH DOT ABOVE - ḍ: 'd', // LATIN SMALL LETTER D WITH DOT BELOW - ɗ: 'd', // LATIN SMALL LETTER D WITH HOOK - ᶑ: 'd', // LATIN SMALL LETTER D WITH HOOK AND TAIL - ḏ: 'd', // LATIN SMALL LETTER D WITH LINE BELOW - ᵭ: 'd', // LATIN SMALL LETTER D WITH MIDDLE TILDE - ᶁ: 'd', // LATIN SMALL LETTER D WITH PALATAL HOOK - đ: 'd', // LATIN SMALL LETTER D WITH STROKE - ɖ: 'd', // LATIN SMALL LETTER D WITH TAIL - ƌ: 'd', // LATIN SMALL LETTER D WITH TOPBAR - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DB DIGRAPH' (ȸ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DELTA' (ẟ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DEZH DIGRAPH' (ʤ) - ı: 'i', // LATIN SMALL LETTER DOTLESS I - ȷ: 'j', // LATIN SMALL LETTER DOTLESS J - ɟ: 'j', // LATIN SMALL LETTER DOTLESS J WITH STROKE - ʄ: 'j', // LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DUM' (ꝱ) - dz: 'dz', // LATIN SMALL LETTER DZ - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DZ DIGRAPH' (ʣ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER DZ DIGRAPH WITH CURL' (ʥ) - dž: 'dz', // LATIN SMALL LETTER DZ WITH CARON - é: 'e', // LATIN SMALL LETTER E WITH ACUTE - ĕ: 'e', // LATIN SMALL LETTER E WITH BREVE - ě: 'e', // LATIN SMALL LETTER E WITH CARON - ȩ: 'e', // LATIN SMALL LETTER E WITH CEDILLA - ḝ: 'e', // LATIN SMALL LETTER E WITH CEDILLA AND BREVE - ê: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX - ế: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE - ệ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW - ề: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE - ể: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE - ễ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE - ḙ: 'e', // LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW - ë: 'e', // LATIN SMALL LETTER E WITH DIAERESIS - ė: 'e', // LATIN SMALL LETTER E WITH DOT ABOVE - ẹ: 'e', // LATIN SMALL LETTER E WITH DOT BELOW - ȅ: 'e', // LATIN SMALL LETTER E WITH DOUBLE GRAVE - è: 'e', // LATIN SMALL LETTER E WITH GRAVE - ẻ: 'e', // LATIN SMALL LETTER E WITH HOOK ABOVE - ȇ: 'e', // LATIN SMALL LETTER E WITH INVERTED BREVE - ē: 'e', // LATIN SMALL LETTER E WITH MACRON - ḗ: 'e', // LATIN SMALL LETTER E WITH MACRON AND ACUTE - ḕ: 'e', // LATIN SMALL LETTER E WITH MACRON AND GRAVE - ⱸ: 'e', // LATIN SMALL LETTER E WITH NOTCH - ę: 'e', // LATIN SMALL LETTER E WITH OGONEK - ᶒ: 'e', // LATIN SMALL LETTER E WITH RETROFLEX HOOK - ɇ: 'e', // LATIN SMALL LETTER E WITH STROKE - ẽ: 'e', // LATIN SMALL LETTER E WITH TILDE - ḛ: 'e', // LATIN SMALL LETTER E WITH TILDE BELOW - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EGYPTOLOGICAL AIN' (ꜥ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EGYPTOLOGICAL ALEF' (ꜣ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ENG' (ŋ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH' (ʃ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH CURL' (ʆ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH PALATAL HOOK' (ᶋ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH WITH RETROFLEX HOOK' (ᶘ) - ꝫ: 'et', // LATIN SMALL LETTER ET - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ETH' (ð) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH' (ʒ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH REVERSED' (ƹ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH CARON' (ǯ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH CURL' (ʓ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH RETROFLEX HOOK' (ᶚ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER EZH WITH TAIL' (ƺ) - ḟ: 'f', // LATIN SMALL LETTER F WITH DOT ABOVE - ƒ: 'f', // LATIN SMALL LETTER F WITH HOOK - ᵮ: 'f', // LATIN SMALL LETTER F WITH MIDDLE TILDE - ᶂ: 'f', // LATIN SMALL LETTER F WITH PALATAL HOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER FENG DIGRAPH' (ʩ) - ǵ: 'g', // LATIN SMALL LETTER G WITH ACUTE - ğ: 'g', // LATIN SMALL LETTER G WITH BREVE - ǧ: 'g', // LATIN SMALL LETTER G WITH CARON - ģ: 'g', // LATIN SMALL LETTER G WITH CEDILLA - ĝ: 'g', // LATIN SMALL LETTER G WITH CIRCUMFLEX - ġ: 'g', // LATIN SMALL LETTER G WITH DOT ABOVE - ɠ: 'g', // LATIN SMALL LETTER G WITH HOOK - ḡ: 'g', // LATIN SMALL LETTER G WITH MACRON - ᶃ: 'g', // LATIN SMALL LETTER G WITH PALATAL HOOK - ǥ: 'g', // LATIN SMALL LETTER G WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER GAMMA' (ɣ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER GLOTTAL STOP' (ɂ) - ḫ: 'h', // LATIN SMALL LETTER H WITH BREVE BELOW - ȟ: 'h', // LATIN SMALL LETTER H WITH CARON - ḩ: 'h', // LATIN SMALL LETTER H WITH CEDILLA - ĥ: 'h', // LATIN SMALL LETTER H WITH CIRCUMFLEX - ⱨ: 'h', // LATIN SMALL LETTER H WITH DESCENDER - ḧ: 'h', // LATIN SMALL LETTER H WITH DIAERESIS - ḣ: 'h', // LATIN SMALL LETTER H WITH DOT ABOVE - ḥ: 'h', // LATIN SMALL LETTER H WITH DOT BELOW - ɦ: 'h', // LATIN SMALL LETTER H WITH HOOK - ẖ: 'h', // LATIN SMALL LETTER H WITH LINE BELOW - ħ: 'h', // LATIN SMALL LETTER H WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HALF H' (ⱶ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HENG' (ꜧ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER HENG WITH HOOK' (ɧ) - ƕ: 'hv', // LATIN SMALL LETTER HV - í: 'i', // LATIN SMALL LETTER I WITH ACUTE - ĭ: 'i', // LATIN SMALL LETTER I WITH BREVE - ǐ: 'i', // LATIN SMALL LETTER I WITH CARON - î: 'i', // LATIN SMALL LETTER I WITH CIRCUMFLEX - ï: 'i', // LATIN SMALL LETTER I WITH DIAERESIS - ḯ: 'i', // LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE - ị: 'i', // LATIN SMALL LETTER I WITH DOT BELOW - ȉ: 'i', // LATIN SMALL LETTER I WITH DOUBLE GRAVE - ì: 'i', // LATIN SMALL LETTER I WITH GRAVE - ỉ: 'i', // LATIN SMALL LETTER I WITH HOOK ABOVE - ȋ: 'i', // LATIN SMALL LETTER I WITH INVERTED BREVE - ī: 'i', // LATIN SMALL LETTER I WITH MACRON - į: 'i', // LATIN SMALL LETTER I WITH OGONEK - ᶖ: 'i', // LATIN SMALL LETTER I WITH RETROFLEX HOOK - ɨ: 'i', // LATIN SMALL LETTER I WITH STROKE - ĩ: 'i', // LATIN SMALL LETTER I WITH TILDE - ḭ: 'i', // LATIN SMALL LETTER I WITH TILDE BELOW - ꝺ: 'd', // LATIN SMALL LETTER INSULAR D - ꝼ: 'f', // LATIN SMALL LETTER INSULAR F - ᵹ: 'g', // LATIN SMALL LETTER INSULAR G - ꞃ: 'r', // LATIN SMALL LETTER INSULAR R - ꞅ: 's', // LATIN SMALL LETTER INSULAR S - ꞇ: 't', // LATIN SMALL LETTER INSULAR T - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER IOTA' (ɩ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER IOTA WITH STROKE' (ᵼ) - ꝭ: 'is', // LATIN SMALL LETTER IS - ǰ: 'j', // LATIN SMALL LETTER J WITH CARON - ĵ: 'j', // LATIN SMALL LETTER J WITH CIRCUMFLEX - ʝ: 'j', // LATIN SMALL LETTER J WITH CROSSED-TAIL - ɉ: 'j', // LATIN SMALL LETTER J WITH STROKE - ḱ: 'k', // LATIN SMALL LETTER K WITH ACUTE - ǩ: 'k', // LATIN SMALL LETTER K WITH CARON - ķ: 'k', // LATIN SMALL LETTER K WITH CEDILLA - ⱪ: 'k', // LATIN SMALL LETTER K WITH DESCENDER - ꝃ: 'k', // LATIN SMALL LETTER K WITH DIAGONAL STROKE - ḳ: 'k', // LATIN SMALL LETTER K WITH DOT BELOW - ƙ: 'k', // LATIN SMALL LETTER K WITH HOOK - ḵ: 'k', // LATIN SMALL LETTER K WITH LINE BELOW - ᶄ: 'k', // LATIN SMALL LETTER K WITH PALATAL HOOK - ꝁ: 'k', // LATIN SMALL LETTER K WITH STROKE - ꝅ: 'k', // LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER KRA' (ĸ) - ĺ: 'l', // LATIN SMALL LETTER L WITH ACUTE - ƚ: 'l', // LATIN SMALL LETTER L WITH BAR - ɬ: 'l', // LATIN SMALL LETTER L WITH BELT - ľ: 'l', // LATIN SMALL LETTER L WITH CARON - ļ: 'l', // LATIN SMALL LETTER L WITH CEDILLA - ḽ: 'l', // LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW - ȴ: 'l', // LATIN SMALL LETTER L WITH CURL - ḷ: 'l', // LATIN SMALL LETTER L WITH DOT BELOW - ḹ: 'l', // LATIN SMALL LETTER L WITH DOT BELOW AND MACRON - ⱡ: 'l', // LATIN SMALL LETTER L WITH DOUBLE BAR - ꝉ: 'l', // LATIN SMALL LETTER L WITH HIGH STROKE - ḻ: 'l', // LATIN SMALL LETTER L WITH LINE BELOW - ŀ: 'l', // LATIN SMALL LETTER L WITH MIDDLE DOT - ɫ: 'l', // LATIN SMALL LETTER L WITH MIDDLE TILDE - ᶅ: 'l', // LATIN SMALL LETTER L WITH PALATAL HOOK - ɭ: 'l', // LATIN SMALL LETTER L WITH RETROFLEX HOOK - ł: 'l', // LATIN SMALL LETTER L WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LAMBDA WITH STROKE' (ƛ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LEZH' (ɮ) - lj: 'lj', // LATIN SMALL LETTER LJ - ſ: 's', // LATIN SMALL LETTER LONG S - ẜ: 's', // LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE - ẛ: 's', // LATIN SMALL LETTER LONG S WITH DOT ABOVE - ẝ: 's', // LATIN SMALL LETTER LONG S WITH HIGH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LS DIGRAPH' (ʪ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LUM' (ꝲ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER LZ DIGRAPH' (ʫ) - ḿ: 'm', // LATIN SMALL LETTER M WITH ACUTE - ṁ: 'm', // LATIN SMALL LETTER M WITH DOT ABOVE - ṃ: 'm', // LATIN SMALL LETTER M WITH DOT BELOW - ɱ: 'm', // LATIN SMALL LETTER M WITH HOOK - ᵯ: 'm', // LATIN SMALL LETTER M WITH MIDDLE TILDE - ᶆ: 'm', // LATIN SMALL LETTER M WITH PALATAL HOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MIDDLE-WELSH LL' (ỻ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MIDDLE-WELSH V' (ỽ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER MUM' (ꝳ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER N PRECEDED BY APOSTROPHE' (ʼn) - ń: 'n', // LATIN SMALL LETTER N WITH ACUTE - ň: 'n', // LATIN SMALL LETTER N WITH CARON - ņ: 'n', // LATIN SMALL LETTER N WITH CEDILLA - ṋ: 'n', // LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW - ȵ: 'n', // LATIN SMALL LETTER N WITH CURL - ṅ: 'n', // LATIN SMALL LETTER N WITH DOT ABOVE - ṇ: 'n', // LATIN SMALL LETTER N WITH DOT BELOW - ǹ: 'n', // LATIN SMALL LETTER N WITH GRAVE - ɲ: 'n', // LATIN SMALL LETTER N WITH LEFT HOOK - ṉ: 'n', // LATIN SMALL LETTER N WITH LINE BELOW - ƞ: 'n', // LATIN SMALL LETTER N WITH LONG RIGHT LEG - ᵰ: 'n', // LATIN SMALL LETTER N WITH MIDDLE TILDE - ᶇ: 'n', // LATIN SMALL LETTER N WITH PALATAL HOOK - ɳ: 'n', // LATIN SMALL LETTER N WITH RETROFLEX HOOK - ñ: 'n', // LATIN SMALL LETTER N WITH TILDE - nj: 'nj', // LATIN SMALL LETTER NJ - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER NUM' (ꝴ) - ó: 'o', // LATIN SMALL LETTER O WITH ACUTE - ŏ: 'o', // LATIN SMALL LETTER O WITH BREVE - ǒ: 'o', // LATIN SMALL LETTER O WITH CARON - ô: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX - ố: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE - ộ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW - ồ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE - ổ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE - ỗ: 'o', // LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE - ö: 'o', // LATIN SMALL LETTER O WITH DIAERESIS - ȫ: 'o', // LATIN SMALL LETTER O WITH DIAERESIS AND MACRON - ȯ: 'o', // LATIN SMALL LETTER O WITH DOT ABOVE - ȱ: 'o', // LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON - ọ: 'o', // LATIN SMALL LETTER O WITH DOT BELOW - ő: 'o', // LATIN SMALL LETTER O WITH DOUBLE ACUTE - ȍ: 'o', // LATIN SMALL LETTER O WITH DOUBLE GRAVE - ò: 'o', // LATIN SMALL LETTER O WITH GRAVE - ỏ: 'o', // LATIN SMALL LETTER O WITH HOOK ABOVE - ơ: 'o', // LATIN SMALL LETTER O WITH HORN - ớ: 'o', // LATIN SMALL LETTER O WITH HORN AND ACUTE - ợ: 'o', // LATIN SMALL LETTER O WITH HORN AND DOT BELOW - ờ: 'o', // LATIN SMALL LETTER O WITH HORN AND GRAVE - ở: 'o', // LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE - ỡ: 'o', // LATIN SMALL LETTER O WITH HORN AND TILDE - ȏ: 'o', // LATIN SMALL LETTER O WITH INVERTED BREVE - ꝋ: 'o', // LATIN SMALL LETTER O WITH LONG STROKE OVERLAY - ꝍ: 'o', // LATIN SMALL LETTER O WITH LOOP - ⱺ: 'o', // LATIN SMALL LETTER O WITH LOW RING INSIDE - ō: 'o', // LATIN SMALL LETTER O WITH MACRON - ṓ: 'o', // LATIN SMALL LETTER O WITH MACRON AND ACUTE - ṑ: 'o', // LATIN SMALL LETTER O WITH MACRON AND GRAVE - ǫ: 'o', // LATIN SMALL LETTER O WITH OGONEK - ǭ: 'o', // LATIN SMALL LETTER O WITH OGONEK AND MACRON - ø: 'o', // LATIN SMALL LETTER O WITH STROKE - ǿ: 'o', // LATIN SMALL LETTER O WITH STROKE AND ACUTE - õ: 'o', // LATIN SMALL LETTER O WITH TILDE - ṍ: 'o', // LATIN SMALL LETTER O WITH TILDE AND ACUTE - ṏ: 'o', // LATIN SMALL LETTER O WITH TILDE AND DIAERESIS - ȭ: 'o', // LATIN SMALL LETTER O WITH TILDE AND MACRON - ƣ: 'oi', // LATIN SMALL LETTER OI - ꝏ: 'oo', // LATIN SMALL LETTER OO - ɛ: 'e', // LATIN SMALL LETTER OPEN E - ᶓ: 'e', // LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK - ɔ: 'o', // LATIN SMALL LETTER OPEN O - ᶗ: 'o', // LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK - ȣ: 'ou', // LATIN SMALL LETTER OU - ṕ: 'p', // LATIN SMALL LETTER P WITH ACUTE - ṗ: 'p', // LATIN SMALL LETTER P WITH DOT ABOVE - ꝓ: 'p', // LATIN SMALL LETTER P WITH FLOURISH - ƥ: 'p', // LATIN SMALL LETTER P WITH HOOK - ᵱ: 'p', // LATIN SMALL LETTER P WITH MIDDLE TILDE - ᶈ: 'p', // LATIN SMALL LETTER P WITH PALATAL HOOK - ꝕ: 'p', // LATIN SMALL LETTER P WITH SQUIRREL TAIL - ᵽ: 'p', // LATIN SMALL LETTER P WITH STROKE - ꝑ: 'p', // LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER PHI' (ɸ) - ꝙ: 'q', // LATIN SMALL LETTER Q WITH DIAGONAL STROKE - ʠ: 'q', // LATIN SMALL LETTER Q WITH HOOK - ɋ: 'q', // LATIN SMALL LETTER Q WITH HOOK TAIL - ꝗ: 'q', // LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER QP DIGRAPH' (ȹ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER R ROTUNDA' (ꝛ) - ŕ: 'r', // LATIN SMALL LETTER R WITH ACUTE - ř: 'r', // LATIN SMALL LETTER R WITH CARON - ŗ: 'r', // LATIN SMALL LETTER R WITH CEDILLA - ṙ: 'r', // LATIN SMALL LETTER R WITH DOT ABOVE - ṛ: 'r', // LATIN SMALL LETTER R WITH DOT BELOW - ṝ: 'r', // LATIN SMALL LETTER R WITH DOT BELOW AND MACRON - ȑ: 'r', // LATIN SMALL LETTER R WITH DOUBLE GRAVE - ɾ: 'r', // LATIN SMALL LETTER R WITH FISHHOOK - ᵳ: 'r', // LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE - ȓ: 'r', // LATIN SMALL LETTER R WITH INVERTED BREVE - ṟ: 'r', // LATIN SMALL LETTER R WITH LINE BELOW - ɼ: 'r', // LATIN SMALL LETTER R WITH LONG LEG - ᵲ: 'r', // LATIN SMALL LETTER R WITH MIDDLE TILDE - ᶉ: 'r', // LATIN SMALL LETTER R WITH PALATAL HOOK - ɍ: 'r', // LATIN SMALL LETTER R WITH STROKE - ɽ: 'r', // LATIN SMALL LETTER R WITH TAIL - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RAMS HORN' (ɤ) - ↄ: 'c', // LATIN SMALL LETTER REVERSED C - ꜿ: 'c', // LATIN SMALL LETTER REVERSED C WITH DOT - ɘ: 'e', // LATIN SMALL LETTER REVERSED E - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E' (ɜ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E WITH HOOK' (ɝ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK' (ᶔ) - ɿ: 'r', // LATIN SMALL LETTER REVERSED R WITH FISHHOOK - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RUM' (ꝵ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER RUM ROTUNDA' (ꝝ) - ś: 's', // LATIN SMALL LETTER S WITH ACUTE - ṥ: 's', // LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE - š: 's', // LATIN SMALL LETTER S WITH CARON - ṧ: 's', // LATIN SMALL LETTER S WITH CARON AND DOT ABOVE - ş: 's', // LATIN SMALL LETTER S WITH CEDILLA - ŝ: 's', // LATIN SMALL LETTER S WITH CIRCUMFLEX - ș: 's', // LATIN SMALL LETTER S WITH COMMA BELOW - ṡ: 's', // LATIN SMALL LETTER S WITH DOT ABOVE - ṣ: 's', // LATIN SMALL LETTER S WITH DOT BELOW - ṩ: 's', // LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE - ʂ: 's', // LATIN SMALL LETTER S WITH HOOK - ᵴ: 's', // LATIN SMALL LETTER S WITH MIDDLE TILDE - ᶊ: 's', // LATIN SMALL LETTER S WITH PALATAL HOOK - ȿ: 's', // LATIN SMALL LETTER S WITH SWASH TAIL - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SALTILLO' (ꞌ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA' (ə) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA WITH HOOK' (ɚ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK' (ᶕ) - ɡ: 'g', // LATIN SMALL LETTER SCRIPT G - ß: 'ss', // LATIN SMALL LETTER SHARP S - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS DIAERESIZED U' (ᴞ) - ᴑ: 'o', // LATIN SMALL LETTER SIDEWAYS O - ᴓ: 'o', // LATIN SMALL LETTER SIDEWAYS O WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS OPEN O' (ᴒ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SIDEWAYS TURNED M' (ᴟ) - ᴝ: 'u', // LATIN SMALL LETTER SIDEWAYS U - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER SQUAT REVERSED ESH' (ʅ) - ť: 't', // LATIN SMALL LETTER T WITH CARON - ţ: 't', // LATIN SMALL LETTER T WITH CEDILLA - ṱ: 't', // LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW - ț: 't', // LATIN SMALL LETTER T WITH COMMA BELOW - ȶ: 't', // LATIN SMALL LETTER T WITH CURL - ẗ: 't', // LATIN SMALL LETTER T WITH DIAERESIS - ⱦ: 't', // LATIN SMALL LETTER T WITH DIAGONAL STROKE - ṫ: 't', // LATIN SMALL LETTER T WITH DOT ABOVE - ṭ: 't', // LATIN SMALL LETTER T WITH DOT BELOW - ƭ: 't', // LATIN SMALL LETTER T WITH HOOK - ṯ: 't', // LATIN SMALL LETTER T WITH LINE BELOW - ᵵ: 't', // LATIN SMALL LETTER T WITH MIDDLE TILDE - ƫ: 't', // LATIN SMALL LETTER T WITH PALATAL HOOK - ʈ: 't', // LATIN SMALL LETTER T WITH RETROFLEX HOOK - ŧ: 't', // LATIN SMALL LETTER T WITH STROKE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TAILLESS PHI' (ⱷ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TC DIGRAPH WITH CURL' (ʨ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TESH DIGRAPH' (ʧ) - ᵺ: 'th', // LATIN SMALL LETTER TH WITH STRIKETHROUGH - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN' (þ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN WITH STROKE' (ꝥ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER' (ꝧ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE FIVE' (ƽ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE SIX' (ƅ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TONE TWO' (ƨ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TOP HALF O' (ᴖ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TRESILLO' (ꜫ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TS DIGRAPH' (ʦ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TUM' (ꝷ) - ɐ: 'a', // LATIN SMALL LETTER TURNED A - ᴂ: 'ae', // LATIN SMALL LETTER TURNED AE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED ALPHA' (ɒ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED DELTA' (ƍ) - ǝ: 'e', // LATIN SMALL LETTER TURNED E - ᵷ: 'g', // LATIN SMALL LETTER TURNED G - ɥ: 'h', // LATIN SMALL LETTER TURNED H - ʮ: 'h', // LATIN SMALL LETTER TURNED H WITH FISHHOOK - ʯ: 'h', // LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL - ᴉ: 'i', // LATIN SMALL LETTER TURNED I - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED INSULAR G' (ꝿ) - ʞ: 'k', // LATIN SMALL LETTER TURNED K - ꞁ: 'l', // LATIN SMALL LETTER TURNED L - ɯ: 'm', // LATIN SMALL LETTER TURNED M - ɰ: 'm', // LATIN SMALL LETTER TURNED M WITH LONG LEG - ᴔ: 'oe', // LATIN SMALL LETTER TURNED OE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER TURNED OPEN E' (ᴈ) - ɹ: 'r', // LATIN SMALL LETTER TURNED R - ɻ: 'r', // LATIN SMALL LETTER TURNED R WITH HOOK - ɺ: 'r', // LATIN SMALL LETTER TURNED R WITH LONG LEG - ⱹ: 'r', // LATIN SMALL LETTER TURNED R WITH TAIL - ʇ: 't', // LATIN SMALL LETTER TURNED T - ʌ: 'v', // LATIN SMALL LETTER TURNED V - ʍ: 'w', // LATIN SMALL LETTER TURNED W - ʎ: 'y', // LATIN SMALL LETTER TURNED Y - ꜩ: 'tz', // LATIN SMALL LETTER TZ - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER U BAR' (ʉ) - ú: 'u', // LATIN SMALL LETTER U WITH ACUTE - ŭ: 'u', // LATIN SMALL LETTER U WITH BREVE - ǔ: 'u', // LATIN SMALL LETTER U WITH CARON - û: 'u', // LATIN SMALL LETTER U WITH CIRCUMFLEX - ṷ: 'u', // LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW - ü: 'u', // LATIN SMALL LETTER U WITH DIAERESIS - ǘ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE - ǚ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND CARON - ǜ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE - ǖ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON - ṳ: 'u', // LATIN SMALL LETTER U WITH DIAERESIS BELOW - ụ: 'u', // LATIN SMALL LETTER U WITH DOT BELOW - ű: 'u', // LATIN SMALL LETTER U WITH DOUBLE ACUTE - ȕ: 'u', // LATIN SMALL LETTER U WITH DOUBLE GRAVE - ù: 'u', // LATIN SMALL LETTER U WITH GRAVE - ủ: 'u', // LATIN SMALL LETTER U WITH HOOK ABOVE - ư: 'u', // LATIN SMALL LETTER U WITH HORN - ứ: 'u', // LATIN SMALL LETTER U WITH HORN AND ACUTE - ự: 'u', // LATIN SMALL LETTER U WITH HORN AND DOT BELOW - ừ: 'u', // LATIN SMALL LETTER U WITH HORN AND GRAVE - ử: 'u', // LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE - ữ: 'u', // LATIN SMALL LETTER U WITH HORN AND TILDE - ȗ: 'u', // LATIN SMALL LETTER U WITH INVERTED BREVE - ū: 'u', // LATIN SMALL LETTER U WITH MACRON - ṻ: 'u', // LATIN SMALL LETTER U WITH MACRON AND DIAERESIS - ų: 'u', // LATIN SMALL LETTER U WITH OGONEK - ᶙ: 'u', // LATIN SMALL LETTER U WITH RETROFLEX HOOK - ů: 'u', // LATIN SMALL LETTER U WITH RING ABOVE - ũ: 'u', // LATIN SMALL LETTER U WITH TILDE - ṹ: 'u', // LATIN SMALL LETTER U WITH TILDE AND ACUTE - ṵ: 'u', // LATIN SMALL LETTER U WITH TILDE BELOW - ᵫ: 'ue', // LATIN SMALL LETTER UE - ꝸ: 'um', // LATIN SMALL LETTER UM - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER UPSILON' (ʊ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER UPSILON WITH STROKE' (ᵿ) - ⱴ: 'v', // LATIN SMALL LETTER V WITH CURL - ꝟ: 'v', // LATIN SMALL LETTER V WITH DIAGONAL STROKE - ṿ: 'v', // LATIN SMALL LETTER V WITH DOT BELOW - ʋ: 'v', // LATIN SMALL LETTER V WITH HOOK - ᶌ: 'v', // LATIN SMALL LETTER V WITH PALATAL HOOK - ⱱ: 'v', // LATIN SMALL LETTER V WITH RIGHT HOOK - ṽ: 'v', // LATIN SMALL LETTER V WITH TILDE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER VEND' (ꝩ) - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER VISIGOTHIC Z' (ꝣ) - ꝡ: 'vy', // LATIN SMALL LETTER VY - ẃ: 'w', // LATIN SMALL LETTER W WITH ACUTE - ŵ: 'w', // LATIN SMALL LETTER W WITH CIRCUMFLEX - ẅ: 'w', // LATIN SMALL LETTER W WITH DIAERESIS - ẇ: 'w', // LATIN SMALL LETTER W WITH DOT ABOVE - ẉ: 'w', // LATIN SMALL LETTER W WITH DOT BELOW - ẁ: 'w', // LATIN SMALL LETTER W WITH GRAVE - ⱳ: 'w', // LATIN SMALL LETTER W WITH HOOK - ẘ: 'w', // LATIN SMALL LETTER W WITH RING ABOVE - ẍ: 'x', // LATIN SMALL LETTER X WITH DIAERESIS - ẋ: 'x', // LATIN SMALL LETTER X WITH DOT ABOVE - ᶍ: 'x', // LATIN SMALL LETTER X WITH PALATAL HOOK - ý: 'y', // LATIN SMALL LETTER Y WITH ACUTE - ŷ: 'y', // LATIN SMALL LETTER Y WITH CIRCUMFLEX - ÿ: 'y', // LATIN SMALL LETTER Y WITH DIAERESIS - ẏ: 'y', // LATIN SMALL LETTER Y WITH DOT ABOVE - ỵ: 'y', // LATIN SMALL LETTER Y WITH DOT BELOW - ỳ: 'y', // LATIN SMALL LETTER Y WITH GRAVE - ƴ: 'y', // LATIN SMALL LETTER Y WITH HOOK - ỷ: 'y', // LATIN SMALL LETTER Y WITH HOOK ABOVE - ỿ: 'y', // LATIN SMALL LETTER Y WITH LOOP - ȳ: 'y', // LATIN SMALL LETTER Y WITH MACRON - ẙ: 'y', // LATIN SMALL LETTER Y WITH RING ABOVE - ɏ: 'y', // LATIN SMALL LETTER Y WITH STROKE - ỹ: 'y', // LATIN SMALL LETTER Y WITH TILDE - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER YOGH' (ȝ) - ź: 'z', // LATIN SMALL LETTER Z WITH ACUTE - ž: 'z', // LATIN SMALL LETTER Z WITH CARON - ẑ: 'z', // LATIN SMALL LETTER Z WITH CIRCUMFLEX - ʑ: 'z', // LATIN SMALL LETTER Z WITH CURL - ⱬ: 'z', // LATIN SMALL LETTER Z WITH DESCENDER - ż: 'z', // LATIN SMALL LETTER Z WITH DOT ABOVE - ẓ: 'z', // LATIN SMALL LETTER Z WITH DOT BELOW - ȥ: 'z', // LATIN SMALL LETTER Z WITH HOOK - ẕ: 'z', // LATIN SMALL LETTER Z WITH LINE BELOW - ᵶ: 'z', // LATIN SMALL LETTER Z WITH MIDDLE TILDE - ᶎ: 'z', // LATIN SMALL LETTER Z WITH PALATAL HOOK - ʐ: 'z', // LATIN SMALL LETTER Z WITH RETROFLEX HOOK - ƶ: 'z', // LATIN SMALL LETTER Z WITH STROKE - ɀ: 'z', // LATIN SMALL LETTER Z WITH SWASH TAIL - ff: 'ff', // LATIN SMALL LIGATURE FF - ffi: 'ffi', // LATIN SMALL LIGATURE FFI - ffl: 'ffl', // LATIN SMALL LIGATURE FFL - fi: 'fi', // LATIN SMALL LIGATURE FI - fl: 'fl', // LATIN SMALL LIGATURE FL - ij: 'ij', // LATIN SMALL LIGATURE IJ - // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LIGATURE LONG S T' (ſt) - œ: 'oe', // LATIN SMALL LIGATURE OE - st: 'st', // LATIN SMALL LIGATURE ST - ₐ: 'a', // LATIN SUBSCRIPT SMALL LETTER A - ₑ: 'e', // LATIN SUBSCRIPT SMALL LETTER E - ᵢ: 'i', // LATIN SUBSCRIPT SMALL LETTER I - ⱼ: 'j', // LATIN SUBSCRIPT SMALL LETTER J - ₒ: 'o', // LATIN SUBSCRIPT SMALL LETTER O - ᵣ: 'r', // LATIN SUBSCRIPT SMALL LETTER R - // CANNOT FIND APPROXIMATION FOR 'LATIN SUBSCRIPT SMALL LETTER SCHWA' (ₔ) - ᵤ: 'u', // LATIN SUBSCRIPT SMALL LETTER U - ᵥ: 'v', // LATIN SUBSCRIPT SMALL LETTER V - ₓ: 'x' // LATIN SUBSCRIPT SMALL LETTER X -}; - -export function map(x) { - return latinMap[x] || x; -} - -export function latinise(input) { - return input.replace(/[^A-Za-z0-9]/g, map); -} diff --git a/webapp/utils/license_utils.jsx b/webapp/utils/license_utils.jsx deleted file mode 100644 index a44cfb9d4..000000000 --- a/webapp/utils/license_utils.jsx +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import LocalizationStore from 'stores/localization_store.jsx'; - -const LICENSE_EXPIRY_NOTIFICATION = 1000 * 60 * 60 * 24 * 60; // 60 days -const LICENSE_GRACE_PERIOD = 1000 * 60 * 60 * 24 * 15; // 15 days - -export function isLicenseExpiring() { - if (window.mm_license.IsLicensed !== 'true') { - return false; - } - - const timeDiff = parseInt(global.window.mm_license.ExpiresAt, 10) - Date.now(); - return timeDiff <= LICENSE_EXPIRY_NOTIFICATION; -} - -export function isLicenseExpired() { - if (window.mm_license.IsLicensed !== 'true') { - return false; - } - - const timeDiff = parseInt(global.window.mm_license.ExpiresAt, 10) - Date.now(); - return timeDiff < 0; -} - -export function isLicensePastGracePeriod() { - if (window.mm_license.IsLicensed !== 'true') { - return false; - } - - const timeDiff = Date.now() - parseInt(global.window.mm_license.ExpiresAt, 10); - return timeDiff > LICENSE_GRACE_PERIOD; -} - -export function displayExpiryDate() { - const date = new Date(parseInt(global.window.mm_license.ExpiresAt, 10)); - return date.toLocaleString(LocalizationStore.getLocale(), {year: 'numeric', month: 'long', day: 'numeric'}); -} diff --git a/webapp/utils/markdown.jsx b/webapp/utils/markdown.jsx deleted file mode 100644 index 5918b1581..000000000 --- a/webapp/utils/markdown.jsx +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import * as TextFormatting from './text_formatting.jsx'; -import * as SyntaxHighlighting from './syntax_highlighting.jsx'; - -import marked from 'marked'; -import katex from 'katex'; - -class MattermostMarkdownRenderer extends marked.Renderer { - constructor(options, formattingOptions = {}) { - super(options); - - this.heading = this.heading.bind(this); - this.paragraph = this.paragraph.bind(this); - this.text = this.text.bind(this); - - this.formattingOptions = formattingOptions; - } - - code(code, language) { - let usedLanguage = language || ''; - usedLanguage = usedLanguage.toLowerCase(); - - if (usedLanguage === 'tex' || usedLanguage === 'latex') { - try { - const html = katex.renderToString(code, {throwOnError: false, displayMode: true}); - - return '
' + html + '
'; - } catch (e) { - // fall through if latex parsing fails and handle below - } - } - - // treat html as xml to prevent injection attacks - if (usedLanguage === 'html') { - usedLanguage = 'xml'; - } - - let className = 'post-code'; - if (!usedLanguage) { - className += ' post-code--wrap'; - } - - let header = ''; - if (SyntaxHighlighting.canHighlight(usedLanguage)) { - header = ( - '' + - SyntaxHighlighting.getLanguageName(usedLanguage) + - '' - ); - } - - // if we have to apply syntax highlighting AND highlighting of search terms, create two copies - // of the code block, one with syntax highlighting applied and another with invisible text, but - // search term highlighting and overlap them - const content = SyntaxHighlighting.highlight(usedLanguage, code); - let searchedContent = ''; - - if (this.formattingOptions.searchPatterns) { - const tokens = new Map(); - - let searched = TextFormatting.sanitizeHtml(code); - searched = TextFormatting.highlightSearchTerms(searched, tokens, this.formattingOptions.searchPatterns); - - if (tokens.size > 0) { - searched = TextFormatting.replaceTokens(searched, tokens); - - searchedContent = ( - '
' + - searched + - '
' - ); - } - } - - return ( - '
' + - header + - '' + - searchedContent + - content + - '' + - '
' - ); - } - - codespan(text) { - let output = text; - - if (this.formattingOptions.searchPatterns) { - const tokens = new Map(); - output = TextFormatting.highlightSearchTerms(output, tokens, this.formattingOptions.searchPatterns); - output = TextFormatting.replaceTokens(output, tokens); - } - - return ( - '' + - '' + - output + - '' + - '' - ); - } - - br() { - if (this.formattingOptions.singleline) { - return ' '; - } - - return super.br(); - } - - image(href, title, text) { - let src = href; - let dimensions = []; - const parts = href.split(' '); - if (parts.length > 1) { - const lastPart = parts.pop(); - src = parts.join(' '); - if (lastPart[0] === '=') { - dimensions = lastPart.substr(1).split('x'); - if (dimensions.length === 2 && dimensions[1] === '') { - dimensions[1] = 'auto'; - } - } - } - let out = '' + text + ' 0) { - out += ' width="' + dimensions[0] + '"'; - } - if (dimensions.length > 1) { - out += ' height="' + dimensions[1] + '"'; - } - out += ' class="markdown-inline-img"'; - out += this.options.xhtml ? '/>' : '>'; - return out; - } - - heading(text, level) { - return `${text}`; - } - - link(href, title, text) { - let outHref = href; - - if (this.formattingOptions.linkFilter && !this.formattingOptions.linkFilter(outHref)) { - return text; - } - - try { - let unescaped = unescape(href); - try { - unescaped = decodeURIComponent(unescaped); - } catch (e) { - unescaped = global.unescape(unescaped); - } - unescaped = unescaped.replace(/[^\w:]/g, '').toLowerCase(); - - if (unescaped.indexOf('javascript:') === 0 || unescaped.indexOf('vbscript:') === 0 || unescaped.indexOf('data:') === 0) { // eslint-disable-line no-script-url - return text; - } - } catch (e) { - return text; - } - - if (!(/[a-z+.-]+:/i).test(outHref)) { - outHref = `http://${outHref}`; - } - - let output = ']*>/g, '') + ''; - - return output; - } - - paragraph(text) { - if (this.formattingOptions.singleline) { - return `

${text}

`; - } - - return super.paragraph(text); - } - - table(header, body) { - return `
${header}${body}
`; - } - - listitem(text, bullet) { - const taskListReg = /^\[([ |xX])] /; - const isTaskList = taskListReg.exec(text); - - if (isTaskList) { - return `
  • ${' '}${text.replace(taskListReg, '')}
  • `; - } - - if (/^\d+.$/.test(bullet)) { - // this is a numbered list item so override the numbering - return `
  • ${text}
  • `; - } - - return `
  • ${text}
  • `; - } - - text(txt) { - return TextFormatting.doFormatText(txt, this.formattingOptions); - } -} - -export function format(text, options = {}) { - const markdownOptions = { - renderer: new MattermostMarkdownRenderer(null, options), - sanitize: true, - gfm: true, - tables: true, - mangle: false - }; - - return marked(text, markdownOptions); -} - -// Marked helper functions that should probably just be exported - -function unescape(html) { - return html.replace(/&([#\w]+);/g, (_, m) => { - const n = m.toLowerCase(); - if (n === 'colon') { - return ':'; - } else if (n.charAt(0) === '#') { - return n.charAt(1) === 'x' ? - String.fromCharCode(parseInt(n.substring(2), 16)) : - String.fromCharCode(Number(n.substring(1))); - } - return ''; - }); -} diff --git a/webapp/utils/post_utils.jsx b/webapp/utils/post_utils.jsx deleted file mode 100644 index 670dfbaaf..000000000 --- a/webapp/utils/post_utils.jsx +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import Constants from 'utils/constants.jsx'; -import * as Utils from 'utils/utils.jsx'; - -import TeamStore from 'stores/team_store.jsx'; -import UserStore from 'stores/user_store.jsx'; -import ChannelStore from 'stores/channel_store.jsx'; - -export function isSystemMessage(post) { - return Boolean(post.type && (post.type.lastIndexOf(Constants.SYSTEM_MESSAGE_PREFIX) === 0)); -} - -export function isFromWebhook(post) { - return post.props && post.props.from_webhook === 'true'; -} - -export function isPostOwner(post) { - return UserStore.getCurrentId() === post.user_id; -} - -export function isComment(post) { - if ('root_id' in post) { - return post.root_id !== '' && post.root_id != null; - } - return false; -} - -export function isEdited(post) { - return post.edit_at > 0; -} - -export function getProfilePicSrcForPost(post, user) { - let src = ''; - if (user && user.id === post.user_id) { - src = Utils.imageURLForUser(user); - } else { - src = Utils.imageURLForUser(post.user_id); - } - - if (post.props && post.props.from_webhook && !post.props.use_user_icon && global.window.mm_config.EnablePostIconOverride === 'true') { - if (post.props.override_icon_url) { - src = post.props.override_icon_url; - } else { - src = Constants.DEFAULT_WEBHOOK_LOGO; - } - } else if (isSystemMessage(post)) { - src = Constants.SYSTEM_MESSAGE_PROFILE_IMAGE; - } - - return src; -} - -export function canDeletePost(post) { - const isOwner = isPostOwner(post); - const isSystemAdmin = UserStore.isSystemAdminForCurrentUser(); - const isTeamAdmin = TeamStore.isTeamAdminForCurrentTeam() || isSystemAdmin; - const isChannelAdmin = ChannelStore.isChannelAdminForCurrentChannel() || isTeamAdmin; - const isAdmin = isChannelAdmin || isTeamAdmin || isSystemAdmin; - - if (global.window.mm_license.IsLicensed === 'true') { - return (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_ALL && (isOwner || isChannelAdmin)) || - (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_TEAM_ADMIN && isTeamAdmin) || - (global.window.mm_config.RestrictPostDelete === Constants.PERMISSIONS_DELETE_POST_SYSTEM_ADMIN && isSystemAdmin); - } - - return isOwner || isAdmin; -} - -export function canEditPost(post, editDisableAction) { - const isOwner = isPostOwner(post); - let canEdit = isOwner && !isSystemMessage(post); - - if (canEdit && global.window.mm_license.IsLicensed === 'true') { - if (global.window.mm_config.AllowEditPost === Constants.ALLOW_EDIT_POST_NEVER) { - canEdit = false; - } else if (global.window.mm_config.AllowEditPost === Constants.ALLOW_EDIT_POST_TIME_LIMIT) { - const timeLeft = (post.create_at + (global.window.mm_config.PostEditTimeLimit * 1000)) - Utils.getTimestamp(); - if (timeLeft > 0) { - editDisableAction.fireAfter(timeLeft + 1000); - } else { - canEdit = false; - } - } - } - return canEdit; -} - -export function shouldShowDotMenu(post) { - if (Utils.isMobile()) { - return true; - } - - if (!isSystemMessage(post)) { - return true; - } - - if (canDeletePost(post)) { - return true; - } - - if (canEditPost(post)) { - return true; - } - - return false; -} - -export function containsAtMention(text, key) { - if (!text || !key) { - return false; - } - - // This doesn't work for at mentions containing periods or hyphens - return new RegExp(`\\B${key}\\b`, 'i').test(removeCode(text)); -} - -// Returns a given text string with all Markdown code replaced with whitespace. -export function removeCode(text) { - // These patterns should match the ones in app/notification.go, except JavaScript doesn't - // support \z for the end of the text in multiline mode, so we use $(?![\r\n]) - const codeBlockPattern = /^[^\S\n]*[`~]{3}.*$[\s\S]+?(^[^\S\n]*[`~]{3}$|$(?![\r\n]))/m; - const inlineCodePattern = /`+(?:.+?|.*?\n(.*?\S.*?\n)*.*?)`+/m; - - return text.replace(codeBlockPattern, '').replace(inlineCodePattern, ' '); -} diff --git a/webapp/utils/syntax_highlighting.jsx b/webapp/utils/syntax_highlighting.jsx deleted file mode 100644 index 0fb10638f..000000000 --- a/webapp/utils/syntax_highlighting.jsx +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import * as TextFormatting from './text_formatting.jsx'; -import Constants from './constants.jsx'; - -import hlJS from 'highlight.js/lib/highlight.js'; - -import hljsActionscript from 'highlight.js/lib/languages/actionscript.js'; -import hljsApplescript from 'highlight.js/lib/languages/applescript.js'; -import hljsBash from 'highlight.js/lib/languages/bash.js'; -import hljsClojure from 'highlight.js/lib/languages/clojure.js'; -import hljsCoffeescript from 'highlight.js/lib/languages/coffeescript.js'; -import hljsCpp from 'highlight.js/lib/languages/cpp.js'; -import hljsCs from 'highlight.js/lib/languages/cs.js'; -import hljsCss from 'highlight.js/lib/languages/css.js'; -import hljsD from 'highlight.js/lib/languages/d.js'; -import hljsDart from 'highlight.js/lib/languages/dart.js'; -import hljsDelphi from 'highlight.js/lib/languages/delphi.js'; -import hljsDiff from 'highlight.js/lib/languages/diff.js'; -import hljsDjango from 'highlight.js/lib/languages/django.js'; -import hljsDockerfile from 'highlight.js/lib/languages/dockerfile.js'; -import hljsErlang from 'highlight.js/lib/languages/erlang.js'; -import hljsFortran from 'highlight.js/lib/languages/fortran.js'; -import hljsFsharp from 'highlight.js/lib/languages/fsharp.js'; -import hljsGcode from 'highlight.js/lib/languages/gcode.js'; -import hljsGo from 'highlight.js/lib/languages/go.js'; -import hljsGroovy from 'highlight.js/lib/languages/groovy.js'; -import hljsHandlebars from 'highlight.js/lib/languages/handlebars.js'; -import hljsHaskell from 'highlight.js/lib/languages/haskell.js'; -import hljsHaxe from 'highlight.js/lib/languages/haxe.js'; -import hljsJava from 'highlight.js/lib/languages/java.js'; -import hljsJavascript from 'highlight.js/lib/languages/javascript.js'; -import hljsJson from 'highlight.js/lib/languages/json.js'; -import hljsJulia from 'highlight.js/lib/languages/julia.js'; -import hljsKotlin from 'highlight.js/lib/languages/kotlin.js'; -import hljsLess from 'highlight.js/lib/languages/less.js'; -import hljsLisp from 'highlight.js/lib/languages/lisp.js'; -import hljsLua from 'highlight.js/lib/languages/lua.js'; -import hljsMakefile from 'highlight.js/lib/languages/makefile.js'; -import hljsMarkdown from 'highlight.js/lib/languages/markdown.js'; -import hljsMatlab from 'highlight.js/lib/languages/matlab.js'; -import hljsObjectivec from 'highlight.js/lib/languages/objectivec.js'; -import hljsOcaml from 'highlight.js/lib/languages/ocaml.js'; -import hljsPerl from 'highlight.js/lib/languages/perl.js'; -import hljsPhp from 'highlight.js/lib/languages/php.js'; -import hljsPowershell from 'highlight.js/lib/languages/powershell.js'; -import hljsPuppet from 'highlight.js/lib/languages/puppet.js'; -import hljsPython from 'highlight.js/lib/languages/python.js'; -import hljsR from 'highlight.js/lib/languages/r.js'; -import hljsRuby from 'highlight.js/lib/languages/ruby.js'; -import hljsRust from 'highlight.js/lib/languages/rust.js'; -import hljsScala from 'highlight.js/lib/languages/scala.js'; -import hljsScheme from 'highlight.js/lib/languages/scheme.js'; -import hljsScss from 'highlight.js/lib/languages/scss.js'; -import hljsSmalltalk from 'highlight.js/lib/languages/smalltalk.js'; -import hljsSql from 'highlight.js/lib/languages/sql.js'; -import hljsSwift from 'highlight.js/lib/languages/swift.js'; -import hljsTex from 'highlight.js/lib/languages/tex.js'; -import hljsVbnet from 'highlight.js/lib/languages/vbnet.js'; -import hljsVbscript from 'highlight.js/lib/languages/vbscript.js'; -import hljsVerilog from 'highlight.js/lib/languages/verilog.js'; -import hljsXml from 'highlight.js/lib/languages/xml.js'; -import hljsYaml from 'highlight.js/lib/languages/yaml.js'; - -hlJS.registerLanguage('actionscript', hljsActionscript); -hlJS.registerLanguage('applescript', hljsApplescript); -hlJS.registerLanguage('bash', hljsBash); -hlJS.registerLanguage('clojure', hljsClojure); -hlJS.registerLanguage('coffeescript', hljsCoffeescript); -hlJS.registerLanguage('cpp', hljsCpp); -hlJS.registerLanguage('cs', hljsCs); -hlJS.registerLanguage('css', hljsCss); -hlJS.registerLanguage('d', hljsD); -hlJS.registerLanguage('dart', hljsDart); -hlJS.registerLanguage('delphi', hljsDelphi); -hlJS.registerLanguage('diff', hljsDiff); -hlJS.registerLanguage('django', hljsDjango); -hlJS.registerLanguage('dockerfile', hljsDockerfile); -hlJS.registerLanguage('erlang', hljsErlang); -hlJS.registerLanguage('fortran', hljsFortran); -hlJS.registerLanguage('fsharp', hljsFsharp); -hlJS.registerLanguage('gcode', hljsGcode); -hlJS.registerLanguage('go', hljsGo); -hlJS.registerLanguage('groovy', hljsGroovy); -hlJS.registerLanguage('handlebars', hljsHandlebars); -hlJS.registerLanguage('haskell', hljsHaskell); -hlJS.registerLanguage('haxe', hljsHaxe); -hlJS.registerLanguage('java', hljsJava); -hlJS.registerLanguage('javascript', hljsJavascript); -hlJS.registerLanguage('json', hljsJson); -hlJS.registerLanguage('julia', hljsJulia); -hlJS.registerLanguage('kotlin', hljsKotlin); -hlJS.registerLanguage('less', hljsLess); -hlJS.registerLanguage('lisp', hljsLisp); -hlJS.registerLanguage('lua', hljsLua); -hlJS.registerLanguage('makefile', hljsMakefile); -hlJS.registerLanguage('markdown', hljsMarkdown); -hlJS.registerLanguage('matlab', hljsMatlab); -hlJS.registerLanguage('objectivec', hljsObjectivec); -hlJS.registerLanguage('ocaml', hljsOcaml); -hlJS.registerLanguage('perl', hljsPerl); -hlJS.registerLanguage('php', hljsPhp); -hlJS.registerLanguage('powershell', hljsPowershell); -hlJS.registerLanguage('puppet', hljsPuppet); -hlJS.registerLanguage('python', hljsPython); -hlJS.registerLanguage('r', hljsR); -hlJS.registerLanguage('ruby', hljsRuby); -hlJS.registerLanguage('rust', hljsRust); -hlJS.registerLanguage('scala', hljsScala); -hlJS.registerLanguage('scheme', hljsScheme); -hlJS.registerLanguage('scss', hljsScss); -hlJS.registerLanguage('smalltalk', hljsSmalltalk); -hlJS.registerLanguage('sql', hljsSql); -hlJS.registerLanguage('swift', hljsSwift); -hlJS.registerLanguage('tex', hljsTex); -hlJS.registerLanguage('vbnet', hljsVbnet); -hlJS.registerLanguage('vbscript', hljsVbscript); -hlJS.registerLanguage('verilog', hljsVerilog); -hlJS.registerLanguage('xml', hljsXml); -hlJS.registerLanguage('yaml', hljsYaml); - -const HighlightedLanguages = Constants.HighlightedLanguages; - -export function highlight(lang, code) { - const language = getLanguageFromNameOrAlias(lang); - - if (language) { - try { - return hlJS.highlight(language, code).value; - } catch (e) { - // fall through if highlighting fails and handle below - } - } - - return TextFormatting.sanitizeHtml(code); -} - -export function getLanguageFromFileExtension(extension) { - for (var key in HighlightedLanguages) { - if (HighlightedLanguages[key].extensions.find((x) => x === extension)) { - return key; - } - } - - return null; -} - -export function canHighlight(language) { - return Boolean(getLanguageFromNameOrAlias(language)); -} - -export function getLanguageName(language) { - if (canHighlight(language)) { - return HighlightedLanguages[getLanguageFromNameOrAlias(language)].name; - } - - return ''; -} - -function getLanguageFromNameOrAlias(name) { - const langName = name.toLowerCase(); - if (HighlightedLanguages[langName]) { - return langName; - } - - return Object.keys(HighlightedLanguages).find((key) => { - const aliases = HighlightedLanguages[key].aliases; - return aliases && aliases.find((a) => a === langName); - }); -} diff --git a/webapp/utils/team_utils.jsx b/webapp/utils/team_utils.jsx deleted file mode 100644 index 7cd788388..000000000 --- a/webapp/utils/team_utils.jsx +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import LocalizationStore from 'stores/localization_store.jsx'; - -export function convertTeamMapToList(teamMap) { - const teams = []; - - for (const id in teamMap) { - if (teamMap.hasOwnProperty(id)) { - teams.push(teamMap[id]); - } - } - - return teams.sort(sortTeamsByDisplayName); -} - -// Use when sorting multiple teams by their `display_name` field -export function sortTeamsByDisplayName(a, b) { - const locale = LocalizationStore.getLocale(); - - if (a.display_name !== b.display_name) { - return a.display_name.localeCompare(b.display_name, locale, {numeric: true}); - } - - return a.name.localeCompare(b.name, locale, {numeric: true}); -} diff --git a/webapp/utils/text_formatting.jsx b/webapp/utils/text_formatting.jsx deleted file mode 100644 index e34b8fdbb..000000000 --- a/webapp/utils/text_formatting.jsx +++ /dev/null @@ -1,504 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import Autolinker from 'autolinker'; -import Constants from './constants.jsx'; -import EmojiStore from 'stores/emoji_store.jsx'; -import * as Emoticons from './emoticons.jsx'; -import * as Markdown from './markdown.jsx'; -import twemoji from 'twemoji'; -import XRegExp from 'xregexp'; - -const punctuation = XRegExp.cache('[^\\pL\\d]'); - -// pattern to detect the existance of a Chinese, Japanese, or Korean character in a string -// http://stackoverflow.com/questions/15033196/using-javascript-to-check-whether-a-string-contains-japanese-characters-includi -const cjkPattern = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf\uac00-\ud7a3]/; - -// Performs formatting of user posts including highlighting mentions and search terms and converting urls, hashtags, -// @mentions and ~channels to links by taking a user's message and returning a string of formatted html. Also takes -// a number of options as part of the second parameter: -// - searchTerm - If specified, this word is highlighted in the resulting html. Defaults to nothing. -// - mentionHighlight - Specifies whether or not to highlight mentions of the current user. Defaults to true. -// - mentionKeys - A list of mention keys for the current user to highlight. -// - singleline - Specifies whether or not to remove newlines. Defaults to false. -// - emoticons - Enables emoticon parsing. Defaults to true. -// - markdown - Enables markdown parsing. Defaults to true. -// - siteURL - The origin of this Mattermost instance. If provided, links to channels and posts will be replaced with internal -// links that can be handled by a special click handler. -// - atMentions - Whether or not to render at mentions into spans with a data-mention attribute. Defaults to false. -// - channelNamesMap - An object mapping channel display names to channels. If provided, ~channel mentions will be replaced with -// links to the relevant channel. -// - team - The current team. -export function formatText(text, inputOptions) { - if (!text || typeof text !== 'string') { - return ''; - } - - let output = text; - - const options = Object.assign({}, inputOptions); - options.searchPatterns = parseSearchTerms(options.searchTerm).map(convertSearchTermToRegex); - - if (!('markdown' in options) || options.markdown) { - // the markdown renderer will call doFormatText as necessary - output = Markdown.format(output, options); - } else { - output = sanitizeHtml(output); - output = doFormatText(output, options); - } - - // replace newlines with spaces if necessary - if (options.singleline) { - output = replaceNewlines(output); - } - - return output; -} - -// Performs most of the actual formatting work for formatText. Not intended to be called normally. -export function doFormatText(text, options) { - let output = text; - - const tokens = new Map(); - - // replace important words and phrases with tokens - if (options.atMentions) { - output = autolinkAtMentions(output, tokens); - } - - if (options.channelNamesMap) { - output = autolinkChannelMentions(output, tokens, options.channelNamesMap, options.team); - } - - output = autolinkEmails(output, tokens); - output = autolinkHashtags(output, tokens); - - if (!('emoticons' in options) || options.emoticon) { - output = Emoticons.handleEmoticons(output, tokens, options.emojis || EmojiStore.getEmojis()); - } - - if (options.searchPatterns) { - output = highlightSearchTerms(output, tokens, options.searchPatterns); - } - - if (!('mentionHighlight' in options) || options.mentionHighlight) { - output = highlightCurrentMentions(output, tokens, options.mentionKeys); - } - - if (!('emoticons' in options) || options.emoticon) { - output = twemoji.parse(output, { - className: 'emoticon', - callback: (icon) => { - if (!EmojiStore.hasUnicode(icon)) { - // just leave the unicode characters and hope the browser can handle it - return null; - } - - return EmojiStore.getEmojiImageUrl(EmojiStore.getUnicode(icon)); - } - }); - } - - // reinsert tokens with formatted versions of the important words and phrases - output = replaceTokens(output, tokens); - - return output; -} - -export function sanitizeHtml(text) { - let output = text; - - // normal string.replace only does a single occurrance so use a regex instead - output = output.replace(/&/g, '&'); - output = output.replace(//g, '>'); - output = output.replace(/'/g, '''); - output = output.replace(/"/g, '"'); - - return output; -} - -// Convert emails into tokens -function autolinkEmails(text, tokens) { - function replaceEmailWithToken(match) { - const linkText = match.getMatchedText(); - let url = linkText; - - if (match.getType() === 'email') { - url = `mailto:${url}`; - } - - const index = tokens.size; - const alias = `$MM_EMAIL${index}`; - - tokens.set(alias, { - value: `${linkText}`, - originalText: linkText - }); - - return alias; - } - - // we can't just use a static autolinker because we need to set replaceFn - const autolinker = new Autolinker({ - urls: false, - email: true, - phone: false, - mention: false, - hashtag: false, - replaceFn: replaceEmailWithToken - }); - - return autolinker.link(text); -} - -export function autolinkAtMentions(text, tokens) { - function replaceAtMentionWithToken(fullMatch, username) { - const index = tokens.size; - const alias = `$MM_ATMENTION${index}`; - - tokens.set(alias, { - value: `@${username}`, - originalText: fullMatch - }); - - return alias; - } - - let output = text; - output = output.replace(/\B@([a-z0-9.\-_]*)/gi, replaceAtMentionWithToken); - - return output; -} - -function autolinkChannelMentions(text, tokens, channelNamesMap, team) { - function channelMentionExists(c) { - return Boolean(channelNamesMap[c]); - } - function addToken(channelName, mention, displayName) { - const index = tokens.size; - const alias = `$MM_CHANNELMENTION${index}`; - let href = '#'; - if (team) { - href = '/' + team.name + '/channels/' + channelName; - } - - tokens.set(alias, { - value: `~${displayName}`, - originalText: mention - }); - return alias; - } - - function replaceChannelMentionWithToken(fullMatch, spacer, mention, channelName) { - let channelNameLower = channelName.toLowerCase(); - - if (channelMentionExists(channelNameLower)) { - // Exact match - const alias = addToken(channelNameLower, mention, escapeHtml(channelNamesMap[channelNameLower].display_name)); - return spacer + alias; - } - - // Not an exact match, attempt to truncate any punctuation to see if we can find a channel - const originalChannelName = channelNameLower; - - for (let c = channelNameLower.length; c > 0; c--) { - if (punctuation.test(channelNameLower[c - 1])) { - channelNameLower = channelNameLower.substring(0, c - 1); - - if (channelMentionExists(channelNameLower)) { - const suffix = originalChannelName.substr(c - 1); - const alias = addToken(channelNameLower, '~' + channelNameLower, - escapeHtml(channelNamesMap[channelNameLower].display_name)); - return spacer + alias + suffix; - } - } else { - // If the last character is not punctuation, no point in going any further - break; - } - } - - return fullMatch; - } - - let output = text; - output = output.replace(/(^|\s)(~([a-z0-9.\-_]*))/gi, replaceChannelMentionWithToken); - - return output; -} - -export function escapeRegex(text) { - return text.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&'); -} - -const htmlEntities = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' -}; - -export function escapeHtml(text) { - return text.replace(/[&<>"']/g, (match) => htmlEntities[match]); -} - -function highlightCurrentMentions(text, tokens, mentionKeys = []) { - let output = text; - - // look for any existing tokens which are self mentions and should be highlighted - var newTokens = new Map(); - for (const [alias, token] of tokens) { - if (mentionKeys.indexOf(token.originalText) !== -1) { - const index = tokens.size + newTokens.size; - const newAlias = `$MM_SELFMENTION${index}`; - - newTokens.set(newAlias, { - value: `${alias}`, - originalText: token.originalText - }); - output = output.replace(alias, newAlias); - } - } - - // the new tokens are stashed in a separate map since we can't add objects to a map during iteration - for (const newToken of newTokens) { - tokens.set(newToken[0], newToken[1]); - } - - // look for self mentions in the text - function replaceCurrentMentionWithToken(fullMatch, prefix, mention) { - const index = tokens.size; - const alias = `$MM_SELFMENTION${index}`; - - tokens.set(alias, { - value: `${mention}`, - originalText: mention - }); - - return prefix + alias; - } - - for (const mention of mentionKeys) { - if (!mention) { - continue; - } - - output = output.replace(new RegExp(`(^|\\W)(${escapeRegex(mention)})\\b`, 'gi'), replaceCurrentMentionWithToken); - } - - return output; -} - -function autolinkHashtags(text, tokens) { - let output = text; - - var newTokens = new Map(); - for (const [alias, token] of tokens) { - if (token.originalText.lastIndexOf('#', 0) === 0) { - const index = tokens.size + newTokens.size; - const newAlias = `$MM_HASHTAG${index}`; - - newTokens.set(newAlias, { - value: `${token.originalText}`, - originalText: token.originalText, - hashtag: token.originalText.substring(1) - }); - - output = output.replace(alias, newAlias); - } - } - - // the new tokens are stashed in a separate map since we can't add objects to a map during iteration - for (const newToken of newTokens) { - tokens.set(newToken[0], newToken[1]); - } - - // look for hashtags in the text - function replaceHashtagWithToken(fullMatch, prefix, originalText) { - const index = tokens.size; - const alias = `$MM_HASHTAG${index}`; - - if (text.length < Constants.MIN_HASHTAG_LINK_LENGTH + 1) { - // too short to be a hashtag - return fullMatch; - } - - tokens.set(alias, { - value: `${originalText}`, - originalText, - hashtag: originalText.substring(1) - }); - - return prefix + alias; - } - - return output.replace(XRegExp.cache('(^|\\W)(#\\pL[\\pL\\d\\-_.]*[\\pL\\d])', 'g'), replaceHashtagWithToken); -} - -const puncStart = XRegExp.cache('^[^\\pL\\d\\s#]+'); -const puncEnd = XRegExp.cache('[^\\pL\\d\\s]+$'); - -function parseSearchTerms(searchTerm) { - let terms = []; - - let termString = searchTerm; - - while (termString) { - let captured; - - // check for a quoted string - captured = (/^"(.*?)"/).exec(termString); - if (captured) { - termString = termString.substring(captured[0].length); - terms.push(captured[1]); - continue; - } - - // check for a search flag (and don't add it to terms) - captured = (/^(?:in|from|channel): ?\S+/).exec(termString); - if (captured) { - termString = termString.substring(captured[0].length); - continue; - } - - // capture at mentions differently from the server so we can highlight them with the preceeding at sign - captured = (/^@\w+\b/).exec(termString); - if (captured) { - termString = termString.substring(captured[0].length); - - terms.push(captured[0]); - continue; - } - - // capture any plain text up until the next quote or search flag - captured = (/^.+?(?=\bin:|\bfrom:|\bchannel:|"|$)/).exec(termString); - if (captured) { - termString = termString.substring(captured[0].length); - - // break the text up into words based on how the server splits them in SqlPostStore.SearchPosts and then discard empty terms - terms.push(...captured[0].split(/[ <>+()~@]/).filter((term) => Boolean(term))); - continue; - } - - // we should never reach this point since at least one of the regexes should match something in the remaining text - throw new Error('Infinite loop in search term parsing: "' + termString + '"'); - } - - // remove punctuation from each term - terms = terms.map((term) => { - term.replace(puncStart, ''); - if (term.charAt(term.length - 1) !== '*') { - term.replace(puncEnd, ''); - } - return term; - }); - - return terms; -} - -function convertSearchTermToRegex(term) { - let pattern; - - if (cjkPattern.test(term)) { - // term contains Chinese, Japanese, or Korean characters so don't mark word boundaries - pattern = '()(' + escapeRegex(term.replace(/\*/g, '')) + ')'; - } else if (term.endsWith('*')) { - pattern = '\\b()(' + escapeRegex(term.substring(0, term.length - 1)) + ')'; - } else if (term.startsWith('@') || term.startsWith('#')) { - // needs special handling of the first boundary because a word boundary doesn't work before a symbol - pattern = '(\\W|^)(' + escapeRegex(term) + ')\\b'; - } else { - pattern = '\\b()(' + escapeRegex(term) + ')\\b'; - } - - return { - pattern: new RegExp(pattern, 'gi'), - term - }; -} - -export function highlightSearchTerms(text, tokens, searchPatterns) { - if (!searchPatterns || searchPatterns.length === 0) { - return text; - } - - let output = text; - - function replaceSearchTermWithToken(match, prefix, word) { - const index = tokens.size; - const alias = `$MM_SEARCHTERM${index}`; - - tokens.set(alias, { - value: `${word}`, - originalText: word - }); - - return prefix + alias; - } - - for (const pattern of searchPatterns) { - // highlight existing tokens matching search terms - var newTokens = new Map(); - for (const [alias, token] of tokens) { - if (pattern.pattern.test(token.originalText)) { - // If it's a Hashtag, skip it unless the search term is an exact match. - let originalText = token.originalText; - if (originalText.startsWith('#')) { - originalText = originalText.substr(1); - } - let term = pattern.term; - if (term.startsWith('#')) { - term = term.substr(1); - } - - if (alias.startsWith('$MM_HASHTAG') && originalText !== term) { - continue; - } - - const index = tokens.size + newTokens.size; - const newAlias = `$MM_SEARCHTERM${index}`; - - newTokens.set(newAlias, { - value: `${alias}`, - originalText: token.originalText - }); - - output = output.replace(alias, newAlias); - } - - // The pattern regexes are global, so calling pattern.pattern.test() above alters their - // state. Reset lastIndex to 0 between calls to test() to ensure it returns the - // same result every time it is called with the same value of token.originalText. - pattern.pattern.lastIndex = 0; - } - - // the new tokens are stashed in a separate map since we can't add objects to a map during iteration - for (const newToken of newTokens) { - tokens.set(newToken[0], newToken[1]); - } - - output = output.replace(pattern.pattern, replaceSearchTermWithToken); - } - - return output; -} - -export function replaceTokens(text, tokens) { - let output = text; - - // iterate backwards through the map so that we do replacement in the opposite order that we added tokens - const aliases = [...tokens.keys()]; - for (let i = aliases.length - 1; i >= 0; i--) { - const alias = aliases[i]; - const token = tokens.get(alias); - output = output.replace(alias, token.value); - } - - return output; -} - -function replaceNewlines(text) { - return text.replace(/\n/g, ' '); -} diff --git a/webapp/utils/url.jsx b/webapp/utils/url.jsx deleted file mode 100644 index f1edf58c1..000000000 --- a/webapp/utils/url.jsx +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import {latinise} from 'utils/latinise.jsx'; - -export function cleanUpUrlable(input) { - var cleaned = latinise(input); - cleaned = cleaned.trim().replace(/-/g, ' ').replace(/[^\w\s]/gi, '').toLowerCase().replace(/\s/g, '-'); - cleaned = cleaned.replace(/-{2,}/, '-'); - cleaned = cleaned.replace(/^-+/, ''); - cleaned = cleaned.replace(/-+$/, ''); - return cleaned; -} - -export function getShortenedURL(url = '', getLength = 27) { - if (url.length > 35) { - const subLength = getLength - 14; - return url.substring(0, 10) + '...' + url.substring(url.length - subLength, url.length) + '/'; - } - return url + '/'; -} - -export function getSiteURL() { - if (window.location.origin) { - return window.location.origin; - } - - return window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); -} diff --git a/webapp/utils/user_agent.jsx b/webapp/utils/user_agent.jsx deleted file mode 100644 index c16d61d45..000000000 --- a/webapp/utils/user_agent.jsx +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -/* -Example User Agents --------------------- - -Chrome: - Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 - -Firefox: - Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0 - -IE11: - Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko - -Edge: - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 - -Desktop App: - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/1.2.1 Chrome/49.0.2623.75 Electron/0.37.8 Safari/537.36 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 - Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/53.0.2785.113 Electron/1.4.2 Safari/537.36 - Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Mattermost/3.4.1 Chrome/51.0.2704.106 Electron/1.2.8 Safari/537.36 - -Android Chrome: - Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19 - -Android App: - Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30 - Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36 - Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36 - -iOS Safari: - Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543 Safari/419.3 - -iOS Android: - Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; en) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3 - -iOS App: - Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69 -*/ - -const userAgent = window.navigator.userAgent; - -export function isChrome() { - return userAgent.indexOf('Chrome') > -1; -} - -export function isSafari() { - return userAgent.indexOf('Safari') !== -1 && userAgent.indexOf('Chrome') === -1; -} - -export function isIosSafari() { - return userAgent.indexOf('iPhone') !== -1 && userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('CriOS') === -1; -} - -export function isIosChrome() { - return userAgent.indexOf('CriOS') !== -1; -} - -export function isIosWeb() { - return isIosSafari() || isIosChrome(); -} - -export function isIos() { - return userAgent.indexOf('iPhone') !== -1 || userAgent.indexOf('iPad') !== -1; -} - -export function isAndroid() { - return userAgent.indexOf('Android') !== -1; -} - -export function isAndroidChrome() { - return userAgent.indexOf('Android') !== -1 && userAgent.indexOf('Chrome') !== -1 && userAgent.indexOf('Version') === -1; -} - -export function isAndroidWeb() { - return isAndroidChrome(); -} - -// Returns true if and only if the user is using a Mattermost mobile app. This will return false if the user is using the -// web browser on a mobile device. -export function isMobileApp() { - return isMobile() && !isIosWeb() && !isAndroidWeb(); -} - -// Returns true if and only if the user is using Mattermost from either the mobile app or the web browser on a mobile device. -export function isMobile() { - return isIos() || isAndroid(); -} - -export function isFirefox() { - return userAgent.indexOf('Firefox') !== -1; -} - -export function isInternetExplorer() { - return userAgent.indexOf('Trident') !== -1; -} - -export function isEdge() { - return userAgent.indexOf('Edge') !== -1; -} - -export function isDesktopApp() { - return userAgent.indexOf('Mattermost') !== -1 && userAgent.indexOf('Electron') !== -1; -} - -export function isWindowsApp() { - return isDesktopApp() && userAgent.indexOf('Windows') !== -1; -} - -export function isMacApp() { - return isDesktopApp() && userAgent.indexOf('Macintosh') !== -1; -} diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx deleted file mode 100644 index 9bfd22e07..000000000 --- a/webapp/utils/utils.jsx +++ /dev/null @@ -1,1441 +0,0 @@ -// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. -// See License.txt for license information. - -import $ from 'jquery'; -import AppDispatcher from '../dispatcher/app_dispatcher.jsx'; -import ChannelStore from 'stores/channel_store.jsx'; -import UserStore from 'stores/user_store.jsx'; -import LocalizationStore from 'stores/localization_store.jsx'; -import PreferenceStore from 'stores/preference_store.jsx'; -import TeamStore from 'stores/team_store.jsx'; -import Constants from 'utils/constants.jsx'; -var ActionTypes = Constants.ActionTypes; -import * as UserAgent from 'utils/user_agent.jsx'; -import {Posts} from 'mattermost-redux/constants'; -import {Client4} from 'mattermost-redux/client'; - -import {browserHistory} from 'react-router/es6'; -import {FormattedMessage} from 'react-intl'; - -import icon50 from 'images/icon50x50.png'; -import bing from 'images/bing.mp3'; - -import React from 'react'; - -export function isEmail(email) { - // writing a regex to match all valid email addresses is really, really hard (see http://stackoverflow.com/a/201378) - // so we just do a simple check and rely on a verification email to tell if it's a real address - return (/^.+@.+$/).test(email); -} - -export function isMac() { - return navigator.platform.toUpperCase().indexOf('MAC') >= 0; -} - -export function createSafeId(prop) { - if (prop === null) { - return null; - } - - var str = ''; - - if (prop.props && prop.props.defaultMessage) { - str = prop.props.defaultMessage; - } else { - str = prop.toString(); - } - - return str.replace(new RegExp(' ', 'g'), '_'); -} - -export function cmdOrCtrlPressed(e, allowAlt = false) { - if (allowAlt) { - return (isMac() && e.metaKey) || (!isMac() && e.ctrlKey); - } - return (isMac() && e.metaKey) || (!isMac() && e.ctrlKey && !e.altKey); -} - -export function isInRole(roles, inRole) { - var parts = roles.split(' '); - for (var i = 0; i < parts.length; i++) { - if (parts[i] === inRole) { - return true; - } - } - - return false; -} - -export function isChannelAdmin(roles) { - if (global.mm_license.IsLicensed !== 'true') { - return false; - } - - if (isInRole(roles, 'channel_admin')) { - return true; - } - - return false; -} - -export function isAdmin(roles) { - if (isInRole(roles, 'team_admin')) { - return true; - } - - if (isInRole(roles, 'system_admin')) { - return true; - } - - return false; -} - -export function isSystemAdmin(roles) { - if (isInRole(roles, 'system_admin')) { - return true; - } - - return false; -} - -export function getCookie(name) { - var value = '; ' + document.cookie; - var parts = value.split('; ' + name + '='); - if (parts.length === 2) { - return parts.pop().split(';').shift(); - } - return ''; -} - -var requestedNotificationPermission = false; - -export function notifyMe(title, body, channel, teamId, duration, silent) { - if (!('Notification' in window)) { - return; - } - - let notificationDuration = Constants.DEFAULT_NOTIFICATION_DURATION; - if (duration != null) { - notificationDuration = duration; - } - - if (Notification.permission === 'granted' || (Notification.permission === 'default' && !requestedNotificationPermission)) { - requestedNotificationPermission = true; - - if (typeof Notification.requestPermission === 'function') { - Notification.requestPermission((permission) => { - if (permission === 'granted') { - try { - var notification = new Notification(title, {body, tag: body, icon: icon50, requireInteraction: notificationDuration === 0, silent}); - notification.onclick = () => { - window.focus(); - if (channel && (channel.type === Constants.DM_CHANNEL || channel.type === Constants.GM_CHANNEL)) { - browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/' + channel.name); - } else if (channel) { - browserHistory.push(TeamStore.getTeamUrl(teamId) + '/channels/' + channel.name); - } else if (teamId) { - browserHistory.push(TeamStore.getTeamUrl(teamId) + '/channels/town-square'); - } else { - browserHistory.push(TeamStore.getCurrentTeamUrl() + '/channels/town-square'); - } - }; - - if (notificationDuration > 0) { - setTimeout(() => { - notification.close(); - }, notificationDuration); - } - } catch (e) { - console.error(e); //eslint-disable-line no-console - } - } - }); - } - } -} - -var canDing = true; - -export function ding() { - if (hasSoundOptions() && canDing) { - var audio = new Audio(bing); - audio.play(); - canDing = false; - setTimeout(() => { - canDing = true; - }, 3000); - } -} - -export function hasSoundOptions() { - return (!(UserAgent.isFirefox()) && !(UserAgent.isEdge())); -} - -export function getDateForUnixTicks(ticks) { - return new Date(ticks); -} - -export function displayDate(ticks) { - var d = new Date(ticks); - var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - - return monthNames[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear(); -} - -export function displayTime(ticks, utc) { - const d = new Date(ticks); - let hours; - let minutes; - let ampm = ''; - let timezone = ''; - - if (utc) { - hours = d.getUTCHours(); - minutes = d.getUTCMinutes(); - timezone = ' UTC'; - } else { - hours = d.getHours(); - minutes = d.getMinutes(); - } - - if (minutes <= 9) { - minutes = '0' + minutes; - } - - const useMilitaryTime = PreferenceStore.getBool(Constants.Preferences.CATEGORY_DISPLAY_SETTINGS, 'use_military_time'); - if (!useMilitaryTime) { - ampm = ' AM'; - if (hours >= 12) { - ampm = ' PM'; - } - - hours %= 12; - if (!hours) { - hours = '12'; - } - } - - return hours + ':' + minutes + ampm + timezone; -} - -// returns Unix timestamp in milliseconds -export function getTimestamp() { - return Date.now(); -} - -// extracts links not styled by Markdown -export function extractFirstLink(text) { - const pattern = /(^|[\s\n]|)((?:https?|ftp):\/\/[-A-Z0-9+\u0026\u2019@#/%?=()~_|!:,.;]*[-A-Z0-9+\u0026@#/%=~()_|])/i; - let inText = text; - - // strip out code blocks - inText = inText.replace(/`[^`]*`/g, ''); - - // strip out inline markdown images - inText = inText.replace(/!\[[^\]]*]\([^)]*\)/g, ''); - - const match = pattern.exec(inText); - if (match) { - return match[0].trim(); - } - - return ''; -} - -// Taken from http://stackoverflow.com/questions/1068834/object-comparison-in-javascript and modified slightly -export function areObjectsEqual(x, y) { - let p; - const leftChain = []; - const rightChain = []; - - // Remember that NaN === NaN returns false - // and isNaN(undefined) returns true - if (isNaN(x) && isNaN(y) && typeof x === 'number' && typeof y === 'number') { - return true; - } - - // Compare primitives and functions. - // Check if both arguments link to the same object. - // Especially useful on step when comparing prototypes - if (x === y) { - return true; - } - - // Works in case when functions are created in constructor. - // Comparing dates is a common scenario. Another built-ins? - // We can even handle functions passed across iframes - if ((typeof x === 'function' && typeof y === 'function') || - (x instanceof Date && y instanceof Date) || - (x instanceof RegExp && y instanceof RegExp) || - (x instanceof String && y instanceof String) || - (x instanceof Number && y instanceof Number)) { - return x.toString() === y.toString(); - } - - if (x instanceof Map && y instanceof Map) { - return areMapsEqual(x, y); - } - - // At last checking prototypes as good a we can - if (!(x instanceof Object && y instanceof Object)) { - return false; - } - - if (x.isPrototypeOf(y) || y.isPrototypeOf(x)) { - return false; - } - - if (x.constructor !== y.constructor) { - return false; - } - - if (x.prototype !== y.prototype) { - return false; - } - - // Check for infinitive linking loops - if (leftChain.indexOf(x) > -1 || rightChain.indexOf(y) > -1) { - return false; - } - - // Quick checking of one object beeing a subset of another. - for (p in y) { - if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) { - return false; - } else if (typeof y[p] !== typeof x[p]) { - return false; - } - } - - for (p in x) { - if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) { - return false; - } else if (typeof y[p] !== typeof x[p]) { - return false; - } - - switch (typeof (x[p])) { - case 'object': - case 'function': - - leftChain.push(x); - rightChain.push(y); - - if (!areObjectsEqual(x[p], y[p])) { - return false; - } - - leftChain.pop(); - rightChain.pop(); - break; - - default: - if (x[p] !== y[p]) { - return false; - } - break; - } - } - - return true; -} - -export function areMapsEqual(a, b) { - if (a.size !== b.size) { - return false; - } - - for (const [key, value] of a) { - if (!b.has(key)) { - return false; - } - - if (!areObjectsEqual(value, b.get(key))) { - return false; - } - } - - return true; -} - -export function replaceHtmlEntities(text) { - var tagsToReplace = { - '&': '&', - '<': '<', - '>': '>' - }; - var newtext = text; - for (var tag in tagsToReplace) { - if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) { - var regex = new RegExp(tag, 'g'); - newtext = newtext.replace(regex, tagsToReplace[tag]); - } - } - return newtext; -} - -export function insertHtmlEntities(text) { - var tagsToReplace = { - '&': '&', - '<': '<', - '>': '>' - }; - var newtext = text; - for (var tag in tagsToReplace) { - if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) { - var regex = new RegExp(tag, 'g'); - newtext = newtext.replace(regex, tagsToReplace[tag]); - } - } - return newtext; -} - -export function getFileType(extin) { - var ext = extin.toLowerCase(); - if (Constants.IMAGE_TYPES.indexOf(ext) > -1) { - return 'image'; - } - - if (Constants.AUDIO_TYPES.indexOf(ext) > -1) { - return 'audio'; - } - - if (Constants.VIDEO_TYPES.indexOf(ext) > -1) { - return 'video'; - } - - if (Constants.SPREADSHEET_TYPES.indexOf(ext) > -1) { - return 'spreadsheet'; - } - - if (Constants.CODE_TYPES.indexOf(ext) > -1) { - return 'code'; - } - - if (Constants.WORD_TYPES.indexOf(ext) > -1) { - return 'word'; - } - - if (Constants.PRESENTATION_TYPES.indexOf(ext) > -1) { - return 'presentation'; - } - - if (Constants.PDF_TYPES.indexOf(ext) > -1) { - return 'pdf'; - } - - if (Constants.PATCH_TYPES.indexOf(ext) > -1) { - return 'patch'; - } - - if (Constants.SVG_TYPES.indexOf(ext) > -1) { - return 'svg'; - } - - return 'other'; -} - -export function getFileIconPath(fileInfo) { - const fileType = getFileType(fileInfo.extension); - - var icon; - if (fileType in Constants.ICON_FROM_TYPE) { - icon = Constants.ICON_FROM_TYPE[fileType]; - } else { - icon = Constants.ICON_FROM_TYPE.other; - } - - return icon; -} - -export function getIconClassName(fileTypeIn) { - var fileType = fileTypeIn.toLowerCase(); - - if (fileType in Constants.ICON_NAME_FROM_TYPE) { - return Constants.ICON_NAME_FROM_TYPE[fileType]; - } - - return 'generic'; -} - -export function splitFileLocation(fileLocation) { - var fileSplit = fileLocation.split('.'); - - var ext = ''; - if (fileSplit.length > 1) { - ext = fileSplit[fileSplit.length - 1]; - fileSplit.splice(fileSplit.length - 1, 1); - } - - var filePath = fileSplit.join('.'); - var filename = filePath.split('/')[filePath.split('/').length - 1]; - - return {ext, name: filename, path: filePath}; -} - -export function sortFilesByName(files) { - const locale = LocalizationStore.getLocale(); - return Array.from(files).sort((a, b) => a.name.localeCompare(b.name, locale, {numeric: true})); -} - -export function toTitleCase(str) { - function doTitleCase(txt) { - return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); - } - return str.replace(/\w\S*/g, doTitleCase); -} - -export function isHexColor(value) { - return value && (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i).test(value); -} - -export function applyTheme(theme) { - if (theme.sidebarBg) { - changeCss('.app__body .sidebar--left .sidebar__switcher, .sidebar--left, .sidebar--left .sidebar__divider .sidebar__divider__text, .app__body .modal .settings-modal .settings-table .settings-links, .app__body .sidebar--menu', 'background:' + theme.sidebarBg); - changeCss('body.app__body', 'scrollbar-face-color:' + theme.sidebarBg); - changeCss('@media(max-width: 768px){.app__body .modal .settings-modal:not(.settings-modal--tabless):not(.display--content) .modal-content', 'background:' + theme.sidebarBg); - } - - if (theme.sidebarText) { - changeCss('.app__body .ps-container > .ps-scrollbar-y-rail > .ps-scrollbar-y', 'background:' + theme.sidebarText); - changeCss('.app__body .ps-container:hover .ps-scrollbar-y-rail:hover, .app__body .sidebar__switcher button:hover', 'background:' + changeOpacity(theme.sidebarText, 0.15)); - changeCss('.app__body .sidebar--left .nav-pills__container li > h4, .app__body .sidebar--left .nav-pills__container li > a, .app__body .sidebar--right, .app__body .modal .settings-modal .nav-pills>li a', 'color:' + changeOpacity(theme.sidebarText, 0.6)); - changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .settings-table .nav>li>a, .app__body .sidebar--menu', 'color:' + changeOpacity(theme.sidebarText, 0.8)); - changeCss('.app__body .sidebar--left .add-channel-btn', 'color:' + changeOpacity(theme.sidebarText, 0.8)); - changeCss('.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + theme.sidebarText); - changeCss('.sidebar--left .status .offline--icon, .app__body .sidebar--menu svg, .app__body .sidebar-item .icon', 'fill:' + theme.sidebarText); - changeCss('.sidebar--left .status.status--group', 'background:' + changeOpacity(theme.sidebarText, 0.3)); - changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .settings-table .nav>li>a, .app__body .sidebar--menu .divider', 'border-color:' + changeOpacity(theme.sidebarText, 0.2)); - changeCss('.app__body .sidebar--left .sidebar__switcher', 'border-color:' + changeOpacity(theme.sidebarText, 0.2)); - changeCss('@media(max-width: 768px){.sidebar--left .add-channel-btn:hover, .sidebar--left .add-channel-btn:focus', 'color:' + changeOpacity(theme.sidebarText, 0.6)); - changeCss('@media(max-width: 768px){.app__body .search__icon svg', 'stroke:' + theme.sidebarText); - changeCss('.app__body .sidebar--left .sidebar__switcher button', 'color:' + theme.sidebarText); - changeCss('.app__body .sidebar--left .sidebar__switcher button svg', 'fill:' + theme.sidebarText); - changeCss('.app__body .sidebar__switcher button', 'background:' + changeOpacity(theme.sidebarText, 0.08)); - } - - if (theme.sidebarUnreadText) { - changeCss('.sidebar--left .nav-pills__container li>a.unread-title', 'color:' + theme.sidebarUnreadText + '!important;'); - } - - if (theme.sidebarTextHoverBg) { - changeCss('.sidebar--left .nav-pills__container li > a:hover, .app__body .modal .settings-modal .nav-pills>li:hover a', 'background:' + theme.sidebarTextHoverBg); - } - - if (theme.sidebarTextActiveBorder) { - changeCss('.sidebar--left .nav li.active a:before, .app__body .modal .settings-modal .nav-pills>li.active a:before', 'background:' + theme.sidebarTextActiveBorder); - changeCss('.sidebar--left .sidebar__divider:before', 'background:' + changeOpacity(theme.sidebarTextActiveBorder, 0.5)); - changeCss('.sidebar--left .sidebar__divider', 'color:' + theme.sidebarTextActiveBorder); - changeCss('.multi-teams .team-sidebar .team-wrapper .team-container.active:before', 'background:' + theme.sidebarTextActiveBorder); - changeCss('.multi-teams .team-sidebar .team-wrapper .team-container.unread:before', 'background:' + theme.sidebarTextActiveBorder); - } - - if (theme.sidebarTextActiveColor) { - changeCss('.sidebar--left .nav-pills__container li.active a, .sidebar--left .nav-pills__container li.active a:hover, .sidebar--left .nav-pills__container li.active a:focus, .app__body .modal .settings-modal .nav-pills>li.active a, .app__body .modal .settings-modal .nav-pills>li.active a:hover, .app__body .modal .settings-modal .nav-pills>li.active a:active', 'color:' + theme.sidebarTextActiveColor); - changeCss('.sidebar--left .nav li.active a, .sidebar--left .nav li.active a:hover, .sidebar--left .nav li.active a:focus', 'background:' + changeOpacity(theme.sidebarTextActiveColor, 0.1)); - changeCss('@media(max-width: 768px){.app__body .modal .settings-modal .nav-pills > li.active a', 'color:' + changeOpacity(theme.sidebarText, 0.8)); - } - - if (theme.sidebarHeaderBg) { - changeCss('.app__body .status-wrapper .status_dropdown__toggle .status, .sidebar--left .team__header, .app__body .sidebar--menu .team__header, .app__body .post-list__timestamp > div', 'background:' + theme.sidebarHeaderBg); - changeCss('.app__body .modal .modal-header', 'background:' + theme.sidebarHeaderBg); - changeCss('.app__body .multi-teams .team-sidebar, .app__body #navbar .navbar-default', 'background:' + theme.sidebarHeaderBg); - changeCss('@media(max-width: 768px){.app__body .search-bar__container', 'background:' + theme.sidebarHeaderBg); - changeCss('.app__body .attachment .attachment__container', 'border-left-color:' + theme.sidebarHeaderBg); - } - - if (theme.sidebarHeaderTextColor) { - changeCss('.app__body .status-wrapper .status_dropdown__toggle .status-edit, .multi-teams .team-sidebar .team-wrapper .team-container .team-btn, .sidebar--left .team__header .header__info, .app__body .sidebar--menu .team__header .header__info, .app__body .post-list__timestamp > div', 'color:' + theme.sidebarHeaderTextColor); - changeCss('.app__body .icon--sidebarHeaderTextColor svg, .app__body .sidebar--left .status-wrapper .status_dropdown__toggle .offline--icon, .app__body .sidebar-header-dropdown__icon svg', 'fill:' + theme.sidebarHeaderTextColor); - changeCss('.sidebar--left .team__header .user__name, .app__body .sidebar--menu .team__header .user__name', 'color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.8)); - changeCss('.sidebar--left .team__header:hover .user__name, .app__body .sidebar--menu .team__header:hover .user__name', 'color:' + theme.sidebarHeaderTextColor); - changeCss('.app__body .modal .modal-header .modal-title, .app__body .modal .modal-header .modal-title .name, .app__body .modal .modal-header button.close', 'color:' + theme.sidebarHeaderTextColor); - changeCss('.app__body #navbar .navbar-default .navbar-brand .dropdown-toggle', 'color:' + theme.sidebarHeaderTextColor); - changeCss('.app__body #navbar .navbar-default .navbar-toggle .icon-bar', 'background:' + theme.sidebarHeaderTextColor); - changeCss('.app__body .post-list__timestamp > div', 'border-color:' + changeOpacity(theme.sidebarHeaderTextColor, 0.5)); - changeCss('@media(max-width: 768px){.app__body .search-bar__container', 'color:' + theme.sidebarHeaderTextColor); - changeCss('@media(max-width: 768px){.app__body .search-bar__container .search__form', 'background:' + theme.sidebarHeaderTextColor); - changeCss('.app__body .navbar-right__icon', 'background:' + changeOpacity(theme.sidebarHeaderTextColor, 0.2)); - changeCss('.app__body .navbar-right__icon svg', 'fill:' + theme.sidebarHeaderTextColor); - changeCss('.app__body .navbar-right__icon svg', 'stroke:' + theme.sidebarHeaderTextColor); - } - - if (theme.onlineIndicator) { - changeCss('.app__body .status.status--online', 'color:' + theme.onlineIndicator); - changeCss('.app__body .status .online--icon', 'fill:' + theme.onlineIndicator); - } - - if (theme.awayIndicator) { - changeCss('.app__body .status.status--away', 'color:' + theme.awayIndicator); - changeCss('.app__body .status .away--icon', 'fill:' + theme.awayIndicator); - } - - if (theme.mentionBj) { - changeCss('.sidebar--left .nav-pills__unread-indicator', 'background:' + theme.mentionBj); - changeCss('.app__body .sidebar--left .badge', 'background:' + theme.mentionBj); - changeCss('.multi-teams .team-sidebar .badge', 'background:' + theme.mentionBj); - } - - if (theme.mentionColor) { - changeCss('.sidebar--left .nav-pills__unread-indicator svg', 'fill:' + theme.mentionColor); - changeCss('.app__body .sidebar--left .nav-pills__unread-indicator', 'color:' + theme.mentionColor); - changeCss('.app__body .sidebar--left .badge', 'color:' + theme.mentionColor); - changeCss('.app__body .multi-teams .team-sidebar .badge', 'color:' + theme.mentionColor); - } - - if (theme.centerChannelBg) { - changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'background:' + theme.centerChannelBg); - changeCss('@media(max-width: 320px){.tutorial-steps__container', 'background:' + theme.centerChannelBg); - changeCss('.app__body .channel-header__info .channel-header__description:before, .app__body .status-wrapper .status_dropdown__toggle .status .icon__container:after, .app__body .app__content, .app__body .markdown__table, .app__body .markdown__table tbody tr, .app__body .suggestion-list__content, .app__body .modal .modal-content, .app__body .modal .modal-footer, .app__body .post.post--compact .post-image__column, .app__body .suggestion-list__divider > span, .app__body .status-wrapper .status, .app__body .alert.alert-transparent', 'background:' + theme.centerChannelBg); - changeCss('#post-list .post-list-holder-by-time, .app__body .post .dropdown-menu a', 'background:' + theme.centerChannelBg); - changeCss('#post-create', 'background:' + theme.centerChannelBg); - changeCss('.app__body .date-separator .separator__text, .app__body .new-separator .separator__text', 'background:' + theme.centerChannelBg); - changeCss('.app__body .post-image__details, .app__body .search-help-popover .search-autocomplete__divider span', 'background:' + theme.centerChannelBg); - changeCss('.app__body .sidebar--right, .app__body .dropdown-menu, .app__body .popover, .app__body .tip-overlay', 'background:' + theme.centerChannelBg); - changeCss('.app__body .popover.bottom>.arrow:after', 'border-bottom-color:' + theme.centerChannelBg); - changeCss('.app__body .popover.right>.arrow:after, .app__body .tip-overlay.tip-overlay--sidebar .arrow, .app__body .tip-overlay.tip-overlay--header .arrow', 'border-right-color:' + theme.centerChannelBg); - changeCss('.app__body .popover.left>.arrow:after', 'border-left-color:' + theme.centerChannelBg); - changeCss('.app__body .popover.top>.arrow:after, .app__body .tip-overlay.tip-overlay--chat .arrow', 'border-top-color:' + theme.centerChannelBg); - changeCss('@media(min-width: 768px){.app__body .form-control', 'background:' + theme.centerChannelBg); - changeCss('@media(min-width: 768px){.app__body .sidebar--right.sidebar--right--expanded .sidebar-right-container', 'background:' + theme.centerChannelBg); - changeCss('.app__body .attachment__content, .app__body .attachment-actions button', 'background:' + theme.centerChannelBg); - changeCss('body.app__body', 'scrollbar-face-color:' + theme.centerChannelBg); - changeCss('body.app__body', 'scrollbar-track-color:' + theme.centerChannelBg); - changeCss('.app__body .shortcut-key, .app__body .post-list__new-messages-below', 'color:' + theme.centerChannelBg); - changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg); - changeCss('.app__body .nav-tabs, .app__body .nav-tabs > li.active > a', 'background:' + theme.centerChannelBg); - } - - if (theme.centerChannelColor) { - changeCss('.app__body .mentions__name .status.status--group, .app__body .multi-select__note', 'background:' + changeOpacity(theme.centerChannelColor, 0.12)); - changeCss('.app__body .member-list__popover .more-modal__body, .app__body .alert.alert-transparent, .app__body .channel-header .channel-header__icon, .app__body .search-bar__container .search__form', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.12)); - changeCss('.app__body .post-list__arrows, .app__body .post .flag-icon__container', 'fill:' + changeOpacity(theme.centerChannelColor, 0.3)); - changeCss('@media(min-width: 768px){.app__body .search__icon svg', 'stroke:' + changeOpacity(theme.centerChannelColor, 0.4)); - changeCss('.app__body .channel-header__icon svg', 'fill:' + changeOpacity(theme.centerChannelColor, 0.4)); - changeCss('.app__body .modal .status .offline--icon, .app__body .channel-header__links .icon, .app__body .sidebar--right .sidebar--right__subheader .usage__icon, .app__body .more-modal__header svg, .app__body .icon--body', 'fill:' + theme.centerChannelColor); - changeCss('@media(min-width: 768px){.app__body .post:hover .post__header .col__reply, .app__body .post.post--hovered .post__header .col__reply', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .modal .shortcuts-modal .subsection, .app__body .sidebar--right .sidebar--right__header, .app__body .channel-header, .app__body .nav-tabs > li > a:hover, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a:focus, .app__body .nav-tabs, .app__body .nav-tabs > li.active > a:hover, .app__body .post .dropdown-menu a, .sidebar--left, .app__body .suggestion-list__content .command', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .post.post--system .post__body, .app__body .modal .channel-switch-modal .modal-header .close', 'color:' + changeOpacity(theme.centerChannelColor, 0.6)); - changeCss('.app__body .nav-tabs, .app__body .nav-tabs > li.active > a, pp__body .input-group-addon, .app__body .app__content, .app__body .post-create__container .post-create-body .btn-file, .app__body .post-create__container .post-create-footer .msg-typing, .app__body .suggestion-list__content .command, .app__body .modal .modal-content, .app__body .dropdown-menu, .app__body .popover, .app__body .mentions__name, .app__body .tip-overlay, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'color:' + theme.centerChannelColor); - changeCss('.app__body .post .post__link', 'color:' + changeOpacity(theme.centerChannelColor, 0.65)); - changeCss('.app__body #archive-link-home, .video-div .video-thumbnail__error', 'background:' + changeOpacity(theme.centerChannelColor, 0.15)); - changeCss('.app__body #post-create', 'color:' + theme.centerChannelColor); - changeCss('.app__body .mentions--top, .app__body .suggestion-list', 'box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px'); - changeCss('.app__body .mentions--top, .app__body .suggestion-list', '-webkit-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px'); - changeCss('.app__body .mentions--top, .app__body .suggestion-list', '-moz-box-shadow:' + changeOpacity(theme.centerChannelColor, 0.2) + ' 1px -3px 12px'); - changeCss('.app__body .dropdown-menu, .app__body .popover ', 'box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('.app__body .dropdown-menu, .app__body .popover ', '-moz-box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('.app__body .dropdown-menu, .app__body .popover ', '-webkit-box-shadow: 0 17px 50px 0 ' + changeOpacity(theme.centerChannelColor, 0.1) + ', 0 12px 15px 0 ' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('.app__body .shortcut-key, .app__body .post__body hr, .app__body .loading-screen .loading__content .round, .app__body .tutorial__circles .circle', 'background:' + theme.centerChannelColor); - changeCss('.app__body .channel-header .heading', 'color:' + theme.centerChannelColor); - changeCss('.app__body .markdown__table tbody tr:nth-child(2n)', 'background:' + changeOpacity(theme.centerChannelColor, 0.07)); - changeCss('.app__body .channel-header__info .header-dropdown__icon', 'color:' + changeOpacity(theme.centerChannelColor, 0.8)); - changeCss('.app__body .post-create__container .post-create-body .send-button.disabled i, .app__body .channel-header #member_popover', 'color:' + changeOpacity(theme.centerChannelColor, 0.4)); - changeCss('.app__body .channel-header .pinned-posts-button svg', 'fill:' + changeOpacity(theme.centerChannelColor, 0.6)); - changeCss('.app__body .custom-textarea, .app__body .custom-textarea:focus, .app__body .file-preview, .app__body .post-image__details, .app__body .sidebar--right .sidebar-right__body, .app__body .markdown__table th, .app__body .markdown__table td, .app__body .suggestion-list__content, .app__body .modal .modal-content, .app__body .modal .settings-modal .settings-table .settings-content .divider-light, .app__body .webhooks__container, .app__body .dropdown-menu, .app__body .modal .modal-header', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .popover.bottom>.arrow', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.25)); - changeCss('.app__body .search-help-popover .search-autocomplete__divider span, .app__body .suggestion-list__divider > span', 'color:' + changeOpacity(theme.centerChannelColor, 0.7)); - changeCss('.app__body .popover.right>.arrow', 'border-right-color:' + changeOpacity(theme.centerChannelColor, 0.25)); - changeCss('.app__body .popover.left>.arrow', 'border-left-color:' + changeOpacity(theme.centerChannelColor, 0.25)); - changeCss('.app__body .popover.top>.arrow', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.25)); - changeCss('.app__body .suggestion-list__content .command, .app__body .popover .popover-title', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .suggestion-list__content .command, .app__body .popover .popover__row', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .suggestion-list__divider:before, .app__body .dropdown-menu .divider, .app__body .search-help-popover .search-autocomplete__divider:before', 'background:' + theme.centerChannelColor); - changeCss('.app__body .custom-textarea', 'color:' + theme.centerChannelColor); - changeCss('.app__body .post-image__column', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .post-image__details', 'color:' + theme.centerChannelColor); - changeCss('.app__body .post-image__column a, .app__body .post-image__column a:hover, .app__body .post-image__column a:focus', 'color:' + theme.centerChannelColor); - changeCss('@media(min-width: 768px){.app__body .search-bar__container .search__form .search-bar, .app__body .form-control', 'color:' + theme.centerChannelColor); - changeCss('.app__body .input-group-addon, .app__body .form-control, .app__body .post-create__container .post-body__actions > span, .app__body .post-create__container .post-body__actions > a', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('@media(min-width: 768px){.app__body .post-list__table .post-list__content .dropdown-menu a:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('.app__body .form-control:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .attachment .attachment__content, .app__body .attachment-actions button', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3)); - changeCss('.app__body .attachment-actions button:focus, .app__body .attachment-actions button:hover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.5)); - changeCss('.app__body .attachment-actions button:focus, .app__body .attachment-actions button:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.03)); - changeCss('.app__body .input-group-addon, .app__body .channel-intro .channel-intro__content, .app__body .webhooks__container', 'background:' + changeOpacity(theme.centerChannelColor, 0.05)); - changeCss('.app__body .date-separator .separator__text', 'color:' + theme.centerChannelColor); - changeCss('.app__body .date-separator .separator__hr, .app__body .modal-footer, .app__body .modal .custom-textarea', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .search-item-container, .app__body .post-right__container .post.post--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('.app__body .modal .custom-textarea:focus', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.3)); - changeCss('.app__body .channel-intro, .app__body .modal .settings-modal .settings-table .settings-content .divider-dark, .app__body hr, .app__body .modal .settings-modal .settings-table .settings-links, .app__body .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__header, .app__body .user-settings .authorized-app:not(:last-child)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .post.current--user .post__body, .app__body .post.post--comment.other--root.current--user .post-comment, .app__body pre, .app__body .post-right__container .post.post--root', 'background:' + changeOpacity(theme.centerChannelColor, 0.05)); - changeCss('.app__body .post.post--comment.other--root.current--user .post-comment, .app__body .more-modal__list .more-modal__row, .app__body .member-div:first-child, .app__body .member-div, .app__body .access-history__table .access__report, .app__body .activity-log__table', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('@media(max-width: 1800px){.app__body .inner-wrap.move--left .post.post--comment.same--root', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07)); - changeCss('.app__body .post.post--hovered', 'background:' + changeOpacity(theme.centerChannelColor, 0.08)); - changeCss('.app__body .attachment__body__wrap.btn-close', 'background:' + changeOpacity(theme.centerChannelColor, 0.08)); - changeCss('.app__body .attachment__body__wrap.btn-close', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('@media(min-width: 768px){.app__body .post:hover, .app__body .more-modal__list .more-modal__row:hover, .app__body .modal .settings-modal .settings-table .settings-content .section-min:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.08)); - changeCss('.app__body .more-modal__row.more-modal__row--selected, .app__body .date-separator.hovered--before:after, .app__body .date-separator.hovered--after:before, .app__body .new-separator.hovered--after:before, .app__body .new-separator.hovered--before:after', 'background:' + changeOpacity(theme.centerChannelColor, 0.07)); - changeCss('@media(min-width: 768px){.app__body .suggestion-list__content .command:hover, .app__body .mentions__name:hover, .app__body .dropdown-menu>li>a:focus, .app__body .dropdown-menu>li>a:hover', 'background:' + changeOpacity(theme.centerChannelColor, 0.15)); - changeCss('.app__body .suggestion--selected, .app__body .emoticon-suggestion:hover, .app__body .bot-indicator', 'background:' + changeOpacity(theme.centerChannelColor, 0.15)); - changeCss('code, .app__body .form-control[disabled], .app__body .form-control[readonly], .app__body fieldset[disabled] .form-control', 'background:' + changeOpacity(theme.centerChannelColor, 0.1)); - changeCss('@media(min-width: 960px){.app__body .post.current--user:hover .post__body ', 'background: none;'); - changeCss('.app__body .sidebar--right', 'color:' + theme.centerChannelColor); - changeCss('.app__body .search-help-popover .search-autocomplete__item:hover, .app__body .modal .settings-modal .settings-table .settings-content .appearance-section .theme-elements__body', 'background:' + changeOpacity(theme.centerChannelColor, 0.05)); - changeCss('.app__body .search-help-popover .search-autocomplete__item.selected', 'background:' + changeOpacity(theme.centerChannelColor, 0.15)); - if (!UserAgent.isFirefox() && !UserAgent.isInternetExplorer() && !UserAgent.isEdge()) { - changeCss('body.app__body ::-webkit-scrollbar-thumb', 'background:' + changeOpacity(theme.centerChannelColor, 0.4)); - } - changeCss('body', 'scrollbar-arrow-color:' + theme.centerChannelColor); - changeCss('.app__body .post-create__container .post-create-body .btn-file svg, .app__body .post.post--compact .post-image__column .post-image__details svg, .app__body .modal .about-modal .about-modal__logo svg, .app__body .post .post__img svg, .app__body .post-body__actions svg', 'fill:' + theme.centerChannelColor); - changeCss('.app__body .scrollbar--horizontal, .app__body .scrollbar--vertical', 'background:' + changeOpacity(theme.centerChannelColor, 0.5)); - changeCss('.app__body .post-list__new-messages-below', 'background:' + changeColor(theme.centerChannelColor, 0.5)); - changeCss('.app__body .post.post--comment .post__body', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('@media(min-width: 768px){.app__body .post.post--compact.same--root.post--comment .post__content', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .post.post--comment.current--user .post__body', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .channel-header__info .status .offline--icon', 'fill:' + theme.centerChannelColor); - changeCss('.app__body .navbar .status .offline--icon', 'fill:' + theme.centerChannelColor); - changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.25)); - changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'color:' + changeOpacity(theme.centerChannelColor, 0.7)); - changeCss('.app__body .emoji-picker', 'color:' + theme.centerChannelColor); - changeCss('.app__body .emoji-picker', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .emoji-picker__preview, .app__body .emoji-picker__items, .app__body .emoji-picker__search-container', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.2)); - changeCss('.app__body .emoji-picker__items', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.05)); - changeCss('.emoji-picker__category .fa:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8)); - changeCss('.app__body .emoji-picker__category, .app__body .emoji-picker__category:focus, .app__body .emoji-picker__category:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.3)); - changeCss('.app__body .emoji-picker__category--selected, .app__body .emoji-picker__category--selected:focus, .app__body .emoji-picker__category--selected:hover', 'color:' + theme.centerChannelColor); - changeCss('.app__body .emoji-picker__item-wrapper:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8)); - changeCss('.app__body .emojisprite:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8)); - changeCss('.app__body .icon__postcontent_picker:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8)); - changeCss('.app__body .popover', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.07)); - } - - if (theme.newMessageSeparator) { - changeCss('.app__body .new-separator .separator__text', 'color:' + theme.newMessageSeparator); - changeCss('.app__body .new-separator .separator__hr', 'border-color:' + changeOpacity(theme.newMessageSeparator, 0.5)); - } - - if (theme.linkColor) { - changeCss('.app__body .channel-header__links > a.active, .app__body a, .app__body a:focus, .app__body a:hover, .app__body .btn, .app__body .btn:focus, .app__body .btn:hover', 'color:' + theme.linkColor); - changeCss('.app__body .attachment .attachment__container', 'border-left-color:' + changeOpacity(theme.linkColor, 0.5)); - changeCss('.app__body .member-list__popover .more-modal__list .more-modal__row:hover', 'background:' + changeOpacity(theme.linkColor, 0.08)); - changeCss('.app__body .channel-header__links .icon:hover, .app__body .channel-header__links > a.active .icon, .app__body .post .flag-icon__container.visible, .app__body .post .reacticon__container, .app__body .post .comment-icon__container, .app__body .post .post__reply', 'fill:' + theme.linkColor); - changeCss('@media(min-width: 768px){.app__body .search__form.focused .search__icon svg', 'stroke:' + theme.linkColor); - changeCss('.app__body .channel-header__links .icon:hover, .app__body .post .flag-icon__container.visible, .app__body .post .comment-icon__container, .app__body .post .post__reply', 'fill:' + theme.linkColor); - changeCss('.app__body .channel-header .channel-header__icon:hover #member_popover, .app__body .channel-header .channel-header__icon.active #member_popover', 'color:' + theme.linkColor); - changeCss('.app__body .channel-header .pinned-posts-button:hover svg', 'fill:' + changeOpacity(theme.linkColor, 0.6)); - changeCss('.app__body .member-list__popover .more-modal__actions svg, .app__body .channel-header .channel-header__icon:hover svg, .app__body .channel-header .channel-header__icon.active svg', 'fill:' + theme.linkColor); - changeCss('.app__body .post-reaction.post-reaction--current-user', 'background:' + changeOpacity(theme.linkColor, 0.1)); - changeCss('.app__body .post-reaction.post-reaction--current-user', 'border-color:' + changeOpacity(theme.linkColor, 0.4)); - changeCss('.app__body .member-list__popover .more-modal__list .more-modal__row:hover, .app__body .channel-header .channel-header__icon:hover, .app__body .channel-header .channel-header__icon.active, .app__body .search-bar__container .search__form.focused', 'border-color:' + theme.linkColor); - changeCss('.app__body .post-reaction.post-reaction--current-user', 'color:' + theme.linkColor); - changeCss('.app__body .channel-header__title.open .heading, .app__body .channel-header__info .channel-header__title.open .header-dropdown__icon', 'color:' + theme.linkColor); - changeCss('.app__body .channel-header .dropdown-toggle:hover .heading, .app__body .channel-header .dropdown-toggle:hover .header-dropdown__icon', 'color:' + theme.linkColor); - } - - if (theme.buttonBg) { - changeCss('.app__body .new-messages__button div, .app__body .btn.btn-primary, .app__body .tutorial__circles .circle.active, .app__body .post__pinned-badge', 'background:' + theme.buttonBg); - changeCss('.app__body .btn.btn-primary:hover, .app__body .btn.btn-primary:active, .app__body .btn.btn-primary:focus', 'background:' + changeColor(theme.buttonBg, -0.15)); - } - - if (theme.buttonColor) { - changeCss('.app__body .new-messages__button div, .app__body .btn.btn-primary, .app__body .post__pinned-badge', 'color:' + theme.buttonColor); - changeCss('.app__body .new-messages__button svg', 'fill:' + theme.buttonColor); - } - - if (theme.errorTextColor) { - changeCss('.app__body .has-error .help-block, .app__body .has-error .control-label, .app__body .has-error .radio, .app__body .has-error .checkbox, .app__body .has-error .radio-inline, .app__body .has-error .checkbox-inline, .app__body .has-error.radio label, .app__body .has-error.checkbox label, .app__body .has-error.radio-inline label, .app__body .has-error.checkbox-inline label', 'color:' + theme.errorTextColor); - } - - if (theme.mentionHighlightBg) { - changeCss('.app__body .mention--highlight, .app__body .search-highlight', 'background:' + theme.mentionHighlightBg); - changeCss('.app__body .post.post--comment .post__body.mention-comment', 'border-color:' + theme.mentionHighlightBg); - changeCss('.app__body .post.post--highlight', 'background:' + changeOpacity(theme.mentionHighlightBg, 0.5)); - } - - if (theme.mentionHighlightLink) { - changeCss('.app__body .mention--highlight .mention-link, .app__body .mention--highlight, .app__body .search-highlight', 'color:' + theme.mentionHighlightLink); - } - - if (!theme.codeTheme) { - theme.codeTheme = Constants.DEFAULT_CODE_THEME; - } - updateCodeTheme(theme.codeTheme); -} - -export function resetTheme() { - applyTheme(Constants.THEMES.default); -} - -export function changeCss(className, classValue) { - let styleEl = document.querySelector('style[data-class="' + className + '"]'); - if (!styleEl) { - styleEl = document.createElement('style'); - styleEl.setAttribute('data-class', className); - - // Append style element to head - document.head.appendChild(styleEl); - } - - // Grab style sheet - const styleSheet = styleEl.sheet; - const rules = styleSheet.cssRules || styleSheet.rules; - const style = classValue.substr(0, classValue.indexOf(':')); - const value = classValue.substr(classValue.indexOf(':') + 1); - - for (let i = 0; i < rules.length; i++) { - if (rules[i].selectorText === className) { - rules[i].style[style] = value; - return; - } - } - - let mediaQuery = ''; - if (className.indexOf('@media') >= 0) { - mediaQuery = '}'; - } - styleSheet.insertRule(className + '{' + classValue + '}' + mediaQuery, styleSheet.cssRules.length); -} - -export function updateCodeTheme(userTheme) { - let cssPath = ''; - Constants.THEME_ELEMENTS.forEach((element) => { - if (element.id === 'codeTheme') { - element.themes.forEach((theme) => { - if (userTheme === theme.id) { - cssPath = theme.cssURL; - } - }); - } - }); - const $link = $('link.code_theme'); - if (cssPath !== $link.attr('href')) { - changeCss('code.hljs', 'visibility: hidden'); - var xmlHTTP = new XMLHttpRequest(); - xmlHTTP.open('GET', cssPath, true); - xmlHTTP.onload = function onLoad() { - $link.attr('href', cssPath); - if (UserAgent.isFirefox()) { - $link.one('load', () => { - changeCss('code.hljs', 'visibility: visible'); - }); - } else { - changeCss('code.hljs', 'visibility: visible'); - } - }; - xmlHTTP.send(); - } -} - -export function placeCaretAtEnd(el) { - el.focus(); - el.selectionStart = el.value.length; - el.selectionEnd = el.value.length; -} - -export function getCaretPosition(el) { - if (el.selectionStart) { - return el.selectionStart; - } else if (document.selection) { - el.focus(); - - var r = document.selection.createRange(); - if (r == null) { - return 0; - } - - var re = el.createTextRange(); - var rc = re.duplicate(); - re.moveToBookmark(r.getBookmark()); - rc.setEndPoint('EndToStart', re); - - return rc.text.length; - } - return 0; -} - -export function setSelectionRange(input, selectionStart, selectionEnd) { - if (input.setSelectionRange) { - input.focus(); - input.setSelectionRange(selectionStart, selectionEnd); - } else if (input.createTextRange) { - var range = input.createTextRange(); - range.collapse(true); - range.moveEnd('character', selectionEnd); - range.moveStart('character', selectionStart); - range.select(); - } -} - -export function setCaretPosition(input, pos) { - setSelectionRange(input, pos, pos); -} - -export function getSelectedText(input) { - var selectedText; - if (typeof document.selection !== 'undefined') { - input.focus(); - var sel = document.selection.createRange(); - selectedText = sel.text; - } else if (typeof input.selectionStart !== 'undefined') { - var startPos = input.selectionStart; - var endPos = input.selectionEnd; - selectedText = input.value.substring(startPos, endPos); - } - - return selectedText; -} - -export function isValidUsername(name) { - var error = ''; - if (!name) { - error = 'This field is required'; - } else if (name.length < Constants.MIN_USERNAME_LENGTH || name.length > Constants.MAX_USERNAME_LENGTH) { - error = 'Must be between ' + Constants.MIN_USERNAME_LENGTH + ' and ' + Constants.MAX_USERNAME_LENGTH + ' characters'; - } else if (!(/^[a-z0-9.\-_]+$/).test(name)) { - error = "Must contain only letters, numbers, and the symbols '.', '-', and '_'."; - } else if (!(/[a-z]/).test(name.charAt(0))) { //eslint-disable-line no-negated-condition - error = 'First character must be a letter.'; - } else { - for (var i = 0; i < Constants.RESERVED_USERNAMES.length; i++) { - if (name === Constants.RESERVED_USERNAMES[i]) { - error = 'Cannot use a reserved word as a username.'; - break; - } - } - } - - return error; -} - -export function isMobile() { - return window.innerWidth <= Constants.MOBILE_SCREEN_WIDTH; -} - -export function getDirectTeammate(channelId) { - var userIds = ChannelStore.get(channelId).name.split('__'); - var curUserId = UserStore.getCurrentId(); - var teammate = {}; - - if (userIds.length !== 2 || userIds.indexOf(curUserId) === -1) { - return teammate; - } - - for (var idx in userIds) { - if (userIds[idx] !== curUserId) { - teammate = UserStore.getProfile(userIds[idx]); - break; - } - } - - return teammate; -} - -export function loadImage(url, onLoad, onProgress) { - const request = new XMLHttpRequest(); - - request.open('GET', url, true); - request.responseType = 'arraybuffer'; - request.onload = onLoad; - request.onprogress = (e) => { - if (onProgress) { - const completedPercentage = Math.round((e.loaded / e.total) * 100); - - onProgress(completedPercentage); - } - }; - - request.send(); -} - -export function changeColor(colourIn, amt) { - var hex = colourIn; - var lum = amt; - - // validate hex string - hex = String(hex).replace(/[^0-9a-f]/gi, ''); - if (hex.length < 6) { - hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; - } - lum = lum || 0; - - // convert to decimal and change luminosity - var rgb = '#'; - var c; - var i; - for (i = 0; i < 3; i++) { - c = parseInt(hex.substr(i * 2, 2), 16); - c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); - rgb += ('00' + c).substr(c.length); - } - - return rgb; -} - -export function changeOpacity(oldColor, opacity) { - var color = oldColor; - if (color[0] === '#') { - color = color.slice(1); - } - - if (color.length === 3) { - const tempColor = color; - color = ''; - - color += tempColor[0] + tempColor[0]; - color += tempColor[1] + tempColor[1]; - color += tempColor[2] + tempColor[2]; - } - - var r = parseInt(color.substring(0, 2), 16); - var g = parseInt(color.substring(2, 4), 16); - var b = parseInt(color.substring(4, 6), 16); - - return 'rgba(' + r + ',' + g + ',' + b + ',' + opacity + ')'; -} - -export function getFullName(user) { - if (user.first_name && user.last_name) { - return user.first_name + ' ' + user.last_name; - } else if (user.first_name) { - return user.first_name; - } else if (user.last_name) { - return user.last_name; - } - - return ''; -} - -export function getDisplayName(user) { - if (user.nickname && user.nickname.trim().length > 0) { - return user.nickname; - } - var fullName = getFullName(user); - - if (fullName) { - return fullName; - } - - return user.username; -} - -/** - * Gets the display name of the user with the specified id, respecting the TeammateNameDisplay configuration setting - */ -export function displayUsername(userId) { - return displayUsernameForUser(UserStore.getProfile(userId)); -} - -/** - * Gets the display name of the specified user, respecting the TeammateNameDisplay configuration setting - */ -export function displayUsernameForUser(user) { - if (user) { - const nameFormat = global.window.mm_config.TeammateNameDisplay; - let name = user.username; - if (nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME && user.nickname && user.nickname !== '') { - name = user.nickname; - } else if ((user.first_name || user.last_name) && (nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_NICKNAME_FULLNAME || nameFormat === Constants.TEAMMATE_NAME_DISPLAY.SHOW_FULLNAME)) { - name = getFullName(user); - } - - return name; - } - - return ''; -} - -/** - * Gets the entire name, including username, full name, and nickname, of the user with the specified id - */ -export function displayEntireName(userId) { - return displayEntireNameForUser(UserStore.getProfile(userId)); -} - -/** - * Gets the entire name, including username, full name, and nickname, of the specified user - */ -export function displayEntireNameForUser(user) { - if (!user) { - return ''; - } - - let displayName = user.username; - const fullName = getFullName(user); - - if (fullName && user.nickname) { - displayName += ` - ${fullName} (${user.nickname})`; - } else if (fullName) { - displayName += ` - ${fullName}`; - } else if (user.nickname) { - displayName += ` - ${user.nickname}`; - } - - return displayName; -} - -export function imageURLForUser(userIdOrObject) { - if (typeof userIdOrObject == 'string') { - const profile = UserStore.getProfile(userIdOrObject); - if (profile) { - return imageURLForUser(profile); - } - return Client4.getUsersRoute() + '/' + userIdOrObject + '/image?_=' + Date.now(); - } - return Client4.getUsersRoute() + '/' + userIdOrObject.id + '/image?_=' + (userIdOrObject.last_picture_update || 0); -} - -// Converts a file size in bytes into a human-readable string of the form '123MB'. -export function fileSizeToString(bytes) { - // it's unlikely that we'll have files bigger than this - if (bytes > 1024 * 1024 * 1024 * 1024) { - return Math.floor(bytes / (1024 * 1024 * 1024 * 1024)) + 'TB'; - } else if (bytes > 1024 * 1024 * 1024) { - return Math.floor(bytes / (1024 * 1024 * 1024)) + 'GB'; - } else if (bytes > 1024 * 1024) { - return Math.floor(bytes / (1024 * 1024)) + 'MB'; - } else if (bytes > 1024) { - return Math.floor(bytes / 1024) + 'KB'; - } - - return bytes + 'B'; -} - -// Gets the websocket port to use. Configurable on the server. -export function getWebsocketPort(protocol) { - if ((/^wss:/).test(protocol)) { // wss:// - return ':' + global.window.mm_config.WebsocketSecurePort; - } - if ((/^ws:/).test(protocol)) { - return ':' + global.window.mm_config.WebsocketPort; - } - return ''; -} - -// Generates a RFC-4122 version 4 compliant globally unique identifier. -export function generateId() { - // implementation taken from http://stackoverflow.com/a/2117523 - var id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; - - id = id.replace(/[xy]/g, (c) => { - var r = Math.floor(Math.random() * 16); - - var v; - if (c === 'x') { - v = r; - } else { - v = (r & 0x3) | 0x8; - } - - return v.toString(16); - }); - - return id; -} - -export function getDirectChannelName(id, otherId) { - let handle; - - if (otherId > id) { - handle = id + '__' + otherId; - } else { - handle = otherId + '__' + id; - } - - return handle; -} - -// Used to get the id of the other user from a DM channel -export function getUserIdFromChannelName(channel) { - return getUserIdFromChannelId(channel.name); -} - -// Used to get the id of the other user from a DM channel id (id1_id2) -export function getUserIdFromChannelId(channelId) { - var ids = channelId.split('__'); - var otherUserId = ''; - if (ids[0] === UserStore.getCurrentId()) { - otherUserId = ids[1]; - } else { - otherUserId = ids[0]; - } - - return otherUserId; -} - -// Returns true if the given channel is a direct channel between the current user and the given one -export function isDirectChannelForUser(otherUserId, channel) { - return channel.type === Constants.DM_CHANNEL && getUserIdFromChannelName(channel) === otherUserId; -} - -export function importSlack(file, success, error) { - Client4.importTeam(TeamStore.getCurrent().id, file, 'slack').then(success).catch(error); -} - -export function windowWidth() { - return $(window).width(); -} - -export function windowHeight() { - return $(window).height(); -} - -export function getChannelTerm(channelType) { - let channelTerm = 'Channel'; - if (channelType === Constants.PRIVATE_CHANNEL) { - channelTerm = 'Group'; - } - - return channelTerm; -} - -export function getPostTerm(post) { - let postTerm = 'Post'; - if (post.root_id) { - postTerm = 'Comment'; - } - - return postTerm; -} - -export function isFeatureEnabled(feature) { - return PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, Constants.FeatureTogglePrefix + feature.label); -} - -export function fillArray(value, length) { - const arr = []; - - for (let i = 0; i < length; i++) { - arr.push(value); - } - - return arr; -} - -// Checks if a data transfer contains files not text, folders, etc.. -// Slightly modified from http://stackoverflow.com/questions/6848043/how-do-i-detect-a-file-is-being-dragged-rather-than-a-draggable-element-on-my-pa -export function isFileTransfer(files) { - if (UserAgent.isInternetExplorer() || UserAgent.isEdge()) { - return files.types != null && files.types.contains('Files'); - } - - return files.types != null && (files.types.indexOf ? files.types.indexOf('Files') !== -1 : files.types.contains('application/x-moz-file')); -} - -export function clearFileInput(elm) { - // clear file input for all modern browsers - try { - elm.value = ''; - if (elm.value) { - elm.type = 'text'; - elm.type = 'file'; - } - } catch (e) { - // Do nothing - } -} - -export function isPostEphemeral(post) { - return post.type === Constants.PostTypes.EPHEMERAL || post.state === Posts.POST_DELETED; -} - -export function getRootId(post) { - return post.root_id === '' ? post.id : post.root_id; -} - -export function localizeMessage(id, defaultMessage) { - const translations = LocalizationStore.getTranslations(); - if (translations) { - const value = translations[id]; - if (value) { - return value; - } - } - - if (defaultMessage) { - return defaultMessage; - } - - return id; -} - -export function mod(a, b) { - return ((a % b) + b) % b; -} - -export function canCreateCustomEmoji(user) { - if (global.window.mm_license.IsLicensed !== 'true') { - return true; - } - - if (isSystemAdmin(user.roles)) { - return true; - } - - // already checked for system admin for both these cases - if (window.mm_config.RestrictCustomEmojiCreation === 'system_admin') { - return false; - } else if (window.mm_config.RestrictCustomEmojiCreation === 'admin') { - // check whether the user is an admin on any of their teams - if (TeamStore.isTeamAdminForAnyTeam()) { - return true; - } - - return false; - } - - return true; -} - -export function isValidPassword(password) { - let errorMsg = ''; - let errorId = 'user.settings.security.passwordError'; - let error = false; - let minimumLength = Constants.MIN_PASSWORD_LENGTH; - - if (global.window.mm_config.BuildEnterpriseReady === 'true' && global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.PasswordRequirements === 'true') { - if (password.length < parseInt(global.window.mm_config.PasswordMinimumLength, 10) || password.length > Constants.MAX_PASSWORD_LENGTH) { - error = true; - } - - if (global.window.mm_config.PasswordRequireLowercase === 'true') { - if (!password.match(/[a-z]/)) { - error = true; - } - - errorId += 'Lowercase'; - } - - if (global.window.mm_config.PasswordRequireUppercase === 'true') { - if (!password.match(/[0-9]/)) { - error = true; - } - - errorId += 'Uppercase'; - } - - if (global.window.mm_config.PasswordRequireNumber === 'true') { - if (!password.match(/[A-Z]/)) { - error = true; - } - - errorId += 'Number'; - } - - if (global.window.mm_config.PasswordRequireSymbol === 'true') { - if (!password.match(/[ !"\\#$%&'()*+,-./:;<=>?@[\]^_`|~]/)) { - error = true; - } - - errorId += 'Symbol'; - } - - minimumLength = global.window.mm_config.PasswordMinimumLength; - } else if (password.length < Constants.MIN_PASSWORD_LENGTH || password.length > Constants.MAX_PASSWORD_LENGTH) { - error = true; - } - - if (error) { - errorMsg = ( - - ); - } - - return errorMsg; -} - -export function handleFormattedTextClick(e) { - const hashtagAttribute = e.target.getAttributeNode('data-hashtag'); - const linkAttribute = e.target.getAttributeNode('data-link'); - const channelMentionAttribute = e.target.getAttributeNode('data-channel-mention'); - - if (hashtagAttribute) { - e.preventDefault(); - - searchForTerm(hashtagAttribute.value); - } else if (linkAttribute) { - const MIDDLE_MOUSE_BUTTON = 1; - - if (!(e.button === MIDDLE_MOUSE_BUTTON || e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)) { - e.preventDefault(); - - browserHistory.push(linkAttribute.value); - } - } else if (channelMentionAttribute) { - e.preventDefault(); - browserHistory.push('/' + TeamStore.getCurrent().name + '/channels/' + channelMentionAttribute.value); - } -} - -// This should eventually be removed once everywhere else calls the action -function searchForTerm(term) { - AppDispatcher.handleServerAction({ - type: ActionTypes.RECEIVED_SEARCH_TERM, - term, - do_search: true - }); -} - -export function isEmptyObject(object) { - if (!object) { - return true; - } - - if (Object.keys(object).length === 0) { - return true; - } - - return false; -} - -export function updateWindowDimensions(component) { - component.setState({width: window.innerWidth, height: window.innerHeight}); -} - -export function removePrefixFromLocalStorage(prefix) { - const keys = []; - for (let i = 0; i < localStorage.length; i++) { - if (localStorage.key(i).startsWith(prefix)) { - keys.push(localStorage.key(i)); - } - } - - for (let i = 0; i < keys.length; i++) { - localStorage.removeItem(keys[i]); - } -} - -export function getEmailInterval(isEmailEnabled) { - const { - INTERVAL_NEVER, - INTERVAL_IMMEDIATE, - INTERVAL_FIFTEEN_MINUTES, - INTERVAL_HOUR, - CATEGORY_NOTIFICATIONS, - EMAIL_INTERVAL - } = Constants.Preferences; - - if (!isEmailEnabled) { - return INTERVAL_NEVER; - } - - const validValuesWithEmailBatching = [INTERVAL_IMMEDIATE, INTERVAL_FIFTEEN_MINUTES, INTERVAL_HOUR]; - const validValuesWithoutEmailBatching = [INTERVAL_IMMEDIATE]; - - let emailInterval; - - if (global.mm_config.EnableEmailBatching === 'true') { - // when email batching is enabled, the default interval is 15 minutes - emailInterval = PreferenceStore.getInt(CATEGORY_NOTIFICATIONS, EMAIL_INTERVAL, INTERVAL_FIFTEEN_MINUTES); - - if (validValuesWithEmailBatching.indexOf(emailInterval) === -1) { - emailInterval = INTERVAL_FIFTEEN_MINUTES; - } - } else { - // otherwise, the default interval is immediately - emailInterval = PreferenceStore.getInt(CATEGORY_NOTIFICATIONS, EMAIL_INTERVAL, INTERVAL_IMMEDIATE); - - if (validValuesWithoutEmailBatching.indexOf(emailInterval) === -1) { - emailInterval = INTERVAL_IMMEDIATE; - } - } - - return emailInterval; -} -- cgit v1.2.3-1-g7c22