diff --git a/README.md b/README.md
new file mode 100644
index 0000000..57bdc2e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,167 @@
+# Cathode
+
+A terminal-style web client for [WeeChat](https://weechat.org/), using the
+modern **API relay protocol** (WeeChat ≥ 4.0). No build step. No framework.
+Drop three files on a web server and go.
+
+> Inspired by [Glowing Bear](https://github.com/glowing-bear/glowing-bear).
+
+---
+
+## Features
+
+- Real-time IRC via WeeChat's JSON/WebSocket relay API
+- Terminal aesthetic — white on black (default) and black on white, togglable
+- Buffer list, nicklist, message history, input with command history (↑/↓)
+- ANSI colour rendering, URL linkification
+- Warns on browser-blocked ports before you try to connect
+- Self-signed cert helper (opens relay URL in a new tab to accept the warning)
+- Zero dependencies, zero build step — plain HTML/CSS/ES-module JS
+
+---
+
+## Requirements
+
+- **WeeChat ≥ 4.0** with the relay plugin enabled and the **api** protocol configured
+- A web server to serve the three static files (nginx, Caddy, Apache, or even
+ `python3 -m http.server`)
+- A domain + TLS cert for production use (certbot/Let's Encrypt recommended)
+
+---
+
+## WeeChat relay setup
+
+```
+# Inside WeeChat:
+
+# Load the relay plugin if not already loaded
+/plugin load relay
+
+# Set a relay password (required)
+/set relay.network.password "your_strong_password_here"
+
+# Create the API relay listener on port 9000
+# Do NOT use port 6667/6697 — those are blocked by browsers
+/relay add api 9000
+
+# For TLS (recommended for non-localhost):
+/relay add tls.api 9000
+
+# Verify it's listening:
+/relay listport
+```
+
+> **Port note:** Ports 6665–6669 and 6697 (the traditional IRC port range)
+> are blocked by all major browsers. Use any other port — 9000 is a safe
+> default.
+
+---
+
+## Installation
+
+### 1. Copy the files
+
+```bash
+# Clone or download, then copy to your web root:
+cp index.html app.js style.css /var/www/cathode/
+
+# Or serve from the repo directly for development:
+python3 -m http.server 8080
+```
+
+### 2. Set up a reverse proxy (recommended)
+
+For production you'll want a reverse proxy to handle TLS and serve both the
+static files and the WeeChat relay API under the same origin — this avoids
+mixed-content issues and makes self-signed certs unnecessary.
+
+See the `proxy/` directory for ready-to-use configs:
+
+| Server | File |
+|--------|------|
+| Caddy | `proxy/Caddyfile` |
+| nginx | `proxy/nginx.conf` |
+| Apache | `proxy/apache.conf` |
+
+All three configs follow the same pattern:
+- Serve static files at `/`
+- Proxy `/api*` to `localhost:9000` (your WeeChat relay port)
+- Handle WebSocket upgrade headers
+
+### 3. Open in browser
+
+Navigate to your domain. Enter the WeeChat relay host/port and password.
+If you're using the reverse proxy setup, the host is your domain and the
+port is 443 — the proxy forwards `/api` internally.
+
+---
+
+## Self-signed certificates
+
+If you can't use Let's Encrypt (no domain, air-gapped, LAN-only), you can
+still use TLS with a self-signed cert on the WeeChat relay. The browser will
+refuse the WebSocket connection until you accept the cert exception:
+
+1. Enter your host and port in Cathode's connect screen
+2. Click the **⚠ CERT** button — this opens `https://host:port/api/version`
+ in a new tab
+3. Accept the browser's security warning in that tab
+4. Return to Cathode and click **CONNECT**
+
+The exception is remembered by the browser for subsequent sessions.
+
+---
+
+## LAN / local use (no TLS)
+
+If you're connecting from the same machine or a trusted LAN, you can skip TLS:
+
+- In WeeChat: `/relay add api 9000` (without `tls.`)
+- In Cathode: uncheck **USE TLS** before connecting
+- Serve Cathode itself over plain HTTP too (or `file://` directly)
+
+Note: `ws://` from an `https://` page is blocked by browsers (mixed content).
+Either serve Cathode over plain HTTP as well, or use the reverse proxy approach.
+
+---
+
+## Directory structure
+
+```
+cathode/
+├── index.html — app shell
+├── app.js — all client logic (ES module, no build step)
+├── style.css — terminal theme, dark + light
+├── proxy/
+│ ├── Caddyfile — Caddy reverse proxy config
+│ ├── nginx.conf — nginx reverse proxy config
+│ └── apache.conf — Apache reverse proxy config
+└── README.md
+```
+
+---
+
+## How it works
+
+Cathode uses WeeChat's **API relay protocol** — a clean JSON-over-WebSocket
+protocol introduced in WeeChat 4.0, replacing the old binary `weechat` relay
+protocol that Glowing Bear was built on.
+
+On connect, Cathode:
+1. Opens a WebSocket to `wss://host:port/api` with the password encoded in
+ the `Sec-WebSocket-Protocol` header (the only header the browser WebSocket
+ API allows you to set)
+2. Sends a batched request: fetch all buffers with last 200 lines and nicks,
+ then subscribe to real-time events
+3. Listens for push events (`buffer_line_added`, `buffer_opened`,
+ `nicklist_nick_added`, etc.) and updates the UI accordingly
+
+---
+
+## License
+
+GPL-3.0 — same as WeeChat and Glowing Bear.
+
+---
+
+*Cathode — Inspired by [Glowing Bear](https://github.com/glowing-bear/glowing-bear)*
diff --git a/apple-touch-icon.png b/apple-touch-icon.png
new file mode 100644
index 0000000..b450ae6
Binary files /dev/null and b/apple-touch-icon.png differ
diff --git a/config.js b/config.js
new file mode 100644
index 0000000..91a23a6
--- /dev/null
+++ b/config.js
@@ -0,0 +1,37 @@
+/**
+ * Cathode — operator configuration
+ *
+ * This file is loaded before app.js. Set properties on window.CATHODE_CONFIG
+ * to configure your deployment. All properties are optional — omit anything
+ * you don't need.
+ *
+ * For a self-hosted personal instance, fill this in once and forget it.
+ * For a shared/public instance, set the upload backend here so users don't
+ * need to configure it themselves (and can't change it).
+ */
+
+window.CATHODE_CONFIG = {
+
+ // ── Notifications ─────────────────────────────────────────────────────────
+ // The relay API doesn't expose WeeChat's per-buffer notify setting, so
+ // Cathode can't read it directly. Use these flags as a workaround.
+ //
+ // notifyServerBuffers: false — suppress notifications from IRC server buffers
+ // (type=server). Set to false if your server buffers are set to
+ // "notify none" in WeeChat. Default: true (don't suppress).
+ notifyServerBuffers: false,
+
+ // ── Upload backend ────────────────────────────────────────────────────────
+ // 'none' — disable file upload entirely (default)
+ // 'filehost' — single_php_filehost (https://github.com/Rouji/single_php_filehost)
+ // 'imgur' — Imgur API (requires a Client ID from https://api.imgur.com/oauth2/addclient)
+ uploadBackend: 'none',
+ filehostUrl: '', // e.g. 'https://files.example.com/' (filehost only)
+ imgurClientId: '', // e.g. 'abc123def456' (imgur only)
+
+ // ── Prefix align max ──────────────────────────────────────────────────────
+ // Mirrors weechat.look.prefix_align_max — truncates long nicks in the
+ // message column. Set to match your WeeChat config. Default: 16.
+ prefixAlignMax: 16,
+
+};
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..8fcd44c
Binary files /dev/null and b/favicon.ico differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..87d57e6
--- /dev/null
+++ b/index.html
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+ Cathode
+
+
+
+
+
+
+
+
+
+
+
CATHODE/irc
+
+
+
⚙ SETTINGS
+
◐ LIGHT
+
⏻ QUIT
+
+
+
+
+
+
+
+
+ ⚠ This page is served over HTTPS — only wss:// relays are reachable.
+ Make sure your WeeChat relay is accessible over TLS.
+
+
+
+
+
+
+
+
+
+
+
+
+ RELAY PASSWORD
+
+
+
+
+
+ USE TLS (wss://)
+ — required on HTTPS pages
+
+
+
+
+
+ CONNECT
+ ⚠ CERT
+
+
+
+ Using a self-signed cert? Click ⚠ CERT to open the relay URL in a new
+ tab, accept the browser warning, then return here and connect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
UPLOAD
+
+
+ BACKEND
+
+ Disabled
+ Single PHP Filehost
+ Imgur
+
+
+
+
+
+
+
+ IMGUR CLIENT ID
+
+
+
+
+
DISPLAY
+
+
+ PREFIX ALIGN MAX (weechat.look.prefix_align_max)
+
+
+
+
+ SAVE
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/js/ansi.js b/js/ansi.js
new file mode 100644
index 0000000..adbebe0
--- /dev/null
+++ b/js/ansi.js
@@ -0,0 +1,123 @@
+// ─── ANSI colour palette ──────────────────────────────────────────────────────
+export const ANSI16 = [
+ '#1a1a1a','#cc3333','#33cc33','#cccc33',
+ '#3333cc','#cc33cc','#33cccc','#cccccc',
+ '#555555','#ff5555','#55ff55','#ffff55',
+ '#5555ff','#ff55ff','#55ffff','#ffffff',
+];
+
+export function ansi256(n) {
+ if (n < 16) return ANSI16[n];
+ if (n >= 232) { const v = 8 + (n - 232) * 10; return `rgb(${v},${v},${v})`; }
+ const i = n - 16;
+ return `rgb(${Math.floor(i/36)*51},${Math.floor((i%36)/6)*51},${(i%6)*51})`;
+}
+
+export function luminance(css) {
+ let r, g, b;
+ const m = css.match(/^rgb\((\d+),(\d+),(\d+)\)$/);
+ if (m) { r = +m[1]; g = +m[2]; b = +m[3]; }
+ else if (css.startsWith('#')) {
+ const h = css.slice(1);
+ if (h.length === 3) {
+ r = parseInt(h[0]+h[0],16); g = parseInt(h[1]+h[1],16); b = parseInt(h[2]+h[2],16);
+ } else {
+ r = parseInt(h.slice(0,2),16); g = parseInt(h.slice(2,4),16); b = parseInt(h.slice(4,6),16);
+ }
+ } else return 0.5;
+ const lin = c => { c /= 255; return c <= 0.04045 ? c/12.92 : Math.pow((c+0.055)/1.055, 2.4); };
+ return 0.2126*lin(r) + 0.7152*lin(g) + 0.0722*lin(b);
+}
+
+// In light theme, force near-white foreground colours to black.
+export function safeFg(css) {
+ const theme = document.documentElement.getAttribute('data-theme') || 'dark';
+ if (theme === 'light' && luminance(css) > 0.70) return '#111111';
+ return css;
+}
+
+// Partial-reset SGR codes — treat like a full reset (close all open spans).
+const PARTIAL_RESET = new Set([21,22,23,24,25,27,28,29,39,49,51,52,53,54,55]);
+
+// Convert ANSI-escaped text to HTML. Linkifies URLs and adds media-toggle buttons.
+export function ansiToHtml(text) {
+ if (!text) return '';
+ let s = text.replace(/&/g,'&').replace(//g,'>');
+ let out = '', spans = 0;
+ // NOTE: the regex literal below must contain a literal ESC character (0x1b)
+ // followed by \[ — do not modify with automated text tools.
+ const re = /\x1b\[([0-9;]*)m/g;
+ let last = 0, m;
+ while ((m = re.exec(s)) !== null) {
+ out += s.slice(last, m.index);
+ last = m.index + m[0].length;
+ const codes = m[1].split(';').map(Number);
+ let i = 0;
+ while (i < codes.length) {
+ if (codes[i] === 0) {
+ if (spans > 0) { out += ''.repeat(spans); spans = 0; }
+ i++; continue;
+ }
+ if (PARTIAL_RESET.has(codes[i])) {
+ if (spans > 0) { out += ''.repeat(spans); spans = 0; }
+ i++; continue;
+ }
+ const st = [];
+ while (i < codes.length && codes[i] !== 0 && !PARTIAL_RESET.has(codes[i])) {
+ const c = codes[i];
+ if (c === 1) { st.push('font-weight:bold'); }
+ else if (c === 3) { st.push('font-style:italic'); }
+ else if (c === 4) { st.push('text-decoration:underline'); }
+ else if (c >= 30 && c <= 37) { st.push(`color:${safeFg(ANSI16[c-30])}`); }
+ else if (c === 38 && codes[i+1] === 5) { st.push(`color:${safeFg(ansi256(codes[i+2]))}`); i+=2; }
+ else if (c === 38 && codes[i+1] === 2) { st.push(`color:${safeFg(`rgb(${codes[i+2]},${codes[i+3]},${codes[i+4]})`)}`); i+=4; }
+ else if (c >= 40 && c <= 47) { st.push(`background:${ANSI16[c-40]}`); }
+ else if (c === 48 && codes[i+1] === 5) { st.push(`background:${ansi256(codes[i+2])}`); i+=2; }
+ else if (c === 48 && codes[i+1] === 2) { st.push(`background:rgb(${codes[i+2]},${codes[i+3]},${codes[i+4]})`); i+=4; }
+ else if (c >= 90 && c <= 97) { st.push(`color:${safeFg(ANSI16[c-90+8])}`); }
+ else if (c >= 100 && c <= 107) { st.push(`background:${ANSI16[c-100+8]}`); }
+ i++;
+ }
+ if (st.length) { out += ``; spans++; }
+ }
+ }
+ out += s.slice(last);
+ if (spans > 0) out += ' '.repeat(spans);
+
+ // Linkify URLs; match through & so query strings aren't cut short
+ return out.replace(/https?:\/\/(?:[^\s<>"']|&)+/g, (url) => {
+ const href = url.replace(/&/g, '&');
+ const isImg = /\.(png|jpe?g|gif|webp|svg|bmp)(\?.*)?$/i.test(href);
+ const isVid = /\.(mp4|webm|ogv|mov)(\?.*)?$/i.test(href);
+ const btn = (isImg || isVid)
+ ? ` ${isImg?'Show Image':'Show Video'} `
+ : '';
+ return `${url} ${btn}`;
+ });
+}
+
+// ─── WeeChat colour name → CSS ────────────────────────────────────────────────
+const WEECHAT_COLOR_NAMES = {
+ 'default':'inherit','bar_fg':'inherit','black':'#1a1a1a','darkgray':'#555555',
+ 'red':'#cc3333','lightred':'#ff5555','green':'#33cc33','lightgreen':'#55ff55',
+ 'brown':'#cccc33','yellow':'#ffff55','blue':'#3333cc','lightblue':'#5555ff',
+ 'magenta':'#cc33cc','lightmagenta':'#ff55ff','cyan':'#33cccc','lightcyan':'#55ffff',
+ 'gray':'#cccccc','white':'#ffffff',
+};
+
+// Convert a nick color value from the relay API to a CSS color string.
+// The API sends either an ANSI escape sequence or a WeeChat color name.
+export function nickColorToCss(colorVal) {
+ if (!colorVal) return '';
+ if (colorVal.includes('\x1b')) {
+ // Extract colour from ANSI escape by running it through ansiToHtml
+ const html = ansiToHtml(colorVal + 'X\x1b[0m');
+ const m = html.match(/style="([^"]+)"/);
+ if (m) {
+ const cm = m[1].match(/(?:^|;)color:([^;]+)/);
+ if (cm) return cm[1];
+ }
+ return '';
+ }
+ return WEECHAT_COLOR_NAMES[colorVal.toLowerCase()] || 'inherit';
+}
diff --git a/js/buffers.js b/js/buffers.js
new file mode 100644
index 0000000..a0d7621
--- /dev/null
+++ b/js/buffers.js
@@ -0,0 +1,323 @@
+import { state, saveSettings } from './state.js';
+import { parseId } from './connection.js';
+import { ansiToHtml, nickColorToCss, safeFg } from './ansi.js';
+import { renderMessages, renderChatHeader, hideNewMsgBanner, appendLine } from './chat.js';
+import { maybeNotify, updateTitle } from './notifications.js';
+
+const el = id => document.getElementById(id);
+const esc = s => String(s).replace(/&/g,'&').replace(//g,'>');
+
+// ─── Buffer events ────────────────────────────────────────────────────────────
+export function onBufOpened(buf) {
+ if (!buf) return;
+ const id = parseId(buf.id);
+ buf = { ...buf, id };
+ state.buffers.set(id, { ...buf, lines: buf.lines||[], nicks:{}, unread:0, highlight:0 });
+ if (!state.smartFilter.has(id)) state.smartFilter.set(id, true);
+ rebuildBufList();
+ if (state.activeBufferId == null) activateBuffer(id);
+}
+
+export function onBufUpdated(buf) {
+ if (!buf) return;
+ const id = parseId(buf.id);
+ const b = state.buffers.get(id);
+ if (!b) return;
+ Object.assign(b, { ...buf, id });
+ paintNode(id);
+ if (state.activeBufferId === id) renderChatHeader();
+}
+
+export function onBufCleared(rawId) {
+ const id = parseId(rawId);
+ const b = state.buffers.get(id);
+ if (b) { b.lines = []; if (state.activeBufferId === id) el('messages').innerHTML = ''; }
+}
+
+export function onBufClosed(rawId) {
+ const id = parseId(rawId);
+ state.buffers.delete(id);
+ removeNode(id);
+ if (state.activeBufferId === id) {
+ const first = state.buffers.keys().next().value;
+ if (first != null) activateBuffer(first);
+ else { state.activeBufferId = null; el('messages').innerHTML = ''; }
+ }
+}
+
+export function onLineAdded(rawId, line) {
+ if (!line) return;
+ const id = parseId(rawId);
+ const b = state.buffers.get(id);
+ if (!b) return;
+ b.lines.push(line);
+ if (state.activeBufferId === id) {
+ appendLine(line);
+ } else {
+ b.unread++;
+ if (line.highlight) b.highlight++;
+ paintNode(id);
+ }
+ maybeNotify(b, line, activateBuffer);
+ updateTitle();
+}
+
+// ─── Nick events ──────────────────────────────────────────────────────────────
+export function collectNicks(group, out) {
+ if (!group) return;
+ for (const n of (group.nicks || [])) out[n.id] = n;
+ for (const g of (group.groups || [])) collectNicks(g, out);
+}
+
+export function onNickAdded(rawId, nick) {
+ const id = parseId(rawId);
+ const b = state.buffers.get(id);
+ if (!b || !nick) return;
+ b.nicks[nick.id] = nick;
+ if (state.activeBufferId === id) renderNicklist(b);
+}
+
+export function onNickRemoved(rawId, nick) {
+ const id = parseId(rawId);
+ const b = state.buffers.get(id);
+ if (!b || !nick) return;
+ delete b.nicks[nick.id];
+ if (state.activeBufferId === id) renderNicklist(b);
+}
+
+export function onGroupChanged(rawId) {
+ const id = parseId(rawId);
+ const b = state.buffers.get(id);
+ if (b && state.activeBufferId === id) renderNicklist(b);
+}
+
+// ─── Nicklist ─────────────────────────────────────────────────────────────────
+export function renderNicklist(buf) {
+ const box = el('nicklist');
+ box.innerHTML = '';
+ const nicks = Object.values(buf.nicks || {}).sort((a, b) => {
+ const w = p => p==='~'?0 : p==='&'?1 : p==='@'?2 : p==='%'?3 : p==='+'?4 : 5;
+ const d = w(a.prefix) - w(b.prefix);
+ return d !== 0 ? d : a.name.localeCompare(b.name, undefined, {sensitivity:'base'});
+ });
+ for (const nick of nicks) {
+ const row = document.createElement('div');
+ row.className = 'nick-item';
+ const pfxChar = (nick.prefix && nick.prefix.trim()) ? esc(nick.prefix) : ' ';
+ const pfxHtml = nick.prefix_color
+ ? `${pfxChar} `
+ : `${pfxChar} `;
+ const nameHtml = nick.color
+ ? `${esc(nick.name)} `
+ : `${esc(nick.name)} `;
+ row.innerHTML = pfxHtml + nameHtml;
+ row.addEventListener('click', () => openNickMenu(nick, buf));
+ box.appendChild(row);
+ }
+}
+
+// ─── Nick context menu ────────────────────────────────────────────────────────
+function openNickMenu(nick, buf) {
+ closeNickMenu();
+ const overlay = document.createElement('div');
+ overlay.id = 'nick-overlay';
+ overlay.className = 'nick-overlay';
+ overlay.addEventListener('click', e => { if (e.target === overlay) closeNickMenu(); });
+
+ const menu = document.createElement('div');
+ menu.className = 'nick-menu';
+
+ const hdr = document.createElement('div');
+ hdr.className = 'nick-menu-hdr';
+ hdr.textContent = (nick.prefix && nick.prefix.trim() ? nick.prefix : '') + nick.name;
+ menu.appendChild(hdr);
+
+ const myPfx = ownPrefix(buf);
+ const isOp = ['@','~','&'].includes(myPfx);
+
+ const actions = [
+ { label: '💬 Query', cmd: `/query ${nick.name}` },
+ { label: '🔍 Whois', cmd: `/whois ${nick.name}` },
+ { label: '🔍 Whois (full)', cmd: `/whois ${nick.name} ${nick.name}` },
+ { label: '📌 Ignore', cmd: `/ignore ${nick.name}` },
+ { label: '🔇 Kick', cmd: `/kick ${nick.name}`, op: true },
+ { label: '🚫 Ban', cmd: `/ban ${nick.name}`, op: true },
+ ];
+ for (const a of actions) {
+ if (a.op && !isOp) continue;
+ const btn = document.createElement('button');
+ btn.className = 'nick-menu-btn';
+ btn.textContent = a.label;
+ btn.addEventListener('click', () => {
+ wsSendRef(a.cmd, buf.name);
+ closeNickMenu();
+ });
+ menu.appendChild(btn);
+ }
+
+ overlay.appendChild(menu);
+ document.body.appendChild(overlay);
+ overlay._esc = e => { if (e.key === 'Escape') closeNickMenu(); };
+ document.addEventListener('keydown', overlay._esc);
+}
+
+function closeNickMenu() {
+ const ov = document.getElementById('nick-overlay');
+ if (!ov) return;
+ document.removeEventListener('keydown', ov._esc);
+ ov.remove();
+}
+
+function ownPrefix(buf) {
+ const nick = (buf.local_variables || {}).nick || '';
+ const entry = Object.values(buf.nicks || {}).find(n => n.name === nick);
+ return entry ? (entry.prefix || '') : '';
+}
+
+// wsSend reference — set by main.js after connection module loads
+let wsSendRef = () => {};
+export function setWsSend(fn) {
+ wsSendRef = (cmd, bufName) => fn({ request: 'POST /api/input', body: { buffer_name: bufName, command: cmd } });
+}
+
+// ─── Buffer list DOM ──────────────────────────────────────────────────────────
+const bufNodes = new Map();
+
+const bKey = id => 'b:' + id;
+const gKey = key => 'g:' + key;
+
+function bufMeta(buf) {
+ const lv = buf.local_variables || {};
+ const plugin = lv.plugin || '';
+ const server = lv.server || '';
+ const type = lv.type || '';
+ if (!plugin || plugin === 'core')
+ return { group:'\x00core', groupLabel:'weechat', isServer:false, indent:false };
+ if (plugin === 'irc') {
+ if (type === 'server' || !server)
+ return { group: server||buf.name, groupLabel: server||buf.name, isServer:true, indent:false };
+ return { group: server, groupLabel: server, isServer:false, indent:true };
+ }
+ const gk = server ? `${plugin}.${server}` : plugin;
+ return { group:gk, groupLabel: server ? `${plugin}/${server}` : plugin,
+ isServer:!server, indent:!!server };
+}
+
+function buildWanted() {
+ const sorted = [...state.buffers.values()].sort((a,b) => a.number - b.number);
+ const groups = new Map();
+ for (const buf of sorted) {
+ const m = bufMeta(buf);
+ if (!groups.has(m.group)) groups.set(m.group, { label:m.groupLabel, srv:null, ch:[] });
+ const g = groups.get(m.group);
+ if (m.isServer) g.srv = buf; else g.ch.push(buf);
+ }
+ const items = [];
+ for (const [gk, g] of groups) {
+ if (g.srv) items.push({ key:bKey(g.srv.id), type:'server', buf:g.srv });
+ else items.push({ key:gKey(gk), type:'header', label:g.label });
+ for (const buf of g.ch)
+ items.push({ key:bKey(buf.id), type:'channel', buf });
+ }
+ return items;
+}
+
+export function rebuildBufList() {
+ const container = el('buffer-list');
+ for (const [,node] of bufNodes) node.remove();
+ bufNodes.clear();
+ for (const item of buildWanted()) {
+ const node = makeNode(item);
+ bufNodes.set(item.key, node);
+ container.appendChild(node);
+ }
+}
+
+function paintNode(id) {
+ const node = bufNodes.get(bKey(id));
+ if (!node) return;
+ const buf = state.buffers.get(id);
+ if (!buf) return;
+ const isServer = node.dataset.isServer === '1';
+ const indent = node.dataset.indent === '1';
+ const classes = ['buffer-item'];
+ if (isServer) classes.push('buf-server');
+ if (indent) classes.push('buf-indented');
+ if (String(buf.id) === String(state.activeBufferId)) classes.push('active');
+ if (buf.highlight > 0) classes.push('highlight');
+ else if (buf.unread > 0) classes.push('unread');
+ node.className = classes.join(' ');
+ const name = buf.short_name || buf.name || '?';
+ const badge = buf.highlight > 0
+ ? `${buf.highlight} `
+ : buf.unread > 0 ? `${buf.unread} ` : '';
+ node.innerHTML =
+ `${buf.number} ` +
+ `${esc(name)} ${badge}` +
+ `× `;
+}
+
+function removeNode(id) {
+ const node = bufNodes.get(bKey(id));
+ if (node) { node.remove(); bufNodes.delete(bKey(id)); }
+ rebuildBufList();
+}
+
+function makeNode(item) {
+ if (item.type === 'header') {
+ const node = document.createElement('div');
+ node.className = 'buf-group-header';
+ node.dataset.key = item.key;
+ node.textContent = item.label;
+ return node;
+ }
+ const isServer = item.type === 'server';
+ const indent = item.type === 'channel';
+ const node = document.createElement('div');
+ node.dataset.key = item.key;
+ node.dataset.id = String(item.buf.id);
+ node.dataset.isServer = isServer ? '1' : '0';
+ node.dataset.indent = indent ? '1' : '0';
+ node.addEventListener('click', () => activateBuffer(node.dataset.id));
+ const classes = ['buffer-item'];
+ if (isServer) classes.push('buf-server');
+ if (indent) classes.push('buf-indented');
+ node.className = classes.join(' ');
+ const buf = item.buf;
+ const name = buf.short_name || buf.name || '?';
+ node.innerHTML =
+ `${buf.number} ` +
+ `${esc(name)} ` +
+ `× `;
+ return node;
+}
+
+// ─── Activate buffer ──────────────────────────────────────────────────────────
+export function activateBuffer(id) {
+ const prev = state.activeBufferId;
+ const buf = state.buffers.get(id);
+ if (!buf) return;
+ state.activeBufferId = id;
+ state.scroll.pinned = true;
+ state.scroll.newCount = 0;
+ buf.unread = 0;
+ buf.highlight = 0;
+ if (prev != null && prev !== id) paintNode(prev);
+ paintNode(id);
+ renderChatHeader();
+ renderMessages(buf);
+ renderNicklist(buf);
+ hideNewMsgBanner();
+ updateTitle();
+ el('chat-input').focus();
+
+ // Sync read position back to WeeChat by switching to the buffer there too.
+ // This marks lines as read in WeeChat's state, updating last_read_line_id.
+ // We send it as a direct API input command rather than going through the input box.
+ if (state.ws && state.ws.readyState === WebSocket.OPEN) {
+ state.ws.send(JSON.stringify({
+ request: 'POST /api/input',
+ body: { buffer_name: 'core.weechat', command: `/buffer ${buf.name}` }
+ }));
+ }
+}
diff --git a/js/chat.js b/js/chat.js
new file mode 100644
index 0000000..3df1112
--- /dev/null
+++ b/js/chat.js
@@ -0,0 +1,183 @@
+import { state } from './state.js';
+import { ansiToHtml } from './ansi.js';
+
+const el = id => document.getElementById(id);
+
+// ─── Prefix truncation ────────────────────────────────────────────────────────
+// Mirrors weechat.look.prefix_align_max — truncates long nicks in the prefix
+// column. Strips ANSI to measure visible length, re-wraps with original escape.
+//
+// IMPORTANT: the regex literals below must contain a literal ESC byte (0x1b).
+// Do not modify with automated text replacement tools.
+export function truncPrefix(raw) {
+ if (!raw) return raw;
+ const visible = raw.replace(/\x1b\[[0-9;]*m/g, '');
+ const max = state.prefixAlignMax;
+ if (visible.length <= max) return raw;
+ // Preserve leading colour escape, truncate visible chars, close with reset
+ const esc = raw.match(/^(\x1b\[[0-9;]*m)*/);
+ const lead = esc ? esc[0] : '';
+ const plain = visible.slice(0, max - 1) + '…';
+ return lead + plain + '\x1b[0m';
+}
+
+export function applyPrefixWidth() {
+ const charWidth = 8.2; // IBM Plex Mono px/char at 13px
+ const px = Math.round(state.prefixAlignMax * charWidth) + 16;
+ document.documentElement.style.setProperty('--prefix-col-width', px + 'px');
+}
+
+// ─── Chat header ──────────────────────────────────────────────────────────────
+export function renderChatHeader() {
+ const buf = state.buffers.get(state.activeBufferId);
+ if (!buf) return;
+ el('chat-title').textContent = buf.short_name || buf.name || '';
+ el('chat-topic').innerHTML = buf.title ? ansiToHtml(buf.title) : '';
+ const lv = buf.local_variables || {};
+ const isIrc = lv.plugin === 'irc' && lv.type !== 'server';
+ const sfBtn = el('smartfilter-btn');
+ if (isIrc) {
+ const on = state.smartFilter.get(buf.id) !== false;
+ sfBtn.textContent = on ? 'FILTER: ON' : 'FILTER: OFF';
+ sfBtn.classList.toggle('sf-off', !on);
+ sfBtn.style.display = '';
+ } else {
+ sfBtn.style.display = 'none';
+ }
+}
+
+export function toggleSmartFilter() {
+ const id = state.activeBufferId;
+ if (id == null) return;
+ const cur = state.smartFilter.get(id) !== false;
+ state.smartFilter.set(id, !cur);
+ renderChatHeader();
+ const buf = state.buffers.get(id);
+ if (buf) renderMessages(buf);
+}
+
+// ─── Message rendering ────────────────────────────────────────────────────────
+export function renderMessages(buf) {
+ const box = el('messages');
+ box.innerHTML = '';
+ for (const line of buf.lines) appendLine(line, false, buf.lastReadId);
+ box.scrollTop = box.scrollHeight;
+ box.onscroll = onMessagesScroll;
+}
+
+export function appendLine(line, scroll = true, lastReadId = null) {
+ if (!line.displayed) return;
+ // Smart filter: skip join/part/quit noise tagged by WeeChat
+ if (line.tags && line.tags.includes('irc_smart_filter')) {
+ if (state.smartFilter.get(state.activeBufferId) !== false) return;
+ }
+ const box = el('messages');
+
+ // Read marker divider — insert before the first unread line
+ if (lastReadId !== null && String(line.id) === String(lastReadId)) {
+ // This is the last-read line; the NEXT line will be unread.
+ // We track this by inserting the divider after this line is appended.
+ // We use a sentinel attribute on the box so we know to insert after this row.
+ box.dataset.insertDividerAfterNext = '1';
+ } else if (box.dataset.insertDividerAfterNext === '1') {
+ delete box.dataset.insertDividerAfterNext;
+ const divider = document.createElement('div');
+ divider.className = 'read-marker';
+ divider.textContent = '─── unread ───';
+ box.appendChild(divider);
+ }
+
+ const subLines = (line.message || '').split('\n');
+ const time = line.date ? fmtTime(line.date) : '';
+ const prefix = line.prefix ? ansiToHtml(truncPrefix(line.prefix)) : '';
+ const hlClass = line.highlight ? ' msg-highlight' : '';
+
+ subLines.forEach((sub, i) => {
+ const row = document.createElement('div');
+ row.className = 'msg-row' + hlClass;
+ if (i === 0) {
+ row.innerHTML =
+ `${time} ` +
+ `${prefix} ` +
+ ` ` +
+ `${ansiToHtml(sub)} `;
+ } else {
+ row.innerHTML =
+ ` ` +
+ ` ` +
+ ` ` +
+ `${ansiToHtml(sub)} `;
+ }
+ box.appendChild(row);
+ });
+
+ if (scroll) {
+ if (state.scroll.pinned) {
+ box.scrollTop = box.scrollHeight;
+ } else {
+ state.scroll.newCount++;
+ showNewMsgBanner(state.scroll.newCount);
+ }
+ }
+}
+
+export function sysMsg(id, text) {
+ if (id != null && id !== state.activeBufferId) return;
+ const box = el('messages');
+ const row = document.createElement('div');
+ row.className = 'msg-row msg-system';
+ row.innerHTML =
+ `${fmtTime(new Date().toISOString())} ` +
+ `-- ` +
+ ` ` +
+ `${escHtml(text)} `;
+ box.appendChild(row);
+ if (state.scroll.pinned) box.scrollTop = box.scrollHeight;
+}
+
+// ─── Scroll lock ──────────────────────────────────────────────────────────────
+export function onMessagesScroll() {
+ const box = el('messages');
+ const atBottom = box.scrollHeight - box.scrollTop - box.clientHeight < 2;
+ if (atBottom && !state.scroll.pinned) {
+ state.scroll.pinned = true;
+ state.scroll.newCount = 0;
+ hideNewMsgBanner();
+ } else if (!atBottom && state.scroll.pinned) {
+ state.scroll.pinned = false;
+ }
+}
+
+export function showNewMsgBanner(count) {
+ let banner = document.getElementById('new-msg-banner');
+ if (!banner) {
+ banner = document.createElement('div');
+ banner.id = 'new-msg-banner';
+ banner.className = 'new-msg-banner';
+ banner.addEventListener('click', () => {
+ const box = el('messages');
+ box.scrollTop = box.scrollHeight;
+ state.scroll.pinned = true;
+ state.scroll.newCount = 0;
+ hideNewMsgBanner();
+ });
+ el('main').appendChild(banner);
+ }
+ banner.textContent = `▼ ${count} new message${count === 1 ? '' : 's'}`;
+}
+
+export function hideNewMsgBanner() {
+ const b = document.getElementById('new-msg-banner');
+ if (b) b.remove();
+}
+
+// ─── Helpers (local) ─────────────────────────────────────────────────────────
+function fmtTime(iso) {
+ try { return new Date(iso).toLocaleTimeString([],
+ {hour:'2-digit', minute:'2-digit', second:'2-digit', hour12:false}); }
+ catch { return ''; }
+}
+
+function escHtml(s) {
+ return String(s).replace(/&/g,'&').replace(//g,'>');
+}
diff --git a/js/connection.js b/js/connection.js
new file mode 100644
index 0000000..f75f34b
--- /dev/null
+++ b/js/connection.js
@@ -0,0 +1,259 @@
+import { state, saveSettings, BLOCKED_PORTS } from './state.js';
+import { initNotifications } from './notifications.js';
+import { applyPrefixWidth, sysMsg } from './chat.js';
+import {
+ onBufOpened, onBufUpdated, onBufCleared, onBufClosed,
+ onLineAdded, onNickAdded, onNickRemoved, onGroupChanged,
+ collectNicks, rebuildBufList, activateBuffer,
+} from './buffers.js';
+
+const el = id => document.getElementById(id);
+
+// ─── Reconnect state ──────────────────────────────────────────────────────────
+const reconnect = {
+ enabled: false, // set true after first successful connect; false on user disconnect
+ timer: null,
+ backoff: 1000, // ms, doubles each attempt up to MAX_BACKOFF
+};
+const MAX_BACKOFF = 30_000;
+const INITIAL_BACKOFF = 1_000;
+
+// ─── Float-safe ID parser ─────────────────────────────────────────────────────
+// The relay sometimes sends buffer IDs as JSON floats (e.g. 1709932823649184.0).
+// Parsing those as Number loses precision — parse as string when safe.
+export function parseId(v) {
+ if (v == null) return null;
+ if (typeof v === 'string') return v; // already a string key
+ if (typeof v === 'number') return String(Math.round(v)); // float → integer string
+ return String(v);
+}
+
+// ─── WebSocket send ───────────────────────────────────────────────────────────
+export function wsSend(obj) {
+ if (state.ws && state.ws.readyState === WebSocket.OPEN)
+ state.ws.send(JSON.stringify(obj));
+}
+
+// ─── Connect ──────────────────────────────────────────────────────────────────
+export function connect() {
+ const host = el('host').value.trim();
+ const port = parseInt(el('port').value, 10);
+ const pass = el('password').value;
+ const tls = el('tls').checked;
+
+ if (!host || !port) return showConnError('Host and port are required.');
+ if (BLOCKED_PORTS.has(port)) return showConnError(
+ `Port ${port} is blocked by browsers. Use a different port — e.g. 9000.`);
+
+ reconnect.enabled = false; // reset; re-enabled on first successful connect
+ clearReconnectTimer();
+ connectTo(host, port, pass, tls);
+}
+
+function connectTo(host, port, pass, tls) {
+ const hostFmt = (host.includes(':') && !host.startsWith('[')) ? `[${host}]` : host;
+ const url = `${tls ? 'wss' : 'ws'}://${hostFmt}:${port}/api`;
+
+ hideConnError();
+ setConnecting(true);
+
+ let ws;
+ try {
+ ws = new WebSocket(url, [
+ 'api.weechat',
+ `base64url.bearer.authorization.weechat.${buildAuth(pass)}`
+ ]);
+ } catch (e) {
+ setConnecting(false);
+ showConnError(`Could not open WebSocket: ${e.message}`);
+ return;
+ }
+
+ const timer = setTimeout(() => {
+ ws.close();
+ setConnecting(false);
+ showConnError('Connection timed out. Check host, port, and relay config.');
+ }, 8000);
+
+ ws.onopen = () => {
+ clearTimeout(timer);
+ state.ws = ws;
+ state.connected = true;
+ reconnect.enabled = true;
+ reconnect.backoff = INITIAL_BACKOFF;
+ Object.assign(state.settings, { host, port, pass, tls });
+ saveSettings();
+ onConnected();
+ };
+
+ ws.onmessage = e => {
+ let data;
+ try { data = JSON.parse(e.data); } catch { return; }
+ if (Array.isArray(data)) data.forEach(dispatch);
+ else dispatch(data);
+ };
+
+ ws.onerror = () => {
+ clearTimeout(timer);
+ setConnecting(false);
+ if (location.protocol === 'https:' && !tls) {
+ showConnError('Secure connection error — cannot connect to an unencrypted relay (ws://) from an HTTPS page.');
+ } else if (!reconnect.enabled) {
+ showConnError('WebSocket error. Check host, port, TLS, and relay config.');
+ }
+ };
+
+ ws.onclose = () => {
+ clearTimeout(timer);
+ if (state.connected) {
+ onDisconnected(/* userInitiated */ false);
+ if (reconnect.enabled) scheduleReconnect(host, port, pass, tls);
+ }
+ };
+}
+
+function scheduleReconnect(host, port, pass, tls) {
+ clearReconnectTimer();
+ const delay = reconnect.backoff;
+ reconnect.backoff = Math.min(reconnect.backoff * 2, MAX_BACKOFF);
+ setStatus('connecting', `RECONNECTING in ${Math.round(delay/1000)}s…`);
+ reconnect.timer = setTimeout(() => {
+ if (!reconnect.enabled) return;
+ setStatus('connecting', 'RECONNECTING…');
+ connectTo(host, port, pass, tls);
+ }, delay);
+}
+
+function clearReconnectTimer() {
+ if (reconnect.timer) { clearTimeout(reconnect.timer); reconnect.timer = null; }
+}
+
+export function disconnect() {
+ reconnect.enabled = false;
+ clearReconnectTimer();
+ wsSend({ request: 'DELETE /api/sync' });
+ onDisconnected(/* userInitiated */ true);
+}
+
+// ─── Auth ─────────────────────────────────────────────────────────────────────
+function buildAuth(pw) {
+ return btoa('plain:' + pw).replace(/\+/g,'-').replace(/\//g,'_').replace(/=/g,'');
+}
+
+// ─── Message dispatch ─────────────────────────────────────────────────────────
+function dispatch(msg) {
+ if (!msg) return;
+ if (msg.code === 0 && msg.event_name) { handleEvent(msg); return; }
+ if (msg.request_id === 'init' && msg.body_type === 'buffers') { handleInit(msg); return; }
+}
+
+function handleEvent(msg) {
+ switch (msg.event_name) {
+ case 'buffer_opened': onBufOpened(msg.body); break;
+ case 'buffer_closed': onBufClosed(msg.buffer_id); break;
+ case 'buffer_renamed':
+ case 'buffer_title_changed':
+ case 'buffer_localvar_added':
+ case 'buffer_localvar_changed':
+ case 'buffer_localvar_removed':
+ case 'buffer_moved':
+ case 'buffer_merged':
+ case 'buffer_unmerged':
+ case 'buffer_hidden':
+ case 'buffer_unhidden': onBufUpdated(msg.body); break;
+ case 'buffer_cleared': onBufCleared(msg.buffer_id); break;
+ case 'buffer_line_added': onLineAdded(msg.buffer_id, msg.body); break;
+ case 'nicklist_nick_added':
+ case 'nicklist_nick_changed': onNickAdded(msg.buffer_id, msg.body); break;
+ case 'nicklist_nick_removing': onNickRemoved(msg.buffer_id, msg.body); break;
+ case 'nicklist_group_added':
+ case 'nicklist_group_changed': onGroupChanged(msg.buffer_id); break;
+ case 'upgrade': sysMsg(null, '⟳ WeeChat upgrading…'); break;
+ case 'upgrade_ended': sysMsg(null, '✓ WeeChat upgrade complete.'); break;
+ case 'quit': onDisconnected(); break;
+ }
+}
+
+// ─── Lifecycle ────────────────────────────────────────────────────────────────
+function onConnected() {
+ setStatus('connected', 'CONNECTED');
+ initNotifications();
+ wsSend([
+ { request: 'GET /api/buffers?lines=-200&nicks=true&colors=ansi', request_id: 'init' },
+ { request: 'POST /api/sync', body: { nicks: true, colors: 'ansi' } }
+ ]);
+}
+
+function handleInit(msg) {
+ state.buffers.clear();
+ const cfg = window.CATHODE_CONFIG || {};
+ if (cfg.prefixAlignMax) {
+ state.prefixAlignMax = cfg.prefixAlignMax;
+ state.settings.prefixAlignMax = cfg.prefixAlignMax;
+ } else if (state.settings.prefixAlignMax) {
+ state.prefixAlignMax = state.settings.prefixAlignMax;
+ }
+ for (const buf of (msg.body || [])) {
+ const nicks = {};
+ collectNicks(buf.nicklist_root, nicks);
+ // Use parseId to handle float IDs from the relay
+ const id = parseId(buf.id) ?? buf.id;
+ state.buffers.set(id, { ...buf, id, lines: buf.lines||[], nicks, unread:0, highlight:0,
+ lastReadId: buf.last_read_line_id ? parseId(buf.last_read_line_id) : null });
+ if (!state.smartFilter.has(id)) state.smartFilter.set(id, true);
+ }
+ setConnecting(false);
+ el('disconnect-btn').style.display = '';
+ applyPrefixWidth();
+ showScreen('chat');
+ rebuildBufList();
+ state.scroll.pinned = true;
+ state.scroll.newCount = 0;
+ const first = state.buffers.keys().next().value;
+ if (first != null) activateBuffer(first);
+}
+
+export function onDisconnected(userInitiated = true) {
+ if (!state.connected && !state.ws) return;
+ state.connected = false;
+ if (state.ws) { try { state.ws.close(); } catch(_){} state.ws = null; }
+ setStatus('disconnected', 'DISCONNECTED');
+ el('disconnect-btn').style.display = 'none';
+ // Only return to connect screen on explicit user disconnect or first-time failure
+ // On auto-reconnect we stay on the chat screen showing the status
+ if (userInitiated) {
+ showScreen('connect');
+ state.buffers.clear();
+ state.activeBufferId = null;
+ state.scroll.pinned = true;
+ state.scroll.newCount = 0;
+ el('buffer-list').innerHTML = '';
+ el('messages').innerHTML = '';
+ el('nicklist').innerHTML = '';
+ const banner = document.getElementById('new-msg-banner');
+ if (banner) banner.remove();
+ }
+}
+
+// ─── UI helpers (connection-screen) ──────────────────────────────────────────
+function showConnError(msg) {
+ el('conn-error').textContent = msg;
+ el('conn-error').style.display = 'block';
+}
+function hideConnError() { el('conn-error').style.display = 'none'; }
+
+function setConnecting(on) {
+ el('connect-btn').disabled = on;
+ el('connect-btn').textContent = on ? 'CONNECTING…' : 'CONNECT';
+ if (on) setStatus('connecting', 'CONNECTING…');
+}
+
+function setStatus(s, text) {
+ el('status-dot').className = 'status-dot ' + s;
+ el('status-text').textContent = text;
+}
+
+function showScreen(name) {
+ el('connect-screen').style.display = name === 'connect' ? '' : 'none';
+ el('chat-screen').style.display = name === 'chat' ? '' : 'none';
+}
diff --git a/js/input.js b/js/input.js
new file mode 100644
index 0000000..162e2a9
--- /dev/null
+++ b/js/input.js
@@ -0,0 +1,131 @@
+import { state } from './state.js';
+
+const el = id => document.getElementById(id);
+
+// Emoji tab completion via emoji-mart SearchIndex.
+// Lazily initialised on first use so it doesn't block startup.
+let emojiSearchReady = false;
+async function initEmojiSearch() {
+ if (emojiSearchReady) return;
+ if (!window.EmojiMart?.SearchIndex) return;
+ try {
+ const res = await fetch('vendor/emoji-data.json');
+ const data = await res.json();
+ await EmojiMart.init({ data });
+ emojiSearchReady = true;
+ } catch (e) {
+ console.warn('Emoji search init failed:', e);
+ }
+}
+
+async function searchEmoji(stem) {
+ await initEmojiSearch();
+ if (!emojiSearchReady) return [];
+ const results = await EmojiMart.SearchIndex.search(stem);
+ return (results || []).map(e => e.skins[0].native + e.id);
+}
+
+const hist = { lines: [], pos: -1, draft: '' };
+const tab = { matches: [], pos: -1, stem: '' };
+
+export function sendInput(wsSend) {
+ const buf = state.buffers.get(state.activeBufferId);
+ const text = el('chat-input').value.trim();
+ if (!buf || !text) return;
+ hist.lines.unshift(text);
+ hist.pos = -1;
+ tab.matches = [];
+ tab.pos = -1;
+ wsSend({ request: 'POST /api/input', body: { buffer_name: buf.name, command: text } });
+ el('chat-input').value = '';
+}
+
+export function onInputKey(e, wsSend) {
+ if (e.key === 'Tab') {
+ e.preventDefault();
+ doTabComplete();
+ return;
+ }
+ if (e.key !== 'Shift') { tab.matches = []; tab.pos = -1; }
+
+ if (e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault();
+ sendInput(wsSend);
+ } else if (e.key === 'ArrowUp') {
+ e.preventDefault();
+ if (hist.pos === -1) hist.draft = el('chat-input').value;
+ hist.pos = Math.min(hist.pos + 1, hist.lines.length - 1);
+ if (hist.lines[hist.pos] !== undefined) el('chat-input').value = hist.lines[hist.pos];
+ } else if (e.key === 'ArrowDown') {
+ e.preventDefault();
+ hist.pos = Math.max(hist.pos - 1, -1);
+ el('chat-input').value = hist.pos === -1 ? hist.draft : hist.lines[hist.pos];
+ }
+}
+
+function doTabComplete() {
+ const input = el('chat-input');
+ const val = input.value;
+ const caret = input.selectionStart;
+ const before = val.slice(0, caret);
+ const tokenMatch = before.match(/(\S+)$/);
+ const token = tokenMatch ? tokenMatch[1] : '';
+ if (!token) return;
+
+ const lower = token.toLowerCase();
+
+ if (tab.matches.length === 0 || tab.stem !== lower) {
+ const buf = state.buffers.get(state.activeBufferId);
+ if (!buf) return;
+
+ const prevWord = before.slice(0, before.length - token.length).trim().split(/\s+/).pop() || '';
+ const wantChannel = token.startsWith('#') || prevWord.toLowerCase() === '/join';
+ const wantEmoji = token.startsWith(':') && token.length > 1;
+
+ if (wantEmoji) {
+ const stem = token.slice(1).replace(/:$/, '').toLowerCase();
+ // Async: kick off search and return; next Tab press will use the results
+ searchEmoji(stem).then(results => {
+ tab.matches = results;
+ tab.stem = lower;
+ tab.pos = -1;
+ if (results.length > 0) doComplete(input, val, caret, before, token);
+ });
+ return; // first Tab fetches; subsequent Tab presses cycle
+ }
+
+ let candidates;
+ if (wantChannel) {
+ candidates = [...state.buffers.values()]
+ .filter(b => {
+ const lv = b.local_variables || {};
+ return lv.type === 'channel' || (b.short_name || '').startsWith('#');
+ })
+ .map(b => b.short_name || b.name);
+ } else {
+ candidates = Object.values(buf.nicks || {}).map(n => n.name);
+ }
+
+ tab.matches = candidates.filter(c => c.toLowerCase().startsWith(lower));
+ tab.matches.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: 'base' }));
+ tab.pos = -1;
+ tab.stem = lower;
+ if (tab.matches.length === 0) return;
+ }
+
+ doComplete(input, val, caret, before, token);
+}
+
+function doComplete(input, val, caret, before, token) {
+ if (tab.matches.length === 0) return;
+ tab.pos = (tab.pos + 1) % tab.matches.length;
+ const match = tab.matches[tab.pos];
+ const isEmoji = /^\p{Emoji}/u.test(match);
+ const insert = isEmoji ? [...match][0] : match;
+ const atStart = before.trimStart() === token;
+ const isNick = !insert.startsWith('#') && !isEmoji;
+ const suffix = (atStart && isNick) ? ': ' : ' ';
+ const completed = before.slice(0, before.length - token.length) + insert + suffix;
+ input.value = completed + val.slice(caret);
+ input.selectionStart = input.selectionEnd = completed.length;
+}
diff --git a/js/main.js b/js/main.js
new file mode 100644
index 0000000..0f63c20
--- /dev/null
+++ b/js/main.js
@@ -0,0 +1,194 @@
+import { state } from './state.js';
+import { initTheme, toggleTheme,
+ openSettings, closeSettings,
+ saveSettingsPanel, updateBackendVis,
+ checkPort, openCertPage } from './settings.js';
+import { connect, disconnect, wsSend } from './connection.js';
+import { toggleSmartFilter } from './chat.js';
+import { sendInput, onInputKey } from './input.js';
+import { uploadFile, initDragDrop } from './upload.js';
+import { setWsSend } from './buffers.js';
+
+const el = id => document.getElementById(id);
+
+document.addEventListener('DOMContentLoaded', () => {
+ initTheme();
+
+ // ── Operator config (config.js → window.CATHODE_CONFIG) ──────────────────
+ const cfg = window.CATHODE_CONFIG || {};
+ if (cfg.uploadBackend) {
+ state.settings.uploadBackend = cfg.uploadBackend;
+ state.settings.filehostUrl = cfg.filehostUrl || '';
+ state.settings.imgurClientId = cfg.imgurClientId || '';
+ const sec = el('settings-upload-section');
+ if (sec) sec.style.display = 'none';
+ }
+ if (cfg.prefixAlignMax) {
+ state.prefixAlignMax = cfg.prefixAlignMax;
+ state.settings.prefixAlignMax = cfg.prefixAlignMax;
+ }
+
+ // ── Restore saved connection settings ────────────────────────────────────
+ const s = state.settings;
+ if (s.host) el('host').value = s.host;
+ if (s.port) el('port').value = s.port;
+ if (s.tls !== undefined) el('tls').checked = s.tls;
+ if (s.prefixAlignMax) state.prefixAlignMax = s.prefixAlignMax;
+
+ // ── Initial UI state ──────────────────────────────────────────────────────
+ el('connect-screen').style.display = '';
+ el('chat-screen').style.display = 'none';
+ el('status-dot').className = 'status-dot disconnected';
+ el('status-text').textContent = 'DISCONNECTED';
+ el('disconnect-btn').style.display = 'none';
+
+ if (location.protocol === 'https:') {
+ el('http-notice').style.display = '';
+ el('tls-locked-note').style.display = '';
+ }
+
+ // ── Wire wsSend into buffers (nick menu commands) ─────────────────────────
+ setWsSend(wsSend);
+
+ // ── Connection ────────────────────────────────────────────────────────────
+ el('connect-btn') .addEventListener('click', connect);
+ el('disconnect-btn').addEventListener('click', disconnect);
+ ['host','port','password'].forEach(id =>
+ el(id).addEventListener('keydown', e => { if (e.key === 'Enter') connect(); })
+ );
+ el('port').addEventListener('input', checkPort);
+
+ // ── Chat input ────────────────────────────────────────────────────────────
+ el('send-btn') .addEventListener('click', () => sendInput(wsSend));
+ el('chat-input').addEventListener('keydown', e => onInputKey(e, wsSend));
+
+ // ── Smart filter ──────────────────────────────────────────────────────────
+ el('smartfilter-btn').addEventListener('click', toggleSmartFilter);
+
+ // ── Buffer close buttons (delegated) ─────────────────────────────────────
+ el('buffer-list').addEventListener('click', e => {
+ const btn = e.target.closest('.buf-close');
+ if (!btn) return;
+ e.stopPropagation();
+ const buf = state.buffers.get(btn.dataset.id);
+ if (!buf) return;
+ wsSend({ request: 'POST /api/input', body: { buffer_name: buf.name, command: '/close' } });
+ });
+
+ // ── Sidebar join button ───────────────────────────────────────────────────
+ el('sidebar-join-btn').addEventListener('click', () => {
+ const ch = prompt('Channel to join (e.g. #weechat):');
+ if (!ch) return;
+ const buf = state.buffers.get(state.activeBufferId);
+ if (!buf) return;
+ wsSend({ request: 'POST /api/input', body: { buffer_name: buf.name, command: '/join ' + ch } });
+ });
+
+ // ── Media preview (document-level delegation) ─────────────────────────────
+ document.addEventListener('click', e => {
+ const btn = e.target.closest('.media-toggle');
+ if (!btn) return;
+ const url = btn.dataset.url.replace(/&/g, '&');
+ const type = btn.dataset.type;
+ const existing = btn.nextElementSibling;
+ if (existing && existing.classList.contains('media-preview')) {
+ existing.remove();
+ btn.textContent = type === 'img' ? 'Show Image' : 'Show Video';
+ return;
+ }
+ const wrap = document.createElement('span');
+ wrap.className = 'media-preview';
+ if (type === 'img') {
+ const img = document.createElement('img');
+ img.src = url;
+ img.className = 'preview-img';
+ img.alt = 'image';
+ img.title = 'Click to open full size';
+ img.addEventListener('click', () => window.open(url, '_blank'));
+ wrap.appendChild(img);
+ } else {
+ const vid = document.createElement('video');
+ vid.src = url;
+ vid.controls = true;
+ vid.className = 'preview-vid';
+ wrap.appendChild(vid);
+ }
+ btn.after(wrap);
+ btn.textContent = type === 'img' ? 'Hide Image' : 'Hide Video';
+ });
+
+ // ── Theme ─────────────────────────────────────────────────────────────────
+ el('theme-toggle').addEventListener('click', toggleTheme);
+ window.addEventListener('cathode:themechange', () => {
+ const buf = state.buffers.get(state.activeBufferId);
+ if (buf) import('./chat.js').then(m => m.renderMessages(buf));
+ if (_emojiPicker) { _emojiPicker.remove(); _emojiPicker = null; }
+ });
+
+ // ── Emoji picker ──────────────────────────────────────────────────────────
+ let _emojiPicker = null;
+ let _emojiDataCache = null;
+
+ async function getEmojiData() {
+ if (_emojiDataCache) return _emojiDataCache;
+ const res = await fetch('vendor/emoji-data.json');
+ _emojiDataCache = await res.json();
+ return _emojiDataCache;
+ }
+
+ el('emoji-btn').addEventListener('click', async e => {
+ e.stopPropagation();
+ if (_emojiPicker) {
+ _emojiPicker.remove(); _emojiPicker = null; return;
+ }
+ if (!window.EmojiMart?.Picker) return;
+ const data = await getEmojiData();
+ const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light';
+ _emojiPicker = new EmojiMart.Picker({
+ data,
+ theme,
+ onEmojiSelect: emoji => {
+ const input = el('chat-input');
+ const pos = input.selectionStart ?? input.value.length;
+ input.value =
+ input.value.slice(0, pos) + emoji.native + input.value.slice(pos);
+ input.selectionStart = input.selectionEnd = pos + [...emoji.native].length;
+ _emojiPicker.remove(); _emojiPicker = null;
+ input.focus();
+ },
+ onClickOutside: () => {
+ if (_emojiPicker) { _emojiPicker.remove(); _emojiPicker = null; }
+ },
+ });
+ _emojiPicker.style.cssText = 'position:absolute;bottom:48px;right:8px;z-index:200;';
+ el('main').appendChild(_emojiPicker);
+ });
+
+ // ── Cert helper ───────────────────────────────────────────────────────────
+ el('cert-btn').addEventListener('click', openCertPage);
+
+ // ── Upload ────────────────────────────────────────────────────────────────
+ el('upload-btn') .addEventListener('click', () => el('upload-file').click());
+ el('upload-file').addEventListener('change', e => {
+ const file = e.target.files[0];
+ if (file) { uploadFile(file); e.target.value = ''; }
+ });
+ initDragDrop();
+
+ // ── Settings panel ────────────────────────────────────────────────────────
+ el('settings-btn') .addEventListener('click', openSettings);
+ el('settings-close') .addEventListener('click', closeSettings);
+ el('settings-save') .addEventListener('click', saveSettingsPanel);
+ el('s-upload-backend').addEventListener('change', updateBackendVis);
+ el('settings-overlay').addEventListener('click', e => {
+ if (e.target === el('settings-overlay')) closeSettings();
+ });
+
+ // ── Global keyboard shortcuts ─────────────────────────────────────────────
+ document.addEventListener('keydown', e => {
+ if (e.key === 'Escape') {
+ closeSettings();
+ if (_emojiPicker) { _emojiPicker.remove(); _emojiPicker = null; }
+ }
+ });
+});
diff --git a/js/notifications.js b/js/notifications.js
new file mode 100644
index 0000000..13e8420
--- /dev/null
+++ b/js/notifications.js
@@ -0,0 +1,60 @@
+import { state } from './state.js';
+
+export async function initNotifications() {
+ if (!('Notification' in window)) return;
+ if (Notification.permission === 'default') {
+ await Notification.requestPermission();
+ }
+}
+
+export function maybeNotify(buf, line, activateBufferFn) {
+ if (!line) return;
+ if (!('Notification' in window) || Notification.permission !== 'granted') return;
+
+ // Buffer-level notify gate.
+ // WeeChat's buffer.notify setting only gates the hotlist — it does NOT affect
+ // line.highlight or line.notify_level, so we implement our own gate here.
+ // The relay API doesn't expose buffer.notify, so we use config flags instead.
+ const lv = buf.local_variables || {};
+ const type = lv.type || '';
+ const cfg = window.CATHODE_CONFIG || {};
+ if (type === 'server' && cfg.notifyServerBuffers === false) return;
+
+ // Detect highlight — check all three sources WeeChat may use
+ const tags = Array.isArray(line.tags) ? line.tags : [];
+ const isHL = line.highlight
+ || (line.notify_level >= 3)
+ || tags.includes('notify_highlight');
+ const isPrivate = (line.notify_level === 2)
+ || tags.includes('notify_private');
+
+ if (!isHL && !isPrivate) return;
+
+ // Suppress only when tab is visible AND the user is on this exact buffer
+ const focused = document.visibilityState === 'visible'
+ && state.activeBufferId === buf.id;
+ if (focused) return;
+
+ const bufName = buf.short_name || buf.name || '?';
+ const stripAnsi = s => (s || '').replace(/\x1b\[[0-9;]*m/g, '').trim();
+ const prefix = stripAnsi(line.prefix);
+ const body = stripAnsi(line.message);
+ const title = isPrivate ? `PM from ${prefix}` : `${prefix} in ${bufName}`;
+
+ const n = new Notification(title, {
+ body,
+ icon: 'apple-touch-icon.png',
+ tag: `cathode-${buf.id}`, // collapses repeated pings from same buffer
+ });
+ n.onclick = () => {
+ window.focus();
+ activateBufferFn(buf.id);
+ n.close();
+ };
+}
+
+export function updateTitle() {
+ let total = 0;
+ for (const buf of state.buffers.values()) total += buf.highlight;
+ document.title = total > 0 ? `(${total}) Cathode` : 'Cathode';
+}
diff --git a/js/settings.js b/js/settings.js
new file mode 100644
index 0000000..422d0bb
--- /dev/null
+++ b/js/settings.js
@@ -0,0 +1,74 @@
+import { state, saveSettings, BLOCKED_PORTS } from './state.js';
+import { applyPrefixWidth } from './chat.js';
+
+const el = id => document.getElementById(id);
+
+// ─── Theme ────────────────────────────────────────────────────────────────────
+export function initTheme() {
+ setTheme(localStorage.getItem('cathode_theme') || 'dark');
+}
+
+export function setTheme(t) {
+ document.documentElement.setAttribute('data-theme', t);
+ localStorage.setItem('cathode_theme', t);
+ el('theme-toggle').textContent = t === 'dark' ? '◐ LIGHT' : '◑ DARK';
+}
+
+export function toggleTheme() {
+ const cur = document.documentElement.getAttribute('data-theme') || 'dark';
+ setTheme(cur === 'dark' ? 'light' : 'dark');
+ // Re-render dispatched via custom event so chat.js can respond without circular import
+ window.dispatchEvent(new CustomEvent('cathode:themechange'));
+}
+
+// ─── Settings panel ───────────────────────────────────────────────────────────
+export function openSettings() {
+ const s = state.settings;
+ el('s-upload-backend').value = s.uploadBackend || 'none';
+ el('s-filehost-url').value = s.filehostUrl || '';
+ el('s-imgur-key').value = s.imgurClientId || '';
+ el('s-prefix-max').value = s.prefixAlignMax || state.prefixAlignMax;
+ updateBackendVis();
+ el('settings-overlay').style.display = '';
+}
+
+export function closeSettings() {
+ el('settings-overlay').style.display = 'none';
+}
+
+export function saveSettingsPanel() {
+ state.settings.uploadBackend = el('s-upload-backend').value;
+ state.settings.filehostUrl = el('s-filehost-url').value.trim();
+ state.settings.imgurClientId = el('s-imgur-key').value.trim();
+ const pm = parseInt(el('s-prefix-max').value, 10);
+ if (pm >= 4 && pm <= 64) {
+ state.settings.prefixAlignMax = pm;
+ state.prefixAlignMax = pm;
+ applyPrefixWidth();
+ }
+ saveSettings();
+ closeSettings();
+}
+
+export function updateBackendVis() {
+ const v = el('s-upload-backend').value;
+ el('s-filehost-opts').style.display = v === 'filehost' ? '' : 'none';
+ el('s-imgur-opts').style.display = v === 'imgur' ? '' : 'none';
+}
+
+// ─── Port warning ─────────────────────────────────────────────────────────────
+export function checkPort() {
+ const port = parseInt(el('port').value, 10);
+ const show = BLOCKED_PORTS.has(port);
+ el('port-warning').textContent = show
+ ? `⚠ Port ${port} is blocked by browsers. Use a different port (e.g. 9000).` : '';
+ el('port-warning').style.display = show ? 'block' : 'none';
+}
+
+// ─── Cert helper ──────────────────────────────────────────────────────────────
+export function openCertPage() {
+ const host = el('host').value.trim();
+ const port = parseInt(el('port').value, 10);
+ if (!host || !port) return alert('Enter host and port first.');
+ window.open(`https://${host}:${port}/api/version`, '_blank');
+}
diff --git a/js/state.js b/js/state.js
new file mode 100644
index 0000000..fddec1c
--- /dev/null
+++ b/js/state.js
@@ -0,0 +1,30 @@
+// ─── Blocked ports (browser hard-block list) ─────────────────────────────────
+export const BLOCKED_PORTS = new Set([
+ 1,7,9,11,13,15,17,19,20,21,22,23,25,37,42,43,53,69,77,79,87,95,
+ 101,102,103,104,107,109,110,111,113,115,117,119,123,135,137,139,
+ 143,161,179,389,427,465,512,513,514,515,526,530,531,532,540,548,
+ 554,556,563,587,601,636,989,990,993,995,1719,1720,1723,2049,3659,
+ 4045,5060,5061,6000,6566,6665,6666,6667,6668,6669,6697,10080
+]);
+
+// ─── Settings persistence ─────────────────────────────────────────────────────
+export function loadSettings() {
+ try { return JSON.parse(localStorage.getItem('cathode_settings') || '{}'); }
+ catch { return {}; }
+}
+
+export function saveSettings() {
+ localStorage.setItem('cathode_settings', JSON.stringify(state.settings));
+}
+
+// ─── Shared application state ─────────────────────────────────────────────────
+export const state = {
+ ws: null,
+ connected: false,
+ buffers: new Map(), // id (number) → buffer object
+ activeBufferId: null,
+ settings: loadSettings(),
+ prefixAlignMax: 16, // mirrors weechat.look.prefix_align_max
+ scroll: { pinned: true, newCount: 0 },
+ smartFilter: new Map(), // bufferId → boolean
+};
diff --git a/js/upload.js b/js/upload.js
new file mode 100644
index 0000000..d04118a
--- /dev/null
+++ b/js/upload.js
@@ -0,0 +1,126 @@
+import { state } from './state.js';
+
+const el = id => document.getElementById(id);
+
+// ─── Upload dispatch ──────────────────────────────────────────────────────────
+export async function uploadFile(file) {
+ const s = state.settings;
+ const backend = s.uploadBackend || 'none';
+ if (backend === 'none') {
+ showUploadError('No upload backend configured. Open ⚙ Settings to set one up.');
+ return;
+ }
+ setUploadState('uploading');
+ try {
+ let url;
+ if (backend === 'filehost') url = await uploadToFilehost(file, s.filehostUrl);
+ else if (backend === 'imgur') url = await uploadToImgur(file, s.imgurClientId);
+
+ setUploadState('ok');
+ setTimeout(() => setUploadState('idle'), 2000);
+
+ const input = el('chat-input');
+ const pos = input.selectionStart || input.value.length;
+ const sep = input.value.length > 0 && !input.value.endsWith(' ') ? ' ' : '';
+ input.value = input.value.slice(0, pos) + sep + url + input.value.slice(pos);
+ input.focus();
+ input.selectionStart = input.selectionEnd = pos + sep.length + url.length;
+ } catch (err) {
+ setUploadState('err');
+ setTimeout(() => setUploadState('idle'), 3000);
+ showUploadError(`Upload failed: ${err.message}`);
+ }
+}
+
+async function uploadToFilehost(file, baseUrl) {
+ if (!baseUrl) throw new Error('Filehost URL not configured in Settings.');
+ const url = baseUrl.endsWith('/') ? baseUrl : baseUrl + '/';
+ const form = new FormData();
+ form.append('file', file, file.name);
+ const res = await fetch(url, { method: 'POST', body: form });
+ if (!res.ok) throw new Error(`Server returned ${res.status}`);
+ const text = (await res.text()).trim();
+ if (!text.startsWith('http')) throw new Error(`Unexpected response: ${text}`);
+ return text;
+}
+
+async function uploadToImgur(file, clientId) {
+ if (!clientId) throw new Error('Imgur Client ID not configured in Settings.');
+ const form = new FormData();
+ form.append('image', file);
+ const res = await fetch('https://api.imgur.com/3/image', {
+ method: 'POST',
+ headers: { Authorization: `Client-ID ${clientId}` },
+ body: form,
+ });
+ const json = await res.json();
+ if (!json.success) throw new Error(json.data?.error || 'Imgur upload failed');
+ return json.data.link;
+}
+
+function setUploadState(s) {
+ const btn = el('upload-btn');
+ btn.classList.remove('uploading', 'upload-ok', 'upload-err');
+ if (s === 'uploading') { btn.classList.add('uploading'); btn.textContent = '⏳'; }
+ else if (s === 'ok') { btn.classList.add('upload-ok'); btn.textContent = '✓'; }
+ else if (s === 'err') { btn.classList.add('upload-err'); btn.textContent = '✗'; }
+ else { btn.textContent = '📎'; }
+}
+
+function showUploadError(msg) {
+ const box = el('messages');
+ if (!box) return;
+ const row = document.createElement('div');
+ row.className = 'msg-row msg-system';
+ row.style.color = 'var(--status-disc)';
+ row.innerHTML =
+ ` ` +
+ `upload ` +
+ ` ` +
+ `${msg} `;
+ box.appendChild(row);
+ if (state.scroll.pinned) box.scrollTop = box.scrollHeight;
+}
+
+// ─── Drag & drop and clipboard paste ─────────────────────────────────────────
+export function initDragDrop() {
+ let dragCounter = 0;
+
+ window.addEventListener('dragenter', e => {
+ if (!e.dataTransfer.types.includes('Files')) return;
+ dragCounter++;
+ el('drag-overlay').style.display = 'flex';
+ });
+
+ window.addEventListener('dragleave', () => {
+ dragCounter--;
+ if (dragCounter <= 0) {
+ dragCounter = 0;
+ el('drag-overlay').style.display = 'none';
+ }
+ });
+
+ window.addEventListener('dragover', e => {
+ if (!e.dataTransfer.types.includes('Files')) return;
+ e.preventDefault();
+ });
+
+ window.addEventListener('drop', e => {
+ e.preventDefault();
+ dragCounter = 0;
+ el('drag-overlay').style.display = 'none';
+ if (!state.connected) return;
+ const files = [...e.dataTransfer.files];
+ if (files.length) uploadFile(files[0]);
+ });
+
+ // Paste image from clipboard
+ el('chat-input').addEventListener('paste', e => {
+ const items = [...(e.clipboardData?.items || [])];
+ const imageItem = items.find(i => i.kind === 'file' && i.type.startsWith('image/'));
+ if (!imageItem) return;
+ e.preventDefault();
+ const file = imageItem.getAsFile();
+ if (file) uploadFile(file);
+ });
+}
diff --git a/proxy/Caddyfile b/proxy/Caddyfile
new file mode 100644
index 0000000..116d382
--- /dev/null
+++ b/proxy/Caddyfile
@@ -0,0 +1,56 @@
+# Caddyfile — Cathode + WeeChat relay reverse proxy
+#
+# This config does two things:
+# 1. Serves the Cathode static files at the root
+# 2. Proxies /api/* to WeeChat's relay (API protocol) with WebSocket support
+#
+# Caddy handles TLS automatically (Let's Encrypt) when you use a real domain.
+# Replace cathode.example.com with your actual domain.
+
+cathode.example.com {
+
+ # Serve Cathode static files
+ root * /var/www/cathode
+ file_server
+
+ # Proxy WeeChat relay API (REST + WebSocket)
+ # WeeChat listens on localhost:9000 — adjust if needed
+ handle /api* {
+ reverse_proxy localhost:9000 {
+ # Pass the real client IP to WeeChat
+ header_up X-Real-IP {remote_host}
+
+ # Required for WebSocket upgrade
+ transport http {
+ # If WeeChat relay uses a self-signed cert on localhost,
+ # disable verification for the backend connection
+ # tls_insecure_skip_verify
+ }
+ }
+ }
+
+ # Security headers
+ header {
+ X-Content-Type-Options nosniff
+ X-Frame-Options DENY
+ Referrer-Policy strict-origin-when-cross-origin
+ }
+
+ # Optional: enable compression for static assets
+ encode gzip
+}
+
+
+# ── Local / LAN setup (no domain, plain HTTP) ────────────────────────────────
+# If you're running on a LAN and don't have a domain, use this instead.
+# Note: browsers will require ws:// (not wss://) and you must uncheck TLS
+# in Cathode's connect screen.
+#
+# :8080 {
+# root * /var/www/cathode
+# file_server
+#
+# handle /api* {
+# reverse_proxy localhost:9000
+# }
+# }
diff --git a/proxy/apache.conf b/proxy/apache.conf
new file mode 100644
index 0000000..810c99f
--- /dev/null
+++ b/proxy/apache.conf
@@ -0,0 +1,89 @@
+# Apache VirtualHost config for Cathode
+# Drop in /etc/apache2/sites-available/cathode.conf
+# Enable with: sudo a2ensite cathode
+#
+# Required modules:
+# sudo a2enmod ssl proxy proxy_http proxy_wstunnel rewrite headers
+#
+# For TLS certs use certbot:
+# sudo certbot --apache -d cathode.example.com
+
+# HTTP → HTTPS redirect
+
+ ServerName cathode.example.com
+ Redirect permanent / https://cathode.example.com/
+
+
+
+ ServerName cathode.example.com
+
+ # TLS (certbot will fill these in, or provide your own)
+ SSLEngine on
+ SSLCertificateFile /etc/letsencrypt/live/cathode.example.com/fullchain.pem
+ SSLCertificateKeyFile /etc/letsencrypt/live/cathode.example.com/privkey.pem
+
+ # Modern TLS
+ SSLProtocol -all +TLSv1.2 +TLSv1.3
+ SSLHonorCipherOrder off
+
+ # Serve Cathode static files
+ DocumentRoot /var/www/cathode
+
+ Options -Indexes +FollowSymLinks
+ AllowOverride None
+ Require all granted
+
+
+ # Proxy WeeChat relay API — REST and WebSocket
+ # WeeChat listens on localhost:9000 — adjust if needed
+
+ # Enable proxy for this vhost
+ ProxyRequests off
+
+ # WebSocket proxy: must come before the plain HTTP proxy rule
+ # Apache uses mod_proxy_wstunnel for WebSocket upgrades
+ RewriteEngine on
+ RewriteCond %{HTTP:Upgrade} =websocket [NC]
+ RewriteRule ^/api(.*) ws://localhost:9000/api$1 [P,L]
+
+ # Plain HTTP proxy for REST requests to /api
+ ProxyPass /api http://localhost:9000/api
+ ProxyPassReverse /api http://localhost:9000/api
+
+ # Pass real client IP
+ ProxyPreserveHost on
+ RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
+
+ # Timeouts for long-lived WebSocket connections
+ ProxyTimeout 3600
+
+ # Security headers
+ Header always set X-Content-Type-Options "nosniff"
+ Header always set X-Frame-Options "DENY"
+ Header always set Referrer-Policy "strict-origin-when-cross-origin"
+
+ # Logging
+ ErrorLog ${APACHE_LOG_DIR}/cathode_error.log
+ CustomLog ${APACHE_LOG_DIR}/cathode_access.log combined
+
+
+
+# ── Local / LAN setup (no domain, plain HTTP) ────────────────────────────────
+# If you're on a LAN without a domain, use this simpler block.
+# Cathode connect screen: uncheck TLS, use ws:// (port 8080 here).
+#
+#
+# DocumentRoot /var/www/cathode
+#
+# Options -Indexes
+# Require all granted
+#
+#
+# ProxyRequests off
+# RewriteEngine on
+# RewriteCond %{HTTP:Upgrade} =websocket [NC]
+# RewriteRule ^/api(.*) ws://localhost:9000/api$1 [P,L]
+# ProxyPass /api http://localhost:9000/api
+# ProxyPassReverse /api http://localhost:9000/api
+# ProxyTimeout 3600
+#
diff --git a/proxy/nginx.conf b/proxy/nginx.conf
new file mode 100644
index 0000000..1483b0a
--- /dev/null
+++ b/proxy/nginx.conf
@@ -0,0 +1,100 @@
+# nginx.conf (or drop in /etc/nginx/sites-available/cathode)
+#
+# This config:
+# 1. Serves the Cathode static files at the root
+# 2. Proxies /api/* to WeeChat's relay with WebSocket support
+# 3. Handles TLS termination (you must provide your own certs, or use
+# certbot: sudo certbot --nginx -d cathode.example.com)
+#
+# Replace cathode.example.com and cert paths as needed.
+
+server {
+ listen 80;
+ server_name cathode.example.com;
+
+ # Redirect all HTTP → HTTPS
+ return 301 https://$host$request_uri;
+}
+
+server {
+ listen 443 ssl http2;
+ server_name cathode.example.com;
+
+ # TLS certificates (use certbot or provide your own)
+ ssl_certificate /etc/letsencrypt/live/cathode.example.com/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/cathode.example.com/privkey.pem;
+
+ # Modern TLS settings
+ ssl_protocols TLSv1.2 TLSv1.3;
+ ssl_prefer_server_ciphers off;
+ ssl_session_cache shared:SSL:10m;
+ ssl_session_timeout 1d;
+
+ # Serve Cathode static files
+ root /var/www/cathode;
+ index index.html;
+
+ location / {
+ try_files $uri $uri/ =404;
+ }
+
+ # Proxy WeeChat relay API — REST and WebSocket
+ # WeeChat listens on localhost:9000 — adjust if needed
+ location /api {
+
+ proxy_pass http://localhost:9000;
+
+ # Required for WebSocket upgrade
+ proxy_http_version 1.1;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ # Standard proxy headers
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+
+ # WebSocket connections can be long-lived — raise the timeouts
+ proxy_read_timeout 3600s;
+ proxy_send_timeout 3600s;
+ proxy_connect_timeout 10s;
+
+ # Disable buffering for real-time streaming
+ proxy_buffering off;
+ }
+
+ # Security headers
+ add_header X-Content-Type-Options nosniff always;
+ add_header X-Frame-Options DENY always;
+ add_header Referrer-Policy strict-origin-when-cross-origin always;
+
+ # Compression
+ gzip on;
+ gzip_types text/css application/javascript text/plain;
+ gzip_min_length 1024;
+}
+
+
+# ── Local / LAN setup (no domain, plain HTTP) ────────────────────────────────
+# If you're on a LAN without a domain, use this simpler block.
+# Cathode connect screen: uncheck TLS, use ws:// (port 8080 here).
+#
+# server {
+# listen 8080;
+#
+# root /var/www/cathode;
+# index index.html;
+#
+# location / {
+# try_files $uri $uri/ =404;
+# }
+#
+# location /api {
+# proxy_pass http://localhost:9000;
+# proxy_http_version 1.1;
+# proxy_set_header Upgrade $http_upgrade;
+# proxy_set_header Connection "upgrade";
+# proxy_read_timeout 3600s;
+# proxy_buffering off;
+# }
+# }
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..015dd16
--- /dev/null
+++ b/style.css
@@ -0,0 +1,1074 @@
+/* ─── Cathode — terminal IRC client ─────────────────────────────────────── */
+
+@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,600;1,400&display=swap');
+
+/* ─── Theme variables ─────────────────────────────────────────────────────── */
+:root,
+[data-theme="dark"] {
+ --bg: #0a0a0a;
+ --bg-panel: #111111;
+ --bg-input: #0f0f0f;
+ --bg-hover: #1a1a1a;
+ --bg-active: #1f1f1f;
+ --fg: #e0e0e0;
+ --fg-dim: #888888;
+ --fg-dimmer: #3a3a3a;
+ --accent: #e0e0e0;
+ --accent-hl: #ffffff;
+ --border: #2a2a2a;
+ --border-l: #333333;
+ --unread: #888888;
+ --highlight: #ffee00;
+ --hl-bg: #1a1800;
+ --cursor: #e0e0e0;
+ --scrollbar: #2a2a2a;
+ --status-conn: #55cc55;
+ --status-disc: #cc5555;
+ --link: #88bbff;
+ --scanline-opacity: 0.015;
+ --prefix-col-width: 148px; /* updated by applyPrefixWidth() */
+}
+
+[data-theme="light"] {
+ --bg: #f5f5f5;
+ --bg-panel: #ebebeb;
+ --bg-input: #ffffff;
+ --bg-hover: #e0e0e0;
+ --bg-active: #d8d8d8;
+ --fg: #111111;
+ --fg-dim: #666666;
+ --fg-dimmer: #bbbbbb;
+ --accent-hl: #000000;
+ --border: #d0d0d0;
+ --border-l: #c0c0c0;
+ --unread: #555555;
+ --highlight: #996600;
+ --hl-bg: #fff8e0;
+ --cursor: #111111;
+ --scrollbar: #cccccc;
+ --status-conn: #228822;
+ --status-disc: #882222;
+ --link: #0055cc;
+ --scanline-opacity: 0;
+}
+
+/* ─── Reset & base ────────────────────────────────────────────────────────── */
+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+
+html, body {
+ height: 100%;
+ overflow: hidden;
+ font-family: 'IBM Plex Mono', 'Courier New', monospace;
+ font-size: 13px;
+ line-height: 1.5;
+ background: var(--bg);
+ color: var(--fg);
+ caret-color: var(--cursor);
+}
+
+/* CRT scanline overlay */
+body::after {
+ content: '';
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ z-index: 9999;
+ background: repeating-linear-gradient(
+ 0deg,
+ transparent,
+ transparent 2px,
+ rgba(0,0,0,var(--scanline-opacity)) 2px,
+ rgba(0,0,0,var(--scanline-opacity)) 4px
+ );
+}
+
+a { color: var(--link); text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+::-webkit-scrollbar { width: 6px; height: 6px; }
+::-webkit-scrollbar-track { background: transparent; }
+::-webkit-scrollbar-thumb { background: var(--scrollbar); border-radius: 0; }
+
+/* ─── Layout shell ────────────────────────────────────────────────────────── */
+#app {
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ width: 100vw;
+}
+
+/* ─── Topbar ──────────────────────────────────────────────────────────────── */
+#topbar {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding: 0 16px;
+ height: 36px;
+ border-bottom: 1px solid var(--border);
+ background: var(--bg-panel);
+ flex-shrink: 0;
+ user-select: none;
+}
+
+#topbar .logo {
+ font-weight: 600;
+ font-size: 14px;
+ letter-spacing: 0.15em;
+ color: var(--accent-hl);
+}
+
+#topbar .logo span {
+ color: var(--fg-dim);
+ font-weight: 400;
+}
+
+.status-pill {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ margin-left: 4px;
+}
+
+.status-dot {
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ flex-shrink: 0;
+ transition: background 0.3s;
+}
+.status-dot.connected { background: var(--status-conn); box-shadow: 0 0 6px var(--status-conn); }
+.status-dot.disconnected { background: var(--status-disc); }
+.status-dot.connecting { background: var(--fg-dim); animation: blink 0.8s step-end infinite; }
+
+@keyframes blink { 50% { opacity: 0; } }
+
+#status-text {
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ color: var(--fg-dim);
+}
+
+.topbar-spacer { flex: 1; }
+
+.topbar-btn {
+ background: none;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 10px;
+ letter-spacing: 0.1em;
+ padding: 3px 9px;
+ cursor: pointer;
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
+}
+.topbar-btn:hover {
+ border-color: var(--border-l);
+ color: var(--fg);
+}
+
+/* Theme toggle — amber in dark, indigo in light */
+#theme-toggle {
+ color: #b8860b;
+ border-color: #3a2e00;
+}
+[data-theme="light"] #theme-toggle {
+ color: #4455bb;
+ border-color: #9aabdd;
+}
+#theme-toggle:hover {
+ color: #e0a800;
+ border-color: #6a5200;
+ background: #1a1000;
+}
+[data-theme="light"] #theme-toggle:hover {
+ color: #2233aa;
+ border-color: #6677cc;
+ background: #eef0ff;
+}
+
+/* Quit button — red */
+#disconnect-btn {
+ color: #aa3333;
+ border-color: #3a1010;
+}
+[data-theme="light"] #disconnect-btn {
+ color: #991111;
+ border-color: #ddaaaa;
+}
+#disconnect-btn:hover {
+ color: #ff5555;
+ border-color: #aa3333;
+ background: #1a0000;
+}
+[data-theme="light"] #disconnect-btn:hover {
+ color: #cc1111;
+ border-color: #cc4444;
+ background: #fff0f0;
+}
+
+/* ─── Connect screen ─────────────────────────────────────────────────────── */
+#connect-screen {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 16px;
+ background: var(--bg);
+}
+
+/* HTTPS/ws warning banner — shown above the connect box */
+#http-notice {
+ width: 420px;
+ padding: 10px 14px;
+ border: 1px solid #553300;
+ border-left: 3px solid #cc6600;
+ background: #1a0d00;
+ font-size: 11px;
+ line-height: 1.7;
+ color: #cc8833;
+}
+[data-theme="light"] #http-notice {
+ background: #fff5e6;
+ border-color: #e09040;
+ border-left-color: #cc6600;
+ color: #7a4400;
+}
+#http-notice strong { color: inherit; font-weight: 600; }
+#http-notice code { font-family: inherit; opacity: 0.85; }
+#http-notice a { color: inherit; text-decoration: underline; }
+#http-notice a:hover { opacity: 0.8; }
+
+#tls-locked-note {
+ color: #cc6600;
+ font-size: 10px;
+ letter-spacing: 0.05em;
+}
+[data-theme="light"] #tls-locked-note { color: #994400; }
+
+.connect-box {
+ width: 420px;
+ border: 1px solid var(--border-l);
+ background: var(--bg-panel);
+ padding: 0;
+}
+
+.connect-box-header {
+ padding: 12px 20px;
+ border-bottom: 1px solid var(--border);
+ font-size: 11px;
+ letter-spacing: 0.2em;
+ color: var(--fg);
+}
+
+.connect-box-body {
+ padding: 24px 20px;
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.field {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+}
+
+.field label {
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ color: var(--fg);
+}
+
+.field input[type="text"],
+.field input[type="number"],
+.field input[type="password"] {
+ background: var(--bg-input);
+ border: 1px solid var(--border);
+ color: var(--fg);
+ font-family: inherit;
+ font-size: 13px;
+ padding: 7px 10px;
+ outline: none;
+ transition: border-color 0.15s;
+ width: 100%;
+}
+.field input:focus {
+ border-color: var(--border-l);
+}
+
+.field-row {
+ display: flex;
+ gap: 10px;
+}
+.field-row .field { flex: 1; }
+.field-row .field.short { flex: 0 0 100px; }
+
+.checkbox-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-size: 11px;
+ color: var(--fg);
+ cursor: pointer;
+ user-select: none;
+}
+.checkbox-row input { cursor: pointer; accent-color: var(--fg); }
+
+#port-warning {
+ display: none;
+ font-size: 11px;
+ color: #cc8800;
+ padding: 6px 8px;
+ border: 1px solid #553300;
+ background: #1a0f00;
+}
+[data-theme="light"] #port-warning {
+ background: #fff8e0;
+ border-color: #cc8800;
+}
+
+#conn-error {
+ display: none;
+ font-size: 11px;
+ color: #ff6666;
+ padding: 6px 8px;
+ border: 1px solid #440000;
+ background: #110000;
+}
+[data-theme="light"] #conn-error {
+ background: #fff0f0;
+ border-color: #cc4444;
+ color: #881111;
+}
+
+.connect-actions {
+ display: flex;
+ gap: 10px;
+ padding-top: 4px;
+}
+
+.btn-primary {
+ flex: 1;
+ background: var(--fg);
+ color: var(--bg);
+ border: none;
+ font-family: inherit;
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.18em;
+ padding: 9px 16px;
+ cursor: pointer;
+ transition: opacity 0.15s;
+}
+.btn-primary:hover:not(:disabled) { opacity: 0.85; }
+.btn-primary:disabled { opacity: 0.4; cursor: not-allowed; }
+
+.btn-secondary {
+ background: none;
+ border: 1px solid var(--border-l);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ padding: 9px 12px;
+ cursor: pointer;
+ white-space: nowrap;
+ transition: border-color 0.15s, color 0.15s;
+}
+.btn-secondary:hover { border-color: var(--fg-dim); color: var(--fg); }
+
+/* Self-signed cert hint — amber callout box */
+.cert-hint {
+ font-size: 11px;
+ color: #c8920a;
+ line-height: 1.6;
+ padding: 8px 12px;
+ border: 1px solid #6a4a00;
+ background: #1a1000;
+ border-left: 3px solid #c8920a;
+}
+[data-theme="light"] .cert-hint {
+ color: #7a5200;
+ border-color: #e0b040;
+ border-left-color: #c8920a;
+ background: #fffae8;
+}
+
+/* ─── Chat screen ────────────────────────────────────────────────────────── */
+#chat-screen {
+ flex: 1;
+ display: flex;
+ overflow: hidden;
+}
+
+/* ─── Buffer sidebar ─────────────────────────────────────────────────────── */
+#sidebar {
+ width: 180px;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ border-right: 1px solid var(--border);
+ background: var(--bg-panel);
+ overflow: hidden;
+}
+
+#sidebar-header {
+ padding: 8px 12px;
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ color: var(--fg-dim);
+ border-bottom: 1px solid var(--border);
+ flex-shrink: 0;
+}
+
+#buffer-list {
+ flex: 1;
+ overflow-y: auto;
+ padding: 4px 0;
+}
+
+/* Close (×) button on buffer items — hidden until hover */
+.buf-close {
+ background: none;
+ border: none;
+ color: var(--fg-dimmer);
+ font-size: 13px;
+ line-height: 1;
+ padding: 0 2px;
+ cursor: pointer;
+ flex-shrink: 0;
+ opacity: 0;
+ transition: opacity 0.1s, color 0.1s;
+ margin-left: auto;
+}
+.buffer-item:hover .buf-close { opacity: 1; }
+.buf-close:hover { color: var(--status-disc); }
+
+/* Sidebar footer — join button */
+#sidebar-footer {
+ flex-shrink: 0;
+ border-top: 1px solid var(--border);
+ padding: 6px 8px;
+}
+.sidebar-footer-btn {
+ width: 100%;
+ background: none;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ padding: 5px 0;
+ cursor: pointer;
+ transition: border-color 0.15s, color 0.15s, background 0.15s;
+}
+.sidebar-footer-btn:hover {
+ border-color: var(--border-l);
+ color: var(--fg);
+ background: var(--bg-hover);
+}
+
+.buffer-item {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 12px;
+ cursor: pointer;
+ font-size: 12px;
+ color: var(--fg-dim);
+ transition: background 0.1s, color 0.1s;
+ min-height: 24px;
+}
+.buffer-item:hover { background: var(--bg-hover); color: var(--fg); }
+.buffer-item.active { background: var(--bg-active); color: var(--fg); }
+.buffer-item.unread { color: var(--unread); }
+.buffer-item.highlight { color: var(--highlight); }
+
+/* Group header (synthetic, no buffer) */
+.buf-group-header {
+ padding: 8px 12px 3px;
+ font-size: 10px;
+ letter-spacing: 0.15em;
+ color: var(--fg-dimmer);
+ text-transform: uppercase;
+ user-select: none;
+ border-top: 1px solid var(--border);
+ margin-top: 2px;
+}
+.buf-group-header:first-child {
+ border-top: none;
+ margin-top: 0;
+}
+
+/* Server buffer row (bold, acts as section header) */
+.buffer-item.buf-server {
+ font-size: 11px;
+ letter-spacing: 0.06em;
+ color: var(--fg);
+ padding-top: 6px;
+ padding-bottom: 6px;
+ border-top: 1px solid var(--border);
+ margin-top: 2px;
+}
+.buffer-item.buf-server:first-child {
+ border-top: none;
+ margin-top: 0;
+}
+.buffer-item.buf-server .buf-name {
+ font-weight: 600;
+}
+
+/* Channel/private rows indented under server */
+.buffer-item.buf-indented {
+ padding-left: 20px;
+}
+.buffer-item.buf-indented .buf-num {
+ width: 14px;
+}
+
+.buf-num {
+ font-size: 10px;
+ color: var(--fg-dimmer);
+ width: 16px;
+ flex-shrink: 0;
+ text-align: right;
+}
+.buf-name {
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.badge {
+ font-size: 9px;
+ padding: 1px 5px;
+ background: var(--fg-dimmer);
+ color: var(--bg);
+ flex-shrink: 0;
+}
+.hl-badge {
+ background: var(--highlight);
+ color: #000;
+}
+
+/* ─── Main chat area ─────────────────────────────────────────────────────── */
+#main {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ min-width: 0;
+ position: relative; /* anchor for .new-msg-banner */
+}
+
+/* ─── Chat header ────────────────────────────────────────────────────────── */
+#chat-header {
+ padding: 6px 14px;
+ border-bottom: 1px solid var(--border);
+ background: var(--bg-panel);
+ flex-shrink: 0;
+ display: flex;
+ align-items: baseline;
+ gap: 12px;
+ min-height: 34px;
+}
+
+#chat-title {
+ font-weight: 600;
+ font-size: 13px;
+ color: var(--accent-hl);
+ flex-shrink: 0;
+}
+
+#chat-topic {
+ font-size: 11px;
+ color: var(--fg-dim);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ flex: 1;
+}
+
+/* Buttons sitting in the chat header */
+.header-btn {
+ background: none;
+ border: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 10px;
+ letter-spacing: 0.1em;
+ padding: 2px 8px;
+ cursor: pointer;
+ flex-shrink: 0;
+ margin-left: auto;
+ transition: border-color 0.15s, color 0.15s;
+}
+.header-btn:hover { border-color: var(--border-l); color: var(--fg); }
+.header-btn.sf-off { color: #cc8800; border-color: #553300; }
+[data-theme="light"] .header-btn.sf-off { color: #885500; border-color: #cc8800; }
+
+/* ─── Messages ───────────────────────────────────────────────────────────── */
+#messages {
+ flex: 1;
+ overflow-y: auto;
+ padding: 6px 0;
+ background: var(--bg);
+}
+
+.msg-row {
+ display: flex;
+ align-items: stretch; /* stretch so msg-sep fills full row height */
+ gap: 0;
+ padding: 1px 14px;
+ font-size: 13px;
+ line-height: 1.55;
+ transition: background 0.1s;
+}
+.msg-row:hover { background: var(--bg-hover); }
+.msg-row.msg-highlight { background: var(--hl-bg); }
+.msg-row.msg-system { color: var(--fg-dim); font-style: italic; }
+
+/* ─── Unread divider ─────────────────────────────────────────────────────── */
+.read-marker {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 4px 14px;
+ font-size: 10px;
+ letter-spacing: 0.15em;
+ color: #cc8800;
+ user-select: none;
+ pointer-events: none;
+}
+[data-theme="light"] .read-marker { color: #885500; }
+.read-marker::before,
+.read-marker::after {
+ content: '';
+ flex: 1;
+ height: 1px;
+ background: currentColor;
+ opacity: 0.4;
+}
+
+.msg-time {
+ color: var(--fg-dimmer);
+ font-size: 11px;
+ flex-shrink: 0;
+ width: 60px;
+ padding-right: 6px;
+ padding-top: 2px; /* realign text to top within stretched row */
+ user-select: none;
+}
+
+.msg-prefix {
+ flex-shrink: 0;
+ width: var(--prefix-col-width);
+ text-align: right;
+ padding-right: 8px;
+ padding-top: 2px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ /* colour and content come from WeeChat ANSI — no override here */
+}
+
+.msg-text {
+ flex: 1;
+ word-break: break-word;
+ overflow-wrap: anywhere;
+ color: var(--fg);
+ min-width: 0;
+ padding-top: 2px;
+ padding-bottom: 1px;
+}
+
+/* Border-based separator — stretches naturally with the row height */
+.msg-sep {
+ flex-shrink: 0;
+ width: 0;
+ border-left: 1px solid var(--fg-dimmer);
+ margin-right: 8px;
+ user-select: none;
+}
+
+/* ─── Media preview ──────────────────────────────────────────────────────── */
+.media-toggle {
+ background: none;
+ border: none;
+ color: var(--link);
+ font-family: inherit;
+ font-size: 11px;
+ padding: 0 4px;
+ cursor: pointer;
+ vertical-align: middle;
+ text-decoration: underline;
+ transition: opacity 0.1s;
+}
+.media-toggle:hover { opacity: 0.75; }
+
+.media-preview {
+ display: block;
+ margin: 4px 0 2px;
+}
+.preview-img {
+ max-width: min(480px, 100%);
+ max-height: 300px;
+ display: block;
+ border: 1px solid var(--border);
+ cursor: pointer;
+}
+.preview-img:hover { border-color: var(--border-l); }
+.preview-vid {
+ max-width: min(480px, 100%);
+ display: block;
+ border: 1px solid var(--border);
+}
+.new-msg-banner {
+ position: absolute;
+ bottom: 46px; /* above inputbar */
+ left: 50%;
+ transform: translateX(-50%);
+ background: var(--fg);
+ color: var(--bg);
+ font-family: inherit;
+ font-size: 11px;
+ font-weight: 600;
+ letter-spacing: 0.12em;
+ padding: 5px 16px;
+ cursor: pointer;
+ white-space: nowrap;
+ z-index: 100;
+ opacity: 0.92;
+ transition: opacity 0.15s;
+}
+.new-msg-banner:hover { opacity: 1; }
+
+/* ─── Nicklist panel — always visible ────────────────────────────────────── */
+#nicklist-panel {
+ width: 150px;
+ flex-shrink: 0;
+ display: flex;
+ flex-direction: column;
+ border-left: 1px solid var(--border);
+ background: var(--bg-panel);
+ overflow: hidden;
+}
+
+#nicklist-header {
+ padding: 8px 12px;
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ color: var(--fg-dim);
+ border-bottom: 1px solid var(--border);
+ flex-shrink: 0;
+ user-select: none;
+}
+
+#nicklist {
+ flex: 1;
+ overflow-y: auto;
+ padding: 4px 0;
+}
+
+.nick-item {
+ display: flex;
+ align-items: center;
+ padding: 2px 10px;
+ font-size: 12px;
+ color: var(--fg-dim);
+ gap: 3px;
+ cursor: pointer;
+ transition: background 0.1s, color 0.1s;
+}
+.nick-item:hover {
+ background: var(--bg-hover);
+ color: var(--fg);
+}
+.nick-pfx {
+ color: var(--fg-dimmer);
+ width: 10px;
+ flex-shrink: 0;
+}
+.nick-name {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+/* ─── Nick context menu ──────────────────────────────────────────────────── */
+.nick-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(0,0,0,0.5);
+}
+[data-theme="light"] .nick-overlay { background: rgba(0,0,0,0.2); }
+
+.nick-menu {
+ background: var(--bg-panel);
+ border: 1px solid var(--border-l);
+ min-width: 210px;
+ display: flex;
+ flex-direction: column;
+}
+
+.nick-menu-hdr {
+ padding: 10px 16px;
+ font-size: 12px;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ color: var(--accent-hl);
+ border-bottom: 1px solid var(--border);
+ user-select: none;
+}
+
+.nick-menu-btn {
+ background: none;
+ border: none;
+ border-bottom: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 12px;
+ padding: 9px 16px;
+ text-align: left;
+ cursor: pointer;
+ transition: background 0.1s, color 0.1s;
+}
+.nick-menu-btn:last-child { border-bottom: none; }
+.nick-menu-btn:hover { background: var(--bg-hover); color: var(--fg); }
+
+/* ─── Input bar ──────────────────────────────────────────────────────────── */
+#inputbar {
+ display: flex;
+ align-items: center;
+ border-top: 1px solid var(--border);
+ background: var(--bg-panel);
+ flex-shrink: 0;
+ height: 38px;
+}
+
+/* ─── Emoji picker popup ─────────────────────────────────────────────────── */
+#emoji-popup {
+ position: absolute;
+ bottom: 42px; /* sits just above the inputbar */
+ right: 80px;
+ z-index: 200;
+ filter: drop-shadow(0 4px 16px rgba(0,0,0,0.5));
+}
+
+/* Wire Cathode's theme variables into emoji-picker-element's CSS custom props */
+emoji-picker {
+ --background: var(--bg-panel);
+ --border-color: var(--border);
+ --border-radius: 0;
+ --button-active-background: var(--bg-active);
+ --button-hover-background: var(--bg-hover);
+ --category-emoji-padding: .25rem;
+ --emoji-padding: .25rem;
+ --emoji-size: 1.4rem;
+ --indicator-color: var(--fg);
+ --input-border-color: var(--border);
+ --input-border-radius: 0;
+ --input-font-color: var(--fg);
+ --input-placeholder-color: var(--fg-dim);
+ --outline-color: var(--border-l);
+ --search-background: var(--bg-input);
+ --text-color: var(--fg);
+ --category-font-color: var(--fg-dim);
+ font-family: 'IBM Plex Mono', monospace;
+ width: 320px;
+ height: 360px;
+}
+
+#input-prompt {
+ padding: 0 10px;
+ color: var(--fg-dimmer);
+ font-size: 14px;
+ user-select: none;
+ flex-shrink: 0;
+}
+
+#chat-input {
+ flex: 1;
+ background: transparent;
+ border: none;
+ color: var(--fg);
+ font-family: inherit;
+ font-size: 13px;
+ outline: none;
+ padding: 0;
+ height: 100%;
+}
+#chat-input::placeholder { color: var(--fg-dimmer); }
+
+#send-btn {
+ background: none;
+ border: none;
+ border-left: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ padding: 0 14px;
+ height: 100%;
+ cursor: pointer;
+ flex-shrink: 0;
+ transition: color 0.15s, background 0.15s;
+}
+#send-btn:hover { color: var(--fg); background: var(--bg-hover); }
+
+/* Paperclip upload button in inputbar */
+.inputbar-btn {
+ background: none;
+ border: none;
+ border-left: 1px solid var(--border);
+ color: var(--fg-dim);
+ font-size: 14px;
+ padding: 0 10px;
+ height: 100%;
+ cursor: pointer;
+ flex-shrink: 0;
+ transition: color 0.15s, background 0.15s;
+}
+.inputbar-btn:hover { color: var(--fg); background: var(--bg-hover); }
+.inputbar-btn.uploading { color: #cc8800; animation: blink 0.6s step-end infinite; }
+.inputbar-btn.upload-ok { color: var(--status-conn); }
+.inputbar-btn.upload-err { color: var(--status-disc); }
+
+/* ─── Drag overlay ───────────────────────────────────────────────────────── */
+#drag-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 500;
+ background: rgba(0,0,0,0.75);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ pointer-events: none;
+}
+[data-theme="light"] #drag-overlay { background: rgba(255,255,255,0.75); }
+
+.drag-overlay-inner {
+ border: 2px dashed var(--fg-dim);
+ padding: 40px 60px;
+ font-size: 16px;
+ letter-spacing: 0.3em;
+ color: var(--fg);
+}
+
+/* Messages area drag-over state */
+#messages.drag-over { outline: 2px dashed var(--fg-dim); outline-offset: -4px; }
+
+/* ─── Settings panel ─────────────────────────────────────────────────────── */
+#settings-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 900;
+ background: rgba(0,0,0,0.5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+[data-theme="light"] #settings-overlay { background: rgba(0,0,0,0.2); }
+
+#settings-panel {
+ width: 380px;
+ background: var(--bg-panel);
+ border: 1px solid var(--border-l);
+ display: flex;
+ flex-direction: column;
+ max-height: 80vh;
+}
+
+.settings-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 10px 16px;
+ border-bottom: 1px solid var(--border);
+ font-size: 11px;
+ letter-spacing: 0.2em;
+ color: var(--fg);
+ flex-shrink: 0;
+}
+
+#settings-close {
+ background: none;
+ border: none;
+ color: var(--fg-dim);
+ font-family: inherit;
+ font-size: 12px;
+ cursor: pointer;
+ padding: 0 2px;
+}
+#settings-close:hover { color: var(--fg); }
+
+.settings-body {
+ padding: 20px 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ overflow-y: auto;
+}
+
+.settings-section {
+ font-size: 10px;
+ letter-spacing: 0.18em;
+ color: var(--fg-dimmer);
+ border-bottom: 1px solid var(--border);
+ padding-bottom: 4px;
+ margin-top: 4px;
+}
+
+.settings-body .field label {
+ font-size: 10px;
+ letter-spacing: 0.12em;
+ color: var(--fg-dim);
+}
+
+.settings-body select {
+ background: var(--bg-input);
+ border: 1px solid var(--border);
+ color: var(--fg);
+ font-family: inherit;
+ font-size: 13px;
+ padding: 7px 10px;
+ outline: none;
+ width: 100%;
+ cursor: pointer;
+}
+.settings-body select:focus { border-color: var(--border-l); }
+
+.settings-actions {
+ padding-top: 8px;
+}
+
+/* ─── Footer ─────────────────────────────────────────────────────────────── */
+#footer {
+ padding: 3px 14px;
+ font-size: 10px;
+ color: var(--fg-dimmer);
+ border-top: 1px solid var(--border);
+ background: var(--bg-panel);
+ flex-shrink: 0;
+ letter-spacing: 0.05em;
+}
+#footer a { color: var(--fg-dimmer); }
+#footer a:hover { color: var(--fg-dim); }
+
+/* ─── Responsive ─────────────────────────────────────────────────────────── */
+@media (max-width: 700px) {
+ #sidebar { width: 140px; }
+ #nicklist-panel { display: none; }
+ .msg-prefix { width: 90px; }
+ .msg-time { width: 56px; font-size: 10px; }
+}
+
+@media (max-width: 480px) {
+ #sidebar { width: 110px; }
+ .msg-prefix { width: 70px; }
+}
diff --git a/vendor/emoji-data.json b/vendor/emoji-data.json
new file mode 100644
index 0000000..2074096
--- /dev/null
+++ b/vendor/emoji-data.json
@@ -0,0 +1 @@
+{"categories":[{"id":"people","emojis":["grinning","smiley","smile","grin","laughing","sweat_smile","joy","slightly_smiling_face","upside_down_face","wink","blush","innocent","heart_eyes","kissing_heart","kissing","relaxed","kissing_closed_eyes","kissing_smiling_eyes","yum","stuck_out_tongue","stuck_out_tongue_winking_eye","stuck_out_tongue_closed_eyes","money_mouth_face","hugging_face","thinking_face","zipper_mouth_face","neutral_face","expressionless","no_mouth","smirk","unamused","face_with_rolling_eyes","grimacing","relieved","pensive","sleepy","sleeping","mask","face_with_thermometer","face_with_head_bandage","dizzy_face","sunglasses","nerd_face","confused","worried","slightly_frowning_face","white_frowning_face","open_mouth","hushed","astonished","flushed","frowning","anguished","fearful","cold_sweat","disappointed_relieved","cry","sob","scream","confounded","persevere","disappointed","sweat","weary","tired_face","triumph","rage","angry","smiling_imp","imp","skull","skull_and_crossbones","hankey","japanese_ogre","japanese_goblin","ghost","alien","space_invader","robot_face","smiley_cat","smile_cat","joy_cat","heart_eyes_cat","smirk_cat","kissing_cat","scream_cat","crying_cat_face","pouting_cat","see_no_evil","hear_no_evil","speak_no_evil","love_letter","cupid","gift_heart","sparkling_heart","heartpulse","heartbeat","revolving_hearts","two_hearts","heart_decoration","heavy_heart_exclamation_mark_ornament","broken_heart","heart","yellow_heart","green_heart","blue_heart","purple_heart","kiss","100","anger","boom","dizzy","sweat_drops","dash","wave","raised_hand_with_fingers_splayed","hand","spock-hand","ok_hand","v","the_horns","point_left","point_right","point_up_2","middle_finger","point_down","point_up","+1","-1","fist","facepunch","clap","raised_hands","open_hands","pray","writing_hand","nail_care","muscle","ear","nose","eyes","eye","tongue","lips","baby","boy","girl","person_with_blond_hair","man","woman","older_man","older_woman","person_frowning","person_with_pouting_face","no_good","ok_woman","information_desk_person","raising_hand","bow","cop","sleuth_or_spy","guardsman","construction_worker","princess","man_with_turban","man_with_gua_pi_mao","bride_with_veil","angel","santa","massage","haircut","walking","runner","dancer","man_in_business_suit_levitating","dancers","horse_racing","skier","snowboarder","golfer","surfer","rowboat","swimmer","person_with_ball","weight_lifter","bicyclist","mountain_bicyclist","bath","sleeping_accommodation","two_women_holding_hands","man_and_woman_holding_hands","two_men_holding_hands","couplekiss","woman-kiss-man","man-kiss-man","woman-kiss-woman","couple_with_heart","woman-heart-man","man-heart-man","woman-heart-woman","family","man-woman-boy","man-woman-girl","man-woman-girl-boy","man-woman-boy-boy","man-woman-girl-girl","man-man-boy","man-man-girl","man-man-girl-boy","man-man-boy-boy","man-man-girl-girl","woman-woman-boy","woman-woman-girl","woman-woman-girl-boy","woman-woman-boy-boy","woman-woman-girl-girl","speaking_head_in_silhouette","bust_in_silhouette","busts_in_silhouette","footprints","hole","speech_balloon","eye-in-speech-bubble","left_speech_bubble","right_anger_bubble","thought_balloon","zzz"]},{"id":"nature","emojis":["monkey_face","monkey","dog","dog2","poodle","wolf","cat","cat2","lion_face","tiger","tiger2","leopard","horse","racehorse","unicorn_face","cow","ox","water_buffalo","cow2","pig","pig2","boar","pig_nose","ram","sheep","goat","dromedary_camel","camel","elephant","mouse","mouse2","rat","hamster","rabbit","rabbit2","chipmunk","bear","koala","panda_face","feet","turkey","chicken","rooster","hatching_chick","baby_chick","hatched_chick","bird","penguin","dove_of_peace","frog","crocodile","turtle","snake","dragon_face","dragon","whale","whale2","dolphin","fish","tropical_fish","blowfish","octopus","shell","snail","bug","ant","bee","ladybug","spider","spider_web","scorpion","bouquet","cherry_blossom","white_flower","rosette","rose","hibiscus","sunflower","blossom","tulip","seedling","evergreen_tree","deciduous_tree","palm_tree","cactus","ear_of_rice","herb","shamrock","four_leaf_clover","maple_leaf","fallen_leaf","leaves","mushroom"]},{"id":"foods","emojis":["grapes","melon","watermelon","tangerine","lemon","banana","pineapple","apple","green_apple","pear","peach","cherries","strawberry","tomato","eggplant","corn","hot_pepper","chestnut","bread","cheese_wedge","meat_on_bone","poultry_leg","hamburger","fries","pizza","hotdog","taco","burrito","fried_egg","stew","popcorn","bento","rice_cracker","rice_ball","rice","curry","ramen","spaghetti","sweet_potato","oden","sushi","fried_shrimp","fish_cake","dango","crab","icecream","shaved_ice","ice_cream","doughnut","cookie","birthday","cake","chocolate_bar","candy","lollipop","custard","honey_pot","baby_bottle","coffee","tea","sake","champagne","wine_glass","cocktail","tropical_drink","beer","beers","knife_fork_plate","fork_and_knife","hocho","amphora"]},{"id":"activity","emojis":["jack_o_lantern","christmas_tree","fireworks","sparkler","sparkles","balloon","tada","confetti_ball","tanabata_tree","bamboo","dolls","flags","wind_chime","rice_scene","ribbon","gift","reminder_ribbon","admission_tickets","ticket","medal","trophy","sports_medal","soccer","baseball","basketball","volleyball","football","rugby_football","tennis","bowling","cricket_bat_and_ball","field_hockey_stick_and_ball","ice_hockey_stick_and_puck","table_tennis_paddle_and_ball","badminton_racquet_and_shuttlecock","golf","ice_skate","fishing_pole_and_fish","running_shirt_with_sash","ski","dart","gun","8ball","crystal_ball","video_game","joystick","slot_machine","game_die","spades","hearts","diamonds","clubs","black_joker","mahjong","flower_playing_cards","performing_arts","frame_with_picture","art"]},{"id":"places","emojis":["earth_africa","earth_americas","earth_asia","globe_with_meridians","world_map","japan","snow_capped_mountain","mountain","volcano","mount_fuji","camping","beach_with_umbrella","desert","desert_island","national_park","stadium","classical_building","building_construction","house_buildings","derelict_house_building","house","house_with_garden","office","post_office","european_post_office","hospital","bank","hotel","love_hotel","convenience_store","school","department_store","factory","japanese_castle","european_castle","wedding","tokyo_tower","statue_of_liberty","church","mosque","synagogue","shinto_shrine","kaaba","fountain","tent","foggy","night_with_stars","cityscape","sunrise_over_mountains","sunrise","city_sunset","city_sunrise","bridge_at_night","hotsprings","carousel_horse","ferris_wheel","roller_coaster","barber","circus_tent","steam_locomotive","railway_car","bullettrain_side","bullettrain_front","train2","metro","light_rail","station","tram","monorail","mountain_railway","train","bus","oncoming_bus","trolleybus","minibus","ambulance","fire_engine","police_car","oncoming_police_car","taxi","oncoming_taxi","car","oncoming_automobile","blue_car","truck","articulated_lorry","tractor","racing_car","racing_motorcycle","bike","busstop","motorway","railway_track","oil_drum","fuelpump","rotating_light","traffic_light","vertical_traffic_light","construction","anchor","boat","speedboat","passenger_ship","ferry","motor_boat","ship","airplane","small_airplane","airplane_departure","airplane_arriving","seat","helicopter","suspension_railway","mountain_cableway","aerial_tramway","satellite","rocket","bellhop_bell","hourglass","hourglass_flowing_sand","watch","alarm_clock","stopwatch","timer_clock","mantelpiece_clock","clock12","clock1230","clock1","clock130","clock2","clock230","clock3","clock330","clock4","clock430","clock5","clock530","clock6","clock630","clock7","clock730","clock8","clock830","clock9","clock930","clock10","clock1030","clock11","clock1130","new_moon","waxing_crescent_moon","first_quarter_moon","moon","full_moon","waning_gibbous_moon","last_quarter_moon","waning_crescent_moon","crescent_moon","new_moon_with_face","first_quarter_moon_with_face","last_quarter_moon_with_face","thermometer","sunny","full_moon_with_face","sun_with_face","star","star2","stars","milky_way","cloud","partly_sunny","thunder_cloud_and_rain","mostly_sunny","barely_sunny","partly_sunny_rain","rain_cloud","snow_cloud","lightning","tornado","fog","wind_blowing_face","cyclone","rainbow","closed_umbrella","umbrella","umbrella_with_rain_drops","umbrella_on_ground","zap","snowflake","snowman","snowman_without_snow","comet","fire","droplet","ocean"]},{"id":"objects","emojis":["eyeglasses","dark_sunglasses","necktie","shirt","jeans","dress","kimono","bikini","womans_clothes","purse","handbag","pouch","shopping_bags","school_satchel","mans_shoe","athletic_shoe","high_heel","sandal","boot","crown","womans_hat","tophat","mortar_board","helmet_with_white_cross","prayer_beads","lipstick","ring","gem","mute","speaker","sound","loud_sound","loudspeaker","mega","postal_horn","bell","no_bell","musical_score","musical_note","notes","studio_microphone","level_slider","control_knobs","microphone","headphones","radio","saxophone","guitar","musical_keyboard","trumpet","violin","iphone","calling","phone","telephone_receiver","pager","fax","battery","electric_plug","computer","desktop_computer","printer","keyboard","three_button_mouse","trackball","minidisc","floppy_disk","cd","dvd","movie_camera","film_frames","film_projector","clapper","tv","camera","camera_with_flash","video_camera","vhs","mag","mag_right","candle","bulb","flashlight","izakaya_lantern","notebook_with_decorative_cover","closed_book","book","green_book","blue_book","orange_book","books","notebook","ledger","page_with_curl","scroll","page_facing_up","newspaper","rolled_up_newspaper","bookmark_tabs","bookmark","label","moneybag","yen","dollar","euro","pound","money_with_wings","credit_card","chart","email","e-mail","incoming_envelope","envelope_with_arrow","outbox_tray","inbox_tray","package","mailbox","mailbox_closed","mailbox_with_mail","mailbox_with_no_mail","postbox","ballot_box_with_ballot","pencil2","black_nib","lower_left_fountain_pen","lower_left_ballpoint_pen","lower_left_paintbrush","lower_left_crayon","memo","briefcase","file_folder","open_file_folder","card_index_dividers","date","calendar","spiral_note_pad","spiral_calendar_pad","card_index","chart_with_upwards_trend","chart_with_downwards_trend","bar_chart","clipboard","pushpin","round_pushpin","paperclip","linked_paperclips","straight_ruler","triangular_ruler","scissors","card_file_box","file_cabinet","wastebasket","lock","unlock","lock_with_ink_pen","closed_lock_with_key","key","old_key","hammer","pick","hammer_and_pick","hammer_and_wrench","dagger_knife","crossed_swords","bomb","bow_and_arrow","shield","wrench","nut_and_bolt","gear","compression","scales","link","chains","alembic","microscope","telescope","satellite_antenna","syringe","pill","door","bed","couch_and_lamp","toilet","shower","bathtub","smoking","coffin","funeral_urn","moyai"]},{"id":"symbols","emojis":["atm","put_litter_in_its_place","potable_water","wheelchair","mens","womens","restroom","baby_symbol","wc","passport_control","customs","baggage_claim","left_luggage","warning","children_crossing","no_entry","no_entry_sign","no_bicycles","no_smoking","do_not_litter","non-potable_water","no_pedestrians","no_mobile_phones","underage","radioactive_sign","biohazard_sign","arrow_up","arrow_upper_right","arrow_right","arrow_lower_right","arrow_down","arrow_lower_left","arrow_left","arrow_upper_left","arrow_up_down","left_right_arrow","leftwards_arrow_with_hook","arrow_right_hook","arrow_heading_up","arrow_heading_down","arrows_clockwise","arrows_counterclockwise","back","end","on","soon","top","place_of_worship","atom_symbol","om_symbol","star_of_david","wheel_of_dharma","yin_yang","latin_cross","orthodox_cross","star_and_crescent","peace_symbol","menorah_with_nine_branches","six_pointed_star","aries","taurus","gemini","cancer","leo","virgo","libra","scorpius","sagittarius","capricorn","aquarius","pisces","ophiuchus","twisted_rightwards_arrows","repeat","repeat_one","arrow_forward","fast_forward","black_right_pointing_double_triangle_with_vertical_bar","black_right_pointing_triangle_with_double_vertical_bar","arrow_backward","rewind","black_left_pointing_double_triangle_with_vertical_bar","arrow_up_small","arrow_double_up","arrow_down_small","arrow_double_down","double_vertical_bar","black_square_for_stop","black_circle_for_record","eject","cinema","low_brightness","high_brightness","signal_strength","vibration_mode","mobile_phone_off","heavy_multiplication_x","heavy_plus_sign","heavy_minus_sign","heavy_division_sign","bangbang","interrobang","question","grey_question","grey_exclamation","exclamation","wavy_dash","currency_exchange","heavy_dollar_sign","recycle","fleur_de_lis","trident","name_badge","beginner","o","white_check_mark","ballot_box_with_check","heavy_check_mark","x","negative_squared_cross_mark","curly_loop","loop","part_alternation_mark","eight_spoked_asterisk","eight_pointed_black_star","sparkle","copyright","registered","tm","hash","keycap_star","zero","one","two","three","four","five","six","seven","eight","nine","keycap_ten","capital_abcd","abcd","1234","symbols","abc","a","ab","b","cl","cool","free","information_source","id","m","new","ng","o2","ok","parking","sos","up","vs","koko","sa","u6708","u6709","u6307","ideograph_advantage","u5272","u7121","u7981","accept","u7533","u5408","u7a7a","congratulations","secret","u55b6","u6e80","red_circle","large_blue_circle","black_circle","white_circle","black_large_square","white_large_square","black_medium_square","white_medium_square","black_medium_small_square","white_medium_small_square","black_small_square","white_small_square","large_orange_diamond","large_blue_diamond","small_orange_diamond","small_blue_diamond","small_red_triangle","small_red_triangle_down","diamond_shape_with_a_dot_inside","radio_button","white_square_button","black_square_button"]},{"id":"flags","emojis":["checkered_flag","cn","crossed_flags","de","es","flag-ac","flag-ad","flag-ae","flag-af","flag-ag","flag-ai","flag-al","flag-am","flag-ao","flag-aq","flag-ar","flag-as","flag-at","flag-au","flag-aw","flag-ax","flag-az","flag-ba","flag-bb","flag-bd","flag-be","flag-bf","flag-bg","flag-bh","flag-bi","flag-bj","flag-bl","flag-bm","flag-bn","flag-bo","flag-bq","flag-br","flag-bs","flag-bt","flag-bv","flag-bw","flag-by","flag-bz","flag-ca","flag-cc","flag-cd","flag-cf","flag-cg","flag-ch","flag-ci","flag-ck","flag-cl","flag-cm","flag-co","flag-cp","flag-cr","flag-cu","flag-cv","flag-cw","flag-cx","flag-cy","flag-cz","flag-dg","flag-dj","flag-dk","flag-dm","flag-do","flag-dz","flag-ea","flag-ec","flag-ee","flag-eg","flag-eh","flag-er","flag-et","flag-eu","flag-fi","flag-fj","flag-fk","flag-fm","flag-fo","flag-ga","flag-gd","flag-ge","flag-gf","flag-gg","flag-gh","flag-gi","flag-gl","flag-gm","flag-gn","flag-gp","flag-gq","flag-gr","flag-gs","flag-gt","flag-gu","flag-gw","flag-gy","flag-hk","flag-hm","flag-hn","flag-hr","flag-ht","flag-hu","flag-ic","flag-id","flag-ie","flag-il","flag-im","flag-in","flag-io","flag-iq","flag-ir","flag-is","flag-je","flag-jm","flag-jo","flag-ke","flag-kg","flag-kh","flag-ki","flag-km","flag-kn","flag-kp","flag-kw","flag-ky","flag-kz","flag-la","flag-lb","flag-lc","flag-li","flag-lk","flag-lr","flag-ls","flag-lt","flag-lu","flag-lv","flag-ly","flag-ma","flag-mc","flag-md","flag-me","flag-mf","flag-mg","flag-mh","flag-mk","flag-ml","flag-mm","flag-mn","flag-mo","flag-mp","flag-mq","flag-mr","flag-ms","flag-mt","flag-mu","flag-mv","flag-mw","flag-mx","flag-my","flag-mz","flag-na","flag-nc","flag-ne","flag-nf","flag-ng","flag-ni","flag-nl","flag-no","flag-np","flag-nr","flag-nu","flag-nz","flag-om","flag-pa","flag-pe","flag-pf","flag-pg","flag-ph","flag-pk","flag-pl","flag-pm","flag-pn","flag-pr","flag-ps","flag-pt","flag-pw","flag-py","flag-qa","flag-re","flag-ro","flag-rs","flag-rw","flag-sa","flag-sb","flag-sc","flag-sd","flag-se","flag-sg","flag-sh","flag-si","flag-sj","flag-sk","flag-sl","flag-sm","flag-sn","flag-so","flag-sr","flag-ss","flag-st","flag-sv","flag-sx","flag-sy","flag-sz","flag-ta","flag-tc","flag-td","flag-tf","flag-tg","flag-th","flag-tj","flag-tk","flag-tl","flag-tm","flag-tn","flag-to","flag-tr","flag-tt","flag-tv","flag-tw","flag-tz","flag-ua","flag-ug","flag-um","flag-uy","flag-uz","flag-va","flag-vc","flag-ve","flag-vg","flag-vi","flag-vn","flag-vu","flag-wf","flag-ws","flag-xk","flag-ye","flag-yt","flag-za","flag-zm","flag-zw","fr","gb","it","jp","kr","ru","triangular_flag_on_post","us","waving_black_flag","waving_white_flag"]}],"emojis":{"100":{"id":"100","name":"Hundred Points","keywords":["100","score","perfect","numbers","century","exam","quiz","test","pass"],"skins":[{"unified":"1f4af","native":"💯"}],"version":1},"1234":{"id":"1234","name":"Input Numbers","keywords":["1234","blue","square","1","2","3","4"],"skins":[{"unified":"1f522","native":"🔢"}],"version":1},"grinning":{"id":"grinning","name":"Grinning Face","emoticons":[":D"],"keywords":["smile","happy","joy",":D","grin"],"skins":[{"unified":"1f600","native":"😀"}],"version":1},"smiley":{"id":"smiley","name":"Grinning Face with Big Eyes","emoticons":[":)","=)","=-)"],"keywords":["smiley","happy","joy","haha",":D",":)","smile","funny"],"skins":[{"unified":"1f603","native":"😃"}],"version":1},"smile":{"id":"smile","name":"Grinning Face with Smiling Eyes","emoticons":[":)","C:","c:",":D",":-D"],"keywords":["smile","happy","joy","funny","haha","laugh","like",":D",":)"],"skins":[{"unified":"1f604","native":"😄"}],"version":1},"grin":{"id":"grin","name":"Beaming Face with Smiling Eyes","keywords":["grin","happy","smile","joy","kawaii"],"skins":[{"unified":"1f601","native":"😁"}],"version":1},"laughing":{"id":"laughing","name":"Grinning Squinting Face","emoticons":[":>",":->"],"keywords":["laughing","satisfied","happy","joy","lol","haha","glad","XD","laugh"],"skins":[{"unified":"1f606","native":"😆"}],"version":1},"sweat_smile":{"id":"sweat_smile","name":"Grinning Face with Sweat","keywords":["smile","hot","happy","laugh","relief"],"skins":[{"unified":"1f605","native":"😅"}],"version":1},"joy":{"id":"joy","name":"Face with Tears of Joy","keywords":["cry","weep","happy","happytears","haha"],"skins":[{"unified":"1f602","native":"😂"}],"version":1},"slightly_smiling_face":{"id":"slightly_smiling_face","name":"Slightly Smiling Face","emoticons":[":)","(:",":-)"],"keywords":["smile"],"skins":[{"unified":"1f642","native":"🙂"}],"version":1},"upside_down_face":{"id":"upside_down_face","name":"Upside-Down Face","keywords":["upside","down","flipped","silly","smile"],"skins":[{"unified":"1f643","native":"🙃"}],"version":1},"wink":{"id":"wink","name":"Winking Face","emoticons":[";)",";-)"],"keywords":["wink","happy","mischievous","secret",";)","smile","eye"],"skins":[{"unified":"1f609","native":"😉"}],"version":1},"blush":{"id":"blush","name":"Smiling Face with Smiling Eyes","emoticons":[":)"],"keywords":["blush","smile","happy","flushed","crush","embarrassed","shy","joy"],"skins":[{"unified":"1f60a","native":"😊"}],"version":1},"innocent":{"id":"innocent","name":"Smiling Face with Halo","keywords":["innocent","angel","heaven"],"skins":[{"unified":"1f607","native":"😇"}],"version":1},"heart_eyes":{"id":"heart_eyes","name":"Smiling Face with Heart-Eyes","keywords":["heart","eyes","love","like","affection","valentines","infatuation","crush"],"skins":[{"unified":"1f60d","native":"😍"}],"version":1},"kissing_heart":{"id":"kissing_heart","name":"Face Blowing a Kiss","emoticons":[":*",":-*"],"keywords":["kissing","heart","love","like","affection","valentines","infatuation"],"skins":[{"unified":"1f618","native":"😘"}],"version":1},"kissing":{"id":"kissing","name":"Kissing Face","keywords":["love","like","3","valentines","infatuation","kiss"],"skins":[{"unified":"1f617","native":"😗"}],"version":1},"relaxed":{"id":"relaxed","name":"Smiling Face","keywords":["relaxed","blush","massage","happiness"],"skins":[{"unified":"263a-fe0f","native":"☺️"}],"version":1},"kissing_closed_eyes":{"id":"kissing_closed_eyes","name":"Kissing Face with Closed Eyes","keywords":["love","like","affection","valentines","infatuation","kiss"],"skins":[{"unified":"1f61a","native":"😚"}],"version":1},"kissing_smiling_eyes":{"id":"kissing_smiling_eyes","name":"Kissing Face with Smiling Eyes","keywords":["affection","valentines","infatuation","kiss"],"skins":[{"unified":"1f619","native":"😙"}],"version":1},"yum":{"id":"yum","name":"Face Savoring Food","keywords":["yum","happy","joy","tongue","smile","silly","yummy","nom","delicious","savouring"],"skins":[{"unified":"1f60b","native":"😋"}],"version":1},"stuck_out_tongue":{"id":"stuck_out_tongue","name":"Face with Tongue","emoticons":[":p",":-p",":P",":-P",":b",":-b"],"keywords":["stuck","out","prank","childish","playful","mischievous","smile"],"skins":[{"unified":"1f61b","native":"😛"}],"version":1},"stuck_out_tongue_winking_eye":{"id":"stuck_out_tongue_winking_eye","name":"Winking Face with Tongue","emoticons":[";p",";-p",";b",";-b",";P",";-P"],"keywords":["stuck","out","eye","prank","childish","playful","mischievous","smile","wink"],"skins":[{"unified":"1f61c","native":"😜"}],"version":1},"stuck_out_tongue_closed_eyes":{"id":"stuck_out_tongue_closed_eyes","name":"Squinting Face with Tongue","keywords":["stuck","out","closed","eyes","prank","playful","mischievous","smile"],"skins":[{"unified":"1f61d","native":"😝"}],"version":1},"money_mouth_face":{"id":"money_mouth_face","name":"Money-Mouth Face","keywords":["money","mouth","rich","dollar"],"skins":[{"unified":"1f911","native":"🤑"}],"version":1},"hugging_face":{"id":"hugging_face","name":"Hugging Face","keywords":["smile","hug"],"skins":[{"unified":"1f917","native":"🤗"}],"version":1},"thinking_face":{"id":"thinking_face","name":"Thinking Face","keywords":["hmmm","think","consider"],"skins":[{"unified":"1f914","native":"🤔"}],"version":1},"zipper_mouth_face":{"id":"zipper_mouth_face","name":"Zipper-Mouth Face","keywords":["zipper","mouth","sealed","secret"],"skins":[{"unified":"1f910","native":"🤐"}],"version":1},"neutral_face":{"id":"neutral_face","name":"Neutral Face","emoticons":[":|",":-|"],"keywords":["indifference","meh",":",""],"skins":[{"unified":"1f610","native":"😐"}],"version":1},"expressionless":{"id":"expressionless","name":"Expressionless Face","emoticons":["-_-"],"keywords":["indifferent","-","","meh","deadpan"],"skins":[{"unified":"1f611","native":"😑"}],"version":1},"no_mouth":{"id":"no_mouth","name":"Face Without Mouth","keywords":["no","hellokitty"],"skins":[{"unified":"1f636","native":"😶"}],"version":1},"smirk":{"id":"smirk","name":"Smirking Face","keywords":["smirk","smile","mean","prank","smug","sarcasm"],"skins":[{"unified":"1f60f","native":"😏"}],"version":1},"unamused":{"id":"unamused","name":"Unamused Face","emoticons":[":("],"keywords":["indifference","bored","straight","serious","sarcasm","unimpressed","skeptical","dubious","side","eye"],"skins":[{"unified":"1f612","native":"😒"}],"version":1},"face_with_rolling_eyes":{"id":"face_with_rolling_eyes","name":"Face with Rolling Eyes","keywords":["eyeroll","frustrated"],"skins":[{"unified":"1f644","native":"🙄"}],"version":1},"grimacing":{"id":"grimacing","name":"Grimacing Face","keywords":["grimace","teeth"],"skins":[{"unified":"1f62c","native":"😬"}],"version":1},"relieved":{"id":"relieved","name":"Relieved Face","keywords":["relaxed","phew","massage","happiness"],"skins":[{"unified":"1f60c","native":"😌"}],"version":1},"pensive":{"id":"pensive","name":"Pensive Face","keywords":["sad","depressed","upset"],"skins":[{"unified":"1f614","native":"😔"}],"version":1},"sleepy":{"id":"sleepy","name":"Sleepy Face","keywords":["tired","rest","nap"],"skins":[{"unified":"1f62a","native":"😪"}],"version":1},"sleeping":{"id":"sleeping","name":"Sleeping Face","keywords":["tired","sleepy","night","zzz"],"skins":[{"unified":"1f634","native":"😴"}],"version":1},"mask":{"id":"mask","name":"Face with Medical Mask","keywords":["sick","ill","disease","covid"],"skins":[{"unified":"1f637","native":"😷"}],"version":1},"face_with_thermometer":{"id":"face_with_thermometer","name":"Face with Thermometer","keywords":["sick","temperature","cold","fever","covid"],"skins":[{"unified":"1f912","native":"🤒"}],"version":1},"face_with_head_bandage":{"id":"face_with_head_bandage","name":"Face with Head-Bandage","keywords":["head","bandage","injured","clumsy","hurt"],"skins":[{"unified":"1f915","native":"🤕"}],"version":1},"dizzy_face":{"id":"dizzy_face","name":"Dizzy Face","keywords":["spent","unconscious","xox"],"skins":[{"unified":"1f635","native":"😵"}],"version":1},"sunglasses":{"id":"sunglasses","name":"Smiling Face with Sunglasses","emoticons":["8)"],"keywords":["cool","smile","summer","beach","sunglass"],"skins":[{"unified":"1f60e","native":"😎"}],"version":1},"nerd_face":{"id":"nerd_face","name":"Nerd Face","keywords":["nerdy","geek","dork"],"skins":[{"unified":"1f913","native":"🤓"}],"version":1},"confused":{"id":"confused","name":"Confused Face","emoticons":[":\\",":-\\",":/",":-/"],"keywords":["indifference","huh","weird","hmmm",":/"],"skins":[{"unified":"1f615","native":"😕"}],"version":1},"worried":{"id":"worried","name":"Worried Face","keywords":["concern","nervous",":("],"skins":[{"unified":"1f61f","native":"😟"}],"version":1},"slightly_frowning_face":{"id":"slightly_frowning_face","name":"Slightly Frowning Face","keywords":["disappointed","sad","upset"],"skins":[{"unified":"1f641","native":"🙁"}],"version":1},"white_frowning_face":{"id":"white_frowning_face","name":"Frowning Face","keywords":["white","sad","upset","frown"],"skins":[{"unified":"2639-fe0f","native":"☹️"}],"version":1},"open_mouth":{"id":"open_mouth","name":"Face with Open Mouth","emoticons":[":o",":-o",":O",":-O"],"keywords":["surprise","impressed","wow","whoa",":O"],"skins":[{"unified":"1f62e","native":"😮"}],"version":1},"hushed":{"id":"hushed","name":"Hushed Face","keywords":["woo","shh"],"skins":[{"unified":"1f62f","native":"😯"}],"version":1},"astonished":{"id":"astonished","name":"Astonished Face","keywords":["xox","surprised","poisoned"],"skins":[{"unified":"1f632","native":"😲"}],"version":1},"flushed":{"id":"flushed","name":"Flushed Face","keywords":["blush","shy","flattered"],"skins":[{"unified":"1f633","native":"😳"}],"version":1},"frowning":{"id":"frowning","name":"Frowning Face with Open Mouth","keywords":["aw","what"],"skins":[{"unified":"1f626","native":"😦"}],"version":1},"anguished":{"id":"anguished","name":"Anguished Face","emoticons":["D:"],"keywords":["stunned","nervous"],"skins":[{"unified":"1f627","native":"😧"}],"version":1},"fearful":{"id":"fearful","name":"Fearful Face","keywords":["scared","terrified","nervous"],"skins":[{"unified":"1f628","native":"😨"}],"version":1},"cold_sweat":{"id":"cold_sweat","name":"Anxious Face with Sweat","keywords":["cold","nervous"],"skins":[{"unified":"1f630","native":"😰"}],"version":1},"disappointed_relieved":{"id":"disappointed_relieved","name":"Sad but Relieved Face","keywords":["disappointed","phew","sweat","nervous"],"skins":[{"unified":"1f625","native":"😥"}],"version":1},"cry":{"id":"cry","name":"Crying Face","emoticons":[":'("],"keywords":["cry","tears","sad","depressed","upset",":'("],"skins":[{"unified":"1f622","native":"😢"}],"version":1},"sob":{"id":"sob","name":"Loudly Crying Face","emoticons":[":'("],"keywords":["sob","cry","tears","sad","upset","depressed"],"skins":[{"unified":"1f62d","native":"😭"}],"version":1},"scream":{"id":"scream","name":"Face Screaming in Fear","keywords":["scream","munch","scared","omg"],"skins":[{"unified":"1f631","native":"😱"}],"version":1},"confounded":{"id":"confounded","name":"Confounded Face","keywords":["confused","sick","unwell","oops",":S"],"skins":[{"unified":"1f616","native":"😖"}],"version":1},"persevere":{"id":"persevere","name":"Persevering Face","keywords":["persevere","sick","no","upset","oops"],"skins":[{"unified":"1f623","native":"😣"}],"version":1},"disappointed":{"id":"disappointed","name":"Disappointed Face","emoticons":["):",":(",":-("],"keywords":["sad","upset","depressed",":("],"skins":[{"unified":"1f61e","native":"😞"}],"version":1},"sweat":{"id":"sweat","name":"Face with Cold Sweat","keywords":["downcast","hot","sad","tired","exercise"],"skins":[{"unified":"1f613","native":"😓"}],"version":1},"weary":{"id":"weary","name":"Weary Face","keywords":["tired","sleepy","sad","frustrated","upset"],"skins":[{"unified":"1f629","native":"😩"}],"version":1},"tired_face":{"id":"tired_face","name":"Tired Face","keywords":["sick","whine","upset","frustrated"],"skins":[{"unified":"1f62b","native":"😫"}],"version":1},"triumph":{"id":"triumph","name":"Face with Look of Triumph","keywords":["steam","from","nose","gas","phew","proud","pride"],"skins":[{"unified":"1f624","native":"😤"}],"version":1},"rage":{"id":"rage","name":"Pouting Face","keywords":["rage","angry","mad","hate","despise"],"skins":[{"unified":"1f621","native":"😡"}],"version":1},"angry":{"id":"angry","name":"Angry Face","emoticons":[">:(",">:-("],"keywords":["mad","annoyed","frustrated"],"skins":[{"unified":"1f620","native":"😠"}],"version":1},"smiling_imp":{"id":"smiling_imp","name":"Smiling Face with Horns","keywords":["imp","devil"],"skins":[{"unified":"1f608","native":"😈"}],"version":1},"imp":{"id":"imp","name":"Imp","keywords":["angry","face","with","horns","devil"],"skins":[{"unified":"1f47f","native":"👿"}],"version":1},"skull":{"id":"skull","name":"Skull","keywords":["dead","skeleton","creepy","death"],"skins":[{"unified":"1f480","native":"💀"}],"version":1},"skull_and_crossbones":{"id":"skull_and_crossbones","name":"Skull and Crossbones","keywords":["poison","danger","deadly","scary","death","pirate","evil"],"skins":[{"unified":"2620-fe0f","native":"☠️"}],"version":1},"hankey":{"id":"hankey","name":"Pile of Poo","keywords":["hankey","poop","shit","shitface","fail","turd"],"skins":[{"unified":"1f4a9","native":"💩"}],"version":1},"japanese_ogre":{"id":"japanese_ogre","name":"Ogre","keywords":["japanese","monster","red","mask","halloween","scary","creepy","devil","demon"],"skins":[{"unified":"1f479","native":"👹"}],"version":1},"japanese_goblin":{"id":"japanese_goblin","name":"Goblin","keywords":["japanese","red","evil","mask","monster","scary","creepy"],"skins":[{"unified":"1f47a","native":"👺"}],"version":1},"ghost":{"id":"ghost","name":"Ghost","keywords":["halloween","spooky","scary"],"skins":[{"unified":"1f47b","native":"👻"}],"version":1},"alien":{"id":"alien","name":"Alien","keywords":["UFO","paul","weird","outer","space"],"skins":[{"unified":"1f47d","native":"👽"}],"version":1},"space_invader":{"id":"space_invader","name":"Alien Monster","keywords":["space","invader","game","arcade","play"],"skins":[{"unified":"1f47e","native":"👾"}],"version":1},"robot_face":{"id":"robot_face","name":"Robot","keywords":["face","computer","machine","bot"],"skins":[{"unified":"1f916","native":"🤖"}],"version":1},"smiley_cat":{"id":"smiley_cat","name":"Grinning Cat","keywords":["smiley","animal","cats","happy","smile"],"skins":[{"unified":"1f63a","native":"😺"}],"version":1},"smile_cat":{"id":"smile_cat","name":"Grinning Cat with Smiling Eyes","keywords":["smile","animal","cats"],"skins":[{"unified":"1f638","native":"😸"}],"version":1},"joy_cat":{"id":"joy_cat","name":"Cat with Tears of Joy","keywords":["animal","cats","haha","happy"],"skins":[{"unified":"1f639","native":"😹"}],"version":1},"heart_eyes_cat":{"id":"heart_eyes_cat","name":"Smiling Cat with Heart-Eyes","keywords":["heart","eyes","animal","love","like","affection","cats","valentines"],"skins":[{"unified":"1f63b","native":"😻"}],"version":1},"smirk_cat":{"id":"smirk_cat","name":"Cat with Wry Smile","keywords":["smirk","animal","cats"],"skins":[{"unified":"1f63c","native":"😼"}],"version":1},"kissing_cat":{"id":"kissing_cat","name":"Kissing Cat","keywords":["animal","cats","kiss"],"skins":[{"unified":"1f63d","native":"😽"}],"version":1},"scream_cat":{"id":"scream_cat","name":"Weary Cat","keywords":["scream","animal","cats","munch","scared"],"skins":[{"unified":"1f640","native":"🙀"}],"version":1},"crying_cat_face":{"id":"crying_cat_face","name":"Crying Cat","keywords":["face","animal","tears","weep","sad","cats","upset","cry"],"skins":[{"unified":"1f63f","native":"😿"}],"version":1},"pouting_cat":{"id":"pouting_cat","name":"Pouting Cat","keywords":["animal","cats"],"skins":[{"unified":"1f63e","native":"😾"}],"version":1},"see_no_evil":{"id":"see_no_evil","name":"See-No-Evil Monkey","keywords":["see","no","evil","animal","nature","haha"],"skins":[{"unified":"1f648","native":"🙈"}],"version":1},"hear_no_evil":{"id":"hear_no_evil","name":"Hear-No-Evil Monkey","keywords":["hear","no","evil","animal","nature"],"skins":[{"unified":"1f649","native":"🙉"}],"version":1},"speak_no_evil":{"id":"speak_no_evil","name":"Speak-No-Evil Monkey","keywords":["speak","no","evil","animal","nature","omg"],"skins":[{"unified":"1f64a","native":"🙊"}],"version":1},"love_letter":{"id":"love_letter","name":"Love Letter","keywords":["email","like","affection","envelope","valentines"],"skins":[{"unified":"1f48c","native":"💌"}],"version":1},"cupid":{"id":"cupid","name":"Heart with Arrow","keywords":["cupid","love","like","affection","valentines"],"skins":[{"unified":"1f498","native":"💘"}],"version":1},"gift_heart":{"id":"gift_heart","name":"Heart with Ribbon","keywords":["gift","love","valentines"],"skins":[{"unified":"1f49d","native":"💝"}],"version":1},"sparkling_heart":{"id":"sparkling_heart","name":"Sparkling Heart","keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f496","native":"💖"}],"version":1},"heartpulse":{"id":"heartpulse","name":"Growing Heart","keywords":["heartpulse","like","love","affection","valentines","pink"],"skins":[{"unified":"1f497","native":"💗"}],"version":1},"heartbeat":{"id":"heartbeat","name":"Beating Heart","keywords":["heartbeat","love","like","affection","valentines","pink"],"skins":[{"unified":"1f493","native":"💓"}],"version":1},"revolving_hearts":{"id":"revolving_hearts","name":"Revolving Hearts","keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f49e","native":"💞"}],"version":1},"two_hearts":{"id":"two_hearts","name":"Two Hearts","keywords":["love","like","affection","valentines","heart"],"skins":[{"unified":"1f495","native":"💕"}],"version":1},"heart_decoration":{"id":"heart_decoration","name":"Heart Decoration","keywords":["purple","square","love","like"],"skins":[{"unified":"1f49f","native":"💟"}],"version":1},"heavy_heart_exclamation_mark_ornament":{"id":"heavy_heart_exclamation_mark_ornament","name":"Heart Exclamation","keywords":["heavy","mark","ornament","decoration","love"],"skins":[{"unified":"2763-fe0f","native":"❣️"}],"version":1},"broken_heart":{"id":"broken_heart","name":"Broken Heart","emoticons":["3"],"keywords":["sad","sorry","break","heartbreak"],"skins":[{"unified":"1f494","native":"💔"}],"version":1},"heart":{"id":"heart","name":"Red Heart","emoticons":["<3"],"keywords":["love","like","valentines"],"skins":[{"unified":"2764-fe0f","native":"❤️"}],"version":1},"yellow_heart":{"id":"yellow_heart","name":"Yellow Heart","emoticons":["<3"],"keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f49b","native":"💛"}],"version":1},"green_heart":{"id":"green_heart","name":"Green Heart","emoticons":["<3"],"keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f49a","native":"💚"}],"version":1},"blue_heart":{"id":"blue_heart","name":"Blue Heart","emoticons":["<3"],"keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f499","native":"💙"}],"version":1},"purple_heart":{"id":"purple_heart","name":"Purple Heart","emoticons":["<3"],"keywords":["love","like","affection","valentines"],"skins":[{"unified":"1f49c","native":"💜"}],"version":1},"kiss":{"id":"kiss","name":"Kiss Mark","keywords":["face","lips","love","like","affection","valentines"],"skins":[{"unified":"1f48b","native":"💋"}],"version":1},"anger":{"id":"anger","name":"Anger Symbol","keywords":["angry","mad"],"skins":[{"unified":"1f4a2","native":"💢"}],"version":1},"boom":{"id":"boom","name":"Collision","keywords":["boom","bomb","explode","explosion","blown"],"skins":[{"unified":"1f4a5","native":"💥"}],"version":1},"dizzy":{"id":"dizzy","name":"Dizzy","keywords":["star","sparkle","shoot","magic"],"skins":[{"unified":"1f4ab","native":"💫"}],"version":1},"sweat_drops":{"id":"sweat_drops","name":"Sweat Droplets","keywords":["drops","water","drip","oops"],"skins":[{"unified":"1f4a6","native":"💦"}],"version":1},"dash":{"id":"dash","name":"Dash Symbol","keywords":["dashing","away","wind","air","fast","shoo","fart","smoke","puff"],"skins":[{"unified":"1f4a8","native":"💨"}],"version":1},"hole":{"id":"hole","name":"Hole","keywords":["embarrassing"],"skins":[{"unified":"1f573-fe0f","native":"🕳️"}],"version":1},"speech_balloon":{"id":"speech_balloon","name":"Speech Balloon","keywords":["bubble","words","message","talk","chatting"],"skins":[{"unified":"1f4ac","native":"💬"}],"version":1},"eye-in-speech-bubble":{"id":"eye-in-speech-bubble","name":"Eye in Speech Bubble","keywords":["in-speech-bubble","info"],"skins":[{"unified":"1f441-fe0f-200d-1f5e8-fe0f","native":"👁️🗨️"}],"version":2},"left_speech_bubble":{"id":"left_speech_bubble","name":"Left Speech Bubble","keywords":["words","message","talk","chatting"],"skins":[{"unified":"1f5e8-fe0f","native":"🗨️"}],"version":2},"right_anger_bubble":{"id":"right_anger_bubble","name":"Right Anger Bubble","keywords":["caption","speech","thinking","mad"],"skins":[{"unified":"1f5ef-fe0f","native":"🗯️"}],"version":1},"thought_balloon":{"id":"thought_balloon","name":"Thought Balloon","keywords":["bubble","cloud","speech","thinking","dream"],"skins":[{"unified":"1f4ad","native":"💭"}],"version":1},"zzz":{"id":"zzz","name":"Zzz","keywords":["sleepy","tired","dream"],"skins":[{"unified":"1f4a4","native":"💤"}],"version":1},"wave":{"id":"wave","name":"Waving Hand","keywords":["wave","hands","gesture","goodbye","solong","farewell","hello","hi","palm"],"skins":[{"unified":"1f44b","native":"👋"},{"unified":"1f44b-1f3fb","native":"👋🏻"},{"unified":"1f44b-1f3fc","native":"👋🏼"},{"unified":"1f44b-1f3fd","native":"👋🏽"},{"unified":"1f44b-1f3fe","native":"👋🏾"},{"unified":"1f44b-1f3ff","native":"👋🏿"}],"version":1},"raised_hand_with_fingers_splayed":{"id":"raised_hand_with_fingers_splayed","name":"Hand with Fingers Splayed","keywords":["raised","palm"],"skins":[{"unified":"1f590-fe0f","native":"🖐️"},{"unified":"1f590-1f3fb","native":"🖐🏻"},{"unified":"1f590-1f3fc","native":"🖐🏼"},{"unified":"1f590-1f3fd","native":"🖐🏽"},{"unified":"1f590-1f3fe","native":"🖐🏾"},{"unified":"1f590-1f3ff","native":"🖐🏿"}],"version":1},"hand":{"id":"hand","name":"Raised Hand","keywords":["fingers","stop","highfive","high","five","palm","ban"],"skins":[{"unified":"270b","native":"✋"},{"unified":"270b-1f3fb","native":"✋🏻"},{"unified":"270b-1f3fc","native":"✋🏼"},{"unified":"270b-1f3fd","native":"✋🏽"},{"unified":"270b-1f3fe","native":"✋🏾"},{"unified":"270b-1f3ff","native":"✋🏿"}],"version":1},"spock-hand":{"id":"spock-hand","name":"Vulcan Salute","keywords":["spock","hand","fingers","star","trek"],"skins":[{"unified":"1f596","native":"🖖"},{"unified":"1f596-1f3fb","native":"🖖🏻"},{"unified":"1f596-1f3fc","native":"🖖🏼"},{"unified":"1f596-1f3fd","native":"🖖🏽"},{"unified":"1f596-1f3fe","native":"🖖🏾"},{"unified":"1f596-1f3ff","native":"🖖🏿"}],"version":1},"ok_hand":{"id":"ok_hand","name":"Ok Hand","keywords":["fingers","limbs","perfect","okay"],"skins":[{"unified":"1f44c","native":"👌"},{"unified":"1f44c-1f3fb","native":"👌🏻"},{"unified":"1f44c-1f3fc","native":"👌🏼"},{"unified":"1f44c-1f3fd","native":"👌🏽"},{"unified":"1f44c-1f3fe","native":"👌🏾"},{"unified":"1f44c-1f3ff","native":"👌🏿"}],"version":1},"v":{"id":"v","name":"Victory Hand","keywords":["v","fingers","ohyeah","peace","two"],"skins":[{"unified":"270c-fe0f","native":"✌️"},{"unified":"270c-1f3fb","native":"✌🏻"},{"unified":"270c-1f3fc","native":"✌🏼"},{"unified":"270c-1f3fd","native":"✌🏽"},{"unified":"270c-1f3fe","native":"✌🏾"},{"unified":"270c-1f3ff","native":"✌🏿"}],"version":1},"the_horns":{"id":"the_horns","name":"Sign of the Horns","keywords":["hand","fingers","evil","eye","rock","on"],"skins":[{"unified":"1f918","native":"🤘"},{"unified":"1f918-1f3fb","native":"🤘🏻"},{"unified":"1f918-1f3fc","native":"🤘🏼"},{"unified":"1f918-1f3fd","native":"🤘🏽"},{"unified":"1f918-1f3fe","native":"🤘🏾"},{"unified":"1f918-1f3ff","native":"🤘🏿"}],"version":1},"point_left":{"id":"point_left","name":"Backhand Index Pointing Left","keywords":["point","direction","fingers","hand"],"skins":[{"unified":"1f448","native":"👈"},{"unified":"1f448-1f3fb","native":"👈🏻"},{"unified":"1f448-1f3fc","native":"👈🏼"},{"unified":"1f448-1f3fd","native":"👈🏽"},{"unified":"1f448-1f3fe","native":"👈🏾"},{"unified":"1f448-1f3ff","native":"👈🏿"}],"version":1},"point_right":{"id":"point_right","name":"Backhand Index Pointing Right","keywords":["point","fingers","hand","direction"],"skins":[{"unified":"1f449","native":"👉"},{"unified":"1f449-1f3fb","native":"👉🏻"},{"unified":"1f449-1f3fc","native":"👉🏼"},{"unified":"1f449-1f3fd","native":"👉🏽"},{"unified":"1f449-1f3fe","native":"👉🏾"},{"unified":"1f449-1f3ff","native":"👉🏿"}],"version":1},"point_up_2":{"id":"point_up_2","name":"Backhand Index Pointing Up","keywords":["point","2","fingers","hand","direction"],"skins":[{"unified":"1f446","native":"👆"},{"unified":"1f446-1f3fb","native":"👆🏻"},{"unified":"1f446-1f3fc","native":"👆🏼"},{"unified":"1f446-1f3fd","native":"👆🏽"},{"unified":"1f446-1f3fe","native":"👆🏾"},{"unified":"1f446-1f3ff","native":"👆🏿"}],"version":1},"middle_finger":{"id":"middle_finger","name":"Middle Finger","keywords":["reversed","hand","with","extended","fingers","rude","flipping"],"skins":[{"unified":"1f595","native":"🖕"},{"unified":"1f595-1f3fb","native":"🖕🏻"},{"unified":"1f595-1f3fc","native":"🖕🏼"},{"unified":"1f595-1f3fd","native":"🖕🏽"},{"unified":"1f595-1f3fe","native":"🖕🏾"},{"unified":"1f595-1f3ff","native":"🖕🏿"}],"version":1},"point_down":{"id":"point_down","name":"Backhand Index Pointing Down","keywords":["point","fingers","hand","direction"],"skins":[{"unified":"1f447","native":"👇"},{"unified":"1f447-1f3fb","native":"👇🏻"},{"unified":"1f447-1f3fc","native":"👇🏼"},{"unified":"1f447-1f3fd","native":"👇🏽"},{"unified":"1f447-1f3fe","native":"👇🏾"},{"unified":"1f447-1f3ff","native":"👇🏿"}],"version":1},"point_up":{"id":"point_up","name":"Index Pointing Up","keywords":["point","hand","fingers","direction"],"skins":[{"unified":"261d-fe0f","native":"☝️"},{"unified":"261d-1f3fb","native":"☝🏻"},{"unified":"261d-1f3fc","native":"☝🏼"},{"unified":"261d-1f3fd","native":"☝🏽"},{"unified":"261d-1f3fe","native":"☝🏾"},{"unified":"261d-1f3ff","native":"☝🏿"}],"version":1},"+1":{"id":"+1","name":"Thumbs Up","keywords":["+1","thumbsup","yes","awesome","good","agree","accept","cool","hand","like"],"skins":[{"unified":"1f44d","native":"👍"},{"unified":"1f44d-1f3fb","native":"👍🏻"},{"unified":"1f44d-1f3fc","native":"👍🏼"},{"unified":"1f44d-1f3fd","native":"👍🏽"},{"unified":"1f44d-1f3fe","native":"👍🏾"},{"unified":"1f44d-1f3ff","native":"👍🏿"}],"version":1},"-1":{"id":"-1","name":"Thumbs Down","keywords":["-1","thumbsdown","no","dislike","hand"],"skins":[{"unified":"1f44e","native":"👎"},{"unified":"1f44e-1f3fb","native":"👎🏻"},{"unified":"1f44e-1f3fc","native":"👎🏼"},{"unified":"1f44e-1f3fd","native":"👎🏽"},{"unified":"1f44e-1f3fe","native":"👎🏾"},{"unified":"1f44e-1f3ff","native":"👎🏿"}],"version":1},"fist":{"id":"fist","name":"Raised Fist","keywords":["fingers","hand","grasp"],"skins":[{"unified":"270a","native":"✊"},{"unified":"270a-1f3fb","native":"✊🏻"},{"unified":"270a-1f3fc","native":"✊🏼"},{"unified":"270a-1f3fd","native":"✊🏽"},{"unified":"270a-1f3fe","native":"✊🏾"},{"unified":"270a-1f3ff","native":"✊🏿"}],"version":1},"facepunch":{"id":"facepunch","name":"Oncoming Fist","keywords":["facepunch","punch","angry","violence","hit","attack","hand"],"skins":[{"unified":"1f44a","native":"👊"},{"unified":"1f44a-1f3fb","native":"👊🏻"},{"unified":"1f44a-1f3fc","native":"👊🏼"},{"unified":"1f44a-1f3fd","native":"👊🏽"},{"unified":"1f44a-1f3fe","native":"👊🏾"},{"unified":"1f44a-1f3ff","native":"👊🏿"}],"version":1},"clap":{"id":"clap","name":"Clapping Hands","keywords":["clap","praise","applause","congrats","yay"],"skins":[{"unified":"1f44f","native":"👏"},{"unified":"1f44f-1f3fb","native":"👏🏻"},{"unified":"1f44f-1f3fc","native":"👏🏼"},{"unified":"1f44f-1f3fd","native":"👏🏽"},{"unified":"1f44f-1f3fe","native":"👏🏾"},{"unified":"1f44f-1f3ff","native":"👏🏿"}],"version":1},"raised_hands":{"id":"raised_hands","name":"Raising Hands","keywords":["raised","gesture","hooray","yea","celebration"],"skins":[{"unified":"1f64c","native":"🙌"},{"unified":"1f64c-1f3fb","native":"🙌🏻"},{"unified":"1f64c-1f3fc","native":"🙌🏼"},{"unified":"1f64c-1f3fd","native":"🙌🏽"},{"unified":"1f64c-1f3fe","native":"🙌🏾"},{"unified":"1f64c-1f3ff","native":"🙌🏿"}],"version":1},"open_hands":{"id":"open_hands","name":"Open Hands","keywords":["fingers","butterfly"],"skins":[{"unified":"1f450","native":"👐"},{"unified":"1f450-1f3fb","native":"👐🏻"},{"unified":"1f450-1f3fc","native":"👐🏼"},{"unified":"1f450-1f3fd","native":"👐🏽"},{"unified":"1f450-1f3fe","native":"👐🏾"},{"unified":"1f450-1f3ff","native":"👐🏿"}],"version":1},"pray":{"id":"pray","name":"Folded Hands","keywords":["pray","please","hope","wish","namaste","highfive","high","five","thank","you","thanks","appreciate"],"skins":[{"unified":"1f64f","native":"🙏"},{"unified":"1f64f-1f3fb","native":"🙏🏻"},{"unified":"1f64f-1f3fc","native":"🙏🏼"},{"unified":"1f64f-1f3fd","native":"🙏🏽"},{"unified":"1f64f-1f3fe","native":"🙏🏾"},{"unified":"1f64f-1f3ff","native":"🙏🏿"}],"version":1},"writing_hand":{"id":"writing_hand","name":"Writing Hand","keywords":["lower","left","ballpoint","pen","stationery","write","compose"],"skins":[{"unified":"270d-fe0f","native":"✍️"},{"unified":"270d-1f3fb","native":"✍🏻"},{"unified":"270d-1f3fc","native":"✍🏼"},{"unified":"270d-1f3fd","native":"✍🏽"},{"unified":"270d-1f3fe","native":"✍🏾"},{"unified":"270d-1f3ff","native":"✍🏿"}],"version":1},"nail_care":{"id":"nail_care","name":"Nail Polish","keywords":["care","beauty","manicure","finger","fashion"],"skins":[{"unified":"1f485","native":"💅"},{"unified":"1f485-1f3fb","native":"💅🏻"},{"unified":"1f485-1f3fc","native":"💅🏼"},{"unified":"1f485-1f3fd","native":"💅🏽"},{"unified":"1f485-1f3fe","native":"💅🏾"},{"unified":"1f485-1f3ff","native":"💅🏿"}],"version":1},"muscle":{"id":"muscle","name":"Flexed Biceps","keywords":["muscle","arm","flex","hand","summer","strong"],"skins":[{"unified":"1f4aa","native":"💪"},{"unified":"1f4aa-1f3fb","native":"💪🏻"},{"unified":"1f4aa-1f3fc","native":"💪🏼"},{"unified":"1f4aa-1f3fd","native":"💪🏽"},{"unified":"1f4aa-1f3fe","native":"💪🏾"},{"unified":"1f4aa-1f3ff","native":"💪🏿"}],"version":1},"ear":{"id":"ear","name":"Ear","keywords":["face","hear","sound","listen"],"skins":[{"unified":"1f442","native":"👂"},{"unified":"1f442-1f3fb","native":"👂🏻"},{"unified":"1f442-1f3fc","native":"👂🏼"},{"unified":"1f442-1f3fd","native":"👂🏽"},{"unified":"1f442-1f3fe","native":"👂🏾"},{"unified":"1f442-1f3ff","native":"👂🏿"}],"version":1},"nose":{"id":"nose","name":"Nose","keywords":["smell","sniff"],"skins":[{"unified":"1f443","native":"👃"},{"unified":"1f443-1f3fb","native":"👃🏻"},{"unified":"1f443-1f3fc","native":"👃🏼"},{"unified":"1f443-1f3fd","native":"👃🏽"},{"unified":"1f443-1f3fe","native":"👃🏾"},{"unified":"1f443-1f3ff","native":"👃🏿"}],"version":1},"eyes":{"id":"eyes","name":"Eyes","keywords":["look","watch","stalk","peek","see"],"skins":[{"unified":"1f440","native":"👀"}],"version":1},"eye":{"id":"eye","name":"Eye","keywords":["face","look","see","watch","stare"],"skins":[{"unified":"1f441-fe0f","native":"👁️"}],"version":1},"tongue":{"id":"tongue","name":"Tongue","keywords":["mouth","playful"],"skins":[{"unified":"1f445","native":"👅"}],"version":1},"lips":{"id":"lips","name":"Mouth","keywords":["lips","kiss"],"skins":[{"unified":"1f444","native":"👄"}],"version":1},"baby":{"id":"baby","name":"Baby","keywords":["child","boy","girl","toddler"],"skins":[{"unified":"1f476","native":"👶"},{"unified":"1f476-1f3fb","native":"👶🏻"},{"unified":"1f476-1f3fc","native":"👶🏼"},{"unified":"1f476-1f3fd","native":"👶🏽"},{"unified":"1f476-1f3fe","native":"👶🏾"},{"unified":"1f476-1f3ff","native":"👶🏿"}],"version":1},"boy":{"id":"boy","name":"Boy","keywords":["man","male","guy","teenager"],"skins":[{"unified":"1f466","native":"👦"},{"unified":"1f466-1f3fb","native":"👦🏻"},{"unified":"1f466-1f3fc","native":"👦🏼"},{"unified":"1f466-1f3fd","native":"👦🏽"},{"unified":"1f466-1f3fe","native":"👦🏾"},{"unified":"1f466-1f3ff","native":"👦🏿"}],"version":1},"girl":{"id":"girl","name":"Girl","keywords":["female","woman","teenager"],"skins":[{"unified":"1f467","native":"👧"},{"unified":"1f467-1f3fb","native":"👧🏻"},{"unified":"1f467-1f3fc","native":"👧🏼"},{"unified":"1f467-1f3fd","native":"👧🏽"},{"unified":"1f467-1f3fe","native":"👧🏾"},{"unified":"1f467-1f3ff","native":"👧🏿"}],"version":1},"person_with_blond_hair":{"id":"person_with_blond_hair","name":"Person Blond Hair","keywords":["with","hairstyle"],"skins":[{"unified":"1f471","native":"👱"},{"unified":"1f471-1f3fb","native":"👱🏻"},{"unified":"1f471-1f3fc","native":"👱🏼"},{"unified":"1f471-1f3fd","native":"👱🏽"},{"unified":"1f471-1f3fe","native":"👱🏾"},{"unified":"1f471-1f3ff","native":"👱🏿"}],"version":1},"man":{"id":"man","name":"Man","keywords":["mustache","father","dad","guy","classy","sir","moustache"],"skins":[{"unified":"1f468","native":"👨"},{"unified":"1f468-1f3fb","native":"👨🏻"},{"unified":"1f468-1f3fc","native":"👨🏼"},{"unified":"1f468-1f3fd","native":"👨🏽"},{"unified":"1f468-1f3fe","native":"👨🏾"},{"unified":"1f468-1f3ff","native":"👨🏿"}],"version":1},"woman":{"id":"woman","name":"Woman","keywords":["female","girls","lady"],"skins":[{"unified":"1f469","native":"👩"},{"unified":"1f469-1f3fb","native":"👩🏻"},{"unified":"1f469-1f3fc","native":"👩🏼"},{"unified":"1f469-1f3fd","native":"👩🏽"},{"unified":"1f469-1f3fe","native":"👩🏾"},{"unified":"1f469-1f3ff","native":"👩🏿"}],"version":1},"older_man":{"id":"older_man","name":"Old Man","keywords":["older","human","male","men","elder","senior"],"skins":[{"unified":"1f474","native":"👴"},{"unified":"1f474-1f3fb","native":"👴🏻"},{"unified":"1f474-1f3fc","native":"👴🏼"},{"unified":"1f474-1f3fd","native":"👴🏽"},{"unified":"1f474-1f3fe","native":"👴🏾"},{"unified":"1f474-1f3ff","native":"👴🏿"}],"version":1},"older_woman":{"id":"older_woman","name":"Old Woman","keywords":["older","human","female","women","lady","elder","senior"],"skins":[{"unified":"1f475","native":"👵"},{"unified":"1f475-1f3fb","native":"👵🏻"},{"unified":"1f475-1f3fc","native":"👵🏼"},{"unified":"1f475-1f3fd","native":"👵🏽"},{"unified":"1f475-1f3fe","native":"👵🏾"},{"unified":"1f475-1f3ff","native":"👵🏿"}],"version":1},"person_frowning":{"id":"person_frowning","name":"Person Frowning","keywords":["worried"],"skins":[{"unified":"1f64d","native":"🙍"},{"unified":"1f64d-1f3fb","native":"🙍🏻"},{"unified":"1f64d-1f3fc","native":"🙍🏼"},{"unified":"1f64d-1f3fd","native":"🙍🏽"},{"unified":"1f64d-1f3fe","native":"🙍🏾"},{"unified":"1f64d-1f3ff","native":"🙍🏿"}],"version":1},"person_with_pouting_face":{"id":"person_with_pouting_face","name":"Person Pouting","keywords":["with","face","upset"],"skins":[{"unified":"1f64e","native":"🙎"},{"unified":"1f64e-1f3fb","native":"🙎🏻"},{"unified":"1f64e-1f3fc","native":"🙎🏼"},{"unified":"1f64e-1f3fd","native":"🙎🏽"},{"unified":"1f64e-1f3fe","native":"🙎🏾"},{"unified":"1f64e-1f3ff","native":"🙎🏿"}],"version":1},"no_good":{"id":"no_good","name":"Person Gesturing No","keywords":["good","decline"],"skins":[{"unified":"1f645","native":"🙅"},{"unified":"1f645-1f3fb","native":"🙅🏻"},{"unified":"1f645-1f3fc","native":"🙅🏼"},{"unified":"1f645-1f3fd","native":"🙅🏽"},{"unified":"1f645-1f3fe","native":"🙅🏾"},{"unified":"1f645-1f3ff","native":"🙅🏿"}],"version":1},"ok_woman":{"id":"ok_woman","name":"Person Gesturing Ok","keywords":["woman","agree"],"skins":[{"unified":"1f646","native":"🙆"},{"unified":"1f646-1f3fb","native":"🙆🏻"},{"unified":"1f646-1f3fc","native":"🙆🏼"},{"unified":"1f646-1f3fd","native":"🙆🏽"},{"unified":"1f646-1f3fe","native":"🙆🏾"},{"unified":"1f646-1f3ff","native":"🙆🏿"}],"version":1},"information_desk_person":{"id":"information_desk_person","name":"Person Tipping Hand","keywords":["information","desk"],"skins":[{"unified":"1f481","native":"💁"},{"unified":"1f481-1f3fb","native":"💁🏻"},{"unified":"1f481-1f3fc","native":"💁🏼"},{"unified":"1f481-1f3fd","native":"💁🏽"},{"unified":"1f481-1f3fe","native":"💁🏾"},{"unified":"1f481-1f3ff","native":"💁🏿"}],"version":1},"raising_hand":{"id":"raising_hand","name":"Person Raising Hand","keywords":["question"],"skins":[{"unified":"1f64b","native":"🙋"},{"unified":"1f64b-1f3fb","native":"🙋🏻"},{"unified":"1f64b-1f3fc","native":"🙋🏼"},{"unified":"1f64b-1f3fd","native":"🙋🏽"},{"unified":"1f64b-1f3fe","native":"🙋🏾"},{"unified":"1f64b-1f3ff","native":"🙋🏿"}],"version":1},"bow":{"id":"bow","name":"Person Bowing","keywords":["bow","respectiful"],"skins":[{"unified":"1f647","native":"🙇"},{"unified":"1f647-1f3fb","native":"🙇🏻"},{"unified":"1f647-1f3fc","native":"🙇🏼"},{"unified":"1f647-1f3fd","native":"🙇🏽"},{"unified":"1f647-1f3fe","native":"🙇🏾"},{"unified":"1f647-1f3ff","native":"🙇🏿"}],"version":1},"cop":{"id":"cop","name":"Police Officer","keywords":["cop"],"skins":[{"unified":"1f46e","native":"👮"},{"unified":"1f46e-1f3fb","native":"👮🏻"},{"unified":"1f46e-1f3fc","native":"👮🏼"},{"unified":"1f46e-1f3fd","native":"👮🏽"},{"unified":"1f46e-1f3fe","native":"👮🏾"},{"unified":"1f46e-1f3ff","native":"👮🏿"}],"version":1},"sleuth_or_spy":{"id":"sleuth_or_spy","name":"Detective","keywords":["sleuth","or","spy","human"],"skins":[{"unified":"1f575-fe0f","native":"🕵️"},{"unified":"1f575-1f3fb","native":"🕵🏻"},{"unified":"1f575-1f3fc","native":"🕵🏼"},{"unified":"1f575-1f3fd","native":"🕵🏽"},{"unified":"1f575-1f3fe","native":"🕵🏾"},{"unified":"1f575-1f3ff","native":"🕵🏿"}],"version":1},"guardsman":{"id":"guardsman","name":"Guard","keywords":["guardsman","protect"],"skins":[{"unified":"1f482","native":"💂"},{"unified":"1f482-1f3fb","native":"💂🏻"},{"unified":"1f482-1f3fc","native":"💂🏼"},{"unified":"1f482-1f3fd","native":"💂🏽"},{"unified":"1f482-1f3fe","native":"💂🏾"},{"unified":"1f482-1f3ff","native":"💂🏿"}],"version":1},"construction_worker":{"id":"construction_worker","name":"Construction Worker","keywords":["labor","build"],"skins":[{"unified":"1f477","native":"👷"},{"unified":"1f477-1f3fb","native":"👷🏻"},{"unified":"1f477-1f3fc","native":"👷🏼"},{"unified":"1f477-1f3fd","native":"👷🏽"},{"unified":"1f477-1f3fe","native":"👷🏾"},{"unified":"1f477-1f3ff","native":"👷🏿"}],"version":1},"princess":{"id":"princess","name":"Princess","keywords":["girl","woman","female","blond","crown","royal","queen"],"skins":[{"unified":"1f478","native":"👸"},{"unified":"1f478-1f3fb","native":"👸🏻"},{"unified":"1f478-1f3fc","native":"👸🏼"},{"unified":"1f478-1f3fd","native":"👸🏽"},{"unified":"1f478-1f3fe","native":"👸🏾"},{"unified":"1f478-1f3ff","native":"👸🏿"}],"version":1},"man_with_turban":{"id":"man_with_turban","name":"Man with Turban","keywords":["person","wearing","headdress"],"skins":[{"unified":"1f473","native":"👳"},{"unified":"1f473-1f3fb","native":"👳🏻"},{"unified":"1f473-1f3fc","native":"👳🏼"},{"unified":"1f473-1f3fd","native":"👳🏽"},{"unified":"1f473-1f3fe","native":"👳🏾"},{"unified":"1f473-1f3ff","native":"👳🏿"}],"version":1},"man_with_gua_pi_mao":{"id":"man_with_gua_pi_mao","name":"Man with Gua Pi Mao","keywords":["skullcap","male","boy","chinese"],"skins":[{"unified":"1f472","native":"👲"},{"unified":"1f472-1f3fb","native":"👲🏻"},{"unified":"1f472-1f3fc","native":"👲🏼"},{"unified":"1f472-1f3fd","native":"👲🏽"},{"unified":"1f472-1f3fe","native":"👲🏾"},{"unified":"1f472-1f3ff","native":"👲🏿"}],"version":1},"bride_with_veil":{"id":"bride_with_veil","name":"Bride with Veil","keywords":["couple","marriage","wedding","woman"],"skins":[{"unified":"1f470","native":"👰"},{"unified":"1f470-1f3fb","native":"👰🏻"},{"unified":"1f470-1f3fc","native":"👰🏼"},{"unified":"1f470-1f3fd","native":"👰🏽"},{"unified":"1f470-1f3fe","native":"👰🏾"},{"unified":"1f470-1f3ff","native":"👰🏿"}],"version":1},"angel":{"id":"angel","name":"Baby Angel","keywords":["heaven","wings","halo"],"skins":[{"unified":"1f47c","native":"👼"},{"unified":"1f47c-1f3fb","native":"👼🏻"},{"unified":"1f47c-1f3fc","native":"👼🏼"},{"unified":"1f47c-1f3fd","native":"👼🏽"},{"unified":"1f47c-1f3fe","native":"👼🏾"},{"unified":"1f47c-1f3ff","native":"👼🏿"}],"version":1},"santa":{"id":"santa","name":"Santa Claus","keywords":["festival","man","male","xmas","father","christmas"],"skins":[{"unified":"1f385","native":"🎅"},{"unified":"1f385-1f3fb","native":"🎅🏻"},{"unified":"1f385-1f3fc","native":"🎅🏼"},{"unified":"1f385-1f3fd","native":"🎅🏽"},{"unified":"1f385-1f3fe","native":"🎅🏾"},{"unified":"1f385-1f3ff","native":"🎅🏿"}],"version":1},"massage":{"id":"massage","name":"Face Massage","keywords":["person","getting","relax"],"skins":[{"unified":"1f486","native":"💆"},{"unified":"1f486-1f3fb","native":"💆🏻"},{"unified":"1f486-1f3fc","native":"💆🏼"},{"unified":"1f486-1f3fd","native":"💆🏽"},{"unified":"1f486-1f3fe","native":"💆🏾"},{"unified":"1f486-1f3ff","native":"💆🏿"}],"version":1},"haircut":{"id":"haircut","name":"Haircut","keywords":["person","getting","hairstyle"],"skins":[{"unified":"1f487","native":"💇"},{"unified":"1f487-1f3fb","native":"💇🏻"},{"unified":"1f487-1f3fc","native":"💇🏼"},{"unified":"1f487-1f3fd","native":"💇🏽"},{"unified":"1f487-1f3fe","native":"💇🏾"},{"unified":"1f487-1f3ff","native":"💇🏿"}],"version":1},"walking":{"id":"walking","name":"Pedestrian","keywords":["walking","person","move"],"skins":[{"unified":"1f6b6","native":"🚶"},{"unified":"1f6b6-1f3fb","native":"🚶🏻"},{"unified":"1f6b6-1f3fc","native":"🚶🏼"},{"unified":"1f6b6-1f3fd","native":"🚶🏽"},{"unified":"1f6b6-1f3fe","native":"🚶🏾"},{"unified":"1f6b6-1f3ff","native":"🚶🏿"}],"version":1},"runner":{"id":"runner","name":"Runner","keywords":["running","person","move"],"skins":[{"unified":"1f3c3","native":"🏃"},{"unified":"1f3c3-1f3fb","native":"🏃🏻"},{"unified":"1f3c3-1f3fc","native":"🏃🏼"},{"unified":"1f3c3-1f3fd","native":"🏃🏽"},{"unified":"1f3c3-1f3fe","native":"🏃🏾"},{"unified":"1f3c3-1f3ff","native":"🏃🏿"}],"version":1},"dancer":{"id":"dancer","name":"Dancer","keywords":["woman","dancing","female","girl","fun"],"skins":[{"unified":"1f483","native":"💃"},{"unified":"1f483-1f3fb","native":"💃🏻"},{"unified":"1f483-1f3fc","native":"💃🏼"},{"unified":"1f483-1f3fd","native":"💃🏽"},{"unified":"1f483-1f3fe","native":"💃🏾"},{"unified":"1f483-1f3ff","native":"💃🏿"}],"version":1},"man_in_business_suit_levitating":{"id":"man_in_business_suit_levitating","name":"Person in Suit Levitating","keywords":["man","business","levitate","hover","jump"],"skins":[{"unified":"1f574-fe0f","native":"🕴️"},{"unified":"1f574-1f3fb","native":"🕴🏻"},{"unified":"1f574-1f3fc","native":"🕴🏼"},{"unified":"1f574-1f3fd","native":"🕴🏽"},{"unified":"1f574-1f3fe","native":"🕴🏾"},{"unified":"1f574-1f3ff","native":"🕴🏿"}],"version":1},"dancers":{"id":"dancers","name":"Woman with Bunny Ears","keywords":["dancers","people","perform","costume"],"skins":[{"unified":"1f46f","native":"👯"}],"version":1},"horse_racing":{"id":"horse_racing","name":"Horse Racing","keywords":["animal","betting","competition","gambling","luck"],"skins":[{"unified":"1f3c7","native":"🏇"},{"unified":"1f3c7-1f3fb","native":"🏇🏻"},{"unified":"1f3c7-1f3fc","native":"🏇🏼"},{"unified":"1f3c7-1f3fd","native":"🏇🏽"},{"unified":"1f3c7-1f3fe","native":"🏇🏾"},{"unified":"1f3c7-1f3ff","native":"🏇🏿"}],"version":1},"skier":{"id":"skier","name":"Skier","keywords":["sports","winter","snow"],"skins":[{"unified":"26f7-fe0f","native":"⛷️"}],"version":1},"snowboarder":{"id":"snowboarder","name":"Snowboarder","keywords":["sports","winter"],"skins":[{"unified":"1f3c2","native":"🏂"},{"unified":"1f3c2-1f3fb","native":"🏂🏻"},{"unified":"1f3c2-1f3fc","native":"🏂🏼"},{"unified":"1f3c2-1f3fd","native":"🏂🏽"},{"unified":"1f3c2-1f3fe","native":"🏂🏾"},{"unified":"1f3c2-1f3ff","native":"🏂🏿"}],"version":1},"golfer":{"id":"golfer","name":"Person Golfing","keywords":["golfer","sports","business"],"skins":[{"unified":"1f3cc-fe0f","native":"🏌️"},{"unified":"1f3cc-1f3fb","native":"🏌🏻"},{"unified":"1f3cc-1f3fc","native":"🏌🏼"},{"unified":"1f3cc-1f3fd","native":"🏌🏽"},{"unified":"1f3cc-1f3fe","native":"🏌🏾"},{"unified":"1f3cc-1f3ff","native":"🏌🏿"}],"version":1},"surfer":{"id":"surfer","name":"Surfer","keywords":["person","surfing","sport","sea"],"skins":[{"unified":"1f3c4","native":"🏄"},{"unified":"1f3c4-1f3fb","native":"🏄🏻"},{"unified":"1f3c4-1f3fc","native":"🏄🏼"},{"unified":"1f3c4-1f3fd","native":"🏄🏽"},{"unified":"1f3c4-1f3fe","native":"🏄🏾"},{"unified":"1f3c4-1f3ff","native":"🏄🏿"}],"version":1},"rowboat":{"id":"rowboat","name":"Rowboat","keywords":["person","rowing","boat","sport","move"],"skins":[{"unified":"1f6a3","native":"🚣"},{"unified":"1f6a3-1f3fb","native":"🚣🏻"},{"unified":"1f6a3-1f3fc","native":"🚣🏼"},{"unified":"1f6a3-1f3fd","native":"🚣🏽"},{"unified":"1f6a3-1f3fe","native":"🚣🏾"},{"unified":"1f6a3-1f3ff","native":"🚣🏿"}],"version":1},"swimmer":{"id":"swimmer","name":"Swimmer","keywords":["person","swimming","sport","pool"],"skins":[{"unified":"1f3ca","native":"🏊"},{"unified":"1f3ca-1f3fb","native":"🏊🏻"},{"unified":"1f3ca-1f3fc","native":"🏊🏼"},{"unified":"1f3ca-1f3fd","native":"🏊🏽"},{"unified":"1f3ca-1f3fe","native":"🏊🏾"},{"unified":"1f3ca-1f3ff","native":"🏊🏿"}],"version":1},"person_with_ball":{"id":"person_with_ball","name":"Person Bouncing Ball","keywords":["with","sports","human"],"skins":[{"unified":"26f9-fe0f","native":"⛹️"},{"unified":"26f9-1f3fb","native":"⛹🏻"},{"unified":"26f9-1f3fc","native":"⛹🏼"},{"unified":"26f9-1f3fd","native":"⛹🏽"},{"unified":"26f9-1f3fe","native":"⛹🏾"},{"unified":"26f9-1f3ff","native":"⛹🏿"}],"version":1},"weight_lifter":{"id":"weight_lifter","name":"Person Lifting Weights","keywords":["weight","lifter","sports","training","exercise"],"skins":[{"unified":"1f3cb-fe0f","native":"🏋️"},{"unified":"1f3cb-1f3fb","native":"🏋🏻"},{"unified":"1f3cb-1f3fc","native":"🏋🏼"},{"unified":"1f3cb-1f3fd","native":"🏋🏽"},{"unified":"1f3cb-1f3fe","native":"🏋🏾"},{"unified":"1f3cb-1f3ff","native":"🏋🏿"}],"version":1},"bicyclist":{"id":"bicyclist","name":"Bicyclist","keywords":["person","biking","sport","move"],"skins":[{"unified":"1f6b4","native":"🚴"},{"unified":"1f6b4-1f3fb","native":"🚴🏻"},{"unified":"1f6b4-1f3fc","native":"🚴🏼"},{"unified":"1f6b4-1f3fd","native":"🚴🏽"},{"unified":"1f6b4-1f3fe","native":"🚴🏾"},{"unified":"1f6b4-1f3ff","native":"🚴🏿"}],"version":1},"mountain_bicyclist":{"id":"mountain_bicyclist","name":"Mountain Bicyclist","keywords":["person","biking","sport","move"],"skins":[{"unified":"1f6b5","native":"🚵"},{"unified":"1f6b5-1f3fb","native":"🚵🏻"},{"unified":"1f6b5-1f3fc","native":"🚵🏼"},{"unified":"1f6b5-1f3fd","native":"🚵🏽"},{"unified":"1f6b5-1f3fe","native":"🚵🏾"},{"unified":"1f6b5-1f3ff","native":"🚵🏿"}],"version":1},"bath":{"id":"bath","name":"Bath","keywords":["person","taking","clean","shower","bathroom"],"skins":[{"unified":"1f6c0","native":"🛀"},{"unified":"1f6c0-1f3fb","native":"🛀🏻"},{"unified":"1f6c0-1f3fc","native":"🛀🏼"},{"unified":"1f6c0-1f3fd","native":"🛀🏽"},{"unified":"1f6c0-1f3fe","native":"🛀🏾"},{"unified":"1f6c0-1f3ff","native":"🛀🏿"}],"version":1},"sleeping_accommodation":{"id":"sleeping_accommodation","name":"Person in Bed","keywords":["sleeping","accommodation","rest"],"skins":[{"unified":"1f6cc","native":"🛌"},{"unified":"1f6cc-1f3fb","native":"🛌🏻"},{"unified":"1f6cc-1f3fc","native":"🛌🏼"},{"unified":"1f6cc-1f3fd","native":"🛌🏽"},{"unified":"1f6cc-1f3fe","native":"🛌🏾"},{"unified":"1f6cc-1f3ff","native":"🛌🏿"}],"version":1},"two_women_holding_hands":{"id":"two_women_holding_hands","name":"Women Holding Hands","keywords":["two","pair","friendship","couple","love","like","female","people","human"],"skins":[{"unified":"1f46d","native":"👭"},{"unified":"1f46d-1f3fb","native":"👭🏻"},{"unified":"1f46d-1f3fc","native":"👭🏼"},{"unified":"1f46d-1f3fd","native":"👭🏽"},{"unified":"1f46d-1f3fe","native":"👭🏾"},{"unified":"1f46d-1f3ff","native":"👭🏿"}],"version":1},"man_and_woman_holding_hands":{"id":"man_and_woman_holding_hands","name":"Man and Woman Holding Hands","keywords":["couple","pair","people","human","love","date","dating","like","affection","valentines","marriage"],"skins":[{"unified":"1f46b","native":"👫"},{"unified":"1f46b-1f3fb","native":"👫🏻"},{"unified":"1f46b-1f3fc","native":"👫🏼"},{"unified":"1f46b-1f3fd","native":"👫🏽"},{"unified":"1f46b-1f3fe","native":"👫🏾"},{"unified":"1f46b-1f3ff","native":"👫🏿"}],"version":1},"two_men_holding_hands":{"id":"two_men_holding_hands","name":"Men Holding Hands","keywords":["two","pair","couple","love","like","bromance","friendship","people","human"],"skins":[{"unified":"1f46c","native":"👬"},{"unified":"1f46c-1f3fb","native":"👬🏻"},{"unified":"1f46c-1f3fc","native":"👬🏼"},{"unified":"1f46c-1f3fd","native":"👬🏽"},{"unified":"1f46c-1f3fe","native":"👬🏾"},{"unified":"1f46c-1f3ff","native":"👬🏿"}],"version":1},"couplekiss":{"id":"couplekiss","name":"Kiss","keywords":["couplekiss","pair","valentines","love","like","dating","marriage"],"skins":[{"unified":"1f48f","native":"💏"},{"unified":"1f48f-1f3fb","native":"💏🏻"},{"unified":"1f48f-1f3fc","native":"💏🏼"},{"unified":"1f48f-1f3fd","native":"💏🏽"},{"unified":"1f48f-1f3fe","native":"💏🏾"},{"unified":"1f48f-1f3ff","native":"💏🏿"}],"version":1},"woman-kiss-man":{"id":"woman-kiss-man","name":"Kiss: Woman, Man","keywords":["woman","kiss-man","kiss","love"],"skins":[{"unified":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468","native":"👩❤️💋👨"},{"unified":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","native":"👩🏻❤️💋👨🏻"},{"unified":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","native":"👩🏼❤️💋👨🏼"},{"unified":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","native":"👩🏽❤️💋👨🏽"},{"unified":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","native":"👩🏾❤️💋👨🏾"},{"unified":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","native":"👩🏿❤️💋👨🏿"}],"version":2},"man-kiss-man":{"id":"man-kiss-man","name":"Kiss: Man, Man","keywords":["kiss-man","kiss","pair","valentines","love","like","dating","marriage"],"skins":[{"unified":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468","native":"👨❤️💋👨"},{"unified":"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb","native":"👨🏻❤️💋👨🏻"},{"unified":"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc","native":"👨🏼❤️💋👨🏼"},{"unified":"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd","native":"👨🏽❤️💋👨🏽"},{"unified":"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe","native":"👨🏾❤️💋👨🏾"},{"unified":"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff","native":"👨🏿❤️💋👨🏿"}],"version":2},"woman-kiss-woman":{"id":"woman-kiss-woman","name":"Kiss: Woman, Woman","keywords":["kiss-woman","kiss","pair","valentines","love","like","dating","marriage"],"skins":[{"unified":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469","native":"👩❤️💋👩"},{"unified":"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb","native":"👩🏻❤️💋👩🏻"},{"unified":"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc","native":"👩🏼❤️💋👩🏼"},{"unified":"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd","native":"👩🏽❤️💋👩🏽"},{"unified":"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe","native":"👩🏾❤️💋👩🏾"},{"unified":"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff","native":"👩🏿❤️💋👩🏿"}],"version":2},"couple_with_heart":{"id":"couple_with_heart","name":"Couple with Heart","keywords":["pair","love","like","affection","human","dating","valentines","marriage"],"skins":[{"unified":"1f491","native":"💑"},{"unified":"1f491-1f3fb","native":"💑🏻"},{"unified":"1f491-1f3fc","native":"💑🏼"},{"unified":"1f491-1f3fd","native":"💑🏽"},{"unified":"1f491-1f3fe","native":"💑🏾"},{"unified":"1f491-1f3ff","native":"💑🏿"}],"version":1},"woman-heart-man":{"id":"woman-heart-man","name":"Couple with Heart: Woman, Man","keywords":["woman","heart-man","heart","love"],"skins":[{"unified":"1f469-200d-2764-fe0f-200d-1f468","native":"👩❤️👨"},{"unified":"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","native":"👩🏻❤️👨🏻"},{"unified":"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","native":"👩🏼❤️👨🏼"},{"unified":"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","native":"👩🏽❤️👨🏽"},{"unified":"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","native":"👩🏾❤️👨🏾"},{"unified":"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff","native":"👩🏿❤️👨🏿"}],"version":2},"man-heart-man":{"id":"man-heart-man","name":"Couple with Heart: Man, Man","keywords":["heart-man","heart","pair","love","like","affection","human","dating","valentines","marriage"],"skins":[{"unified":"1f468-200d-2764-fe0f-200d-1f468","native":"👨❤️👨"},{"unified":"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb","native":"👨🏻❤️👨🏻"},{"unified":"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc","native":"👨🏼❤️👨🏼"},{"unified":"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd","native":"👨🏽❤️👨🏽"},{"unified":"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe","native":"👨🏾❤️👨🏾"},{"unified":"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff","native":"👨🏿❤️👨🏿"}],"version":2},"woman-heart-woman":{"id":"woman-heart-woman","name":"Couple with Heart: Woman, Woman","keywords":["heart-woman","heart","pair","love","like","affection","human","dating","valentines","marriage"],"skins":[{"unified":"1f469-200d-2764-fe0f-200d-1f469","native":"👩❤️👩"},{"unified":"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb","native":"👩🏻❤️👩🏻"},{"unified":"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc","native":"👩🏼❤️👩🏼"},{"unified":"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd","native":"👩🏽❤️👩🏽"},{"unified":"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe","native":"👩🏾❤️👩🏾"},{"unified":"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff","native":"👩🏿❤️👩🏿"}],"version":2},"family":{"id":"family","name":"Family","keywords":["home","parents","child","mom","dad","father","mother","people","human"],"skins":[{"unified":"1f46a","native":"👪"}],"version":1},"man-woman-boy":{"id":"man-woman-boy","name":"Family: Man, Woman, Boy","keywords":["man","woman-boy","family","woman","love"],"skins":[{"unified":"1f468-200d-1f469-200d-1f466","native":"👨👩👦"}],"version":2},"man-woman-girl":{"id":"man-woman-girl","name":"Family: Man, Woman, Girl","keywords":["man","woman-girl","family","woman","home","parents","people","human","child"],"skins":[{"unified":"1f468-200d-1f469-200d-1f467","native":"👨👩👧"}],"version":2},"man-woman-girl-boy":{"id":"man-woman-girl-boy","name":"Family: Man, Woman, Girl, Boy","keywords":["man","woman-girl-boy","family","woman","girl","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f469-200d-1f467-200d-1f466","native":"👨👩👧👦"}],"version":2},"man-woman-boy-boy":{"id":"man-woman-boy-boy","name":"Family: Man, Woman, Boy, Boy","keywords":["man","woman-boy-boy","family","woman","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f469-200d-1f466-200d-1f466","native":"👨👩👦👦"}],"version":2},"man-woman-girl-girl":{"id":"man-woman-girl-girl","name":"Family: Man, Woman, Girl, Girl","keywords":["man","woman-girl-girl","family","woman","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f469-200d-1f467-200d-1f467","native":"👨👩👧👧"}],"version":2},"man-man-boy":{"id":"man-man-boy","name":"Family: Man, Man, Boy","keywords":["man","man-boy","family","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f468-200d-1f466","native":"👨👨👦"}],"version":2},"man-man-girl":{"id":"man-man-girl","name":"Family: Man, Man, Girl","keywords":["man","man-girl","family","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f468-200d-1f467","native":"👨👨👧"}],"version":2},"man-man-girl-boy":{"id":"man-man-girl-boy","name":"Family: Man, Man, Girl, Boy","keywords":["man","man-girl-boy","family","girl","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f468-200d-1f467-200d-1f466","native":"👨👨👧👦"}],"version":2},"man-man-boy-boy":{"id":"man-man-boy-boy","name":"Family: Man, Man, Boy, Boy","keywords":["man","man-boy-boy","family","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f468-200d-1f466-200d-1f466","native":"👨👨👦👦"}],"version":2},"man-man-girl-girl":{"id":"man-man-girl-girl","name":"Family: Man, Man, Girl, Girl","keywords":["man","man-girl-girl","family","home","parents","people","human","children"],"skins":[{"unified":"1f468-200d-1f468-200d-1f467-200d-1f467","native":"👨👨👧👧"}],"version":2},"woman-woman-boy":{"id":"woman-woman-boy","name":"Family: Woman, Woman, Boy","keywords":["woman","woman-boy","family","home","parents","people","human","children"],"skins":[{"unified":"1f469-200d-1f469-200d-1f466","native":"👩👩👦"}],"version":2},"woman-woman-girl":{"id":"woman-woman-girl","name":"Family: Woman, Woman, Girl","keywords":["woman","woman-girl","family","home","parents","people","human","children"],"skins":[{"unified":"1f469-200d-1f469-200d-1f467","native":"👩👩👧"}],"version":2},"woman-woman-girl-boy":{"id":"woman-woman-girl-boy","name":"Family: Woman, Woman, Girl, Boy","keywords":["woman","woman-girl-boy","family","girl","home","parents","people","human","children"],"skins":[{"unified":"1f469-200d-1f469-200d-1f467-200d-1f466","native":"👩👩👧👦"}],"version":2},"woman-woman-boy-boy":{"id":"woman-woman-boy-boy","name":"Family: Woman, Woman, Boy, Boy","keywords":["woman","woman-boy-boy","family","home","parents","people","human","children"],"skins":[{"unified":"1f469-200d-1f469-200d-1f466-200d-1f466","native":"👩👩👦👦"}],"version":2},"woman-woman-girl-girl":{"id":"woman-woman-girl-girl","name":"Family: Woman, Woman, Girl, Girl","keywords":["woman","woman-girl-girl","family","home","parents","people","human","children"],"skins":[{"unified":"1f469-200d-1f469-200d-1f467-200d-1f467","native":"👩👩👧👧"}],"version":2},"speaking_head_in_silhouette":{"id":"speaking_head_in_silhouette","name":"Speaking Head","keywords":["in","silhouette","user","person","human","sing","say","talk"],"skins":[{"unified":"1f5e3-fe0f","native":"🗣️"}],"version":1},"bust_in_silhouette":{"id":"bust_in_silhouette","name":"Bust in Silhouette","keywords":["user","person","human"],"skins":[{"unified":"1f464","native":"👤"}],"version":1},"busts_in_silhouette":{"id":"busts_in_silhouette","name":"Busts in Silhouette","keywords":["user","person","human","group","team"],"skins":[{"unified":"1f465","native":"👥"}],"version":1},"footprints":{"id":"footprints","name":"Footprints","keywords":["feet","tracking","walking","beach"],"skins":[{"unified":"1f463","native":"👣"}],"version":1},"monkey_face":{"id":"monkey_face","name":"Monkey Face","emoticons":[":o)"],"keywords":["animal","nature","circus"],"skins":[{"unified":"1f435","native":"🐵"}],"version":1},"monkey":{"id":"monkey","name":"Monkey","keywords":["animal","nature","banana","circus"],"skins":[{"unified":"1f412","native":"🐒"}],"version":1},"dog":{"id":"dog","name":"Dog Face","keywords":["animal","friend","nature","woof","puppy","pet","faithful"],"skins":[{"unified":"1f436","native":"🐶"}],"version":1},"dog2":{"id":"dog2","name":"Dog","keywords":["dog2","animal","nature","friend","doge","pet","faithful"],"skins":[{"unified":"1f415","native":"🐕"}],"version":1},"poodle":{"id":"poodle","name":"Poodle","keywords":["dog","animal","101","nature","pet"],"skins":[{"unified":"1f429","native":"🐩"}],"version":1},"wolf":{"id":"wolf","name":"Wolf","keywords":["animal","nature","wild"],"skins":[{"unified":"1f43a","native":"🐺"}],"version":1},"cat":{"id":"cat","name":"Cat Face","keywords":["animal","meow","nature","pet","kitten"],"skins":[{"unified":"1f431","native":"🐱"}],"version":1},"cat2":{"id":"cat2","name":"Cat","keywords":["cat2","animal","meow","pet","cats"],"skins":[{"unified":"1f408","native":"🐈"}],"version":1},"lion_face":{"id":"lion_face","name":"Lion","keywords":["face","animal","nature"],"skins":[{"unified":"1f981","native":"🦁"}],"version":1},"tiger":{"id":"tiger","name":"Tiger Face","keywords":["animal","cat","danger","wild","nature","roar"],"skins":[{"unified":"1f42f","native":"🐯"}],"version":1},"tiger2":{"id":"tiger2","name":"Tiger","keywords":["tiger2","animal","nature","roar"],"skins":[{"unified":"1f405","native":"🐅"}],"version":1},"leopard":{"id":"leopard","name":"Leopard","keywords":["animal","nature"],"skins":[{"unified":"1f406","native":"🐆"}],"version":1},"horse":{"id":"horse","name":"Horse Face","keywords":["animal","brown","nature"],"skins":[{"unified":"1f434","native":"🐴"}],"version":1},"racehorse":{"id":"racehorse","name":"Horse","keywords":["racehorse","animal","gamble","luck"],"skins":[{"unified":"1f40e","native":"🐎"}],"version":1},"unicorn_face":{"id":"unicorn_face","name":"Unicorn","keywords":["face","animal","nature","mystical"],"skins":[{"unified":"1f984","native":"🦄"}],"version":1},"cow":{"id":"cow","name":"Cow Face","keywords":["beef","ox","animal","nature","moo","milk"],"skins":[{"unified":"1f42e","native":"🐮"}],"version":1},"ox":{"id":"ox","name":"Ox","keywords":["animal","cow","beef"],"skins":[{"unified":"1f402","native":"🐂"}],"version":1},"water_buffalo":{"id":"water_buffalo","name":"Water Buffalo","keywords":["animal","nature","ox","cow"],"skins":[{"unified":"1f403","native":"🐃"}],"version":1},"cow2":{"id":"cow2","name":"Cow","keywords":["cow2","beef","ox","animal","nature","moo","milk"],"skins":[{"unified":"1f404","native":"🐄"}],"version":1},"pig":{"id":"pig","name":"Pig Face","keywords":["animal","oink","nature"],"skins":[{"unified":"1f437","native":"🐷"}],"version":1},"pig2":{"id":"pig2","name":"Pig","keywords":["pig2","animal","nature"],"skins":[{"unified":"1f416","native":"🐖"}],"version":1},"boar":{"id":"boar","name":"Boar","keywords":["animal","nature"],"skins":[{"unified":"1f417","native":"🐗"}],"version":1},"pig_nose":{"id":"pig_nose","name":"Pig Nose","keywords":["animal","oink"],"skins":[{"unified":"1f43d","native":"🐽"}],"version":1},"ram":{"id":"ram","name":"Ram","keywords":["animal","sheep","nature"],"skins":[{"unified":"1f40f","native":"🐏"}],"version":1},"sheep":{"id":"sheep","name":"Ewe","keywords":["sheep","animal","nature","wool","shipit"],"skins":[{"unified":"1f411","native":"🐑"}],"version":1},"goat":{"id":"goat","name":"Goat","keywords":["animal","nature"],"skins":[{"unified":"1f410","native":"🐐"}],"version":1},"dromedary_camel":{"id":"dromedary_camel","name":"Camel","keywords":["dromedary","animal","hot","desert","hump"],"skins":[{"unified":"1f42a","native":"🐪"}],"version":1},"camel":{"id":"camel","name":"Bactrian Camel","keywords":["two","hump","animal","nature","hot","desert"],"skins":[{"unified":"1f42b","native":"🐫"}],"version":1},"elephant":{"id":"elephant","name":"Elephant","keywords":["animal","nature","nose","th","circus"],"skins":[{"unified":"1f418","native":"🐘"}],"version":1},"mouse":{"id":"mouse","name":"Mouse Face","keywords":["animal","nature","cheese","wedge","rodent"],"skins":[{"unified":"1f42d","native":"🐭"}],"version":1},"mouse2":{"id":"mouse2","name":"Mouse","keywords":["mouse2","animal","nature","rodent"],"skins":[{"unified":"1f401","native":"🐁"}],"version":1},"rat":{"id":"rat","name":"Rat","keywords":["animal","mouse","rodent"],"skins":[{"unified":"1f400","native":"🐀"}],"version":1},"hamster":{"id":"hamster","name":"Hamster","keywords":["animal","nature"],"skins":[{"unified":"1f439","native":"🐹"}],"version":1},"rabbit":{"id":"rabbit","name":"Rabbit Face","keywords":["animal","nature","pet","spring","magic","bunny"],"skins":[{"unified":"1f430","native":"🐰"}],"version":1},"rabbit2":{"id":"rabbit2","name":"Rabbit","keywords":["rabbit2","animal","nature","pet","magic","spring"],"skins":[{"unified":"1f407","native":"🐇"}],"version":1},"chipmunk":{"id":"chipmunk","name":"Chipmunk","keywords":["animal","nature","rodent","squirrel"],"skins":[{"unified":"1f43f-fe0f","native":"🐿️"}],"version":1},"bear":{"id":"bear","name":"Bear","keywords":["animal","nature","wild"],"skins":[{"unified":"1f43b","native":"🐻"}],"version":1},"koala":{"id":"koala","name":"Koala","keywords":["animal","nature"],"skins":[{"unified":"1f428","native":"🐨"}],"version":1},"panda_face":{"id":"panda_face","name":"Panda","keywords":["face","animal","nature"],"skins":[{"unified":"1f43c","native":"🐼"}],"version":1},"feet":{"id":"feet","name":"Paw Prints","keywords":["feet","animal","tracking","footprints","dog","cat","pet"],"skins":[{"unified":"1f43e","native":"🐾"}],"version":1},"turkey":{"id":"turkey","name":"Turkey","keywords":["animal","bird"],"skins":[{"unified":"1f983","native":"🦃"}],"version":1},"chicken":{"id":"chicken","name":"Chicken","keywords":["animal","cluck","nature","bird"],"skins":[{"unified":"1f414","native":"🐔"}],"version":1},"rooster":{"id":"rooster","name":"Rooster","keywords":["animal","nature","chicken"],"skins":[{"unified":"1f413","native":"🐓"}],"version":1},"hatching_chick":{"id":"hatching_chick","name":"Hatching Chick","keywords":["animal","chicken","egg","born","baby","bird"],"skins":[{"unified":"1f423","native":"🐣"}],"version":1},"baby_chick":{"id":"baby_chick","name":"Baby Chick","keywords":["animal","chicken","bird"],"skins":[{"unified":"1f424","native":"🐤"}],"version":1},"hatched_chick":{"id":"hatched_chick","name":"Front-Facing Baby Chick","keywords":["hatched","front","facing","animal","chicken","bird"],"skins":[{"unified":"1f425","native":"🐥"}],"version":1},"bird":{"id":"bird","name":"Bird","keywords":["animal","nature","fly","tweet","spring"],"skins":[{"unified":"1f426","native":"🐦"}],"version":1},"penguin":{"id":"penguin","name":"Penguin","keywords":["animal","nature"],"skins":[{"unified":"1f427","native":"🐧"}],"version":1},"dove_of_peace":{"id":"dove_of_peace","name":"Dove","keywords":["of","peace","animal","bird"],"skins":[{"unified":"1f54a-fe0f","native":"🕊️"}],"version":1},"frog":{"id":"frog","name":"Frog","keywords":["animal","nature","croak","toad"],"skins":[{"unified":"1f438","native":"🐸"}],"version":1},"crocodile":{"id":"crocodile","name":"Crocodile","keywords":["animal","nature","reptile","lizard","alligator"],"skins":[{"unified":"1f40a","native":"🐊"}],"version":1},"turtle":{"id":"turtle","name":"Turtle","keywords":["animal","slow","nature","tortoise"],"skins":[{"unified":"1f422","native":"🐢"}],"version":1},"snake":{"id":"snake","name":"Snake","keywords":["animal","evil","nature","hiss","python"],"skins":[{"unified":"1f40d","native":"🐍"}],"version":1},"dragon_face":{"id":"dragon_face","name":"Dragon Face","keywords":["animal","myth","nature","chinese","green"],"skins":[{"unified":"1f432","native":"🐲"}],"version":1},"dragon":{"id":"dragon","name":"Dragon","keywords":["animal","myth","nature","chinese","green"],"skins":[{"unified":"1f409","native":"🐉"}],"version":1},"whale":{"id":"whale","name":"Spouting Whale","keywords":["animal","nature","sea","ocean"],"skins":[{"unified":"1f433","native":"🐳"}],"version":1},"whale2":{"id":"whale2","name":"Whale","keywords":["whale2","animal","nature","sea","ocean"],"skins":[{"unified":"1f40b","native":"🐋"}],"version":1},"dolphin":{"id":"dolphin","name":"Dolphin","keywords":["flipper","animal","nature","fish","sea","ocean","fins","beach"],"skins":[{"unified":"1f42c","native":"🐬"}],"version":1},"fish":{"id":"fish","name":"Fish","keywords":["animal","food","nature"],"skins":[{"unified":"1f41f","native":"🐟"}],"version":1},"tropical_fish":{"id":"tropical_fish","name":"Tropical Fish","keywords":["animal","swim","ocean","beach","nemo"],"skins":[{"unified":"1f420","native":"🐠"}],"version":1},"blowfish":{"id":"blowfish","name":"Blowfish","keywords":["animal","nature","food","sea","ocean"],"skins":[{"unified":"1f421","native":"🐡"}],"version":1},"octopus":{"id":"octopus","name":"Octopus","keywords":["animal","creature","ocean","sea","nature","beach"],"skins":[{"unified":"1f419","native":"🐙"}],"version":1},"shell":{"id":"shell","name":"Spiral Shell","keywords":["nature","sea","beach"],"skins":[{"unified":"1f41a","native":"🐚"}],"version":1},"snail":{"id":"snail","name":"Snail","keywords":["slow","animal","shell"],"skins":[{"unified":"1f40c","native":"🐌"}],"version":1},"bug":{"id":"bug","name":"Bug","keywords":["animal","insect","nature","worm"],"skins":[{"unified":"1f41b","native":"🐛"}],"version":1},"ant":{"id":"ant","name":"Ant","keywords":["animal","insect","nature","bug"],"skins":[{"unified":"1f41c","native":"🐜"}],"version":1},"bee":{"id":"bee","name":"Honeybee","keywords":["bee","animal","insect","nature","bug","spring","honey"],"skins":[{"unified":"1f41d","native":"🐝"}],"version":1},"ladybug":{"id":"ladybug","name":"Lady Beetle","keywords":["ladybug","animal","insect","nature"],"skins":[{"unified":"1f41e","native":"🐞"}],"version":1},"spider":{"id":"spider","name":"Spider","keywords":["animal","arachnid"],"skins":[{"unified":"1f577-fe0f","native":"🕷️"}],"version":1},"spider_web":{"id":"spider_web","name":"Spider Web","keywords":["animal","insect","arachnid","silk"],"skins":[{"unified":"1f578-fe0f","native":"🕸️"}],"version":1},"scorpion":{"id":"scorpion","name":"Scorpion","keywords":["animal","arachnid"],"skins":[{"unified":"1f982","native":"🦂"}],"version":1},"bouquet":{"id":"bouquet","name":"Bouquet","keywords":["flowers","nature","spring"],"skins":[{"unified":"1f490","native":"💐"}],"version":1},"cherry_blossom":{"id":"cherry_blossom","name":"Cherry Blossom","keywords":["nature","plant","spring","flower"],"skins":[{"unified":"1f338","native":"🌸"}],"version":1},"white_flower":{"id":"white_flower","name":"White Flower","keywords":["japanese","spring"],"skins":[{"unified":"1f4ae","native":"💮"}],"version":1},"rosette":{"id":"rosette","name":"Rosette","keywords":["flower","decoration","military"],"skins":[{"unified":"1f3f5-fe0f","native":"🏵️"}],"version":1},"rose":{"id":"rose","name":"Rose","keywords":["flowers","valentines","love","spring"],"skins":[{"unified":"1f339","native":"🌹"}],"version":1},"hibiscus":{"id":"hibiscus","name":"Hibiscus","keywords":["plant","vegetable","flowers","beach"],"skins":[{"unified":"1f33a","native":"🌺"}],"version":1},"sunflower":{"id":"sunflower","name":"Sunflower","keywords":["nature","plant","fall"],"skins":[{"unified":"1f33b","native":"🌻"}],"version":1},"blossom":{"id":"blossom","name":"Blossom","keywords":["nature","flowers","yellow"],"skins":[{"unified":"1f33c","native":"🌼"}],"version":1},"tulip":{"id":"tulip","name":"Tulip","keywords":["flowers","plant","nature","summer","spring"],"skins":[{"unified":"1f337","native":"🌷"}],"version":1},"seedling":{"id":"seedling","name":"Seedling","keywords":["plant","nature","grass","lawn","spring"],"skins":[{"unified":"1f331","native":"🌱"}],"version":1},"evergreen_tree":{"id":"evergreen_tree","name":"Evergreen Tree","keywords":["plant","nature"],"skins":[{"unified":"1f332","native":"🌲"}],"version":1},"deciduous_tree":{"id":"deciduous_tree","name":"Deciduous Tree","keywords":["plant","nature"],"skins":[{"unified":"1f333","native":"🌳"}],"version":1},"palm_tree":{"id":"palm_tree","name":"Palm Tree","keywords":["plant","vegetable","nature","summer","beach","mojito","tropical"],"skins":[{"unified":"1f334","native":"🌴"}],"version":1},"cactus":{"id":"cactus","name":"Cactus","keywords":["vegetable","plant","nature"],"skins":[{"unified":"1f335","native":"🌵"}],"version":1},"ear_of_rice":{"id":"ear_of_rice","name":"Ear of Rice","keywords":["sheaf","nature","plant"],"skins":[{"unified":"1f33e","native":"🌾"}],"version":1},"herb":{"id":"herb","name":"Herb","keywords":["vegetable","plant","medicine","weed","grass","lawn"],"skins":[{"unified":"1f33f","native":"🌿"}],"version":1},"shamrock":{"id":"shamrock","name":"Shamrock","keywords":["vegetable","plant","nature","irish","clover"],"skins":[{"unified":"2618-fe0f","native":"☘️"}],"version":1},"four_leaf_clover":{"id":"four_leaf_clover","name":"Four Leaf Clover","keywords":["vegetable","plant","nature","lucky","irish"],"skins":[{"unified":"1f340","native":"🍀"}],"version":1},"maple_leaf":{"id":"maple_leaf","name":"Maple Leaf","keywords":["nature","plant","vegetable","ca","fall"],"skins":[{"unified":"1f341","native":"🍁"}],"version":1},"fallen_leaf":{"id":"fallen_leaf","name":"Fallen Leaf","keywords":["nature","plant","vegetable","leaves"],"skins":[{"unified":"1f342","native":"🍂"}],"version":1},"leaves":{"id":"leaves","name":"Leaf Fluttering in Wind","keywords":["leaves","nature","plant","tree","vegetable","grass","lawn","spring"],"skins":[{"unified":"1f343","native":"🍃"}],"version":1},"mushroom":{"id":"mushroom","name":"Mushroom","keywords":["plant","vegetable"],"skins":[{"unified":"1f344","native":"🍄"}],"version":1},"grapes":{"id":"grapes","name":"Grapes","keywords":["fruit","food","wine"],"skins":[{"unified":"1f347","native":"🍇"}],"version":1},"melon":{"id":"melon","name":"Melon","keywords":["fruit","nature","food"],"skins":[{"unified":"1f348","native":"🍈"}],"version":1},"watermelon":{"id":"watermelon","name":"Watermelon","keywords":["fruit","food","picnic","summer"],"skins":[{"unified":"1f349","native":"🍉"}],"version":1},"tangerine":{"id":"tangerine","name":"Tangerine","keywords":["food","fruit","nature","orange"],"skins":[{"unified":"1f34a","native":"🍊"}],"version":1},"lemon":{"id":"lemon","name":"Lemon","keywords":["fruit","nature"],"skins":[{"unified":"1f34b","native":"🍋"}],"version":1},"banana":{"id":"banana","name":"Banana","keywords":["fruit","food","monkey"],"skins":[{"unified":"1f34c","native":"🍌"}],"version":1},"pineapple":{"id":"pineapple","name":"Pineapple","keywords":["fruit","nature","food"],"skins":[{"unified":"1f34d","native":"🍍"}],"version":1},"apple":{"id":"apple","name":"Red Apple","keywords":["fruit","mac","school"],"skins":[{"unified":"1f34e","native":"🍎"}],"version":1},"green_apple":{"id":"green_apple","name":"Green Apple","keywords":["fruit","nature"],"skins":[{"unified":"1f34f","native":"🍏"}],"version":1},"pear":{"id":"pear","name":"Pear","keywords":["fruit","nature","food"],"skins":[{"unified":"1f350","native":"🍐"}],"version":1},"peach":{"id":"peach","name":"Peach","keywords":["fruit","nature","food"],"skins":[{"unified":"1f351","native":"🍑"}],"version":1},"cherries":{"id":"cherries","name":"Cherries","keywords":["food","fruit"],"skins":[{"unified":"1f352","native":"🍒"}],"version":1},"strawberry":{"id":"strawberry","name":"Strawberry","keywords":["fruit","food","nature"],"skins":[{"unified":"1f353","native":"🍓"}],"version":1},"tomato":{"id":"tomato","name":"Tomato","keywords":["fruit","vegetable","nature","food"],"skins":[{"unified":"1f345","native":"🍅"}],"version":1},"eggplant":{"id":"eggplant","name":"Eggplant","keywords":["vegetable","nature","food","aubergine"],"skins":[{"unified":"1f346","native":"🍆"}],"version":1},"corn":{"id":"corn","name":"Ear of Corn","keywords":["food","vegetable","plant"],"skins":[{"unified":"1f33d","native":"🌽"}],"version":1},"hot_pepper":{"id":"hot_pepper","name":"Hot Pepper","keywords":["food","spicy","chilli","chili"],"skins":[{"unified":"1f336-fe0f","native":"🌶️"}],"version":1},"chestnut":{"id":"chestnut","name":"Chestnut","keywords":["food","squirrel"],"skins":[{"unified":"1f330","native":"🌰"}],"version":1},"bread":{"id":"bread","name":"Bread","keywords":["food","wheat","breakfast","toast"],"skins":[{"unified":"1f35e","native":"🍞"}],"version":1},"cheese_wedge":{"id":"cheese_wedge","name":"Cheese Wedge","keywords":["food","chadder","swiss"],"skins":[{"unified":"1f9c0","native":"🧀"}],"version":1},"meat_on_bone":{"id":"meat_on_bone","name":"Meat on Bone","keywords":["good","food","drumstick"],"skins":[{"unified":"1f356","native":"🍖"}],"version":1},"poultry_leg":{"id":"poultry_leg","name":"Poultry Leg","keywords":["food","meat","drumstick","bird","chicken","turkey"],"skins":[{"unified":"1f357","native":"🍗"}],"version":1},"hamburger":{"id":"hamburger","name":"Hamburger","keywords":["meat","fast","food","beef","cheeseburger","mcdonalds","burger","king"],"skins":[{"unified":"1f354","native":"🍔"}],"version":1},"fries":{"id":"fries","name":"French Fries","keywords":["chips","snack","fast","food","potato"],"skins":[{"unified":"1f35f","native":"🍟"}],"version":1},"pizza":{"id":"pizza","name":"Pizza","keywords":["food","party","italy"],"skins":[{"unified":"1f355","native":"🍕"}],"version":1},"hotdog":{"id":"hotdog","name":"Hot Dog","keywords":["hotdog","food","frankfurter","america"],"skins":[{"unified":"1f32d","native":"🌭"}],"version":1},"taco":{"id":"taco","name":"Taco","keywords":["food","mexican"],"skins":[{"unified":"1f32e","native":"🌮"}],"version":1},"burrito":{"id":"burrito","name":"Burrito","keywords":["food","mexican"],"skins":[{"unified":"1f32f","native":"🌯"}],"version":1},"fried_egg":{"id":"fried_egg","name":"Cooking","keywords":["fried","egg","food","breakfast","kitchen","skillet"],"skins":[{"unified":"1f373","native":"🍳"}],"version":1},"stew":{"id":"stew","name":"Pot of Food","keywords":["stew","meat","soup","hot"],"skins":[{"unified":"1f372","native":"🍲"}],"version":1},"popcorn":{"id":"popcorn","name":"Popcorn","keywords":["food","movie","theater","films","snack","drama"],"skins":[{"unified":"1f37f","native":"🍿"}],"version":1},"bento":{"id":"bento","name":"Bento Box","keywords":["food","japanese","lunch"],"skins":[{"unified":"1f371","native":"🍱"}],"version":1},"rice_cracker":{"id":"rice_cracker","name":"Rice Cracker","keywords":["food","japanese","snack"],"skins":[{"unified":"1f358","native":"🍘"}],"version":1},"rice_ball":{"id":"rice_ball","name":"Rice Ball","keywords":["food","japanese"],"skins":[{"unified":"1f359","native":"🍙"}],"version":1},"rice":{"id":"rice","name":"Cooked Rice","keywords":["food","asian"],"skins":[{"unified":"1f35a","native":"🍚"}],"version":1},"curry":{"id":"curry","name":"Curry Rice","keywords":["food","spicy","hot","indian"],"skins":[{"unified":"1f35b","native":"🍛"}],"version":1},"ramen":{"id":"ramen","name":"Steaming Bowl","keywords":["ramen","food","japanese","noodle","chopsticks"],"skins":[{"unified":"1f35c","native":"🍜"}],"version":1},"spaghetti":{"id":"spaghetti","name":"Spaghetti","keywords":["food","italian","pasta","noodle"],"skins":[{"unified":"1f35d","native":"🍝"}],"version":1},"sweet_potato":{"id":"sweet_potato","name":"Roasted Sweet Potato","keywords":["food","nature","plant"],"skins":[{"unified":"1f360","native":"🍠"}],"version":1},"oden":{"id":"oden","name":"Oden","keywords":["food","japanese"],"skins":[{"unified":"1f362","native":"🍢"}],"version":1},"sushi":{"id":"sushi","name":"Sushi","keywords":["food","fish","japanese","rice"],"skins":[{"unified":"1f363","native":"🍣"}],"version":1},"fried_shrimp":{"id":"fried_shrimp","name":"Fried Shrimp","keywords":["food","animal","appetizer","summer"],"skins":[{"unified":"1f364","native":"🍤"}],"version":1},"fish_cake":{"id":"fish_cake","name":"Fish Cake with Swirl","keywords":["food","japan","sea","beach","narutomaki","pink","kamaboko","surimi","ramen"],"skins":[{"unified":"1f365","native":"🍥"}],"version":1},"dango":{"id":"dango","name":"Dango","keywords":["food","dessert","sweet","japanese","barbecue","meat"],"skins":[{"unified":"1f361","native":"🍡"}],"version":1},"crab":{"id":"crab","name":"Crab","keywords":["animal","crustacean"],"skins":[{"unified":"1f980","native":"🦀"}],"version":1},"icecream":{"id":"icecream","name":"Soft Ice Cream","keywords":["icecream","food","hot","dessert","summer"],"skins":[{"unified":"1f366","native":"🍦"}],"version":1},"shaved_ice":{"id":"shaved_ice","name":"Shaved Ice","keywords":["hot","dessert","summer"],"skins":[{"unified":"1f367","native":"🍧"}],"version":1},"ice_cream":{"id":"ice_cream","name":"Ice Cream","keywords":["food","hot","dessert"],"skins":[{"unified":"1f368","native":"🍨"}],"version":1},"doughnut":{"id":"doughnut","name":"Doughnut","keywords":["food","dessert","snack","sweet","donut"],"skins":[{"unified":"1f369","native":"🍩"}],"version":1},"cookie":{"id":"cookie","name":"Cookie","keywords":["food","snack","oreo","chocolate","sweet","dessert"],"skins":[{"unified":"1f36a","native":"🍪"}],"version":1},"birthday":{"id":"birthday","name":"Birthday Cake","keywords":["food","dessert"],"skins":[{"unified":"1f382","native":"🎂"}],"version":1},"cake":{"id":"cake","name":"Shortcake","keywords":["cake","food","dessert"],"skins":[{"unified":"1f370","native":"🍰"}],"version":1},"chocolate_bar":{"id":"chocolate_bar","name":"Chocolate Bar","keywords":["food","snack","dessert","sweet"],"skins":[{"unified":"1f36b","native":"🍫"}],"version":1},"candy":{"id":"candy","name":"Candy","keywords":["snack","dessert","sweet","lolly"],"skins":[{"unified":"1f36c","native":"🍬"}],"version":1},"lollipop":{"id":"lollipop","name":"Lollipop","keywords":["food","snack","candy","sweet"],"skins":[{"unified":"1f36d","native":"🍭"}],"version":1},"custard":{"id":"custard","name":"Custard","keywords":["dessert","food"],"skins":[{"unified":"1f36e","native":"🍮"}],"version":1},"honey_pot":{"id":"honey_pot","name":"Honey Pot","keywords":["bees","sweet","kitchen"],"skins":[{"unified":"1f36f","native":"🍯"}],"version":1},"baby_bottle":{"id":"baby_bottle","name":"Baby Bottle","keywords":["food","container","milk"],"skins":[{"unified":"1f37c","native":"🍼"}],"version":1},"coffee":{"id":"coffee","name":"Hot Beverage","keywords":["coffee","caffeine","latte","espresso","mug"],"skins":[{"unified":"2615","native":"☕"}],"version":1},"tea":{"id":"tea","name":"Teacup Without Handle","keywords":["tea","drink","bowl","breakfast","green","british"],"skins":[{"unified":"1f375","native":"🍵"}],"version":1},"sake":{"id":"sake","name":"Sake","keywords":["wine","drink","drunk","beverage","japanese","alcohol","booze"],"skins":[{"unified":"1f376","native":"🍶"}],"version":1},"champagne":{"id":"champagne","name":"Bottle with Popping Cork","keywords":["champagne","drink","wine","celebration"],"skins":[{"unified":"1f37e","native":"🍾"}],"version":1},"wine_glass":{"id":"wine_glass","name":"Wine Glass","keywords":["drink","beverage","drunk","alcohol","booze"],"skins":[{"unified":"1f377","native":"🍷"}],"version":1},"cocktail":{"id":"cocktail","name":"Cocktail Glass","keywords":["drink","drunk","alcohol","beverage","booze","mojito"],"skins":[{"unified":"1f378","native":"🍸"}],"version":1},"tropical_drink":{"id":"tropical_drink","name":"Tropical Drink","keywords":["beverage","cocktail","summer","beach","alcohol","booze","mojito"],"skins":[{"unified":"1f379","native":"🍹"}],"version":1},"beer":{"id":"beer","name":"Beer Mug","keywords":["relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"skins":[{"unified":"1f37a","native":"🍺"}],"version":1},"beers":{"id":"beers","name":"Clinking Beer Mugs","keywords":["beers","relax","beverage","drink","drunk","party","pub","summer","alcohol","booze"],"skins":[{"unified":"1f37b","native":"🍻"}],"version":1},"knife_fork_plate":{"id":"knife_fork_plate","name":"Fork and Knife with Plate","keywords":["food","eat","meal","lunch","dinner","restaurant"],"skins":[{"unified":"1f37d-fe0f","native":"🍽️"}],"version":1},"fork_and_knife":{"id":"fork_and_knife","name":"Fork and Knife","keywords":["cutlery","kitchen"],"skins":[{"unified":"1f374","native":"🍴"}],"version":1},"hocho":{"id":"hocho","name":"Hocho","keywords":["knife","kitchen","blade","cutlery","weapon"],"skins":[{"unified":"1f52a","native":"🔪"}],"version":1},"amphora":{"id":"amphora","name":"Amphora","keywords":["vase","jar"],"skins":[{"unified":"1f3fa","native":"🏺"}],"version":1},"earth_africa":{"id":"earth_africa","name":"Earth Globe Europe-Africa","keywords":["africa","showing","europe","world","international"],"skins":[{"unified":"1f30d","native":"🌍"}],"version":1},"earth_americas":{"id":"earth_americas","name":"Earth Globe Americas","keywords":["showing","world","USA","international"],"skins":[{"unified":"1f30e","native":"🌎"}],"version":1},"earth_asia":{"id":"earth_asia","name":"Earth Globe Asia-Australia","keywords":["asia","showing","australia","world","east","international"],"skins":[{"unified":"1f30f","native":"🌏"}],"version":1},"globe_with_meridians":{"id":"globe_with_meridians","name":"Globe with Meridians","keywords":["earth","international","world","internet","interweb","i18n"],"skins":[{"unified":"1f310","native":"🌐"}],"version":1},"world_map":{"id":"world_map","name":"World Map","keywords":["location","direction"],"skins":[{"unified":"1f5fa-fe0f","native":"🗺️"}],"version":1},"japan":{"id":"japan","name":"Map of Japan","keywords":["nation","country","japanese","asia"],"skins":[{"unified":"1f5fe","native":"🗾"}],"version":1},"snow_capped_mountain":{"id":"snow_capped_mountain","name":"Snow-Capped Mountain","keywords":["snow","capped","photo","nature","environment","winter","cold"],"skins":[{"unified":"1f3d4-fe0f","native":"🏔️"}],"version":1},"mountain":{"id":"mountain","name":"Mountain","keywords":["photo","nature","environment"],"skins":[{"unified":"26f0-fe0f","native":"⛰️"}],"version":1},"volcano":{"id":"volcano","name":"Volcano","keywords":["photo","nature","disaster"],"skins":[{"unified":"1f30b","native":"🌋"}],"version":1},"mount_fuji":{"id":"mount_fuji","name":"Mount Fuji","keywords":["photo","mountain","nature","japanese"],"skins":[{"unified":"1f5fb","native":"🗻"}],"version":1},"camping":{"id":"camping","name":"Camping","keywords":["photo","outdoors","tent"],"skins":[{"unified":"1f3d5-fe0f","native":"🏕️"}],"version":1},"beach_with_umbrella":{"id":"beach_with_umbrella","name":"Beach with Umbrella","keywords":["weather","summer","sunny","sand","mojito"],"skins":[{"unified":"1f3d6-fe0f","native":"🏖️"}],"version":1},"desert":{"id":"desert","name":"Desert","keywords":["photo","warm","saharah"],"skins":[{"unified":"1f3dc-fe0f","native":"🏜️"}],"version":1},"desert_island":{"id":"desert_island","name":"Desert Island","keywords":["photo","tropical","mojito"],"skins":[{"unified":"1f3dd-fe0f","native":"🏝️"}],"version":1},"national_park":{"id":"national_park","name":"National Park","keywords":["photo","environment","nature"],"skins":[{"unified":"1f3de-fe0f","native":"🏞️"}],"version":1},"stadium":{"id":"stadium","name":"Stadium","keywords":["photo","place","sports","concert","venue"],"skins":[{"unified":"1f3df-fe0f","native":"🏟️"}],"version":1},"classical_building":{"id":"classical_building","name":"Classical Building","keywords":["art","culture","history"],"skins":[{"unified":"1f3db-fe0f","native":"🏛️"}],"version":1},"building_construction":{"id":"building_construction","name":"Building Construction","keywords":["wip","working","progress"],"skins":[{"unified":"1f3d7-fe0f","native":"🏗️"}],"version":1},"house_buildings":{"id":"house_buildings","name":"Houses","keywords":["house","buildings","photo"],"skins":[{"unified":"1f3d8-fe0f","native":"🏘️"}],"version":1},"derelict_house_building":{"id":"derelict_house_building","name":"Derelict House","keywords":["building","abandon","evict","broken"],"skins":[{"unified":"1f3da-fe0f","native":"🏚️"}],"version":1},"house":{"id":"house","name":"House","keywords":["building","home"],"skins":[{"unified":"1f3e0","native":"🏠"}],"version":1},"house_with_garden":{"id":"house_with_garden","name":"House with Garden","keywords":["home","plant","nature"],"skins":[{"unified":"1f3e1","native":"🏡"}],"version":1},"office":{"id":"office","name":"Office Building","keywords":["bureau","work"],"skins":[{"unified":"1f3e2","native":"🏢"}],"version":1},"post_office":{"id":"post_office","name":"Japanese Post Office","keywords":["building","envelope","communication"],"skins":[{"unified":"1f3e3","native":"🏣"}],"version":1},"european_post_office":{"id":"european_post_office","name":"Post Office","keywords":["european","building","email"],"skins":[{"unified":"1f3e4","native":"🏤"}],"version":1},"hospital":{"id":"hospital","name":"Hospital","keywords":["building","health","surgery","doctor"],"skins":[{"unified":"1f3e5","native":"🏥"}],"version":1},"bank":{"id":"bank","name":"Bank","keywords":["building","money","sales","cash","business","enterprise"],"skins":[{"unified":"1f3e6","native":"🏦"}],"version":1},"hotel":{"id":"hotel","name":"Hotel","keywords":["building","accomodation","checkin"],"skins":[{"unified":"1f3e8","native":"🏨"}],"version":1},"love_hotel":{"id":"love_hotel","name":"Love Hotel","keywords":["like","affection","dating"],"skins":[{"unified":"1f3e9","native":"🏩"}],"version":1},"convenience_store":{"id":"convenience_store","name":"Convenience Store","keywords":["building","shopping","groceries"],"skins":[{"unified":"1f3ea","native":"🏪"}],"version":1},"school":{"id":"school","name":"School","keywords":["building","student","education","learn","teach"],"skins":[{"unified":"1f3eb","native":"🏫"}],"version":1},"department_store":{"id":"department_store","name":"Department Store","keywords":["building","shopping","mall"],"skins":[{"unified":"1f3ec","native":"🏬"}],"version":1},"factory":{"id":"factory","name":"Factory","keywords":["building","industry","pollution","smoke"],"skins":[{"unified":"1f3ed","native":"🏭"}],"version":1},"japanese_castle":{"id":"japanese_castle","name":"Japanese Castle","keywords":["photo","building"],"skins":[{"unified":"1f3ef","native":"🏯"}],"version":1},"european_castle":{"id":"european_castle","name":"Castle","keywords":["european","building","royalty","history"],"skins":[{"unified":"1f3f0","native":"🏰"}],"version":1},"wedding":{"id":"wedding","name":"Wedding","keywords":["love","like","affection","couple","marriage","bride","groom"],"skins":[{"unified":"1f492","native":"💒"}],"version":1},"tokyo_tower":{"id":"tokyo_tower","name":"Tokyo Tower","keywords":["photo","japanese"],"skins":[{"unified":"1f5fc","native":"🗼"}],"version":1},"statue_of_liberty":{"id":"statue_of_liberty","name":"Statue of Liberty","keywords":["american","newyork"],"skins":[{"unified":"1f5fd","native":"🗽"}],"version":1},"church":{"id":"church","name":"Church","keywords":["building","religion","christ"],"skins":[{"unified":"26ea","native":"⛪"}],"version":1},"mosque":{"id":"mosque","name":"Mosque","keywords":["islam","worship","minaret"],"skins":[{"unified":"1f54c","native":"🕌"}],"version":1},"synagogue":{"id":"synagogue","name":"Synagogue","keywords":["judaism","worship","temple","jewish"],"skins":[{"unified":"1f54d","native":"🕍"}],"version":1},"shinto_shrine":{"id":"shinto_shrine","name":"Shinto Shrine","keywords":["temple","japan","kyoto"],"skins":[{"unified":"26e9-fe0f","native":"⛩️"}],"version":1},"kaaba":{"id":"kaaba","name":"Kaaba","keywords":["mecca","mosque","islam"],"skins":[{"unified":"1f54b","native":"🕋"}],"version":1},"fountain":{"id":"fountain","name":"Fountain","keywords":["photo","summer","water","fresh"],"skins":[{"unified":"26f2","native":"⛲"}],"version":1},"tent":{"id":"tent","name":"Tent","keywords":["photo","camping","outdoors"],"skins":[{"unified":"26fa","native":"⛺"}],"version":1},"foggy":{"id":"foggy","name":"Foggy","keywords":["photo","mountain"],"skins":[{"unified":"1f301","native":"🌁"}],"version":1},"night_with_stars":{"id":"night_with_stars","name":"Night with Stars","keywords":["evening","city","downtown"],"skins":[{"unified":"1f303","native":"🌃"}],"version":1},"cityscape":{"id":"cityscape","name":"Cityscape","keywords":["photo","night","life","urban"],"skins":[{"unified":"1f3d9-fe0f","native":"🏙️"}],"version":1},"sunrise_over_mountains":{"id":"sunrise_over_mountains","name":"Sunrise over Mountains","keywords":["view","vacation","photo"],"skins":[{"unified":"1f304","native":"🌄"}],"version":1},"sunrise":{"id":"sunrise","name":"Sunrise","keywords":["morning","view","vacation","photo"],"skins":[{"unified":"1f305","native":"🌅"}],"version":1},"city_sunset":{"id":"city_sunset","name":"Cityscape at Dusk","keywords":["city","sunset","photo","evening","sky","buildings"],"skins":[{"unified":"1f306","native":"🌆"}],"version":1},"city_sunrise":{"id":"city_sunrise","name":"Sunset","keywords":["city","sunrise","photo","good","morning","dawn"],"skins":[{"unified":"1f307","native":"🌇"}],"version":1},"bridge_at_night":{"id":"bridge_at_night","name":"Bridge at Night","keywords":["photo","sanfrancisco"],"skins":[{"unified":"1f309","native":"🌉"}],"version":1},"hotsprings":{"id":"hotsprings","name":"Hot Springs","keywords":["hotsprings","bath","warm","relax"],"skins":[{"unified":"2668-fe0f","native":"♨️"}],"version":1},"carousel_horse":{"id":"carousel_horse","name":"Carousel Horse","keywords":["photo","carnival"],"skins":[{"unified":"1f3a0","native":"🎠"}],"version":1},"ferris_wheel":{"id":"ferris_wheel","name":"Ferris Wheel","keywords":["photo","carnival","londoneye"],"skins":[{"unified":"1f3a1","native":"🎡"}],"version":1},"roller_coaster":{"id":"roller_coaster","name":"Roller Coaster","keywords":["carnival","playground","photo","fun"],"skins":[{"unified":"1f3a2","native":"🎢"}],"version":1},"barber":{"id":"barber","name":"Barber Pole","keywords":["hair","salon","style"],"skins":[{"unified":"1f488","native":"💈"}],"version":1},"circus_tent":{"id":"circus_tent","name":"Circus Tent","keywords":["festival","carnival","party"],"skins":[{"unified":"1f3aa","native":"🎪"}],"version":1},"steam_locomotive":{"id":"steam_locomotive","name":"Locomotive","keywords":["steam","transportation","vehicle","train"],"skins":[{"unified":"1f682","native":"🚂"}],"version":1},"railway_car":{"id":"railway_car","name":"Railway Car","keywords":["transportation","vehicle"],"skins":[{"unified":"1f683","native":"🚃"}],"version":1},"bullettrain_side":{"id":"bullettrain_side","name":"High-Speed Train","keywords":["bullettrain","side","high","speed","transportation","vehicle"],"skins":[{"unified":"1f684","native":"🚄"}],"version":1},"bullettrain_front":{"id":"bullettrain_front","name":"Bullet Train","keywords":["bullettrain","front","transportation","vehicle","speed","fast","public","travel"],"skins":[{"unified":"1f685","native":"🚅"}],"version":1},"train2":{"id":"train2","name":"Train","keywords":["train2","transportation","vehicle"],"skins":[{"unified":"1f686","native":"🚆"}],"version":1},"metro":{"id":"metro","name":"Metro","keywords":["transportation","blue","square","mrt","underground","tube"],"skins":[{"unified":"1f687","native":"🚇"}],"version":1},"light_rail":{"id":"light_rail","name":"Light Rail","keywords":["transportation","vehicle"],"skins":[{"unified":"1f688","native":"🚈"}],"version":1},"station":{"id":"station","name":"Station","keywords":["transportation","vehicle","public"],"skins":[{"unified":"1f689","native":"🚉"}],"version":1},"tram":{"id":"tram","name":"Tram","keywords":["transportation","vehicle"],"skins":[{"unified":"1f68a","native":"🚊"}],"version":1},"monorail":{"id":"monorail","name":"Monorail","keywords":["transportation","vehicle"],"skins":[{"unified":"1f69d","native":"🚝"}],"version":1},"mountain_railway":{"id":"mountain_railway","name":"Mountain Railway","keywords":["transportation","vehicle"],"skins":[{"unified":"1f69e","native":"🚞"}],"version":1},"train":{"id":"train","name":"Tram Car","keywords":["train","transportation","vehicle","carriage","public","travel"],"skins":[{"unified":"1f68b","native":"🚋"}],"version":1},"bus":{"id":"bus","name":"Bus","keywords":["car","vehicle","transportation"],"skins":[{"unified":"1f68c","native":"🚌"}],"version":1},"oncoming_bus":{"id":"oncoming_bus","name":"Oncoming Bus","keywords":["vehicle","transportation"],"skins":[{"unified":"1f68d","native":"🚍"}],"version":1},"trolleybus":{"id":"trolleybus","name":"Trolleybus","keywords":["bart","transportation","vehicle"],"skins":[{"unified":"1f68e","native":"🚎"}],"version":1},"minibus":{"id":"minibus","name":"Minibus","keywords":["vehicle","car","transportation"],"skins":[{"unified":"1f690","native":"🚐"}],"version":1},"ambulance":{"id":"ambulance","name":"Ambulance","keywords":["health","911","hospital"],"skins":[{"unified":"1f691","native":"🚑"}],"version":1},"fire_engine":{"id":"fire_engine","name":"Fire Engine","keywords":["transportation","cars","vehicle"],"skins":[{"unified":"1f692","native":"🚒"}],"version":1},"police_car":{"id":"police_car","name":"Police Car","keywords":["vehicle","cars","transportation","law","legal","enforcement"],"skins":[{"unified":"1f693","native":"🚓"}],"version":1},"oncoming_police_car":{"id":"oncoming_police_car","name":"Oncoming Police Car","keywords":["vehicle","law","legal","enforcement","911"],"skins":[{"unified":"1f694","native":"🚔"}],"version":1},"taxi":{"id":"taxi","name":"Taxi","keywords":["uber","vehicle","cars","transportation"],"skins":[{"unified":"1f695","native":"🚕"}],"version":1},"oncoming_taxi":{"id":"oncoming_taxi","name":"Oncoming Taxi","keywords":["vehicle","cars","uber"],"skins":[{"unified":"1f696","native":"🚖"}],"version":1},"car":{"id":"car","name":"Automobile","keywords":["car","red","transportation","vehicle"],"skins":[{"unified":"1f697","native":"🚗"}],"version":1},"oncoming_automobile":{"id":"oncoming_automobile","name":"Oncoming Automobile","keywords":["car","vehicle","transportation"],"skins":[{"unified":"1f698","native":"🚘"}],"version":1},"blue_car":{"id":"blue_car","name":"Recreational Vehicle","keywords":["blue","car","sport","utility","transportation"],"skins":[{"unified":"1f699","native":"🚙"}],"version":1},"truck":{"id":"truck","name":"Delivery Truck","keywords":["cars","transportation"],"skins":[{"unified":"1f69a","native":"🚚"}],"version":1},"articulated_lorry":{"id":"articulated_lorry","name":"Articulated Lorry","keywords":["vehicle","cars","transportation","express"],"skins":[{"unified":"1f69b","native":"🚛"}],"version":1},"tractor":{"id":"tractor","name":"Tractor","keywords":["vehicle","car","farming","agriculture"],"skins":[{"unified":"1f69c","native":"🚜"}],"version":1},"racing_car":{"id":"racing_car","name":"Racing Car","keywords":["sports","race","fast","formula","f1"],"skins":[{"unified":"1f3ce-fe0f","native":"🏎️"}],"version":1},"racing_motorcycle":{"id":"racing_motorcycle","name":"Motorcycle","keywords":["racing","race","sports","fast"],"skins":[{"unified":"1f3cd-fe0f","native":"🏍️"}],"version":1},"bike":{"id":"bike","name":"Bicycle","keywords":["bike","sports","exercise","hipster"],"skins":[{"unified":"1f6b2","native":"🚲"}],"version":1},"busstop":{"id":"busstop","name":"Bus Stop","keywords":["busstop","transportation","wait"],"skins":[{"unified":"1f68f","native":"🚏"}],"version":1},"motorway":{"id":"motorway","name":"Motorway","keywords":["road","cupertino","interstate","highway"],"skins":[{"unified":"1f6e3-fe0f","native":"🛣️"}],"version":1},"railway_track":{"id":"railway_track","name":"Railway Track","keywords":["train","transportation"],"skins":[{"unified":"1f6e4-fe0f","native":"🛤️"}],"version":1},"oil_drum":{"id":"oil_drum","name":"Oil Drum","keywords":["barrell"],"skins":[{"unified":"1f6e2-fe0f","native":"🛢️"}],"version":1},"fuelpump":{"id":"fuelpump","name":"Fuel Pump","keywords":["fuelpump","gas","station","petroleum"],"skins":[{"unified":"26fd","native":"⛽"}],"version":1},"rotating_light":{"id":"rotating_light","name":"Police Car Light","keywords":["rotating","ambulance","911","emergency","alert","error","pinged","law","legal"],"skins":[{"unified":"1f6a8","native":"🚨"}],"version":1},"traffic_light":{"id":"traffic_light","name":"Horizontal Traffic Light","keywords":["transportation","signal"],"skins":[{"unified":"1f6a5","native":"🚥"}],"version":1},"vertical_traffic_light":{"id":"vertical_traffic_light","name":"Vertical Traffic Light","keywords":["transportation","driving"],"skins":[{"unified":"1f6a6","native":"🚦"}],"version":1},"construction":{"id":"construction","name":"Construction","keywords":["wip","progress","caution","warning"],"skins":[{"unified":"1f6a7","native":"🚧"}],"version":1},"anchor":{"id":"anchor","name":"Anchor","keywords":["ship","ferry","sea","boat"],"skins":[{"unified":"2693","native":"⚓"}],"version":1},"boat":{"id":"boat","name":"Sailboat","keywords":["boat","ship","summer","transportation","water","sailing"],"skins":[{"unified":"26f5","native":"⛵"}],"version":1},"speedboat":{"id":"speedboat","name":"Speedboat","keywords":["ship","transportation","vehicle","summer"],"skins":[{"unified":"1f6a4","native":"🚤"}],"version":1},"passenger_ship":{"id":"passenger_ship","name":"Passenger Ship","keywords":["yacht","cruise","ferry"],"skins":[{"unified":"1f6f3-fe0f","native":"🛳️"}],"version":1},"ferry":{"id":"ferry","name":"Ferry","keywords":["boat","ship","yacht"],"skins":[{"unified":"26f4-fe0f","native":"⛴️"}],"version":1},"motor_boat":{"id":"motor_boat","name":"Motor Boat","keywords":["ship"],"skins":[{"unified":"1f6e5-fe0f","native":"🛥️"}],"version":1},"ship":{"id":"ship","name":"Ship","keywords":["transportation","titanic","deploy"],"skins":[{"unified":"1f6a2","native":"🚢"}],"version":1},"airplane":{"id":"airplane","name":"Airplane","keywords":["vehicle","transportation","flight","fly"],"skins":[{"unified":"2708-fe0f","native":"✈️"}],"version":1},"small_airplane":{"id":"small_airplane","name":"Small Airplane","keywords":["flight","transportation","fly","vehicle"],"skins":[{"unified":"1f6e9-fe0f","native":"🛩️"}],"version":1},"airplane_departure":{"id":"airplane_departure","name":"Airplane Departure","keywords":["airport","flight","landing"],"skins":[{"unified":"1f6eb","native":"🛫"}],"version":1},"airplane_arriving":{"id":"airplane_arriving","name":"Airplane Arrival","keywords":["arriving","airport","flight","boarding"],"skins":[{"unified":"1f6ec","native":"🛬"}],"version":1},"seat":{"id":"seat","name":"Seat","keywords":["sit","airplane","transport","bus","flight","fly"],"skins":[{"unified":"1f4ba","native":"💺"}],"version":1},"helicopter":{"id":"helicopter","name":"Helicopter","keywords":["transportation","vehicle","fly"],"skins":[{"unified":"1f681","native":"🚁"}],"version":1},"suspension_railway":{"id":"suspension_railway","name":"Suspension Railway","keywords":["vehicle","transportation"],"skins":[{"unified":"1f69f","native":"🚟"}],"version":1},"mountain_cableway":{"id":"mountain_cableway","name":"Mountain Cableway","keywords":["transportation","vehicle","ski"],"skins":[{"unified":"1f6a0","native":"🚠"}],"version":1},"aerial_tramway":{"id":"aerial_tramway","name":"Aerial Tramway","keywords":["transportation","vehicle","ski"],"skins":[{"unified":"1f6a1","native":"🚡"}],"version":1},"satellite":{"id":"satellite","name":"Satellite","keywords":["communication","gps","orbit","spaceflight","NASA","ISS"],"skins":[{"unified":"1f6f0-fe0f","native":"🛰️"}],"version":1},"rocket":{"id":"rocket","name":"Rocket","keywords":["launch","ship","staffmode","NASA","outer","space","fly"],"skins":[{"unified":"1f680","native":"🚀"}],"version":1},"bellhop_bell":{"id":"bellhop_bell","name":"Bellhop Bell","keywords":["service"],"skins":[{"unified":"1f6ce-fe0f","native":"🛎️"}],"version":1},"hourglass":{"id":"hourglass","name":"Hourglass","keywords":["done","time","clock","oldschool","limit","exam","quiz","test"],"skins":[{"unified":"231b","native":"⌛"}],"version":1},"hourglass_flowing_sand":{"id":"hourglass_flowing_sand","name":"Hourglass Not Done","keywords":["flowing","sand","oldschool","time","countdown"],"skins":[{"unified":"23f3","native":"⏳"}],"version":1},"watch":{"id":"watch","name":"Watch","keywords":["time","accessories"],"skins":[{"unified":"231a","native":"⌚"}],"version":1},"alarm_clock":{"id":"alarm_clock","name":"Alarm Clock","keywords":["time","wake"],"skins":[{"unified":"23f0","native":"⏰"}],"version":1},"stopwatch":{"id":"stopwatch","name":"Stopwatch","keywords":["time","deadline"],"skins":[{"unified":"23f1-fe0f","native":"⏱️"}],"version":1},"timer_clock":{"id":"timer_clock","name":"Timer Clock","keywords":["alarm"],"skins":[{"unified":"23f2-fe0f","native":"⏲️"}],"version":1},"mantelpiece_clock":{"id":"mantelpiece_clock","name":"Mantelpiece Clock","keywords":["time"],"skins":[{"unified":"1f570-fe0f","native":"🕰️"}],"version":1},"clock12":{"id":"clock12","name":"Twelve O’clock","keywords":["clock12","o","clock","12","00:00","0000","12:00","1200","time","noon","midnight","midday","late","early","schedule"],"skins":[{"unified":"1f55b","native":"🕛"}],"version":1},"clock1230":{"id":"clock1230","name":"Twelve-Thirty","keywords":["clock1230","twelve","thirty","00:30","0030","12:30","1230","time","late","early","schedule"],"skins":[{"unified":"1f567","native":"🕧"}],"version":1},"clock1":{"id":"clock1","name":"One O’clock","keywords":["clock1","o","clock","1","1:00","100","13:00","1300","time","late","early","schedule"],"skins":[{"unified":"1f550","native":"🕐"}],"version":1},"clock130":{"id":"clock130","name":"One-Thirty","keywords":["clock130","one","thirty","1:30","130","13:30","1330","time","late","early","schedule"],"skins":[{"unified":"1f55c","native":"🕜"}],"version":1},"clock2":{"id":"clock2","name":"Two O’clock","keywords":["clock2","o","clock","2","2:00","200","14:00","1400","time","late","early","schedule"],"skins":[{"unified":"1f551","native":"🕑"}],"version":1},"clock230":{"id":"clock230","name":"Two-Thirty","keywords":["clock230","two","thirty","2:30","230","14:30","1430","time","late","early","schedule"],"skins":[{"unified":"1f55d","native":"🕝"}],"version":1},"clock3":{"id":"clock3","name":"Three O’clock","keywords":["clock3","o","clock","3","3:00","300","15:00","1500","time","late","early","schedule"],"skins":[{"unified":"1f552","native":"🕒"}],"version":1},"clock330":{"id":"clock330","name":"Three-Thirty","keywords":["clock330","three","thirty","3:30","330","15:30","1530","time","late","early","schedule"],"skins":[{"unified":"1f55e","native":"🕞"}],"version":1},"clock4":{"id":"clock4","name":"Four O’clock","keywords":["clock4","o","clock","4","4:00","400","16:00","1600","time","late","early","schedule"],"skins":[{"unified":"1f553","native":"🕓"}],"version":1},"clock430":{"id":"clock430","name":"Four-Thirty","keywords":["clock430","four","thirty","4:30","430","16:30","1630","time","late","early","schedule"],"skins":[{"unified":"1f55f","native":"🕟"}],"version":1},"clock5":{"id":"clock5","name":"Five O’clock","keywords":["clock5","o","clock","5","5:00","500","17:00","1700","time","late","early","schedule"],"skins":[{"unified":"1f554","native":"🕔"}],"version":1},"clock530":{"id":"clock530","name":"Five-Thirty","keywords":["clock530","five","thirty","5:30","530","17:30","1730","time","late","early","schedule"],"skins":[{"unified":"1f560","native":"🕠"}],"version":1},"clock6":{"id":"clock6","name":"Six O’clock","keywords":["clock6","o","clock","6","6:00","600","18:00","1800","time","late","early","schedule","dawn","dusk"],"skins":[{"unified":"1f555","native":"🕕"}],"version":1},"clock630":{"id":"clock630","name":"Six-Thirty","keywords":["clock630","six","thirty","6:30","630","18:30","1830","time","late","early","schedule"],"skins":[{"unified":"1f561","native":"🕡"}],"version":1},"clock7":{"id":"clock7","name":"Seven O’clock","keywords":["clock7","o","clock","7","7:00","700","19:00","1900","time","late","early","schedule"],"skins":[{"unified":"1f556","native":"🕖"}],"version":1},"clock730":{"id":"clock730","name":"Seven-Thirty","keywords":["clock730","seven","thirty","7:30","730","19:30","1930","time","late","early","schedule"],"skins":[{"unified":"1f562","native":"🕢"}],"version":1},"clock8":{"id":"clock8","name":"Eight O’clock","keywords":["clock8","o","clock","8","8:00","800","20:00","2000","time","late","early","schedule"],"skins":[{"unified":"1f557","native":"🕗"}],"version":1},"clock830":{"id":"clock830","name":"Eight-Thirty","keywords":["clock830","eight","thirty","8:30","830","20:30","2030","time","late","early","schedule"],"skins":[{"unified":"1f563","native":"🕣"}],"version":1},"clock9":{"id":"clock9","name":"Nine O’clock","keywords":["clock9","o","clock","9","9:00","900","21:00","2100","time","late","early","schedule"],"skins":[{"unified":"1f558","native":"🕘"}],"version":1},"clock930":{"id":"clock930","name":"Nine-Thirty","keywords":["clock930","nine","thirty","9:30","930","21:30","2130","time","late","early","schedule"],"skins":[{"unified":"1f564","native":"🕤"}],"version":1},"clock10":{"id":"clock10","name":"Ten O’clock","keywords":["clock10","o","clock","10","10:00","1000","22:00","2200","time","late","early","schedule"],"skins":[{"unified":"1f559","native":"🕙"}],"version":1},"clock1030":{"id":"clock1030","name":"Ten-Thirty","keywords":["clock1030","ten","thirty","10:30","1030","22:30","2230","time","late","early","schedule"],"skins":[{"unified":"1f565","native":"🕥"}],"version":1},"clock11":{"id":"clock11","name":"Eleven O’clock","keywords":["clock11","o","clock","11","11:00","1100","23:00","2300","time","late","early","schedule"],"skins":[{"unified":"1f55a","native":"🕚"}],"version":1},"clock1130":{"id":"clock1130","name":"Eleven-Thirty","keywords":["clock1130","eleven","thirty","11:30","1130","23:30","2330","time","late","early","schedule"],"skins":[{"unified":"1f566","native":"🕦"}],"version":1},"new_moon":{"id":"new_moon","name":"New Moon","keywords":["nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f311","native":"🌑"}],"version":1},"waxing_crescent_moon":{"id":"waxing_crescent_moon","name":"Waxing Crescent Moon","keywords":["nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f312","native":"🌒"}],"version":1},"first_quarter_moon":{"id":"first_quarter_moon","name":"First Quarter Moon","keywords":["nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f313","native":"🌓"}],"version":1},"moon":{"id":"moon","name":"Waxing Gibbous Moon","keywords":["nature","night","sky","gray","twilight","planet","space","evening","sleep"],"skins":[{"unified":"1f314","native":"🌔"}],"version":1},"full_moon":{"id":"full_moon","name":"Full Moon","keywords":["nature","yellow","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f315","native":"🌕"}],"version":1},"waning_gibbous_moon":{"id":"waning_gibbous_moon","name":"Waning Gibbous Moon","keywords":["nature","twilight","planet","space","night","evening","sleep","waxing"],"skins":[{"unified":"1f316","native":"🌖"}],"version":1},"last_quarter_moon":{"id":"last_quarter_moon","name":"Last Quarter Moon","keywords":["nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f317","native":"🌗"}],"version":1},"waning_crescent_moon":{"id":"waning_crescent_moon","name":"Waning Crescent Moon","keywords":["nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f318","native":"🌘"}],"version":1},"crescent_moon":{"id":"crescent_moon","name":"Crescent Moon","keywords":["night","sleep","sky","evening","magic"],"skins":[{"unified":"1f319","native":"🌙"}],"version":1},"new_moon_with_face":{"id":"new_moon_with_face","name":"New Moon Face","keywords":["with","nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f31a","native":"🌚"}],"version":1},"first_quarter_moon_with_face":{"id":"first_quarter_moon_with_face","name":"First Quarter Moon Face","keywords":["with","nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f31b","native":"🌛"}],"version":1},"last_quarter_moon_with_face":{"id":"last_quarter_moon_with_face","name":"Last Quarter Moon Face","keywords":["with","nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f31c","native":"🌜"}],"version":1},"thermometer":{"id":"thermometer","name":"Thermometer","keywords":["weather","temperature","hot","cold"],"skins":[{"unified":"1f321-fe0f","native":"🌡️"}],"version":1},"sunny":{"id":"sunny","name":"Sun","keywords":["sunny","weather","nature","brightness","summer","beach","spring"],"skins":[{"unified":"2600-fe0f","native":"☀️"}],"version":1},"full_moon_with_face":{"id":"full_moon_with_face","name":"Full Moon Face","keywords":["with","nature","twilight","planet","space","night","evening","sleep"],"skins":[{"unified":"1f31d","native":"🌝"}],"version":1},"sun_with_face":{"id":"sun_with_face","name":"Sun with Face","keywords":["nature","morning","sky"],"skins":[{"unified":"1f31e","native":"🌞"}],"version":1},"star":{"id":"star","name":"Star","keywords":["night","yellow"],"skins":[{"unified":"2b50","native":"⭐"}],"version":1},"star2":{"id":"star2","name":"Glowing Star","keywords":["star2","night","sparkle","awesome","good","magic"],"skins":[{"unified":"1f31f","native":"🌟"}],"version":1},"stars":{"id":"stars","name":"Shooting Star","keywords":["stars","night","photo"],"skins":[{"unified":"1f320","native":"🌠"}],"version":1},"milky_way":{"id":"milky_way","name":"Milky Way","keywords":["photo","space","stars"],"skins":[{"unified":"1f30c","native":"🌌"}],"version":1},"cloud":{"id":"cloud","name":"Cloud","keywords":["weather","sky"],"skins":[{"unified":"2601-fe0f","native":"☁️"}],"version":1},"partly_sunny":{"id":"partly_sunny","name":"Sun Behind Cloud","keywords":["partly","sunny","weather","nature","cloudy","morning","fall","spring"],"skins":[{"unified":"26c5","native":"⛅"}],"version":1},"thunder_cloud_and_rain":{"id":"thunder_cloud_and_rain","name":"Cloud with Lightning and Rain","keywords":["thunder","weather"],"skins":[{"unified":"26c8-fe0f","native":"⛈️"}],"version":1},"mostly_sunny":{"id":"mostly_sunny","name":"Sun Behind Small Cloud","keywords":["mostly","sunny","weather"],"skins":[{"unified":"1f324-fe0f","native":"🌤️"}],"version":1},"barely_sunny":{"id":"barely_sunny","name":"Sun Behind Large Cloud","keywords":["barely","sunny","weather"],"skins":[{"unified":"1f325-fe0f","native":"🌥️"}],"version":1},"partly_sunny_rain":{"id":"partly_sunny_rain","name":"Sun Behind Rain Cloud","keywords":["partly","sunny","weather"],"skins":[{"unified":"1f326-fe0f","native":"🌦️"}],"version":1},"rain_cloud":{"id":"rain_cloud","name":"Cloud with Rain","keywords":["weather"],"skins":[{"unified":"1f327-fe0f","native":"🌧️"}],"version":1},"snow_cloud":{"id":"snow_cloud","name":"Cloud with Snow","keywords":["weather"],"skins":[{"unified":"1f328-fe0f","native":"🌨️"}],"version":1},"lightning":{"id":"lightning","name":"Cloud with Lightning","keywords":["weather","thunder"],"skins":[{"unified":"1f329-fe0f","native":"🌩️"}],"version":1},"tornado":{"id":"tornado","name":"Tornado","keywords":["cloud","weather","cyclone","twister"],"skins":[{"unified":"1f32a-fe0f","native":"🌪️"}],"version":1},"fog":{"id":"fog","name":"Fog","keywords":["weather"],"skins":[{"unified":"1f32b-fe0f","native":"🌫️"}],"version":1},"wind_blowing_face":{"id":"wind_blowing_face","name":"Wind Face","keywords":["blowing","gust","air"],"skins":[{"unified":"1f32c-fe0f","native":"🌬️"}],"version":1},"cyclone":{"id":"cyclone","name":"Cyclone","keywords":["weather","swirl","blue","cloud","vortex","spiral","whirlpool","spin","tornado","hurricane","typhoon"],"skins":[{"unified":"1f300","native":"🌀"}],"version":1},"rainbow":{"id":"rainbow","name":"Rainbow","keywords":["nature","happy","unicorn","face","photo","sky","spring"],"skins":[{"unified":"1f308","native":"🌈"}],"version":1},"closed_umbrella":{"id":"closed_umbrella","name":"Closed Umbrella","keywords":["weather","rain","drizzle"],"skins":[{"unified":"1f302","native":"🌂"}],"version":1},"umbrella":{"id":"umbrella","name":"Umbrella","keywords":["weather","spring"],"skins":[{"unified":"2602-fe0f","native":"☂️"}],"version":1},"umbrella_with_rain_drops":{"id":"umbrella_with_rain_drops","name":"Umbrella with Rain Drops","keywords":["rainy","weather","spring"],"skins":[{"unified":"2614","native":"☔"}],"version":1},"umbrella_on_ground":{"id":"umbrella_on_ground","name":"Umbrella on Ground","keywords":["weather","summer"],"skins":[{"unified":"26f1-fe0f","native":"⛱️"}],"version":1},"zap":{"id":"zap","name":"High Voltage","keywords":["zap","thunder","weather","lightning","bolt","fast"],"skins":[{"unified":"26a1","native":"⚡"}],"version":1},"snowflake":{"id":"snowflake","name":"Snowflake","keywords":["winter","season","cold","weather","christmas","xmas"],"skins":[{"unified":"2744-fe0f","native":"❄️"}],"version":1},"snowman":{"id":"snowman","name":"Snowman","keywords":["winter","season","cold","weather","christmas","xmas","frozen"],"skins":[{"unified":"2603-fe0f","native":"☃️"}],"version":1},"snowman_without_snow":{"id":"snowman_without_snow","name":"Snowman Without Snow","keywords":["winter","season","cold","weather","christmas","xmas","frozen"],"skins":[{"unified":"26c4","native":"⛄"}],"version":1},"comet":{"id":"comet","name":"Comet","keywords":["space"],"skins":[{"unified":"2604-fe0f","native":"☄️"}],"version":1},"fire":{"id":"fire","name":"Fire","keywords":["hot","cook","flame"],"skins":[{"unified":"1f525","native":"🔥"}],"version":1},"droplet":{"id":"droplet","name":"Droplet","keywords":["water","drip","faucet","spring"],"skins":[{"unified":"1f4a7","native":"💧"}],"version":1},"ocean":{"id":"ocean","name":"Water Wave","keywords":["ocean","sea","nature","tsunami","disaster"],"skins":[{"unified":"1f30a","native":"🌊"}],"version":1},"jack_o_lantern":{"id":"jack_o_lantern","name":"Jack-O-Lantern","keywords":["jack","o","lantern","halloween","light","pumpkin","creepy","fall"],"skins":[{"unified":"1f383","native":"🎃"}],"version":1},"christmas_tree":{"id":"christmas_tree","name":"Christmas Tree","keywords":["festival","vacation","december","xmas","celebration"],"skins":[{"unified":"1f384","native":"🎄"}],"version":1},"fireworks":{"id":"fireworks","name":"Fireworks","keywords":["photo","festival","carnival","congratulations"],"skins":[{"unified":"1f386","native":"🎆"}],"version":1},"sparkler":{"id":"sparkler","name":"Sparkler","keywords":["stars","night","shine"],"skins":[{"unified":"1f387","native":"🎇"}],"version":1},"sparkles":{"id":"sparkles","name":"Sparkles","keywords":["stars","shine","shiny","cool","awesome","good","magic"],"skins":[{"unified":"2728","native":"✨"}],"version":1},"balloon":{"id":"balloon","name":"Balloon","keywords":["party","celebration","birthday","circus"],"skins":[{"unified":"1f388","native":"🎈"}],"version":1},"tada":{"id":"tada","name":"Party Popper","keywords":["tada","congratulations","birthday","magic","circus","celebration"],"skins":[{"unified":"1f389","native":"🎉"}],"version":1},"confetti_ball":{"id":"confetti_ball","name":"Confetti Ball","keywords":["festival","party","birthday","circus"],"skins":[{"unified":"1f38a","native":"🎊"}],"version":1},"tanabata_tree":{"id":"tanabata_tree","name":"Tanabata Tree","keywords":["plant","nature","branch","summer","bamboo","wish","star","festival","tanzaku"],"skins":[{"unified":"1f38b","native":"🎋"}],"version":1},"bamboo":{"id":"bamboo","name":"Pine Decoration","keywords":["bamboo","japanese","plant","nature","vegetable","panda","new","years"],"skins":[{"unified":"1f38d","native":"🎍"}],"version":1},"dolls":{"id":"dolls","name":"Japanese Dolls","keywords":["toy","kimono"],"skins":[{"unified":"1f38e","native":"🎎"}],"version":1},"flags":{"id":"flags","name":"Carp Streamer","keywords":["flags","fish","japanese","koinobori","banner"],"skins":[{"unified":"1f38f","native":"🎏"}],"version":1},"wind_chime":{"id":"wind_chime","name":"Wind Chime","keywords":["nature","ding","spring","bell"],"skins":[{"unified":"1f390","native":"🎐"}],"version":1},"rice_scene":{"id":"rice_scene","name":"Moon Viewing Ceremony","keywords":["rice","scene","photo","japan","asia","tsukimi"],"skins":[{"unified":"1f391","native":"🎑"}],"version":1},"ribbon":{"id":"ribbon","name":"Ribbon","keywords":["decoration","pink","girl","bowtie"],"skins":[{"unified":"1f380","native":"🎀"}],"version":1},"gift":{"id":"gift","name":"Wrapped Gift","keywords":["present","birthday","christmas","xmas"],"skins":[{"unified":"1f381","native":"🎁"}],"version":1},"reminder_ribbon":{"id":"reminder_ribbon","name":"Reminder Ribbon","keywords":["sports","cause","support","awareness"],"skins":[{"unified":"1f397-fe0f","native":"🎗️"}],"version":1},"admission_tickets":{"id":"admission_tickets","name":"Admission Tickets","keywords":["sports","concert","entrance"],"skins":[{"unified":"1f39f-fe0f","native":"🎟️"}],"version":1},"ticket":{"id":"ticket","name":"Ticket","keywords":["event","concert","pass"],"skins":[{"unified":"1f3ab","native":"🎫"}],"version":1},"medal":{"id":"medal","name":"Military Medal","keywords":["award","winning","army"],"skins":[{"unified":"1f396-fe0f","native":"🎖️"}],"version":1},"trophy":{"id":"trophy","name":"Trophy","keywords":["win","award","contest","place","ftw","ceremony"],"skins":[{"unified":"1f3c6","native":"🏆"}],"version":1},"sports_medal":{"id":"sports_medal","name":"Sports Medal","keywords":["award","winning"],"skins":[{"unified":"1f3c5","native":"🏅"}],"version":1},"soccer":{"id":"soccer","name":"Soccer Ball","keywords":["sports","football"],"skins":[{"unified":"26bd","native":"⚽"}],"version":1},"baseball":{"id":"baseball","name":"Baseball","keywords":["sports","balls"],"skins":[{"unified":"26be","native":"⚾"}],"version":1},"basketball":{"id":"basketball","name":"Basketball","keywords":["sports","balls","NBA"],"skins":[{"unified":"1f3c0","native":"🏀"}],"version":1},"volleyball":{"id":"volleyball","name":"Volleyball","keywords":["sports","balls"],"skins":[{"unified":"1f3d0","native":"🏐"}],"version":1},"football":{"id":"football","name":"American Football","keywords":["sports","balls","NFL"],"skins":[{"unified":"1f3c8","native":"🏈"}],"version":1},"rugby_football":{"id":"rugby_football","name":"Rugby Football","keywords":["sports","team"],"skins":[{"unified":"1f3c9","native":"🏉"}],"version":1},"tennis":{"id":"tennis","name":"Tennis","keywords":["sports","balls","green"],"skins":[{"unified":"1f3be","native":"🎾"}],"version":1},"bowling":{"id":"bowling","name":"Bowling","keywords":["sports","fun","play"],"skins":[{"unified":"1f3b3","native":"🎳"}],"version":1},"cricket_bat_and_ball":{"id":"cricket_bat_and_ball","name":"Cricket Game","keywords":["bat","and","ball","sports"],"skins":[{"unified":"1f3cf","native":"🏏"}],"version":1},"field_hockey_stick_and_ball":{"id":"field_hockey_stick_and_ball","name":"Field Hockey","keywords":["stick","and","ball","sports"],"skins":[{"unified":"1f3d1","native":"🏑"}],"version":1},"ice_hockey_stick_and_puck":{"id":"ice_hockey_stick_and_puck","name":"Ice Hockey","keywords":["stick","and","puck","sports"],"skins":[{"unified":"1f3d2","native":"🏒"}],"version":1},"table_tennis_paddle_and_ball":{"id":"table_tennis_paddle_and_ball","name":"Ping Pong","keywords":["table","tennis","paddle","and","ball","sports","pingpong"],"skins":[{"unified":"1f3d3","native":"🏓"}],"version":1},"badminton_racquet_and_shuttlecock":{"id":"badminton_racquet_and_shuttlecock","name":"Badminton","keywords":["racquet","and","shuttlecock","sports"],"skins":[{"unified":"1f3f8","native":"🏸"}],"version":1},"golf":{"id":"golf","name":"Flag in Hole","keywords":["golf","sports","business","summer"],"skins":[{"unified":"26f3","native":"⛳"}],"version":1},"ice_skate":{"id":"ice_skate","name":"Ice Skate","keywords":["sports"],"skins":[{"unified":"26f8-fe0f","native":"⛸️"}],"version":1},"fishing_pole_and_fish":{"id":"fishing_pole_and_fish","name":"Fishing Pole","keywords":["and","fish","food","hobby","summer"],"skins":[{"unified":"1f3a3","native":"🎣"}],"version":1},"running_shirt_with_sash":{"id":"running_shirt_with_sash","name":"Running Shirt","keywords":["with","sash","play","pageant"],"skins":[{"unified":"1f3bd","native":"🎽"}],"version":1},"ski":{"id":"ski","name":"Skis","keywords":["ski","sports","winter","cold","snow"],"skins":[{"unified":"1f3bf","native":"🎿"}],"version":1},"dart":{"id":"dart","name":"Bullseye","keywords":["dart","direct","hit","game","play","bar","target"],"skins":[{"unified":"1f3af","native":"🎯"}],"version":1},"gun":{"id":"gun","name":"Pistol","keywords":["gun","violence","weapon","revolver"],"skins":[{"unified":"1f52b","native":"🔫"}],"version":1},"8ball":{"id":"8ball","name":"Billiards","keywords":["8ball","pool","8","ball","hobby","game","luck","magic"],"skins":[{"unified":"1f3b1","native":"🎱"}],"version":1},"crystal_ball":{"id":"crystal_ball","name":"Crystal Ball","keywords":["disco","party","magic","circus","fortune","teller"],"skins":[{"unified":"1f52e","native":"🔮"}],"version":1},"video_game":{"id":"video_game","name":"Video Game","keywords":["play","console","PS4","controller"],"skins":[{"unified":"1f3ae","native":"🎮"}],"version":1},"joystick":{"id":"joystick","name":"Joystick","keywords":["game","play"],"skins":[{"unified":"1f579-fe0f","native":"🕹️"}],"version":1},"slot_machine":{"id":"slot_machine","name":"Slot Machine","keywords":["bet","gamble","vegas","fruit","luck","casino"],"skins":[{"unified":"1f3b0","native":"🎰"}],"version":1},"game_die":{"id":"game_die","name":"Game Die","keywords":["dice","random","tabletop","play","luck"],"skins":[{"unified":"1f3b2","native":"🎲"}],"version":1},"spades":{"id":"spades","name":"Spade Suit","keywords":["spades","poker","cards","suits","magic"],"skins":[{"unified":"2660-fe0f","native":"♠️"}],"version":1},"hearts":{"id":"hearts","name":"Heart Suit","keywords":["hearts","poker","cards","magic","suits"],"skins":[{"unified":"2665-fe0f","native":"♥️"}],"version":1},"diamonds":{"id":"diamonds","name":"Diamond Suit","keywords":["diamonds","poker","cards","magic","suits"],"skins":[{"unified":"2666-fe0f","native":"♦️"}],"version":1},"clubs":{"id":"clubs","name":"Club Suit","keywords":["clubs","poker","cards","magic","suits"],"skins":[{"unified":"2663-fe0f","native":"♣️"}],"version":1},"black_joker":{"id":"black_joker","name":"Joker","keywords":["black","poker","cards","game","play","magic"],"skins":[{"unified":"1f0cf","native":"🃏"}],"version":1},"mahjong":{"id":"mahjong","name":"Mahjong Red Dragon","keywords":["game","play","chinese","kanji"],"skins":[{"unified":"1f004","native":"🀄"}],"version":1},"flower_playing_cards":{"id":"flower_playing_cards","name":"Flower Playing Cards","keywords":["game","sunset","red"],"skins":[{"unified":"1f3b4","native":"🎴"}],"version":1},"performing_arts":{"id":"performing_arts","name":"Performing Arts","keywords":["acting","theater","drama"],"skins":[{"unified":"1f3ad","native":"🎭"}],"version":1},"frame_with_picture":{"id":"frame_with_picture","name":"Framed Picture","keywords":["frame","with","photography"],"skins":[{"unified":"1f5bc-fe0f","native":"🖼️"}],"version":1},"art":{"id":"art","name":"Artist Palette","keywords":["art","design","paint","draw","colors"],"skins":[{"unified":"1f3a8","native":"🎨"}],"version":1},"eyeglasses":{"id":"eyeglasses","name":"Glasses","keywords":["eyeglasses","fashion","accessories","eyesight","nerdy","dork","geek"],"skins":[{"unified":"1f453","native":"👓"}],"version":1},"dark_sunglasses":{"id":"dark_sunglasses","name":"Sunglasses","keywords":["dark","face","cool","accessories"],"skins":[{"unified":"1f576-fe0f","native":"🕶️"}],"version":1},"necktie":{"id":"necktie","name":"Necktie","keywords":["shirt","suitup","formal","fashion","cloth","business"],"skins":[{"unified":"1f454","native":"👔"}],"version":1},"shirt":{"id":"shirt","name":"T-Shirt","keywords":["shirt","tshirt","t","fashion","cloth","casual","tee"],"skins":[{"unified":"1f455","native":"👕"}],"version":1},"jeans":{"id":"jeans","name":"Jeans","keywords":["fashion","shopping"],"skins":[{"unified":"1f456","native":"👖"}],"version":1},"dress":{"id":"dress","name":"Dress","keywords":["clothes","fashion","shopping"],"skins":[{"unified":"1f457","native":"👗"}],"version":1},"kimono":{"id":"kimono","name":"Kimono","keywords":["dress","fashion","women","female","japanese"],"skins":[{"unified":"1f458","native":"👘"}],"version":1},"bikini":{"id":"bikini","name":"Bikini","keywords":["swimming","female","woman","girl","fashion","beach","summer"],"skins":[{"unified":"1f459","native":"👙"}],"version":1},"womans_clothes":{"id":"womans_clothes","name":"Womans Clothes","keywords":["woman","s","fashion","shopping","bags","female"],"skins":[{"unified":"1f45a","native":"👚"}],"version":1},"purse":{"id":"purse","name":"Purse","keywords":["fashion","accessories","money","sales","shopping"],"skins":[{"unified":"1f45b","native":"👛"}],"version":1},"handbag":{"id":"handbag","name":"Handbag","keywords":["fashion","accessory","accessories","shopping"],"skins":[{"unified":"1f45c","native":"👜"}],"version":1},"pouch":{"id":"pouch","name":"Pouch","keywords":["clutch","bag","accessories","shopping"],"skins":[{"unified":"1f45d","native":"👝"}],"version":1},"shopping_bags":{"id":"shopping_bags","name":"Shopping Bags","keywords":["mall","buy","purchase"],"skins":[{"unified":"1f6cd-fe0f","native":"🛍️"}],"version":1},"school_satchel":{"id":"school_satchel","name":"Backpack","keywords":["school","satchel","student","education","bag"],"skins":[{"unified":"1f392","native":"🎒"}],"version":1},"mans_shoe":{"id":"mans_shoe","name":"Mans Shoe","keywords":["man","s","fashion","male"],"skins":[{"unified":"1f45e","native":"👞"}],"version":1},"athletic_shoe":{"id":"athletic_shoe","name":"Running Shoe","keywords":["athletic","shoes","sports","sneakers"],"skins":[{"unified":"1f45f","native":"👟"}],"version":1},"high_heel":{"id":"high_heel","name":"High-Heeled Shoe","keywords":["high","heel","heeled","fashion","shoes","female","pumps","stiletto"],"skins":[{"unified":"1f460","native":"👠"}],"version":1},"sandal":{"id":"sandal","name":"Womans Sandal","keywords":["woman","s","shoes","fashion","flip","flops"],"skins":[{"unified":"1f461","native":"👡"}],"version":1},"boot":{"id":"boot","name":"Womans Boots","keywords":["boot","woman","s","shoes","fashion"],"skins":[{"unified":"1f462","native":"👢"}],"version":1},"crown":{"id":"crown","name":"Crown","keywords":["king","kod","leader","royalty","lord"],"skins":[{"unified":"1f451","native":"👑"}],"version":1},"womans_hat":{"id":"womans_hat","name":"Womans Hat","keywords":["woman","s","fashion","accessories","female","lady","spring"],"skins":[{"unified":"1f452","native":"👒"}],"version":1},"tophat":{"id":"tophat","name":"Top Hat","keywords":["tophat","magic","gentleman","classy","circus"],"skins":[{"unified":"1f3a9","native":"🎩"}],"version":1},"mortar_board":{"id":"mortar_board","name":"Graduation Cap","keywords":["mortar","board","school","college","degree","university","hat","legal","learn","education"],"skins":[{"unified":"1f393","native":"🎓"}],"version":1},"helmet_with_white_cross":{"id":"helmet_with_white_cross","name":"Rescue Worker’s Helmet","keywords":["with","white","cross","worker","s","construction","build"],"skins":[{"unified":"26d1-fe0f","native":"⛑️"}],"version":1},"prayer_beads":{"id":"prayer_beads","name":"Prayer Beads","keywords":["dhikr","religious"],"skins":[{"unified":"1f4ff","native":"📿"}],"version":1},"lipstick":{"id":"lipstick","name":"Lipstick","keywords":["female","girl","fashion","woman"],"skins":[{"unified":"1f484","native":"💄"}],"version":1},"ring":{"id":"ring","name":"Ring","keywords":["wedding","propose","marriage","valentines","diamond","fashion","jewelry","gem","engagement"],"skins":[{"unified":"1f48d","native":"💍"}],"version":1},"gem":{"id":"gem","name":"Gem Stone","keywords":["blue","ruby","diamond","jewelry"],"skins":[{"unified":"1f48e","native":"💎"}],"version":1},"mute":{"id":"mute","name":"Muted Speaker","keywords":["mute","sound","volume","silence","quiet"],"skins":[{"unified":"1f507","native":"🔇"}],"version":1},"speaker":{"id":"speaker","name":"Speaker","keywords":["low","volume","sound","silence","broadcast"],"skins":[{"unified":"1f508","native":"🔈"}],"version":1},"sound":{"id":"sound","name":"Speaker Medium Volume","keywords":["sound","broadcast"],"skins":[{"unified":"1f509","native":"🔉"}],"version":1},"loud_sound":{"id":"loud_sound","name":"Speaker High Volume","keywords":["loud","sound","noise","noisy","broadcast"],"skins":[{"unified":"1f50a","native":"🔊"}],"version":1},"loudspeaker":{"id":"loudspeaker","name":"Loudspeaker","keywords":["volume","sound"],"skins":[{"unified":"1f4e2","native":"📢"}],"version":1},"mega":{"id":"mega","name":"Megaphone","keywords":["mega","sound","speaker","volume"],"skins":[{"unified":"1f4e3","native":"📣"}],"version":1},"postal_horn":{"id":"postal_horn","name":"Postal Horn","keywords":["instrument","music"],"skins":[{"unified":"1f4ef","native":"📯"}],"version":1},"bell":{"id":"bell","name":"Bell","keywords":["sound","notification","christmas","xmas","chime"],"skins":[{"unified":"1f514","native":"🔔"}],"version":1},"no_bell":{"id":"no_bell","name":"Bell with Slash","keywords":["no","sound","volume","mute","quiet","silent"],"skins":[{"unified":"1f515","native":"🔕"}],"version":1},"musical_score":{"id":"musical_score","name":"Musical Score","keywords":["treble","clef","compose"],"skins":[{"unified":"1f3bc","native":"🎼"}],"version":1},"musical_note":{"id":"musical_note","name":"Musical Note","keywords":["score","tone","sound"],"skins":[{"unified":"1f3b5","native":"🎵"}],"version":1},"notes":{"id":"notes","name":"Musical Notes","keywords":["music","score"],"skins":[{"unified":"1f3b6","native":"🎶"}],"version":1},"studio_microphone":{"id":"studio_microphone","name":"Studio Microphone","keywords":["sing","recording","artist","talkshow"],"skins":[{"unified":"1f399-fe0f","native":"🎙️"}],"version":1},"level_slider":{"id":"level_slider","name":"Level Slider","keywords":["scale"],"skins":[{"unified":"1f39a-fe0f","native":"🎚️"}],"version":1},"control_knobs":{"id":"control_knobs","name":"Control Knobs","keywords":["dial"],"skins":[{"unified":"1f39b-fe0f","native":"🎛️"}],"version":1},"microphone":{"id":"microphone","name":"Microphone","keywords":["sound","music","PA","sing","talkshow"],"skins":[{"unified":"1f3a4","native":"🎤"}],"version":1},"headphones":{"id":"headphones","name":"Headphone","keywords":["headphones","music","score","gadgets"],"skins":[{"unified":"1f3a7","native":"🎧"}],"version":1},"radio":{"id":"radio","name":"Radio","keywords":["communication","music","podcast","program"],"skins":[{"unified":"1f4fb","native":"📻"}],"version":1},"saxophone":{"id":"saxophone","name":"Saxophone","keywords":["music","instrument","jazz","blues"],"skins":[{"unified":"1f3b7","native":"🎷"}],"version":1},"guitar":{"id":"guitar","name":"Guitar","keywords":["music","instrument"],"skins":[{"unified":"1f3b8","native":"🎸"}],"version":1},"musical_keyboard":{"id":"musical_keyboard","name":"Musical Keyboard","keywords":["piano","instrument","compose"],"skins":[{"unified":"1f3b9","native":"🎹"}],"version":1},"trumpet":{"id":"trumpet","name":"Trumpet","keywords":["music","brass"],"skins":[{"unified":"1f3ba","native":"🎺"}],"version":1},"violin":{"id":"violin","name":"Violin","keywords":["music","instrument","orchestra","symphony"],"skins":[{"unified":"1f3bb","native":"🎻"}],"version":1},"iphone":{"id":"iphone","name":"Mobile Phone","keywords":["iphone","technology","apple","gadgets","dial"],"skins":[{"unified":"1f4f1","native":"📱"}],"version":1},"calling":{"id":"calling","name":"Mobile Phone with Arrow","keywords":["calling","iphone","incoming"],"skins":[{"unified":"1f4f2","native":"📲"}],"version":1},"phone":{"id":"phone","name":"Telephone","keywords":["phone","technology","communication","dial"],"skins":[{"unified":"260e-fe0f","native":"☎️"}],"version":1},"telephone_receiver":{"id":"telephone_receiver","name":"Telephone Receiver","keywords":["technology","communication","dial"],"skins":[{"unified":"1f4de","native":"📞"}],"version":1},"pager":{"id":"pager","name":"Pager","keywords":["bbcall","oldschool","90s"],"skins":[{"unified":"1f4df","native":"📟"}],"version":1},"fax":{"id":"fax","name":"Fax Machine","keywords":["communication","technology"],"skins":[{"unified":"1f4e0","native":"📠"}],"version":1},"battery":{"id":"battery","name":"Battery","keywords":["power","energy","sustain"],"skins":[{"unified":"1f50b","native":"🔋"}],"version":1},"electric_plug":{"id":"electric_plug","name":"Electric Plug","keywords":["charger","power"],"skins":[{"unified":"1f50c","native":"🔌"}],"version":1},"computer":{"id":"computer","name":"Laptop","keywords":["computer","technology","screen","display","monitor"],"skins":[{"unified":"1f4bb","native":"💻"}],"version":1},"desktop_computer":{"id":"desktop_computer","name":"Desktop Computer","keywords":["technology","computing","screen"],"skins":[{"unified":"1f5a5-fe0f","native":"🖥️"}],"version":1},"printer":{"id":"printer","name":"Printer","keywords":["paper","ink"],"skins":[{"unified":"1f5a8-fe0f","native":"🖨️"}],"version":1},"keyboard":{"id":"keyboard","name":"Keyboard","keywords":["technology","computer","type","input","text"],"skins":[{"unified":"2328-fe0f","native":"⌨️"}],"version":1},"three_button_mouse":{"id":"three_button_mouse","name":"Computer Mouse","keywords":["three","button","click"],"skins":[{"unified":"1f5b1-fe0f","native":"🖱️"}],"version":1},"trackball":{"id":"trackball","name":"Trackball","keywords":["technology","trackpad"],"skins":[{"unified":"1f5b2-fe0f","native":"🖲️"}],"version":1},"minidisc":{"id":"minidisc","name":"Minidisc","keywords":["computer","disk","technology","record","data","90s"],"skins":[{"unified":"1f4bd","native":"💽"}],"version":1},"floppy_disk":{"id":"floppy_disk","name":"Floppy Disk","keywords":["oldschool","technology","save","90s","80s"],"skins":[{"unified":"1f4be","native":"💾"}],"version":1},"cd":{"id":"cd","name":"Optical Disc","keywords":["cd","disk","technology","dvd","90s"],"skins":[{"unified":"1f4bf","native":"💿"}],"version":1},"dvd":{"id":"dvd","name":"Dvd","keywords":["cd","disk","disc"],"skins":[{"unified":"1f4c0","native":"📀"}],"version":1},"movie_camera":{"id":"movie_camera","name":"Movie Camera","keywords":["film","record"],"skins":[{"unified":"1f3a5","native":"🎥"}],"version":1},"film_frames":{"id":"film_frames","name":"Film Frames","keywords":["movie"],"skins":[{"unified":"1f39e-fe0f","native":"🎞️"}],"version":1},"film_projector":{"id":"film_projector","name":"Film Projector","keywords":["video","tape","record","movie"],"skins":[{"unified":"1f4fd-fe0f","native":"📽️"}],"version":1},"clapper":{"id":"clapper","name":"Clapper Board","keywords":["movie","film","record"],"skins":[{"unified":"1f3ac","native":"🎬"}],"version":1},"tv":{"id":"tv","name":"Television","keywords":["tv","technology","program","oldschool","show"],"skins":[{"unified":"1f4fa","native":"📺"}],"version":1},"camera":{"id":"camera","name":"Camera","keywords":["gadgets","photography"],"skins":[{"unified":"1f4f7","native":"📷"}],"version":1},"camera_with_flash":{"id":"camera_with_flash","name":"Camera with Flash","keywords":["photography","gadgets"],"skins":[{"unified":"1f4f8","native":"📸"}],"version":1},"video_camera":{"id":"video_camera","name":"Video Camera","keywords":["film","record"],"skins":[{"unified":"1f4f9","native":"📹"}],"version":1},"vhs":{"id":"vhs","name":"Videocassette","keywords":["vhs","record","video","oldschool","90s","80s"],"skins":[{"unified":"1f4fc","native":"📼"}],"version":1},"mag":{"id":"mag","name":"Magnifying Glass Tilted Left","keywords":["mag","search","zoom","find","detective"],"skins":[{"unified":"1f50d","native":"🔍"}],"version":1},"mag_right":{"id":"mag_right","name":"Magnifying Glass Tilted Right","keywords":["mag","search","zoom","find","detective"],"skins":[{"unified":"1f50e","native":"🔎"}],"version":1},"candle":{"id":"candle","name":"Candle","keywords":["fire","wax"],"skins":[{"unified":"1f56f-fe0f","native":"🕯️"}],"version":1},"bulb":{"id":"bulb","name":"Light Bulb","keywords":["electricity","idea"],"skins":[{"unified":"1f4a1","native":"💡"}],"version":1},"flashlight":{"id":"flashlight","name":"Flashlight","keywords":["dark","camping","sight","night"],"skins":[{"unified":"1f526","native":"🔦"}],"version":1},"izakaya_lantern":{"id":"izakaya_lantern","name":"Izakaya Lantern","keywords":["red","paper","light","halloween","spooky"],"skins":[{"unified":"1f3ee","native":"🏮"}],"version":1},"notebook_with_decorative_cover":{"id":"notebook_with_decorative_cover","name":"Notebook with Decorative Cover","keywords":["classroom","notes","record","paper","study"],"skins":[{"unified":"1f4d4","native":"📔"}],"version":1},"closed_book":{"id":"closed_book","name":"Closed Book","keywords":["read","library","knowledge","textbook","learn"],"skins":[{"unified":"1f4d5","native":"📕"}],"version":1},"book":{"id":"book","name":"Open Book","keywords":["read","library","knowledge","literature","learn","study"],"skins":[{"unified":"1f4d6","native":"📖"}],"version":1},"green_book":{"id":"green_book","name":"Green Book","keywords":["read","library","knowledge","study"],"skins":[{"unified":"1f4d7","native":"📗"}],"version":1},"blue_book":{"id":"blue_book","name":"Blue Book","keywords":["read","library","knowledge","learn","study"],"skins":[{"unified":"1f4d8","native":"📘"}],"version":1},"orange_book":{"id":"orange_book","name":"Orange Book","keywords":["read","library","knowledge","textbook","study"],"skins":[{"unified":"1f4d9","native":"📙"}],"version":1},"books":{"id":"books","name":"Books","keywords":["literature","library","study"],"skins":[{"unified":"1f4da","native":"📚"}],"version":1},"notebook":{"id":"notebook","name":"Notebook","keywords":["stationery","record","notes","paper","study"],"skins":[{"unified":"1f4d3","native":"📓"}],"version":1},"ledger":{"id":"ledger","name":"Ledger","keywords":["notes","paper"],"skins":[{"unified":"1f4d2","native":"📒"}],"version":1},"page_with_curl":{"id":"page_with_curl","name":"Page with Curl","keywords":["documents","office","paper"],"skins":[{"unified":"1f4c3","native":"📃"}],"version":1},"scroll":{"id":"scroll","name":"Scroll","keywords":["documents","ancient","history","paper"],"skins":[{"unified":"1f4dc","native":"📜"}],"version":1},"page_facing_up":{"id":"page_facing_up","name":"Page Facing Up","keywords":["documents","office","paper","information"],"skins":[{"unified":"1f4c4","native":"📄"}],"version":1},"newspaper":{"id":"newspaper","name":"Newspaper","keywords":["press","headline"],"skins":[{"unified":"1f4f0","native":"📰"}],"version":1},"rolled_up_newspaper":{"id":"rolled_up_newspaper","name":"Rolled-Up Newspaper","keywords":["rolled","up","press","headline"],"skins":[{"unified":"1f5de-fe0f","native":"🗞️"}],"version":1},"bookmark_tabs":{"id":"bookmark_tabs","name":"Bookmark Tabs","keywords":["favorite","save","order","tidy"],"skins":[{"unified":"1f4d1","native":"📑"}],"version":1},"bookmark":{"id":"bookmark","name":"Bookmark","keywords":["favorite","label","save"],"skins":[{"unified":"1f516","native":"🔖"}],"version":1},"label":{"id":"label","name":"Label","keywords":["sale","tag"],"skins":[{"unified":"1f3f7-fe0f","native":"🏷️"}],"version":1},"moneybag":{"id":"moneybag","name":"Money Bag","keywords":["moneybag","dollar","payment","coins","sale"],"skins":[{"unified":"1f4b0","native":"💰"}],"version":1},"yen":{"id":"yen","name":"Yen Banknote","keywords":["money","sales","japanese","dollar","currency"],"skins":[{"unified":"1f4b4","native":"💴"}],"version":1},"dollar":{"id":"dollar","name":"Dollar Banknote","keywords":["money","sales","bill","currency"],"skins":[{"unified":"1f4b5","native":"💵"}],"version":1},"euro":{"id":"euro","name":"Euro Banknote","keywords":["money","sales","dollar","currency"],"skins":[{"unified":"1f4b6","native":"💶"}],"version":1},"pound":{"id":"pound","name":"Pound Banknote","keywords":["british","sterling","money","sales","bills","uk","england","currency"],"skins":[{"unified":"1f4b7","native":"💷"}],"version":1},"money_with_wings":{"id":"money_with_wings","name":"Money with Wings","keywords":["dollar","bills","payment","sale"],"skins":[{"unified":"1f4b8","native":"💸"}],"version":1},"credit_card":{"id":"credit_card","name":"Credit Card","keywords":["money","sales","dollar","bill","payment","shopping"],"skins":[{"unified":"1f4b3","native":"💳"}],"version":1},"chart":{"id":"chart","name":"Chart Increasing with Yen","keywords":["green","square","graph","presentation","stats"],"skins":[{"unified":"1f4b9","native":"💹"}],"version":1},"email":{"id":"email","name":"Envelope","keywords":["email","letter","postal","inbox","communication"],"skins":[{"unified":"2709-fe0f","native":"✉️"}],"version":1},"e-mail":{"id":"e-mail","name":"E-Mail","keywords":["e","mail","communication","inbox"],"skins":[{"unified":"1f4e7","native":"📧"}],"version":1},"incoming_envelope":{"id":"incoming_envelope","name":"Incoming Envelope","keywords":["email","inbox"],"skins":[{"unified":"1f4e8","native":"📨"}],"version":1},"envelope_with_arrow":{"id":"envelope_with_arrow","name":"Envelope with Arrow","keywords":["email","communication"],"skins":[{"unified":"1f4e9","native":"📩"}],"version":1},"outbox_tray":{"id":"outbox_tray","name":"Outbox Tray","keywords":["inbox","email"],"skins":[{"unified":"1f4e4","native":"📤"}],"version":1},"inbox_tray":{"id":"inbox_tray","name":"Inbox Tray","keywords":["email","documents"],"skins":[{"unified":"1f4e5","native":"📥"}],"version":1},"package":{"id":"package","name":"Package","keywords":["mail","gift","cardboard","box","moving"],"skins":[{"unified":"1f4e6","native":"📦"}],"version":1},"mailbox":{"id":"mailbox","name":"Closed Mailbox with Raised Flag","keywords":["email","inbox","communication"],"skins":[{"unified":"1f4eb","native":"📫"}],"version":1},"mailbox_closed":{"id":"mailbox_closed","name":"Closed Mailbox with Lowered Flag","keywords":["email","communication","inbox"],"skins":[{"unified":"1f4ea","native":"📪"}],"version":1},"mailbox_with_mail":{"id":"mailbox_with_mail","name":"Open Mailbox with Raised Flag","keywords":["mail","email","inbox","communication"],"skins":[{"unified":"1f4ec","native":"📬"}],"version":1},"mailbox_with_no_mail":{"id":"mailbox_with_no_mail","name":"Open Mailbox with Lowered Flag","keywords":["no","mail","email","inbox"],"skins":[{"unified":"1f4ed","native":"📭"}],"version":1},"postbox":{"id":"postbox","name":"Postbox","keywords":["email","letter","envelope"],"skins":[{"unified":"1f4ee","native":"📮"}],"version":1},"ballot_box_with_ballot":{"id":"ballot_box_with_ballot","name":"Ballot Box with Ballot","keywords":["election","vote"],"skins":[{"unified":"1f5f3-fe0f","native":"🗳️"}],"version":1},"pencil2":{"id":"pencil2","name":"Pencil","keywords":["pencil2","stationery","write","paper","writing","school","study"],"skins":[{"unified":"270f-fe0f","native":"✏️"}],"version":1},"black_nib":{"id":"black_nib","name":"Black Nib","keywords":["pen","stationery","writing","write"],"skins":[{"unified":"2712-fe0f","native":"✒️"}],"version":1},"lower_left_fountain_pen":{"id":"lower_left_fountain_pen","name":"Fountain Pen","keywords":["lower","left","stationery","writing","write"],"skins":[{"unified":"1f58b-fe0f","native":"🖋️"}],"version":1},"lower_left_ballpoint_pen":{"id":"lower_left_ballpoint_pen","name":"Pen","keywords":["lower","left","ballpoint","stationery","writing","write"],"skins":[{"unified":"1f58a-fe0f","native":"🖊️"}],"version":1},"lower_left_paintbrush":{"id":"lower_left_paintbrush","name":"Paintbrush","keywords":["lower","left","drawing","creativity","art"],"skins":[{"unified":"1f58c-fe0f","native":"🖌️"}],"version":1},"lower_left_crayon":{"id":"lower_left_crayon","name":"Crayon","keywords":["lower","left","drawing","creativity"],"skins":[{"unified":"1f58d-fe0f","native":"🖍️"}],"version":1},"memo":{"id":"memo","name":"Memo","keywords":["pencil","write","documents","stationery","paper","writing","legal","exam","quiz","test","study","compose"],"skins":[{"unified":"1f4dd","native":"📝"}],"version":1},"briefcase":{"id":"briefcase","name":"Briefcase","keywords":["business","documents","work","law","legal","job","career"],"skins":[{"unified":"1f4bc","native":"💼"}],"version":1},"file_folder":{"id":"file_folder","name":"File Folder","keywords":["documents","business","office"],"skins":[{"unified":"1f4c1","native":"📁"}],"version":1},"open_file_folder":{"id":"open_file_folder","name":"Open File Folder","keywords":["documents","load"],"skins":[{"unified":"1f4c2","native":"📂"}],"version":1},"card_index_dividers":{"id":"card_index_dividers","name":"Card Index Dividers","keywords":["organizing","business","stationery"],"skins":[{"unified":"1f5c2-fe0f","native":"🗂️"}],"version":1},"date":{"id":"date","name":"Calendar","keywords":["date","schedule"],"skins":[{"unified":"1f4c5","native":"📅"}],"version":1},"calendar":{"id":"calendar","name":"Tear-off Calendar","keywords":["tear","off","schedule","date","planning"],"skins":[{"unified":"1f4c6","native":"📆"}],"version":1},"spiral_note_pad":{"id":"spiral_note_pad","name":"Spiral Notepad","keywords":["note","pad","memo","stationery"],"skins":[{"unified":"1f5d2-fe0f","native":"🗒️"}],"version":1},"spiral_calendar_pad":{"id":"spiral_calendar_pad","name":"Spiral Calendar","keywords":["pad","date","schedule","planning"],"skins":[{"unified":"1f5d3-fe0f","native":"🗓️"}],"version":1},"card_index":{"id":"card_index","name":"Card Index","keywords":["business","stationery"],"skins":[{"unified":"1f4c7","native":"📇"}],"version":1},"chart_with_upwards_trend":{"id":"chart_with_upwards_trend","name":"Chart Increasing","keywords":["with","upwards","trend","graph","presentation","stats","recovery","business","economics","money","sales","good","success"],"skins":[{"unified":"1f4c8","native":"📈"}],"version":1},"chart_with_downwards_trend":{"id":"chart_with_downwards_trend","name":"Chart Decreasing","keywords":["with","downwards","trend","graph","presentation","stats","recession","business","economics","money","sales","bad","failure"],"skins":[{"unified":"1f4c9","native":"📉"}],"version":1},"bar_chart":{"id":"bar_chart","name":"Bar Chart","keywords":["graph","presentation","stats"],"skins":[{"unified":"1f4ca","native":"📊"}],"version":1},"clipboard":{"id":"clipboard","name":"Clipboard","keywords":["stationery","documents"],"skins":[{"unified":"1f4cb","native":"📋"}],"version":1},"pushpin":{"id":"pushpin","name":"Pushpin","keywords":["stationery","mark","here"],"skins":[{"unified":"1f4cc","native":"📌"}],"version":1},"round_pushpin":{"id":"round_pushpin","name":"Round Pushpin","keywords":["stationery","location","map","here"],"skins":[{"unified":"1f4cd","native":"📍"}],"version":1},"paperclip":{"id":"paperclip","name":"Paperclip","keywords":["documents","stationery"],"skins":[{"unified":"1f4ce","native":"📎"}],"version":1},"linked_paperclips":{"id":"linked_paperclips","name":"Linked Paperclips","keywords":["documents","stationery"],"skins":[{"unified":"1f587-fe0f","native":"🖇️"}],"version":1},"straight_ruler":{"id":"straight_ruler","name":"Straight Ruler","keywords":["stationery","calculate","length","math","school","drawing","architect","sketch"],"skins":[{"unified":"1f4cf","native":"📏"}],"version":1},"triangular_ruler":{"id":"triangular_ruler","name":"Triangular Ruler","keywords":["stationery","math","architect","sketch"],"skins":[{"unified":"1f4d0","native":"📐"}],"version":1},"scissors":{"id":"scissors","name":"Scissors","keywords":["stationery","cut"],"skins":[{"unified":"2702-fe0f","native":"✂️"}],"version":1},"card_file_box":{"id":"card_file_box","name":"Card File Box","keywords":["business","stationery"],"skins":[{"unified":"1f5c3-fe0f","native":"🗃️"}],"version":1},"file_cabinet":{"id":"file_cabinet","name":"File Cabinet","keywords":["filing","organizing"],"skins":[{"unified":"1f5c4-fe0f","native":"🗄️"}],"version":1},"wastebasket":{"id":"wastebasket","name":"Wastebasket","keywords":["bin","trash","rubbish","garbage","toss"],"skins":[{"unified":"1f5d1-fe0f","native":"🗑️"}],"version":1},"lock":{"id":"lock","name":"Lock","keywords":["locked","security","password","padlock"],"skins":[{"unified":"1f512","native":"🔒"}],"version":1},"unlock":{"id":"unlock","name":"Unlocked","keywords":["unlock","privacy","security"],"skins":[{"unified":"1f513","native":"🔓"}],"version":1},"lock_with_ink_pen":{"id":"lock_with_ink_pen","name":"Locked with Pen","keywords":["lock","ink","security","secret"],"skins":[{"unified":"1f50f","native":"🔏"}],"version":1},"closed_lock_with_key":{"id":"closed_lock_with_key","name":"Locked with Key","keywords":["closed","lock","security","privacy"],"skins":[{"unified":"1f510","native":"🔐"}],"version":1},"key":{"id":"key","name":"Key","keywords":["lock","door","password"],"skins":[{"unified":"1f511","native":"🔑"}],"version":1},"old_key":{"id":"old_key","name":"Old Key","keywords":["lock","door","password"],"skins":[{"unified":"1f5dd-fe0f","native":"🗝️"}],"version":1},"hammer":{"id":"hammer","name":"Hammer","keywords":["tools","build","create"],"skins":[{"unified":"1f528","native":"🔨"}],"version":1},"pick":{"id":"pick","name":"Pick","keywords":["tools","dig"],"skins":[{"unified":"26cf-fe0f","native":"⛏️"}],"version":1},"hammer_and_pick":{"id":"hammer_and_pick","name":"Hammer and Pick","keywords":["tools","build","create"],"skins":[{"unified":"2692-fe0f","native":"⚒️"}],"version":1},"hammer_and_wrench":{"id":"hammer_and_wrench","name":"Hammer and Wrench","keywords":["tools","build","create"],"skins":[{"unified":"1f6e0-fe0f","native":"🛠️"}],"version":1},"dagger_knife":{"id":"dagger_knife","name":"Dagger","keywords":["knife","weapon"],"skins":[{"unified":"1f5e1-fe0f","native":"🗡️"}],"version":1},"crossed_swords":{"id":"crossed_swords","name":"Crossed Swords","keywords":["weapon"],"skins":[{"unified":"2694-fe0f","native":"⚔️"}],"version":1},"bomb":{"id":"bomb","name":"Bomb","keywords":["boom","explode","explosion","terrorism"],"skins":[{"unified":"1f4a3","native":"💣"}],"version":1},"bow_and_arrow":{"id":"bow_and_arrow","name":"Bow and Arrow","keywords":["sports"],"skins":[{"unified":"1f3f9","native":"🏹"}],"version":1},"shield":{"id":"shield","name":"Shield","keywords":["protection","security"],"skins":[{"unified":"1f6e1-fe0f","native":"🛡️"}],"version":1},"wrench":{"id":"wrench","name":"Wrench","keywords":["tools","diy","ikea","fix","maintainer"],"skins":[{"unified":"1f527","native":"🔧"}],"version":1},"nut_and_bolt":{"id":"nut_and_bolt","name":"Nut and Bolt","keywords":["handy","tools","fix"],"skins":[{"unified":"1f529","native":"🔩"}],"version":1},"gear":{"id":"gear","name":"Gear","keywords":["cog"],"skins":[{"unified":"2699-fe0f","native":"⚙️"}],"version":1},"compression":{"id":"compression","name":"Clamp","keywords":["compression","tool"],"skins":[{"unified":"1f5dc-fe0f","native":"🗜️"}],"version":1},"scales":{"id":"scales","name":"Balance Scale","keywords":["scales","law","fairness","weight"],"skins":[{"unified":"2696-fe0f","native":"⚖️"}],"version":1},"link":{"id":"link","name":"Link","keywords":["rings","url"],"skins":[{"unified":"1f517","native":"🔗"}],"version":1},"chains":{"id":"chains","name":"Chains","keywords":["lock","arrest"],"skins":[{"unified":"26d3-fe0f","native":"⛓️"}],"version":1},"alembic":{"id":"alembic","name":"Alembic","keywords":["distilling","science","experiment","chemistry"],"skins":[{"unified":"2697-fe0f","native":"⚗️"}],"version":1},"microscope":{"id":"microscope","name":"Microscope","keywords":["laboratory","experiment","zoomin","science","study"],"skins":[{"unified":"1f52c","native":"🔬"}],"version":1},"telescope":{"id":"telescope","name":"Telescope","keywords":["stars","space","zoom","science","astronomy"],"skins":[{"unified":"1f52d","native":"🔭"}],"version":1},"satellite_antenna":{"id":"satellite_antenna","name":"Satellite Antenna","keywords":["communication","future","radio","space"],"skins":[{"unified":"1f4e1","native":"📡"}],"version":1},"syringe":{"id":"syringe","name":"Syringe","keywords":["health","hospital","drugs","blood","medicine","needle","doctor","nurse"],"skins":[{"unified":"1f489","native":"💉"}],"version":1},"pill":{"id":"pill","name":"Pill","keywords":["health","medicine","doctor","pharmacy","drug"],"skins":[{"unified":"1f48a","native":"💊"}],"version":1},"door":{"id":"door","name":"Door","keywords":["house","entry","exit"],"skins":[{"unified":"1f6aa","native":"🚪"}],"version":1},"bed":{"id":"bed","name":"Bed","keywords":["sleep","rest"],"skins":[{"unified":"1f6cf-fe0f","native":"🛏️"}],"version":1},"couch_and_lamp":{"id":"couch_and_lamp","name":"Couch and Lamp","keywords":["read","chill"],"skins":[{"unified":"1f6cb-fe0f","native":"🛋️"}],"version":1},"toilet":{"id":"toilet","name":"Toilet","keywords":["restroom","wc","washroom","bathroom","potty"],"skins":[{"unified":"1f6bd","native":"🚽"}],"version":1},"shower":{"id":"shower","name":"Shower","keywords":["clean","water","bathroom"],"skins":[{"unified":"1f6bf","native":"🚿"}],"version":1},"bathtub":{"id":"bathtub","name":"Bathtub","keywords":["clean","shower","bathroom"],"skins":[{"unified":"1f6c1","native":"🛁"}],"version":1},"smoking":{"id":"smoking","name":"Cigarette","keywords":["smoking","kills","tobacco","joint","smoke"],"skins":[{"unified":"1f6ac","native":"🚬"}],"version":1},"coffin":{"id":"coffin","name":"Coffin","keywords":["vampire","dead","die","death","rip","graveyard","cemetery","casket","funeral","box"],"skins":[{"unified":"26b0-fe0f","native":"⚰️"}],"version":1},"funeral_urn":{"id":"funeral_urn","name":"Funeral Urn","keywords":["dead","die","death","rip","ashes"],"skins":[{"unified":"26b1-fe0f","native":"⚱️"}],"version":1},"moyai":{"id":"moyai","name":"Moai","keywords":["moyai","rock","easter","island"],"skins":[{"unified":"1f5ff","native":"🗿"}],"version":1},"atm":{"id":"atm","name":"Atm Sign","keywords":["money","sales","cash","blue","square","payment","bank"],"skins":[{"unified":"1f3e7","native":"🏧"}],"version":1},"put_litter_in_its_place":{"id":"put_litter_in_its_place","name":"Litter in Bin Sign","keywords":["put","its","place","blue","square","human","info"],"skins":[{"unified":"1f6ae","native":"🚮"}],"version":1},"potable_water":{"id":"potable_water","name":"Potable Water","keywords":["blue","square","liquid","restroom","cleaning","faucet"],"skins":[{"unified":"1f6b0","native":"🚰"}],"version":1},"wheelchair":{"id":"wheelchair","name":"Wheelchair Symbol","keywords":["blue","square","disabled","accessibility"],"skins":[{"unified":"267f","native":"♿"}],"version":1},"mens":{"id":"mens","name":"Men’s Room","keywords":["mens","men","s","toilet","restroom","wc","blue","square","gender","male"],"skins":[{"unified":"1f6b9","native":"🚹"}],"version":1},"womens":{"id":"womens","name":"Women’s Room","keywords":["womens","women","s","purple","square","woman","female","toilet","loo","restroom","gender"],"skins":[{"unified":"1f6ba","native":"🚺"}],"version":1},"restroom":{"id":"restroom","name":"Restroom","keywords":["blue","square","toilet","refresh","wc","gender"],"skins":[{"unified":"1f6bb","native":"🚻"}],"version":1},"baby_symbol":{"id":"baby_symbol","name":"Baby Symbol","keywords":["orange","square","child"],"skins":[{"unified":"1f6bc","native":"🚼"}],"version":1},"wc":{"id":"wc","name":"Water Closet","keywords":["wc","toilet","restroom","blue","square"],"skins":[{"unified":"1f6be","native":"🚾"}],"version":1},"passport_control":{"id":"passport_control","name":"Passport Control","keywords":["custom","blue","square"],"skins":[{"unified":"1f6c2","native":"🛂"}],"version":1},"customs":{"id":"customs","name":"Customs","keywords":["passport","border","blue","square"],"skins":[{"unified":"1f6c3","native":"🛃"}],"version":1},"baggage_claim":{"id":"baggage_claim","name":"Baggage Claim","keywords":["blue","square","airport","transport"],"skins":[{"unified":"1f6c4","native":"🛄"}],"version":1},"left_luggage":{"id":"left_luggage","name":"Left Luggage","keywords":["blue","square","travel"],"skins":[{"unified":"1f6c5","native":"🛅"}],"version":1},"warning":{"id":"warning","name":"Warning","keywords":["exclamation","wip","alert","error","problem","issue"],"skins":[{"unified":"26a0-fe0f","native":"⚠️"}],"version":1},"children_crossing":{"id":"children_crossing","name":"Children Crossing","keywords":["school","warning","danger","sign","driving","yellow","diamond"],"skins":[{"unified":"1f6b8","native":"🚸"}],"version":1},"no_entry":{"id":"no_entry","name":"No Entry","keywords":["limit","security","privacy","bad","denied","stop","circle"],"skins":[{"unified":"26d4","native":"⛔"}],"version":1},"no_entry_sign":{"id":"no_entry_sign","name":"Prohibited","keywords":["no","entry","sign","forbid","stop","limit","denied","disallow","circle"],"skins":[{"unified":"1f6ab","native":"🚫"}],"version":1},"no_bicycles":{"id":"no_bicycles","name":"No Bicycles","keywords":["cyclist","prohibited","circle"],"skins":[{"unified":"1f6b3","native":"🚳"}],"version":1},"no_smoking":{"id":"no_smoking","name":"No Smoking","keywords":["cigarette","blue","square","smell","smoke"],"skins":[{"unified":"1f6ad","native":"🚭"}],"version":1},"do_not_litter":{"id":"do_not_litter","name":"No Littering","keywords":["do","not","litter","trash","bin","garbage","circle"],"skins":[{"unified":"1f6af","native":"🚯"}],"version":1},"non-potable_water":{"id":"non-potable_water","name":"Non-Potable Water","keywords":["non","potable","drink","faucet","tap","circle"],"skins":[{"unified":"1f6b1","native":"🚱"}],"version":1},"no_pedestrians":{"id":"no_pedestrians","name":"No Pedestrians","keywords":["rules","crossing","walking","circle"],"skins":[{"unified":"1f6b7","native":"🚷"}],"version":1},"no_mobile_phones":{"id":"no_mobile_phones","name":"No Mobile Phones","keywords":["iphone","mute","circle"],"skins":[{"unified":"1f4f5","native":"📵"}],"version":1},"underage":{"id":"underage","name":"No One Under Eighteen","keywords":["underage","18","drink","pub","night","minor","circle"],"skins":[{"unified":"1f51e","native":"🔞"}],"version":1},"radioactive_sign":{"id":"radioactive_sign","name":"Radioactive","keywords":["sign","nuclear","danger"],"skins":[{"unified":"2622-fe0f","native":"☢️"}],"version":1},"biohazard_sign":{"id":"biohazard_sign","name":"Biohazard","keywords":["sign","danger"],"skins":[{"unified":"2623-fe0f","native":"☣️"}],"version":1},"arrow_up":{"id":"arrow_up","name":"Up Arrow","keywords":["blue","square","continue","top","direction"],"skins":[{"unified":"2b06-fe0f","native":"⬆️"}],"version":1},"arrow_upper_right":{"id":"arrow_upper_right","name":"Up-Right Arrow","keywords":["upper","right","up","blue","square","point","direction","diagonal","northeast"],"skins":[{"unified":"2197-fe0f","native":"↗️"}],"version":1},"arrow_right":{"id":"arrow_right","name":"Right Arrow","keywords":["blue","square","next"],"skins":[{"unified":"27a1-fe0f","native":"➡️"}],"version":1},"arrow_lower_right":{"id":"arrow_lower_right","name":"South East Arrow","keywords":["lower","right","down","blue","square","direction","diagonal","southeast"],"skins":[{"unified":"2198-fe0f","native":"↘️"}],"version":1},"arrow_down":{"id":"arrow_down","name":"Down Arrow","keywords":["blue","square","direction","bottom"],"skins":[{"unified":"2b07-fe0f","native":"⬇️"}],"version":1},"arrow_lower_left":{"id":"arrow_lower_left","name":"Down-Left Arrow","keywords":["lower","left","down","blue","square","direction","diagonal","southwest"],"skins":[{"unified":"2199-fe0f","native":"↙️"}],"version":1},"arrow_left":{"id":"arrow_left","name":"Left Arrow","keywords":["blue","square","previous","back"],"skins":[{"unified":"2b05-fe0f","native":"⬅️"}],"version":1},"arrow_upper_left":{"id":"arrow_upper_left","name":"Up-Left Arrow","keywords":["upper","left","up","blue","square","point","direction","diagonal","northwest"],"skins":[{"unified":"2196-fe0f","native":"↖️"}],"version":1},"arrow_up_down":{"id":"arrow_up_down","name":"Up Down Arrow","keywords":["blue","square","direction","way","vertical"],"skins":[{"unified":"2195-fe0f","native":"↕️"}],"version":1},"left_right_arrow":{"id":"left_right_arrow","name":"Left Right Arrow","keywords":["shape","direction","horizontal","sideways"],"skins":[{"unified":"2194-fe0f","native":"↔️"}],"version":1},"leftwards_arrow_with_hook":{"id":"leftwards_arrow_with_hook","name":"Right Arrow Curving Left","keywords":["leftwards","with","hook","back","return","blue","square","undo","enter"],"skins":[{"unified":"21a9-fe0f","native":"↩️"}],"version":1},"arrow_right_hook":{"id":"arrow_right_hook","name":"Left Arrow Curving Right","keywords":["hook","blue","square","return","rotate","direction"],"skins":[{"unified":"21aa-fe0f","native":"↪️"}],"version":1},"arrow_heading_up":{"id":"arrow_heading_up","name":"Right Arrow Curving Up","keywords":["heading","blue","square","direction","top"],"skins":[{"unified":"2934-fe0f","native":"⤴️"}],"version":1},"arrow_heading_down":{"id":"arrow_heading_down","name":"Right Arrow Curving Down","keywords":["heading","blue","square","direction","bottom"],"skins":[{"unified":"2935-fe0f","native":"⤵️"}],"version":1},"arrows_clockwise":{"id":"arrows_clockwise","name":"Clockwise Vertical Arrows","keywords":["sync","cycle","round","repeat"],"skins":[{"unified":"1f503","native":"🔃"}],"version":1},"arrows_counterclockwise":{"id":"arrows_counterclockwise","name":"Counterclockwise Arrows Button","keywords":["blue","square","sync","cycle"],"skins":[{"unified":"1f504","native":"🔄"}],"version":1},"back":{"id":"back","name":"Back Arrow","keywords":["words","return"],"skins":[{"unified":"1f519","native":"🔙"}],"version":1},"end":{"id":"end","name":"End Arrow","keywords":["words"],"skins":[{"unified":"1f51a","native":"🔚"}],"version":1},"on":{"id":"on","name":"On! Arrow","keywords":["on","words"],"skins":[{"unified":"1f51b","native":"🔛"}],"version":1},"soon":{"id":"soon","name":"Soon Arrow","keywords":["words"],"skins":[{"unified":"1f51c","native":"🔜"}],"version":1},"top":{"id":"top","name":"Top Arrow","keywords":["words","blue","square"],"skins":[{"unified":"1f51d","native":"🔝"}],"version":1},"place_of_worship":{"id":"place_of_worship","name":"Place of Worship","keywords":["religion","church","temple","prayer"],"skins":[{"unified":"1f6d0","native":"🛐"}],"version":1},"atom_symbol":{"id":"atom_symbol","name":"Atom Symbol","keywords":["science","physics","chemistry"],"skins":[{"unified":"269b-fe0f","native":"⚛️"}],"version":1},"om_symbol":{"id":"om_symbol","name":"Om","keywords":["symbol","hinduism","buddhism","sikhism","jainism"],"skins":[{"unified":"1f549-fe0f","native":"🕉️"}],"version":1},"star_of_david":{"id":"star_of_david","name":"Star of David","keywords":["judaism"],"skins":[{"unified":"2721-fe0f","native":"✡️"}],"version":1},"wheel_of_dharma":{"id":"wheel_of_dharma","name":"Wheel of Dharma","keywords":["hinduism","buddhism","sikhism","jainism"],"skins":[{"unified":"2638-fe0f","native":"☸️"}],"version":1},"yin_yang":{"id":"yin_yang","name":"Yin Yang","keywords":["balance"],"skins":[{"unified":"262f-fe0f","native":"☯️"}],"version":1},"latin_cross":{"id":"latin_cross","name":"Latin Cross","keywords":["christianity"],"skins":[{"unified":"271d-fe0f","native":"✝️"}],"version":1},"orthodox_cross":{"id":"orthodox_cross","name":"Orthodox Cross","keywords":["suppedaneum","religion"],"skins":[{"unified":"2626-fe0f","native":"☦️"}],"version":1},"star_and_crescent":{"id":"star_and_crescent","name":"Star and Crescent","keywords":["islam"],"skins":[{"unified":"262a-fe0f","native":"☪️"}],"version":1},"peace_symbol":{"id":"peace_symbol","name":"Peace Symbol","keywords":["hippie"],"skins":[{"unified":"262e-fe0f","native":"☮️"}],"version":1},"menorah_with_nine_branches":{"id":"menorah_with_nine_branches","name":"Menorah","keywords":["with","nine","branches","hanukkah","candles","jewish"],"skins":[{"unified":"1f54e","native":"🕎"}],"version":1},"six_pointed_star":{"id":"six_pointed_star","name":"Dotted Six-Pointed Star","keywords":["six","pointed","purple","square","religion","jewish","hexagram"],"skins":[{"unified":"1f52f","native":"🔯"}],"version":1},"aries":{"id":"aries","name":"Aries","keywords":["sign","purple","square","zodiac","astrology"],"skins":[{"unified":"2648","native":"♈"}],"version":1},"taurus":{"id":"taurus","name":"Taurus","keywords":["purple","square","sign","zodiac","astrology"],"skins":[{"unified":"2649","native":"♉"}],"version":1},"gemini":{"id":"gemini","name":"Gemini","keywords":["sign","zodiac","purple","square","astrology"],"skins":[{"unified":"264a","native":"♊"}],"version":1},"cancer":{"id":"cancer","name":"Cancer","keywords":["sign","zodiac","purple","square","astrology"],"skins":[{"unified":"264b","native":"♋"}],"version":1},"leo":{"id":"leo","name":"Leo","keywords":["sign","purple","square","zodiac","astrology"],"skins":[{"unified":"264c","native":"♌"}],"version":1},"virgo":{"id":"virgo","name":"Virgo","keywords":["sign","zodiac","purple","square","astrology"],"skins":[{"unified":"264d","native":"♍"}],"version":1},"libra":{"id":"libra","name":"Libra","keywords":["sign","purple","square","zodiac","astrology"],"skins":[{"unified":"264e","native":"♎"}],"version":1},"scorpius":{"id":"scorpius","name":"Scorpio","keywords":["scorpius","sign","zodiac","purple","square","astrology"],"skins":[{"unified":"264f","native":"♏"}],"version":1},"sagittarius":{"id":"sagittarius","name":"Sagittarius","keywords":["sign","zodiac","purple","square","astrology"],"skins":[{"unified":"2650","native":"♐"}],"version":1},"capricorn":{"id":"capricorn","name":"Capricorn","keywords":["sign","zodiac","purple","square","astrology"],"skins":[{"unified":"2651","native":"♑"}],"version":1},"aquarius":{"id":"aquarius","name":"Aquarius","keywords":["sign","purple","square","zodiac","astrology"],"skins":[{"unified":"2652","native":"♒"}],"version":1},"pisces":{"id":"pisces","name":"Pisces","keywords":["purple","square","sign","zodiac","astrology"],"skins":[{"unified":"2653","native":"♓"}],"version":1},"ophiuchus":{"id":"ophiuchus","name":"Ophiuchus","keywords":["sign","purple","square","constellation","astrology"],"skins":[{"unified":"26ce","native":"⛎"}],"version":1},"twisted_rightwards_arrows":{"id":"twisted_rightwards_arrows","name":"Shuffle Tracks Button","keywords":["twisted","rightwards","arrows","blue","square","music","random"],"skins":[{"unified":"1f500","native":"🔀"}],"version":1},"repeat":{"id":"repeat","name":"Repeat Button","keywords":["loop","record"],"skins":[{"unified":"1f501","native":"🔁"}],"version":1},"repeat_one":{"id":"repeat_one","name":"Repeat Single Button","keywords":["one","blue","square","loop"],"skins":[{"unified":"1f502","native":"🔂"}],"version":1},"arrow_forward":{"id":"arrow_forward","name":"Play Button","keywords":["arrow","forward","blue","square","right","direction"],"skins":[{"unified":"25b6-fe0f","native":"▶️"}],"version":1},"fast_forward":{"id":"fast_forward","name":"Fast-Forward Button","keywords":["fast","forward","blue","square","play","speed","continue"],"skins":[{"unified":"23e9","native":"⏩"}],"version":1},"black_right_pointing_double_triangle_with_vertical_bar":{"id":"black_right_pointing_double_triangle_with_vertical_bar","name":"Next Track Button","keywords":["black","right","pointing","double","triangle","with","vertical","bar","forward","blue","square"],"skins":[{"unified":"23ed-fe0f","native":"⏭️"}],"version":1},"black_right_pointing_triangle_with_double_vertical_bar":{"id":"black_right_pointing_triangle_with_double_vertical_bar","name":"Play or Pause Button","keywords":["black","right","pointing","triangle","with","double","vertical","bar","blue","square"],"skins":[{"unified":"23ef-fe0f","native":"⏯️"}],"version":1},"arrow_backward":{"id":"arrow_backward","name":"Reverse Button","keywords":["arrow","backward","blue","square","left","direction"],"skins":[{"unified":"25c0-fe0f","native":"◀️"}],"version":1},"rewind":{"id":"rewind","name":"Fast Reverse Button","keywords":["rewind","play","blue","square"],"skins":[{"unified":"23ea","native":"⏪"}],"version":1},"black_left_pointing_double_triangle_with_vertical_bar":{"id":"black_left_pointing_double_triangle_with_vertical_bar","name":"Last Track Button","keywords":["black","left","pointing","double","triangle","with","vertical","bar","backward"],"skins":[{"unified":"23ee-fe0f","native":"⏮️"}],"version":1},"arrow_up_small":{"id":"arrow_up_small","name":"Upwards Button","keywords":["arrow","up","small","blue","square","triangle","direction","point","forward","top"],"skins":[{"unified":"1f53c","native":"🔼"}],"version":1},"arrow_double_up":{"id":"arrow_double_up","name":"Fast Up Button","keywords":["arrow","double","blue","square","direction","top"],"skins":[{"unified":"23eb","native":"⏫"}],"version":1},"arrow_down_small":{"id":"arrow_down_small","name":"Downwards Button","keywords":["arrow","down","small","blue","square","direction","bottom"],"skins":[{"unified":"1f53d","native":"🔽"}],"version":1},"arrow_double_down":{"id":"arrow_double_down","name":"Fast Down Button","keywords":["arrow","double","blue","square","direction","bottom"],"skins":[{"unified":"23ec","native":"⏬"}],"version":1},"double_vertical_bar":{"id":"double_vertical_bar","name":"Pause Button","keywords":["double","vertical","bar","blue","square"],"skins":[{"unified":"23f8-fe0f","native":"⏸️"}],"version":1},"black_square_for_stop":{"id":"black_square_for_stop","name":"Stop Button","keywords":["black","square","for","blue"],"skins":[{"unified":"23f9-fe0f","native":"⏹️"}],"version":1},"black_circle_for_record":{"id":"black_circle_for_record","name":"Record Button","keywords":["black","circle","for","blue","square"],"skins":[{"unified":"23fa-fe0f","native":"⏺️"}],"version":1},"eject":{"id":"eject","name":"Eject Button","keywords":["blue","square"],"skins":[{"unified":"23cf-fe0f","native":"⏏️"}],"version":1},"cinema":{"id":"cinema","name":"Cinema","keywords":["blue","square","record","film","movie","curtain","stage","theater"],"skins":[{"unified":"1f3a6","native":"🎦"}],"version":1},"low_brightness":{"id":"low_brightness","name":"Dim Button","keywords":["low","brightness","sun","afternoon","warm","summer"],"skins":[{"unified":"1f505","native":"🔅"}],"version":1},"high_brightness":{"id":"high_brightness","name":"Bright Button","keywords":["high","brightness","sun","light"],"skins":[{"unified":"1f506","native":"🔆"}],"version":1},"signal_strength":{"id":"signal_strength","name":"Antenna Bars","keywords":["signal","strength","blue","square","reception","phone","internet","connection","wifi","bluetooth"],"skins":[{"unified":"1f4f6","native":"📶"}],"version":1},"vibration_mode":{"id":"vibration_mode","name":"Vibration Mode","keywords":["orange","square","phone"],"skins":[{"unified":"1f4f3","native":"📳"}],"version":1},"mobile_phone_off":{"id":"mobile_phone_off","name":"Mobile Phone off","keywords":["mute","orange","square","silence","quiet"],"skins":[{"unified":"1f4f4","native":"📴"}],"version":1},"heavy_multiplication_x":{"id":"heavy_multiplication_x","name":"Multiply","keywords":["heavy","multiplication","x","sign","math","calculation"],"skins":[{"unified":"2716-fe0f","native":"✖️"}],"version":1},"heavy_plus_sign":{"id":"heavy_plus_sign","name":"Plus","keywords":["heavy","sign","math","calculation","addition","more","increase"],"skins":[{"unified":"2795","native":"➕"}],"version":1},"heavy_minus_sign":{"id":"heavy_minus_sign","name":"Minus","keywords":["heavy","sign","math","calculation","subtract","less"],"skins":[{"unified":"2796","native":"➖"}],"version":1},"heavy_division_sign":{"id":"heavy_division_sign","name":"Divide","keywords":["heavy","division","sign","math","calculation"],"skins":[{"unified":"2797","native":"➗"}],"version":1},"bangbang":{"id":"bangbang","name":"Double Exclamation Mark","keywords":["bangbang","surprise"],"skins":[{"unified":"203c-fe0f","native":"‼️"}],"version":1},"interrobang":{"id":"interrobang","name":"Exclamation Question Mark","keywords":["interrobang","wat","punctuation","surprise"],"skins":[{"unified":"2049-fe0f","native":"⁉️"}],"version":1},"question":{"id":"question","name":"Red Question Mark","keywords":["doubt","confused"],"skins":[{"unified":"2753","native":"❓"}],"version":1},"grey_question":{"id":"grey_question","name":"White Question Mark","keywords":["grey","doubts","gray","huh","confused"],"skins":[{"unified":"2754","native":"❔"}],"version":1},"grey_exclamation":{"id":"grey_exclamation","name":"White Exclamation Mark","keywords":["grey","surprise","punctuation","gray","wow","warning"],"skins":[{"unified":"2755","native":"❕"}],"version":1},"exclamation":{"id":"exclamation","name":"Red Exclamation Mark","keywords":["heavy","danger","surprise","punctuation","wow","warning"],"skins":[{"unified":"2757","native":"❗"}],"version":1},"wavy_dash":{"id":"wavy_dash","name":"Wavy Dash","keywords":["draw","line","moustache","mustache","squiggle","scribble"],"skins":[{"unified":"3030-fe0f","native":"〰️"}],"version":1},"currency_exchange":{"id":"currency_exchange","name":"Currency Exchange","keywords":["money","sales","dollar","travel"],"skins":[{"unified":"1f4b1","native":"💱"}],"version":1},"heavy_dollar_sign":{"id":"heavy_dollar_sign","name":"Heavy Dollar Sign","keywords":["money","sales","payment","currency","buck"],"skins":[{"unified":"1f4b2","native":"💲"}],"version":1},"recycle":{"id":"recycle","name":"Recycling Symbol","keywords":["recycle","arrow","environment","garbage","trash"],"skins":[{"unified":"267b-fe0f","native":"♻️"}],"version":1},"fleur_de_lis":{"id":"fleur_de_lis","name":"Fleur-De-Lis","keywords":["fleur","de","lis","decorative","scout"],"skins":[{"unified":"269c-fe0f","native":"⚜️"}],"version":1},"trident":{"id":"trident","name":"Trident Emblem","keywords":["weapon","spear"],"skins":[{"unified":"1f531","native":"🔱"}],"version":1},"name_badge":{"id":"name_badge","name":"Name Badge","keywords":["fire","forbid"],"skins":[{"unified":"1f4db","native":"📛"}],"version":1},"beginner":{"id":"beginner","name":"Japanese Symbol for Beginner","keywords":["badge","shield"],"skins":[{"unified":"1f530","native":"🔰"}],"version":1},"o":{"id":"o","name":"Hollow Red Circle","keywords":["o","round"],"skins":[{"unified":"2b55","native":"⭕"}],"version":1},"white_check_mark":{"id":"white_check_mark","name":"Check Mark Button","keywords":["white","green","square","ok","agree","vote","election","answer","tick"],"skins":[{"unified":"2705","native":"✅"}],"version":1},"ballot_box_with_check":{"id":"ballot_box_with_check","name":"Check Box with Check","keywords":["ballot","ok","agree","confirm","black","square","vote","election","yes","tick"],"skins":[{"unified":"2611-fe0f","native":"☑️"}],"version":1},"heavy_check_mark":{"id":"heavy_check_mark","name":"Check Mark","keywords":["heavy","ok","nike","answer","yes","tick"],"skins":[{"unified":"2714-fe0f","native":"✔️"}],"version":1},"x":{"id":"x","name":"Cross Mark","keywords":["x","no","delete","remove","cancel","red"],"skins":[{"unified":"274c","native":"❌"}],"version":1},"negative_squared_cross_mark":{"id":"negative_squared_cross_mark","name":"Cross Mark Button","keywords":["negative","squared","x","green","square","no","deny"],"skins":[{"unified":"274e","native":"❎"}],"version":1},"curly_loop":{"id":"curly_loop","name":"Curly Loop","keywords":["scribble","draw","shape","squiggle"],"skins":[{"unified":"27b0","native":"➰"}],"version":1},"loop":{"id":"loop","name":"Double Curly Loop","keywords":["tape","cassette"],"skins":[{"unified":"27bf","native":"➿"}],"version":1},"part_alternation_mark":{"id":"part_alternation_mark","name":"Part Alternation Mark","keywords":["graph","presentation","stats","business","economics","bad"],"skins":[{"unified":"303d-fe0f","native":"〽️"}],"version":1},"eight_spoked_asterisk":{"id":"eight_spoked_asterisk","name":"Eight Spoked Asterisk","keywords":["star","sparkle","green","square"],"skins":[{"unified":"2733-fe0f","native":"✳️"}],"version":1},"eight_pointed_black_star":{"id":"eight_pointed_black_star","name":"Eight-Pointed Star","keywords":["eight","pointed","black","orange","square","shape","polygon"],"skins":[{"unified":"2734-fe0f","native":"✴️"}],"version":1},"sparkle":{"id":"sparkle","name":"Sparkle","keywords":["stars","green","square","awesome","good","fireworks"],"skins":[{"unified":"2747-fe0f","native":"❇️"}],"version":1},"copyright":{"id":"copyright","name":"Copyright","keywords":["ip","license","circle","law","legal"],"skins":[{"unified":"00a9-fe0f","native":"©️"}],"version":1},"registered":{"id":"registered","name":"Registered","keywords":["alphabet","circle"],"skins":[{"unified":"00ae-fe0f","native":"®️"}],"version":1},"tm":{"id":"tm","name":"Trade Mark","keywords":["tm","trademark","brand","law","legal"],"skins":[{"unified":"2122-fe0f","native":"™️"}],"version":1},"hash":{"id":"hash","name":"Hash Key","keywords":["keycap","","symbol","blue","square","twitter"],"skins":[{"unified":"0023-fe0f-20e3","native":"#️⃣"}],"version":1},"keycap_star":{"id":"keycap_star","name":"Keycap: *","keywords":["keycap","star",""],"skins":[{"unified":"002a-fe0f-20e3","native":"*️⃣"}],"version":2},"zero":{"id":"zero","name":"Keycap 0","keywords":["zero","numbers","blue","square","null"],"skins":[{"unified":"0030-fe0f-20e3","native":"0️⃣"}],"version":1},"one":{"id":"one","name":"Keycap 1","keywords":["one","blue","square","numbers"],"skins":[{"unified":"0031-fe0f-20e3","native":"1️⃣"}],"version":1},"two":{"id":"two","name":"Keycap 2","keywords":["two","numbers","prime","blue","square"],"skins":[{"unified":"0032-fe0f-20e3","native":"2️⃣"}],"version":1},"three":{"id":"three","name":"Keycap 3","keywords":["three","numbers","prime","blue","square"],"skins":[{"unified":"0033-fe0f-20e3","native":"3️⃣"}],"version":1},"four":{"id":"four","name":"Keycap 4","keywords":["four","numbers","blue","square"],"skins":[{"unified":"0034-fe0f-20e3","native":"4️⃣"}],"version":1},"five":{"id":"five","name":"Keycap 5","keywords":["five","numbers","blue","square","prime"],"skins":[{"unified":"0035-fe0f-20e3","native":"5️⃣"}],"version":1},"six":{"id":"six","name":"Keycap 6","keywords":["six","numbers","blue","square"],"skins":[{"unified":"0036-fe0f-20e3","native":"6️⃣"}],"version":1},"seven":{"id":"seven","name":"Keycap 7","keywords":["seven","numbers","blue","square","prime"],"skins":[{"unified":"0037-fe0f-20e3","native":"7️⃣"}],"version":1},"eight":{"id":"eight","name":"Keycap 8","keywords":["eight","blue","square","numbers"],"skins":[{"unified":"0038-fe0f-20e3","native":"8️⃣"}],"version":1},"nine":{"id":"nine","name":"Keycap 9","keywords":["nine","blue","square","numbers"],"skins":[{"unified":"0039-fe0f-20e3","native":"9️⃣"}],"version":1},"keycap_ten":{"id":"keycap_ten","name":"Keycap 10","keywords":["ten","numbers","blue","square"],"skins":[{"unified":"1f51f","native":"🔟"}],"version":1},"capital_abcd":{"id":"capital_abcd","name":"Input Latin Uppercase","keywords":["capital","abcd","alphabet","words","blue","square"],"skins":[{"unified":"1f520","native":"🔠"}],"version":1},"abcd":{"id":"abcd","name":"Input Latin Lowercase","keywords":["abcd","blue","square","alphabet"],"skins":[{"unified":"1f521","native":"🔡"}],"version":1},"symbols":{"id":"symbols","name":"Input Symbols","keywords":["blue","square","music","note","ampersand","percent","glyphs","characters"],"skins":[{"unified":"1f523","native":"🔣"}],"version":1},"abc":{"id":"abc","name":"Input Latin Letters","keywords":["abc","blue","square","alphabet"],"skins":[{"unified":"1f524","native":"🔤"}],"version":1},"a":{"id":"a","name":"A Button (blood Type)","keywords":["red","square","alphabet","letter"],"skins":[{"unified":"1f170-fe0f","native":"🅰️"}],"version":1},"ab":{"id":"ab","name":"Negative Squared Ab","keywords":["button","red","square","alphabet"],"skins":[{"unified":"1f18e","native":"🆎"}],"version":1},"b":{"id":"b","name":"B Button (blood Type)","keywords":["red","square","alphabet","letter"],"skins":[{"unified":"1f171-fe0f","native":"🅱️"}],"version":1},"cl":{"id":"cl","name":"Cl Button","keywords":["alphabet","words","red","square"],"skins":[{"unified":"1f191","native":"🆑"}],"version":1},"cool":{"id":"cool","name":"Cool Button","keywords":["words","blue","square"],"skins":[{"unified":"1f192","native":"🆒"}],"version":1},"free":{"id":"free","name":"Free Button","keywords":["blue","square","words"],"skins":[{"unified":"1f193","native":"🆓"}],"version":1},"information_source":{"id":"information_source","name":"Information","keywords":["source","blue","square","alphabet","letter"],"skins":[{"unified":"2139-fe0f","native":"ℹ️"}],"version":1},"id":{"id":"id","name":"Id Button","keywords":["purple","square","words"],"skins":[{"unified":"1f194","native":"🆔"}],"version":1},"m":{"id":"m","name":"Circled M","keywords":["alphabet","blue","circle","letter"],"skins":[{"unified":"24c2-fe0f","native":"Ⓜ️"}],"version":1},"new":{"id":"new","name":"New Button","keywords":["blue","square","words","start"],"skins":[{"unified":"1f195","native":"🆕"}],"version":1},"ng":{"id":"ng","name":"Ng Button","keywords":["blue","square","words","shape","icon"],"skins":[{"unified":"1f196","native":"🆖"}],"version":1},"o2":{"id":"o2","name":"O Button (blood Type)","keywords":["o2","alphabet","red","square","letter"],"skins":[{"unified":"1f17e-fe0f","native":"🅾️"}],"version":1},"ok":{"id":"ok","name":"Ok Button","keywords":["good","agree","yes","blue","square"],"skins":[{"unified":"1f197","native":"🆗"}],"version":1},"parking":{"id":"parking","name":"P Button","keywords":["parking","cars","blue","square","alphabet","letter"],"skins":[{"unified":"1f17f-fe0f","native":"🅿️"}],"version":1},"sos":{"id":"sos","name":"Sos Button","keywords":["help","red","square","words","emergency","911"],"skins":[{"unified":"1f198","native":"🆘"}],"version":1},"up":{"id":"up","name":"Up! Button","keywords":["up","blue","square","above","high"],"skins":[{"unified":"1f199","native":"🆙"}],"version":1},"vs":{"id":"vs","name":"Vs Button","keywords":["words","orange","square"],"skins":[{"unified":"1f19a","native":"🆚"}],"version":1},"koko":{"id":"koko","name":"Squared Katakana Koko","keywords":["japanese","here","button","blue","square","destination"],"skins":[{"unified":"1f201","native":"🈁"}],"version":1},"sa":{"id":"sa","name":"Squared Katakana Sa","keywords":["japanese","service","charge","button","blue","square"],"skins":[{"unified":"1f202-fe0f","native":"🈂️"}],"version":1},"u6708":{"id":"u6708","name":"Japanese “monthly Amount” Button","keywords":["u6708","monthly","amount","chinese","month","moon","orange","square","kanji"],"skins":[{"unified":"1f237-fe0f","native":"🈷️"}],"version":1},"u6709":{"id":"u6709","name":"Squared Cjk Unified Ideograph-6709","keywords":["u6709","japanese","not","free","of","charge","button","orange","square","chinese","have","kanji"],"skins":[{"unified":"1f236","native":"🈶"}],"version":1},"u6307":{"id":"u6307","name":"Japanese “reserved” Button","keywords":["u6307","reserved","chinese","point","green","square","kanji"],"skins":[{"unified":"1f22f","native":"🈯"}],"version":1},"ideograph_advantage":{"id":"ideograph_advantage","name":"Japanese “bargain” Button","keywords":["ideograph","advantage","bargain","chinese","kanji","obtain","get","circle"],"skins":[{"unified":"1f250","native":"🉐"}],"version":1},"u5272":{"id":"u5272","name":"Japanese “discount” Button","keywords":["u5272","discount","cut","divide","chinese","kanji","pink","square"],"skins":[{"unified":"1f239","native":"🈹"}],"version":1},"u7121":{"id":"u7121","name":"Japanese “free of Charge” Button","keywords":["u7121","free","charge","nothing","chinese","kanji","orange","square"],"skins":[{"unified":"1f21a","native":"🈚"}],"version":1},"u7981":{"id":"u7981","name":"Japanese “prohibited” Button","keywords":["u7981","prohibited","kanji","chinese","forbidden","limit","restricted","red","square"],"skins":[{"unified":"1f232","native":"🈲"}],"version":1},"accept":{"id":"accept","name":"Circled Ideograph Accept","keywords":["japanese","acceptable","button","ok","good","chinese","kanji","agree","yes","orange","circle"],"skins":[{"unified":"1f251","native":"🉑"}],"version":1},"u7533":{"id":"u7533","name":"Japanese “application” Button","keywords":["u7533","application","chinese","kanji","orange","square"],"skins":[{"unified":"1f238","native":"🈸"}],"version":1},"u5408":{"id":"u5408","name":"Japanese “passing Grade” Button","keywords":["u5408","passing","grade","chinese","join","kanji","red","square"],"skins":[{"unified":"1f234","native":"🈴"}],"version":1},"u7a7a":{"id":"u7a7a","name":"Japanese “vacancy” Button","keywords":["u7a7a","vacancy","kanji","chinese","empty","sky","blue","square"],"skins":[{"unified":"1f233","native":"🈳"}],"version":1},"congratulations":{"id":"congratulations","name":"Circled Ideograph Congratulation","keywords":["congratulations","japanese","button","chinese","kanji","red","circle"],"skins":[{"unified":"3297-fe0f","native":"㊗️"}],"version":1},"secret":{"id":"secret","name":"Circled Ideograph Secret","keywords":["japanese","button","privacy","chinese","sshh","kanji","red","circle"],"skins":[{"unified":"3299-fe0f","native":"㊙️"}],"version":1},"u55b6":{"id":"u55b6","name":"Squared Cjk Unified Ideograph-55b6","keywords":["u55b6","japanese","open","for","business","button","opening","hours","orange","square"],"skins":[{"unified":"1f23a","native":"🈺"}],"version":1},"u6e80":{"id":"u6e80","name":"Japanese “no Vacancy” Button","keywords":["u6e80","no","vacancy","full","chinese","red","square","kanji"],"skins":[{"unified":"1f235","native":"🈵"}],"version":1},"red_circle":{"id":"red_circle","name":"Red Circle","keywords":["shape","error","danger"],"skins":[{"unified":"1f534","native":"🔴"}],"version":1},"large_blue_circle":{"id":"large_blue_circle","name":"Blue Circle","keywords":["large","shape","icon","button"],"skins":[{"unified":"1f535","native":"🔵"}],"version":1},"black_circle":{"id":"black_circle","name":"Black Circle","keywords":["shape","button","round"],"skins":[{"unified":"26ab","native":"⚫"}],"version":1},"white_circle":{"id":"white_circle","name":"White Circle","keywords":["shape","round"],"skins":[{"unified":"26aa","native":"⚪"}],"version":1},"black_large_square":{"id":"black_large_square","name":"Black Large Square","keywords":["shape","icon","button"],"skins":[{"unified":"2b1b","native":"⬛"}],"version":1},"white_large_square":{"id":"white_large_square","name":"White Large Square","keywords":["shape","icon","stone","button"],"skins":[{"unified":"2b1c","native":"⬜"}],"version":1},"black_medium_square":{"id":"black_medium_square","name":"Black Medium Square","keywords":["shape","button","icon"],"skins":[{"unified":"25fc-fe0f","native":"◼️"}],"version":1},"white_medium_square":{"id":"white_medium_square","name":"White Medium Square","keywords":["shape","stone","icon"],"skins":[{"unified":"25fb-fe0f","native":"◻️"}],"version":1},"black_medium_small_square":{"id":"black_medium_small_square","name":"Black Medium Small Square","keywords":["icon","shape","button"],"skins":[{"unified":"25fe","native":"◾"}],"version":1},"white_medium_small_square":{"id":"white_medium_small_square","name":"White Medium Small Square","keywords":["shape","stone","icon","button"],"skins":[{"unified":"25fd","native":"◽"}],"version":1},"black_small_square":{"id":"black_small_square","name":"Black Small Square","keywords":["shape","icon"],"skins":[{"unified":"25aa-fe0f","native":"▪️"}],"version":1},"white_small_square":{"id":"white_small_square","name":"White Small Square","keywords":["shape","icon"],"skins":[{"unified":"25ab-fe0f","native":"▫️"}],"version":1},"large_orange_diamond":{"id":"large_orange_diamond","name":"Large Orange Diamond","keywords":["shape","jewel","gem"],"skins":[{"unified":"1f536","native":"🔶"}],"version":1},"large_blue_diamond":{"id":"large_blue_diamond","name":"Large Blue Diamond","keywords":["shape","jewel","gem"],"skins":[{"unified":"1f537","native":"🔷"}],"version":1},"small_orange_diamond":{"id":"small_orange_diamond","name":"Small Orange Diamond","keywords":["shape","jewel","gem"],"skins":[{"unified":"1f538","native":"🔸"}],"version":1},"small_blue_diamond":{"id":"small_blue_diamond","name":"Small Blue Diamond","keywords":["shape","jewel","gem"],"skins":[{"unified":"1f539","native":"🔹"}],"version":1},"small_red_triangle":{"id":"small_red_triangle","name":"Red Triangle Pointed Up","keywords":["small","shape","direction","top"],"skins":[{"unified":"1f53a","native":"🔺"}],"version":1},"small_red_triangle_down":{"id":"small_red_triangle_down","name":"Red Triangle Pointed Down","keywords":["small","shape","direction","bottom"],"skins":[{"unified":"1f53b","native":"🔻"}],"version":1},"diamond_shape_with_a_dot_inside":{"id":"diamond_shape_with_a_dot_inside","name":"Diamond with a Dot","keywords":["shape","inside","jewel","blue","gem","crystal","fancy"],"skins":[{"unified":"1f4a0","native":"💠"}],"version":1},"radio_button":{"id":"radio_button","name":"Radio Button","keywords":["input","old","music","circle"],"skins":[{"unified":"1f518","native":"🔘"}],"version":1},"white_square_button":{"id":"white_square_button","name":"White Square Button","keywords":["shape","input"],"skins":[{"unified":"1f533","native":"🔳"}],"version":1},"black_square_button":{"id":"black_square_button","name":"Black Square Button","keywords":["shape","input","frame"],"skins":[{"unified":"1f532","native":"🔲"}],"version":1},"checkered_flag":{"id":"checkered_flag","name":"Chequered Flag","keywords":["checkered","contest","finishline","race","gokart"],"skins":[{"unified":"1f3c1","native":"🏁"}],"version":1},"triangular_flag_on_post":{"id":"triangular_flag_on_post","name":"Triangular Flag","keywords":["on","post","mark","milestone","place"],"skins":[{"unified":"1f6a9","native":"🚩"}],"version":1},"crossed_flags":{"id":"crossed_flags","name":"Crossed Flags","keywords":["japanese","nation","country","border"],"skins":[{"unified":"1f38c","native":"🎌"}],"version":1},"waving_black_flag":{"id":"waving_black_flag","name":"Black Flag","keywords":["waving","pirate"],"skins":[{"unified":"1f3f4","native":"🏴"}],"version":1},"waving_white_flag":{"id":"waving_white_flag","name":"White Flag","keywords":["waving","losing","loser","lost","surrender","give","up","fail"],"skins":[{"unified":"1f3f3-fe0f","native":"🏳️"}],"version":1},"flag-ac":{"id":"flag-ac","name":"Ascension Island Flag","keywords":["ac"],"skins":[{"unified":"1f1e6-1f1e8","native":"🇦🇨"}],"version":2},"flag-ad":{"id":"flag-ad","name":"Andorra Flag","keywords":["ad","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1e9","native":"🇦🇩"}],"version":2},"flag-ae":{"id":"flag-ae","name":"United Arab Emirates Flag","keywords":["ae","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1ea","native":"🇦🇪"}],"version":2},"flag-af":{"id":"flag-af","name":"Afghanistan Flag","keywords":["af","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1eb","native":"🇦🇫"}],"version":2},"flag-ag":{"id":"flag-ag","name":"Antigua & Barbuda Flag","keywords":["ag","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1ec","native":"🇦🇬"}],"version":2},"flag-ai":{"id":"flag-ai","name":"Anguilla Flag","keywords":["ai","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1ee","native":"🇦🇮"}],"version":2},"flag-al":{"id":"flag-al","name":"Albania Flag","keywords":["al","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f1","native":"🇦🇱"}],"version":2},"flag-am":{"id":"flag-am","name":"Armenia Flag","keywords":["am","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f2","native":"🇦🇲"}],"version":2},"flag-ao":{"id":"flag-ao","name":"Angola Flag","keywords":["ao","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f4","native":"🇦🇴"}],"version":2},"flag-aq":{"id":"flag-aq","name":"Antarctica Flag","keywords":["aq","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f6","native":"🇦🇶"}],"version":2},"flag-ar":{"id":"flag-ar","name":"Argentina Flag","keywords":["ar","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f7","native":"🇦🇷"}],"version":2},"flag-as":{"id":"flag-as","name":"American Samoa Flag","keywords":["as","ws","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f8","native":"🇦🇸"}],"version":2},"flag-at":{"id":"flag-at","name":"Austria Flag","keywords":["at","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1f9","native":"🇦🇹"}],"version":2},"flag-au":{"id":"flag-au","name":"Australia Flag","keywords":["au","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1fa","native":"🇦🇺"}],"version":2},"flag-aw":{"id":"flag-aw","name":"Aruba Flag","keywords":["aw","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1fc","native":"🇦🇼"}],"version":2},"flag-ax":{"id":"flag-ax","name":"Åland Islands Flag","keywords":["ax","aland","Aland","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1fd","native":"🇦🇽"}],"version":2},"flag-az":{"id":"flag-az","name":"Azerbaijan Flag","keywords":["az","nation","country","banner"],"skins":[{"unified":"1f1e6-1f1ff","native":"🇦🇿"}],"version":2},"flag-ba":{"id":"flag-ba","name":"Bosnia & Herzegovina Flag","keywords":["ba","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1e6","native":"🇧🇦"}],"version":2},"flag-bb":{"id":"flag-bb","name":"Barbados Flag","keywords":["bb","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1e7","native":"🇧🇧"}],"version":2},"flag-bd":{"id":"flag-bd","name":"Bangladesh Flag","keywords":["bd","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1e9","native":"🇧🇩"}],"version":2},"flag-be":{"id":"flag-be","name":"Belgium Flag","keywords":["be","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ea","native":"🇧🇪"}],"version":2},"flag-bf":{"id":"flag-bf","name":"Burkina Faso Flag","keywords":["bf","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1eb","native":"🇧🇫"}],"version":2},"flag-bg":{"id":"flag-bg","name":"Bulgaria Flag","keywords":["bg","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ec","native":"🇧🇬"}],"version":2},"flag-bh":{"id":"flag-bh","name":"Bahrain Flag","keywords":["bh","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ed","native":"🇧🇭"}],"version":2},"flag-bi":{"id":"flag-bi","name":"Burundi Flag","keywords":["bi","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ee","native":"🇧🇮"}],"version":2},"flag-bj":{"id":"flag-bj","name":"Benin Flag","keywords":["bj","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ef","native":"🇧🇯"}],"version":2},"flag-bl":{"id":"flag-bl","name":"St. Barthélemy Flag","keywords":["bl","st","barthelemy","saint","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f1","native":"🇧🇱"}],"version":2},"flag-bm":{"id":"flag-bm","name":"Bermuda Flag","keywords":["bm","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f2","native":"🇧🇲"}],"version":2},"flag-bn":{"id":"flag-bn","name":"Brunei Flag","keywords":["bn","darussalam","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f3","native":"🇧🇳"}],"version":2},"flag-bo":{"id":"flag-bo","name":"Bolivia Flag","keywords":["bo","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f4","native":"🇧🇴"}],"version":2},"flag-bq":{"id":"flag-bq","name":"Caribbean Netherlands Flag","keywords":["bq","bonaire","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f6","native":"🇧🇶"}],"version":2},"flag-br":{"id":"flag-br","name":"Brazil Flag","keywords":["br","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f7","native":"🇧🇷"}],"version":2},"flag-bs":{"id":"flag-bs","name":"Bahamas Flag","keywords":["bs","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f8","native":"🇧🇸"}],"version":2},"flag-bt":{"id":"flag-bt","name":"Bhutan Flag","keywords":["bt","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1f9","native":"🇧🇹"}],"version":2},"flag-bv":{"id":"flag-bv","name":"Bouvet Island Flag","keywords":["bv","norway"],"skins":[{"unified":"1f1e7-1f1fb","native":"🇧🇻"}],"version":2},"flag-bw":{"id":"flag-bw","name":"Botswana Flag","keywords":["bw","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1fc","native":"🇧🇼"}],"version":2},"flag-by":{"id":"flag-by","name":"Belarus Flag","keywords":["by","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1fe","native":"🇧🇾"}],"version":2},"flag-bz":{"id":"flag-bz","name":"Belize Flag","keywords":["bz","nation","country","banner"],"skins":[{"unified":"1f1e7-1f1ff","native":"🇧🇿"}],"version":2},"flag-ca":{"id":"flag-ca","name":"Canada Flag","keywords":["ca","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1e6","native":"🇨🇦"}],"version":2},"flag-cc":{"id":"flag-cc","name":"Cocos (keeling) Islands Flag","keywords":["cc","keeling","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1e8","native":"🇨🇨"}],"version":2},"flag-cd":{"id":"flag-cd","name":"Congo - Kinshasa Flag","keywords":["cd","democratic","republic","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1e9","native":"🇨🇩"}],"version":2},"flag-cf":{"id":"flag-cf","name":"Central African Republic Flag","keywords":["cf","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1eb","native":"🇨🇫"}],"version":2},"flag-cg":{"id":"flag-cg","name":"Congo - Brazzaville Flag","keywords":["cg","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1ec","native":"🇨🇬"}],"version":2},"flag-ch":{"id":"flag-ch","name":"Switzerland Flag","keywords":["ch","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1ed","native":"🇨🇭"}],"version":2},"flag-ci":{"id":"flag-ci","name":"Côte D’ivoire Flag","keywords":["ci","cote","d","ivoire","ivory","coast","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1ee","native":"🇨🇮"}],"version":2},"flag-ck":{"id":"flag-ck","name":"Cook Islands Flag","keywords":["ck","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1f0","native":"🇨🇰"}],"version":2},"flag-cl":{"id":"flag-cl","name":"Chile Flag","keywords":["cl","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1f1","native":"🇨🇱"}],"version":2},"flag-cm":{"id":"flag-cm","name":"Cameroon Flag","keywords":["cm","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1f2","native":"🇨🇲"}],"version":2},"cn":{"id":"cn","name":"China Flag","keywords":["cn","chinese","prc","country","nation","banner"],"skins":[{"unified":"1f1e8-1f1f3","native":"🇨🇳"}],"version":1},"flag-co":{"id":"flag-co","name":"Colombia Flag","keywords":["co","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1f4","native":"🇨🇴"}],"version":2},"flag-cp":{"id":"flag-cp","name":"Clipperton Island Flag","keywords":["cp"],"skins":[{"unified":"1f1e8-1f1f5","native":"🇨🇵"}],"version":2},"flag-cr":{"id":"flag-cr","name":"Costa Rica Flag","keywords":["cr","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1f7","native":"🇨🇷"}],"version":2},"flag-cu":{"id":"flag-cu","name":"Cuba Flag","keywords":["cu","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1fa","native":"🇨🇺"}],"version":2},"flag-cv":{"id":"flag-cv","name":"Cape Verde Flag","keywords":["cv","cabo","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1fb","native":"🇨🇻"}],"version":2},"flag-cw":{"id":"flag-cw","name":"Curaçao Flag","keywords":["cw","curacao","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1fc","native":"🇨🇼"}],"version":2},"flag-cx":{"id":"flag-cx","name":"Christmas Island Flag","keywords":["cx","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1fd","native":"🇨🇽"}],"version":2},"flag-cy":{"id":"flag-cy","name":"Cyprus Flag","keywords":["cy","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1fe","native":"🇨🇾"}],"version":2},"flag-cz":{"id":"flag-cz","name":"Czechia Flag","keywords":["cz","nation","country","banner"],"skins":[{"unified":"1f1e8-1f1ff","native":"🇨🇿"}],"version":2},"de":{"id":"de","name":"Germany Flag","keywords":["de","german","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1ea","native":"🇩🇪"}],"version":1},"flag-dg":{"id":"flag-dg","name":"Diego Garcia Flag","keywords":["dg"],"skins":[{"unified":"1f1e9-1f1ec","native":"🇩🇬"}],"version":2},"flag-dj":{"id":"flag-dj","name":"Djibouti Flag","keywords":["dj","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1ef","native":"🇩🇯"}],"version":2},"flag-dk":{"id":"flag-dk","name":"Denmark Flag","keywords":["dk","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1f0","native":"🇩🇰"}],"version":2},"flag-dm":{"id":"flag-dm","name":"Dominica Flag","keywords":["dm","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1f2","native":"🇩🇲"}],"version":2},"flag-do":{"id":"flag-do","name":"Dominican Republic Flag","keywords":["do","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1f4","native":"🇩🇴"}],"version":2},"flag-dz":{"id":"flag-dz","name":"Algeria Flag","keywords":["dz","nation","country","banner"],"skins":[{"unified":"1f1e9-1f1ff","native":"🇩🇿"}],"version":2},"flag-ea":{"id":"flag-ea","name":"Ceuta & Melilla Flag","keywords":["ea"],"skins":[{"unified":"1f1ea-1f1e6","native":"🇪🇦"}],"version":2},"flag-ec":{"id":"flag-ec","name":"Ecuador Flag","keywords":["ec","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1e8","native":"🇪🇨"}],"version":2},"flag-ee":{"id":"flag-ee","name":"Estonia Flag","keywords":["ee","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1ea","native":"🇪🇪"}],"version":2},"flag-eg":{"id":"flag-eg","name":"Egypt Flag","keywords":["eg","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1ec","native":"🇪🇬"}],"version":2},"flag-eh":{"id":"flag-eh","name":"Western Sahara Flag","keywords":["eh","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1ed","native":"🇪🇭"}],"version":2},"flag-er":{"id":"flag-er","name":"Eritrea Flag","keywords":["er","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1f7","native":"🇪🇷"}],"version":2},"es":{"id":"es","name":"Spain Flag","keywords":["es","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1f8","native":"🇪🇸"}],"version":1},"flag-et":{"id":"flag-et","name":"Ethiopia Flag","keywords":["et","nation","country","banner"],"skins":[{"unified":"1f1ea-1f1f9","native":"🇪🇹"}],"version":2},"flag-eu":{"id":"flag-eu","name":"European Union Flag","keywords":["eu","banner"],"skins":[{"unified":"1f1ea-1f1fa","native":"🇪🇺"}],"version":2},"flag-fi":{"id":"flag-fi","name":"Finland Flag","keywords":["fi","nation","country","banner"],"skins":[{"unified":"1f1eb-1f1ee","native":"🇫🇮"}],"version":2},"flag-fj":{"id":"flag-fj","name":"Fiji Flag","keywords":["fj","nation","country","banner"],"skins":[{"unified":"1f1eb-1f1ef","native":"🇫🇯"}],"version":2},"flag-fk":{"id":"flag-fk","name":"Falkland Islands Flag","keywords":["fk","malvinas","nation","country","banner"],"skins":[{"unified":"1f1eb-1f1f0","native":"🇫🇰"}],"version":2},"flag-fm":{"id":"flag-fm","name":"Micronesia Flag","keywords":["fm","federated","states","nation","country","banner"],"skins":[{"unified":"1f1eb-1f1f2","native":"🇫🇲"}],"version":2},"flag-fo":{"id":"flag-fo","name":"Faroe Islands Flag","keywords":["fo","nation","country","banner"],"skins":[{"unified":"1f1eb-1f1f4","native":"🇫🇴"}],"version":2},"fr":{"id":"fr","name":"France Flag","keywords":["fr","banner","nation","french","country"],"skins":[{"unified":"1f1eb-1f1f7","native":"🇫🇷"}],"version":1},"flag-ga":{"id":"flag-ga","name":"Gabon Flag","keywords":["ga","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1e6","native":"🇬🇦"}],"version":2},"gb":{"id":"gb","name":"United Kingdom Flag","keywords":["gb","uk","great","britain","northern","ireland","nation","country","banner","british","UK","english","england","union","jack"],"skins":[{"unified":"1f1ec-1f1e7","native":"🇬🇧"}],"version":1},"flag-gd":{"id":"flag-gd","name":"Grenada Flag","keywords":["gd","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1e9","native":"🇬🇩"}],"version":2},"flag-ge":{"id":"flag-ge","name":"Georgia Flag","keywords":["ge","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1ea","native":"🇬🇪"}],"version":2},"flag-gf":{"id":"flag-gf","name":"French Guiana Flag","keywords":["gf","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1eb","native":"🇬🇫"}],"version":2},"flag-gg":{"id":"flag-gg","name":"Guernsey Flag","keywords":["gg","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1ec","native":"🇬🇬"}],"version":2},"flag-gh":{"id":"flag-gh","name":"Ghana Flag","keywords":["gh","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1ed","native":"🇬🇭"}],"version":2},"flag-gi":{"id":"flag-gi","name":"Gibraltar Flag","keywords":["gi","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1ee","native":"🇬🇮"}],"version":2},"flag-gl":{"id":"flag-gl","name":"Greenland Flag","keywords":["gl","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f1","native":"🇬🇱"}],"version":2},"flag-gm":{"id":"flag-gm","name":"Gambia Flag","keywords":["gm","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f2","native":"🇬🇲"}],"version":2},"flag-gn":{"id":"flag-gn","name":"Guinea Flag","keywords":["gn","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f3","native":"🇬🇳"}],"version":2},"flag-gp":{"id":"flag-gp","name":"Guadeloupe Flag","keywords":["gp","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f5","native":"🇬🇵"}],"version":2},"flag-gq":{"id":"flag-gq","name":"Equatorial Guinea Flag","keywords":["gq","gn","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f6","native":"🇬🇶"}],"version":2},"flag-gr":{"id":"flag-gr","name":"Greece Flag","keywords":["gr","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f7","native":"🇬🇷"}],"version":2},"flag-gs":{"id":"flag-gs","name":"South Georgia & South Sandwich Islands Flag","keywords":["gs","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f8","native":"🇬🇸"}],"version":2},"flag-gt":{"id":"flag-gt","name":"Guatemala Flag","keywords":["gt","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1f9","native":"🇬🇹"}],"version":2},"flag-gu":{"id":"flag-gu","name":"Guam Flag","keywords":["gu","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1fa","native":"🇬🇺"}],"version":2},"flag-gw":{"id":"flag-gw","name":"Guinea-Bissau Flag","keywords":["gw","guinea","bissau","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1fc","native":"🇬🇼"}],"version":2},"flag-gy":{"id":"flag-gy","name":"Guyana Flag","keywords":["gy","nation","country","banner"],"skins":[{"unified":"1f1ec-1f1fe","native":"🇬🇾"}],"version":2},"flag-hk":{"id":"flag-hk","name":"Hong Kong Sar China Flag","keywords":["hk","nation","country","banner"],"skins":[{"unified":"1f1ed-1f1f0","native":"🇭🇰"}],"version":2},"flag-hm":{"id":"flag-hm","name":"Heard & Mcdonald Islands Flag","keywords":["hm"],"skins":[{"unified":"1f1ed-1f1f2","native":"🇭🇲"}],"version":2},"flag-hn":{"id":"flag-hn","name":"Honduras Flag","keywords":["hn","nation","country","banner"],"skins":[{"unified":"1f1ed-1f1f3","native":"🇭🇳"}],"version":2},"flag-hr":{"id":"flag-hr","name":"Croatia Flag","keywords":["hr","nation","country","banner"],"skins":[{"unified":"1f1ed-1f1f7","native":"🇭🇷"}],"version":2},"flag-ht":{"id":"flag-ht","name":"Haiti Flag","keywords":["ht","nation","country","banner"],"skins":[{"unified":"1f1ed-1f1f9","native":"🇭🇹"}],"version":2},"flag-hu":{"id":"flag-hu","name":"Hungary Flag","keywords":["hu","nation","country","banner"],"skins":[{"unified":"1f1ed-1f1fa","native":"🇭🇺"}],"version":2},"flag-ic":{"id":"flag-ic","name":"Canary Islands Flag","keywords":["ic","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1e8","native":"🇮🇨"}],"version":2},"flag-id":{"id":"flag-id","name":"Indonesia Flag","keywords":["id","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1e9","native":"🇮🇩"}],"version":2},"flag-ie":{"id":"flag-ie","name":"Ireland Flag","keywords":["ie","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1ea","native":"🇮🇪"}],"version":2},"flag-il":{"id":"flag-il","name":"Israel Flag","keywords":["il","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f1","native":"🇮🇱"}],"version":2},"flag-im":{"id":"flag-im","name":"Isle of Man Flag","keywords":["im","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f2","native":"🇮🇲"}],"version":2},"flag-in":{"id":"flag-in","name":"India Flag","keywords":["in","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f3","native":"🇮🇳"}],"version":2},"flag-io":{"id":"flag-io","name":"British Indian Ocean Territory Flag","keywords":["io","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f4","native":"🇮🇴"}],"version":2},"flag-iq":{"id":"flag-iq","name":"Iraq Flag","keywords":["iq","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f6","native":"🇮🇶"}],"version":2},"flag-ir":{"id":"flag-ir","name":"Iran Flag","keywords":["ir","islamic","republic","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f7","native":"🇮🇷"}],"version":2},"flag-is":{"id":"flag-is","name":"Iceland Flag","keywords":["is","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f8","native":"🇮🇸"}],"version":2},"it":{"id":"it","name":"Italy Flag","keywords":["it","nation","country","banner"],"skins":[{"unified":"1f1ee-1f1f9","native":"🇮🇹"}],"version":1},"flag-je":{"id":"flag-je","name":"Jersey Flag","keywords":["je","nation","country","banner"],"skins":[{"unified":"1f1ef-1f1ea","native":"🇯🇪"}],"version":2},"flag-jm":{"id":"flag-jm","name":"Jamaica Flag","keywords":["jm","nation","country","banner"],"skins":[{"unified":"1f1ef-1f1f2","native":"🇯🇲"}],"version":2},"flag-jo":{"id":"flag-jo","name":"Jordan Flag","keywords":["jo","nation","country","banner"],"skins":[{"unified":"1f1ef-1f1f4","native":"🇯🇴"}],"version":2},"jp":{"id":"jp","name":"Japan Flag","keywords":["jp","japanese","nation","country","banner","ja"],"skins":[{"unified":"1f1ef-1f1f5","native":"🇯🇵"}],"version":1},"flag-ke":{"id":"flag-ke","name":"Kenya Flag","keywords":["ke","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1ea","native":"🇰🇪"}],"version":2},"flag-kg":{"id":"flag-kg","name":"Kyrgyzstan Flag","keywords":["kg","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1ec","native":"🇰🇬"}],"version":2},"flag-kh":{"id":"flag-kh","name":"Cambodia Flag","keywords":["kh","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1ed","native":"🇰🇭"}],"version":2},"flag-ki":{"id":"flag-ki","name":"Kiribati Flag","keywords":["ki","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1ee","native":"🇰🇮"}],"version":2},"flag-km":{"id":"flag-km","name":"Comoros Flag","keywords":["km","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1f2","native":"🇰🇲"}],"version":2},"flag-kn":{"id":"flag-kn","name":"St. Kitts & Nevis Flag","keywords":["kn","st","saint","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1f3","native":"🇰🇳"}],"version":2},"flag-kp":{"id":"flag-kp","name":"North Korea Flag","keywords":["kp","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1f5","native":"🇰🇵"}],"version":2},"kr":{"id":"kr","name":"South Korea Flag","keywords":["kr","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1f7","native":"🇰🇷"}],"version":1},"flag-kw":{"id":"flag-kw","name":"Kuwait Flag","keywords":["kw","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1fc","native":"🇰🇼"}],"version":2},"flag-ky":{"id":"flag-ky","name":"Cayman Islands Flag","keywords":["ky","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1fe","native":"🇰🇾"}],"version":2},"flag-kz":{"id":"flag-kz","name":"Kazakhstan Flag","keywords":["kz","nation","country","banner"],"skins":[{"unified":"1f1f0-1f1ff","native":"🇰🇿"}],"version":2},"flag-la":{"id":"flag-la","name":"Laos Flag","keywords":["la","lao","democratic","republic","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1e6","native":"🇱🇦"}],"version":2},"flag-lb":{"id":"flag-lb","name":"Lebanon Flag","keywords":["lb","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1e7","native":"🇱🇧"}],"version":2},"flag-lc":{"id":"flag-lc","name":"St. Lucia Flag","keywords":["lc","st","saint","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1e8","native":"🇱🇨"}],"version":2},"flag-li":{"id":"flag-li","name":"Liechtenstein Flag","keywords":["li","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1ee","native":"🇱🇮"}],"version":2},"flag-lk":{"id":"flag-lk","name":"Sri Lanka Flag","keywords":["lk","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1f0","native":"🇱🇰"}],"version":2},"flag-lr":{"id":"flag-lr","name":"Liberia Flag","keywords":["lr","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1f7","native":"🇱🇷"}],"version":2},"flag-ls":{"id":"flag-ls","name":"Lesotho Flag","keywords":["ls","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1f8","native":"🇱🇸"}],"version":2},"flag-lt":{"id":"flag-lt","name":"Lithuania Flag","keywords":["lt","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1f9","native":"🇱🇹"}],"version":2},"flag-lu":{"id":"flag-lu","name":"Luxembourg Flag","keywords":["lu","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1fa","native":"🇱🇺"}],"version":2},"flag-lv":{"id":"flag-lv","name":"Latvia Flag","keywords":["lv","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1fb","native":"🇱🇻"}],"version":2},"flag-ly":{"id":"flag-ly","name":"Libya Flag","keywords":["ly","nation","country","banner"],"skins":[{"unified":"1f1f1-1f1fe","native":"🇱🇾"}],"version":2},"flag-ma":{"id":"flag-ma","name":"Morocco Flag","keywords":["ma","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1e6","native":"🇲🇦"}],"version":2},"flag-mc":{"id":"flag-mc","name":"Monaco Flag","keywords":["mc","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1e8","native":"🇲🇨"}],"version":2},"flag-md":{"id":"flag-md","name":"Moldova Flag","keywords":["md","republic","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1e9","native":"🇲🇩"}],"version":2},"flag-me":{"id":"flag-me","name":"Montenegro Flag","keywords":["me","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1ea","native":"🇲🇪"}],"version":2},"flag-mf":{"id":"flag-mf","name":"St. Martin Flag","keywords":["mf","st"],"skins":[{"unified":"1f1f2-1f1eb","native":"🇲🇫"}],"version":2},"flag-mg":{"id":"flag-mg","name":"Madagascar Flag","keywords":["mg","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1ec","native":"🇲🇬"}],"version":2},"flag-mh":{"id":"flag-mh","name":"Marshall Islands Flag","keywords":["mh","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1ed","native":"🇲🇭"}],"version":2},"flag-mk":{"id":"flag-mk","name":"North Macedonia Flag","keywords":["mk","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f0","native":"🇲🇰"}],"version":2},"flag-ml":{"id":"flag-ml","name":"Mali Flag","keywords":["ml","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f1","native":"🇲🇱"}],"version":2},"flag-mm":{"id":"flag-mm","name":"Myanmar (burma) Flag","keywords":["mm","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f2","native":"🇲🇲"}],"version":2},"flag-mn":{"id":"flag-mn","name":"Mongolia Flag","keywords":["mn","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f3","native":"🇲🇳"}],"version":2},"flag-mo":{"id":"flag-mo","name":"Macao Sar China Flag","keywords":["mo","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f4","native":"🇲🇴"}],"version":2},"flag-mp":{"id":"flag-mp","name":"Northern Mariana Islands Flag","keywords":["mp","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f5","native":"🇲🇵"}],"version":2},"flag-mq":{"id":"flag-mq","name":"Martinique Flag","keywords":["mq","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f6","native":"🇲🇶"}],"version":2},"flag-mr":{"id":"flag-mr","name":"Mauritania Flag","keywords":["mr","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f7","native":"🇲🇷"}],"version":2},"flag-ms":{"id":"flag-ms","name":"Montserrat Flag","keywords":["ms","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f8","native":"🇲🇸"}],"version":2},"flag-mt":{"id":"flag-mt","name":"Malta Flag","keywords":["mt","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1f9","native":"🇲🇹"}],"version":2},"flag-mu":{"id":"flag-mu","name":"Mauritius Flag","keywords":["mu","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1fa","native":"🇲🇺"}],"version":2},"flag-mv":{"id":"flag-mv","name":"Maldives Flag","keywords":["mv","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1fb","native":"🇲🇻"}],"version":2},"flag-mw":{"id":"flag-mw","name":"Malawi Flag","keywords":["mw","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1fc","native":"🇲🇼"}],"version":2},"flag-mx":{"id":"flag-mx","name":"Mexico Flag","keywords":["mx","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1fd","native":"🇲🇽"}],"version":2},"flag-my":{"id":"flag-my","name":"Malaysia Flag","keywords":["my","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1fe","native":"🇲🇾"}],"version":2},"flag-mz":{"id":"flag-mz","name":"Mozambique Flag","keywords":["mz","nation","country","banner"],"skins":[{"unified":"1f1f2-1f1ff","native":"🇲🇿"}],"version":2},"flag-na":{"id":"flag-na","name":"Namibia Flag","keywords":["na","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1e6","native":"🇳🇦"}],"version":2},"flag-nc":{"id":"flag-nc","name":"New Caledonia Flag","keywords":["nc","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1e8","native":"🇳🇨"}],"version":2},"flag-ne":{"id":"flag-ne","name":"Niger Flag","keywords":["ne","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1ea","native":"🇳🇪"}],"version":2},"flag-nf":{"id":"flag-nf","name":"Norfolk Island Flag","keywords":["nf","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1eb","native":"🇳🇫"}],"version":2},"flag-ng":{"id":"flag-ng","name":"Nigeria Flag","keywords":["ng","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1ec","native":"🇳🇬"}],"version":2},"flag-ni":{"id":"flag-ni","name":"Nicaragua Flag","keywords":["ni","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1ee","native":"🇳🇮"}],"version":2},"flag-nl":{"id":"flag-nl","name":"Netherlands Flag","keywords":["nl","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1f1","native":"🇳🇱"}],"version":2},"flag-no":{"id":"flag-no","name":"Norway Flag","keywords":["no","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1f4","native":"🇳🇴"}],"version":2},"flag-np":{"id":"flag-np","name":"Nepal Flag","keywords":["np","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1f5","native":"🇳🇵"}],"version":2},"flag-nr":{"id":"flag-nr","name":"Nauru Flag","keywords":["nr","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1f7","native":"🇳🇷"}],"version":2},"flag-nu":{"id":"flag-nu","name":"Niue Flag","keywords":["nu","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1fa","native":"🇳🇺"}],"version":2},"flag-nz":{"id":"flag-nz","name":"New Zealand Flag","keywords":["nz","nation","country","banner"],"skins":[{"unified":"1f1f3-1f1ff","native":"🇳🇿"}],"version":2},"flag-om":{"id":"flag-om","name":"Oman Flag","keywords":["om","symbol","nation","country","banner"],"skins":[{"unified":"1f1f4-1f1f2","native":"🇴🇲"}],"version":2},"flag-pa":{"id":"flag-pa","name":"Panama Flag","keywords":["pa","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1e6","native":"🇵🇦"}],"version":2},"flag-pe":{"id":"flag-pe","name":"Peru Flag","keywords":["pe","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1ea","native":"🇵🇪"}],"version":2},"flag-pf":{"id":"flag-pf","name":"French Polynesia Flag","keywords":["pf","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1eb","native":"🇵🇫"}],"version":2},"flag-pg":{"id":"flag-pg","name":"Papua New Guinea Flag","keywords":["pg","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1ec","native":"🇵🇬"}],"version":2},"flag-ph":{"id":"flag-ph","name":"Philippines Flag","keywords":["ph","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1ed","native":"🇵🇭"}],"version":2},"flag-pk":{"id":"flag-pk","name":"Pakistan Flag","keywords":["pk","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f0","native":"🇵🇰"}],"version":2},"flag-pl":{"id":"flag-pl","name":"Poland Flag","keywords":["pl","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f1","native":"🇵🇱"}],"version":2},"flag-pm":{"id":"flag-pm","name":"St. Pierre & Miquelon Flag","keywords":["pm","st","saint","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f2","native":"🇵🇲"}],"version":2},"flag-pn":{"id":"flag-pn","name":"Pitcairn Islands Flag","keywords":["pn","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f3","native":"🇵🇳"}],"version":2},"flag-pr":{"id":"flag-pr","name":"Puerto Rico Flag","keywords":["pr","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f7","native":"🇵🇷"}],"version":2},"flag-ps":{"id":"flag-ps","name":"Palestinian Territories Flag","keywords":["ps","palestine","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f8","native":"🇵🇸"}],"version":2},"flag-pt":{"id":"flag-pt","name":"Portugal Flag","keywords":["pt","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1f9","native":"🇵🇹"}],"version":2},"flag-pw":{"id":"flag-pw","name":"Palau Flag","keywords":["pw","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1fc","native":"🇵🇼"}],"version":2},"flag-py":{"id":"flag-py","name":"Paraguay Flag","keywords":["py","nation","country","banner"],"skins":[{"unified":"1f1f5-1f1fe","native":"🇵🇾"}],"version":2},"flag-qa":{"id":"flag-qa","name":"Qatar Flag","keywords":["qa","nation","country","banner"],"skins":[{"unified":"1f1f6-1f1e6","native":"🇶🇦"}],"version":2},"flag-re":{"id":"flag-re","name":"Réunion Flag","keywords":["re","reunion","nation","country","banner"],"skins":[{"unified":"1f1f7-1f1ea","native":"🇷🇪"}],"version":2},"flag-ro":{"id":"flag-ro","name":"Romania Flag","keywords":["ro","nation","country","banner"],"skins":[{"unified":"1f1f7-1f1f4","native":"🇷🇴"}],"version":2},"flag-rs":{"id":"flag-rs","name":"Serbia Flag","keywords":["rs","nation","country","banner"],"skins":[{"unified":"1f1f7-1f1f8","native":"🇷🇸"}],"version":2},"ru":{"id":"ru","name":"Russia Flag","keywords":["ru","russian","federation","nation","country","banner"],"skins":[{"unified":"1f1f7-1f1fa","native":"🇷🇺"}],"version":1},"flag-rw":{"id":"flag-rw","name":"Rwanda Flag","keywords":["rw","nation","country","banner"],"skins":[{"unified":"1f1f7-1f1fc","native":"🇷🇼"}],"version":2},"flag-sa":{"id":"flag-sa","name":"Saudi Arabia Flag","keywords":["sa","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1e6","native":"🇸🇦"}],"version":2},"flag-sb":{"id":"flag-sb","name":"Solomon Islands Flag","keywords":["sb","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1e7","native":"🇸🇧"}],"version":2},"flag-sc":{"id":"flag-sc","name":"Seychelles Flag","keywords":["sc","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1e8","native":"🇸🇨"}],"version":2},"flag-sd":{"id":"flag-sd","name":"Sudan Flag","keywords":["sd","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1e9","native":"🇸🇩"}],"version":2},"flag-se":{"id":"flag-se","name":"Sweden Flag","keywords":["se","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1ea","native":"🇸🇪"}],"version":2},"flag-sg":{"id":"flag-sg","name":"Singapore Flag","keywords":["sg","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1ec","native":"🇸🇬"}],"version":2},"flag-sh":{"id":"flag-sh","name":"St. Helena Flag","keywords":["sh","st","saint","ascension","tristan","cunha","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1ed","native":"🇸🇭"}],"version":2},"flag-si":{"id":"flag-si","name":"Slovenia Flag","keywords":["si","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1ee","native":"🇸🇮"}],"version":2},"flag-sj":{"id":"flag-sj","name":"Svalbard & Jan Mayen Flag","keywords":["sj"],"skins":[{"unified":"1f1f8-1f1ef","native":"🇸🇯"}],"version":2},"flag-sk":{"id":"flag-sk","name":"Slovakia Flag","keywords":["sk","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f0","native":"🇸🇰"}],"version":2},"flag-sl":{"id":"flag-sl","name":"Sierra Leone Flag","keywords":["sl","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f1","native":"🇸🇱"}],"version":2},"flag-sm":{"id":"flag-sm","name":"San Marino Flag","keywords":["sm","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f2","native":"🇸🇲"}],"version":2},"flag-sn":{"id":"flag-sn","name":"Senegal Flag","keywords":["sn","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f3","native":"🇸🇳"}],"version":2},"flag-so":{"id":"flag-so","name":"Somalia Flag","keywords":["so","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f4","native":"🇸🇴"}],"version":2},"flag-sr":{"id":"flag-sr","name":"Suriname Flag","keywords":["sr","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f7","native":"🇸🇷"}],"version":2},"flag-ss":{"id":"flag-ss","name":"South Sudan Flag","keywords":["ss","sd","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f8","native":"🇸🇸"}],"version":2},"flag-st":{"id":"flag-st","name":"São Tomé & Príncipe Flag","keywords":["st","sao","tome","principe","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1f9","native":"🇸🇹"}],"version":2},"flag-sv":{"id":"flag-sv","name":"El Salvador Flag","keywords":["sv","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1fb","native":"🇸🇻"}],"version":2},"flag-sx":{"id":"flag-sx","name":"Sint Maarten Flag","keywords":["sx","dutch","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1fd","native":"🇸🇽"}],"version":2},"flag-sy":{"id":"flag-sy","name":"Syria Flag","keywords":["sy","syrian","arab","republic","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1fe","native":"🇸🇾"}],"version":2},"flag-sz":{"id":"flag-sz","name":"Eswatini Flag","keywords":["sz","nation","country","banner"],"skins":[{"unified":"1f1f8-1f1ff","native":"🇸🇿"}],"version":2},"flag-ta":{"id":"flag-ta","name":"Tristan Da Cunha Flag","keywords":["ta"],"skins":[{"unified":"1f1f9-1f1e6","native":"🇹🇦"}],"version":2},"flag-tc":{"id":"flag-tc","name":"Turks & Caicos Islands Flag","keywords":["tc","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1e8","native":"🇹🇨"}],"version":2},"flag-td":{"id":"flag-td","name":"Chad Flag","keywords":["td","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1e9","native":"🇹🇩"}],"version":2},"flag-tf":{"id":"flag-tf","name":"French Southern Territories Flag","keywords":["tf","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1eb","native":"🇹🇫"}],"version":2},"flag-tg":{"id":"flag-tg","name":"Togo Flag","keywords":["tg","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1ec","native":"🇹🇬"}],"version":2},"flag-th":{"id":"flag-th","name":"Thailand Flag","keywords":["th","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1ed","native":"🇹🇭"}],"version":2},"flag-tj":{"id":"flag-tj","name":"Tajikistan Flag","keywords":["tj","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1ef","native":"🇹🇯"}],"version":2},"flag-tk":{"id":"flag-tk","name":"Tokelau Flag","keywords":["tk","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f0","native":"🇹🇰"}],"version":2},"flag-tl":{"id":"flag-tl","name":"Timor-Leste Flag","keywords":["tl","timor","leste","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f1","native":"🇹🇱"}],"version":2},"flag-tm":{"id":"flag-tm","name":"Turkmenistan Flag","keywords":["tm","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f2","native":"🇹🇲"}],"version":2},"flag-tn":{"id":"flag-tn","name":"Tunisia Flag","keywords":["tn","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f3","native":"🇹🇳"}],"version":2},"flag-to":{"id":"flag-to","name":"Tonga Flag","keywords":["to","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f4","native":"🇹🇴"}],"version":2},"flag-tr":{"id":"flag-tr","name":"Turkey Flag","keywords":["tr","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f7","native":"🇹🇷"}],"version":2},"flag-tt":{"id":"flag-tt","name":"Trinidad & Tobago Flag","keywords":["tt","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1f9","native":"🇹🇹"}],"version":2},"flag-tv":{"id":"flag-tv","name":"Tuvalu Flag","keywords":["tv","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1fb","native":"🇹🇻"}],"version":2},"flag-tw":{"id":"flag-tw","name":"Taiwan Flag","keywords":["tw","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1fc","native":"🇹🇼"}],"version":2},"flag-tz":{"id":"flag-tz","name":"Tanzania Flag","keywords":["tz","united","republic","nation","country","banner"],"skins":[{"unified":"1f1f9-1f1ff","native":"🇹🇿"}],"version":2},"flag-ua":{"id":"flag-ua","name":"Ukraine Flag","keywords":["ua","nation","country","banner"],"skins":[{"unified":"1f1fa-1f1e6","native":"🇺🇦"}],"version":2},"flag-ug":{"id":"flag-ug","name":"Uganda Flag","keywords":["ug","nation","country","banner"],"skins":[{"unified":"1f1fa-1f1ec","native":"🇺🇬"}],"version":2},"flag-um":{"id":"flag-um","name":"U.s. Outlying Islands Flag","keywords":["um","u","s"],"skins":[{"unified":"1f1fa-1f1f2","native":"🇺🇲"}],"version":2},"us":{"id":"us","name":"United States Flag","keywords":["us","america","nation","country","banner"],"skins":[{"unified":"1f1fa-1f1f8","native":"🇺🇸"}],"version":1},"flag-uy":{"id":"flag-uy","name":"Uruguay Flag","keywords":["uy","nation","country","banner"],"skins":[{"unified":"1f1fa-1f1fe","native":"🇺🇾"}],"version":2},"flag-uz":{"id":"flag-uz","name":"Uzbekistan Flag","keywords":["uz","nation","country","banner"],"skins":[{"unified":"1f1fa-1f1ff","native":"🇺🇿"}],"version":2},"flag-va":{"id":"flag-va","name":"Vatican City Flag","keywords":["va","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1e6","native":"🇻🇦"}],"version":2},"flag-vc":{"id":"flag-vc","name":"St. Vincent & Grenadines Flag","keywords":["vc","st","saint","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1e8","native":"🇻🇨"}],"version":2},"flag-ve":{"id":"flag-ve","name":"Venezuela Flag","keywords":["ve","bolivarian","republic","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1ea","native":"🇻🇪"}],"version":2},"flag-vg":{"id":"flag-vg","name":"British Virgin Islands Flag","keywords":["vg","bvi","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1ec","native":"🇻🇬"}],"version":2},"flag-vi":{"id":"flag-vi","name":"U.s. Virgin Islands Flag","keywords":["vi","u","s","us","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1ee","native":"🇻🇮"}],"version":2},"flag-vn":{"id":"flag-vn","name":"Vietnam Flag","keywords":["vn","viet","nam","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1f3","native":"🇻🇳"}],"version":2},"flag-vu":{"id":"flag-vu","name":"Vanuatu Flag","keywords":["vu","nation","country","banner"],"skins":[{"unified":"1f1fb-1f1fa","native":"🇻🇺"}],"version":2},"flag-wf":{"id":"flag-wf","name":"Wallis & Futuna Flag","keywords":["wf","nation","country","banner"],"skins":[{"unified":"1f1fc-1f1eb","native":"🇼🇫"}],"version":2},"flag-ws":{"id":"flag-ws","name":"Samoa Flag","keywords":["ws","nation","country","banner"],"skins":[{"unified":"1f1fc-1f1f8","native":"🇼🇸"}],"version":2},"flag-xk":{"id":"flag-xk","name":"Kosovo Flag","keywords":["xk","nation","country","banner"],"skins":[{"unified":"1f1fd-1f1f0","native":"🇽🇰"}],"version":2},"flag-ye":{"id":"flag-ye","name":"Yemen Flag","keywords":["ye","nation","country","banner"],"skins":[{"unified":"1f1fe-1f1ea","native":"🇾🇪"}],"version":2},"flag-yt":{"id":"flag-yt","name":"Mayotte Flag","keywords":["yt","nation","country","banner"],"skins":[{"unified":"1f1fe-1f1f9","native":"🇾🇹"}],"version":2},"flag-za":{"id":"flag-za","name":"South Africa Flag","keywords":["za","nation","country","banner"],"skins":[{"unified":"1f1ff-1f1e6","native":"🇿🇦"}],"version":2},"flag-zm":{"id":"flag-zm","name":"Zambia Flag","keywords":["zm","nation","country","banner"],"skins":[{"unified":"1f1ff-1f1f2","native":"🇿🇲"}],"version":2},"flag-zw":{"id":"flag-zw","name":"Zimbabwe Flag","keywords":["zw","nation","country","banner"],"skins":[{"unified":"1f1ff-1f1fc","native":"🇿🇼"}],"version":2}},"aliases":{"satisfied":"laughing","grinning_face_with_star_eyes":"star-struck","grinning_face_with_one_large_and_one_small_eye":"zany_face","smiling_face_with_smiling_eyes_and_hand_covering_mouth":"face_with_hand_over_mouth","face_with_finger_covering_closed_lips":"shushing_face","face_with_one_eyebrow_raised":"face_with_raised_eyebrow","face_with_open_mouth_vomiting":"face_vomiting","shocked_face_with_exploding_head":"exploding_head","serious_face_with_symbols_covering_mouth":"face_with_symbols_on_mouth","poop":"hankey","shit":"hankey","collision":"boom","raised_hand":"hand","hand_with_index_and_middle_fingers_crossed":"crossed_fingers","sign_of_the_horns":"the_horns","reversed_hand_with_middle_finger_extended":"middle_finger","thumbsup":"+1","thumbsdown":"-1","punch":"facepunch","mother_christmas":"mrs_claus","running":"runner","man-with-bunny-ears-partying":"men-with-bunny-ears-partying","woman-with-bunny-ears-partying":"women-with-bunny-ears-partying","women_holding_hands":"two_women_holding_hands","woman_and_man_holding_hands":"man_and_woman_holding_hands","couple":"man_and_woman_holding_hands","men_holding_hands":"two_men_holding_hands","paw_prints":"feet","flipper":"dolphin","honeybee":"bee","lady_beetle":"ladybug","cooking":"fried_egg","knife":"hocho","red_car":"car","sailboat":"boat","waxing_gibbous_moon":"moon","sun_small_cloud":"mostly_sunny","sun_behind_cloud":"barely_sunny","sun_behind_rain_cloud":"partly_sunny_rain","lightning_cloud":"lightning","tornado_cloud":"tornado","tshirt":"shirt","shoe":"mans_shoe","telephone":"phone","lantern":"izakaya_lantern","open_book":"book","envelope":"email","pencil":"memo","heavy_exclamation_mark":"exclamation","staff_of_aesculapius":"medical_symbol","flag-cn":"cn","flag-de":"de","flag-es":"es","flag-fr":"fr","uk":"gb","flag-gb":"gb","flag-it":"it","flag-jp":"jp","flag-kr":"kr","flag-ru":"ru","flag-us":"us"},"sheet":{"cols":61,"rows":61}}
\ No newline at end of file
diff --git a/vendor/emoji-mart.js b/vendor/emoji-mart.js
new file mode 100644
index 0000000..6dbcada
--- /dev/null
+++ b/vendor/emoji-mart.js
@@ -0,0 +1,2 @@
+!function(){function e(e,t,r,n){Object.defineProperty(e,t,{get:r,set:n,enumerable:!0,configurable:!0})}function t(e){return e&&e.__esModule?e.default:e}var r={};function n(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,r,n,o,i,a){try{var s=e[i](a),c=s.value}catch(e){return void r(e)}s.done?t(c):Promise.resolve(c).then(n,o)}function i(e){return function(){var t=this,r=arguments;return new Promise((function(n,i){var a=e.apply(t,r);function s(e){o(a,n,i,s,c,"next",e)}function c(e){o(a,n,i,s,c,"throw",e)}s(void 0)}))}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var c=n.call(a,"catchLoc"),l=n.call(a,"finallyLoc");if(c&&l){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),L(r),v}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,r,n){return this.delegate={iterator:z(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),v}},e}(z);try{regeneratorRuntime=E}catch(e){"object"==typeof globalThis?globalThis.regeneratorRuntime=E:Function("r","regeneratorRuntime = r")(E)}var P,R,O,B,A,T,H={},I=[],D=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function F(e,t){for(var r in t)e[r]=t[r];return e}function V(e){var t=e.parentNode;t&&t.removeChild(e)}function U(e,t,r){var n,o,i,a={};for(i in t)"key"==i?n=t[i]:"ref"==i?o=t[i]:a[i]=t[i];if(arguments.length>2&&(a.children=arguments.length>3?P.call(arguments,2):r),"function"==typeof e&&null!=e.defaultProps)for(i in e.defaultProps)void 0===a[i]&&(a[i]=e.defaultProps[i]);return N(e,a,n,o,null)}function N(e,t,r,n,o){var i={type:e,props:t,key:r,ref:n,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==o?++O:o};return null==o&&null!=R.vnode&&R.vnode(i),i}function q(e){return e.children}function W(e,t){this.props=e,this.context=t}function G(e,t){if(null==t)return e.__?G(e.__,e.__.__k.indexOf(e)+1):null;for(var r;t0?N(p.type,p.props,p.key,null,p.__v):p)){if(p.__=r,p.__b=r.__b+1,null===(h=m[u])||h&&p.key==h.key&&p.type===h.type)m[u]=void 0;else for(d=0;d<_;d++){if((h=m[d])&&p.key==h.key&&p.type===h.type){m[d]=void 0;break}h=null}oe(e,p,h=h||H,o,i,a,s,c,l),f=p.__e,(d=p.ref)&&h.ref!=d&&(g||(g=[]),h.ref&&g.push(h.ref,null,p),g.push(d,p.__c||f,p)),null!=f?(null==v&&(v=f),"function"==typeof p.type&&p.__k===h.__k?p.__d=c=J(p,c,e):c=Q(e,p,h,m,f,c),"function"==typeof r.type&&(r.__d=c)):c&&h.__e==c&&c.parentNode!=e&&(c=G(h))}for(r.__e=v,u=_;u--;)null!=m[u]&&("function"==typeof r.type&&null!=m[u].__e&&m[u].__e==r.__d&&(r.__d=G(n,u+1)),se(m[u],m[u]));if(g)for(u=0;u=o)return!1;var a=t+i/4%t,s=Math.floor(i/4/t),c=e.getImageData(a,s,1,1).data;return n[i]===c[0]&&n[i+2]===c[2]&&!(e.measureText(r).width>=t)}}(),me={latestVersion:function(){var e=!0,t=!1,r=void 0;try{for(var n,o=fe[Symbol.iterator]();!(e=(n=o.next()).done);e=!0){var i=n.value,a=i.v;if(ve(i.emoji))return a}}catch(e){t=!0,r=e}finally{try{e||null==o.return||o.return()}finally{if(t)throw r}}},noCountryFlags:function(){return!ve("🇨🇦")}},_e=["+1","grinning","kissing_heart","heart_eyes","laughing","stuck_out_tongue_winking_eye","sweat_smile","joy","scream","disappointed","unamused","weary","sob","sunglasses","heart"],be=null;var ye,ke={add:function(e){be||(be=he.get("frequently")||{});var t=e.id||e;t&&(be[t]||(be[t]=0),be[t]+=1,he.set("last",t),he.set("frequently",be))},get:function(e){var t=e.maxFrequentRows,r=e.perLine;if(!t)return[];be||(be=he.get("frequently"));var n=[];if(!be){for(var o in be={},_e.slice(0,r)){var i=_e[o];be[i]=r-o,n.push(i)}return n}var a=t*r,s=he.get("last");for(var c in be)n.push(c);if(n.sort((function(e,t){var r=be[t],n=be[e];return r==n?e.localeCompare(t):r-n})),n.length>a){var l=n.slice(a);n=n.slice(0,a);var u=!0,d=!1,h=void 0;try{for(var p,f=l[Symbol.iterator]();!(u=(p=f.next()).done);u=!0){var v=p.value;v!=s&&delete be[v]}}catch(e){d=!0,h=e}finally{try{u||null==f.return||f.return()}finally{if(d)throw h}}s&&-1==n.indexOf(s)&&(delete be[n[n.length-1]],n.splice(-1,1,s)),he.set("frequently",be)}return n},DEFAULTS:_e};ye=JSON.parse('{"search":"Search","search_no_results_1":"Oh no!","search_no_results_2":"That emoji couldn’t be found","pick":"Pick an emoji…","add_custom":"Add custom emoji","categories":{"activity":"Activity","custom":"Custom","flags":"Flags","foods":"Food & Drink","frequent":"Frequently used","nature":"Animals & Nature","objects":"Objects","people":"Smileys & People","places":"Travel & Places","search":"Search Results","symbols":"Symbols"},"skins":{"1":"Default","2":"Light","3":"Medium-Light","4":"Medium","5":"Medium-Dark","6":"Dark","choose":"Choose default skin tone"}}');var we={autoFocus:{value:!1},dynamicWidth:{value:!1},emojiButtonColors:{value:null},emojiButtonRadius:{value:"100%"},emojiButtonSize:{value:36},emojiSize:{value:24},emojiVersion:{value:15,choices:[1,2,3,4,5,11,12,12.1,13,13.1,14,15]},exceptEmojis:{value:[]},icons:{value:"auto",choices:["auto","outline","solid"]},locale:{value:"en",choices:["en","ar","be","cs","de","es","fa","fi","fr","hi","it","ja","ko","nl","pl","pt","ru","sa","tr","uk","vi","zh"]},maxFrequentRows:{value:4},navPosition:{value:"top",choices:["top","bottom","none"]},noCountryFlags:{value:!1},noResultsEmoji:{value:null},perLine:{value:9},previewEmoji:{value:null},previewPosition:{value:"bottom",choices:["top","bottom","none"]},searchPosition:{value:"sticky",choices:["sticky","static","none"]},set:{value:"native",choices:["native","apple","facebook","google","twitter"]},skin:{value:1,choices:[1,2,3,4,5,6]},skinTonePosition:{value:"preview",choices:["preview","search","none"]},theme:{value:"auto",choices:["auto","light","dark"]},categories:null,categoryIcons:null,custom:null,data:null,i18n:null,getImageURL:null,getSpritesheetURL:null,onAddCustomEmoji:null,onClickOutside:null,onEmojiSelect:null,stickySearch:{deprecated:!0,value:!0}},xe=null,Ce=null,Se={};function je(e){return Le.apply(this,arguments)}function Le(){return(Le=i(t(z).mark((function e(r){var n,o;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!Se[r]){e.next=2;break}return e.abrupt("return",Se[r]);case 2:return e.next=4,fetch(r);case 4:return n=e.sent,e.next=7,n.json();case 7:return o=e.sent,Se[r]=o,e.abrupt("return",o);case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var Me=null,ze=null,Ee=!1;function Pe(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).caller;return Me||(Me=new Promise((function(e){ze=e}))),e?Re(e):t&&!Ee&&console.warn("`".concat(t,"` requires data to be initialized first. Promise will be pending until `init` is called.")),Me}function Re(e){return Oe.apply(this,arguments)}function Oe(){return(Oe=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u,d,h,p,f,v,g,m,_,y,k,w,x,C,S,j,L,M,E,P,R,O,B,A,T,H,I,D,F,V,U,N,q,W,G,K;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(Ee=!0,n=r.emojiVersion,o=r.set,i=r.locale,n||(n=we.emojiVersion.value),o||(o=we.set.value),i||(i=we.locale.value),Ce){e.next=36;break}if("function"!=typeof r.data){e.next=12;break}return e.next=9,r.data();case 9:e.t1=e.sent,e.next=13;break;case 12:e.t1=r.data;case 13:if(e.t0=e.t1,e.t0){e.next=18;break}return e.next=17,je("https://cdn.jsdelivr.net/npm/@emoji-mart/data@latest/sets/".concat(n,"/").concat(o,".json"));case 17:e.t0=e.sent;case 18:(Ce=e.t0).emoticons={},Ce.natives={},Ce.categories.unshift({id:"frequent",emojis:[]}),e.t2=regeneratorRuntime.keys(Ce.aliases);case 23:if((e.t3=e.t2()).done){e.next=33;break}if(a=e.t3.value,s=Ce.aliases[a],c=Ce.emojis[s]){e.next=29;break}return e.abrupt("continue",23);case 29:c.aliases||(c.aliases=[]),c.aliases.push(a),e.next=23;break;case 33:Ce.originalCategories=Ce.categories,e.next=37;break;case 36:Ce.categories=Ce.categories.filter((function(e){return!!!e.name}));case 37:if("function"!=typeof r.i18n){e.next=43;break}return e.next=40,r.i18n();case 40:e.t5=e.sent,e.next=44;break;case 43:e.t5=r.i18n;case 44:if(e.t4=e.t5,e.t4){e.next=54;break}if("en"!=i){e.next=50;break}e.t6=t(ye),e.next=53;break;case 50:return e.next=52,je("https://cdn.jsdelivr.net/npm/@emoji-mart/data@latest/i18n/".concat(i,".json"));case 52:e.t6=e.sent;case 53:e.t4=e.t6;case 54:if(xe=e.t4,!r.custom){e.next=87;break}e.t7=regeneratorRuntime.keys(r.custom);case 57:if((e.t8=e.t7()).done){e.next=87;break}if(l=e.t8.value,l=parseInt(l),u=r.custom[l],d=r.custom[l-1],u.emojis&&u.emojis.length){e.next=64;break}return e.abrupt("continue",57);case 64:for(u.id||(u.id="custom_".concat(l+1)),u.name||(u.name=xe.categories.custom),d&&!u.icon&&(u.target=d.target||d),Ce.categories.push(u),h=!0,p=!1,f=void 0,e.prev=69,v=u.emojis[Symbol.iterator]();!(h=(g=v.next()).done);h=!0)m=g.value,Ce.emojis[m.id]=m;e.next=77;break;case 73:e.prev=73,e.t9=e.catch(69),p=!0,f=e.t9;case 77:e.prev=77,e.prev=78,h||null==v.return||v.return();case 80:if(e.prev=80,!p){e.next=83;break}throw f;case 83:return e.finish(80);case 84:return e.finish(77);case 85:e.next=57;break;case 87:r.categories&&(Ce.categories=Ce.originalCategories.filter((function(e){return-1!=r.categories.indexOf(e.id)})).sort((function(e,t){return r.categories.indexOf(e.id)-r.categories.indexOf(t.id)}))),_=null,y=null,"native"==o&&(_=me.latestVersion(),y=r.noCountryFlags||me.noCountryFlags()),k=Ce.categories.length,w=!1;case 93:if(!k--){e.next=179;break}if("frequent"==(x=Ce.categories[k]).id&&(C=r.maxFrequentRows,S=r.perLine,C=C>=0?C:we.maxFrequentRows.value,S||(S=we.perLine.value),x.emojis=ke.get({maxFrequentRows:C,perLine:S})),x.emojis&&x.emojis.length){e.next=99;break}return Ce.categories.splice(k,1),e.abrupt("continue",93);case 99:(j=r.categoryIcons)&&(L=j[x.id])&&!x.icon&&(x.icon=L),M=x.emojis.length;case 102:if(!M--){e.next=177;break}if(E=x.emojis[M],P=E.id?E:Ce.emojis[E],R=function(){x.emojis.splice(M,1)},!(!P||r.exceptEmojis&&r.exceptEmojis.includes(P.id))){e.next=109;break}return R(),e.abrupt("continue",102);case 109:if(!(_&&P.version>_)){e.next=112;break}return R(),e.abrupt("continue",102);case 112:if(!y||"flags"!=x.id){e.next=116;break}if(De.includes(P.id)){e.next=116;break}return R(),e.abrupt("continue",102);case 116:if(P.search){e.next=175;break}if(w=!0,P.search=","+[[P.id,!1],[P.name,!0],[P.keywords,!1],[P.emoticons,!1]].map((function(e){var t=b(e,2),r=t[0],n=t[1];if(r)return(Array.isArray(r)?r:[r]).map((function(e){return(n?e.split(/[-|_|\s]+/):[e]).map((function(e){return e.toLowerCase()}))})).flat()})).flat().filter((function(e){return e&&e.trim()})).join(","),O=!0,B=!1,A=void 0,!P.emoticons){e.next=145;break}e.prev=121,T=P.emoticons[Symbol.iterator]();case 123:if(O=(H=T.next()).done){e.next=131;break}if(I=H.value,!Ce.emoticons[I]){e.next=127;break}return e.abrupt("continue",128);case 127:Ce.emoticons[I]=P.id;case 128:O=!0,e.next=123;break;case 131:e.next=137;break;case 133:e.prev=133,e.t10=e.catch(121),B=!0,A=e.t10;case 137:e.prev=137,e.prev=138,O||null==T.return||T.return();case 140:if(e.prev=140,!B){e.next=143;break}throw A;case 143:return e.finish(140);case 144:return e.finish(137);case 145:D=0,F=!0,V=!1,U=void 0,e.prev=147,N=P.skins[Symbol.iterator]();case 149:if(F=(q=N.next()).done){e.next=161;break}if(W=q.value){e.next=153;break}return e.abrupt("continue",158);case 153:D++,(G=W.native)&&(Ce.natives[G]=P.id,P.search+=",".concat(G)),K=1==D?"":":skin-tone-".concat(D,":"),W.shortcodes=":".concat(P.id,":").concat(K);case 158:F=!0,e.next=149;break;case 161:e.next=167;break;case 163:e.prev=163,e.t11=e.catch(147),V=!0,U=e.t11;case 167:e.prev=167,e.prev=168,F||null==N.return||N.return();case 170:if(e.prev=170,!V){e.next=173;break}throw U;case 173:return e.finish(170);case 174:return e.finish(167);case 175:e.next=102;break;case 177:e.next=93;break;case 179:w&&Ie.reset(),ze();case 181:case"end":return e.stop()}}),e,null,[[69,73,77,85],[78,,80,84],[121,133,137,145],[138,,140,144],[147,163,167,175],[168,,170,174]])})))).apply(this,arguments)}function Be(e,t,r){e||(e={});var n={};for(var o in t)n[o]=Ae(o,e,t,r);return n}function Ae(e,t,r,n){var o=r[e],i=n&&n.getAttribute(e)||(null!=t[e]&&null!=t[e]?t[e]:null);return o?(null!=i&&o.value&&j(o.value)!=(void 0===i?"undefined":j(i))&&(i="boolean"==typeof o.value?"false"!=i:o.value.constructor(i)),o.transform&&i&&(i=o.transform(i)),(null==i||o.choices&&-1==o.choices.indexOf(i))&&(i=o.value),i):i}var Te=null;function He(){return He=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u,d,h,p,f,v,g,m,_,b,y,k,w,x=arguments;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=x.length>1&&void 0!==x[1]?x[1]:{},o=n.maxResults,i=n.caller,r&&r.trim().length){e.next=3;break}return e.abrupt("return",null);case 3:return o||(o=90),e.next=6,Pe(null,{caller:i||"SearchIndex.search"});case 6:if((a=r.toLowerCase().replace(/(\w)-/,"$1 ").split(/[\s|,]+/).filter((function(e,t,r){return e.trim()&&r.indexOf(e)==t}))).length){e.next=9;break}return e.abrupt("return");case 9:s=Te||(Te=Object.values(Ce.emojis)),u=!0,d=!1,h=void 0,e.prev=12,p=a[Symbol.iterator]();case 14:if(u=(f=p.next()).done){e.next=54;break}if(v=f.value,s.length){e.next=18;break}return e.abrupt("break",54);case 18:c=[],l={},g=!0,m=!1,_=void 0,e.prev=21,b=s[Symbol.iterator]();case 23:if(g=(y=b.next()).done){e.next=36;break}if((k=y.value).search){e.next=27;break}return e.abrupt("continue",33);case 27:if(-1!=(w=k.search.indexOf(",".concat(v)))){e.next=30;break}return e.abrupt("continue",33);case 30:c.push(k),l[k.id]||(l[k.id]=0),l[k.id]+=k.id==v?0:w+1;case 33:g=!0,e.next=23;break;case 36:e.next=42;break;case 38:e.prev=38,e.t0=e.catch(21),m=!0,_=e.t0;case 42:e.prev=42,e.prev=43,g||null==b.return||b.return();case 45:if(e.prev=45,!m){e.next=48;break}throw _;case 48:return e.finish(45);case 49:return e.finish(42);case 50:s=c;case 51:u=!0,e.next=14;break;case 54:e.next=60;break;case 56:e.prev=56,e.t1=e.catch(12),d=!0,h=e.t1;case 60:e.prev=60,e.prev=61,u||null==p.return||p.return();case 63:if(e.prev=63,!d){e.next=66;break}throw h;case 66:return e.finish(63);case 67:return e.finish(60);case 68:if(!(c.length<2)){e.next=70;break}return e.abrupt("return",c);case 70:return c.sort((function(e,t){var r=l[e.id],n=l[t.id];return r==n?e.id.localeCompare(t.id):r-n})),c.length>o&&(c=c.slice(0,o)),e.abrupt("return",c);case 73:case"end":return e.stop()}}),e,null,[[12,56,60,68],[21,38,42,50],[43,,45,49],[61,,63,67]])}))),He.apply(this,arguments)}var Ie={search:function(e){return He.apply(this,arguments)},get:function(e){return e.id?e:Ce.emojis[e]||Ce.emojis[Ce.aliases[e]]||Ce.emojis[Ce.natives[e]]},reset:function(){Te=null},SHORTCODES_REGEX:/^(?:\:([^\:]+)\:)(?:\:skin-tone-(\d)\:)?$/},De=["checkered_flag","crossed_flags","pirate_flag","rainbow-flag","transgender_flag","triangular_flag_on_post","waving_black_flag","waving_white_flag"];function Fe(){return Ve.apply(this,arguments)}function Ve(){return Ve=i(t(z).mark((function e(){var r,n=arguments;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=n.length>0&&void 0!==n[0]?n[0]:1,e.t0=regeneratorRuntime.keys(w(Array(r).keys()));case 2:if((e.t1=e.t0()).done){e.next=8;break}return e.t1.value,e.next=6,new Promise(requestAnimationFrame);case 6:e.next=2;break;case 8:case"end":return e.stop()}}),e)}))),Ve.apply(this,arguments)}function Ue(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.skinIndex,n=void 0===r?0:r,o=e.skins[n]||(n=0,e.skins[n]),i={id:e.id,name:e.name,native:o.native,unified:o.unified,keywords:e.keywords,shortcodes:o.shortcodes||e.shortcodes};return e.skins.length>1&&(i.skin=n+1),o.src&&(i.src=o.src),e.aliases&&e.aliases.length&&(i.aliases=e.aliases),e.emoticons&&e.emoticons.length&&(i.emoticons=e.emoticons),i}function Ne(e){return qe.apply(this,arguments)}function qe(){return(qe=i(t(z).mark((function e(r){var n,o,i,a,s,c,l,u;return t(z).wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ie.search(r,{maxResults:1,caller:"getEmojiDataFromNative"});case 2:if((n=e.sent)&&n.length){e.next=5;break}return e.abrupt("return",null);case 5:o=n[0],i=0,a=!0,s=!1,c=void 0,e.prev=8,l=o.skins[Symbol.iterator]();case 10:if(a=(u=l.next()).done){e.next=18;break}if(u.value.native!=r){e.next=14;break}return e.abrupt("break",18);case 14:i++;case 15:a=!0,e.next=10;break;case 18:e.next=24;break;case 20:e.prev=20,e.t0=e.catch(8),s=!0,c=e.t0;case 24:e.prev=24,e.prev=25,a||null==l.return||l.return();case 27:if(e.prev=27,!s){e.next=30;break}throw c;case 30:return e.finish(27);case 31:return e.finish(24);case 32:return e.abrupt("return",Ue(o,{skinIndex:i}));case 33:case"end":return e.stop()}}),e,null,[[8,20,24,32],[25,,27,31]])})))).apply(this,arguments)}var We={categories:{activity:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M16.17 337.5c0 44.98 7.565 83.54 13.98 107.9C35.22 464.3 50.46 496 174.9 496c9.566 0 19.59-.4707 29.84-1.271L17.33 307.3C16.53 317.6 16.17 327.7 16.17 337.5zM495.8 174.5c0-44.98-7.565-83.53-13.98-107.9c-4.688-17.54-18.34-31.23-36.04-35.95C435.5 27.91 392.9 16 337 16c-9.564 0-19.59 .4707-29.84 1.271l187.5 187.5C495.5 194.4 495.8 184.3 495.8 174.5zM26.77 248.8l236.3 236.3c142-36.1 203.9-150.4 222.2-221.1L248.9 26.87C106.9 62.96 45.07 177.2 26.77 248.8zM256 335.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L164.7 283.3C161.6 280.2 160 276.1 160 271.1c0-8.529 6.865-16 16-16c4.095 0 8.189 1.562 11.31 4.688l64.01 64C254.4 327.8 256 331.9 256 335.1zM304 287.1c0 9.141-7.474 16-16 16c-4.094 0-8.188-1.564-11.31-4.689L212.7 235.3C209.6 232.2 208 228.1 208 223.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01C302.5 279.8 304 283.9 304 287.1zM256 175.1c0-9.141 7.473-16 16-16c4.094 0 8.188 1.562 11.31 4.688l64.01 64.01c3.125 3.125 4.688 7.219 4.688 11.31c0 9.133-7.468 16-16 16c-4.094 0-8.189-1.562-11.31-4.688l-64.01-64.01C257.6 184.2 256 180.1 256 175.1z"})})},custom:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",children:de("path",{d:"M417.1 368c-5.937 10.27-16.69 16-27.75 16c-5.422 0-10.92-1.375-15.97-4.281L256 311.4V448c0 17.67-14.33 32-31.1 32S192 465.7 192 448V311.4l-118.3 68.29C68.67 382.6 63.17 384 57.75 384c-11.06 0-21.81-5.734-27.75-16c-8.828-15.31-3.594-34.88 11.72-43.72L159.1 256L41.72 187.7C26.41 178.9 21.17 159.3 29.1 144C36.63 132.5 49.26 126.7 61.65 128.2C65.78 128.7 69.88 130.1 73.72 132.3L192 200.6V64c0-17.67 14.33-32 32-32S256 46.33 256 64v136.6l118.3-68.29c3.838-2.213 7.939-3.539 12.07-4.051C398.7 126.7 411.4 132.5 417.1 144c8.828 15.31 3.594 34.88-11.72 43.72L288 256l118.3 68.28C421.6 333.1 426.8 352.7 417.1 368z"})}),flags:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M64 496C64 504.8 56.75 512 48 512h-32C7.25 512 0 504.8 0 496V32c0-17.75 14.25-32 32-32s32 14.25 32 32V496zM476.3 0c-6.365 0-13.01 1.35-19.34 4.233c-45.69 20.86-79.56 27.94-107.8 27.94c-59.96 0-94.81-31.86-163.9-31.87C160.9 .3055 131.6 4.867 96 15.75v350.5c32-9.984 59.87-14.1 84.85-14.1c73.63 0 124.9 31.78 198.6 31.78c31.91 0 68.02-5.971 111.1-23.09C504.1 355.9 512 344.4 512 332.1V30.73C512 11.1 495.3 0 476.3 0z"})})},foods:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M481.9 270.1C490.9 279.1 496 291.3 496 304C496 316.7 490.9 328.9 481.9 337.9C472.9 346.9 460.7 352 448 352H64C51.27 352 39.06 346.9 30.06 337.9C21.06 328.9 16 316.7 16 304C16 291.3 21.06 279.1 30.06 270.1C39.06 261.1 51.27 256 64 256H448C460.7 256 472.9 261.1 481.9 270.1zM475.3 388.7C478.3 391.7 480 395.8 480 400V416C480 432.1 473.3 449.3 461.3 461.3C449.3 473.3 432.1 480 416 480H96C79.03 480 62.75 473.3 50.75 461.3C38.74 449.3 32 432.1 32 416V400C32 395.8 33.69 391.7 36.69 388.7C39.69 385.7 43.76 384 48 384H464C468.2 384 472.3 385.7 475.3 388.7zM50.39 220.8C45.93 218.6 42.03 215.5 38.97 211.6C35.91 207.7 33.79 203.2 32.75 198.4C31.71 193.5 31.8 188.5 32.99 183.7C54.98 97.02 146.5 32 256 32C365.5 32 457 97.02 479 183.7C480.2 188.5 480.3 193.5 479.2 198.4C478.2 203.2 476.1 207.7 473 211.6C469.1 215.5 466.1 218.6 461.6 220.8C457.2 222.9 452.3 224 447.3 224H64.67C59.73 224 54.84 222.9 50.39 220.8zM372.7 116.7C369.7 119.7 368 123.8 368 128C368 131.2 368.9 134.3 370.7 136.9C372.5 139.5 374.1 141.6 377.9 142.8C380.8 143.1 384 144.3 387.1 143.7C390.2 143.1 393.1 141.6 395.3 139.3C397.6 137.1 399.1 134.2 399.7 131.1C400.3 128 399.1 124.8 398.8 121.9C397.6 118.1 395.5 116.5 392.9 114.7C390.3 112.9 387.2 111.1 384 111.1C379.8 111.1 375.7 113.7 372.7 116.7V116.7zM244.7 84.69C241.7 87.69 240 91.76 240 96C240 99.16 240.9 102.3 242.7 104.9C244.5 107.5 246.1 109.6 249.9 110.8C252.8 111.1 256 112.3 259.1 111.7C262.2 111.1 265.1 109.6 267.3 107.3C269.6 105.1 271.1 102.2 271.7 99.12C272.3 96.02 271.1 92.8 270.8 89.88C269.6 86.95 267.5 84.45 264.9 82.7C262.3 80.94 259.2 79.1 256 79.1C251.8 79.1 247.7 81.69 244.7 84.69V84.69zM116.7 116.7C113.7 119.7 112 123.8 112 128C112 131.2 112.9 134.3 114.7 136.9C116.5 139.5 118.1 141.6 121.9 142.8C124.8 143.1 128 144.3 131.1 143.7C134.2 143.1 137.1 141.6 139.3 139.3C141.6 137.1 143.1 134.2 143.7 131.1C144.3 128 143.1 124.8 142.8 121.9C141.6 118.1 139.5 116.5 136.9 114.7C134.3 112.9 131.2 111.1 128 111.1C123.8 111.1 119.7 113.7 116.7 116.7L116.7 116.7z"})})},frequent:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M13 4h-2l-.001 7H9v2h2v2h2v-2h4v-2h-4z"}),de("path",{d:"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M256 512C114.6 512 0 397.4 0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512zM232 256C232 264 236 271.5 242.7 275.1L338.7 339.1C349.7 347.3 364.6 344.3 371.1 333.3C379.3 322.3 376.3 307.4 365.3 300L280 243.2V120C280 106.7 269.3 96 255.1 96C242.7 96 231.1 106.7 231.1 120L232 256z"})})},nature:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8"}),de("path",{d:"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 576 512",children:de("path",{d:"M332.7 19.85C334.6 8.395 344.5 0 356.1 0C363.6 0 370.6 3.52 375.1 9.502L392 32H444.1C456.8 32 469.1 37.06 478.1 46.06L496 64H552C565.3 64 576 74.75 576 88V112C576 156.2 540.2 192 496 192H426.7L421.6 222.5L309.6 158.5L332.7 19.85zM448 64C439.2 64 432 71.16 432 80C432 88.84 439.2 96 448 96C456.8 96 464 88.84 464 80C464 71.16 456.8 64 448 64zM416 256.1V480C416 497.7 401.7 512 384 512H352C334.3 512 320 497.7 320 480V364.8C295.1 377.1 268.8 384 240 384C211.2 384 184 377.1 160 364.8V480C160 497.7 145.7 512 128 512H96C78.33 512 64 497.7 64 480V249.8C35.23 238.9 12.64 214.5 4.836 183.3L.9558 167.8C-3.331 150.6 7.094 133.2 24.24 128.1C41.38 124.7 58.76 135.1 63.05 152.2L66.93 167.8C70.49 182 83.29 191.1 97.97 191.1H303.8L416 256.1z"})})},objects:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z"}),de("path",{d:"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 384 512",children:de("path",{d:"M112.1 454.3c0 6.297 1.816 12.44 5.284 17.69l17.14 25.69c5.25 7.875 17.17 14.28 26.64 14.28h61.67c9.438 0 21.36-6.401 26.61-14.28l17.08-25.68c2.938-4.438 5.348-12.37 5.348-17.7L272 415.1h-160L112.1 454.3zM191.4 .0132C89.44 .3257 16 82.97 16 175.1c0 44.38 16.44 84.84 43.56 115.8c16.53 18.84 42.34 58.23 52.22 91.45c.0313 .25 .0938 .5166 .125 .7823h160.2c.0313-.2656 .0938-.5166 .125-.7823c9.875-33.22 35.69-72.61 52.22-91.45C351.6 260.8 368 220.4 368 175.1C368 78.61 288.9-.2837 191.4 .0132zM192 96.01c-44.13 0-80 35.89-80 79.1C112 184.8 104.8 192 96 192S80 184.8 80 176c0-61.76 50.25-111.1 112-111.1c8.844 0 16 7.159 16 16S200.8 96.01 192 96.01z"})})},people:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M12 0C5.373 0 0 5.373 0 12s5.373 12 12 12 12-5.373 12-12S18.627 0 12 0m0 22C6.486 22 2 17.514 2 12S6.486 2 12 2s10 4.486 10 10-4.486 10-10 10"}),de("path",{d:"M8 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 8 7M16 7a2 2 0 1 0-.001 3.999A2 2 0 0 0 16 7M15.232 15c-.693 1.195-1.87 2-3.349 2-1.477 0-2.655-.805-3.347-2H15m3-2H6a6 6 0 1 0 12 0"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M0 256C0 114.6 114.6 0 256 0C397.4 0 512 114.6 512 256C512 397.4 397.4 512 256 512C114.6 512 0 397.4 0 256zM256 432C332.1 432 396.2 382 415.2 314.1C419.1 300.4 407.8 288 393.6 288H118.4C104.2 288 92.92 300.4 96.76 314.1C115.8 382 179.9 432 256 432V432zM176.4 160C158.7 160 144.4 174.3 144.4 192C144.4 209.7 158.7 224 176.4 224C194 224 208.4 209.7 208.4 192C208.4 174.3 194 160 176.4 160zM336.4 224C354 224 368.4 209.7 368.4 192C368.4 174.3 354 160 336.4 160C318.7 160 304.4 174.3 304.4 192C304.4 209.7 318.7 224 336.4 224z"})})},places:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:[de("path",{d:"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5"}),de("path",{d:"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z"})]}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M39.61 196.8L74.8 96.29C88.27 57.78 124.6 32 165.4 32H346.6C387.4 32 423.7 57.78 437.2 96.29L472.4 196.8C495.6 206.4 512 229.3 512 256V448C512 465.7 497.7 480 480 480H448C430.3 480 416 465.7 416 448V400H96V448C96 465.7 81.67 480 64 480H32C14.33 480 0 465.7 0 448V256C0 229.3 16.36 206.4 39.61 196.8V196.8zM109.1 192H402.9L376.8 117.4C372.3 104.6 360.2 96 346.6 96H165.4C151.8 96 139.7 104.6 135.2 117.4L109.1 192zM96 256C78.33 256 64 270.3 64 288C64 305.7 78.33 320 96 320C113.7 320 128 305.7 128 288C128 270.3 113.7 256 96 256zM416 320C433.7 320 448 305.7 448 288C448 270.3 433.7 256 416 256C398.3 256 384 270.3 384 288C384 305.7 398.3 320 416 320z"})})},symbols:{outline:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",children:de("path",{d:"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76"})}),solid:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",children:de("path",{d:"M500.3 7.251C507.7 13.33 512 22.41 512 31.1V175.1C512 202.5 483.3 223.1 447.1 223.1C412.7 223.1 383.1 202.5 383.1 175.1C383.1 149.5 412.7 127.1 447.1 127.1V71.03L351.1 90.23V207.1C351.1 234.5 323.3 255.1 287.1 255.1C252.7 255.1 223.1 234.5 223.1 207.1C223.1 181.5 252.7 159.1 287.1 159.1V63.1C287.1 48.74 298.8 35.61 313.7 32.62L473.7 .6198C483.1-1.261 492.9 1.173 500.3 7.251H500.3zM74.66 303.1L86.5 286.2C92.43 277.3 102.4 271.1 113.1 271.1H174.9C185.6 271.1 195.6 277.3 201.5 286.2L213.3 303.1H239.1C266.5 303.1 287.1 325.5 287.1 351.1V463.1C287.1 490.5 266.5 511.1 239.1 511.1H47.1C21.49 511.1-.0019 490.5-.0019 463.1V351.1C-.0019 325.5 21.49 303.1 47.1 303.1H74.66zM143.1 359.1C117.5 359.1 95.1 381.5 95.1 407.1C95.1 434.5 117.5 455.1 143.1 455.1C170.5 455.1 191.1 434.5 191.1 407.1C191.1 381.5 170.5 359.1 143.1 359.1zM440.3 367.1H496C502.7 367.1 508.6 372.1 510.1 378.4C513.3 384.6 511.6 391.7 506.5 396L378.5 508C372.9 512.1 364.6 513.3 358.6 508.9C352.6 504.6 350.3 496.6 353.3 489.7L391.7 399.1H336C329.3 399.1 323.4 395.9 321 389.6C318.7 383.4 320.4 376.3 325.5 371.1L453.5 259.1C459.1 255 467.4 254.7 473.4 259.1C479.4 263.4 481.6 271.4 478.7 278.3L440.3 367.1zM116.7 219.1L19.85 119.2C-8.112 90.26-6.614 42.31 24.85 15.34C51.82-8.137 93.26-3.642 118.2 21.83L128.2 32.32L137.7 21.83C162.7-3.642 203.6-8.137 231.6 15.34C262.6 42.31 264.1 90.26 236.1 119.2L139.7 219.1C133.2 225.6 122.7 225.6 116.7 219.1H116.7z"})})}},search:{loupe:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",children:de("path",{d:"M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"})}),delete:de("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 20 20",children:de("path",{d:"M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z"})})}};function Ge(e){var t=e.id,r=e.skin,n=e.emoji;if(e.shortcodes){var o=e.shortcodes.match(Ie.SHORTCODES_REGEX);o&&(t=o[1],o[2]&&(r=o[2]))}if(n||(n=Ie.get(t||e.native)),!n)return e.fallback;var i=n.skins[r-1]||n.skins[0],a=i.src||("native"==e.set||e.spritesheet?void 0:"function"==typeof e.getImageURL?e.getImageURL(e.set,i.unified):"https://cdn.jsdelivr.net/npm/emoji-datasource-".concat(e.set,"@15.0.1/img/").concat(e.set,"/64/").concat(i.unified,".png")),s="function"==typeof e.getSpritesheetURL?e.getSpritesheetURL(e.set):"https://cdn.jsdelivr.net/npm/emoji-datasource-".concat(e.set,"@15.0.1/img/").concat(e.set,"/sheets-256/64.png");return de("span",{class:"emoji-mart-emoji","data-emoji-set":e.set,children:a?de("img",{style:{maxWidth:e.size||"1em",maxHeight:e.size||"1em",display:"inline-block"},alt:i.native||i.shortcodes,src:a}):"native"==e.set?de("span",{style:{fontSize:e.size,fontFamily:'"EmojiMart", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "Android Emoji"'},children:i.native}):de("span",{style:{display:"block",width:e.size,height:e.size,backgroundImage:"url(".concat(s,")"),backgroundSize:"".concat(100*Ce.sheet.cols,"% ").concat(100*Ce.sheet.rows,"%"),backgroundPosition:"".concat(100/(Ce.sheet.cols-1)*i.x,"% ").concat(100/(Ce.sheet.rows-1)*i.y,"%")}})})}function Ke(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}function $e(e,t,r){return($e=Ke()?Reflect.construct:function(e,t,r){var n=[null];n.push.apply(n,t);var o=new(Function.bind.apply(e,n));return r&&d(o,r.prototype),o}).apply(null,arguments)}function Xe(e,t,r){return $e.apply(null,arguments)}function Ye(e){var t="function"==typeof Map?new Map:void 0;return Ye=function(e){if(null===e||(r=e,-1===Function.toString.call(r).indexOf("[native code]")))return e;var r;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return Xe(e,arguments,S(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),d(n,e)},Ye(e)}function Je(e){return Ye(e)}var Ze=function(e){"use strict";h(r,e);var t=M(r);function r(){var e,o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(a(this,r),(e=t.call(this)).props=o,o.parent||o.ref){var i=null,s=o.parent||(i=o.ref&&o.ref.current);i&&(i.innerHTML=""),s&&s.appendChild(n(e))}return e}return c(r,[{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(var t in e)this.attributeChangedCallback(t,null,e[t])}},{key:"attributeChangedCallback",value:function(e,t,r){if(this.component){var n=Ae(e,l({},e,r),this.constructor.Props,this);this.component.componentWillReceiveProps?this.component.componentWillReceiveProps(l({},e,n)):(this.component.props[e]=n,this.component.forceUpdate())}}},{key:"disconnectedCallback",value:function(){this.disconnected=!0,this.component&&this.component.unregister&&this.component.unregister()}}],[{key:"observedAttributes",get:function(){return Object.keys(this.Props)}}]),r}("undefined"!=typeof window&&window.HTMLElement?window.HTMLElement:Object),Qe=function(e){"use strict";h(r,e);var t=M(r);function r(e){var n,o=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).styles;return a(this,r),(n=t.call(this,e)).setShadow(),n.injectStyles(o),n}return c(r,[{key:"setShadow",value:function(){this.attachShadow({mode:"open"})}},{key:"injectStyles",value:function(e){if(e){var t=document.createElement("style");t.textContent=e,this.shadowRoot.insertBefore(t,this.shadowRoot.firstChild)}}}]),r}(Je(Ze)),et={fallback:"",id:"",native:"",shortcodes:"",size:{value:"",transform:function(e){return/\D/.test(e)?e:"".concat(e,"px")}},set:we.set,skin:we.skin},tt=function(e){"use strict";h(n,e);var r=M(n);function n(e){return a(this,n),r.call(this,e)}return c(n,[{key:"connectedCallback",value:function(){var e=this;return i(t(z).mark((function r(){var n;return t(z).wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return(n=Be(e.props,et,e)).element=e,n.ref=function(t){e.component=t},t.next=5,Pe();case 5:if(!e.disconnected){t.next=7;break}return t.abrupt("return");case 7:le(de(Ge,p({},n)),e);case 8:case"end":return t.stop()}}),r)})))()}}]),n}(Je(Ze));l(tt,"Props",et),"undefined"==typeof customElements||customElements.get("em-emoji")||customElements.define("em-emoji",tt);var rt,nt,ot=[],it=R.__b,at=R.__r,st=R.diffed,ct=R.__c,lt=R.unmount;function ut(){var e;for(ot.sort((function(e,t){return e.__v.__b-t.__v.__b}));e=ot.pop();)if(e.__P)try{e.__H.__h.forEach(ht),e.__H.__h.forEach(pt),e.__H.__h=[]}catch(t){e.__H.__h=[],R.__e(t,e.__v)}}R.__b=function(e){rt=null,it&&it(e)},R.__r=function(e){at&&at(e),0;var t=(rt=e.__c).__H;t&&(t.__h.forEach(ht),t.__h.forEach(pt),t.__h=[])},R.diffed=function(e){st&&st(e);var t=e.__c;t&&t.__H&&t.__H.__h.length&&(1!==ot.push(t)&&nt===R.requestAnimationFrame||((nt=R.requestAnimationFrame)||function(e){var t,r=function(){clearTimeout(n),dt&&cancelAnimationFrame(t),setTimeout(e)},n=setTimeout(r,100);dt&&(t=requestAnimationFrame(r))})(ut)),rt=null},R.__c=function(e,t){t.some((function(e){try{e.__h.forEach(ht),e.__h=e.__h.filter((function(e){return!e.__||pt(e)}))}catch(r){t.some((function(e){e.__h&&(e.__h=[])})),t=[],R.__e(r,e.__v)}})),ct&&ct(e,t)},R.unmount=function(e){lt&<(e);var t,r=e.__c;r&&r.__H&&(r.__H.__.forEach((function(e){try{ht(e)}catch(e){t=e}})),t&&R.__e(t,r.__v))};var dt="function"==typeof requestAnimationFrame;function ht(e){var t=rt,r=e.__c;"function"==typeof r&&(e.__c=void 0,r()),rt=t}function pt(e){var t=rt;e.__c=e.__(),rt=t}function ft(e,t){for(var r in t)e[r]=t[r];return e}function vt(e,t){for(var r in e)if("__source"!==r&&!(r in t))return!0;for(var n in t)if("__source"!==n&&e[n]!==t[n])return!0;return!1}function gt(e){this.props=e}(gt.prototype=new W).isPureReactComponent=!0,gt.prototype.shouldComponentUpdate=function(e,t){return vt(this.props,e)||vt(this.state,t)};var mt=R.__b;R.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),mt&&mt(e)};"undefined"!=typeof Symbol&&Symbol.for&&Symbol.for("react.forward_ref");var _t=R.__e;R.__e=function(e,t,r){if(e.then)for(var n,o=t;o=o.__;)if((n=o.__c)&&n.__c)return null==t.__e&&(t.__e=r.__e,t.__k=r.__k),n.__c(e,t);_t(e,t,r)};var bt=R.unmount;function yt(){this.__u=0,this.t=null,this.__b=null}function kt(e){var t=e.__.__c;return t&&t.__e&&t.__e(e)}function wt(){this.u=null,this.o=null}R.unmount=function(e){var t=e.__c;t&&t.__R&&t.__R(),t&&!0===e.__h&&(e.type=null),bt&&bt(e)},(yt.prototype=new W).__c=function(e,t){var r=t.__c,n=this;null==n.t&&(n.t=[]),n.t.push(r);var o=kt(n.__v),i=!1,a=function(){i||(i=!0,r.__R=null,o?o(s):s())};r.__R=a;var s=function(){if(!--n.__u){if(n.state.__e){var e=n.state.__e;n.__v.__k[0]=function e(t,r,n){return t&&(t.__v=null,t.__k=t.__k&&t.__k.map((function(t){return e(t,r,n)})),t.__c&&t.__c.__P===r&&(t.__e&&n.insertBefore(t.__e,t.__d),t.__c.__e=!0,t.__c.__P=n)),t}(e,e.__c.__P,e.__c.__O)}var t;for(n.setState({__e:n.__b=null});t=n.t.pop();)t.forceUpdate()}},c=!0===t.__h;n.__u++||c||n.setState({__e:n.__b=n.__v.__k[0]}),e.then(a,a)},yt.prototype.componentWillUnmount=function(){this.t=[]},yt.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var r=document.createElement("div"),n=this.__v.__k[0].__c;this.__v.__k[0]=function e(t,r,n){return t&&(t.__c&&t.__c.__H&&(t.__c.__H.__.forEach((function(e){"function"==typeof e.__c&&e.__c()})),t.__c.__H=null),null!=(t=ft({},t)).__c&&(t.__c.__P===n&&(t.__c.__P=r),t.__c=null),t.__k=t.__k&&t.__k.map((function(t){return e(t,r,n)}))),t}(this.__b,r,n.__O=n.__P)}this.__b=null}var o=t.__e&&U(q,null,e.fallback);return o&&(o.__h=null),[U(q,null,t.__e?null:e.children),o]};var xt=function(e,t,r){if(++r[1]===r[0]&&e.o.delete(t),e.props.revealOrder&&("t"!==e.props.revealOrder[0]||!e.o.size))for(r=e.u;r;){for(;r.length>3;)r.pop()();if(r[1]0&&void 0!==arguments[0]?arguments[0]:this.props;return{skin:he.get("skin")||e.skin,theme:this.initTheme(e.theme)}}},{key:"componentWillMount",value:function(){this.dir=xe.rtl?"rtl":"ltr",this.refs={menu:{current:null},navigation:{current:null},scroll:{current:null},search:{current:null},searchInput:{current:null},skinToneButton:{current:null},skinToneRadio:{current:null}},this.initGrid(),0==this.props.stickySearch&&"sticky"==this.props.searchPosition&&(console.warn("[EmojiMart] Deprecation warning: `stickySearch` has been renamed `searchPosition`."),this.props.searchPosition="static")}},{key:"componentDidMount",value:function(){if(this.register(),this.shadowRoot=this.base.parentNode,this.props.autoFocus){var e=this.refs.searchInput;e.current&&e.current.focus()}}},{key:"componentWillReceiveProps",value:function(e){var t=this;for(var r in this.nextState||(this.nextState={}),e)this.nextState[r]=e[r];clearTimeout(this.nextStateTimer),this.nextStateTimer=setTimeout((function(){var e=!1;for(var r in t.nextState)t.props[r]=t.nextState[r],"custom"!==r&&"categories"!==r||(e=!0);delete t.nextState;var n=t.getInitialState();if(e)return t.reset(n);t.setState(n)}))}},{key:"componentWillUnmount",value:function(){this.unregister()}},{key:"reset",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=this;return i(t(z).mark((function n(){return t(z).wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Pe(r.props);case 2:r.initGrid(),r.unobserve(),r.setState(e,(function(){r.observeCategories(),r.observeRows()}));case 5:case"end":return t.stop()}}),n)})))()}},{key:"register",value:function(){document.addEventListener("click",this.handleClickOutside),this.observe()}},{key:"unregister",value:function(){var e;document.removeEventListener("click",this.handleClickOutside),null===(e=this.darkMedia)||void 0===e||e.removeEventListener("change",this.darkMediaCallback),this.unobserve()}},{key:"observe",value:function(){this.observeCategories(),this.observeRows()}},{key:"unobserve",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.except,r=void 0===t?[]:t;Array.isArray(r)||(r=[r]);var n=!0,o=!1,i=void 0;try{for(var a,s=this.observers[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value;r.includes(c)||c.disconnect()}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}this.observers=[].concat(r)}},{key:"initGrid",value:function(){var e=this,t=Ce.categories;this.refs.categories=new Map;var r=Ce.categories.map((function(e){return e.id})).join(",");this.navKey&&this.navKey!=r&&this.refs.scroll.current&&(this.refs.scroll.current.scrollTop=0),this.navKey=r,this.grid=[],this.grid.setsize=0;var n=function(t,r){var n=[];n.__categoryId=r.id,n.__index=t.length,e.grid.push(n);var o=e.grid.length-1,i=o%Ht?{}:{current:null};return i.index=o,i.posinset=e.grid.setsize+1,t.push(i),n},o=!0,i=!1,a=void 0;try{for(var s,c=t[Symbol.iterator]();!(o=(s=c.next()).done);o=!0){var l=s.value,u=[],d=n(u,l),h=!0,p=!1,f=void 0;try{for(var v,g=l.emojis[Symbol.iterator]();!(h=(v=g.next()).done);h=!0){var m=v.value;d.length==this.getPerLine()&&(d=n(u,l)),this.grid.setsize+=1,d.push(m)}}catch(e){p=!0,f=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw f}}this.refs.categories.set(l.id,{root:{current:null},rows:u})}}catch(e){i=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw a}}}},{key:"initTheme",value:function(e){if("auto"!=e)return e;if(!this.darkMedia){if(this.darkMedia=matchMedia("(prefers-color-scheme: dark)"),this.darkMedia.media.match(/^not/))return"light";this.darkMedia.addEventListener("change",this.darkMediaCallback)}return this.darkMedia.matches?"dark":"light"}},{key:"initDynamicPerLine",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props,t=this;if(e.dynamicWidth){var r=e.element,n=e.emojiButtonSize,o=function(){var e=r.getBoundingClientRect().width;return Math.floor(e/n)},i=new ResizeObserver((function(){var e=t;t.unobserve({except:i}),t.setState({perLine:o()},(function(){var t=e;e.initGrid(),e.forceUpdate((function(){t.observeCategories(),t.observeRows()}))}))}));return i.observe(r),this.observers.push(i),o()}}},{key:"getPerLine",value:function(){return this.state.perLine||this.props.perLine}},{key:"getEmojiByPos",value:function(e){var t=b(e,2),r=t[0],n=t[1],o=this.state.searchResults||this.grid,i=o[r]&&o[r][n];if(i)return Ie.get(i)}},{key:"observeCategories",value:function(){var e=this.refs.navigation.current;if(e){var t=new Map,r={root:this.refs.scroll.current,threshold:[0,1]},n=new IntersectionObserver((function(r){var n=!0,o=!1,i=void 0;try{for(var a,s=r[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value,l=c.target.dataset.id;t.set(l,c.intersectionRatio)}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}var u,d=w(t),h=!0,p=!1,f=void 0;try{for(var v,g=d[Symbol.iterator]();!(h=(v=g.next()).done);h=!0){var m=b(v.value,2),_=m[0];if(m[1]){(u=_)!=e.state.categoryId&&e.setState({categoryId:u});break}}}catch(e){p=!0,f=e}finally{try{h||null==g.return||g.return()}finally{if(p)throw f}}}),r),o=!0,i=!1,a=void 0;try{for(var s,c=this.refs.categories.values()[Symbol.iterator]();!(o=(s=c.next()).done);o=!0){var l=s.value.root;n.observe(l.current)}}catch(e){i=!0,a=e}finally{try{o||null==c.return||c.return()}finally{if(i)throw a}}this.observers.push(n)}}},{key:"observeRows",value:function(){var e=this,t=p({},this.state.visibleRows),r=new IntersectionObserver((function(r){var n=!0,o=!1,i=void 0;try{for(var a,s=r[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value,l=parseInt(c.target.dataset.index);c.isIntersecting?t[l]=!0:delete t[l]}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}e.setState({visibleRows:t})}),{root:this.refs.scroll.current,rootMargin:"".concat(this.props.emojiButtonSize*(Ht+5),"px 0px ").concat(this.props.emojiButtonSize*Ht,"px")}),n=!0,o=!1,i=void 0;try{for(var a,s=this.refs.categories.values()[Symbol.iterator]();!(n=(a=s.next()).done);n=!0){var c=a.value.rows,l=!0,u=!1,d=void 0;try{for(var h,f=c[Symbol.iterator]();!(l=(h=f.next()).done);l=!0){var v=h.value;v.current&&r.observe(v.current)}}catch(e){u=!0,d=e}finally{try{l||null==f.return||f.return()}finally{if(u)throw d}}}}catch(e){o=!0,i=e}finally{try{n||null==s.return||s.return()}finally{if(o)throw i}}this.observers.push(r)}},{key:"preventDefault",value:function(e){e.preventDefault()}},{key:"unfocusSearch",value:function(){var e=this.refs.searchInput.current;e&&e.blur()}},{key:"navigate",value:function(e){var t=e.e,r=e.input,n=e.left,o=e.right,i=e.up,a=e.down,s=this,c=this.state.searchResults||this.grid;if(c.length){var l=b(this.state.pos,2),u=l[0],d=l[1],h=function(){if(0==u&&0==d&&!t.repeat&&(n||i))return null;if(-1==u)return t.repeat||!o&&!a||r.selectionStart!=r.value.length?null:[0,0];if(n||o){var e=c[u],s=n?-1:1;if(!e[d+=s]){if(!(e=c[u+=s]))return u=n?0:c.length-1,d=n?0:c[u].length-1,[u,d];d=n?e.length-1:0}return[u,d]}if(i||a){var l=c[u+=i?-1:1];return l?(l[d]||(d=l.length-1),[u,d]):(u=i?0:c.length-1,d=i?0:c[u].length-1,[u,d])}}();h?(t.preventDefault(),this.setState({pos:h,keyboard:!0},(function(){s.scrollTo({row:h[0]})}))):this.state.pos[0]>-1&&this.setState({pos:[-1,-1]})}}},{key:"scrollTo",value:function(e){var t=e.categoryId,r=e.row,n=this.state.searchResults||this.grid;if(n.length){var o=this.refs.scroll.current,i=o.getBoundingClientRect(),a=0;if(r>=0&&(t=n[r].__categoryId),t)a=(this.refs[t]||this.refs.categories.get(t).root).current.getBoundingClientRect().top-(i.top-o.scrollTop)+1;if(r>=0)if(r){var s=a+n[r].__index*this.props.emojiButtonSize,c=s+this.props.emojiButtonSize+.88*this.props.emojiButtonSize;if(so.scrollTop+i.height))return;a=c-i.height}}else a=0;this.ignoreMouse(),o.scrollTop=a}}},{key:"ignoreMouse",value:function(){var e=this;this.mouseIsIgnored=!0,clearTimeout(this.ignoreMouseTimer),this.ignoreMouseTimer=setTimeout((function(){delete e.mouseIsIgnored}),100)}},{key:"handleEmojiOver",value:function(e){this.mouseIsIgnored||this.state.showSkins||this.setState({pos:e||[-1,-1],keyboard:!1})}},{key:"handleEmojiClick",value:function(e){var t=e.e,r=e.emoji,n=e.pos;if(this.props.onEmojiSelect&&(!r&&n&&(r=this.getEmojiByPos(n)),r)){var o=Ue(r,{skinIndex:this.state.skin-1});this.props.maxFrequentRows&&ke.add(o,this.props),this.props.onEmojiSelect(o,t)}}},{key:"closeSkins",value:function(){this.state.showSkins&&(this.setState({showSkins:null,tempSkin:null}),this.base.removeEventListener("click",this.handleBaseClick),this.base.removeEventListener("keydown",this.handleBaseKeydown))}},{key:"handleSkinMouseOver",value:function(e){this.setState({tempSkin:e})}},{key:"handleSkinClick",value:function(e){this.ignoreMouse(),this.closeSkins(),this.setState({skin:e,tempSkin:null}),he.set("skin",e)}},{key:"renderNav",value:function(){return de(At,{ref:this.refs.navigation,icons:this.props.icons,theme:this.state.theme,dir:this.dir,unfocused:!!this.state.searchResults,position:this.props.navPosition,onClick:this.handleCategoryClick},this.navKey)}},{key:"renderPreview",value:function(){var e=this.getEmojiByPos(this.state.pos),t=this.state.searchResults&&!this.state.searchResults.length;return de("div",{id:"preview",class:"flex flex-middle",dir:this.dir,"data-position":this.props.previewPosition,children:[de("div",{class:"flex flex-middle flex-grow",children:[de("div",{class:"flex flex-auto flex-middle flex-center",style:{height:this.props.emojiButtonSize,fontSize:this.props.emojiButtonSize},children:de(Ge,{emoji:e,id:t?this.props.noResultsEmoji||"cry":this.props.previewEmoji||("top"==this.props.previewPosition?"point_down":"point_up"),set:this.props.set,size:this.props.emojiButtonSize,skin:this.state.tempSkin||this.state.skin,spritesheet:!0,getSpritesheetURL:this.props.getSpritesheetURL})}),de("div",{class:"margin-".concat(this.dir[0]),children:de("div",e||t?{class:"padding-".concat(this.dir[2]," align-").concat(this.dir[0]),children:[de("div",{class:"preview-title ellipsis",children:e?e.name:xe.search_no_results_1}),de("div",{class:"preview-subtitle ellipsis color-c",children:e?e.skins[0].shortcodes:xe.search_no_results_2})]}:{class:"preview-placeholder color-c",children:xe.pick})})]}),!e&&"preview"==this.props.skinTonePosition&&this.renderSkinToneButton()]})}},{key:"renderEmojiButton",value:function(e,t){var r,n,o=t.pos,i=t.posinset,a=t.grid,s=this,c=this.props.emojiButtonSize,l=this.state.tempSkin||this.state.skin,u=(e.skins[l-1]||e.skins[0]).native,d=(r=this.state.pos,n=o,Array.isArray(r)&&Array.isArray(n)&&r.length===n.length&&r.every((function(e,t){return e==n[t]}))),h=o.concat(e.id).join("");return de(Tt,{selected:d,skin:l,size:c,children:de("button",{"aria-label":u,"aria-selected":d||void 0,"aria-posinset":i,"aria-setsize":a.setsize,"data-keyboard":this.state.keyboard,title:"none"==this.props.previewPosition?e.name:void 0,type:"button",class:"flex flex-center flex-middle",tabindex:"-1",onClick:function(t){return s.handleEmojiClick({e:t,emoji:e})},onMouseEnter:function(){return s.handleEmojiOver(o)},onMouseLeave:function(){return s.handleEmojiOver()},style:{width:this.props.emojiButtonSize,height:this.props.emojiButtonSize,fontSize:this.props.emojiSize,lineHeight:0},children:[de("div",{"aria-hidden":"true",class:"background",style:{borderRadius:this.props.emojiButtonRadius,backgroundColor:this.props.emojiButtonColors?this.props.emojiButtonColors[(i-1)%this.props.emojiButtonColors.length]:void 0}}),de(Ge,{emoji:e,set:this.props.set,size:this.props.emojiSize,skin:l,spritesheet:!0,getSpritesheetURL:this.props.getSpritesheetURL})]})},h)}},{key:"renderSearch",value:function(){var e="none"==this.props.previewPosition||"search"==this.props.skinTonePosition;return de("div",{children:[de("div",{class:"spacer"}),de("div",{class:"flex flex-middle",children:[de("div",{class:"search relative flex-grow",children:[de("input",{type:"search",ref:this.refs.searchInput,placeholder:xe.search,onClick:this.handleSearchClick,onInput:this.handleSearchInput,onKeyDown:this.handleSearchKeyDown,autoComplete:"off"}),de("span",{class:"icon loupe flex",children:We.search.loupe}),this.state.searchResults&&de("button",{title:"Clear","aria-label":"Clear",type:"button",class:"icon delete flex",onClick:this.clearSearch,onMouseDown:this.preventDefault,children:We.search.delete})]}),e&&this.renderSkinToneButton()]})]})}},{key:"renderSearchResults",value:function(){var e=this,t=this.state.searchResults;return t?de("div",{class:"category",ref:this.refs.search,children:[de("div",{class:"sticky padding-small align-".concat(this.dir[0]),children:xe.categories.search}),de("div",{children:t.length?t.map((function(r,n){var o=e;return de("div",{class:"flex",children:r.map((function(e,r){return o.renderEmojiButton(e,{pos:[n,r],posinset:n*o.props.perLine+r+1,grid:t})}))})})):de("div",{class:"padding-small align-".concat(this.dir[0]),children:this.props.onAddCustomEmoji&&de("a",{onClick:this.props.onAddCustomEmoji,children:xe.add_custom})})})]}):null}},{key:"renderCategories",value:function(){var e=this,t=Ce.categories,r=!!this.state.searchResults,n=this.getPerLine();return de("div",{style:{visibility:r?"hidden":void 0,display:r?"none":void 0,height:"100%"},children:t.map((function(t){var r=e,o=e.refs.categories.get(t.id),i=o.root,a=o.rows;return de("div",{"data-id":t.target?t.target.id:t.id,class:"category",ref:i,children:[de("div",{class:"sticky padding-small align-".concat(e.dir[0]),children:t.name||xe.categories[t.id]}),de("div",{class:"relative",style:{height:a.length*e.props.emojiButtonSize},children:a.map((function(e,o){var i,a=r,s=e.index-e.index%Ht,c=r.state.visibleRows[s],l="current"in e?e:void 0;if(!c&&!l)return null;var u=o*n,d=u+n,h=t.emojis.slice(u,d);return h.length*{position:relative}.category button .background{opacity:0;background-color:var(--em-color-border);transition:opacity var(--duration-fast)var(--easing)var(--duration-instant);position:absolute;top:0;bottom:0;left:0;right:0}.category button:hover .background{transition-duration:var(--duration-instant);transition-delay:0s}.category button[aria-selected] .background{opacity:1}.category button[data-keyboard] .background{transition:none}.row{width:100%;position:absolute;top:0;left:0}.skin-tone-button{border:1px solid transparent;border-radius:100%}.skin-tone-button:hover{border-color:var(--em-color-border)}.skin-tone-button:active .skin-tone{transform:scale(.85)!important}.skin-tone-button .skin-tone{transition:transform var(--duration)var(--easing)}.skin-tone-button[aria-selected]{background-color:var(--em-color-border);border-top-color:rgba(0,0,0,.05);border-bottom-color:transparent;border-left-width:0;border-right-width:0}.skin-tone-button[aria-selected] .skin-tone{transform:scale(.9)}.menu{z-index:2;white-space:nowrap;border:1px solid var(--em-color-border);background-color:rgba(var(--em-rgb-background),.9);-webkit-backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition-property:opacity,transform;transition-duration:var(--duration);transition-timing-function:var(--easing);border-radius:10px;padding:4px;position:absolute;box-shadow:1px 1px 5px rgba(0,0,0,.05)}.menu.hidden{opacity:0}.menu[data-position=bottom]{transform-origin:100% 100%}.menu[data-position=bottom].hidden{transform:scale(.9)rotate(-3deg)translateY(5%)}.menu[data-position=top]{transform-origin:100% 0}.menu[data-position=top].hidden{transform:scale(.9)rotate(3deg)translateY(-5%)}.menu input[type=radio]{clip:rect(0 0 0 0);width:1px;height:1px;border:0;margin:0;padding:0;position:absolute;overflow:hidden}.menu input[type=radio]:checked+.option{box-shadow:0 0 0 2px rgb(var(--em-rgb-accent))}.option{width:100%;border-radius:6px;padding:4px 6px}.option:hover{color:#fff;background-color:rgb(var(--em-rgb-accent))}.skin-tone{width:16px;height:16px;border-radius:100%;display:inline-block;position:relative;overflow:hidden}.skin-tone:after{content:"";mix-blend-mode:overlay;background:linear-gradient(rgba(255,255,255,.2),transparent);border:1px solid rgba(0,0,0,.8);border-radius:100%;position:absolute;top:0;bottom:0;left:0;right:0;box-shadow:inset 0 -2px 3px #000,inset 0 1px 2px #fff}.skin-tone-1{background-color:#ffc93a}.skin-tone-2{background-color:#ffdab7}.skin-tone-3{background-color:#e7b98f}.skin-tone-4{background-color:#c88c61}.skin-tone-5{background-color:#a46134}.skin-tone-6{background-color:#5d4437}[data-index]{justify-content:space-between}[data-emoji-set=twitter] .skin-tone:after{box-shadow:none;border-color:rgba(0,0,0,.5)}[data-emoji-set=twitter] .skin-tone-1{background-color:#fade72}[data-emoji-set=twitter] .skin-tone-2{background-color:#f3dfd0}[data-emoji-set=twitter] .skin-tone-3{background-color:#eed3a8}[data-emoji-set=twitter] .skin-tone-4{background-color:#cfad8d}[data-emoji-set=twitter] .skin-tone-5{background-color:#a8805d}[data-emoji-set=twitter] .skin-tone-6{background-color:#765542}[data-emoji-set=google] .skin-tone:after{box-shadow:inset 0 0 2px 2px rgba(0,0,0,.4)}[data-emoji-set=google] .skin-tone-1{background-color:#f5c748}[data-emoji-set=google] .skin-tone-2{background-color:#f1d5aa}[data-emoji-set=google] .skin-tone-3{background-color:#d4b48d}[data-emoji-set=google] .skin-tone-4{background-color:#aa876b}[data-emoji-set=google] .skin-tone-5{background-color:#916544}[data-emoji-set=google] .skin-tone-6{background-color:#61493f}[data-emoji-set=facebook] .skin-tone:after{border-color:rgba(0,0,0,.4);box-shadow:inset 0 -2px 3px #000,inset 0 1px 4px #fff}[data-emoji-set=facebook] .skin-tone-1{background-color:#f5c748}[data-emoji-set=facebook] .skin-tone-2{background-color:#f1d5aa}[data-emoji-set=facebook] .skin-tone-3{background-color:#d4b48d}[data-emoji-set=facebook] .skin-tone-4{background-color:#aa876b}[data-emoji-set=facebook] .skin-tone-5{background-color:#916544}[data-emoji-set=facebook] .skin-tone-6{background-color:#61493f}',window.EmojiMart=r}();
+//# sourceMappingURL=browser.js.map