diff --git a/.arcconfig b/.arcconfig deleted file mode 100644 index dd69fbb779..0000000000 --- a/.arcconfig +++ /dev/null @@ -1,11 +0,0 @@ -{ - "project_id" : "edgehill", - "conduit_uri" : "https://review.inboxapp.com/", - "load" : [ - "arclib" - ], - "lint.engine": "ArcanistSingleLintEngine", - "lint.engine.single.linter": "ArcanistScriptAndRegexLinter", - "linter.scriptandregex.script": "script/lint.sh", - "linter.scriptandregex.regex": "/^ ((?P✖)|(?P⚠)) *line (?P\\d+) +(?P.*)$/m" -} diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000000..50a519048a --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": "./build/config/eslint.json" +} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 6eb1a23ae9..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,14 +0,0 @@ -# Specs depend on character counts, if we don't specify the line endings the -# fixtures will vary depending on platform -spec/fixtures/**/*.js text eol=lf -spec/fixtures/**/*.coffee text eol=lf -spec/fixtures/**/*.less text eol=lf -spec/fixtures/**/*.css text eol=lf -spec/fixtures/**/*.txt text eol=lf -spec/fixtures/dir/**/* text eol=lf - -# Git 1.7 does not support **/* patterns -spec/fixtures/css.css text eol=lf -spec/fixtures/sample.js text eol=lf -spec/fixtures/sample.less text eol=lf -spec/fixtures/sample.txt text eol=lf diff --git a/.gitignore b/.gitignore index 962578505c..cf6dbff09c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +.arcconfig +.arclint +arclib *.swp *~ .DS_Store @@ -9,8 +12,35 @@ node_modules npm-debug.log debug.log /tags -/atom-shell/ -docs/output -docs/includes +/electron/ +/_docs_output +/junitxml + spec/fixtures/evil-files/ -yoursway-create-dmg +build/resources/certs +/_site +/.sass-cache +.integration-test-config +.idea/ +spec-saved-state.json + +!spec/fixtures/packages/package-with-incompatible-native-module/node_modules + +#emacs +*~ +*# + +/src/error-logger-extensions +/src/nylas-private-* +internal_packages/nylas-private-* +internal_packages/activity-list +internal_packages/composer-mail-merge +internal_packages/composer-scheduler +internal_packages/link-tracking +internal_packages/open-tracking +internal_packages/send-later +internal_packages/send-reminders +internal_packages/thread-sharing +internal_packages/local-sync +/dist +/dump.rdb diff --git a/.gitmodules b/.gitmodules index e69de29bb2..62731142c6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/K2"] + path = src/K2 + url = git@github.com:nylas/K2.git diff --git a/.node-version b/.node-version deleted file mode 100644 index b58b2ff994..0000000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -v0.10.33 diff --git a/.npmrc b/.npmrc deleted file mode 100644 index c5ff09782f..0000000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -cache = ~/.atom/.npm diff --git a/.pairs b/.pairs deleted file mode 100644 index 2955310284..0000000000 --- a/.pairs +++ /dev/null @@ -1,17 +0,0 @@ -pairs: - ns: Nathan Sobo; nathan - cj: Corey Johnson; cj - dg: David Graham; dgraham - ks: Kevin Sawicki; kevin - jc: Jerry Cheung; jerry - bl: Brian Lopez; brian - jp: Justin Palmer; justin - gt: Garen Torikian; garen - mc: Matt Colyer; mcolyer - bo: Ben Ogle; benogle - jr: Jason Rudolph; jasonrudolph - jl: Jessica Lord; jlord - dh: Daniel Hengeveld; danielh -email: - domain: github.com -#global: true diff --git a/.python-version b/.python-version deleted file mode 100644 index 49cdd668e1..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -2.7.6 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..b2de05d9f7 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,94 @@ +sudo: false + +git: + submodules: false + +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - build-essential + - clang + - fakeroot + - g++-4.8 + - git + - libgnome-keyring-dev + - xvfb + - rpm + - libxext-dev + - libxtst-dev + - libxkbfile-dev + +branches: + only: + - master + - ci-test + - /stable.*/ + - /ci-build\/.*/ + +matrix: + include: + - os: linux + env: NODE_VERSION=6.9 CC=gcc-4.8 CXX=g++-4.8 + - os: osx + env: NODE_VERSION=6.9 CC=clang CXX=clang++ + +before_install: +- if [ "${TRAVIS_PULL_REQUEST}" = "false" ] && [ "${MIRROR}" = "false" ]; then + openssl aes-256-cbc -k "$DECRYPTION_PASSWORD" -in build/resources/ssh/nylas-n1-ci-ssh.openssl.enc -out nylas-n1-ci-ssh -d; + mv nylas-n1-ci-ssh ~/.ssh/id_rsa; + chmod 400 ~/.ssh/id_rsa; + ssh-keyscan github.com >> ~/.ssh/known_hosts; + git submodule update --init --recursive; + 2>/dev/null 1>/dev/null openssl aes-256-cbc -K $encrypted_d583b56b822e_key -iv $encrypted_d583b56b822e_iv -in src/K2/packages/local-private/encrypted_certificates/travis/travis-files.tar.enc -out src/K2/packages/local-private/encrypted_certificates/travis/travis-files.tar -d; + mkdir build/resources/certs; + 2>/dev/null 1>/dev/null tar xvf src/K2/packages/local-private/encrypted_certificates/travis/travis-files.tar --directory=build/resources/certs/; + 2>/dev/null 1>/dev/null source build/resources/certs/set_unix_env.sh; + fi +- if [ "${MIRROR}" = "true" ]; then + export PUBLISH_BUILD=true; + git submodule update --init --recursive; + 2>/dev/null 1>/dev/null openssl aes-256-cbc -K $encrypted_e6bb7e15b74d_key -iv $encrypted_e6bb7e15b74d_iv -in src/K2/packages/local-private/encrypted_certificates/travis/travis-files-mirror.tar.enc -out src/K2/packages/local-private/encrypted_certificates/travis/travis-files.tar -d; + mkdir build/resources/certs; + 2>/dev/null 1>/dev/null tar xvf src/K2/packages/local-private/encrypted_certificates/travis/travis-files.tar --directory=build/resources/certs/; + 2>/dev/null 1>/dev/null source build/resources/certs/set_unix_env.sh; + fi + +install: +- echo $CC +- echo $CXX +- clang --version +- if [ "$CC" = "gcc-4.8" ]; then gcc-4.8 -v; else gcc -v; fi +- git clone https://github.com/creationix/nvm.git /tmp/.nvm +- source /tmp/.nvm/nvm.sh +- nvm install $NODE_VERSION +- nvm use --delete-prefix $NODE_VERSION + +before_script: +- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then + export DISPLAY=:99.0; + sh -e /etc/init.d/xvfb start; + fi + +script: +- if [ "${TRAVIS_OS_NAME}" == "linux" ]; then + script/bootstrap && script/grunt ci --stack --no-color; + else + script/bootstrap && npm test && script/grunt ci --stack --no-color; + fi + +cache: + directories: + - node_modules + - apm/node_modules + - build/node_modules + +# The NYLAS_GITHUB_OAUTH_TOKEN is overriden by build/resources/certs/set_unix_env.sh +env: + global: + - secure: O+XG3C/VnCfCVXTHudOQ6JMmBqrRHXh1j7jRwfQ3PYd27gm9BWNjvwlbWTLNcaar9gM00Pwi3rR8IujzJLlw3usZGWbJMLkz+aPYdOlbiDLhyMdIHwX4oI58d1eHx7m8Eun3qT3Y0VkO3blBNdWFWV4ebkfLZyygzXva4CDlSFtbeQYGy4ft76v7Au9uVlOUoV8f+juPx+0Jv+AtQmsY9Sf+6WbxrNaE9y2u2q1ks+XpjFn8Wt1f/xp/Vae0/MjJFpGIVfaUy+q7W8QQ0TyzSCM0eGtjxilS+BkGHjjvlLlMdCspRnZzpSJC+KkpEKLJrAPjR0DAfYMedWockEaIwGG8Onf90fXKG0nlvAg4WrWjnpr0q+V79zOU/yYD/kysLBYg6fYzv6uTvN7TzNaFkKaiQZvorI9P8w/wShGFHE4Y8JC5QU4CLI8q2qrkI38KKt3valIP4qxA/56aM0+D5roTecfh3Y40OcpqKZicpeNvuB1u2FmD2+oxLEb3MVnyfnVnDBP7Crp8/oLsIl/gGR/SVUEyLIimozugUySnCig1BEicygECvp6eRpEHryNrEvLKfxtppr3eWcRKQwnYwch4CaFwya0Lpc1dSA9NaOFQu0kR374s+fhqYgrkaCJevZd+ouKY+0Zt8gZ4CjJVhJ5YamwZAPG+obRd9G3xRM0= + - NYLAS_GITHUB_OAUTH_TOKEN=cb200be7c921f73a1c35930f6a4ac8758b271be0 + +notifications: + slack: nylas:Egem0aHuqMfkIlycPswxblzJ diff --git a/.watchmanconfig b/.watchmanconfig new file mode 100644 index 0000000000..8da48ca18f --- /dev/null +++ b/.watchmanconfig @@ -0,0 +1,13 @@ +{ + "ignore_dirs": [ + "build/node_modules", + "apm/node_modules", + "node_modules", + "src/K2/node_modules", + "src/K2/packages/local-sync/node_modules", + "src/K2/packages/isomorphic-core/node_modules", + "src/K2/packages/cloud-api/node_modules", + "src/K2/packages/cloud-workers/node_modules", + "src/K2/packages/cloud-core/node_modules" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000..2a0494fb15 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,283 @@ +# Nylas Mail Changelog + +### 1.0.29 (2/21/2017) + +- Fixes: + + + You can now click inline images in messages to open them + + More IMAP errors have been identified as retryable, which means users will + see less errors when syncing an account + + Improve performance of thread search indexing queries + + Correctly catch Invalid Login errors when sending + +- Development: + + + Developer bar in Worker window now shows single delta connection + + More code converted to Javascript + +### 1.0.28 (2/16/2017) + +- Fixes: + + + Fix offline notification bug that caused api outage + + We now properly handle gmail auth token errors in the middle of the sync loop. This means less red boxes for users! + + Less battery usage when initial sync has completed! + + No more errors when saving sent messages to sent folders (`auth or accountId` errors) + + No more `Lingering tasks in progress marked as failed errors` + + Syncback tasks will continue retrying even after closing app + + Syncback tasks retry more aggressively + + Detect more offline errors when sending, sending is more reliable + + Imap connection pooling (yet to land) + + More retryable IMAP errors, means less red boxes for users + + Offline notification now shows itself when we’re actually offline, shows countdown for next reconnect attempt + +- Development: + + + More tests + + Don't use breadcrumbs in dev mode + + Add a better reason when waking sync for syncback in the logs + + BackoffScheduler, BatteryManager added for reusability + +### 1.0.27 (2/14/17) + +- Fixes: + + + Offline notification fixes + +### 1.0.26 (2/10/17) + +- Fixes: + + + Downloads retry if they fail + + NylasID doesn't intermittently log out or throw errors + + Fix initial sync for Inbox Zero Gmail accounts + +### 1.0.25 (2/10/17) + +- Fixes: + + + When replying to a thread, properly add it to the sent folder + +- Development: + + + Can now once again run Nylas Mail test suite + +### 1.0.24 (2/9/17) + +- Fixes: + + + Fix error reporter when reporting an error without an identity (this would + crash the app) + +- Development: + + + Fix logging inside local-sync api requests + + Stop reporting handled API errors to Sentry + + Report thread-list perf metrics + +### 1.0.23 (2/8/17) + +- Fixes: + + + Fix emails occasionally being sent with an incomplete body (#3269) + + Correctly thread messages together when open/link tracking is enabled + + Fix `Mailbox does not exist` error for iCloud users (#3253) + + When adding account, correctly remove whitespace from emails + + Fix link in update notification to point to latest changelog + +- Performance: + + + Thread list actions no longer sporadically lag for ~1sec (this is especially + noticeable when many accounts have been added) + + No longer slow down sync process when more than 100,000 threads have been synced + +- Development: + + + Better logging in worker window + + You can now run a development build of Nylas Mail alongside a production + build + +### 1.0.22 (2/7/17) + +- Fixes: + + + New mail notification sounds on startup are combined when multiple new messages have arrived + + You can now correctly select threads using `cmd` and `shift` + + Improve message fetching by making sure we always fetch the most recent + messages first. + + Improve IMAP connection timeouts by incrementing the socket timeout (#3232) + + When adding a Google account, make sure to show the Account Chooser + +- Development: + + + Nylas Identity is no longer stored in config.json + +### 1.0.21 (2/3/17) + +- Fixes: + + + Fixed an issue where Nylas Mail could delete all accounts (addresses #3231) + + Correctly delete and archive threads when they contain sent messages (addresses #2706) + + Improve performance and prevent crashes when running several sync actions + + Improve error handling when sync actions fail + + Fix JSON serialization issue which could cause sync process to error. + +### 1.0.20 (2/1/17) + +- Fixes: + + + Properly clean up broken replies + +### 1.0.19 (1/31/17) + +- Fixes: + + + Replies on threads won't create duplicate-looking emails. This began + to happen on midnight February 1 UTC due to a date parsing bug + + Improve error handling in sync + + Better retrying of certain syncback actions + +- Development: + + + Now using Electron 1.4.15 + +### 1.0.18 (1/30/17) + +- Performance: + + + 60% reduction of CPU usage during initial sync due to optimizing + unnecessary rendering + +- Fixes: + + + New composer stays in "to" field when initially typing + +- Development: + + + Better documentation for Nylas Mail SDKs + + GitHub repository renamed from nylas/N1 to nylas/nylas-mail + + `master` branch now has Nylas Mail (1.0.x) + + `n1-pro` branch now has Nylas Pro (1.5.x) + +### 1.0.17 (1/27/17) + +- Fixes: + + + Fix send and archive: Can now archive after sending without errors + + Local search now includes more thread results + + Contact autocomplete in composer participant fields now includes more results + +### 1.0.16 (1/27/17) + +- Performance: + + + Improved typing performance in the composer, especially with + misspelled words + +- Fixes: + + + Nylas Mail plugins install properly + + Fix undo and occasional archive & move tasks failing due to not having uids + + Fix logging for auth + + Properly clean up after file downloads + + Properly recover from IMAP uid invalidity + +### 1.0.15 (1/25/17) + +- Features: + + + Improve CPU performance of idle windows + +- Fixes: + + + Correctly detect initial battery status for throttling. + + Correctly allow auth for Custom IMAP accounts only #3185 + +### 1.0.14 (1/25/17) + +- Features: + + + Improved spellchecker + +- Fixes: + + + Correctly update attributes like starred and unread when syncing folders. + Marking as read or starred will no longer bounce back. + + Correctly detect new mail while syncing Gmail inbox. + +### 1.0.13 (1/25/17) + +- Fixes: + + + Messages immediately appear in sent folder. No bouncing back. + + Login more likely to succeed. Waits longer for IMAP + + Doesn't allow invalid form submission + + Correctly handles token refresh failing + + Auto updater says "Nylas Mail" properly + + Sync drafts correctly on Gmail + +- Development: + + + Local sync account API deprecated + + Silence noisy queries in the logs + +### 1.0.12 (1/24/17) + +- Features: + + + New 'Debug' sync button that opens up the console + + Faster search + + Message processing now throttles when on battery + + Analytics for change mail tasks + +- Fixes: + + + Archive, Mark as Unread, and Move to trash don't "bounce back" + + Adding a new account is now smoother + + Improved threading + + Drafts are no longer in the inbox + +### 1.0.11 (1/19/17) + +- Features: + + + Nylas Mail's installer on Mac uses a DMG + +- Fixes: + + + Fixed app being occasionally unresponsive + + Decreased odds of failed logins (by bumping connection timeout value) + + Sync erroring notification no longer tripped by timeouts + +### 1.0.10 (1/19/17) + +- Features: + + + "Contact Support" button now auto-fills information + + Actions reach providers faster + +- Fixes: + + + Show errors on the GMail auth screen + + Show draft sending errors + + Can now correctly search threads via `from:` and `to:` + + Other error management improvements + + The database will now be reset if malformed + + Improve the offline notification + +- Development: + + + Update Thread indexing + + Add loadFromColumm option to Attribute + +### 1.0.9 (1/17/17) + +- Fixes: + + + All Fastmail domains now use the correct credentials + + Offline notification more reliable + + Fix error logging + +### 1.0.8 (1/17/17) + +- Introducing Nylas Mail Basic! Read more about it [here](https://blog.nylas.com/nylas-mail-is-now-free-8350d6a1044d) diff --git a/CONFIGURATION.md b/CONFIGURATION.md new file mode 100644 index 0000000000..4d7e99009c --- /dev/null +++ b/CONFIGURATION.md @@ -0,0 +1,13 @@ +# Configuration + +This document outlines configuration options which aren't exposed via N1's +preferences interface but may be useful. + +## Running Against Open Source Sync Engine + +If you want to point N1 to your self-hosted sync engine, select "Hosting your own sync engine?" under the "Get Started" button on the welcome screen. There, follow the instructions for creating your own instance of the sync engine and enter the URL and port number where you have it running. + + +## Other Config Options + +- `core.workspace.interfaceZoom`: If you'd like the N1 interface to be smaller or larger, this option allows you to scale the UI globally. (Default: 1) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 15e42f708b..ffa2a56038 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,130 +1,101 @@ -# Contributing to Atom - -:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: - -The following is a set of guidelines for contributing to Atom and its packages, -which are hosted in the [Atom Organization](https://github.com/atom) on GitHub. -If you're unsure which package is causing your problem or if you're having an -issue with Atom core, please open an issue on the [main atom repository](https://github.com/atom/atom/issues). -These are just guidelines, not rules, use your best judgement and feel free to -propose changes to this document in a pull request. - -## Submitting Issues - -* Check the [debugging guide](https://atom.io/docs/latest/debugging) for tips - on debugging. You might be able to find the cause of the problem and fix - things yourself. -* Include the version of Atom you are using and the OS. -* Include screenshots and animated GIFs whenever possible; they are immensely - helpful. -* Include the behavior you expected and other places you've seen that behavior - such as Emacs, vi, Xcode, etc. -* Check the dev tools (`alt-cmd-i`) for errors to include. If the dev tools - are open _before_ the error is triggered, a full stack trace for the error - will be logged. If you can reproduce the error, use this approach to get the - full stack trace and include it in the issue. -* On Mac, check Console.app for stack traces to include if reporting a crash. -* Perform a cursory search to see if a similar issue has already been submitted. -* Please setup a [profile picture](https://help.github.com/articles/how-do-i-set-up-my-profile-picture) - to make yourself recognizable and so we can all get to know each other better. - -### Package Repositories - -This is the repository for the core Atom editor only. Atom comes bundled with -many packages and themes that are stored in other repos under the -[Atom organization](https://github.com/atom) such as -[tabs](https://github.com/atom/tabs), -[find-and-replace](https://github.com/atom/find-and-replace), -[language-javascript](https://github.com/atom/language-javascript), and -[atom-light-ui](https://github.com/atom/atom-light-ui). - -For more information on how to work with Atom's official packages, see -[Contributing to Atom Packages](https://atom.io/docs/latest/contributing-to-packages.html) - -## Pull Requests - -* Include screenshots and animated GIFs in your pull request whenever possible. -* Follow the [CoffeeScript](#coffeescript-styleguide), - [JavaScript](https://github.com/styleguide/javascript), - and [CSS](https://github.com/styleguide/css) styleguides. -* Include thoughtfully-worded, well-structured - [Jasmine](http://jasmine.github.io/) specs. -* Document new code based on the - [Documentation Styleguide](#documentation-styleguide) -* End files with a newline. -* Place requires in the following order: - * Built in Node Modules (such as `path`) - * Built in Atom and Atom Shell Modules (such as `atom`, `shell`) - * Local Modules (using relative paths) -* Place class properties in the following order: - * Class methods and properties (methods starting with a `@`) - * Instance methods and properties -* Avoid platform-dependent code: - * Use `require('atom').fs.getHomeDirectory()` to get the home directory. - * Use `path.join()` to concatenate filenames. - * Use `os.tmpdir()` rather than `/tmp` when you need to reference the - temporary directory. -* Using a plain `return` when returning explicitly at the end of a function. - * Not `return null`, `return undefined`, `null`, or `undefined` - -## Git Commit Messages - -* Use the present tense ("Add feature" not "Added feature") -* Use the imperative mood ("Move cursor to..." not "Moves cursor to...") -* Limit the first line to 72 characters or less -* Reference issues and pull requests liberally -* Consider starting the commit message with an applicable emoji: - * :art: `:art:` when improving the format/structure of the code - * :racehorse: `:racehorse:` when improving performance - * :non-potable_water: `:non-potable_water:` when plugging memory leaks - * :memo: `:memo:` when writing docs - * :penguin: `:penguin:` when fixing something on Linux - * :apple: `:apple:` when fixing something on Mac OS - * :checkered_flag: `:checkered_flag:` when fixing something on Windows - * :bug: `:bug:` when fixing a bug - * :fire: `:fire:` when removing code or files - * :green_heart: `:green_heart:` when fixing the CI build - * :white_check_mark: `:white_check_mark:` when adding tests - * :lock: `:lock:` when dealing with security - * :arrow_up: `:arrow_up:` when upgrading dependencies - * :arrow_down: `:arrow_down:` when downgrading dependencies - * :shirt: `:shirt:` when removing linter warnings - -## CoffeeScript Styleguide - -* Set parameter defaults without spaces around the equal sign - * `clear = (count=1) ->` instead of `clear = (count = 1) ->` -* Use parentheses if it improves code clarity. -* Prefer alphabetic keywords to symbolic keywords: - * `a is b` instead of `a == b` -* Avoid spaces inside the curly-braces of hash literals: - * `{a: 1, b: 2}` instead of `{ a: 1, b: 2 }` -* Include a single line of whitespace between methods. -* Capitalize initialisms and acronyms in names, except for the first word, which - should be lower-case: - * `getURI` instead of `getUri` - * `uriToOpen` instead of `URIToOpen` - -## Documentation Styleguide - -* Use [AtomDoc](https://github.com/atom/atomdoc). -* Use [Markdown](https://daringfireball.net/projects/markdown). -* Reference methods and classes in markdown with the custom `{}` notation: - * Reference classes with `{ClassName}` - * Reference instance methods with `{ClassName::methodName}` - * Reference class methods with `{ClassName.methodName}` - -### Example - -```coffee -# Public: Disable the package with the given name. -# -# * `name` The {String} name of the package to disable. -# * `options` (optional) The {Object} with disable options (default: {}): -# * `trackTime` A {Boolean}, `true` to track the amount of time taken. -# * `ignoreErrors` A {Boolean}, `true` to catch and ignore errors thrown. -# * `callback` The {Function} to call after the package has been disabled. -# -# Returns `undefined`. -disablePackage: (name, options, callback) -> -``` +# Filing an Issue + +Thanks for checking out N1! If you have a feature request, be sure to check out the [open source roadmap](http://trello.com/b/hxsqB6vx/n1-open-source-roadmap). If someone has already requested +the feature you have in mind, you can upvote the card on Trello—to keep things organized, we +often close feature requests on GitHub after creating Trello cards. + +If you've found a bug, try searching for similars issue before filing a new one. Please include +the version of N1 you're using, the platform you're using (Mac / Windows / Linux), and the +type of email account. (Gmail, Outlook 365, etc.) + +# Contributing to N1 + +The hosted sync engine allows us to control adoption of N1 and maintain a great +experience for our users. However, the sync engine is +[open source](https://github.com/nylas/sync-engine) and you can set it +up yourself to begin using N1 immediately. Follow instructions on the [sync +engine](https://github.com/nylas/sync-engine) repository. + +### Getting Started + +Before you get started, make sure you've installed the following dependencies. +N1's build scripts and tooling use modern JavaScript features and require: + + - Node 6.0 or above with npm3 + - python 2.7 + +Linux users should make sure they've installed all the packages listed at +https://github.com/nylas/nylas-mail/blob/master/.travis.yml#L10. Linux users on +Debian 8 and Ubuntu 15.04 onward must also install libgcrypt11 and gnome-keyring. + +Next, clone and build N1 from source: + + git clone https://github.com/nylas/nylas-mail.git + cd nylas-mail + script/bootstrap + +Read the [getting started guides](https://nylas.github.io/N1/getting-started/). + +**Building Nylas on Windows? See the [Windows instructions.](https://github.com/nylas/nylas-mail/blob/master/docs/Windows.md)** + +### Running N1 + + npm start + +### Testing N1 + + npm test + +This will run the full suite of automated unit tests. We use [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html). + +It runs all tests inside of the `/spec` folder and all tests inside of +`/internal_packages/**/spec` + +You may skip certain tests (temporarily) with `xit` and `xdescribe`, or focus on only certain tests with `fit` and `fdescribe`. + +### Linting N1 + +N1 lints clean against eslint, coffeelint, csslint, lesslint, and our own internal +tool, nylaslint. To run the linters, just run `npm run lint`. + +### Creating binaries + +Once you've checked out N1 and run `script/bootstrap`, you can create a packaged +version of the application by running `script/build`. Note that the builds +available at [https://nylas.com/N1](https://nylas.com/N1) include licensed +fonts, sounds, and other improvements. If you're just looking to run N1, you +should download it there! + + +# Pull requests + +We require all authors sign our [Contributor License +Agreement](https://www.nylas.com/cla.html) before pull requests (even +minor ones) can be accepted. (It's similar to other projects, like NodeJS +Meteor, or React). I'm really sorry, but Legal made us do it. + +### Commit Format + +We decided to not impose super strict commit guidelines on the community. + +We're trusting you to be thoughtful, responsible, committers. + +We do have a few heuristics: + +- Keep commits fairly isolated. Don't jam lots of different functionality + in 1 squashed commit. `git bisect` and `git cherry-pick` should still be + reasonable things to do. +- Keep commits fairly significant. DO `squash` all those little file + changes and "fixmes". Don't make it difficult to browse our history. + Play the balance between this idea and the last point. If a commit + doesn't deserve your time to write a long thoughtful message about, then + squash it. +- Be hyper-descriptive in your commit messages. I care less about what + you did (I can read the code), **I want to know WHY you did it**. Put + that in the commit body (not the subject). Itemize the major semantic + changes that happened. +- Read "[How to Write a Git Commit Message](http://chris.beams.io/posts/git-commit/)" if you haven't already (but don't be too prescriptivist about it!) + +# Running Against Open Source Sync Engine + +See [Configuration](https://github.com/nylas/nylas-mail/blob/master/CONFIGURATION.md) diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 76fa18eaeb..0000000000 --- a/Dockerfile +++ /dev/null @@ -1,22 +0,0 @@ -# VERSION: 0.1 -# DESCRIPTION: Image to build Atom and create a .rpm file - -# Base docker image -FROM fedora:20 - -# Install dependencies -RUN yum install -y \ - make \ - gcc \ - gcc-c++ \ - glibc-devel \ - git-core \ - libgnome-keyring-devel \ - rpmdevtools - -# Install node -RUN curl -sL https://rpm.nodesource.com/setup | bash - -RUN yum install -y nodejs - -ADD . /atom -WORKDIR /atom diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..91cede0765 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,37 @@ + + +##### Are there any related issues? + +... + +##### What operating system are you using? +... + +##### What version of Nylas Mail are you using? +... + +-- + +**Bug?** +##### Do you have any third-party plugins installed? If so, which ones? +... + +##### Is the issue related to a specific email provider (Gmail, Exchange, etc.)? +... + +##### Is the issue reproducible with a particular attachment, message, signature, etc? + +... + +-- + +**Feature Request?** +##### Does this feature exist in another mail client or tool you use? +... diff --git a/LICENSE.md b/LICENSE.md index 4d231b4563..5f8b06fe3c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,20 +1,675 @@ -Copyright (c) 2014 GitHub Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is not allowed. + +### Preamble + +The GNU General Public License is a free, copyleft license for +software and other kinds of works. + +The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom +to share and change all versions of a program--to make sure it remains +free software for all its users. We, the Free Software Foundation, use +the GNU General Public License for most of our software; it applies +also to any other work released this way by its authors. You can apply +it to your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + +To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you +have certain responsibilities if you distribute copies of the +software, or if you modify it: responsibilities to respect the freedom +of others. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + +Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + +For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + +Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the +manufacturer can do so. This is fundamentally incompatible with the +aim of protecting users' freedom to change the software. The +systematic pattern of such abuse occurs in the area of products for +individuals to use, which is precisely where it is most unacceptable. +Therefore, we have designed this version of the GPL to prohibit the +practice for those products. If such problems arise substantially in +other domains, we stand ready to extend this provision to those +domains in future versions of the GPL, as needed to protect the +freedom of users. + +Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish +to avoid the special danger that patents applied to a free program +could make it effectively proprietary. To prevent this, the GPL +assures that patents cannot be used to render the program non-free. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS + +#### 0. Definitions. + +"This License" refers to version 3 of the GNU General Public License. + +"Copyright" also means copyright-like laws that apply to other kinds +of works, such as semiconductor masks. + +"The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + +To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of +an exact copy. The resulting work is called a "modified version" of +the earlier work or a work "based on" the earlier work. + +A "covered work" means either the unmodified Program or a work based +on the Program. + +To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + +To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user +through a computer network, with no transfer of a copy, is not +conveying. + +An interactive user interface displays "Appropriate Legal Notices" to +the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + +#### 1. Source Code. + +The "source code" for a work means the preferred form of the work for +making modifications to it. "Object code" means any non-source form of +a work. + +A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + +The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + +The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + +The Corresponding Source need not include anything that users can +regenerate automatically from other parts of the Corresponding Source. + +The Corresponding Source for a work in source code form is that same +work. + +#### 2. Basic Permissions. + +All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + +You may make, run and propagate covered works that you do not convey, +without conditions so long as your license otherwise remains in force. +You may convey covered works to others for the sole purpose of having +them make modifications exclusively for you, or provide you with +facilities for running those works, provided that you comply with the +terms of this License in conveying all material for which you do not +control copyright. Those thus making or running the covered works for +you must do so exclusively on your behalf, under your direction and +control, on terms that prohibit them from making any copies of your +copyrighted material outside their relationship with you. + +Conveying under any other circumstances is permitted solely under the +conditions stated below. Sublicensing is not allowed; section 10 makes +it unnecessary. + +#### 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + +No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + +When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such +circumvention is effected by exercising rights under this License with +respect to the covered work, and you disclaim any intention to limit +operation or modification of the work as a means of enforcing, against +the work's users, your or third parties' legal rights to forbid +circumvention of technological measures. + +#### 4. Conveying Verbatim Copies. + +You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + +You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + +#### 5. Conveying Modified Source Versions. + +You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these +conditions: + +- a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. +- b) The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in section 4 + to "keep intact all notices". +- c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. +- d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + +A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + +#### 6. Conveying Non-Source Forms. + +You may convey a covered work in object code form under the terms of +sections 4 and 5, provided that you also convey the machine-readable +Corresponding Source under the terms of this License, in one of these +ways: + +- a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. +- b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the Corresponding + Source from a network server at no charge. +- c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. +- d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. +- e) Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the general + public at no charge under subsection 6d. + +A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + +A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, +family, or household purposes, or (2) anything designed or sold for +incorporation into a dwelling. In determining whether a product is a +consumer product, doubtful cases shall be resolved in favor of +coverage. For a particular product received by a particular user, +"normally used" refers to a typical or common use of that class of +product, regardless of the status of the particular user or of the way +in which the particular user actually uses, or expects or is expected +to use, the product. A product is a consumer product regardless of +whether the product has substantial commercial, industrial or +non-consumer uses, unless such uses represent the only significant +mode of use of the product. + +"Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to +install and execute modified versions of a covered work in that User +Product from a modified version of its Corresponding Source. The +information must suffice to ensure that the continued functioning of +the modified object code is in no case prevented or interfered with +solely because modification has been made. + +If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + +The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or +updates for a work that has been modified or installed by the +recipient, or for the User Product in which it has been modified or +installed. Access to a network may be denied when the modification +itself materially and adversely affects the operation of the network +or violates the rules and protocols for communication across the +network. + +Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + +#### 7. Additional Terms. + +"Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + +When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + +Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders +of that material) supplement the terms of this License with terms: + +- a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or +- b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or +- c) Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or +- d) Limiting the use for publicity purposes of names of licensors + or authors of the material; or +- e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or +- f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions + of it) with contractual assumptions of liability to the recipient, + for any liability that these contractual assumptions directly + impose on those licensors and authors. + +All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + +If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + +Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; the +above requirements apply either way. + +#### 8. Termination. + +You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + +However, if you cease all violation of this License, then your license +from a particular copyright holder is reinstated (a) provisionally, +unless and until the copyright holder explicitly and finally +terminates your license, and (b) permanently, if the copyright holder +fails to notify you of the violation by some reasonable means prior to +60 days after the cessation. + +Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + +Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + +#### 9. Acceptance Not Required for Having Copies. + +You are not required to accept this License in order to receive or run +a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + +#### 10. Automatic Licensing of Downstream Recipients. + +Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + +An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + +You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + +#### 11. Patents. + +A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + +A contributor's "essential patent claims" are all patent claims owned +or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + +Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + +In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + +If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + +If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + +A patent license is "discriminatory" if it does not include within the +scope of its coverage, prohibits the exercise of, or is conditioned on +the non-exercise of one or more of the rights that are specifically +granted under this License. You may not convey a covered work if you +are a party to an arrangement with a third party that is in the +business of distributing software, under which you make payment to the +third party based on the extent of your activity of conveying the +work, and under which the third party grants, to any of the parties +who would receive the covered work from you, a discriminatory patent +license (a) in connection with copies of the covered work conveyed by +you (or copies made from those copies), or (b) primarily for and in +connection with specific products or compilations that contain the +covered work, unless you entered into that arrangement, or that patent +license was granted, prior to 28 March 2007. + +Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + +#### 12. No Surrender of Others' Freedom. + +If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under +this License and any other pertinent obligations, then as a +consequence you may not convey it at all. For example, if you agree to +terms that obligate you to collect a royalty for further conveying +from those to whom you convey the Program, the only way you could +satisfy both those terms and this License would be to refrain entirely +from conveying the Program. + +#### 13. Use with the GNU Affero General Public License. + +Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + +#### 14. Revised Versions of this License. + +The Free Software Foundation may publish revised and/or new versions +of the GNU General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in +detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies that a certain numbered version of the GNU General Public +License "or any later version" applies to it, you have the option of +following the terms and conditions either of that numbered version or +of any later version published by the Free Software Foundation. If the +Program does not specify a version number of the GNU General Public +License, you may choose any version ever published by the Free +Software Foundation. + +If the Program specifies that a proxy can decide which future versions +of the GNU General Public License can be used, that proxy's public +statement of acceptance of a version permanently authorizes you to +choose that version for the Program. + +Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + +#### 15. Disclaimer of Warranty. + +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT +WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE +DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR +CORRECTION. + +#### 16. Limitation of Liability. + +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR +CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES +ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT +NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR +LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM +TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER +PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +#### 17. Interpretation of Sections 15 and 16. + +If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper +mail. + +If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + +You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see . + +The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read . diff --git a/README.md b/README.md index 92f301b3fe..c2e180734e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,148 @@ -Nylas Mail is a hackable platform for your personal data, built on [Electron](https://github.com/atom/electron) and the [Nylas Platform APIs](https://nylas.com/sync_engine). +# Nylas Mail - the open-source, extensible mail client +![N1 Screenshot](https://nylas.com/static/img/nylas-mail/hero_graphic_mac@2x.png) + **Nylas Mail is an open-source mail client built on the modern web with [Electron](https://github.com/atom/electron), [React](https://facebook.github.io/react/), and [Flux](https://facebook.github.io/flux/).** It is designed to be extensible, so it's easy to create new experiences and workflows around email. Want to learn more? Check out the [full documentation](https://nylas.github.io/nylas-mail/). +[![Build Status](https://travis-ci.org/nylas/nylas-mail.svg?branch=master)](https://travis-ci.org/nylas/nylas-mail) +[![Slack Invite Button](http://slack-invite.nylas.com/badge.svg)](http://slack-invite.nylas.com) -## Building Nylas Mail +#### Want to help build the future of email? [Nylas is hiring](https://jobs.lever.co/nylas)! -* [Linux](docs/build-instructions/linux.md) -* [OS X](docs/build-instructions/os-x.md) -* [FreeBSD](docs/build-instructions/freebsd.md) -* [Windows](docs/build-instructions/windows.md) +## Download Nylas Mail -## Extending Nylas Mail +You can download compiled versions of Nylas Mail for Windows, Mac OS X, and Linux (.deb) from [https://nylas.com/download](https://nylas.com/download). You can also build and run Nylas Mail (Previously N1) on Fedora. On Arch Linux, you can install **[n1](https://aur.archlinux.org/packages/n1/)** or **[n1-git](https://aur.archlinux.org/packages/n1-git/)** from the aur. -It's easy to extend Nylas Mail using your favorite web technologies. Check out the [Nylas Package API](docs/index) to get started, and the [API reference](https://atom.io/docs/api) for information about specific classes. \ No newline at end of file +## Build A Plugin + +Plugins lie at the heart of Nylas Mail and give it its powerful features. Building your own plugins allows you to integrate the app with other tools, experiment with new workflows, and more. Follow the [Getting Started guide](https://nylas.github.io/nylas-mail/) to write your first plugin in five minutes. To create your own theme, go to our [Theme Starter guide](https://github.com/nylas/N1-theme-starter). + +If you would like to run the N1 source and contribute, check out our [contributing +guide](https://github.com/nylas/nylas-mail/blob/master/CONTRIBUTING.md). + +## Themes + +The Nylas Mail user interface is styled using CSS, which means it's easy to modify and extend. Nylas Mail comes stock with a few beautiful themes, and there are many more which have been built by community developers + +
+ + +#### Bundled Themes +- [Dark](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-dark) +- [Darkside](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-darkside) (designed by [Jamie Wilson](https://github.com/jamiewilson)) +- [Taiga](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-taiga) (designed by [Noah Buscher](https://github.com/noahbuscher)) +- [Ubuntu](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-ubuntu) (designed by [Ahmed Elhanafy](https://github.com/ahmedlhanafy)) +- [Less Is More](https://github.com/nylas/nylas-mail/tree/master/internal_packages/ui-less-is-more) (designed by [Alexander Adkins](https://github.com/P0WW0W)) + + + +#### Community Themes +- [Arc Dark](https://github.com/varlesh/Nylas-Arc-Dark-Theme) +- [Predawn](https://github.com/adambmedia/N1-Predawn) +- [ElementaryOS](https://github.com/edipox/elementary-nylas) +- [Ido](https://github.com/edipox/n1-ido)—Polymail-inspired theme +- [Solarized Dark](https://github.com/NSHenry/N1-Solarized-Dark) +- [Berend](https://github.com/Frique/N1-Berend) +- [LevelUp](https://github.com/stolinski/level-up-nylas-n1-theme) +- [Sunrise](https://github.com/jackiehluo/n1-sunrise) +- [ToogaBooga](https://github.com/brycedorn/N1-ToogaBooga) +- [Material](https://github.com/jackiehluo/n1-material) +- [Monokai](https://github.com/dcondrey/n1-monokai) +- [Agapanthus](https://github.com/taniadaniela/n1-agapanthus)—Inbox-inspired theme +- [Stripe](https://github.com/oeaeee/n1-stripe) +- [Kleinstein] (https://github.com/diklein/Kleinstein)—Hide the account list sidebar +- [BoraBora](https://github.com/arimai/N1-BoraBora) +- [Honeyduke](https://github.com/arimai/n1-honeyduke) +- [Snow](https://github.com/Wattenberger/N1-snow-theme) +- [Hull](https://github.com/unity/n1-hull) +- [Express](https://github.com/oeaeee/n1-express) +- [DarkSoda](https://github.com/adambullmer/N1-theme-DarkSoda) +- [Bemind](https://github.com/bemindinteractive/Bemind-N1-Theme) +- [Dracula](https://github.com/dracula/nylas-n1) +- [MouseEatsCat](https://github.com/MouseEatsCat/MouseEatsCat-N1) +- [Sublime Dark](https://github.com/rishabhkesarwani/Nylas-Sublime-Dark-Theme) +- [Firefox](https://github.com/darshandsoni/n1-firefox-theme) +- [Gmail](https://github.com/dregitsky/n1-gmail-theme) +- [Darkish](https://github.com/dyrnade/N1-Darkish) + +#### To install community themes: + +1. Download and unzip the repo +2. In Nylas Mail, select `Developer > Install a Package Manually... ` +3. Navigate to where you downloaded the theme and select the root folder. The theme is copied into the `~/.nylas-mail` folder for your convinence +5. Select `Change Theme...` from the top level menu, and you'll see the newly installed theme. That's it! + + +Want to dive in more? Try [creating your own theme](https://github.com/nylas/nylas-mail-theme-starter)! + + +## Plugin List +We're working on building a plugin index that makes it super easy to add them to Nylas Mail. For now, check out the list below! (Feel free to submit a PR if you build a plugin and want it featured here.) + + +#### Bundled Plugins +Great starting points for creating your own plugins! +- [Translate](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-translate)—Works with 10 languages +- [Quick Replies](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-templates)—Send emails faster with templates +- [Emoji Keyboard](https://github.com/nylas/nylas-mail/tree/master/internal_packages/composer-emoji)—Insert emoji by typing a colon (:) followed by the name of an emoji symbol +- [GitHub Sidebar Info](https://github.com/nylas/nylas-mail/tree/master/internal_packages/github-contact-card) +- [View on GitHub](https://github.com/nylas/nylas-mail/tree/master/internal_packages/message-view-on-github) +- [Personal Level Indicators](https://github.com/nylas/nylas-mail/tree/master/internal_packages/personal-level-indicators) +- [Phishing Detection](https://github.com/nylas/nylas-mail/tree/master/internal_packages/phishing-detection) + +#### Community Plugins + +Note these are not tested or officially supported by Nylas, but we still think they are really cool! If you find bugs with them, please open GitHub issues on their individual project pages, not the Nylas Mail (N1) repo page. Thanks! + +- [Jiffy](http://noahbuscher.github.io/N1-Jiffy/)—Insert animated GIFs +- [Weather](https://github.com/jackiehluo/n1-weather) +- [Todoist](https://github.com/alexfruehwirth/N1TodoistIntegration) +- [Unsubscribe](https://github.com/colinking/n1-unsubscribe) +- [Squirt Speed Reader](https://github.com/HarleyKwyn/squirt-reader-N1-plugin/) +- [Website Launcher](https://github.com/adriangrantdotorg/nylas-n1-background-webpage)—Opens a URL in separate window +- In Development: [Cypher](https://github.com/mbilker/cypher) (PGP Encryption) +- [Avatars](https://github.com/unity/n1-avatars) +- [Events Calendar (WIP)](https://github.com/nerdenough/n1-events-calendar) +- [Mail in Chat (WIP)](https://github.com/yjchen/mail_in_chat) +- [Evernote](https://github.com/grobgl/n1-evernote) +- [Wunderlist](https://github.com/miguelrs/n1-wunderlist) +- [Participants Display](https://github.com/kbruccoleri/nylas-participants-display) +- [GitHub](https://github.com/ForbesLindesay/N1-GitHub) + +When you install packages, they're moved to ~/.nylas-mail/packages, and Nylas Mail runs apm install on the command line to fetch dependencies listed in the package's package.json + + +## Building the docs + +Plugin SDK docs are available at [https://nylas.github.io/nylas-mail/](https://nylas.github.io/nylas-mail/). Here's how you build them: + +Until my patch gets merged, docs need to be built manually using mg's fork. + + git clone git@github.com:grinich/gitbook.git + + cd nylas-mail + + ./node_modules/.bin/gitbook alias ../gitbook latest + +Then to actually build the docs: + + script/grunt docs + + ./node_modules/.bin/gitbook --gitbook=latest build . ./_docs_output --log=debug --debug + + rm -r docs_src/classes + +If you want to preview the docs: + + pushd ./_docs_output; python -m SimpleHTTPServer; popd + +Just want to publish everything? There's a helper script that does it for you: + + script/publish-docs + + +## Configuration +You can configure Nylas Mail in a few ways—for instance, pointing it to your self-hosted instance of the sync engine or changing the interface zoom level. [Learn more about how.](https://github.com/nylas/nylas-mail/blob/master/CONFIGURATION.md) + +## Feature Requests / Plugin Ideas + +Have an idea for a package or a feature you'd love to see in Nylas Mail? Search for existing [GitHub issues](https://github.com/nylas/nylas-mail/issues) and join the conversation! diff --git a/apm/README.md b/apm/README.md index 19d44ca9d0..1b22ac5fd1 100644 --- a/apm/README.md +++ b/apm/README.md @@ -1,2 +1,2 @@ -This folder is where [apm](https://github.com/atom/apm) is installed to so that -it is bundled with Atom. +Nylas Mail ships a copy of [apm](https://github.com/atom/apm) to build packages +when users choose to install them. This won't be true much longer. diff --git a/apm/package.json b/apm/package.json index c070e36c3b..f6c13d7005 100644 --- a/apm/package.json +++ b/apm/package.json @@ -1,11 +1,11 @@ { - "name": "atom-bundled-apm", - "description": "Atom's bundled apm", + "name": "n1-bundled-apm", + "description": "N1's bundled apm", "repository": { "type": "git", - "url": "https://github.com/atom/atom.git" + "url": "https://github.com/nylas/nylas-mail" }, "dependencies": { - "atom-package-manager": "0.135.0" + "atom-package-manager": "1.1.1" } } diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..cde3dad2c4 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,59 @@ +version: '{build}' + +platform: + - x86 + +pull_requests: + do_not_increment_build_number: true + +branches: + only: + - master + - ci-test + - /stable.*/ + - /ci-build\/.*/ + +# We need to only clone the main module because our submodule requires the +# encrypted ssh key to access submodules +clone_depth: 1 +build: + verbosity: minimal +install: +- ps: Install-Product node $env:NODE_VERSION $env:PLATFORM +- ps: nuget install secure-file -ExcludeVersion +- ps: npm config set msvs_version 2013 + +# We need to extract the encrypted private ssh key to clone the submodule. +- ps: | + if ($env:DECRYPTION_PASSWORD) { + secure-file\tools\secure-file -decrypt build\resources\ssh\nylas-n1-ci-ssh-secure-file.enc -secret $env:DECRYPTION_PASSWORD + mv -Force build\resources\ssh\nylas-n1-ci-ssh-secure-file c:\users\appveyor\.ssh\id_rsa + + # http://stackoverflow.com/questions/21002919/running-a-remote-powershell-script-with-a-git-command-in-it-results-in-nativecom + Start-Process -FilePath git.exe -ArgumentList 'submodule update --init --recursive' -Wait -NoNewWindow + + secure-file\tools\secure-file -decrypt src\K2\packages\local-private\encrypted_certificates\appveyor\win-nylas-n1.p12.enc -secret $env:DECRYPTION_PASSWORD + secure-file\tools\secure-file -decrypt src\K2\packages\local-private\encrypted_certificates\appveyor\set_win_env.ps1.enc -secret $env:DECRYPTION_PASSWORD + . src\K2\packages\local-private\encrypted_certificates\appveyor\set_win_env.ps1 + } + +build_script: +- cmd: script\bootstrap.cmd + +deploy_script: +- cmd: script\grunt.cmd ci --stack --no-color + +environment: + matrix: + - NODE_VERSION: 6.9 + PUBLISH_BUILD: true + global: + CERTIFICATE_FILE: .\src\K2\packages\local-private\encrypted_certificates\appveyor\win-nylas-n1.p12 + DECRYPTION_PASSWORD: + secure: 48VSzDtdBd52Xlo3TZ1NeR1yRRrZ3AU6Px5XjD5RDp44cFU5GYVspecGqX6DGCV7i0D7nldGMyEbXNrjM1t1Kw== + +cache: + - apm\node_modules -> apm\package.json + - build\node_modules -> build\package.json + - '%USERPROFILE%\.nylas\.apm' + - '%USERPROFILE%\.npm' diff --git a/arclib/.phutil_module_cache b/arclib/.phutil_module_cache deleted file mode 100644 index b7d92402c5..0000000000 --- a/arclib/.phutil_module_cache +++ /dev/null @@ -1 +0,0 @@ -{"__symbol_cache_version__":11} \ No newline at end of file diff --git a/arclib/__phutil_library_init__.php b/arclib/__phutil_library_init__.php deleted file mode 100644 index 93cfbaabbe..0000000000 --- a/arclib/__phutil_library_init__.php +++ /dev/null @@ -1,3 +0,0 @@ - 2, - 'class' => array(), - 'function' => array(), - 'xmap' => array(), -)); diff --git a/atom.sh b/atom.sh deleted file mode 100755 index 73da87df2e..0000000000 --- a/atom.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash - -# This file is sym-linked to the `atom` executable. -# It is used by `apm` when calling commands. - -if [ "$(uname)" == 'Darwin' ]; then - OS='Mac' -elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then - OS='Linux' -elif [ "$(expr substr $(uname -s) 1 10)" == 'MINGW32_NT' ]; then - OS='Cygwin' -else - echo "Your platform ($(uname -a)) is not supported." - exit 1 -fi - -while getopts ":wtfvh-:" opt; do - case "$opt" in - -) - case "${OPTARG}" in - wait) - WAIT=1 - ;; - help|version) - REDIRECT_STDERR=1 - EXPECT_OUTPUT=1 - ;; - foreground|test) - EXPECT_OUTPUT=1 - ;; - esac - ;; - w) - WAIT=1 - ;; - h|v) - REDIRECT_STDERR=1 - EXPECT_OUTPUT=1 - ;; - f|t) - EXPECT_OUTPUT=1 - ;; - esac -done - -if [ $REDIRECT_STDERR ]; then - exec 2> /dev/null -fi - -if [ $OS == 'Mac' ]; then - if [ -z "$EDGEHILL_PATH" ]; then - echo "Set the EDGEHILL_PATH environment variable to the absolute location of the main edgehill folder." - exit 1 - fi - - ATOM_SHELL_PATH=${ATOM_SHELL_PATH:-$EDGEHILL_PATH/atom-shell} # Set ATOM_SHELL_PATH unless it is already set - - # Exit if Atom can't be found - if [ -z "$ATOM_SHELL_PATH" ]; then - echo "Cannot locate atom-shell. Be sure you have run script/grunt download-atom-shell first from $EDGEHILL_PATH" - exit 1 - fi - - # We find the atom-shell executable inside of the atom-shell directory. - $ATOM_SHELL_PATH/Atom.app/Contents/MacOS/Atom --executed-from="$(pwd)" --pid=$$ "$@" $EDGEHILL_PATH - -elif [ $OS == 'Linux' ]; then - DOT_INBOX_DIR="$HOME/.inbox" - - mkdir -p "$DOT_INBOX_DIR" - - if [ -z "$EDGEHILL_PATH" ]; then - echo "Set the EDGEHILL_PATH environment variable to the absolute location of the main edgehill folder." - exit 1 - fi - - ATOM_SHELL_PATH=${ATOM_SHELL_PATH:-$EDGEHILL_PATH/atom-shell} # Set ATOM_SHELL_PATH unless it is already set - - # Exit if Atom can't be found - if [ -z "$ATOM_SHELL_PATH" ]; then - echo "Cannot locate atom-shell. Be sure you have run script/grunt download-atom-shell first from $EDGEHILL_PATH" - exit 1 - fi - - # We find the atom-shell executable inside of the atom-shell directory. - $ATOM_SHELL_PATH/atom --executed-from="$(pwd)" --pid=$$ "$@" $EDGEHILL_PATH - -fi - -# Exits this process when Atom is used as $EDITOR -on_die() { - exit 0 -} -trap 'on_die' SIGQUIT SIGTERM - -# If the wait flag is set, don't exit this process until Atom tells it to. -if [ $WAIT ]; then - while true; do - sleep 1 - done -fi diff --git a/book.json b/book.json new file mode 100644 index 0000000000..613d5e7590 --- /dev/null +++ b/book.json @@ -0,0 +1,38 @@ +{ + "gitbook": "3.2.2", + "title": "Nylas Mail Plugin SDK", + "root": "./docs_src", + + "plugins": [ + "search", + "lunr", + "-fontsettings", + "-sharing", + "anchors", + "github", + "editlink", + "favicon" + ], + + "pluginsConfig": { + "editlink": { + "base": "https://github.com/nylas/nylas-mail/tree/master/docs_src", + "label": "Edit This Page", + "multilingual": false + }, + "github": { + "url": "https://github.com/nylas/nylas-mail" + }, + "favicon": { + "shortcut": "/img/favicon.png" + } + }, + + "links": { + "sharing": { + "facebook": false, + "twitter": false + } + } + +} diff --git a/build/Gruntfile.coffee b/build/Gruntfile.coffee deleted file mode 100644 index 027c45cece..0000000000 --- a/build/Gruntfile.coffee +++ /dev/null @@ -1,323 +0,0 @@ -fs = require 'fs' -path = require 'path' -os = require 'os' - -# This is the main Gruntfile that manages building Edgehill distributions. -# The reason it's inisde of the build/ folder is so everything can be -# compiled against Node's v8 headers instead of Atom's v8 headers. All -# packages in the root-level node_modules are compiled against Atom's v8 -# headers. -# -# Some useful grunt options are: -# --instal-dir -# --build-dir -# -# To keep the various directories straight, here are what the various -# directories might look like on MacOS -# -# tmpDir: /var/folders/xl/_qdlmc512sb6cpqryy_2tzzw0000gn/T/ (aka /tmp) -# -# buildDir = /tmp/edgehill-build -# shellAppDir = /tmp/edgehill-build/Edgehill.app -# contentsDir = /tmp/edgehill-build/Edgehill.app/Contents -# appDir = /tmp/edgehill-build/Edgehill.app/Contents/Resources/app -# -# installDir = /Applications/Edgehil.app -# -# And on Linux: -# -# tmpDir: /tmp/ -# -# buildDir = /tmp/edgehill-build -# shellAppDir = /tmp/edgehill-build/Edgehill -# contentsDir = /tmp/edgehill-build/Edgehill -# appDir = /tmp/edgehill-build/Edgehill/resources/app -# -# installDir = /usr/local OR $INSTALL_PREFIX -# binDir = /usr/local/bin -# shareDir = /usr/local/share/edgehill - -# Add support for obselete APIs of vm module so we can make some third-party -# modules work under node v0.11.x. -require 'vm-compatibility-layer' - -_ = require 'underscore-plus' - -packageJson = require '../package.json' - -# Shim harmony collections in case grunt was invoked without harmony -# collections enabled -_.extend(global, require('harmony-collections')) unless global.WeakMap? - -module.exports = (grunt) -> - grunt.loadNpmTasks('grunt-coffeelint-cjsx') - grunt.loadNpmTasks('grunt-lesslint') - grunt.loadNpmTasks('grunt-cson') - grunt.loadNpmTasks('grunt-contrib-csslint') - grunt.loadNpmTasks('grunt-coffee-react') - grunt.loadNpmTasks('grunt-contrib-coffee') - grunt.loadNpmTasks('grunt-contrib-less') - grunt.loadNpmTasks('grunt-shell') - grunt.loadNpmTasks('grunt-markdown') - grunt.loadNpmTasks('grunt-download-atom-shell') - grunt.loadNpmTasks('grunt-atom-shell-installer') - grunt.loadNpmTasks('grunt-peg') - grunt.loadTasks('tasks') - - # This allows all subsequent paths to the relative to the root of the repo - grunt.file.setBase(path.resolve('..')) - - # Commented out because it was causing normal grunt message to dissapear - # for some reason. - # if not grunt.option('verbose') - # grunt.log.writeln = (args...) -> grunt.log - # grunt.log.write = (args...) -> grunt.log - - [major, minor, patch] = packageJson.version.split('.') - tmpDir = os.tmpdir() - appName = if process.platform is 'darwin' then 'Edgehill.app' else 'Edgehill' - buildDir = grunt.option('build-dir') ? path.join(tmpDir, 'edgehill-build') - buildDir = path.resolve(buildDir) - installDir = grunt.option('install-dir') - - home = if process.platform is 'win32' then process.env.USERPROFILE else process.env.HOME - atomShellDownloadDir = path.join(home, '.inbox', 'atom-shell') - - symbolsDir = path.join(buildDir, 'Atom.breakpad.syms') - shellAppDir = path.join(buildDir, appName) - if process.platform is 'win32' - contentsDir = shellAppDir - appDir = path.join(shellAppDir, 'resources', 'app') - installDir ?= path.join(process.env.ProgramFiles, appName) - killCommand = 'taskkill /F /IM edgehill.exe' - else if process.platform is 'darwin' - contentsDir = path.join(shellAppDir, 'Contents') - appDir = path.join(contentsDir, 'Resources', 'app') - installDir ?= path.join('/Applications', appName) - killCommand = 'pkill -9 Edgehill' - else - contentsDir = shellAppDir - appDir = path.join(shellAppDir, 'resources', 'app') - installDir ?= process.env.INSTALL_PREFIX ? '/usr/local' - killCommand ='pkill -9 edgehill' - - installDir = path.resolve(installDir) - - cjsxConfig = - glob_to_multiple: - expand: true - src: [ - 'src/**/*.cjsx' - 'internal_packages/**/*.cjsx' - ] - dest: appDir - ext: '.js' - - coffeeConfig = - glob_to_multiple: - expand: true - src: [ - 'src/**/*.coffee' - 'internal_packages/**/*.coffee' - 'exports/**/*.coffee' - 'static/**/*.coffee' - ] - dest: appDir - ext: '.js' - - lessConfig = - options: - paths: [ - 'static/variables' - 'static' - ] - glob_to_multiple: - expand: true - src: [ - 'static/**/*.less' - ] - dest: appDir - ext: '.css' - - prebuildLessConfig = - src: [ - 'static/**/*.less' - ] - - csonConfig = - options: - rootObject: true - cachePath: path.join(home, '.inbox', 'compile-cache', 'grunt-cson') - - glob_to_multiple: - expand: true - src: [ - 'menus/*.cson' - 'keymaps/*.cson' - 'static/**/*.cson' - ] - dest: appDir - ext: '.json' - - pegConfig = - glob_to_multiple: - expand: true - src: ['src/**/*.pegjs'] - dest: appDir - ext: '.js' - - for child in fs.readdirSync('node_modules') when child isnt '.bin' - directory = path.join('node_modules', child) - metadataPath = path.join(directory, 'package.json') - continue unless grunt.file.isFile(metadataPath) - - {engines, theme} = grunt.file.readJSON(metadataPath) - if engines?.atom? - coffeeConfig.glob_to_multiple.src.push("#{directory}/**/*.coffee") - lessConfig.glob_to_multiple.src.push("#{directory}/**/*.less") - prebuildLessConfig.src.push("#{directory}/**/*.less") unless theme - csonConfig.glob_to_multiple.src.push("#{directory}/**/*.cson") - pegConfig.glob_to_multiple.src.push("#{directory}/**/*.pegjs") - - grunt.initConfig - pkg: grunt.file.readJSON('package.json') - - atom: {appDir, appName, symbolsDir, buildDir, contentsDir, installDir, shellAppDir} - - docsOutputDir: 'docs/output' - - coffee: coffeeConfig - - cjsx: cjsxConfig - - less: lessConfig - - 'prebuild-less': prebuildLessConfig - - cson: csonConfig - - peg: pegConfig - - coffeelint: - options: - configFile: 'coffeelint.json' - src: [ - 'internal_packages/**/*.cjsx' - 'internal_packages/**/*.coffee' - 'dot-inbox/**/*.coffee' - 'exports/**/*.coffee' - 'src/**/*.coffee' - ] - build: [ - 'build/tasks/**/*.coffee' - 'build/Gruntfile.coffee' - ] - test: [ - 'spec/*.coffee' - 'spec-inbox/*.cjsx' - 'spec-inbox/*.coffee' - ] - target: - grunt.option("target")?.split(" ") or [] - - csslint: - options: - 'adjoining-classes': false - 'duplicate-background-images': false - 'box-model': false - 'box-sizing': false - 'bulletproof-font-face': false - 'compatible-vendor-prefixes': false - 'display-property-grouping': false - 'fallback-colors': false - 'font-sizes': false - 'gradients': false - 'ids': false - 'important': false - 'known-properties': false - 'outline-none': false - 'overqualified-elements': false - 'qualified-headings': false - 'unique-headings': false - 'universal-selector': false - 'vendor-prefix': false - src: [ - 'static/**/*.css' - ] - - lesslint: - src: [ - 'static/**/*.less' - ] - options: - imports: ['variables/*.less'] - - markdown: - guides: - files: [ - expand: true - cwd: 'docs' - src: '**/*.md' - dest: 'docs/output/' - ext: '.html' - ] - options: - template: 'docs/template.jst' - templateContext: - title: "Documentation" - tag: "v#{major}.#{minor}" - markdownOptions: - gfm: true - preCompile: (src, context) -> - fm = require 'json-front-matter' - parsed = fm.parse(src) - _.extend(context, parsed.attributes) - parsed.body - - 'download-atom-shell': - version: packageJson.atomShellVersion - outputDir: 'atom-shell' - downloadDir: atomShellDownloadDir - rebuild: true # rebuild native modules after atom-shell is updated - token: process.env.ATOM_ACCESS_TOKEN - - 'create-windows-installer': - appDirectory: shellAppDir - outputDirectory: path.join(buildDir, 'installer') - authors: 'InboxApp Inc.' - loadingGif: path.resolve(__dirname, '..', 'resources', 'win', 'loading.gif') - iconUrl: 'https://raw.githubusercontent.com/atom/atom/master/resources/win/atom.ico' - setupIcon: path.resolve(__dirname, '..', 'resources', 'win', 'edgehill.ico') - - shell: - 'kill-atom': - command: killCommand - options: - stdout: false - stderr: false - failOnError: false - - grunt.registerTask('compile', ['coffee', 'cjsx', 'prebuild-less', 'cson', 'peg']) - grunt.registerTask('lint', ['coffeelint', 'csslint', 'lesslint']) - grunt.registerTask('test', ['shell:kill-atom', 'run-edgehill-specs']) - grunt.registerTask('docs', ['build-docs', 'render-docs']) - - ciTasks = ['output-disk-space', 'download-atom-shell', 'build'] - ciTasks.push('dump-symbols') if process.platform isnt 'win32' - ciTasks.push('set-version', 'lint') - ciTasks.push('mkdeb') if process.platform is 'linux' - ciTasks.push('test') if process.platform is 'darwin' - ciTasks.push('codesign') - ciTasks.push('mkdmg') if process.platform is 'darwin' - ciTasks.push('create-windows-installer') if process.platform is 'win32' - ciTasks.push('publish-edgehill-build') if process.platform is 'darwin' - # ciTasks.push('publish-build') - grunt.registerTask('ci', ciTasks) - - defaultTasks = ['download-atom-shell', 'build', 'set-version'] - # We don't run `install` on linux because you need to run `sudo`. - # See docs/build-instructions/linux.md - # `sudo script/grunt install` - defaultTasks.push 'mkdmg' if process.platform is 'darwin' - defaultTasks.push 'install' unless process.platform is 'linux' - grunt.registerTask('default', defaultTasks) diff --git a/build/Gruntfile.js b/build/Gruntfile.js new file mode 100644 index 0000000000..b237e749ac --- /dev/null +++ b/build/Gruntfile.js @@ -0,0 +1,88 @@ +/* eslint global-require: 0 */ +const path = require('path'); + +module.exports = (grunt) => { + if (!grunt.option('platform')) { + grunt.option('platform', process.platform); + } + + // This allows all subsequent paths to the relative to the root of the repo + grunt.config.init({ + 'appDir': path.resolve('..'), + 'classDocsOutputDir': './docs_src/classes', + + 'outputDir': path.resolve('../dist'), + 'appJSON': grunt.file.readJSON('../package.json'), + 'source:coffeescript': [ + 'internal_packages/**/*.cjsx', + 'internal_packages/**/*.coffee', + 'dot-nylas/**/*.coffee', + 'src/**/*.coffee', + 'src/**/*.cjsx', + 'spec/**/*.cjsx', + 'spec/**/*.coffee', + '!src/**/node_modules/**/*.coffee', + '!internal_packages/**/node_modules/**/*.coffee', + ], + 'source:es6': [ + 'internal_packages/**/*.jsx', + 'internal_packages/**/*.es6', + 'internal_packages/**/*.es', + 'dot-nylas/**/*.es6', + 'dot-nylas/**/*.es', + 'src/**/*.es6', + 'src/**/*.es', + 'src/**/*.jsx', + 'src/K2/**/*.js', // K2 doesn't use ES6 extension, lint it anyway! + 'spec/**/*.es6', + 'spec/**/*.es', + 'spec/**/*.jsx', + '!src/K2/packages/local-private/src/error-logger-extensions/*.js', + '!src/**/node_modules/**/*.es6', + '!src/**/node_modules/**/*.es', + '!src/**/node_modules/**/*.jsx', + '!src/K2/**/node_modules/**/*.js', + '!internal_packages/**/node_modules/**/*.es6', + '!internal_packages/**/node_modules/**/*.es', + '!internal_packages/**/node_modules/**/*.jsx', + ], + + 'gitbook': { + 'development': { + 'input': "./", + 'title': "vue.js book", + 'description': "This book is vue.js guide book.", + 'github': "koba04/vuejs-book" + } + } + + + }); + + grunt.loadTasks('./tasks'); + grunt.file.setBase(path.resolve('..')); + + // Register CI Tasks + const postBuildSteps = []; + if (grunt.option('platform') === 'win32') { + postBuildSteps.push('create-windows-installer') + } else if (grunt.option('platform') === 'darwin') { + postBuildSteps.push('create-mac-zip') + postBuildSteps.push('create-mac-dmg') + } else if (grunt.option('platform') === 'linux') { + postBuildSteps.push('create-deb-installer'); + postBuildSteps.push('create-rpm-installer'); + } + + const {shouldPublishBuild} = require('./tasks/task-helpers')(grunt); + if (shouldPublishBuild()) { + postBuildSteps.push('publish'); + } + + grunt.registerTask('build', ['setup-travis-keychain', 'packager']); + grunt.registerTask('lint', ['eslint', 'lesslint', 'nylaslint', 'coffeelint', 'csslint']); + grunt.registerTask('ci', ['build'].concat(postBuildSteps)); + + grunt.registerTask('docs', ['docs-build', 'docs-render']); + +} diff --git a/build/README.md b/build/README.md index 4ada056f1e..0623125f41 100644 --- a/build/README.md +++ b/build/README.md @@ -1,10 +1,27 @@ -# Atom Build +# N1 Build Environment +Node version 0.10.x (Due to the version of electron currently used.) -This folder contains the grunt configuration and tasks to build Atom. +# N1 Building and Tasks -It was moved from the root of the repository so that any native modules used -would be compiled against node's v8 headers since anything stored in -`node_modules` at the root of the repo is compiled against atom's v8 headers. +This folder contains tasks to create production builds of N1 -New build dependencies should be added to the `package.json` file located in -this folder. +Tasks should not be executed from this folder, but rather from `/scripts`. The +`/scripts` folder has convenient methods that fix paths and do environment +checks. + +Note that most of the task definitions are stored in `/build/tasks` + +## Some useful tasks + +NOTE: Run all of these from the N1 root folder. + +**Linting:** + + `script/grunt lint` + +**Building:** + + `script/grunt build` + +The build folder has its own package.json and is isolated so we can use `npm` +to compile against v8's headers instead of `apm` diff --git a/coffeelint.json b/build/config/coffeelint.json similarity index 100% rename from coffeelint.json rename to build/config/coffeelint.json diff --git a/build/config/eslint.json b/build/config/eslint.json new file mode 100644 index 0000000000..f3d5060407 --- /dev/null +++ b/build/config/eslint.json @@ -0,0 +1,74 @@ +{ + "parser": "babel-eslint", + "extends": "airbnb", + "globals": { + "NylasEnv": false, + "$n": false, + "waitsForPromise": false, + "advanceClock": false, + "TEST_ACCOUNT_ID": false, + "TEST_ACCOUNT_NAME": false, + "TEST_ACCOUNT_EMAIL": false, + "TEST_ACCOUNT_ALIAS_EMAIL": false + }, + "env": { + "browser": true, + "node": true, + "jasmine": true + }, + "rules": { + "arrow-body-style": "off", + "arrow-parens": "off", + "class-methods-use-this": "off", + "prefer-arrow-callback": ["error", {"allowNamedFunctions": true}], + "eqeqeq": ["error", "smart"], + "id-length": "off", + "object-curly-spacing": "off", + "max-len": "off", + "new-cap": ["error", {"capIsNew": false}], + "newline-per-chained-call": "off", + "no-bitwise": "off", + "no-lonely-if": "off", + "no-console": "off", + "no-continue": "off", + "no-constant-condition": "off", + "no-loop-func": "off", + "no-plusplus": "off", + "no-shadow": "error", + "no-underscore-dangle": "off", + "object-shorthand": "off", + "quotes": "off", + "quote-props": ["error", "consistent-as-needed", { "keywords": true }], + "no-param-reassign": ["error", { "props": false }], + "semi": "off", + "no-mixed-operators": "off", + "import/extensions": ["error", "never", { "json": "always" }], + "import/no-unresolved": ["error", {"ignore": ["nylas-exports", "nylas-component-kit", "electron", "nylas-store", "react-dom/server", "nylas-observables", "windows-shortcuts", "moment-round", "better-sqlite3", "chrono-node", "event-kit", "enzyme"]}], + "import/no-extraneous-dependencies": "off", + "import/newline-after-import": "off", + "import/prefer-default-export": "off", + "react/no-multi-comp": "off", + "react/no-find-dom-node": "off", + "react/no-string-refs": "off", + "react/no-unused-prop-types": "off", + "react/forbid-prop-types": "off", + "jsx-a11y/no-static-element-interactions": "off", + "react/prop-types": ["error", {"ignore": ["children"]}], + "react/sort-comp": "error", + "no-restricted-syntax": [ + "error", "ForInStatement", "LabeledStatement", "WithStatement" + ], + "comma-dangle": ["error", { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "ignore" + }], + "no-useless-return": "off" + }, + "settings": { + "import/core-modules": [ "nylas-exports", "nylas-component-kit", "electron", "nylas-store", "nylas-observables" ], + "import/resolver": {"node": {"extensions": [".es6", ".jsx", ".coffee", ".json", ".cjsx", ".js"]}} + } +} diff --git a/build/debian/Dockerfile b/build/debian/Dockerfile deleted file mode 100644 index 5dd5a5eb8b..0000000000 --- a/build/debian/Dockerfile +++ /dev/null @@ -1,50 +0,0 @@ -# VERSION: 0.1 -# DESCRIPTION: Create the atom editor in a container -# AUTHOR: Jessica Frazelle -# COMMENTS: -# This file describes how to build the atom editor -# in a container with all dependencies installed. -# Tested on Debian Jessie. -# USAGE: -# # Download atom Dockerfile -# wget https://raw.githubusercontent.com/atom/atom/master/Dockerfile -# -# # Build atom image -# docker build -t atom . -# -# docker run -v /tmp/.X11-unix:/tmp/.X11-unix \ -# -e DISPLAY=unix$DISPLAY atom -# - -DOCKER-VERSION 1.3 - -# Base docker image -FROM debian:jessie -MAINTAINER Jessica Frazelle - -# Install dependencies -RUN apt-get update && apt-get install -y \ - build-essential \ - ca-certificates \ - curl \ - git \ - libasound2 \ - libgconf-2-4 \ - libgnome-keyring-dev \ - libgtk2.0-0 \ - libnss3 \ - libxtst6 \ - --no-install-recommends - -# install node -RUN curl -sL https://deb.nodesource.com/setup | bash - -RUN apt-get install -y nodejs - -# clone atom -RUN git clone https://github.com/atom/atom /src -WORKDIR /src -RUN git fetch && git checkout $(git describe --tags `git rev-list --tags --max-count=1`) -RUN script/build && script/grunt install - -# Autorun atom -CMD /usr/local/bin/atom --foreground --log-file /var/log/atom.log && tail -f /var/log/atom.log diff --git a/build/docs_templates/_function.html b/build/docs_templates/_function.html new file mode 100644 index 0000000000..5ef834d927 --- /dev/null +++ b/build/docs_templates/_function.html @@ -0,0 +1,40 @@ +

+ {{name}}({{#each arguments}}{{#if isOptional}}[{{/if}}{{name}}{{#if isOptional}}]{{/if}}{{/each}}) +

+ +
+

{{{description}}}

+
+ +{{#if arguments.length}} +Parameters + + + + + + {{#each arguments}} + + + + + {{/each}} +
ArgumentDescription
+ {{name}} + + {{#if isOptional}}Optional{{/if}} + {{{description}}} +
+{{/if}} + +{{#if returnValues.length}} +Returns + + + + + {{#each returnValues}} + + {{/each}} +
Return Values
{{{description}}}
+{{/if}} diff --git a/build/docs_templates/_property.html b/build/docs_templates/_property.html new file mode 100644 index 0000000000..ee21ae0a68 --- /dev/null +++ b/build/docs_templates/_property.html @@ -0,0 +1,17 @@ +

{{name}}

+

{{{description}}}

+{{#if arguments.length}} + + {{#each arguments}} + + + + + {{/each}} +
+ {{name}} + + {{#if isOptional}}Optional{{/if}} + {{{description}}} +
+{{/if}} diff --git a/build/docs_templates/class.md b/build/docs_templates/class.md new file mode 100644 index 0000000000..9b75d411c8 --- /dev/null +++ b/build/docs_templates/class.md @@ -0,0 +1,44 @@ +# {{ name }} + +## Summary + +{{{documentation.description}}} + +
    + {{#each documentation.sections}} +
  • {{name}}
  • + {{/each}} +
+ + +{{#if documentation.classProperties.length}} + +### Class Properties + +{{#each documentation.classProperties}} +{{> _property.html}} +{{/each}} + +{{/if}} + + +{{#if documentation.classMethods.length}} + +### Class Methods + +{{#each documentation.classMethods}} +{{> _function.html}} +{{/each}} + +{{/if}} + + +{{#if documentation.instanceMethods.length}} + +### Instance Methods + +{{#each documentation.instanceMethods}} +{{> _function.html}} +{{/each}} + +{{/if}} diff --git a/build/docs_templates/sidebar.md b/build/docs_templates/sidebar.md new file mode 100644 index 0000000000..a715353cc7 --- /dev/null +++ b/build/docs_templates/sidebar.md @@ -0,0 +1,45 @@ +{{!-- This is our preferred ordering, so do it manually! --}} +## General +{{#each sidebar.General}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Component Kit +{{#each sidebar.[Component Kit]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Extensions +{{#each sidebar.[Extensions]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Models +{{#each sidebar.[Models]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Stores +{{#each sidebar.[Stores]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Database +{{#each sidebar.[Database]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Drafts +{{#each sidebar.[Drafts]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## NylasEnv +{{#each sidebar.[NylasEnv]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} + +## Atom +{{#each sidebar.[Atom]}} +* [{{this}}](/classes/{{this}}.md) +{{/each}} diff --git a/build/local-ci.sh b/build/local-ci.sh new file mode 100755 index 0000000000..36130baba6 --- /dev/null +++ b/build/local-ci.sh @@ -0,0 +1,18 @@ +#! /usr/bin/env bash +set -e +if [ ! -d "build/resources/certs" ]; then + echo "Please manually place the unencrypted certs for this operating system into build/resources/certs" + exit 1 +fi + +mkdir -p /tmp/nylas +mv build/resources/certs /tmp/nylas/certs +git clean -xdf +mv /tmp/nylas/certs build/resources/certs + +export PUBLISH_BUILD=true; +git submodule update --init --recursive +source build/resources/certs/set_unix_env.sh + +script/bootstrap +script/grunt ci diff --git a/build/package.json b/build/package.json index 553813f715..c086410f4d 100644 --- a/build/package.json +++ b/build/package.json @@ -1,54 +1,33 @@ { - "name": "atom-build", - "description": "Atom build", + "name": "nylas-build", + "description": "N1 build", "repository": { "type": "git", - "url": "https://github.com/atom/atom.git" + "url": "https://github.com/nylas/edgehill.git" }, "dependencies": { - "archiver": "^0.13", - "async": "~0.2.9", - "bluebird": "^2.3", - "coffee-react-transform": "^3.1.0", - "donna": "1.0.10", - "formidable": "~1.0.14", - "fs-plus": "2.x", - "github-releases": "~0.2.0", + "archiver": "1.2.x", + "chalk": "1.x.x", + "coffeelint-cjsx": "^2.0", + "electron-installer-dmg": "0.2.0", + "electron-packager": "^8.4.0", + "glob": "7.1.1", "grunt": "~0.4.1", - "grunt-atom-shell-installer": "^0.20.0", "grunt-cli": "~0.1.9", + "grunt-coffee-react": "^5.0.0", "grunt-coffeelint": "git+https://github.com/atom/grunt-coffeelint.git#cfb99aa99811d52687969532bd5a98011ed95bfe", "grunt-coffeelint-cjsx": "^0.1", "grunt-contrib-coffee": "~0.12.0", - "grunt-contrib-csslint": "~0.1.2", + "grunt-contrib-csslint": "~0.5.0", "grunt-contrib-less": "~0.8.0", - "grunt-cson": "0.14.0", - "grunt-download-atom-shell": "~0.11.0", + "grunt-electron-installer": "2.1.0", "grunt-lesslint": "0.13.0", - "grunt-markdown": "^0.7.0", - "grunt-peg": "~1.1.0", - "grunt-shell": "~0.3.1", - "handlebars": "^3.0.2", - "harmony-collections": "~0.3.8", - "highlight.js": "^8.5.0", - "json-front-matter": "^1.0.0", - "legal-eagle": "~0.9.0", - "marked": "^0.3.3", "minidump": "~0.8", - "moment": "^2.8", - "npm": "~1.4.5", - "rcedit": "~0.3.0", - "request": "~2.27.0", - "rimraf": "~2.2.2", - "runas": "~1.0.1", + "request": "^2.64", "s3": "^4.3", - "tello": "1.0.5", "temp": "~0.8.1", - "underscore-plus": "1.x", + "underscore": "^1.8.3", "unzip": "~0.1.9", - "vm-compatibility-layer": "~0.1.0" - }, - "devDependencies": { - "grunt-coffee-react": "^2.1.0" + "webdriverio": "^2.4.5" } } diff --git a/build/resources/asar-ordering-hint.txt b/build/resources/asar-ordering-hint.txt new file mode 100644 index 0000000000..1cbb278dc4 --- /dev/null +++ b/build/resources/asar-ordering-hint.txt @@ -0,0 +1,3818 @@ +956764: package.json +1760546: src/browser/main.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +1853312: node_modules/fs-plus/node_modules/async/package.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1894875: node_modules/mkdirp/package.json +1896279: node_modules/mkdirp/index.js +1898909: node_modules/optimist/package.json +1900199: node_modules/optimist/index.js +1914385: node_modules/optimist/node_modules/wordwrap/package.json +1915858: node_modules/optimist/node_modules/wordwrap/index.js +1918089: src/error-logger.js +1926560: node_modules/nslog/package.json +1928316: node_modules/nslog/lib/nslog.js +1928640: src/error-logger-extensions/nylas-private-error-reporter.js +1933337: node_modules/raven/package.json +1935222: node_modules/raven/index.js +1935631: node_modules/raven/lib/client.js +1941308: node_modules/raven/lib/parsers.js +1945141: node_modules/raven/node_modules/cookie/package.json +1946217: node_modules/raven/node_modules/cookie/index.js +1948116: node_modules/raven/lib/utils.js +1953762: node_modules/raven/lib/transports.js +1956068: node_modules/raven/node_modules/lsmod/package.json +1957254: node_modules/raven/node_modules/lsmod/index.js +1958729: node_modules/raven/node_modules/stack-trace/package.json +1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js +1962761: node_modules/node-uuid/package.json +1964629: node_modules/node-uuid/uuid.js +1933337: node_modules/raven/package.json +1972642: node_modules/raven/lib/middleware/connect.js +1973294: src/compile-cache.js +1978902: src/compile-support/babel.js +1980527: static/babelrc.json +1980671: src/compile-support/coffee-script.js +1981853: src/compile-support/typescript.js +1983139: node_modules/underscore/package.json +1985095: node_modules/underscore/underscore.js +2038014: node_modules/source-map-support/package.json +2039642: node_modules/source-map-support/source-map-support.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +2130092: src/browser/application.js +2161879: src/browser/system-tray-manager.js +2173675: src/browser/nylas-window.js +2187662: src/browser/window-manager.js +91213297: src/browser/window-launcher.js +91200495: src/browser/file-list-cache.js +2195924: src/browser/application-menu.js +2207382: src/flux/models/utils.js +8174990: node_modules/moment-timezone/package.json +8177056: node_modules/moment-timezone/index.js +8177170: node_modules/moment-timezone/moment-timezone.js +3971136: node_modules/moment/package.json +3974612: node_modules/moment/moment.js +8190929: node_modules/moment-timezone/data/packed/latest.json +3261374: src/task-registry.js +3264167: src/serializable-registry.js +3271782: src/database-object-registry.js +2228693: src/browser/auto-update-manager.js +2235663: src/browser/nylas-protocol-handler.js +2396007: node_modules/season/package.json +2397840: node_modules/season/lib/cson.js +2238228: src/config.js +2261295: src/config-utils.js +2264399: node_modules/emissary/package.json +2266273: node_modules/emissary/lib/emissary.js +2266555: node_modules/emissary/lib/helpers.js +2268129: node_modules/emissary/lib/behavior.js +2272107: node_modules/emissary/node_modules/underscore-plus/package.json +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2288860: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/package.json +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2336063: node_modules/property-accessors/package.json +2337929: node_modules/property-accessors/lib/property-accessors.js +2340201: node_modules/property-accessors/node_modules/mixto/package.json +2341779: node_modules/property-accessors/node_modules/mixto/lib/mixin.js +2343179: node_modules/emissary/lib/signal.js +2352520: node_modules/emissary/lib/emitter.js +2367779: node_modules/emissary/node_modules/mixto/package.json +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +2376215: node_modules/event-kit/package.json +2378208: node_modules/event-kit/lib/event-kit.js +2378397: node_modules/event-kit/lib/emitter.js +2382101: node_modules/event-kit/lib/disposable.js +2394595: node_modules/event-kit/lib/composite-disposable.js +2441735: node_modules/pathwatcher/package.json +2444020: node_modules/pathwatcher/lib/main.js +2450494: node_modules/pathwatcher/lib/file.js +2466571: node_modules/pathwatcher/node_modules/underscore-plus/package.json +2468584: node_modules/pathwatcher/node_modules/underscore-plus/lib/underscore-plus.js +2483372: node_modules/pathwatcher/node_modules/underscore-plus/node_modules/underscore/package.json +2485130: node_modules/pathwatcher/node_modules/underscore-plus/node_modules/underscore/underscore.js +2530619: node_modules/pathwatcher/lib/directory.js +2542040: node_modules/pathwatcher/node_modules/async/package.json +2543482: node_modules/pathwatcher/node_modules/async/lib/async.js +2572883: src/color.js +1973294: src/compile-cache.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +1973294: src/compile-cache.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +1973294: src/compile-cache.js +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +1853312: node_modules/fs-plus/node_modules/async/package.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1978902: src/compile-support/babel.js +1853312: node_modules/fs-plus/node_modules/async/package.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1853312: node_modules/fs-plus/node_modules/async/package.json +1980527: static/babelrc.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1980671: src/compile-support/coffee-script.js +1981853: src/compile-support/typescript.js +1978902: src/compile-support/babel.js +1983139: node_modules/underscore/package.json +1985095: node_modules/underscore/underscore.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1978902: src/compile-support/babel.js +1980527: static/babelrc.json +1980671: src/compile-support/coffee-script.js +1981853: src/compile-support/typescript.js +2038014: node_modules/source-map-support/package.json +1983139: node_modules/underscore/package.json +2039642: node_modules/source-map-support/source-map-support.js +1985095: node_modules/underscore/underscore.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +1980527: static/babelrc.json +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +1980671: src/compile-support/coffee-script.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +1981853: src/compile-support/typescript.js +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +1983139: node_modules/underscore/package.json +1985095: node_modules/underscore/underscore.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2038014: node_modules/source-map-support/package.json +2039642: node_modules/source-map-support/source-map-support.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2038014: node_modules/source-map-support/package.json +2039642: node_modules/source-map-support/source-map-support.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +2851648: src/module-cache.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2866883: node_modules/semver/package.json +2868219: node_modules/semver/semver.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +956764: package.json +2851648: src/module-cache.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2866883: node_modules/semver/package.json +2868219: node_modules/semver/semver.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +2851648: src/module-cache.js +956764: package.json +2866883: node_modules/semver/package.json +2868219: node_modules/semver/semver.js +956764: package.json +2397840: node_modules/season/lib/cson.js +94886363: src/secondary-window-bootstrap.js +2901212: node_modules/bluebird/js/main/bluebird.js +2901506: node_modules/bluebird/js/main/promise.js +2926597: node_modules/bluebird/js/main/util.js +2935230: node_modules/bluebird/js/main/es5.js +2397840: node_modules/season/lib/cson.js +2937208: node_modules/bluebird/js/main/async.js +2925857: src/window-bootstrap.js +2941161: node_modules/bluebird/js/main/schedule.js +2901212: node_modules/bluebird/js/main/bluebird.js +2901506: node_modules/bluebird/js/main/promise.js +2942440: node_modules/bluebird/js/main/queue.js +2944794: node_modules/bluebird/js/main/errors.js +2948412: node_modules/bluebird/js/main/thenables.js +2950756: node_modules/bluebird/js/main/promise_array.js +2926597: node_modules/bluebird/js/main/util.js +2954903: node_modules/bluebird/js/main/captured_trace.js +2935230: node_modules/bluebird/js/main/es5.js +2397840: node_modules/season/lib/cson.js +2937208: node_modules/bluebird/js/main/async.js +94886363: src/secondary-window-bootstrap.js +2941161: node_modules/bluebird/js/main/schedule.js +2901212: node_modules/bluebird/js/main/bluebird.js +2942440: node_modules/bluebird/js/main/queue.js +2901506: node_modules/bluebird/js/main/promise.js +2969949: node_modules/bluebird/js/main/debuggability.js +2944794: node_modules/bluebird/js/main/errors.js +2975097: node_modules/bluebird/js/main/context.js +2948412: node_modules/bluebird/js/main/thenables.js +2976035: node_modules/bluebird/js/main/catch_filter.js +2950756: node_modules/bluebird/js/main/promise_array.js +2978109: node_modules/bluebird/js/main/promise_resolver.js +2926597: node_modules/bluebird/js/main/util.js +2954903: node_modules/bluebird/js/main/captured_trace.js +2981972: node_modules/bluebird/js/main/progress.js +2935230: node_modules/bluebird/js/main/es5.js +2984464: node_modules/bluebird/js/main/method.js +2985800: node_modules/bluebird/js/main/bind.js +2987812: node_modules/bluebird/js/main/finally.js +2937208: node_modules/bluebird/js/main/async.js +2990436: node_modules/bluebird/js/main/direct_resolve.js +2991902: node_modules/bluebird/js/main/synchronous_inspection.js +2941161: node_modules/bluebird/js/main/schedule.js +2942440: node_modules/bluebird/js/main/queue.js +2994543: node_modules/bluebird/js/main/join.js +2969949: node_modules/bluebird/js/main/debuggability.js +2998433: node_modules/bluebird/js/main/map.js +2944794: node_modules/bluebird/js/main/errors.js +2975097: node_modules/bluebird/js/main/context.js +3002811: node_modules/bluebird/js/main/cancel.js +2948412: node_modules/bluebird/js/main/thenables.js +2976035: node_modules/bluebird/js/main/catch_filter.js +3004209: node_modules/bluebird/js/main/using.js +2950756: node_modules/bluebird/js/main/promise_array.js +2978109: node_modules/bluebird/js/main/promise_resolver.js +2954903: node_modules/bluebird/js/main/captured_trace.js +3011204: node_modules/bluebird/js/main/generators.js +2981972: node_modules/bluebird/js/main/progress.js +2984464: node_modules/bluebird/js/main/method.js +3015905: node_modules/bluebird/js/main/nodeify.js +2985800: node_modules/bluebird/js/main/bind.js +3017541: node_modules/bluebird/js/main/call_get.js +2987812: node_modules/bluebird/js/main/finally.js +3021885: node_modules/bluebird/js/main/props.js +2990436: node_modules/bluebird/js/main/direct_resolve.js +2991902: node_modules/bluebird/js/main/synchronous_inspection.js +3024057: node_modules/bluebird/js/main/race.js +2994543: node_modules/bluebird/js/main/join.js +3025282: node_modules/bluebird/js/main/reduce.js +2969949: node_modules/bluebird/js/main/debuggability.js +2998433: node_modules/bluebird/js/main/map.js +3030305: node_modules/bluebird/js/main/settle.js +2975097: node_modules/bluebird/js/main/context.js +3031473: node_modules/bluebird/js/main/some.js +2976035: node_modules/bluebird/js/main/catch_filter.js +3002811: node_modules/bluebird/js/main/cancel.js +3004209: node_modules/bluebird/js/main/using.js +2978109: node_modules/bluebird/js/main/promise_resolver.js +3034851: node_modules/bluebird/js/main/promisify.js +2981972: node_modules/bluebird/js/main/progress.js +3011204: node_modules/bluebird/js/main/generators.js +2984464: node_modules/bluebird/js/main/method.js +3046413: node_modules/bluebird/js/main/any.js +3015905: node_modules/bluebird/js/main/nodeify.js +3046834: node_modules/bluebird/js/main/each.js +2985800: node_modules/bluebird/js/main/bind.js +3047132: node_modules/bluebird/js/main/timers.js +3017541: node_modules/bluebird/js/main/call_get.js +2987812: node_modules/bluebird/js/main/finally.js +3048873: node_modules/bluebird/js/main/filter.js +2990436: node_modules/bluebird/js/main/direct_resolve.js +3021885: node_modules/bluebird/js/main/props.js +2991902: node_modules/bluebird/js/main/synchronous_inspection.js +2994543: node_modules/bluebird/js/main/join.js +3024057: node_modules/bluebird/js/main/race.js +3025282: node_modules/bluebird/js/main/reduce.js +2998433: node_modules/bluebird/js/main/map.js +2937208: node_modules/bluebird/js/main/async.js +3049187: node_modules/babel-core/package.json +3030305: node_modules/bluebird/js/main/settle.js +3002811: node_modules/bluebird/js/main/cancel.js +3031473: node_modules/bluebird/js/main/some.js +3004209: node_modules/bluebird/js/main/using.js +3034851: node_modules/bluebird/js/main/promisify.js +3011204: node_modules/bluebird/js/main/generators.js +1973294: src/compile-cache.js +3015905: node_modules/bluebird/js/main/nodeify.js +3046413: node_modules/bluebird/js/main/any.js +3046834: node_modules/bluebird/js/main/each.js +3017541: node_modules/bluebird/js/main/call_get.js +3047132: node_modules/bluebird/js/main/timers.js +3021885: node_modules/bluebird/js/main/props.js +2901506: node_modules/bluebird/js/main/promise.js +3048873: node_modules/bluebird/js/main/filter.js +3024057: node_modules/bluebird/js/main/race.js +3025282: node_modules/bluebird/js/main/reduce.js +2937208: node_modules/bluebird/js/main/async.js +3030305: node_modules/bluebird/js/main/settle.js +2901212: node_modules/bluebird/js/main/bluebird.js +3049187: node_modules/babel-core/package.json +3031473: node_modules/bluebird/js/main/some.js +2926597: node_modules/bluebird/js/main/util.js +3034851: node_modules/bluebird/js/main/promisify.js +3046413: node_modules/bluebird/js/main/any.js +3052709: src/window.js +3046834: node_modules/bluebird/js/main/each.js +3053190: src/nylas-env.js +1973294: src/compile-cache.js +3047132: node_modules/bluebird/js/main/timers.js +3048873: node_modules/bluebird/js/main/filter.js +2901506: node_modules/bluebird/js/main/promise.js +2937208: node_modules/bluebird/js/main/async.js +3049187: node_modules/babel-core/package.json +2901212: node_modules/bluebird/js/main/bluebird.js +2926597: node_modules/bluebird/js/main/util.js +1973294: src/compile-cache.js +2266273: node_modules/emissary/lib/emissary.js +2266555: node_modules/emissary/lib/helpers.js +3052709: src/window.js +2268129: node_modules/emissary/lib/behavior.js +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2901506: node_modules/bluebird/js/main/promise.js +3053190: src/nylas-env.js +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2901212: node_modules/bluebird/js/main/bluebird.js +2926597: node_modules/bluebird/js/main/util.js +2266273: node_modules/emissary/lib/emissary.js +3052709: src/window.js +2266555: node_modules/emissary/lib/helpers.js +3053190: src/nylas-env.js +2268129: node_modules/emissary/lib/behavior.js +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2337929: node_modules/property-accessors/lib/property-accessors.js +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2343179: node_modules/emissary/lib/signal.js +2352520: node_modules/emissary/lib/emitter.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +2266273: node_modules/emissary/lib/emissary.js +2266555: node_modules/emissary/lib/helpers.js +2268129: node_modules/emissary/lib/behavior.js +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2378208: node_modules/event-kit/lib/event-kit.js +2337929: node_modules/property-accessors/lib/property-accessors.js +2378397: node_modules/event-kit/lib/emitter.js +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2382101: node_modules/event-kit/lib/disposable.js +2343179: node_modules/emissary/lib/signal.js +2394595: node_modules/event-kit/lib/composite-disposable.js +3088814: node_modules/coffeestack/index.js +2352520: node_modules/emissary/lib/emitter.js +3093983: src/window-event-handler.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +2378208: node_modules/event-kit/lib/event-kit.js +2337929: node_modules/property-accessors/lib/property-accessors.js +3106501: src/styles-element.js +2378397: node_modules/event-kit/lib/emitter.js +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2382101: node_modules/event-kit/lib/disposable.js +94901394: src/store-registry.js +2343179: node_modules/emissary/lib/signal.js +2394595: node_modules/event-kit/lib/composite-disposable.js +3264167: src/serializable-registry.js +3088814: node_modules/coffeestack/index.js +2352520: node_modules/emissary/lib/emitter.js +3093983: src/window-event-handler.js +2207382: src/flux/models/utils.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +8174990: node_modules/moment-timezone/package.json +8177056: node_modules/moment-timezone/index.js +8177170: node_modules/moment-timezone/moment-timezone.js +2378208: node_modules/event-kit/lib/event-kit.js +2378397: node_modules/event-kit/lib/emitter.js +3974612: node_modules/moment/moment.js +3106501: src/styles-element.js +2382101: node_modules/event-kit/lib/disposable.js +2394595: node_modules/event-kit/lib/composite-disposable.js +94901394: src/store-registry.js +3088814: node_modules/coffeestack/index.js +3264167: src/serializable-registry.js +3093983: src/window-event-handler.js +2207382: src/flux/models/utils.js +8174990: node_modules/moment-timezone/package.json +8177056: node_modules/moment-timezone/index.js +8177170: node_modules/moment-timezone/moment-timezone.js +3106501: src/styles-element.js +3974612: node_modules/moment/moment.js +94901394: src/store-registry.js +3264167: src/serializable-registry.js +2207382: src/flux/models/utils.js +8174990: node_modules/moment-timezone/package.json +8177056: node_modules/moment-timezone/index.js +8177170: node_modules/moment-timezone/moment-timezone.js +3974612: node_modules/moment/moment.js +8190929: node_modules/moment-timezone/data/packed/latest.json +8190929: node_modules/moment-timezone/data/packed/latest.json +8190929: node_modules/moment-timezone/data/packed/latest.json +3261374: src/task-registry.js +3271782: src/database-object-registry.js +3113921: src/flux/errors.js +3261374: src/task-registry.js +3271782: src/database-object-registry.js +3113921: src/flux/errors.js +3261374: src/task-registry.js +1918089: src/error-logger.js +1918089: src/error-logger.js +3271782: src/database-object-registry.js +3113921: src/flux/errors.js +1928640: src/error-logger-extensions/nylas-private-error-reporter.js +1933337: node_modules/raven/package.json +1928640: src/error-logger-extensions/nylas-private-error-reporter.js +1935222: node_modules/raven/index.js +1935631: node_modules/raven/lib/client.js +1933337: node_modules/raven/package.json +1935222: node_modules/raven/index.js +1941308: node_modules/raven/lib/parsers.js +1935631: node_modules/raven/lib/client.js +1946217: node_modules/raven/node_modules/cookie/index.js +1948116: node_modules/raven/lib/utils.js +1941308: node_modules/raven/lib/parsers.js +1953762: node_modules/raven/lib/transports.js +1946217: node_modules/raven/node_modules/cookie/index.js +1948116: node_modules/raven/lib/utils.js +1953762: node_modules/raven/lib/transports.js +1918089: src/error-logger.js +1928640: src/error-logger-extensions/nylas-private-error-reporter.js +1933337: node_modules/raven/package.json +1935222: node_modules/raven/index.js +1935631: node_modules/raven/lib/client.js +1941308: node_modules/raven/lib/parsers.js +1946217: node_modules/raven/node_modules/cookie/index.js +1948116: node_modules/raven/lib/utils.js +1953762: node_modules/raven/lib/transports.js +1957254: node_modules/raven/node_modules/lsmod/index.js +1957254: node_modules/raven/node_modules/lsmod/index.js +1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js +1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js +1964629: node_modules/node-uuid/uuid.js +1964629: node_modules/node-uuid/uuid.js +1933337: node_modules/raven/package.json +1933337: node_modules/raven/package.json +1972642: node_modules/raven/lib/middleware/connect.js +1972642: node_modules/raven/lib/middleware/connect.js +1957254: node_modules/raven/node_modules/lsmod/index.js +1960042: node_modules/raven/node_modules/stack-trace/lib/stack-trace.js +1964629: node_modules/node-uuid/uuid.js +1933337: node_modules/raven/package.json +1972642: node_modules/raven/lib/middleware/connect.js +2238228: src/config.js +2238228: src/config.js +2261295: src/config-utils.js +2261295: src/config-utils.js +2444020: node_modules/pathwatcher/lib/main.js +2444020: node_modules/pathwatcher/lib/main.js +2450494: node_modules/pathwatcher/lib/file.js +2450494: node_modules/pathwatcher/lib/file.js +2530619: node_modules/pathwatcher/lib/directory.js +2530619: node_modules/pathwatcher/lib/directory.js +2572883: src/color.js +2572883: src/color.js +2238228: src/config.js +3115571: src/keymap-manager.js +3115571: src/keymap-manager.js +2261295: src/config-utils.js +72365667: node_modules/mousetrap/mousetrap.js +72365667: node_modules/mousetrap/mousetrap.js +2444020: node_modules/pathwatcher/lib/main.js +3122755: src/command-registry.js +3122755: src/command-registry.js +3153088: src/package-manager.js +3153088: src/package-manager.js +2450494: node_modules/pathwatcher/lib/file.js +3176053: node_modules/q/q.js +3176053: node_modules/q/q.js +2530619: node_modules/pathwatcher/lib/directory.js +2572883: src/color.js +3115571: src/keymap-manager.js +72365667: node_modules/mousetrap/mousetrap.js +3122755: src/command-registry.js +3176053: node_modules/q/q.js +3176053: node_modules/q/q.js +3153088: src/package-manager.js +3153088: src/package-manager.js +3153088: src/package-manager.js +3053190: src/nylas-env.js +3053190: src/nylas-env.js +3176053: node_modules/q/q.js +94886363: src/secondary-window-bootstrap.js +2925857: src/window-bootstrap.js +3238845: src/package.js +3238845: src/package.js +2407083: node_modules/async/lib/async.js +2407083: node_modules/async/lib/async.js +3176053: node_modules/q/q.js +3274725: src/theme-package.js +3274725: src/theme-package.js +3276790: src/flux/stores/database-store.js +3276790: src/flux/stores/database-store.js +3153088: src/package-manager.js +3053190: src/nylas-env.js +94886363: src/secondary-window-bootstrap.js +2405266: node_modules/async/package.json +2405266: node_modules/async/package.json +3305440: node_modules/sqlite3/package.json +3305440: node_modules/sqlite3/package.json +3317559: node_modules/sqlite3/lib/sqlite3.js +3317559: node_modules/sqlite3/lib/sqlite3.js +3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js +3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js +3238845: src/package.js +74661469: node_modules/nopt/lib/nopt.js +74661469: node_modules/nopt/lib/nopt.js +41220040: node_modules/abbrev/abbrev.js +41220040: node_modules/abbrev/abbrev.js +2407083: node_modules/async/lib/async.js +74736261: node_modules/npmlog/log.js +74736261: node_modules/npmlog/log.js +41757580: node_modules/are-we-there-yet/index.js +41757580: node_modules/are-we-there-yet/index.js +41760200: node_modules/are-we-there-yet/tracker-group.js +41760200: node_modules/are-we-there-yet/tracker-group.js +41759926: node_modules/are-we-there-yet/tracker-base.js +41759926: node_modules/are-we-there-yet/tracker-base.js +41764374: node_modules/are-we-there-yet/tracker.js +41764374: node_modules/are-we-there-yet/tracker.js +41763431: node_modules/are-we-there-yet/tracker-stream.js +41763431: node_modules/are-we-there-yet/tracker-stream.js +3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js +3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js +3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +3274725: src/theme-package.js +3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +3276790: src/flux/stores/database-store.js +56978227: node_modules/falafel/node_modules/isarray/index.js +56978227: node_modules/falafel/node_modules/isarray/index.js +56174974: node_modules/core-util-is/lib/util.js +56174974: node_modules/core-util-is/lib/util.js +3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js +3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js +3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +2405266: node_modules/async/package.json +3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +3305440: node_modules/sqlite3/package.json +3317559: node_modules/sqlite3/lib/sqlite3.js +3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +3323109: node_modules/node-pre-gyp/lib/node-pre-gyp.js +3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +74661469: node_modules/nopt/lib/nopt.js +3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +56223160: node_modules/delegates/index.js +56223160: node_modules/delegates/index.js +41220040: node_modules/abbrev/abbrev.js +57167856: node_modules/gauge/progress-bar.js +57167856: node_modules/gauge/progress-bar.js +74736261: node_modules/npmlog/log.js +57204450: node_modules/has-unicode/index.js +57204450: node_modules/has-unicode/index.js +41738129: node_modules/ansi/lib/ansi.js +41738129: node_modules/ansi/lib/ansi.js +41757580: node_modules/are-we-there-yet/index.js +41760200: node_modules/are-we-there-yet/tracker-group.js +41759926: node_modules/are-we-there-yet/tracker-base.js +41746103: node_modules/ansi/lib/newlines.js +41746103: node_modules/ansi/lib/newlines.js +41764374: node_modules/are-we-there-yet/tracker.js +41763431: node_modules/are-we-there-yet/tracker-stream.js +3327439: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/readable.js +67599487: node_modules/lodash.pad/index.js +67599487: node_modules/lodash.pad/index.js +3327909: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_readable.js +67593383: node_modules/lodash._baseslice/index.js +67593383: node_modules/lodash._baseslice/index.js +67646936: node_modules/lodash.tostring/index.js +67646936: node_modules/lodash.tostring/index.js +56978227: node_modules/falafel/node_modules/isarray/index.js +56174974: node_modules/core-util-is/lib/util.js +67615561: node_modules/lodash.padend/index.js +67615561: node_modules/lodash.padend/index.js +3357009: node_modules/babel-core/node_modules/regenerator/node_modules/commoner/node_modules/glob/node_modules/inherits/inherits.js +3357051: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js +67631576: node_modules/lodash.padstart/index.js +67631576: node_modules/lodash.padstart/index.js +3370120: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_duplex.js +3372931: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_transform.js +3380281: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_passthrough.js +56223160: node_modules/delegates/index.js +57167856: node_modules/gauge/progress-bar.js +3382008: node_modules/node-pre-gyp/lib/pre-binding.js +3382008: node_modules/node-pre-gyp/lib/pre-binding.js +3382833: node_modules/node-pre-gyp/lib/util/versioning.js +57204450: node_modules/has-unicode/index.js +3382833: node_modules/node-pre-gyp/lib/util/versioning.js +41738129: node_modules/ansi/lib/ansi.js +3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js +3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js +41746103: node_modules/ansi/lib/newlines.js +67599487: node_modules/lodash.pad/index.js +67593383: node_modules/lodash._baseslice/index.js +3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json +67646936: node_modules/lodash.tostring/index.js +3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json +3446169: node_modules/node-pre-gyp/package.json +67615561: node_modules/lodash.padend/index.js +3446169: node_modules/node-pre-gyp/package.json +3305440: node_modules/sqlite3/package.json +67631576: node_modules/lodash.padstart/index.js +3305440: node_modules/sqlite3/package.json +3382008: node_modules/node-pre-gyp/lib/pre-binding.js +3382833: node_modules/node-pre-gyp/lib/util/versioning.js +3396883: node_modules/node-pre-gyp/node_modules/semver/semver.js +3449351: src/flux/models/model.js +3449351: src/flux/models/model.js +3454751: src/flux/attributes.js +3454751: src/flux/attributes.js +3458403: src/flux/attributes/matcher.js +3458403: src/flux/attributes/matcher.js +3429402: node_modules/node-pre-gyp/lib/util/abi_crosswalk.json +3446169: node_modules/node-pre-gyp/package.json +3305440: node_modules/sqlite3/package.json +3470821: src/flux/attributes/sort-order.js +3470821: src/flux/attributes/sort-order.js +3471723: src/flux/attributes/attribute.js +3471723: src/flux/attributes/attribute.js +3474483: src/flux/attributes/attribute-number.js +3474483: src/flux/attributes/attribute-number.js +3477709: src/flux/attributes/attribute-string.js +3477709: src/flux/attributes/attribute-string.js +3479579: src/flux/attributes/attribute-object.js +3479579: src/flux/attributes/attribute-object.js +3481139: src/flux/attributes/attribute-boolean.js +3481139: src/flux/attributes/attribute-boolean.js +3482541: src/flux/attributes/attribute-datetime.js +3482541: src/flux/attributes/attribute-datetime.js +3485716: src/flux/attributes/attribute-collection.js +3485716: src/flux/attributes/attribute-collection.js +3490067: src/flux/attributes/attribute-joined-data.js +3490067: src/flux/attributes/attribute-joined-data.js +3492659: src/flux/attributes/attribute-serverid.js +3492659: src/flux/attributes/attribute-serverid.js +3494243: src/flux/actions.js +3449351: src/flux/models/model.js +3494243: src/flux/actions.js +3509768: node_modules/reflux/package.json +3454751: src/flux/attributes.js +3509768: node_modules/reflux/package.json +3511690: node_modules/reflux/src/index.js +3458403: src/flux/attributes/matcher.js +3511690: node_modules/reflux/src/index.js +3513193: node_modules/reflux/src/ListenerMethods.js +3513193: node_modules/reflux/src/ListenerMethods.js +3519984: node_modules/reflux/src/utils.js +3519984: node_modules/reflux/src/utils.js +3521383: node_modules/reflux/node_modules/eventemitter3/index.js +3521383: node_modules/reflux/node_modules/eventemitter3/index.js +3470821: src/flux/attributes/sort-order.js +3527461: node_modules/reflux/src/joins.js +3471723: src/flux/attributes/attribute.js +3527461: node_modules/reflux/src/joins.js +3530350: node_modules/reflux/src/createStore.js +3530350: node_modules/reflux/src/createStore.js +3474483: src/flux/attributes/attribute-number.js +3531848: node_modules/reflux/src/Keep.js +3477709: src/flux/attributes/attribute-string.js +3531848: node_modules/reflux/src/Keep.js +3479579: src/flux/attributes/attribute-object.js +3532111: node_modules/reflux/src/PublisherMethods.js +3532111: node_modules/reflux/src/PublisherMethods.js +3481139: src/flux/attributes/attribute-boolean.js +3534287: node_modules/reflux/src/createAction.js +3534287: node_modules/reflux/src/createAction.js +3482541: src/flux/attributes/attribute-datetime.js +3535424: node_modules/reflux/src/connect.js +3535424: node_modules/reflux/src/connect.js +3485716: src/flux/attributes/attribute-collection.js +3536186: node_modules/reflux/src/ListenerMixin.js +3536186: node_modules/reflux/src/ListenerMixin.js +3490067: src/flux/attributes/attribute-joined-data.js +3536620: node_modules/reflux/src/listenTo.js +3536620: node_modules/reflux/src/listenTo.js +3538124: node_modules/reflux/src/listenToMany.js +3492659: src/flux/attributes/attribute-serverid.js +3538124: node_modules/reflux/src/listenToMany.js +3494243: src/flux/actions.js +3509768: node_modules/reflux/package.json +3511690: node_modules/reflux/src/index.js +3513193: node_modules/reflux/src/ListenerMethods.js +3519984: node_modules/reflux/src/utils.js +3521383: node_modules/reflux/node_modules/eventemitter3/index.js +3527461: node_modules/reflux/src/joins.js +3530350: node_modules/reflux/src/createStore.js +3531848: node_modules/reflux/src/Keep.js +3532111: node_modules/reflux/src/PublisherMethods.js +3534287: node_modules/reflux/src/createAction.js +3535424: node_modules/reflux/src/connect.js +3539478: src/flux/models/query.js +3539478: src/flux/models/query.js +3536186: node_modules/reflux/src/ListenerMixin.js +3536620: node_modules/reflux/src/listenTo.js +3538124: node_modules/reflux/src/listenToMany.js +3553781: src/flux/models/query-range.js +3553781: src/flux/models/query-range.js +3556781: src/global/nylas-store.js +3556781: src/global/nylas-store.js +3557281: src/flux/modules/reflux-coffee.js +3557281: src/flux/modules/reflux-coffee.js +3564303: node_modules/underscore.string/package.json +3564303: node_modules/underscore.string/package.json +3126085: node_modules/underscore.string/index.js +3126085: node_modules/underscore.string/index.js +3130619: node_modules/underscore.string/isBlank.js +3130619: node_modules/underscore.string/isBlank.js +3130755: node_modules/underscore.string/helper/makeString.js +3130755: node_modules/underscore.string/helper/makeString.js +3130916: node_modules/underscore.string/stripTags.js +3130916: node_modules/underscore.string/stripTags.js +3131065: node_modules/underscore.string/capitalize.js +3131065: node_modules/underscore.string/capitalize.js +3131341: node_modules/underscore.string/decapitalize.js +3131341: node_modules/underscore.string/decapitalize.js +3131518: node_modules/underscore.string/chop.js +3131518: node_modules/underscore.string/chop.js +3131710: node_modules/underscore.string/trim.js +3131710: node_modules/underscore.string/trim.js +3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js +3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js +3132413: node_modules/underscore.string/helper/escapeRegExp.js +3132413: node_modules/underscore.string/helper/escapeRegExp.js +3132577: node_modules/underscore.string/clean.js +3132577: node_modules/underscore.string/clean.js +3132693: node_modules/underscore.string/cleanDiacritics.js +3132693: node_modules/underscore.string/cleanDiacritics.js +3133280: node_modules/underscore.string/count.js +3133280: node_modules/underscore.string/count.js +3133530: node_modules/underscore.string/chars.js +3133530: node_modules/underscore.string/chars.js +3539478: src/flux/models/query.js +3133658: node_modules/underscore.string/swapCase.js +3133883: node_modules/underscore.string/escapeHTML.js +3133658: node_modules/underscore.string/swapCase.js +3134273: node_modules/underscore.string/helper/escapeChars.js +3133883: node_modules/underscore.string/escapeHTML.js +3134692: node_modules/underscore.string/unescapeHTML.js +3553781: src/flux/models/query-range.js +3134273: node_modules/underscore.string/helper/escapeChars.js +3135351: node_modules/underscore.string/helper/htmlEntities.js +3134692: node_modules/underscore.string/unescapeHTML.js +3135655: node_modules/underscore.string/splice.js +3135351: node_modules/underscore.string/helper/htmlEntities.js +3556781: src/global/nylas-store.js +3135836: node_modules/underscore.string/insert.js +3135655: node_modules/underscore.string/splice.js +3135961: node_modules/underscore.string/replaceAll.js +3135836: node_modules/underscore.string/insert.js +3136217: node_modules/underscore.string/include.js +3557281: src/flux/modules/reflux-coffee.js +3135961: node_modules/underscore.string/replaceAll.js +3136402: node_modules/underscore.string/join.js +3136217: node_modules/underscore.string/include.js +3136622: node_modules/underscore.string/lines.js +3136402: node_modules/underscore.string/join.js +3136734: node_modules/underscore.string/dedent.js +3136622: node_modules/underscore.string/lines.js +3136734: node_modules/underscore.string/dedent.js +3564303: node_modules/underscore.string/package.json +3137344: node_modules/underscore.string/reverse.js +3126085: node_modules/underscore.string/index.js +3137461: node_modules/underscore.string/startsWith.js +3137811: node_modules/underscore.string/helper/toPositive.js +3130619: node_modules/underscore.string/isBlank.js +3137903: node_modules/underscore.string/endsWith.js +3130755: node_modules/underscore.string/helper/makeString.js +3137344: node_modules/underscore.string/reverse.js +3138345: node_modules/underscore.string/pred.js +3130916: node_modules/underscore.string/stripTags.js +3138460: node_modules/underscore.string/helper/adjacent.js +3137461: node_modules/underscore.string/startsWith.js +3131065: node_modules/underscore.string/capitalize.js +3137811: node_modules/underscore.string/helper/toPositive.js +3131341: node_modules/underscore.string/decapitalize.js +3138722: node_modules/underscore.string/succ.js +3137903: node_modules/underscore.string/endsWith.js +3131518: node_modules/underscore.string/chop.js +3138836: node_modules/underscore.string/titleize.js +3131710: node_modules/underscore.string/trim.js +3138345: node_modules/underscore.string/pred.js +3139043: node_modules/underscore.string/camelize.js +3132143: node_modules/underscore.string/helper/defaultToWhiteSpace.js +3138460: node_modules/underscore.string/helper/adjacent.js +3139364: node_modules/underscore.string/underscored.js +3132413: node_modules/underscore.string/helper/escapeRegExp.js +3139540: node_modules/underscore.string/dasherize.js +3132577: node_modules/underscore.string/clean.js +3139703: node_modules/underscore.string/classify.js +3132693: node_modules/underscore.string/cleanDiacritics.js +3139981: node_modules/underscore.string/humanize.js +3138722: node_modules/underscore.string/succ.js +3140227: node_modules/underscore.string/ltrim.js +3138836: node_modules/underscore.string/titleize.js +3140651: node_modules/underscore.string/rtrim.js +3133280: node_modules/underscore.string/count.js +3139043: node_modules/underscore.string/camelize.js +3141074: node_modules/underscore.string/truncate.js +3133530: node_modules/underscore.string/chars.js +3141347: node_modules/underscore.string/prune.js +3139364: node_modules/underscore.string/underscored.js +3133658: node_modules/underscore.string/swapCase.js +3139540: node_modules/underscore.string/dasherize.js +3142255: node_modules/underscore.string/words.js +3139703: node_modules/underscore.string/classify.js +3142463: node_modules/underscore.string/pad.js +3133883: node_modules/underscore.string/escapeHTML.js +3139981: node_modules/underscore.string/humanize.js +3143150: node_modules/underscore.string/helper/strRepeat.js +3134273: node_modules/underscore.string/helper/escapeChars.js +3143345: node_modules/underscore.string/lpad.js +3140227: node_modules/underscore.string/ltrim.js +3143466: node_modules/underscore.string/rpad.js +3134692: node_modules/underscore.string/unescapeHTML.js +3140651: node_modules/underscore.string/rtrim.js +3143596: node_modules/underscore.string/lrpad.js +3135351: node_modules/underscore.string/helper/htmlEntities.js +3141074: node_modules/underscore.string/truncate.js +3135655: node_modules/underscore.string/splice.js +3141347: node_modules/underscore.string/prune.js +3143726: node_modules/underscore.string/sprintf.js +3135836: node_modules/underscore.string/insert.js +4476299: node_modules/juice/node_modules/util-deprecate/node.js +3142255: node_modules/underscore.string/words.js +3135961: node_modules/underscore.string/replaceAll.js +3142463: node_modules/underscore.string/pad.js +89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js +3136217: node_modules/underscore.string/include.js +3143150: node_modules/underscore.string/helper/strRepeat.js +3136402: node_modules/underscore.string/join.js +3143345: node_modules/underscore.string/lpad.js +3136622: node_modules/underscore.string/lines.js +3143466: node_modules/underscore.string/rpad.js +3136734: node_modules/underscore.string/dedent.js +3143923: node_modules/underscore.string/vsprintf.js +3143596: node_modules/underscore.string/lrpad.js +3137344: node_modules/underscore.string/reverse.js +3144122: node_modules/underscore.string/toNumber.js +3143726: node_modules/underscore.string/sprintf.js +3137461: node_modules/underscore.string/startsWith.js +3144317: node_modules/underscore.string/numberFormat.js +4476299: node_modules/juice/node_modules/util-deprecate/node.js +3137811: node_modules/underscore.string/helper/toPositive.js +3144704: node_modules/underscore.string/strRight.js +3137903: node_modules/underscore.string/endsWith.js +3144959: node_modules/underscore.string/strRightBack.js +89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js +3138345: node_modules/underscore.string/pred.js +3145222: node_modules/underscore.string/strLeft.js +3138460: node_modules/underscore.string/helper/adjacent.js +3145454: node_modules/underscore.string/strLeftBack.js +3145682: node_modules/underscore.string/toSentence.js +3143923: node_modules/underscore.string/vsprintf.js +3138722: node_modules/underscore.string/succ.js +3146093: node_modules/underscore.string/toSentenceSerial.js +3144122: node_modules/underscore.string/toNumber.js +3144317: node_modules/underscore.string/numberFormat.js +3138836: node_modules/underscore.string/titleize.js +3146253: node_modules/underscore.string/slugify.js +3144704: node_modules/underscore.string/strRight.js +3139043: node_modules/underscore.string/camelize.js +3146513: node_modules/underscore.string/surround.js +3144959: node_modules/underscore.string/strRightBack.js +3139364: node_modules/underscore.string/underscored.js +3146610: node_modules/underscore.string/quote.js +3145222: node_modules/underscore.string/strLeft.js +3139540: node_modules/underscore.string/dasherize.js +3146744: node_modules/underscore.string/unquote.js +3145454: node_modules/underscore.string/strLeftBack.js +3139703: node_modules/underscore.string/classify.js +3146956: node_modules/underscore.string/repeat.js +3145682: node_modules/underscore.string/toSentence.js +3147436: node_modules/underscore.string/naturalCmp.js +3139981: node_modules/underscore.string/humanize.js +3146093: node_modules/underscore.string/toSentenceSerial.js +3148137: node_modules/underscore.string/levenshtein.js +3140227: node_modules/underscore.string/ltrim.js +3140651: node_modules/underscore.string/rtrim.js +3149427: node_modules/underscore.string/toBoolean.js +3146253: node_modules/underscore.string/slugify.js +3150095: node_modules/underscore.string/exports.js +3141074: node_modules/underscore.string/truncate.js +3150336: node_modules/underscore.string/wrap.js +3146513: node_modules/underscore.string/surround.js +3141347: node_modules/underscore.string/prune.js +3146610: node_modules/underscore.string/quote.js +3152857: node_modules/underscore.string/map.js +3142255: node_modules/underscore.string/words.js +3146744: node_modules/underscore.string/unquote.js +3142463: node_modules/underscore.string/pad.js +3146956: node_modules/underscore.string/repeat.js +3143150: node_modules/underscore.string/helper/strRepeat.js +3147436: node_modules/underscore.string/naturalCmp.js +3143345: node_modules/underscore.string/lpad.js +3148137: node_modules/underscore.string/levenshtein.js +3568295: src/flux/coffee-helpers.js +3143466: node_modules/underscore.string/rpad.js +3149427: node_modules/underscore.string/toBoolean.js +3143596: node_modules/underscore.string/lrpad.js +3150095: node_modules/underscore.string/exports.js +3143726: node_modules/underscore.string/sprintf.js +3150336: node_modules/underscore.string/wrap.js +4476299: node_modules/juice/node_modules/util-deprecate/node.js +3152857: node_modules/underscore.string/map.js +3570836: node_modules/promise-queue/package.json +89722232: node_modules/underscore.string/node_modules/sprintf-js/src/sprintf.js +3572457: node_modules/promise-queue/index.js +3568295: src/flux/coffee-helpers.js +3572560: node_modules/promise-queue/lib/index.js +3143923: node_modules/underscore.string/vsprintf.js +3144122: node_modules/underscore.string/toNumber.js +3144317: node_modules/underscore.string/numberFormat.js +3577195: src/priority-ui-coordinator.js +3144704: node_modules/underscore.string/strRight.js +3144959: node_modules/underscore.string/strRightBack.js +3570836: node_modules/promise-queue/package.json +3145222: node_modules/underscore.string/strLeft.js +3579245: src/flux/stores/database-setup-query-builder.js +3572457: node_modules/promise-queue/index.js +3145454: node_modules/underscore.string/strLeftBack.js +3145682: node_modules/underscore.string/toSentence.js +3583641: src/flux/stores/database-change-record.js +3572560: node_modules/promise-queue/lib/index.js +3146093: node_modules/underscore.string/toSentenceSerial.js +3585323: src/flux/stores/database-transaction.js +3146253: node_modules/underscore.string/slugify.js +3577195: src/priority-ui-coordinator.js +3146513: node_modules/underscore.string/surround.js +3146610: node_modules/underscore.string/quote.js +3146744: node_modules/underscore.string/unquote.js +3146956: node_modules/underscore.string/repeat.js +3579245: src/flux/stores/database-setup-query-builder.js +3147436: node_modules/underscore.string/naturalCmp.js +3148137: node_modules/underscore.string/levenshtein.js +3583641: src/flux/stores/database-change-record.js +3149427: node_modules/underscore.string/toBoolean.js +3150095: node_modules/underscore.string/exports.js +3585323: src/flux/stores/database-transaction.js +3150336: node_modules/underscore.string/wrap.js +3152857: node_modules/underscore.string/map.js +3568295: src/flux/coffee-helpers.js +3599638: src/apm-wrapper.js +3570836: node_modules/promise-queue/package.json +3572457: node_modules/promise-queue/index.js +3613961: src/buffered-process.js +3572560: node_modules/promise-queue/lib/index.js +3577195: src/priority-ui-coordinator.js +3599638: src/apm-wrapper.js +3621867: src/clipboard.js +3579245: src/flux/stores/database-setup-query-builder.js +3583641: src/flux/stores/database-change-record.js +3613961: src/buffered-process.js +3622937: src/theme-manager.js +3585323: src/flux/stores/database-transaction.js +3621867: src/clipboard.js +3642517: src/style-manager.js +3648228: src/flux/action-bridge.js +3622937: src/theme-manager.js +3654791: src/menu-manager.js +3658911: src/menu-helpers.js +3642517: src/style-manager.js +3648228: src/flux/action-bridge.js +3599638: src/apm-wrapper.js +3654791: src/menu-manager.js +3658911: src/menu-helpers.js +3613961: src/buffered-process.js +3621867: src/clipboard.js +3622937: src/theme-manager.js +3677020: menus/darwin.json +3642517: src/style-manager.js +3648228: src/flux/action-bridge.js +3654791: src/menu-manager.js +3677020: menus/darwin.json +3662409: src/nylas-spellchecker.js +3658911: src/menu-helpers.js +3662409: src/nylas-spellchecker.js +3677020: menus/darwin.json +3662409: src/nylas-spellchecker.js +3798011: src/global/nylas-exports.js +3798011: src/global/nylas-exports.js +5912469: src/deprecate-utils.js +3668481: src/config-schema.js +5912469: src/deprecate-utils.js +3798011: src/global/nylas-exports.js +5912469: src/deprecate-utils.js +3668481: src/config-schema.js +4687050: src/global/nylas-observables.js +4697858: node_modules/rx-lite/package.json +4699647: node_modules/rx-lite/rx.lite.js +4687050: src/global/nylas-observables.js +4697858: node_modules/rx-lite/package.json +4699647: node_modules/rx-lite/rx.lite.js +4699647: node_modules/rx-lite/rx.lite.js +4687050: src/global/nylas-observables.js +4699647: node_modules/rx-lite/rx.lite.js +4687050: src/global/nylas-observables.js +3925280: src/flux/models/category.js +5180618: src/flux/models/query-subscription-pool.js +5195386: src/flux/models/query-subscription.js +5231737: src/flux/models/mutable-query-result-set.js +5237299: src/flux/models/query-result-set.js +5389575: src/flux/stores/task-queue.js +3925280: src/flux/models/category.js +5180618: src/flux/models/query-subscription-pool.js +3813280: src/flux/tasks/task.js +5195386: src/flux/models/query-subscription.js +5231737: src/flux/models/mutable-query-result-set.js +4200026: src/flux/nylas-api.js +5237299: src/flux/models/query-result-set.js +5389575: src/flux/stores/task-queue.js +4222287: node_modules/request/package.json +4225420: node_modules/request/index.js +80787899: node_modules/request/node_modules/extend/index.js +4229450: node_modules/request/lib/cookies.js +4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js +3813280: src/flux/tasks/task.js +4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +4200026: src/flux/nylas-api.js +4222287: node_modules/request/package.json +4225420: node_modules/request/index.js +80787899: node_modules/request/node_modules/extend/index.js +4229450: node_modules/request/lib/cookies.js +4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js +4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js +4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js +4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js +4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js +4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json +4432858: node_modules/request/lib/helpers.js +4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js +4435389: node_modules/request/request.js +4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js +80567623: node_modules/request/node_modules/bl/bl.js +4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js +4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js +80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js +4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js +80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json +75226954: node_modules/process-nextick-args/index.js +80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +4432858: node_modules/request/lib/helpers.js +4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js +4435389: node_modules/request/request.js +57417682: node_modules/isarray/index.js +80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +81345592: node_modules/request/node_modules/hawk/lib/index.js +80567623: node_modules/request/node_modules/bl/bl.js +81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js +80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +75226954: node_modules/process-nextick-args/index.js +80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +57417682: node_modules/isarray/index.js +80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js +81345592: node_modules/request/node_modules/hawk/lib/index.js +81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +81345973: node_modules/request/node_modules/hawk/lib/server.js +81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js +81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +81342006: node_modules/request/node_modules/hawk/lib/crypto.js +81364519: node_modules/request/node_modules/hawk/lib/utils.js +81331415: node_modules/request/node_modules/hawk/lib/client.js +80480692: node_modules/request/node_modules/aws-sign2/index.js +81551606: node_modules/request/node_modules/http-signature/lib/index.js +81552232: node_modules/request/node_modules/http-signature/lib/parser.js +81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +81345973: node_modules/request/node_modules/hawk/lib/server.js +81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +81342006: node_modules/request/node_modules/hawk/lib/crypto.js +81574938: node_modules/request/node_modules/http-signature/lib/utils.js +81364519: node_modules/request/node_modules/hawk/lib/utils.js +81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js +81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js +81331415: node_modules/request/node_modules/hawk/lib/client.js +81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js +80480692: node_modules/request/node_modules/aws-sign2/index.js +81551606: node_modules/request/node_modules/http-signature/lib/index.js +81552232: node_modules/request/node_modules/http-signature/lib/parser.js +81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js +81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js +81574938: node_modules/request/node_modules/http-signature/lib/utils.js +81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js +81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js +81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js +81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js +81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js +81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js +81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js +81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js +81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js +81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js +81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js +81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js +81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js +81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js +81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js +81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js +81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js +81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js +81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js +81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js +81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js +81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js +81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js +81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js +81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js +81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js +81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js +81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js +81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js +81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js +81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js +81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js +81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js +81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js +81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js +81562004: node_modules/request/node_modules/http-signature/lib/signer.js +81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js +81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js +81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js +81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js +81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js +81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js +81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js +81577777: node_modules/request/node_modules/http-signature/lib/verify.js +82371286: node_modules/request/node_modules/mime-types/index.js +81562004: node_modules/request/node_modules/http-signature/lib/signer.js +82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js +82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js +81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js +81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js +81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +81577777: node_modules/request/node_modules/http-signature/lib/verify.js +82371286: node_modules/request/node_modules/mime-types/index.js +82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js +82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js +80754327: node_modules/request/node_modules/caseless/index.js +80801324: node_modules/request/node_modules/forever-agent/index.js +80814876: node_modules/request/node_modules/form-data/lib/form_data.js +3668481: src/config-schema.js +80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js +80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js +80754327: node_modules/request/node_modules/caseless/index.js +80801324: node_modules/request/node_modules/forever-agent/index.js +80814876: node_modules/request/node_modules/form-data/lib/form_data.js +80826033: node_modules/request/node_modules/form-data/lib/populate.js +82348558: node_modules/request/node_modules/isstream/isstream.js +82341499: node_modules/request/node_modules/is-typedarray/index.js +80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js +4479214: node_modules/request/lib/getProxyFromURI.js +4481482: node_modules/request/lib/querystring.js +80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +82587962: node_modules/request/node_modules/qs/lib/index.js +82593363: node_modules/request/node_modules/qs/lib/stringify.js +82597342: node_modules/request/node_modules/qs/lib/utils.js +80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +82588115: node_modules/request/node_modules/qs/lib/parse.js +4482815: node_modules/request/lib/har.js +81001381: node_modules/request/node_modules/har-validator/lib/index.js +81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js +81001935: node_modules/request/node_modules/har-validator/lib/runner.js +80826033: node_modules/request/node_modules/form-data/lib/populate.js +81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js +81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json +82348558: node_modules/request/node_modules/isstream/isstream.js +81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json +81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json +82341499: node_modules/request/node_modules/is-typedarray/index.js +81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json +81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json +4479214: node_modules/request/lib/getProxyFromURI.js +81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json +81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json +4481482: node_modules/request/lib/querystring.js +81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json +81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json +82587962: node_modules/request/node_modules/qs/lib/index.js +81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json +81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json +82593363: node_modules/request/node_modules/qs/lib/stringify.js +81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json +81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json +81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json +82597342: node_modules/request/node_modules/qs/lib/utils.js +81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json +81001195: node_modules/request/node_modules/har-validator/lib/error.js +81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +82588115: node_modules/request/node_modules/qs/lib/parse.js +81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js +4482815: node_modules/request/lib/har.js +81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js +81001381: node_modules/request/node_modules/har-validator/lib/index.js +81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js +81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js +81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +81001935: node_modules/request/node_modules/har-validator/lib/runner.js +4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js +81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js +81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js +81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json +81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json +4533728: node_modules/request/lib/auth.js +81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json +81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json +81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json +81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json +81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json +81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json +4550226: node_modules/request/lib/oauth.js +81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json +81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json +81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json +81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json +81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json +82544802: node_modules/request/node_modules/oauth-sign/index.js +81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json +81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json +81001195: node_modules/request/node_modules/har-validator/lib/error.js +4568756: node_modules/request/lib/multipart.js +81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +4585628: node_modules/request/lib/redirect.js +4594531: node_modules/request/lib/tunnel.js +81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js +4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js +81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js +81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js +81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +91866084: src/flux/nylas-long-connection.js +4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js +81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js +2376215: node_modules/event-kit/package.json +4533728: node_modules/request/lib/auth.js +3905749: src/flux/models/account.js +3911874: src/flux/models/model-with-metadata.js +4550226: node_modules/request/lib/oauth.js +82544802: node_modules/request/node_modules/oauth-sign/index.js +4568756: node_modules/request/lib/multipart.js +4585628: node_modules/request/lib/redirect.js +3959955: src/flux/models/message.js +4594531: node_modules/request/lib/tunnel.js +3971136: node_modules/moment/package.json +4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js +3809622: src/flux/models/file.js +91866084: src/flux/nylas-long-connection.js +3870842: src/flux/models/event.js +3875483: src/flux/models/contact.js +2376215: node_modules/event-kit/package.json +3886010: src/regexp-utils.js +3905749: src/flux/models/account.js +56664169: node_modules/emoji-data/lib/emoji_data.js +3911874: src/flux/models/model-with-metadata.js +56662240: node_modules/emoji-data/lib/emoji_char.js +56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js +3959955: src/flux/models/message.js +3971136: node_modules/moment/package.json +3809622: src/flux/models/file.js +3870842: src/flux/models/event.js +3875483: src/flux/models/contact.js +3886010: src/regexp-utils.js +56664169: node_modules/emoji-data/lib/emoji_data.js +56662240: node_modules/emoji-data/lib/emoji_char.js +56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js +3889367: src/flux/stores/account-store.js +65006241: node_modules/keytar/package.json +65004180: node_modules/keytar/lib/keytar.js +3889367: src/flux/stores/account-store.js +65006241: node_modules/keytar/package.json +65004180: node_modules/keytar/lib/keytar.js +4687050: src/global/nylas-observables.js +4697858: node_modules/rx-lite/package.json +3925080: src/flux/models/label.js +4699647: node_modules/rx-lite/rx.lite.js +3930438: src/flux/models/folder.js +3930638: src/flux/models/thread.js +4096909: src/flux/models/calendar.js +4098495: src/flux/models/json-blob.js +3925080: src/flux/models/label.js +3930438: src/flux/models/folder.js +3930638: src/flux/models/thread.js +4096909: src/flux/models/calendar.js +5951047: src/flux/stores/badge-store.js +5726955: src/flux/stores/focused-perspective-store.js +5744701: src/flux/stores/workspace-store.js +5951047: src/flux/stores/badge-store.js +5726955: src/flux/stores/focused-perspective-store.js +4648657: src/flux/stores/category-store.js +5744701: src/flux/stores/workspace-store.js +9942964: src/flux/stores/nylas-sync-status-store.js +4648657: src/flux/stores/category-store.js +9942964: src/flux/stores/nylas-sync-status-store.js +4699647: node_modules/rx-lite/rx.lite.js +4098495: src/flux/models/json-blob.js +4687050: src/global/nylas-observables.js +4100089: src/mailbox-perspective.js +3925280: src/flux/models/category.js +4120446: src/flux/tasks/task-factory.js +4139229: src/flux/tasks/change-folder-task.js +5180618: src/flux/models/query-subscription-pool.js +4156736: src/flux/tasks/change-mail-task.js +5195386: src/flux/models/query-subscription.js +4100089: src/mailbox-perspective.js +5231737: src/flux/models/mutable-query-result-set.js +4120446: src/flux/tasks/task-factory.js +4636283: src/flux/tasks/syncback-category-task.js +5237299: src/flux/models/query-result-set.js +4139229: src/flux/tasks/change-folder-task.js +5389575: src/flux/stores/task-queue.js +5273907: src/flux/tasks/change-labels-task.js +4156736: src/flux/tasks/change-mail-task.js +5304677: src/flux/tasks/change-unread-task.js +3813280: src/flux/tasks/task.js +4636283: src/flux/tasks/syncback-category-task.js +5341333: src/flux/tasks/change-starred-task.js +4200026: src/flux/nylas-api.js +5350052: src/flux/stores/outbox-store.js +5356198: src/flux/tasks/send-draft-task.js +5273907: src/flux/tasks/change-labels-task.js +5417961: src/sound-registry.js +91943581: src/flux/tasks/base-draft-task.js +4222287: node_modules/request/package.json +5304677: src/flux/tasks/change-unread-task.js +4225420: node_modules/request/index.js +5419733: src/flux/tasks/syncback-metadata-task.js +80787899: node_modules/request/node_modules/extend/index.js +4229450: node_modules/request/lib/cookies.js +5431422: src/flux/tasks/syncback-model-task.js +5341333: src/flux/tasks/change-starred-task.js +4230419: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/cookie.js +91991403: src/flux/tasks/notify-plugins-of-send-task.js +5350052: src/flux/stores/outbox-store.js +5356198: src/flux/tasks/send-draft-task.js +4267962: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +91821594: src/flux/edgehill-api.js +5417961: src/sound-registry.js +5459931: src/flux/tasks/syncback-draft-task.js +91943581: src/flux/tasks/base-draft-task.js +5471010: src/flux/stores/task-queue-status-store.js +5419733: src/flux/tasks/syncback-metadata-task.js +5431422: src/flux/tasks/syncback-model-task.js +91991403: src/flux/tasks/notify-plugins-of-send-task.js +5512912: src/flux/stores/thread-counts-store.js +91821594: src/flux/edgehill-api.js +91919008: src/flux/stores/recently-read-store.js +5459931: src/flux/tasks/syncback-draft-task.js +5501930: src/flux/models/mutable-query-subscription.js +5471010: src/flux/stores/task-queue-status-store.js +91852488: src/flux/models/unread-query-subscription.js +5512912: src/flux/stores/thread-counts-store.js +91919008: src/flux/stores/recently-read-store.js +5501930: src/flux/models/mutable-query-subscription.js +4417589: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/store.js +91852488: src/flux/models/unread-query-subscription.js +4420430: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/memstore.js +4425944: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js +4428210: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js +4430645: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tough-cookie/package.json +5680865: src/flux/stores/draft-store.js +4432858: node_modules/request/lib/helpers.js +4434482: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/json-stringify-safe/stringify.js +4435389: node_modules/request/request.js +5704584: src/flux/stores/draft-editing-session.js +5886976: src/extension-registry.js +5895610: src/extensions/composer-extension-adapter.js +80567623: node_modules/request/node_modules/bl/bl.js +5860903: src/dom-utils.js +80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js +80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +5680865: src/flux/stores/draft-store.js +75226954: node_modules/process-nextick-args/index.js +80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +5913732: src/extensions/extension-utils.js +5915158: src/extensions/message-view-extension-adapter.js +5704584: src/flux/stores/draft-editing-session.js +57417682: node_modules/isarray/index.js +5886976: src/extension-registry.js +91896596: src/flux/stores/draft-factory.js +80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +5895610: src/extensions/composer-extension-adapter.js +5714320: src/flux/stores/contact-store.js +81345592: node_modules/request/node_modules/hawk/lib/index.js +5860903: src/dom-utils.js +81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +5723311: src/flux/stores/contact-ranking-store.js +5913732: src/extensions/extension-utils.js +81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +5915158: src/extensions/message-view-extension-adapter.js +5523481: src/window-bridge.js +91896596: src/flux/stores/draft-factory.js +5714320: src/flux/stores/contact-store.js +5917902: src/flux/stores/message-store.js +5723311: src/flux/stores/contact-ranking-store.js +5733766: src/flux/stores/focused-content-store.js +5523481: src/window-bridge.js +5756110: src/services/inline-style-transformer.js +81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js +5917902: src/flux/stores/message-store.js +81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +5758660: src/services/sanitize-transformer.js +5763630: node_modules/sanitize-html/package.json +5733766: src/flux/stores/focused-content-store.js +81345973: node_modules/request/node_modules/hawk/lib/server.js +5765975: node_modules/sanitize-html/index.js +81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js +81342006: node_modules/request/node_modules/hawk/lib/crypto.js +81364519: node_modules/request/node_modules/hawk/lib/utils.js +5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js +81331415: node_modules/request/node_modules/hawk/lib/client.js +5756110: src/services/inline-style-transformer.js +5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js +80480692: node_modules/request/node_modules/aws-sign2/index.js +81551606: node_modules/request/node_modules/http-signature/lib/index.js +81552232: node_modules/request/node_modules/http-signature/lib/parser.js +5810958: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +5758660: src/services/sanitize-transformer.js +5811580: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/decode.json +5811878: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/entities.json +5763630: node_modules/sanitize-html/package.json +5765975: node_modules/sanitize-html/index.js +81574938: node_modules/request/node_modules/http-signature/lib/utils.js +5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js +81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js +81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js +5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js +81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js +5852494: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js +5854241: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/xml.json +81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js +5854294: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js +5810958: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +5858733: node_modules/juice/node_modules/cheerio/node_modules/css-select/node_modules/domutils/node_modules/domelementtype/index.js +81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js +5811580: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/decode.json +5859144: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/node.js +5811878: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/entities.json +81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js +5860059: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/element.js +81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +5860502: node_modules/sanitize-html/node_modules/regexp-quote/regexp-quote.js +81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js +5860597: src/flux/models/message-utils.js +81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js +92019120: src/flux/tasks/syncback-draft-files-task.js +81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js +92064500: src/multi-request-progress-monitor.js +81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js +5852494: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js +5555349: src/flux/tasks/destroy-draft-task.js +81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js +81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js +5854241: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/xml.json +81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js +5854294: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js +81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js +5858733: node_modules/juice/node_modules/cheerio/node_modules/css-select/node_modules/domutils/node_modules/domelementtype/index.js +6145019: src/flux/stores/modal-store.js +5859144: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/node.js +81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js +4488696: node_modules/react/package.json +81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js +5860059: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/element.js +4490634: node_modules/react/react.js +81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +4490690: node_modules/react/lib/React.js +5860502: node_modules/sanitize-html/node_modules/regexp-quote/regexp-quote.js +79997473: node_modules/react/node_modules/object-assign/index.js +81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js +5860597: src/flux/models/message-utils.js +4503558: node_modules/react/lib/ReactChildren.js +92019120: src/flux/tasks/syncback-draft-files-task.js +4509426: node_modules/react/lib/PooledClass.js +81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js +92064500: src/multi-request-progress-monitor.js +77945402: node_modules/react/node_modules/fbjs/lib/invariant.js +4515504: node_modules/react/lib/ReactElement.js +81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +5555349: src/flux/tasks/destroy-draft-task.js +81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js +4526119: node_modules/react/lib/ReactCurrentOwner.js +77997237: node_modules/react/node_modules/fbjs/lib/warning.js +77865983: node_modules/react/node_modules/fbjs/lib/emptyFunction.js +81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js +77610157: node_modules/react/lib/canDefineProperty.js +81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js +4526776: node_modules/react/lib/traverseAllChildren.js +6145019: src/flux/stores/modal-store.js +4549078: node_modules/react/lib/getIteratorFn.js +4488696: node_modules/react/package.json +81562004: node_modules/request/node_modules/http-signature/lib/signer.js +4554180: node_modules/react/lib/ReactComponent.js +4490634: node_modules/react/react.js +77543851: node_modules/react/lib/ReactNoopUpdateQueue.js +4490690: node_modules/react/lib/React.js +77541351: node_modules/react/lib/ReactInstrumentation.js +81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js +77520716: node_modules/react/lib/ReactDebugTool.js +79997473: node_modules/react/node_modules/object-assign/index.js +4503558: node_modules/react/lib/ReactChildren.js +77541813: node_modules/react/lib/ReactInvalidSetStateWarningDevTool.js +81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js +4509426: node_modules/react/lib/PooledClass.js +77868121: node_modules/react/node_modules/fbjs/lib/emptyObject.js +81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js +4658325: node_modules/react/lib/ReactClass.js +77945402: node_modules/react/node_modules/fbjs/lib/invariant.js +4515504: node_modules/react/lib/ReactElement.js +81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +4622568: node_modules/react/lib/ReactPropTypeLocations.js +4526119: node_modules/react/lib/ReactCurrentOwner.js +77955086: node_modules/react/node_modules/fbjs/lib/keyMirror.js +77997237: node_modules/react/node_modules/fbjs/lib/warning.js +81577777: node_modules/request/node_modules/http-signature/lib/verify.js +77865983: node_modules/react/node_modules/fbjs/lib/emptyFunction.js +4623120: node_modules/react/lib/ReactPropTypeLocationNames.js +77610157: node_modules/react/lib/canDefineProperty.js +77961237: node_modules/react/node_modules/fbjs/lib/keyOf.js +82371286: node_modules/request/node_modules/mime-types/index.js +4526776: node_modules/react/lib/traverseAllChildren.js +77505957: node_modules/react/lib/ReactDOMFactories.js +82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js +4611818: node_modules/react/lib/ReactElementValidator.js +4549078: node_modules/react/lib/getIteratorFn.js +82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +4554180: node_modules/react/lib/ReactComponent.js +77963437: node_modules/react/node_modules/fbjs/lib/mapObject.js +77543851: node_modules/react/lib/ReactNoopUpdateQueue.js +77541351: node_modules/react/lib/ReactInstrumentation.js +77520716: node_modules/react/lib/ReactDebugTool.js +77541813: node_modules/react/lib/ReactInvalidSetStateWarningDevTool.js +77868121: node_modules/react/node_modules/fbjs/lib/emptyObject.js +4658325: node_modules/react/lib/ReactClass.js +4622568: node_modules/react/lib/ReactPropTypeLocations.js +77955086: node_modules/react/node_modules/fbjs/lib/keyMirror.js +5328125: node_modules/react/lib/ReactPropTypes.js +4623120: node_modules/react/lib/ReactPropTypeLocationNames.js +77961237: node_modules/react/node_modules/fbjs/lib/keyOf.js +77505957: node_modules/react/lib/ReactDOMFactories.js +77568528: node_modules/react/lib/ReactVersion.js +4611818: node_modules/react/lib/ReactElementValidator.js +5544770: node_modules/react/lib/onlyChild.js +75786540: node_modules/react-dom/package.json +75786477: node_modules/react-dom/index.js +77963437: node_modules/react/node_modules/fbjs/lib/mapObject.js +4476422: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/stringstream/stringstream.js +4693093: node_modules/react/lib/ReactDOM.js +80754327: node_modules/request/node_modules/caseless/index.js +77494923: node_modules/react/lib/ReactDOMComponentTree.js +4954924: node_modules/react/lib/DOMProperty.js +80801324: node_modules/request/node_modules/forever-agent/index.js +77494452: node_modules/react/lib/ReactDOMComponentFlags.js +5154239: node_modules/react/lib/ReactDefaultInjection.js +5157979: node_modules/react/lib/BeforeInputEventPlugin.js +80814876: node_modules/request/node_modules/form-data/lib/form_data.js +4501390: node_modules/react/lib/EventConstants.js +80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js +5171831: node_modules/react/lib/EventPropagators.js +80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +5034693: node_modules/react/lib/EventPluginHub.js +5328125: node_modules/react/lib/ReactPropTypes.js +5042578: node_modules/react/lib/EventPluginRegistry.js +80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +4493310: node_modules/react/lib/EventPluginUtils.js +77568528: node_modules/react/lib/ReactVersion.js +4684789: node_modules/react/lib/ReactErrorUtils.js +5544770: node_modules/react/lib/onlyChild.js +5051772: node_modules/react/lib/accumulateInto.js +75786540: node_modules/react-dom/package.json +5053515: node_modules/react/lib/forEachAccumulated.js +75786477: node_modules/react-dom/index.js +77682133: node_modules/react/node_modules/fbjs/lib/ExecutionEnvironment.js +4693093: node_modules/react/lib/ReactDOM.js +5177151: node_modules/react/lib/FallbackCompositionState.js +77494923: node_modules/react/lib/ReactDOMComponentTree.js +80826033: node_modules/request/node_modules/form-data/lib/populate.js +5179621: node_modules/react/lib/getTextContentAccessor.js +82348558: node_modules/request/node_modules/isstream/isstream.js +4954924: node_modules/react/lib/DOMProperty.js +5185473: node_modules/react/lib/SyntheticCompositionEvent.js +82341499: node_modules/request/node_modules/is-typedarray/index.js +5186617: node_modules/react/lib/SyntheticEvent.js +77494452: node_modules/react/lib/ReactDOMComponentFlags.js +4479214: node_modules/request/lib/getProxyFromURI.js +5154239: node_modules/react/lib/ReactDefaultInjection.js +4481482: node_modules/request/lib/querystring.js +5157979: node_modules/react/lib/BeforeInputEventPlugin.js +5236171: node_modules/react/lib/SyntheticInputEvent.js +82587962: node_modules/request/node_modules/qs/lib/index.js +82593363: node_modules/request/node_modules/qs/lib/stringify.js +5241892: node_modules/react/lib/ChangeEventPlugin.js +4501390: node_modules/react/lib/EventConstants.js +82597342: node_modules/request/node_modules/qs/lib/utils.js +5171831: node_modules/react/lib/EventPropagators.js +4571389: node_modules/react/lib/ReactUpdates.js +5034693: node_modules/react/lib/EventPluginHub.js +82588115: node_modules/request/node_modules/qs/lib/parse.js +5042578: node_modules/react/lib/EventPluginRegistry.js +4580474: node_modules/react/lib/CallbackQueue.js +4482815: node_modules/request/lib/har.js +77540690: node_modules/react/lib/ReactFeatureFlags.js +4493310: node_modules/react/lib/EventPluginUtils.js +4583141: node_modules/react/lib/ReactPerf.js +81001381: node_modules/request/node_modules/har-validator/lib/index.js +4590060: node_modules/react/lib/ReactReconciler.js +81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js +4684789: node_modules/react/lib/ReactErrorUtils.js +4599068: node_modules/react/lib/ReactRef.js +81001935: node_modules/request/node_modules/har-validator/lib/runner.js +5051772: node_modules/react/lib/accumulateInto.js +4608257: node_modules/react/lib/ReactOwner.js +5053515: node_modules/react/lib/forEachAccumulated.js +81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js +4626735: node_modules/react/lib/Transaction.js +77682133: node_modules/react/node_modules/fbjs/lib/ExecutionEnvironment.js +81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json +5177151: node_modules/react/lib/FallbackCompositionState.js +81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json +5230693: node_modules/react/lib/getEventTarget.js +81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json +5179621: node_modules/react/lib/getTextContentAccessor.js +81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json +5056054: node_modules/react/lib/isEventSupported.js +81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json +5185473: node_modules/react/lib/SyntheticCompositionEvent.js +81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json +5253386: node_modules/react/lib/isTextInputElement.js +5186617: node_modules/react/lib/SyntheticEvent.js +81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json +81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json +81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json +81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json +81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json +5254419: node_modules/react/lib/DefaultEventPluginOrder.js +81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json +5236171: node_modules/react/lib/SyntheticInputEvent.js +81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json +5255683: node_modules/react/lib/EnterLeaveEventPlugin.js +81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json +81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json +5241892: node_modules/react/lib/ChangeEventPlugin.js +5259147: node_modules/react/lib/SyntheticMouseEvent.js +81001195: node_modules/request/node_modules/har-validator/lib/error.js +5261327: node_modules/react/lib/SyntheticUIEvent.js +81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +4571389: node_modules/react/lib/ReactUpdates.js +5055413: node_modules/react/lib/ViewportMetrics.js +5262952: node_modules/react/lib/getEventModifierState.js +4580474: node_modules/react/lib/CallbackQueue.js +5264226: node_modules/react/lib/HTMLDOMPropertyConfig.js +77540690: node_modules/react/lib/ReactFeatureFlags.js +81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js +4583141: node_modules/react/lib/ReactPerf.js +81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js +4965198: node_modules/react/lib/ReactComponentBrowserEnvironment.js +4590060: node_modules/react/lib/ReactReconciler.js +4981199: node_modules/react/lib/DOMChildrenOperations.js +4599068: node_modules/react/lib/ReactRef.js +81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js +4608257: node_modules/react/lib/ReactOwner.js +77469073: node_modules/react/lib/DOMLazyTree.js +4626735: node_modules/react/lib/Transaction.js +81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +77613716: node_modules/react/lib/createMicrosoftUnsafeLocalFunction.js +4525735: node_modules/babel-core/node_modules/output-file-sync/node_modules/xtend/immutable.js +4994328: node_modules/react/lib/setTextContent.js +81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js +4964346: node_modules/react/lib/escapeTextContentForBrowser.js +4995531: node_modules/react/lib/setInnerHTML.js +5230693: node_modules/react/lib/getEventTarget.js +5056054: node_modules/react/lib/isEventSupported.js +4533728: node_modules/request/lib/auth.js +4986498: node_modules/react/lib/Danger.js +5253386: node_modules/react/lib/isTextInputElement.js +4550226: node_modules/request/lib/oauth.js +77856589: node_modules/react/node_modules/fbjs/lib/createNodesFromMarkup.js +5254419: node_modules/react/lib/DefaultEventPluginOrder.js +77848650: node_modules/react/node_modules/fbjs/lib/createArrayFromMixed.js +5255683: node_modules/react/lib/EnterLeaveEventPlugin.js +82544802: node_modules/request/node_modules/oauth-sign/index.js +77922333: node_modules/react/node_modules/fbjs/lib/getMarkupWrap.js +5259147: node_modules/react/lib/SyntheticMouseEvent.js +4568756: node_modules/request/lib/multipart.js +5261327: node_modules/react/lib/SyntheticUIEvent.js +4585628: node_modules/request/lib/redirect.js +4594531: node_modules/request/lib/tunnel.js +5055413: node_modules/react/lib/ViewportMetrics.js +5262952: node_modules/react/lib/getEventModifierState.js +4993464: node_modules/react/lib/ReactMultiChildUpdateTypes.js +4601413: node_modules/less-cache/node_modules/less/node_modules/request/node_modules/tunnel-agent/index.js +5264226: node_modules/react/lib/HTMLDOMPropertyConfig.js +4966626: node_modules/react/lib/ReactDOMIDOperations.js +91866084: src/flux/nylas-long-connection.js +5100253: node_modules/react/lib/ReactDOMComponent.js +4965198: node_modules/react/lib/ReactComponentBrowserEnvironment.js +4981199: node_modules/react/lib/DOMChildrenOperations.js +77469073: node_modules/react/lib/DOMLazyTree.js +77613716: node_modules/react/lib/createMicrosoftUnsafeLocalFunction.js +2376215: node_modules/event-kit/package.json +4994328: node_modules/react/lib/setTextContent.js +4964346: node_modules/react/lib/escapeTextContentForBrowser.js +77468440: node_modules/react/lib/AutoFocusUtils.js +4995531: node_modules/react/lib/setInnerHTML.js +3905749: src/flux/models/account.js +77909940: node_modules/react/node_modules/fbjs/lib/focusNode.js +4986498: node_modules/react/lib/Danger.js +4967813: node_modules/react/lib/CSSPropertyOperations.js +3911874: src/flux/models/model-with-metadata.js +77856589: node_modules/react/node_modules/fbjs/lib/createNodesFromMarkup.js +4974604: node_modules/react/lib/CSSProperty.js +77848650: node_modules/react/node_modules/fbjs/lib/createArrayFromMixed.js +77922333: node_modules/react/node_modules/fbjs/lib/getMarkupWrap.js +77831606: node_modules/react/node_modules/fbjs/lib/camelizeStyleName.js +77830175: node_modules/react/node_modules/fbjs/lib/camelize.js +4993464: node_modules/react/lib/ReactMultiChildUpdateTypes.js +3959955: src/flux/models/message.js +4978298: node_modules/react/lib/dangerousStyleValue.js +4966626: node_modules/react/lib/ReactDOMIDOperations.js +77943412: node_modules/react/node_modules/fbjs/lib/hyphenateStyleName.js +3971136: node_modules/moment/package.json +5100253: node_modules/react/lib/ReactDOMComponent.js +77941796: node_modules/react/node_modules/fbjs/lib/hyphenate.js +77967845: node_modules/react/node_modules/fbjs/lib/memoizeStringOnly.js +3809622: src/flux/models/file.js +77472180: node_modules/react/lib/DOMNamespaces.js +4947570: node_modules/react/lib/DOMPropertyOperations.js +3870842: src/flux/models/event.js +77468440: node_modules/react/lib/AutoFocusUtils.js +77509750: node_modules/react/lib/ReactDOMInstrumentation.js +3875483: src/flux/models/contact.js +77502083: node_modules/react/lib/ReactDOMDebugTool.js +77514692: node_modules/react/lib/ReactDOMUnknownPropertyDevtool.js +77909940: node_modules/react/node_modules/fbjs/lib/focusNode.js +4967813: node_modules/react/lib/CSSPropertyOperations.js +3886010: src/regexp-utils.js +4963597: node_modules/react/lib/quoteAttributeValueForBrowser.js +5022146: node_modules/react/lib/ReactBrowserEventEmitter.js +4974604: node_modules/react/lib/CSSProperty.js +56664169: node_modules/emoji-data/lib/emoji_data.js +56662240: node_modules/emoji-data/lib/emoji_char.js +5054412: node_modules/react/lib/ReactEventEmitterMixin.js +77617819: node_modules/react/lib/getVendorPrefixedEventName.js +56691400: node_modules/emoji-data/node_modules/underscore.string/lib/underscore.string.js +77831606: node_modules/react/node_modules/fbjs/lib/camelizeStyleName.js +77830175: node_modules/react/node_modules/fbjs/lib/camelize.js +5303529: node_modules/react/lib/ReactDOMButton.js +4978298: node_modules/react/lib/dangerousStyleValue.js +5313340: node_modules/react/lib/ReactDOMInput.js +77943412: node_modules/react/node_modules/fbjs/lib/hyphenateStyleName.js +5322982: node_modules/react/lib/LinkedValueUtils.js +77941796: node_modules/react/node_modules/fbjs/lib/hyphenate.js +77967845: node_modules/react/node_modules/fbjs/lib/memoizeStringOnly.js +5379029: node_modules/react/lib/ReactDOMOption.js +77472180: node_modules/react/lib/DOMNamespaces.js +5382256: node_modules/react/lib/ReactDOMSelect.js +4947570: node_modules/react/lib/DOMPropertyOperations.js +5405374: node_modules/react/lib/ReactDOMTextarea.js +77509750: node_modules/react/lib/ReactDOMInstrumentation.js +77502083: node_modules/react/lib/ReactDOMDebugTool.js +5134927: node_modules/react/lib/ReactMultiChild.js +77514692: node_modules/react/lib/ReactDOMUnknownPropertyDevtool.js +4963597: node_modules/react/lib/quoteAttributeValueForBrowser.js +5097145: node_modules/react/lib/ReactComponentEnvironment.js +5147906: node_modules/react/lib/ReactChildReconciler.js +5022146: node_modules/react/lib/ReactBrowserEventEmitter.js +5061495: node_modules/react/lib/instantiateReactComponent.js +5054412: node_modules/react/lib/ReactEventEmitterMixin.js +5065922: node_modules/react/lib/ReactCompositeComponent.js +77617819: node_modules/react/lib/getVendorPrefixedEventName.js +5303529: node_modules/react/lib/ReactDOMButton.js +4567499: node_modules/react/lib/ReactInstanceMap.js +5313340: node_modules/react/lib/ReactDOMInput.js +77542853: node_modules/react/lib/ReactNodeTypes.js +4559113: node_modules/react/lib/ReactUpdateQueue.js +5322982: node_modules/react/lib/LinkedValueUtils.js +5098804: node_modules/react/lib/shouldUpdateReactComponent.js +5379029: node_modules/react/lib/ReactDOMOption.js +5058027: node_modules/react/lib/ReactEmptyComponent.js +5382256: node_modules/react/lib/ReactDOMSelect.js +4623734: node_modules/react/lib/ReactNativeComponent.js +5152586: node_modules/react/lib/flattenChildren.js +5405374: node_modules/react/lib/ReactDOMTextarea.js +5134927: node_modules/react/lib/ReactMultiChild.js +77987568: node_modules/react/node_modules/fbjs/lib/shallowEqual.js +77629907: node_modules/react/lib/validateDOMNesting.js +5097145: node_modules/react/lib/ReactComponentEnvironment.js +5147906: node_modules/react/lib/ReactChildReconciler.js +5061495: node_modules/react/lib/instantiateReactComponent.js +77503986: node_modules/react/lib/ReactDOMEmptyComponent.js +5065922: node_modules/react/lib/ReactCompositeComponent.js +77510993: node_modules/react/lib/ReactDOMTreeTraversal.js +4941549: node_modules/react/lib/ReactDOMTextComponent.js +5271987: node_modules/react/lib/ReactDefaultBatchingStrategy.js +4567499: node_modules/react/lib/ReactInstanceMap.js +77542853: node_modules/react/lib/ReactNodeTypes.js +5411190: node_modules/react/lib/ReactEventListener.js +4559113: node_modules/react/lib/ReactUpdateQueue.js +77676891: node_modules/react/node_modules/fbjs/lib/EventListener.js +5098804: node_modules/react/lib/shouldUpdateReactComponent.js +5058027: node_modules/react/lib/ReactEmptyComponent.js +77934933: node_modules/react/node_modules/fbjs/lib/getUnboundedScrollPosition.js +4623734: node_modules/react/lib/ReactNativeComponent.js +5416577: node_modules/react/lib/ReactInjection.js +5152586: node_modules/react/lib/flattenChildren.js +5426571: node_modules/react/lib/ReactReconcileTransaction.js +5447146: node_modules/react/lib/ReactInputSelection.js +77987568: node_modules/react/node_modules/fbjs/lib/shallowEqual.js +5451456: node_modules/react/lib/ReactDOMSelection.js +77629907: node_modules/react/lib/validateDOMNesting.js +5458269: node_modules/react/lib/getNodeForCharacterOffset.js +77503986: node_modules/react/lib/ReactDOMEmptyComponent.js +77836612: node_modules/react/node_modules/fbjs/lib/containsNode.js +77951977: node_modules/react/node_modules/fbjs/lib/isTextNode.js +77510993: node_modules/react/lib/ReactDOMTreeTraversal.js +77950580: node_modules/react/node_modules/fbjs/lib/isNode.js +4941549: node_modules/react/lib/ReactDOMTextComponent.js +77913930: node_modules/react/node_modules/fbjs/lib/getActiveElement.js +5530086: node_modules/react/lib/SVGDOMPropertyConfig.js +5271987: node_modules/react/lib/ReactDefaultBatchingStrategy.js +3889367: src/flux/stores/account-store.js +5411190: node_modules/react/lib/ReactEventListener.js +77676891: node_modules/react/node_modules/fbjs/lib/EventListener.js +77934933: node_modules/react/node_modules/fbjs/lib/getUnboundedScrollPosition.js +5416577: node_modules/react/lib/ReactInjection.js +65006241: node_modules/keytar/package.json +5426571: node_modules/react/lib/ReactReconcileTransaction.js +65004180: node_modules/keytar/lib/keytar.js +5447146: node_modules/react/lib/ReactInputSelection.js +5451456: node_modules/react/lib/ReactDOMSelection.js +5458269: node_modules/react/lib/getNodeForCharacterOffset.js +5474425: node_modules/react/lib/SelectEventPlugin.js +77836612: node_modules/react/node_modules/fbjs/lib/containsNode.js +77951977: node_modules/react/node_modules/fbjs/lib/isTextNode.js +77950580: node_modules/react/node_modules/fbjs/lib/isNode.js +5480910: node_modules/react/lib/SimpleEventPlugin.js +77913930: node_modules/react/node_modules/fbjs/lib/getActiveElement.js +5530086: node_modules/react/lib/SVGDOMPropertyConfig.js +77602647: node_modules/react/lib/SyntheticAnimationEvent.js +5499613: node_modules/react/lib/SyntheticClipboardEvent.js +5500825: node_modules/react/lib/SyntheticFocusEvent.js +5508624: node_modules/react/lib/SyntheticKeyboardEvent.js +5511371: node_modules/react/lib/getEventCharCode.js +5519469: node_modules/react/lib/getEventKey.js +5522372: node_modules/react/lib/SyntheticDragEvent.js +5526795: node_modules/react/lib/SyntheticTouchEvent.js +77603899: node_modules/react/lib/SyntheticTransitionEvent.js +5528111: node_modules/react/lib/SyntheticWheelEvent.js +5474425: node_modules/react/lib/SelectEventPlugin.js +5480910: node_modules/react/lib/SimpleEventPlugin.js +4998763: node_modules/react/lib/ReactMount.js +77602647: node_modules/react/lib/SyntheticAnimationEvent.js +5499613: node_modules/react/lib/SyntheticClipboardEvent.js +5500825: node_modules/react/lib/SyntheticFocusEvent.js +77501092: node_modules/react/lib/ReactDOMContainerInfo.js +77509290: node_modules/react/lib/ReactDOMFeatureFlags.js +5508624: node_modules/react/lib/SyntheticKeyboardEvent.js +5058770: node_modules/react/lib/ReactMarkupChecksum.js +5511371: node_modules/react/lib/getEventCharCode.js +5519469: node_modules/react/lib/getEventKey.js +5060281: node_modules/react/lib/adler32.js +5269677: node_modules/react/lib/findDOMNode.js +5522372: node_modules/react/lib/SyntheticDragEvent.js +5526795: node_modules/react/lib/SyntheticTouchEvent.js +77616438: node_modules/react/lib/getNativeComponentFromComposite.js +77627726: node_modules/react/lib/renderSubtreeIntoContainer.js +77603899: node_modules/react/lib/SyntheticTransitionEvent.js +5528111: node_modules/react/lib/SyntheticWheelEvent.js +4998763: node_modules/react/lib/ReactMount.js +77501092: node_modules/react/lib/ReactDOMContainerInfo.js +77509290: node_modules/react/lib/ReactDOMFeatureFlags.js +5058770: node_modules/react/lib/ReactMarkupChecksum.js +5060281: node_modules/react/lib/adler32.js +5269677: node_modules/react/lib/findDOMNode.js +77616438: node_modules/react/lib/getNativeComponentFromComposite.js +77627726: node_modules/react/lib/renderSubtreeIntoContainer.js +5634095: src/global/nylas-component-kit.js +3925080: src/flux/models/label.js +5634095: src/global/nylas-component-kit.js +3930438: src/flux/models/folder.js +3930638: src/flux/models/thread.js +6135910: src/flux/stores/popover-store.js +91364936: src/components/fixed-popover.js +4096909: src/flux/models/calendar.js +5951047: src/flux/stores/badge-store.js +5726955: src/flux/stores/focused-perspective-store.js +5744701: src/flux/stores/workspace-store.js +5932960: src/flux/stores/metadata-store.js +4648657: src/flux/stores/category-store.js +6135910: src/flux/stores/popover-store.js +9942964: src/flux/stores/nylas-sync-status-store.js +91364936: src/components/fixed-popover.js +5541756: src/flux/stores/undo-redo-store.js +5614032: src/flux/stores/mail-rules-store.js +4098495: src/flux/models/json-blob.js +5592720: src/flux/tasks/reprocess-mail-rules-task.js +5605792: src/mail-rules-processor.js +5621142: src/mail-rules-templates.js +5629111: src/components/scenario-editor-models.js +5932960: src/flux/stores/metadata-store.js +5541756: src/flux/stores/undo-redo-store.js +5941725: src/flux/stores/file-upload-store.js +5614032: src/flux/stores/mail-rules-store.js +5592720: src/flux/tasks/reprocess-mail-rules-task.js +1894875: node_modules/mkdirp/package.json +1896279: node_modules/mkdirp/index.js +5605792: src/mail-rules-processor.js +5621142: src/mail-rules-templates.js +5629111: src/components/scenario-editor-models.js +5941725: src/flux/stores/file-upload-store.js +4100089: src/mailbox-perspective.js +1894875: node_modules/mkdirp/package.json +1896279: node_modules/mkdirp/index.js +4120446: src/flux/tasks/task-factory.js +4139229: src/flux/tasks/change-folder-task.js +4156736: src/flux/tasks/change-mail-task.js +4636283: src/flux/tasks/syncback-category-task.js +5273907: src/flux/tasks/change-labels-task.js +5304677: src/flux/tasks/change-unread-task.js +5341333: src/flux/tasks/change-starred-task.js +5350052: src/flux/stores/outbox-store.js +5960988: src/flux/stores/file-download-store.js +5356198: src/flux/tasks/send-draft-task.js +5417961: src/sound-registry.js +5975123: node_modules/request-progress/package.json +91943581: src/flux/tasks/base-draft-task.js +5976554: node_modules/request-progress/index.js +5978608: node_modules/request-progress/node_modules/throttleit/index.js +5419733: src/flux/tasks/syncback-metadata-task.js +5431422: src/flux/tasks/syncback-model-task.js +91991403: src/flux/tasks/notify-plugins-of-send-task.js +91821594: src/flux/edgehill-api.js +5960988: src/flux/stores/file-download-store.js +5459931: src/flux/tasks/syncback-draft-task.js +5975123: node_modules/request-progress/package.json +5976554: node_modules/request-progress/index.js +5471010: src/flux/stores/task-queue-status-store.js +5978608: node_modules/request-progress/node_modules/throttleit/index.js +5986780: src/flux/stores/preferences-ui-store.js +5512912: src/flux/stores/thread-counts-store.js +5990595: node_modules/immutable/package.json +5992964: node_modules/immutable/dist/immutable.js +91919008: src/flux/stores/recently-read-store.js +5501930: src/flux/models/mutable-query-subscription.js +91852488: src/flux/models/unread-query-subscription.js +5986780: src/flux/stores/preferences-ui-store.js +5990595: node_modules/immutable/package.json +5992964: node_modules/immutable/dist/immutable.js +5680865: src/flux/stores/draft-store.js +5704584: src/flux/stores/draft-editing-session.js +5886976: src/extension-registry.js +5895610: src/extensions/composer-extension-adapter.js +5860903: src/dom-utils.js +5913732: src/extensions/extension-utils.js +5915158: src/extensions/message-view-extension-adapter.js +91896596: src/flux/stores/draft-factory.js +5714320: src/flux/stores/contact-store.js +5723311: src/flux/stores/contact-ranking-store.js +6183183: src/flux/stores/message-body-processor.js +5523481: src/window-bridge.js +5979358: src/flux/stores/focused-contacts-store.js +5917902: src/flux/stores/message-store.js +6153847: src/flux/stores/searchable-component-store.js +5733766: src/flux/stores/focused-content-store.js +94875052: src/searchable-components/search-constants.js +3672501: keymaps/base.json +6183183: src/flux/stores/message-body-processor.js +5756110: src/services/inline-style-transformer.js +5979358: src/flux/stores/focused-contacts-store.js +5758660: src/services/sanitize-transformer.js +5763630: node_modules/sanitize-html/package.json +6153847: src/flux/stores/searchable-component-store.js +5765975: node_modules/sanitize-html/index.js +94875052: src/searchable-components/search-constants.js +5775765: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/index.js +5777529: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Parser.js +3672501: keymaps/base.json +5785458: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/lib/Tokenizer.js +3674831: keymaps/base-darwin.json +5810958: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/lib/decode_codepoint.js +5811580: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/decode.json +3675274: keymaps/templates/Gmail.json +5811878: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/entities.json +5852494: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/legacy.json +5854241: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/entities/maps/xml.json +3675274: keymaps/templates/Gmail.json +3674831: keymaps/base-darwin.json +5854294: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js +3682264: src/less-compile-cache.js +5858733: node_modules/juice/node_modules/cheerio/node_modules/css-select/node_modules/domutils/node_modules/domelementtype/index.js +3675274: keymaps/templates/Gmail.json +3684143: node_modules/less-cache/lib/less-cache.js +5859144: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/node.js +5860059: node_modules/juice/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/lib/element.js +3693157: node_modules/less-cache/node_modules/less/lib/less/fs.js +5860502: node_modules/sanitize-html/node_modules/regexp-quote/regexp-quote.js +3693264: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/graceful-fs.js +5860597: src/flux/models/message-utils.js +3696362: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/fs.js +92019120: src/flux/tasks/syncback-draft-files-task.js +92064500: src/multi-request-progress-monitor.js +5555349: src/flux/tasks/destroy-draft-task.js +3675274: keymaps/templates/Gmail.json +3682264: src/less-compile-cache.js +3684143: node_modules/less-cache/lib/less-cache.js +6145019: src/flux/stores/modal-store.js +3696740: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/polyfills.js +3693157: node_modules/less-cache/node_modules/less/lib/less/fs.js +4488696: node_modules/react/package.json +3693264: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/graceful-fs.js +4490634: node_modules/react/react.js +4490690: node_modules/react/lib/React.js +3696362: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/fs.js +79997473: node_modules/react/node_modules/object-assign/index.js +3703233: node_modules/jasmine-tagged/node_modules/jasmine-focused/node_modules/walkdir/walkdir.js +4503558: node_modules/react/lib/ReactChildren.js +4509426: node_modules/react/lib/PooledClass.js +77945402: node_modules/react/node_modules/fbjs/lib/invariant.js +4515504: node_modules/react/lib/ReactElement.js +4526119: node_modules/react/lib/ReactCurrentOwner.js +77997237: node_modules/react/node_modules/fbjs/lib/warning.js +77865983: node_modules/react/node_modules/fbjs/lib/emptyFunction.js +3696740: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/polyfills.js +77610157: node_modules/react/lib/canDefineProperty.js +4526776: node_modules/react/lib/traverseAllChildren.js +4549078: node_modules/react/lib/getIteratorFn.js +3703233: node_modules/jasmine-tagged/node_modules/jasmine-focused/node_modules/walkdir/walkdir.js +4554180: node_modules/react/lib/ReactComponent.js +77543851: node_modules/react/lib/ReactNoopUpdateQueue.js +77541351: node_modules/react/lib/ReactInstrumentation.js +77520716: node_modules/react/lib/ReactDebugTool.js +77541813: node_modules/react/lib/ReactInvalidSetStateWarningDevTool.js +77868121: node_modules/react/node_modules/fbjs/lib/emptyObject.js +4658325: node_modules/react/lib/ReactClass.js +4622568: node_modules/react/lib/ReactPropTypeLocations.js +77955086: node_modules/react/node_modules/fbjs/lib/keyMirror.js +4623120: node_modules/react/lib/ReactPropTypeLocationNames.js +77961237: node_modules/react/node_modules/fbjs/lib/keyOf.js +77505957: node_modules/react/lib/ReactDOMFactories.js +4611818: node_modules/react/lib/ReactElementValidator.js +77963437: node_modules/react/node_modules/fbjs/lib/mapObject.js +5328125: node_modules/react/lib/ReactPropTypes.js +77568528: node_modules/react/lib/ReactVersion.js +5544770: node_modules/react/lib/onlyChild.js +75786540: node_modules/react-dom/package.json +75786477: node_modules/react-dom/index.js +4693093: node_modules/react/lib/ReactDOM.js +77494923: node_modules/react/lib/ReactDOMComponentTree.js +4954924: node_modules/react/lib/DOMProperty.js +77494452: node_modules/react/lib/ReactDOMComponentFlags.js +5154239: node_modules/react/lib/ReactDefaultInjection.js +5157979: node_modules/react/lib/BeforeInputEventPlugin.js +4501390: node_modules/react/lib/EventConstants.js +5171831: node_modules/react/lib/EventPropagators.js +5034693: node_modules/react/lib/EventPluginHub.js +5042578: node_modules/react/lib/EventPluginRegistry.js +4493310: node_modules/react/lib/EventPluginUtils.js +4684789: node_modules/react/lib/ReactErrorUtils.js +5051772: node_modules/react/lib/accumulateInto.js +5053515: node_modules/react/lib/forEachAccumulated.js +77682133: node_modules/react/node_modules/fbjs/lib/ExecutionEnvironment.js +5177151: node_modules/react/lib/FallbackCompositionState.js +5179621: node_modules/react/lib/getTextContentAccessor.js +5185473: node_modules/react/lib/SyntheticCompositionEvent.js +5186617: node_modules/react/lib/SyntheticEvent.js +5236171: node_modules/react/lib/SyntheticInputEvent.js +5241892: node_modules/react/lib/ChangeEventPlugin.js +4571389: node_modules/react/lib/ReactUpdates.js +4580474: node_modules/react/lib/CallbackQueue.js +77540690: node_modules/react/lib/ReactFeatureFlags.js +4583141: node_modules/react/lib/ReactPerf.js +4590060: node_modules/react/lib/ReactReconciler.js +4599068: node_modules/react/lib/ReactRef.js +4608257: node_modules/react/lib/ReactOwner.js +4626735: node_modules/react/lib/Transaction.js +5230693: node_modules/react/lib/getEventTarget.js +5056054: node_modules/react/lib/isEventSupported.js +5253386: node_modules/react/lib/isTextInputElement.js +5254419: node_modules/react/lib/DefaultEventPluginOrder.js +5255683: node_modules/react/lib/EnterLeaveEventPlugin.js +5259147: node_modules/react/lib/SyntheticMouseEvent.js +5261327: node_modules/react/lib/SyntheticUIEvent.js +5055413: node_modules/react/lib/ViewportMetrics.js +5262952: node_modules/react/lib/getEventModifierState.js +5264226: node_modules/react/lib/HTMLDOMPropertyConfig.js +4965198: node_modules/react/lib/ReactComponentBrowserEnvironment.js +4981199: node_modules/react/lib/DOMChildrenOperations.js +77469073: node_modules/react/lib/DOMLazyTree.js +77613716: node_modules/react/lib/createMicrosoftUnsafeLocalFunction.js +4994328: node_modules/react/lib/setTextContent.js +4964346: node_modules/react/lib/escapeTextContentForBrowser.js +4995531: node_modules/react/lib/setInnerHTML.js +4986498: node_modules/react/lib/Danger.js +77856589: node_modules/react/node_modules/fbjs/lib/createNodesFromMarkup.js +77848650: node_modules/react/node_modules/fbjs/lib/createArrayFromMixed.js +77922333: node_modules/react/node_modules/fbjs/lib/getMarkupWrap.js +4993464: node_modules/react/lib/ReactMultiChildUpdateTypes.js +4966626: node_modules/react/lib/ReactDOMIDOperations.js +5100253: node_modules/react/lib/ReactDOMComponent.js +77468440: node_modules/react/lib/AutoFocusUtils.js +77909940: node_modules/react/node_modules/fbjs/lib/focusNode.js +4967813: node_modules/react/lib/CSSPropertyOperations.js +4974604: node_modules/react/lib/CSSProperty.js +77831606: node_modules/react/node_modules/fbjs/lib/camelizeStyleName.js +77830175: node_modules/react/node_modules/fbjs/lib/camelize.js +4978298: node_modules/react/lib/dangerousStyleValue.js +77943412: node_modules/react/node_modules/fbjs/lib/hyphenateStyleName.js +77941796: node_modules/react/node_modules/fbjs/lib/hyphenate.js +77967845: node_modules/react/node_modules/fbjs/lib/memoizeStringOnly.js +77472180: node_modules/react/lib/DOMNamespaces.js +4947570: node_modules/react/lib/DOMPropertyOperations.js +77509750: node_modules/react/lib/ReactDOMInstrumentation.js +77502083: node_modules/react/lib/ReactDOMDebugTool.js +77514692: node_modules/react/lib/ReactDOMUnknownPropertyDevtool.js +4963597: node_modules/react/lib/quoteAttributeValueForBrowser.js +5022146: node_modules/react/lib/ReactBrowserEventEmitter.js +5054412: node_modules/react/lib/ReactEventEmitterMixin.js +77617819: node_modules/react/lib/getVendorPrefixedEventName.js +5303529: node_modules/react/lib/ReactDOMButton.js +5313340: node_modules/react/lib/ReactDOMInput.js +5322982: node_modules/react/lib/LinkedValueUtils.js +5379029: node_modules/react/lib/ReactDOMOption.js +5382256: node_modules/react/lib/ReactDOMSelect.js +5405374: node_modules/react/lib/ReactDOMTextarea.js +5134927: node_modules/react/lib/ReactMultiChild.js +5097145: node_modules/react/lib/ReactComponentEnvironment.js +5147906: node_modules/react/lib/ReactChildReconciler.js +5061495: node_modules/react/lib/instantiateReactComponent.js +5065922: node_modules/react/lib/ReactCompositeComponent.js +4567499: node_modules/react/lib/ReactInstanceMap.js +77542853: node_modules/react/lib/ReactNodeTypes.js +4559113: node_modules/react/lib/ReactUpdateQueue.js +5098804: node_modules/react/lib/shouldUpdateReactComponent.js +5058027: node_modules/react/lib/ReactEmptyComponent.js +4623734: node_modules/react/lib/ReactNativeComponent.js +5152586: node_modules/react/lib/flattenChildren.js +77987568: node_modules/react/node_modules/fbjs/lib/shallowEqual.js +77629907: node_modules/react/lib/validateDOMNesting.js +77503986: node_modules/react/lib/ReactDOMEmptyComponent.js +77510993: node_modules/react/lib/ReactDOMTreeTraversal.js +4941549: node_modules/react/lib/ReactDOMTextComponent.js +5271987: node_modules/react/lib/ReactDefaultBatchingStrategy.js +5411190: node_modules/react/lib/ReactEventListener.js +77676891: node_modules/react/node_modules/fbjs/lib/EventListener.js +77934933: node_modules/react/node_modules/fbjs/lib/getUnboundedScrollPosition.js +5416577: node_modules/react/lib/ReactInjection.js +5426571: node_modules/react/lib/ReactReconcileTransaction.js +5447146: node_modules/react/lib/ReactInputSelection.js +5451456: node_modules/react/lib/ReactDOMSelection.js +5458269: node_modules/react/lib/getNodeForCharacterOffset.js +77836612: node_modules/react/node_modules/fbjs/lib/containsNode.js +77951977: node_modules/react/node_modules/fbjs/lib/isTextNode.js +77950580: node_modules/react/node_modules/fbjs/lib/isNode.js +77913930: node_modules/react/node_modules/fbjs/lib/getActiveElement.js +5530086: node_modules/react/lib/SVGDOMPropertyConfig.js +5474425: node_modules/react/lib/SelectEventPlugin.js +5480910: node_modules/react/lib/SimpleEventPlugin.js +77602647: node_modules/react/lib/SyntheticAnimationEvent.js +5499613: node_modules/react/lib/SyntheticClipboardEvent.js +5500825: node_modules/react/lib/SyntheticFocusEvent.js +5508624: node_modules/react/lib/SyntheticKeyboardEvent.js +5511371: node_modules/react/lib/getEventCharCode.js +5519469: node_modules/react/lib/getEventKey.js +5522372: node_modules/react/lib/SyntheticDragEvent.js +5526795: node_modules/react/lib/SyntheticTouchEvent.js +77603899: node_modules/react/lib/SyntheticTransitionEvent.js +5528111: node_modules/react/lib/SyntheticWheelEvent.js +4998763: node_modules/react/lib/ReactMount.js +77501092: node_modules/react/lib/ReactDOMContainerInfo.js +77509290: node_modules/react/lib/ReactDOMFeatureFlags.js +5058770: node_modules/react/lib/ReactMarkupChecksum.js +5060281: node_modules/react/lib/adler32.js +5269677: node_modules/react/lib/findDOMNode.js +77616438: node_modules/react/lib/getNativeComponentFromComposite.js +77627726: node_modules/react/lib/renderSubtreeIntoContainer.js +5634095: src/global/nylas-component-kit.js +6135910: src/flux/stores/popover-store.js +91364936: src/components/fixed-popover.js +5932960: src/flux/stores/metadata-store.js +5541756: src/flux/stores/undo-redo-store.js +5614032: src/flux/stores/mail-rules-store.js +5592720: src/flux/tasks/reprocess-mail-rules-task.js +5605792: src/mail-rules-processor.js +5621142: src/mail-rules-templates.js +5629111: src/components/scenario-editor-models.js +5941725: src/flux/stores/file-upload-store.js +1894875: node_modules/mkdirp/package.json +1896279: node_modules/mkdirp/index.js +5960988: src/flux/stores/file-download-store.js +5975123: node_modules/request-progress/package.json +5976554: node_modules/request-progress/index.js +3708754: static/index.less +5978608: node_modules/request-progress/node_modules/throttleit/index.js +3709902: static/variables/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3719008: static/normalize.less +3726688: static/type.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3731800: static/inputs.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3733216: static/buttons.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3737856: static/dropdowns.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3738091: static/workspace.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3746538: static/resizable.less +3747129: static/selection.less +3747443: static/utilities.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3708754: static/index.less +3717773: static/variables/ui-mixins.less +3748613: static/components/popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3750797: static/components/menu.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3752952: static/components/switch.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3753558: static/components/tokenizing-text-field.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3759326: static/components/extra.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3761494: static/components/list-tabular.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3765991: static/components/disclosure-triangle.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3709902: static/variables/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3717773: static/variables/ui-mixins.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3766478: static/components/button-dropdown.less +3719008: static/normalize.less +3733216: static/buttons.less +3726688: static/type.less +3770706: static/components/scroll-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3731800: static/inputs.less +3773921: static/components/spinner.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3733216: static/buttons.less +3774954: static/components/generated-form.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3776905: static/components/unsafe.less +3717773: static/variables/ui-mixins.less +3737856: static/dropdowns.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3738091: static/workspace.less +3777342: static/components/key-commands-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3777420: static/components/contenteditable.less +3746538: static/resizable.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3747129: static/selection.less +3781503: static/components/editable-list.less +3747443: static/utilities.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3784402: static/components/outline-view.less +3717773: static/variables/ui-mixins.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3748613: static/components/popover.less +3717773: static/variables/ui-mixins.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3750797: static/components/menu.less +3787888: static/components/fixed-popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3790891: static/components/modal.less +3752952: static/components/switch.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791241: static/components/date-input.less +3753558: static/components/tokenizing-text-field.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97491765: static/components/nylas-calendar.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97490322: static/components/empty-list-state.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489398: static/components/date-picker.less +3759326: static/components/extra.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97499252: static/components/time-picker.less +3717773: static/variables/ui-mixins.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3761494: static/components/list-tabular.less +97498180: static/components/table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489787: static/components/editable-table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3765991: static/components/disclosure-triangle.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3766478: static/components/button-dropdown.less +3733216: static/buttons.less +3770706: static/components/scroll-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3773921: static/components/spinner.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3774954: static/components/generated-form.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3776905: static/components/unsafe.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3777342: static/components/key-commands-region.less +3777420: static/components/contenteditable.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3781503: static/components/editable-list.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3784402: static/components/outline-view.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3787888: static/components/fixed-popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3790891: static/components/modal.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791241: static/components/date-input.less +3718416: internal_packages/ui-light/styles/ui-variables.less +5986780: src/flux/stores/preferences-ui-store.js +97491765: static/components/nylas-calendar.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97490322: static/components/empty-list-state.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489398: static/components/date-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97499252: static/components/time-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97498180: static/components/table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489787: static/components/editable-table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +5990595: node_modules/immutable/package.json +5992964: node_modules/immutable/dist/immutable.js +3791399: static/email-frame.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791399: static/email-frame.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6330626: src/sheet-container.js +75770892: node_modules/react-addons-css-transition-group/index.js +6285435: node_modules/react/lib/ReactCSSTransitionGroup.js +6288370: node_modules/react/lib/ReactTransitionGroup.js +6294511: node_modules/react/lib/ReactTransitionChildMapping.js +6300645: node_modules/react/lib/ReactCSSTransitionGroupChild.js +77653837: node_modules/react/node_modules/fbjs/lib/CSSCore.js +6305123: node_modules/react/lib/ReactTransitionEvents.js +6336675: src/sheet.js +3795009: internal_packages/send-later/package.json +6259077: src/component-registry.js +956764: package.json +5658995: src/components/retina-img.js +6345466: src/components/flexbox.js +6347603: src/components/injected-component-set.js +6355674: src/components/unsafe-component.js +6361626: src/components/injected-component-label.js +6363606: src/components/resizable-region.js +6372438: src/sheet-toolbar.js +6183183: src/flux/stores/message-body-processor.js +3795593: internal_packages/nylas-private-analytics/lib/main.js +5979358: src/flux/stores/focused-contacts-store.js +3795926: internal_packages/nylas-private-fonts/stylesheets/nylas-fonts.less +3709902: static/variables/ui-variables.less +3797131: internal_packages/nylas-private-fonts/lib/main.js +6153847: src/flux/stores/searchable-component-store.js +3797276: internal_packages/nylas-private-sounds/lib/main.js +94875052: src/searchable-components/search-constants.js +6217392: internal_packages/screenshot-mode/lib/main.js +3672501: keymaps/base.json +38810714: internal_packages/thread-search-index/lib/main.js +38818707: internal_packages/thread-search-index/lib/search-index-store.js +6218172: internal_packages/deltas/lib/main.js +6218486: internal_packages/deltas/lib/account-delta-connection-pool.js +6226311: internal_packages/deltas/lib/nylas-long-connection.js +3674831: keymaps/base-darwin.json +6234072: internal_packages/deltas/lib/account-delta-connection.js +3675274: keymaps/templates/Gmail.json +6249716: internal_packages/deltas/lib/contact-rankings-cache.js +6251800: internal_packages/deltas/lib/refreshing-json-cache.js +6254175: internal_packages/worker-ui/stylesheets/worker-ui.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6258340: internal_packages/worker-ui/lib/main.js +3675274: keymaps/templates/Gmail.json +3682264: src/less-compile-cache.js +6259077: src/component-registry.js +3684143: node_modules/less-cache/lib/less-cache.js +6267062: internal_packages/worker-ui/lib/developer-bar.js +3693157: node_modules/less-cache/node_modules/less/lib/less/fs.js +3693264: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/graceful-fs.js +3696362: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/fs.js +6311954: internal_packages/worker-ui/lib/developer-bar-store.js +6318392: internal_packages/worker-ui/lib/developer-bar-task.js +6322329: node_modules/classnames/package.json +6323631: node_modules/classnames/index.js +6324643: internal_packages/worker-ui/lib/developer-bar-curl-item.js +3696740: node_modules/less-cache/node_modules/less/node_modules/graceful-fs/polyfills.js +6327819: internal_packages/worker-ui/lib/developer-bar-long-poll-item.js +6330626: src/sheet-container.js +3703233: node_modules/jasmine-tagged/node_modules/jasmine-focused/node_modules/walkdir/walkdir.js +75770892: node_modules/react-addons-css-transition-group/index.js +6285435: node_modules/react/lib/ReactCSSTransitionGroup.js +6288370: node_modules/react/lib/ReactTransitionGroup.js +6294511: node_modules/react/lib/ReactTransitionChildMapping.js +6300645: node_modules/react/lib/ReactCSSTransitionGroupChild.js +77653837: node_modules/react/node_modules/fbjs/lib/CSSCore.js +6305123: node_modules/react/lib/ReactTransitionEvents.js +6336675: src/sheet.js +5658995: src/components/retina-img.js +6345466: src/components/flexbox.js +6347603: src/components/injected-component-set.js +6355674: src/components/unsafe-component.js +6361626: src/components/injected-component-label.js +6363606: src/components/resizable-region.js +6372438: src/sheet-toolbar.js +6388649: internal_packages/nylas-private-analytics/lib/analytics-store.js +6395255: internal_packages/nylas-private-analytics/node_modules/underscore/package.json +6397211: internal_packages/nylas-private-analytics/node_modules/underscore/underscore.js +6450130: internal_packages/nylas-private-analytics/node_modules/mixpanel/package.json +6451584: internal_packages/nylas-private-analytics/node_modules/mixpanel/lib/mixpanel-node.js +3709902: static/variables/ui-variables.less +3708754: static/index.less +3709902: static/variables/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3719008: static/normalize.less +3726688: static/type.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3731800: static/inputs.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3733216: static/buttons.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3737856: static/dropdowns.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3738091: static/workspace.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3746538: static/resizable.less +3747129: static/selection.less +3747443: static/utilities.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3748613: static/components/popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3750797: static/components/menu.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3752952: static/components/switch.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3753558: static/components/tokenizing-text-field.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3759326: static/components/extra.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3761494: static/components/list-tabular.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3765991: static/components/disclosure-triangle.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3766478: static/components/button-dropdown.less +3733216: static/buttons.less +3770706: static/components/scroll-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3773921: static/components/spinner.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3774954: static/components/generated-form.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3776905: static/components/unsafe.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3777342: static/components/key-commands-region.less +3777420: static/components/contenteditable.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3781503: static/components/editable-list.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3784402: static/components/outline-view.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3787888: static/components/fixed-popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3790891: static/components/modal.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791241: static/components/date-input.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97491765: static/components/nylas-calendar.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97490322: static/components/empty-list-state.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489398: static/components/date-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97499252: static/components/time-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97498180: static/components/table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489787: static/components/editable-table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791399: static/email-frame.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3795009: internal_packages/send-later/package.json +956764: package.json +4487636: internal_packages/account-sidebar/stylesheets/account-sidebar.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +4488033: internal_packages/account-sidebar/lib/main.js +5625206: internal_packages/account-sidebar/lib/components/account-sidebar.js +5639191: src/components/outline-view.js +5658995: src/components/retina-img.js +6475049: src/components/outline-view-item.js +6322329: node_modules/classnames/package.json +6323631: node_modules/classnames/index.js +6515079: src/components/disclosure-triangle.js +6516563: src/components/drop-zone.js +6519250: src/components/scroll-region.js +6541041: src/components/scrollbar-ticks.js +6345466: src/components/flexbox.js +6259077: src/component-registry.js +6547498: internal_packages/account-sidebar/lib/components/account-switcher.js +6550507: internal_packages/account-sidebar/lib/account-commands.js +6555086: internal_packages/account-sidebar/lib/sidebar-actions.js +6555434: internal_packages/account-sidebar/lib/sidebar-store.js +6561356: internal_packages/account-sidebar/lib/sidebar-section.js +5568947: src/flux/tasks/destroy-category-task.js +6568512: internal_packages/account-sidebar/lib/sidebar-item.js +11121379: internal_packages/activity-list/stylesheets/activity-list.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +11116731: internal_packages/activity-list/lib/main.js +11044916: internal_packages/activity-list/lib/activity-list-button.js +11103679: internal_packages/activity-list/lib/activity-list.js +11078805: internal_packages/activity-list/lib/activity-list-store.js +11043296: internal_packages/activity-list/lib/activity-list-actions.js +11119272: internal_packages/activity-list/lib/plugins.js +11059386: internal_packages/activity-list/lib/activity-list-item-container.js +11054031: internal_packages/activity-list/lib/activity-list-empty-state.js +6576439: internal_packages/attachments/stylesheets/attachments.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6581032: internal_packages/attachments/lib/main.js +6583425: internal_packages/attachments/lib/attachment-component.js +6602716: internal_packages/attachments/lib/image-attachment-component.js +6621086: internal_packages/category-picker/stylesheets/category-picker.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6622362: internal_packages/category-picker/lib/main.js +6622941: internal_packages/category-picker/lib/category-picker.js +6650228: src/components/key-commands-region.js +11125195: internal_packages/category-picker/lib/category-picker-popover.js +6662242: internal_packages/composer/stylesheets/composer.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3733216: static/buttons.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +6672270: internal_packages/composer/lib/main.js +6688298: internal_packages/composer/lib/compose-button.js +6693285: internal_packages/composer/lib/composer-view.js +6801894: internal_packages/composer/lib/file-upload.js +6810718: internal_packages/composer/lib/image-upload.js +6817376: internal_packages/composer/lib/composer-editor.js +15488775: internal_packages/composer/lib/composer-header.js +6881838: internal_packages/composer/lib/account-contact-field.js +6918854: internal_packages/composer/lib/collapsed-participants.js +15477990: internal_packages/composer/lib/composer-header-actions.js +6916905: internal_packages/composer/lib/fields.js +91309256: src/components/decorators/listens-to-flux-store.js +6854571: internal_packages/composer/lib/send-action-button.js +15467409: internal_packages/composer/lib/action-bar-plugins.js +15526379: internal_packages/composer/lib/decorators/inflate-draft-client-id.js +12062174: internal_packages/composer-emoji/stylesheets/composer-emoji.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +11895302: internal_packages/composer-emoji/lib/main.js +11884154: internal_packages/composer-emoji/lib/emoji-store.js +11220121: internal_packages/composer-emoji/lib/emoji-actions.js +11311506: internal_packages/composer-emoji/lib/emoji-data.js +3708754: static/index.less +3709902: static/variables/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3719008: static/normalize.less +3726688: static/type.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3731800: static/inputs.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3733216: static/buttons.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3737856: static/dropdowns.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3738091: static/workspace.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3746538: static/resizable.less +3747129: static/selection.less +3747443: static/utilities.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3748613: static/components/popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3750797: static/components/menu.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3752952: static/components/switch.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3753558: static/components/tokenizing-text-field.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3759326: static/components/extra.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3761494: static/components/list-tabular.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3765991: static/components/disclosure-triangle.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3766478: static/components/button-dropdown.less +3733216: static/buttons.less +3770706: static/components/scroll-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3773921: static/components/spinner.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3774954: static/components/generated-form.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3776905: static/components/unsafe.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3777342: static/components/key-commands-region.less +3777420: static/components/contenteditable.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3781503: static/components/editable-list.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3784402: static/components/outline-view.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3787888: static/components/fixed-popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3790891: static/components/modal.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791241: static/components/date-input.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97491765: static/components/nylas-calendar.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97490322: static/components/empty-list-state.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489398: static/components/date-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97499252: static/components/time-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97498180: static/components/table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489787: static/components/editable-table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791399: static/email-frame.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +11269567: internal_packages/composer-emoji/lib/emoji-composer-extension.js +11874201: internal_packages/composer-emoji/lib/emoji-picker.js +12036836: internal_packages/composer-emoji/node_modules/node-emoji/package.json +11900180: internal_packages/composer-emoji/node_modules/node-emoji/index.js +11900220: internal_packages/composer-emoji/node_modules/node-emoji/lib/emoji.js +11901752: internal_packages/composer-emoji/node_modules/node-emoji/lib/emoji.json +6209520: src/extensions/composer-extension.js +6199449: src/extensions/contenteditable-extension.js +11863789: internal_packages/composer-emoji/lib/emoji-message-extension.js +6216016: src/extensions/message-view-extension.js +11263608: internal_packages/composer-emoji/lib/emoji-button.js +11220330: internal_packages/composer-emoji/lib/emoji-button-popover.js +11197213: internal_packages/composer-emoji/lib/categorized-emoji.js +12365614: internal_packages/composer-mail-merge/stylesheets/mail-merge.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +12246852: internal_packages/composer-mail-merge/lib/main.js +12078922: internal_packages/composer-mail-merge/lib/mail-merge-button.js +12115700: internal_packages/composer-mail-merge/lib/mail-merge-draft-editing-session.js +12255616: internal_packages/composer-mail-merge/lib/table-data-reducer.js +12097808: internal_packages/composer-mail-merge/lib/mail-merge-constants.js +12365120: internal_packages/composer-mail-merge/package.json +12275198: internal_packages/composer-mail-merge/lib/workspace-data-reducer.js +12195717: internal_packages/composer-mail-merge/lib/mail-merge-utils.js +12294536: internal_packages/composer-mail-merge/node_modules/papaparse/package.json +12296719: internal_packages/composer-mail-merge/node_modules/papaparse/papaparse.js +75788185: node_modules/react-dom/server.js +77510224: node_modules/react/lib/ReactDOMServer.js +5537399: node_modules/react/lib/ReactServerRendering.js +77547198: node_modules/react/lib/ReactServerBatchingStrategy.js +5539994: node_modules/react/lib/ReactServerRenderingTransaction.js +12182972: internal_packages/composer-mail-merge/lib/mail-merge-token.js +12164340: internal_packages/composer-mail-merge/lib/mail-merge-send-button.js +12143212: internal_packages/composer-mail-merge/lib/mail-merge-participants-text-field.js +12101370: internal_packages/composer-mail-merge/lib/mail-merge-container.js +12224650: internal_packages/composer-mail-merge/lib/mail-merge-workspace.js +12175665: internal_packages/composer-mail-merge/lib/mail-merge-table.js +12133498: internal_packages/composer-mail-merge/lib/mail-merge-header-input.js +91336318: src/components/editable-table.js +91714196: src/components/selectable-table.js +91306664: src/components/decorators/compose.js +91296149: src/components/decorators/auto-focuses.js +91318034: src/components/decorators/listens-to-movement-keys.js +91751055: src/components/table.js +91429095: src/components/lazy-rendered-list.js +12089622: internal_packages/composer-mail-merge/lib/mail-merge-composer-extension.js +12774978: internal_packages/composer-scheduler/stylesheets/scheduler.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +12597570: internal_packages/composer-scheduler/lib/main.js +12401184: internal_packages/composer-scheduler/lib/calendar/proposed-time-event.js +12634143: internal_packages/composer-scheduler/lib/scheduler-actions.js +12637241: internal_packages/composer-scheduler/lib/scheduler-constants.js +12639598: internal_packages/composer-scheduler/package.json +12409433: internal_packages/composer-scheduler/lib/calendar/proposed-time-picker.js +12611238: internal_packages/composer-scheduler/lib/proposed-time-calendar-store.js +12604799: internal_packages/composer-scheduler/lib/proposal.js +67807413: node_modules/moment-round/package.json +67804644: node_modules/moment-round/dist/moment-round.js +12394346: internal_packages/composer-scheduler/lib/calendar/proposed-time-calendar-data-source.js +91490885: src/components/nylas-calendar/calendar-data-source.js +12458476: internal_packages/composer-scheduler/lib/composer/new-event-card-container.js +12472599: internal_packages/composer-scheduler/lib/composer/new-event-card.js +12509765: internal_packages/composer-scheduler/lib/composer/new-event-helper.js +12529558: internal_packages/composer-scheduler/lib/composer/proposed-time-list.js +12435429: internal_packages/composer-scheduler/lib/composer/email-b64-images.js +12557233: internal_packages/composer-scheduler/lib/composer/scheduler-composer-button.js +12577398: internal_packages/composer-scheduler/lib/composer/scheduler-composer-extension.js +12517105: internal_packages/composer-scheduler/lib/composer/new-event-preview.js +6940725: internal_packages/composer-signature/styles/composer-signature.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6942112: internal_packages/composer-signature/lib/main.js +6945805: internal_packages/composer-signature/lib/signature-composer-extension.js +6952671: internal_packages/composer-signature/lib/signature-utils.js +6956430: internal_packages/composer-signature/lib/signature-store.js +12790035: internal_packages/composer-signature/lib/signature-actions.js +6964420: internal_packages/composer-signature/lib/preferences-signatures.js +7087046: internal_packages/composer-spellcheck/lib/main.js +7088733: internal_packages/composer-spellcheck/lib/spellcheck-composer-extension.js +15649511: internal_packages/draft-list/stylesheets/draft-list.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +15640684: internal_packages/draft-list/lib/main.js +15634286: internal_packages/draft-list/lib/draft-list.js +10328875: src/components/flux-container.js +91409314: src/components/focus-container.js +91356893: src/components/empty-list-state.js +9573988: src/components/evented-iframe.js +9590240: src/searchable-components/searchable-component-maker.js +9604588: src/searchable-components/virtual-dom-parser.js +9625948: src/searchable-components/search-match.js +9630803: src/searchable-components/unified-dom-parser.js +9656602: src/searchable-components/iframe-searcher.js +9660189: src/searchable-components/real-dom-parser.js +10348470: src/components/multiselect-list.js +10242985: src/components/list-tabular.js +6613819: src/components/spinner.js +10255150: src/components/list-data-source.js +10259550: src/components/list-selection.js +10266495: src/components/list-tabular-item.js +10270866: src/components/swipe-container.js +10361741: src/components/multiselect-list-interaction-handler.js +10365624: src/components/multiselect-split-interaction-handler.js +15622621: internal_packages/draft-list/lib/draft-list-store.js +10317803: src/flux/stores/observable-list-data-source.js +15613521: internal_packages/draft-list/lib/draft-list-columns.js +6347603: src/components/injected-component-set.js +6355674: src/components/unsafe-component.js +6361626: src/components/injected-component-label.js +15626659: internal_packages/draft-list/lib/draft-list-toolbar.js +91329623: src/components/decorators/listens-to-observable.js +15616539: internal_packages/draft-list/lib/draft-list-send-status.js +15647651: internal_packages/draft-list/lib/sending-progress-bar.js +15637453: internal_packages/draft-list/lib/draft-toolbar-buttons.js +8166806: internal_packages/events/stylesheets/events.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +8168831: internal_packages/events/lib/main.js +8169447: internal_packages/events/lib/event-header.js +5545981: src/flux/tasks/event-rsvp-task.js +9406822: internal_packages/link-tracking/stylesheets/main.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9407650: internal_packages/link-tracking/lib/main.js +9411086: internal_packages/link-tracking/lib/link-tracking-button.js +9419481: internal_packages/link-tracking/lib/link-tracking-constants.js +9421038: internal_packages/link-tracking/package.json +9421801: internal_packages/link-tracking/lib/link-tracking-composer-extension.js +9433912: internal_packages/link-tracking/lib/link-tracking-message-extension.js +9443214: internal_packages/message-autoload-images/stylesheets/message-autoload-images.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9443764: internal_packages/message-autoload-images/lib/main.js +9447860: internal_packages/message-autoload-images/lib/autoload-images-extension.js +9452536: internal_packages/message-autoload-images/lib/autoload-images-store.js +9464787: internal_packages/message-autoload-images/lib/autoload-images-actions.js +9466378: internal_packages/message-autoload-images/lib/autoload-images-header.js +9475435: internal_packages/message-list/stylesheets/find-in-thread.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9476423: internal_packages/message-list/stylesheets/message-list.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9492060: internal_packages/message-list/lib/main.js +9493451: internal_packages/message-list/lib/message-list.js +9514819: internal_packages/message-list/lib/find-in-thread.js +9533550: internal_packages/message-list/lib/message-item-container.js +9538634: internal_packages/message-list/lib/message-item.js +9554145: internal_packages/message-list/lib/email-frame.js +21971387: internal_packages/message-list/lib/autolinker.js +21985271: internal_packages/message-list/lib/autoscale-images.js +9674883: internal_packages/message-list/lib/email-frame-styles-store.js +9677072: internal_packages/message-list/lib/message-participants.js +9684453: internal_packages/message-list/lib/message-item-body.js +10181263: src/canvas-utils.js +6774422: src/services/quoted-html-transformer.js +6783209: src/services/quote-string-detector.js +6789262: src/dom-walkers.js +9691982: internal_packages/message-list/lib/message-timestamp.js +9694947: internal_packages/message-list/lib/message-controls.js +6876890: src/components/button-dropdown.js +6626794: src/components/menu.js +6791782: src/components/injected-component.js +9704877: src/components/mail-label-set.js +6659234: src/components/mail-label.js +9717628: src/components/mail-important-icon.js +9723341: internal_packages/message-list/lib/message-list-hidden-messages-toggle.js +22004384: internal_packages/message-list/lib/sidebar-plugin-container.js +21992491: internal_packages/message-list/lib/sidebar-participant-picker.js +9914437: internal_packages/mode-switch/stylesheets/mode-switch.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9914642: internal_packages/mode-switch/lib/main.js +9915888: internal_packages/mode-switch/lib/mode-toggle.js +9918736: internal_packages/notification-mailto/lib/main.js +9920876: src/default-client-helper.js +9923701: internal_packages/notification-update-available/stylesheets/release-bar.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9924225: internal_packages/notification-update-available/lib/main.js +9927264: internal_packages/notifications/stylesheets/notifications.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9931964: internal_packages/notifications/lib/main.js +25522410: internal_packages/notifications/lib/sidebar/activity-sidebar.js +75770954: node_modules/react-addons-css-transition-group/package.json +75770892: node_modules/react-addons-css-transition-group/index.js +6285435: node_modules/react/lib/ReactCSSTransitionGroup.js +6288370: node_modules/react/lib/ReactTransitionGroup.js +6294511: node_modules/react/lib/ReactTransitionChildMapping.js +6300645: node_modules/react/lib/ReactCSSTransitionGroupChild.js +77653837: node_modules/react/node_modules/fbjs/lib/CSSCore.js +6305123: node_modules/react/lib/ReactTransitionEvents.js +9936813: internal_packages/notifications/lib/notifications-store.js +25534637: internal_packages/notifications/lib/sidebar/streaming-sync-activity.js +25528307: internal_packages/notifications/lib/sidebar/initial-sync-activity.js +25500590: internal_packages/notifications/lib/headers/connection-status-header.js +25486624: internal_packages/notifications/lib/headers/account-error-header.js +25515642: internal_packages/notifications/lib/headers/notifications-header.js +25518220: internal_packages/notifications/lib/headers/notifications-item.js +3795593: internal_packages/nylas-private-analytics/lib/main.js +3795926: internal_packages/nylas-private-fonts/stylesheets/nylas-fonts.less +3709902: static/variables/ui-variables.less +3797131: internal_packages/nylas-private-fonts/lib/main.js +3797276: internal_packages/nylas-private-sounds/lib/main.js +9948811: internal_packages/open-tracking/stylesheets/main.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +9949921: internal_packages/open-tracking/lib/main.js +9954068: internal_packages/open-tracking/lib/open-tracking-button.js +9962734: internal_packages/open-tracking/lib/open-tracking-constants.js +9964291: internal_packages/open-tracking/package.json +9965050: internal_packages/open-tracking/lib/open-tracking-icon.js +9974239: internal_packages/open-tracking/lib/open-tracking-message-status.js +9983231: internal_packages/open-tracking/lib/open-tracking-composer-extension.js +29621096: internal_packages/participant-profile/stylesheets/participant-profile.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +27770485: internal_packages/participant-profile/lib/main.js +27771226: internal_packages/participant-profile/lib/participant-profile-store.js +27766292: internal_packages/participant-profile/lib/clearbit-data-source.js +27772813: internal_packages/participant-profile/lib/sidebar-participant-profile.js +27794981: internal_packages/participant-profile/lib/sidebar-related-threads.js +10002861: internal_packages/plugins/stylesheets/plugins.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10005819: internal_packages/plugins/lib/main.js +10584362: internal_packages/plugins/lib/preferences-plugins.js +10591138: internal_packages/plugins/lib/tabs-store.js +10593603: internal_packages/plugins/lib/plugins-actions.js +10595942: internal_packages/plugins/lib/tabs.js +10597146: internal_packages/plugins/lib/tab-installed.js +10612734: internal_packages/plugins/lib/package-set.js +10619274: internal_packages/plugins/lib/package.js +10636183: internal_packages/plugins/lib/packages-store.js +10007988: internal_packages/preferences/stylesheets/preferences-accounts.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10010736: internal_packages/preferences/stylesheets/preferences-mail-rules.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10013552: internal_packages/preferences/stylesheets/preferences.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10018740: internal_packages/preferences/lib/main.js +10942956: internal_packages/preferences/lib/preferences-root.js +36888774: internal_packages/preferences/lib/preferences-tabs-bar.js +10678179: internal_packages/preferences/lib/tabs/preferences-general.js +10687249: internal_packages/preferences/lib/tabs/config-schema-item.js +10702281: internal_packages/preferences/lib/tabs/workspace-section.js +10744972: internal_packages/preferences/lib/tabs/sending-section.js +10752957: internal_packages/preferences/lib/tabs/preferences-accounts.js +10763596: internal_packages/preferences/lib/tabs/preferences-account-list.js +10775702: internal_packages/preferences/lib/tabs/preferences-account-details.js +36901668: internal_packages/preferences/lib/tabs/preferences-appearance.js +10803666: internal_packages/preferences/lib/tabs/preferences-keymaps.js +10835061: internal_packages/preferences/lib/tabs/preferences-mail-rules.js +10027324: internal_packages/print/lib/main.js +10028732: internal_packages/print/lib/printer.js +10034622: internal_packages/print/lib/print-window.js +36971547: internal_packages/remove-tracking-pixels/lib/main.js +6217392: internal_packages/screenshot-mode/lib/main.js +10043968: internal_packages/send-and-archive/styles/send-and-archive.less +3709902: static/variables/ui-variables.less +10043990: internal_packages/send-and-archive/lib/main.js +10044567: internal_packages/send-and-archive/lib/send-and-archive-extension.js +3795009: internal_packages/send-later/package.json +10046563: internal_packages/send-later/stylesheets/send-later.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10047505: internal_packages/send-later/lib/main.js +37038743: internal_packages/send-later/lib/send-later-button.js +10048157: internal_packages/send-later/lib/send-later-popover.js +10062336: src/date-utils.js +10080490: node_modules/chrono-node/src/chrono.js +10082187: node_modules/chrono-node/src/options.js +10084390: node_modules/chrono-node/src/parsers/parser.js +10087416: node_modules/chrono-node/src/parsers/EN/ENISOFormatParser.js +10090699: node_modules/chrono-node/src/result.js +10094393: node_modules/chrono-node/src/parsers/EN/ENDeadlineFormatParser.js +10096163: node_modules/chrono-node/src/parsers/EN/ENMonthNameLittleEndianParser.js +10099767: node_modules/chrono-node/src/utils/EN.js +10100643: node_modules/chrono-node/src/parsers/EN/ENMonthNameMiddleEndianParser.js +54657192: node_modules/chrono-node/src/parsers/EN/ENMonthNameParser.js +10104644: node_modules/chrono-node/src/parsers/EN/ENSlashDateFormatParser.js +10107976: node_modules/chrono-node/src/parsers/EN/ENSlashDateFormatStartWithYearParser.js +54659809: node_modules/chrono-node/src/parsers/EN/ENSlashMonthFormatParser.js +10109509: node_modules/chrono-node/src/parsers/EN/ENTimeAgoFormatParser.js +10112162: node_modules/chrono-node/src/parsers/EN/ENTimeExpressionParser.js +10119452: node_modules/chrono-node/src/parsers/EN/ENWeekdayParser.js +10122038: node_modules/chrono-node/src/parsers/EN/ENCasualDateParser.js +10124502: node_modules/chrono-node/src/parsers/JP/JPStandardParser.js +10127111: node_modules/chrono-node/src/utils/JP.js +10128540: node_modules/chrono-node/src/parsers/JP/JPCasualDateParser.js +54661209: node_modules/chrono-node/src/parsers/ES/ESCasualDateParser.js +54664898: node_modules/chrono-node/src/parsers/ES/ESDeadlineFormatParser.js +54673468: node_modules/chrono-node/src/parsers/ES/ESTimeAgoFormatParser.js +54675930: node_modules/chrono-node/src/parsers/ES/ESTimeExpressionParser.js +54682534: node_modules/chrono-node/src/parsers/ES/ESWeekdayParser.js +54666650: node_modules/chrono-node/src/parsers/ES/ESMonthNameLittleEndianParser.js +54686880: node_modules/chrono-node/src/utils/ES.js +54670068: node_modules/chrono-node/src/parsers/ES/ESSlashDateFormatParser.js +10130127: node_modules/chrono-node/src/refiners/refiner.js +10131338: node_modules/chrono-node/src/refiners/OverlapRemovalRefiner.js +10132351: node_modules/chrono-node/src/refiners/ExtractTimezoneOffsetRefiner.js +10133766: node_modules/chrono-node/src/refiners/ExtractTimezoneAbbrRefiner.js +10137202: node_modules/chrono-node/src/refiners/UnlikelyFormatFilter.js +10137518: node_modules/chrono-node/src/refiners/EN/ENMergeDateTimeRefiner.js +10141811: node_modules/chrono-node/src/refiners/EN/ENMergeDateRangeRefiner.js +10144348: node_modules/chrono-node/src/refiners/JP/JPMergeDateRangeRefiner.js +10061936: internal_packages/send-later/lib/send-later-actions.js +10062177: internal_packages/send-later/lib/send-later-constants.js +3795009: internal_packages/send-later/package.json +10144604: internal_packages/send-later/lib/send-later-store.js +10146708: internal_packages/send-later/lib/send-later-status.js +10154325: internal_packages/sidebar-fullcontact/stylesheets/sidebar-fullcontact.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10155637: internal_packages/sidebar-fullcontact/lib/main.js +10156198: internal_packages/sidebar-fullcontact/lib/sidebar-fullcontact.js +10158666: internal_packages/sidebar-fullcontact/lib/fullcontact-store.js +10160817: internal_packages/sidebar-fullcontact/lib/sidebar-fullcontact-details.js +10169244: internal_packages/system-tray/lib/main.js +10170796: internal_packages/system-tray/lib/system-tray-icon-store.js +37317747: internal_packages/theme-picker/styles/theme-picker.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10189521: internal_packages/theme-picker/lib/main.js +10189999: internal_packages/theme-picker/lib/theme-picker.js +10205690: internal_packages/theme-picker/lib/theme-option.js +38809494: internal_packages/thread-list/stylesheets/selected-items-stack.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10222854: internal_packages/thread-list/stylesheets/thread-list.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10235013: internal_packages/thread-list/lib/main.js +10331274: internal_packages/thread-list/lib/thread-list.js +10370299: internal_packages/thread-list/lib/thread-list-columns.js +10379446: internal_packages/thread-list/lib/thread-list-quick-actions.js +10383457: internal_packages/thread-list/lib/thread-list-participants.js +10238079: internal_packages/thread-list/lib/thread-list-store.js +10313585: internal_packages/thread-list/lib/thread-list-data-source.js +10389852: internal_packages/thread-list/lib/thread-list-icon.js +10393161: internal_packages/thread-list/lib/thread-list-scroll-tooltip.js +10395728: internal_packages/thread-list/lib/thread-list-context-menu.js +10414166: internal_packages/thread-list/lib/category-removal-target-rulesets.js +38750037: internal_packages/thread-list/lib/thread-list-toolbar.js +38717639: internal_packages/thread-list/lib/injects-toolbar-buttons.js +38726612: internal_packages/thread-list/lib/message-list-toolbar.js +38735117: internal_packages/thread-list/lib/selected-items-stack.js +38756427: internal_packages/thread-list/lib/thread-toolbar-buttons.js +38900474: internal_packages/thread-search/stylesheets/search-bar.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +38846525: internal_packages/thread-search/lib/main.js +38848780: internal_packages/thread-search/lib/search-bar.js +38890613: internal_packages/thread-search/lib/search-store.js +38848436: internal_packages/thread-search/lib/search-actions.js +38857942: internal_packages/thread-search/lib/search-mailbox-perspective.js +38869907: internal_packages/thread-search/lib/search-query-subscription.js +10422956: internal_packages/thread-snooze/stylesheets/snooze-mail-label.less +3709902: static/variables/ui-variables.less +10423117: internal_packages/thread-snooze/stylesheets/snooze-popover.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10424653: internal_packages/thread-snooze/lib/main.js +39002329: internal_packages/thread-snooze/lib/snooze-buttons.js +10425464: internal_packages/thread-snooze/lib/snooze-popover.js +10439168: internal_packages/thread-snooze/lib/snooze-actions.js +10439380: internal_packages/thread-snooze/lib/snooze-mail-label.js +10448736: internal_packages/thread-snooze/lib/snooze-constants.js +10448947: internal_packages/thread-snooze/package.json +10449468: internal_packages/thread-snooze/lib/snooze-utils.js +10453553: internal_packages/thread-snooze/lib/snooze-store.js +10456694: internal_packages/undo-redo/stylesheets/undo-redo.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +10458145: internal_packages/undo-redo/lib/main.js +10458810: internal_packages/undo-redo/lib/undo-redo-component.js +10463691: internal_packages/unread-notifications/lib/main.js +10471380: src/native-notifications.js +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +6330626: src/sheet-container.js +6336675: src/sheet.js +6363606: src/components/resizable-region.js +6372438: src/sheet-toolbar.js +94914523: src/task.js +6388649: internal_packages/nylas-private-analytics/lib/analytics-store.js +6395255: internal_packages/nylas-private-analytics/node_modules/underscore/package.json +6397211: internal_packages/nylas-private-analytics/node_modules/underscore/underscore.js +6450130: internal_packages/nylas-private-analytics/node_modules/mixpanel/package.json +6451584: internal_packages/nylas-private-analytics/node_modules/mixpanel/lib/mixpanel-node.js +3709902: static/variables/ui-variables.less +1973294: src/compile-cache.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +3708754: static/index.less +3709902: static/variables/ui-variables.less +3717773: static/variables/ui-mixins.less +3717937: static/mixins/common-ui-elements.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3718450: static/mixins/text-emphasis.less +3718566: static/mixins/background-variant.less +3718705: static/mixins/windows.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3719008: static/normalize.less +3726688: static/type.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3731800: static/inputs.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +3733216: static/buttons.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3737856: static/dropdowns.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3738091: static/workspace.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +3746538: static/resizable.less +3747129: static/selection.less +3747443: static/utilities.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3748613: static/components/popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3750797: static/components/menu.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3752952: static/components/switch.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3753558: static/components/tokenizing-text-field.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3759326: static/components/extra.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3761494: static/components/list-tabular.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3765991: static/components/disclosure-triangle.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3766478: static/components/button-dropdown.less +3733216: static/buttons.less +3770706: static/components/scroll-region.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3773921: static/components/spinner.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3774954: static/components/generated-form.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3776905: static/components/unsafe.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3777342: static/components/key-commands-region.less +3777420: static/components/contenteditable.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3781503: static/components/editable-list.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3784402: static/components/outline-view.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3717773: static/variables/ui-mixins.less +3787888: static/components/fixed-popover.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3790891: static/components/modal.less +3718416: internal_packages/ui-light/styles/ui-variables.less +3791241: static/components/date-input.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97491765: static/components/nylas-calendar.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97490322: static/components/empty-list-state.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489398: static/components/date-picker.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97499252: static/components/time-picker.less +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +3718416: internal_packages/ui-light/styles/ui-variables.less +97498180: static/components/table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +97489787: static/components/editable-table.less +3718416: internal_packages/ui-light/styles/ui-variables.less +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +3791399: static/email-frame.less +3709902: static/variables/ui-variables.less +3718416: internal_packages/ui-light/styles/ui-variables.less +1853312: node_modules/fs-plus/node_modules/async/package.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1978902: src/compile-support/babel.js +1980527: static/babelrc.json +1980671: src/compile-support/coffee-script.js +1981853: src/compile-support/typescript.js +1983139: node_modules/underscore/package.json +1985095: node_modules/underscore/underscore.js +2038014: node_modules/source-map-support/package.json +2039642: node_modules/source-map-support/source-map-support.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +94911340: src/task-bootstrap.js +2264399: node_modules/emissary/package.json +2266273: node_modules/emissary/lib/emissary.js +2266555: node_modules/emissary/lib/helpers.js +2268129: node_modules/emissary/lib/behavior.js +2272107: node_modules/emissary/node_modules/underscore-plus/package.json +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2288860: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/package.json +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2336063: node_modules/property-accessors/package.json +2337929: node_modules/property-accessors/lib/property-accessors.js +2340201: node_modules/property-accessors/node_modules/mixto/package.json +2341779: node_modules/property-accessors/node_modules/mixto/lib/mixin.js +2343179: node_modules/emissary/lib/signal.js +2352520: node_modules/emissary/lib/emitter.js +2367779: node_modules/emissary/node_modules/mixto/package.json +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +4222287: node_modules/request/package.json +4225420: node_modules/request/index.js +80790165: node_modules/request/node_modules/extend/package.json +80787899: node_modules/request/node_modules/extend/index.js +4229450: node_modules/request/lib/cookies.js +82838107: node_modules/request/node_modules/tough-cookie/package.json +82637881: node_modules/request/node_modules/tough-cookie/lib/cookie.js +82685639: node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +82835266: node_modules/request/node_modules/tough-cookie/lib/store.js +82675424: node_modules/request/node_modules/tough-cookie/lib/memstore.js +82683373: node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js +82680938: node_modules/request/node_modules/tough-cookie/lib/pathMatch.js +82838107: node_modules/request/node_modules/tough-cookie/package.json +4432858: node_modules/request/lib/helpers.js +82361121: node_modules/request/node_modules/json-stringify-safe/package.json +82362804: node_modules/request/node_modules/json-stringify-safe/stringify.js +4435389: node_modules/request/request.js +80742369: node_modules/request/node_modules/bl/package.json +80567623: node_modules/request/node_modules/bl/bl.js +80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js +80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +80720291: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json +80718759: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js +80705839: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json +80702818: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js +80712444: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json +80711730: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js +80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +80716737: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json +80716605: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js +80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +80738031: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json +80737908: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js +81531974: node_modules/request/node_modules/hawk/package.json +81345592: node_modules/request/node_modules/hawk/lib/index.js +81424556: node_modules/request/node_modules/hawk/node_modules/boom/package.json +81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +81515577: node_modules/request/node_modules/hawk/node_modules/hoek/package.json +81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +81530565: node_modules/request/node_modules/hawk/node_modules/sntp/package.json +81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js +81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +81345973: node_modules/request/node_modules/hawk/lib/server.js +81429631: node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json +81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +81342006: node_modules/request/node_modules/hawk/lib/crypto.js +81364519: node_modules/request/node_modules/hawk/lib/utils.js +81331415: node_modules/request/node_modules/hawk/lib/client.js +80485113: node_modules/request/node_modules/aws-sign2/package.json +80480692: node_modules/request/node_modules/aws-sign2/index.js +82337952: node_modules/request/node_modules/http-signature/package.json +81551606: node_modules/request/node_modules/http-signature/lib/index.js +81552232: node_modules/request/node_modules/http-signature/lib/parser.js +81591249: node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json +81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +81574938: node_modules/request/node_modules/http-signature/lib/utils.js +82335507: node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json +81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js +81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js +81955466: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/package.json +81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js +81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js +81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js +81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js +81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js +81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js +81943093: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/package.json +81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js +81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js +81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js +81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js +81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js +81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js +81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js +81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js +81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js +81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js +81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js +81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js +81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js +81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js +81562004: node_modules/request/node_modules/http-signature/lib/signer.js +81802301: node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json +81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js +81636568: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/package.json +81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js +81801412: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/package.json +81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js +81774451: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json +81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +81577777: node_modules/request/node_modules/http-signature/lib/verify.js +82533240: node_modules/request/node_modules/mime-types/package.json +82371286: node_modules/request/node_modules/mime-types/index.js +82530646: node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json +82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js +82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +82606571: node_modules/request/node_modules/stringstream/package.json +82607891: node_modules/request/node_modules/stringstream/stringstream.js +80756086: node_modules/request/node_modules/caseless/package.json +80754327: node_modules/request/node_modules/caseless/index.js +80805500: node_modules/request/node_modules/forever-agent/package.json +80801324: node_modules/request/node_modules/forever-agent/index.js +80986121: node_modules/request/node_modules/form-data/package.json +80814876: node_modules/request/node_modules/form-data/lib/form_data.js +80777465: node_modules/request/node_modules/combined-stream/package.json +80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js +80775847: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json +80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +80983078: node_modules/request/node_modules/form-data/node_modules/async/package.json +80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +80826033: node_modules/request/node_modules/form-data/lib/populate.js +82349146: node_modules/request/node_modules/isstream/package.json +82348558: node_modules/request/node_modules/isstream/isstream.js +82342515: node_modules/request/node_modules/is-typedarray/package.json +82341499: node_modules/request/node_modules/is-typedarray/index.js +4479214: node_modules/request/lib/getProxyFromURI.js +4481482: node_modules/request/lib/querystring.js +82601463: node_modules/request/node_modules/qs/package.json +82587962: node_modules/request/node_modules/qs/lib/index.js +82593363: node_modules/request/node_modules/qs/lib/stringify.js +82597342: node_modules/request/node_modules/qs/lib/utils.js +82588115: node_modules/request/node_modules/qs/lib/parse.js +4482815: node_modules/request/lib/har.js +81178912: node_modules/request/node_modules/har-validator/package.json +81001381: node_modules/request/node_modules/har-validator/lib/index.js +81176502: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/package.json +81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js +81001935: node_modules/request/node_modules/har-validator/lib/runner.js +81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js +81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json +81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json +81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json +81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json +81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json +81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json +81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json +81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json +81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json +81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json +81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json +81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json +81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json +81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json +81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json +81001195: node_modules/request/node_modules/har-validator/lib/error.js +81161590: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json +81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +81147021: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json +81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js +81145615: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json +81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js +81128902: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json +81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js +81151111: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json +81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +81158029: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json +81157276: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js +81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js +4533728: node_modules/request/lib/auth.js +1962761: node_modules/node-uuid/package.json +1964629: node_modules/node-uuid/uuid.js +4550226: node_modules/request/lib/oauth.js +82548387: node_modules/request/node_modules/oauth-sign/package.json +82544802: node_modules/request/node_modules/oauth-sign/index.js +4568756: node_modules/request/lib/multipart.js +4585628: node_modules/request/lib/redirect.js +4594531: node_modules/request/lib/tunnel.js +82856379: node_modules/request/node_modules/tunnel-agent/package.json +82849535: node_modules/request/node_modules/tunnel-agent/index.js +3599638: src/apm-wrapper.js +3613961: src/buffered-process.js +94914523: src/task.js +1973294: src/compile-cache.js +1766806: node_modules/fs-plus/package.json +1768751: node_modules/fs-plus/lib/fs-plus.js +1789356: node_modules/fs-plus/node_modules/underscore-plus/package.json +1791321: node_modules/fs-plus/node_modules/underscore-plus/lib/underscore-plus.js +1806109: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/package.json +1807823: node_modules/fs-plus/node_modules/underscore-plus/node_modules/underscore/underscore.js +1853312: node_modules/fs-plus/node_modules/async/package.json +1854649: node_modules/fs-plus/node_modules/async/lib/async.js +1884050: node_modules/fs-plus/node_modules/mkdirp/package.json +1885107: node_modules/fs-plus/node_modules/mkdirp/index.js +1887478: node_modules/fs-plus/node_modules/rimraf/package.json +1889121: node_modules/fs-plus/node_modules/rimraf/rimraf.js +1978902: src/compile-support/babel.js +1980527: static/babelrc.json +1980671: src/compile-support/coffee-script.js +1981853: src/compile-support/typescript.js +1983139: node_modules/underscore/package.json +1985095: node_modules/underscore/underscore.js +2038014: node_modules/source-map-support/package.json +2039642: node_modules/source-map-support/source-map-support.js +2054178: node_modules/source-map-support/node_modules/source-map/package.json +2057217: node_modules/source-map-support/node_modules/source-map/lib/source-map.js +2057643: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-generator.js +2070902: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/package.json +2072148: node_modules/source-map-support/node_modules/source-map/node_modules/amdefine/amdefine.js +2082064: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64-vlq.js +2086956: node_modules/source-map-support/node_modules/source-map/lib/source-map/base64.js +2088093: node_modules/source-map-support/node_modules/source-map/lib/source-map/util.js +2093422: node_modules/source-map-support/node_modules/source-map/lib/source-map/array-set.js +2096140: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-map-consumer.js +2113947: node_modules/source-map-support/node_modules/source-map/lib/source-map/binary-search.js +2117157: node_modules/source-map-support/node_modules/source-map/lib/source-map/source-node.js +94911340: src/task-bootstrap.js +2264399: node_modules/emissary/package.json +2266273: node_modules/emissary/lib/emissary.js +2266555: node_modules/emissary/lib/helpers.js +2268129: node_modules/emissary/lib/behavior.js +2272107: node_modules/emissary/node_modules/underscore-plus/package.json +2274072: node_modules/emissary/node_modules/underscore-plus/lib/underscore-plus.js +2288860: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/package.json +2290574: node_modules/emissary/node_modules/underscore-plus/node_modules/underscore/underscore.js +2336063: node_modules/property-accessors/package.json +2337929: node_modules/property-accessors/lib/property-accessors.js +2340201: node_modules/property-accessors/node_modules/mixto/package.json +2341779: node_modules/property-accessors/node_modules/mixto/lib/mixin.js +2343179: node_modules/emissary/lib/signal.js +2352520: node_modules/emissary/lib/emitter.js +2367779: node_modules/emissary/node_modules/mixto/package.json +2369463: node_modules/emissary/node_modules/mixto/lib/mixin.js +2370863: node_modules/emissary/lib/subscriber.js +2374948: node_modules/emissary/lib/subscription.js +4222287: node_modules/request/package.json +4225420: node_modules/request/index.js +80790165: node_modules/request/node_modules/extend/package.json +80787899: node_modules/request/node_modules/extend/index.js +4229450: node_modules/request/lib/cookies.js +82838107: node_modules/request/node_modules/tough-cookie/package.json +82637881: node_modules/request/node_modules/tough-cookie/lib/cookie.js +82685639: node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +82835266: node_modules/request/node_modules/tough-cookie/lib/store.js +82675424: node_modules/request/node_modules/tough-cookie/lib/memstore.js +82683373: node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js +82680938: node_modules/request/node_modules/tough-cookie/lib/pathMatch.js +82838107: node_modules/request/node_modules/tough-cookie/package.json +4432858: node_modules/request/lib/helpers.js +82361121: node_modules/request/node_modules/json-stringify-safe/package.json +82362804: node_modules/request/node_modules/json-stringify-safe/stringify.js +4435389: node_modules/request/request.js +80742369: node_modules/request/node_modules/bl/package.json +80567623: node_modules/request/node_modules/bl/bl.js +80636139: node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js +80636191: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js +80720291: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json +80718759: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js +80705839: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json +80702818: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js +80712444: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json +80711730: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js +80638643: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js +80716737: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json +80716605: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js +80670635: node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js +80738031: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json +80737908: node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js +81531974: node_modules/request/node_modules/hawk/package.json +81345592: node_modules/request/node_modules/hawk/lib/index.js +81424556: node_modules/request/node_modules/hawk/node_modules/boom/package.json +81416906: node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +81515577: node_modules/request/node_modules/hawk/node_modules/hoek/package.json +81490930: node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +81488262: node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +81530565: node_modules/request/node_modules/hawk/node_modules/sntp/package.json +81520773: node_modules/request/node_modules/hawk/node_modules/sntp/index.js +81520807: node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +81345973: node_modules/request/node_modules/hawk/lib/server.js +81429631: node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json +81428267: node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +81342006: node_modules/request/node_modules/hawk/lib/crypto.js +81364519: node_modules/request/node_modules/hawk/lib/utils.js +81331415: node_modules/request/node_modules/hawk/lib/client.js +80485113: node_modules/request/node_modules/aws-sign2/package.json +80480692: node_modules/request/node_modules/aws-sign2/index.js +82337952: node_modules/request/node_modules/http-signature/package.json +81551606: node_modules/request/node_modules/http-signature/lib/index.js +81552232: node_modules/request/node_modules/http-signature/lib/parser.js +81591249: node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json +81585919: node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +81574938: node_modules/request/node_modules/http-signature/lib/utils.js +82335507: node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json +81887698: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js +81888429: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js +81955466: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/package.json +81950012: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js +81830178: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js +81847974: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js +81845672: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js +81911179: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js +81895828: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js +81901963: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js +81943093: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/package.json +81942773: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js +81928490: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js +81928251: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js +81934548: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js +81928959: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js +81935186: node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js +81908010: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js +81843337: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js +81851404: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js +81853302: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js +81858111: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js +81865807: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js +81881346: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js +81877740: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js +81884606: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js +81835020: node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js +81562004: node_modules/request/node_modules/http-signature/lib/signer.js +81802301: node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json +81602307: node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js +81636568: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/package.json +81632804: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js +81801412: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/package.json +81797823: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js +81774451: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json +81763963: node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js +81577777: node_modules/request/node_modules/http-signature/lib/verify.js +82533240: node_modules/request/node_modules/mime-types/package.json +82371286: node_modules/request/node_modules/mime-types/index.js +82530646: node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json +82530510: node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js +82387545: node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json +82606571: node_modules/request/node_modules/stringstream/package.json +82607891: node_modules/request/node_modules/stringstream/stringstream.js +80756086: node_modules/request/node_modules/caseless/package.json +80754327: node_modules/request/node_modules/caseless/index.js +80805500: node_modules/request/node_modules/forever-agent/package.json +80801324: node_modules/request/node_modules/forever-agent/index.js +80986121: node_modules/request/node_modules/form-data/package.json +80814876: node_modules/request/node_modules/form-data/lib/form_data.js +80777465: node_modules/request/node_modules/combined-stream/package.json +80764215: node_modules/request/node_modules/combined-stream/lib/combined_stream.js +80775847: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json +80773528: node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +80983078: node_modules/request/node_modules/form-data/node_modules/async/package.json +80944514: node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +80826033: node_modules/request/node_modules/form-data/lib/populate.js +82349146: node_modules/request/node_modules/isstream/package.json +82348558: node_modules/request/node_modules/isstream/isstream.js +82342515: node_modules/request/node_modules/is-typedarray/package.json +82341499: node_modules/request/node_modules/is-typedarray/index.js +4479214: node_modules/request/lib/getProxyFromURI.js +4481482: node_modules/request/lib/querystring.js +82601463: node_modules/request/node_modules/qs/package.json +82587962: node_modules/request/node_modules/qs/lib/index.js +82593363: node_modules/request/node_modules/qs/lib/stringify.js +82597342: node_modules/request/node_modules/qs/lib/utils.js +82588115: node_modules/request/node_modules/qs/lib/parse.js +4482815: node_modules/request/lib/har.js +81178912: node_modules/request/node_modules/har-validator/package.json +81001381: node_modules/request/node_modules/har-validator/lib/index.js +81176502: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/package.json +81163939: node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js +81001935: node_modules/request/node_modules/har-validator/lib/runner.js +81005359: node_modules/request/node_modules/har-validator/lib/schemas/index.js +81002525: node_modules/request/node_modules/har-validator/lib/schemas/cache.json +81002712: node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json +81003206: node_modules/request/node_modules/har-validator/lib/schemas/content.json +81003583: node_modules/request/node_modules/har-validator/lib/schemas/cookie.json +81004081: node_modules/request/node_modules/har-validator/lib/schemas/creator.json +81004311: node_modules/request/node_modules/har-validator/lib/schemas/entry.json +81005242: node_modules/request/node_modules/har-validator/lib/schemas/har.json +81007111: node_modules/request/node_modules/har-validator/lib/schemas/log.json +81007604: node_modules/request/node_modules/har-validator/lib/schemas/page.json +81008181: node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json +81008406: node_modules/request/node_modules/har-validator/lib/schemas/postData.json +81009060: node_modules/request/node_modules/har-validator/lib/schemas/record.json +81009286: node_modules/request/node_modules/har-validator/lib/schemas/request.json +81010139: node_modules/request/node_modules/har-validator/lib/schemas/response.json +81010946: node_modules/request/node_modules/har-validator/lib/schemas/timings.json +81001195: node_modules/request/node_modules/har-validator/lib/error.js +81161590: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json +81108729: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js +81147021: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json +81132607: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js +81145615: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json +81134601: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js +81128902: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json +81127606: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js +81151111: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json +81149530: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js +81158029: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json +81157276: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js +81106380: node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js +4533728: node_modules/request/lib/auth.js +1962761: node_modules/node-uuid/package.json +1964629: node_modules/node-uuid/uuid.js +4550226: node_modules/request/lib/oauth.js +82548387: node_modules/request/node_modules/oauth-sign/package.json +82544802: node_modules/request/node_modules/oauth-sign/index.js +4568756: node_modules/request/lib/multipart.js +4585628: node_modules/request/lib/redirect.js +4594531: node_modules/request/lib/tunnel.js +82856379: node_modules/request/node_modules/tunnel-agent/package.json +82849535: node_modules/request/node_modules/tunnel-agent/index.js diff --git a/build/resources/linux/debian/control.in b/build/resources/linux/debian/control.in new file mode 100644 index 0000000000..7a6693e0cc --- /dev/null +++ b/build/resources/linux/debian/control.in @@ -0,0 +1,10 @@ +Package: <%= name %> +Version: <%= version %> +Depends: libgnome-keyring0, gir1.2-gnomekeyring-1.0, git, gconf2, gconf-service, libgtk2.0-0, libudev0 | libudev1, libgcrypt11 | libgcrypt20, libnotify4, libxtst6, libnss3, python, gvfs-bin, xdg-utils +Section: <%= section %> +Priority: optional +Architecture: <%= arch %> +Installed-Size: <%= installedSize %> +Maintainer: <%= maintainer %> +Description: <%= description %> + <%= description %> diff --git a/build/resources/linux/debian/lintian-overrides b/build/resources/linux/debian/lintian-overrides new file mode 100644 index 0000000000..0c946dfc06 --- /dev/null +++ b/build/resources/linux/debian/lintian-overrides @@ -0,0 +1,9 @@ +nylas: arch-dependent-file-in-usr-share +nylas: changelog-file-missing-in-native-package +nylas: copyright-file-contains-full-apache-2-license +nylas: copyright-should-refer-to-common-license-file-for-apache-2 +nylas: copyright-should-refer-to-common-license-file-for-lgpl +nylas: embedded-library +nylas: package-installs-python-bytecode +nylas: unstripped-binary-or-object +nylas: extra-license-file diff --git a/build/resources/linux/debian/postinst b/build/resources/linux/debian/postinst new file mode 100755 index 0000000000..42c4b3e1b2 --- /dev/null +++ b/build/resources/linux/debian/postinst @@ -0,0 +1,161 @@ +#!/bin/sh +# postinst script for Nylas +# +# see: dh_installdeb(1) + +# summary of how this script can be called: +# * `configure' +# * abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + +UBUNTU_CODENAMES="precise trusty utopic vivid" # "xenial is not yet available in nylas repos." +DEBIAN_CODENAMES="squeeze wheezy jessie sid" + +case "$1" in + configure) + gtk-update-icon-cache /usr/share/icons/hicolor > /dev/null 2>&1 + + DISTRO=`lsb_release -s -i` + + if [ "$DISTRO" = "Ubuntu" ] || [ "$DISTRO" = "elementary OS" ] || [ "$DISTRO" = "LinuxMint" ] ; then + DISTS=$UBUNTU_CODENAMES + DISTRO="ubuntu" + elif [ "$DISTRO" = "Debian" ]; then + DISTS=$DEBIAN_CODENAMES + DISTRO="debian" + else + echo "You are not running Debian, Ubuntu, ElementaryOS or LinuxMint. Not adding Nylas repository." + DISTRO="" + fi + + if [ -n "$DISTRO" ]; then + # Add the Nylas repository. + # Copyright (c) 2009 The Chromium Authors. All rights reserved. + # Use of this source code is governed by a BSD-style license. + + # Install the repository signing key + install_key() { + APT_KEY="`which apt-key 2> /dev/null`" + if [ -x "$APT_KEY" ]; then + "$APT_KEY" add - >/dev/null 2>&1 </dev/null | cut -d ':' -f 1) + if [ -n "$SOURCELIST" ]; then + return 0 + fi + + printf "$REPOCONFIG\n" > "$APT_SOURCESDIR/nylas.list" + if [ $? -eq 0 ]; then + return 1 + fi + fi + return 2 + } + + install_key + update_sources_lists + + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument '$1'" >&2 + exit 1 + ;; +esac + +set -e + +exit 0 diff --git a/build/resources/linux/debian/postrm b/build/resources/linux/debian/postrm new file mode 100755 index 0000000000..33c8300657 --- /dev/null +++ b/build/resources/linux/debian/postrm @@ -0,0 +1,58 @@ +#!/bin/sh +# Remove the Nylas repository. +# Copyright (c) 2009 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license. + +set -e +action="$1" + +# Only do complete clean-up on purge. +if [ "$action" != "purge" ] ; then + exit 0 +fi + +APT_GET="`which apt-get 2> /dev/null`" +APT_CONFIG="`which apt-config 2> /dev/null`" + +# Parse apt configuration and return requested variable value. +apt_config_val() { + APTVAR="$1" + if [ -x "$APT_CONFIG" ]; then + "$APT_CONFIG" dump | sed -e "/^$APTVAR /"'!d' -e "s/^$APTVAR \"\(.*\)\".*/\1/" + fi +} + +uninstall_key() { + APT_KEY="`which apt-key 2> /dev/null`" + if [ -x "$APT_KEY" ]; then + # don't fail if the key wasn't found + "$APT_KEY" rm 7D0ACF4A >/dev/null 2>&1 || true + fi +} + +# Set variables for the locations of the apt sources lists. +find_apt_sources() { + APTDIR=$(apt_config_val Dir) + APTETC=$(apt_config_val 'Dir::Etc') + APT_SOURCES="$APTDIR$APTETC$(apt_config_val 'Dir::Etc::sourcelist')" + APT_SOURCESDIR="$APTDIR$APTETC$(apt_config_val 'Dir::Etc::sourceparts')" +} + +# Remove a repository from the apt sources. +# Returns: +# 0 - successfully removed, or not configured +# 1 - failed to remove +clean_sources_lists() { + find_apt_sources + + if [ -d "$APT_SOURCESDIR" ]; then + rm -f "$APT_SOURCESDIR/nylas.list" + fi + + return 0 +} + +uninstall_key +clean_sources_lists + +exit 0 diff --git a/build/resources/linux/icons/128.png b/build/resources/linux/icons/128.png new file mode 100644 index 0000000000..fb86db5b36 Binary files /dev/null and b/build/resources/linux/icons/128.png differ diff --git a/build/resources/linux/icons/16.png b/build/resources/linux/icons/16.png new file mode 100644 index 0000000000..dd2b7d9821 Binary files /dev/null and b/build/resources/linux/icons/16.png differ diff --git a/build/resources/linux/icons/256.png b/build/resources/linux/icons/256.png new file mode 100644 index 0000000000..0a03af5598 Binary files /dev/null and b/build/resources/linux/icons/256.png differ diff --git a/build/resources/linux/icons/32.png b/build/resources/linux/icons/32.png new file mode 100644 index 0000000000..7e67b8eea5 Binary files /dev/null and b/build/resources/linux/icons/32.png differ diff --git a/build/resources/linux/icons/512.png b/build/resources/linux/icons/512.png new file mode 100644 index 0000000000..1616522972 Binary files /dev/null and b/build/resources/linux/icons/512.png differ diff --git a/build/resources/linux/icons/64.png b/build/resources/linux/icons/64.png new file mode 100644 index 0000000000..f55b61e0ab Binary files /dev/null and b/build/resources/linux/icons/64.png differ diff --git a/build/resources/linux/nylas-mail.desktop.in b/build/resources/linux/nylas-mail.desktop.in new file mode 100644 index 0000000000..fe6d68f2e8 --- /dev/null +++ b/build/resources/linux/nylas-mail.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Name=<%= productName %> +Comment=<%= description %> +GenericName=<%= productName %> +Exec=/usr/bin/nylas-mail %U +Icon=nylas-mail +Type=Application +StartupNotify=true +StartupWMClass=<%= productName %> +Categories=GNOME;GTK;Network;Email;Utility;Development; +MimeType=text/plain;x-scheme-handler/mailto;x-scheme-handler/nylas; diff --git a/build/resources/linux/redhat/nylas.spec.in b/build/resources/linux/redhat/nylas.spec.in new file mode 100644 index 0000000000..900e649f59 --- /dev/null +++ b/build/resources/linux/redhat/nylas.spec.in @@ -0,0 +1,40 @@ +Name: <%= name %> +Version: <%= version %> +Release: 0.1%{?dist} +Summary: <%= description %> +License: GPLv3 +URL: https://github.com/nylas/nylas-mail +AutoReqProv: no # Avoid libchromiumcontent.so missing dependency + +requires: libgnome-keyring + +%description +<%= description %> + +%install +mkdir -p %{buildroot}/usr/share/nylas-mail +cp -r <%= contentsDir %>/* %{buildroot}/usr/share/nylas-mail + +mkdir -p %{buildroot}/usr/bin/ + +ln -s ../share/nylas-mail/nylas %{buildroot}/usr/bin/nylas-mail +chmod 755 %{buildroot}/usr/bin/nylas-mail + +mkdir -p %{buildroot}/usr/share/applications/ +mv nylas-mail.desktop %{buildroot}/usr/share/applications/ + +for s in 16 32 64 128 256 512; do + mkdir -p %{buildroot}/usr/share/icons/hicolor/${s}x${s}/apps + cp -p <%= linuxAssetsDir %>/icons/${s}.png %{buildroot}/usr/share/icons/hicolor/${s}x${s}/apps/nylas-mail.png +done + +%files +/usr/bin/nylas-mail +/usr/share/nylas-mail +/usr/share/applications/nylas-mail.desktop +/usr/share/icons/hicolor/16x16/apps/nylas-mail.png +/usr/share/icons/hicolor/32x32/apps/nylas-mail.png +/usr/share/icons/hicolor/64x64/apps/nylas-mail.png +/usr/share/icons/hicolor/128x128/apps/nylas-mail.png +/usr/share/icons/hicolor/256x256/apps/nylas-mail.png +/usr/share/icons/hicolor/512x512/apps/nylas-mail.png diff --git a/build/resources/mac/Nylas Calendar.app/Contents/Info.plist b/build/resources/mac/Nylas Calendar.app/Contents/Info.plist new file mode 100644 index 0000000000..a08b20c1a1 --- /dev/null +++ b/build/resources/mac/Nylas Calendar.app/Contents/Info.plist @@ -0,0 +1,61 @@ + + + + + BuildMachineOSBuild + 15E65 + CFBundleDevelopmentRegion + en + CFBundleExecutable + Nylas Calendar + CFBundleIconFile + AppIcon + CFBundleIdentifier + com.nylas.Nylas-Calendar + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Nylas Calendar + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleURLTypes + + + CFBundleURLName + nylas-calendar-shim + + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 7D1014 + DTPlatformVersion + GM + DTSDKBuild + 15E60 + DTSDKName + macosx10.11 + DTXcode + 0731 + DTXcodeBuild + 7D1014 + LSMinimumSystemVersion + 10.11 + NSHumanReadableCopyright + Copyright © 2016 Ben Gotow. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/build/resources/mac/Nylas Calendar.app/Contents/MacOS/Nylas Calendar b/build/resources/mac/Nylas Calendar.app/Contents/MacOS/Nylas Calendar new file mode 100755 index 0000000000..59d982c3a7 Binary files /dev/null and b/build/resources/mac/Nylas Calendar.app/Contents/MacOS/Nylas Calendar differ diff --git a/build/resources/mac/Nylas Calendar.app/Contents/PkgInfo b/build/resources/mac/Nylas Calendar.app/Contents/PkgInfo new file mode 100644 index 0000000000..bd04210fb4 --- /dev/null +++ b/build/resources/mac/Nylas Calendar.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/build/resources/mac/Nylas Calendar.app/Contents/Resources/AppIcon.icns b/build/resources/mac/Nylas Calendar.app/Contents/Resources/AppIcon.icns new file mode 100644 index 0000000000..bd4f7fdb21 Binary files /dev/null and b/build/resources/mac/Nylas Calendar.app/Contents/Resources/AppIcon.icns differ diff --git a/build/resources/mac/Nylas Calendar.app/Contents/Resources/Base.lproj/MainMenu.nib b/build/resources/mac/Nylas Calendar.app/Contents/Resources/Base.lproj/MainMenu.nib new file mode 100644 index 0000000000..016f8f684c Binary files /dev/null and b/build/resources/mac/Nylas Calendar.app/Contents/Resources/Base.lproj/MainMenu.nib differ diff --git a/build/resources/mac/Nylas Calendar.app/Contents/_CodeSignature/CodeResources b/build/resources/mac/Nylas Calendar.app/Contents/_CodeSignature/CodeResources new file mode 100644 index 0000000000..6dff66395b --- /dev/null +++ b/build/resources/mac/Nylas Calendar.app/Contents/_CodeSignature/CodeResources @@ -0,0 +1,144 @@ + + + + + files + + Resources/AppIcon.icns + + 5v+SAI+weVs8VSrknYJvITKSEws= + + Resources/Base.lproj/MainMenu.nib + + hash + + 3K0ICUQtN1fqxnQ0VFIIBLmDg00= + + optional + + + + files2 + + Resources/AppIcon.icns + + hash + + 5v+SAI+weVs8VSrknYJvITKSEws= + + hash2 + + cDmR/kt31C8E2IvUvGZRLOTDSOnZAtRnMPhGIJs6k00= + + + Resources/Base.lproj/MainMenu.nib + + hash + + 3K0ICUQtN1fqxnQ0VFIIBLmDg00= + + hash2 + + v9hB8Bi1UaRdestGh/P5TKwS9ntchvYPnE+TZp/y76w= + + optional + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/build/resources/mac/Nylas-Mail-DMG-Background.png b/build/resources/mac/Nylas-Mail-DMG-Background.png new file mode 100644 index 0000000000..1def5c06f1 Binary files /dev/null and b/build/resources/mac/Nylas-Mail-DMG-Background.png differ diff --git a/resources/mac/file.icns b/build/resources/mac/file.icns similarity index 100% rename from resources/mac/file.icns rename to build/resources/mac/file.icns diff --git a/build/resources/mac/nylas-Info.plist b/build/resources/mac/nylas-Info.plist new file mode 100644 index 0000000000..84e3b27fa5 --- /dev/null +++ b/build/resources/mac/nylas-Info.plist @@ -0,0 +1,23 @@ + + + + + NSPrincipalClass + AtomApplication + CFBundleDocumentTypes + + + LSHandlerRank + Alternate + CFBundleTypeRole + Viewer + CFBundleTypeName + File + CFBundleTypeExtensions + + * + + + + + diff --git a/build/resources/mac/nylas.icns b/build/resources/mac/nylas.icns new file mode 100644 index 0000000000..5c02d4f59c Binary files /dev/null and b/build/resources/mac/nylas.icns differ diff --git a/build/resources/nylas.png b/build/resources/nylas.png new file mode 100644 index 0000000000..a69dbaaff4 Binary files /dev/null and b/build/resources/nylas.png differ diff --git a/build/resources/ssh/nylas-n1-ci-ssh-secure-file.enc b/build/resources/ssh/nylas-n1-ci-ssh-secure-file.enc new file mode 100755 index 0000000000..679920ac84 Binary files /dev/null and b/build/resources/ssh/nylas-n1-ci-ssh-secure-file.enc differ diff --git a/build/resources/ssh/nylas-n1-ci-ssh.openssl.enc b/build/resources/ssh/nylas-n1-ci-ssh.openssl.enc new file mode 100644 index 0000000000..935f01e4a6 Binary files /dev/null and b/build/resources/ssh/nylas-n1-ci-ssh.openssl.enc differ diff --git a/build/resources/win/elevate.cmd b/build/resources/win/elevate.cmd new file mode 100644 index 0000000000..8f72b356f0 --- /dev/null +++ b/build/resources/win/elevate.cmd @@ -0,0 +1,5 @@ +@setlocal +@echo off +set CMD=%* +set APP=%1 +start wscript //nologo "%~dpn0.vbs" %* \ No newline at end of file diff --git a/build/resources/win/elevate.vbs b/build/resources/win/elevate.vbs new file mode 100644 index 0000000000..1304e85514 --- /dev/null +++ b/build/resources/win/elevate.vbs @@ -0,0 +1,13 @@ +Set Shell = CreateObject("Shell.Application") +Set WShell = WScript.CreateObject("WScript.Shell") +Set ProcEnv = WShell.Environment("PROCESS") + +cmd = ProcEnv("CMD") +app = ProcEnv("APP") +args= Right(cmd,(Len(cmd)-Len(app))) + +If (WScript.Arguments.Count >= 1) Then + Shell.ShellExecute app, args, "", "runas", 0 +Else + WScript.Quit +End If \ No newline at end of file diff --git a/build/resources/win/loading.gif b/build/resources/win/loading.gif new file mode 100644 index 0000000000..ae7f841410 Binary files /dev/null and b/build/resources/win/loading.gif differ diff --git a/build/resources/win/loading.png b/build/resources/win/loading.png new file mode 100644 index 0000000000..fabddab3f8 Binary files /dev/null and b/build/resources/win/loading.png differ diff --git a/build/resources/win/nylas-mailto-default.reg b/build/resources/win/nylas-mailto-default.reg new file mode 100755 index 0000000000..a1721f8d1d Binary files /dev/null and b/build/resources/win/nylas-mailto-default.reg differ diff --git a/build/resources/win/nylas-mailto-registration.reg b/build/resources/win/nylas-mailto-registration.reg new file mode 100755 index 0000000000..64a437f731 --- /dev/null +++ b/build/resources/win/nylas-mailto-registration.reg @@ -0,0 +1,60 @@ +Windows Registry Editor Version 5.00 + +[{{HKEY_ROOT}}\SOFTWARE\Classes\Nylas.Url.mailto] +"FriendlyTypeName"="Nylas Url" + +[{{HKEY_ROOT}}\SOFTWARE\Classes\Nylas.Url.mailto\shell] + +[{{HKEY_ROOT}}\SOFTWARE\Classes\Nylas.Url.mailto\shell\open] + +[{{HKEY_ROOT}}\SOFTWARE\Classes\Nylas.Url.mailto\shell\open\command] +@="\"{{PATH_TO_ROOT_FOLDER}}\\Update.exe\" --processStart nylas.exe --process-start-args %1" + + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas] +@="Nylas" +"LocalizedString"="@{{PATH_TO_ROOT_FOLDER}}\\Update.exe,-123" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\DefaultIcon] +@="{{PATH_TO_APP_FOLDER}}\\nylas.exe,1" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Capabilities] +"ApplicationName"="Nylas Mail" +"ApplicationDescription"="A fast, modern mail client designed to help you boost your productivity." + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Capabilities\StartMenu] +"Mail"="Nylas" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Capabilities\URLAssociations] +"mailto"="Nylas.Url.mailto" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols] + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols\mailto] +@="URL:MailTo Protocol" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols\mailto\DefaultIcon] +@="{{PATH_TO_APP_FOLDER}}\\nylas.exe,1" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols\mailto\shell] + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols\mailto\shell\open] + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\Protocols\mailto\shell\open\command] +@="\"{{PATH_TO_ROOT_FOLDER}}\\Update.exe\" --processStart nylas.exe --process-start-args %1" + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\shell] + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\shell\open] + +[{{HKEY_ROOT}}\SOFTWARE\Clients\Mail\Nylas\shell\open\command] +@="\"{{PATH_TO_ROOT_FOLDER}}\\Update.exe\" --processStart nylas.exe" + +[{{HKEY_ROOT}}\SOFTWARE\RegisteredApplications] +"Nylas"="Software\\Clients\\Mail\\Nylas\\Capabilities" + + +[HKEY_CURRENT_USER\SOFTWARE\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache] +"{{PATH_TO_ROOT_FOLDER}}\\Update.exe"="Nylas Mail" +"{{PATH_TO_ROOT_FOLDER}}\\Update.exe.FriendlyAppName"="Nylas Mail" +"{{PATH_TO_ROOT_FOLDER}}\\Update.exe.ApplicationCompany"="Nylas" diff --git a/build/resources/win/nylas.ico b/build/resources/win/nylas.ico new file mode 100644 index 0000000000..0aa35cde63 Binary files /dev/null and b/build/resources/win/nylas.ico differ diff --git a/build/tasks/build-task.coffee b/build/tasks/build-task.coffee deleted file mode 100644 index e912550246..0000000000 --- a/build/tasks/build-task.coffee +++ /dev/null @@ -1,188 +0,0 @@ -fs = require 'fs' -path = require 'path' -_ = require 'underscore-plus' - -module.exports = (grunt) -> - {cp, isAtomPackage, mkdir, rm} = require('./task-helpers')(grunt) - - grunt.registerTask 'build', 'Build the application', -> - shellAppDir = grunt.config.get('atom.shellAppDir') - buildDir = grunt.config.get('atom.buildDir') - appDir = grunt.config.get('atom.appDir') - - rm shellAppDir - rm path.join(buildDir, 'installer') - mkdir path.dirname(buildDir) - - # Atom-shell IS the executable. We just need to make sure our Edgehill - # app ends up in the correct `app` folder for atom-shell to find. - if process.platform is 'darwin' - cp 'atom-shell/Atom.app', shellAppDir, filter: /default_app/ - cp(path.join(shellAppDir, 'Contents', 'MacOS', 'Atom'), - path.join(shellAppDir, 'Contents', 'MacOS', 'Edgehill')) - rm path.join(shellAppDir, 'Contents', 'MacOS', 'Atom') - else if process.platform is 'win32' - cp 'atom-shell', shellAppDir, filter: /default_app/ - # We can rename atom.exe to edgehill.exe, but all of the node libraries with - # native code are hard-linked to a file called atom.exe. For now, let's just - # leave it as atom.exe. https://github.com/atom/atom-shell/issues/713 - else - cp 'atom-shell', shellAppDir, filter: /default_app/ - cp path.join(shellAppDir, 'atom'), path.join(shellAppDir, 'edgehill') - rm path.join(shellAppDir, 'atom') - - mkdir appDir - - # Note that `atom.sh` can't be renamed `edgehill.sh` because `apm` - # is currently hard-coded to call `atom.sh` - if process.platform isnt 'win32' - cp 'atom.sh', path.join(appDir, 'atom.sh') - - cp 'package.json', path.join(appDir, 'package.json') - cp path.join('resources', 'edgehill.png'), path.join(appDir, 'edgehill.png') - - packageDirectories = [] - nonPackageDirectories = [ - 'benchmark' - 'dot-inbox' - 'vendor' - 'resources' - ] - - {devDependencies} = grunt.file.readJSON('package.json') - - for child in fs.readdirSync('node_modules') - directory = path.join('node_modules', child) - if isAtomPackage(directory) - packageDirectories.push(directory) - else - nonPackageDirectories.push(directory) - - for child in fs.readdirSync('internal_packages') - directory = path.join('internal_packages', child) - if isAtomPackage(directory) - packageDirectories.push(directory) - else - nonPackageDirectories.push(directory) - - # Put any paths here that shouldn't end up in the built Atom.app - # so that it doesn't becomes larger than it needs to be. - ignoredPaths = [ - path.join('git-utils', 'deps') - path.join('oniguruma', 'deps') - path.join('less', 'dist') - path.join('npm', 'doc') - path.join('npm', 'html') - path.join('npm', 'man') - path.join('npm', 'node_modules', '.bin', 'beep') - path.join('npm', 'node_modules', '.bin', 'clear') - path.join('npm', 'node_modules', '.bin', 'starwars') - path.join('pegjs', 'examples') - path.join('jasmine-reporters', 'ext') - path.join('jasmine-node', 'node_modules', 'gaze') - path.join('jasmine-node', 'spec') - path.join('node_modules', 'nan') - path.join('build', 'binding.Makefile') - path.join('build', 'config.gypi') - path.join('build', 'gyp-mac-tool') - path.join('build', 'Makefile') - path.join('build', 'Release', 'obj.target') - path.join('build', 'Release', 'obj') - path.join('build', 'Release', '.deps') - path.join('vendor', 'apm') - path.join('resources', 'linux') - path.join('resources', 'mac') - path.join('resources', 'win') - - # These are only require in dev mode when the grammar isn't precompiled - path.join('atom-keymap', 'node_modules', 'loophole') - path.join('atom-keymap', 'node_modules', 'pegjs') - path.join('atom-keymap', 'node_modules', '.bin', 'pegjs') - path.join('snippets', 'node_modules', 'loophole') - path.join('snippets', 'node_modules', 'pegjs') - path.join('snippets', 'node_modules', '.bin', 'pegjs') - - '.DS_Store' - '.jshintrc' - '.npmignore' - '.pairs' - '.travis.yml' - ] - ignoredPaths = ignoredPaths.map (ignoredPath) -> _.escapeRegExp(ignoredPath) - - # Add .* to avoid matching hunspell_dictionaries. - ignoredPaths.push "#{_.escapeRegExp(path.join('spellchecker', 'vendor', 'hunspell') + path.sep)}.*" - ignoredPaths.push "#{_.escapeRegExp(path.join('build', 'Release') + path.sep)}.*\\.pdb" - - # Ignore *.cc and *.h files from native modules - ignoredPaths.push "#{_.escapeRegExp(path.join('ctags', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('git-utils', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('keytar', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('nslog', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('oniguruma', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('pathwatcher', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('runas', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('scrollbar-style', 'src') + path.sep)}.*\\.(cc|h)*" - ignoredPaths.push "#{_.escapeRegExp(path.join('spellchecker', 'src') + path.sep)}.*\\.(cc|h)*" - - # Ignore build files - ignoredPaths.push "#{_.escapeRegExp(path.sep)}binding\\.gyp$" - ignoredPaths.push "#{_.escapeRegExp(path.sep)}.+\\.target.mk$" - ignoredPaths.push "#{_.escapeRegExp(path.sep)}linker\\.lock$" - ignoredPaths.push "#{_.escapeRegExp(path.join('build', 'Release') + path.sep)}.+\\.node\\.dSYM" - - # Hunspell dictionaries are only not needed on OS X. - if process.platform is 'darwin' - ignoredPaths.push path.join('spellchecker', 'vendor', 'hunspell_dictionaries') - ignoredPaths = ignoredPaths.map (ignoredPath) -> "(#{ignoredPath})" - - testFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}te?sts?#{_.escapeRegExp(path.sep)}") - exampleFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}examples?#{_.escapeRegExp(path.sep)}") - benchmarkFolderPattern = new RegExp("#{_.escapeRegExp(path.sep)}benchmarks?#{_.escapeRegExp(path.sep)}") - - nodeModulesFilter = new RegExp(ignoredPaths.join('|')) - filterNodeModule = (pathToCopy) -> - return true if benchmarkFolderPattern.test(pathToCopy) - - pathToCopy = path.resolve(pathToCopy) - nodeModulesFilter.test(pathToCopy) or testFolderPattern.test(pathToCopy) or exampleFolderPattern.test(pathToCopy) - - packageFilter = new RegExp("(#{ignoredPaths.join('|')})|(.+\\.(cson|coffee|cjsx|jsx)$)") - filterPackage = (pathToCopy) -> - return true if benchmarkFolderPattern.test(pathToCopy) - - pathToCopy = path.resolve(pathToCopy) - packageFilter.test(pathToCopy) or testFolderPattern.test(pathToCopy) or exampleFolderPattern.test(pathToCopy) - - for directory in nonPackageDirectories - cp directory, path.join(appDir, directory), filter: filterNodeModule - - for directory in packageDirectories - cp directory, path.join(appDir, directory), filter: filterPackage - - cp 'spec', path.join(appDir, 'spec') - cp 'spec-inbox', path.join(appDir, 'spec-inbox') - cp 'src', path.join(appDir, 'src'), filter: /.+\.(cson|coffee|cjsx|jsx)$/ - cp 'static', path.join(appDir, 'static') - - cp path.join('apm', 'node_modules', 'atom-package-manager'), path.join(appDir, 'apm'), filter: filterNodeModule - if process.platform isnt 'win32' - fs.symlinkSync(path.join('..', '..', 'bin', 'apm'), path.join(appDir, 'apm', 'node_modules', '.bin', 'apm')) - - if process.platform is 'darwin' - grunt.file.recurse path.join('resources', 'mac'), (sourcePath, rootDirectory, subDirectory='', filename) -> - unless /.+\.plist/.test(sourcePath) - grunt.file.copy(sourcePath, path.resolve(appDir, '..', subDirectory, filename)) - - if process.platform is 'win32' - cp path.join('resources', 'win', 'atom.cmd'), path.join(shellAppDir, 'resources', 'cli', 'atom.cmd') - cp path.join('resources', 'win', 'atom.sh'), path.join(shellAppDir, 'resources', 'cli', 'atom.sh') - cp path.join('resources', 'win', 'atom.js'), path.join(shellAppDir, 'resources', 'cli', 'atom.js') - cp path.join('resources', 'win', 'apm.sh'), path.join(shellAppDir, 'resources', 'cli', 'apm.sh') - - dependencies = ['compile', 'generate-license:save', 'generate-module-cache', 'compile-packages-slug'] - dependencies.push('copy-info-plist') if process.platform is 'darwin' - dependencies.push('set-exe-icon') if process.platform is 'win32' - grunt.task.run(dependencies...) - - grunt.log.ok("Built Edgehill into #{buildDir}") diff --git a/build/tasks/check-licenses-task.coffee b/build/tasks/check-licenses-task.coffee deleted file mode 100644 index 64e99b2ab7..0000000000 --- a/build/tasks/check-licenses-task.coffee +++ /dev/null @@ -1,27 +0,0 @@ -module.exports = (grunt) -> - grunt.registerTask 'check-licenses', 'Report the licenses of all dependencies', -> - legalEagle = require 'legal-eagle' - {size, keys} = require 'underscore-plus' - done = @async() - - options = - path: process.cwd() - omitPermissive: true - overrides: require './license-overrides' - - legalEagle options, (err, summary) -> - if err? - console.error(err) - process.exit 1 - - for key of summary - delete summary[key] if key.match /^atom@/ - - if size(summary) - console.error "Found dependencies without permissive licenses:" - for name in keys(summary).sort() - console.error "#{name}" - console.error " License: #{summary[name].license}" - console.error " Repository: #{summary[name].repository}" - process.exit 1 - done() diff --git a/build/tasks/clean-task.coffee b/build/tasks/clean-task.coffee deleted file mode 100644 index 97f0a91053..0000000000 --- a/build/tasks/clean-task.coffee +++ /dev/null @@ -1,21 +0,0 @@ -path = require 'path' -os = require 'os' - -module.exports = (grunt) -> - {rm} = require('./task-helpers')(grunt) - - grunt.registerTask 'partial-clean', 'Delete some of the build files', -> - tmpdir = os.tmpdir() - - rm grunt.config.get('atom.buildDir') - rm require('../src/coffee-cache').cacheDir - rm require('../src/less-compile-cache').cacheDir - rm path.join(tmpdir, 'atom-cached-atom-shells') - rm 'atom-shell' - - grunt.registerTask 'clean', 'Delete all the build files', -> - homeDir = process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME'] - - rm 'node_modules' - rm path.join(homeDir, '.atom', '.node-gyp') - grunt.task.run('partial-clean') diff --git a/build/tasks/codesign-task.coffee b/build/tasks/codesign-task.coffee deleted file mode 100644 index e7f854a9c7..0000000000 --- a/build/tasks/codesign-task.coffee +++ /dev/null @@ -1,61 +0,0 @@ -path = require 'path' -fs = require 'fs-plus' - -# Edgehill introduces the KEYCHAIN_ACCESS environment variable. This is -# injected via Jenkins. It is of the form: -# -# /full/keychain/path/login.keychain:password -# -# The KEYCHAIN_ACCESS variable is saved in a Jenkins Credential and -# injected via the Credentials Binding Plugin. -# -module.exports = (grunt) -> - {spawn} = require('./task-helpers')(grunt) - - grunt.registerTask 'codesign', 'Codesign the app', -> - done = @async() - - if process.platform is 'darwin' and (process.env.XCODE_KEYCHAIN or process.env.KEYCHAIN_ACCESS) - unlockKeychain (error) -> - if error? - done(error) - else - signApp(done) - else - signApp(done) - - unlockKeychain = (callback) -> - cmd = 'security' - {XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN, KEYCHAIN_ACCESS} = process.env - - if KEYCHAIN_ACCESS? - [XCODE_KEYCHAIN, XCODE_KEYCHAIN_PASSWORD] = KEYCHAIN_ACCESS.split(":") - - args = ['unlock-keychain', '-p', XCODE_KEYCHAIN_PASSWORD, XCODE_KEYCHAIN] - spawn {cmd, args}, (error) -> callback(error) - - signApp = (callback) -> - switch process.platform - when 'darwin' - cmd = 'codesign' - args = ['--deep', '--force', '--verbose', '--sign', 'Developer ID Application: InboxApp, Inc.', grunt.config.get('atom.shellAppDir')] - spawn {cmd, args}, (error) -> callback(error) - when 'win32' - # TODO: Don't do anything now, because we need a certificate pfx file - # issued from a certificate authority, and we don't have one. - return callback() - spawn {cmd: 'taskkill', args: ['/F', '/IM', 'atom.exe']}, -> - cmd = process.env.JANKY_SIGNTOOL ? 'signtool' - args = ['sign', path.join(grunt.config.get('atom.shellAppDir'), 'atom.exe')] - - spawn {cmd, args}, (error) -> - return callback(error) if error? - - setupExePath = path.resolve(grunt.config.get('atom.buildDir'), 'installer', 'AtomSetup.exe') - if fs.isFileSync(setupExePath) - args = ['sign', setupExePath] - spawn {cmd, args}, (error) -> callback(error) - else - callback() - else - callback() diff --git a/build/tasks/coffeelint-task.js b/build/tasks/coffeelint-task.js new file mode 100644 index 0000000000..4579d47256 --- /dev/null +++ b/build/tasks/coffeelint-task.js @@ -0,0 +1,25 @@ +module.exports = (grunt) => { + grunt.config.merge({ + coffeelint: { + 'options': { + configFile: 'build/config/coffeelint.json', + }, + 'src': grunt.config('source:coffeescript'), + 'build': [ + 'build/tasks/**/*.coffee', + ], + 'test': [ + 'spec/**/*.cjsx', + 'spec/**/*.coffee', + ], + 'static': [ + 'static/**/*.coffee', + 'static/**/*.cjsx', + ], + 'target': (grunt.option("target") ? grunt.option("target").split(" ") : []), + }, + }); + + grunt.loadNpmTasks('grunt-contrib-coffee'); + grunt.loadNpmTasks('grunt-coffeelint-cjsx'); +} diff --git a/build/tasks/compile-packages-slug-task.coffee b/build/tasks/compile-packages-slug-task.coffee deleted file mode 100644 index c5b89c9ea9..0000000000 --- a/build/tasks/compile-packages-slug-task.coffee +++ /dev/null @@ -1,58 +0,0 @@ -path = require 'path' -CSON = require 'season' -fs = require 'fs-plus' -_ = require 'underscore-plus' - -module.exports = (grunt) -> - {spawn, rm} = require('./task-helpers')(grunt) - - grunt.registerTask 'compile-packages-slug', 'Add bundled package metadata information to the main package.json file', -> - appDir = fs.realpathSync(grunt.config.get('atom.appDir')) - - modulesDirectory = path.join(appDir, 'node_modules') - internalInboxPackagesDirectory = path.join(appDir, 'internal_packages') - - modulesPaths = fs.listSync(modulesDirectory) - modulesPaths = modulesPaths.concat(fs.listSync(internalInboxPackagesDirectory)) - packages = {} - - for moduleDirectory in modulesPaths - continue if path.basename(moduleDirectory) is '.bin' - - metadataPath = path.join(moduleDirectory, 'package.json') - metadata = grunt.file.readJSON(metadataPath) - continue unless metadata?.engines?.atom? - - moduleCache = metadata._atomModuleCache ? {} - - rm metadataPath - _.remove(moduleCache.extensions?['.json'] ? [], 'package.json') - - for property in ['_from', '_id', 'dist', 'readme', 'readmeFilename'] - delete metadata[property] - - pack = {metadata, keymaps: {}, menus: {}} - - if metadata.main - mainPath = require.resolve(path.resolve(moduleDirectory, metadata.main)) - pack.main = path.relative(appDir, mainPath) - - for keymapPath in fs.listSync(path.join(moduleDirectory, 'keymaps'), ['.cson', '.json']) - relativePath = path.relative(appDir, keymapPath) - pack.keymaps[relativePath] = CSON.readFileSync(keymapPath) - rm keymapPath - - for menuPath in fs.listSync(path.join(moduleDirectory, 'menus'), ['.cson', '.json']) - relativePath = path.relative(appDir, menuPath) - pack.menus[relativePath] = CSON.readFileSync(menuPath) - rm menuPath - - packages[metadata.name] = pack - - for extension, paths of moduleCache.extensions - delete moduleCache.extensions[extension] if paths.length is 0 - - metadata = grunt.file.readJSON(path.join(appDir, 'package.json')) - metadata._atomPackages = packages - - grunt.file.write(path.join(appDir, 'package.json'), JSON.stringify(metadata)) diff --git a/build/tasks/copy-info-plist-task.coffee b/build/tasks/copy-info-plist-task.coffee deleted file mode 100644 index 76b8d6f0cb..0000000000 --- a/build/tasks/copy-info-plist-task.coffee +++ /dev/null @@ -1,13 +0,0 @@ -path = require 'path' - -module.exports = (grunt) -> - {cp} = require('./task-helpers')(grunt) - - grunt.registerTask 'copy-info-plist', 'Copy plist', -> - contentsDir = grunt.config.get('atom.contentsDir') - plistPath = path.join(contentsDir, 'Info.plist') - helperPlistPath = path.join(contentsDir, 'Frameworks/Atom Helper.app/Contents/Info.plist') - - # Copy custom plist files - cp 'resources/mac/edgehill-Info.plist', plistPath - cp 'resources/mac/helper-Info.plist', helperPlistPath diff --git a/build/tasks/create-mac-dmg.js b/build/tasks/create-mac-dmg.js new file mode 100644 index 0000000000..81639e08d3 --- /dev/null +++ b/build/tasks/create-mac-dmg.js @@ -0,0 +1,25 @@ +const path = require('path'); +const createDMG = require('electron-installer-dmg') + +module.exports = (grunt) => { + grunt.registerTask('create-mac-dmg', 'Create DMG for Nylas Mail', function pack() { + const done = this.async(); + const dmgPath = path.join(grunt.config('outputDir'), "NylasMail.dmg"); + createDMG({ + appPath: path.join(grunt.config('outputDir'), "Nylas Mail-darwin-x64", "Nylas Mail.app"), + name: "NylasMail", + background: path.resolve(grunt.config('appDir'), 'build', 'resources', 'mac', 'Nylas-Mail-DMG-background.png'), + icon: path.resolve(grunt.config('appDir'), 'build', 'resources', 'mac', 'nylas.icns'), + overwrite: true, + out: grunt.config('outputDir'), + }, (err) => { + if (err) { + done(err); + return + } + + grunt.log.writeln(`>> Created ${dmgPath}`); + done(null); + }) + }); +}; diff --git a/build/tasks/create-mac-zip.js b/build/tasks/create-mac-zip.js new file mode 100644 index 0000000000..fcd90ceecb --- /dev/null +++ b/build/tasks/create-mac-zip.js @@ -0,0 +1,35 @@ +/* eslint prefer-template: 0 */ +/* eslint global-require: 0 */ +/* eslint quote-props: 0 */ +const path = require('path'); + +module.exports = (grunt) => { + const {spawn} = require('./task-helpers')(grunt); + + grunt.registerTask('create-mac-zip', 'Zip up Nylas Mail', function pack() { + const done = this.async(); + const zipPath = path.join(grunt.config('outputDir'), 'NylasMail.zip'); + + if (grunt.file.exists(zipPath)) { + grunt.file.delete(zipPath, {force: true}); + } + + const orig = process.cwd(); + process.chdir(path.join(grunt.config('outputDir'), 'Nylas Mail-darwin-x64')); + + spawn({ + cmd: "zip", + args: ["-9", "-y", "-r", "-9", "-X", zipPath, 'Nylas Mail.app'], + }, (error) => { + process.chdir(orig); + + if (error) { + done(error); + return; + } + + grunt.log.writeln(`>> Created ${zipPath}`); + done(null); + }); + }); +}; diff --git a/build/tasks/csslint-task.js b/build/tasks/csslint-task.js new file mode 100644 index 0000000000..f00c927445 --- /dev/null +++ b/build/tasks/csslint-task.js @@ -0,0 +1,33 @@ +module.exports = (grunt) => { + grunt.config.merge({ + csslint: { + options: { + 'adjoining-classes': false, + 'duplicate-background-images': false, + 'box-model': false, + 'box-sizing': false, + 'bulletproof-font-face': false, + 'compatible-vendor-prefixes': false, + 'display-property-grouping': false, + 'fallback-colors': false, + 'font-sizes': false, + 'gradients': false, + 'ids': false, + 'important': false, + 'known-properties': false, + 'outline-none': false, + 'overqualified-elements': false, + 'qualified-headings': false, + 'unique-headings': false, + 'universal-selector': false, + 'vendor-prefix': false, + 'duplicate-properties': false, // doesn't place nice with mixins + }, + src: [ + 'static/**/*.css', + ], + }, + }); + + grunt.loadNpmTasks('grunt-contrib-csslint'); +} diff --git a/build/tasks/docs-build-task.js b/build/tasks/docs-build-task.js new file mode 100644 index 0000000000..0787225f95 --- /dev/null +++ b/build/tasks/docs-build-task.js @@ -0,0 +1,204 @@ +const path = require('path'); +const cjsxtransform = require('coffee-react-transform'); +const rimraf = require('rimraf'); + +const fs = require('fs-plus'); +var fs_extra = require('fs-extra'); + +const _ = require('underscore'); + +const donna = require('donna'); +const joanna = require('joanna'); +const tello = require('tello'); + +module.exports = function(grunt) { + + let {cp, mkdir, rm} = require('./task-helpers')(grunt); + + let getClassesToInclude = function() { + let modulesPath = path.resolve(__dirname, '..', '..', 'internal_packages'); + let classes = {}; + fs.traverseTreeSync(modulesPath, function(modulePath) { + // Don't traverse inside dependencies + if (modulePath.match(/node_modules/g)) { return false; } + + // Don't traverse blacklisted packages (that have docs, but we don't want to include) + if (path.basename(modulePath) !== 'package.json') { return true; } + if (!fs.isFileSync(modulePath)) { return true; } + + let apiPath = path.join(path.dirname(modulePath), 'api.json'); + if (fs.isFileSync(apiPath)) { + _.extend(classes, grunt.file.readJSON(apiPath).classes); + } + return true; + }); + return classes; + }; + + let sortClasses = function(classes) { + let sortedClasses = {}; + for (let className of Array.from(Object.keys(classes).sort())) { + sortedClasses[className] = classes[className]; + } + return sortedClasses; + }; + + return grunt.registerTask('docs-build', 'Builds the API docs in src', function() { + + grunt.log.writeln("Time to build the docs!") + + let done = this.async(); + + + let classDocsOutputDir = grunt.config.get('classDocsOutputDir'); + + let cjsxOutputDir = path.join(classDocsOutputDir, 'temp-cjsx'); + + return rimraf(cjsxOutputDir, function() { + let api; + fs.mkdir(cjsxOutputDir); + + let srcPath = path.resolve(__dirname, '..', '..', 'src'); + + const blacklist = ['/K2/', + 'legacy-edgehill-api', + 'edgehill-api']; + + let in_blacklist = function(file) { + for (var i = 0; i < blacklist.length; i++) { + if (file.indexOf(blacklist[i]) >= 0) { + return true; + } + } + return false; + }; + + fs.traverseTreeSync(srcPath, function(file) { + + if (in_blacklist(file)) { + console.log("Skipping " + file); + // Skip K2 + } + + // Convert CJSX into coffeescript that can be read by Donna + else if (path.extname(file) === '.cjsx') { + let transformed = cjsxtransform(grunt.file.read(file)); + + // Only attempt to parse this file as documentation if it contains + // real Coffeescript classes. + if (transformed.indexOf('\nclass ') > 0) { + + grunt.log.writeln("Found class in file: " + file) + + grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -5 + 1 || undefined)+'coffee'), transformed); + } + } + else if (path.extname(file) === '.jsx') { + console.log('Transforming ' + file) + + let fileStr = grunt.file.read(file); + + let transformed = require("babel-core").transform(fileStr, { + plugins: ["transform-react-jsx", + "transform-class-properties"], + presets: ['react', 'stage-2'] + }); + + grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined)+'js'), transformed.code); + } + else if (path.extname(file) == '.es6') { + console.log(file); + + let fileStr = grunt.file.read(file); + + let transformed = require("babel-core").transform(fileStr, { + plugins: ["transform-class-properties", + "transform-function-bind"], + presets: ['react', 'stage-2'] + + }); + + if (transformed.code.indexOf('class ') > 0) { + grunt.log.writeln("Found class in file: " + file) + + grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined)+'js'), transformed.code); + } + } + else if (path.extname(file) == '.coffee' || + path.extname(file) == '.js') { + let dest_path = path.join(cjsxOutputDir, path.basename(file)); + console.log("Copying " + file + " to " + dest_path); + fs_extra.copySync(file, dest_path); + } + return true; + }); + + grunt.log.ok('Done transforming, starting donna extraction') + grunt.log.writeln('cjsxOutputDir: ' + cjsxOutputDir) + + // Process coffeescript source + let metadata = donna.generateMetadata([cjsxOutputDir]); + grunt.log.ok('---- Done with Donna (cjsx metadata)----'); + + + // DEBUG + // Use to check individual files + var js_files = [] + fs.traverseTreeSync(cjsxOutputDir, function(file) { + if (path.extname(file) === '.js') { + console.log('testing joanna on ' + file) + let meta = joanna([file]) + console.log('testing tello on ' + file) + tello.digest(meta) + console.log('passed') + } + }); + + var js_files = [] + fs.traverseTreeSync(cjsxOutputDir, function(file) { + if (path.extname(file) === '.js') { + js_files.push(file.toString()) + } + }); + + console.log(js_files); + grunt.log.ok('---- Starting Jonna (jsx metadata)----'); + let jsx_metadata = joanna(js_files); + grunt.log.ok('---- Done with Joanna (jsx metadata)----'); + + + Object.assign(metadata[0].files, jsx_metadata.files); + console.log(metadata[0]); + + grunt.file.write('/tmp/metadata.json', JSON.stringify(metadata, null, 2)); + + + + try { + api = tello.digest(metadata); + } catch (e) { + console.log(e) + console.log(e.stack); + + console.log(metadata) + return; + } + + console.log('---- Done with Tello ----'); + _.extend(api.classes, getClassesToInclude()); + + console.log(api.classes) + + + api.classes = sortClasses(api.classes); + console.log(api.classes) + + let apiJson = JSON.stringify(api, null, 2); + let apiJsonPath = path.join(classDocsOutputDir, 'api.json'); + grunt.file.write(apiJsonPath, apiJson); + return done(); + }); + }); + + +}; diff --git a/build/tasks/docs-render-task.js b/build/tasks/docs-render-task.js new file mode 100644 index 0000000000..5104c8b6a6 --- /dev/null +++ b/build/tasks/docs-render-task.js @@ -0,0 +1,232 @@ +const path = require('path'); +const Handlebars = require('handlebars'); +const marked = require('meta-marked'); +const fs = require('fs-plus'); +const _ = require('underscore'); + +marked.setOptions({ + highlight(code) { + return require('highlight.js').highlightAuto(code).value; + } +}); + +let standardClassURLRoot = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/'; + +let standardClasses = [ + 'string', + 'object', + 'array', + 'function', + 'number', + 'date', + 'error', + 'boolean', + 'null', + 'undefined', + 'json', + 'set', + 'map', + 'typeerror', + 'syntaxerror', + 'referenceerror', + 'rangeerror' +]; + +let thirdPartyClasses = { + 'react.component': 'https://facebook.github.io/react/docs/component-api.html', + 'promise': 'https://github.com/petkaantonov/bluebird/blob/master/API.md', + 'range': 'https://developer.mozilla.org/en-US/docs/Web/API/Range', + 'selection': 'https://developer.mozilla.org/en-US/docs/Web/API/Selection', + 'node': 'https://developer.mozilla.org/en-US/docs/Web/API/Node', +}; + +module.exports = function(grunt) { + + let {cp, mkdir, rm} = require('./task-helpers')(grunt); + + let relativePathForClass = classname => classname+'.html'; + + let outputPathFor = function(relativePath) { + let classDocsOutputDir = grunt.config.get('classDocsOutputDir'); + return path.join(classDocsOutputDir, relativePath); + }; + + var processFields = function(json, fields, tasks) { + let val; + if (fields == null) { fields = []; } + if (tasks == null) { tasks = []; } + if (json instanceof Array) { + return (() => { + let result = []; + for (val of Array.from(json)) { + result.push(processFields(val, fields, tasks)); + } + return result; + })(); + } else { + return (() => { + let result1 = []; + for (let key in json) { + val = json[key]; + let item; + if (Array.from(fields).includes(key)) { + for (let task of Array.from(tasks)) { + val = task(val); + } + json[key] = val; + } + if (_.isObject(val)) { + item = processFields(val, fields, tasks); + } + result1.push(item); + } + return result1; + })(); + } + }; + + return grunt.registerTask('docs-render', 'Builds html from the API docs', function() { + + let documentation, filename, html, match, meta, name, result, section, val; + let classDocsOutputDir = grunt.config.get('classDocsOutputDir'); + + // Parse API reference Markdown + + let classes = []; + let apiJsonPath = path.join(classDocsOutputDir, 'api.json'); + let apiJSON = JSON.parse(grunt.file.read(apiJsonPath)); + + + for (var classname in apiJSON.classes) { + // Parse a "@Section" out of the description if one is present + let contents = apiJSON.classes[classname]; + let sectionRegex = /Section: ?([\w ]*)(?:$|\n)/; + section = 'General'; + + match = sectionRegex.exec(contents.description); + if (match) { + contents.description = contents.description.replace(match[0], ''); + section = match[1].trim(); + } + + // Replace superClass "React" with "React.Component". The Coffeescript Lexer + // is so bad. + if (contents.superClass === "React") { + contents.superClass = "React.Component"; + } + + classes.push({ + name: classname, + documentation: contents, + section + }); + } + + + // Build Sidebar metadata we can hand off to each of the templates to + // generate the sidebar + let sidebar = {}; + for (var i = 0; i < classes.length; i++) { + var current_class = classes[i]; + console.log(current_class.name + ' ' + current_class.section) + + if (!(current_class.section in sidebar)) { + sidebar[current_class.section] = [] + } + sidebar[current_class.section].push(current_class.name) + } + + + // Prepare to render by loading handlebars partials + let templatesPath = path.resolve(__dirname, '..', '..', 'build', 'docs_templates'); + grunt.file.recurse(templatesPath, function(abspath, root, subdir, filename) { + if ((filename[0] === '_') && (path.extname(filename) === '.html')) { + return Handlebars.registerPartial(filename, grunt.file.read(abspath)); + } + }); + + // Render Helpers + + let knownClassnames = {}; + for (classname in apiJSON.classes) { + val = apiJSON.classes[classname]; + knownClassnames[classname.toLowerCase()] = val; + } + + + let expandTypeReferences = function(val) { + let refRegex = /{([\w.]*)}/g; + while ((match = refRegex.exec(val)) !== null) { + let term = match[1].toLowerCase(); + let label = match[1]; + let url = false; + if (Array.from(standardClasses).includes(term)) { + url = standardClassURLRoot+term; + } else if (thirdPartyClasses[term]) { + url = thirdPartyClasses[term]; + } else if (knownClassnames[term]) { + url = relativePathForClass(knownClassnames[term].name); + grunt.log.ok("Found: " + term) + } else { + console.warn(`Cannot find class named ${term}`); + } + + if (url) { + val = val.replace(match[0], `${label}`); + } + } + return val; + }; + + let expandFuncReferences = function(val) { + let refRegex = /{([\w]*)?::([\w]*)}/g; + while ((match = refRegex.exec(val)) !== null) { + var label; + let [text, a, b] = Array.from(match); + let url = false; + if (a && b) { + url = `${relativePathForClass(a)}#${b}`; + label = `${a}::${b}`; + } else { + url = `#${b}`; + label = `${b}`; + } + if (url) { + val = val.replace(text, `${label}`); + } + } + return val; + }; + + // DEBUG Render sidebar json + // grunt.file.write(outputPathFor('sidebar.json'), JSON.stringify(sidebar, null, 2)); + + // Render Class Pages + let classTemplatePath = path.join(templatesPath, 'class.md'); + let classTemplate = Handlebars.compile(grunt.file.read(classTemplatePath)); + + for ({name, documentation, section} of Array.from(classes)) { + // Recursively process `description` and `type` fields to process markdown, + // expand references to types, functions and other files. + processFields(documentation, ['description'], [expandFuncReferences]); + processFields(documentation, ['type'], [expandTypeReferences]); + + result = classTemplate({name, documentation, section}); + grunt.file.write(outputPathFor(name + '.md'), result); + } + + let sidebarTemplatePath = path.join(templatesPath, 'sidebar.md'); + let sidebarTemplate = Handlebars.compile(grunt.file.read(sidebarTemplatePath)); + + grunt.file.write(outputPathFor('Sidebar.md'), + sidebarTemplate({sidebar})); + + + // Remove temp cjsx output + return fs.removeSync(outputPathFor("temp-cjsx")); + }); +}; + +function __guard__(value, transform) { + return (typeof value !== 'undefined' && value !== null) ? transform(value) : undefined; +} diff --git a/build/tasks/docs-task.coffee b/build/tasks/docs-task.coffee deleted file mode 100644 index 50ad97ad13..0000000000 --- a/build/tasks/docs-task.coffee +++ /dev/null @@ -1,176 +0,0 @@ -path = require 'path' -Handlebars = require 'handlebars' -marked = require 'marked' -cjsxtransform = require 'coffee-react-transform' -rimraf = require 'rimraf' - -fs = require 'fs-plus' -_ = require 'underscore-plus' - -donna = require 'donna' -tello = require 'tello' - -moduleBlacklist = [ - 'space-pen' -] - -marked.setOptions - highlight: (code) -> - require('highlight.js').highlightAuto(code).value - -standardClassURLRoot = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/' - -standardClasses = [ - 'string', - 'object', - 'array', - 'function', - 'number', - 'date', - 'error', - 'boolean', - 'null', - 'undefined', - 'json', - 'set', - 'map', - 'typeerror', - 'syntaxerror', - 'referenceerror', - 'rangeerror' -] - -thirdPartyClasses = { - 'react.component': 'https://facebook.github.io/react/docs/component-api.html', - 'promise': 'https://github.com/petkaantonov/bluebird/blob/master/API.md', - 'range': 'https://developer.mozilla.org/en-US/docs/Web/API/Range', - 'selection': 'https://developer.mozilla.org/en-US/docs/Web/API/Selection', - 'node': 'https://developer.mozilla.org/en-US/docs/Web/API/Node', -} - -module.exports = (grunt) -> - getClassesToInclude = -> - modulesPath = path.resolve(__dirname, '..', '..', 'internal_packages') - classes = {} - fs.traverseTreeSync modulesPath, (modulePath) -> - # Don't traverse inside dependencies - return false if modulePath.match(/node_modules/g) - - # Don't traverse blacklisted packages (that have docs, but we don't want to include) - return false if path.basename(modulePath) in moduleBlacklist - return true unless path.basename(modulePath) is 'package.json' - return true unless fs.isFileSync(modulePath) - - apiPath = path.join(path.dirname(modulePath), 'api.json') - if fs.isFileSync(apiPath) - _.extend(classes, grunt.file.readJSON(apiPath).classes) - true - classes - - sortClasses = (classes) -> - sortedClasses = {} - for className in Object.keys(classes).sort() - sortedClasses[className] = classes[className] - sortedClasses - - processFields = (json, fields = [], tasks = []) -> - if json instanceof Array - for val in json - processFields(val, fields, tasks) - else - for key, val of json - if key in fields - for task in tasks - val = task(val) - json[key] = val - if _.isObject(val) - processFields(val, fields, tasks) - - - grunt.registerTask 'build-docs', 'Builds the API docs in src', -> - done = @async() - - # Convert CJSX into coffeescript that can be read by Donna - - docsOutputDir = grunt.config.get('docsOutputDir') - cjsxOutputDir = path.join(docsOutputDir, 'temp-cjsx') - rimraf cjsxOutputDir, -> - fs.mkdir(cjsxOutputDir) - srcPath = path.resolve(__dirname, '..', '..', 'src') - fs.traverseTreeSync srcPath, (file) -> - if path.extname(file) is '.cjsx' - transformed = cjsxtransform(grunt.file.read(file)) - # Only attempt to parse this file as documentation if it contains - # real Coffeescript classes. - if transformed.indexOf('\nclass ') > 0 - grunt.file.write(path.join(cjsxOutputDir, path.basename(file)[0..-5]+'coffee'), transformed) - true - - # Process coffeescript source - - metadata = donna.generateMetadata(['.', cjsxOutputDir]) - api = tello.digest(metadata) - _.extend(api.classes, getClassesToInclude()) - api.classes = sortClasses(api.classes) - - apiJson = JSON.stringify(api, null, 2) - apiJsonPath = path.join(docsOutputDir, 'api.json') - grunt.file.write(apiJsonPath, apiJson) - done() - - grunt.registerTask 'render-docs', 'Builds html from the API docs', -> - docsOutputDir = grunt.config.get('docsOutputDir') - apiJsonPath = path.join(docsOutputDir, 'api.json') - - templatesPath = path.resolve(__dirname, '..', '..', 'docs-templates') - grunt.file.recurse templatesPath, (abspath, root, subdir, filename) -> - if filename[0] is '_' and path.extname(filename) is '.html' - Handlebars.registerPartial(filename[0..-6], grunt.file.read(abspath)) - - templatePath = path.join(templatesPath, 'class.html') - template = Handlebars.compile(grunt.file.read(templatePath)) - - api = JSON.parse(grunt.file.read(apiJsonPath)) - classnames = _.map Object.keys(api.classes), (s) -> s.toLowerCase() - console.log("Generating HTML for #{classnames.length} classes") - - expandTypeReferences = (val) -> - refRegex = /{([\w.]*)}/g - while (match = refRegex.exec(val)) isnt null - classname = match[1].toLowerCase() - url = false - if classname in standardClasses - url = standardClassURLRoot+classname - else if thirdPartyClasses[classname] - url = thirdPartyClasses[classname] - else if classname in classnames - url = "./#{classname}.html" - else - console.warn("Cannot find class named #{classname}") - - if url - val = val.replace(match[0], "#{match[1]}") - val - - expandFuncReferences = (val) -> - refRegex = /{([\w]*)?::([\w]*)}/g - while (match = refRegex.exec(val)) isnt null - [text, a, b] = match - url = false - if a and b - url = "#{a}.html##{b}" - label = "#{a}::#{b}" - else - url = "##{b}" - label = "#{b}" - if url - val = val.replace(text, "#{label}") - val - - for classname, contents of api.classes - processFields(contents, ['description'], [marked, expandTypeReferences, expandFuncReferences]) - processFields(contents, ['type'], [expandTypeReferences]) - - result = template(contents) - resultPath = path.join(docsOutputDir, "#{classname}.html") - grunt.file.write(resultPath, result) diff --git a/build/tasks/docs-task.js b/build/tasks/docs-task.js new file mode 100644 index 0000000000..e143ee85b8 --- /dev/null +++ b/build/tasks/docs-task.js @@ -0,0 +1,177 @@ +const path = require('path'); +const cjsxtransform = require('coffee-react-transform'); +const rimraf = require('rimraf'); + +const fs = require('fs-plus'); +const _ = require('underscore'); + +const donna = require('donna'); +const joanna = require('joanna'); +const tello = require('tello'); + +module.exports = function(grunt) { + + let {cp, mkdir, rm} = require('./task-helpers')(grunt); + + let getClassesToInclude = function() { + let modulesPath = path.resolve(__dirname, '..', '..', 'internal_packages'); + let classes = {}; + fs.traverseTreeSync(modulesPath, function(modulePath) { + // Don't traverse inside dependencies + if (modulePath.match(/node_modules/g)) { return false; } + + // Don't traverse blacklisted packages (that have docs, but we don't want to include) + if (path.basename(modulePath) !== 'package.json') { return true; } + if (!fs.isFileSync(modulePath)) { return true; } + + let apiPath = path.join(path.dirname(modulePath), 'api.json'); + if (fs.isFileSync(apiPath)) { + _.extend(classes, grunt.file.readJSON(apiPath).classes); + } + return true; + }); + return classes; + }; + + let sortClasses = function(classes) { + let sortedClasses = {}; + for (let className of Array.from(Object.keys(classes).sort())) { + sortedClasses[className] = classes[className]; + } + return sortedClasses; + }; + + var processFields = function(json, fields, tasks) { + let val; + if (fields == null) { fields = []; } + if (tasks == null) { tasks = []; } + if (json instanceof Array) { + return (() => { + let result = []; + for (val of Array.from(json)) { + result.push(processFields(val, fields, tasks)); + } + return result; + })(); + } else { + return (() => { + let result1 = []; + for (let key in json) { + val = json[key]; + let item; + if (Array.from(fields).includes(key)) { + for (let task of Array.from(tasks)) { + val = task(val); + } + json[key] = val; + } + if (_.isObject(val)) { + item = processFields(val, fields, tasks); + } + result1.push(item); + } + return result1; + })(); + } + }; + + return grunt.registerTask('docs', 'Builds the API docs in src', function() { + + grunt.log.writeln("Time to build the docs!") + + let done = this.async(); + + // Convert CJSX into coffeescript that can be read by Donna + + // let classDocsOutputDir = grunt.config.get('classDocsOutputDir'); + + let classDocsOutputDir = '~/Desktop/Nylas Mail Docs/' + let cjsxOutputDir = path.join(classDocsOutputDir, 'temp-cjsx'); + + return rimraf(cjsxOutputDir, function() { + let api; + fs.mkdir(cjsxOutputDir); + + let srcPath = path.resolve(__dirname, '..', '..', 'src'); + + fs.traverseTreeSync(srcPath, function(file) { + + if (file.indexOf('/K2/') > 0) { + // Skip K2 + } + else if (path.extname(file) === '.cjsx') { // Should also look for jsx and es6 + let transformed = cjsxtransform(grunt.file.read(file)); + + // Only attempt to parse this file as documentation if it contains + // real Coffeescript classes. + if (transformed.indexOf('\nclass ') > 0) { + + grunt.log.writeln("Found class in file: " + file) + + grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -5 + 1 || undefined)+'coffee'), transformed); + } + } + else if (path.extname(file) === '.jsx') { + console.log('Transforming ' + file) + + let fileStr = grunt.file.read(file); + + let transformed = require("babel-core").transform(fileStr, { + plugins: ["transform-react-jsx", + "transform-class-properties"], + presets: ['react', 'stage-2'] + }); + + + if (transformed.code.indexOf('class ') > 0) { + grunt.log.writeln("Found class in file: " + file) + + grunt.file.write(path.join(cjsxOutputDir, path.basename(file).slice(0, -3 || undefined)+'js'), transformed.code); + } + } + return true; + }); + + grunt.log.ok('Done transforming, starting donna extraction') + grunt.log.writeln('cjsxOutputDir: ' + cjsxOutputDir) + + // Process coffeescript source + let metadata = donna.generateMetadata([cjsxOutputDir]); + grunt.log.ok('---- Done with Donna (cjsx metadata)----'); + + console.log(js_files); + + var js_files = [] + fs.traverseTreeSync(cjsxOutputDir, function(file) { + if (path.extname(file) === '.js') { + js_files.push(file.toString()) + } + }); + + console.log(js_files); + let jsx_metadata = joanna(js_files); + grunt.log.ok('---- Done with Joanna (jsx metadata)----'); + + Object.assign(metadata, jsx_metadata); + + console.log(metadata); + + try { + api = tello.digest(metadata); + } catch (e) { + console.log(e.stack); + } + + console.log('---- Done with Tello ----'); + _.extend(api.classes, getClassesToInclude()); + api.classes = sortClasses(api.classes); + + let apiJson = JSON.stringify(api, null, 2); + let apiJsonPath = path.join(classDocsOutputDir, 'api.json'); + grunt.file.write(apiJsonPath, apiJson); + return done(); + }); + }); + + +}; diff --git a/build/tasks/dump-symbols-task.coffee b/build/tasks/dump-symbols-task.coffee deleted file mode 100644 index a690ba8d40..0000000000 --- a/build/tasks/dump-symbols-task.coffee +++ /dev/null @@ -1,39 +0,0 @@ -async = require 'async' -fs = require 'fs-plus' -path = require 'path' -minidump = require 'minidump' - -module.exports = (grunt) -> - {mkdir, rm} = require('./task-helpers')(grunt) - - dumpSymbolTo = (binaryPath, targetDirectory, callback) -> - minidump.dumpSymbol binaryPath, (error, content) -> - return callback(error) if error? - - moduleLine = /MODULE [^ ]+ [^ ]+ ([0-9A-F]+) (.*)\n/.exec(content) - if moduleLine.length isnt 3 - return callback("Invalid output when dumping symbol for #{binaryPath}") - - filename = moduleLine[2] - targetPathDirname = path.join(targetDirectory, filename, moduleLine[1]) - mkdir targetPathDirname - - targetPath = path.join(targetPathDirname, "#{filename}.sym") - fs.writeFile(targetPath, content, callback) - - grunt.registerTask 'dump-symbols', 'Dump symbols for native modules', -> - done = @async() - - symbolsDir = grunt.config.get('atom.symbolsDir') - rm symbolsDir - mkdir symbolsDir - - tasks = [] - onFile = (binaryPath) -> - if /.*\.node$/.test(binaryPath) - tasks.push(dumpSymbolTo.bind(this, binaryPath, symbolsDir)) - onDirectory = -> - true - fs.traverseTreeSync 'node_modules', onFile, onDirectory - - async.parallel tasks, done diff --git a/build/tasks/eslint-task.js b/build/tasks/eslint-task.js new file mode 100644 index 0000000000..d8417f12a4 --- /dev/null +++ b/build/tasks/eslint-task.js @@ -0,0 +1,72 @@ +const chalk = require('chalk'); +const eslint = require('eslint'); + +module.exports = (grunt) => { + grunt.config.merge({ + eslint: { + options: { + ignore: false, + configFile: 'build/config/eslint.json', + }, + target: grunt.config('source:es6'), + }, + + eslintFixer: { + src: grunt.config('source:es6'), + }, + }); + + grunt.registerMultiTask('eslint', 'Validate files with ESLint', function task() { + const opts = this.options({ + outputFile: false, + quiet: false, + maxWarnings: -1, + }); + + if (this.filesSrc.length === 0) { + grunt.log.writeln(chalk.magenta('Could not find any files to validate.')); + return true; + } + + const formatter = eslint.CLIEngine.getFormatter(opts.format); + + if (!formatter) { + grunt.warn(`Could not find formatter ${opts.format}.`); + return false; + } + + const engine = new eslint.CLIEngine(opts); + + let report = null; + try { + report = engine.executeOnFiles(this.filesSrc); + } catch (err) { + grunt.warn(err); + return false; + } + + if (opts.fix) { + eslint.CLIEngine.outputFixes(report); + } + + let results = report.results; + if (opts.quiet) { + results = eslint.CLIEngine.getErrorResults(results); + } + + const output = formatter(results); + + if (opts.outputFile) { + grunt.file.write(opts.outputFile, output); + } else if (output) { + console.log(output); + } + + const tooManyWarnings = opts.maxWarnings >= 0 && report.warningCount > opts.maxWarnings; + if (report.errorCount === 0 && tooManyWarnings) { + grunt.warn(`ESLint found too many warnings (maximum:${opts.maxWarnings})`); + } + + return report.errorCount === 0; + }); +}; diff --git a/build/tasks/generate-license-task.coffee b/build/tasks/generate-license-task.coffee deleted file mode 100644 index 6b616f5cb4..0000000000 --- a/build/tasks/generate-license-task.coffee +++ /dev/null @@ -1,46 +0,0 @@ -fs = require 'fs' -path = require 'path' - -module.exports = (grunt) -> - grunt.registerTask 'generate-license', 'Generate the license, including the licenses of all dependencies', (mode) -> - legalEagle = require 'legal-eagle' - done = @async() - - options = - path: process.cwd() - overrides: require './license-overrides' - - legalEagle options, (err, dependencyLicenses) -> - if err? - console.error(err) - exit 1 - - licenseText = getLicenseText(dependencyLicenses) - if mode is 'save' - targetPath = path.join(grunt.config.get('atom.appDir'), 'LICENSE.md') - fs.writeFileSync(targetPath, licenseText) - else - console.log licenseText - done() - -getLicenseText = (dependencyLicenses) -> - {keys} = require 'underscore-plus' - text = """ - #{fs.readFileSync('LICENSE.md', 'utf8')} - - This application bundles the following third-party packages in accordance - with the following licenses:\n\n - """ - names = keys(dependencyLicenses).sort() - for name in names - {license, source, sourceText} = dependencyLicenses[name] - - text += "-------------------------------------------------------------------------\n\n" - text += "Package: #{name}\n" - text += "License: #{license}\n" - text += "License Source: #{source}\n" if source? - if sourceText? - text += "Source Text:\n\n" - text += sourceText - text += '\n' - text diff --git a/build/tasks/generate-module-cache-task.coffee b/build/tasks/generate-module-cache-task.coffee deleted file mode 100644 index d21f53336c..0000000000 --- a/build/tasks/generate-module-cache-task.coffee +++ /dev/null @@ -1,39 +0,0 @@ -path = require 'path' -fs = require 'fs-plus' -ModuleCache = require '../../src/module-cache' - -module.exports = (grunt) -> - grunt.registerTask 'generate-module-cache', 'Generate a module cache for all core modules and packages', -> - appDir = grunt.config.get('atom.appDir') - - {packageDependencies} = grunt.file.readJSON('package.json') - - for packageName, version of packageDependencies - ModuleCache.create(path.join(appDir, 'node_modules', packageName)) - - ModuleCache.create(appDir) - - metadata = grunt.file.readJSON(path.join(appDir, 'package.json')) - - metadata._atomModuleCache.folders.forEach (folder) -> - if '' in folder.paths - folder.paths = [ - '' - 'exports' - 'spec' - 'src' - 'src/browser' - 'static' - 'vendor' - ] - - # Reactionary does not have an explicit react dependency - metadata._atomModuleCache.folders.push - paths: [ - 'node_modules/reactionary-atom-fork/lib' - ] - dependencies: { - 'react-atom-fork': metadata.dependencies['react-atom-fork'] - } - - grunt.file.write(path.join(appDir, 'package.json'), JSON.stringify(metadata)) diff --git a/build/tasks/install-task.coffee b/build/tasks/install-task.coffee deleted file mode 100644 index c9ee4c9d62..0000000000 --- a/build/tasks/install-task.coffee +++ /dev/null @@ -1,65 +0,0 @@ -path = require 'path' -_ = require 'underscore-plus' -fs = require 'fs-plus' -runas = null -temp = require 'temp' - -module.exports = (grunt) -> - {cp, mkdir, rm} = require('./task-helpers')(grunt) - - grunt.registerTask 'install', 'Install the built application', -> - installDir = grunt.config.get('atom.installDir') - shellAppDir = grunt.config.get('atom.shellAppDir') - - if process.platform is 'win32' - runas ?= require 'runas' - copyFolder = path.resolve 'script', 'copy-folder.cmd' - if runas('cmd', ['/c', copyFolder, shellAppDir, installDir], admin: true) isnt 0 - grunt.log.error("Failed to copy #{shellAppDir} to #{installDir}") - - createShortcut = path.resolve 'script', 'create-shortcut.cmd' - runas('cmd', ['/c', createShortcut, path.join(installDir, 'edgehill.exe'), 'Edgehill']) - else if process.platform is 'darwin' - rm installDir - mkdir path.dirname(installDir) - - tempFolder = temp.path() - mkdir tempFolder - cp shellAppDir, tempFolder - fs.renameSync(tempFolder, installDir) - else - binDir = path.join(installDir, 'bin') - shareDir = path.join(installDir, 'share', 'edgehill') - - iconName = path.join(shareDir,'resources', 'app', 'resources', 'edgehill.png') - - mkdir binDir - # Note that `atom.sh` can't be renamed `edgehill.sh` because `apm` - # is currently hard-coded to call `atom.sh` - cp 'atom.sh', path.join(binDir, 'edgehill') - rm shareDir - mkdir path.dirname(shareDir) - cp shellAppDir, shareDir - - # Create edgehill.desktop if installation not in temporary folder - tmpDir = if process.env.TMPDIR? then process.env.TMPDIR else '/tmp' - if installDir.indexOf(tmpDir) isnt 0 - desktopFile = path.join('resources', 'linux', 'edgehill.desktop.in') - desktopInstallFile = path.join(installDir, 'share', 'applications', 'edgehill.desktop') - - {description} = grunt.file.readJSON('package.json') - iconName = path.join(shareDir, 'resources', 'app', 'resources', 'edgehill.png') - installDir = path.join(installDir, '.') # To prevent "Exec=/usr/local//share/edgehill/edgehill" - template = _.template(String(fs.readFileSync(desktopFile))) - filled = template({description, installDir, iconName}) - - grunt.file.write(desktopInstallFile, filled) - - # Create relative symbol link for apm. - process.chdir(binDir) - rm('apm') - fs.symlinkSync(path.join('..', 'share', 'edgehill', 'resources', 'app', 'apm', 'node_modules', '.bin', 'apm'), 'apm') - - fs.chmodSync(path.join(shareDir, 'edgehill'), "755") - - grunt.log.ok("Installed Edgehill into #{installDir}") diff --git a/build/tasks/installer-linux-task.js b/build/tasks/installer-linux-task.js new file mode 100644 index 0000000000..84c419a1c9 --- /dev/null +++ b/build/tasks/installer-linux-task.js @@ -0,0 +1,116 @@ +/* eslint global-require:0 */ +const fs = require('fs'); +const path = require('path'); +const _ = require('underscore'); + +module.exports = (grunt) => { + const {spawn} = require('./task-helpers')(grunt); + + const outputDir = grunt.config.get('outputDir'); + const contentsDir = path.join(grunt.config('outputDir'), `nylas-linux-${process.arch}`); + const linuxAssetsDir = path.resolve(path.join('resources', 'linux')); + const arch = { + ia32: 'i386', + x64: 'amd64', + }[process.arch]; + + // a few helpers + + const writeFromTemplate = (filePath, data) => { + const template = _.template(String(fs.readFileSync(filePath))) + const finishedPath = path.join(outputDir, path.basename(filePath).replace('.in', '')); + grunt.file.write(finishedPath, template(data)); + return finishedPath; + } + + const getInstalledSize = (dir, callback) => { + const cmd = 'du'; + const args = ['-sk', dir]; + spawn({cmd, args}, (error, {stdout}) => { + const installedSize = stdout.split(/\s+/).shift() || '200000'; // default to 200MB + callback(null, installedSize); + }); + } + + grunt.registerTask('create-rpm-installer', 'Create rpm package', function mkrpmf() { + const done = this.async() + if (!arch) { + done(new Error(`Unsupported arch ${process.arch}`)); + return; + } + + const rpmDir = path.join(grunt.config('outputDir'), 'rpm'); + if (grunt.file.exists(rpmDir)) { + grunt.file.delete(rpmDir, {force: true}); + } + + const templateData = { + name: grunt.config('appJSON').name, + version: grunt.config('appJSON').version, + description: grunt.config('appJSON').description, + productName: grunt.config('appJSON').productName, + linuxShareDir: '/usr/local/share/nylas', + linuxAssetsDir: linuxAssetsDir, + contentsDir: contentsDir, + } + + // This populates nylas.spec + const specInFilePath = path.join(linuxAssetsDir, 'redhat', 'nylas.spec.in') + writeFromTemplate(specInFilePath, templateData) + + // This populates nylas.desktop + const desktopInFilePath = path.join(linuxAssetsDir, 'nylas-mail.desktop.in') + writeFromTemplate(desktopInFilePath, templateData) + + const cmd = path.join('script', 'mkrpm') + const args = [outputDir, contentsDir, linuxAssetsDir] + spawn({cmd, args}, (error) => { + if (error) { + return done(error); + } + grunt.log.ok(`Created rpm package in ${rpmDir}`); + return done(); + }); + }); + + grunt.registerTask('create-deb-installer', 'Create debian package', function mkdebf() { + const done = this.async() + if (!arch) { + done(`Unsupported arch ${process.arch}`); + return; + } + + getInstalledSize(contentsDir, (error, installedSize) => { + if (error) { + done(error); + return; + } + + const version = grunt.config('appJSON').version; + const data = { + version: version, + name: grunt.config('appJSON').name, + description: grunt.config('appJSON').description, + productName: grunt.config('appJSON').productName, + linuxShareDir: '/usr/share/nylas-mail', + arch: arch, + section: 'devel', + maintainer: 'Nylas Team ', + installedSize: installedSize, + } + writeFromTemplate(path.join(linuxAssetsDir, 'debian', 'control.in'), data) + writeFromTemplate(path.join(linuxAssetsDir, 'nylas-mail.desktop.in'), data) + + const icon = path.join('build', 'resources', 'nylas.png') + const cmd = path.join('script', 'mkdeb'); + const args = [version, arch, icon, linuxAssetsDir, contentsDir, outputDir]; + spawn({cmd, args}, (spawnError) => { + if (spawnError) { + return done(spawnError); + } + grunt.log.ok(`Created ${outputDir}/nylas-${version}-${arch}.deb`); + return done() + }); + }); + }); +} diff --git a/build/tasks/installer-windows-task.js b/build/tasks/installer-windows-task.js new file mode 100644 index 0000000000..6fe3e9cc21 --- /dev/null +++ b/build/tasks/installer-windows-task.js @@ -0,0 +1,29 @@ +const path = require('path'); + +module.exports = (grunt) => { + const appPackageJSON = grunt.config('appJSON'); + + grunt.config.merge({ + 'create-windows-installer': { + ia32: { + usePackageJson: false, + outputDirectory: path.join(grunt.config('appDir'), 'dist'), + appDirectory: path.join(grunt.config('appDir'), 'dist', 'nylas-win32-ia32'), + loadingGif: path.join(grunt.config('appDir'), 'build', 'resources', 'win', 'loading.gif'), + iconUrl: 'http://edgehill.s3.amazonaws.com/static/nylas.ico', + certificateFile: process.env.CERTIFICATE_FILE, + certificatePassword: process.env.WINDOWS_CODESIGN_KEY_PASSWORD, + description: appPackageJSON.description, + version: appPackageJSON.version, + title: appPackageJSON.productName, + authors: 'Nylas Inc.', + setupIcon: path.join(grunt.config('appDir'), 'build', 'resources', 'win', 'nylas.ico'), + setupExe: 'NylasMailSetup.exe', + exe: 'nylas.exe', + name: 'Nylas', + }, + }, + }); + + grunt.loadNpmTasks('grunt-electron-installer'); +} diff --git a/build/tasks/lesslint-task.js b/build/tasks/lesslint-task.js new file mode 100644 index 0000000000..26aae5ae71 --- /dev/null +++ b/build/tasks/lesslint-task.js @@ -0,0 +1,20 @@ +module.exports = (grunt) => { + grunt.config.merge({ + lesslint: { + src: [ + 'internal_packages/**/*.less', + 'dot-nylas/**/*.less', + 'static/**/*.less', + ], + options: { + less: { + paths: ['static', 'static/variables/'], + }, + imports: ['static/variables/*.less'], + }, + }, + }); + + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-lesslint'); +} diff --git a/build/tasks/license-overrides.coffee b/build/tasks/license-overrides.coffee deleted file mode 100644 index b32ebb5458..0000000000 --- a/build/tasks/license-overrides.coffee +++ /dev/null @@ -1,84 +0,0 @@ -module.exports = - 'aws-sign@0.3.0': - repository: 'https://github.com/mikeal/aws-sign' - license: 'MIT' - source: 'index.js' - sourceText: """ - /*! - * knox - auth - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - - """ - 'bufferjs@2.0.0': - repository: 'https://github.com/coolaj86/node-bufferjs' - license: 'MIT' - source: 'LICENSE.MIT' - sourceText: """ - Copyright (c) 2010 AJ ONeal (and Contributors) - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - """ - 'buffers@0.1.1': - repository: "http://github.com/substack/node-buffers" - license: 'MIT' - source: 'README.markdown' - sourceText: """ - - license - ======= - - MIT/X11 - """ - 'cheerio@0.15.0': - repository: "https://github.com/cheeriojs/cheerio" - license: 'MIT' - source: 'https://github.com/cheeriojs/cheerio/blob/master/package.json' - 'specificity@0.1.3': - repository: 'https://github.com/keeganstreet/specificity' - license: 'MIT' - source: 'package.json in repository' - - 'promzard@0.2.0': - license: 'ISC' - source: 'LICENSE in the repository' - sourceText: """ - The ISC License - - Copyright (c) Isaac Z. Schlueter - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR - IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - """ - - 'jschardet@1.1.0': - license: 'LGPL' - source: 'README.md in the repository' - sourceText: """ - JsChardet - ========= - - Port of python's chardet (http://chardet.feedparser.org/). - - License - ------- - - LGPL - """ - 'core-js@0.4.10': - license: 'MIT' - source: 'http://rock.mit-license.org linked in source files and bower.json says MIT' diff --git a/build/tasks/mkdeb-task.coffee b/build/tasks/mkdeb-task.coffee deleted file mode 100644 index 0d335e1f89..0000000000 --- a/build/tasks/mkdeb-task.coffee +++ /dev/null @@ -1,52 +0,0 @@ -fs = require 'fs' -path = require 'path' -_ = require 'underscore-plus' - -module.exports = (grunt) -> - {spawn} = require('./task-helpers')(grunt) - - fillTemplate = (filePath, data) -> - template = _.template(String(fs.readFileSync("#{filePath}.in"))) - filled = template(data) - - outputPath = path.join(grunt.config.get('atom.buildDir'), path.basename(filePath)) - grunt.file.write(outputPath, filled) - outputPath - - getInstalledSize = (buildDir, callback) -> - cmd = 'du' - args = ['-sk', path.join(buildDir, 'Edgehill')] - spawn {cmd, args}, (error, {stdout}) -> - installedSize = stdout.split(/\s+/)?[0] or '200000' # default to 200MB - callback(null, installedSize) - - grunt.registerTask 'mkdeb', 'Create debian package', -> - done = @async() - buildDir = grunt.config.get('atom.buildDir') - - if process.arch is 'ia32' - arch = 'i386' - else if process.arch is 'x64' - arch = 'amd64' - else - return done("Unsupported arch #{process.arch}") - - {name, version, description} = grunt.file.readJSON('package.json') - section = 'devel' - maintainer = 'InboxApp ' - installDir = '/usr' - iconName = 'edgehill' - getInstalledSize buildDir, (error, installedSize) -> - data = {name, version, description, section, arch, maintainer, installDir, iconName, installedSize} - controlFilePath = fillTemplate(path.join('resources', 'linux', 'debian', 'control'), data) - desktopFilePath = fillTemplate(path.join('resources', 'linux', 'edgehill.desktop'), data) - icon = path.join('resources', 'edgehill.png') - - cmd = path.join('script', 'mkdeb') - args = [version, arch, controlFilePath, desktopFilePath, icon, buildDir] - spawn {cmd, args}, (error) -> - if error? - done(error) - else - grunt.log.ok "Created #{buildDir}/edgehill-#{version}-#{arch}.deb" - done() diff --git a/build/tasks/mkdmg-task.coffee b/build/tasks/mkdmg-task.coffee deleted file mode 100644 index 59b3a9c6ac..0000000000 --- a/build/tasks/mkdmg-task.coffee +++ /dev/null @@ -1,59 +0,0 @@ -fs = require 'fs' -path = require 'path' -_ = require 'underscore-plus' -Promise = require("bluebird") - -module.exports = (grunt) -> - {spawn, rm} = require('./task-helpers')(grunt) - - appName = -> grunt.config.get('atom.appName') - dmgName = -> "#{appName().split('.')[0]}.dmg" - buildDir = -> grunt.config.get('atom.buildDir') - dmgPath = -> path.join(buildDir(), dmgName()) - appDir = -> path.join(buildDir(), grunt.config.get('atom.appName')) - - getDmgExecutable = -> - new Promise (resolve, reject) -> - dmgMakerRepo = "yoursway-create-dmg" - dmgExecutable = path.join(dmgMakerRepo, "create-dmg") - if fs.existsSync(dmgExecutable) then resolve(dmgExecutable) - else - console.log("---> Downloading yoursway-create-dmg") - spawn - cmd: "git" - args: ["clone", "https://github.com/andreyvit/#{dmgMakerRepo}"] - , (error, results, exitCode) -> - if exitCode is 0 then resolve(dmgExecutable) else reject(error) - - removeOldDmg = (dmgExecutable) -> - if fs.existsSync(dmgPath()) then rm dmgPath() - - executeDmgMaker = (dmgExecutable) -> - new Promise (resolve, reject) -> - console.log("---> Bulding Edgehill DMG") - spawn - cmd: dmgExecutable - args: [ - "--volname", "Edgehill Installer", - "--volicon", path.join("resources", "edgehill.png"), - "--window-pos", "200", "120", - "--window-size", "800", "400", - "--icon-size", "100", - "--icon", appName(), "200", "190", - "--hide-extension", appName(), - "--app-drop-link", "600", "185", - dmgPath() - appDir(), - ] - , (error, results, exitCode) -> - if exitCode is 0 then resolve() else reject(error) - - grunt.registerTask 'mkdmg', 'Create Mac DMG', -> - done = @async() - removeOldDmg() - getDmgExecutable() - .then(executeDmgMaker) - .then(done) - .catch (error) -> - console.error(error) - done() diff --git a/build/tasks/mkrpm-task.coffee b/build/tasks/mkrpm-task.coffee deleted file mode 100644 index 4b5b7a5ce7..0000000000 --- a/build/tasks/mkrpm-task.coffee +++ /dev/null @@ -1,48 +0,0 @@ -fs = require 'fs' -path = require 'path' -_ = require 'underscore-plus' - -module.exports = (grunt) -> - {spawn, rm, mkdir} = require('./task-helpers')(grunt) - - fillTemplate = (filePath, data) -> - template = _.template(String(fs.readFileSync("#{filePath}.in"))) - filled = template(data) - - outputPath = path.join(grunt.config.get('atom.buildDir'), path.basename(filePath)) - grunt.file.write(outputPath, filled) - outputPath - - grunt.registerTask 'mkrpm', 'Create rpm package', -> - done = @async() - - if process.arch is 'ia32' - arch = 'i386' - else if process.arch is 'x64' - arch = 'amd64' - else - return done("Unsupported arch #{process.arch}") - - {name, version, description} = grunt.file.readJSON('package.json') - buildDir = grunt.config.get('atom.buildDir') - - rpmDir = path.join(buildDir, 'rpm') - rm rpmDir - mkdir rpmDir - - installDir = grunt.config.get('atom.installDir') - shareDir = path.join(installDir, 'share', 'edgehill') - iconName = path.join(shareDir, 'resources', 'app', 'resources', 'edgehill.png') - - data = {name, version, description, installDir, iconName} - specFilePath = fillTemplate(path.join('resources', 'linux', 'redhat', 'edgehill.spec'), data) - desktopFilePath = fillTemplate(path.join('resources', 'linux', 'edgehill.desktop'), data) - - cmd = path.join('script', 'mkrpm') - args = [specFilePath, desktopFilePath, buildDir] - spawn {cmd, args}, (error) -> - if error? - done(error) - else - grunt.log.ok "Created rpm package in #{rpmDir}" - done() diff --git a/build/tasks/nof-task.coffee b/build/tasks/nof-task.coffee deleted file mode 100644 index 6eb7623dd2..0000000000 --- a/build/tasks/nof-task.coffee +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = (grunt) -> - {spawn} = require('./task-helpers')(grunt) - - grunt.registerTask 'nof', 'Un-focus all specs', -> - nof = require.resolve('.bin/nof') - spawn({cmd: nof, args: ['spec']}, @async()) diff --git a/build/tasks/nylaslint-task.js b/build/tasks/nylaslint-task.js new file mode 100644 index 0000000000..ad68088909 --- /dev/null +++ b/build/tasks/nylaslint-task.js @@ -0,0 +1,189 @@ +/* eslint no-cond-assign: 0 */ +const path = require('path'); +const fs = require('fs-plus'); + +function normalizeRequirePath(requirePath, fPath) { + if (requirePath[0] === ".") { + return path.normalize(path.join(path.dirname(fPath), requirePath)); + } + return requirePath; +} + + +module.exports = (grunt) => { + grunt.config.merge({ + nylaslint: { + src: grunt.config('source:coffeescript').concat(grunt.config('source:es6')), + }, + }); + + grunt.registerMultiTask('nylaslint', 'Check requires for file extensions compiled away', function nylaslint() { + const done = this.async(); + + // Enable once path errors are fixed. + if (process.platform === 'win32') { + done(); + return; + } + + const extensionRegex = /require ['"].*\.(coffee|cjsx|jsx|es6|es)['"]/i; + + for (const fileset of this.files) { + grunt.log.writeln(`Nylinting ${fileset.src.length} files.`); + + const esExtensions = { + ".es6": true, + ".es": true, + ".jsx": true, + }; + + const errors = []; + + const esExport = {}; + const esNoExport = {}; + const esExportDefault = {}; + + // Temp TODO. Fix spec files + for (const f of fileset.src) { + if (!esExtensions[path.extname(f)]) { continue; } + if (!/-spec/.test(f)) { continue; } + + const content = fs.readFileSync(f, {encoding: 'utf8'}); + + // https://regex101.com/r/rQ3eD0/1 + // Matches only the first describe block + const describeRe = /[\n]describe\(['"](.*?)['"], ?\(\) ?=> ?/m; + if (describeRe.test(content)) { + errors.push(`${f}: Spec has to start with function`); + } + } + + // NOTE: Comment me in if you want to fix these files. + // _str = require('underscore.string') + // replacer = (match, describeName) -> + // fnName = _str.camelize(describeName, true) + // return "\ndescribe('#{describeName}', function #{fnName}() " + // newContent = content.replace(describeRe, replacer) + // fs.writeFileSync(f, newContent, encoding:'utf8') + + // Build the list of ES6 files that export things and categorize + for (const f of fileset.src) { + if (!esExtensions[path.extname(f)]) { continue; } + const lookupPath = `${path.dirname(f)}/${path.basename(f, path.extname(f))}`; + const content = fs.readFileSync(f, {encoding: 'utf8'}); + + if (/module.exports\s?=\s?.+/gmi.test(content)) { + if (!f.endsWith('nylas-exports.es6')) { + errors.push(`${f}: Don't use module.exports in ES6`); + } + } + + if (/^export/gmi.test(content)) { + if (/^export default/gmi.test(content)) { + esExportDefault[lookupPath] = true; + } else { + esExport[lookupPath] = true; + } + } else { + esNoExport[lookupPath] = true; + } + } + + // Now look again through all ES6 files, this time to check imports + // instead of exports. + for (const f of fileset.src) { + let result = null; + if (!esExtensions[path.extname(f)]) { + continue; + } + const content = fs.readFileSync(f, {encoding: 'utf8'}); + const importRe = /import \{.*\} from ['"](.*?)['"]/gmi; + + while (result = importRe.exec(content)) { + for (const requirePath of result.slice(1)) { + const lookupPath = normalizeRequirePath(requirePath, f); + if (esExportDefault[lookupPath] || esNoExport[lookupPath]) { + errors.push(`${f}: Don't destructure default export ${requirePath}`); + } + } + } + } + + // Now look through all coffeescript files + // If they require things from ES6 files, ensure they're using the + // proper syntax. + for (const f of fileset.src) { + let result = null; + if (esExtensions[path.extname(f)]) { + continue; + } + const content = fs.readFileSync(f, {encoding: 'utf8'}); + if (extensionRegex.test(content)) { + errors.push(`${f}: Remove extensions when requiring files`); + } + + const requireRe = /require[ (]['"]([\w_./-]*?)['"]/gmi; + + while (result = requireRe.exec(content)) { + for (const requirePath of result.slice(1)) { + const lookupPath = normalizeRequirePath(requirePath, f); + + const baseRequirePath = path.basename(requirePath); + + const plainRequireRe = new RegExp(`require[ (]['"].*${baseRequirePath}['"]\\)?$`, "gm"); + const defaultRequireRe = new RegExp(`require\\(['"].*${baseRequirePath}['"]\\)\\.default`, "gm"); + + if (esExport[lookupPath]) { + if (!plainRequireRe.test(content)) { + errors.push(`${f}: No \`default\` exported ${requirePath}`); + } + } else if (esNoExport[lookupPath]) { + errors.push(`${f}: Nothing exported from ${requirePath}`); + } else if (esExportDefault[lookupPath]) { + if (!defaultRequireRe.test(content)) { + errors.push(`${f}: Add \`default\` to require ${requirePath}`); + } + } else { + // must be a coffeescript or core file + if (defaultRequireRe.test(content)) { + errors.push(`${f}: Don't ask for \`default\` from ${requirePath}`); + } + } + } + } + } + + if (errors.length > 0) { + for (const err of errors) { grunt.log.error(err); } + const error = ` + Please fix the #{errors.length} linter errors above. These are the issues we're looking for: + + ISSUES WITH COFFEESCRIPT FILES: + + 1. Remove extensions when requiring files: + Since we compile files in production to plain ".js" files it's very important you do NOT include the file extension when "require"ing a file. + + 2. Add "default" to require: + As of Babel 6, "require" no longer returns whatever the "default" value is. If you are "require"ing an es6 file from a coffeescript file, you must explicitly request the "default" property. For example: do "require('./my-es6-file').default" + + 3. Don't ask for "default": + If you're requiring a coffeescript file from a coffeescript file, you will almost never need to load a "default" object. This is likely an indication you incorrectly thought you were importing an ES6 file. + + ISSUES WITH ES6 FILES: + + 4. Don't use module.exports in ES6: + You sholudn't manually assign module.exports anymore. Use proper ES6 module syntax like "export default" or "export const FOO". + + 5. Don't destructure default export: + If you're using "import {FOO} from './bar'" in ES6 files, it's important that "./bar" does NOT export a "default". Instead, in './bar', do "export const FOO = 'foo'" + + 6. Spec has to start with function + Top-level "describe" blocks can no longer use the "() => {}" function syntax. This will incorrectly bind "this" to the "window" object instead of the jasmine object. The top-level "describe" block must use the "function describeName() {}" syntax + `; + done(new Error(error)); + } + } + + done(null); + }); +} diff --git a/build/tasks/output-build-filetypes.coffee b/build/tasks/output-build-filetypes.coffee deleted file mode 100644 index 64b952bbe4..0000000000 --- a/build/tasks/output-build-filetypes.coffee +++ /dev/null @@ -1,21 +0,0 @@ -path = require 'path' - -module.exports = (grunt) -> - grunt.registerTask 'output-build-filetypes', 'Log counts for each filetype in the built application', -> - shellAppDir = grunt.config.get('atom.shellAppDir') - - types = {} - grunt.file.recurse shellAppDir, (absolutePath, rootPath, relativePath, fileName) -> - extension = path.extname(fileName) or fileName - types[extension] ?= 0 - types[extension]++ - - extensions = Object.keys(types).sort (extension1, extension2) -> - diff = types[extension2] - types[extension1] - if diff is 0 - extension1.toLowerCase().localeCompare(extension2.toLowerCase()) - else - diff - - extensions.forEach (extension) -> - grunt.log.error "#{extension}: #{types[extension]}" diff --git a/build/tasks/output-disk-space.coffee b/build/tasks/output-disk-space.coffee deleted file mode 100644 index 372ead6721..0000000000 --- a/build/tasks/output-disk-space.coffee +++ /dev/null @@ -1,25 +0,0 @@ -module.exports = (grunt) -> - {spawn} = require('./task-helpers')(grunt) - - grunt.registerTask 'output-disk-space', 'Print diskspace available', -> - return unless process.platform is 'darwin' - - done = @async() - - cmd = 'df' - args = ['-Hl'] - spawn {cmd, args}, (error, result, code) -> - return done(error) if error? - - lines = result.stdout.split("\n") - - for line in lines[1..] - [filesystem, size, used, avail, capacity, extra] = line.split(/\s+/) - capacity = parseInt(capacity) - - if capacity > 90 - grunt.log.error("#{filesystem} is at #{capacity}% capacity!") - else if capacity > 80 - grunt.log.ok("#{filesystem} is at #{capacity}% capacity.") - - done() diff --git a/build/tasks/output-long-paths-task.coffee b/build/tasks/output-long-paths-task.coffee deleted file mode 100644 index ce84d663b4..0000000000 --- a/build/tasks/output-long-paths-task.coffee +++ /dev/null @@ -1,18 +0,0 @@ -path = require 'path' - -module.exports = (grunt) -> - grunt.registerTask 'output-long-paths', 'Log long paths in the built application', -> - shellAppDir = grunt.config.get('atom.shellAppDir') - - longPaths = [] - grunt.file.recurse shellAppDir, (absolutePath, rootPath, relativePath, fileName) -> - if relativePath - fullPath = path.join(relativePath, fileName) - else - fullPath = fileName - longPaths.push(fullPath) if fullPath.length >= 175 - - longPaths.sort (longPath1, longPath2) -> longPath2.length - longPath1.length - - longPaths.forEach (longPath) -> - grunt.log.error "#{longPath.length} character path: #{longPath}" diff --git a/build/tasks/package-task.js b/build/tasks/package-task.js new file mode 100644 index 0000000000..6ea6f5b403 --- /dev/null +++ b/build/tasks/package-task.js @@ -0,0 +1,283 @@ +/* eslint global-require: 0 *//* eslint prefer-template: 0 */ +/* eslint quote-props: 0 */ +const packager = require('electron-packager'); +const path = require('path'); +const util = require('util'); +const tmpdir = path.resolve(require('os').tmpdir(), 'nylas-build'); +const fs = require('fs-plus'); +const coffeereact = require('coffee-react'); +const glob = require('glob'); +const babel = require('babel-core'); + +const packageJSON = require('../../package.json') +const babelOptions = require("../../static/babelrc"); + +module.exports = (grunt) => { + function runCopyAPM(buildPath, electronVersion, platform, arch, callback) { + // Move APM up out of the /app folder which will be inside the ASAR + const apmTargetDir = path.resolve(buildPath, '..', 'apm'); + fs.moveSync(path.join(buildPath, 'apm'), apmTargetDir) + + // Move /apm/node_modules/atom-package-manager up a level. We're + // essentially pulling the atom-package-manager module up outside of + // the node_modules folder, which is necessary because npmV3 installs + // nested dependencies in the same dir. + const apmPackageDir = path.join(apmTargetDir, 'node_modules', 'atom-package-manager') + for (const name of fs.readdirSync(apmPackageDir)) { + fs.renameSync(path.join(apmPackageDir, name), path.join(apmTargetDir, name)); + } + + const apmSymlink = path.join(apmTargetDir, 'node_modules', '.bin', 'apm'); + if (fs.existsSync(apmSymlink)) { + fs.unlinkSync(apmSymlink); + } + fs.rmdirSync(apmPackageDir); + callback(); + } + + function runCopyPlatformSpecificResources(buildPath, electronVersion, platform, arch, callback) { + // these files (like nylas-mailto-default.reg) go alongside the ASAR, + // not inside it, so we need to move out of the `app` directory. + const resourcesDir = path.resolve(buildPath, '..'); + if (platform === 'win32') { + fs.copySync(path.resolve(grunt.config('appDir'), 'build', 'resources', 'win'), resourcesDir); + } + callback(); + } + + function runCopySymlinkedPackages(buildPath, electronVersion, platform, arch, callback) { + console.log("---> Moving symlinked node modules / internal packages into build folder.") + + const dirs = [ + path.join(buildPath, 'internal_packages'), + path.join(buildPath, 'node_modules'), + ]; + + dirs.forEach((dir) => { + fs.readdirSync(dir).forEach((packageName) => { + const packagePath = path.join(dir, packageName) + const realPackagePath = fs.realpathSync(packagePath).replace('/private/', '/') + if (realPackagePath !== packagePath) { + console.log(` ---> Copying ${realPackagePath} to ${packagePath}`); + fs.removeSync(packagePath); + fs.copySync(realPackagePath, packagePath); + } + }); + }); + + callback(); + } + + /** + * We don't need the K2 folder anymore since the previous step hard + * copied the local-sync package (and its isomorphic-core dependency) + * into /internal_packages. The remains of the folder are N1-Cloud + * pieces that aren't necessary + */ + function removeUnnecessaryFiles(buildPath, electronVersion, platform, arch, callback) { + fs.removeSync(path.join(buildPath, 'src', 'K2')) + callback(); + } + + function runTranspilers(buildPath, electronVersion, platform, arch, callback) { + console.log("---> Running babel and coffeescript transpilers") + + grunt.config('source:coffeescript').forEach(pattern => { + glob.sync(pattern, {cwd: buildPath, absolute: true}).forEach((coffeepath) => { + if (/(node_modules|\.js$)/.test(coffeepath)) return + console.log(` ---> Compiling ${coffeepath.slice(coffeepath.indexOf("/app") + 4)}`) + const outPath = coffeepath.replace(path.extname(coffeepath), '.js'); + const res = coffeereact.compile(grunt.file.read(coffeepath), { + bare: false, + join: false, + separator: grunt.util.normalizelf(grunt.util.linefeed), + + sourceMap: true, + sourceRoot: '/', + generatedFile: path.basename(outPath), + sourceFiles: [path.relative(buildPath, coffeepath)], + }); + grunt.file.write(outPath, `${res.js}\n//# sourceMappingURL=${path.basename(outPath)}.map\n`); + grunt.file.write(`${outPath}.map`, res.v3SourceMap); + fs.unlinkSync(coffeepath); + }); + }); + + grunt.config('source:es6').forEach(pattern => { + glob.sync(pattern, {cwd: buildPath, absolute: true}).forEach((es6Path) => { + if (/(node_modules|\.js$)/.test(es6Path)) return + const outPath = es6Path.replace(path.extname(es6Path), '.js'); + console.log(` ---> Compiling ${es6Path.slice(es6Path.indexOf("/app") + 4)}`) + const res = babel.transformFileSync(es6Path, Object.assign(babelOptions, { + sourceMaps: true, + sourceRoot: '/', + sourceMapTarget: path.relative(buildPath, outPath), + sourceFileName: path.relative(buildPath, es6Path), + })); + grunt.file.write(outPath, `${res.code}\n//# sourceMappingURL=${path.basename(outPath)}.map\n`); + grunt.file.write(`${outPath}.map`, JSON.stringify(res.map)); + fs.unlinkSync(es6Path); + }); + }); + + callback(); + } + + const platform = grunt.option('platform'); + const {shouldPublishBuild} = require('./task-helpers')(grunt); + + // See: https://github.com/electron-userland/electron-packager/blob/master/usage.txt + grunt.config.merge({ + 'packager': { + 'app-version': packageJSON.version, + 'platform': platform, + 'protocols': [{ + name: "Nylas Protocol", + schemes: ["nylas"], + }, { + name: "Mailto Protocol", + schemes: ["mailto"], + }], + 'dir': grunt.config('appDir'), + 'app-category-type': "public.app-category.business", + 'tmpdir': tmpdir, + 'arch': { + 'win32': 'ia32', + }[platform], + 'icon': { + darwin: path.resolve(grunt.config('appDir'), 'build', 'resources', 'mac', 'nylas.icns'), + win32: path.resolve(grunt.config('appDir'), 'build', 'resources', 'win', 'nylas.ico'), + linux: undefined, + }[platform], + 'name': { + darwin: 'Nylas Mail', + win32: 'nylas', + linux: 'nylas', + }[platform], + 'app-copyright': `Copyright (C) 2014-${new Date().getFullYear()} Nylas, Inc. All rights reserved.`, + 'derefSymlinks': false, + 'asar': { + 'unpack': "{" + [ + '*.node', + '**/vendor/**', + 'examples/**', + '**/src/tasks/**', + '**/node_modules/spellchecker/**', + '**/node_modules/windows-shortcuts/**', + ].join(',') + "}", + }, + 'ignore': [ + // top level dirs we never want + '^[\\/]+arclib', + '^[\\/]+build', + '^[\\/]+electron', + '^[\\/]+flow-typed', + '^[\\/]+spec_integration', + + // general dirs we never want + '[\\/]+gh-pages$', + '[\\/]+docs$', + '[\\/]+obj[\\/]+gen', + '[\\/]+\\.deps$', + + // specific files we never want + '\\.DS_Store$', + '\\.jshintrc$', + '\\.npmignore$', + '\\.pairs$', + '\\.travis\\.yml$', + 'appveyor\\.yml$', + '\\.idea$', + '\\.editorconfig$', + '\\.lint$', + '\\.lintignore$', + '\\.arcconfig$', + '\\.arclint$', + '\\.flowconfig$', + '\\.jshintignore$', + '\\.gitattributes$', + '\\.gitkeep$', + '\\.pdb$', + '\\.cc$', + '\\.h$', + '\\.d\\.ts$', + '\\.js\\.flow$', + '\\.map$', + 'binding\\.gyp$', + 'target\\.mk$', + '\\.node\\.dYSM$', + 'autoconf-\\d*\\.tar\\.gz$', + + // specific (large) module bits we know we don't need + 'node_modules[\\/]+less[\\/]+dist$', + 'node_modules[\\/]+react[\\/]+dist$', + 'node_modules[\\/].*[\\/]tests?$', + 'node_modules[\\/].*[\\/]coverage$', + 'node_modules[\\/].*[\\/]benchmark$', + '@paulbetts[\\/]+cld[\\/]+deps[\\/]+cld', + ], + 'out': grunt.config('outputDir'), + 'overwrite': true, + 'prune': true, + /** + * This will automatically look for the identity in the keychain. It + * runs the `security find-identity` command. Note that TRAVIS needs + * us to setup the keychain first and install the identity. We do + * this in the setup-travis-keychain-task + */ + 'osx-sign': shouldPublishBuild(), + 'win32metadata': { + CompanyName: 'Nylas, Inc.', + FileDescription: 'The best email app for people and teams at work', + LegalCopyright: `Copyright (C) 2014-${new Date().getFullYear()} Nylas, Inc. All rights reserved.`, + ProductName: 'Nylas Mail', + }, + // NOTE: The following plist keys can NOT be set in the + // nylas-Info.plist since they are manually overridden by + // electron-packager based on this config file: + // + // CFBundleDisplayName: 'name', + // CFBundleExecutable: 'name', + // CFBundleIdentifier: 'app-bundle-id', + // CFBundleName: 'name' + // + // See https://github.com/electron-userland/electron-packager/blob/master/mac.js#L50 + // + // Our own nylas-Info.plist gets extended on top of the + // Electron.app/Contents/Info.plist. A majority of the defaults are + // left in the Electron Info.plist file + 'extend-info': path.resolve(grunt.config('appDir'), 'build', 'resources', 'mac', 'nylas-Info.plist'), + 'app-bundle-id': "com.nylas.nylas-mail", + 'afterCopy': [ + runCopyPlatformSpecificResources, + runCopyAPM, + runCopySymlinkedPackages, + removeUnnecessaryFiles, + runTranspilers, + ], + }, + }) + + grunt.registerTask('packager', 'Package build of Nylas Mail', function pack() { + const done = this.async(); + + console.log('---> Running build with options:'); + console.log(util.inspect(grunt.config.get('packager'), true, 7, true)); + + let time = 1; + const ongoing = setInterval(() => { + console.log(`---> Packaging for ${time}s`); + time += 1; + }, 1000) + + packager(grunt.config.get('packager'), (err, appPaths) => { + clearInterval(ongoing) + if (err) { + grunt.fail.fatal(err); + return done(err); + } + console.log(`---> Done Successfully. Built into: ${appPaths}`); + return done(); + }); + }); +}; diff --git a/build/tasks/prebuild-less-task.coffee b/build/tasks/prebuild-less-task.coffee deleted file mode 100644 index 54672fed85..0000000000 --- a/build/tasks/prebuild-less-task.coffee +++ /dev/null @@ -1,52 +0,0 @@ -path = require 'path' -fs = require 'fs' - -LessCache = require 'less-cache' - -module.exports = (grunt) -> - grunt.registerMultiTask 'prebuild-less', 'Prebuild cached of compiled LESS files', -> - prebuiltConfigurations = [ - ['inbox-light-ui'] - ] - - directory = path.join(grunt.config.get('atom.appDir'), 'less-compile-cache') - - for configuration in prebuiltConfigurations - importPaths = grunt.config.get('less.options.paths') - themeMains = [] - for theme in configuration - # TODO Use AtomPackage class once it runs outside of an Atom context - themePath = path.resolve('node_modules', theme) - if fs.existsSync(themePath) is false - themePath = path.resolve('internal_packages', theme) - - if fs.existsSync(path.join(themePath, 'stylesheets')) - stylesheetsDir = path.join(themePath, 'stylesheets') - else - stylesheetsDir = path.join(themePath, 'styles') - {main} = grunt.file.readJSON(path.join(themePath, 'package.json')) - main ?= 'index.less' - mainPath = path.join(themePath, main) - themeMains.push(mainPath) if grunt.file.isFile(mainPath) - importPaths.unshift(stylesheetsDir) if grunt.file.isDir(stylesheetsDir) - - grunt.verbose.writeln("Building LESS cache for #{configuration.join(', ').yellow}") - lessCache = new LessCache - cacheDir: directory - resourcePath: path.resolve('.') - importPaths: importPaths - - cssForFile = (file) -> - baseVarImports = """ - @import "variables/ui-variables"; - """ - less = fs.readFileSync(file, 'utf8') - lessCache.cssForFile(file, [baseVarImports, less].join('\n')) - - for file in @filesSrc - grunt.verbose.writeln("File #{file.cyan} created in cache.") - cssForFile(file) - - for file in themeMains - grunt.verbose.writeln("File #{file.cyan} created in cache.") - cssForFile(file) diff --git a/build/tasks/publish-build-task.coffee b/build/tasks/publish-build-task.coffee deleted file mode 100644 index c8c2c18faa..0000000000 --- a/build/tasks/publish-build-task.coffee +++ /dev/null @@ -1,200 +0,0 @@ -child_process = require 'child_process' -path = require 'path' - -_ = require 'underscore-plus' -async = require 'async' -fs = require 'fs-plus' -GitHub = require 'github-releases' -request = require 'request' - -grunt = null - -commitSha = process.env.JANKY_SHA1 -token = process.env.EDGEHILL_ACCESS_TOKEN -defaultHeaders = - Authorization: "token #{token}" - 'User-Agent': 'Edgehill' - -module.exports = (gruntObject) -> - grunt = gruntObject - {cp} = require('./task-helpers')(grunt) - - grunt.registerTask 'publish-build', 'Publish the built app', -> - tasks = [] - tasks.push('build-docs', 'prepare-docs') if process.platform is 'darwin' - tasks.push('upload-assets') if process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'master' - grunt.task.run(tasks) - - grunt.registerTask 'prepare-docs', 'Move api.json to edgehill-api.json', -> - docsOutputDir = grunt.config.get('docsOutputDir') - buildDir = grunt.config.get('atom.buildDir') - cp path.join(docsOutputDir, 'api.json'), path.join(buildDir, 'edgehill-api.json') - - grunt.registerTask 'upload-assets', 'Upload the assets to a GitHub release', -> - doneCallback = @async() - startTime = Date.now() - done = (args...) -> - elapsedTime = Math.round((Date.now() - startTime) / 100) / 10 - grunt.log.ok("Upload time: #{elapsedTime}s") - doneCallback(args...) - - unless token - return done(new Error('EDGEHILL_ACCESS_TOKEN environment variable not set')) - - buildDir = grunt.config.get('atom.buildDir') - assets = getAssets() - - zipAssets buildDir, assets, (error) -> - return done(error) if error? - getAtomDraftRelease (error, release) -> - return done(error) if error? - assetNames = (asset.assetName for asset in assets) - deleteExistingAssets release, assetNames, (error) -> - return done(error) if error? - uploadAssets(release, buildDir, assets, done) - -getAssets = -> - {cp} = require('./task-helpers')(grunt) - - {version} = grunt.file.readJSON('package.json') - buildDir = grunt.config.get('atom.buildDir') - - switch process.platform - when 'darwin' - [ - {assetName: 'edgehill-mac.zip', sourcePath: 'Edgehill.app'} - {assetName: 'edgehill-mac-symbols.zip', sourcePath: 'Atom.breakpad.syms'} - {assetName: 'edgehill-api.json', sourcePath: 'edgehill-api.json'} - ] - when 'win32' - assets = [{assetName: 'atom-windows.zip', sourcePath: 'Atom'}] - for squirrelAsset in ['AtomSetup.exe', 'RELEASES', "atom-#{version}-full.nupkg"] - cp path.join(buildDir, 'installer', squirrelAsset), path.join(buildDir, squirrelAsset) - assets.push({assetName: squirrelAsset, sourcePath: assetName}) - assets - when 'linux' - if process.arch is 'ia32' - arch = 'i386' - else - arch = 'amd64' - - # Check for a Debian build - sourcePath = "#{buildDir}/edgehill-#{version}-#{arch}.deb" - assetName = "edgehill-#{arch}.deb" - - # Check for a Fedora build - unless fs.isFileSync(sourcePath) - rpmName = fs.readdirSync("#{buildDir}/rpm")[0] - sourcePath = "#{buildDir}/rpm/#{rpmName}" - if process.arch is 'ia32' - arch = 'i386' - else - arch = 'x86_64' - assetName = "edgehill.#{arch}.rpm" - - cp sourcePath, path.join(buildDir, assetName) - - [ - {assetName, sourcePath} - ] - -logError = (message, error, details) -> - grunt.log.error(message) - grunt.log.error(error.message ? error) if error? - grunt.log.error(details) if details - -zipAssets = (buildDir, assets, callback) -> - zip = (directory, sourcePath, assetName, callback) -> - if process.platform is 'win32' - zipCommand = "C:/psmodules/7z.exe a -r #{assetName} #{sourcePath}" - else - zipCommand = "zip -r --symlinks #{assetName} #{sourcePath}" - options = {cwd: directory, maxBuffer: Infinity} - child_process.exec zipCommand, options, (error, stdout, stderr) -> - logError("Zipping #{sourcePath} failed", error, stderr) if error? - callback(error) - - tasks = [] - for {assetName, sourcePath} in assets when path.extname(assetName) is '.zip' - fs.removeSync(path.join(buildDir, assetName)) - tasks.push(zip.bind(this, buildDir, sourcePath, assetName)) - async.parallel(tasks, callback) - -getAtomDraftRelease = (callback) -> - atomRepo = new GitHub({repo: 'inboxapp/inboxapp', token}) - atomRepo.getReleases (error, releases=[]) -> - if error? - logError('Fetching inboxapp/edgehill releases failed', error, releases) - callback(error) - else - [firstDraft] = releases.filter ({draft}) -> draft - if firstDraft? - options = - uri: firstDraft.assets_url - method: 'GET' - headers: defaultHeaders - json: true - request options, (error, response, assets=[]) -> - if error? or response.statusCode isnt 200 - logError('Fetching draft release assets failed', error, assets) - callback(error ? new Error(response.statusCode)) - else - firstDraft.assets = assets - callback(null, firstDraft) - else - callback(new Error('No draft release in inboxapp/edgehill repo')) - -deleteRelease = (release) -> - options = - uri: release.url - method: 'DELETE' - headers: defaultHeaders - json: true - request options, (error, response, body='') -> - if error? or response.statusCode isnt 204 - logError('Deleting release failed', error, body) - -deleteExistingAssets = (release, assetNames, callback) -> - [callback, assetNames] = [assetNames, callback] if not callback? - - deleteAsset = (url, callback) -> - options = - uri: url - method: 'DELETE' - headers: defaultHeaders - request options, (error, response, body='') -> - if error? or response.statusCode isnt 204 - logError('Deleting existing release asset failed', error, body) - callback(error ? new Error(response.statusCode)) - else - callback() - - tasks = [] - for asset in release.assets when not assetNames? or asset.name in assetNames - tasks.push(deleteAsset.bind(this, asset.url)) - async.parallel(tasks, callback) - -uploadAssets = (release, buildDir, assets, callback) -> - upload = (release, assetName, assetPath, callback) -> - options = - uri: release.upload_url.replace(/\{.*$/, "?name=#{assetName}") - method: 'POST' - headers: _.extend({ - 'Content-Type': 'application/zip' - 'Content-Length': fs.getSizeSync(assetPath) - }, defaultHeaders) - - assetRequest = request options, (error, response, body='') -> - if error? or response.statusCode >= 400 - logError("Upload release asset #{assetName} failed", error, body) - callback(error ? new Error(response.statusCode)) - else - callback(null, release) - - fs.createReadStream(assetPath).pipe(assetRequest) - - tasks = [] - for {assetName} in assets - assetPath = path.join(buildDir, assetName) - tasks.push(upload.bind(this, release, assetName, assetPath)) - async.parallel(tasks, callback) diff --git a/build/tasks/publish-edgehill-build-task.coffee b/build/tasks/publish-edgehill-build-task.coffee deleted file mode 100644 index a5d1b29ffc..0000000000 --- a/build/tasks/publish-edgehill-build-task.coffee +++ /dev/null @@ -1,148 +0,0 @@ -_ = require 'underscore-plus' -s3 = require 's3' -fs = require 'fs' -path = require 'path' -request = require 'request' -Promise = require 'bluebird' - -module.exports = (grunt) -> - {cp, spawn, rm} = require('./task-helpers')(grunt) - - appName = -> grunt.config.get('atom.appName') - dmgName = -> "#{appName().split('.')[0]}.dmg" - zipName = -> "#{appName().split('.')[0]}.zip" - - defaultPublishPath = -> path.join(process.env.HOME, "Downloads") - - publishPath = -> - process.env.PUBLISH_PATH ? defaultPublishPath() - - postToSlack = (msg) -> - new Promise (resolve, reject) -> - url = "https://hooks.slack.com/services/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" - request.post - url: url - json: - username: "Edgehill Builds" - text: msg - , (err, httpResponse, body) -> - if err then reject(err) - else resolve() - - # Returns a properly bound s3obj - prepareS3 = -> - awsKey = process.env.AWS_ACCESS_KEY_ID ? "" - awsSecret = process.env.AWS_SECRET_ACCESS_KEY ? "" - - if awsKey.length is 0 - grunt.log.error "Please set the AWS_ACCESS_KEY_ID environment variable" - return false - if awsSecret.length is 0 - grunt.log.error "Please set the AWS_SECRET_ACCESS_KEY environment variable" - return false - - s3Client = s3.createClient - s3Options: - accessKeyId: process.env.AWS_ACCESS_KEY_ID - scretAccessKey: process.env.AWS_SECRET_ACCESS_KEY - - return s3Client - - uploadFile = (s3Client, localSource, destName) -> - grunt.log.writeln ">> Uploading #{localSource} to S3…" - - write = grunt.log.writeln - lastPc = 0 - - new Promise (resolve, reject) -> - uploader = s3Client.uploadFile - localFile: localSource - s3Params: - Key: destName - ACL: "public-read" - Bucket: "edgehill" - - uploader.on "error", (err) -> - reject(err) - uploader.on "progress", -> - pc = Math.round(uploader.progressAmount / uploader.progressTotal * 100.0) - if pc isnt lastPc - lastPc = pc - write(">> Uploading #{destName} #{pc}%") - uploader.on "end", (data) -> - resolve(data) - - getVersion = -> - {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) - return version - - uploadDMGToS3 = (s3Client) -> - destName = "Edgehill_#{getVersion()}.dmg" - dmgPath = path.join(grunt.config.get('atom.buildDir'), dmgName()) - new Promise (resolve, reject) -> - uploadFile(s3Client, dmgPath, destName) - .then (data) -> - grunt.log.ok "Uploaded DMG to #{data.Location}" - msg = "New Mac Edgehill build! <#{data.Location}|#{destName}>" - postToSlack(msg).then -> - resolve(data) - .catch(reject) - .catch(reject) - - uploadZipToS3 = (s3Client) -> - destName = "Edgehill_#{getVersion()}.zip" - buildDir = grunt.config.get('atom.buildDir') - - grunt.log.writeln ">> Creating zip file…" - new Promise (resolve, reject) -> - appToZip = path.join(buildDir, appName()) - zipPath = path.join(buildDir, zipName()) - - rm zipPath - - orig = process.cwd() - process.chdir(buildDir) - - spawn - cmd: "zip" - args: ["-9", "-y", "-r", zipName(), appName()] - , (error) -> - if error - process.chdir(orig) - reject(error) - return - - grunt.log.writeln ">> Created #{zipPath}" - grunt.log.writeln ">> Uploading…" - uploadFile(s3Client, zipPath, destName) - .then (data) -> - grunt.log.ok "Uploaded zip to #{data.Location}" - process.chdir(orig) - resolve(data) - .catch (err) -> - process.chdir(orig) - reject(err) - - grunt.registerTask "publish-edgehill-build", "Publish Edgehill build", -> - done = @async() - - dmgPath = path.join(grunt.config.get('atom.buildDir'), dmgName()) - - if not fs.existsSync dmgPath - grunt.log.error "DMG does not exist at #{dmgPath}. Run script/grunt build first." - cp dmgPath, path.join(publishPath(), dmgName()) - - grunt.log.ok "Copied DMG to #{publishPath()}" - if publishPath() is defaultPublishPath() - grunt.log.ok "Set the PUBLISH_PATH environment variable to change where Edgehill copies the built file to." - - s3Client = prepareS3() - - if s3Client - Promise.all([uploadDMGToS3(s3Client), uploadZipToS3(s3Client)]) - .then -> - done() - .catch (err) -> - grunt.log.error(err) - return false - else return false diff --git a/build/tasks/publish-task.js b/build/tasks/publish-task.js new file mode 100644 index 0000000000..9f1a91317c --- /dev/null +++ b/build/tasks/publish-task.js @@ -0,0 +1,181 @@ +/* eslint global-require: 0 */ +/* eslint import/no-dynamic-require: 0 */ +const s3 = require('s3'); +const request = require('request'); +const Promise = require('bluebird'); +const path = require('path'); +const fs = require('fs-plus'); + + +let s3Client = null; +let packageVersion = null; +let fullVersion = null; + +module.exports = (grunt) => { + const {spawn} = require('./task-helpers')(grunt); + + function populateVersion() { + return new Promise((resolve, reject) => { + const json = grunt.config.get('appJSON') + const cmd = 'git'; + const args = ['rev-parse', '--short', 'HEAD']; + spawn({cmd, args}, (error, {stdout} = {}) => { + if (error) { + return reject(); + } + const commitHash = stdout ? stdout.trim() : null; + packageVersion = json.version; + if (packageVersion.indexOf('-') > 0) { + fullVersion = packageVersion; + } else { + fullVersion = `${packageVersion}-${commitHash}`; + } + return resolve(); + }); + }); + } + + function postToSlack(msg) { + if (!process.env.NYLAS_INTERNAL_HOOK_URL) { + return Promise.resolve(); + } + return new Promise((resolve, reject) => + request.post({ + url: process.env.NYLAS_INTERNAL_HOOK_URL, + json: { + username: "Edgehill Builds", + text: msg, + }, + } + , (error) => { + return error ? reject(error) : resolve(); + }) + ); + } + + function put(localSource, destName, options = {}) { + grunt.log.writeln(`>> Uploading ${localSource} to S3…`); + + const write = grunt.log.writeln; + let lastPc = 0; + + const params = { + Key: destName, + ACL: "public-read", + Bucket: "edgehill", + }; + Object.assign(params, options); + + return new Promise((resolve, reject) => { + const uploader = s3Client.uploadFile({ + localFile: localSource, + s3Params: params, + }); + uploader.on("error", err => reject(err)); + uploader.on("progress", () => { + const pc = Math.round((uploader.progressAmount / uploader.progressTotal) * 100.0); + if (pc !== lastPc) { + lastPc = pc; + write(`>> Uploading ${destName} ${pc}%`); + return; + } + }); + uploader.on("end", data => resolve(data)); + }); + } + + function uploadToS3(filepath, key) { + grunt.log.writeln(`>> Uploading ${filepath} to ${key}…`); + return put(filepath, key).then((data) => { + const msg = `Nylas Mail release asset uploaded: <${data.Location}|${key}>`; + return postToSlack(msg).then(() => Promise.resolve(data)); + }); + } + + grunt.registerTask("publish", "Publish Nylas build", function publish() { + const done = this.async(); + + populateVersion() + .then(() => { + // find files to publish + const {shouldPublishBuild} = require('./task-helpers')(grunt); + const outputDir = grunt.config.get('outputDir'); + const uploads = []; + + if (process.platform === 'darwin') { + uploads.push({ + source: `${outputDir}/NylasMail.zip`, + key: `${fullVersion}/${process.platform}/${process.arch}/NylasMail.zip`, + }); + uploads.push({ + source: `${outputDir}/NylasMail.dmg`, + key: `${fullVersion}/${process.platform}/${process.arch}/NylasMail.dmg`, + }); + } else if (process.platform === 'win32') { + uploads.push({ + source: `${outputDir}/RELEASES`, + key: `${fullVersion}/${process.platform}/${process.arch}/RELEASES`, + }); + uploads.push({ + source: `${outputDir}/NylasMailSetup.exe`, + key: `${fullVersion}/${process.platform}/${process.arch}/NylasMailSetup.exe`, + }); + uploads.push({ + source: `${outputDir}/Nylas-${packageVersion}-full.nupkg`, + key: `${fullVersion}/${process.platform}/${process.arch}/nylas-${packageVersion}-full.nupkg`, + }); + } else if (process.platform === 'linux') { + const files = fs.readdirSync(outputDir); + for (const file of files) { + if (path.extname(file) === '.deb') { + uploads.push({ + source: `${outputDir}/${file}`, + key: `${fullVersion}/${process.platform}-deb/${process.arch}/NylasMail.deb`, + options: {ContentType: "application/x-deb"}, + }); + } + if (path.extname(file) === '.rpm') { + uploads.push({ + source: `${outputDir}/${file}`, + key: `${fullVersion}/${process.platform}-rpm/${process.arch}/NylasMail.rpm`, + options: {ContentType: "application/x-rpm"}, + }); + } + } + } else { + grunt.fail.fatal(`Unsupported platform: '${process.platform}'`); + } + + // configure environment + if (!shouldPublishBuild()) { + grunt.log.writeln(`>> Not publishing builds…`); + grunt.log.writeln(`>> Would have uploaded the following assets: ${JSON.stringify(uploads, null, 2)}`); + return Promise.resolve(); + } + const awsKey = process.env.AWS_ACCESS_KEY_ID != null ? process.env.AWS_ACCESS_KEY_ID : ""; + const awsSecret = process.env.AWS_SECRET_ACCESS_KEY != null ? process.env.AWS_SECRET_ACCESS_KEY : ""; + + if (awsKey.length === 0) { + grunt.fail.fatal("Please set the AWS_ACCESS_KEY_ID environment variable"); + } + if (awsSecret.length === 0) { + grunt.fail.fatal("Please set the AWS_SECRET_ACCESS_KEY environment variable"); + } + + s3Client = s3.createClient({ + s3Options: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID, + scretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, + }, + }); + + return Promise.all(uploads.map(({source, key, options}) => + uploadToS3(source, key, options)) + ) + .then(done) + }) + .catch((err) => { + grunt.fail.fatal(err) + }); + }); +} diff --git a/build/tasks/set-exe-icon-task.coffee b/build/tasks/set-exe-icon-task.coffee deleted file mode 100644 index f4e7b3bcbb..0000000000 --- a/build/tasks/set-exe-icon-task.coffee +++ /dev/null @@ -1,12 +0,0 @@ -path = require 'path' - -module.exports = (grunt) -> - grunt.registerTask 'set-exe-icon', 'Set icon of the exe', -> - done = @async() - - shellAppDir = grunt.config.get('atom.shellAppDir') - shellExePath = path.join(shellAppDir, 'edgehill.exe') - iconPath = path.resolve('resources', 'win', 'edgehill.ico') - - rcedit = require('rcedit') - rcedit(shellExePath, {'icon': iconPath}, done) diff --git a/build/tasks/set-version-task.coffee b/build/tasks/set-version-task.coffee deleted file mode 100644 index 676495e85d..0000000000 --- a/build/tasks/set-version-task.coffee +++ /dev/null @@ -1,56 +0,0 @@ -fs = require 'fs' -path = require 'path' - -module.exports = (grunt) -> - {spawn} = require('./task-helpers')(grunt) - - getVersion = (callback) -> - onBuildMachine = process.env.JANKY_SHA1 and process.env.JANKY_BRANCH is 'master' - inRepository = fs.existsSync(path.resolve(__dirname, '..', '..', '.git')) - {version} = require(path.join(grunt.config.get('atom.appDir'), 'package.json')) - if onBuildMachine or not inRepository - callback(null, version) - else - cmd = 'git' - args = ['rev-parse', '--short', 'HEAD'] - spawn {cmd, args}, (error, {stdout}={}, code) -> - commitHash = stdout?.trim?() - combinedVersion = "#{version}-#{commitHash}" - callback(error, combinedVersion) - - grunt.registerTask 'set-version', 'Set the version in the plist and package.json', -> - done = @async() - - getVersion (error, version) -> - if error? - done(error) - return - - appDir = grunt.config.get('atom.appDir') - - # Replace version field of package.json. - packageJsonPath = path.join(appDir, 'package.json') - packageJson = require(packageJsonPath) - packageJson.version = version - packageJsonString = JSON.stringify(packageJson) - fs.writeFileSync(packageJsonPath, packageJsonString) - - if process.platform is 'darwin' - cmd = 'script/set-version' - args = [grunt.config.get('atom.buildDir'), version] - spawn {cmd, args}, (error, result, code) -> done(error) - else if process.platform is 'win32' - shellAppDir = grunt.config.get('atom.shellAppDir') - shellExePath = path.join(shellAppDir, 'edgehill.exe') - - strings = - CompanyName: 'InboxApp, Inc.' - FileDescription: 'Edgehill' - LegalCopyright: 'Copyright (C) 2014 InboxApp, Inc. All rights reserved' - ProductName: 'Edgehill' - ProductVersion: version - - rcedit = require('rcedit') - rcedit(shellExePath, {'version-string': strings}, done) - else - done() diff --git a/build/tasks/setup-travis-keychain-task.js b/build/tasks/setup-travis-keychain-task.js new file mode 100644 index 0000000000..ad6ca5f24c --- /dev/null +++ b/build/tasks/setup-travis-keychain-task.js @@ -0,0 +1,114 @@ +/* eslint global-require: 0 */ +const path = require('path'); +const fs = require('fs-plus'); + +// Codesigning is a Mac-only process that requires a valid Apple +// certificate, the private key, and access to the Mac keychain. +// +// We can only codesign from keys in the keychain. At the end of the day +// we need the certificate and private key to exist in the keychain +// +// In the case of Travis, we need to setup a temp keychain from encrypted +// files in the repository. # We'll decrypt and import our certificates, +// put them in a temporary keychain, and use that. +// +// If you want to verify the app was signed you can run the commands: +// +// spctl -a -t exec -vv /path/to/N1.app +// +// Which should return "satisfies its Designated Requirement" +// +// And: +// +// codesign --verify --deep --verbose=2 /path/to/N1.app +// +// Which should return "accepted" +module.exports = (grunt) => { + let getCertData; + const {spawnP, shouldPublishBuild} = require('./task-helpers')(grunt); + const tmpKeychain = "n1-build.keychain"; + + const unlockKeychain = (keychain, keychainPass) => { + const args = ['unlock-keychain', '-p', keychainPass, keychain]; + return spawnP({cmd: "security", args}); + }; + + const cleanupKeychain = () => { + if (fs.existsSync(path.join(process.env.HOME, "Library", "Keychains", tmpKeychain))) { + return spawnP({cmd: "security", args: ["delete-keychain", tmpKeychain]}); + } + return Promise.resolve() + }; + + const buildTravisKeychain = () => { + const crypto = require('crypto'); + const tmpPass = crypto.randomBytes(32).toString('hex'); + const {appleCert, nylasCert, nylasPrivateKey, keyPass} = getCertData(); + const codesignBin = path.join("/", "usr", "bin", "codesign"); + + // Create a custom, temporary keychain + return cleanupKeychain() + .then(() => spawnP({cmd: "security", args: ["create-keychain", '-p', tmpPass, tmpKeychain]})) + + // Make the custom keychain default, so xcodebuild will use it for signing + .then(() => spawnP({cmd: "security", args: ["default-keychain", "-s", tmpKeychain]})) + + // Unlock the keychain + .then(() => unlockKeychain(tmpKeychain, tmpPass)) + + // Set keychain timeout to 1 hour for long builds + .then(() => spawnP({cmd: "security", args: ["set-keychain-settings", "-t", "3600", "-l", tmpKeychain]})) + + // Add certificates to keychain and allow codesign to access them + .then(() => spawnP({cmd: "security", args: ["import", appleCert, "-k", tmpKeychain, "-T", codesignBin]})) + + .then(() => spawnP({cmd: "security", args: ["import", nylasCert, "-k", tmpKeychain, "-T", codesignBin]})) + + // Load the password for the private key from environment variables + .then(() => spawnP({cmd: "security", args: ["import", nylasPrivateKey, "-k", tmpKeychain, "-P", keyPass, "-T", codesignBin]})); + }; + + getCertData = () => { + const certs = path.resolve(path.join('build', 'resources', 'certs')); + const appleCert = path.join(certs, 'AppleWWDRCA.cer'); + const nylasCert = path.join(certs, 'mac-nylas-n1.cer'); + const nylasPrivateKey = path.join(certs, 'mac-nylas-n1.p12'); + + const keyPass = process.env.APPLE_CODESIGN_KEY_PASSWORD; + + if (!keyPass) { + throw new Error("APPLE_CODESIGN_KEY_PASSWORD must be set"); + } + if (!fs.existsSync(appleCert)) { + throw new Error(`${appleCert} doesn't exist`); + } + if (!fs.existsSync(nylasCert)) { + throw new Error(`${nylasCert} doesn't exist`); + } + if (!fs.existsSync(nylasPrivateKey)) { + throw new Error(`${nylasPrivateKey} doesn't exist`); + } + + return {appleCert, nylasCert, nylasPrivateKey, keyPass}; + }; + + const shouldRun = () => { + if (process.platform !== 'darwin') { + grunt.log.writeln(`Skipping keychain setup since ${process.platform} is not darwin`); + return false + } + if (!process.env.TRAVIS) { + grunt.log.writeln(`Skipping keychain setup since TRAVIS env variable is not set`); + return false + } + if (!shouldPublishBuild()) { return false } + return true + } + + grunt.registerTask('setup-travis-keychain', 'Setup Travis Keychain to sign the app', function setupTravisKeychain() { + const done = this.async(); + if (!shouldRun()) return done(); + + return buildTravisKeychain().then(done).catch(grunt.fail.fatal); + }); +} diff --git a/build/tasks/spec-task.coffee b/build/tasks/spec-task.coffee deleted file mode 100644 index 56e3bd92b1..0000000000 --- a/build/tasks/spec-task.coffee +++ /dev/null @@ -1,142 +0,0 @@ -fs = require 'fs' -path = require 'path' - -_ = require 'underscore-plus' -async = require 'async' - -concurrency = 2 - -module.exports = (grunt) -> - {isAtomPackage, spawn} = require('./task-helpers')(grunt) - - packageSpecQueue = null - - logDeprecations = (label, {stderr}={}) -> - return unless process.env.JANKY_SHA1 - stderr ?= '' - deprecatedStart = stderr.indexOf('Calls to deprecated functions') - return if deprecatedStart is -1 - - grunt.log.error(label) - stderr = stderr.substring(deprecatedStart) - stderr = stderr.replace(/^\s*\[[^\]]+\]\s+/gm, '') - stderr = stderr.replace(/source: .*$/gm, '') - stderr = stderr.replace(/^"/gm, '') - stderr = stderr.replace(/",\s*$/gm, '') - grunt.log.error(stderr) - - getAppPath = -> - contentsDir = grunt.config.get('atom.contentsDir') - switch process.platform - when 'darwin' - path.join(contentsDir, 'MacOS', 'Edgehill') - when 'linux' - path.join(contentsDir, 'edgehill') - when 'win32' - path.join(contentsDir, 'edgehill.exe') - - runPackageSpecs = (callback) -> - failedPackages = [] - rootDir = grunt.config.get('atom.shellAppDir') - resourcePath = process.cwd() - appPath = getAppPath() - - # Ensure application is executable on Linux - fs.chmodSync(appPath, '755') if process.platform is 'linux' - - packageSpecQueue = async.queue (packagePath, callback) -> - if process.platform in ['darwin', 'linux'] - options = - cmd: appPath - args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}"] - opts: - cwd: packagePath - env: _.extend({}, process.env, ATOM_SHELL_PATH: rootDir) - else if process.platform is 'win32' - options = - cmd: process.env.comspec - args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{path.join(packagePath, 'spec')}", "--log-file=ci.log"] - opts: - cwd: packagePath - env: _.extend({}, process.env, ATOM_SHELL_PATH: rootDir) - - grunt.verbose.writeln "Launching #{path.basename(packagePath)} specs." - spawn options, (error, results, code) -> - if process.platform is 'win32' - if error - process.stderr.write(fs.readFileSync(path.join(packagePath, 'ci.log'))) - fs.unlinkSync(path.join(packagePath, 'ci.log')) - - failedPackages.push path.basename(packagePath) if error - logDeprecations("#{path.basename(packagePath)} Specs", results) - callback() - - modulesDirectory = path.resolve('node_modules') - for packageDirectory in fs.readdirSync(modulesDirectory) - packagePath = path.join(modulesDirectory, packageDirectory) - continue unless grunt.file.isDir(path.join(packagePath, 'spec')) - continue unless isAtomPackage(packagePath) - packageSpecQueue.push(packagePath) - - packageSpecQueue.concurrency = concurrency - 1 - packageSpecQueue.drain = -> callback(null, failedPackages) - - runCoreSpecs = (callback) -> - appPath = getAppPath() - resourcePath = process.cwd() - coreSpecsPath = path.resolve('spec') - - if process.platform in ['darwin', 'linux'] - options = - cmd: appPath - args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}"] - else if process.platform is 'win32' - options = - cmd: process.env.comspec - args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}", "--log-file=ci.log"] - - spawn options, (error, results, code) -> - if process.platform is 'win32' - process.stderr.write(fs.readFileSync('ci.log')) if error - fs.unlinkSync('ci.log') - else - # TODO: Restore concurrency on Windows - packageSpecQueue.concurrency = concurrency - logDeprecations('Core Specs', results) - - callback(null, error) - - grunt.registerTask 'run-specs', 'Run the specs', -> - done = @async() - startTime = Date.now() - - # TODO: This should really be parallel on both platforms, however our - # fixtures step on each others toes currently. - if process.platform in ['darwin', 'linux'] - method = async.parallel - else if process.platform is 'win32' - method = async.series - - method [runCoreSpecs, runPackageSpecs], (error, results) -> - [coreSpecFailed, failedPackages] = results - elapsedTime = Math.round((Date.now() - startTime) / 100) / 10 - grunt.log.ok("Total spec time: #{elapsedTime}s using #{concurrency} cores") - failures = failedPackages - failures.push "atom core" if coreSpecFailed - - grunt.log.error("[Error]".red + " #{failures.join(', ')} spec(s) failed") if failures.length > 0 - - if process.platform is 'win32' and process.env.JANKY_SHA1 - done() - else - done(!coreSpecFailed and failedPackages.length == 0) - - grunt.registerTask 'run-edgehill-specs', 'Run the specs', -> - proc = require 'child_process' - done = @async() - testProc = proc.spawn("./atom.sh", ["--test"]) - testProc.stdout.on 'data', (data) -> console.log(data.toString()) - testProc.stderr.on 'data', (data) -> grunt.log.error(data.toString()) - testProc.on 'error', (err) -> grunt.log.error("Process error: #{err}") - testProc.on 'close', (exitCode, signal) -> - done() diff --git a/build/tasks/task-helpers.coffee b/build/tasks/task-helpers.coffee deleted file mode 100644 index a862f291fd..0000000000 --- a/build/tasks/task-helpers.coffee +++ /dev/null @@ -1,68 +0,0 @@ -fs = require 'fs-plus' -path = require 'path' - -module.exports = (grunt) -> - cp: (source, destination, {filter}={}) -> - unless grunt.file.exists(source) - grunt.fatal("Cannot copy non-existent #{source.cyan} to #{destination.cyan}") - - copyFile = (sourcePath, destinationPath) -> - return if filter?(sourcePath) or filter?.test?(sourcePath) - - stats = fs.lstatSync(sourcePath) - if stats.isSymbolicLink() - grunt.file.mkdir(path.dirname(destinationPath)) - fs.symlinkSync(fs.readlinkSync(sourcePath), destinationPath) - else if stats.isFile() - grunt.file.copy(sourcePath, destinationPath) - - if grunt.file.exists(destinationPath) - fs.chmodSync(destinationPath, fs.statSync(sourcePath).mode) - - if grunt.file.isFile(source) - copyFile(source, destination) - else - try - onFile = (sourcePath) -> - destinationPath = path.join(destination, path.relative(source, sourcePath)) - copyFile(sourcePath, destinationPath) - onDirectory = (sourcePath) -> - if fs.isSymbolicLinkSync(sourcePath) - destinationPath = path.join(destination, path.relative(source, sourcePath)) - copyFile(sourcePath, destinationPath) - false - else - true - fs.traverseTreeSync source, onFile, onDirectory - catch error - grunt.fatal(error) - - grunt.verbose.writeln("Copied #{source.cyan} to #{destination.cyan}.") - - mkdir: (args...) -> - grunt.file.mkdir(args...) - - rm: (args...) -> - grunt.file.delete(args..., force: true) if grunt.file.exists(args...) - - spawn: (options, callback) -> - childProcess = require 'child_process' - stdout = [] - stderr = [] - error = null - proc = childProcess.spawn(options.cmd, options.args, options.opts) - proc.stdout.on 'data', (data) -> stdout.push(data.toString()) - proc.stderr.on 'data', (data) -> stderr.push(data.toString()) - proc.on 'error', (processError) -> error ?= processError - proc.on 'close', (exitCode, signal) -> - error ?= new Error(signal) if exitCode != 0 - results = {stderr: stderr.join(''), stdout: stdout.join(''), code: exitCode} - grunt.log.error results.stderr if exitCode != 0 - callback(error, results, exitCode) - - isAtomPackage: (packagePath) -> - try - {engines} = grunt.file.readJSON(path.join(packagePath, 'package.json')) - engines?.atom? - catch error - false diff --git a/build/tasks/task-helpers.js b/build/tasks/task-helpers.js new file mode 100644 index 0000000000..13492fb578 --- /dev/null +++ b/build/tasks/task-helpers.js @@ -0,0 +1,51 @@ +const childProcess = require('child_process'); + +module.exports = (grunt) => { + function spawn(options, callback) { + const stdout = []; + const stderr = []; + let error = null; + const proc = childProcess.spawn(options.cmd, options.args, options.opts); + proc.stdout.on('data', data => stdout.push(data.toString())); + proc.stderr.on('data', data => stderr.push(data.toString())); + proc.on('error', (processError) => { + return error != null ? error : (error = processError) + }); + proc.on('close', (exitCode, signal) => { + if (exitCode !== 0) { if (typeof error === 'undefined' || error === null) { error = new Error(signal); } } + const results = {stderr: stderr.join(''), stdout: stdout.join(''), code: exitCode}; + if (exitCode !== 0) { grunt.log.error(results.stderr); } + return callback(error, results, exitCode); + }); + } + + function shouldPublishBuild() { + if (!process.env.PUBLISH_BUILD) { + grunt.log.writeln("Skipping because PUBLISH_BUILD env is not set"); + return false; + } + if (process.env.APPVEYOR) { + if (process.env.APPVEYOR_PULL_REQUEST_NUMBER) { + grunt.log.writeln("Skipping because this is a pull request"); + return false; + } + } else if (process.env.TRAVIS) { + if (process.env.TRAVIS_PULL_REQUEST !== "false") { + grunt.log.writeln("Skipping because TRAVIS_PULL_REQUEST env doesn't equal 'false'"); + return false; + } + } + return true; + } + + function spawnP(options) { + return new Promise((resolve, reject) => { + spawn(options, (error) => { + if (error) return reject(error); + return resolve() + }) + }) + } + + return {spawn, spawnP, shouldPublishBuild}; +} diff --git a/docs-atom/README.md b/docs-atom/README.md deleted file mode 100644 index e8863f5206..0000000000 --- a/docs-atom/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Welcome to the Atom Docs - -![Atom](https://cloud.githubusercontent.com/assets/72919/2874231/3af1db48-d3dd-11e3-98dc-6066f8bc766f.png) - -TODO: Write when docs move to a dedicated repo. diff --git a/docs-atom/advanced/configuration.md b/docs-atom/advanced/configuration.md deleted file mode 100644 index 82d821eb00..0000000000 --- a/docs-atom/advanced/configuration.md +++ /dev/null @@ -1,58 +0,0 @@ -## Configuration API - -### Reading Config Settings - -If you are writing a package that you want to make configurable, you'll need to -read config settings via the `atom.config` global. You can read the current -value of a namespaced config key with `atom.config.get`: - -```coffeescript -# read a value with `config.get` -@showInvisibles() if atom.config.get "editor.showInvisibles" -``` - -Or you can subscribe via `atom.config.observe` to track changes from any view -object. - -```coffeescript -{View} = require 'space-pen' - -class MyView extends View - attached: -> - @fontSizeObserveSubscription = - atom.config.observe 'editor.fontSize', (newValue, {previous}) => - @adjustFontSize() - - detached: -> - @fontSizeObserveSubscription.dispose() -``` - -The `atom.config.observe` method will call the given callback immediately with -the current value for the specified key path, and it will also call it in the -future whenever the value of that key path changes. If you only want to invoke -the callback when the next time the value changes, use `atom.config.onDidChange` -instead. - -Subscription methods return *disposable* subscription objects. Note in the -example above how we save the subscription to the `@fontSizeObserveSubscription` -instance variable and dispose of it when the view is detached. To group multiple -subscriptions together, you can add them all to a -[`CompositeDisposable`][composite-disposable] that you dispose when the view is -detached. - -### Writing Config Settings - -The `atom.config` database is populated on startup from `~/.atom/config.cson`, -but you can programmatically write to it with `atom.config.set`: - -```coffeescript -# basic key update -atom.config.set("core.showInvisibles", true) -``` - -If you're exposing package configuration via specific key paths, you'll want to -associate them with a schema in your package's main module. Read more about -schemas in the [config API docs][config-api]. - -[composite-disposable]: https://atom.io/docs/api/latest/CompositeDisposable -[config-api]: https://atom.io/docs/api/latest/Config diff --git a/docs-atom/advanced/keymaps.md b/docs-atom/advanced/keymaps.md deleted file mode 100644 index 2efbd64aee..0000000000 --- a/docs-atom/advanced/keymaps.md +++ /dev/null @@ -1,175 +0,0 @@ -# Keymaps In-Depth - -## Structure of a Keymap File - -Keymap files are encoded as JSON or CSON files containing nested hashes. They -work much like style sheets, but instead of applying style properties to elements -matching the selector, they specify the meaning of keystrokes on elements -matching the selector. Here is an example of some bindings that apply when -keystrokes pass through `atom-text-editor` elements: - -```coffee -'atom-text-editor': - 'cmd-delete': 'editor:delete-to-beginning-of-line' - 'alt-backspace': 'editor:delete-to-beginning-of-word' - 'ctrl-A': 'editor:select-to-first-character-of-line' - 'ctrl-shift-e': 'editor:select-to-end-of-line' - 'cmd-left': 'editor:move-to-first-character-of-line' - -'atom-text-editor:not([mini])' - 'cmd-alt-[': 'editor:fold-current-row' - 'cmd-alt-]': 'editor:unfold-current-row' -``` - -Beneath the first selector are several bindings, mapping specific *keystroke -patterns* to *commands*. When an element with the `atom-text-editor` class is focused and -`cmd-delete` is pressed, an custom DOM event called -`editor:delete-to-beginning-of-line` is emitted on the `atom-text-editor` element. - -The second selector group also targets editors, but only if they don't have the -`mini` attribute. In this example, the commands for code folding don't really -make sense on mini-editors, so the selector restricts them to regular editors. - -### Keystroke Patterns - -Keystroke patterns express one or more keystrokes combined with optional -modifier keys. For example: `ctrl-w v`, or `cmd-shift-up`. A keystroke is -composed of the following symbols, separated by a `-`. A multi-keystroke pattern -can be expressed as keystroke patterns separated by spaces. - - -| Type | Examples -| --------------------|---------------------------- -| Character literals | `a` `4` `$` -| Modifier keys | `cmd` `ctrl` `alt` `shift` -| Special keys | `enter` `escape` `backspace` `delete` `tab` `home` `end` `pageup` `pagedown` `left` `right` `up` `down` - -### Commands - -Commands are custom DOM events that are triggered when a keystroke matches a -binding. This allows user interface code to listen for named commands without -specifying the specific keybinding that triggers it. For example, the following -code creates a command to insert the current date in an editor: - -```coffee -atom.commands.add 'atom-text-editor', - 'user:insert-date': (event) -> - editor = @getModel() - editor.insertText(new Date().toLocaleString()) -``` - -`atom.commands` refers to the global {CommandRegistry} instance where all commands -are set and consequently picked up by the command palette. - -When you are looking to bind new keys, it is often useful to use the command -palette (`ctrl-shift-p`) to discover what commands are being listened for in a -given focus context. Commands are "humanized" following a simple algorithm, so a -command like `editor:fold-current-row` would appear as "Editor: Fold Current -Row". - -### "Composed" Commands - -A common question is, "How do I make a single keybinding execute two or more -commands?" There isn't any direct support for this in Atom, but it can be -achieved by creating a custom command that performs the multiple actions -you desire and then creating a keybinding for that command. For example, let's -say I want to create a "composed" command that performs a Select Line followed -by Cut. You could add the following to your `init.coffee`: - -```coffee -atom.commands.add 'atom-text-editor', 'custom:cut-line', -> - editor = atom.workspace.getActiveTextEditor() - editor.selectLinesContainingCursors() - editor.cutSelectedText() -``` - -Then let's say we want to map this custom command to `alt-ctrl-z`, you could -add the following to your keymap: - -```coffee -'atom-text-editor': - 'alt-ctrl-z': 'custom:cut-line' -``` - -### Specificity and Cascade Order - -As is the case with CSS applying styles, when multiple bindings match for a -single element, the conflict is resolved by choosing the most *specific* -selector. If two matching selectors have the same specificity, the binding -for the selector appearing later in the cascade takes precedence. - -Currently, there's no way to specify selector ordering within a single keymap, -because JSON objects do not preserve order. We eventually plan to introduce a -custom CSS-like file format for keymaps that allows for ordering within a single -file. For now, we've opted to handle cases where selector ordering is critical -by breaking the keymap into two separate files, such as `snippets-1.cson` and -`snippets-2.cson`. - -## Removing Bindings - -When the keymap system encounters a binding with the `unset!` directive as its -command, it will treat the current element as if it had no key bindings matching -the current keystroke sequence and continue searching from its parent. If you -want to remove a binding from a keymap you don't control, such as keymaps in -Atom core or in packages, use the `unset!` directive. - -For example, the following code removes the keybinding for `a` in the Tree View, -which is normally used to trigger the `tree-view:add-file` command: - -```coffee -'.tree-view': - 'a': 'unset!' -``` - -![](https://cloud.githubusercontent.com/assets/38924/3174771/e7f6ce64-ebf4-11e3-922d-f280bffb3fc5.png) - -## Forcing Chromium's Native Keystroke Handling - -EDIT: This has been overridden in the Edgehill project. By default, Chromium's -native keystroke handling for Copy, Paste, Select-All, etc. is enabled. To except -yourself from these behaviors, apply the `.override-key-bindings` class to an element. - -If you want to force the native browser behavior for a given keystroke, use the -`native!` directive as the command of a binding. This can be useful to enable -the correct behavior in native input elements, for example. If you apply the -`.native-key-bindings` class to an element, all the keystrokes typically handled -by the browser will be assigned the `native!` directive. - -## Overloading Key Bindings - -Occasionally, it makes sense to layer multiple actions on top of the same key -binding. An example of this is the snippets package. Snippets are inserted by -typing a snippet prefix such as `for` and then pressing `tab`. Every time `tab` -is pressed, we want to execute code attempting to expand a snippet if one exists -for the text preceding the cursor. If a snippet *doesn't* exist, we want `tab` -to actually insert whitespace. - -To achieve this, the snippets package makes use of the `.abortKeyBinding()` -method on the event object representing the `snippets:expand` command. - -```coffee-script -# pseudo-code -editor.command 'snippets:expand', (e) => - if @cursorFollowsValidPrefix() - @expandSnippet() - else - e.abortKeyBinding() -``` - -When the event handler observes that the cursor does not follow a valid prefix, -it calls `e.abortKeyBinding()`, telling the keymap system to continue searching -for another matching binding. - -## Step-by-Step: How Keydown Events are Mapped to Commands - -* A keydown event occurs on a *focused* element. -* Starting at the focused element, the keymap walks upward towards the root of - the document, searching for the most specific CSS selector that matches the - current DOM element and also contains a keystroke pattern matching the keydown - event. -* When a matching keystroke pattern is found, the search is terminated and the - pattern's corresponding command is triggered on the current element. -* If `.abortKeyBinding()` is called on the triggered event object, the search - is resumed, triggering a binding on the next-most-specific CSS selector for - the same element or continuing upward to parent elements. -* If no bindings are found, the event is handled by Chromium normally. diff --git a/docs-atom/advanced/node-modules.md b/docs-atom/advanced/node-modules.md deleted file mode 100644 index 1737138038..0000000000 --- a/docs-atom/advanced/node-modules.md +++ /dev/null @@ -1,24 +0,0 @@ -## Developing Node Modules - -Atom contains a number of packages that are Node modules instead of Atom packages. If you want to -make changes to the Node modules, for instance `atom-keymap`, you have to link them into the -development environment differently than you would a normal Atom package. - -### Linking a Node Module Into Your Atom Dev Environment - -Here are the steps to run a local version of a node module *not an apm* within Atom. We're using -`atom-keymap` as an example: - -```bash -$ git clone https://github.com/atom/atom-keymap.git -$ cd atom-keymap -$ npm install -$ npm link -$ apm rebuild # This is the special step, it makes the npm work with Atom's version of Node -$ cd WHERE-YOU-CLONED-ATOM -$ npm link atom-keymap -$ atom # Should work! -``` - -After this, you'll have to `npm install` and `apm rebuild` when you make a change to the node -module's code. diff --git a/docs-atom/advanced/scopes-and-scope-descriptors.md b/docs-atom/advanced/scopes-and-scope-descriptors.md deleted file mode 100644 index 7ee82995e1..0000000000 --- a/docs-atom/advanced/scopes-and-scope-descriptors.md +++ /dev/null @@ -1,87 +0,0 @@ -# Scoped Settings, Scopes and Scope Descriptors - -Atom supports language-specific settings. You can soft wrap only Markdown files, or set the tab length to 4 in Python files. - -Language-specific settings are a subset of something more general we call "scoped settings". Scoped settings allow targeting down to a specific syntax token type. For example, you could conceivably set a setting to target only Ruby comments, only code inside Markdown files, or even only JavaScript function names. - -## Scope names in syntax tokens - -Each token in the editor has a collection of scope names. For example, the aformentioned JavaScript function name might have the scope names `function` and `name`. An open paren might have the scope names `punctuation`, `parameters`, `begin`. - -Scope names work just like CSS classes. In fact, in the editor, scope names are attached to a token's DOM node as CSS classes. - -Take this piece of JavaScript: - -```js -function functionName() { - console.log('Log it out'); -} -``` - -In the dev tools, the first line's markup looks like this. - -![screen shot 2014-10-14 at 11 21 35 am](https://cloud.githubusercontent.com/assets/69169/4634321/2b1b923c-53cf-11e4-9268-6e57bcb14ec8.png) - -All the class names on the spans are scope names. Any scope name can be used to target a setting's value. - -## Scope Selectors - -Scope selectors allow you to target specific tokens just like a CSS selector targets specific nodes in the DOM. Some examples: - -```coffee -'.source.js' # selects all javascript tokens -'.source.js .function.name' # selects all javascript function names -'.function.name' # selects all function names in any language -``` - -[Config::set][config-set] accepts a `scopeSelector`. If you'd like to set a setting for JavaScript function names, you can give it the js function name `scopeSelector`: - -```coffee -atom.config.set('.source.js .function.name', 'my-package.my-setting', 'special value') -``` - -## Scope Descriptors - -A scope descriptor is an [Object][scope-descriptor] that wraps an `Array` of -`String`s. The Array describes a path from the root of the syntax tree to a -token including _all_ scope names for the entire path. - -In our JavaScript example above, a scope descriptor for the function name token would be: - -```coffee -['source.js', 'meta.function.js', 'entity.name.function.js'] -``` - -[Config::get][config-get] accepts a `scopeDescriptor`. You can get the value for your setting scoped to JavaScript function names via: - -```coffee -scopeDescriptor = ['source.js', 'meta.function.js', 'entity.name.function.js'] -value = atom.config.get(scopeDescriptor, 'my-package.my-setting') -``` - -But, you do not need to generate scope descriptors by hand. There are a couple methods available to get the scope descriptor from the editor: - -* [Editor::getRootScopeDescriptor][editor-getRootScopeDescriptor] to get the language's descriptor. eg. `[".source.js"]` -* [Editor::scopeDescriptorForBufferPosition][editor-scopeDescriptorForBufferPosition] to get the descriptor at a specific position in the buffer. -* [Cursor::getScopeDescriptor][cursor-getScopeDescriptor] to get a cursor's descriptor based on position. eg. if the cursor were in the name of the method in our example it would return `["source.js", "meta.function.js", "entity.name.function.js"]` - -Let's revisit our example using these methods: - -```coffee -editor = atom.workspace.getActiveTextEditor() -cursor = editor.getLastCursor() -valueAtCursor = atom.config.get(cursor.getScopeDescriptor(), 'my-package.my-setting') -valueForLanguage = atom.config.get(editor.getRootScopeDescriptor(), 'my-package.my-setting') -``` - - -[config]:https://atom.io/docs/api/latest/Config -[config-get]:https://atom.io/docs/api/latest/Config#instance-get -[config-set]:https://atom.io/docs/api/latest/Config#instance-set -[config-observe]:https://atom.io/docs/api/latest/Config#instance-observe - -[editor-getRootScopeDescriptor]:https://atom.io/docs/api/latest/TextEditor#instance-getRootScopeDescriptor -[editor-scopeDescriptorForBufferPosition]:https://atom.io/docs/api/latest/TextEditor#instance-scopeDescriptorForBufferPosition - -[cursor-getScopeDescriptor]:https://atom.io/docs/api/latest/Cursor#instance-getScopeDescriptor -[scope-descriptor]:https://atom.io/docs/api/latest/ScopeDescriptor diff --git a/docs-atom/advanced/serialization.md b/docs-atom/advanced/serialization.md deleted file mode 100644 index c2a5f303a0..0000000000 --- a/docs-atom/advanced/serialization.md +++ /dev/null @@ -1,75 +0,0 @@ -## Serialization in Atom - -When a window is refreshed or restored from a previous session, the view and its -associated objects are *deserialized* from a JSON representation that was stored -during the window's previous shutdown. For your own views and objects to be -compatible with refreshing, you'll need to make them play nicely with the -serializing and deserializing. - -### Package Serialization Hook - -Your package's main module can optionally include a `serialize` method, which -will be called before your package is deactivated. You should return JSON, which -will be handed back to you as an argument to `activate` next time it is called. -In the following example, the package keeps an instance of `MyObject` in the -same state across refreshes. - -```coffee-script -module.exports = - activate: (state) -> - @myObject = - if state - atom.deserializers.deserialize(state) - else - new MyObject("Hello") - - serialize: -> - @myObject.serialize() -``` - -### Serialization Methods - -```coffee-script -class MyObject - atom.deserializers.add(this) - - @deserialize: ({data}) -> new MyObject(data) - constructor: (@data) -> - serialize: -> { deserializer: 'MyObject', data: @data } -``` - -#### .serialize() -Objects that you want to serialize should implement `.serialize()`. This method -should return a serializable object, and it must contain a key named -`deserializer` whose value is the name of a registered deserializer that can -convert the rest of the data to an object. It's usually just the name of the -class itself. - -#### @deserialize(data) -The other side of the coin is the `deserialize` method, which is usually a -class-level method on the same class that implements `serialize`. This method's -job is to convert a state object returned from a previous call `serialize` back -into a genuine object. - -#### atom.deserializers.add(klass) -You need to call the `atom.deserializers.add` method with your class in -order to make it available to the deserialization system. Now you can call the -global `deserialize` method with state returned from `serialize`, and your -class's `deserialize` method will be selected automatically. - -### Versioning - -```coffee-script -class MyObject - atom.deserializers.add(this) - - @version: 2 - @deserialize: (state) -> ... - serialize: -> { version: @constructor.version, ... } -``` - -Your serializable class can optionally have a class-level `@version` property -and include a `version` key in its serialized state. When deserializing, Atom -will only attempt to call deserialize if the two versions match, and otherwise -return undefined. We plan on implementing a migration system in the future, but -this at least protects you from improperly deserializing old state. diff --git a/docs-atom/apm-rest-api.md b/docs-atom/apm-rest-api.md deleted file mode 100644 index 2b7a0e3272..0000000000 --- a/docs-atom/apm-rest-api.md +++ /dev/null @@ -1,288 +0,0 @@ -# Atom.io package and update API - -This guide describes the web API used by [apm](https://github.com/atom/apm) and -Atom. The vast majority of use cases are met by the `apm` command-line tool, -which does other useful things like incrementing your version in `package.json` -and making sure you have pushed your git tag. In fact, Atom itself shells out to -`apm` rather than hitting the API directly. If you're curious about how Atom -uses `apm`, see the [PackageManager class](https://github.com/atom/settings-view/blob/master/lib/package-manager.coffee) -in the `settings-view` package. - -*This API should be considered pre-release and is subject to change (though significant breaking changes are unlikely).* - -### Authorization - -For calls to the API that require authentication, provide a valid token from your -[Atom.io account page](https://atom.io/account) in the `Authorization` header. - -### Media type - -All requests that take parameters require `application/json`. - -# API Resources - -## Packages - -### Listing packages - -#### GET /api/packages - -Parameters: - -- **page** (optional) -- **sort** (optional) - One of `downloads`, `created_at`, `updated_at`, `stars`. Defaults to `downloads` -- **direction** (optional) - `asc` or `desc`. Defaults to `desc`. `stars` can only be ordered `desc` - -Returns a list of all packages in the following format: -```json - [ - { - "releases": { - "latest": "0.6.0" - }, - "name": "thedaniel-test-package", - "repository": { - "type": "git", - "url": "https://github.com/thedaniel/test-package" - } - }, - ... - ] -``` - -Results are paginated 30 at a time, and links to the next and last pages are -provided in the `Link` header: - -``` -Link: ; rel="self", - ; rel="last", - ; rel="next" -``` - -By default, results are sorted by download count, descending. - -### Searching packages - -#### GET /api/packages/search - -Parameters: - -- **q** (required) - Search query -- **page** (optional) -- **sort** (optional) - One of `downloads`, `created_at`, `updated_at`, `stars`. Defaults to the relevance of the search query. -- **direction** (optional) - `asc` or `desc`. Defaults to `desc`. - -Returns results in the same format as [listing packages](#listing-packages). - -### Showing package details - -#### GET /api/packages/:package_name - -Returns package details and versions for a single package - -Parameters: - -- **engine** (optional) - Only show packages with versions compatible with this - Atom version. Must be valid [SemVer](http://semver.org). - -Returns: - -```json - { - "releases": { - "latest": "0.6.0" - }, - "name": "thedaniel-test-package", - "repository": { - "type": "git", - "url": "https://github.com/thedaniel/test-package" - }, - "versions": [ - (see single version output below) - ..., - ] - } -``` - -### Creating a package - -#### POST /api/packages - -Create a new package; requires authentication. - -The name and version will be fetched from the `package.json` -file in the specified repository. The authenticating user *must* have access -to the indicated repository. - -When a package is created, a release hook is registered with GitHub for package -version creation. - -Parameters: - -- **repository** - String. The repository containing the plugin, in the form "owner/repo" - -Returns: - -- **201** - Successfully created, returns created package. -- **400** - Repository is inaccessible, nonexistent, not an atom package. Possible - error messages include: - - That repo does not exist, isn't an atom package, or atombot does not have access - - The package.json at owner/repo isn't valid -- **409** - A package by that name already exists - -### Deleting a package - -#### DELETE /api/packages/:package_name - -Delete a package; requires authentication. - -Returns: - -- **204** - Success -- **400** - Repository is inaccessible -- **401** - Unauthorized - -### Renaming a package - -Packages are renamed by publishing a new version with the name changed in `package.json` -See [Creating a new package version](#creating-a-new-package-version) for details. - -Requests made to the previous name will forward to the new name. - -### Package Versions - -#### GET /api/packages/:package_name/versions/:version_name - -Returns `package.json` with `dist` key added for e.g. tarball download: - -```json - { - "bugs": { - "url": "https://github.com/thedaniel/test-package/issues" - }, - "dependencies": { - "async": "~0.2.6", - "pegjs": "~0.7.0", - "season": "~0.13.0" - }, - "description": "Expand snippets matching the current prefix with `tab`.", - "dist": { - "tarball": "https://codeload.github.com/..." - }, - "engines": { - "atom": "*" - }, - "main": "./lib/snippets", - "name": "thedaniel-test-package", - "publishConfig": { - "registry": "https://...", - }, - "repository": { - "type": "git", - "url": "https://github.com/thedaniel/test-package.git" - }, - "version": "0.6.0" - } -``` - - -### Creating a new package version - -#### POST /api/packages/:package_name/versions - -Creates a new package version from a git tag; requires authentication. If `rename` -is not `true`, the `name` field in `package.json` *must* match the current package -name. - -#### Parameters - -- **tag** - A git tag for the version you'd like to create. It's important to note - that the version name will not be taken from the tag, but from the `version` - key in the `package.json` file at that ref. The authenticating user *must* have - access to the package repository. -- **rename** - Boolean indicating whether this version contains a new name for the package. - -#### Returns - -- **201** - Successfully created. Returns created version. -- **400** - Git tag not found / Repository inaccessible / package.json invalid -- **409** - Version exists - -### Deleting a version - -#### DELETE /api/packages/:package_name/versions/:version_name - -Deletes a package version; requires authentication. - -Note that a version cannot be republished with a different tag if it is deleted. -If you need to delete the latest version of a package for e.g. security reasons, -you'll need to increment the version when republishing. - -Returns 204 No Content - - -## Stars - -### Listing user stars - -#### GET /api/users/:login/stars - -List a user's starred packages. - -Return value is similar to **GET /api/packages** - -#### GET /api/stars - -List the authenticated user's starred packages; requires authentication. - -Return value is similar to **GET /api/packages** - -### Starring a package - -#### POST /api/packages/:name/star - -Star a package; requires authentication. - -Returns a package. - -### Unstarring a package - -#### DELETE /api/packages/:name/star - -Unstar a package; requires authentication. - -Returns 204 No Content. - -### Listing a package's stargazers - -#### GET /api/packages/:name/stargazers - -List the users that have starred a package. - -Returns a list of user objects: - -```json -[ - {"login":"aperson"}, - {"login":"anotherperson"}, -] -``` - -## Atom updates - -### Listing Atom updates - -#### GET /api/updates - -Atom update feed, following the format expected by [Squirrel](https://github.com/Squirrel/). - -Returns: - -```json -{ - "name": "0.96.0", - "notes": "[HTML release notes]", - "pub_date": "2014-05-19T15:52:06.000Z", - "url": "https://www.atom.io/api/updates/download" -} -``` diff --git a/docs-atom/build-instructions/freebsd.md b/docs-atom/build-instructions/freebsd.md deleted file mode 100644 index 797cd42c0c..0000000000 --- a/docs-atom/build-instructions/freebsd.md +++ /dev/null @@ -1,22 +0,0 @@ -# FreeBSD - -FreeBSD -RELEASE 64-bit is the recommended platform. - -## Requirements - - * FreeBSD - * `pkg install node` - * `pkg install npm` - * `pkg install libgnome-keyring` - * `npm config set python /usr/local/bin/python2 -g` to ensure that gyp uses Python 2 - -## Instructions - - ```sh - git clone https://github.com/inboxapp/edgehill - cd edgehill - script/build # Creates application at $TMPDIR/edgehill-build/Edgehill - sudo script/grunt install # Installs command to /usr/local/bin/edgehill - ``` - -## Troubleshooting diff --git a/docs-atom/build-instructions/linux.md b/docs-atom/build-instructions/linux.md deleted file mode 100644 index 2366a9fc26..0000000000 --- a/docs-atom/build-instructions/linux.md +++ /dev/null @@ -1,159 +0,0 @@ -# Linux - -Ubuntu LTS 12.04 64-bit is the recommended platform. - -## Requirements - - * OS with 64-bit or 32-bit architecture - * C++ toolchain - * [Git](http://git-scm.com/) - * [Node.js](http://nodejs.org/download/) v0.10.x - * [npm](https://www.npmjs.com/) v1.4.x (bundled with Node.js) - * `npm -v` to check the version. - * `npm config set python /usr/bin/python2 -g` to ensure that gyp uses python2. - * You might need to run this command as `sudo`, depending on how you have set up [npm](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#ubuntu-mint-elementary-os). - * development headers for [GNOME Keyring](https://wiki.gnome.org/Projects/GnomeKeyring) - -### Ubuntu / Debian - -* `sudo apt-get install build-essential git libgnome-keyring-dev fakeroot` -* Instructions for [Node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#ubuntu-mint-elementary-os). - -### Fedora / CentOS / RHEL - -* `sudo yum --assumeyes install make gcc gcc-c++ glibc-devel git-core libgnome-keyring-devel rpmdevtools` -* Instructions for [Node.js](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#fedora). - -### Arch - -* `sudo pacman -S gconf base-devel git nodejs libgnome-keyring python2` -* `export PYTHON=/usr/bin/python2` before building Atom. - -### Slackware - -* `sbopkg -k -i node -i atom` - -### openSUSE - -* `sudo zypper install nodejs make gcc gcc-c++ glibc-devel git-core libgnome-keyring-devel rpmdevtools` - -## Instructions - -If you have problems with permissions don't forget to prefix with `sudo` - -1. Clone the Edgehill repository: - - ```sh - git clone https://github.com/inboxapp/edgehill - cd edgehill - ``` - -2. Checkout the latest Edgehill release: - - ```sh - git fetch -p - git checkout $(git describe --tags `git rev-list --tags --max-count=1`) - ``` - -3. Build Edgehill: - - ```sh - script/build - ``` - - This will create the edgehill application at `$TMPDIR/edgehill-build/Edgehill`. - -4. Install the `edgehill` and `apm` commands to `/usr/local/bin` by executing: - - ```sh - sudo script/grunt install - ``` - - To use the newly installed Edgehill, quit and restart all running Edgehill instances. - -5. *Optionally*, you may generate distributable packages of Edgehill at `$TMPDIR/edgehill-build`. Currenty, `.deb` and `.rpm` package types are supported. To create a `.deb` package run: - - ```sh - script/grunt mkdeb - ``` - - To create an `.rpm` package run - - ```sh - script/grunt mkrpm - ``` - -## Advanced Options - -### Custom install directory - -```sh -sudo script/grunt install --install-dir /install/edgehill/here -``` - -### Custom build directory - -```sh -script/build --build-dir /build/edgehill/here -``` - -## Troubleshooting - -### TypeError: Unable to watch path - -If you get following error with a big traceback right after Edgehill starts: - - ``` - TypeError: Unable to watch path - ``` - -you have to increase number of watched files by inotify. For testing if -this is the reason for this error you can issue - - ```sh - sudo sysctl fs.inotify.max_user_watches=32768 - ``` - -and restart Edgehill. If Edgehill now works fine, you can make this setting permanent: - - ```sh - echo 32768 | sudo tee -a /proc/sys/fs/inotify/max_user_watches - ``` - -See also https://github.com/atom/atom/issues/2082. - -### /usr/bin/env: node: No such file or directory - -If you get this notice when attempting to `script/build`, you either do not -have Node.js installed, or node isn't identified as Node.js on your machine. -If it's the latter, entering `sudo ln -s /usr/bin/nodejs /usr/bin/node` into -your terminal may fix the issue. - -#### You can also use Alternatives - -On some variants (mostly Debian based distros) it's preferable for you to use -Alternatives so that changes to the binary paths can be fixed or altered easily: - -```sh -sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 1 --slave /usr/bin/js js /usr/bin/nodejs -``` - -### AttributeError: 'module' object has no attribute 'script_main' - -If you get following error with a big traceback while building Edgehill: - - ``` - sys.exit(gyp.script_main()) AttributeError: 'module' object has no attribute 'script_main' gyp ERR! - ``` - -you need to uninstall the system version of gyp. - -On Fedora you would do the following: - - ```sh - sudo yum remove gyp - ``` - -### Linux build error reports in atom/atom -* Use [this search](https://github.com/atom/atom/search?q=label%3Abuild-error+label%3Alinux&type=Issues) - to get a list of reports about build errors on Linux. diff --git a/docs-atom/build-instructions/os-x.md b/docs-atom/build-instructions/os-x.md deleted file mode 100644 index 94eb801ffd..0000000000 --- a/docs-atom/build-instructions/os-x.md +++ /dev/null @@ -1,20 +0,0 @@ -# OS X - -## Requirements - - * OS X 10.8 or later - * [node.js](http://nodejs.org/download/) v0.10.x - * Command Line Tools for [Xcode](https://developer.apple.com/xcode/downloads/) (run `xcode-select --install` to install) - -## Instructions - - ```sh - git clone git@github.com:inboxapp/edgehill.git - cd edgehill - script/build # Creates application at /Applications/Edgehill.app - ``` - -## Troubleshooting - -### OSX build error reports in atom/atom -* Use [this search](https://github.com/atom/atom/search?q=label%3Abuild-error+label%3Aos-x&type=Issues) to get a list of reports about build errors on OSX. diff --git a/docs-atom/build-instructions/windows.md b/docs-atom/build-instructions/windows.md deleted file mode 100644 index c6ee393f36..0000000000 --- a/docs-atom/build-instructions/windows.md +++ /dev/null @@ -1,89 +0,0 @@ -# Windows - -## Requirements - -### On Windows 7 - * [Visual C++ 2010 Express](http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs#DownloadFamilies_4) - * [Visual Studio 2010 Service Pack 1](http://www.microsoft.com/en-us/download/details.aspx?id=23691) - * [node.js](http://nodejs.org/download/) v0.10.x - * For 64-bit builds of node and native modules you **must** have the - [Windows 7 64-bit SDK](http://www.microsoft.com/en-us/download/details.aspx?id=8279). - You may also need the [compiler update for the Windows SDK 7.1](http://www.microsoft.com/en-us/download/details.aspx?id=4422) - * [Python](https://www.python.org/downloads/) v2.7. - * The python.exe must be available at `%SystemDrive%\Python27\python.exe`. - If it is installed elsewhere, you can create a symbolic link to the - directory containing the python.exe using: - `mklink /d %SystemDrive%\Python27 D:\elsewhere\Python27` - * [GitHub for Windows](http://windows.github.com/) - -### On Windows 8 - * [Visual Studio Express 2013 for Windows Desktop](http://www.visualstudio.com/en-us/downloads/download-visual-studio-vs#DownloadFamilies_2) - * [node.js](http://nodejs.org/download/) v0.10.x - * [Python](https://www.python.org/downloads/) v2.7.x (required by [node-gyp](https://github.com/TooTallNate/node-gyp)) - * [GitHub for Windows](http://windows.github.com/) - -## Instructions - - ```bat - # Use the `Git Shell` app which was installed by GitHub for Windows. Also Make - # sure you have logged into the GitHub for Windows GUI App. - cd C:\ - git clone https://github.com/inboxapp/edgehill/ - cd edgehill - script/build # Creates application in the `Program Files` directory - ``` - -## Why do I have to use GitHub for Windows? - -You don't. You can use your existing Git! GitHub for Windows's Git Shell is just -easier to set up. - -If you _prefer_ using your existing Git installation, make sure git's cmd directory is in your PATH env variable (e.g. `C:\Program Files (x86)\Git\cmd`) before you open your powershell or command window. -Note that you may have to open your command window as administrator. For powershell that doesn't seem to always be the case, though. - -If none of this works, do install Github for Windows and use its Git shell. Makes life easier. - - -## Troubleshooting - -### Common Errors -* `node is not recognized` - - * If you just installed node you need to restart your computer before node is - available on your Path. - - -* `script/build` outputs only the Node and Python versions before returning - - * Try moving the repository to `C:\atom`. Most likely, the path is too long. - See [issue #2200](https://github.com/atom/atom/issues/2200). - -* `error MSB4025: The project file could not be loaded. Invalid character in the given encoding.` - - * These can occur because your home directory (`%USERPROFILE%`) has non-ASCII - characters in it. This is a bug in [gyp](https://code.google.com/p/gyp/) - which is used to build native node modules and there is no known workaround. - * https://github.com/TooTallNate/node-gyp/issues/297 - * https://code.google.com/p/gyp/issues/detail?id=393 - -* `script/build` stops at installing runas with 'Failed at the runas@0.5.4 install script.' - - See the next item. - -* `error MSB8020: The build tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found.` - - * If you're building atom with Visual Studio 2013 try executing the following - command in your Git shell and then re-run `script/build`: - - ``` - $env:GYP_MSVS_VERSION=2013 - ``` - -* Other `node-gyp` errors on first build attempt, even though the right node and python versions are installed. - * Do try the build command one more time, as experience shows it often works on second try in many of these cases. - - -### Windows build error reports in atom/atom -* If all fails, use [this search](https://github.com/atom/atom/search?q=label%3Abuild-error+label%3Awindows&type=Issues) to get a list of reports about build errors on Windows, and see if yours has already been reported. - -* If it hasn't, please open a new issue with your Windows version 32/64bit and a print/screenshot of your build output, incl. the node and python versions. diff --git a/docs-atom/contributing-to-packages.md b/docs-atom/contributing-to-packages.md deleted file mode 100644 index 42de6e37bc..0000000000 --- a/docs-atom/contributing-to-packages.md +++ /dev/null @@ -1,54 +0,0 @@ -# Contributing to Official Atom Packages - -If you think you know which package is causing the issue you are reporting, feel -free to open up the issue in that specific repository instead. When in doubt -just open the issue here but be aware that it may get closed here and reopened -in the proper package's repository. - -## Hacking on Packages - -### Cloning - -The first step is creating your own clone. - -For example, if you want to make changes to the `tree-view` package, fork the repo on your github account, then clone it: - -``` -> git clone git@github.com:your-username/tree-view.git -``` - -Next install all the dependencies: - -``` -> cd tree-view -> apm install -Installing modules ✓ -``` - -Now you can link it to development mode so when you run an Atom window with `atom --dev`, you will use your fork instead of the built in package: - -``` -> apm link -d -``` - -### Running in Development Mode - -Editing a package in Atom is a bit of a circular experience: you're using Atom -to modify itself. What happens if you temporarily break something? You don't -want the version of Atom you're using to edit to become useless in the process. -For this reason, you'll only want to load packages in **development mode** while -you are working on them. You'll perform your editing in **stable mode**, only -switching to development mode to test your changes. - -To open a development mode window, use the "Application: Open Dev" command, -which is normally bound to `cmd-shift-o`. You can also run dev mode from the -command line with `atom --dev`. - -To load your package in development mode, create a symlink to it in -`~/.atom/dev/packages`. This occurs automatically when you clone the package -with `apm develop`. You can also run `apm link --dev` and `apm unlink --dev` -from the package directory to create and remove dev-mode symlinks. - -### Installing Dependencies - -You'll want to keep dependencies up to date by running `apm update` after pulling any upstream changes. diff --git a/docs-atom/contributing.md b/docs-atom/contributing.md deleted file mode 120000 index 44fcc63439..0000000000 --- a/docs-atom/contributing.md +++ /dev/null @@ -1 +0,0 @@ -../CONTRIBUTING.md \ No newline at end of file diff --git a/docs-atom/converting-a-text-mate-bundle.md b/docs-atom/converting-a-text-mate-bundle.md deleted file mode 100644 index 3471bc83bf..0000000000 --- a/docs-atom/converting-a-text-mate-bundle.md +++ /dev/null @@ -1,52 +0,0 @@ -## Converting a TextMate Bundle - -This guide will show you how to convert a [TextMate][TextMate] bundle to an -Atom package. - -Converting a TextMate bundle will allow you to use its editor preferences, -snippets, and colorization inside Atom. - -### Install apm - -The `apm` command line utility that ships with Atom supports converting -a TextMate bundle to an Atom package. - -Check that you have `apm` installed by running the following command in your -terminal: - -```sh -apm help init -``` - -You should see a message print out with details about the `apm init` command. - -If you do not, launch Atom and run the _Atom > Install Shell Commands_ menu -to install the `apm` and `atom` commands. - -### Convert the Package - -Let's convert the TextMate bundle for the [R][R] programming language. You can find other existing TextMate bundles [here][TextMateOrg]. - -You can convert the R bundle with the following command: - -```sh -apm init --package ~/.atom/packages/language-r --convert https://github.com/textmate/r.tmbundle -``` - -You can now browse to `~/.atom/packages/language-r` to see the converted bundle. - -:tada: Your new package is now ready to use, launch Atom and open a `.r` file in -the editor to see it in action! - -### Further Reading - -* Check out [Publishing a Package](publishing-a-package.html) for more information - on publishing the package you just created to [atom.io][atomio]. - -[atomio]: https://atom.io -[CSS]: https://en.wikipedia.org/wiki/Cascading_Style_Sheets -[Less]: http://lesscss.org -[plist]: https://en.wikipedia.org/wiki/Property_list -[R]: https://en.wikipedia.org/wiki/R_(programming_language) -[TextMate]: http://macromates.com -[TextMateOrg]: https://github.com/textmate diff --git a/docs-atom/converting-a-text-mate-theme.md b/docs-atom/converting-a-text-mate-theme.md deleted file mode 100644 index 79dacd5238..0000000000 --- a/docs-atom/converting-a-text-mate-theme.md +++ /dev/null @@ -1,68 +0,0 @@ -## Converting a TextMate Theme - -This guide will show you how to convert a [TextMate][TextMate] theme to an Atom -theme. - -### Differences - -TextMate themes use [plist][plist] files while Atom themes use [CSS][CSS] or -[Less][Less] to style the UI and syntax in the editor. - -The utility that converts the theme first parses the theme's plist file and -then creates comparable CSS rules and properties that will style Atom similarly. - -### Install apm - -The `apm` command line utility that ships with Atom supports converting -a TextMate theme to an Atom theme. - -Check that you have `apm` installed by running the following command in your -terminal: - -```sh -apm help init -``` - -You should see a message print out with details about the `apm init` command. - -If you do not, launch Atom and run the _Atom > Install Shell Commands_ menu -to install the `apm` and `atom` commands. - -You can now run `apm help init` to see all the options for initializing new -packages and themes. - -### Convert the Theme - -Download the theme you wish to convert, you can browse existing TextMate themes -[here][TextMateThemes]. - -Now, let's say you've downloaded the theme to `~/Downloads/MyTheme.tmTheme`, -you can convert the theme with the following command: - -```sh -apm init --theme ~/.atom/packages/my-theme --convert ~/Downloads/MyTheme.tmTheme -``` - -You can browse to `~/.atom/packages/my-theme` to see the converted theme. - -### Activate the Theme - -Now that your theme is installed to `~/.atom/packages` you can enable it -by launching Atom and selecting the _Atom > Preferences..._ menu. - -Select the _Themes_ link on the left side and choose _My Theme_ from the -__Syntax Theme__ dropdown menu to enable your new theme. - -:tada: Your theme is now enabled, open an editor to see it in action! - -### Further Reading - -* Check out [Publishing a Package](publishing-a-package.html) for more information - on publishing the theme you just created to [atom.io][atomio]. - -[atomio]: https://atom.io -[CSS]: https://en.wikipedia.org/wiki/Cascading_Style_Sheets -[Less]: http://lesscss.org -[plist]: https://en.wikipedia.org/wiki/Property_list -[TextMate]: http://macromates.com -[TextMateThemes]: http://wiki.macromates.com/Themes/UserSubmittedThemes diff --git a/docs-atom/creating-a-package.md b/docs-atom/creating-a-package.md deleted file mode 100644 index d00f6ecc1a..0000000000 --- a/docs-atom/creating-a-package.md +++ /dev/null @@ -1,515 +0,0 @@ -# Creating Packages - -Packages are at the core of Atom. Nearly everything outside of the main editor -is handled by a package. That includes "core" pieces like the [file tree][file-tree], -[status bar][status-bar], [syntax highlighting][cs-syntax], and more. - -A package can contain a variety of different resource types to change Atom's -behavior. The basic package layout is as follows: - -```text -my-package/ - grammars/ - keymaps/ - lib/ - menus/ - spec/ - snippets/ - styles/ - index.coffee - package.json -``` - -Not every package will have (or need) all of these directories. - -We have [a tutorial on creating your first package][first-package]. - -There are also guides for converting [TextMate bundles][convert-bundle] and -[TextMate themes][convert-theme] so they work in Atom. - -## package.json - -Similar to [npm packages][npm], Atom packages contain a _package.json_ file -in their top-level directory. This file contains metadata about the package, -such as the path to its "main" module, library dependencies, and manifests -specifying the order in which its resources should be loaded. - -In addition to the regular [npm package.json keys][npm-keys] available, Atom -package.json files have their own additions. - -- `main` (**Required**): the path to the CoffeeScript file that's the entry point -to your package. -- `styles` (**Optional**): an Array of Strings identifying the order of the -style sheets your package needs to load. If not specified, style sheets in the -_styles_ directory are added alphabetically. -- `keymaps`(**Optional**): an Array of Strings identifying the order of the -key mappings your package needs to load. If not specified, mappings in the -_keymaps_ directory are added alphabetically. -- `menus`(**Optional**): an Array of Strings identifying the order of -the menu mappings your package needs to load. If not specified, mappings -in the _menus_ directory are added alphabetically. -- `snippets` (**Optional**): an Array of Strings identifying the order of the -snippets your package needs to load. If not specified, snippets in the -_snippets_ directory are added alphabetically. -- `activationCommands` (**Optional**): an Array of Strings identifying commands that -trigger your package's activation. You can delay the loading of your package -until one of these events is triggered. -- `providedServices` (**Optional**): an Object describing the services that your -package provides, which can be used by other packages. The keys of this object -are the names of the services, and the values are Objects with the following -keys: - - `description` (**Optional**) a String describing the service - - `versions` (**Required**) an Object whose keys are Semver version strings, - and whose values are names of methods in your package's top-level module - that return a value implementing the service. -- `consumedServices` (**Optional**): an Object describing the services that your -package uses, which can be provided by other packages. The keys of this object -are the names of the services, and the values are Objects with the following -keys: - - `versions` (**Required**) an Object whose keys are Semver version ranges - and whose values are names of methods in your package's top-level module - that are called with values implementing the service. - -## Source Code - -If you want to extend Atom's behavior, your package should contain a single -top-level module, which you export from _index.coffee_ (or whichever file is -indicated by the `main` key in your _package.json_ file). The remainder of your -code should be placed in the `lib` directory, and required from your top-level -file. - -Your package's top-level module is a singleton object that manages the lifecycle -of your extensions to Atom. Even if your package creates ten different views and -appends them to different parts of the DOM, it's all managed from your top-level -object. - -Your package's top-level module should implement the following methods: - -- `activate(state)`: This **required** method is called when your -package is activated. It is passed the state data from the last time the window -was serialized if your module implements the `serialize()` method. Use this to -do initialization work when your package is started (like setting up DOM -elements or binding events). - -- `serialize()`: This **optional** method is called when the window is shutting -down, allowing you to return JSON to represent the state of your component. When -the window is later restored, the data you returned is passed to your -module's `activate` method so you can restore your view to where the user left -off. - -- `deactivate()`: This **optional** method is called when the window is shutting -down, or when your package is being updated or disabled. If your package is -watching any files, holding external resources, providing commands or subscribing -to events, release them here. - -### Simple Package Code - -Your directory would look like this: - -```text -my-package/ - package.json - index.coffee - lib/ - my-package.coffee -``` - -`index.coffee` might be: -```coffeescript -module.exports = require "./lib/my-package" -``` - -`my-package/my-package.coffee` might start: -```coffeescript -module.exports = - activate: (state) -> # ... - deactivate: -> # ... - serialize: -> # ... -``` - -Beyond this simple contract, your package has access to [Atom's API][api]. Be aware -that the Atom 1.0 API is mostly frozen. Refer to the API documentation for what -is public. That said, please collaborate with us if you need an API that doesn't -exist. Our goal is to build out Atom's API organically based on the needs of -package authors like you. - -## Style Sheets - -Style sheets for your package should be placed in the _styles_ directory. -Any style sheets in this directory will be loaded and attached to the DOM when -your package is activated. Style sheets can be written as CSS or [Less], but -Less is recommended. - -Ideally, you won't need much in the way of styling. We've provided a standard -set of components which define both the colors and UI elements for any package -that fits into Atom seamlessly. You can view all of Atom's UI components by -opening the styleguide: open the command palette (`cmd-shift-P`) and search for -_styleguide_, or just type `cmd-ctrl-shift-G`. - -If you _do_ need special styling, try to keep only structural styles in the -package style sheets. If you _must_ specify colors and sizing, these should be -taken from the active theme's [ui-variables.less][ui-variables]. For more -information, see the [theme variables docs][theme-variables]. If you follow this -guideline, your package will look good out of the box with any theme! - -An optional `styleSheets` array in your _package.json_ can list the style sheets -by name to specify a loading order; otherwise, style sheets are loaded -alphabetically. - -## Keymaps - -It's recommended that you provide key bindings for commonly used actions for -your extension, especially if you're also adding a new command: - -```coffeescript -'.tree-view-scroller': - 'ctrl-V': 'changer:magic' -``` - -Keymaps are placed in the _keymaps_ subdirectory. By default, all keymaps are -loaded in alphabetical order. An optional `keymaps` array in your _package.json_ -can specify which keymaps to load and in what order. - - -Keybindings are executed by determining which element the keypress occurred on. -In the example above, `changer:magic` command is executed when pressing `ctrl-V` -on the `.tree-view-scroller` element. - -See the [main keymaps documentation][keymaps] for more detailed information on -how keymaps work. - -## Menus - -Menus are placed in the _menus_ subdirectory. By default, all menus are loaded -in alphabetical order. An optional `menus` array in your _package.json_ can -specify which menus to load and in what order. - -### Application Menu - -It's recommended that you create an application menu item for common actions -with your package that aren't tied to a specific element: - -```coffeescript -'menu': [ - { - 'label': 'Packages' - 'submenu': [ - { - 'label': 'My Package' - 'submenu': [ - { - 'label': 'Toggle' - 'command': 'my-package:toggle' - } - ] - } - ] - } -] -``` - -To add your own item to the application menu, simply create a top level `menu` -key in any menu configuration file in _menus_. This can be a JSON or [CSON] -file. - -The menu templates you specify are merged with all other templates provided -by other packages in the order which they were loaded. - -### Context Menu - -It's recommended to specify a context menu item for commands that are linked to -specific parts of the interface, like adding a file in the tree-view: - -```coffeescript -'context-menu': - '.tree-view': [ - {label: 'Add file', command: 'tree-view:add-file'} - ] - 'atom-workspace': [ - {label: 'Inspect Element', command: 'core:inspect'} - ] -``` - -To add your own item to the application menu simply create a top level -`context-menu` key in any menu configuration file in _menus_. This can be a -JSON or [CSON] file. - -Context menus are created by determining which element was selected and then -adding all of the menu items whose selectors match that element (in the order -which they were loaded). The process is then repeated for the elements until -reaching the top of the DOM tree. - -In the example above, the `Add file` item will only appear when the focused item -or one of its parents has the `tree-view` class applied to it. - -You can also add separators and submenus to your context menus. To add a -submenu, provide a `submenu` key instead of a command. To add a separator, add -an item with a single `type: 'separator'` key/value pair. - -```coffeescript -'context-menu': - 'atom-workspace': [ - { - label: 'Text' - submenu: [ - {label: 'Inspect Element', command: 'core:inspect'} - {type: 'separator'} - {label: 'Selector All', command: 'core:select-all'} - {type: 'separator'} - {label: 'Deleted Selected Text', command: 'core:delete'} - ] - } - ] -``` - -## Snippets - -An extension can supply language snippets in the _snippets_ directory which -allows the user to enter repetitive text quickly: - -```coffeescript -".source.coffee .specs": - "Expect": - prefix: "ex" - body: "expect($1).to$2" - "Describe": - prefix: "de" - body: """ - describe "${1:description}", -> - ${2:body} - """ -``` - -A snippets file contains scope selectors at its top level (`.source.coffee -.spec`). Each scope selector contains a hash of snippets keyed by their name -(`Expect`, `Describe`). Each snippet also specifies a `prefix` and a `body` key. -The `prefix` represents the first few letters to type before hitting the `tab` -key to autocomplete. The `body` defines the autofilled text. You can use -placeholders like `$1`, `$2`, to indicate regions in the body the user can -navigate to every time they hit `tab`. - -All files in the directory are automatically loaded, unless the _package.json_ -supplies a `snippets` key. As with all scoped items, snippets loaded later take -precedence over earlier snippets when two snippets match a scope with the same -specificity. - -## Language Grammars - -If you're developing a new language grammar, you'll want to place your file in -the _grammars_ directory. Each grammar is a pairing of two keys, `match` and -`captures`. `match` is a regular expression identifying the pattern to -highlight, while `captures` is an object representing what to do with each -matching group. - -For example: - - -```coffeescript -{ - 'match': '(?:^|\\s)(__[^_]+__)' - 'captures': - '1': 'name': 'markup.bold.gfm' -} -``` - -This indicates that the first matching capture (`(__[^_]+__)`) should have the -`markup.bold.gfm` token applied to it. - -To capture a single group, simply use the `name` key instead: - -```coffeescript -{ - 'match': '^#{1,6}\\s+.+$' - 'name': 'markup.heading.gfm' -} -``` - -This indicates that Markdown header lines (`#`, `##`, `###`) should be applied -with the `markup.heading.gfm` token. - -More information about the significance of these tokens can be found in -[section 12.4 of the TextMate Manual][tm-tokens]. - -Your grammar should also include a `filetypes` array, which is a list of file -extensions your grammar supports: - -```coffeescript -'fileTypes': [ - 'markdown' - 'md' - 'mkd' - 'mkdown' - 'ron' -] -``` - -## Adding Configuration Settings - -You can support config settings in your package that are editable in the -settings view. Specify a `config` key in your package main: - -```coffeescript -module.exports = - # Your config schema! - config: - someInt: - type: 'integer' - default: 23 - minimum: 1 - activate: (state) -> # ... - # ... -``` - -To define the configuration, we use [json schema][json-schema] which allows you -to indicate the type your value should be, its default, etc. - -See the [Config API Docs](https://atom.io/docs/api/latest/Config) for more -details specifying your configuration. - -## Interacting With Other Packages Via Services - -Atom packages can interact with each other through versioned APIs called -*services*. To provide a service, in your `package.json`, specify one or more -version numbers, each paired with the name of a method on your package's main module: - -```json -{ - "providedServices": { - "my-service": { - "description": "Does a useful thing", - "versions": { - "1.2.3": "provideMyServiceV1", - "2.3.4": "provideMyServiceV2", - } - } - } -} -``` - -In your package's main module, implement the methods named above. These methods -will be called any time a package is activated that consumes their corresponding -service. They should return a value that implements the service's API. - - -```coffeescript -module.exports = - activate: -> # ... - - provideMyServiceV1: -> - adaptToLegacyAPI(myService) - - provideMyServiceV2: -> - myService -``` - -Similarly, to consume a service, specify one or more [version *ranges*][version-ranges], -each paired with the name of a method on the package's main module: - -```json -{ - "consumedServices": { - "another-service": { - "versions": { - "^1.2.3": "consumeAnotherServiceV1", - ">=2.3.4 <2.5": "consumeAnotherServiceV2", - } - } - } -} -``` - -These methods will be called any time a package is activated that *provides* their -corresponding service. They will receive the service object as an argument. You -will usually need to perform some kind of cleanup in the event that the package -providing the service is deactivated. To do this, return a `Disposable` from -your service-consuming method: - -```coffeescript -{Disposable} = require 'atom' - -module.exports = - activate: -> # ... - - consumeAnotherServiceV1: (service) -> - useService(adaptServiceFromLegacyAPI(service)) - new Disposable -> stopUsingService(service) - - consumeAnotherServiceV2: (service) -> - useService(service) - new Disposable -> stopUsingService(service) -``` - -## Bundle External Resources - -It's common to ship external resources like images and fonts in the package, to -make it easy to reference the resources in HTML or CSS, you can use the `atom` -protocol URLs to load resources in the package. - -The URLs should be in the format of -`atom://package-name/relative-path-to-package-of-resource`, for example, the -`atom://image-view/images/transparent-background.gif` would be equivalent to -`~/.atom/packages/image-view/images/transparent-background.gif`. - -You can also use the `atom` protocol URLs in themes. - -## Writing Tests - -Your package **should** have tests, and if they're placed in the _spec_ -directory, they can be run by Atom. - -Under the hood, [Jasmine] executes your tests, so you can assume that any DSL -available there is also available to your package. - -## Running Tests - -Once you've got your test suite written, you can run it by pressing -`cmd-alt-ctrl-p` or via the _Developer > Run Package Specs_ menu. - -You can also use the `apm test` command to run them from the command line. It -prints the test output and results to the console and returns the proper status -code depending on whether the tests passed or failed. - -## Publishing - -Atom bundles a command line utility called apm which can be used to publish -Atom packages to the public registry. - -Once your package is written and ready for distribution you can run the -following to publish your package: - -```sh -cd my-package -apm publish minor -``` - -This will update your `package.json` to have a new minor `version`, commit the -change, create a new [Git tag][git-tag], and then upload the package to the -registry. - -Run `apm help publish` to see all the available options and `apm help` to see -all the other available commands. - -[api]: https://atom.io/docs/api/latest -[file-tree]: https://github.com/atom/tree-view -[status-bar]: https://github.com/atom/status-bar -[cs-syntax]: https://github.com/atom/language-coffee-script -[npm]: https://en.wikipedia.org/wiki/Npm_(software) -[npm-keys]: https://docs.npmjs.com/files/package.json -[git-tag]: http://git-scm.com/book/en/Git-Basics-Tagging -[wrap-guide]: https://github.com/atom/wrap-guide/ -[keymaps]: advanced/keymaps.md -[theme-variables]: theme-variables.md -[tm-tokens]: http://manual.macromates.com/en/language_grammars.html -[spacepen]: https://github.com/nathansobo/space-pen -[path]: http://nodejs.org/docs/latest/api/path.html -[jquery]: http://jquery.com/ -[underscore]: http://underscorejs.org/ -[jasmine]: http://jasmine.github.io -[cson]: https://github.com/atom/season -[Less]: http://lesscss.org -[ui-variables]: https://github.com/atom/atom-dark-ui/blob/master/styles/ui-variables.less -[first-package]: your-first-package.html -[convert-bundle]: converting-a-text-mate-bundle.html -[convert-theme]: converting-a-text-mate-theme.html -[json-schema]: http://json-schema.org/ -[version-ranges]: https://docs.npmjs.com/misc/semver#ranges diff --git a/docs-atom/creating-a-theme.md b/docs-atom/creating-a-theme.md deleted file mode 100644 index 6e8ab1dc45..0000000000 --- a/docs-atom/creating-a-theme.md +++ /dev/null @@ -1,148 +0,0 @@ -# Creating a Theme - -Atom's interface is rendered using HTML, and it's styled via [Less] which is a -superset of CSS. Don't worry if you haven't heard of Less before; it's just like -CSS, but with a few handy extensions. - -Atom supports two types of themes: _UI_ and _syntax_. UI themes style -elements such as the tree view, the tabs, drop-down lists, and the status bar. -Syntax themes style the code inside the editor. - -Themes can be installed and changed from the settings view which you can open -by selecting the _Atom > Preferences..._ menu and navigating to the _Install_ -section and the _Themes_ section on the left hand side. - -## Getting Started - -Themes are pretty straightforward but it's still helpful to be familiar with -a few things before starting: - -* Less is a superset of CSS, but it has some really handy features like - variables. If you aren't familiar with its syntax, take a few minutes - to [familiarize yourself][less-tutorial]. -* You may also want to review the concept of a _[package.json]_, too. This file - is used to help distribute your theme to Atom users. -* Your theme's _package.json_ must contain a `"theme"` key with a value - of `"ui"` or `"syntax"` for Atom to recognize and load it as a theme. -* You can find existing themes to install or fork on - [atom.io][atomio-themes]. - -## Creating a Syntax Theme - -Let's create your first theme. - -To get started, hit `cmd-shift-P`, and start typing "Generate Syntax Theme" to -generate a new theme package. Select "Generate Syntax Theme," and you'll be -asked for the path where your theme will be created. Let's call ours -_motif-syntax_. __Tip:__ syntax themes should end with _-syntax_. - -Atom will pop open a new window, showing the _motif-syntax_ theme, with a -default set of folders and files created for us. If you open the settings view -(`cmd-,`) and navigate to the _Themes_ section on the left, you'll see the -_Motif_ theme listed in the _Syntax Theme_ drop-down. Select it from the menu to -activate it, now when you open an editor you should see that your new -_motif-syntax_ theme in action. - -Open up _styles/colors.less_ to change the various colors variables which -have been already been defined. For example, turn `@red` into `#f4c2c1`. - -Then open _styles/base.less_ and modify the various selectors that have -been already been defined. These selectors style different parts of code in the -editor such as comments, strings and the line numbers in the gutter. - -As an example, let's make the `.gutter` `background-color` into `@red`. - -Reload Atom by pressing `cmd-alt-ctrl-l` to see the changes you made reflected -in your Atom window. Pretty neat! - -__Tip:__ You can avoid reloading to see changes you make by opening an atom -window in dev mode. To open a Dev Mode Atom window run `atom --dev .` in the -terminal, use `cmd-shift-o` or use the _View > Developer > Open in Dev Mode_ -menu. When you edit your theme, changes will instantly be reflected! - -> Note: It's advised to _not_ specify a `font-family` in your syntax theme because it will override the Font Family field in Atom's settings. If you still like to recommend a font that goes well with your theme, we recommend you do so in your README. - -## Creating an Interface Theme - -Interface themes **must** provide a `ui-variables.less` file which contains all -of the variables provided by the [core themes][ui-variables]. - -To create an interface UI theme, do the following: - -1. Fork one of the following repositories: - * [atom-dark-ui] - * [atom-light-ui] -2. Clone the forked repository to the local filesystem -3. Open a terminal in the forked theme's directory -4. Open your new theme in a Dev Mode Atom window run `atom --dev .` in the - terminal or use the _View > Developer > Open in Dev Mode_ menu -5. Change the name of the theme in the theme's `package.json` file -6. Name your theme end with a `-ui`. i.e. `super-white-ui` -7. Run `apm link` to symlink your repository to `~/.atom/packages` -8. Reload Atom using `cmd-alt-ctrl-L` -9. Enable the theme via _UI Theme_ drop-down in the _Themes_ section of the - settings view -10. Make changes! Since you opened the theme in a Dev Mode window, changes will - be instantly reflected in the editor without having to reload. - -## Development workflow - -There are a few of tools to help make theme development faster and easier. - -### Live Reload - -Reloading by hitting `cmd-alt-ctrl-L` after you make changes to your theme is -less than ideal. Atom supports [live updating][livereload] of styles on Dev Mode -Atom windows. - -To enable a Dev Mode window: - -1. Open your theme directory in a dev window by either going to the - __View > Developer > Open in Dev Mode__ menu or by hitting the `cmd-shift-o` - shortcut -2. Make a change to your theme file and save it. Your change should be - immediately applied! - -If you'd like to reload all the styles at any time, you can use the shortcut -`cmd-ctrl-shift-r`. - -### Developer Tools - -Atom is based on the Chrome browser, and supports Chrome's Developer Tools. You -can open them by selecting the _View > Toggle Developer Tools_ menu, or by -using the `cmd-alt-i` shortcut. - -The dev tools allow you to inspect elements and take a look at their CSS -properties. - -![devtools-img] - -Check out Google's [extensive tutorial][devtools-tutorial] for a short -introduction. - -### Atom Styleguide - -If you are creating an interface theme, you'll want a way to see how your theme -changes affect all the components in the system. The [styleguide] is a page that -renders every component Atom supports. - -To open the styleguide, open the command palette (`cmd-shift-P`) and search for -_styleguide_, or use the shortcut `cmd-ctrl-shift-g`. - -![styleguide-img] - -[atomio-themes]: https://atom.io/themes -[Less]: http://lesscss.org/ -[git]: http://git-scm.com/ -[atom]: https://atom.io/ -[package.json]: ./creating-a-package.html#package-json -[less-tutorial]: https://speakerdeck.com/danmatthews/less-css -[devtools-tutorial]: https://developer.chrome.com/devtools/docs/dom-and-styles -[ui-variables]: ./theme-variables.html -[livereload]: https://github.com/atom/dev-live-reload -[styleguide]: https://github.com/atom/styleguide -[atom-dark-ui]: https://github.com/atom/atom-dark-ui -[atom-light-ui]: https://github.com/atom/atom-light-ui -[styleguide-img]: https://f.cloud.github.com/assets/69169/1347390/2d431d98-36af-11e3-8f8e-3f4ce1e67adb.png -[devtools-img]: https://f.cloud.github.com/assets/69169/1347391/2d51f91c-36af-11e3-806f-f7b334af43e9.png -[themesettings-img]: https://f.cloud.github.com/assets/69169/1347569/3150bd0c-36b2-11e3-9d69-423503acfe3f.png diff --git a/docs-atom/customizing-atom.md b/docs-atom/customizing-atom.md deleted file mode 100644 index d2151f350e..0000000000 --- a/docs-atom/customizing-atom.md +++ /dev/null @@ -1,185 +0,0 @@ -# Customizing Atom - -To change a setting, configure a theme, or install a package just open the -Settings view in the current window by pressing `cmd-,`. - -## Changing The Theme - -Atom comes with both light and dark UI themes as well as several syntax themes. -You are also encouraged to [create or fork][create-theme] your own theme. - -To change the active theme just open the Settings view (`cmd-,`) and select the -`Themes` section from the left hand side. You will see a drop-down menu to -change the active _Syntax_ and _UI_ themes. - -You can also install more themes from here by browsing the featured themes or -searching for a specific theme. - -## Installing Packages - -You can install non-bundled packages by going to the `Packages` section on left -hand side of the Settings view (`cmd-,`). You will see several featured packages -and you can also search for packages from here. The packages listed here have -been published to [atom.io](http://atom.io/packages) which is the official -registry for Atom packages. - -You can also install packages from the command line using `apm`. - -Check that you have `apm` installed by running the following command in your -terminal: - -```sh -apm help install -``` - -You should see a message print out with details about the `apm install` command. - -If you do not, launch Atom and run the _Atom > Install Shell Commands_ menu -to install the `apm` and `atom` commands. - -You can also install packages by using the `apm install` command: - -* `apm install ` to install the latest version. - -* `apm install @` to install a specific version. - -For example `apm install emmet@0.1.5` installs the `0.1.5` release of the -[Emmet](https://github.com/atom/emmet) package into `~/.atom/packages`. - -You can also use `apm` to find new packages to install: - -* `apm search coffee` to search for CoffeeScript packages. - -* `apm view emmet` to see more information about a specific package. - -## Customizing Key Bindings - -Atom keymaps work similarly to style sheets. Just as style sheets use selectors -to apply styles to elements, Atom keymaps use selectors to associate keystrokes -with events in specific contexts. Here's a small example, excerpted from Atom's -built-in keymaps: - -```coffee -'atom-text-editor': - 'enter': 'editor:newline' - -'atom-text-editor[mini] input': - 'enter': 'core:confirm' -``` - -This keymap defines the meaning of `enter` in two different contexts. In a -normal editor, pressing `enter` emits the `editor:newline` event, which causes -the editor to insert a newline. But if the same keystroke occurs inside of a -select list's mini-editor, it instead emits the `core:confirm` event based on -the binding in the more-specific selector. - -By default, `~/.atom/keymap.cson` is loaded when Atom is started. It will always -be loaded last, giving you the chance to override bindings that are defined by -Atom's core keymaps or third-party packages. - -You can open this file in an editor from the _Atom > Open Your Keymap_ menu. - -You'll want to know all the commands available to you. Open the Settings panel -(`cmd-,`) and select the _Keybindings_ tab. It will show you all the keybindings -currently in use. - -## Advanced Configuration - -Atom loads configuration settings from the `config.cson` file in your _~/.atom_ -directory, which contains [CoffeeScript-style JSON][CSON] (CSON): - -```coffee -'core': - 'excludeVcsIgnoredPaths': true -'editor': - 'fontSize': 18 -``` - -The configuration itself is grouped by the package name or one of the two core -namespaces: `core` and `editor`. - -You can open this file in an editor from the _Atom > Open Your Config_ menu. - -### Configuration Key Reference - -- `core` - - `disabledPackages`: An array of package names to disable - - `excludeVcsIgnoredPaths`: Don't search within files specified by _.gitignore_ - - `followSymlinks`: Follow symlinks when searching and scanning root directory - - `ignoredNames`: File names to ignore across all of Atom - - `projectHome`: The directory where projects are assumed to be located - - `themes`: An array of theme names to load, in cascading order -- `editor` - - `autoIndent`: Enable/disable basic auto-indent (defaults to `true`) - - `nonWordCharacters`: A string of non-word characters to define word boundaries - - `fontSize`: The editor font size - - `fontFamily`: The editor font family - - `invisibles`: Specify characters that Atom renders for invisibles in this hash - - `tab`: Hard tab characters - - `cr`: Carriage return (for Microsoft-style line endings) - - `eol`: `\n` characters - - `space`: Leading and trailing space characters - - `preferredLineLength`: Identifies the length of a line (defaults to `80`) - - `showInvisibles`: Whether to render placeholders for invisible characters (defaults to `false`) - - `showIndentGuide`: Show/hide indent indicators within the editor - - `showLineNumbers`: Show/hide line numbers within the gutter - - `softWrap`: Enable/disable soft wrapping of text within the editor - - `softWrapAtPreferredLineLength`: Enable/disable soft line wrapping at `preferredLineLength` - - `tabLength`: Number of spaces within a tab (defaults to `2`) -- `fuzzyFinder` - - `ignoredNames`: Files to ignore *only* in the fuzzy-finder -- `whitespace` - - `ensureSingleTrailingNewline`: Whether to reduce multiple newlines to one at the end of files - - `removeTrailingWhitespace`: Enable/disable striping of whitespace at the end of lines (defaults to `true`) -- `wrap-guide` - - `columns`: Array of hashes with a `pattern` and `column` key to match the - the path of the current editor to a column position. - -### Quick Personal Hacks - -### init.coffee - -When Atom finishes loading, it will evaluate _init.coffee_ in your _~/.atom_ -directory, giving you a chance to run arbitrary personal [CoffeeScript][] code to -make customizations. You have full access to Atom's API from code in this file. -If customizations become extensive, consider [creating a package][creating-a-package]. - -You can open this file in an editor from the _Atom > Open Your Init Script_ -menu. - -For example, if you have the Audio Beep configuration setting enabled, you -could add the following code to your _~/.atom/init.coffee_ file to have Atom -greet you with an audio beep every time it loads: - -```coffee -atom.beep() -``` - -This file can also be named _init.js_ and contain JavaScript code. - -### styles.less - -If you want to apply quick-and-dirty personal styling changes without creating -an entire theme that you intend to publish, you can add styles to the -_styles.less_ file in your _~/.atom_ directory. - -You can open this file in an editor from the _Atom > Open Your Stylesheet_ menu. - -For example, to change the color of the cursor, you could add the following -rule to your _~/.atom/styles.less_ file: - -```less -atom-text-editor::shadow .cursor { - border-color: pink; -} -``` - -Unfamiliar with Less? Read more about it [here][Less]. - -This file can also be named _styles.css_ and contain CSS. - -[creating-a-package]: creating-a-package.md -[create-theme]: creating-a-theme.md -[Less]: http://www.lesscss.org -[CSON]: https://github.com/atom/season -[CoffeeScript]: http://coffeescript.org/ diff --git a/docs-atom/debugging.md b/docs-atom/debugging.md deleted file mode 100644 index ec202e7f8c..0000000000 --- a/docs-atom/debugging.md +++ /dev/null @@ -1,133 +0,0 @@ -# Debugging - -Atom provides several tools to help you understand unexpected behavior and debug problems. This guide describes some of those tools and a few approaches to help you debug and provide more helpful information when [submitting issues]: - -* [Update to the latest version](#update-to-the-latest-version) -* [Check for linked packages](#check-for-linked-packages) -* [Check Atom and package settings](#check-atom-and-package-settings) -* [Check the keybindings](#check-the-keybindings) -* [Check if the problem shows up in safe mode](#check-if-the-problem-shows-up-in-safe-mode) -* [Check your config files](#check-your-config-files) -* [Check for errors in the developer tools](#check-for-errors-in-the-developer-tools) - -## Update to the latest version - -You might be running into an issue which was already fixed in a more recent version of Atom than the one you're using. - -If you're building Atom from source, pull down the latest version of master and [re-build][building atom]. - -If you're using released version, check which version of Atom you're using: - -```shell -$ atom --version -0.99.0 -``` - -Head on over to the [list of releases][atom releases] and see if there's a more recent release. You can update to the most recent release by downloading Atom from the releases page, or with the in-app auto-updater. The in-app auto-updater checks for and downloads a new version after you restart Atom, or if you use the Atom > Check for Update menu option. - -## Check for linked packages - -If you develop or contribute to Atom packages, there may be left-over packages linked to your `~/.atom/packages` or `~/.atom/dev/packages` directories. You can use: - -```shell -$ apm links -``` - -to list all linked development packages. You can remove the links using the `apm unlink` command. See `apm unlink --help` for details. - -## Check Atom and package settings - -In some cases, unexpected behavior might be caused by misconfigured or unconfigured settings in Atom or in one of the packages. - -Open Atom's Settings View with `cmd-,` or the Atom > Preferences menu option. - -![Settings View] - -Check Atom's settings in the Settings pane, there's a description of each configuration option [here][customizing guide]. For example, if you want Atom to use hard tabs (real tabs) and not soft tabs (spaces), disable the "Soft Tabs" option. - -Since Atom ships with a set of packages and you can install additional packages yourself, check the list of packages and their settings. For example, if you'd like to get rid of the vertical line in the middle of the editor, disable the [Wrap Guide package]. And if you don't like it when Atom strips trailing whitespace or ensures that there's a single trailing newline in the file, you can configure that in the [Whitespace packages'][whitespace package] settings. - -![Package Settings] - -## Check the keybindings - -If a command is not executing when you hit a keystroke or the wrong command is executing, there might be an issue with the keybindings for that keystroke. Atom ships with the [Keybinding resolver][keybinding resolver package], a neat package which helps you understand which keybindings are executed. - -Show the keybinding resolver with cmd-. or with "Key Binding Resolver: Show" from the Command palette. With the keybinding resolver shown, hit a keystroke: - -![Keybinding Resolver] - -The keybinding resolver shows you a list of keybindings that exist for the keystroke, where each item in the list has the following: -* the command for the keybinding, -* the CSS selector used to define the context in which the keybinding is valid, and -* the file in which the keybinding is defined. - -Of all the keybinding that are listed (grey color), at most one keybinding is matched and executed (green color). If the command you wanted to trigger isn't listed, then a keybinding for that command hasn't been defined. More keybindings are provided by [packages] and you can [define your own keybindings][customizing keybindings]. - -If multiple keybindings are matched, Atom determines which keybinding will be executed based on the [specificity of the selectors and the order in which they were loaded][specificity and order]. If the command you wanted to trigger is listed in the Keybinding resolver, but wasn't the one that was executed, this is normally explained by one of two causes: -* the keystroke was not used in the context defined by the keybinding's selector. For example, you can't trigger the "Tree View: Add File" command if the Tree View is not focused, or -* there is another keybinding that took precedence. This often happens when you install a package which defines keybinding that conflict with existing keybindings. If the package's keybindings have selectors with higher specificity or were loaded later, they'll have priority over existing ones. - -Atom loads core Atom keybindings and package keybindings first, and user-defined keybindings after last. Since user-defined keybindings are loaded last, you can use your `keymap.cson` file to tweak the keybindings and sort out problems like these. For example, you can remove keybindings with [the `unset!` directive][unset directive]. - -If you notice that a package's keybindings are taking precedence over core Atom keybindings, it might be a good idea to report the issue on the package's GitHub repository. - -## Check if the problem shows up in safe mode - -A large part of Atom's functionality comes from packages you can install. In some cases, these packages might be causing unexpected behavior, problems, or performance issues. - -To determine if a package you installed is causing problems, start Atom from the terminal in safe mode: - -``` -$ atom --safe -``` - -This starts Atom, but does not load packages from `~/.atom/packages` or `~/.atom/dev/packages`. If you can no longer reproduce the problem in safe mode, it's likely it was caused by one of the packages. - -To figure out which package is causing trouble, start Atom normally again and open Settings (`cmd-,`). Since Settings allow you to disable each installed package, you can disable packages one by one until you can no longer reproduce the issue. Restart (`cmd-q`) or reload (`cmd-ctrl-alt-l`) Atom after you disable each package to make sure it's completely gone. - -When you find the problematic package, you can disable or uninstall the package, and consider creating an issue on the package's GitHub repository. - -## Check your config files - -You might have defined some custom functionality or styles in Atom's [Init script or Stylesheet]. In some situations, these personal hacks might be causing problems so try clearing those files and restarting Atom. - -## Check for errors in the developer tools - -When an error is thrown in Atom, the developer tools are automatically shown with the error logged in the Console tab. However, if the dev tools are open before the error is triggered, a full stack trace for the error will be logged: - -![devtools error] - -If you can reproduce the error, use this approach to get the full stack trace. The stack trace might point to a problem in your [Init script][init script or stylesheet] or a specific package you installed, which you can then disable and report an issue on its GitHub repository. - -## Check that you have a build toolchain installed - -If you are having issues installing a package using `apm install`, this could be -because the package has dependencies on libraries that contain native code -and so you will need to have a C++ compiler and Python installed to be able to -install it. - -You can run `apm install --check` to see if [apm][apm] can build native code on -your machine. - -Check out the pre-requisites in the [build instructions][build-instructions] for -your platform for more details. - -[apm]: https://github.com/atom/apm -[build-instructions]: https://github.com/atom/atom/tree/master/docs/build-instructions -[submitting issues]: https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues -[building atom]: https://github.com/atom/atom#building -[atom releases]: https://github.com/atom/atom/releases -[customizing guide]: https://atom.io/docs/latest/customizing-atom#configuration-key-reference -[settings view]: https://f.cloud.github.com/assets/671378/2241795/ba4827d8-9ce4-11e3-93a8-6666ee100917.png -[package settings]: https://cloud.githubusercontent.com/assets/38924/3173588/7e5f6b0c-ebe8-11e3-9ec3-e8d140967e79.png -[wrap guide package]: https://atom.io/packages/wrap-guide -[whitespace package]: https://atom.io/packages/whitespace -[keybinding resolver package]: https://atom.io/packages/keybinding-resolver -[keybinding resolver]: https://f.cloud.github.com/assets/671378/2241702/5dd5a102-9cde-11e3-9e3f-1d999930492f.png -[customizing keybindings]: https://atom.io/docs/latest/customizing-atom#customizing-key-bindings -[packages]: https://atom.io/packages -[specificity and order]: https://atom.io/docs/latest/advanced/keymaps#specificity-and-cascade-order -[unset directive]: https://atom.io/docs/latest/advanced/keymaps#removing-bindings -[init script or stylesheet]: https://atom.io/docs/latest/customizing-atom#quick-personal-hacks -[devtools error]: https://cloud.githubusercontent.com/assets/38924/3177710/11b4e510-ec13-11e3-96db-a2e8a7891773.png diff --git a/docs-atom/getting-started.md b/docs-atom/getting-started.md deleted file mode 100644 index 03e0a5abe2..0000000000 --- a/docs-atom/getting-started.md +++ /dev/null @@ -1,109 +0,0 @@ -# Getting Started - -Welcome to Atom! This guide provides a quick introduction so you can be -productive as quickly as possible. There are also guides which cover -[configuring], [theming], and [extending] Atom. - -## The Command Palette - -If there's one key-command you remember in Atom, it should be `cmd-shift-P`. You -can always press `cmd-shift-P` to bring up a list of commands (and key bindings) -that are relevant to the currently focused interface element. This is a great -way to explore the system and learn key bindings interactively. For information -about adding or changing a key binding refer to the [customizing key -bindings][key-bindings] section. - -![Command Palette] - -## The Basics - -### Working With Files - -Atom windows are scoped to a single directory on disk. If you launch Atom from -the command line via the `atom` command and don't specify a path, Atom opens a -window for the current working directory. The current window's directory will be -visible as the root of the tree view on the left, and also serve as the context -for all file-related operations. - -#### Finding Files - -The fastest way to find a file is to use the fuzzy finder. Press `cmd-t` and -begin typing the name of the file you're looking for. If you are looking for a -file that is already open press `cmd-b` to bring up a searchable list of open -files. If you are using Git you can use `cmd-shift-b` to search the list of -files modified and untracked in your project's repository. - -You can also use the tree view to navigate to a file. To open and focus the -tree view, press `ctrl-0`. The tree view can be toggled open and closed with -`cmd-\`. - -#### Adding, Moving, Deleting Files - -You can add, move, and delete files and folders by right-clicking them in the -tree view and selecting the desired operation from the context menu. You can -also perform these operations from the keyboard by selecting a file or folder -and using `a` to add, `m` to move, and `delete` to delete. - -### Searching - -#### Find and Replace - -To search within a buffer use `cmd-f`. To search the entire project use -`cmd-shift-f`. - -#### Navigating By Symbols - -To jump to a symbol such as a method definition, press `cmd-r`. This opens a -list of all symbols in the current file, which you can fuzzy filter similarly to -`cmd-t`. - -To search for symbols across your project, use `cmd-shift-r`. First you'll need -to make sure you have `tags` (or `TAGS`) file generated for your project. -This can be done by installing [ctags](http://ctags.sourceforge.net/) and -running a command such as `ctags -R src/` from the command line in your -project's root directory. Using [Homebrew](http://brew.sh/)? Just run -`brew install ctags`. - -You can customize how tags are generated by creating your own `.ctags` file -in your home directory (`~/.ctags`). Here is [a good example][ctags] to start -from. - -### Split Panes - -You can split any editor pane horizontally or vertically by using `cmd-k right` -or `cmd-k down`. Once you have a split pane, you can move focus between them -with `cmd-k cmd-right` or `cmd-k cmd-down`. To close a pane, close all its -editors with `cmd-w`, then press `cmd-w` one more time to close the pane. You -can configure panes to auto-close when empty in the Settings view. - -### Folding - -You can fold blocks of code by clicking the arrows that appear when you hover -your mouse cursor over the gutter. You can also fold and unfold from the -keyboard with `alt-cmd-[` and `alt-cmd-]`. To fold everything, use -`alt-cmd-shift-{` and to unfold everything use `alt-cmd-shift-}`. You can also -fold at a specific indentation level with `cmd-k cmd-N` where N is the -indentation depth. - -### Soft-Wrap - -If you want to toggle soft wrap, trigger the command from the command palette. -Press `cmd-shift-P` to open the palette, then type "wrap" to find the correct -command. By default, lines will wrap based on the size of the editor. If you -prefer to wrap at a specific line length, toggle "Wrap at preferred line length" -in preferences. - -## Configuration - -Press `cmd-,` to open the Settings view. This is the place to change settings, -install packages, and change the theme. - -For more advanced configuration see the [customization guide][customization]. - -[configuring]: customizing-atom.md -[theming]: creating-a-theme.md -[extending]: creating-a-package.md -[customization]: customizing-atom.md -[key-bindings]: customizing-atom.md#customizing-key-bindings -[command palette]: https://f.cloud.github.com/assets/1424/1091618/ee7c3554-166a-11e3-9955-aaa61bb5509c.png -[ctags]: https://github.com/atom/symbols-view/blob/master/lib/.ctags diff --git a/docs-atom/index.md b/docs-atom/index.md deleted file mode 100644 index 87e198e09f..0000000000 --- a/docs-atom/index.md +++ /dev/null @@ -1,29 +0,0 @@ -## Guides - -* [Getting Started](getting-started.md) -* [Customizing Atom](customizing-atom.md) -* [Creating a Package](creating-a-package.md) -* [Creating a Theme](creating-a-theme.md) -* [Publishing a Package](publishing-a-package.md) -* [Writing Specs](writing-specs.md) -* [Converting a TextMate Bundle](converting-a-text-mate-bundle.md) -* [Converting a TextMate Theme](converting-a-text-mate-theme.md) -* [Contributing](contributing.md) -* [Contributing to Core Packages](contributing-to-packages.md) -* [Debugging](debugging.md) -* [Your First Package](your-first-package.md) - -### Advanced Topics - -* [Configuration](advanced/configuration.md) -* [Developing Node Modules](advanced/node-modules.md) -* [Keymaps](advanced/keymaps.md) -* [Serialization](advanced/serialization.md) -* [Scopes and Scope Descriptors](advanced/scopes-and-scope-descriptors.md) -* [Theme Variables](theme-variables.md) -* [apm REST API](apm-rest-api.md) - -### Upgrading to 1.0 APIs - -* [Upgrading Your UI Theme Or Package Selectors](upgrading/upgrading-your-ui-theme.md) -* [Upgrading Your Syntax Theme](upgrading/upgrading-your-syntax-theme.md) diff --git a/docs-atom/publishing-a-package.md b/docs-atom/publishing-a-package.md deleted file mode 100644 index 264876c7ad..0000000000 --- a/docs-atom/publishing-a-package.md +++ /dev/null @@ -1,114 +0,0 @@ -## Publishing a Package - -This guide will show you how to publish a package or theme to the -[atom.io][atomio] package registry. - -Publishing a package allows other people to install it and use it in Atom. It -is a great way to share what you've made and get feedback and contributions from -others. - -This guide assumes your package's name is `my-package` but you should pick a -better name. - -### Install apm - -The `apm` command line utility that ships with Atom supports publishing packages -to the atom.io registry. - -Check that you have `apm` installed by running the following command in your -terminal: - -```sh -apm help publish -``` - -You should see a message print out with details about the `apm publish` command. - -If you do not, launch Atom and run the _Atom > Install Shell Commands_ menu -to install the `apm` and `atom` commands. - -### Prepare Your Package - -If you've followed the steps in the [your first package][your-first-package] -doc then you should be ready to publish and you can skip to the next step. - -If not, there are a few things you should check before publishing: - - * Your *package.json* file has `name`, `description`, and `repository` fields. - * Your *package.json* file has a `version` field with a value of `"0.0.0"`. - * Your *package.json* file has an `engines` field that contains an entry - for Atom such as: `"engines": {"atom": ">=0.50.0"}`. - * Your package has a `README.md` file at the root. - * Your package is in a Git repository that has been pushed to - [GitHub][github]. Follow [this guide][repo-guide] if your package isn't - already on GitHub. - -### Publish Your Package - -Before you publish a package it is a good idea to check ahead of time if -a package with the same name has already been published to atom.io. You can do -that by visiting `https://atom.io/packages/my-package` to see if the package -already exists. If it does, update your package's name to something that is -available before proceeding. - -Now let's review what the `apm publish` command does: - - 1. Registers the package name on atom.io if it is being published for the - first time. - 2. Updates the `version` field in the *package.json* file and commits it. - 3. Creates a new [Git tag][git-tag] for the version being published. - 4. Pushes the tag and current branch up to GitHub. - 5. Updates atom.io with the new version being published. - -Now run the following commands to publish your package: - -```sh -cd ~/github/my-package -apm publish minor -``` - -If this is the first package you are publishing, the `apm publish` command may -prompt you for your GitHub username and password. This is required to publish -and you only need to enter this information the first time you publish. The -credentials are stored securely in your [keychain][keychain] once you login. - -:tada: Your package is now published and available on atom.io. Head on over to -`https://atom.io/packages/my-package` to see your package's page. - -With `apm publish`, you can bump the version and publish by using -```sh -apm publish -``` -where `` can be `major`, `minor` and `patch`. - -The `major` option to the publish command tells apm to increment the first -digit of the version before publishing so the published version will be `1.0.0` -and the Git tag created will be `v1.0.0`. - -The `minor` option to the publish command tells apm to increment the second -digit of the version before publishing so the published version will be `0.1.0` -and the Git tag created will be `v0.1.0`. - -The `patch` option to the publish command tells apm to increment the third -digit of the version before publishing so the published version will be `0.0.1` -and the Git tag created will be `v0.0.1`. - -Use `major` when you make a huge change, like a rewrite, or a large change to the functionality or interface. -Use `minor` when adding or removing a feature. -Use `patch` when you make a small change like a bug fix that does not add or remove features. - -### Further Reading - -* Check out [semantic versioning][semver] to learn more about versioning your - package releases. -* Consult the [Atom.io package API docs][apm-rest-api] to learn more about how - `apm` works. - -[atomio]: https://atom.io -[github]: https://github.com -[git-tag]: http://git-scm.com/book/en/Git-Basics-Tagging -[keychain]: https://en.wikipedia.org/wiki/Keychain_(Apple) -[repo-guide]: http://guides.github.com/overviews/desktop -[semver]: http://semver.org -[your-first-package]: your-first-package.html -[apm-rest-api]: apm-rest-api.md diff --git a/docs-atom/template.jst b/docs-atom/template.jst deleted file mode 100644 index 89791feaa0..0000000000 --- a/docs-atom/template.jst +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - - - - - - Atom - <%= title %> - - - - - -
- <%= content %> -
- - \ No newline at end of file diff --git a/docs-atom/theme-variables.md b/docs-atom/theme-variables.md deleted file mode 100644 index 6bb6cd88be..0000000000 --- a/docs-atom/theme-variables.md +++ /dev/null @@ -1,118 +0,0 @@ -# Style variables - -EDGEHILL NOTE: THIS FILE IS NOT UP TO DATE. - -Atom's UI provides a set of variables you can use in your own themes and packages. - -## Use in Themes - -Each custom theme must specify a `ui-variables.less` file with all of the -following variables defined. The top-most theme specified in the theme settings -will be loaded and available for import. - -## Use in Packages - -In any of your package's `.less` files, you can access the theme variables -by importing the `ui-variables` file from Atom. - -Your package should generally only specify structural styling, and these should -come from [the style guide][styleguide]. Your package shouldn't specify colors, -padding sizes, or anything in absolute pixels. You should instead use the theme -variables. If you follow this guideline, your package will look good out of the -box with any theme! - -Here's an example `.less` file that a package can define using theme variables: - -```css -@import "ui-variables"; - -.my-selector { - background-color: @base-background-color; - padding: @component-padding; -} -``` - -## Variables - -### Text colors - -* `@text-color` -* `@text-color-subtle` -* `@text-color-highlight` -* `@text-color-selected` -* `@text-color-info` - A blue -* `@text-color-success`- A green -* `@text-color-warning`- An orange or yellow -* `@text-color-error` - A red - -### Background colors - -* `@background-color-info` - A blue -* `@background-color-success` - A green -* `@background-color-warning` - An orange or yellow -* `@background-color-error` - A red -* `@background-color-highlight` -* `@background-color-selected` -* `@app-background-color` - The app's background under all the editor components - -### Component colors - -* `@base-background-color` - -* `@base-border-color` - - -* `@pane-item-background-color` - -* `@pane-item-border-color` - - -* `@input-background-color` - -* `@input-border-color` - - -* `@tool-panel-background-color` - -* `@tool-panel-border-color` - - -* `@inset-panel-background-color` - -* `@inset-panel-border-color` - - -* `@panel-heading-background-color` - -* `@panel-heading-border-color` - - -* `@overlay-background-color` - -* `@overlay-border-color` - - -* `@button-background-color` - -* `@button-background-color-hover` - -* `@button-background-color-selected` - -* `@button-border-color` - - -* `@tab-bar-background-color` - -* `@tab-bar-border-color` - -* `@tab-background-color` - -* `@tab-background-color-active` - -* `@tab-border-color` - - -* `@tree-view-background-color` - -* `@tree-view-border-color` - - -* `@ui-site-color-1` - -* `@ui-site-color-2` - -* `@ui-site-color-3` - -* `@ui-site-color-4` - -* `@ui-site-color-5` - - -### Component sizes - -* `@disclosure-arrow-size` - - -* `@component-padding` - -* `@component-icon-padding` - -* `@component-icon-size` - -* `@component-line-height` - -* `@component-border-radius` - - -* `@tab-height` - - -### Fonts - -* `@font-size` - -* `@font-family` - - -[styleguide]: https://github.com/atom/styleguide diff --git a/docs-atom/upgrading/upgrading-your-package.md b/docs-atom/upgrading/upgrading-your-package.md deleted file mode 100644 index 9bde475efa..0000000000 --- a/docs-atom/upgrading/upgrading-your-package.md +++ /dev/null @@ -1,625 +0,0 @@ -# Upgrading your package to 1.0 APIs - -Atom is rapidly approaching 1.0. Much of the effort leading up to the 1.0 has been cleaning up APIs in an attempt to future proof, and make a more pleasant experience developing packages. - -This document will guide you through the large bits of upgrading your package to work with 1.0 APIs. - -## TL;DR - -We've set deprecation messages and errors in strategic places to help make sure you don't miss anything. You should be able to get 95% of the way to an updated package just by fixing errors and deprecations. There are a couple of things you can do to get the full effect of all the errors and deprecations. - -### Use atom-space-pen-views - -If you use any class from `require 'atom'` with a `$` or `View` in the name, add the `atom-space-pen-views` module to your package's `package.json` file's dependencies: - -```js -{ - "dependencies": { - "atom-space-pen-views": "^2.0.3" - } -} -``` - -Then run `apm install` in your package directory. - -### Require views from atom-space-pen-views - -Anywhere you are requiring one of the following from `atom` you need to require them from `atom-space-pen-views` instead. - -```coffee -# require these from 'atom-space-pen-views' rather than 'atom' -$ -$$ -$$$ -View -TextEditorView -ScrollView -SelectListView -``` - -So this: - -```coffee -# Old way -{$, TextEditorView, View, GitRepository} = require 'atom' -``` - -Would be replaced by this: - -```coffee -# New way -{GitRepository} = require 'atom' -{$, TextEditorView, View} = require 'atom-space-pen-views' -``` - -### Run specs and test your package - -You wrote specs, right!? Here's where they shine. Run them with `cmd-shift-P`, and search for `run package specs`. It will show all the deprecation messages and errors. - -### Update the engines field in package.json - -When you are deprecation free and all done converting, upgrade the `engines` field in your package.json: - -```json -{ - "engines": { - "atom": ">=0.174.0, <2.0.0" - } -} -``` - -### Examples - -We have upgraded all the core packages. Please see [this issue](https://github.com/atom/atom/issues/4011) for a link to all the upgrade PRs. - -## Deprecations - -All of the methods in Atom core that have changes will emit deprecation messages when called. These messages are shown in two places: your **package specs**, and in **Deprecation Cop**. - -### Specs - -Just run your specs, and all the deprecations will be displayed in yellow. - -![spec-deps](https://cloud.githubusercontent.com/assets/69169/5637943/b85114ba-95b5-11e4-8681-b81ea8f556d7.png) - -### Deprecation Cop - -Run an atom window in dev mode (`atom -d`) with your package loaded, and open Deprecation Cop (search for `deprecation` in the command palette). Deprecated methods will be appear in Deprecation Cop only after they have been called. - -![dep-cop](https://cloud.githubusercontent.com/assets/69169/5637914/6e702fa2-95b5-11e4-92cc-a236ddacee21.png) - -When deprecation cop is open, and deprecated methods are called, a `Refresh` button will appear in the top right of the Deprecation Cop interface. So exercise your package, then come back to Deprecation Cop and click the `Refresh` button. - -## Upgrading your Views - -Previous to 1.0, views were baked into Atom core. These views were based on jQuery and `space-pen`. They looked something like this: - -```coffee -# The old way: getting views from atom -{$, TextEditorView, View} = require 'atom' - -module.exports = -class SomeView extends View - @content: -> - @div class: 'find-and-replace', => - @div class: 'block', => - @subview 'myEditor', new TextEditorView(mini: true) - #... -``` - -### The New - -`require 'atom'` no longer provides view helpers or jQuery. Atom core is now 'view agnostic'. The preexisting view system is available from a new npm package: `atom-space-pen-views`. - -`atom-space-pen-views` now provides jQuery, `space-pen` views, and Atom specific views: - - -```coffee -# These are now provided by atom-space-pen-views -$ -$$ -$$$ -View -TextEditorView -ScrollView -SelectListView -``` - -### Adding the module dependencies - -To use the new views, you need to specify the `atom-space-pen-views` module in your package's `package.json` file's dependencies: - -```js -{ - "dependencies": { - "atom-space-pen-views": "^2.0.3" - } -} -``` - -`space-pen` bundles jQuery. If you do not need `space-pen` or any of the views, you can require jQuery directly. - -```js -{ - "dependencies": { - "jquery": "^2" - } -} -``` - -### Converting your views - -Sometimes it is as simple as converting the requires at the top of each view page. I assume you read the 'TL;DR' section and have updated all of your requires. - -### Upgrading classes extending any space-pen View - -#### `afterAttach` and `beforeRemove` updated - -The `afterAttach` and `beforeRemove` hooks have been replaced with -`attached` and `detached` and the semantics have changed. - -`afterAttach` was called whenever the node was attached to another DOM node, even if that parent node wasn't present in the DOM. `afterAttach` also was called with a boolean indicating whether or not the element and its parents were on the DOM. Now the `attached` hook is _only_ called when the node and all of its parents are actually on the DOM, and is not called with a boolean. - -`beforeRemove` was only called when `$.fn.remove` was called, which was typically used when the node was completely removed from the DOM. The new `detached` hook is called whenever the DOM node is _detached_, which could happen if the node is being detached for reattachment later. In short, if `beforeRemove` is called the node is never coming back. With `detached` it might be attached again later. - -```coffee -# Old way -{View} = require 'atom' -class MyView extends View - afterAttach: (onDom) -> - #... - - beforeRemove: -> - #... -``` - -```coffee -# New way -{View} = require 'atom-space-pen-views' -class MyView extends View - attached: -> - # Always called with the equivalent of @afterAttach(true)! - #... - - detached: -> - #... -``` - -#### `subscribe` and `subscribeToCommand` methods removed - -The `subscribe` and `subscribeToCommand` methods have been removed. See the Eventing and Disposables section for more info. - -### Upgrading to the new TextEditorView - -All of the atom-specific methods available on the `TextEditorView` have been moved to the `TextEditor`, available via `TextEditorView::getModel`. See the [`TextEditorView` docs][TextEditorView] and [`TextEditor` docs][TextEditor] for more info. - -### Upgrading classes extending ScrollView - -The `ScrollView` has very minor changes. - -You can no longer use `@off` to remove default behavior for `core:move-up`, `core:move-down`, etc. - -```coffee -# Old way to turn off default behavior -class ResultsView extends ScrollView - initialize: (@model) -> - super() - # turn off default scrolling behavior from ScrollView - @off 'core:move-up' - @off 'core:move-down' - @off 'core:move-left' - @off 'core:move-right' -``` - -```coffee -# New way to turn off default behavior -class ResultsView extends ScrollView - initialize: (@model) -> - disposable = super() - # turn off default scrolling behavior from ScrollView - disposable.dispose() -``` - -* Check out [an example](https://github.com/atom/find-and-replace/pull/311/files#diff-9) from find-and-replace. -* See the [docs][ScrollView] for all the options. - -### Upgrading classes extending SelectListView - -Your SelectListView might look something like this: - -```coffee -# Old! -class CommandPaletteView extends SelectListView - initialize: -> - super() - @addClass('command-palette overlay from-top') - atom.workspaceView.command 'command-palette:toggle', => @toggle() - - confirmed: ({name, jQuery}) -> - @cancel() - # do something with the result - - toggle: -> - if @hasParent() - @cancel() - else - @attach() - - attach: -> - @storeFocusedElement() - - items = [] # TODO: build items - @setItems(items) - - atom.workspaceView.append(this) - @focusFilterEditor() - - confirmed: ({name, jQuery}) -> - @cancel() -``` - -This attaches and detaches itself from the dom when toggled, canceling magically detaches it from the DOM, and it uses the classes `overlay` and `from-top`. - -The new SelectListView no longer automatically detaches itself from the DOM when cancelled. It's up to you to implement whatever cancel beahavior you want. Using the new APIs to mimic the sematics of the old class, it should look like this: - -```coffee -# New! -class CommandPaletteView extends SelectListView - initialize: -> - super() - # no more need for the `overlay` and `from-top` classes - @addClass('command-palette') - atom.commands.add 'atom-workspace', 'command-palette:toggle', => @toggle() - - # You need to implement the `cancelled` method and hide. - cancelled: -> - @hide() - - confirmed: ({name, jQuery}) -> - @cancel() - # do something with the result - - toggle: -> - # Toggling now checks panel visibility, - # and hides / shows rather than attaching to / detaching from the DOM. - if @panel?.isVisible() - @cancel() - else - @show() - - show: -> - # Now you will add your select list as a modal panel to the workspace - @panel ?= atom.workspace.addModalPanel(item: this) - @panel.show() - - @storeFocusedElement() - - items = [] # TODO: build items - @setItems(items) - - @focusFilterEditor() - - hide: -> - @panel?.hide() -``` - -* And check out the [conversion of CommandPaletteView][selectlistview-example] as a real-world example. -* See the [SelectListView docs][SelectListView] for all options. - -## Using the model layer rather than the view layer - -The API no longer exposes any specialized view objects or view classes. `atom.workspaceView`, and all the view classes: `WorkspaceView`, `EditorView`, `PaneView`, etc. have been globally deprecated. - -Nearly all of the atom-specific actions performed by the old view objects can now be managed via the model layer. For example, here's adding a panel to the interface using the `atom.workspace` model instead of the `workspaceView`: - -```coffee -# Old! -div = document.createElement('div') -atom.workspaceView.appendToTop(div) -``` - -```coffee -# New! -div = document.createElement('div') -atom.workspace.addTopPanel(item: div) -``` - -For actions that still require the view, such as dispatching commands or munging css classes, you'll access the view via the `atom.views.getView()` method. This will return a subclass of `HTMLElement` rather than a jQuery object or an instance of a deprecated view class (e.g. `WorkspaceView`). - -```coffee -# Old! -workspaceView = atom.workspaceView -editorView = workspaceView.getActiveEditorView() -paneView = editorView.getPaneView() -``` - -```coffee -# New! -# Generally, just use the models -workspace = atom.workspace -editor = workspace.getActiveTextEditor() -pane = editor.getPane() - -# If you need views, get them with `getView` -workspaceElement = atom.views.getView(atom.workspace) -editorElement = atom.views.getView(editor) -paneElement = atom.views.getView(pane) -``` - -## Updating Specs - -`atom.workspaceView`, the `WorkspaceView` class and the `EditorView` class have been deprecated. These two objects are used heavily throughout specs, mostly to dispatch events and commands. This section will explain how to remove them while still retaining the ability to dispatch events and commands. - -### Removing WorkspaceView references - -`WorkspaceView` has been deprecated. Everything you could do on the view, you can now do on the `Workspace` model. - -Requiring `WorkspaceView` from `atom` and accessing any methods on it will throw a deprecation warning. Many specs lean heavily on `WorkspaceView` to trigger commands and fetch `EditorView` objects. - -Your specs might contain something like this: - -```coffee -# Old! -{WorkspaceView} = require 'atom' -describe 'FindView', -> - beforeEach -> - atom.workspaceView = new WorkspaceView() -``` - -Instead, we will use the `atom.views.getView()` method. This will return a plain `HTMLElement`, not a `WorkspaceView` or jQuery object. - -```coffee -# New! -describe 'FindView', -> - workspaceElement = null - beforeEach -> - workspaceElement = atom.views.getView(atom.workspace) -``` - -### Attaching the workspace to the DOM - -The workspace needs to be attached to the DOM in some cases. For example, view hooks only work (`attached()` on `View`, `attachedCallback()` on custom elements) when there is a descendant attached to the DOM. - -You might see this in your specs: - -```coffee -# Old! -atom.workspaceView.attachToDom() -``` - -Change it to: - -```coffee -# New! -jasmine.attachToDOM(workspaceElement) -``` - -### Removing EditorView references - -Like `WorkspaceView`, `EditorView` has been deprecated. Everything you needed to do on the view you are now able to do on the `TextEditor` model. - -In many cases, you will not even need to get the editor's view anymore. Any of those instances should be updated to use the `TextEditor` instance instead. You should really only need the editor's view when you plan on triggering a command on the view in a spec. - -Your specs might contain something like this: - -```coffee -# Old! -describe 'Something', -> - [editorView] = [] - beforeEach -> - editorView = atom.workspaceView.getActiveView() -``` - -We're going to use `atom.views.getView()` again to get the editor element. As in the case of the `workspaceElement`, `getView` will return a subclass of `HTMLElement` rather than an `EditorView` or jQuery object. - -```coffee -# New! -describe 'Something', -> - [editor, editorElement] = [] - beforeEach -> - editor = atom.workspace.getActiveTextEditor() - editorElement = atom.views.getView(editor) -``` - -### Dispatching commands - -Since the `editorElement` objects are no longer `jQuery` objects, they no longer support `trigger()`. Additionally, Atom has a new command dispatcher, `atom.commands`, that we use rather than commandeering jQuery's `trigger` method. - -From this: - -```coffee -# Old! -workspaceView.trigger 'a-package:toggle' -editorView.trigger 'find-and-replace:show' -``` - -To this: - -```coffee -# New! -atom.commands.dispatch workspaceElement, 'a-package:toggle' -atom.commands.dispatch editorElement, 'find-and-replace:show' -``` - -## Eventing and Disposables - -A couple large things changed with respect to events: - -1. All model events are now exposed as event subscription methods that return [`Disposable`][disposable] objects -1. The `subscribe()` method is no longer available on `space-pen` `View` objects -1. An Emitter is now provided from `require 'atom'` - -### Consuming Events - -All events from the Atom API are now methods that return a [`Disposable`][disposable] object, on which you can call `dispose()` to unsubscribe. - -```coffee -# Old! -editor.on 'changed', -> -``` - -```coffee -# New! -disposable = editor.onDidChange -> - -# You can unsubscribe at some point in the future via `dispose()` -disposable.dispose() -``` - -Deprecation warnings will guide you toward the correct methods. - -#### Using a CompositeDisposable - -You can group multiple disposables into a single disposable with a `CompositeDisposable`. - -```coffee -{CompositeDisposable} = require 'atom' - -class Something - constructor: -> - editor = atom.workspace.getActiveTextEditor() - @disposables = new CompositeDisposable - @disposables.add editor.onDidChange -> - @disposables.add editor.onDidChangePath -> - - destroy: -> - @disposables.dispose() -``` - -### Removing View::subscribe and Subscriber::subscribe calls - -There were a couple permutations of `subscribe()`. In these examples, a `CompositeDisposable` is used as it will commonly be useful where conversion is necessary. - -#### subscribe(unsubscribable) - -This one is very straight forward. - -```coffee -# Old! -@subscribe editor.on 'changed', -> -``` - -```coffee -# New! -disposables = new CompositeDisposable -disposables.add editor.onDidChange -> -``` - -#### subscribe(modelObject, event, method) - -When the modelObject is an Atom model object, the change is very simple. Just use the correct event method, and add it to your CompositeDisposable. - -```coffee -# Old! -@subscribe editor, 'changed', -> -``` - -```coffee -# New! -disposables = new CompositeDisposable -disposables.add editor.onDidChange -> -``` - -#### subscribe(jQueryObject, selector(optional), event, method) - -Things are a little more complicated when subscribing to a DOM or jQuery element. Atom no longer provides helpers for subscribing to elements. You can use jQuery or the native DOM APIs, whichever you prefer. - -```coffee -# Old! -@subscribe $(window), 'focus', -> -``` - -```coffee -# New! -{Disposable, CompositeDisposable} = require 'atom' -disposables = new CompositeDisposable - -# New with jQuery -focusCallback = -> -$(window).on 'focus', focusCallback -disposables.add new Disposable -> - $(window).off 'focus', focusCallback - -# New with native APIs -focusCallback = -> -window.addEventListener 'focus', focusCallback -disposables.add new Disposable -> - window.removeEventListener 'focus', focusCallback -``` - -### Providing Events: Using the Emitter - -You no longer need to require `emissary` to get an emitter. We now provide an `Emitter` class from `require 'atom'`. We have a specific pattern for use of the `Emitter`. Rather than mixing it in, we instantiate a member variable, and create explicit subscription methods. For more information see the [`Emitter` docs][emitter]. - -```coffee -# New! -{Emitter} = require 'atom' - -class Something - constructor: -> - @emitter = new Emitter - - destroy: -> - @emitter.dispose() - - onDidChange: (callback) -> - @emitter.on 'did-change', callback - - methodThatFiresAChange: -> - @emitter.emit 'did-change', {data: 2} - -# Using the evented class -something = new Something -something.onDidChange (eventObject) -> - console.log eventObject.data # => 2 -something.methodThatFiresAChange() -``` - -## Subscribing To Commands - -`$.fn.command` and `View::subscribeToCommand` are no longer available. Now we use `atom.commands.add`, and collect the results in a `CompositeDisposable`. See [the docs][commands-add] for more info. - -```coffee -# Old! -atom.workspaceView.command 'core:close core:cancel', -> - -# When inside a View class, you might see this -@subscribeToCommand 'core:close core:cancel', -> -``` - -```coffee -# New! -@disposables.add atom.commands.add 'atom-workspace', - 'core:close': -> - 'core:cancel': -> - -# You can register commands directly on individual DOM elements in addition to -# using selectors. When in a View class, you should have a `@element` object -# available. `@element` is a plain HTMLElement object -@disposables.add atom.commands.add @element, - 'core:close': -> - 'core:cancel': -> -``` - -## Upgrading your stylesheet's selectors - -Many selectors have changed, and we have introduced the [Shadow DOM][shadowdom] to the editor. See [Upgrading Your Package Selectors guide][upgrading-selectors] for more information in upgrading your package stylesheets. - -## Help us improve this guide! - -Did you hit something painful that wasn't in here? Want to reword some bit of it? Find something incorrect? Please edit [this file][guide], and send a pull request. Contributions are greatly appreciated. - - - - -[texteditorview]:https://github.com/atom/atom-space-pen-views#texteditorview -[scrollview]:https://github.com/atom/atom-space-pen-views#scrollview -[selectlistview]:https://github.com/atom/atom-space-pen-views#selectlistview -[selectlistview-example]:https://github.com/atom/command-palette/pull/19/files -[emitter]:https://atom.io/docs/api/latest/Emitter -[texteditor]:https://atom.io/docs/api/latest/TextEditor -[disposable]:https://atom.io/docs/api/latest/Disposable -[commands-add]:https://atom.io/docs/api/latest/CommandRegistry#instance-add -[upgrading-selectors]:upgrading-your-ui-theme -[shadowdom]:http://blog.atom.io/2014/11/18/avoiding-style-pollution-with-the-shadow-dom.html -[guide]:https://github.com/atom/atom/blob/master/docs/upgrading/upgrading-your-package.md diff --git a/docs-atom/upgrading/upgrading-your-syntax-theme.md b/docs-atom/upgrading/upgrading-your-syntax-theme.md deleted file mode 100644 index 3a8241ca08..0000000000 --- a/docs-atom/upgrading/upgrading-your-syntax-theme.md +++ /dev/null @@ -1,24 +0,0 @@ -# Upgrading Your Syntax Theme - -Text editor content is now rendered in the shadow DOM, which shields it from being styled by global style sheets to protect against accidental style pollution. For more background on the shadow DOM, check out the [Shadow DOM 101][shadow-dom-101] on HTML 5 Rocks. - -Syntax themes are specifically intended to style only text editor content, so they are automatically loaded directly into the text editor's shadow DOM when it is enabled. This happens automatically when the the theme's `package.json` contains a `theme: "syntax"` declaration, so you don't need to change anything to target the appropriate context. - -When theme style sheets are loaded into the text editor's shadow DOM, selectors intended to target the editor from the *outside* no longer make sense. Styles targeting the `.editor` and `.editor-colors` classes instead need to target the `:host` pseudo-element, which matches against the containing `atom-text-editor` node. Check out the [Shadow DOM 201][host-pseudo-element] article for more information about the `:host` pseudo-element. - -Here's an example from Atom's light syntax theme. Note that the `atom-text-editor` selector intended to target the editor from the outside has been retained to allow the theme to keep working during the transition phase when it is possible to disable the shadow DOM. - -```css -atom-text-editor, :host { /* :host added */ - background-color: @syntax-background-color; - color: @syntax-text-color; - - .invisible-character { - color: @syntax-invisible-character-color; - } - /* more nested selectors... */ -} -``` - -[shadow-dom-101]: http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom -[host-pseudo-element]: http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201#toc-style-host diff --git a/docs-atom/upgrading/upgrading-your-ui-theme.md b/docs-atom/upgrading/upgrading-your-ui-theme.md deleted file mode 100644 index 822b0759ad..0000000000 --- a/docs-atom/upgrading/upgrading-your-ui-theme.md +++ /dev/null @@ -1,137 +0,0 @@ -# Upgrading Your UI Theme Or Package Selectors - -In addition to changes in Atom's scripting API, we'll also be making some breaking changes to Atom's DOM structure, requiring style sheets and keymaps in both packages and themes to be updated. - -## Deprecation Cop - -Deprecation cop will list usages of deprecated selector patterns to guide you. You can access it via the command palette (`cmd-shift-p`, then search for `Deprecation`). It breaks the deprecations down by package: - -![dep-cop](https://cloud.githubusercontent.com/assets/69169/5078860/d38a5df4-6e64-11e4-95b6-eb585ee9bbfc.png) - -## Custom Tags - -Rather than adding classes to standard HTML elements to indicate their role, Atom now uses custom element names. For example, `
` has now been replaced with ``. Selectors should be updated accordingly. Note that tag names have lower specificity than classes in CSS, so you'll need to take care in converting things. - -Old Selector | New Selector ---------------------|-------------------------------- -`.editor` | `atom-text-editor` -`.editor.mini` | `atom-text-editor[mini]` -`.workspace` | `atom-workspace` -`.horizontal` | `atom-workspace-axis.horizontal` -`.vertical` | `atom-workspace-axis.vertical` -`.pane-container` | `atom-pane-conatiner` -`.pane` | `atom-pane` -`.tool-panel` | `atom-panel` -`.panel-top` | `atom-panel.top` -`.panel-bottom` | `atom-panel.bottom` -`.panel-left` | `atom-panel.left` -`.panel-right` | `atom-panel.right` -`.overlay` | `atom-panel.modal` - -## Supporting the Shadow DOM - -Text editor content is now rendered in the shadow DOM, which shields it from being styled by global style sheets to protect against accidental style pollution. For more background on the shadow DOM, check out the [Shadow DOM 101][shadow-dom-101] on HTML 5 Rocks. If you need to style text editor content in a UI theme, you'll need to circumvent this protection for any rules that target the text editor's content. Some examples of the kinds of UI theme styles needing to be updated: - -* Highlight decorations -* Gutter decorations -* Line decorations -* Scrollbar styling -* Anything targeting a child selector of `.editor` - -During a transition phase, it will be possible to enable or disable the text editor's shadow DOM in the settings, so themes will need to be compatible with both approaches. - -### Shadow DOM Selectors - -Chromium provides two tools for bypassing shadow boundaries, the `::shadow` pseudo-element and the `/deep/` combinator. For an in-depth explanation of styling the shadow DOM, see the [Shadow DOM 201][shadow-dom-201] article on HTML 5 Rocks. - -#### ::shadow - -The `::shadow` pseudo-element allows you to bypass a single shadow root. For example, say you want to update a highlight decoration for a linter package. Initially, the style looks as follows: - -```css -// Without shadow DOM support -atom-text-editor .highlight.my-linter { - background: hotpink; -} -``` - -In order for this style to apply with the shadow DOM enabled, you will need to add a second selector with the `::shadow` pseudo-element. You should leave the original selector in place so your theme continues to work with the shadow DOM disabled during the transition period. - -```css -// With shadow DOM support -atom-text-editor .highlight.my-linter, -atom-text-editor::shadow .highlight.my-linter { - background: hotpink; -} -``` - -Check out the [find-and-replace][find-and-replace] package for another example of using `::shadow` to pierce the shadow DOM. - -#### /deep/ - -The `/deep/` combinator overrides *all* shadow boundaries, making it useful for rules you want to apply globally such as scrollbar styling. Here's a snippet containing scrollbar styling for the Atom Dark UI theme before shadow DOM support: - -```css -// Without shadow DOM support -.scrollbars-visible-always { - ::-webkit-scrollbar { - width: 8px; - height: 8px; - } - - ::-webkit-scrollbar-track, - ::-webkit-scrollbar-corner { - background: @scrollbar-background-color; - } - - ::-webkit-scrollbar-thumb { - background: @scrollbar-color; - border-radius: 5px; - box-shadow: 0 0 1px black inset; - } -} -``` - -To style scrollbars even inside of the shadow DOM, each rule needs to be prefixed with `/deep/`. We use `/deep/` instead of `::shadow` because we don't care about the selector of the host element in this case. We just want our styling to apply everywhere. - -```css -// With shadow DOM support using /deep/ -.scrollbars-visible-always { - /deep/ ::-webkit-scrollbar { - width: 8px; - height: 8px; - } - - /deep/ ::-webkit-scrollbar-track, - /deep/ ::-webkit-scrollbar-corner { - background: @scrollbar-background-color; - } - - /deep/ ::-webkit-scrollbar-thumb { - background: @scrollbar-color; - border-radius: 5px; - box-shadow: 0 0 1px black inset; - } -} -``` - -### Context-Targeted Style Sheets - -The selector features discussed above allow you to target shadow DOM content with specific selectors, but Atom also allows you to target a specific shadow DOM context with an entire style sheet. The context into which a style sheet is loaded is based on the file name. If you want to load a style sheet into the editor, name it with the `.atom-text-editor.less` or `.atom-text-editor.css` extensions. - -``` -my-ui-theme/ - styles/ - index.less # loaded globally - index.atom-text-editor.less # loaded in the text editor shadow DOM -``` - -Check out this [style sheet](https://github.com/atom/decoration-example/blob/master/styles/decoration-example.atom-text-editor.less) from the decoration-example package for an example of context-targeting. - -Inside a context-targeted style sheet, there's no need to use the `::shadow` or `/deep/` expressions. If you want to refer to the element containing the shadow root, you can use the `::host` pseudo-element. - -During the transition phase, style sheets targeting the `atom-text-editor` context will *also* be loaded globally. Make sure you update your selectors in a way that maintains compatibility with the shadow DOM being disabled. That means if you use a `::host` pseudo element, you should also include the same style rule matches against `atom-text-editor`. - -[shadow-dom-101]: http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom -[shadow-dom-201]: http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201#toc-style-cat-hat -[find-and-replace]: https://github.com/atom/find-and-replace/blob/95351f261bc384960a69b66bf12eae8002da63f9/styles/find-and-replace.less#L10 diff --git a/docs-atom/writing-specs.md b/docs-atom/writing-specs.md deleted file mode 100644 index 38db57439f..0000000000 --- a/docs-atom/writing-specs.md +++ /dev/null @@ -1,136 +0,0 @@ -# Writing specs - -Atom uses [Jasmine](http://jasmine.github.io/1.3/introduction.html) as its spec framework. Any new functionality should have specs to guard against regressions. - -## Create a new spec - -[Atom specs](https://github.com/atom/atom/tree/master/spec) and [package specs](https://github.com/atom/markdown-preview/tree/master/spec) are added to their respective `spec` directory. The example below creates a spec for Atom core. - -0. Create a spec file - - Spec files **must** end with `-spec` so add `sample-spec.coffee` to `atom/spec`. - -0. Add one or more `describe` methods - - The `describe` method takes two arguments, a description and a function. If the description explains a behavior it typically begins with `when`; if it is more like a unit test it begins with the method name. - - ```coffee - describe "when a test is written", -> - # contents - ``` - - or - - ```coffee - describe "Editor::moveUp", -> - # contents - ``` - -0. Add one or more `it` method - - The `it` method also takes two arguments, a description and a function. Try and make the description flow with the `it` method. For example, a description of `this should work` doesn't read well as `it this should work`. But a description of `should work` sounds great as `it should work`. - - ```coffee - describe "when a test is written", -> - it "has some expectations that should pass", -> - # Expectations - ``` - -0. Add one or more expectations - - The best way to learn about expectations is to read the [jasmine documentation](http://jasmine.github.io/1.3/introduction.html#section-Expectations) about them. Below is a simple example. - - ```coffee - describe "when a test is written", -> - it "has some expectations that should pass", -> - expect("apples").toEqual("apples") - expect("oranges").not.toEqual("apples") - ``` - -## Asynchronous specs - -Writing Asynchronous specs can be tricky at first. Some examples. - -0. Promises - - Working with promises is rather easy in Atom. You can use our `waitsForPromise` function. - - ```coffee - describe "when we open a file", -> - it "should be opened in an editor", -> - waitsForPromise -> - atom.workspace.open('c.coffee').then (editor) -> - expect(editor.getPath()).toContain 'c.coffee' - ``` - - This method can be used in the `describe`, `it`, `beforeEach` and `afterEach` functions. - - ```coffee - describe "when we open a file", -> - beforeEach -> - waitsForPromise -> - atom.workspace.open 'c.coffee' - - it "should be opened in an editor", -> - expect(atom.workspace.getActiveTextEditor().getPath()).toContain 'c.coffee' - - ``` - - If you need to wait for multiple promises use a new `waitsForPromise` function for each promise. (Caution: Without `beforeEach` this example will fail!) - - ```coffee - describe "waiting for the packages to load", -> - - beforeEach -> - waitsForPromise -> - atom.workspace.open('sample.js') - waitsForPromise -> - atom.packages.activatePackage('tabs') - waitsForPromise -> - atom.packages.activatePackage('tree-view') - - it 'should have waited long enough', -> - expect(atom.packages.isPackageActive('tabs')).toBe true - expect(atom.packages.isPackageActive('tree-view')).toBe true - ``` - -0. Asynchronous functions with callbacks - - Specs for asynchronous functions can be done using the `waitsFor` and `runs` functions. A simple example. - - ```coffee - describe "fs.readdir(path, cb)", -> - it "is async", -> - spy = jasmine.createSpy('fs.readdirSpy') - - fs.readdir('/tmp/example', spy) - waitsFor -> - spy.callCount > 0 - runs -> - exp = [null, ['example.coffee']] - expect(spy.mostRecentCall.args).toEqual exp - expect(spy).toHaveBeenCalledWith(null, ['example.coffee']) - ``` - -For a more detailed documentation on asynchronous tests please visit the [jasmine documentation](http://jasmine.github.io/1.3/introduction.html#section-Asynchronous_Support). - - -## Running specs - -Most of the time you'll want to run specs by triggering the `window:run-package-specs` command. This command is not only to run package specs, it is also for Atom core specs. This will run all the specs in the current project's spec directory. If you want to run the Atom core specs and **all** the default package specs trigger the `window:run-all-specs` command. - -To run a limited subset of specs use the `fdescribe` or `fit` methods. You can use those to focus a single spec or several specs. In the example above, focusing an individual spec looks like this: - -```coffee -describe "when a test is written", -> - fit "has some expectations that should pass", -> - expect("apples").toEqual("apples") - expect("oranges").not.toEqual("apples") -``` - -### Running on CI - -It is now easy to run the specs in a CI environment like Travis and AppVeyor. See the -[Travis CI For Your Packages](http://blog.atom.io/2014/04/25/ci-for-your-packages.html) -and [AppVeyor CI For Your Packages](http://blog.atom.io/2014/07/28/windows-ci-for-your-packages.html) -posts for more details. diff --git a/docs-atom/your-first-package.md b/docs-atom/your-first-package.md deleted file mode 100644 index eb882abc7c..0000000000 --- a/docs-atom/your-first-package.md +++ /dev/null @@ -1,158 +0,0 @@ -# Create Your First Package - -This tutorial will guide you though creating a simple command that replaces the -selected text with [ascii art](https://en.wikipedia.org/wiki/ASCII_art). When you -run our new command with the word "cool" selected, it will be replaced with: - -``` - ___ - /\_ \ - ___ ___ ___\//\ \ - /'___\ / __`\ / __`\\ \ \ -/\ \__//\ \L\ \/\ \L\ \\_\ \_ -\ \____\ \____/\ \____//\____\ - \/____/\/___/ \/___/ \/____/ -``` - -The final package can be viewed at -[https://github.com/atom/ascii-art](https://github.com/atom/ascii-art). - -To begin, press `cmd-shift-P` to bring up the [Command -Palette](https://github.com/atom/command-palette). Type "generate package" and -select the "Package Generator: Generate Package" command. Now we need to name -the package. Try to avoid naming your package with the *atom-* prefix, for -example we are going to call this package _ascii-art_. - -Atom will open a new window with the contents of our new _ascii-art_ package -displayed in the Tree View. Because this window is opened **after** the package -is created, the ASCII Art package will be loaded and available in our new -window. To verify this, toggle the Command Palette (`cmd-shift-P`) and type -"ASCII Art". You'll see a new `ASCII Art: Toggle` command. When triggered, this -command displays a default message. - -Now let's edit the package files to make our ASCII Art package do something -interesting. Since this package doesn't need any UI, we can remove all -view-related code. Start by opening up _lib/ascii-art.coffee_. Remove all view -code, so the `module.exports` section looks like this: - -```coffeescript -module.exports = - activate: -> -``` - -## Create a Command - -Now let's add a command. We recommend that you namespace your commands with the -package name followed by a `:`, so we'll call our command `ascii-art:convert`. -Register the command in _lib/ascii-art.coffee_: - -```coffeescript -module.exports = - activate: -> - atom.commands.add 'atom-workspace', "ascii-art:convert", => @convert() - - convert: -> - # This assumes the active pane item is an editor - editor = atom.workspace.getActivePaneItem() - editor.insertText('Hello, World!') -``` - -The `atom.commands.add` method takes a selector, command name, and a callback. -The callback executes when the command is triggered on an element matching the -selector. In this case, when the command is triggered the callback will call the -`convert` method and insert 'Hello, World!'. - -## Reload the Package - -Before we can trigger `ascii-art:convert`, we need to load the latest code for -our package by reloading the window. Run the command `window:reload` from the -command palette or by pressing `ctrl-alt-cmd-l`. - -## Trigger the Command - -Now open the command panel and search for the `ascii-art:convert` command. But -it's not there! To fix this, open _package.json_ and find the property called -`activationCommands`. Activation Events speed up load time by allowing Atom to -delay a package's activation until it's needed. So remove the existing command -and add `ascii-art:convert` to the `activationCommands` array: - -```json -"activationCommands": ["ascii-art:convert"], -``` - -First, reload the window by running the command `window:reload`. Now when you -run the `ascii-art:convert` command it will output 'Hello, World!' - -## Add a Key Binding - -Now let's add a key binding to trigger the `ascii-art:convert` command. Open -_keymaps/ascii-art.cson_ and add a key binding linking `ctrl-alt-a` to the -`ascii-art:convert` command. You can delete the pre-existing key binding since -you don't need it anymore. When finished, the file will have this: - -```coffeescript -'atom-text-editor': - 'ctrl-alt-a': 'ascii-art:convert' -``` - -Notice `atom-text-editor` on the first line. Just like CSS, keymap selectors -*scope* key bindings so they only apply to specific elements. In this case, our -binding is only active for elements matching the `atom-text-editor` selector. If -the Tree View has focus, pressing `ctrl-alt-a` won't trigger the -`ascii-art:convert` command. But if the editor has focus, the -`ascii-art:convert` method *will* be triggered. More information on key bindings -can be found in the [keymaps](advanced/keymaps.html) documentation. - -Now reload the window and verify that the key binding works! You can also verify -that it **doesn't** work when the Tree View is focused. - -## Add the ASCII Art - -Now we need to convert the selected text to ASCII art. To do this we will use -the [figlet](https://npmjs.org/package/figlet) [node](http://nodejs.org/) module -from [npm](https://npmjs.org/). Open _package.json_ and add the latest version of -figlet to the dependencies: - -```json -"dependencies": { - "figlet": "1.0.8" -} -``` - -After saving the file, run the command 'update-package-dependencies:update' from -the Command Palette. This will install the package's node module dependencies, -only figlet in this case. You will need to run -'update-package-dependencies:update' whenever you update the dependencies field -in your _package.json_ file. - -Now require the figlet node module in _lib/ascii-art.coffee_ and instead of -inserting 'Hello, World!' convert the selected text to ASCII art. - -```coffeescript -convert: -> - # This assumes the active pane item is an editor - editor = atom.workspace.getActivePaneItem() - selection = editor.getLastSelection() - - figlet = require 'figlet' - figlet selection.getText(), {font: "Larry 3D 2"}, (error, asciiArt) -> - if error - console.error(error) - else - selection.insertText("\n#{asciiArt}\n") -``` - -Select some text in an editor window and hit `ctrl-alt-a`. :tada: You're now an -ASCII art professional! - -## Further reading - -* [Getting your project on GitHub guide](http://guides.github.com/overviews/desktop) - -* [Writing specs](writing-specs.md) for your package - -* [Creating a package guide](creating-a-package.html) for more information - on the mechanics of packages - -* [Publishing a package guide](publishing-a-package.html) for more information - on publishing your package to [atom.io](https://atom.io) diff --git a/docs-templates/_function.html b/docs-templates/_function.html deleted file mode 100644 index 06582beab2..0000000000 --- a/docs-templates/_function.html +++ /dev/null @@ -1,19 +0,0 @@ -

{{name}} Link

-

{{{description}}}

-{{#if arguments.length}} - Parameters - - {{#each arguments}} - - {{/each}} -
{{name}}{{type}}{{{description}}}{{isOptional}}
-{{/if}} - -{{#if returnValues.length}} - Returns - - {{#each returnValues}} - - {{/each}} -
{{type}}{{{description}}}
-{{/if}} diff --git a/docs-templates/_property.html b/docs-templates/_property.html deleted file mode 100644 index 5793537e51..0000000000 --- a/docs-templates/_property.html +++ /dev/null @@ -1,9 +0,0 @@ -

{{name}} Link

-

{{{description}}}

-{{#if arguments.length}} - - {{#each arguments}} - - {{/each}} -
{{name}}{{type}}{{{description}}}

{{isOptional}}
-{{/if}} diff --git a/docs-templates/class.html b/docs-templates/class.html deleted file mode 100644 index d6fafa1c68..0000000000 --- a/docs-templates/class.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - -asdasda - - - - -

{{name}}{{#if superClass}} extends {{superClass}}{{/if}}

-{{filename}} - -

{{{description}}}

- -
    - {{#each sections}} -
  • {{name}}
  • - {{/each}} -
- - -{{#if classProperties.length}} -

Class Properties

- - {{#each classProperties}} - {{>_property}} - {{/each}} - -{{/if}} - -{{#if classMethods.length}} -

Class Methods

- - {{#each classMethods}} - {{>_function}} - {{/each}} - -{{/if}} - - -{{#if instanceMethods.length}} -

Instance Methods

- - {{#each instanceMethods}} - {{>_function}} - {{/each}} - -{{/if}} - - - \ No newline at end of file diff --git a/docs/Architecture.md b/docs/Architecture.md deleted file mode 100644 index 30d29aadf8..0000000000 --- a/docs/Architecture.md +++ /dev/null @@ -1,38 +0,0 @@ -### Flux Architecture - -Nylas Mail also uses [Reflux](https://github.com/spoike/refluxjs), a slim implementation of Facebook's [Flux Application Architecture](https://facebook.github.io/flux/) to coordinate the movement of data through the application. Flux is extremely well suited for applications that support third-party extension, because it emphasizes loose coupling and well defined interfaces between components. It enforces: - -- **Uni-directional data flow** -- **Loose coupling between components** - -For more information about the Flux pattern, check out [this diagram](https://facebook.github.io/flux/docs/overview.html#structure-and-data-flow). - -There are several core stores in the application: - -- **NamespaceStore**: When the user signs in to Nylas Mail, their auth token provides one or more namespaces. The NamespaceStore manages the available Namespaces, exposes the current Namespace, and allows you to observe changes to the current namespace. - -- **TaskQueue**: Manages `Tasks`, operations queued for processing on the backend. `Task` objects represent individual API actions and are persisted to disk, ensuring that they are performed eventually. Each `Task` may depend on other tasks, and `Tasks` are executed in order. - -- **DatabaseStore**: The DatabaseStore marshalls data in and out of the local cache, and exposes an ActiveRecord-style query interface. You can observe the DatabaseStore to monitor the state of data in Nylas Mail. - -- **DraftStore**: Manages `Drafts`. Drafts present a unique case in Nylas Mail because they may be updated frequently by disconnected parts of the application. You should use the DraftStore to create, edit, and send drafts. - -- **FocusedContentStore**: Manages focus within the main applciation window. The FocusedContentStore allows you to query and monitor changes to the selected thread, tag, file, etc. - -Most packages declare additional stores that subscribe to these Stores, as well as user Actions, and vend data to the package's React components. - - -###Actions - -Nylas Mail is built on top of Reflux, an implementation of the Flux architecture. React views fire `Actions`, which anyone in the application can subscribe to. Typically, `Stores` listen to actions to perform business logic and trigger updates to their corresponding views. - -Your packages can fire `Actions` to trigger behaviors in the app. You can also define your own actions for use within your package. - -For a complete list of available actions, see `Actions.coffee`. Actions in Nylas Mail are broken into three categories: - -- Global Actions: These actions can be fired in any window and are automatically distributed to all windows via IPC. - -- Main Window Actions: These actions can be fired in any window and are automatically sent to the main window via IPC. They are not sent to other windows of the app. - -- Window Actions: These actions only broadcast within the window they're fired in. - diff --git a/docs/Database.md b/docs/Database.md deleted file mode 100644 index 8356529a9b..0000000000 --- a/docs/Database.md +++ /dev/null @@ -1,168 +0,0 @@ -###Database - -Nylas Mail is built on top of a custom database layer modeled after ActiveRecord. For many parts of the application, the database is the source of truth. Data is retrieved from the API, written to the database, and changes to the database trigger Stores and components to refresh their contents. The illustration below shows this flow of data: - - - -The Database connection is managed by the `DatabaseStore`, a singleton object that exists in every window. All Database requests are asynchronous. Queries are forwarded to the application's `Browser` process via IPC and run in SQLite. - -#####Declaring Models - -In Nylas Mail, Models are thin wrappers around data with a particular schema. Each Model class declares a set of attributes that define the object's data. For example: - -``` -class Example extends Model - - @attributes: - 'id': Attributes.String - queryable: true - modelKey: 'id' - - 'object': Attributes.String - modelKey: 'object' - - 'namespaceId': Attributes.String - queryable: true - modelKey: 'namespaceId' - jsonKey: 'namespace_id' - - 'body': Attributes.JoinedData - modelTable: 'MessageBody' - modelKey: 'body' - - 'files': Attributes.Collection - modelKey: 'files' - itemClass: File - - 'unread': Attributes.Boolean - queryable: true - modelKey: 'unread' -``` - -When models are inflated from JSON using `fromJSON` or converted to JSON using `toJSON`, only the attributes declared on the model are copied. The `modelKey` and `jsonKey` options allow you to specify where a particular key should be found. Attributes are also coerced to the proper types: String attributes will always be strings, Boolean attributes will always be `true` or `false`, etc. `null` is a valid value for all types. - -The DatabaseStore automatically maintains cache tables for storing Model objects. By default, models are stored in the cache as JSON blobs and basic attributes are not queryable. When the `queryable` option is specified on an attribute, it is given a separate column and index in the SQLite table for the model, and you can construct queries using the attribute: - -``` -Thread.attributes.namespaceId.equals("123") -// where namespace_id = '123' - -Thread.attributes.lastMessageTimestamp.greaterThan(123) -// where last_message_timestamp > 123 - -Thread.attributes.lastMessageTimestamp.descending() -// order by last_message_timestamp DESC -``` - -#####Retrieving Models - -You can make queries for models stored in SQLite using a Promise-based ActiveRecord-style syntax. There is no way to make raw SQL queries against the local data store. - -``` -DatabaseStore.find(Thread, '123').then (thread) -> - # thread is a thread object - -DatabaseStore.findBy(Thread, {subject: 'Hello World'}).then (thread) -> - # find a single thread by subject - -DatabaseStore.findAll(Thread).where([Thread.attributes.tags.contains('inbox')]).then (threads) -> - # find threads with the inbox tag - -DatabaseStore.count(Thread).where([Thread.attributes.lastMessageTimestamp.greaterThan(120315123)]).then (results) -> - # count threads where last message received since 120315123. - -``` - -#####Retrieving Pages of Models - -If you need to paginate through a view of data, you should use a `DatabaseView`. Database views can be configured with a sort order and a set of where clauses. After the view is configured, it maintains a cache of models in memory in a highly efficient manner and makes it easy to implement pagination. `DatabaseView` also performs deep inspection of it's cache when models are changed and can avoid costly SQL queries. - - -#####Saving and Updating Models - -The DatabaseStore exposes two methods for creating and updating models: `persistModel` and `persistModels`. When you call `persistModel`, queries are automatically executed to update the object in the cache and the DatabaseStore triggers, broadcasting an update to the rest of the application so that views dependent on these kind of models can refresh. - -When possible, you should accumulate the objects you want to save and call `persistModels`. The DatabaseStore will generate batch insert statements, and a single notification will be broadcast throughout the application. Since saving objects can result in objects being re-fetched by many stores and components, you should be mindful of database insertions. - -#####Saving Drafts - -Drafts in Nylas Mail presented us with a unique challenge. The same draft may be edited rapidly by unrelated parts of the application, causing race scenarios. (For example, when the user is typing and attachments finish uploading at the same time.) This problem could be solved by object locking, but we chose to marshall draft changes through a central DraftStore that debounces database queries and adds other helpful features. See the `DraftStore` documentation for more information. - -#####Removing Models - -The DatabaseStore exposes a single method, `unpersistModel`, that allows you to purge an object from the cache. You cannot remove a model by ID alone - you must load it first. - -####Advanced Model Attributes - -#####Attribute.JoinedData - -Joined Data attributes allow you to store certain attributes of an object in a separate table in the database. We use this attribute type for Message bodies. Storing message bodies, which can be very large, in a separate table allows us to make queries on message metadata extremely fast, and inflate Message objects without their bodies to build the thread list. - -When building a query on a model with a JoinedData attribute, you need to call `include` to explicitly load the joined data attribute. The query builder will automatically perform a `LEFT OUTER JOIN` with the secondary table to retrieve the attribute: - -``` -DatabaseStore.find(Message, '123').then (message) -> - // message.body is undefined - -DatabaseStore.find(Message, '123').include(Message.attributes.body).then (message) -> - // message.body is defined -``` - -When you call `persistModel`, JoinedData attributes are automatically written to the secondary table. - -JoinedData attributes cannot be `queryable`. - -#####Attribute.Collection - -Collection attributes provide basic support for one-to-many relationships. For example, Threads in Nylas Mail have a collection of Tags. - -When Collection attributes are marked as `queryable`, the DatabaseStore automatically creates a join table and maintains it as you create, save, and delete models. When you call `persistModel`, entries are added to the join table associating the ID of the model with the IDs of models in the collection. - -Collection attributes have an additional clause builder, `contains`: - -``` -DatabaseStore.findAll(Thread).where([Thread.attributes.tags.contains('inbox')]) -``` - -This is equivalent to writing the following SQL: - -``` -SELECT `Thread`.`data` FROM `Thread` INNER JOIN `Thread-Tag` AS `M1` ON `M1`.`id` = `Thread`.`id` WHERE `M1`.`value` = 'inbox' ORDER BY `Thread`.`last_message_timestamp` DESC -``` - -#### Listening for Changes - -For many parts of the application, the Database is the source of truth. Funneling changes through the database ensures that they are available to the entire application. Basing your packages on the Database, and listening to it for changes, ensures that your views never fall out of sync. - -Within Reflux Stores, you can listen to the DatabaseStore using the `listenTo` helper method: - -``` -@listenTo(DatabaseStore, @_onDataChanged) -``` - -Within generic code, you can listen to the DatabaseStore using this syntax: - -``` -@unlisten = DatabaseStore.listen(@_onDataChanged, @) -``` - -When a model is persisted or unpersisted from the database, your listener method will fire. It's very important to inspect the change payload before making queries to refresh your data. The change payload is a simple object with the following keys: - -``` -{ - "objectClass": // string: the name of the class that was changed. ie: "Thread" - "objects": // array: the objects that were persisted or removed -} -``` - - -##### But why can't I...? - -Nylas Mail exposes a minimal Database API that exposes high-level methods for saving and retrieving objects. The API was designed with several goals in mind, which will help us create a healthy ecosystem of third-party packages: - -- Package code should not be tightly coupled to SQLite -- Queries should be composed in a way that makes invalid queries impossible -- All changes to the local database must be observable - - - diff --git a/docs/Debugging.md b/docs/Debugging.md deleted file mode 100644 index 1aa5825aad..0000000000 --- a/docs/Debugging.md +++ /dev/null @@ -1,3 +0,0 @@ -###Debugging - -Nylas Mail is built on top of Atom Shell, which runs the latest version of Chromium (at the time of writing, Chromium 41). You can access the standard Chrome Developer Tools using the Command-Option-I keyboard shortcut. When you open the developer tools, you'll also notice a bar appear at the bottom of the window. This bar allows you to inspect API requests sent from the app, streaming updates received from the Nylas API, and tasks that are queued for processing with the `TaskQueue`. diff --git a/docs/DraftStoreExtensions.md b/docs/DraftStoreExtensions.md deleted file mode 100644 index abce92ef45..0000000000 --- a/docs/DraftStoreExtensions.md +++ /dev/null @@ -1,40 +0,0 @@ -###Extending the Composer Experience - -The composer lies at the heart of Nylas Mail, and many improvements to the mail experience require deep integration with the composer. To enable these sort of plugins, the DraftStore exposes an extension API. - -This API allows your package to: - -- Display warning messages before a draft is sent. (ie: "Are you sure you want to send this without attaching a proposal?") - -- Intercept keyboard and mouse events to the composer's text editor. - -- Transform the draft and make additional changes before it is sent. - -To create a Draft Store Extension, subclass {DraftStoreExtension} and override the methods your extension needs. See {DraftStoreExtension} for a complete list of the methods your extension can implement. In the sample packages repository, [templates]() is an example of a package which uses a DraftStoreExtension to enhance the composer experience. - -####Example: - -This extension displays a warning before sending a draft that contains the names of competitor's products and if the user proceeds to send the draft containing the words, it appends a disclaimer. - -``` -{DraftStoreExtension} = require 'inbox-exports' - -class ProductsExtension extends DraftStoreExtension - - @warningsForSending: (draft) -> - words = ['iphone', 'ipad', 'apple', 'iwatch', 'macbook'] - body = draft.body.toLowercase() - for word in words - if body.indexOf(word) > 0 - return ["with the word '#{word}'?"] - return [] - - @finalizeSessionBeforeSending: (session) -> - draft = session.draft() - if @warningsForSending(draft) - bodyWithWarning = draft.body += "
This email \ - contains competitor's product names \ - or trademarks used in context." - session.changes.add(body: bodyWithWarning) -``` - diff --git a/docs/FAQ.md b/docs/FAQ.md deleted file mode 100644 index 8cae0e3020..0000000000 --- a/docs/FAQ.md +++ /dev/null @@ -1,4 +0,0 @@ - -#####Do I have to use React? - -You need to use React if you want to register UI components with the Component Registry. However, you can create a React component and attach DOM to it's DOM node manually. Packages can also add a DOM node directly to `document.body`, though this is discouraged. diff --git a/docs/Index.md b/docs/Index.md deleted file mode 100644 index 0fb6dc8127..0000000000 --- a/docs/Index.md +++ /dev/null @@ -1,49 +0,0 @@ -##Nylas Package API - -The Nylas Package API allows you to create powerful extensions to Nylas Mail. The client is built on top of Atom Shell and runs on Mac OS X, Windows, and Linux. It exposes rich APIs for working with the mail, contacts, and calendar and a robust local cache layer. Your packages can leverage NodeJS and other web technologies to create innovative new experiences. - - - - - diff --git a/docs/InterfaceConcepts.md b/docs/InterfaceConcepts.md deleted file mode 100644 index 8ef99c59ac..0000000000 --- a/docs/InterfaceConcepts.md +++ /dev/null @@ -1,63 +0,0 @@ - - -###Sheets and Columns - -The Nylas Mail user interface is conceptually organized into Sheets. Each Sheet represents a window of content. For example, the `Threads` sheet lies at the heart of the application. When the user chooses the "Files" tab, a separate `Files` sheet is displayed in place of `Threads`. When the user clicks a thread in single-pane mode, a `Thread` sheet is pushed on to the workspace and appears after a brief transition. - - - -The `WorkspaceStore` maintains the state of the application's workspace and the stack of sheets currently being displayed. Your packages can declare "root" sheets which are listed in the app's main sidebar, or push custom sheets on top of sheets to display data. - -The Nilas Workspace supports two display modes: `split` and `list`. Each Sheet describes it's appearance in each of the view modes it supports. For example, the `Threads` sheet describes a three column `split` view and a single column `list` view. Other sheets, like `Files` register for only one mode, and the user's mode preference is ignored. - -For each mode, Sheets register a set of column names. - - - -``` -@defineSheet 'Threads', {root: true}, - split: ['RootSidebar', 'ThreadList', 'MessageList', 'MessageListSidebar'] - list: ['RootSidebar', 'ThreadList'] -``` - -Column names are important. Once you've registered a sheet, your package (and other packages) register React components that appear in each column. - -Sheets also have a `Header` and `Footer` region that spans all of their content columns. You can register components to appear in these regions to display notifications, add bars beneath the toolbar, etc. - - -``` -ComponentRegistry.register AccountSidebar, - location: WorkspaceStore.Location.RootSidebar - - -ComponentRegistry.register NotificationsStickyBar, - location: WorkspaceStore.Sheet.Threads.Header - -``` - -Each column is laid out as a CSS Flexbox, making them extremely flexible. For more about layout using Flexbox, see Working with Flexbox. - - -###Toolbars - -Toolbars in Nylas Mail are also powered by the Component Registry. Though toolbars appear to be a single unit at the top of a sheet, they are divided into columns with the same widths as the columns in the sheet beneath them. - - - -Each Toolbar column is laid out using Flexbox. You can control where toolbar elements appear within the column using the CSS `order` attribute. To make it easy to position toolbar items on the left, right, or center of a column, we've added two "spacer" elements with `order:50` and `order:-50` that evenly use up available space. Other CSS attributes allow you to control whether your items shrink or expand as the column's size changes. - - - -To add items to a toolbar, you inject them via the Component Registry. There are several ways of describing the location of a toolbar component which are useful in different scenarios: - -- `.Toolbar`: This component will always appear in the toolbar above the column named ``. - - (Example: Compose button which appears above the Left Sidebar column, regardless of what else is there.) - -- `.Toolbar`: This component will appear in the toolbar above ``. - - (Example: Archive button that should always be coupled with the MessageList component, placed anywhere a MessageList component is placed.) - -- `Global.Toolbar.Left`: This component will always be added to the leftmost column of the toolbar. - - (Example: Window Controls) diff --git a/docs/PackageOverview.md b/docs/PackageOverview.md deleted file mode 100644 index ddfe560095..0000000000 --- a/docs/PackageOverview.md +++ /dev/null @@ -1,99 +0,0 @@ -###Building a Package - -Packages lie at the heart of Nylas Mail. Each part of the core experience is a separate package that uses the Nilas Package API to add functionality to the client. Want to make a read-only mail client? Remove the core `Composer` package and you'll see reply buttons and composer functionality disappear. - -Let's explore the files in a simple package that adds a Translate option to the Composer. When you tap the Translate button, we'll display a popup menu with a list of languages. When you pick a language, we'll make a web request and convert your reply into the desired language. - -#####Package Structure - -Each package is defined by a `package.json` file that includes it's name, version and dependencies. Our `translate` package uses React and the Node [request](https://github.com/request/request) library. - -``` -{ - "name": "translate", - "version": "0.1.0", - "main": "./lib/main", - "description": "An example package for Nylas Mail", - "license": "Proprietary", - "engines": { - "atom": "*" - }, - "dependencies": { - "react": "^0.12.2", - "request": "^2.53" - } -} - -``` - -Our package also contains source files, a spec file with complete tests for the behavior the package adds, and a stylesheet for CSS. - -``` -- package.json -- lib/ - - main.cjsx -- spec/ - - main-spec.coffee -- stylesheets/ - - translate.less -``` - -`package.json` lists `lib/main` as the root file of our package. As our package expands, we can add other source files. Since Nylas Mail runs NodeJS, you can `require` other source files, Node packages, etc. Inside `main.cjsx`, there are two important functions being exported: - -``` -module.exports = - - ## - # Activate is called when the package is loaded. If your package previously - # saved state using `serialize` it is provided. - # - activate: (@state) -> - ComponentRegistry.register TranslateButton, - role: 'Composer:ActionButton' - - ## - # Serialize is called when your package is about to be unmounted. - # You can return a state object that will be passed back to your package - # when it is re-activated. - # - serialize: -> - {} - - ## - # This optional method is called when the window is shutting down, - # or when your package is being updated or disabled. If your package is - # watching any files, holding external resources, providing commands or - # subscribing to events, release them here. - deactivate: -> - ComponentRegistry.unregister('TranslateButton') -``` - - -> Nylas Mail uses CJSX, a Coffeescript version of JSX, which makes it easy to express Virtual DOM in React `render` methods! You may want to add the [Babel](https://github.com/babel/babel-sublime) plugin to Sublime Text, or the [CJSX Language](https://atom.io/packages/language-cjsx) for syntax highlighting. - - -#####Package Style Sheets - -Style sheets for your package should be placed in the _styles_ directory. -Any style sheets in this directory will be loaded and attached to the DOM when -your package is activated. Style sheets can be written as CSS or [Less], but -Less is recommended. - -Ideally, you won't need much in the way of styling. We've provided a standard -set of components which define both the colors and UI elements for any package -that fits into Nylas Mail seamlessly. - -If you _do_ need special styling, try to keep only structural styles in the -package style sheets. If you _must_ specify colors and sizing, these should be -taken from the active theme's [ui-variables.less][ui-variables]. For more -information, see the [theme variables docs][theme-variables]. If you follow this -guideline, your package will look good out of the box with any theme! - -An optional `stylesheets` array in your _package.json_ can list the style sheets -by name to specify a loading order; otherwise, all style sheets are loaded. - -###Installing a Package - -Nylas Mail ships with many packages already bundled with the application. When the application launches, it looks for additional packages in `~/.inbox/packages`. Each package you create belongs in it's own directory inside this folder. - -In the future, it will be possible to install packages directly from within the client. diff --git a/docs/React.md b/docs/React.md deleted file mode 100644 index 55b177f04f..0000000000 --- a/docs/React.md +++ /dev/null @@ -1,109 +0,0 @@ -### The Nylas Mail Interface - -Nylas Mail uses [React](https://facebook.github.io/react/) to create a fast, responsive UI. Packages that want to extend the Nylas Mail interface should use React. Using React's `JSX` is optional, but both `JSX` and `CJSX` (Coffeescript) are available. - -For a quick introduction to React, take a look at Facebook's [Getting Started with React](https://facebook.github.io/react/docs/getting-started.html). - -#### React Components - -Nylas Mail provides a set of core React components you can use in your packages. Many of the standard components listen for key events, include considerations for different platforms, and have extensive CSS. Wrapping standard components makes it easy to build rich interfaces that are consistent with the rest of the Nylas Mail platform. - -To use a standard component, require it from `ui-components` and use it in your component's `render` method. - -> Keep in mind that React's Component model is based on composition rather than inheritance. On other platforms, you might subclass `Popover` to create your own custom Popover. In React, you should wrap the standard Popover component in your own component, which provides the Popover with `props` and children to customize it's behavior. - - -Here's a quick look at standard components you can require from `ui-components`: - -- **Menu**: Allows you to display a list of items consistent with the rest of the Nylas Mail user experience. - -- **Spinner**: Displays an indeterminate progress indicator centered within it's container. - -- **Popover**: Component for creating menus and popovers that appear in response to a click and stay open until the user clicks outside them. - -- **Flexbox**: Component for creating a Flexbox layout. - -- **RetinaImg**: Replacement for standard `` tags which automatically resolves the best version of the image for the user's display and can apply many image transforms. - -- **ListTabular**: Component for creating a list of items backed by a paginating ModelView. - -- **MultiselectList**: Component for creating a list that supports multi-selection. (Internally wraps ListTabular) - -- **MultiselectActionBar**: Component for creating a contextual toolbar that is activated when the user makes a selection on a ModelView. - -- **ResizableRegion**: Component that renders it's children inside a resizable region with a draggable handle. - -- **TokenizingTextField**: Wraps a standard `` and takes function props for tokenizing input values and displaying autocompletion suggestions. - -- **EventedIFrame**: Replacement for the standard `",Yd="'autoplay='false'class='video'>",Zd="'classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'codebase='http://apple.com/qtactivex/qtplugin.cab'width='",$d="'controller='",ae="'enablejavascript='true'postdomevents='true'scale='tofit'name='embedobj_",xe="'height='",ye="'id='embedobj_",ze="'loop='",Ae="'volume='",Be="(",Ce=")",De=") ",Ee="*",Fe=",",Ge=",M12=", +He=",M21=",Ie=",M22=",Je=",SizingMethod='auto expand')",Ke=",transparent),to(rgba(255,255,255,.5)))",Le="-10000",Me="-bottom",Ne="-moz-",Oe="-moz-perspective",Pe="-ms-transform",Qe="-ms-transform-origin",Re="-o-",Se="-pie-background",Te="-webkit-",Ue="-webkit-perspective",Ve="-webkit-tap-highlight-color",We="-webkit-transform",Xe=".",Ye=".AlphaImageLoader(sizingMethod='scale',src='",Ze=".HYPE_element{-webkit-transform:rotateY(0);}video.HYPE_element{-webkit-transform:none;}^{color:#000;`size:16px;`weight:normal;`family:Helvetica,Arial,Sans-Serif;`weight:normal;`style:normal;`variant:normal;text-decoration:none;text-align:left;text-transform:none;text-indent:0;text-shadow:none;line-height:normal;letter-spacing:normal;white-space:normal;word-spacing:normal;@:baseline;border:none;background-color:transparent;background-image:none;-webkit-`smoothing:antialiased;-moz-backface-visibility:hidden;}", +$e=".HYPE_scene ",af=".Matrix(M11=",bf=".gif",cf=".gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)",df=".png",ef="/",Xf="/PIE.htc')",Yf="/blank.gif",Zf="0",$f="0.0",ag="0123456789ABCDEF",bg="0px",cg="1",dg="1.0",eg="100",fg="100%",gg="2d",hg="50%",ig="600px",jg=": ",kg="",lg="",mg="
",ng="', +qg="=",rg="?",sg="@1x",tg="@2x",ug="APPLY ERR ",vg="Action",wg="Alpha(Opacity=",xg="Android",yg="BD",th="BODY",uh="BackCompat",vh="Body",wh="Composite",xh="Constraint",yh="Error in ",zh="False",Ah="GET",Bh="GHIJKLMNOPQRSTUVWXYZ",Ch="HYPE_element",Dh="HYPE_element ",Eh="HYPE_element HYPE_scene",Fh="HYPE_element HYPE_scene ",Gh="HYPE_element Hype_scene ",Hh="HYPE_element_container",Ih="HYPE_persistent_symbols",Jh="HYPE_scene",Kh="HYPE_scene_index",Lh="HYP_a",Mh="HYP_b",Nh="HYP_c",Oh="HYP_d",Ph="HYP_e", +Qh="HYP_f",Rh="HYP_g",Sh="HYP_h",Th="HYP_i",Uh="HYP_j",Vh="HYP_k",Wh="HYP_l",Xh="HYP_m",Yh="HYP_n",Zh="HYP_o",$h="HYP_p",ai="HYP_q",bi="HYP_t",ci="HYP_u",di="HypeDocumentLoad",ei="HypeSceneLoad",fi="HypeSceneUnload",gi="HypeSwipe",hi="HypeSymbolLoad",ii="HypeSymbolUnload",ji="HypeTimelineAction",ki="HypeTimelineComplete",li="HypeTriggerCustomBehavior",mi="L ",ni="L 0 0 L 40 0 L 40 40 L 0 40",oi="M",pi="MSPointerUp",qi="MouseEvents",ri="MozBoxShadow",si="N",ti="O",ui="P",vi="Q",wi="R",xi="S",yi="T", +zi="True",Ai="U",Bi="V",Ci="W",Di="World",Ei="YES",Kj="^div,^span,^applet,^object,^iframe,^h1,^h2,^h3,^h4,^h5,^h6,^p,^blockquote,^pre,^a,^abbr,^acronym,^address,^big,^cite,^code,^del,^dfn,^em,^img,^ins,^kbd,^q,^s,^samp,^small,^strike,^strong,^sub,^sup,^tt,^var,^b,^u,^i,^center,^dl,^dt,^dd,^ol,^ul,^li,^fieldset,^form,^label,^legend,^table,^caption,^tbody,^tfoot,^thead,^tr,^th,^td,^article,^aside,^canvas,^details,^embed,^figure,^figcaption,^footer,^header,^hgroup,^menu,^nav,^output,^ruby,^section,^summary,^time,^mark,^audio,^video{color:?;`size:?;`weight:?;`family:?;`weight:?;`style:?;`variant:?;text-decoration:?;text-align:?;text-transform:?;text-indent:?;text-shadow:?;line-height:?;letter-spacing:?;white-space:?;word-spacing:?;@:?;border:none;background-color:transparent;background-image:none;padding:0;box-sizing:content-box;}^p{display:block;$:1em 0;}^div,^layer{display:block;}^article,^aside,^footer,^header,^hgroup,^nav,^section{display:block;}^blockquote{display:block;$:1em 40px;}^figcaption{display:block;}^figure{display:block;$:1em 40px;}^q{display:inline;}^q:before{content:open-quote;}^q:after{content:close-quote;}^center{display:block;text-align:center;}^hr{display:block;$:.5em auto;border-style:inset;border-width:1px;}^h1,^h2,^h3,^h4,^h5,^h6{display:block;$-left:0;$-right:0;`weight:bold;}^h1{`size:2em;$-top:.67em;$|:.67em;}^h2{`size:1.5em;$-top:.83em;$|:.83em;}^h3{`size:1.17em;$-top:1em;$|:1em;}^h4{$-top:1.33em;$|:1.33em;}^h5{`size:.83em;$-top:1.67em;$|:1.67em;}^h6{`size:.67em;$-top:2.33em;$|:2.33em;}^table{display:table;border-collapse:separate;border-spacing:2px;border-color:gray;}^thead{display:table-header-group;@:middle;border-color:?;}^tbody{display:table-row-group;@:middle;border-color:?;}^tfoot{display:table-footer-group;@:middle;border-color:?;}^col{display:table-column;}^colgroup{display:table-column-group;}^tr{display:table-row;@:?;border-color:?;}^td,^th{display:table-cell;@:?;}^th{`weight:bold;}^caption{display:table-caption;text-align:center;}^ul,^menu,^dir{display:block;list-style-type:disc;$:1em 0;padding-left:40px;}^ol{display:block;list-style-type:decimal;$:1em 0;padding-left:40px;}^li{display:list-item;$:0;}^ul ul,^ol ul{list-style-type:circle;}^ol ol ul,^ol ul ul,^ul ol ul,^ul ul ul{list-style-type:square;}^dd{display:block;$-left:40px;}^dl{display:block;$:1em 0;}^dt{display:block;}^ol ul,^ul ol,^ul ul,^ol ol{$-top:0;$|:0;}^u,^ins{text-decoration:underline;}^strong,^b{`weight:bolder;}^i,^cite,^em,^var,^address{`style:italic;}^tt,^code,^kbd,^samp{`family:monospace;}^pre,^xmp,^plaintext,^listing{display:block;`family:monospace;white-space:pre;$:1em 0;}^mark{background-color:yellow;color:black;}^big{`size:larger;}^small{`size:smaller;}^s,^strike,^del{text-decoration:line-through;}^sub{@:sub;`size:smaller;}^sup{@:super;`size:smaller;}^nobr{white-space:nowrap;}^a{color:blue;text-decoration:underline;cursor:pointer;}^a:active{color:red;}^noframes{display:none;}^frameset,^frame{display:block;}^frameset{border-color:?;}^iframe{border:0;}^details{display:block;}^summary{display:block;}", +Lj="_",Mj="_blank",Nj="a",Oj="aA",Pj="aB",Qj="aC",Rj="aD",Sj="aE",Tj="aI",Uj="aJ",Vj="aK",Wj="aL",Xj="aM",Yj="aN",Zj="aS",$j="aT",ak="aU",bk="aV",ck="aW",dk="aX",ek="aY",fk="aZ",gk="abort",hk="absolute",ik="acC",jk="afterAdd",kk="afterRemove",lk="afterRender",mk="afterUpdate",nk="alt",ok="aria-busy",pk="aria-flowto",qk="aria-hidden",rk="arraybuffer",sk="audio",tk="audio/ogg",uk="auto",vk="autoplay",wk="autostart",xk="b",yk="bA",zk="bB",Ak="bC",Bk="bF",Ck="bG",Dk="bH",Ek="bI",Fk="bJ",Gk="bK",Hk="bL", +Ik="bM",Jk="bN",Kk="bO",Lk="bP",Mk="bQ",Nk="bR",Ok="bS",Pk="bT",Qk="bU",Rk="bV",Sk="bW",Tk="backdrop-filter",Uk="background-origin",Vk="background-size",Wk="bcC",Xk="beforeAdd",Yk="beforeRemove",Zk="beforeRender",$k="beforeUpdate",al="below ",bl="block",cl="blur(",dl="body",el="body=",fl="boolean",gl="border-radius",hl="box-reflect",il="box-shadow",jl="boxShadow",kl="brightness(",ll="button",ml="c",nl="cB",ol="cC",pl="cD",ql="cF",rl="cG",sl="cH",tl="cI",ul="cJ",vl="cK",wl="cL",xl="cQ",yl="cR",zl= +"cT",Al="cW",Bl="cX",Cl="cY",Dl="cancel",El="canplaythrough",Fl="canvas",Gl="click",Hl="collisionActive",Il="collisionEnd",Jl="collisionStart",Kl="color: coral",Ll="color: red",Ml="composite",Nl="constraint",Ol="contrast(",Pl="controller",Ql="controls",Rl="d",Sl="deg",Tl="deviceorientation",Ul="div",Vl="down",Wl="drag",Xl="dropbox.com",Yl="e",Zl="element",$l="embed",am="embedobj_",bm="end",cm="enter",dm="error",em="exit",fm="f",gm="false",hm="fcC",im="file://",jm="filter",km="flat",lm="font-",mm= +"function",nm="head",om="height",pm="hidden",qm="href",rm="http://",sm="hue-rotate(",tm="hype-obj-",um="hype-scene-",vm="iPad",wm="iPhone",xm="iPod",ym="ibooksimg://",zm="img",Am="img_",Bm="inherit",Cm="j",Dm="kTimelineDefaultIdentifier",Em="kTimelinePhysicsIdentifier: ",Fm="keydown",Gm="keypress",Hm="keyup",Im="l",Jm="left",Km="linear-gradient(",Lm="load",Mm="loop",Nm="m",Om="mailto:",Pm="margin",Qm="mouseConstraint",Rm="mouseclick",Sm="mousedown",Tm="mousemove",Um="mouseout",Vm="mouseover",Wm="mouseup", +Xm="move",Ym="mozHidden",Zm="mozvisibilitychange",$m="msHidden",an="msvisibilitychange",bn="mute",cn="n",dn="no",en="no-repeat",fn="none",gn="number",hn="object",jn="on",kn="onresize",ln="pageshow",mn="pointer-events",nn="pointerup",on="preserve-3d",pn="progid:DXImageTransform.Microsoft",qn="px",rn="px) ",sn="r",tn="resize",un="rgb",vn="rgba",wn="rgba(",xn="rgba(0,0,0,0)",yn="right",zn="role",An="saturate(",Bn="script",Cn="sepia(",Dn="source",En="src",Fn="start",Gn="string",Hn="subject=",In="swipe", +Jn="tX",Kn="tY",Ln="tabindex",Mn="tap",Nn="target",On="title",Pn="touchcancel",Qn="touchend",Rn="touchmove",Sn="touchstart",Tn="transform-origin",Un="transform-style",Vn="true",Wn="type",Xn="up",Yn="url('",Zn="user-select",$n="vertical-align",ao="video",bo="video/ogg",co="video/quicktime",eo="video/webm",fo="visibilitychange",go="warn",ho="webkitHidden",io="webkitvisibilitychange",jo="width",ko="www.",lo="x-ibooks-th://",mo="z";function no(){return function(){}} +p.HYPE_526=function(L,C,La,Ub,Fi,Gi,Lb,x,lc,qo,ff,gf,qa,Hi,zg,hf,ro,so,be){function Ii(a,b,c){var d=ka[Bb],e={x:0,y:0};b=b.aa;a=a[I];for(var f,g,k=b[0],n=b[1],n=0;ne?e=g:g=g){f.nb=g;break}g=a&&(a=1E-6);1==c&&(d=0,e=1,a=ja);b.Xa=d;b.La=e;b.sc=f;V.$a.Xd(b, +a)}}function Ic(a){var b,c,d=sd(a);if(!(qa!=h||a==j||kf==h||d==j||d.Vc==h)){var e=d.ub.ma,f=R[a.id],g=d.yc[f],k=t(a,Ik,0);if(!(0==k&&g==j)){Li(a)==h&&(k=1);var n=t(a,Qk,0.5),q=t(a,Rk,0.1),w=t(a,zl,0.01),l=t(a,Sk,0.0010);0>=l&&(l=1E-6);1==k&&(n=0,q=1,l=ja);var v=t(a,ik,0),Q=t(a,Wk,0),M=t(a,hm,0);b=[1,0,0,1,0,0];c=Bg(a);c[D](a);for(var J=0;JF;F+=G){var P=r*V.Ja.cos(F*u.PI/180)+(d-r),E=y*V.Ja.sin(F*u.PI/180)+y;lb(ba,P*f,E*aa)}lb(ba,d*f,y*aa); +lb(ba,d*f,(e-B)*aa);if(0F;F+=G)P=C*V.Ja.cos(F*u.PI/180)+(d-C),E=B*V.Ja.sin(F*u.PI/180)+(e-B),lb(ba,P*f,E*aa)}lb(ba,(d-C)*f,e*aa);lb(ba,$*f,e*aa);if(0<$||0F;F+=G)P=$*V.Ja.cos(F*u.PI/180)+$,E=x*V.Ja.sin(F*u.PI/180)+(e-x),lb(ba,P*f,E*aa)}lb(ba,0,(e-x)*aa);lb(ba,0,z*aa);if(0F;F+=G)P=A*V.Ja.cos(F*u.PI/180)+A,E=z*V.Ja.sin(F*u.PI/180)+z,lb(ba,P*f,E*aa)}d=Z;for(e=0;e=aa?J:aa),F=b*N,N*=g,b=Q-F,g=v-N,n==h&&l==m?k-=b:n==h&&l==h&&(k-=b/2),q==h&&w==m?c-=g:q==h&& +w==h&&(c-=g/2));b=k}t(f,$h,m)==m&&(Y(f,Jn,0.5),Y(f,Kn,0.5),ia(f,$h,h));Y(f,Nj,b);Y(f,xk,c);Y(f,fm,d[Za](6))}}function Oi(a,b){of=a.Vc=h;var c=u[ab](1E3/60),d=u[bb](1E3*b),e=d-a.Md;a.Md=d;a.hc+=u[bb](e);for(d=0;a.hc>=c&&20>d;)V.Fc[cd](a.ub,c),a.hc-=c,d+=1;V.Fc.ya(a.ub);Hg();a.Vc=m}function pf(a){a=V.zb.Ga(a.ub.ma);for(var b=0;bd?u.PI:0))*(180/u.PI);a.Fd=u[Gb](c*c+d*d);d=a[Fb];qf(d)==h&&(c=rf(d)*a.Fd,d=sf(d)+a.Ed,a.ub.ma.Ub.x=c*V.Ja.cos(d*u.PI/180),a.ub.ma.Ub.y=c*V.Ja.sin(d*u.PI/180));pf(a);Kc()}}function tf(a){for(var b=a;b!=j;){a=t(b,Bk);a==j&&(b=x[G].v[R[b.id]],b!=j&&(a=b.bF));a=Ja(a);if(a==j)break;b=a;if(Eg(b)==h)return b}return j}function Eg(a){return x[G].U[R[a.id]]!=j||t(a,wl)!=j?h:m}function sd(a){a=tf(a);return Ig(a!=j?a.id:j)}function Ig(a){a==j&&(a=C);for(var b=0;bz.ca?e||4==c[tb]:e||1==c[tb]||c.metaKey==h)?9>z.ca||z.Rd||z.Cb!=j?p.open(f,Mj):(9==z.ca||15>z[Cb])&&!(c instanceof MouseEvent)?p.open(f,Mj):(e=s[Db](Nj),e[Ib](qm,f),e[Ib](Nn,Mj),s[Ec][Na](e),f=s.createEvent(qi),f.initMouseEvent(Gl,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hc],c[ic],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c[tb],s[Ec][bd]),e.dispatchEvent(f),s[Ec][Gc](e)):p.top.location= +f);else if(6==f){g=e.l;k=e.m;e=e.n;f=Om;g!=j&&(f+=escape(g));if(k!=j||e!=j)f+=rg,g=[],k!=j&&g[D](Hn+ga(k)),e!=j&&g[D](el+ga(e)),f+=g.join(Ud);f!=Om&&(p.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=h&&(e=m),f!=j&&(f=Mg(f),wa(f,e),f[Jb]())):13==f?(f=e.o,f!=j&&Mg(f)[Dc]()):14==f&&(e=e.B,e!=j&&Ui(e))}}}function vf(a,b){return function(c){Ng(c,b,R[a.id])}}function Og(a,b){return function(c){Vi(c,b,R[a.id])}}function wf(a){var b=t(a,Vj,Zf),c=t(a,Wj,Zf),d=t(a,Tj,Zf),e=t(a,Uj,Zf),b=typeof b!=gn?b:F(b),c=typeof c!= +gn?c:F(c),d=typeof d!=gn?d:F(d),e=typeof e!=gn?e:F(e);a[O][gl]=Z+b+hd+c+hd+e+hd+d}function ee(){}function Wi(a){var b=t(a,dk,8),c=t(a,ck,0);z.vd==j&&(1==1-c&&a[O].removeProperty!=j?a[O].removeProperty(ma.Oa+hl):a[O][ma.Oa+hl]=al+F(b)+id+(1-c)+Ke)}function Pg(a){var b=t(a,Bi);if(b!=j){var c=Z;b==cg?c=Ti(t(a,Ci)):b==Zf&&(c=Z+Ub+ef+t(a,Ai));b=og+c+Xd;z.kb!=j&&(b=mg+b+kg);sa(a,b)}}function Xi(a,b){var c=b==h?yg:Z,d=t(a,c+Hk,0),e=t(a,c+Ck,0),f=t(a,c+Dk,0),g=t(a,c+Ek,1),k=t(a,c+Fk,1),c=t(a,c+Gk,1),n=Z; +0!=d&&(n+=cl+d+rn);0!=e&&(n+=Cn+e+De);0!=f&&(n+=sm+(Z+f+Sl)+De);1!=g&&(n+=An+g+De);if(1!=k){if(6==z.Wd||z.kb!=j&&536.26>=pa(z.Ra))k-=1,1z.ca||(0!=k?c+=md+(Z+k+Sl)+De:b==h&&(1==w&&1==l&&v==m)&&(c+=nd),0!=g&&(c+=ld+(Z+g+Sl)+De));1!=w&&(c+=od+w+De);1!=l&&(c+=pd+l+De);b=Z+(Z+100*Q+Qd)+hd+(Z+100*M+Qd);a[O][ma.Oa+Tn]=b;a[O].MozTransformOrigin=b;a[O].OTransformOrigin=b;a[O][Qe]=b;a[O][Tn]=b; +a[O][We]=c;a[O].MozTransform=c;a[O].OTransform=c;a[O][Pe]=c;a[O].transform=c}function xd(a){9>z.ca?fe(a):ge(a);qa==h&&Ic(a)}function Rg(a){function b(a,b){return Z+a+Km+(Z+(b==h?(u.abs(e)+180)%360:(360-u.abs(e)+270)%360)+Sl)+Fe+xb(c)+Fe+xb(d)+Ce}var c=t(a,cn);if(!(c==j||c==Z)){var d=t(a,Nm);if(!(d==j||d==Z)){var e=t(a,Im);e!=j&&(z.Ra!=j?Ga(a[O],b(ma.Oa,m)):z.xe!=j?Ga(a[O],b(Ne,m)):10>z.ca?a[O][Se]=b(Z,m):Ga(a[O],15>z[Cb]?b(Re,m):b(Z,h)))}}}function Yi(a){Ia(a[O],t(a,Cl,m)==h?fn:t(a,sn,Z));Sg(R[a.id])} +function Mb(a){Mc[a.id]=j;Nc(a)}function Nc(a){try{if(of==h)he[a.id]=a;else{var b=t(a,Ok,36),c=Qg(a),d=R[a.id],e=mf(d),f=nf(e),g=Gg(e),k=nf(d),n=t(a,Nj,0),q=t(a,xk,0),w=t(a,ml,j),l=t(a,Rl,j),v=e=h;w==j&&(e=m,w=k[Ra]);l==j&&(v=m,l=k[dd]);var Q=Vb(d),M=Wb(d),J=M-l,d=n,k=q,N=Q,A=M,r=m;if(Jc==h&&36!=b){var da=0!=(b&1),$=0!=(b&4),x=0!=(b&2),C=0!=(b&8),y=0!=(b&32),B=0!=(b&16),G=0!=(b&64)&&x==h&&B==h,E=0!=(b&128)&&x==h&&B==h,r=0!=(b&256)&&(x==h||B==h),ba=g[Ra]/f[Ra],T=g[dd]/f[dd];x==h&&(N=da==h&&$==h?Q+ +(g[Ra]-f[Ra]):u[ab](Q*ba));da==h&&$==h&&x==m?(b=n+Q/2,d=u[ab](b*ba-Q/2)):da==h&&$==m&&x==h?d=g[Ra]-f[Ra]+n-(N-Q):da==h&&$==m?d=g[Ra]-f[Ra]+n:da==m&&$==m&&(d=u[ab](n*ba));B==h&&(A=C==h&&y==h?M+(g[dd]-f[dd]):u[ab](M*T));C==h&&y==h&&B==m?k=u[ab]((q+M/2)*T-M/2):C==h&&y==m&&B==h?k=g[dd]-f[dd]+q-(A-M):C==h&&y==m?k=g[dd]-f[dd]+q:C==m&&y==m&&(k=u[ab](q*T));if((G==h||E==h)==h)g=N,f=A,q=N/Q,ba=A/M,T=q,G==h?T=q<=ba?q:ba:E==h&&(T=q>=ba?q:ba),N=u[ab](Q*T),A=u[ab](M*T),G=g-N,E=f-A,da==h&&$==m?d+=G:da==h&&$==h&& +(d+=u[ab](G/2)),C==h&&y==m?k+=E:C==h&&y==h&&(k+=u[ab](E/2))}var V=u.max(0,N-(Q-w)),P=u.max(0,A-J);qa==h&&(ia(a,Yh,V),ia(a,Zh,P));e==h?(r==h&&(d+=t(a,Jn,0.5)*(N-Q),ia(a,bi,u.max(0,N/Q)),V=w),ra(a[O],F(V,2))):ra(a[O],Z);v==h?(r==h&&(k+=t(a,Kn,0.5)*(A-M),ia(a,ci,u.max(0,A/M)),P=l),Ma(a[O],F(P,2))):Ma(a[O],Z);if(8>z.ca){var Y=s[cb](Am+a.id);Y!=j&&(w=function(){ra(Y[O],F(a[uc]));Ma(Y[O],F(a[Xc]))},0==a[uc]&&0==a[Xc]?p[vc](w,0):w())}if(9>z.ca){t(a,fm)!=j&&fe(a);var ea=a[Fc][wb][am+a.id];ea!=j&&(ea[Ib](jo, +V),ea[Ib](om,P))}ia(a,Lh,k);ia(a,Mh,d);c==m&&(k+=t(a,Th,0),d+=t(a,Sh,0),a[O].top=F(k),va(a[O],F(d)));if(c==h||r==h)9>z.ca?fe(a):ge(a);qa==h&&Ic(a);Tg==m&&Ug()}}catch(L){}}function Ti(a){a!=j&&0===a[ub](ko)&&(a=rm+a);return a}function ie(a){return a[Ya](/'/g,Sd)}function mb(a,b){if(a[ub])return a[ub](b);for(var c=0;c=e){d=w!=j?w[Ac].y+(l[Ac].y-w[Ac].y)*(e-w[Ac].x)/(l[Ac].x-w[Ac].x):l[Ac].y;break a}w=l}w=j}d=l[Ac].y}c.ea==h&&(d=1-d);e=n;w=a.a;if(w!=ca){n=Vg[w];if(a.b!=j){if(c.zc[w]==j&&(n=a.o,q=a.a,q!=ca)){v=Vg[q];a={};for(var Q=[],J=0,N=0,M=0;Me;e++)r[e]=c[e]+(g[e]-c[e])*d;e=dj(r)}else 1==d&&(e=q);Y(k,f,e);qa==h&&Fg(k,f,e,b)}function bj(a,b,c){var d;d=a[H];var e=0,f,g=0,g={};if(0>b||1b){var w=a.Ka[0];2<=w.qa[H]&&(f=w.qa[0],e=w.qa[1],k=f)}else n=-1,q=1-b,w=a.Ka[a.Ka[H]-1],2<=w.qa[H]&&(f=w.qa[w.qa[H]-2],k=e=w.qa[w.qa[H]-1]);if(f!=j&&e!=j){a=n*(e[Ac].x-f[Ac].x);b=n*(e[Ac].y-f[Ac].y);d*=q;0==b?(g.y=0,g.x=d):(g.y=u[Gb](u.pow(d,2)/(u.pow(a,2)/ +u.pow(b,2)+1)),g.x=g.y*a/b);if(0a&&0>g.x)g.x*=-1;if(0b&&0>g.y)g.y*=-1;g.x+=k[Ac].x;g.y+=k[Ac].y;g.wb=ej(f[Ac],e[Ac])}}else if(0==d)g={x:a.Ka[0].fb.x,y:a.Ka[0].fb.y,wb:0};else{if(1==b)d=a.Ka,f=d[d[H]-1],g=1;else{for(g=0;gb){f=w;break}e+=w[H]}g=(b-e/d)/(f[H]/d);d=f[H]*g;for(b=a=g=0;b=f)b.eb=d+1,yb[g][k]==b.fa&&(1==e.p&&b.sa==h?(e=x[G].v[g].aH,f=Ja(g),e==h&&f[Jb]&&(f.autoplay=h,f[Jb]())):0==e.p&&b.Da[D](e));else break}c=[];for(d=0;d=f){if(yd[e]==b.fa){var q=b.ea==m?n.G:Ca(n.G+n[yc],k),f=0,f=n.z?q-n[yc]:q+n[yc],f=u.max(0,f);zd(k,m);f=nc(f,k,h,h,m);f==m&&Zb(e,j)}b.ab[ed](d,1);d--}}for(d=b.tb;d=f)){b.tb=d+1;var w=n.E,l=n.z,v=q=b.ea==m?n.G:Ca(n.G+n[yc],k),t=m;b.ea==h&&(l=!l);w&&(f=a-f,f>n[yc]?(w=m,f=n[yc]):(b.ab[D](n),t=h),v=l?v-f:v+f,v=u.max(0,v));if(w){if(f=ud(q,e,h))continue;l&&(zd(k,l),v=Ca(Ha(k)-v,k));if(f=nc(v,k,h,h,h))continue;b.sa?(je(k,b.xa),td(e,l,m,m)):Zb(e,j)}else Zb(e,j),ud(v,e,m);t&&(yd[e]=b.fa)}}}function nc(a,b,c,d,e){of=h;for(var f=b.pa,g=b.ea?b.ac:b.ta,k=[],n=u.min(a*b.xa,Ha(b)),q=b.eb;q=l)&&k[D](w)}e=m;if(0==k[H]||d==m)Yg(n,b,g);else{for(var w=d=0,v=b.sa,t=b.ea,q=0;qe&&(a=e);d.ea==h&&(a=Ca(e-a,xa(b)));d.eb=0;d.tb=0;d.Da=[];d.ab=[];b=zb()/1E3;d.pa=b-a;d.Qa=b-d.pa;d.sa==h&&(p[Qa](d.hb),d.hb=p[vc](function(){ke(d)}, +1E3*((e-a)/d.xa)));hj(d,m);Zg(d,0);ij(d,a);a=nc(a,d,m,h,c);Kc();return a}}function Ad(a,b){var c=xa(a);if(c==j)return 0;var d=0;c.sa==h?(d=zb()/1E3-c.pa,d*=c.xa):d=c.Qa;var e=Ha(c);b==h&&c.ea==h&&(d=e-d);d=u.max(0,d);return d=u.min(e,d)}function ij(a,b){for(var c={},d=a.ea?a.ac:a.ta,e=0;e=b&&(c[g]==j&&(c[g]={}),q!=h&&c[g][k]==j&&(q=Ja(g),n==ca&&(a.ea==h&&0==f.d)&&(n=f.s),Y(q,k,n)),c[g][k]=h)}}}} +function td(a,b,c,d){yd[a]=j;var e=xa(a);e!=j&&(c&&je(e,1),zd(e,b),e.sa==m&&(e.pa!=j?e.Qa==Ha(e)?d&&Yb(a,j,b):(e.sa=h,e.pa=zb()/1E3-e.Qa/e.xa,p[Qa](e.hb),e.hb=p[vc](function(){ke(e)},1E3*((Ha(e)-e.Qa)/e.xa)),e.mb!=h&&(Zg(e,e.Qa),e.eb=0,e.tb=0,e.Da=[],e.ab=[]),nc(e.Qa/e.xa,e,m,m),Kc()):(d==h||0==e.Qa)&&Yb(a,j,b)))}function Zb(a,b){yd[a]=j;var c=xa(a);c!=j&&c.sa==h&&(je(c,1),c.Qa=b!=j?b:zb()/1E3-c.pa,c.sa=m,p[Qa](c.hb))}function ke(a){if(!(qa==h&&a.mb==h)&&!nc(Ha(a),a,h,h))if(le(a),me!=j&&Af==a.fa)a= +me,Af=me=j,a();else if(a={type:ki,timelineName:a.Lb.n},Bf(a,j)!==m){var b=Ta();if(b!=j){var c=x[Cf(Df())].F;c!=j&&ta(b,c.a)(a)}}}function Ca(a,b){return qa==h&&b.mb==h?Ef(a,60):Ef(a,b.Lb.f)}function Ef(a,b){var c=u[bb](a);return c+u[Sa]((a-c)*b)/b}function Ha(a){return qa==h&&a.mb==h?31536E3:Ca(a.Lb.d,a)}function Kc(){if(zf!==h){zf=h;var a=function(a){p[vc](a,1E3/60)};(z.kb!=j?a:p.requestAnimationFrame||p.webkitRequestAnimationFrame||p.mozRequestAnimationFrame||a)(function(){zf=m;gj()})}}function le(a){p[Qa](a.hb); +a.eb=0;a.tb=0;a.Da=[];a.ab=[];a.Xe=j;a.pa=j;a.sa=m;a.xa=1;a.Qa=Ha(a);a=mb(eb,a);-1!=a&&eb[ed](a,1)}function jj(a){for(var b=0;b=b&&(db[f]===ca||db[f][g]===ca||db[f][g]==a.fa))yb[f][g]=a.fa}jj(a)}function Yb(a,b,c){yd[a]=j;for(var d=0;dz.ca&&0==a[ub](vn)&&(a=dj(Xg(a),h));return a} +function dj(a,b){if(1==a[3]||b==h){for(var c=ma.Wc,d=Id,e=0;3>e;e++)d+=c[qb](a[e]/16)+c[qb](a[e]%16);return d}return wn+oa(a[0])+Fe+oa(a[1])+Fe+oa(a[2])+Fe+pa(a[3])+Ce}function F(a,b){var c=u.pow(10,b==j?0:b);return Z+u[Sa](a*c)/c+qn}function Xg(a){var b=[0,0,0,1];if(0==a[ub](un)){var c=a[ub](Be),d=a[ub](Ce);if(3c;c++)b[c]=16*d[ub](a[qb](2*c))+d[ub](a[qb](2*c+1))}return b} +function cj(a){typeof a!=gn&&(a=pa(a));return isNaN(a)?0:a}function mj(a,b,c){Gf=m;c!=j&&delete x[G].T[c];Ia(b[O],bl);Y(b,Mk,0,ek,0);ia(b,Xh,Zf);Y(b,xk,0,Nj,0,mo,1,Yl,1);c=x[G].a;c!=j?(ra(b[O],fg),ra(T[O],c+Qd)):(ra(b[O],F(x[G].Y)),ra(T[O],b[O][Ra]));c=x[G].b;c!=j?(Ma(b[O],fg),Ma(T[O],c+Qd)):(Ma(b[O],F(x[G].Z)),Ma(T[O],b[O][dd]));Mc[T.id]=j;Mc[b.id]=j;fa[R[a.id]]&&(a!=j&&a!=b)&&(Ia(a[O],fn),a[Ib](qk,h),Y(a,Mk,0,ek,0,xk,0,Nj,0,mo,0,Yl,1),ia(a,Xh,Zf));T[O][Ue]=j;T[O][ma.Oa+Un]=km;T[O][Oe]=j;T[O].perspective= +j;if(9>z.ca){a=ne(a);for(c=0;cq;q++)for(var w=0;wu.abs(c.x-pe[b].x)&&25>u.abs(c.y-pe[b].y)&&(a.stopPropagation(),a[rb]())}}function oj(a){var b=[],c=x[G].U,d;for(d in c)c[K](d)!=m&&c[d].n==a&&b[D](oc[d]);return b}function Ui(a){var b={type:li, +customBehaviorName:a},c=Lf[a];if(c!=j)for(var d=0;d=d;d++)c[D]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Db=c;a.Hb=ca;a.Sc=m;var c=a.wa?b[Cc][0]:b,e;e=function(b){dh(a);a.ob=Dl;Of(b,a)};a.Ia=e;b=a.wa?a.Qc:s;a.wa?Ua(Pn,a.Ia,b,m):p.self!=p.top&&(d=function(a){(a.relatedTarget===s.documentElement||a.toElement===j)&&e(a)},a.Ia=d,Ua(Um,d,b,m));c=Jf(c);d=a.Db[0];d[Uc].x=c.x;d.end.x=c.x;d[Pa].x=c.x;d[Uc].y=c.y;d.end.y=c.y;d[Pa].y=c.y;sj(a,c);a.pd=function(b){if(!(a.ob===bm||a.ob===Dl))if(Nf== +h)a.Ia(b);else{if(a.uc==m&&(Mf++,a.uc=h,a[U].ua==Wl)){Pf=h;if(a[U].Ya!=j)for(var c=0;cz.ca&&(a.Qc.ondragstart=function(a){return a==j?m:h});if(a[U].Ya!=j)for(c=0;cw,(l||w==m||Pf==h)&&a.Ia(b)):a[U].ua==Mn&&5=t?Jm:yn:0>=t&&-180<=t?Xn:Vl)!=r,x=v/J;else{r=l=Ad(d.fa,m);for(v=J=0;va[U].gc?(b={type:gi+a[U][Oa][qb](0).toUpperCase()+a[U][Oa][Xa](1)+vg},a.qd(b)):a.Ia(b)):a[U].ua==Mn?1500>d&&a.qd(b):a.Ia(b);dh(a)}};Ua(a.wa?Qn:Wm,a.od,b,m);b.setCapture&&b.setCapture();a.tc=zb();a.Xc=a.tc;Pf=Nf=a.uc=m}}}function dh(a){if(a.Sc!=h){a.Sc=h;db={};var b=a.wa?a.Qc:s;b.releaseCapture&&b.releaseCapture();re(a.wa?Rn:Tm,a.pd,b); +re(a.wa?Qn:Wm,a.od,b);a.wa?re(Pn,a.Ia,b):re(Um,a.Ia,b);a[U].ua==Wl&&(Pf=m);a.uc==h&&Mf--;qa==h&&a[U]&&(Ic(a[U].vb),Kc())}}function Of(a,b){b[U].se==h&&(a.hypeGesturePhase=b.ob,a.hypeGestureXPosition=b.Db[0].end.x,a.hypeGestureYPosition=b.Db[0].end.y,b.qd(a))}function re(a,b,c){c[wc]?c[wc](a,b,m):c[Wc]&&c[Wc](jn+a,b)}function Ua(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Qf[D](e);c[Hb]?c[Hb](a,b,m):c[Tb]&&c[Tb](jn+a,b)}function Jf(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hc]|| +a[ic])b.x=a[hc]+s[Ec].scrollLeft+s.documentElement.scrollLeft,b.y=a[ic]+s[Ec].scrollTop+s.documentElement.scrollTop;return b}function uj(a){var b;0==a.c?0==a.A?b=yn:1==a.A&&(b=Jm):1==a.c&&(0==a.A?b=Xn:1==a.A&&(b=Vl));return b}function sj(a,b){var c=a[U][Oa]==yn||a[U][Oa]==Jm?b.x:b.y;a.Hb=a.Hb==ca?c:a[U][Oa]==yn||a[U][Oa]==Vl?u.max(a.Hb,c):u.min(a.Hb,c)}function tj(a,b,c){a=u[Sa](180*u[Eb](b.y-a.y,b.x-a.x)/u.PI);c=u.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Jm;if(a<=45-c&&a>=-45+c)return yn;if(a< +-45-c&&a>-135+c)return Xn;if(a>45+c&&a<135-c)return Vl}function Mg(a){for(var b=Bd[a],c={},d=0;dz.ca?wo:xo;d={};d.kd=z.kb!=j;var f=Sf[a];f==j&&(f=new b(a,c),f.Lf=a,f.cc=c,f.options=d,f.jd=function(){var a=[],b;for(b in f.cc)f.cc[K](b)!=m&&a[D](b); +return a.sort()});return f}function vj(a){a=Bd[a];if(a!=j){for(var b=1=$b[H]?wj():b==h&&gh==m&&(gh=h,p[vc](function(){xj()},1))}function xj(){0>=$b[H]||(gh=m,yj($b[0],h))}function yj(a,b){var c=La[a].p;if(1==c)if(c=La[a].g,c!=j&&vj(c)!=a)fh(a,b);else{var d=new Image,c=function(c){d=this;if((z.Pc!= +j||z.Wd!=j&&z.kb==j)&&c[Ob]==Lm&&-1!=Ub[ub](Xl)&&-1==d.src[ub](bf))try{var e=s[Db](Fl);ra(e,d[Ra]);Ma(e,d[dd]);e.getContext(gg).drawImage(d,0,0);zj[d.Ne]=e.toDataURL()}catch(k){}fh(a,b)},e=Rf(a);d.onload=c;d.onerror=c;d.onabort=c;d.src=e;d.Ne=a}else 2==c&&(c=function(){for(var c=Bd[La[a].g],d=0;dpa(z.Ra)||9>z.ca?p[vc](c,1):e.load(c,c))}function wj(){gf!=j&&gf(m,T);if(Bf({type:di},T)!==m)if(-1==zg)Lc(Pc);else{se=h;for(var a= +-1,b=0;bc&&(c=f),ra(T[O],F(c)),Mc[T.id]=j,T[O].margin==uk&&(ka&&(a=g),Ma(T[O],F(a)))}function Dd(a){var b=T[bd].offsetHeight,c=x[a].b;return c!=j?c/100*b:x[a].Z}function Cd(a){var b=T[bd][ib],c=x[a].a;return c!=j?c/100*b:x[a].Y}function hh(a,b,c,d){if(!(Aj(a)==j||Gf==h)){c==j&&(c=1.1);c=Ef(c,60);Gf=h;var e=function(){d!=j&&d();nb=[];Lf={};var e=Ta();Jc=x[a].a!=j||x[a].b!=j?h:m;var f=Aj(a),g=G,k=Ta();if(k!=j){for(var n=k[fc](ao),l=0;lF&&(F=l[O][dc]))}else w[D]({container:l,domElement:E,sceneElement:v});la[k].Kd==m&&(qa==h&&Lg(qc[k]),nj(l,h),la[k].Kd=h)}for(l= +0;lg?P:g,fa[C].a=0,fa[C].b=0)):(te(e,ea,h,m),P!=g&&(W[D](ac(Rl,0,S,ml,C,P,g)),fa[C]={},fa[C].c=X>L?X:L,fa[C].d=P,fa[C].a=0,fa[C].b=0)),q=Nj,f=L,r=-1*L,5==b?(f=-1*X,r=X):6==b?(q=xk,f=-1*P,r=P):7==b&&(q=xk,f=g,r=-1*g),e!=j&&(w=R[e.id],Y(e,ml,X,Rl,P),W[D](ac(q,0,S,ml,w,0,f))),W[D](ac(q,0,S,ml,R[ea.id],r,0)),Y(ea,ml,L,Rl,g,q,r),ih(Vh,S,W,e,ea),Ia(ea[O],bl)):(te(e,ea,m,m),mj(e,ea,j));Qc()},f=m,g= +Ta();g[Ib](qk,h);if(Bj==h&&g!=j){var g=Cf(Df()),k={type:fi};if(Bf(k,j)!==m){var n=x[g].B;if(n!=j){for(var q=n.a,w=ta(Ta(),q),n=0;nk;k++){var n=fj(e,k/99),q={};q.location=n;b&&(g=eh(n,g),f+=g,Aa(q,g)); +e.qa[D](q);g=n}c+=f;Aa(e,f)}return c}function fj(a,b){var c=Fd(a.fb,a.Jb,b),d=Fd(a.Jb,a.Bb,b),e=Fd(a.Bb,a.Rb,b),f=Fd(c,d,b),d=Fd(d,e,b),f=Fd(f,d,b),g=m,k=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?k=e:(k=c,g=h));f.wb=ej(f,k);g==h&&(f.wb+=180);return f}function ej(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*u.atan((b.y-a.y)/(b.x-a.x))/u.PI;b.xc)break;b=e}}return b}function Gg(a){var b=qc[Df()];a!=j&&(b=qc[a]);a=Mc[b];a==j&&(a=s[cb](b),a={width:a[ib],height:a.offsetHeight},Mc[b]=a);return a}function nf(a){var b=0,c=0;a==j?(b=x[G].Y,c=x[G].Z):(b=Vb(a),c=Wb(a));return{width:b,height:c}}function Qg(a){return(z.Ra!=j||3.5<=z.Cb||10<=z.ca)&&t(a,Xh)==cg}function Hg(){of=m;Tg=h;for(var a in he)he[K](a)&&Nc(he[a]);Tg=m;Ug();he={}} +function Ug(){p[vc](function(){de!=j&&(kh?lh=h:(kh=h,de.refreshAll(),kh=m,lh&&(lh=m,Ug())))},0)}function mh(a,b,c){var d=b;if(d==j||s[cb](d)!=j){do d=c+Hj();while(s[cb](d)!=j)}qc[a]=d;R[d]=a;return nh[b!=j?b:d]=d}function Ja(a){return s[cb](qc[a])}function zb(){return(new Date).getTime()}function Hj(){for(var a=Z,b=ma.Wc+Bh,c=0;20>c;c++)var d=u[bb](u.random()*b[H]),a=a+b.substring(d,d+1);return a}function xo(a){var b=this;Sf[a]=b;b.bc=function(){var a=s[Db](sk);b.Ha=a;for(var d=b.jd(),e=0;ez.ca&&(b=b.match(/('|")(http.*?css.*?)('|")/),b!=j&&2<=b[H]&&s.createStyleSheet(b[2]));p[vc](Qc,120);p[vc](Qc,1200);a=s[Db](Ul);a.id=Ih;Ia(a[O], +fn);a[Ib](qk,h);T[Na](a);for(b=0;bz.ca)xj();else for(L=0;Lz.ca|| +z.Rd){if(1==oa(b))ia(a,Rh,Z),ia(a,Qh,Z);else{var c=wg+u[Sa](100*b)+Ce;ia(a,Rh,ma.wc+Xe+c);ia(a,Qh,c.toLowerCase());a[O].backgroundColor==Z&&a[O].backgroundImage==Z&&s[cb](Am+a.id)==j&&Ga(a[O],Yn+ie(Z+Ub+Yf)+Wd)}fe(a)}a[O].opacity=b;a[O].MozOpacity=b},aP:function(a,b){a[O].cursor=b},bD:function(a,b){a[O][ma.Oa+Zn]=b;a[O].MozUserSelect=b;a.onselectstart=function(){return m}},N:function(a,b){a[O].borderLeftWidth=F(b);Mb(a)},O:function(a,b){a[O].borderRightWidth=F(b);Mb(a)},P:function(a,b){a[O].borderTopWidth= +F(b);Mb(a)},M:function(a,b){a[O].borderBottomWidth=F(b);Mb(a)},B:function(a,b){a[O].borderLeftColor=xb(b)},C:function(a,b){a[O].borderRightColor=xb(b)},D:function(a,b){a[O].borderTopColor=xb(b)},A:function(a,b){a[O].borderBottomColor=xb(b)},J:function(a,b){a[O].borderLeftStyle=b},K:function(a,b){a[O].borderRightStyle=b},L:function(a,b){a[O].borderTopStyle=b},I:function(a,b){a[O].borderBottomStyle=b},aK:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopLeftRadius=b;a[O].MozBorderRadiusTopleft=b;9> +z.ca&&wf(a)},aL:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopRightRadius=b;a[O].MozBorderRadiusTopright=b;9>z.ca&&wf(a)},aI:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomLeftRadius=b;a[O].MozBorderRadiusBottomleft=b;9>z.ca&&wf(a)},aJ:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomRightRadius=b;a[O].MozBorderRadiusBottomright=b;9>z.ca&&wf(a)},bE:function(a,b){sa(a,Z);var c,d=Bd[b];if(d!=j){for(var e=0;ez.ca){d=a[Fc][Db](Ul);Da(d,Ch);for(e=0;ez.ca)try{c.SetControllerVisible(0!=oa(b))}catch(d){p[vc](function(){fb.aO(a,b)},100)}},aR:function(a,b){a[Ib](bn,b);a.volume=0!=b?$f:dg;var c=a[Fc][wb][am+a.id]; +if(c!=j&&9>z.ca)try{c.SetMute(0!=oa(b))}catch(d){p[vc](function(){fb.aR(a,b)},100)}},aQ:function(a,b){a[Ib](Mm,b);wa(a,0!=b);var c=a[Fc][wb][am+a.id];if(c!=j&&9>z.ca)try{c.pf(0!=oa(b))}catch(d){p[vc](function(){fb.aQ(a,b)},100)}},j:function(a,b){Ba(a[O],b)},r:Yi,cY:Yi,aG:function(a,b){a[Ib](On,b);a[Ib](nk,b)},g:function(a,b){a[O].backgroundColor=xb(b)},n:Rg,m:Rg,l:Rg,h:function(a,b){var c=vj(b);if(c!=j){var d=La[c].n,e=Rf(c);if((3.6>z.Cb||9>z.ca)&&(a[O].backgroundRepeat==j||a[O].backgroundRepeat== +Z||a[O].backgroundRepeat==en)){var f=Am+a.id,c=s[cb](f);c!=j?c.src=e:(c=s[Db](zm),c.src=e,c.id=f,Ba(c[O],hk),ra(c[O],fg),Ma(c[O],fg),c[O].top=Zf,va(c[O],Zf),za(c[O],Le),a[Na](c));ia(c,Oh,c.src);9>z.ca&&d.substr(d[H]-4).toLowerCase()==df&&(c.src=Z+Ub+Yf,e=ie(e)[Ya](/\%/gi,Rd),ia(c,Ph,ma.wc+Ye+e+Wd),ia(c,Nh,ma.wc+cf),fe(c));Nc(a)}else d=zj[c],Ga(a[O],d!=j?Yn+d+Wd:Yn+ie(e)+Wd)}},q:function(a,b){a[O].backgroundSize=b;a[O][ma.Oa+Vk]=b;a[O].MozBackgroundSize=b},o:function(a,b){a[O].backgroundOrigin=b;a[O][ma.Oa+ +Uk]=b;a[O].MozBackgroundOrigin=b},p:function(a,b){if(b!=j&&b!=en){var c=s[cb](Am+a.id);c!=j&&(Ga(a[O],Yn+ie(t(c,Oh))+Wd),c[bd][Gc](c))}a[O].backgroundRepeat=b},x:function(a,b){a[O].overflow=b},aT:function(a,b){a[O].paddingLeft=F(b);Mb(a)},aU:function(a,b){a[O].paddingRight=F(b);Mb(a)},aV:function(a,b){a[O].paddingTop=F(b);Mb(a)},aS:function(a,b){a[O].paddingBottom=F(b);Mb(a)},S:yf,T:yf,R:yf,Q:yf,bB:xf,bC:xf,bA:xf,aZ:xf,bL:function(a){vd(a);z.Pc!=j&&a[O][We]==Z&&(a[O][We]=fn)},bG:vd,bH:vd,bI:vd,bJ:vd, +bK:vd,BDbL:wd,BDbG:wd,BDbH:wd,BDbI:wd,BDbJ:wd,BDbK:wd,Z:function(a,b){a[O].wordWrap=b},yy:function(a,b){a[O].whiteSpace=b},y:function(a,b){a[O].whiteSpaceCollapsing=b},z:function(a,b){za(a[O],b);a[bd][sc]==Hh&&za(a[bd][O],b)},aA:function(a,b){var c=ta(a,b.a);be&&(Oc(a,{Eb:1,ua:Mn},c),a[O][Ve]=xn);a[Ib](zn,ll);Va(Gl,a,c,h)},aD:function(a,b){Va(Vm,a,ta(a,b.a),m)},aC:function(a,b){Va(Um,a,ta(a,b.a),m)},aE:function(a,b){var c=ta(a,b.a);be&&(Va(Qn,a,c,h),a[O][Ve]=xn);a[Ib](zn,ll);Va(Wm,a,c,h)},aB:function(a, +b){var c=ta(a,b.a);if(be){var d=m;if(z.kb!=j)for(var e=b.a,f=0;fz.ca?c():Qi(a,c,cm)},cX:function(a,b){9>z.ca||Qi(a,ta(a,b.a),em)},cG:function(a,b){Oc(a,{Eb:1,direction:yn,gc:30,ua:In},ta(a,b.a))},cH:function(a,b){Oc(a,{Eb:1,direction:Jm,gc:30,ua:In},ta(a,b.a))},cI:function(a,b){Oc(a,{Eb:1,direction:Xn,gc:30,ua:In},ta(a,b.a))},cJ:function(a, +b){Oc(a,{Eb:1,direction:Vl,gc:30,ua:In},ta(a,b.a))},cK:ee,cF:ee,aM:function(a,b){Va(Vm,a,Og(a,b),m);Va(Um,a,vf(a,b),m)},aN:function(a,b){be&&(Va(Sn,a,Og(a,b),m),Va(Rn,a,vf(a,b),m),Va(Qn,a,vf(a,b),m),a[O][Ve]=xn);Va(Sm,a,Og(a,b),m);Va(Wm,a,vf(a,b),m)},V:Pg,U:Pg,W:Pg,w:function(a,b){var c=s[cb](Am+a.id),c=c!=j?c.cloneNode(h):j;sa(a,b);for(var d=a[fc](Bn),e=0;ez.ca){var c=function(b){b=b?b:p[fd];if(a[O][mn]==fn){var c=a[O].display;Ia(a[O],fn);var f=s.elementFromPoint(b[hc],b[ic]);Ia(a[O],c?c:Z);s.createEvent?(b[rb](),c=s.createEvent(qi),c.initMouseEvent(b[Ob], +b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hc],b[ic],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b[tb],j),f.dispatchEvent(c)):(c=s.createEventObject(),c.clientX=b[hc],c.clientY=b[ic],f.fireEvent(jn+b[Ob],c),event.cancelBubble=h)}};Ua(pi,c,a,h);Ua(Wm,c,a,h);Ua(Sm,c,a,h);Ua(Gl,c,a,h)}}},Sf={},Gd=j,ce=[Nj,xk,fm],Ka=[],kf=m;fb.bM=Ic;fb.bU=jf;fb.bV=jf;fb.cT=jf;fb.bW=jf;var V,X={},E={ge:4},yo=1,zo=-1;E.create=function(a){var b={id:y.Wb(),type:dl,label:vh,ba:0,aa:S.Id(ni),position:{x:0,y:0}, +Ba:{x:0,y:0},ic:0,ka:{x:0,y:0},Ea:{x:0,y:0,ba:0},speed:0,Sa:0,ha:{x:0,y:0},va:0,da:m,ia:m,rb:0,hd:60,Ab:0.0010,Xa:0,La:0.1,sc:0.01,pc:{Bd:1,Nd:4294967295,group:0},yb:0.05,gb:1,ya:{visible:h,Sf:{Wf:1,Xf:1},lineWidth:1.5}},b=y[pb](b,a);b.ga=b.ga||gb[kc](b.aa);b.$=b.$||r.mc(b[I]);b.oa=b.oa||b.ba;E.Zd(b,b.aa);E.Yd(b,b.da);Wa.set(b,b.ia);S[Bc](b.aa,b.ba,b[I]);Rc[Bc](b.Ua,b.ba);gb[cd](b.ga,b.aa,b.ha);b.Ua=a.Ua||b.Ua;b.Ta=a.Ta||b.Ta;E.Cc(b,a.Wa||b.Wa);E.gd(b,a.qb||b.qb);a=b.da?Pd:y.ne();var c=y.Qe(a);b.ya.fillStyle= +b.ya.fillStyle||a;b.ya.strokeStyle=b.ya.strokeStyle||c;return b};E.If=function(a){return a?zo--:yo++};E.Yd=function(a,b){if(a.da=b)a.Xa=0,a.La=1,a.Wa=a.qb=a.Ab=ja,a.ra=a.Ma=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,a.va=0,ua(a,0),a.Sa=0,a.rb=0};E.Cc=function(a,b){a.Wa=b;a.ra=1/a.Wa;a.Ab=a.Wa/a.Ta};E.Xd=function(a,b){E.Cc(a,b*a.Ta);a.Ab=b};E.gd=function(a,b){a.qb=b;a.Ma=1/a.qb};E.Zd=function(a,b){a.aa=b[0][Ec]===a?b:S[kc](b,a);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);var c=S.Oc(a.aa);S[Pb](a.aa, +c,-1);E.gd(a,E.ge*S.qb(a.aa,a.Wa));S[Pb](a.aa,a[I]);gb[cd](a.ga,a.aa,a.ha)};E.Dc=function(a,b){var c=r.sub(b,a[I]);a[I].x=b.x;a[I].y=b.y;a.$.x+=c.x;a.$.y+=c.y;S[Pb](a.aa,c);gb[cd](a.ga,a.aa,a.ha)};E.fd=function(a,b){var c=b-a.ba;a.ba=b;a.oa+=c;S[Bc](a.aa,c,a[I]);Rc[Bc](a.Ua,c);gb[cd](a.ga,a.aa,a.ha)};E.Pe=function(a,b){a.$.x=a[I].x-b.x;a.$.y=a[I].y-b.y;a.ha.x=b.x;a.ha.y=b.y;ua(a,r.Vb(a.ha))};E.Oe=function(a,b){a.oa=a.ba-b;a.va=b;a.Sa=y.abs(a.va)};E.translate=function(a,b){E.Dc(a,r.add(a[I],b))};E.rotate= +function(a,b){E.fd(a,a.ba+b)};E.scale=function(a,b,c,d){S.scale(a.aa,b,c,d);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);S[Pb](a.aa,{x:-a[I].x,y:-a[I].y});E.gd(a,S.qb(a.aa,a.Wa));S[Pb](a.aa,{x:a[I].x,y:a[I].y});gb[cd](a.ga,a.aa,a.ha)};E.Me=function(a){for(var b=0;be.max.x||g.ga.max.ye.max.y)||E[cd](g,b,c,d))}};E.update=function(a,b,c,d){b=u.pow(b*c*a.gb,2);c=1-a.sc*c*a.gb;var e=a[I].y-a.$.y;a.ha.x=(a[I].x-a.$.x)*c*d+a.Ba.x/a.Wa*b;a.ha.y=e*c*d+a.Ba.y/a.Wa*b;a.$.x=a[I].x;a.$.y=a[I].y;a[I].x+=a.ha.x;a[I].y+=a.ha.y;a.va=(a.ba-a.oa)*c*d+a.ic/a.qb*b;a.oa=a.ba;a.ba+=a.va;ua(a,r.Vb(a.ha));a.Sa=y.abs(a.va);S[Pb](a.aa,a.ha);0!==a.va&&(S[Bc](a.aa,a.va,a[I]),Rc[Bc](a.Ua,a.va));gb[cd](a.ga,a.aa,a.ha)};E.sf=function(a, +b,c){a.Ba.x+=c.x;a.Ba.y+=c.y;a.ic+=((b.x-a[I].x)*c.y-(b.y-a[I].y)*c.x)*a.Ma};var B={create:function(a){return y[pb]({id:y.Wb(),type:Ml,parent:j,vc:m,bb:[],Ob:[],na:[],label:wh},a)},Aa:function(a,b,c,d){a.vc=b;c&&a.parent&&B.Aa(a.parent,b,c,d);if(d)for(var e=0;el.ga.max.x||l.ga.min.x>g.ga[Ra]||0>l.ga.max.y||l.ga.min.y>g.ga[dd])){var v;v=l.ga;v=Ki(u[bb](v.min.x/a.yd),u[bb](v.max.x/a.yd),u[bb](v.min.y/a.xd),u[bb](v.max.y/a.xd));if(!l[sb]||v.id!==l[sb].id||d){r.wd+=1;if(!l[sb]||d)l.region=v;var t;n=v;q=l[sb]; +e=u.min(n.dc,q.dc);f=u.max(n.Qb,q.Qb);t=u.min(n.ec,q.ec);n=u.max(n.Sb,q.Sb);t=Ki(e,f,t,n);for(e=t.dc;e<=t.Qb;e++)for(f=t.ec;f<=t.Sb;f++){q=e+Fe+f;n=k[q];var x=e>=v.dc&&e<=v.Qb&&f>=v.ec&&f<=v.Sb,z=e>=l[sb].dc&&e<=l[sb].Qb&&f>=l[sb].ec&&f<=l[sb].Sb;if(!x&&z&&z&&n){var C=a,A=n,B=l;A[ed](y[ub](A,B),1);for(var E=0;EL*f.La*d&&(F=L*f.La*d* +G);G=r.jb(C,q);L=r.jb(z,q);G=l/(f.ra+k.Ma*G*G+n.Ma*L*L);A*=G;F*=G;0>E&&E*E>4*d?(x.Ib=0,x.Kb=0):(E=x.Ib,x.Ib=u.min(x.Ib+A,0),A=x.Ib-E,E=x.Kb,x.Kb=y.Nb(x.Kb+F,-B,B),F=x.Kb-E);c.x=q.x*A+g.x*F;c.y=q.y*A+g.y*F;!k.da&&!k.ia&&(k.$.x+=c.x*k.ra,k.$.y+=c.y*k.ra,k.oa+=r.jb(C,c)*k.Ma);!n.da&&!n.ia&&(n.$.x-=c.x*n.ra,n.$.y-=c.y*n.ra,n.oa-=r.jb(z,c)*n.Ma)}}}}},qh={Cd:function(a,b,c){var d,e;d=m;c?(e=a[vb]*a[vb]+a.Sa*a.Sa+b[vb]*b[vb]+b.Sa*b.Sa,d=c&&c.ib&&0.2>e,e=c):e={ib:m,ja:a,la:b};if(c&&d){if(c=Ag(c.ja.aa,c.la.aa, +[c.ja.Ua[c.Nc]]),e.Vd=h,0>=c.nb)return e.ib=m,e}else{c=Ag(a.aa,b.aa,a.Ua);if(0>=c.nb)return e.ib=m,e;d=Ag(b.aa,a.aa,b.Ua);if(0>=d.nb)return e.ib=m,e;c.nbd[H]&&(a=Ii(b,a,r.Od(e.Pa)),S[Zc](b.aa,a[0])&&d[D](a[0]), +2>d[H]&&S[Zc](b.aa,a[1])&&d[D](a[1]));2>d[H]&&(d=[c[0]]);e.ld=d;e.We=r.sub(d[0],e.Ce);return e}},Vf={create:function(a){a.ja&&!a.Zb&&(a.Zb={x:0,y:0});a.la&&!a.$b&&(a.$b={x:0,y:0});var b=a.ja?r.add(a.ja[I],a.Zb):a.Zb,c=a.la?r.add(a.la[I],a.$b):a.$b,b=r.Vb(r.sub(b,c));Aa(a,a[H]||b||1E-6);a.ya=y[pb]({visible:h,lineWidth:2,strokeStyle:Ld},a.ya);a.id=a.id||y.Wb();a.label=a.label||xh;a.type=Nl;a.ae=a.ae||1;a.Mc=a.Mc||0;a.Kc=a.ja?a.ja.ba:a.Kc;a.Lc=a.la?a.la.ba:a.Lc;return a},Te:function(a,b){for(var c=0;c< +a[H];c++)Vf.Se(a[c],b)},Se:function(a,b){var c=a.ja,d=a.la,e=a.Zb,f=a.$b;c&&!c.da&&(a.Zb=r[Bc](e,c.ba-a.Kc),a.Kc=c.ba);d&&!d.da&&(a.$b=r[Bc](f,d.ba-a.Lc),a.Lc=d.ba);var g=e,k=f;c&&(g=r.add(c[I],e));d&&(k=r.add(d[I],f));if(g&&k){var e=r.sub(g,k),n=r.Vb(e);0===n&&(n=1E-6);f=r.we(e,n);e=r.sb(e,0.5*((n-a[H])/n)*a.ae*b*b);if(!(y.abs(1-n/a[H])<0.0010*b)){var q,t,l;c&&!c.da?(q={x:g.x-c[I].x+e.x,y:g.y-c[I].y+e.y},c.ha.x=c[I].x-c.$.x,c.ha.y=c[I].y-c.$.y,c.va=c.ba-c.oa,g=r.add(c.ha,r.sb(r.Xb(q),c.va)),n=r.za(q, +f),n=c.ra+c.Ma*n*n):(g={x:0,y:0},n=c?c.ra:0);d&&!d.da?(t={x:k.x-d[I].x-e.x,y:k.y-d[I].y-e.y},d.ha.x=d[I].x-d.$.x,d.ha.y=d[I].y-d.$.y,d.va=d.ba-d.oa,k=r.add(d.ha,r.sb(r.Xb(t),d.va)),l=r.za(t,f),l=d.ra+d.Ma*l*l):(k={x:0,y:0},l=d?d.ra:0);k=r.za(f,r.sub(k,g))/(n+l);0>16)+c;var d=(b>>8&255)+c,b=(b&255)+c;return Id+(16777216+65536*(255>a?1>a?0:a:255)+256*(255>d?1>d?0:d:255)+(255>b?1>b?0:b:255))[jc](16)[Xa](1)},Rf:function(a){for(var b=a[H]- +1;0c?c:a},Re:function(a){return 0>a?-1:1},now:function(){var a=p.performance;return a?(a.now=a.now||a.webkitNow||a.Hf||a.Jf||a.Ff,+a.now()):+new Date},random:function(a,b){a="undefined"!== +typeof a?a:0;y.Gc=(9301*y.Gc+49297)%233280;return a+y.Gc/233280*(("undefined"!==typeof b?b:1)-a)},vf:function(a){a=a[Ya](Id,Z);3==a[H]&&(a=a[qb](0)+a[qb](0)+a[qb](1)+a[qb](1)+a[qb](2)+a[qb](2));return oa(a,16)},log:function(a,b){if(console&&console.log){var c;switch(b){case go:c=Kl;break;case dm:c=Ll}console.log(Td+b+jg+a,c)}},Wb:function(){return y.je++},sin:function(a){return pa(u.sin(a)[Za](8))},cos:function(a){return pa(u.cos(a)[Za](8))},indexOf:function(a,b){if(a[ub])return a[ub](b);for(var c= +0;c=e.hd&&Wa.set(e,h)):0Wa.ie*c&&Wa.set(f,m)}}},set:function(a,b){b?(a.ia=h,a.xb=a.hd,a.ka.x=0,a.ka.y=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,ua(a,0),a.Sa=0,a.rb=0):(a.ia=m,a.xb=0)}},Rc={Jd:function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x);e.xa.max.y&&(a.max.y=e.y);e.y=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},Pd:function(a,b){return a.min.x<=b.max.x&& +a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},translate:function(a,b){a.min.x+=b.x;a.max.x+=b.x;a.min.y+=b.y;a.max.y+=b.y},shift:function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x;a.max.x=b.x+c;a.min.y=b.y;a.max.y=b.y+d}},r={mc:function(a){return{x:a.x,y:a.y}},Vb:function(a){return y[Gb](a.x*a.x+a.y*a.y)},Cf:function(a){return a.x*a.x+a.y*a.y},rotate:function(a,b){var c=y.cos(b),d=y.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},Qf:function(a,b,c){var d=y.cos(b);b=y.sin(b);return{x:c.x+ +((a.x-c.x)*d-(a.y-c.y)*b),y:c.y+((a.x-c.x)*b+(a.y-c.y)*d)}},xc:function(a){var b=r.Vb(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},za:function(a,b){return a.x*b.x+a.y*b.y},jb:function(a,b){return a.x*b.y-a.y*b.x},add:function(a,b){return{x:a.x+b.x,y:a.y+b.y}},sub:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},sb:function(a,b){return{x:a.x*b,y:a.y*b}},we:function(a,b){return{x:a.x/b,y:a.y/b}},Xb:function(a){var b;b=b===h?-1:1;return{x:b*-a.y,y:b*a.x}},Od:function(a){return{x:-a.x,y:-a.y}},ba:function(a, +b){return u[Eb](b.y-a.y,b.x-a.x)}},S={create:function(a,b){for(var c=[],d=0;dy.oa||y.Db||y.Ka!=j?n.open(f,Of):(9==y.oa||15>y[Sa])&&!(c instanceof MouseEvent)?n.open(f,Of):(e=p[Ta](X),e[B](Ci,f),e[B](Mj,Of),p[zb][ua](e),f=p.createEvent(Af),f.initMouseEvent(ei, +c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hb],c[ib],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,p[zb][Qb]),e.dispatchEvent(f),p[zb][Ab](e)):n.top.location=f);else if(6==f){h=e.l;l=e.m;e=e.n;f=Xi;h!=j&&(f+=escape(h));if(l!=j||e!=j)f+=ee,h=[],l!=j&&h[A](Gj+ba(l)),e!=j&&h[A](Kh+ba(e)),f+=h.join(zc);f!=Xi&&(n.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=g&&(e=k),f!=j&&(f=oe(f),ka(f,e),f[Va]())):13==f?(f=e.o,f!=j&&oe(f)[yb]()):14==f&&(e=e.B,e!=j&&Wf(e))}}}function zd(a,b){return function(c){pe(c, +b,O[a.id])}}function qe(a,b){return function(c){Xf(c,b,O[a.id])}}function Lc(){}function Yf(a){var b=u(a,$g,8),c=u(a,Zg,0);y.hb==j&&(1==1-c&&a[L].removeProperty!=j?a[L].removeProperty(da.la+Lh):a[L][da.la+Lh]=Hh+x(b)+Wb+(1-c)+Hc)}function re(a){var b=u(a,Kf);if(b!=j){var c=W;b==rd?c=Vf(u(a,Lf)):b==od&&(c=W+jc+nd+u(a,Jf));b=be+c+Cc;y.va!=j&&(b=ae+b+Zd);ja(a,b)}}function Zf(a,b){var c=b==g?ke:W,d=u(a,c+wh,0),e=u(a,c+rh,0),f=u(a,c+sh,0),h=u(a,c+th,1),l=u(a,c+uh,1),c=u(a,c+vh,1),m=W;0!=d&&(m+=Jh+d+rj); +0!=e&&(m+=Bj+e+Fc);0!=f&&(m+=Ei+(W+f+ii)+Fc);1!=h&&(m+=zj+h+Fc);if(1!=l){if(6==y.pb||y.va!=j&&536.26>=ha(y.na))l-=1,1y.oa||(0!=l?c+=$b+(W+l+ii)+Fc:b==g&&(1==q&&1==t&&rb==k)&&(c+=ac),0!=h&&(c+=Zb+(W+h+ii)+Fc));1!=q&&(c+=bc+q+Fc);1!=t&&(c+=cc+t+Fc);b=W+(W+100*w+hc)+Vb+(W+100*I+hc);a[L][da.la+Sj]=b;a[L].MozTransformOrigin=b;a[L].OTransformOrigin= +b;a[L][ed]=b;a[L][Sj]=b;a[L][jd]=c;a[L].MozTransform=c;a[L].OTransform=c;a[L][dd]=c;a[L].transform=c}function oc(a){Mc(a)}function te(a){function b(a,b){return W+a+Ti+(W+(b==g?(z.abs(e)+180)%360:(360-z.abs(e)+270)%360)+ii)+Gc+c+Gc+d+Ec}var c=u(a,gj);if(!(c==j||c==W)){var d=u(a,Wi);if(!(d==j||d==W)){var e=u(a,Ri);e!=j&&(a[L].backgroundImage=y.na!=j?b(da.la,k):y.yb!=j?b(bd,k):15>y[Sa]?b(fd,k):b(W,g))}}}function $f(a){qa(a[L],u(a,ai,k)==g?ij:u(a,sj,W));ue(O[a.id])}function Ya(a){Ib[a.id]=j;pc(a)}function pc(a){try{if(Cd== +g)Nc[a.id]=a;else{var b=u(a,Ch,36),c=se(a),d=O[a.id],e=ve(d),f=ag(e),h=bg(e),l=ag(d),m=u(a,X,0),s=u(a,mh,0),q=u(a,Qh,j),t=u(a,hi,j),rb=e=g;q==j&&(e=k,q=l[Ba]);t==j&&(rb=k,t=l[Rb]);var w=Oc(d),I=Pc(d),d=I-t,l=m,P=s,v=w,M=I,y=k;if(nc==g&&36!=b){var r=0!=(b&1),Jb=0!=(b&4),G=0!=(b&2),Na=0!=(b&8),F=0!=(b&32),D=0!=(b&16),J=0!=(b&64)&&G==g&&D==g,E=0!=(b&128)&&G==g&&D==g,y=0!=(b&256)&&(G==g||D==g),Q=h[Ba]/f[Ba],R=h[Rb]/f[Rb];G==g&&(v=r==g&&Jb==g?w+(h[Ba]-f[Ba]):z[Ga](w*Q));r==g&&Jb==g&&G==k?(b=m+w/2,l=z[Ga](b* +Q-w/2)):r==g&&Jb==k&&G==g?l=h[Ba]-f[Ba]+m-(v-w):r==g&&Jb==k?l=h[Ba]-f[Ba]+m:r==k&&Jb==k&&(l=z[Ga](m*Q));D==g&&(M=Na==g&&F==g?I+(h[Rb]-f[Rb]):z[Ga](I*R));Na==g&&F==g&&D==k?P=z[Ga]((s+I/2)*R-I/2):Na==g&&F==k&&D==g?P=h[Rb]-f[Rb]+s-(M-I):Na==g&&F==k?P=h[Rb]-f[Rb]+s:Na==k&&F==k&&(P=z[Ga](s*R));if((J==g||E==g)==g)h=v,f=M,s=v/w,Q=M/I,R=s,J==g?R=s<=Q?s:Q:E==g&&(R=s>=Q?s:Q),v=z[Ga](w*R),M=z[Ga](I*R),J=h-v,E=f-M,r==g&&Jb==k?l+=J:r==g&&Jb==g&&(l+=z[Ga](J/2)),Na==g&&F==k?P+=E:Na==g&&F==g&&(P+=z[Ga](E/2))}var Y= +z.max(0,v-(w-q)),H=z.max(0,M-d);e==g?(y==g&&(l+=u(a,Ij,0.5)*(v-w),Xa(a,nf,z.max(0,v/w)),Y=q),ia(a[L],x(Y,2))):ia(a[L],W);rb==g?(y==g&&(P+=u(a,Jj,0.5)*(M-I),Xa(a,of,z.max(0,M/I)),H=t),ta(a[L],x(H,2))):ta(a[L],W);Xa(a,ff,P);Xa(a,gf,l);c==k&&(a[L].top=x(P),a[L].left=x(l));(c==g||y==g)&&Mc(a);we==k&&xe()}}catch(Z){}}function Vf(a){a!=j&&0===a[Ma](ak)&&(a=Di+a);return a}function sb(a,b){if(a[Ma])return a[Ma](b);for(var c=0;c=d){b=e!=j?e[wb].y+(t[wb].y-e[wb].y)*(d-e[wb].x)/(t[wb].x-e[wb].x):t[wb].y;break a}e=t}e=j}b=t[wb].y}c.$==g&&(b=1-b);d=m;e=a.a;if(e!=aa){m= +ye[e];if(a.b!=j){if(c.Sa[e]==j&&(m=a.o,s=a.a,s!=aa)){q=ye[s];a={};for(var v=[],I=0,P=0,w=0;wa;a++)c[a]=h[a]+(M[a]-h[a])*b;if(1==c[3]){h=da.Ya;M=gc;for(b=0;3>b;b++)M+=h[Ka](c[b]/16)+h[Ka](c[b]%16);d=M}else d=vj+ga(c[0])+Gc+ga(c[1])+Gc+ga(c[2])+Gc+ha(c[3])+Ec}else 1==b&&(d=s);Q(l,f,d)}function fg(a,b,c){var d;d=a[C];var e=0,f,h=0,h={};if(0>b||1b){var q=a.ka[0];2<=q.ba[C]&&(f=q.ba[0],e= +q.ba[1],l=f)}else m=-1,s=1-b,q=a.ka[a.ka[C]-1],2<=q.ba[C]&&(f=q.ba[q.ba[C]-2],l=e=q.ba[q.ba[C]-1]);if(f!=j&&e!=j){a=m*(e[wb].x-f[wb].x);b=m*(e[wb].y-f[wb].y);d*=s;0==b?(h.y=0,h.x=d):(h.y=z.sqrt(z.pow(d,2)/(z.pow(a,2)/z.pow(b,2)+1)),h.x=h.y*a/b);if(0a&&0>h.x)h.x*=-1;if(0b&&0>h.y)h.y*=-1;h.x+=l[wb].x;h.y+=l[wb].y;h.za=ig(f[wb],e[wb])}}else if(0==d)h={x:a.ka[0].ta.x,y:a.ka[0].ta.y,za:0};else{if(1==b)d=a.ka,f=d[d[C]-1],h=1;else{for(h=0;h +b){f=q;break}e+=q[C]}h=(b-e/d)/(f[C]/d);d=f[C]*h;for(b=a=h=0;b=f)b.sa=d+1,Oa[h][l]==b.aa&&(1==e.p&&b.fa==g?(e=v[D].v[h].aH,f=sa(h),e==g&&f[Va]&&(f.autoplay=g,f[Va]())):0==e.p&&b.ia[A](e));else break}c=[];for(d=0;d=f){if(qc[e]==b.aa){var s=b.$==k?m.G:V(m.G+m[mb],l),f=0,f=m.z?s-m[mb]:s+m[mb],f=z.max(0,f);rc(l,k);f=tb(f,l,g,g,k);f==k&&qb(e,j)}b.qa[Sb](d,1);d--}}for(d=b.ya;d=f)){b.ya=d+1;var q=m.E,t=m.z,u=s=b.$==k?m.G:V(m.G+m[mb],l),w=k;b.$==g&&(t=!t);q&&(f=a-f,f>m[mb]?(q=k,f=m[mb]):(b.qa[A](m),w=g),u=t?u-f:u+f,u=z.max(0,u));if(q){if(f=kc(s,e,g))continue;t&&(rc(l,t),u=V(ca(l)-u,l));if(f=tb(u,l,g,g,g))continue; +b.fa?(Qc(l,b.ha),Kc(e,t,k,k)):qb(e,j)}else qb(e,j),kc(u,e,k);w&&(qc[e]=b.aa)}}}function tb(a,b,c,d,e){Cd=g;var f=b.da,h=b.$?b.Na:b.ea,l=[];a=z.min(a*b.ha,ca(b));for(var m=b.sa;m=q)&&l[A](s)}e=k;if(0==l[C]||d==k)Ae(a,b,h);else{for(var s=d=0,t=b.fa,v=b.$,m=0;me&&(a=e);d.$==g&&(a=V(e-a,S(b)));d.sa=0;d.ya=0;d.ia=[];d.qa=[];b=Pa()/1E3;d.da=b-a;d.ma=b-d.da;d.fa== +g&&(n[xa](d.ua),d.ua=n[kb](function(){Rc(d)},1E3*((e-a)/d.ha)));mg(d,k);Be(d,0);ng(d,a);a=tb(a,d,k,g,c);Dd();return a}}function sc(a,b){var c=S(a);if(c==j)return 0;var d=0;c.fa==g?(d=Pa()/1E3-c.da,d*=c.ha):d=c.ma;var e=ca(c);b==g&&c.$==g&&(d=e-d);d=z.max(0,d);return d=z.min(e,d)}function ng(a,b){for(var c={},d=a.$?a.Na:a.ea,e=0;e=b&&(c[h]==j&&(c[h]={}),s!=g&&c[h][l]==j&&(s=sa(h),m==aa&&(a.$== +g&&0==f.d)&&(m=f.s),Q(s,l,m)),c[h][l]=g)}}}}function Kc(a,b,c,d){qc[a]=j;var e=S(a);e!=j&&(c&&Qc(e,1),rc(e,b),e.fa==k&&(e.da!=j?e.ma==ca(e)?d&&pb(a,j,b):(e.fa=g,e.da=Pa()/1E3-e.ma/e.ha,n[xa](e.ua),e.ua=n[kb](function(){Rc(e)},1E3*((ca(e)-e.ma)/e.ha)),e.Ra!=g&&(Be(e,e.ma),e.sa=0,e.ya=0,e.ia=[],e.qa=[]),tb(e.ma/e.ha,e,k,k),Dd()):(d==g||0==e.ma)&&pb(a,j,b)))}function qb(a,b){qc[a]=j;var c=S(a);c!=j&&c.fa==g&&(Qc(c,1),c.ma=b!=j?b:Pa()/1E3-c.da,c.fa=k,n[xa](c.ua))}function Rc(a){if(!tb(ca(a),a,g,g))if(Sc(a), +Tc!=j&&Fd==a.aa)a=Tc,Fd=Tc=j,a();else if(a={type:wf,timelineName:a.Ha.n},Gd(a,j)!==k){var b=ya();if(b!=j){var c=v[Hd(Id())].F;c!=j&&Y(b,c.a)(a)}}}function V(a,b){return Ce(a,b.Ha.f)}function Ce(a,b){var c=z.floor(a);return c+z[Ca]((a-c)*b)/b}function ca(a){return V(a.Ha.d,a)}function Dd(){if(Ed!==g){Ed=g;var a=function(a){n[kb](a,1E3/60)};(y.va!=j?a:n.requestAnimationFrame||n.webkitRequestAnimationFrame||n.mozRequestAnimationFrame||a)(function(){Ed=k;lg()})}}function Sc(a){n[xa](a.ua);a.sa=0;a.ya= +0;a.ia=[];a.qa=[];a.Fb=j;a.da=j;a.fa=k;a.ha=1;a.ma=ca(a);a=sb(Fa,a);-1!=a&&Fa[Sb](a,1)}function og(a){for(var b=0;b=b&&(Ia[f]===aa||Ia[f][h]===aa||Ia[f][h]==a.aa))Oa[f][h]=a.aa}og(a)}function pb(a,b,c){qc[a]=j;for(var d=0;dc;c++)b[c]=16*d[Ma](a[Ka](2*c))+d[Ma](a[Ka](2*c+1))}return b}function gg(a){typeof a!=jj&&(a=ha(a));return isNaN(a)?0:a}function rg(a,b,c){Kd=k;c!=j&&delete v[D].T[c];qa(b[L],Ih);Q(b,Ah,0,ah,0);Xa(b,lf,od);Q(b,mh,0,X,0,ck,1,ni,1);c=v[D].a;c!=j?(ia(b[L],td),ia(F[L],c+hc)):(ia(b[L],x(v[D].Y)),ia(F[L],b[L][Ba]));c=v[D].b; +c!=j?(ta(b[L],td),ta(F[L],c+hc)):(ta(b[L],x(v[D].Z)),ta(F[L],b[L][Rb]));Ib[F.id]=j;Ib[b.id]=j;J[O[a.id]]&&(a!=j&&a!=b)&&(qa(a[L],ij),a[B](hh,g),Q(a,Ah,0,ah,0,mh,0,X,0,ck,0,ni,1),Xa(a,lf,od));F[L][hd]=j;F[L][da.la+Tj]=yi;F[L][cd]=j;F[L].perspective=j;c=[];a=v[D].v;for(var d in a)if(a[K](d)!=k){var e=a[d],f=e.cL;if(f){c[A](f);var h=R[f][Gb];J[O[h.id]]=j;var l=p[Ta](e.k);oa(l,e.cP?$e+e.cP:Ze);l.id=h.id;l[L].pointerEvents=lh;for(l[L][nj]=lh;0s;s++)for(var q=0;qz.abs(c.x-Vc[b].x)&& +25>z.abs(c.y-Vc[b].y)&&(a.stopPropagation(),a[La]())}}function ug(a){var b=[],c=v[D].U,d;for(d in c)c[K](d)!=k&&c[d].n==a&&b[A](ub[d]);return b}function Wf(a){var b={type:xf,customBehaviorName:a},c=Qd[a];if(c!=j)for(var d=0;d=d;d++)c[A]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Ca=c;a.Fa=aa;a.Xa=k;var c=a.ga?b[xb][0]:b,e;e=function(b){He(a);a.xa=bi;Td(b,a)};a.ja=e;b=a.ga?a.jb:p;a.ga?za(Oj,a.ja,b,k):n.self!=n.top&&(d=function(a){(a.relatedTarget===p.documentElement||a.toElement=== +j)&&e(a)},a.ja=d,za(bj,d,b,k));c=Od(c);d=a.Ca[0];d[Cb].x=c.x;d.end.x=c.x;d[wa].x=c.x;d[Cb].y=c.y;d.end.y=c.y;d[wa].y=c.y;yg(a,c);a.cb=function(b){if(!(a.xa===ri||a.xa===bi))if(Sd==g)a.ja(b);else{if(a.Qa==k&&(Rd++,a.Qa=g,a[N].ca==li)){Ud=g;if(a[N].pa!=j)for(var c=0;cc,(q||w==k||Ud==g)&&a.ja(b)):a[N].ca==Lj&&5=w?Si:xj:0>=w&&-180<=w?Vj:ki)!=I,G=u/P;else{I=t=sc(d.aa,k);for(u=P=0;ua[N].Oa?(b={type:sf+a[N][va][Ka](0).toUpperCase()+a[N][va][Da](1)+ie},a.eb(b)):a.ja(b)):a[N].ca==Lj?1500>d&&a.eb(b):a.ja(b);He(a)}};za(a.ga?Pj:dj,a.bb,b,k);b.setCapture&&b.setCapture();a.Pa=Pa();a.Za=a.Pa;Ud=Sd=a.Qa=k}}}function He(a){if(a.Xa!=g){a.Xa=g;Ia={};var b=a.ga?a.jb:p;b.releaseCapture&&b.releaseCapture();Xc(a.ga? +Qj:aj,a.cb,b);Xc(a.ga?Pj:dj,a.bb,b);a.ga?Xc(Oj,a.ja,b):Xc(bj,a.ja,b);a[N].ca==li&&(Ud=k);a.Qa==g&&Rd--}}function Td(a,b){b[N].wb==g&&(a.hypeGesturePhase=b.xa,a.hypeGestureXPosition=b.Ca[0].end.x,a.hypeGestureYPosition=b.Ca[0].end.y,b.eb(a))}function Xc(a,b,c){c[lb]?c[lb](a,b,k):c[Eb]&&c[Eb](kj+a,b)}function za(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Vd[A](e);c[Ua]?c[Ua](a,b,k):c[bb]&&c[bb](kj+a,b)}function Od(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hb]||a[ib])b.x= +a[hb]+p[zb].scrollLeft+p.documentElement.scrollLeft,b.y=a[ib]+p[zb].scrollTop+p.documentElement.scrollTop;return b}function Ag(a){var b;0==a.c?0==a.A?b=xj:1==a.A&&(b=Si):1==a.c&&(0==a.A?b=Vj:1==a.A&&(b=ki));return b}function yg(a,b){var c=a[N][va]==xj||a[N][va]==Si?b.x:b.y;a.Fa=a.Fa==aa?c:a[N][va]==xj||a[N][va]==ki?z.max(a.Fa,c):z.min(a.Fa,c)}function zg(a,b,c){a=z[Ca](180*z.atan2(b.y-a.y,b.x-a.x)/z.PI);c=z.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Si;if(a<=45-c&&a>=-45+c)return xj;if(a<-45- +c&&a>-135+c)return Vj;if(a>45+c&&a<135-c)return ki}function oe(a){for(var b=tc[a],c={},d=0;d=Mb[C]&&Cg()}function lk(a){var b=U[a].p;if(1==b)if(b=U[a].g,b!=j&&Bg(b)!=a)Ke(a);else{var c=new Image,b=function(b){c=this;if((y.Wa!=j||y.pb!=j&&y.va==j)&&b[ab]==Ui&&-1!=jc[Ma](mi)&&-1==c.src[Ma](md))try{var d=p[Ta](di);ia(d,c[Ba]);ta(d,c[Rb]);d.getContext(ud).drawImage(c, +0,0);Dg[c.Eb]=d.toDataURL()}catch(h){}Ke(a)},d=Wd(a);c.onload=b;c.onerror=b;c.onabort=b;c.src=d;c.Eb=a}else 2==b&&(b=function(){for(var b=tc[U[a].g],c=0;cha(y.na)||9>y.oa?n[kb](b,1):d.load(b,b))}function Cg(){wd!=j&&wd(k,F);if(Gd({type:pf},F)!==k)if(-1==ne)Hb(Nb);else{Yc=g;for(var a=-1,b=0;bc&&(c=f),ia(F[L],x(c)),Ib[F.id]=j,F[L].margin==lh&&(la&&(a=h),ta(F[L],x(a)))}function vc(a){var b=F[Qb].offsetHeight,c=v[a].b;return c!=j?c/100*b:v[a].Z}function uc(a){var b=F[Qb][Ja],c=v[a].a;return c!=j?c/100*b:v[a].Y}function Le(a,b,c,d){if(!(Eg(a)==j||Kd== +g)){c==j&&(c=1.1);c=Ce(c,60);Kd=g;var e=function(){d!=j&&d();Qa=[];Qd={};var e=ya();nc=v[a].a!=j||v[a].b!=j?g:k;var f=Eg(a),h=D,l=ya();if(l!=j){for(var m=l[gb](Zj),r=0;r$&&($=r[L][fb]))}else t[A]({container:r,domElement:S,sceneElement:w}); +R[l].mb==k&&(tg(r,g),R[l].mb=g)}for(r=0;rh?H:h,J[G].a=0,J[G].b=0)):(Zc(e,T,g,k),H!=h&&(U[A](db(hi,0,fa,Qh,G,H,h)),J[G]={},J[G].c=ma>Z?ma:Z,J[G].d=H,J[G].a=0,J[G].b=0)),q=X,f=Z,s=-1*Z,5==b?(f=-1*ma,s=ma):6==b?(q=mh,f=-1*H,s=H):7==b&&(q=mh,f=h,s=-1*h),e!=j&&(t=O[e.id],Q(e,Qh,ma,hi,H),U[A](db(q,0,fa,Qh,t,0,f))),U[A](db(q,0,fa,Qh,O[T.id],s,0)),Q(T,Qh,Z,hi,h,q,s),Me(jf,fa,U,e,T),qa(T[L],Ih)):(Zc(e,T,k,k),rg(e,T,j));Ob()},f=k,h= +ya();h[B](hh,g);if(Fg==g&&h!=j){var h=Hd(Id()),l={type:rf};if(Gd(l,j)!==k){var m=v[h].B;if(m!=j){for(var s=m.a,q=Y(ya(),s),m=0;ml;l++){var m=jg(e,l/99),s={};s.location=m;b&&(h=Ie(m,h),f+=h,na(s,h)); +e.ba[A](s);h=m}c+=f;na(e,f)}return c}function jg(a,b){var c=xc(a.ta,a.Ga,b),d=xc(a.Ga,a.Ba,b),e=xc(a.Ba,a.Ja,b),f=xc(c,d,b),d=xc(d,e,b),f=xc(f,d,b),h=k,l=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?l=e:(l=c,h=g));f.za=ig(f,l);h==g&&(f.za+=180);return f}function ig(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*z.atan((b.y-a.y)/(b.x-a.x))/z.PI;b.xc)break;b=e}}return b}function bg(a){var b=Kb[Id()];a!=j&&(b=Kb[a]);a=Ib[b];a==j&&(a=p[Ha](b),a={width:a[Ja],height:a.offsetHeight},Ib[b]=a);return a}function ag(a){var b=0,c=0;a==j?(b=v[D].Y,c=v[D].Z):(b=Oc(a),c=Pc(a));return{width:b,height:c}}function se(a){return(y.na!=j||3.5<=y.Ka||10<=y.oa)&&u(a,lf)==rd}function kg(){Cd=k;we=g;for(var a in Nc)Nc[K](a)&&pc(Nc[a]);we=k;xe();Nc={}}function xe(){n[kb](function(){Jc!= +j&&(Oe?Pe=g:(Oe=g,Jc.refreshAll(),Oe=k,Pe&&(Pe=k,xe())))},0)}function Qe(a,b,c){var d=b;if(d==j||p[Ha](d)!=j){do d=c+Lg();while(p[Ha](d)!=j)}Kb[a]=d;O[d]=a;return Re[b!=j?b:d]=d}function sa(a){return p[Ha](Kb[a])}function Pa(){return Date.now()}function Lg(){for(var a=W,b=da.Ya+We,c=0;20>c;c++)var d=z.floor(z.random()*b[C]),a=a+b.substring(d,d+1);return a}function kk(a){var b=this;Je[a]=b;b.qb=function(){var a=p[Ta](jh);b.Aa=a;for(var d=b.rb(),e=0;ey.oa){var c=function(b){b=b?b:n[Tb];if(a[L][nj]==ij){var c=a[L].display;qa(a[L], +ij);var f=p.elementFromPoint(b[hb],b[ib]);qa(a[L],c?c:W);p.createEvent&&(b[La](),c=p.createEvent(Af),c.initMouseEvent(b[ab],b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hb],b[ib],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,j),f.dispatchEvent(c))}};za(zf,c,a,g);za(dj,c,a,g);za($i,c,a,g);za(ei,c,a,g)}}},Je={},yc=j;da.API={kSceneTransitionInstant:1,kSceneTransitionCrossfade:2,kSceneTransitionSwap:3,kSceneTransitionPushLeftToRight:4,kSceneTransitionPushRightToLeft:5,kSceneTransitionPushBottomToTop:6, +kSceneTransitionPushTopToBottom:7,kHypeGesturePhaseStart:Ej,kHypeGesturePhaseMove:ej,kHypeGesturePhaseEnd:ri,kHypeGesturePhaseCancel:bi,documentName:function(){return $},documentId:function(){return G},sceneNames:Hg,currentSceneName:function(){return Wa[Nb].n},showSceneNamed:function(a,b,c){a=sb(Hg(),a);Hb(a,b,c)},showNextScene:Tf,showPreviousScene:Uf,playTimelineNamed:qg,startTimelineNamed:qg,goToTimeInTimelineNamed:function(a,b){var c=vb(b);c==j&&(c=Ni);kc(a,c,k)},pauseTimelineNamed:function(a){a= +vb(a);a==j&&(a=Ni);qb(a,j)},continueTimelineNamed:function(a,b,c){a=vb(a);a==j&&(a=Ni);b==aa&&(b=0);Kc(a,1==b?g:k,g,c)},getElementById:function(a){var b=Re[a];b==j&&(b=a);return p[Ha](b)},setElementProperty:function(a,b,c,d,e){var f={easein:hi,easeout:ni,easeinout:Qh,linear:mh};b=Mg[b];if(b!=j){var h=b.HYP_r,l=O[a.id];b=W+l+h;0 + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/PIE.htc b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/PIE.htc new file mode 100644 index 0000000000..ca3b54700c --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/PIE.htc @@ -0,0 +1,96 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/Stoutpine.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/Stoutpine.svg new file mode 100644 index 0000000000..fdd47f7128 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/Stoutpine.svg @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airbag.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airbag.svg new file mode 100644 index 0000000000..d477cf3a8f --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airbag.svg @@ -0,0 +1,28 @@ + + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airstrip_hype_generated_script.js b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airstrip_hype_generated_script.js new file mode 100644 index 0000000000..f1cef6ade4 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/airstrip_hype_generated_script.js @@ -0,0 +1,7 @@ +// HYPE.documents["Airstrip"] + +(function(){(function k(){function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=[],window[b].push(k),a=document.getElementsByTagName("head")[0],b=document.createElement("script"),c=h,false==!0&&(c=""),b.type="text/javascript",b.src=c+"/"+d,a.appendChild(b)):window[b].push(k),c=!0);return c}var h="Airstrip.hyperesources",c="Airstrip",e="airstrip_hype_container";if(false==!1)try{for(var f=document.getElementsByTagName("script"), +a=0;aa||false==!0)?"HYPE-526.full.min.js":"HYPE-526.thin.min.js"),false==!0&&(a=a||l("HYPE_w_526","HYPE_wdtl_526","HYPE-526.waypoints.min.js")),a))return; +f=window.HYPE.documents;if(null!=f[c]){b=1;a=c;do c=""+a+"-"+b++;while(null!=f[c]);for(var d=document.getElementsByTagName("div"),b=!1,a=0;a + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/endstripes.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/endstripes.svg new file mode 100644 index 0000000000..767c05239a --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/endstripes.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grass.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grass.svg new file mode 100644 index 0000000000..4746dd84f7 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grass.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grassbits.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grassbits.svg new file mode 100644 index 0000000000..4999362665 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/grassbits.svg @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/plane2.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/plane2.svg new file mode 100644 index 0000000000..fa56e886af --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/plane2.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/planeshadow.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/planeshadow.svg new file mode 100644 index 0000000000..ea82fe3259 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/planeshadow.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole1.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole1.svg new file mode 100644 index 0000000000..04f0807387 --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole1.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole2.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole2.svg new file mode 100644 index 0000000000..eace9325fa --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/pole2.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/runway.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/runway.svg new file mode 100644 index 0000000000..8605d32bdb --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/runway.svg @@ -0,0 +1,13 @@ + + + + + + diff --git a/static/animations/inbox-zero/airstrip/airstrip.hyperesources/stripe.svg b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/stripe.svg new file mode 100644 index 0000000000..620fcd0b9c --- /dev/null +++ b/static/animations/inbox-zero/airstrip/airstrip.hyperesources/stripe.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/galaxy/galaxy.html b/static/animations/inbox-zero/galaxy/galaxy.html new file mode 100644 index 0000000000..da80e43fc5 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.html @@ -0,0 +1,44 @@ + + + + + + Galaxy + + + + + + + + + + +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/BC8A15-restorable.plist b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/BC8A15-restorable.plist new file mode 100644 index 0000000000..746ee0a330 Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/BC8A15-restorable.plist differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Checkmark body-1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Checkmark body-1.svg new file mode 100644 index 0000000000..6b2a43dc15 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Checkmark body-1.svg @@ -0,0 +1,10 @@ + + + + Checkmark body + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Combined Shape-1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Combined Shape-1.svg new file mode 100644 index 0000000000..c48b3f447e --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Combined Shape-1.svg @@ -0,0 +1,10 @@ + + + + Combined Shape + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/HYPE-526.full.min.js b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/HYPE-526.full.min.js new file mode 100644 index 0000000000..5e4ba04454 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/HYPE-526.full.min.js @@ -0,0 +1,183 @@ +(function(){var ca=void 0,h=!0,j=null,m=!1,ga=encodeURIComponent,p=window,ha=Object,ja=Infinity,s=document,u=Math,ka=Number,na=navigator,oa=parseInt,pa=parseFloat;function ra(L,C){return L.width=C}function sa(L,C){return L.innerHTML=C}function ua(L,C){return L.speed=C}function va(L,C){return L.left=C}function wa(L,C){return L.loop=C}function ya(L,C){return L.play=C}function za(L,C){return L.zIndex=C}function Aa(L,C){return L.length=C}function Ba(L,C){return L.position=C} +function Da(L,C){return L.className=C}function Ea(L,C){return L.pause=C}function Fa(L,C){return L.MozPerspective=C}function Ga(L,C){return L.backgroundImage=C}function Ia(L,C){return L.display=C}function Ma(L,C){return L.height=C} +var Na="appendChild",D="push",Oa="direction",Pa="lastPosition",Qa="clearTimeout",Ra="width",Sa="round",Xa="slice",Ya="replace",Za="toFixed",$a="timestamp",ab="ceil",bb="floor",cb="getElementById",ib="offsetWidth",jb="concat",kb="list",pb="extend",qb="charAt",rb="preventDefault",sb="region",tb="button",ub="indexOf",vb="speed",wb="embeds",Bb="MAX_VALUE",Cb="opera",Db="createElement",Eb="atan2",Fb="identifier",Gb="sqrt",Hb="addEventListener",Ib="setAttribute",Jb="play",Kb="parentElement",Ob="type",Pb= +"translate",Qb="clear",Rb="childNodes",Sb="Play",Tb="attachEvent",bc="source",cc="changedTouches",dc="zIndex",ec="keys",fc="getElementsByTagName",gc="MIN_VALUE",hc="clientX",ic="clientY",jc="toString",H="length",I="position",kc="create",sc="className",tc="index",uc="clientWidth",vc="setTimeout",wc="removeEventListener",xc="split",yc="duration",zc="userAgent",Ac="location",Bc="rotate",K="hasOwnProperty",Cc="touches",O="style",Dc="pause",Ec="body",Fc="ownerDocument",Gc="removeChild",Hc="search",Tc= +"group",U="options",Uc="start",Vc="getAttribute",Wc="detachEvent",Xc="clientHeight",Yc="console",Zc="contains",$c="element",ad="startTime",bd="parentNode",cd="update",dd="height",ed="splice",fd="event",Z="",gd="\n",hd=" ",id=" -webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(",jd=" : ",kd=" rotate(",ld=" rotateX(",md=" rotateY(",nd=" rotateY(0) ",od=" scaleX(",pd=" scaleY(",qd=" translateX(",rd=" translateY(",Hd=" translateZ(",Id="#",Jd="#4ECDC4",Kd="#556270",Ld="#666",Md= +"#C44D58",Nd="#C7F464",Od="#FF6B6B",Pd="#eeeeee",Qd="%",Rd="%25",Sd="%27",Td="%c [Matter] ",Ud="&",Vd=" ",Wd="')",Xd="'>",Yd="'autoplay='false'class='video'>",Zd="'classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'codebase='http://apple.com/qtactivex/qtplugin.cab'width='",$d="'controller='",ae="'enablejavascript='true'postdomevents='true'scale='tofit'name='embedobj_",xe="'height='",ye="'id='embedobj_",ze="'loop='",Ae="'volume='",Be="(",Ce=")",De=") ",Ee="*",Fe=",",Ge=",M12=", +He=",M21=",Ie=",M22=",Je=",SizingMethod='auto expand')",Ke=",transparent),to(rgba(255,255,255,.5)))",Le="-10000",Me="-bottom",Ne="-moz-",Oe="-moz-perspective",Pe="-ms-transform",Qe="-ms-transform-origin",Re="-o-",Se="-pie-background",Te="-webkit-",Ue="-webkit-perspective",Ve="-webkit-tap-highlight-color",We="-webkit-transform",Xe=".",Ye=".AlphaImageLoader(sizingMethod='scale',src='",Ze=".HYPE_element{-webkit-transform:rotateY(0);}video.HYPE_element{-webkit-transform:none;}^{color:#000;`size:16px;`weight:normal;`family:Helvetica,Arial,Sans-Serif;`weight:normal;`style:normal;`variant:normal;text-decoration:none;text-align:left;text-transform:none;text-indent:0;text-shadow:none;line-height:normal;letter-spacing:normal;white-space:normal;word-spacing:normal;@:baseline;border:none;background-color:transparent;background-image:none;-webkit-`smoothing:antialiased;-moz-backface-visibility:hidden;}", +$e=".HYPE_scene ",af=".Matrix(M11=",bf=".gif",cf=".gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)",df=".png",ef="/",Xf="/PIE.htc')",Yf="/blank.gif",Zf="0",$f="0.0",ag="0123456789ABCDEF",bg="0px",cg="1",dg="1.0",eg="100",fg="100%",gg="2d",hg="50%",ig="600px",jg=": ",kg="
",lg="",mg="
",ng="', +qg="=",rg="?",sg="@1x",tg="@2x",ug="APPLY ERR ",vg="Action",wg="Alpha(Opacity=",xg="Android",yg="BD",th="BODY",uh="BackCompat",vh="Body",wh="Composite",xh="Constraint",yh="Error in ",zh="False",Ah="GET",Bh="GHIJKLMNOPQRSTUVWXYZ",Ch="HYPE_element",Dh="HYPE_element ",Eh="HYPE_element HYPE_scene",Fh="HYPE_element HYPE_scene ",Gh="HYPE_element Hype_scene ",Hh="HYPE_element_container",Ih="HYPE_persistent_symbols",Jh="HYPE_scene",Kh="HYPE_scene_index",Lh="HYP_a",Mh="HYP_b",Nh="HYP_c",Oh="HYP_d",Ph="HYP_e", +Qh="HYP_f",Rh="HYP_g",Sh="HYP_h",Th="HYP_i",Uh="HYP_j",Vh="HYP_k",Wh="HYP_l",Xh="HYP_m",Yh="HYP_n",Zh="HYP_o",$h="HYP_p",ai="HYP_q",bi="HYP_t",ci="HYP_u",di="HypeDocumentLoad",ei="HypeSceneLoad",fi="HypeSceneUnload",gi="HypeSwipe",hi="HypeSymbolLoad",ii="HypeSymbolUnload",ji="HypeTimelineAction",ki="HypeTimelineComplete",li="HypeTriggerCustomBehavior",mi="L ",ni="L 0 0 L 40 0 L 40 40 L 0 40",oi="M",pi="MSPointerUp",qi="MouseEvents",ri="MozBoxShadow",si="N",ti="O",ui="P",vi="Q",wi="R",xi="S",yi="T", +zi="True",Ai="U",Bi="V",Ci="W",Di="World",Ei="YES",Kj="^div,^span,^applet,^object,^iframe,^h1,^h2,^h3,^h4,^h5,^h6,^p,^blockquote,^pre,^a,^abbr,^acronym,^address,^big,^cite,^code,^del,^dfn,^em,^img,^ins,^kbd,^q,^s,^samp,^small,^strike,^strong,^sub,^sup,^tt,^var,^b,^u,^i,^center,^dl,^dt,^dd,^ol,^ul,^li,^fieldset,^form,^label,^legend,^table,^caption,^tbody,^tfoot,^thead,^tr,^th,^td,^article,^aside,^canvas,^details,^embed,^figure,^figcaption,^footer,^header,^hgroup,^menu,^nav,^output,^ruby,^section,^summary,^time,^mark,^audio,^video{color:?;`size:?;`weight:?;`family:?;`weight:?;`style:?;`variant:?;text-decoration:?;text-align:?;text-transform:?;text-indent:?;text-shadow:?;line-height:?;letter-spacing:?;white-space:?;word-spacing:?;@:?;border:none;background-color:transparent;background-image:none;padding:0;box-sizing:content-box;}^p{display:block;$:1em 0;}^div,^layer{display:block;}^article,^aside,^footer,^header,^hgroup,^nav,^section{display:block;}^blockquote{display:block;$:1em 40px;}^figcaption{display:block;}^figure{display:block;$:1em 40px;}^q{display:inline;}^q:before{content:open-quote;}^q:after{content:close-quote;}^center{display:block;text-align:center;}^hr{display:block;$:.5em auto;border-style:inset;border-width:1px;}^h1,^h2,^h3,^h4,^h5,^h6{display:block;$-left:0;$-right:0;`weight:bold;}^h1{`size:2em;$-top:.67em;$|:.67em;}^h2{`size:1.5em;$-top:.83em;$|:.83em;}^h3{`size:1.17em;$-top:1em;$|:1em;}^h4{$-top:1.33em;$|:1.33em;}^h5{`size:.83em;$-top:1.67em;$|:1.67em;}^h6{`size:.67em;$-top:2.33em;$|:2.33em;}^table{display:table;border-collapse:separate;border-spacing:2px;border-color:gray;}^thead{display:table-header-group;@:middle;border-color:?;}^tbody{display:table-row-group;@:middle;border-color:?;}^tfoot{display:table-footer-group;@:middle;border-color:?;}^col{display:table-column;}^colgroup{display:table-column-group;}^tr{display:table-row;@:?;border-color:?;}^td,^th{display:table-cell;@:?;}^th{`weight:bold;}^caption{display:table-caption;text-align:center;}^ul,^menu,^dir{display:block;list-style-type:disc;$:1em 0;padding-left:40px;}^ol{display:block;list-style-type:decimal;$:1em 0;padding-left:40px;}^li{display:list-item;$:0;}^ul ul,^ol ul{list-style-type:circle;}^ol ol ul,^ol ul ul,^ul ol ul,^ul ul ul{list-style-type:square;}^dd{display:block;$-left:40px;}^dl{display:block;$:1em 0;}^dt{display:block;}^ol ul,^ul ol,^ul ul,^ol ol{$-top:0;$|:0;}^u,^ins{text-decoration:underline;}^strong,^b{`weight:bolder;}^i,^cite,^em,^var,^address{`style:italic;}^tt,^code,^kbd,^samp{`family:monospace;}^pre,^xmp,^plaintext,^listing{display:block;`family:monospace;white-space:pre;$:1em 0;}^mark{background-color:yellow;color:black;}^big{`size:larger;}^small{`size:smaller;}^s,^strike,^del{text-decoration:line-through;}^sub{@:sub;`size:smaller;}^sup{@:super;`size:smaller;}^nobr{white-space:nowrap;}^a{color:blue;text-decoration:underline;cursor:pointer;}^a:active{color:red;}^noframes{display:none;}^frameset,^frame{display:block;}^frameset{border-color:?;}^iframe{border:0;}^details{display:block;}^summary{display:block;}", +Lj="_",Mj="_blank",Nj="a",Oj="aA",Pj="aB",Qj="aC",Rj="aD",Sj="aE",Tj="aI",Uj="aJ",Vj="aK",Wj="aL",Xj="aM",Yj="aN",Zj="aS",$j="aT",ak="aU",bk="aV",ck="aW",dk="aX",ek="aY",fk="aZ",gk="abort",hk="absolute",ik="acC",jk="afterAdd",kk="afterRemove",lk="afterRender",mk="afterUpdate",nk="alt",ok="aria-busy",pk="aria-flowto",qk="aria-hidden",rk="arraybuffer",sk="audio",tk="audio/ogg",uk="auto",vk="autoplay",wk="autostart",xk="b",yk="bA",zk="bB",Ak="bC",Bk="bF",Ck="bG",Dk="bH",Ek="bI",Fk="bJ",Gk="bK",Hk="bL", +Ik="bM",Jk="bN",Kk="bO",Lk="bP",Mk="bQ",Nk="bR",Ok="bS",Pk="bT",Qk="bU",Rk="bV",Sk="bW",Tk="backdrop-filter",Uk="background-origin",Vk="background-size",Wk="bcC",Xk="beforeAdd",Yk="beforeRemove",Zk="beforeRender",$k="beforeUpdate",al="below ",bl="block",cl="blur(",dl="body",el="body=",fl="boolean",gl="border-radius",hl="box-reflect",il="box-shadow",jl="boxShadow",kl="brightness(",ll="button",ml="c",nl="cB",ol="cC",pl="cD",ql="cF",rl="cG",sl="cH",tl="cI",ul="cJ",vl="cK",wl="cL",xl="cQ",yl="cR",zl= +"cT",Al="cW",Bl="cX",Cl="cY",Dl="cancel",El="canplaythrough",Fl="canvas",Gl="click",Hl="collisionActive",Il="collisionEnd",Jl="collisionStart",Kl="color: coral",Ll="color: red",Ml="composite",Nl="constraint",Ol="contrast(",Pl="controller",Ql="controls",Rl="d",Sl="deg",Tl="deviceorientation",Ul="div",Vl="down",Wl="drag",Xl="dropbox.com",Yl="e",Zl="element",$l="embed",am="embedobj_",bm="end",cm="enter",dm="error",em="exit",fm="f",gm="false",hm="fcC",im="file://",jm="filter",km="flat",lm="font-",mm= +"function",nm="head",om="height",pm="hidden",qm="href",rm="http://",sm="hue-rotate(",tm="hype-obj-",um="hype-scene-",vm="iPad",wm="iPhone",xm="iPod",ym="ibooksimg://",zm="img",Am="img_",Bm="inherit",Cm="j",Dm="kTimelineDefaultIdentifier",Em="kTimelinePhysicsIdentifier: ",Fm="keydown",Gm="keypress",Hm="keyup",Im="l",Jm="left",Km="linear-gradient(",Lm="load",Mm="loop",Nm="m",Om="mailto:",Pm="margin",Qm="mouseConstraint",Rm="mouseclick",Sm="mousedown",Tm="mousemove",Um="mouseout",Vm="mouseover",Wm="mouseup", +Xm="move",Ym="mozHidden",Zm="mozvisibilitychange",$m="msHidden",an="msvisibilitychange",bn="mute",cn="n",dn="no",en="no-repeat",fn="none",gn="number",hn="object",jn="on",kn="onresize",ln="pageshow",mn="pointer-events",nn="pointerup",on="preserve-3d",pn="progid:DXImageTransform.Microsoft",qn="px",rn="px) ",sn="r",tn="resize",un="rgb",vn="rgba",wn="rgba(",xn="rgba(0,0,0,0)",yn="right",zn="role",An="saturate(",Bn="script",Cn="sepia(",Dn="source",En="src",Fn="start",Gn="string",Hn="subject=",In="swipe", +Jn="tX",Kn="tY",Ln="tabindex",Mn="tap",Nn="target",On="title",Pn="touchcancel",Qn="touchend",Rn="touchmove",Sn="touchstart",Tn="transform-origin",Un="transform-style",Vn="true",Wn="type",Xn="up",Yn="url('",Zn="user-select",$n="vertical-align",ao="video",bo="video/ogg",co="video/quicktime",eo="video/webm",fo="visibilitychange",go="warn",ho="webkitHidden",io="webkitvisibilitychange",jo="width",ko="www.",lo="x-ibooks-th://",mo="z";function no(){return function(){}} +p.HYPE_526=function(L,C,La,Ub,Fi,Gi,Lb,x,lc,qo,ff,gf,qa,Hi,zg,hf,ro,so,be){function Ii(a,b,c){var d=ka[Bb],e={x:0,y:0};b=b.aa;a=a[I];for(var f,g,k=b[0],n=b[1],n=0;ne?e=g:g=g){f.nb=g;break}g=a&&(a=1E-6);1==c&&(d=0,e=1,a=ja);b.Xa=d;b.La=e;b.sc=f;V.$a.Xd(b, +a)}}function Ic(a){var b,c,d=sd(a);if(!(qa!=h||a==j||kf==h||d==j||d.Vc==h)){var e=d.ub.ma,f=R[a.id],g=d.yc[f],k=t(a,Ik,0);if(!(0==k&&g==j)){Li(a)==h&&(k=1);var n=t(a,Qk,0.5),q=t(a,Rk,0.1),w=t(a,zl,0.01),l=t(a,Sk,0.0010);0>=l&&(l=1E-6);1==k&&(n=0,q=1,l=ja);var v=t(a,ik,0),Q=t(a,Wk,0),M=t(a,hm,0);b=[1,0,0,1,0,0];c=Bg(a);c[D](a);for(var J=0;JF;F+=G){var P=r*V.Ja.cos(F*u.PI/180)+(d-r),E=y*V.Ja.sin(F*u.PI/180)+y;lb(ba,P*f,E*aa)}lb(ba,d*f,y*aa); +lb(ba,d*f,(e-B)*aa);if(0F;F+=G)P=C*V.Ja.cos(F*u.PI/180)+(d-C),E=B*V.Ja.sin(F*u.PI/180)+(e-B),lb(ba,P*f,E*aa)}lb(ba,(d-C)*f,e*aa);lb(ba,$*f,e*aa);if(0<$||0F;F+=G)P=$*V.Ja.cos(F*u.PI/180)+$,E=x*V.Ja.sin(F*u.PI/180)+(e-x),lb(ba,P*f,E*aa)}lb(ba,0,(e-x)*aa);lb(ba,0,z*aa);if(0F;F+=G)P=A*V.Ja.cos(F*u.PI/180)+A,E=z*V.Ja.sin(F*u.PI/180)+z,lb(ba,P*f,E*aa)}d=Z;for(e=0;e=aa?J:aa),F=b*N,N*=g,b=Q-F,g=v-N,n==h&&l==m?k-=b:n==h&&l==h&&(k-=b/2),q==h&&w==m?c-=g:q==h&& +w==h&&(c-=g/2));b=k}t(f,$h,m)==m&&(Y(f,Jn,0.5),Y(f,Kn,0.5),ia(f,$h,h));Y(f,Nj,b);Y(f,xk,c);Y(f,fm,d[Za](6))}}function Oi(a,b){of=a.Vc=h;var c=u[ab](1E3/60),d=u[bb](1E3*b),e=d-a.Md;a.Md=d;a.hc+=u[bb](e);for(d=0;a.hc>=c&&20>d;)V.Fc[cd](a.ub,c),a.hc-=c,d+=1;V.Fc.ya(a.ub);Hg();a.Vc=m}function pf(a){a=V.zb.Ga(a.ub.ma);for(var b=0;bd?u.PI:0))*(180/u.PI);a.Fd=u[Gb](c*c+d*d);d=a[Fb];qf(d)==h&&(c=rf(d)*a.Fd,d=sf(d)+a.Ed,a.ub.ma.Ub.x=c*V.Ja.cos(d*u.PI/180),a.ub.ma.Ub.y=c*V.Ja.sin(d*u.PI/180));pf(a);Kc()}}function tf(a){for(var b=a;b!=j;){a=t(b,Bk);a==j&&(b=x[G].v[R[b.id]],b!=j&&(a=b.bF));a=Ja(a);if(a==j)break;b=a;if(Eg(b)==h)return b}return j}function Eg(a){return x[G].U[R[a.id]]!=j||t(a,wl)!=j?h:m}function sd(a){a=tf(a);return Ig(a!=j?a.id:j)}function Ig(a){a==j&&(a=C);for(var b=0;bz.ca?e||4==c[tb]:e||1==c[tb]||c.metaKey==h)?9>z.ca||z.Rd||z.Cb!=j?p.open(f,Mj):(9==z.ca||15>z[Cb])&&!(c instanceof MouseEvent)?p.open(f,Mj):(e=s[Db](Nj),e[Ib](qm,f),e[Ib](Nn,Mj),s[Ec][Na](e),f=s.createEvent(qi),f.initMouseEvent(Gl,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hc],c[ic],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c[tb],s[Ec][bd]),e.dispatchEvent(f),s[Ec][Gc](e)):p.top.location= +f);else if(6==f){g=e.l;k=e.m;e=e.n;f=Om;g!=j&&(f+=escape(g));if(k!=j||e!=j)f+=rg,g=[],k!=j&&g[D](Hn+ga(k)),e!=j&&g[D](el+ga(e)),f+=g.join(Ud);f!=Om&&(p.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=h&&(e=m),f!=j&&(f=Mg(f),wa(f,e),f[Jb]())):13==f?(f=e.o,f!=j&&Mg(f)[Dc]()):14==f&&(e=e.B,e!=j&&Ui(e))}}}function vf(a,b){return function(c){Ng(c,b,R[a.id])}}function Og(a,b){return function(c){Vi(c,b,R[a.id])}}function wf(a){var b=t(a,Vj,Zf),c=t(a,Wj,Zf),d=t(a,Tj,Zf),e=t(a,Uj,Zf),b=typeof b!=gn?b:F(b),c=typeof c!= +gn?c:F(c),d=typeof d!=gn?d:F(d),e=typeof e!=gn?e:F(e);a[O][gl]=Z+b+hd+c+hd+e+hd+d}function ee(){}function Wi(a){var b=t(a,dk,8),c=t(a,ck,0);z.vd==j&&(1==1-c&&a[O].removeProperty!=j?a[O].removeProperty(ma.Oa+hl):a[O][ma.Oa+hl]=al+F(b)+id+(1-c)+Ke)}function Pg(a){var b=t(a,Bi);if(b!=j){var c=Z;b==cg?c=Ti(t(a,Ci)):b==Zf&&(c=Z+Ub+ef+t(a,Ai));b=og+c+Xd;z.kb!=j&&(b=mg+b+kg);sa(a,b)}}function Xi(a,b){var c=b==h?yg:Z,d=t(a,c+Hk,0),e=t(a,c+Ck,0),f=t(a,c+Dk,0),g=t(a,c+Ek,1),k=t(a,c+Fk,1),c=t(a,c+Gk,1),n=Z; +0!=d&&(n+=cl+d+rn);0!=e&&(n+=Cn+e+De);0!=f&&(n+=sm+(Z+f+Sl)+De);1!=g&&(n+=An+g+De);if(1!=k){if(6==z.Wd||z.kb!=j&&536.26>=pa(z.Ra))k-=1,1z.ca||(0!=k?c+=md+(Z+k+Sl)+De:b==h&&(1==w&&1==l&&v==m)&&(c+=nd),0!=g&&(c+=ld+(Z+g+Sl)+De));1!=w&&(c+=od+w+De);1!=l&&(c+=pd+l+De);b=Z+(Z+100*Q+Qd)+hd+(Z+100*M+Qd);a[O][ma.Oa+Tn]=b;a[O].MozTransformOrigin=b;a[O].OTransformOrigin=b;a[O][Qe]=b;a[O][Tn]=b; +a[O][We]=c;a[O].MozTransform=c;a[O].OTransform=c;a[O][Pe]=c;a[O].transform=c}function xd(a){9>z.ca?fe(a):ge(a);qa==h&&Ic(a)}function Rg(a){function b(a,b){return Z+a+Km+(Z+(b==h?(u.abs(e)+180)%360:(360-u.abs(e)+270)%360)+Sl)+Fe+xb(c)+Fe+xb(d)+Ce}var c=t(a,cn);if(!(c==j||c==Z)){var d=t(a,Nm);if(!(d==j||d==Z)){var e=t(a,Im);e!=j&&(z.Ra!=j?Ga(a[O],b(ma.Oa,m)):z.xe!=j?Ga(a[O],b(Ne,m)):10>z.ca?a[O][Se]=b(Z,m):Ga(a[O],15>z[Cb]?b(Re,m):b(Z,h)))}}}function Yi(a){Ia(a[O],t(a,Cl,m)==h?fn:t(a,sn,Z));Sg(R[a.id])} +function Mb(a){Mc[a.id]=j;Nc(a)}function Nc(a){try{if(of==h)he[a.id]=a;else{var b=t(a,Ok,36),c=Qg(a),d=R[a.id],e=mf(d),f=nf(e),g=Gg(e),k=nf(d),n=t(a,Nj,0),q=t(a,xk,0),w=t(a,ml,j),l=t(a,Rl,j),v=e=h;w==j&&(e=m,w=k[Ra]);l==j&&(v=m,l=k[dd]);var Q=Vb(d),M=Wb(d),J=M-l,d=n,k=q,N=Q,A=M,r=m;if(Jc==h&&36!=b){var da=0!=(b&1),$=0!=(b&4),x=0!=(b&2),C=0!=(b&8),y=0!=(b&32),B=0!=(b&16),G=0!=(b&64)&&x==h&&B==h,E=0!=(b&128)&&x==h&&B==h,r=0!=(b&256)&&(x==h||B==h),ba=g[Ra]/f[Ra],T=g[dd]/f[dd];x==h&&(N=da==h&&$==h?Q+ +(g[Ra]-f[Ra]):u[ab](Q*ba));da==h&&$==h&&x==m?(b=n+Q/2,d=u[ab](b*ba-Q/2)):da==h&&$==m&&x==h?d=g[Ra]-f[Ra]+n-(N-Q):da==h&&$==m?d=g[Ra]-f[Ra]+n:da==m&&$==m&&(d=u[ab](n*ba));B==h&&(A=C==h&&y==h?M+(g[dd]-f[dd]):u[ab](M*T));C==h&&y==h&&B==m?k=u[ab]((q+M/2)*T-M/2):C==h&&y==m&&B==h?k=g[dd]-f[dd]+q-(A-M):C==h&&y==m?k=g[dd]-f[dd]+q:C==m&&y==m&&(k=u[ab](q*T));if((G==h||E==h)==h)g=N,f=A,q=N/Q,ba=A/M,T=q,G==h?T=q<=ba?q:ba:E==h&&(T=q>=ba?q:ba),N=u[ab](Q*T),A=u[ab](M*T),G=g-N,E=f-A,da==h&&$==m?d+=G:da==h&&$==h&& +(d+=u[ab](G/2)),C==h&&y==m?k+=E:C==h&&y==h&&(k+=u[ab](E/2))}var V=u.max(0,N-(Q-w)),P=u.max(0,A-J);qa==h&&(ia(a,Yh,V),ia(a,Zh,P));e==h?(r==h&&(d+=t(a,Jn,0.5)*(N-Q),ia(a,bi,u.max(0,N/Q)),V=w),ra(a[O],F(V,2))):ra(a[O],Z);v==h?(r==h&&(k+=t(a,Kn,0.5)*(A-M),ia(a,ci,u.max(0,A/M)),P=l),Ma(a[O],F(P,2))):Ma(a[O],Z);if(8>z.ca){var Y=s[cb](Am+a.id);Y!=j&&(w=function(){ra(Y[O],F(a[uc]));Ma(Y[O],F(a[Xc]))},0==a[uc]&&0==a[Xc]?p[vc](w,0):w())}if(9>z.ca){t(a,fm)!=j&&fe(a);var ea=a[Fc][wb][am+a.id];ea!=j&&(ea[Ib](jo, +V),ea[Ib](om,P))}ia(a,Lh,k);ia(a,Mh,d);c==m&&(k+=t(a,Th,0),d+=t(a,Sh,0),a[O].top=F(k),va(a[O],F(d)));if(c==h||r==h)9>z.ca?fe(a):ge(a);qa==h&&Ic(a);Tg==m&&Ug()}}catch(L){}}function Ti(a){a!=j&&0===a[ub](ko)&&(a=rm+a);return a}function ie(a){return a[Ya](/'/g,Sd)}function mb(a,b){if(a[ub])return a[ub](b);for(var c=0;c=e){d=w!=j?w[Ac].y+(l[Ac].y-w[Ac].y)*(e-w[Ac].x)/(l[Ac].x-w[Ac].x):l[Ac].y;break a}w=l}w=j}d=l[Ac].y}c.ea==h&&(d=1-d);e=n;w=a.a;if(w!=ca){n=Vg[w];if(a.b!=j){if(c.zc[w]==j&&(n=a.o,q=a.a,q!=ca)){v=Vg[q];a={};for(var Q=[],J=0,N=0,M=0;Me;e++)r[e]=c[e]+(g[e]-c[e])*d;e=dj(r)}else 1==d&&(e=q);Y(k,f,e);qa==h&&Fg(k,f,e,b)}function bj(a,b,c){var d;d=a[H];var e=0,f,g=0,g={};if(0>b||1b){var w=a.Ka[0];2<=w.qa[H]&&(f=w.qa[0],e=w.qa[1],k=f)}else n=-1,q=1-b,w=a.Ka[a.Ka[H]-1],2<=w.qa[H]&&(f=w.qa[w.qa[H]-2],k=e=w.qa[w.qa[H]-1]);if(f!=j&&e!=j){a=n*(e[Ac].x-f[Ac].x);b=n*(e[Ac].y-f[Ac].y);d*=q;0==b?(g.y=0,g.x=d):(g.y=u[Gb](u.pow(d,2)/(u.pow(a,2)/ +u.pow(b,2)+1)),g.x=g.y*a/b);if(0a&&0>g.x)g.x*=-1;if(0b&&0>g.y)g.y*=-1;g.x+=k[Ac].x;g.y+=k[Ac].y;g.wb=ej(f[Ac],e[Ac])}}else if(0==d)g={x:a.Ka[0].fb.x,y:a.Ka[0].fb.y,wb:0};else{if(1==b)d=a.Ka,f=d[d[H]-1],g=1;else{for(g=0;gb){f=w;break}e+=w[H]}g=(b-e/d)/(f[H]/d);d=f[H]*g;for(b=a=g=0;b=f)b.eb=d+1,yb[g][k]==b.fa&&(1==e.p&&b.sa==h?(e=x[G].v[g].aH,f=Ja(g),e==h&&f[Jb]&&(f.autoplay=h,f[Jb]())):0==e.p&&b.Da[D](e));else break}c=[];for(d=0;d=f){if(yd[e]==b.fa){var q=b.ea==m?n.G:Ca(n.G+n[yc],k),f=0,f=n.z?q-n[yc]:q+n[yc],f=u.max(0,f);zd(k,m);f=nc(f,k,h,h,m);f==m&&Zb(e,j)}b.ab[ed](d,1);d--}}for(d=b.tb;d=f)){b.tb=d+1;var w=n.E,l=n.z,v=q=b.ea==m?n.G:Ca(n.G+n[yc],k),t=m;b.ea==h&&(l=!l);w&&(f=a-f,f>n[yc]?(w=m,f=n[yc]):(b.ab[D](n),t=h),v=l?v-f:v+f,v=u.max(0,v));if(w){if(f=ud(q,e,h))continue;l&&(zd(k,l),v=Ca(Ha(k)-v,k));if(f=nc(v,k,h,h,h))continue;b.sa?(je(k,b.xa),td(e,l,m,m)):Zb(e,j)}else Zb(e,j),ud(v,e,m);t&&(yd[e]=b.fa)}}}function nc(a,b,c,d,e){of=h;for(var f=b.pa,g=b.ea?b.ac:b.ta,k=[],n=u.min(a*b.xa,Ha(b)),q=b.eb;q=l)&&k[D](w)}e=m;if(0==k[H]||d==m)Yg(n,b,g);else{for(var w=d=0,v=b.sa,t=b.ea,q=0;qe&&(a=e);d.ea==h&&(a=Ca(e-a,xa(b)));d.eb=0;d.tb=0;d.Da=[];d.ab=[];b=zb()/1E3;d.pa=b-a;d.Qa=b-d.pa;d.sa==h&&(p[Qa](d.hb),d.hb=p[vc](function(){ke(d)}, +1E3*((e-a)/d.xa)));hj(d,m);Zg(d,0);ij(d,a);a=nc(a,d,m,h,c);Kc();return a}}function Ad(a,b){var c=xa(a);if(c==j)return 0;var d=0;c.sa==h?(d=zb()/1E3-c.pa,d*=c.xa):d=c.Qa;var e=Ha(c);b==h&&c.ea==h&&(d=e-d);d=u.max(0,d);return d=u.min(e,d)}function ij(a,b){for(var c={},d=a.ea?a.ac:a.ta,e=0;e=b&&(c[g]==j&&(c[g]={}),q!=h&&c[g][k]==j&&(q=Ja(g),n==ca&&(a.ea==h&&0==f.d)&&(n=f.s),Y(q,k,n)),c[g][k]=h)}}}} +function td(a,b,c,d){yd[a]=j;var e=xa(a);e!=j&&(c&&je(e,1),zd(e,b),e.sa==m&&(e.pa!=j?e.Qa==Ha(e)?d&&Yb(a,j,b):(e.sa=h,e.pa=zb()/1E3-e.Qa/e.xa,p[Qa](e.hb),e.hb=p[vc](function(){ke(e)},1E3*((Ha(e)-e.Qa)/e.xa)),e.mb!=h&&(Zg(e,e.Qa),e.eb=0,e.tb=0,e.Da=[],e.ab=[]),nc(e.Qa/e.xa,e,m,m),Kc()):(d==h||0==e.Qa)&&Yb(a,j,b)))}function Zb(a,b){yd[a]=j;var c=xa(a);c!=j&&c.sa==h&&(je(c,1),c.Qa=b!=j?b:zb()/1E3-c.pa,c.sa=m,p[Qa](c.hb))}function ke(a){if(!(qa==h&&a.mb==h)&&!nc(Ha(a),a,h,h))if(le(a),me!=j&&Af==a.fa)a= +me,Af=me=j,a();else if(a={type:ki,timelineName:a.Lb.n},Bf(a,j)!==m){var b=Ta();if(b!=j){var c=x[Cf(Df())].F;c!=j&&ta(b,c.a)(a)}}}function Ca(a,b){return qa==h&&b.mb==h?Ef(a,60):Ef(a,b.Lb.f)}function Ef(a,b){var c=u[bb](a);return c+u[Sa]((a-c)*b)/b}function Ha(a){return qa==h&&a.mb==h?31536E3:Ca(a.Lb.d,a)}function Kc(){if(zf!==h){zf=h;var a=function(a){p[vc](a,1E3/60)};(z.kb!=j?a:p.requestAnimationFrame||p.webkitRequestAnimationFrame||p.mozRequestAnimationFrame||a)(function(){zf=m;gj()})}}function le(a){p[Qa](a.hb); +a.eb=0;a.tb=0;a.Da=[];a.ab=[];a.Xe=j;a.pa=j;a.sa=m;a.xa=1;a.Qa=Ha(a);a=mb(eb,a);-1!=a&&eb[ed](a,1)}function jj(a){for(var b=0;b=b&&(db[f]===ca||db[f][g]===ca||db[f][g]==a.fa))yb[f][g]=a.fa}jj(a)}function Yb(a,b,c){yd[a]=j;for(var d=0;dz.ca&&0==a[ub](vn)&&(a=dj(Xg(a),h));return a} +function dj(a,b){if(1==a[3]||b==h){for(var c=ma.Wc,d=Id,e=0;3>e;e++)d+=c[qb](a[e]/16)+c[qb](a[e]%16);return d}return wn+oa(a[0])+Fe+oa(a[1])+Fe+oa(a[2])+Fe+pa(a[3])+Ce}function F(a,b){var c=u.pow(10,b==j?0:b);return Z+u[Sa](a*c)/c+qn}function Xg(a){var b=[0,0,0,1];if(0==a[ub](un)){var c=a[ub](Be),d=a[ub](Ce);if(3c;c++)b[c]=16*d[ub](a[qb](2*c))+d[ub](a[qb](2*c+1))}return b} +function cj(a){typeof a!=gn&&(a=pa(a));return isNaN(a)?0:a}function mj(a,b,c){Gf=m;c!=j&&delete x[G].T[c];Ia(b[O],bl);Y(b,Mk,0,ek,0);ia(b,Xh,Zf);Y(b,xk,0,Nj,0,mo,1,Yl,1);c=x[G].a;c!=j?(ra(b[O],fg),ra(T[O],c+Qd)):(ra(b[O],F(x[G].Y)),ra(T[O],b[O][Ra]));c=x[G].b;c!=j?(Ma(b[O],fg),Ma(T[O],c+Qd)):(Ma(b[O],F(x[G].Z)),Ma(T[O],b[O][dd]));Mc[T.id]=j;Mc[b.id]=j;fa[R[a.id]]&&(a!=j&&a!=b)&&(Ia(a[O],fn),a[Ib](qk,h),Y(a,Mk,0,ek,0,xk,0,Nj,0,mo,0,Yl,1),ia(a,Xh,Zf));T[O][Ue]=j;T[O][ma.Oa+Un]=km;T[O][Oe]=j;T[O].perspective= +j;if(9>z.ca){a=ne(a);for(c=0;cq;q++)for(var w=0;wu.abs(c.x-pe[b].x)&&25>u.abs(c.y-pe[b].y)&&(a.stopPropagation(),a[rb]())}}function oj(a){var b=[],c=x[G].U,d;for(d in c)c[K](d)!=m&&c[d].n==a&&b[D](oc[d]);return b}function Ui(a){var b={type:li, +customBehaviorName:a},c=Lf[a];if(c!=j)for(var d=0;d=d;d++)c[D]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Db=c;a.Hb=ca;a.Sc=m;var c=a.wa?b[Cc][0]:b,e;e=function(b){dh(a);a.ob=Dl;Of(b,a)};a.Ia=e;b=a.wa?a.Qc:s;a.wa?Ua(Pn,a.Ia,b,m):p.self!=p.top&&(d=function(a){(a.relatedTarget===s.documentElement||a.toElement===j)&&e(a)},a.Ia=d,Ua(Um,d,b,m));c=Jf(c);d=a.Db[0];d[Uc].x=c.x;d.end.x=c.x;d[Pa].x=c.x;d[Uc].y=c.y;d.end.y=c.y;d[Pa].y=c.y;sj(a,c);a.pd=function(b){if(!(a.ob===bm||a.ob===Dl))if(Nf== +h)a.Ia(b);else{if(a.uc==m&&(Mf++,a.uc=h,a[U].ua==Wl)){Pf=h;if(a[U].Ya!=j)for(var c=0;cz.ca&&(a.Qc.ondragstart=function(a){return a==j?m:h});if(a[U].Ya!=j)for(c=0;cw,(l||w==m||Pf==h)&&a.Ia(b)):a[U].ua==Mn&&5=t?Jm:yn:0>=t&&-180<=t?Xn:Vl)!=r,x=v/J;else{r=l=Ad(d.fa,m);for(v=J=0;va[U].gc?(b={type:gi+a[U][Oa][qb](0).toUpperCase()+a[U][Oa][Xa](1)+vg},a.qd(b)):a.Ia(b)):a[U].ua==Mn?1500>d&&a.qd(b):a.Ia(b);dh(a)}};Ua(a.wa?Qn:Wm,a.od,b,m);b.setCapture&&b.setCapture();a.tc=zb();a.Xc=a.tc;Pf=Nf=a.uc=m}}}function dh(a){if(a.Sc!=h){a.Sc=h;db={};var b=a.wa?a.Qc:s;b.releaseCapture&&b.releaseCapture();re(a.wa?Rn:Tm,a.pd,b); +re(a.wa?Qn:Wm,a.od,b);a.wa?re(Pn,a.Ia,b):re(Um,a.Ia,b);a[U].ua==Wl&&(Pf=m);a.uc==h&&Mf--;qa==h&&a[U]&&(Ic(a[U].vb),Kc())}}function Of(a,b){b[U].se==h&&(a.hypeGesturePhase=b.ob,a.hypeGestureXPosition=b.Db[0].end.x,a.hypeGestureYPosition=b.Db[0].end.y,b.qd(a))}function re(a,b,c){c[wc]?c[wc](a,b,m):c[Wc]&&c[Wc](jn+a,b)}function Ua(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Qf[D](e);c[Hb]?c[Hb](a,b,m):c[Tb]&&c[Tb](jn+a,b)}function Jf(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hc]|| +a[ic])b.x=a[hc]+s[Ec].scrollLeft+s.documentElement.scrollLeft,b.y=a[ic]+s[Ec].scrollTop+s.documentElement.scrollTop;return b}function uj(a){var b;0==a.c?0==a.A?b=yn:1==a.A&&(b=Jm):1==a.c&&(0==a.A?b=Xn:1==a.A&&(b=Vl));return b}function sj(a,b){var c=a[U][Oa]==yn||a[U][Oa]==Jm?b.x:b.y;a.Hb=a.Hb==ca?c:a[U][Oa]==yn||a[U][Oa]==Vl?u.max(a.Hb,c):u.min(a.Hb,c)}function tj(a,b,c){a=u[Sa](180*u[Eb](b.y-a.y,b.x-a.x)/u.PI);c=u.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Jm;if(a<=45-c&&a>=-45+c)return yn;if(a< +-45-c&&a>-135+c)return Xn;if(a>45+c&&a<135-c)return Vl}function Mg(a){for(var b=Bd[a],c={},d=0;dz.ca?wo:xo;d={};d.kd=z.kb!=j;var f=Sf[a];f==j&&(f=new b(a,c),f.Lf=a,f.cc=c,f.options=d,f.jd=function(){var a=[],b;for(b in f.cc)f.cc[K](b)!=m&&a[D](b); +return a.sort()});return f}function vj(a){a=Bd[a];if(a!=j){for(var b=1=$b[H]?wj():b==h&&gh==m&&(gh=h,p[vc](function(){xj()},1))}function xj(){0>=$b[H]||(gh=m,yj($b[0],h))}function yj(a,b){var c=La[a].p;if(1==c)if(c=La[a].g,c!=j&&vj(c)!=a)fh(a,b);else{var d=new Image,c=function(c){d=this;if((z.Pc!= +j||z.Wd!=j&&z.kb==j)&&c[Ob]==Lm&&-1!=Ub[ub](Xl)&&-1==d.src[ub](bf))try{var e=s[Db](Fl);ra(e,d[Ra]);Ma(e,d[dd]);e.getContext(gg).drawImage(d,0,0);zj[d.Ne]=e.toDataURL()}catch(k){}fh(a,b)},e=Rf(a);d.onload=c;d.onerror=c;d.onabort=c;d.src=e;d.Ne=a}else 2==c&&(c=function(){for(var c=Bd[La[a].g],d=0;dpa(z.Ra)||9>z.ca?p[vc](c,1):e.load(c,c))}function wj(){gf!=j&&gf(m,T);if(Bf({type:di},T)!==m)if(-1==zg)Lc(Pc);else{se=h;for(var a= +-1,b=0;bc&&(c=f),ra(T[O],F(c)),Mc[T.id]=j,T[O].margin==uk&&(ka&&(a=g),Ma(T[O],F(a)))}function Dd(a){var b=T[bd].offsetHeight,c=x[a].b;return c!=j?c/100*b:x[a].Z}function Cd(a){var b=T[bd][ib],c=x[a].a;return c!=j?c/100*b:x[a].Y}function hh(a,b,c,d){if(!(Aj(a)==j||Gf==h)){c==j&&(c=1.1);c=Ef(c,60);Gf=h;var e=function(){d!=j&&d();nb=[];Lf={};var e=Ta();Jc=x[a].a!=j||x[a].b!=j?h:m;var f=Aj(a),g=G,k=Ta();if(k!=j){for(var n=k[fc](ao),l=0;lF&&(F=l[O][dc]))}else w[D]({container:l,domElement:E,sceneElement:v});la[k].Kd==m&&(qa==h&&Lg(qc[k]),nj(l,h),la[k].Kd=h)}for(l= +0;lg?P:g,fa[C].a=0,fa[C].b=0)):(te(e,ea,h,m),P!=g&&(W[D](ac(Rl,0,S,ml,C,P,g)),fa[C]={},fa[C].c=X>L?X:L,fa[C].d=P,fa[C].a=0,fa[C].b=0)),q=Nj,f=L,r=-1*L,5==b?(f=-1*X,r=X):6==b?(q=xk,f=-1*P,r=P):7==b&&(q=xk,f=g,r=-1*g),e!=j&&(w=R[e.id],Y(e,ml,X,Rl,P),W[D](ac(q,0,S,ml,w,0,f))),W[D](ac(q,0,S,ml,R[ea.id],r,0)),Y(ea,ml,L,Rl,g,q,r),ih(Vh,S,W,e,ea),Ia(ea[O],bl)):(te(e,ea,m,m),mj(e,ea,j));Qc()},f=m,g= +Ta();g[Ib](qk,h);if(Bj==h&&g!=j){var g=Cf(Df()),k={type:fi};if(Bf(k,j)!==m){var n=x[g].B;if(n!=j){for(var q=n.a,w=ta(Ta(),q),n=0;nk;k++){var n=fj(e,k/99),q={};q.location=n;b&&(g=eh(n,g),f+=g,Aa(q,g)); +e.qa[D](q);g=n}c+=f;Aa(e,f)}return c}function fj(a,b){var c=Fd(a.fb,a.Jb,b),d=Fd(a.Jb,a.Bb,b),e=Fd(a.Bb,a.Rb,b),f=Fd(c,d,b),d=Fd(d,e,b),f=Fd(f,d,b),g=m,k=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?k=e:(k=c,g=h));f.wb=ej(f,k);g==h&&(f.wb+=180);return f}function ej(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*u.atan((b.y-a.y)/(b.x-a.x))/u.PI;b.xc)break;b=e}}return b}function Gg(a){var b=qc[Df()];a!=j&&(b=qc[a]);a=Mc[b];a==j&&(a=s[cb](b),a={width:a[ib],height:a.offsetHeight},Mc[b]=a);return a}function nf(a){var b=0,c=0;a==j?(b=x[G].Y,c=x[G].Z):(b=Vb(a),c=Wb(a));return{width:b,height:c}}function Qg(a){return(z.Ra!=j||3.5<=z.Cb||10<=z.ca)&&t(a,Xh)==cg}function Hg(){of=m;Tg=h;for(var a in he)he[K](a)&&Nc(he[a]);Tg=m;Ug();he={}} +function Ug(){p[vc](function(){de!=j&&(kh?lh=h:(kh=h,de.refreshAll(),kh=m,lh&&(lh=m,Ug())))},0)}function mh(a,b,c){var d=b;if(d==j||s[cb](d)!=j){do d=c+Hj();while(s[cb](d)!=j)}qc[a]=d;R[d]=a;return nh[b!=j?b:d]=d}function Ja(a){return s[cb](qc[a])}function zb(){return(new Date).getTime()}function Hj(){for(var a=Z,b=ma.Wc+Bh,c=0;20>c;c++)var d=u[bb](u.random()*b[H]),a=a+b.substring(d,d+1);return a}function xo(a){var b=this;Sf[a]=b;b.bc=function(){var a=s[Db](sk);b.Ha=a;for(var d=b.jd(),e=0;ez.ca&&(b=b.match(/('|")(http.*?css.*?)('|")/),b!=j&&2<=b[H]&&s.createStyleSheet(b[2]));p[vc](Qc,120);p[vc](Qc,1200);a=s[Db](Ul);a.id=Ih;Ia(a[O], +fn);a[Ib](qk,h);T[Na](a);for(b=0;bz.ca)xj();else for(L=0;Lz.ca|| +z.Rd){if(1==oa(b))ia(a,Rh,Z),ia(a,Qh,Z);else{var c=wg+u[Sa](100*b)+Ce;ia(a,Rh,ma.wc+Xe+c);ia(a,Qh,c.toLowerCase());a[O].backgroundColor==Z&&a[O].backgroundImage==Z&&s[cb](Am+a.id)==j&&Ga(a[O],Yn+ie(Z+Ub+Yf)+Wd)}fe(a)}a[O].opacity=b;a[O].MozOpacity=b},aP:function(a,b){a[O].cursor=b},bD:function(a,b){a[O][ma.Oa+Zn]=b;a[O].MozUserSelect=b;a.onselectstart=function(){return m}},N:function(a,b){a[O].borderLeftWidth=F(b);Mb(a)},O:function(a,b){a[O].borderRightWidth=F(b);Mb(a)},P:function(a,b){a[O].borderTopWidth= +F(b);Mb(a)},M:function(a,b){a[O].borderBottomWidth=F(b);Mb(a)},B:function(a,b){a[O].borderLeftColor=xb(b)},C:function(a,b){a[O].borderRightColor=xb(b)},D:function(a,b){a[O].borderTopColor=xb(b)},A:function(a,b){a[O].borderBottomColor=xb(b)},J:function(a,b){a[O].borderLeftStyle=b},K:function(a,b){a[O].borderRightStyle=b},L:function(a,b){a[O].borderTopStyle=b},I:function(a,b){a[O].borderBottomStyle=b},aK:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopLeftRadius=b;a[O].MozBorderRadiusTopleft=b;9> +z.ca&&wf(a)},aL:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopRightRadius=b;a[O].MozBorderRadiusTopright=b;9>z.ca&&wf(a)},aI:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomLeftRadius=b;a[O].MozBorderRadiusBottomleft=b;9>z.ca&&wf(a)},aJ:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomRightRadius=b;a[O].MozBorderRadiusBottomright=b;9>z.ca&&wf(a)},bE:function(a,b){sa(a,Z);var c,d=Bd[b];if(d!=j){for(var e=0;ez.ca){d=a[Fc][Db](Ul);Da(d,Ch);for(e=0;ez.ca)try{c.SetControllerVisible(0!=oa(b))}catch(d){p[vc](function(){fb.aO(a,b)},100)}},aR:function(a,b){a[Ib](bn,b);a.volume=0!=b?$f:dg;var c=a[Fc][wb][am+a.id]; +if(c!=j&&9>z.ca)try{c.SetMute(0!=oa(b))}catch(d){p[vc](function(){fb.aR(a,b)},100)}},aQ:function(a,b){a[Ib](Mm,b);wa(a,0!=b);var c=a[Fc][wb][am+a.id];if(c!=j&&9>z.ca)try{c.pf(0!=oa(b))}catch(d){p[vc](function(){fb.aQ(a,b)},100)}},j:function(a,b){Ba(a[O],b)},r:Yi,cY:Yi,aG:function(a,b){a[Ib](On,b);a[Ib](nk,b)},g:function(a,b){a[O].backgroundColor=xb(b)},n:Rg,m:Rg,l:Rg,h:function(a,b){var c=vj(b);if(c!=j){var d=La[c].n,e=Rf(c);if((3.6>z.Cb||9>z.ca)&&(a[O].backgroundRepeat==j||a[O].backgroundRepeat== +Z||a[O].backgroundRepeat==en)){var f=Am+a.id,c=s[cb](f);c!=j?c.src=e:(c=s[Db](zm),c.src=e,c.id=f,Ba(c[O],hk),ra(c[O],fg),Ma(c[O],fg),c[O].top=Zf,va(c[O],Zf),za(c[O],Le),a[Na](c));ia(c,Oh,c.src);9>z.ca&&d.substr(d[H]-4).toLowerCase()==df&&(c.src=Z+Ub+Yf,e=ie(e)[Ya](/\%/gi,Rd),ia(c,Ph,ma.wc+Ye+e+Wd),ia(c,Nh,ma.wc+cf),fe(c));Nc(a)}else d=zj[c],Ga(a[O],d!=j?Yn+d+Wd:Yn+ie(e)+Wd)}},q:function(a,b){a[O].backgroundSize=b;a[O][ma.Oa+Vk]=b;a[O].MozBackgroundSize=b},o:function(a,b){a[O].backgroundOrigin=b;a[O][ma.Oa+ +Uk]=b;a[O].MozBackgroundOrigin=b},p:function(a,b){if(b!=j&&b!=en){var c=s[cb](Am+a.id);c!=j&&(Ga(a[O],Yn+ie(t(c,Oh))+Wd),c[bd][Gc](c))}a[O].backgroundRepeat=b},x:function(a,b){a[O].overflow=b},aT:function(a,b){a[O].paddingLeft=F(b);Mb(a)},aU:function(a,b){a[O].paddingRight=F(b);Mb(a)},aV:function(a,b){a[O].paddingTop=F(b);Mb(a)},aS:function(a,b){a[O].paddingBottom=F(b);Mb(a)},S:yf,T:yf,R:yf,Q:yf,bB:xf,bC:xf,bA:xf,aZ:xf,bL:function(a){vd(a);z.Pc!=j&&a[O][We]==Z&&(a[O][We]=fn)},bG:vd,bH:vd,bI:vd,bJ:vd, +bK:vd,BDbL:wd,BDbG:wd,BDbH:wd,BDbI:wd,BDbJ:wd,BDbK:wd,Z:function(a,b){a[O].wordWrap=b},yy:function(a,b){a[O].whiteSpace=b},y:function(a,b){a[O].whiteSpaceCollapsing=b},z:function(a,b){za(a[O],b);a[bd][sc]==Hh&&za(a[bd][O],b)},aA:function(a,b){var c=ta(a,b.a);be&&(Oc(a,{Eb:1,ua:Mn},c),a[O][Ve]=xn);a[Ib](zn,ll);Va(Gl,a,c,h)},aD:function(a,b){Va(Vm,a,ta(a,b.a),m)},aC:function(a,b){Va(Um,a,ta(a,b.a),m)},aE:function(a,b){var c=ta(a,b.a);be&&(Va(Qn,a,c,h),a[O][Ve]=xn);a[Ib](zn,ll);Va(Wm,a,c,h)},aB:function(a, +b){var c=ta(a,b.a);if(be){var d=m;if(z.kb!=j)for(var e=b.a,f=0;fz.ca?c():Qi(a,c,cm)},cX:function(a,b){9>z.ca||Qi(a,ta(a,b.a),em)},cG:function(a,b){Oc(a,{Eb:1,direction:yn,gc:30,ua:In},ta(a,b.a))},cH:function(a,b){Oc(a,{Eb:1,direction:Jm,gc:30,ua:In},ta(a,b.a))},cI:function(a,b){Oc(a,{Eb:1,direction:Xn,gc:30,ua:In},ta(a,b.a))},cJ:function(a, +b){Oc(a,{Eb:1,direction:Vl,gc:30,ua:In},ta(a,b.a))},cK:ee,cF:ee,aM:function(a,b){Va(Vm,a,Og(a,b),m);Va(Um,a,vf(a,b),m)},aN:function(a,b){be&&(Va(Sn,a,Og(a,b),m),Va(Rn,a,vf(a,b),m),Va(Qn,a,vf(a,b),m),a[O][Ve]=xn);Va(Sm,a,Og(a,b),m);Va(Wm,a,vf(a,b),m)},V:Pg,U:Pg,W:Pg,w:function(a,b){var c=s[cb](Am+a.id),c=c!=j?c.cloneNode(h):j;sa(a,b);for(var d=a[fc](Bn),e=0;ez.ca){var c=function(b){b=b?b:p[fd];if(a[O][mn]==fn){var c=a[O].display;Ia(a[O],fn);var f=s.elementFromPoint(b[hc],b[ic]);Ia(a[O],c?c:Z);s.createEvent?(b[rb](),c=s.createEvent(qi),c.initMouseEvent(b[Ob], +b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hc],b[ic],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b[tb],j),f.dispatchEvent(c)):(c=s.createEventObject(),c.clientX=b[hc],c.clientY=b[ic],f.fireEvent(jn+b[Ob],c),event.cancelBubble=h)}};Ua(pi,c,a,h);Ua(Wm,c,a,h);Ua(Sm,c,a,h);Ua(Gl,c,a,h)}}},Sf={},Gd=j,ce=[Nj,xk,fm],Ka=[],kf=m;fb.bM=Ic;fb.bU=jf;fb.bV=jf;fb.cT=jf;fb.bW=jf;var V,X={},E={ge:4},yo=1,zo=-1;E.create=function(a){var b={id:y.Wb(),type:dl,label:vh,ba:0,aa:S.Id(ni),position:{x:0,y:0}, +Ba:{x:0,y:0},ic:0,ka:{x:0,y:0},Ea:{x:0,y:0,ba:0},speed:0,Sa:0,ha:{x:0,y:0},va:0,da:m,ia:m,rb:0,hd:60,Ab:0.0010,Xa:0,La:0.1,sc:0.01,pc:{Bd:1,Nd:4294967295,group:0},yb:0.05,gb:1,ya:{visible:h,Sf:{Wf:1,Xf:1},lineWidth:1.5}},b=y[pb](b,a);b.ga=b.ga||gb[kc](b.aa);b.$=b.$||r.mc(b[I]);b.oa=b.oa||b.ba;E.Zd(b,b.aa);E.Yd(b,b.da);Wa.set(b,b.ia);S[Bc](b.aa,b.ba,b[I]);Rc[Bc](b.Ua,b.ba);gb[cd](b.ga,b.aa,b.ha);b.Ua=a.Ua||b.Ua;b.Ta=a.Ta||b.Ta;E.Cc(b,a.Wa||b.Wa);E.gd(b,a.qb||b.qb);a=b.da?Pd:y.ne();var c=y.Qe(a);b.ya.fillStyle= +b.ya.fillStyle||a;b.ya.strokeStyle=b.ya.strokeStyle||c;return b};E.If=function(a){return a?zo--:yo++};E.Yd=function(a,b){if(a.da=b)a.Xa=0,a.La=1,a.Wa=a.qb=a.Ab=ja,a.ra=a.Ma=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,a.va=0,ua(a,0),a.Sa=0,a.rb=0};E.Cc=function(a,b){a.Wa=b;a.ra=1/a.Wa;a.Ab=a.Wa/a.Ta};E.Xd=function(a,b){E.Cc(a,b*a.Ta);a.Ab=b};E.gd=function(a,b){a.qb=b;a.Ma=1/a.qb};E.Zd=function(a,b){a.aa=b[0][Ec]===a?b:S[kc](b,a);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);var c=S.Oc(a.aa);S[Pb](a.aa, +c,-1);E.gd(a,E.ge*S.qb(a.aa,a.Wa));S[Pb](a.aa,a[I]);gb[cd](a.ga,a.aa,a.ha)};E.Dc=function(a,b){var c=r.sub(b,a[I]);a[I].x=b.x;a[I].y=b.y;a.$.x+=c.x;a.$.y+=c.y;S[Pb](a.aa,c);gb[cd](a.ga,a.aa,a.ha)};E.fd=function(a,b){var c=b-a.ba;a.ba=b;a.oa+=c;S[Bc](a.aa,c,a[I]);Rc[Bc](a.Ua,c);gb[cd](a.ga,a.aa,a.ha)};E.Pe=function(a,b){a.$.x=a[I].x-b.x;a.$.y=a[I].y-b.y;a.ha.x=b.x;a.ha.y=b.y;ua(a,r.Vb(a.ha))};E.Oe=function(a,b){a.oa=a.ba-b;a.va=b;a.Sa=y.abs(a.va)};E.translate=function(a,b){E.Dc(a,r.add(a[I],b))};E.rotate= +function(a,b){E.fd(a,a.ba+b)};E.scale=function(a,b,c,d){S.scale(a.aa,b,c,d);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);S[Pb](a.aa,{x:-a[I].x,y:-a[I].y});E.gd(a,S.qb(a.aa,a.Wa));S[Pb](a.aa,{x:a[I].x,y:a[I].y});gb[cd](a.ga,a.aa,a.ha)};E.Me=function(a){for(var b=0;be.max.x||g.ga.max.ye.max.y)||E[cd](g,b,c,d))}};E.update=function(a,b,c,d){b=u.pow(b*c*a.gb,2);c=1-a.sc*c*a.gb;var e=a[I].y-a.$.y;a.ha.x=(a[I].x-a.$.x)*c*d+a.Ba.x/a.Wa*b;a.ha.y=e*c*d+a.Ba.y/a.Wa*b;a.$.x=a[I].x;a.$.y=a[I].y;a[I].x+=a.ha.x;a[I].y+=a.ha.y;a.va=(a.ba-a.oa)*c*d+a.ic/a.qb*b;a.oa=a.ba;a.ba+=a.va;ua(a,r.Vb(a.ha));a.Sa=y.abs(a.va);S[Pb](a.aa,a.ha);0!==a.va&&(S[Bc](a.aa,a.va,a[I]),Rc[Bc](a.Ua,a.va));gb[cd](a.ga,a.aa,a.ha)};E.sf=function(a, +b,c){a.Ba.x+=c.x;a.Ba.y+=c.y;a.ic+=((b.x-a[I].x)*c.y-(b.y-a[I].y)*c.x)*a.Ma};var B={create:function(a){return y[pb]({id:y.Wb(),type:Ml,parent:j,vc:m,bb:[],Ob:[],na:[],label:wh},a)},Aa:function(a,b,c,d){a.vc=b;c&&a.parent&&B.Aa(a.parent,b,c,d);if(d)for(var e=0;el.ga.max.x||l.ga.min.x>g.ga[Ra]||0>l.ga.max.y||l.ga.min.y>g.ga[dd])){var v;v=l.ga;v=Ki(u[bb](v.min.x/a.yd),u[bb](v.max.x/a.yd),u[bb](v.min.y/a.xd),u[bb](v.max.y/a.xd));if(!l[sb]||v.id!==l[sb].id||d){r.wd+=1;if(!l[sb]||d)l.region=v;var t;n=v;q=l[sb]; +e=u.min(n.dc,q.dc);f=u.max(n.Qb,q.Qb);t=u.min(n.ec,q.ec);n=u.max(n.Sb,q.Sb);t=Ki(e,f,t,n);for(e=t.dc;e<=t.Qb;e++)for(f=t.ec;f<=t.Sb;f++){q=e+Fe+f;n=k[q];var x=e>=v.dc&&e<=v.Qb&&f>=v.ec&&f<=v.Sb,z=e>=l[sb].dc&&e<=l[sb].Qb&&f>=l[sb].ec&&f<=l[sb].Sb;if(!x&&z&&z&&n){var C=a,A=n,B=l;A[ed](y[ub](A,B),1);for(var E=0;EL*f.La*d&&(F=L*f.La*d* +G);G=r.jb(C,q);L=r.jb(z,q);G=l/(f.ra+k.Ma*G*G+n.Ma*L*L);A*=G;F*=G;0>E&&E*E>4*d?(x.Ib=0,x.Kb=0):(E=x.Ib,x.Ib=u.min(x.Ib+A,0),A=x.Ib-E,E=x.Kb,x.Kb=y.Nb(x.Kb+F,-B,B),F=x.Kb-E);c.x=q.x*A+g.x*F;c.y=q.y*A+g.y*F;!k.da&&!k.ia&&(k.$.x+=c.x*k.ra,k.$.y+=c.y*k.ra,k.oa+=r.jb(C,c)*k.Ma);!n.da&&!n.ia&&(n.$.x-=c.x*n.ra,n.$.y-=c.y*n.ra,n.oa-=r.jb(z,c)*n.Ma)}}}}},qh={Cd:function(a,b,c){var d,e;d=m;c?(e=a[vb]*a[vb]+a.Sa*a.Sa+b[vb]*b[vb]+b.Sa*b.Sa,d=c&&c.ib&&0.2>e,e=c):e={ib:m,ja:a,la:b};if(c&&d){if(c=Ag(c.ja.aa,c.la.aa, +[c.ja.Ua[c.Nc]]),e.Vd=h,0>=c.nb)return e.ib=m,e}else{c=Ag(a.aa,b.aa,a.Ua);if(0>=c.nb)return e.ib=m,e;d=Ag(b.aa,a.aa,b.Ua);if(0>=d.nb)return e.ib=m,e;c.nbd[H]&&(a=Ii(b,a,r.Od(e.Pa)),S[Zc](b.aa,a[0])&&d[D](a[0]), +2>d[H]&&S[Zc](b.aa,a[1])&&d[D](a[1]));2>d[H]&&(d=[c[0]]);e.ld=d;e.We=r.sub(d[0],e.Ce);return e}},Vf={create:function(a){a.ja&&!a.Zb&&(a.Zb={x:0,y:0});a.la&&!a.$b&&(a.$b={x:0,y:0});var b=a.ja?r.add(a.ja[I],a.Zb):a.Zb,c=a.la?r.add(a.la[I],a.$b):a.$b,b=r.Vb(r.sub(b,c));Aa(a,a[H]||b||1E-6);a.ya=y[pb]({visible:h,lineWidth:2,strokeStyle:Ld},a.ya);a.id=a.id||y.Wb();a.label=a.label||xh;a.type=Nl;a.ae=a.ae||1;a.Mc=a.Mc||0;a.Kc=a.ja?a.ja.ba:a.Kc;a.Lc=a.la?a.la.ba:a.Lc;return a},Te:function(a,b){for(var c=0;c< +a[H];c++)Vf.Se(a[c],b)},Se:function(a,b){var c=a.ja,d=a.la,e=a.Zb,f=a.$b;c&&!c.da&&(a.Zb=r[Bc](e,c.ba-a.Kc),a.Kc=c.ba);d&&!d.da&&(a.$b=r[Bc](f,d.ba-a.Lc),a.Lc=d.ba);var g=e,k=f;c&&(g=r.add(c[I],e));d&&(k=r.add(d[I],f));if(g&&k){var e=r.sub(g,k),n=r.Vb(e);0===n&&(n=1E-6);f=r.we(e,n);e=r.sb(e,0.5*((n-a[H])/n)*a.ae*b*b);if(!(y.abs(1-n/a[H])<0.0010*b)){var q,t,l;c&&!c.da?(q={x:g.x-c[I].x+e.x,y:g.y-c[I].y+e.y},c.ha.x=c[I].x-c.$.x,c.ha.y=c[I].y-c.$.y,c.va=c.ba-c.oa,g=r.add(c.ha,r.sb(r.Xb(q),c.va)),n=r.za(q, +f),n=c.ra+c.Ma*n*n):(g={x:0,y:0},n=c?c.ra:0);d&&!d.da?(t={x:k.x-d[I].x-e.x,y:k.y-d[I].y-e.y},d.ha.x=d[I].x-d.$.x,d.ha.y=d[I].y-d.$.y,d.va=d.ba-d.oa,k=r.add(d.ha,r.sb(r.Xb(t),d.va)),l=r.za(t,f),l=d.ra+d.Ma*l*l):(k={x:0,y:0},l=d?d.ra:0);k=r.za(f,r.sub(k,g))/(n+l);0>16)+c;var d=(b>>8&255)+c,b=(b&255)+c;return Id+(16777216+65536*(255>a?1>a?0:a:255)+256*(255>d?1>d?0:d:255)+(255>b?1>b?0:b:255))[jc](16)[Xa](1)},Rf:function(a){for(var b=a[H]- +1;0c?c:a},Re:function(a){return 0>a?-1:1},now:function(){var a=p.performance;return a?(a.now=a.now||a.webkitNow||a.Hf||a.Jf||a.Ff,+a.now()):+new Date},random:function(a,b){a="undefined"!== +typeof a?a:0;y.Gc=(9301*y.Gc+49297)%233280;return a+y.Gc/233280*(("undefined"!==typeof b?b:1)-a)},vf:function(a){a=a[Ya](Id,Z);3==a[H]&&(a=a[qb](0)+a[qb](0)+a[qb](1)+a[qb](1)+a[qb](2)+a[qb](2));return oa(a,16)},log:function(a,b){if(console&&console.log){var c;switch(b){case go:c=Kl;break;case dm:c=Ll}console.log(Td+b+jg+a,c)}},Wb:function(){return y.je++},sin:function(a){return pa(u.sin(a)[Za](8))},cos:function(a){return pa(u.cos(a)[Za](8))},indexOf:function(a,b){if(a[ub])return a[ub](b);for(var c= +0;c=e.hd&&Wa.set(e,h)):0Wa.ie*c&&Wa.set(f,m)}}},set:function(a,b){b?(a.ia=h,a.xb=a.hd,a.ka.x=0,a.ka.y=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,ua(a,0),a.Sa=0,a.rb=0):(a.ia=m,a.xb=0)}},Rc={Jd:function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x);e.xa.max.y&&(a.max.y=e.y);e.y=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},Pd:function(a,b){return a.min.x<=b.max.x&& +a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},translate:function(a,b){a.min.x+=b.x;a.max.x+=b.x;a.min.y+=b.y;a.max.y+=b.y},shift:function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x;a.max.x=b.x+c;a.min.y=b.y;a.max.y=b.y+d}},r={mc:function(a){return{x:a.x,y:a.y}},Vb:function(a){return y[Gb](a.x*a.x+a.y*a.y)},Cf:function(a){return a.x*a.x+a.y*a.y},rotate:function(a,b){var c=y.cos(b),d=y.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},Qf:function(a,b,c){var d=y.cos(b);b=y.sin(b);return{x:c.x+ +((a.x-c.x)*d-(a.y-c.y)*b),y:c.y+((a.x-c.x)*b+(a.y-c.y)*d)}},xc:function(a){var b=r.Vb(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},za:function(a,b){return a.x*b.x+a.y*b.y},jb:function(a,b){return a.x*b.y-a.y*b.x},add:function(a,b){return{x:a.x+b.x,y:a.y+b.y}},sub:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},sb:function(a,b){return{x:a.x*b,y:a.y*b}},we:function(a,b){return{x:a.x/b,y:a.y/b}},Xb:function(a){var b;b=b===h?-1:1;return{x:b*-a.y,y:b*a.x}},Od:function(a){return{x:-a.x,y:-a.y}},ba:function(a, +b){return u[Eb](b.y-a.y,b.x-a.x)}},S={create:function(a,b){for(var c=[],d=0;dy.oa||y.Db||y.Ka!=j?n.open(f,Of):(9==y.oa||15>y[Sa])&&!(c instanceof MouseEvent)?n.open(f,Of):(e=p[Ta](X),e[B](Ci,f),e[B](Mj,Of),p[zb][ua](e),f=p.createEvent(Af),f.initMouseEvent(ei, +c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hb],c[ib],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,p[zb][Qb]),e.dispatchEvent(f),p[zb][Ab](e)):n.top.location=f);else if(6==f){h=e.l;l=e.m;e=e.n;f=Xi;h!=j&&(f+=escape(h));if(l!=j||e!=j)f+=ee,h=[],l!=j&&h[A](Gj+ba(l)),e!=j&&h[A](Kh+ba(e)),f+=h.join(zc);f!=Xi&&(n.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=g&&(e=k),f!=j&&(f=oe(f),ka(f,e),f[Va]())):13==f?(f=e.o,f!=j&&oe(f)[yb]()):14==f&&(e=e.B,e!=j&&Wf(e))}}}function zd(a,b){return function(c){pe(c, +b,O[a.id])}}function qe(a,b){return function(c){Xf(c,b,O[a.id])}}function Lc(){}function Yf(a){var b=u(a,$g,8),c=u(a,Zg,0);y.hb==j&&(1==1-c&&a[L].removeProperty!=j?a[L].removeProperty(da.la+Lh):a[L][da.la+Lh]=Hh+x(b)+Wb+(1-c)+Hc)}function re(a){var b=u(a,Kf);if(b!=j){var c=W;b==rd?c=Vf(u(a,Lf)):b==od&&(c=W+jc+nd+u(a,Jf));b=be+c+Cc;y.va!=j&&(b=ae+b+Zd);ja(a,b)}}function Zf(a,b){var c=b==g?ke:W,d=u(a,c+wh,0),e=u(a,c+rh,0),f=u(a,c+sh,0),h=u(a,c+th,1),l=u(a,c+uh,1),c=u(a,c+vh,1),m=W;0!=d&&(m+=Jh+d+rj); +0!=e&&(m+=Bj+e+Fc);0!=f&&(m+=Ei+(W+f+ii)+Fc);1!=h&&(m+=zj+h+Fc);if(1!=l){if(6==y.pb||y.va!=j&&536.26>=ha(y.na))l-=1,1y.oa||(0!=l?c+=$b+(W+l+ii)+Fc:b==g&&(1==q&&1==t&&rb==k)&&(c+=ac),0!=h&&(c+=Zb+(W+h+ii)+Fc));1!=q&&(c+=bc+q+Fc);1!=t&&(c+=cc+t+Fc);b=W+(W+100*w+hc)+Vb+(W+100*I+hc);a[L][da.la+Sj]=b;a[L].MozTransformOrigin=b;a[L].OTransformOrigin= +b;a[L][ed]=b;a[L][Sj]=b;a[L][jd]=c;a[L].MozTransform=c;a[L].OTransform=c;a[L][dd]=c;a[L].transform=c}function oc(a){Mc(a)}function te(a){function b(a,b){return W+a+Ti+(W+(b==g?(z.abs(e)+180)%360:(360-z.abs(e)+270)%360)+ii)+Gc+c+Gc+d+Ec}var c=u(a,gj);if(!(c==j||c==W)){var d=u(a,Wi);if(!(d==j||d==W)){var e=u(a,Ri);e!=j&&(a[L].backgroundImage=y.na!=j?b(da.la,k):y.yb!=j?b(bd,k):15>y[Sa]?b(fd,k):b(W,g))}}}function $f(a){qa(a[L],u(a,ai,k)==g?ij:u(a,sj,W));ue(O[a.id])}function Ya(a){Ib[a.id]=j;pc(a)}function pc(a){try{if(Cd== +g)Nc[a.id]=a;else{var b=u(a,Ch,36),c=se(a),d=O[a.id],e=ve(d),f=ag(e),h=bg(e),l=ag(d),m=u(a,X,0),s=u(a,mh,0),q=u(a,Qh,j),t=u(a,hi,j),rb=e=g;q==j&&(e=k,q=l[Ba]);t==j&&(rb=k,t=l[Rb]);var w=Oc(d),I=Pc(d),d=I-t,l=m,P=s,v=w,M=I,y=k;if(nc==g&&36!=b){var r=0!=(b&1),Jb=0!=(b&4),G=0!=(b&2),Na=0!=(b&8),F=0!=(b&32),D=0!=(b&16),J=0!=(b&64)&&G==g&&D==g,E=0!=(b&128)&&G==g&&D==g,y=0!=(b&256)&&(G==g||D==g),Q=h[Ba]/f[Ba],R=h[Rb]/f[Rb];G==g&&(v=r==g&&Jb==g?w+(h[Ba]-f[Ba]):z[Ga](w*Q));r==g&&Jb==g&&G==k?(b=m+w/2,l=z[Ga](b* +Q-w/2)):r==g&&Jb==k&&G==g?l=h[Ba]-f[Ba]+m-(v-w):r==g&&Jb==k?l=h[Ba]-f[Ba]+m:r==k&&Jb==k&&(l=z[Ga](m*Q));D==g&&(M=Na==g&&F==g?I+(h[Rb]-f[Rb]):z[Ga](I*R));Na==g&&F==g&&D==k?P=z[Ga]((s+I/2)*R-I/2):Na==g&&F==k&&D==g?P=h[Rb]-f[Rb]+s-(M-I):Na==g&&F==k?P=h[Rb]-f[Rb]+s:Na==k&&F==k&&(P=z[Ga](s*R));if((J==g||E==g)==g)h=v,f=M,s=v/w,Q=M/I,R=s,J==g?R=s<=Q?s:Q:E==g&&(R=s>=Q?s:Q),v=z[Ga](w*R),M=z[Ga](I*R),J=h-v,E=f-M,r==g&&Jb==k?l+=J:r==g&&Jb==g&&(l+=z[Ga](J/2)),Na==g&&F==k?P+=E:Na==g&&F==g&&(P+=z[Ga](E/2))}var Y= +z.max(0,v-(w-q)),H=z.max(0,M-d);e==g?(y==g&&(l+=u(a,Ij,0.5)*(v-w),Xa(a,nf,z.max(0,v/w)),Y=q),ia(a[L],x(Y,2))):ia(a[L],W);rb==g?(y==g&&(P+=u(a,Jj,0.5)*(M-I),Xa(a,of,z.max(0,M/I)),H=t),ta(a[L],x(H,2))):ta(a[L],W);Xa(a,ff,P);Xa(a,gf,l);c==k&&(a[L].top=x(P),a[L].left=x(l));(c==g||y==g)&&Mc(a);we==k&&xe()}}catch(Z){}}function Vf(a){a!=j&&0===a[Ma](ak)&&(a=Di+a);return a}function sb(a,b){if(a[Ma])return a[Ma](b);for(var c=0;c=d){b=e!=j?e[wb].y+(t[wb].y-e[wb].y)*(d-e[wb].x)/(t[wb].x-e[wb].x):t[wb].y;break a}e=t}e=j}b=t[wb].y}c.$==g&&(b=1-b);d=m;e=a.a;if(e!=aa){m= +ye[e];if(a.b!=j){if(c.Sa[e]==j&&(m=a.o,s=a.a,s!=aa)){q=ye[s];a={};for(var v=[],I=0,P=0,w=0;wa;a++)c[a]=h[a]+(M[a]-h[a])*b;if(1==c[3]){h=da.Ya;M=gc;for(b=0;3>b;b++)M+=h[Ka](c[b]/16)+h[Ka](c[b]%16);d=M}else d=vj+ga(c[0])+Gc+ga(c[1])+Gc+ga(c[2])+Gc+ha(c[3])+Ec}else 1==b&&(d=s);Q(l,f,d)}function fg(a,b,c){var d;d=a[C];var e=0,f,h=0,h={};if(0>b||1b){var q=a.ka[0];2<=q.ba[C]&&(f=q.ba[0],e= +q.ba[1],l=f)}else m=-1,s=1-b,q=a.ka[a.ka[C]-1],2<=q.ba[C]&&(f=q.ba[q.ba[C]-2],l=e=q.ba[q.ba[C]-1]);if(f!=j&&e!=j){a=m*(e[wb].x-f[wb].x);b=m*(e[wb].y-f[wb].y);d*=s;0==b?(h.y=0,h.x=d):(h.y=z.sqrt(z.pow(d,2)/(z.pow(a,2)/z.pow(b,2)+1)),h.x=h.y*a/b);if(0a&&0>h.x)h.x*=-1;if(0b&&0>h.y)h.y*=-1;h.x+=l[wb].x;h.y+=l[wb].y;h.za=ig(f[wb],e[wb])}}else if(0==d)h={x:a.ka[0].ta.x,y:a.ka[0].ta.y,za:0};else{if(1==b)d=a.ka,f=d[d[C]-1],h=1;else{for(h=0;h +b){f=q;break}e+=q[C]}h=(b-e/d)/(f[C]/d);d=f[C]*h;for(b=a=h=0;b=f)b.sa=d+1,Oa[h][l]==b.aa&&(1==e.p&&b.fa==g?(e=v[D].v[h].aH,f=sa(h),e==g&&f[Va]&&(f.autoplay=g,f[Va]())):0==e.p&&b.ia[A](e));else break}c=[];for(d=0;d=f){if(qc[e]==b.aa){var s=b.$==k?m.G:V(m.G+m[mb],l),f=0,f=m.z?s-m[mb]:s+m[mb],f=z.max(0,f);rc(l,k);f=tb(f,l,g,g,k);f==k&&qb(e,j)}b.qa[Sb](d,1);d--}}for(d=b.ya;d=f)){b.ya=d+1;var q=m.E,t=m.z,u=s=b.$==k?m.G:V(m.G+m[mb],l),w=k;b.$==g&&(t=!t);q&&(f=a-f,f>m[mb]?(q=k,f=m[mb]):(b.qa[A](m),w=g),u=t?u-f:u+f,u=z.max(0,u));if(q){if(f=kc(s,e,g))continue;t&&(rc(l,t),u=V(ca(l)-u,l));if(f=tb(u,l,g,g,g))continue; +b.fa?(Qc(l,b.ha),Kc(e,t,k,k)):qb(e,j)}else qb(e,j),kc(u,e,k);w&&(qc[e]=b.aa)}}}function tb(a,b,c,d,e){Cd=g;var f=b.da,h=b.$?b.Na:b.ea,l=[];a=z.min(a*b.ha,ca(b));for(var m=b.sa;m=q)&&l[A](s)}e=k;if(0==l[C]||d==k)Ae(a,b,h);else{for(var s=d=0,t=b.fa,v=b.$,m=0;me&&(a=e);d.$==g&&(a=V(e-a,S(b)));d.sa=0;d.ya=0;d.ia=[];d.qa=[];b=Pa()/1E3;d.da=b-a;d.ma=b-d.da;d.fa== +g&&(n[xa](d.ua),d.ua=n[kb](function(){Rc(d)},1E3*((e-a)/d.ha)));mg(d,k);Be(d,0);ng(d,a);a=tb(a,d,k,g,c);Dd();return a}}function sc(a,b){var c=S(a);if(c==j)return 0;var d=0;c.fa==g?(d=Pa()/1E3-c.da,d*=c.ha):d=c.ma;var e=ca(c);b==g&&c.$==g&&(d=e-d);d=z.max(0,d);return d=z.min(e,d)}function ng(a,b){for(var c={},d=a.$?a.Na:a.ea,e=0;e=b&&(c[h]==j&&(c[h]={}),s!=g&&c[h][l]==j&&(s=sa(h),m==aa&&(a.$== +g&&0==f.d)&&(m=f.s),Q(s,l,m)),c[h][l]=g)}}}}function Kc(a,b,c,d){qc[a]=j;var e=S(a);e!=j&&(c&&Qc(e,1),rc(e,b),e.fa==k&&(e.da!=j?e.ma==ca(e)?d&&pb(a,j,b):(e.fa=g,e.da=Pa()/1E3-e.ma/e.ha,n[xa](e.ua),e.ua=n[kb](function(){Rc(e)},1E3*((ca(e)-e.ma)/e.ha)),e.Ra!=g&&(Be(e,e.ma),e.sa=0,e.ya=0,e.ia=[],e.qa=[]),tb(e.ma/e.ha,e,k,k),Dd()):(d==g||0==e.ma)&&pb(a,j,b)))}function qb(a,b){qc[a]=j;var c=S(a);c!=j&&c.fa==g&&(Qc(c,1),c.ma=b!=j?b:Pa()/1E3-c.da,c.fa=k,n[xa](c.ua))}function Rc(a){if(!tb(ca(a),a,g,g))if(Sc(a), +Tc!=j&&Fd==a.aa)a=Tc,Fd=Tc=j,a();else if(a={type:wf,timelineName:a.Ha.n},Gd(a,j)!==k){var b=ya();if(b!=j){var c=v[Hd(Id())].F;c!=j&&Y(b,c.a)(a)}}}function V(a,b){return Ce(a,b.Ha.f)}function Ce(a,b){var c=z.floor(a);return c+z[Ca]((a-c)*b)/b}function ca(a){return V(a.Ha.d,a)}function Dd(){if(Ed!==g){Ed=g;var a=function(a){n[kb](a,1E3/60)};(y.va!=j?a:n.requestAnimationFrame||n.webkitRequestAnimationFrame||n.mozRequestAnimationFrame||a)(function(){Ed=k;lg()})}}function Sc(a){n[xa](a.ua);a.sa=0;a.ya= +0;a.ia=[];a.qa=[];a.Fb=j;a.da=j;a.fa=k;a.ha=1;a.ma=ca(a);a=sb(Fa,a);-1!=a&&Fa[Sb](a,1)}function og(a){for(var b=0;b=b&&(Ia[f]===aa||Ia[f][h]===aa||Ia[f][h]==a.aa))Oa[f][h]=a.aa}og(a)}function pb(a,b,c){qc[a]=j;for(var d=0;dc;c++)b[c]=16*d[Ma](a[Ka](2*c))+d[Ma](a[Ka](2*c+1))}return b}function gg(a){typeof a!=jj&&(a=ha(a));return isNaN(a)?0:a}function rg(a,b,c){Kd=k;c!=j&&delete v[D].T[c];qa(b[L],Ih);Q(b,Ah,0,ah,0);Xa(b,lf,od);Q(b,mh,0,X,0,ck,1,ni,1);c=v[D].a;c!=j?(ia(b[L],td),ia(F[L],c+hc)):(ia(b[L],x(v[D].Y)),ia(F[L],b[L][Ba]));c=v[D].b; +c!=j?(ta(b[L],td),ta(F[L],c+hc)):(ta(b[L],x(v[D].Z)),ta(F[L],b[L][Rb]));Ib[F.id]=j;Ib[b.id]=j;J[O[a.id]]&&(a!=j&&a!=b)&&(qa(a[L],ij),a[B](hh,g),Q(a,Ah,0,ah,0,mh,0,X,0,ck,0,ni,1),Xa(a,lf,od));F[L][hd]=j;F[L][da.la+Tj]=yi;F[L][cd]=j;F[L].perspective=j;c=[];a=v[D].v;for(var d in a)if(a[K](d)!=k){var e=a[d],f=e.cL;if(f){c[A](f);var h=R[f][Gb];J[O[h.id]]=j;var l=p[Ta](e.k);oa(l,e.cP?$e+e.cP:Ze);l.id=h.id;l[L].pointerEvents=lh;for(l[L][nj]=lh;0s;s++)for(var q=0;qz.abs(c.x-Vc[b].x)&& +25>z.abs(c.y-Vc[b].y)&&(a.stopPropagation(),a[La]())}}function ug(a){var b=[],c=v[D].U,d;for(d in c)c[K](d)!=k&&c[d].n==a&&b[A](ub[d]);return b}function Wf(a){var b={type:xf,customBehaviorName:a},c=Qd[a];if(c!=j)for(var d=0;d=d;d++)c[A]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Ca=c;a.Fa=aa;a.Xa=k;var c=a.ga?b[xb][0]:b,e;e=function(b){He(a);a.xa=bi;Td(b,a)};a.ja=e;b=a.ga?a.jb:p;a.ga?za(Oj,a.ja,b,k):n.self!=n.top&&(d=function(a){(a.relatedTarget===p.documentElement||a.toElement=== +j)&&e(a)},a.ja=d,za(bj,d,b,k));c=Od(c);d=a.Ca[0];d[Cb].x=c.x;d.end.x=c.x;d[wa].x=c.x;d[Cb].y=c.y;d.end.y=c.y;d[wa].y=c.y;yg(a,c);a.cb=function(b){if(!(a.xa===ri||a.xa===bi))if(Sd==g)a.ja(b);else{if(a.Qa==k&&(Rd++,a.Qa=g,a[N].ca==li)){Ud=g;if(a[N].pa!=j)for(var c=0;cc,(q||w==k||Ud==g)&&a.ja(b)):a[N].ca==Lj&&5=w?Si:xj:0>=w&&-180<=w?Vj:ki)!=I,G=u/P;else{I=t=sc(d.aa,k);for(u=P=0;ua[N].Oa?(b={type:sf+a[N][va][Ka](0).toUpperCase()+a[N][va][Da](1)+ie},a.eb(b)):a.ja(b)):a[N].ca==Lj?1500>d&&a.eb(b):a.ja(b);He(a)}};za(a.ga?Pj:dj,a.bb,b,k);b.setCapture&&b.setCapture();a.Pa=Pa();a.Za=a.Pa;Ud=Sd=a.Qa=k}}}function He(a){if(a.Xa!=g){a.Xa=g;Ia={};var b=a.ga?a.jb:p;b.releaseCapture&&b.releaseCapture();Xc(a.ga? +Qj:aj,a.cb,b);Xc(a.ga?Pj:dj,a.bb,b);a.ga?Xc(Oj,a.ja,b):Xc(bj,a.ja,b);a[N].ca==li&&(Ud=k);a.Qa==g&&Rd--}}function Td(a,b){b[N].wb==g&&(a.hypeGesturePhase=b.xa,a.hypeGestureXPosition=b.Ca[0].end.x,a.hypeGestureYPosition=b.Ca[0].end.y,b.eb(a))}function Xc(a,b,c){c[lb]?c[lb](a,b,k):c[Eb]&&c[Eb](kj+a,b)}function za(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Vd[A](e);c[Ua]?c[Ua](a,b,k):c[bb]&&c[bb](kj+a,b)}function Od(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hb]||a[ib])b.x= +a[hb]+p[zb].scrollLeft+p.documentElement.scrollLeft,b.y=a[ib]+p[zb].scrollTop+p.documentElement.scrollTop;return b}function Ag(a){var b;0==a.c?0==a.A?b=xj:1==a.A&&(b=Si):1==a.c&&(0==a.A?b=Vj:1==a.A&&(b=ki));return b}function yg(a,b){var c=a[N][va]==xj||a[N][va]==Si?b.x:b.y;a.Fa=a.Fa==aa?c:a[N][va]==xj||a[N][va]==ki?z.max(a.Fa,c):z.min(a.Fa,c)}function zg(a,b,c){a=z[Ca](180*z.atan2(b.y-a.y,b.x-a.x)/z.PI);c=z.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Si;if(a<=45-c&&a>=-45+c)return xj;if(a<-45- +c&&a>-135+c)return Vj;if(a>45+c&&a<135-c)return ki}function oe(a){for(var b=tc[a],c={},d=0;d=Mb[C]&&Cg()}function lk(a){var b=U[a].p;if(1==b)if(b=U[a].g,b!=j&&Bg(b)!=a)Ke(a);else{var c=new Image,b=function(b){c=this;if((y.Wa!=j||y.pb!=j&&y.va==j)&&b[ab]==Ui&&-1!=jc[Ma](mi)&&-1==c.src[Ma](md))try{var d=p[Ta](di);ia(d,c[Ba]);ta(d,c[Rb]);d.getContext(ud).drawImage(c, +0,0);Dg[c.Eb]=d.toDataURL()}catch(h){}Ke(a)},d=Wd(a);c.onload=b;c.onerror=b;c.onabort=b;c.src=d;c.Eb=a}else 2==b&&(b=function(){for(var b=tc[U[a].g],c=0;cha(y.na)||9>y.oa?n[kb](b,1):d.load(b,b))}function Cg(){wd!=j&&wd(k,F);if(Gd({type:pf},F)!==k)if(-1==ne)Hb(Nb);else{Yc=g;for(var a=-1,b=0;bc&&(c=f),ia(F[L],x(c)),Ib[F.id]=j,F[L].margin==lh&&(la&&(a=h),ta(F[L],x(a)))}function vc(a){var b=F[Qb].offsetHeight,c=v[a].b;return c!=j?c/100*b:v[a].Z}function uc(a){var b=F[Qb][Ja],c=v[a].a;return c!=j?c/100*b:v[a].Y}function Le(a,b,c,d){if(!(Eg(a)==j||Kd== +g)){c==j&&(c=1.1);c=Ce(c,60);Kd=g;var e=function(){d!=j&&d();Qa=[];Qd={};var e=ya();nc=v[a].a!=j||v[a].b!=j?g:k;var f=Eg(a),h=D,l=ya();if(l!=j){for(var m=l[gb](Zj),r=0;r$&&($=r[L][fb]))}else t[A]({container:r,domElement:S,sceneElement:w}); +R[l].mb==k&&(tg(r,g),R[l].mb=g)}for(r=0;rh?H:h,J[G].a=0,J[G].b=0)):(Zc(e,T,g,k),H!=h&&(U[A](db(hi,0,fa,Qh,G,H,h)),J[G]={},J[G].c=ma>Z?ma:Z,J[G].d=H,J[G].a=0,J[G].b=0)),q=X,f=Z,s=-1*Z,5==b?(f=-1*ma,s=ma):6==b?(q=mh,f=-1*H,s=H):7==b&&(q=mh,f=h,s=-1*h),e!=j&&(t=O[e.id],Q(e,Qh,ma,hi,H),U[A](db(q,0,fa,Qh,t,0,f))),U[A](db(q,0,fa,Qh,O[T.id],s,0)),Q(T,Qh,Z,hi,h,q,s),Me(jf,fa,U,e,T),qa(T[L],Ih)):(Zc(e,T,k,k),rg(e,T,j));Ob()},f=k,h= +ya();h[B](hh,g);if(Fg==g&&h!=j){var h=Hd(Id()),l={type:rf};if(Gd(l,j)!==k){var m=v[h].B;if(m!=j){for(var s=m.a,q=Y(ya(),s),m=0;ml;l++){var m=jg(e,l/99),s={};s.location=m;b&&(h=Ie(m,h),f+=h,na(s,h)); +e.ba[A](s);h=m}c+=f;na(e,f)}return c}function jg(a,b){var c=xc(a.ta,a.Ga,b),d=xc(a.Ga,a.Ba,b),e=xc(a.Ba,a.Ja,b),f=xc(c,d,b),d=xc(d,e,b),f=xc(f,d,b),h=k,l=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?l=e:(l=c,h=g));f.za=ig(f,l);h==g&&(f.za+=180);return f}function ig(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*z.atan((b.y-a.y)/(b.x-a.x))/z.PI;b.xc)break;b=e}}return b}function bg(a){var b=Kb[Id()];a!=j&&(b=Kb[a]);a=Ib[b];a==j&&(a=p[Ha](b),a={width:a[Ja],height:a.offsetHeight},Ib[b]=a);return a}function ag(a){var b=0,c=0;a==j?(b=v[D].Y,c=v[D].Z):(b=Oc(a),c=Pc(a));return{width:b,height:c}}function se(a){return(y.na!=j||3.5<=y.Ka||10<=y.oa)&&u(a,lf)==rd}function kg(){Cd=k;we=g;for(var a in Nc)Nc[K](a)&&pc(Nc[a]);we=k;xe();Nc={}}function xe(){n[kb](function(){Jc!= +j&&(Oe?Pe=g:(Oe=g,Jc.refreshAll(),Oe=k,Pe&&(Pe=k,xe())))},0)}function Qe(a,b,c){var d=b;if(d==j||p[Ha](d)!=j){do d=c+Lg();while(p[Ha](d)!=j)}Kb[a]=d;O[d]=a;return Re[b!=j?b:d]=d}function sa(a){return p[Ha](Kb[a])}function Pa(){return Date.now()}function Lg(){for(var a=W,b=da.Ya+We,c=0;20>c;c++)var d=z.floor(z.random()*b[C]),a=a+b.substring(d,d+1);return a}function kk(a){var b=this;Je[a]=b;b.qb=function(){var a=p[Ta](jh);b.Aa=a;for(var d=b.rb(),e=0;ey.oa){var c=function(b){b=b?b:n[Tb];if(a[L][nj]==ij){var c=a[L].display;qa(a[L], +ij);var f=p.elementFromPoint(b[hb],b[ib]);qa(a[L],c?c:W);p.createEvent&&(b[La](),c=p.createEvent(Af),c.initMouseEvent(b[ab],b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hb],b[ib],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,j),f.dispatchEvent(c))}};za(zf,c,a,g);za(dj,c,a,g);za($i,c,a,g);za(ei,c,a,g)}}},Je={},yc=j;da.API={kSceneTransitionInstant:1,kSceneTransitionCrossfade:2,kSceneTransitionSwap:3,kSceneTransitionPushLeftToRight:4,kSceneTransitionPushRightToLeft:5,kSceneTransitionPushBottomToTop:6, +kSceneTransitionPushTopToBottom:7,kHypeGesturePhaseStart:Ej,kHypeGesturePhaseMove:ej,kHypeGesturePhaseEnd:ri,kHypeGesturePhaseCancel:bi,documentName:function(){return $},documentId:function(){return G},sceneNames:Hg,currentSceneName:function(){return Wa[Nb].n},showSceneNamed:function(a,b,c){a=sb(Hg(),a);Hb(a,b,c)},showNextScene:Tf,showPreviousScene:Uf,playTimelineNamed:qg,startTimelineNamed:qg,goToTimeInTimelineNamed:function(a,b){var c=vb(b);c==j&&(c=Ni);kc(a,c,k)},pauseTimelineNamed:function(a){a= +vb(a);a==j&&(a=Ni);qb(a,j)},continueTimelineNamed:function(a,b,c){a=vb(a);a==j&&(a=Ni);b==aa&&(b=0);Kc(a,1==b?g:k,g,c)},getElementById:function(a){var b=Re[a];b==j&&(b=a);return p[Ha](b)},setElementProperty:function(a,b,c,d,e){var f={easein:hi,easeout:ni,easeinout:Qh,linear:mh};b=Mg[b];if(b!=j){var h=b.HYP_r,l=O[a.id];b=W+l+h;0 + + + + + + + + diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 3-1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 3-1.svg new file mode 100644 index 0000000000..834ace2e52 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 3-1.svg @@ -0,0 +1,10 @@ + + + + Path 3 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 4-1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 4-1.svg new file mode 100644 index 0000000000..78ca943de3 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 4-1.svg @@ -0,0 +1,10 @@ + + + + Path 4 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 7-1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 7-1.svg new file mode 100644 index 0000000000..8969071bf6 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Path 7-1.svg @@ -0,0 +1,10 @@ + + + + Path 7 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1.png new file mode 100644 index 0000000000..1d5ba4ff72 Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1_2x.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1_2x.png new file mode 100644 index 0000000000..3fed2bf8e2 Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 1_2x.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2.png new file mode 100644 index 0000000000..f254d413ee Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2_2x.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2_2x.png new file mode 100644 index 0000000000..3452de7d3c Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Planet 2_2x.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 1.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 1.svg new file mode 100644 index 0000000000..8bcbf10da8 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 1.svg @@ -0,0 +1,12 @@ + + + + Ray 1 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 2.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 2.svg new file mode 100644 index 0000000000..a2d6a816d3 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 2.svg @@ -0,0 +1,12 @@ + + + + Ray 2 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 3.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 3.svg new file mode 100644 index 0000000000..958b2788cf --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 3.svg @@ -0,0 +1,12 @@ + + + + Ray 3 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 4.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 4.svg new file mode 100644 index 0000000000..3407dbc615 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 4.svg @@ -0,0 +1,12 @@ + + + + Ray 4 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 5.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 5.svg new file mode 100644 index 0000000000..2643d1a531 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 5.svg @@ -0,0 +1,12 @@ + + + + Ray 5 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 6.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 6.svg new file mode 100644 index 0000000000..94383f9602 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Ray 6.svg @@ -0,0 +1,12 @@ + + + + Ray 6 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 2.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 2.svg new file mode 100644 index 0000000000..5e6168f2b6 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 2.svg @@ -0,0 +1,10 @@ + + + + Star 1 Copy 2 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 5.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 5.svg new file mode 100644 index 0000000000..a883772628 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 5.svg @@ -0,0 +1,10 @@ + + + + Star 1 Copy 5 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 7.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 7.svg new file mode 100644 index 0000000000..4746028dd5 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 7.svg @@ -0,0 +1,12 @@ + + + + Star 1 Copy 7 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 8.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 8.svg new file mode 100644 index 0000000000..88e788f268 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 8.svg @@ -0,0 +1,12 @@ + + + + Star 1 Copy 8 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 9.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 9.svg new file mode 100644 index 0000000000..18ade57207 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy 9.svg @@ -0,0 +1,12 @@ + + + + Star 1 Copy 9 + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy.svg new file mode 100644 index 0000000000..27b25e8f82 --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star 1 Copy.svg @@ -0,0 +1,10 @@ + + + + Star 1 Copy + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star.svg b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star.svg new file mode 100644 index 0000000000..56e0b62c8f --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/Star.svg @@ -0,0 +1,17 @@ + + + + Star + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/blank.gif b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/blank.gif new file mode 100644 index 0000000000..f191b280ce Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/blank.gif differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet.png new file mode 100644 index 0000000000..0e62b7ecda Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet_2x.png b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet_2x.png new file mode 100644 index 0000000000..1ed31d127d Binary files /dev/null and b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/comet_2x.png differ diff --git a/static/animations/inbox-zero/galaxy/galaxy.hyperesources/galaxy_hype_generated_script.js b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/galaxy_hype_generated_script.js new file mode 100644 index 0000000000..130ee716db --- /dev/null +++ b/static/animations/inbox-zero/galaxy/galaxy.hyperesources/galaxy_hype_generated_script.js @@ -0,0 +1,7 @@ +// HYPE.documents["Galaxy"] + +(function(){(function k(){function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=[],window[b].push(k),a=document.getElementsByTagName("head")[0],b=document.createElement("script"),c=h,false==!0&&(c=""),b.type="text/javascript",b.src=c+"/"+d,a.appendChild(b)):window[b].push(k),c=!0);return c}var h="Galaxy.hyperesources",c="Galaxy",e="galaxy_hype_container";if(false==!1)try{for(var f=document.getElementsByTagName("script"), +a=0;aa||false==!0)?"HYPE-526.full.min.js":"HYPE-526.thin.min.js"),false==!0&&(a=a||l("HYPE_w_526","HYPE_wdtl_526","HYPE-526.waypoints.min.js")),a))return; +f=window.HYPE.documents;if(null!=f[c]){b=1;a=c;do c=""+a+"-"+b++;while(null!=f[c]);for(var d=document.getElementsByTagName("div"),b=!1,a=0;a + + + + + GEM Slower + + + + + + + + + + +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + diff --git a/static/animations/inbox-zero/gem/gem.hyperesources/HYPE-526.full.min.js b/static/animations/inbox-zero/gem/gem.hyperesources/HYPE-526.full.min.js new file mode 100644 index 0000000000..5e4ba04454 --- /dev/null +++ b/static/animations/inbox-zero/gem/gem.hyperesources/HYPE-526.full.min.js @@ -0,0 +1,183 @@ +(function(){var ca=void 0,h=!0,j=null,m=!1,ga=encodeURIComponent,p=window,ha=Object,ja=Infinity,s=document,u=Math,ka=Number,na=navigator,oa=parseInt,pa=parseFloat;function ra(L,C){return L.width=C}function sa(L,C){return L.innerHTML=C}function ua(L,C){return L.speed=C}function va(L,C){return L.left=C}function wa(L,C){return L.loop=C}function ya(L,C){return L.play=C}function za(L,C){return L.zIndex=C}function Aa(L,C){return L.length=C}function Ba(L,C){return L.position=C} +function Da(L,C){return L.className=C}function Ea(L,C){return L.pause=C}function Fa(L,C){return L.MozPerspective=C}function Ga(L,C){return L.backgroundImage=C}function Ia(L,C){return L.display=C}function Ma(L,C){return L.height=C} +var Na="appendChild",D="push",Oa="direction",Pa="lastPosition",Qa="clearTimeout",Ra="width",Sa="round",Xa="slice",Ya="replace",Za="toFixed",$a="timestamp",ab="ceil",bb="floor",cb="getElementById",ib="offsetWidth",jb="concat",kb="list",pb="extend",qb="charAt",rb="preventDefault",sb="region",tb="button",ub="indexOf",vb="speed",wb="embeds",Bb="MAX_VALUE",Cb="opera",Db="createElement",Eb="atan2",Fb="identifier",Gb="sqrt",Hb="addEventListener",Ib="setAttribute",Jb="play",Kb="parentElement",Ob="type",Pb= +"translate",Qb="clear",Rb="childNodes",Sb="Play",Tb="attachEvent",bc="source",cc="changedTouches",dc="zIndex",ec="keys",fc="getElementsByTagName",gc="MIN_VALUE",hc="clientX",ic="clientY",jc="toString",H="length",I="position",kc="create",sc="className",tc="index",uc="clientWidth",vc="setTimeout",wc="removeEventListener",xc="split",yc="duration",zc="userAgent",Ac="location",Bc="rotate",K="hasOwnProperty",Cc="touches",O="style",Dc="pause",Ec="body",Fc="ownerDocument",Gc="removeChild",Hc="search",Tc= +"group",U="options",Uc="start",Vc="getAttribute",Wc="detachEvent",Xc="clientHeight",Yc="console",Zc="contains",$c="element",ad="startTime",bd="parentNode",cd="update",dd="height",ed="splice",fd="event",Z="",gd="\n",hd=" ",id=" -webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(",jd=" : ",kd=" rotate(",ld=" rotateX(",md=" rotateY(",nd=" rotateY(0) ",od=" scaleX(",pd=" scaleY(",qd=" translateX(",rd=" translateY(",Hd=" translateZ(",Id="#",Jd="#4ECDC4",Kd="#556270",Ld="#666",Md= +"#C44D58",Nd="#C7F464",Od="#FF6B6B",Pd="#eeeeee",Qd="%",Rd="%25",Sd="%27",Td="%c [Matter] ",Ud="&",Vd=" ",Wd="')",Xd="'>",Yd="'autoplay='false'class='video'>",Zd="'classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'codebase='http://apple.com/qtactivex/qtplugin.cab'width='",$d="'controller='",ae="'enablejavascript='true'postdomevents='true'scale='tofit'name='embedobj_",xe="'height='",ye="'id='embedobj_",ze="'loop='",Ae="'volume='",Be="(",Ce=")",De=") ",Ee="*",Fe=",",Ge=",M12=", +He=",M21=",Ie=",M22=",Je=",SizingMethod='auto expand')",Ke=",transparent),to(rgba(255,255,255,.5)))",Le="-10000",Me="-bottom",Ne="-moz-",Oe="-moz-perspective",Pe="-ms-transform",Qe="-ms-transform-origin",Re="-o-",Se="-pie-background",Te="-webkit-",Ue="-webkit-perspective",Ve="-webkit-tap-highlight-color",We="-webkit-transform",Xe=".",Ye=".AlphaImageLoader(sizingMethod='scale',src='",Ze=".HYPE_element{-webkit-transform:rotateY(0);}video.HYPE_element{-webkit-transform:none;}^{color:#000;`size:16px;`weight:normal;`family:Helvetica,Arial,Sans-Serif;`weight:normal;`style:normal;`variant:normal;text-decoration:none;text-align:left;text-transform:none;text-indent:0;text-shadow:none;line-height:normal;letter-spacing:normal;white-space:normal;word-spacing:normal;@:baseline;border:none;background-color:transparent;background-image:none;-webkit-`smoothing:antialiased;-moz-backface-visibility:hidden;}", +$e=".HYPE_scene ",af=".Matrix(M11=",bf=".gif",cf=".gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)",df=".png",ef="/",Xf="/PIE.htc')",Yf="/blank.gif",Zf="0",$f="0.0",ag="0123456789ABCDEF",bg="0px",cg="1",dg="1.0",eg="100",fg="100%",gg="2d",hg="50%",ig="600px",jg=": ",kg="
",lg="",mg="
",ng="', +qg="=",rg="?",sg="@1x",tg="@2x",ug="APPLY ERR ",vg="Action",wg="Alpha(Opacity=",xg="Android",yg="BD",th="BODY",uh="BackCompat",vh="Body",wh="Composite",xh="Constraint",yh="Error in ",zh="False",Ah="GET",Bh="GHIJKLMNOPQRSTUVWXYZ",Ch="HYPE_element",Dh="HYPE_element ",Eh="HYPE_element HYPE_scene",Fh="HYPE_element HYPE_scene ",Gh="HYPE_element Hype_scene ",Hh="HYPE_element_container",Ih="HYPE_persistent_symbols",Jh="HYPE_scene",Kh="HYPE_scene_index",Lh="HYP_a",Mh="HYP_b",Nh="HYP_c",Oh="HYP_d",Ph="HYP_e", +Qh="HYP_f",Rh="HYP_g",Sh="HYP_h",Th="HYP_i",Uh="HYP_j",Vh="HYP_k",Wh="HYP_l",Xh="HYP_m",Yh="HYP_n",Zh="HYP_o",$h="HYP_p",ai="HYP_q",bi="HYP_t",ci="HYP_u",di="HypeDocumentLoad",ei="HypeSceneLoad",fi="HypeSceneUnload",gi="HypeSwipe",hi="HypeSymbolLoad",ii="HypeSymbolUnload",ji="HypeTimelineAction",ki="HypeTimelineComplete",li="HypeTriggerCustomBehavior",mi="L ",ni="L 0 0 L 40 0 L 40 40 L 0 40",oi="M",pi="MSPointerUp",qi="MouseEvents",ri="MozBoxShadow",si="N",ti="O",ui="P",vi="Q",wi="R",xi="S",yi="T", +zi="True",Ai="U",Bi="V",Ci="W",Di="World",Ei="YES",Kj="^div,^span,^applet,^object,^iframe,^h1,^h2,^h3,^h4,^h5,^h6,^p,^blockquote,^pre,^a,^abbr,^acronym,^address,^big,^cite,^code,^del,^dfn,^em,^img,^ins,^kbd,^q,^s,^samp,^small,^strike,^strong,^sub,^sup,^tt,^var,^b,^u,^i,^center,^dl,^dt,^dd,^ol,^ul,^li,^fieldset,^form,^label,^legend,^table,^caption,^tbody,^tfoot,^thead,^tr,^th,^td,^article,^aside,^canvas,^details,^embed,^figure,^figcaption,^footer,^header,^hgroup,^menu,^nav,^output,^ruby,^section,^summary,^time,^mark,^audio,^video{color:?;`size:?;`weight:?;`family:?;`weight:?;`style:?;`variant:?;text-decoration:?;text-align:?;text-transform:?;text-indent:?;text-shadow:?;line-height:?;letter-spacing:?;white-space:?;word-spacing:?;@:?;border:none;background-color:transparent;background-image:none;padding:0;box-sizing:content-box;}^p{display:block;$:1em 0;}^div,^layer{display:block;}^article,^aside,^footer,^header,^hgroup,^nav,^section{display:block;}^blockquote{display:block;$:1em 40px;}^figcaption{display:block;}^figure{display:block;$:1em 40px;}^q{display:inline;}^q:before{content:open-quote;}^q:after{content:close-quote;}^center{display:block;text-align:center;}^hr{display:block;$:.5em auto;border-style:inset;border-width:1px;}^h1,^h2,^h3,^h4,^h5,^h6{display:block;$-left:0;$-right:0;`weight:bold;}^h1{`size:2em;$-top:.67em;$|:.67em;}^h2{`size:1.5em;$-top:.83em;$|:.83em;}^h3{`size:1.17em;$-top:1em;$|:1em;}^h4{$-top:1.33em;$|:1.33em;}^h5{`size:.83em;$-top:1.67em;$|:1.67em;}^h6{`size:.67em;$-top:2.33em;$|:2.33em;}^table{display:table;border-collapse:separate;border-spacing:2px;border-color:gray;}^thead{display:table-header-group;@:middle;border-color:?;}^tbody{display:table-row-group;@:middle;border-color:?;}^tfoot{display:table-footer-group;@:middle;border-color:?;}^col{display:table-column;}^colgroup{display:table-column-group;}^tr{display:table-row;@:?;border-color:?;}^td,^th{display:table-cell;@:?;}^th{`weight:bold;}^caption{display:table-caption;text-align:center;}^ul,^menu,^dir{display:block;list-style-type:disc;$:1em 0;padding-left:40px;}^ol{display:block;list-style-type:decimal;$:1em 0;padding-left:40px;}^li{display:list-item;$:0;}^ul ul,^ol ul{list-style-type:circle;}^ol ol ul,^ol ul ul,^ul ol ul,^ul ul ul{list-style-type:square;}^dd{display:block;$-left:40px;}^dl{display:block;$:1em 0;}^dt{display:block;}^ol ul,^ul ol,^ul ul,^ol ol{$-top:0;$|:0;}^u,^ins{text-decoration:underline;}^strong,^b{`weight:bolder;}^i,^cite,^em,^var,^address{`style:italic;}^tt,^code,^kbd,^samp{`family:monospace;}^pre,^xmp,^plaintext,^listing{display:block;`family:monospace;white-space:pre;$:1em 0;}^mark{background-color:yellow;color:black;}^big{`size:larger;}^small{`size:smaller;}^s,^strike,^del{text-decoration:line-through;}^sub{@:sub;`size:smaller;}^sup{@:super;`size:smaller;}^nobr{white-space:nowrap;}^a{color:blue;text-decoration:underline;cursor:pointer;}^a:active{color:red;}^noframes{display:none;}^frameset,^frame{display:block;}^frameset{border-color:?;}^iframe{border:0;}^details{display:block;}^summary{display:block;}", +Lj="_",Mj="_blank",Nj="a",Oj="aA",Pj="aB",Qj="aC",Rj="aD",Sj="aE",Tj="aI",Uj="aJ",Vj="aK",Wj="aL",Xj="aM",Yj="aN",Zj="aS",$j="aT",ak="aU",bk="aV",ck="aW",dk="aX",ek="aY",fk="aZ",gk="abort",hk="absolute",ik="acC",jk="afterAdd",kk="afterRemove",lk="afterRender",mk="afterUpdate",nk="alt",ok="aria-busy",pk="aria-flowto",qk="aria-hidden",rk="arraybuffer",sk="audio",tk="audio/ogg",uk="auto",vk="autoplay",wk="autostart",xk="b",yk="bA",zk="bB",Ak="bC",Bk="bF",Ck="bG",Dk="bH",Ek="bI",Fk="bJ",Gk="bK",Hk="bL", +Ik="bM",Jk="bN",Kk="bO",Lk="bP",Mk="bQ",Nk="bR",Ok="bS",Pk="bT",Qk="bU",Rk="bV",Sk="bW",Tk="backdrop-filter",Uk="background-origin",Vk="background-size",Wk="bcC",Xk="beforeAdd",Yk="beforeRemove",Zk="beforeRender",$k="beforeUpdate",al="below ",bl="block",cl="blur(",dl="body",el="body=",fl="boolean",gl="border-radius",hl="box-reflect",il="box-shadow",jl="boxShadow",kl="brightness(",ll="button",ml="c",nl="cB",ol="cC",pl="cD",ql="cF",rl="cG",sl="cH",tl="cI",ul="cJ",vl="cK",wl="cL",xl="cQ",yl="cR",zl= +"cT",Al="cW",Bl="cX",Cl="cY",Dl="cancel",El="canplaythrough",Fl="canvas",Gl="click",Hl="collisionActive",Il="collisionEnd",Jl="collisionStart",Kl="color: coral",Ll="color: red",Ml="composite",Nl="constraint",Ol="contrast(",Pl="controller",Ql="controls",Rl="d",Sl="deg",Tl="deviceorientation",Ul="div",Vl="down",Wl="drag",Xl="dropbox.com",Yl="e",Zl="element",$l="embed",am="embedobj_",bm="end",cm="enter",dm="error",em="exit",fm="f",gm="false",hm="fcC",im="file://",jm="filter",km="flat",lm="font-",mm= +"function",nm="head",om="height",pm="hidden",qm="href",rm="http://",sm="hue-rotate(",tm="hype-obj-",um="hype-scene-",vm="iPad",wm="iPhone",xm="iPod",ym="ibooksimg://",zm="img",Am="img_",Bm="inherit",Cm="j",Dm="kTimelineDefaultIdentifier",Em="kTimelinePhysicsIdentifier: ",Fm="keydown",Gm="keypress",Hm="keyup",Im="l",Jm="left",Km="linear-gradient(",Lm="load",Mm="loop",Nm="m",Om="mailto:",Pm="margin",Qm="mouseConstraint",Rm="mouseclick",Sm="mousedown",Tm="mousemove",Um="mouseout",Vm="mouseover",Wm="mouseup", +Xm="move",Ym="mozHidden",Zm="mozvisibilitychange",$m="msHidden",an="msvisibilitychange",bn="mute",cn="n",dn="no",en="no-repeat",fn="none",gn="number",hn="object",jn="on",kn="onresize",ln="pageshow",mn="pointer-events",nn="pointerup",on="preserve-3d",pn="progid:DXImageTransform.Microsoft",qn="px",rn="px) ",sn="r",tn="resize",un="rgb",vn="rgba",wn="rgba(",xn="rgba(0,0,0,0)",yn="right",zn="role",An="saturate(",Bn="script",Cn="sepia(",Dn="source",En="src",Fn="start",Gn="string",Hn="subject=",In="swipe", +Jn="tX",Kn="tY",Ln="tabindex",Mn="tap",Nn="target",On="title",Pn="touchcancel",Qn="touchend",Rn="touchmove",Sn="touchstart",Tn="transform-origin",Un="transform-style",Vn="true",Wn="type",Xn="up",Yn="url('",Zn="user-select",$n="vertical-align",ao="video",bo="video/ogg",co="video/quicktime",eo="video/webm",fo="visibilitychange",go="warn",ho="webkitHidden",io="webkitvisibilitychange",jo="width",ko="www.",lo="x-ibooks-th://",mo="z";function no(){return function(){}} +p.HYPE_526=function(L,C,La,Ub,Fi,Gi,Lb,x,lc,qo,ff,gf,qa,Hi,zg,hf,ro,so,be){function Ii(a,b,c){var d=ka[Bb],e={x:0,y:0};b=b.aa;a=a[I];for(var f,g,k=b[0],n=b[1],n=0;ne?e=g:g=g){f.nb=g;break}g=a&&(a=1E-6);1==c&&(d=0,e=1,a=ja);b.Xa=d;b.La=e;b.sc=f;V.$a.Xd(b, +a)}}function Ic(a){var b,c,d=sd(a);if(!(qa!=h||a==j||kf==h||d==j||d.Vc==h)){var e=d.ub.ma,f=R[a.id],g=d.yc[f],k=t(a,Ik,0);if(!(0==k&&g==j)){Li(a)==h&&(k=1);var n=t(a,Qk,0.5),q=t(a,Rk,0.1),w=t(a,zl,0.01),l=t(a,Sk,0.0010);0>=l&&(l=1E-6);1==k&&(n=0,q=1,l=ja);var v=t(a,ik,0),Q=t(a,Wk,0),M=t(a,hm,0);b=[1,0,0,1,0,0];c=Bg(a);c[D](a);for(var J=0;JF;F+=G){var P=r*V.Ja.cos(F*u.PI/180)+(d-r),E=y*V.Ja.sin(F*u.PI/180)+y;lb(ba,P*f,E*aa)}lb(ba,d*f,y*aa); +lb(ba,d*f,(e-B)*aa);if(0F;F+=G)P=C*V.Ja.cos(F*u.PI/180)+(d-C),E=B*V.Ja.sin(F*u.PI/180)+(e-B),lb(ba,P*f,E*aa)}lb(ba,(d-C)*f,e*aa);lb(ba,$*f,e*aa);if(0<$||0F;F+=G)P=$*V.Ja.cos(F*u.PI/180)+$,E=x*V.Ja.sin(F*u.PI/180)+(e-x),lb(ba,P*f,E*aa)}lb(ba,0,(e-x)*aa);lb(ba,0,z*aa);if(0F;F+=G)P=A*V.Ja.cos(F*u.PI/180)+A,E=z*V.Ja.sin(F*u.PI/180)+z,lb(ba,P*f,E*aa)}d=Z;for(e=0;e=aa?J:aa),F=b*N,N*=g,b=Q-F,g=v-N,n==h&&l==m?k-=b:n==h&&l==h&&(k-=b/2),q==h&&w==m?c-=g:q==h&& +w==h&&(c-=g/2));b=k}t(f,$h,m)==m&&(Y(f,Jn,0.5),Y(f,Kn,0.5),ia(f,$h,h));Y(f,Nj,b);Y(f,xk,c);Y(f,fm,d[Za](6))}}function Oi(a,b){of=a.Vc=h;var c=u[ab](1E3/60),d=u[bb](1E3*b),e=d-a.Md;a.Md=d;a.hc+=u[bb](e);for(d=0;a.hc>=c&&20>d;)V.Fc[cd](a.ub,c),a.hc-=c,d+=1;V.Fc.ya(a.ub);Hg();a.Vc=m}function pf(a){a=V.zb.Ga(a.ub.ma);for(var b=0;bd?u.PI:0))*(180/u.PI);a.Fd=u[Gb](c*c+d*d);d=a[Fb];qf(d)==h&&(c=rf(d)*a.Fd,d=sf(d)+a.Ed,a.ub.ma.Ub.x=c*V.Ja.cos(d*u.PI/180),a.ub.ma.Ub.y=c*V.Ja.sin(d*u.PI/180));pf(a);Kc()}}function tf(a){for(var b=a;b!=j;){a=t(b,Bk);a==j&&(b=x[G].v[R[b.id]],b!=j&&(a=b.bF));a=Ja(a);if(a==j)break;b=a;if(Eg(b)==h)return b}return j}function Eg(a){return x[G].U[R[a.id]]!=j||t(a,wl)!=j?h:m}function sd(a){a=tf(a);return Ig(a!=j?a.id:j)}function Ig(a){a==j&&(a=C);for(var b=0;bz.ca?e||4==c[tb]:e||1==c[tb]||c.metaKey==h)?9>z.ca||z.Rd||z.Cb!=j?p.open(f,Mj):(9==z.ca||15>z[Cb])&&!(c instanceof MouseEvent)?p.open(f,Mj):(e=s[Db](Nj),e[Ib](qm,f),e[Ib](Nn,Mj),s[Ec][Na](e),f=s.createEvent(qi),f.initMouseEvent(Gl,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hc],c[ic],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c[tb],s[Ec][bd]),e.dispatchEvent(f),s[Ec][Gc](e)):p.top.location= +f);else if(6==f){g=e.l;k=e.m;e=e.n;f=Om;g!=j&&(f+=escape(g));if(k!=j||e!=j)f+=rg,g=[],k!=j&&g[D](Hn+ga(k)),e!=j&&g[D](el+ga(e)),f+=g.join(Ud);f!=Om&&(p.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=h&&(e=m),f!=j&&(f=Mg(f),wa(f,e),f[Jb]())):13==f?(f=e.o,f!=j&&Mg(f)[Dc]()):14==f&&(e=e.B,e!=j&&Ui(e))}}}function vf(a,b){return function(c){Ng(c,b,R[a.id])}}function Og(a,b){return function(c){Vi(c,b,R[a.id])}}function wf(a){var b=t(a,Vj,Zf),c=t(a,Wj,Zf),d=t(a,Tj,Zf),e=t(a,Uj,Zf),b=typeof b!=gn?b:F(b),c=typeof c!= +gn?c:F(c),d=typeof d!=gn?d:F(d),e=typeof e!=gn?e:F(e);a[O][gl]=Z+b+hd+c+hd+e+hd+d}function ee(){}function Wi(a){var b=t(a,dk,8),c=t(a,ck,0);z.vd==j&&(1==1-c&&a[O].removeProperty!=j?a[O].removeProperty(ma.Oa+hl):a[O][ma.Oa+hl]=al+F(b)+id+(1-c)+Ke)}function Pg(a){var b=t(a,Bi);if(b!=j){var c=Z;b==cg?c=Ti(t(a,Ci)):b==Zf&&(c=Z+Ub+ef+t(a,Ai));b=og+c+Xd;z.kb!=j&&(b=mg+b+kg);sa(a,b)}}function Xi(a,b){var c=b==h?yg:Z,d=t(a,c+Hk,0),e=t(a,c+Ck,0),f=t(a,c+Dk,0),g=t(a,c+Ek,1),k=t(a,c+Fk,1),c=t(a,c+Gk,1),n=Z; +0!=d&&(n+=cl+d+rn);0!=e&&(n+=Cn+e+De);0!=f&&(n+=sm+(Z+f+Sl)+De);1!=g&&(n+=An+g+De);if(1!=k){if(6==z.Wd||z.kb!=j&&536.26>=pa(z.Ra))k-=1,1z.ca||(0!=k?c+=md+(Z+k+Sl)+De:b==h&&(1==w&&1==l&&v==m)&&(c+=nd),0!=g&&(c+=ld+(Z+g+Sl)+De));1!=w&&(c+=od+w+De);1!=l&&(c+=pd+l+De);b=Z+(Z+100*Q+Qd)+hd+(Z+100*M+Qd);a[O][ma.Oa+Tn]=b;a[O].MozTransformOrigin=b;a[O].OTransformOrigin=b;a[O][Qe]=b;a[O][Tn]=b; +a[O][We]=c;a[O].MozTransform=c;a[O].OTransform=c;a[O][Pe]=c;a[O].transform=c}function xd(a){9>z.ca?fe(a):ge(a);qa==h&&Ic(a)}function Rg(a){function b(a,b){return Z+a+Km+(Z+(b==h?(u.abs(e)+180)%360:(360-u.abs(e)+270)%360)+Sl)+Fe+xb(c)+Fe+xb(d)+Ce}var c=t(a,cn);if(!(c==j||c==Z)){var d=t(a,Nm);if(!(d==j||d==Z)){var e=t(a,Im);e!=j&&(z.Ra!=j?Ga(a[O],b(ma.Oa,m)):z.xe!=j?Ga(a[O],b(Ne,m)):10>z.ca?a[O][Se]=b(Z,m):Ga(a[O],15>z[Cb]?b(Re,m):b(Z,h)))}}}function Yi(a){Ia(a[O],t(a,Cl,m)==h?fn:t(a,sn,Z));Sg(R[a.id])} +function Mb(a){Mc[a.id]=j;Nc(a)}function Nc(a){try{if(of==h)he[a.id]=a;else{var b=t(a,Ok,36),c=Qg(a),d=R[a.id],e=mf(d),f=nf(e),g=Gg(e),k=nf(d),n=t(a,Nj,0),q=t(a,xk,0),w=t(a,ml,j),l=t(a,Rl,j),v=e=h;w==j&&(e=m,w=k[Ra]);l==j&&(v=m,l=k[dd]);var Q=Vb(d),M=Wb(d),J=M-l,d=n,k=q,N=Q,A=M,r=m;if(Jc==h&&36!=b){var da=0!=(b&1),$=0!=(b&4),x=0!=(b&2),C=0!=(b&8),y=0!=(b&32),B=0!=(b&16),G=0!=(b&64)&&x==h&&B==h,E=0!=(b&128)&&x==h&&B==h,r=0!=(b&256)&&(x==h||B==h),ba=g[Ra]/f[Ra],T=g[dd]/f[dd];x==h&&(N=da==h&&$==h?Q+ +(g[Ra]-f[Ra]):u[ab](Q*ba));da==h&&$==h&&x==m?(b=n+Q/2,d=u[ab](b*ba-Q/2)):da==h&&$==m&&x==h?d=g[Ra]-f[Ra]+n-(N-Q):da==h&&$==m?d=g[Ra]-f[Ra]+n:da==m&&$==m&&(d=u[ab](n*ba));B==h&&(A=C==h&&y==h?M+(g[dd]-f[dd]):u[ab](M*T));C==h&&y==h&&B==m?k=u[ab]((q+M/2)*T-M/2):C==h&&y==m&&B==h?k=g[dd]-f[dd]+q-(A-M):C==h&&y==m?k=g[dd]-f[dd]+q:C==m&&y==m&&(k=u[ab](q*T));if((G==h||E==h)==h)g=N,f=A,q=N/Q,ba=A/M,T=q,G==h?T=q<=ba?q:ba:E==h&&(T=q>=ba?q:ba),N=u[ab](Q*T),A=u[ab](M*T),G=g-N,E=f-A,da==h&&$==m?d+=G:da==h&&$==h&& +(d+=u[ab](G/2)),C==h&&y==m?k+=E:C==h&&y==h&&(k+=u[ab](E/2))}var V=u.max(0,N-(Q-w)),P=u.max(0,A-J);qa==h&&(ia(a,Yh,V),ia(a,Zh,P));e==h?(r==h&&(d+=t(a,Jn,0.5)*(N-Q),ia(a,bi,u.max(0,N/Q)),V=w),ra(a[O],F(V,2))):ra(a[O],Z);v==h?(r==h&&(k+=t(a,Kn,0.5)*(A-M),ia(a,ci,u.max(0,A/M)),P=l),Ma(a[O],F(P,2))):Ma(a[O],Z);if(8>z.ca){var Y=s[cb](Am+a.id);Y!=j&&(w=function(){ra(Y[O],F(a[uc]));Ma(Y[O],F(a[Xc]))},0==a[uc]&&0==a[Xc]?p[vc](w,0):w())}if(9>z.ca){t(a,fm)!=j&&fe(a);var ea=a[Fc][wb][am+a.id];ea!=j&&(ea[Ib](jo, +V),ea[Ib](om,P))}ia(a,Lh,k);ia(a,Mh,d);c==m&&(k+=t(a,Th,0),d+=t(a,Sh,0),a[O].top=F(k),va(a[O],F(d)));if(c==h||r==h)9>z.ca?fe(a):ge(a);qa==h&&Ic(a);Tg==m&&Ug()}}catch(L){}}function Ti(a){a!=j&&0===a[ub](ko)&&(a=rm+a);return a}function ie(a){return a[Ya](/'/g,Sd)}function mb(a,b){if(a[ub])return a[ub](b);for(var c=0;c=e){d=w!=j?w[Ac].y+(l[Ac].y-w[Ac].y)*(e-w[Ac].x)/(l[Ac].x-w[Ac].x):l[Ac].y;break a}w=l}w=j}d=l[Ac].y}c.ea==h&&(d=1-d);e=n;w=a.a;if(w!=ca){n=Vg[w];if(a.b!=j){if(c.zc[w]==j&&(n=a.o,q=a.a,q!=ca)){v=Vg[q];a={};for(var Q=[],J=0,N=0,M=0;Me;e++)r[e]=c[e]+(g[e]-c[e])*d;e=dj(r)}else 1==d&&(e=q);Y(k,f,e);qa==h&&Fg(k,f,e,b)}function bj(a,b,c){var d;d=a[H];var e=0,f,g=0,g={};if(0>b||1b){var w=a.Ka[0];2<=w.qa[H]&&(f=w.qa[0],e=w.qa[1],k=f)}else n=-1,q=1-b,w=a.Ka[a.Ka[H]-1],2<=w.qa[H]&&(f=w.qa[w.qa[H]-2],k=e=w.qa[w.qa[H]-1]);if(f!=j&&e!=j){a=n*(e[Ac].x-f[Ac].x);b=n*(e[Ac].y-f[Ac].y);d*=q;0==b?(g.y=0,g.x=d):(g.y=u[Gb](u.pow(d,2)/(u.pow(a,2)/ +u.pow(b,2)+1)),g.x=g.y*a/b);if(0a&&0>g.x)g.x*=-1;if(0b&&0>g.y)g.y*=-1;g.x+=k[Ac].x;g.y+=k[Ac].y;g.wb=ej(f[Ac],e[Ac])}}else if(0==d)g={x:a.Ka[0].fb.x,y:a.Ka[0].fb.y,wb:0};else{if(1==b)d=a.Ka,f=d[d[H]-1],g=1;else{for(g=0;gb){f=w;break}e+=w[H]}g=(b-e/d)/(f[H]/d);d=f[H]*g;for(b=a=g=0;b=f)b.eb=d+1,yb[g][k]==b.fa&&(1==e.p&&b.sa==h?(e=x[G].v[g].aH,f=Ja(g),e==h&&f[Jb]&&(f.autoplay=h,f[Jb]())):0==e.p&&b.Da[D](e));else break}c=[];for(d=0;d=f){if(yd[e]==b.fa){var q=b.ea==m?n.G:Ca(n.G+n[yc],k),f=0,f=n.z?q-n[yc]:q+n[yc],f=u.max(0,f);zd(k,m);f=nc(f,k,h,h,m);f==m&&Zb(e,j)}b.ab[ed](d,1);d--}}for(d=b.tb;d=f)){b.tb=d+1;var w=n.E,l=n.z,v=q=b.ea==m?n.G:Ca(n.G+n[yc],k),t=m;b.ea==h&&(l=!l);w&&(f=a-f,f>n[yc]?(w=m,f=n[yc]):(b.ab[D](n),t=h),v=l?v-f:v+f,v=u.max(0,v));if(w){if(f=ud(q,e,h))continue;l&&(zd(k,l),v=Ca(Ha(k)-v,k));if(f=nc(v,k,h,h,h))continue;b.sa?(je(k,b.xa),td(e,l,m,m)):Zb(e,j)}else Zb(e,j),ud(v,e,m);t&&(yd[e]=b.fa)}}}function nc(a,b,c,d,e){of=h;for(var f=b.pa,g=b.ea?b.ac:b.ta,k=[],n=u.min(a*b.xa,Ha(b)),q=b.eb;q=l)&&k[D](w)}e=m;if(0==k[H]||d==m)Yg(n,b,g);else{for(var w=d=0,v=b.sa,t=b.ea,q=0;qe&&(a=e);d.ea==h&&(a=Ca(e-a,xa(b)));d.eb=0;d.tb=0;d.Da=[];d.ab=[];b=zb()/1E3;d.pa=b-a;d.Qa=b-d.pa;d.sa==h&&(p[Qa](d.hb),d.hb=p[vc](function(){ke(d)}, +1E3*((e-a)/d.xa)));hj(d,m);Zg(d,0);ij(d,a);a=nc(a,d,m,h,c);Kc();return a}}function Ad(a,b){var c=xa(a);if(c==j)return 0;var d=0;c.sa==h?(d=zb()/1E3-c.pa,d*=c.xa):d=c.Qa;var e=Ha(c);b==h&&c.ea==h&&(d=e-d);d=u.max(0,d);return d=u.min(e,d)}function ij(a,b){for(var c={},d=a.ea?a.ac:a.ta,e=0;e=b&&(c[g]==j&&(c[g]={}),q!=h&&c[g][k]==j&&(q=Ja(g),n==ca&&(a.ea==h&&0==f.d)&&(n=f.s),Y(q,k,n)),c[g][k]=h)}}}} +function td(a,b,c,d){yd[a]=j;var e=xa(a);e!=j&&(c&&je(e,1),zd(e,b),e.sa==m&&(e.pa!=j?e.Qa==Ha(e)?d&&Yb(a,j,b):(e.sa=h,e.pa=zb()/1E3-e.Qa/e.xa,p[Qa](e.hb),e.hb=p[vc](function(){ke(e)},1E3*((Ha(e)-e.Qa)/e.xa)),e.mb!=h&&(Zg(e,e.Qa),e.eb=0,e.tb=0,e.Da=[],e.ab=[]),nc(e.Qa/e.xa,e,m,m),Kc()):(d==h||0==e.Qa)&&Yb(a,j,b)))}function Zb(a,b){yd[a]=j;var c=xa(a);c!=j&&c.sa==h&&(je(c,1),c.Qa=b!=j?b:zb()/1E3-c.pa,c.sa=m,p[Qa](c.hb))}function ke(a){if(!(qa==h&&a.mb==h)&&!nc(Ha(a),a,h,h))if(le(a),me!=j&&Af==a.fa)a= +me,Af=me=j,a();else if(a={type:ki,timelineName:a.Lb.n},Bf(a,j)!==m){var b=Ta();if(b!=j){var c=x[Cf(Df())].F;c!=j&&ta(b,c.a)(a)}}}function Ca(a,b){return qa==h&&b.mb==h?Ef(a,60):Ef(a,b.Lb.f)}function Ef(a,b){var c=u[bb](a);return c+u[Sa]((a-c)*b)/b}function Ha(a){return qa==h&&a.mb==h?31536E3:Ca(a.Lb.d,a)}function Kc(){if(zf!==h){zf=h;var a=function(a){p[vc](a,1E3/60)};(z.kb!=j?a:p.requestAnimationFrame||p.webkitRequestAnimationFrame||p.mozRequestAnimationFrame||a)(function(){zf=m;gj()})}}function le(a){p[Qa](a.hb); +a.eb=0;a.tb=0;a.Da=[];a.ab=[];a.Xe=j;a.pa=j;a.sa=m;a.xa=1;a.Qa=Ha(a);a=mb(eb,a);-1!=a&&eb[ed](a,1)}function jj(a){for(var b=0;b=b&&(db[f]===ca||db[f][g]===ca||db[f][g]==a.fa))yb[f][g]=a.fa}jj(a)}function Yb(a,b,c){yd[a]=j;for(var d=0;dz.ca&&0==a[ub](vn)&&(a=dj(Xg(a),h));return a} +function dj(a,b){if(1==a[3]||b==h){for(var c=ma.Wc,d=Id,e=0;3>e;e++)d+=c[qb](a[e]/16)+c[qb](a[e]%16);return d}return wn+oa(a[0])+Fe+oa(a[1])+Fe+oa(a[2])+Fe+pa(a[3])+Ce}function F(a,b){var c=u.pow(10,b==j?0:b);return Z+u[Sa](a*c)/c+qn}function Xg(a){var b=[0,0,0,1];if(0==a[ub](un)){var c=a[ub](Be),d=a[ub](Ce);if(3c;c++)b[c]=16*d[ub](a[qb](2*c))+d[ub](a[qb](2*c+1))}return b} +function cj(a){typeof a!=gn&&(a=pa(a));return isNaN(a)?0:a}function mj(a,b,c){Gf=m;c!=j&&delete x[G].T[c];Ia(b[O],bl);Y(b,Mk,0,ek,0);ia(b,Xh,Zf);Y(b,xk,0,Nj,0,mo,1,Yl,1);c=x[G].a;c!=j?(ra(b[O],fg),ra(T[O],c+Qd)):(ra(b[O],F(x[G].Y)),ra(T[O],b[O][Ra]));c=x[G].b;c!=j?(Ma(b[O],fg),Ma(T[O],c+Qd)):(Ma(b[O],F(x[G].Z)),Ma(T[O],b[O][dd]));Mc[T.id]=j;Mc[b.id]=j;fa[R[a.id]]&&(a!=j&&a!=b)&&(Ia(a[O],fn),a[Ib](qk,h),Y(a,Mk,0,ek,0,xk,0,Nj,0,mo,0,Yl,1),ia(a,Xh,Zf));T[O][Ue]=j;T[O][ma.Oa+Un]=km;T[O][Oe]=j;T[O].perspective= +j;if(9>z.ca){a=ne(a);for(c=0;cq;q++)for(var w=0;wu.abs(c.x-pe[b].x)&&25>u.abs(c.y-pe[b].y)&&(a.stopPropagation(),a[rb]())}}function oj(a){var b=[],c=x[G].U,d;for(d in c)c[K](d)!=m&&c[d].n==a&&b[D](oc[d]);return b}function Ui(a){var b={type:li, +customBehaviorName:a},c=Lf[a];if(c!=j)for(var d=0;d=d;d++)c[D]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Db=c;a.Hb=ca;a.Sc=m;var c=a.wa?b[Cc][0]:b,e;e=function(b){dh(a);a.ob=Dl;Of(b,a)};a.Ia=e;b=a.wa?a.Qc:s;a.wa?Ua(Pn,a.Ia,b,m):p.self!=p.top&&(d=function(a){(a.relatedTarget===s.documentElement||a.toElement===j)&&e(a)},a.Ia=d,Ua(Um,d,b,m));c=Jf(c);d=a.Db[0];d[Uc].x=c.x;d.end.x=c.x;d[Pa].x=c.x;d[Uc].y=c.y;d.end.y=c.y;d[Pa].y=c.y;sj(a,c);a.pd=function(b){if(!(a.ob===bm||a.ob===Dl))if(Nf== +h)a.Ia(b);else{if(a.uc==m&&(Mf++,a.uc=h,a[U].ua==Wl)){Pf=h;if(a[U].Ya!=j)for(var c=0;cz.ca&&(a.Qc.ondragstart=function(a){return a==j?m:h});if(a[U].Ya!=j)for(c=0;cw,(l||w==m||Pf==h)&&a.Ia(b)):a[U].ua==Mn&&5=t?Jm:yn:0>=t&&-180<=t?Xn:Vl)!=r,x=v/J;else{r=l=Ad(d.fa,m);for(v=J=0;va[U].gc?(b={type:gi+a[U][Oa][qb](0).toUpperCase()+a[U][Oa][Xa](1)+vg},a.qd(b)):a.Ia(b)):a[U].ua==Mn?1500>d&&a.qd(b):a.Ia(b);dh(a)}};Ua(a.wa?Qn:Wm,a.od,b,m);b.setCapture&&b.setCapture();a.tc=zb();a.Xc=a.tc;Pf=Nf=a.uc=m}}}function dh(a){if(a.Sc!=h){a.Sc=h;db={};var b=a.wa?a.Qc:s;b.releaseCapture&&b.releaseCapture();re(a.wa?Rn:Tm,a.pd,b); +re(a.wa?Qn:Wm,a.od,b);a.wa?re(Pn,a.Ia,b):re(Um,a.Ia,b);a[U].ua==Wl&&(Pf=m);a.uc==h&&Mf--;qa==h&&a[U]&&(Ic(a[U].vb),Kc())}}function Of(a,b){b[U].se==h&&(a.hypeGesturePhase=b.ob,a.hypeGestureXPosition=b.Db[0].end.x,a.hypeGestureYPosition=b.Db[0].end.y,b.qd(a))}function re(a,b,c){c[wc]?c[wc](a,b,m):c[Wc]&&c[Wc](jn+a,b)}function Ua(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Qf[D](e);c[Hb]?c[Hb](a,b,m):c[Tb]&&c[Tb](jn+a,b)}function Jf(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hc]|| +a[ic])b.x=a[hc]+s[Ec].scrollLeft+s.documentElement.scrollLeft,b.y=a[ic]+s[Ec].scrollTop+s.documentElement.scrollTop;return b}function uj(a){var b;0==a.c?0==a.A?b=yn:1==a.A&&(b=Jm):1==a.c&&(0==a.A?b=Xn:1==a.A&&(b=Vl));return b}function sj(a,b){var c=a[U][Oa]==yn||a[U][Oa]==Jm?b.x:b.y;a.Hb=a.Hb==ca?c:a[U][Oa]==yn||a[U][Oa]==Vl?u.max(a.Hb,c):u.min(a.Hb,c)}function tj(a,b,c){a=u[Sa](180*u[Eb](b.y-a.y,b.x-a.x)/u.PI);c=u.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Jm;if(a<=45-c&&a>=-45+c)return yn;if(a< +-45-c&&a>-135+c)return Xn;if(a>45+c&&a<135-c)return Vl}function Mg(a){for(var b=Bd[a],c={},d=0;dz.ca?wo:xo;d={};d.kd=z.kb!=j;var f=Sf[a];f==j&&(f=new b(a,c),f.Lf=a,f.cc=c,f.options=d,f.jd=function(){var a=[],b;for(b in f.cc)f.cc[K](b)!=m&&a[D](b); +return a.sort()});return f}function vj(a){a=Bd[a];if(a!=j){for(var b=1=$b[H]?wj():b==h&&gh==m&&(gh=h,p[vc](function(){xj()},1))}function xj(){0>=$b[H]||(gh=m,yj($b[0],h))}function yj(a,b){var c=La[a].p;if(1==c)if(c=La[a].g,c!=j&&vj(c)!=a)fh(a,b);else{var d=new Image,c=function(c){d=this;if((z.Pc!= +j||z.Wd!=j&&z.kb==j)&&c[Ob]==Lm&&-1!=Ub[ub](Xl)&&-1==d.src[ub](bf))try{var e=s[Db](Fl);ra(e,d[Ra]);Ma(e,d[dd]);e.getContext(gg).drawImage(d,0,0);zj[d.Ne]=e.toDataURL()}catch(k){}fh(a,b)},e=Rf(a);d.onload=c;d.onerror=c;d.onabort=c;d.src=e;d.Ne=a}else 2==c&&(c=function(){for(var c=Bd[La[a].g],d=0;dpa(z.Ra)||9>z.ca?p[vc](c,1):e.load(c,c))}function wj(){gf!=j&&gf(m,T);if(Bf({type:di},T)!==m)if(-1==zg)Lc(Pc);else{se=h;for(var a= +-1,b=0;bc&&(c=f),ra(T[O],F(c)),Mc[T.id]=j,T[O].margin==uk&&(ka&&(a=g),Ma(T[O],F(a)))}function Dd(a){var b=T[bd].offsetHeight,c=x[a].b;return c!=j?c/100*b:x[a].Z}function Cd(a){var b=T[bd][ib],c=x[a].a;return c!=j?c/100*b:x[a].Y}function hh(a,b,c,d){if(!(Aj(a)==j||Gf==h)){c==j&&(c=1.1);c=Ef(c,60);Gf=h;var e=function(){d!=j&&d();nb=[];Lf={};var e=Ta();Jc=x[a].a!=j||x[a].b!=j?h:m;var f=Aj(a),g=G,k=Ta();if(k!=j){for(var n=k[fc](ao),l=0;lF&&(F=l[O][dc]))}else w[D]({container:l,domElement:E,sceneElement:v});la[k].Kd==m&&(qa==h&&Lg(qc[k]),nj(l,h),la[k].Kd=h)}for(l= +0;lg?P:g,fa[C].a=0,fa[C].b=0)):(te(e,ea,h,m),P!=g&&(W[D](ac(Rl,0,S,ml,C,P,g)),fa[C]={},fa[C].c=X>L?X:L,fa[C].d=P,fa[C].a=0,fa[C].b=0)),q=Nj,f=L,r=-1*L,5==b?(f=-1*X,r=X):6==b?(q=xk,f=-1*P,r=P):7==b&&(q=xk,f=g,r=-1*g),e!=j&&(w=R[e.id],Y(e,ml,X,Rl,P),W[D](ac(q,0,S,ml,w,0,f))),W[D](ac(q,0,S,ml,R[ea.id],r,0)),Y(ea,ml,L,Rl,g,q,r),ih(Vh,S,W,e,ea),Ia(ea[O],bl)):(te(e,ea,m,m),mj(e,ea,j));Qc()},f=m,g= +Ta();g[Ib](qk,h);if(Bj==h&&g!=j){var g=Cf(Df()),k={type:fi};if(Bf(k,j)!==m){var n=x[g].B;if(n!=j){for(var q=n.a,w=ta(Ta(),q),n=0;nk;k++){var n=fj(e,k/99),q={};q.location=n;b&&(g=eh(n,g),f+=g,Aa(q,g)); +e.qa[D](q);g=n}c+=f;Aa(e,f)}return c}function fj(a,b){var c=Fd(a.fb,a.Jb,b),d=Fd(a.Jb,a.Bb,b),e=Fd(a.Bb,a.Rb,b),f=Fd(c,d,b),d=Fd(d,e,b),f=Fd(f,d,b),g=m,k=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?k=e:(k=c,g=h));f.wb=ej(f,k);g==h&&(f.wb+=180);return f}function ej(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*u.atan((b.y-a.y)/(b.x-a.x))/u.PI;b.xc)break;b=e}}return b}function Gg(a){var b=qc[Df()];a!=j&&(b=qc[a]);a=Mc[b];a==j&&(a=s[cb](b),a={width:a[ib],height:a.offsetHeight},Mc[b]=a);return a}function nf(a){var b=0,c=0;a==j?(b=x[G].Y,c=x[G].Z):(b=Vb(a),c=Wb(a));return{width:b,height:c}}function Qg(a){return(z.Ra!=j||3.5<=z.Cb||10<=z.ca)&&t(a,Xh)==cg}function Hg(){of=m;Tg=h;for(var a in he)he[K](a)&&Nc(he[a]);Tg=m;Ug();he={}} +function Ug(){p[vc](function(){de!=j&&(kh?lh=h:(kh=h,de.refreshAll(),kh=m,lh&&(lh=m,Ug())))},0)}function mh(a,b,c){var d=b;if(d==j||s[cb](d)!=j){do d=c+Hj();while(s[cb](d)!=j)}qc[a]=d;R[d]=a;return nh[b!=j?b:d]=d}function Ja(a){return s[cb](qc[a])}function zb(){return(new Date).getTime()}function Hj(){for(var a=Z,b=ma.Wc+Bh,c=0;20>c;c++)var d=u[bb](u.random()*b[H]),a=a+b.substring(d,d+1);return a}function xo(a){var b=this;Sf[a]=b;b.bc=function(){var a=s[Db](sk);b.Ha=a;for(var d=b.jd(),e=0;ez.ca&&(b=b.match(/('|")(http.*?css.*?)('|")/),b!=j&&2<=b[H]&&s.createStyleSheet(b[2]));p[vc](Qc,120);p[vc](Qc,1200);a=s[Db](Ul);a.id=Ih;Ia(a[O], +fn);a[Ib](qk,h);T[Na](a);for(b=0;bz.ca)xj();else for(L=0;Lz.ca|| +z.Rd){if(1==oa(b))ia(a,Rh,Z),ia(a,Qh,Z);else{var c=wg+u[Sa](100*b)+Ce;ia(a,Rh,ma.wc+Xe+c);ia(a,Qh,c.toLowerCase());a[O].backgroundColor==Z&&a[O].backgroundImage==Z&&s[cb](Am+a.id)==j&&Ga(a[O],Yn+ie(Z+Ub+Yf)+Wd)}fe(a)}a[O].opacity=b;a[O].MozOpacity=b},aP:function(a,b){a[O].cursor=b},bD:function(a,b){a[O][ma.Oa+Zn]=b;a[O].MozUserSelect=b;a.onselectstart=function(){return m}},N:function(a,b){a[O].borderLeftWidth=F(b);Mb(a)},O:function(a,b){a[O].borderRightWidth=F(b);Mb(a)},P:function(a,b){a[O].borderTopWidth= +F(b);Mb(a)},M:function(a,b){a[O].borderBottomWidth=F(b);Mb(a)},B:function(a,b){a[O].borderLeftColor=xb(b)},C:function(a,b){a[O].borderRightColor=xb(b)},D:function(a,b){a[O].borderTopColor=xb(b)},A:function(a,b){a[O].borderBottomColor=xb(b)},J:function(a,b){a[O].borderLeftStyle=b},K:function(a,b){a[O].borderRightStyle=b},L:function(a,b){a[O].borderTopStyle=b},I:function(a,b){a[O].borderBottomStyle=b},aK:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopLeftRadius=b;a[O].MozBorderRadiusTopleft=b;9> +z.ca&&wf(a)},aL:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopRightRadius=b;a[O].MozBorderRadiusTopright=b;9>z.ca&&wf(a)},aI:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomLeftRadius=b;a[O].MozBorderRadiusBottomleft=b;9>z.ca&&wf(a)},aJ:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomRightRadius=b;a[O].MozBorderRadiusBottomright=b;9>z.ca&&wf(a)},bE:function(a,b){sa(a,Z);var c,d=Bd[b];if(d!=j){for(var e=0;ez.ca){d=a[Fc][Db](Ul);Da(d,Ch);for(e=0;ez.ca)try{c.SetControllerVisible(0!=oa(b))}catch(d){p[vc](function(){fb.aO(a,b)},100)}},aR:function(a,b){a[Ib](bn,b);a.volume=0!=b?$f:dg;var c=a[Fc][wb][am+a.id]; +if(c!=j&&9>z.ca)try{c.SetMute(0!=oa(b))}catch(d){p[vc](function(){fb.aR(a,b)},100)}},aQ:function(a,b){a[Ib](Mm,b);wa(a,0!=b);var c=a[Fc][wb][am+a.id];if(c!=j&&9>z.ca)try{c.pf(0!=oa(b))}catch(d){p[vc](function(){fb.aQ(a,b)},100)}},j:function(a,b){Ba(a[O],b)},r:Yi,cY:Yi,aG:function(a,b){a[Ib](On,b);a[Ib](nk,b)},g:function(a,b){a[O].backgroundColor=xb(b)},n:Rg,m:Rg,l:Rg,h:function(a,b){var c=vj(b);if(c!=j){var d=La[c].n,e=Rf(c);if((3.6>z.Cb||9>z.ca)&&(a[O].backgroundRepeat==j||a[O].backgroundRepeat== +Z||a[O].backgroundRepeat==en)){var f=Am+a.id,c=s[cb](f);c!=j?c.src=e:(c=s[Db](zm),c.src=e,c.id=f,Ba(c[O],hk),ra(c[O],fg),Ma(c[O],fg),c[O].top=Zf,va(c[O],Zf),za(c[O],Le),a[Na](c));ia(c,Oh,c.src);9>z.ca&&d.substr(d[H]-4).toLowerCase()==df&&(c.src=Z+Ub+Yf,e=ie(e)[Ya](/\%/gi,Rd),ia(c,Ph,ma.wc+Ye+e+Wd),ia(c,Nh,ma.wc+cf),fe(c));Nc(a)}else d=zj[c],Ga(a[O],d!=j?Yn+d+Wd:Yn+ie(e)+Wd)}},q:function(a,b){a[O].backgroundSize=b;a[O][ma.Oa+Vk]=b;a[O].MozBackgroundSize=b},o:function(a,b){a[O].backgroundOrigin=b;a[O][ma.Oa+ +Uk]=b;a[O].MozBackgroundOrigin=b},p:function(a,b){if(b!=j&&b!=en){var c=s[cb](Am+a.id);c!=j&&(Ga(a[O],Yn+ie(t(c,Oh))+Wd),c[bd][Gc](c))}a[O].backgroundRepeat=b},x:function(a,b){a[O].overflow=b},aT:function(a,b){a[O].paddingLeft=F(b);Mb(a)},aU:function(a,b){a[O].paddingRight=F(b);Mb(a)},aV:function(a,b){a[O].paddingTop=F(b);Mb(a)},aS:function(a,b){a[O].paddingBottom=F(b);Mb(a)},S:yf,T:yf,R:yf,Q:yf,bB:xf,bC:xf,bA:xf,aZ:xf,bL:function(a){vd(a);z.Pc!=j&&a[O][We]==Z&&(a[O][We]=fn)},bG:vd,bH:vd,bI:vd,bJ:vd, +bK:vd,BDbL:wd,BDbG:wd,BDbH:wd,BDbI:wd,BDbJ:wd,BDbK:wd,Z:function(a,b){a[O].wordWrap=b},yy:function(a,b){a[O].whiteSpace=b},y:function(a,b){a[O].whiteSpaceCollapsing=b},z:function(a,b){za(a[O],b);a[bd][sc]==Hh&&za(a[bd][O],b)},aA:function(a,b){var c=ta(a,b.a);be&&(Oc(a,{Eb:1,ua:Mn},c),a[O][Ve]=xn);a[Ib](zn,ll);Va(Gl,a,c,h)},aD:function(a,b){Va(Vm,a,ta(a,b.a),m)},aC:function(a,b){Va(Um,a,ta(a,b.a),m)},aE:function(a,b){var c=ta(a,b.a);be&&(Va(Qn,a,c,h),a[O][Ve]=xn);a[Ib](zn,ll);Va(Wm,a,c,h)},aB:function(a, +b){var c=ta(a,b.a);if(be){var d=m;if(z.kb!=j)for(var e=b.a,f=0;fz.ca?c():Qi(a,c,cm)},cX:function(a,b){9>z.ca||Qi(a,ta(a,b.a),em)},cG:function(a,b){Oc(a,{Eb:1,direction:yn,gc:30,ua:In},ta(a,b.a))},cH:function(a,b){Oc(a,{Eb:1,direction:Jm,gc:30,ua:In},ta(a,b.a))},cI:function(a,b){Oc(a,{Eb:1,direction:Xn,gc:30,ua:In},ta(a,b.a))},cJ:function(a, +b){Oc(a,{Eb:1,direction:Vl,gc:30,ua:In},ta(a,b.a))},cK:ee,cF:ee,aM:function(a,b){Va(Vm,a,Og(a,b),m);Va(Um,a,vf(a,b),m)},aN:function(a,b){be&&(Va(Sn,a,Og(a,b),m),Va(Rn,a,vf(a,b),m),Va(Qn,a,vf(a,b),m),a[O][Ve]=xn);Va(Sm,a,Og(a,b),m);Va(Wm,a,vf(a,b),m)},V:Pg,U:Pg,W:Pg,w:function(a,b){var c=s[cb](Am+a.id),c=c!=j?c.cloneNode(h):j;sa(a,b);for(var d=a[fc](Bn),e=0;ez.ca){var c=function(b){b=b?b:p[fd];if(a[O][mn]==fn){var c=a[O].display;Ia(a[O],fn);var f=s.elementFromPoint(b[hc],b[ic]);Ia(a[O],c?c:Z);s.createEvent?(b[rb](),c=s.createEvent(qi),c.initMouseEvent(b[Ob], +b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hc],b[ic],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b[tb],j),f.dispatchEvent(c)):(c=s.createEventObject(),c.clientX=b[hc],c.clientY=b[ic],f.fireEvent(jn+b[Ob],c),event.cancelBubble=h)}};Ua(pi,c,a,h);Ua(Wm,c,a,h);Ua(Sm,c,a,h);Ua(Gl,c,a,h)}}},Sf={},Gd=j,ce=[Nj,xk,fm],Ka=[],kf=m;fb.bM=Ic;fb.bU=jf;fb.bV=jf;fb.cT=jf;fb.bW=jf;var V,X={},E={ge:4},yo=1,zo=-1;E.create=function(a){var b={id:y.Wb(),type:dl,label:vh,ba:0,aa:S.Id(ni),position:{x:0,y:0}, +Ba:{x:0,y:0},ic:0,ka:{x:0,y:0},Ea:{x:0,y:0,ba:0},speed:0,Sa:0,ha:{x:0,y:0},va:0,da:m,ia:m,rb:0,hd:60,Ab:0.0010,Xa:0,La:0.1,sc:0.01,pc:{Bd:1,Nd:4294967295,group:0},yb:0.05,gb:1,ya:{visible:h,Sf:{Wf:1,Xf:1},lineWidth:1.5}},b=y[pb](b,a);b.ga=b.ga||gb[kc](b.aa);b.$=b.$||r.mc(b[I]);b.oa=b.oa||b.ba;E.Zd(b,b.aa);E.Yd(b,b.da);Wa.set(b,b.ia);S[Bc](b.aa,b.ba,b[I]);Rc[Bc](b.Ua,b.ba);gb[cd](b.ga,b.aa,b.ha);b.Ua=a.Ua||b.Ua;b.Ta=a.Ta||b.Ta;E.Cc(b,a.Wa||b.Wa);E.gd(b,a.qb||b.qb);a=b.da?Pd:y.ne();var c=y.Qe(a);b.ya.fillStyle= +b.ya.fillStyle||a;b.ya.strokeStyle=b.ya.strokeStyle||c;return b};E.If=function(a){return a?zo--:yo++};E.Yd=function(a,b){if(a.da=b)a.Xa=0,a.La=1,a.Wa=a.qb=a.Ab=ja,a.ra=a.Ma=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,a.va=0,ua(a,0),a.Sa=0,a.rb=0};E.Cc=function(a,b){a.Wa=b;a.ra=1/a.Wa;a.Ab=a.Wa/a.Ta};E.Xd=function(a,b){E.Cc(a,b*a.Ta);a.Ab=b};E.gd=function(a,b){a.qb=b;a.Ma=1/a.qb};E.Zd=function(a,b){a.aa=b[0][Ec]===a?b:S[kc](b,a);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);var c=S.Oc(a.aa);S[Pb](a.aa, +c,-1);E.gd(a,E.ge*S.qb(a.aa,a.Wa));S[Pb](a.aa,a[I]);gb[cd](a.ga,a.aa,a.ha)};E.Dc=function(a,b){var c=r.sub(b,a[I]);a[I].x=b.x;a[I].y=b.y;a.$.x+=c.x;a.$.y+=c.y;S[Pb](a.aa,c);gb[cd](a.ga,a.aa,a.ha)};E.fd=function(a,b){var c=b-a.ba;a.ba=b;a.oa+=c;S[Bc](a.aa,c,a[I]);Rc[Bc](a.Ua,c);gb[cd](a.ga,a.aa,a.ha)};E.Pe=function(a,b){a.$.x=a[I].x-b.x;a.$.y=a[I].y-b.y;a.ha.x=b.x;a.ha.y=b.y;ua(a,r.Vb(a.ha))};E.Oe=function(a,b){a.oa=a.ba-b;a.va=b;a.Sa=y.abs(a.va)};E.translate=function(a,b){E.Dc(a,r.add(a[I],b))};E.rotate= +function(a,b){E.fd(a,a.ba+b)};E.scale=function(a,b,c,d){S.scale(a.aa,b,c,d);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);S[Pb](a.aa,{x:-a[I].x,y:-a[I].y});E.gd(a,S.qb(a.aa,a.Wa));S[Pb](a.aa,{x:a[I].x,y:a[I].y});gb[cd](a.ga,a.aa,a.ha)};E.Me=function(a){for(var b=0;be.max.x||g.ga.max.ye.max.y)||E[cd](g,b,c,d))}};E.update=function(a,b,c,d){b=u.pow(b*c*a.gb,2);c=1-a.sc*c*a.gb;var e=a[I].y-a.$.y;a.ha.x=(a[I].x-a.$.x)*c*d+a.Ba.x/a.Wa*b;a.ha.y=e*c*d+a.Ba.y/a.Wa*b;a.$.x=a[I].x;a.$.y=a[I].y;a[I].x+=a.ha.x;a[I].y+=a.ha.y;a.va=(a.ba-a.oa)*c*d+a.ic/a.qb*b;a.oa=a.ba;a.ba+=a.va;ua(a,r.Vb(a.ha));a.Sa=y.abs(a.va);S[Pb](a.aa,a.ha);0!==a.va&&(S[Bc](a.aa,a.va,a[I]),Rc[Bc](a.Ua,a.va));gb[cd](a.ga,a.aa,a.ha)};E.sf=function(a, +b,c){a.Ba.x+=c.x;a.Ba.y+=c.y;a.ic+=((b.x-a[I].x)*c.y-(b.y-a[I].y)*c.x)*a.Ma};var B={create:function(a){return y[pb]({id:y.Wb(),type:Ml,parent:j,vc:m,bb:[],Ob:[],na:[],label:wh},a)},Aa:function(a,b,c,d){a.vc=b;c&&a.parent&&B.Aa(a.parent,b,c,d);if(d)for(var e=0;el.ga.max.x||l.ga.min.x>g.ga[Ra]||0>l.ga.max.y||l.ga.min.y>g.ga[dd])){var v;v=l.ga;v=Ki(u[bb](v.min.x/a.yd),u[bb](v.max.x/a.yd),u[bb](v.min.y/a.xd),u[bb](v.max.y/a.xd));if(!l[sb]||v.id!==l[sb].id||d){r.wd+=1;if(!l[sb]||d)l.region=v;var t;n=v;q=l[sb]; +e=u.min(n.dc,q.dc);f=u.max(n.Qb,q.Qb);t=u.min(n.ec,q.ec);n=u.max(n.Sb,q.Sb);t=Ki(e,f,t,n);for(e=t.dc;e<=t.Qb;e++)for(f=t.ec;f<=t.Sb;f++){q=e+Fe+f;n=k[q];var x=e>=v.dc&&e<=v.Qb&&f>=v.ec&&f<=v.Sb,z=e>=l[sb].dc&&e<=l[sb].Qb&&f>=l[sb].ec&&f<=l[sb].Sb;if(!x&&z&&z&&n){var C=a,A=n,B=l;A[ed](y[ub](A,B),1);for(var E=0;EL*f.La*d&&(F=L*f.La*d* +G);G=r.jb(C,q);L=r.jb(z,q);G=l/(f.ra+k.Ma*G*G+n.Ma*L*L);A*=G;F*=G;0>E&&E*E>4*d?(x.Ib=0,x.Kb=0):(E=x.Ib,x.Ib=u.min(x.Ib+A,0),A=x.Ib-E,E=x.Kb,x.Kb=y.Nb(x.Kb+F,-B,B),F=x.Kb-E);c.x=q.x*A+g.x*F;c.y=q.y*A+g.y*F;!k.da&&!k.ia&&(k.$.x+=c.x*k.ra,k.$.y+=c.y*k.ra,k.oa+=r.jb(C,c)*k.Ma);!n.da&&!n.ia&&(n.$.x-=c.x*n.ra,n.$.y-=c.y*n.ra,n.oa-=r.jb(z,c)*n.Ma)}}}}},qh={Cd:function(a,b,c){var d,e;d=m;c?(e=a[vb]*a[vb]+a.Sa*a.Sa+b[vb]*b[vb]+b.Sa*b.Sa,d=c&&c.ib&&0.2>e,e=c):e={ib:m,ja:a,la:b};if(c&&d){if(c=Ag(c.ja.aa,c.la.aa, +[c.ja.Ua[c.Nc]]),e.Vd=h,0>=c.nb)return e.ib=m,e}else{c=Ag(a.aa,b.aa,a.Ua);if(0>=c.nb)return e.ib=m,e;d=Ag(b.aa,a.aa,b.Ua);if(0>=d.nb)return e.ib=m,e;c.nbd[H]&&(a=Ii(b,a,r.Od(e.Pa)),S[Zc](b.aa,a[0])&&d[D](a[0]), +2>d[H]&&S[Zc](b.aa,a[1])&&d[D](a[1]));2>d[H]&&(d=[c[0]]);e.ld=d;e.We=r.sub(d[0],e.Ce);return e}},Vf={create:function(a){a.ja&&!a.Zb&&(a.Zb={x:0,y:0});a.la&&!a.$b&&(a.$b={x:0,y:0});var b=a.ja?r.add(a.ja[I],a.Zb):a.Zb,c=a.la?r.add(a.la[I],a.$b):a.$b,b=r.Vb(r.sub(b,c));Aa(a,a[H]||b||1E-6);a.ya=y[pb]({visible:h,lineWidth:2,strokeStyle:Ld},a.ya);a.id=a.id||y.Wb();a.label=a.label||xh;a.type=Nl;a.ae=a.ae||1;a.Mc=a.Mc||0;a.Kc=a.ja?a.ja.ba:a.Kc;a.Lc=a.la?a.la.ba:a.Lc;return a},Te:function(a,b){for(var c=0;c< +a[H];c++)Vf.Se(a[c],b)},Se:function(a,b){var c=a.ja,d=a.la,e=a.Zb,f=a.$b;c&&!c.da&&(a.Zb=r[Bc](e,c.ba-a.Kc),a.Kc=c.ba);d&&!d.da&&(a.$b=r[Bc](f,d.ba-a.Lc),a.Lc=d.ba);var g=e,k=f;c&&(g=r.add(c[I],e));d&&(k=r.add(d[I],f));if(g&&k){var e=r.sub(g,k),n=r.Vb(e);0===n&&(n=1E-6);f=r.we(e,n);e=r.sb(e,0.5*((n-a[H])/n)*a.ae*b*b);if(!(y.abs(1-n/a[H])<0.0010*b)){var q,t,l;c&&!c.da?(q={x:g.x-c[I].x+e.x,y:g.y-c[I].y+e.y},c.ha.x=c[I].x-c.$.x,c.ha.y=c[I].y-c.$.y,c.va=c.ba-c.oa,g=r.add(c.ha,r.sb(r.Xb(q),c.va)),n=r.za(q, +f),n=c.ra+c.Ma*n*n):(g={x:0,y:0},n=c?c.ra:0);d&&!d.da?(t={x:k.x-d[I].x-e.x,y:k.y-d[I].y-e.y},d.ha.x=d[I].x-d.$.x,d.ha.y=d[I].y-d.$.y,d.va=d.ba-d.oa,k=r.add(d.ha,r.sb(r.Xb(t),d.va)),l=r.za(t,f),l=d.ra+d.Ma*l*l):(k={x:0,y:0},l=d?d.ra:0);k=r.za(f,r.sub(k,g))/(n+l);0>16)+c;var d=(b>>8&255)+c,b=(b&255)+c;return Id+(16777216+65536*(255>a?1>a?0:a:255)+256*(255>d?1>d?0:d:255)+(255>b?1>b?0:b:255))[jc](16)[Xa](1)},Rf:function(a){for(var b=a[H]- +1;0c?c:a},Re:function(a){return 0>a?-1:1},now:function(){var a=p.performance;return a?(a.now=a.now||a.webkitNow||a.Hf||a.Jf||a.Ff,+a.now()):+new Date},random:function(a,b){a="undefined"!== +typeof a?a:0;y.Gc=(9301*y.Gc+49297)%233280;return a+y.Gc/233280*(("undefined"!==typeof b?b:1)-a)},vf:function(a){a=a[Ya](Id,Z);3==a[H]&&(a=a[qb](0)+a[qb](0)+a[qb](1)+a[qb](1)+a[qb](2)+a[qb](2));return oa(a,16)},log:function(a,b){if(console&&console.log){var c;switch(b){case go:c=Kl;break;case dm:c=Ll}console.log(Td+b+jg+a,c)}},Wb:function(){return y.je++},sin:function(a){return pa(u.sin(a)[Za](8))},cos:function(a){return pa(u.cos(a)[Za](8))},indexOf:function(a,b){if(a[ub])return a[ub](b);for(var c= +0;c=e.hd&&Wa.set(e,h)):0Wa.ie*c&&Wa.set(f,m)}}},set:function(a,b){b?(a.ia=h,a.xb=a.hd,a.ka.x=0,a.ka.y=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,ua(a,0),a.Sa=0,a.rb=0):(a.ia=m,a.xb=0)}},Rc={Jd:function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x);e.xa.max.y&&(a.max.y=e.y);e.y=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},Pd:function(a,b){return a.min.x<=b.max.x&& +a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},translate:function(a,b){a.min.x+=b.x;a.max.x+=b.x;a.min.y+=b.y;a.max.y+=b.y},shift:function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x;a.max.x=b.x+c;a.min.y=b.y;a.max.y=b.y+d}},r={mc:function(a){return{x:a.x,y:a.y}},Vb:function(a){return y[Gb](a.x*a.x+a.y*a.y)},Cf:function(a){return a.x*a.x+a.y*a.y},rotate:function(a,b){var c=y.cos(b),d=y.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},Qf:function(a,b,c){var d=y.cos(b);b=y.sin(b);return{x:c.x+ +((a.x-c.x)*d-(a.y-c.y)*b),y:c.y+((a.x-c.x)*b+(a.y-c.y)*d)}},xc:function(a){var b=r.Vb(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},za:function(a,b){return a.x*b.x+a.y*b.y},jb:function(a,b){return a.x*b.y-a.y*b.x},add:function(a,b){return{x:a.x+b.x,y:a.y+b.y}},sub:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},sb:function(a,b){return{x:a.x*b,y:a.y*b}},we:function(a,b){return{x:a.x/b,y:a.y/b}},Xb:function(a){var b;b=b===h?-1:1;return{x:b*-a.y,y:b*a.x}},Od:function(a){return{x:-a.x,y:-a.y}},ba:function(a, +b){return u[Eb](b.y-a.y,b.x-a.x)}},S={create:function(a,b){for(var c=[],d=0;da||true==!0)?"HYPE-526.full.min.js":"HYPE-526.thin.min.js"),false==!0&&(a=a||l("HYPE_w_526","HYPE_wdtl_526","HYPE-526.waypoints.min.js")),a))return; +f=window.HYPE.documents;if(null!=f[c]){b=1;a=c;do c=""+a+"-"+b++;while(null!=f[c]);for(var d=document.getElementsByTagName("div"),b=!1,a=0;a + + + + + Oasis + + + + + + + + + + +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/DC9C02-restorable.plist b/static/animations/inbox-zero/oasis/oasis.hyperesources/DC9C02-restorable.plist new file mode 100644 index 0000000000..746ee0a330 Binary files /dev/null and b/static/animations/inbox-zero/oasis/oasis.hyperesources/DC9C02-restorable.plist differ diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/HYPE-526.full.min.js b/static/animations/inbox-zero/oasis/oasis.hyperesources/HYPE-526.full.min.js new file mode 100644 index 0000000000..5e4ba04454 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/HYPE-526.full.min.js @@ -0,0 +1,183 @@ +(function(){var ca=void 0,h=!0,j=null,m=!1,ga=encodeURIComponent,p=window,ha=Object,ja=Infinity,s=document,u=Math,ka=Number,na=navigator,oa=parseInt,pa=parseFloat;function ra(L,C){return L.width=C}function sa(L,C){return L.innerHTML=C}function ua(L,C){return L.speed=C}function va(L,C){return L.left=C}function wa(L,C){return L.loop=C}function ya(L,C){return L.play=C}function za(L,C){return L.zIndex=C}function Aa(L,C){return L.length=C}function Ba(L,C){return L.position=C} +function Da(L,C){return L.className=C}function Ea(L,C){return L.pause=C}function Fa(L,C){return L.MozPerspective=C}function Ga(L,C){return L.backgroundImage=C}function Ia(L,C){return L.display=C}function Ma(L,C){return L.height=C} +var Na="appendChild",D="push",Oa="direction",Pa="lastPosition",Qa="clearTimeout",Ra="width",Sa="round",Xa="slice",Ya="replace",Za="toFixed",$a="timestamp",ab="ceil",bb="floor",cb="getElementById",ib="offsetWidth",jb="concat",kb="list",pb="extend",qb="charAt",rb="preventDefault",sb="region",tb="button",ub="indexOf",vb="speed",wb="embeds",Bb="MAX_VALUE",Cb="opera",Db="createElement",Eb="atan2",Fb="identifier",Gb="sqrt",Hb="addEventListener",Ib="setAttribute",Jb="play",Kb="parentElement",Ob="type",Pb= +"translate",Qb="clear",Rb="childNodes",Sb="Play",Tb="attachEvent",bc="source",cc="changedTouches",dc="zIndex",ec="keys",fc="getElementsByTagName",gc="MIN_VALUE",hc="clientX",ic="clientY",jc="toString",H="length",I="position",kc="create",sc="className",tc="index",uc="clientWidth",vc="setTimeout",wc="removeEventListener",xc="split",yc="duration",zc="userAgent",Ac="location",Bc="rotate",K="hasOwnProperty",Cc="touches",O="style",Dc="pause",Ec="body",Fc="ownerDocument",Gc="removeChild",Hc="search",Tc= +"group",U="options",Uc="start",Vc="getAttribute",Wc="detachEvent",Xc="clientHeight",Yc="console",Zc="contains",$c="element",ad="startTime",bd="parentNode",cd="update",dd="height",ed="splice",fd="event",Z="",gd="\n",hd=" ",id=" -webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(",jd=" : ",kd=" rotate(",ld=" rotateX(",md=" rotateY(",nd=" rotateY(0) ",od=" scaleX(",pd=" scaleY(",qd=" translateX(",rd=" translateY(",Hd=" translateZ(",Id="#",Jd="#4ECDC4",Kd="#556270",Ld="#666",Md= +"#C44D58",Nd="#C7F464",Od="#FF6B6B",Pd="#eeeeee",Qd="%",Rd="%25",Sd="%27",Td="%c [Matter] ",Ud="&",Vd=" ",Wd="')",Xd="'>",Yd="'autoplay='false'class='video'>",Zd="'classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'codebase='http://apple.com/qtactivex/qtplugin.cab'width='",$d="'controller='",ae="'enablejavascript='true'postdomevents='true'scale='tofit'name='embedobj_",xe="'height='",ye="'id='embedobj_",ze="'loop='",Ae="'volume='",Be="(",Ce=")",De=") ",Ee="*",Fe=",",Ge=",M12=", +He=",M21=",Ie=",M22=",Je=",SizingMethod='auto expand')",Ke=",transparent),to(rgba(255,255,255,.5)))",Le="-10000",Me="-bottom",Ne="-moz-",Oe="-moz-perspective",Pe="-ms-transform",Qe="-ms-transform-origin",Re="-o-",Se="-pie-background",Te="-webkit-",Ue="-webkit-perspective",Ve="-webkit-tap-highlight-color",We="-webkit-transform",Xe=".",Ye=".AlphaImageLoader(sizingMethod='scale',src='",Ze=".HYPE_element{-webkit-transform:rotateY(0);}video.HYPE_element{-webkit-transform:none;}^{color:#000;`size:16px;`weight:normal;`family:Helvetica,Arial,Sans-Serif;`weight:normal;`style:normal;`variant:normal;text-decoration:none;text-align:left;text-transform:none;text-indent:0;text-shadow:none;line-height:normal;letter-spacing:normal;white-space:normal;word-spacing:normal;@:baseline;border:none;background-color:transparent;background-image:none;-webkit-`smoothing:antialiased;-moz-backface-visibility:hidden;}", +$e=".HYPE_scene ",af=".Matrix(M11=",bf=".gif",cf=".gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)",df=".png",ef="/",Xf="/PIE.htc')",Yf="/blank.gif",Zf="0",$f="0.0",ag="0123456789ABCDEF",bg="0px",cg="1",dg="1.0",eg="100",fg="100%",gg="2d",hg="50%",ig="600px",jg=": ",kg="
",lg="",mg="
",ng="', +qg="=",rg="?",sg="@1x",tg="@2x",ug="APPLY ERR ",vg="Action",wg="Alpha(Opacity=",xg="Android",yg="BD",th="BODY",uh="BackCompat",vh="Body",wh="Composite",xh="Constraint",yh="Error in ",zh="False",Ah="GET",Bh="GHIJKLMNOPQRSTUVWXYZ",Ch="HYPE_element",Dh="HYPE_element ",Eh="HYPE_element HYPE_scene",Fh="HYPE_element HYPE_scene ",Gh="HYPE_element Hype_scene ",Hh="HYPE_element_container",Ih="HYPE_persistent_symbols",Jh="HYPE_scene",Kh="HYPE_scene_index",Lh="HYP_a",Mh="HYP_b",Nh="HYP_c",Oh="HYP_d",Ph="HYP_e", +Qh="HYP_f",Rh="HYP_g",Sh="HYP_h",Th="HYP_i",Uh="HYP_j",Vh="HYP_k",Wh="HYP_l",Xh="HYP_m",Yh="HYP_n",Zh="HYP_o",$h="HYP_p",ai="HYP_q",bi="HYP_t",ci="HYP_u",di="HypeDocumentLoad",ei="HypeSceneLoad",fi="HypeSceneUnload",gi="HypeSwipe",hi="HypeSymbolLoad",ii="HypeSymbolUnload",ji="HypeTimelineAction",ki="HypeTimelineComplete",li="HypeTriggerCustomBehavior",mi="L ",ni="L 0 0 L 40 0 L 40 40 L 0 40",oi="M",pi="MSPointerUp",qi="MouseEvents",ri="MozBoxShadow",si="N",ti="O",ui="P",vi="Q",wi="R",xi="S",yi="T", +zi="True",Ai="U",Bi="V",Ci="W",Di="World",Ei="YES",Kj="^div,^span,^applet,^object,^iframe,^h1,^h2,^h3,^h4,^h5,^h6,^p,^blockquote,^pre,^a,^abbr,^acronym,^address,^big,^cite,^code,^del,^dfn,^em,^img,^ins,^kbd,^q,^s,^samp,^small,^strike,^strong,^sub,^sup,^tt,^var,^b,^u,^i,^center,^dl,^dt,^dd,^ol,^ul,^li,^fieldset,^form,^label,^legend,^table,^caption,^tbody,^tfoot,^thead,^tr,^th,^td,^article,^aside,^canvas,^details,^embed,^figure,^figcaption,^footer,^header,^hgroup,^menu,^nav,^output,^ruby,^section,^summary,^time,^mark,^audio,^video{color:?;`size:?;`weight:?;`family:?;`weight:?;`style:?;`variant:?;text-decoration:?;text-align:?;text-transform:?;text-indent:?;text-shadow:?;line-height:?;letter-spacing:?;white-space:?;word-spacing:?;@:?;border:none;background-color:transparent;background-image:none;padding:0;box-sizing:content-box;}^p{display:block;$:1em 0;}^div,^layer{display:block;}^article,^aside,^footer,^header,^hgroup,^nav,^section{display:block;}^blockquote{display:block;$:1em 40px;}^figcaption{display:block;}^figure{display:block;$:1em 40px;}^q{display:inline;}^q:before{content:open-quote;}^q:after{content:close-quote;}^center{display:block;text-align:center;}^hr{display:block;$:.5em auto;border-style:inset;border-width:1px;}^h1,^h2,^h3,^h4,^h5,^h6{display:block;$-left:0;$-right:0;`weight:bold;}^h1{`size:2em;$-top:.67em;$|:.67em;}^h2{`size:1.5em;$-top:.83em;$|:.83em;}^h3{`size:1.17em;$-top:1em;$|:1em;}^h4{$-top:1.33em;$|:1.33em;}^h5{`size:.83em;$-top:1.67em;$|:1.67em;}^h6{`size:.67em;$-top:2.33em;$|:2.33em;}^table{display:table;border-collapse:separate;border-spacing:2px;border-color:gray;}^thead{display:table-header-group;@:middle;border-color:?;}^tbody{display:table-row-group;@:middle;border-color:?;}^tfoot{display:table-footer-group;@:middle;border-color:?;}^col{display:table-column;}^colgroup{display:table-column-group;}^tr{display:table-row;@:?;border-color:?;}^td,^th{display:table-cell;@:?;}^th{`weight:bold;}^caption{display:table-caption;text-align:center;}^ul,^menu,^dir{display:block;list-style-type:disc;$:1em 0;padding-left:40px;}^ol{display:block;list-style-type:decimal;$:1em 0;padding-left:40px;}^li{display:list-item;$:0;}^ul ul,^ol ul{list-style-type:circle;}^ol ol ul,^ol ul ul,^ul ol ul,^ul ul ul{list-style-type:square;}^dd{display:block;$-left:40px;}^dl{display:block;$:1em 0;}^dt{display:block;}^ol ul,^ul ol,^ul ul,^ol ol{$-top:0;$|:0;}^u,^ins{text-decoration:underline;}^strong,^b{`weight:bolder;}^i,^cite,^em,^var,^address{`style:italic;}^tt,^code,^kbd,^samp{`family:monospace;}^pre,^xmp,^plaintext,^listing{display:block;`family:monospace;white-space:pre;$:1em 0;}^mark{background-color:yellow;color:black;}^big{`size:larger;}^small{`size:smaller;}^s,^strike,^del{text-decoration:line-through;}^sub{@:sub;`size:smaller;}^sup{@:super;`size:smaller;}^nobr{white-space:nowrap;}^a{color:blue;text-decoration:underline;cursor:pointer;}^a:active{color:red;}^noframes{display:none;}^frameset,^frame{display:block;}^frameset{border-color:?;}^iframe{border:0;}^details{display:block;}^summary{display:block;}", +Lj="_",Mj="_blank",Nj="a",Oj="aA",Pj="aB",Qj="aC",Rj="aD",Sj="aE",Tj="aI",Uj="aJ",Vj="aK",Wj="aL",Xj="aM",Yj="aN",Zj="aS",$j="aT",ak="aU",bk="aV",ck="aW",dk="aX",ek="aY",fk="aZ",gk="abort",hk="absolute",ik="acC",jk="afterAdd",kk="afterRemove",lk="afterRender",mk="afterUpdate",nk="alt",ok="aria-busy",pk="aria-flowto",qk="aria-hidden",rk="arraybuffer",sk="audio",tk="audio/ogg",uk="auto",vk="autoplay",wk="autostart",xk="b",yk="bA",zk="bB",Ak="bC",Bk="bF",Ck="bG",Dk="bH",Ek="bI",Fk="bJ",Gk="bK",Hk="bL", +Ik="bM",Jk="bN",Kk="bO",Lk="bP",Mk="bQ",Nk="bR",Ok="bS",Pk="bT",Qk="bU",Rk="bV",Sk="bW",Tk="backdrop-filter",Uk="background-origin",Vk="background-size",Wk="bcC",Xk="beforeAdd",Yk="beforeRemove",Zk="beforeRender",$k="beforeUpdate",al="below ",bl="block",cl="blur(",dl="body",el="body=",fl="boolean",gl="border-radius",hl="box-reflect",il="box-shadow",jl="boxShadow",kl="brightness(",ll="button",ml="c",nl="cB",ol="cC",pl="cD",ql="cF",rl="cG",sl="cH",tl="cI",ul="cJ",vl="cK",wl="cL",xl="cQ",yl="cR",zl= +"cT",Al="cW",Bl="cX",Cl="cY",Dl="cancel",El="canplaythrough",Fl="canvas",Gl="click",Hl="collisionActive",Il="collisionEnd",Jl="collisionStart",Kl="color: coral",Ll="color: red",Ml="composite",Nl="constraint",Ol="contrast(",Pl="controller",Ql="controls",Rl="d",Sl="deg",Tl="deviceorientation",Ul="div",Vl="down",Wl="drag",Xl="dropbox.com",Yl="e",Zl="element",$l="embed",am="embedobj_",bm="end",cm="enter",dm="error",em="exit",fm="f",gm="false",hm="fcC",im="file://",jm="filter",km="flat",lm="font-",mm= +"function",nm="head",om="height",pm="hidden",qm="href",rm="http://",sm="hue-rotate(",tm="hype-obj-",um="hype-scene-",vm="iPad",wm="iPhone",xm="iPod",ym="ibooksimg://",zm="img",Am="img_",Bm="inherit",Cm="j",Dm="kTimelineDefaultIdentifier",Em="kTimelinePhysicsIdentifier: ",Fm="keydown",Gm="keypress",Hm="keyup",Im="l",Jm="left",Km="linear-gradient(",Lm="load",Mm="loop",Nm="m",Om="mailto:",Pm="margin",Qm="mouseConstraint",Rm="mouseclick",Sm="mousedown",Tm="mousemove",Um="mouseout",Vm="mouseover",Wm="mouseup", +Xm="move",Ym="mozHidden",Zm="mozvisibilitychange",$m="msHidden",an="msvisibilitychange",bn="mute",cn="n",dn="no",en="no-repeat",fn="none",gn="number",hn="object",jn="on",kn="onresize",ln="pageshow",mn="pointer-events",nn="pointerup",on="preserve-3d",pn="progid:DXImageTransform.Microsoft",qn="px",rn="px) ",sn="r",tn="resize",un="rgb",vn="rgba",wn="rgba(",xn="rgba(0,0,0,0)",yn="right",zn="role",An="saturate(",Bn="script",Cn="sepia(",Dn="source",En="src",Fn="start",Gn="string",Hn="subject=",In="swipe", +Jn="tX",Kn="tY",Ln="tabindex",Mn="tap",Nn="target",On="title",Pn="touchcancel",Qn="touchend",Rn="touchmove",Sn="touchstart",Tn="transform-origin",Un="transform-style",Vn="true",Wn="type",Xn="up",Yn="url('",Zn="user-select",$n="vertical-align",ao="video",bo="video/ogg",co="video/quicktime",eo="video/webm",fo="visibilitychange",go="warn",ho="webkitHidden",io="webkitvisibilitychange",jo="width",ko="www.",lo="x-ibooks-th://",mo="z";function no(){return function(){}} +p.HYPE_526=function(L,C,La,Ub,Fi,Gi,Lb,x,lc,qo,ff,gf,qa,Hi,zg,hf,ro,so,be){function Ii(a,b,c){var d=ka[Bb],e={x:0,y:0};b=b.aa;a=a[I];for(var f,g,k=b[0],n=b[1],n=0;ne?e=g:g=g){f.nb=g;break}g=a&&(a=1E-6);1==c&&(d=0,e=1,a=ja);b.Xa=d;b.La=e;b.sc=f;V.$a.Xd(b, +a)}}function Ic(a){var b,c,d=sd(a);if(!(qa!=h||a==j||kf==h||d==j||d.Vc==h)){var e=d.ub.ma,f=R[a.id],g=d.yc[f],k=t(a,Ik,0);if(!(0==k&&g==j)){Li(a)==h&&(k=1);var n=t(a,Qk,0.5),q=t(a,Rk,0.1),w=t(a,zl,0.01),l=t(a,Sk,0.0010);0>=l&&(l=1E-6);1==k&&(n=0,q=1,l=ja);var v=t(a,ik,0),Q=t(a,Wk,0),M=t(a,hm,0);b=[1,0,0,1,0,0];c=Bg(a);c[D](a);for(var J=0;JF;F+=G){var P=r*V.Ja.cos(F*u.PI/180)+(d-r),E=y*V.Ja.sin(F*u.PI/180)+y;lb(ba,P*f,E*aa)}lb(ba,d*f,y*aa); +lb(ba,d*f,(e-B)*aa);if(0F;F+=G)P=C*V.Ja.cos(F*u.PI/180)+(d-C),E=B*V.Ja.sin(F*u.PI/180)+(e-B),lb(ba,P*f,E*aa)}lb(ba,(d-C)*f,e*aa);lb(ba,$*f,e*aa);if(0<$||0F;F+=G)P=$*V.Ja.cos(F*u.PI/180)+$,E=x*V.Ja.sin(F*u.PI/180)+(e-x),lb(ba,P*f,E*aa)}lb(ba,0,(e-x)*aa);lb(ba,0,z*aa);if(0F;F+=G)P=A*V.Ja.cos(F*u.PI/180)+A,E=z*V.Ja.sin(F*u.PI/180)+z,lb(ba,P*f,E*aa)}d=Z;for(e=0;e=aa?J:aa),F=b*N,N*=g,b=Q-F,g=v-N,n==h&&l==m?k-=b:n==h&&l==h&&(k-=b/2),q==h&&w==m?c-=g:q==h&& +w==h&&(c-=g/2));b=k}t(f,$h,m)==m&&(Y(f,Jn,0.5),Y(f,Kn,0.5),ia(f,$h,h));Y(f,Nj,b);Y(f,xk,c);Y(f,fm,d[Za](6))}}function Oi(a,b){of=a.Vc=h;var c=u[ab](1E3/60),d=u[bb](1E3*b),e=d-a.Md;a.Md=d;a.hc+=u[bb](e);for(d=0;a.hc>=c&&20>d;)V.Fc[cd](a.ub,c),a.hc-=c,d+=1;V.Fc.ya(a.ub);Hg();a.Vc=m}function pf(a){a=V.zb.Ga(a.ub.ma);for(var b=0;bd?u.PI:0))*(180/u.PI);a.Fd=u[Gb](c*c+d*d);d=a[Fb];qf(d)==h&&(c=rf(d)*a.Fd,d=sf(d)+a.Ed,a.ub.ma.Ub.x=c*V.Ja.cos(d*u.PI/180),a.ub.ma.Ub.y=c*V.Ja.sin(d*u.PI/180));pf(a);Kc()}}function tf(a){for(var b=a;b!=j;){a=t(b,Bk);a==j&&(b=x[G].v[R[b.id]],b!=j&&(a=b.bF));a=Ja(a);if(a==j)break;b=a;if(Eg(b)==h)return b}return j}function Eg(a){return x[G].U[R[a.id]]!=j||t(a,wl)!=j?h:m}function sd(a){a=tf(a);return Ig(a!=j?a.id:j)}function Ig(a){a==j&&(a=C);for(var b=0;bz.ca?e||4==c[tb]:e||1==c[tb]||c.metaKey==h)?9>z.ca||z.Rd||z.Cb!=j?p.open(f,Mj):(9==z.ca||15>z[Cb])&&!(c instanceof MouseEvent)?p.open(f,Mj):(e=s[Db](Nj),e[Ib](qm,f),e[Ib](Nn,Mj),s[Ec][Na](e),f=s.createEvent(qi),f.initMouseEvent(Gl,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hc],c[ic],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c[tb],s[Ec][bd]),e.dispatchEvent(f),s[Ec][Gc](e)):p.top.location= +f);else if(6==f){g=e.l;k=e.m;e=e.n;f=Om;g!=j&&(f+=escape(g));if(k!=j||e!=j)f+=rg,g=[],k!=j&&g[D](Hn+ga(k)),e!=j&&g[D](el+ga(e)),f+=g.join(Ud);f!=Om&&(p.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=h&&(e=m),f!=j&&(f=Mg(f),wa(f,e),f[Jb]())):13==f?(f=e.o,f!=j&&Mg(f)[Dc]()):14==f&&(e=e.B,e!=j&&Ui(e))}}}function vf(a,b){return function(c){Ng(c,b,R[a.id])}}function Og(a,b){return function(c){Vi(c,b,R[a.id])}}function wf(a){var b=t(a,Vj,Zf),c=t(a,Wj,Zf),d=t(a,Tj,Zf),e=t(a,Uj,Zf),b=typeof b!=gn?b:F(b),c=typeof c!= +gn?c:F(c),d=typeof d!=gn?d:F(d),e=typeof e!=gn?e:F(e);a[O][gl]=Z+b+hd+c+hd+e+hd+d}function ee(){}function Wi(a){var b=t(a,dk,8),c=t(a,ck,0);z.vd==j&&(1==1-c&&a[O].removeProperty!=j?a[O].removeProperty(ma.Oa+hl):a[O][ma.Oa+hl]=al+F(b)+id+(1-c)+Ke)}function Pg(a){var b=t(a,Bi);if(b!=j){var c=Z;b==cg?c=Ti(t(a,Ci)):b==Zf&&(c=Z+Ub+ef+t(a,Ai));b=og+c+Xd;z.kb!=j&&(b=mg+b+kg);sa(a,b)}}function Xi(a,b){var c=b==h?yg:Z,d=t(a,c+Hk,0),e=t(a,c+Ck,0),f=t(a,c+Dk,0),g=t(a,c+Ek,1),k=t(a,c+Fk,1),c=t(a,c+Gk,1),n=Z; +0!=d&&(n+=cl+d+rn);0!=e&&(n+=Cn+e+De);0!=f&&(n+=sm+(Z+f+Sl)+De);1!=g&&(n+=An+g+De);if(1!=k){if(6==z.Wd||z.kb!=j&&536.26>=pa(z.Ra))k-=1,1z.ca||(0!=k?c+=md+(Z+k+Sl)+De:b==h&&(1==w&&1==l&&v==m)&&(c+=nd),0!=g&&(c+=ld+(Z+g+Sl)+De));1!=w&&(c+=od+w+De);1!=l&&(c+=pd+l+De);b=Z+(Z+100*Q+Qd)+hd+(Z+100*M+Qd);a[O][ma.Oa+Tn]=b;a[O].MozTransformOrigin=b;a[O].OTransformOrigin=b;a[O][Qe]=b;a[O][Tn]=b; +a[O][We]=c;a[O].MozTransform=c;a[O].OTransform=c;a[O][Pe]=c;a[O].transform=c}function xd(a){9>z.ca?fe(a):ge(a);qa==h&&Ic(a)}function Rg(a){function b(a,b){return Z+a+Km+(Z+(b==h?(u.abs(e)+180)%360:(360-u.abs(e)+270)%360)+Sl)+Fe+xb(c)+Fe+xb(d)+Ce}var c=t(a,cn);if(!(c==j||c==Z)){var d=t(a,Nm);if(!(d==j||d==Z)){var e=t(a,Im);e!=j&&(z.Ra!=j?Ga(a[O],b(ma.Oa,m)):z.xe!=j?Ga(a[O],b(Ne,m)):10>z.ca?a[O][Se]=b(Z,m):Ga(a[O],15>z[Cb]?b(Re,m):b(Z,h)))}}}function Yi(a){Ia(a[O],t(a,Cl,m)==h?fn:t(a,sn,Z));Sg(R[a.id])} +function Mb(a){Mc[a.id]=j;Nc(a)}function Nc(a){try{if(of==h)he[a.id]=a;else{var b=t(a,Ok,36),c=Qg(a),d=R[a.id],e=mf(d),f=nf(e),g=Gg(e),k=nf(d),n=t(a,Nj,0),q=t(a,xk,0),w=t(a,ml,j),l=t(a,Rl,j),v=e=h;w==j&&(e=m,w=k[Ra]);l==j&&(v=m,l=k[dd]);var Q=Vb(d),M=Wb(d),J=M-l,d=n,k=q,N=Q,A=M,r=m;if(Jc==h&&36!=b){var da=0!=(b&1),$=0!=(b&4),x=0!=(b&2),C=0!=(b&8),y=0!=(b&32),B=0!=(b&16),G=0!=(b&64)&&x==h&&B==h,E=0!=(b&128)&&x==h&&B==h,r=0!=(b&256)&&(x==h||B==h),ba=g[Ra]/f[Ra],T=g[dd]/f[dd];x==h&&(N=da==h&&$==h?Q+ +(g[Ra]-f[Ra]):u[ab](Q*ba));da==h&&$==h&&x==m?(b=n+Q/2,d=u[ab](b*ba-Q/2)):da==h&&$==m&&x==h?d=g[Ra]-f[Ra]+n-(N-Q):da==h&&$==m?d=g[Ra]-f[Ra]+n:da==m&&$==m&&(d=u[ab](n*ba));B==h&&(A=C==h&&y==h?M+(g[dd]-f[dd]):u[ab](M*T));C==h&&y==h&&B==m?k=u[ab]((q+M/2)*T-M/2):C==h&&y==m&&B==h?k=g[dd]-f[dd]+q-(A-M):C==h&&y==m?k=g[dd]-f[dd]+q:C==m&&y==m&&(k=u[ab](q*T));if((G==h||E==h)==h)g=N,f=A,q=N/Q,ba=A/M,T=q,G==h?T=q<=ba?q:ba:E==h&&(T=q>=ba?q:ba),N=u[ab](Q*T),A=u[ab](M*T),G=g-N,E=f-A,da==h&&$==m?d+=G:da==h&&$==h&& +(d+=u[ab](G/2)),C==h&&y==m?k+=E:C==h&&y==h&&(k+=u[ab](E/2))}var V=u.max(0,N-(Q-w)),P=u.max(0,A-J);qa==h&&(ia(a,Yh,V),ia(a,Zh,P));e==h?(r==h&&(d+=t(a,Jn,0.5)*(N-Q),ia(a,bi,u.max(0,N/Q)),V=w),ra(a[O],F(V,2))):ra(a[O],Z);v==h?(r==h&&(k+=t(a,Kn,0.5)*(A-M),ia(a,ci,u.max(0,A/M)),P=l),Ma(a[O],F(P,2))):Ma(a[O],Z);if(8>z.ca){var Y=s[cb](Am+a.id);Y!=j&&(w=function(){ra(Y[O],F(a[uc]));Ma(Y[O],F(a[Xc]))},0==a[uc]&&0==a[Xc]?p[vc](w,0):w())}if(9>z.ca){t(a,fm)!=j&&fe(a);var ea=a[Fc][wb][am+a.id];ea!=j&&(ea[Ib](jo, +V),ea[Ib](om,P))}ia(a,Lh,k);ia(a,Mh,d);c==m&&(k+=t(a,Th,0),d+=t(a,Sh,0),a[O].top=F(k),va(a[O],F(d)));if(c==h||r==h)9>z.ca?fe(a):ge(a);qa==h&&Ic(a);Tg==m&&Ug()}}catch(L){}}function Ti(a){a!=j&&0===a[ub](ko)&&(a=rm+a);return a}function ie(a){return a[Ya](/'/g,Sd)}function mb(a,b){if(a[ub])return a[ub](b);for(var c=0;c=e){d=w!=j?w[Ac].y+(l[Ac].y-w[Ac].y)*(e-w[Ac].x)/(l[Ac].x-w[Ac].x):l[Ac].y;break a}w=l}w=j}d=l[Ac].y}c.ea==h&&(d=1-d);e=n;w=a.a;if(w!=ca){n=Vg[w];if(a.b!=j){if(c.zc[w]==j&&(n=a.o,q=a.a,q!=ca)){v=Vg[q];a={};for(var Q=[],J=0,N=0,M=0;Me;e++)r[e]=c[e]+(g[e]-c[e])*d;e=dj(r)}else 1==d&&(e=q);Y(k,f,e);qa==h&&Fg(k,f,e,b)}function bj(a,b,c){var d;d=a[H];var e=0,f,g=0,g={};if(0>b||1b){var w=a.Ka[0];2<=w.qa[H]&&(f=w.qa[0],e=w.qa[1],k=f)}else n=-1,q=1-b,w=a.Ka[a.Ka[H]-1],2<=w.qa[H]&&(f=w.qa[w.qa[H]-2],k=e=w.qa[w.qa[H]-1]);if(f!=j&&e!=j){a=n*(e[Ac].x-f[Ac].x);b=n*(e[Ac].y-f[Ac].y);d*=q;0==b?(g.y=0,g.x=d):(g.y=u[Gb](u.pow(d,2)/(u.pow(a,2)/ +u.pow(b,2)+1)),g.x=g.y*a/b);if(0a&&0>g.x)g.x*=-1;if(0b&&0>g.y)g.y*=-1;g.x+=k[Ac].x;g.y+=k[Ac].y;g.wb=ej(f[Ac],e[Ac])}}else if(0==d)g={x:a.Ka[0].fb.x,y:a.Ka[0].fb.y,wb:0};else{if(1==b)d=a.Ka,f=d[d[H]-1],g=1;else{for(g=0;gb){f=w;break}e+=w[H]}g=(b-e/d)/(f[H]/d);d=f[H]*g;for(b=a=g=0;b=f)b.eb=d+1,yb[g][k]==b.fa&&(1==e.p&&b.sa==h?(e=x[G].v[g].aH,f=Ja(g),e==h&&f[Jb]&&(f.autoplay=h,f[Jb]())):0==e.p&&b.Da[D](e));else break}c=[];for(d=0;d=f){if(yd[e]==b.fa){var q=b.ea==m?n.G:Ca(n.G+n[yc],k),f=0,f=n.z?q-n[yc]:q+n[yc],f=u.max(0,f);zd(k,m);f=nc(f,k,h,h,m);f==m&&Zb(e,j)}b.ab[ed](d,1);d--}}for(d=b.tb;d=f)){b.tb=d+1;var w=n.E,l=n.z,v=q=b.ea==m?n.G:Ca(n.G+n[yc],k),t=m;b.ea==h&&(l=!l);w&&(f=a-f,f>n[yc]?(w=m,f=n[yc]):(b.ab[D](n),t=h),v=l?v-f:v+f,v=u.max(0,v));if(w){if(f=ud(q,e,h))continue;l&&(zd(k,l),v=Ca(Ha(k)-v,k));if(f=nc(v,k,h,h,h))continue;b.sa?(je(k,b.xa),td(e,l,m,m)):Zb(e,j)}else Zb(e,j),ud(v,e,m);t&&(yd[e]=b.fa)}}}function nc(a,b,c,d,e){of=h;for(var f=b.pa,g=b.ea?b.ac:b.ta,k=[],n=u.min(a*b.xa,Ha(b)),q=b.eb;q=l)&&k[D](w)}e=m;if(0==k[H]||d==m)Yg(n,b,g);else{for(var w=d=0,v=b.sa,t=b.ea,q=0;qe&&(a=e);d.ea==h&&(a=Ca(e-a,xa(b)));d.eb=0;d.tb=0;d.Da=[];d.ab=[];b=zb()/1E3;d.pa=b-a;d.Qa=b-d.pa;d.sa==h&&(p[Qa](d.hb),d.hb=p[vc](function(){ke(d)}, +1E3*((e-a)/d.xa)));hj(d,m);Zg(d,0);ij(d,a);a=nc(a,d,m,h,c);Kc();return a}}function Ad(a,b){var c=xa(a);if(c==j)return 0;var d=0;c.sa==h?(d=zb()/1E3-c.pa,d*=c.xa):d=c.Qa;var e=Ha(c);b==h&&c.ea==h&&(d=e-d);d=u.max(0,d);return d=u.min(e,d)}function ij(a,b){for(var c={},d=a.ea?a.ac:a.ta,e=0;e=b&&(c[g]==j&&(c[g]={}),q!=h&&c[g][k]==j&&(q=Ja(g),n==ca&&(a.ea==h&&0==f.d)&&(n=f.s),Y(q,k,n)),c[g][k]=h)}}}} +function td(a,b,c,d){yd[a]=j;var e=xa(a);e!=j&&(c&&je(e,1),zd(e,b),e.sa==m&&(e.pa!=j?e.Qa==Ha(e)?d&&Yb(a,j,b):(e.sa=h,e.pa=zb()/1E3-e.Qa/e.xa,p[Qa](e.hb),e.hb=p[vc](function(){ke(e)},1E3*((Ha(e)-e.Qa)/e.xa)),e.mb!=h&&(Zg(e,e.Qa),e.eb=0,e.tb=0,e.Da=[],e.ab=[]),nc(e.Qa/e.xa,e,m,m),Kc()):(d==h||0==e.Qa)&&Yb(a,j,b)))}function Zb(a,b){yd[a]=j;var c=xa(a);c!=j&&c.sa==h&&(je(c,1),c.Qa=b!=j?b:zb()/1E3-c.pa,c.sa=m,p[Qa](c.hb))}function ke(a){if(!(qa==h&&a.mb==h)&&!nc(Ha(a),a,h,h))if(le(a),me!=j&&Af==a.fa)a= +me,Af=me=j,a();else if(a={type:ki,timelineName:a.Lb.n},Bf(a,j)!==m){var b=Ta();if(b!=j){var c=x[Cf(Df())].F;c!=j&&ta(b,c.a)(a)}}}function Ca(a,b){return qa==h&&b.mb==h?Ef(a,60):Ef(a,b.Lb.f)}function Ef(a,b){var c=u[bb](a);return c+u[Sa]((a-c)*b)/b}function Ha(a){return qa==h&&a.mb==h?31536E3:Ca(a.Lb.d,a)}function Kc(){if(zf!==h){zf=h;var a=function(a){p[vc](a,1E3/60)};(z.kb!=j?a:p.requestAnimationFrame||p.webkitRequestAnimationFrame||p.mozRequestAnimationFrame||a)(function(){zf=m;gj()})}}function le(a){p[Qa](a.hb); +a.eb=0;a.tb=0;a.Da=[];a.ab=[];a.Xe=j;a.pa=j;a.sa=m;a.xa=1;a.Qa=Ha(a);a=mb(eb,a);-1!=a&&eb[ed](a,1)}function jj(a){for(var b=0;b=b&&(db[f]===ca||db[f][g]===ca||db[f][g]==a.fa))yb[f][g]=a.fa}jj(a)}function Yb(a,b,c){yd[a]=j;for(var d=0;dz.ca&&0==a[ub](vn)&&(a=dj(Xg(a),h));return a} +function dj(a,b){if(1==a[3]||b==h){for(var c=ma.Wc,d=Id,e=0;3>e;e++)d+=c[qb](a[e]/16)+c[qb](a[e]%16);return d}return wn+oa(a[0])+Fe+oa(a[1])+Fe+oa(a[2])+Fe+pa(a[3])+Ce}function F(a,b){var c=u.pow(10,b==j?0:b);return Z+u[Sa](a*c)/c+qn}function Xg(a){var b=[0,0,0,1];if(0==a[ub](un)){var c=a[ub](Be),d=a[ub](Ce);if(3c;c++)b[c]=16*d[ub](a[qb](2*c))+d[ub](a[qb](2*c+1))}return b} +function cj(a){typeof a!=gn&&(a=pa(a));return isNaN(a)?0:a}function mj(a,b,c){Gf=m;c!=j&&delete x[G].T[c];Ia(b[O],bl);Y(b,Mk,0,ek,0);ia(b,Xh,Zf);Y(b,xk,0,Nj,0,mo,1,Yl,1);c=x[G].a;c!=j?(ra(b[O],fg),ra(T[O],c+Qd)):(ra(b[O],F(x[G].Y)),ra(T[O],b[O][Ra]));c=x[G].b;c!=j?(Ma(b[O],fg),Ma(T[O],c+Qd)):(Ma(b[O],F(x[G].Z)),Ma(T[O],b[O][dd]));Mc[T.id]=j;Mc[b.id]=j;fa[R[a.id]]&&(a!=j&&a!=b)&&(Ia(a[O],fn),a[Ib](qk,h),Y(a,Mk,0,ek,0,xk,0,Nj,0,mo,0,Yl,1),ia(a,Xh,Zf));T[O][Ue]=j;T[O][ma.Oa+Un]=km;T[O][Oe]=j;T[O].perspective= +j;if(9>z.ca){a=ne(a);for(c=0;cq;q++)for(var w=0;wu.abs(c.x-pe[b].x)&&25>u.abs(c.y-pe[b].y)&&(a.stopPropagation(),a[rb]())}}function oj(a){var b=[],c=x[G].U,d;for(d in c)c[K](d)!=m&&c[d].n==a&&b[D](oc[d]);return b}function Ui(a){var b={type:li, +customBehaviorName:a},c=Lf[a];if(c!=j)for(var d=0;d=d;d++)c[D]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Db=c;a.Hb=ca;a.Sc=m;var c=a.wa?b[Cc][0]:b,e;e=function(b){dh(a);a.ob=Dl;Of(b,a)};a.Ia=e;b=a.wa?a.Qc:s;a.wa?Ua(Pn,a.Ia,b,m):p.self!=p.top&&(d=function(a){(a.relatedTarget===s.documentElement||a.toElement===j)&&e(a)},a.Ia=d,Ua(Um,d,b,m));c=Jf(c);d=a.Db[0];d[Uc].x=c.x;d.end.x=c.x;d[Pa].x=c.x;d[Uc].y=c.y;d.end.y=c.y;d[Pa].y=c.y;sj(a,c);a.pd=function(b){if(!(a.ob===bm||a.ob===Dl))if(Nf== +h)a.Ia(b);else{if(a.uc==m&&(Mf++,a.uc=h,a[U].ua==Wl)){Pf=h;if(a[U].Ya!=j)for(var c=0;cz.ca&&(a.Qc.ondragstart=function(a){return a==j?m:h});if(a[U].Ya!=j)for(c=0;cw,(l||w==m||Pf==h)&&a.Ia(b)):a[U].ua==Mn&&5=t?Jm:yn:0>=t&&-180<=t?Xn:Vl)!=r,x=v/J;else{r=l=Ad(d.fa,m);for(v=J=0;va[U].gc?(b={type:gi+a[U][Oa][qb](0).toUpperCase()+a[U][Oa][Xa](1)+vg},a.qd(b)):a.Ia(b)):a[U].ua==Mn?1500>d&&a.qd(b):a.Ia(b);dh(a)}};Ua(a.wa?Qn:Wm,a.od,b,m);b.setCapture&&b.setCapture();a.tc=zb();a.Xc=a.tc;Pf=Nf=a.uc=m}}}function dh(a){if(a.Sc!=h){a.Sc=h;db={};var b=a.wa?a.Qc:s;b.releaseCapture&&b.releaseCapture();re(a.wa?Rn:Tm,a.pd,b); +re(a.wa?Qn:Wm,a.od,b);a.wa?re(Pn,a.Ia,b):re(Um,a.Ia,b);a[U].ua==Wl&&(Pf=m);a.uc==h&&Mf--;qa==h&&a[U]&&(Ic(a[U].vb),Kc())}}function Of(a,b){b[U].se==h&&(a.hypeGesturePhase=b.ob,a.hypeGestureXPosition=b.Db[0].end.x,a.hypeGestureYPosition=b.Db[0].end.y,b.qd(a))}function re(a,b,c){c[wc]?c[wc](a,b,m):c[Wc]&&c[Wc](jn+a,b)}function Ua(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Qf[D](e);c[Hb]?c[Hb](a,b,m):c[Tb]&&c[Tb](jn+a,b)}function Jf(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hc]|| +a[ic])b.x=a[hc]+s[Ec].scrollLeft+s.documentElement.scrollLeft,b.y=a[ic]+s[Ec].scrollTop+s.documentElement.scrollTop;return b}function uj(a){var b;0==a.c?0==a.A?b=yn:1==a.A&&(b=Jm):1==a.c&&(0==a.A?b=Xn:1==a.A&&(b=Vl));return b}function sj(a,b){var c=a[U][Oa]==yn||a[U][Oa]==Jm?b.x:b.y;a.Hb=a.Hb==ca?c:a[U][Oa]==yn||a[U][Oa]==Vl?u.max(a.Hb,c):u.min(a.Hb,c)}function tj(a,b,c){a=u[Sa](180*u[Eb](b.y-a.y,b.x-a.x)/u.PI);c=u.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Jm;if(a<=45-c&&a>=-45+c)return yn;if(a< +-45-c&&a>-135+c)return Xn;if(a>45+c&&a<135-c)return Vl}function Mg(a){for(var b=Bd[a],c={},d=0;dz.ca?wo:xo;d={};d.kd=z.kb!=j;var f=Sf[a];f==j&&(f=new b(a,c),f.Lf=a,f.cc=c,f.options=d,f.jd=function(){var a=[],b;for(b in f.cc)f.cc[K](b)!=m&&a[D](b); +return a.sort()});return f}function vj(a){a=Bd[a];if(a!=j){for(var b=1=$b[H]?wj():b==h&&gh==m&&(gh=h,p[vc](function(){xj()},1))}function xj(){0>=$b[H]||(gh=m,yj($b[0],h))}function yj(a,b){var c=La[a].p;if(1==c)if(c=La[a].g,c!=j&&vj(c)!=a)fh(a,b);else{var d=new Image,c=function(c){d=this;if((z.Pc!= +j||z.Wd!=j&&z.kb==j)&&c[Ob]==Lm&&-1!=Ub[ub](Xl)&&-1==d.src[ub](bf))try{var e=s[Db](Fl);ra(e,d[Ra]);Ma(e,d[dd]);e.getContext(gg).drawImage(d,0,0);zj[d.Ne]=e.toDataURL()}catch(k){}fh(a,b)},e=Rf(a);d.onload=c;d.onerror=c;d.onabort=c;d.src=e;d.Ne=a}else 2==c&&(c=function(){for(var c=Bd[La[a].g],d=0;dpa(z.Ra)||9>z.ca?p[vc](c,1):e.load(c,c))}function wj(){gf!=j&&gf(m,T);if(Bf({type:di},T)!==m)if(-1==zg)Lc(Pc);else{se=h;for(var a= +-1,b=0;bc&&(c=f),ra(T[O],F(c)),Mc[T.id]=j,T[O].margin==uk&&(ka&&(a=g),Ma(T[O],F(a)))}function Dd(a){var b=T[bd].offsetHeight,c=x[a].b;return c!=j?c/100*b:x[a].Z}function Cd(a){var b=T[bd][ib],c=x[a].a;return c!=j?c/100*b:x[a].Y}function hh(a,b,c,d){if(!(Aj(a)==j||Gf==h)){c==j&&(c=1.1);c=Ef(c,60);Gf=h;var e=function(){d!=j&&d();nb=[];Lf={};var e=Ta();Jc=x[a].a!=j||x[a].b!=j?h:m;var f=Aj(a),g=G,k=Ta();if(k!=j){for(var n=k[fc](ao),l=0;lF&&(F=l[O][dc]))}else w[D]({container:l,domElement:E,sceneElement:v});la[k].Kd==m&&(qa==h&&Lg(qc[k]),nj(l,h),la[k].Kd=h)}for(l= +0;lg?P:g,fa[C].a=0,fa[C].b=0)):(te(e,ea,h,m),P!=g&&(W[D](ac(Rl,0,S,ml,C,P,g)),fa[C]={},fa[C].c=X>L?X:L,fa[C].d=P,fa[C].a=0,fa[C].b=0)),q=Nj,f=L,r=-1*L,5==b?(f=-1*X,r=X):6==b?(q=xk,f=-1*P,r=P):7==b&&(q=xk,f=g,r=-1*g),e!=j&&(w=R[e.id],Y(e,ml,X,Rl,P),W[D](ac(q,0,S,ml,w,0,f))),W[D](ac(q,0,S,ml,R[ea.id],r,0)),Y(ea,ml,L,Rl,g,q,r),ih(Vh,S,W,e,ea),Ia(ea[O],bl)):(te(e,ea,m,m),mj(e,ea,j));Qc()},f=m,g= +Ta();g[Ib](qk,h);if(Bj==h&&g!=j){var g=Cf(Df()),k={type:fi};if(Bf(k,j)!==m){var n=x[g].B;if(n!=j){for(var q=n.a,w=ta(Ta(),q),n=0;nk;k++){var n=fj(e,k/99),q={};q.location=n;b&&(g=eh(n,g),f+=g,Aa(q,g)); +e.qa[D](q);g=n}c+=f;Aa(e,f)}return c}function fj(a,b){var c=Fd(a.fb,a.Jb,b),d=Fd(a.Jb,a.Bb,b),e=Fd(a.Bb,a.Rb,b),f=Fd(c,d,b),d=Fd(d,e,b),f=Fd(f,d,b),g=m,k=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?k=e:(k=c,g=h));f.wb=ej(f,k);g==h&&(f.wb+=180);return f}function ej(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*u.atan((b.y-a.y)/(b.x-a.x))/u.PI;b.xc)break;b=e}}return b}function Gg(a){var b=qc[Df()];a!=j&&(b=qc[a]);a=Mc[b];a==j&&(a=s[cb](b),a={width:a[ib],height:a.offsetHeight},Mc[b]=a);return a}function nf(a){var b=0,c=0;a==j?(b=x[G].Y,c=x[G].Z):(b=Vb(a),c=Wb(a));return{width:b,height:c}}function Qg(a){return(z.Ra!=j||3.5<=z.Cb||10<=z.ca)&&t(a,Xh)==cg}function Hg(){of=m;Tg=h;for(var a in he)he[K](a)&&Nc(he[a]);Tg=m;Ug();he={}} +function Ug(){p[vc](function(){de!=j&&(kh?lh=h:(kh=h,de.refreshAll(),kh=m,lh&&(lh=m,Ug())))},0)}function mh(a,b,c){var d=b;if(d==j||s[cb](d)!=j){do d=c+Hj();while(s[cb](d)!=j)}qc[a]=d;R[d]=a;return nh[b!=j?b:d]=d}function Ja(a){return s[cb](qc[a])}function zb(){return(new Date).getTime()}function Hj(){for(var a=Z,b=ma.Wc+Bh,c=0;20>c;c++)var d=u[bb](u.random()*b[H]),a=a+b.substring(d,d+1);return a}function xo(a){var b=this;Sf[a]=b;b.bc=function(){var a=s[Db](sk);b.Ha=a;for(var d=b.jd(),e=0;ez.ca&&(b=b.match(/('|")(http.*?css.*?)('|")/),b!=j&&2<=b[H]&&s.createStyleSheet(b[2]));p[vc](Qc,120);p[vc](Qc,1200);a=s[Db](Ul);a.id=Ih;Ia(a[O], +fn);a[Ib](qk,h);T[Na](a);for(b=0;bz.ca)xj();else for(L=0;Lz.ca|| +z.Rd){if(1==oa(b))ia(a,Rh,Z),ia(a,Qh,Z);else{var c=wg+u[Sa](100*b)+Ce;ia(a,Rh,ma.wc+Xe+c);ia(a,Qh,c.toLowerCase());a[O].backgroundColor==Z&&a[O].backgroundImage==Z&&s[cb](Am+a.id)==j&&Ga(a[O],Yn+ie(Z+Ub+Yf)+Wd)}fe(a)}a[O].opacity=b;a[O].MozOpacity=b},aP:function(a,b){a[O].cursor=b},bD:function(a,b){a[O][ma.Oa+Zn]=b;a[O].MozUserSelect=b;a.onselectstart=function(){return m}},N:function(a,b){a[O].borderLeftWidth=F(b);Mb(a)},O:function(a,b){a[O].borderRightWidth=F(b);Mb(a)},P:function(a,b){a[O].borderTopWidth= +F(b);Mb(a)},M:function(a,b){a[O].borderBottomWidth=F(b);Mb(a)},B:function(a,b){a[O].borderLeftColor=xb(b)},C:function(a,b){a[O].borderRightColor=xb(b)},D:function(a,b){a[O].borderTopColor=xb(b)},A:function(a,b){a[O].borderBottomColor=xb(b)},J:function(a,b){a[O].borderLeftStyle=b},K:function(a,b){a[O].borderRightStyle=b},L:function(a,b){a[O].borderTopStyle=b},I:function(a,b){a[O].borderBottomStyle=b},aK:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopLeftRadius=b;a[O].MozBorderRadiusTopleft=b;9> +z.ca&&wf(a)},aL:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopRightRadius=b;a[O].MozBorderRadiusTopright=b;9>z.ca&&wf(a)},aI:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomLeftRadius=b;a[O].MozBorderRadiusBottomleft=b;9>z.ca&&wf(a)},aJ:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomRightRadius=b;a[O].MozBorderRadiusBottomright=b;9>z.ca&&wf(a)},bE:function(a,b){sa(a,Z);var c,d=Bd[b];if(d!=j){for(var e=0;ez.ca){d=a[Fc][Db](Ul);Da(d,Ch);for(e=0;ez.ca)try{c.SetControllerVisible(0!=oa(b))}catch(d){p[vc](function(){fb.aO(a,b)},100)}},aR:function(a,b){a[Ib](bn,b);a.volume=0!=b?$f:dg;var c=a[Fc][wb][am+a.id]; +if(c!=j&&9>z.ca)try{c.SetMute(0!=oa(b))}catch(d){p[vc](function(){fb.aR(a,b)},100)}},aQ:function(a,b){a[Ib](Mm,b);wa(a,0!=b);var c=a[Fc][wb][am+a.id];if(c!=j&&9>z.ca)try{c.pf(0!=oa(b))}catch(d){p[vc](function(){fb.aQ(a,b)},100)}},j:function(a,b){Ba(a[O],b)},r:Yi,cY:Yi,aG:function(a,b){a[Ib](On,b);a[Ib](nk,b)},g:function(a,b){a[O].backgroundColor=xb(b)},n:Rg,m:Rg,l:Rg,h:function(a,b){var c=vj(b);if(c!=j){var d=La[c].n,e=Rf(c);if((3.6>z.Cb||9>z.ca)&&(a[O].backgroundRepeat==j||a[O].backgroundRepeat== +Z||a[O].backgroundRepeat==en)){var f=Am+a.id,c=s[cb](f);c!=j?c.src=e:(c=s[Db](zm),c.src=e,c.id=f,Ba(c[O],hk),ra(c[O],fg),Ma(c[O],fg),c[O].top=Zf,va(c[O],Zf),za(c[O],Le),a[Na](c));ia(c,Oh,c.src);9>z.ca&&d.substr(d[H]-4).toLowerCase()==df&&(c.src=Z+Ub+Yf,e=ie(e)[Ya](/\%/gi,Rd),ia(c,Ph,ma.wc+Ye+e+Wd),ia(c,Nh,ma.wc+cf),fe(c));Nc(a)}else d=zj[c],Ga(a[O],d!=j?Yn+d+Wd:Yn+ie(e)+Wd)}},q:function(a,b){a[O].backgroundSize=b;a[O][ma.Oa+Vk]=b;a[O].MozBackgroundSize=b},o:function(a,b){a[O].backgroundOrigin=b;a[O][ma.Oa+ +Uk]=b;a[O].MozBackgroundOrigin=b},p:function(a,b){if(b!=j&&b!=en){var c=s[cb](Am+a.id);c!=j&&(Ga(a[O],Yn+ie(t(c,Oh))+Wd),c[bd][Gc](c))}a[O].backgroundRepeat=b},x:function(a,b){a[O].overflow=b},aT:function(a,b){a[O].paddingLeft=F(b);Mb(a)},aU:function(a,b){a[O].paddingRight=F(b);Mb(a)},aV:function(a,b){a[O].paddingTop=F(b);Mb(a)},aS:function(a,b){a[O].paddingBottom=F(b);Mb(a)},S:yf,T:yf,R:yf,Q:yf,bB:xf,bC:xf,bA:xf,aZ:xf,bL:function(a){vd(a);z.Pc!=j&&a[O][We]==Z&&(a[O][We]=fn)},bG:vd,bH:vd,bI:vd,bJ:vd, +bK:vd,BDbL:wd,BDbG:wd,BDbH:wd,BDbI:wd,BDbJ:wd,BDbK:wd,Z:function(a,b){a[O].wordWrap=b},yy:function(a,b){a[O].whiteSpace=b},y:function(a,b){a[O].whiteSpaceCollapsing=b},z:function(a,b){za(a[O],b);a[bd][sc]==Hh&&za(a[bd][O],b)},aA:function(a,b){var c=ta(a,b.a);be&&(Oc(a,{Eb:1,ua:Mn},c),a[O][Ve]=xn);a[Ib](zn,ll);Va(Gl,a,c,h)},aD:function(a,b){Va(Vm,a,ta(a,b.a),m)},aC:function(a,b){Va(Um,a,ta(a,b.a),m)},aE:function(a,b){var c=ta(a,b.a);be&&(Va(Qn,a,c,h),a[O][Ve]=xn);a[Ib](zn,ll);Va(Wm,a,c,h)},aB:function(a, +b){var c=ta(a,b.a);if(be){var d=m;if(z.kb!=j)for(var e=b.a,f=0;fz.ca?c():Qi(a,c,cm)},cX:function(a,b){9>z.ca||Qi(a,ta(a,b.a),em)},cG:function(a,b){Oc(a,{Eb:1,direction:yn,gc:30,ua:In},ta(a,b.a))},cH:function(a,b){Oc(a,{Eb:1,direction:Jm,gc:30,ua:In},ta(a,b.a))},cI:function(a,b){Oc(a,{Eb:1,direction:Xn,gc:30,ua:In},ta(a,b.a))},cJ:function(a, +b){Oc(a,{Eb:1,direction:Vl,gc:30,ua:In},ta(a,b.a))},cK:ee,cF:ee,aM:function(a,b){Va(Vm,a,Og(a,b),m);Va(Um,a,vf(a,b),m)},aN:function(a,b){be&&(Va(Sn,a,Og(a,b),m),Va(Rn,a,vf(a,b),m),Va(Qn,a,vf(a,b),m),a[O][Ve]=xn);Va(Sm,a,Og(a,b),m);Va(Wm,a,vf(a,b),m)},V:Pg,U:Pg,W:Pg,w:function(a,b){var c=s[cb](Am+a.id),c=c!=j?c.cloneNode(h):j;sa(a,b);for(var d=a[fc](Bn),e=0;ez.ca){var c=function(b){b=b?b:p[fd];if(a[O][mn]==fn){var c=a[O].display;Ia(a[O],fn);var f=s.elementFromPoint(b[hc],b[ic]);Ia(a[O],c?c:Z);s.createEvent?(b[rb](),c=s.createEvent(qi),c.initMouseEvent(b[Ob], +b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hc],b[ic],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b[tb],j),f.dispatchEvent(c)):(c=s.createEventObject(),c.clientX=b[hc],c.clientY=b[ic],f.fireEvent(jn+b[Ob],c),event.cancelBubble=h)}};Ua(pi,c,a,h);Ua(Wm,c,a,h);Ua(Sm,c,a,h);Ua(Gl,c,a,h)}}},Sf={},Gd=j,ce=[Nj,xk,fm],Ka=[],kf=m;fb.bM=Ic;fb.bU=jf;fb.bV=jf;fb.cT=jf;fb.bW=jf;var V,X={},E={ge:4},yo=1,zo=-1;E.create=function(a){var b={id:y.Wb(),type:dl,label:vh,ba:0,aa:S.Id(ni),position:{x:0,y:0}, +Ba:{x:0,y:0},ic:0,ka:{x:0,y:0},Ea:{x:0,y:0,ba:0},speed:0,Sa:0,ha:{x:0,y:0},va:0,da:m,ia:m,rb:0,hd:60,Ab:0.0010,Xa:0,La:0.1,sc:0.01,pc:{Bd:1,Nd:4294967295,group:0},yb:0.05,gb:1,ya:{visible:h,Sf:{Wf:1,Xf:1},lineWidth:1.5}},b=y[pb](b,a);b.ga=b.ga||gb[kc](b.aa);b.$=b.$||r.mc(b[I]);b.oa=b.oa||b.ba;E.Zd(b,b.aa);E.Yd(b,b.da);Wa.set(b,b.ia);S[Bc](b.aa,b.ba,b[I]);Rc[Bc](b.Ua,b.ba);gb[cd](b.ga,b.aa,b.ha);b.Ua=a.Ua||b.Ua;b.Ta=a.Ta||b.Ta;E.Cc(b,a.Wa||b.Wa);E.gd(b,a.qb||b.qb);a=b.da?Pd:y.ne();var c=y.Qe(a);b.ya.fillStyle= +b.ya.fillStyle||a;b.ya.strokeStyle=b.ya.strokeStyle||c;return b};E.If=function(a){return a?zo--:yo++};E.Yd=function(a,b){if(a.da=b)a.Xa=0,a.La=1,a.Wa=a.qb=a.Ab=ja,a.ra=a.Ma=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,a.va=0,ua(a,0),a.Sa=0,a.rb=0};E.Cc=function(a,b){a.Wa=b;a.ra=1/a.Wa;a.Ab=a.Wa/a.Ta};E.Xd=function(a,b){E.Cc(a,b*a.Ta);a.Ab=b};E.gd=function(a,b){a.qb=b;a.Ma=1/a.qb};E.Zd=function(a,b){a.aa=b[0][Ec]===a?b:S[kc](b,a);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);var c=S.Oc(a.aa);S[Pb](a.aa, +c,-1);E.gd(a,E.ge*S.qb(a.aa,a.Wa));S[Pb](a.aa,a[I]);gb[cd](a.ga,a.aa,a.ha)};E.Dc=function(a,b){var c=r.sub(b,a[I]);a[I].x=b.x;a[I].y=b.y;a.$.x+=c.x;a.$.y+=c.y;S[Pb](a.aa,c);gb[cd](a.ga,a.aa,a.ha)};E.fd=function(a,b){var c=b-a.ba;a.ba=b;a.oa+=c;S[Bc](a.aa,c,a[I]);Rc[Bc](a.Ua,c);gb[cd](a.ga,a.aa,a.ha)};E.Pe=function(a,b){a.$.x=a[I].x-b.x;a.$.y=a[I].y-b.y;a.ha.x=b.x;a.ha.y=b.y;ua(a,r.Vb(a.ha))};E.Oe=function(a,b){a.oa=a.ba-b;a.va=b;a.Sa=y.abs(a.va)};E.translate=function(a,b){E.Dc(a,r.add(a[I],b))};E.rotate= +function(a,b){E.fd(a,a.ba+b)};E.scale=function(a,b,c,d){S.scale(a.aa,b,c,d);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);S[Pb](a.aa,{x:-a[I].x,y:-a[I].y});E.gd(a,S.qb(a.aa,a.Wa));S[Pb](a.aa,{x:a[I].x,y:a[I].y});gb[cd](a.ga,a.aa,a.ha)};E.Me=function(a){for(var b=0;be.max.x||g.ga.max.ye.max.y)||E[cd](g,b,c,d))}};E.update=function(a,b,c,d){b=u.pow(b*c*a.gb,2);c=1-a.sc*c*a.gb;var e=a[I].y-a.$.y;a.ha.x=(a[I].x-a.$.x)*c*d+a.Ba.x/a.Wa*b;a.ha.y=e*c*d+a.Ba.y/a.Wa*b;a.$.x=a[I].x;a.$.y=a[I].y;a[I].x+=a.ha.x;a[I].y+=a.ha.y;a.va=(a.ba-a.oa)*c*d+a.ic/a.qb*b;a.oa=a.ba;a.ba+=a.va;ua(a,r.Vb(a.ha));a.Sa=y.abs(a.va);S[Pb](a.aa,a.ha);0!==a.va&&(S[Bc](a.aa,a.va,a[I]),Rc[Bc](a.Ua,a.va));gb[cd](a.ga,a.aa,a.ha)};E.sf=function(a, +b,c){a.Ba.x+=c.x;a.Ba.y+=c.y;a.ic+=((b.x-a[I].x)*c.y-(b.y-a[I].y)*c.x)*a.Ma};var B={create:function(a){return y[pb]({id:y.Wb(),type:Ml,parent:j,vc:m,bb:[],Ob:[],na:[],label:wh},a)},Aa:function(a,b,c,d){a.vc=b;c&&a.parent&&B.Aa(a.parent,b,c,d);if(d)for(var e=0;el.ga.max.x||l.ga.min.x>g.ga[Ra]||0>l.ga.max.y||l.ga.min.y>g.ga[dd])){var v;v=l.ga;v=Ki(u[bb](v.min.x/a.yd),u[bb](v.max.x/a.yd),u[bb](v.min.y/a.xd),u[bb](v.max.y/a.xd));if(!l[sb]||v.id!==l[sb].id||d){r.wd+=1;if(!l[sb]||d)l.region=v;var t;n=v;q=l[sb]; +e=u.min(n.dc,q.dc);f=u.max(n.Qb,q.Qb);t=u.min(n.ec,q.ec);n=u.max(n.Sb,q.Sb);t=Ki(e,f,t,n);for(e=t.dc;e<=t.Qb;e++)for(f=t.ec;f<=t.Sb;f++){q=e+Fe+f;n=k[q];var x=e>=v.dc&&e<=v.Qb&&f>=v.ec&&f<=v.Sb,z=e>=l[sb].dc&&e<=l[sb].Qb&&f>=l[sb].ec&&f<=l[sb].Sb;if(!x&&z&&z&&n){var C=a,A=n,B=l;A[ed](y[ub](A,B),1);for(var E=0;EL*f.La*d&&(F=L*f.La*d* +G);G=r.jb(C,q);L=r.jb(z,q);G=l/(f.ra+k.Ma*G*G+n.Ma*L*L);A*=G;F*=G;0>E&&E*E>4*d?(x.Ib=0,x.Kb=0):(E=x.Ib,x.Ib=u.min(x.Ib+A,0),A=x.Ib-E,E=x.Kb,x.Kb=y.Nb(x.Kb+F,-B,B),F=x.Kb-E);c.x=q.x*A+g.x*F;c.y=q.y*A+g.y*F;!k.da&&!k.ia&&(k.$.x+=c.x*k.ra,k.$.y+=c.y*k.ra,k.oa+=r.jb(C,c)*k.Ma);!n.da&&!n.ia&&(n.$.x-=c.x*n.ra,n.$.y-=c.y*n.ra,n.oa-=r.jb(z,c)*n.Ma)}}}}},qh={Cd:function(a,b,c){var d,e;d=m;c?(e=a[vb]*a[vb]+a.Sa*a.Sa+b[vb]*b[vb]+b.Sa*b.Sa,d=c&&c.ib&&0.2>e,e=c):e={ib:m,ja:a,la:b};if(c&&d){if(c=Ag(c.ja.aa,c.la.aa, +[c.ja.Ua[c.Nc]]),e.Vd=h,0>=c.nb)return e.ib=m,e}else{c=Ag(a.aa,b.aa,a.Ua);if(0>=c.nb)return e.ib=m,e;d=Ag(b.aa,a.aa,b.Ua);if(0>=d.nb)return e.ib=m,e;c.nbd[H]&&(a=Ii(b,a,r.Od(e.Pa)),S[Zc](b.aa,a[0])&&d[D](a[0]), +2>d[H]&&S[Zc](b.aa,a[1])&&d[D](a[1]));2>d[H]&&(d=[c[0]]);e.ld=d;e.We=r.sub(d[0],e.Ce);return e}},Vf={create:function(a){a.ja&&!a.Zb&&(a.Zb={x:0,y:0});a.la&&!a.$b&&(a.$b={x:0,y:0});var b=a.ja?r.add(a.ja[I],a.Zb):a.Zb,c=a.la?r.add(a.la[I],a.$b):a.$b,b=r.Vb(r.sub(b,c));Aa(a,a[H]||b||1E-6);a.ya=y[pb]({visible:h,lineWidth:2,strokeStyle:Ld},a.ya);a.id=a.id||y.Wb();a.label=a.label||xh;a.type=Nl;a.ae=a.ae||1;a.Mc=a.Mc||0;a.Kc=a.ja?a.ja.ba:a.Kc;a.Lc=a.la?a.la.ba:a.Lc;return a},Te:function(a,b){for(var c=0;c< +a[H];c++)Vf.Se(a[c],b)},Se:function(a,b){var c=a.ja,d=a.la,e=a.Zb,f=a.$b;c&&!c.da&&(a.Zb=r[Bc](e,c.ba-a.Kc),a.Kc=c.ba);d&&!d.da&&(a.$b=r[Bc](f,d.ba-a.Lc),a.Lc=d.ba);var g=e,k=f;c&&(g=r.add(c[I],e));d&&(k=r.add(d[I],f));if(g&&k){var e=r.sub(g,k),n=r.Vb(e);0===n&&(n=1E-6);f=r.we(e,n);e=r.sb(e,0.5*((n-a[H])/n)*a.ae*b*b);if(!(y.abs(1-n/a[H])<0.0010*b)){var q,t,l;c&&!c.da?(q={x:g.x-c[I].x+e.x,y:g.y-c[I].y+e.y},c.ha.x=c[I].x-c.$.x,c.ha.y=c[I].y-c.$.y,c.va=c.ba-c.oa,g=r.add(c.ha,r.sb(r.Xb(q),c.va)),n=r.za(q, +f),n=c.ra+c.Ma*n*n):(g={x:0,y:0},n=c?c.ra:0);d&&!d.da?(t={x:k.x-d[I].x-e.x,y:k.y-d[I].y-e.y},d.ha.x=d[I].x-d.$.x,d.ha.y=d[I].y-d.$.y,d.va=d.ba-d.oa,k=r.add(d.ha,r.sb(r.Xb(t),d.va)),l=r.za(t,f),l=d.ra+d.Ma*l*l):(k={x:0,y:0},l=d?d.ra:0);k=r.za(f,r.sub(k,g))/(n+l);0>16)+c;var d=(b>>8&255)+c,b=(b&255)+c;return Id+(16777216+65536*(255>a?1>a?0:a:255)+256*(255>d?1>d?0:d:255)+(255>b?1>b?0:b:255))[jc](16)[Xa](1)},Rf:function(a){for(var b=a[H]- +1;0c?c:a},Re:function(a){return 0>a?-1:1},now:function(){var a=p.performance;return a?(a.now=a.now||a.webkitNow||a.Hf||a.Jf||a.Ff,+a.now()):+new Date},random:function(a,b){a="undefined"!== +typeof a?a:0;y.Gc=(9301*y.Gc+49297)%233280;return a+y.Gc/233280*(("undefined"!==typeof b?b:1)-a)},vf:function(a){a=a[Ya](Id,Z);3==a[H]&&(a=a[qb](0)+a[qb](0)+a[qb](1)+a[qb](1)+a[qb](2)+a[qb](2));return oa(a,16)},log:function(a,b){if(console&&console.log){var c;switch(b){case go:c=Kl;break;case dm:c=Ll}console.log(Td+b+jg+a,c)}},Wb:function(){return y.je++},sin:function(a){return pa(u.sin(a)[Za](8))},cos:function(a){return pa(u.cos(a)[Za](8))},indexOf:function(a,b){if(a[ub])return a[ub](b);for(var c= +0;c=e.hd&&Wa.set(e,h)):0Wa.ie*c&&Wa.set(f,m)}}},set:function(a,b){b?(a.ia=h,a.xb=a.hd,a.ka.x=0,a.ka.y=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,ua(a,0),a.Sa=0,a.rb=0):(a.ia=m,a.xb=0)}},Rc={Jd:function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x);e.xa.max.y&&(a.max.y=e.y);e.y=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},Pd:function(a,b){return a.min.x<=b.max.x&& +a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},translate:function(a,b){a.min.x+=b.x;a.max.x+=b.x;a.min.y+=b.y;a.max.y+=b.y},shift:function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x;a.max.x=b.x+c;a.min.y=b.y;a.max.y=b.y+d}},r={mc:function(a){return{x:a.x,y:a.y}},Vb:function(a){return y[Gb](a.x*a.x+a.y*a.y)},Cf:function(a){return a.x*a.x+a.y*a.y},rotate:function(a,b){var c=y.cos(b),d=y.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},Qf:function(a,b,c){var d=y.cos(b);b=y.sin(b);return{x:c.x+ +((a.x-c.x)*d-(a.y-c.y)*b),y:c.y+((a.x-c.x)*b+(a.y-c.y)*d)}},xc:function(a){var b=r.Vb(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},za:function(a,b){return a.x*b.x+a.y*b.y},jb:function(a,b){return a.x*b.y-a.y*b.x},add:function(a,b){return{x:a.x+b.x,y:a.y+b.y}},sub:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},sb:function(a,b){return{x:a.x*b,y:a.y*b}},we:function(a,b){return{x:a.x/b,y:a.y/b}},Xb:function(a){var b;b=b===h?-1:1;return{x:b*-a.y,y:b*a.x}},Od:function(a){return{x:-a.x,y:-a.y}},ba:function(a, +b){return u[Eb](b.y-a.y,b.x-a.x)}},S={create:function(a,b){for(var c=[],d=0;dy.oa||y.Db||y.Ka!=j?n.open(f,Of):(9==y.oa||15>y[Sa])&&!(c instanceof MouseEvent)?n.open(f,Of):(e=p[Ta](X),e[B](Ci,f),e[B](Mj,Of),p[zb][ua](e),f=p.createEvent(Af),f.initMouseEvent(ei, +c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hb],c[ib],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,p[zb][Qb]),e.dispatchEvent(f),p[zb][Ab](e)):n.top.location=f);else if(6==f){h=e.l;l=e.m;e=e.n;f=Xi;h!=j&&(f+=escape(h));if(l!=j||e!=j)f+=ee,h=[],l!=j&&h[A](Gj+ba(l)),e!=j&&h[A](Kh+ba(e)),f+=h.join(zc);f!=Xi&&(n.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=g&&(e=k),f!=j&&(f=oe(f),ka(f,e),f[Va]())):13==f?(f=e.o,f!=j&&oe(f)[yb]()):14==f&&(e=e.B,e!=j&&Wf(e))}}}function zd(a,b){return function(c){pe(c, +b,O[a.id])}}function qe(a,b){return function(c){Xf(c,b,O[a.id])}}function Lc(){}function Yf(a){var b=u(a,$g,8),c=u(a,Zg,0);y.hb==j&&(1==1-c&&a[L].removeProperty!=j?a[L].removeProperty(da.la+Lh):a[L][da.la+Lh]=Hh+x(b)+Wb+(1-c)+Hc)}function re(a){var b=u(a,Kf);if(b!=j){var c=W;b==rd?c=Vf(u(a,Lf)):b==od&&(c=W+jc+nd+u(a,Jf));b=be+c+Cc;y.va!=j&&(b=ae+b+Zd);ja(a,b)}}function Zf(a,b){var c=b==g?ke:W,d=u(a,c+wh,0),e=u(a,c+rh,0),f=u(a,c+sh,0),h=u(a,c+th,1),l=u(a,c+uh,1),c=u(a,c+vh,1),m=W;0!=d&&(m+=Jh+d+rj); +0!=e&&(m+=Bj+e+Fc);0!=f&&(m+=Ei+(W+f+ii)+Fc);1!=h&&(m+=zj+h+Fc);if(1!=l){if(6==y.pb||y.va!=j&&536.26>=ha(y.na))l-=1,1y.oa||(0!=l?c+=$b+(W+l+ii)+Fc:b==g&&(1==q&&1==t&&rb==k)&&(c+=ac),0!=h&&(c+=Zb+(W+h+ii)+Fc));1!=q&&(c+=bc+q+Fc);1!=t&&(c+=cc+t+Fc);b=W+(W+100*w+hc)+Vb+(W+100*I+hc);a[L][da.la+Sj]=b;a[L].MozTransformOrigin=b;a[L].OTransformOrigin= +b;a[L][ed]=b;a[L][Sj]=b;a[L][jd]=c;a[L].MozTransform=c;a[L].OTransform=c;a[L][dd]=c;a[L].transform=c}function oc(a){Mc(a)}function te(a){function b(a,b){return W+a+Ti+(W+(b==g?(z.abs(e)+180)%360:(360-z.abs(e)+270)%360)+ii)+Gc+c+Gc+d+Ec}var c=u(a,gj);if(!(c==j||c==W)){var d=u(a,Wi);if(!(d==j||d==W)){var e=u(a,Ri);e!=j&&(a[L].backgroundImage=y.na!=j?b(da.la,k):y.yb!=j?b(bd,k):15>y[Sa]?b(fd,k):b(W,g))}}}function $f(a){qa(a[L],u(a,ai,k)==g?ij:u(a,sj,W));ue(O[a.id])}function Ya(a){Ib[a.id]=j;pc(a)}function pc(a){try{if(Cd== +g)Nc[a.id]=a;else{var b=u(a,Ch,36),c=se(a),d=O[a.id],e=ve(d),f=ag(e),h=bg(e),l=ag(d),m=u(a,X,0),s=u(a,mh,0),q=u(a,Qh,j),t=u(a,hi,j),rb=e=g;q==j&&(e=k,q=l[Ba]);t==j&&(rb=k,t=l[Rb]);var w=Oc(d),I=Pc(d),d=I-t,l=m,P=s,v=w,M=I,y=k;if(nc==g&&36!=b){var r=0!=(b&1),Jb=0!=(b&4),G=0!=(b&2),Na=0!=(b&8),F=0!=(b&32),D=0!=(b&16),J=0!=(b&64)&&G==g&&D==g,E=0!=(b&128)&&G==g&&D==g,y=0!=(b&256)&&(G==g||D==g),Q=h[Ba]/f[Ba],R=h[Rb]/f[Rb];G==g&&(v=r==g&&Jb==g?w+(h[Ba]-f[Ba]):z[Ga](w*Q));r==g&&Jb==g&&G==k?(b=m+w/2,l=z[Ga](b* +Q-w/2)):r==g&&Jb==k&&G==g?l=h[Ba]-f[Ba]+m-(v-w):r==g&&Jb==k?l=h[Ba]-f[Ba]+m:r==k&&Jb==k&&(l=z[Ga](m*Q));D==g&&(M=Na==g&&F==g?I+(h[Rb]-f[Rb]):z[Ga](I*R));Na==g&&F==g&&D==k?P=z[Ga]((s+I/2)*R-I/2):Na==g&&F==k&&D==g?P=h[Rb]-f[Rb]+s-(M-I):Na==g&&F==k?P=h[Rb]-f[Rb]+s:Na==k&&F==k&&(P=z[Ga](s*R));if((J==g||E==g)==g)h=v,f=M,s=v/w,Q=M/I,R=s,J==g?R=s<=Q?s:Q:E==g&&(R=s>=Q?s:Q),v=z[Ga](w*R),M=z[Ga](I*R),J=h-v,E=f-M,r==g&&Jb==k?l+=J:r==g&&Jb==g&&(l+=z[Ga](J/2)),Na==g&&F==k?P+=E:Na==g&&F==g&&(P+=z[Ga](E/2))}var Y= +z.max(0,v-(w-q)),H=z.max(0,M-d);e==g?(y==g&&(l+=u(a,Ij,0.5)*(v-w),Xa(a,nf,z.max(0,v/w)),Y=q),ia(a[L],x(Y,2))):ia(a[L],W);rb==g?(y==g&&(P+=u(a,Jj,0.5)*(M-I),Xa(a,of,z.max(0,M/I)),H=t),ta(a[L],x(H,2))):ta(a[L],W);Xa(a,ff,P);Xa(a,gf,l);c==k&&(a[L].top=x(P),a[L].left=x(l));(c==g||y==g)&&Mc(a);we==k&&xe()}}catch(Z){}}function Vf(a){a!=j&&0===a[Ma](ak)&&(a=Di+a);return a}function sb(a,b){if(a[Ma])return a[Ma](b);for(var c=0;c=d){b=e!=j?e[wb].y+(t[wb].y-e[wb].y)*(d-e[wb].x)/(t[wb].x-e[wb].x):t[wb].y;break a}e=t}e=j}b=t[wb].y}c.$==g&&(b=1-b);d=m;e=a.a;if(e!=aa){m= +ye[e];if(a.b!=j){if(c.Sa[e]==j&&(m=a.o,s=a.a,s!=aa)){q=ye[s];a={};for(var v=[],I=0,P=0,w=0;wa;a++)c[a]=h[a]+(M[a]-h[a])*b;if(1==c[3]){h=da.Ya;M=gc;for(b=0;3>b;b++)M+=h[Ka](c[b]/16)+h[Ka](c[b]%16);d=M}else d=vj+ga(c[0])+Gc+ga(c[1])+Gc+ga(c[2])+Gc+ha(c[3])+Ec}else 1==b&&(d=s);Q(l,f,d)}function fg(a,b,c){var d;d=a[C];var e=0,f,h=0,h={};if(0>b||1b){var q=a.ka[0];2<=q.ba[C]&&(f=q.ba[0],e= +q.ba[1],l=f)}else m=-1,s=1-b,q=a.ka[a.ka[C]-1],2<=q.ba[C]&&(f=q.ba[q.ba[C]-2],l=e=q.ba[q.ba[C]-1]);if(f!=j&&e!=j){a=m*(e[wb].x-f[wb].x);b=m*(e[wb].y-f[wb].y);d*=s;0==b?(h.y=0,h.x=d):(h.y=z.sqrt(z.pow(d,2)/(z.pow(a,2)/z.pow(b,2)+1)),h.x=h.y*a/b);if(0a&&0>h.x)h.x*=-1;if(0b&&0>h.y)h.y*=-1;h.x+=l[wb].x;h.y+=l[wb].y;h.za=ig(f[wb],e[wb])}}else if(0==d)h={x:a.ka[0].ta.x,y:a.ka[0].ta.y,za:0};else{if(1==b)d=a.ka,f=d[d[C]-1],h=1;else{for(h=0;h +b){f=q;break}e+=q[C]}h=(b-e/d)/(f[C]/d);d=f[C]*h;for(b=a=h=0;b=f)b.sa=d+1,Oa[h][l]==b.aa&&(1==e.p&&b.fa==g?(e=v[D].v[h].aH,f=sa(h),e==g&&f[Va]&&(f.autoplay=g,f[Va]())):0==e.p&&b.ia[A](e));else break}c=[];for(d=0;d=f){if(qc[e]==b.aa){var s=b.$==k?m.G:V(m.G+m[mb],l),f=0,f=m.z?s-m[mb]:s+m[mb],f=z.max(0,f);rc(l,k);f=tb(f,l,g,g,k);f==k&&qb(e,j)}b.qa[Sb](d,1);d--}}for(d=b.ya;d=f)){b.ya=d+1;var q=m.E,t=m.z,u=s=b.$==k?m.G:V(m.G+m[mb],l),w=k;b.$==g&&(t=!t);q&&(f=a-f,f>m[mb]?(q=k,f=m[mb]):(b.qa[A](m),w=g),u=t?u-f:u+f,u=z.max(0,u));if(q){if(f=kc(s,e,g))continue;t&&(rc(l,t),u=V(ca(l)-u,l));if(f=tb(u,l,g,g,g))continue; +b.fa?(Qc(l,b.ha),Kc(e,t,k,k)):qb(e,j)}else qb(e,j),kc(u,e,k);w&&(qc[e]=b.aa)}}}function tb(a,b,c,d,e){Cd=g;var f=b.da,h=b.$?b.Na:b.ea,l=[];a=z.min(a*b.ha,ca(b));for(var m=b.sa;m=q)&&l[A](s)}e=k;if(0==l[C]||d==k)Ae(a,b,h);else{for(var s=d=0,t=b.fa,v=b.$,m=0;me&&(a=e);d.$==g&&(a=V(e-a,S(b)));d.sa=0;d.ya=0;d.ia=[];d.qa=[];b=Pa()/1E3;d.da=b-a;d.ma=b-d.da;d.fa== +g&&(n[xa](d.ua),d.ua=n[kb](function(){Rc(d)},1E3*((e-a)/d.ha)));mg(d,k);Be(d,0);ng(d,a);a=tb(a,d,k,g,c);Dd();return a}}function sc(a,b){var c=S(a);if(c==j)return 0;var d=0;c.fa==g?(d=Pa()/1E3-c.da,d*=c.ha):d=c.ma;var e=ca(c);b==g&&c.$==g&&(d=e-d);d=z.max(0,d);return d=z.min(e,d)}function ng(a,b){for(var c={},d=a.$?a.Na:a.ea,e=0;e=b&&(c[h]==j&&(c[h]={}),s!=g&&c[h][l]==j&&(s=sa(h),m==aa&&(a.$== +g&&0==f.d)&&(m=f.s),Q(s,l,m)),c[h][l]=g)}}}}function Kc(a,b,c,d){qc[a]=j;var e=S(a);e!=j&&(c&&Qc(e,1),rc(e,b),e.fa==k&&(e.da!=j?e.ma==ca(e)?d&&pb(a,j,b):(e.fa=g,e.da=Pa()/1E3-e.ma/e.ha,n[xa](e.ua),e.ua=n[kb](function(){Rc(e)},1E3*((ca(e)-e.ma)/e.ha)),e.Ra!=g&&(Be(e,e.ma),e.sa=0,e.ya=0,e.ia=[],e.qa=[]),tb(e.ma/e.ha,e,k,k),Dd()):(d==g||0==e.ma)&&pb(a,j,b)))}function qb(a,b){qc[a]=j;var c=S(a);c!=j&&c.fa==g&&(Qc(c,1),c.ma=b!=j?b:Pa()/1E3-c.da,c.fa=k,n[xa](c.ua))}function Rc(a){if(!tb(ca(a),a,g,g))if(Sc(a), +Tc!=j&&Fd==a.aa)a=Tc,Fd=Tc=j,a();else if(a={type:wf,timelineName:a.Ha.n},Gd(a,j)!==k){var b=ya();if(b!=j){var c=v[Hd(Id())].F;c!=j&&Y(b,c.a)(a)}}}function V(a,b){return Ce(a,b.Ha.f)}function Ce(a,b){var c=z.floor(a);return c+z[Ca]((a-c)*b)/b}function ca(a){return V(a.Ha.d,a)}function Dd(){if(Ed!==g){Ed=g;var a=function(a){n[kb](a,1E3/60)};(y.va!=j?a:n.requestAnimationFrame||n.webkitRequestAnimationFrame||n.mozRequestAnimationFrame||a)(function(){Ed=k;lg()})}}function Sc(a){n[xa](a.ua);a.sa=0;a.ya= +0;a.ia=[];a.qa=[];a.Fb=j;a.da=j;a.fa=k;a.ha=1;a.ma=ca(a);a=sb(Fa,a);-1!=a&&Fa[Sb](a,1)}function og(a){for(var b=0;b=b&&(Ia[f]===aa||Ia[f][h]===aa||Ia[f][h]==a.aa))Oa[f][h]=a.aa}og(a)}function pb(a,b,c){qc[a]=j;for(var d=0;dc;c++)b[c]=16*d[Ma](a[Ka](2*c))+d[Ma](a[Ka](2*c+1))}return b}function gg(a){typeof a!=jj&&(a=ha(a));return isNaN(a)?0:a}function rg(a,b,c){Kd=k;c!=j&&delete v[D].T[c];qa(b[L],Ih);Q(b,Ah,0,ah,0);Xa(b,lf,od);Q(b,mh,0,X,0,ck,1,ni,1);c=v[D].a;c!=j?(ia(b[L],td),ia(F[L],c+hc)):(ia(b[L],x(v[D].Y)),ia(F[L],b[L][Ba]));c=v[D].b; +c!=j?(ta(b[L],td),ta(F[L],c+hc)):(ta(b[L],x(v[D].Z)),ta(F[L],b[L][Rb]));Ib[F.id]=j;Ib[b.id]=j;J[O[a.id]]&&(a!=j&&a!=b)&&(qa(a[L],ij),a[B](hh,g),Q(a,Ah,0,ah,0,mh,0,X,0,ck,0,ni,1),Xa(a,lf,od));F[L][hd]=j;F[L][da.la+Tj]=yi;F[L][cd]=j;F[L].perspective=j;c=[];a=v[D].v;for(var d in a)if(a[K](d)!=k){var e=a[d],f=e.cL;if(f){c[A](f);var h=R[f][Gb];J[O[h.id]]=j;var l=p[Ta](e.k);oa(l,e.cP?$e+e.cP:Ze);l.id=h.id;l[L].pointerEvents=lh;for(l[L][nj]=lh;0s;s++)for(var q=0;qz.abs(c.x-Vc[b].x)&& +25>z.abs(c.y-Vc[b].y)&&(a.stopPropagation(),a[La]())}}function ug(a){var b=[],c=v[D].U,d;for(d in c)c[K](d)!=k&&c[d].n==a&&b[A](ub[d]);return b}function Wf(a){var b={type:xf,customBehaviorName:a},c=Qd[a];if(c!=j)for(var d=0;d=d;d++)c[A]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Ca=c;a.Fa=aa;a.Xa=k;var c=a.ga?b[xb][0]:b,e;e=function(b){He(a);a.xa=bi;Td(b,a)};a.ja=e;b=a.ga?a.jb:p;a.ga?za(Oj,a.ja,b,k):n.self!=n.top&&(d=function(a){(a.relatedTarget===p.documentElement||a.toElement=== +j)&&e(a)},a.ja=d,za(bj,d,b,k));c=Od(c);d=a.Ca[0];d[Cb].x=c.x;d.end.x=c.x;d[wa].x=c.x;d[Cb].y=c.y;d.end.y=c.y;d[wa].y=c.y;yg(a,c);a.cb=function(b){if(!(a.xa===ri||a.xa===bi))if(Sd==g)a.ja(b);else{if(a.Qa==k&&(Rd++,a.Qa=g,a[N].ca==li)){Ud=g;if(a[N].pa!=j)for(var c=0;cc,(q||w==k||Ud==g)&&a.ja(b)):a[N].ca==Lj&&5=w?Si:xj:0>=w&&-180<=w?Vj:ki)!=I,G=u/P;else{I=t=sc(d.aa,k);for(u=P=0;ua[N].Oa?(b={type:sf+a[N][va][Ka](0).toUpperCase()+a[N][va][Da](1)+ie},a.eb(b)):a.ja(b)):a[N].ca==Lj?1500>d&&a.eb(b):a.ja(b);He(a)}};za(a.ga?Pj:dj,a.bb,b,k);b.setCapture&&b.setCapture();a.Pa=Pa();a.Za=a.Pa;Ud=Sd=a.Qa=k}}}function He(a){if(a.Xa!=g){a.Xa=g;Ia={};var b=a.ga?a.jb:p;b.releaseCapture&&b.releaseCapture();Xc(a.ga? +Qj:aj,a.cb,b);Xc(a.ga?Pj:dj,a.bb,b);a.ga?Xc(Oj,a.ja,b):Xc(bj,a.ja,b);a[N].ca==li&&(Ud=k);a.Qa==g&&Rd--}}function Td(a,b){b[N].wb==g&&(a.hypeGesturePhase=b.xa,a.hypeGestureXPosition=b.Ca[0].end.x,a.hypeGestureYPosition=b.Ca[0].end.y,b.eb(a))}function Xc(a,b,c){c[lb]?c[lb](a,b,k):c[Eb]&&c[Eb](kj+a,b)}function za(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Vd[A](e);c[Ua]?c[Ua](a,b,k):c[bb]&&c[bb](kj+a,b)}function Od(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hb]||a[ib])b.x= +a[hb]+p[zb].scrollLeft+p.documentElement.scrollLeft,b.y=a[ib]+p[zb].scrollTop+p.documentElement.scrollTop;return b}function Ag(a){var b;0==a.c?0==a.A?b=xj:1==a.A&&(b=Si):1==a.c&&(0==a.A?b=Vj:1==a.A&&(b=ki));return b}function yg(a,b){var c=a[N][va]==xj||a[N][va]==Si?b.x:b.y;a.Fa=a.Fa==aa?c:a[N][va]==xj||a[N][va]==ki?z.max(a.Fa,c):z.min(a.Fa,c)}function zg(a,b,c){a=z[Ca](180*z.atan2(b.y-a.y,b.x-a.x)/z.PI);c=z.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Si;if(a<=45-c&&a>=-45+c)return xj;if(a<-45- +c&&a>-135+c)return Vj;if(a>45+c&&a<135-c)return ki}function oe(a){for(var b=tc[a],c={},d=0;d=Mb[C]&&Cg()}function lk(a){var b=U[a].p;if(1==b)if(b=U[a].g,b!=j&&Bg(b)!=a)Ke(a);else{var c=new Image,b=function(b){c=this;if((y.Wa!=j||y.pb!=j&&y.va==j)&&b[ab]==Ui&&-1!=jc[Ma](mi)&&-1==c.src[Ma](md))try{var d=p[Ta](di);ia(d,c[Ba]);ta(d,c[Rb]);d.getContext(ud).drawImage(c, +0,0);Dg[c.Eb]=d.toDataURL()}catch(h){}Ke(a)},d=Wd(a);c.onload=b;c.onerror=b;c.onabort=b;c.src=d;c.Eb=a}else 2==b&&(b=function(){for(var b=tc[U[a].g],c=0;cha(y.na)||9>y.oa?n[kb](b,1):d.load(b,b))}function Cg(){wd!=j&&wd(k,F);if(Gd({type:pf},F)!==k)if(-1==ne)Hb(Nb);else{Yc=g;for(var a=-1,b=0;bc&&(c=f),ia(F[L],x(c)),Ib[F.id]=j,F[L].margin==lh&&(la&&(a=h),ta(F[L],x(a)))}function vc(a){var b=F[Qb].offsetHeight,c=v[a].b;return c!=j?c/100*b:v[a].Z}function uc(a){var b=F[Qb][Ja],c=v[a].a;return c!=j?c/100*b:v[a].Y}function Le(a,b,c,d){if(!(Eg(a)==j||Kd== +g)){c==j&&(c=1.1);c=Ce(c,60);Kd=g;var e=function(){d!=j&&d();Qa=[];Qd={};var e=ya();nc=v[a].a!=j||v[a].b!=j?g:k;var f=Eg(a),h=D,l=ya();if(l!=j){for(var m=l[gb](Zj),r=0;r$&&($=r[L][fb]))}else t[A]({container:r,domElement:S,sceneElement:w}); +R[l].mb==k&&(tg(r,g),R[l].mb=g)}for(r=0;rh?H:h,J[G].a=0,J[G].b=0)):(Zc(e,T,g,k),H!=h&&(U[A](db(hi,0,fa,Qh,G,H,h)),J[G]={},J[G].c=ma>Z?ma:Z,J[G].d=H,J[G].a=0,J[G].b=0)),q=X,f=Z,s=-1*Z,5==b?(f=-1*ma,s=ma):6==b?(q=mh,f=-1*H,s=H):7==b&&(q=mh,f=h,s=-1*h),e!=j&&(t=O[e.id],Q(e,Qh,ma,hi,H),U[A](db(q,0,fa,Qh,t,0,f))),U[A](db(q,0,fa,Qh,O[T.id],s,0)),Q(T,Qh,Z,hi,h,q,s),Me(jf,fa,U,e,T),qa(T[L],Ih)):(Zc(e,T,k,k),rg(e,T,j));Ob()},f=k,h= +ya();h[B](hh,g);if(Fg==g&&h!=j){var h=Hd(Id()),l={type:rf};if(Gd(l,j)!==k){var m=v[h].B;if(m!=j){for(var s=m.a,q=Y(ya(),s),m=0;ml;l++){var m=jg(e,l/99),s={};s.location=m;b&&(h=Ie(m,h),f+=h,na(s,h)); +e.ba[A](s);h=m}c+=f;na(e,f)}return c}function jg(a,b){var c=xc(a.ta,a.Ga,b),d=xc(a.Ga,a.Ba,b),e=xc(a.Ba,a.Ja,b),f=xc(c,d,b),d=xc(d,e,b),f=xc(f,d,b),h=k,l=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?l=e:(l=c,h=g));f.za=ig(f,l);h==g&&(f.za+=180);return f}function ig(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*z.atan((b.y-a.y)/(b.x-a.x))/z.PI;b.xc)break;b=e}}return b}function bg(a){var b=Kb[Id()];a!=j&&(b=Kb[a]);a=Ib[b];a==j&&(a=p[Ha](b),a={width:a[Ja],height:a.offsetHeight},Ib[b]=a);return a}function ag(a){var b=0,c=0;a==j?(b=v[D].Y,c=v[D].Z):(b=Oc(a),c=Pc(a));return{width:b,height:c}}function se(a){return(y.na!=j||3.5<=y.Ka||10<=y.oa)&&u(a,lf)==rd}function kg(){Cd=k;we=g;for(var a in Nc)Nc[K](a)&&pc(Nc[a]);we=k;xe();Nc={}}function xe(){n[kb](function(){Jc!= +j&&(Oe?Pe=g:(Oe=g,Jc.refreshAll(),Oe=k,Pe&&(Pe=k,xe())))},0)}function Qe(a,b,c){var d=b;if(d==j||p[Ha](d)!=j){do d=c+Lg();while(p[Ha](d)!=j)}Kb[a]=d;O[d]=a;return Re[b!=j?b:d]=d}function sa(a){return p[Ha](Kb[a])}function Pa(){return Date.now()}function Lg(){for(var a=W,b=da.Ya+We,c=0;20>c;c++)var d=z.floor(z.random()*b[C]),a=a+b.substring(d,d+1);return a}function kk(a){var b=this;Je[a]=b;b.qb=function(){var a=p[Ta](jh);b.Aa=a;for(var d=b.rb(),e=0;ey.oa){var c=function(b){b=b?b:n[Tb];if(a[L][nj]==ij){var c=a[L].display;qa(a[L], +ij);var f=p.elementFromPoint(b[hb],b[ib]);qa(a[L],c?c:W);p.createEvent&&(b[La](),c=p.createEvent(Af),c.initMouseEvent(b[ab],b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hb],b[ib],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,j),f.dispatchEvent(c))}};za(zf,c,a,g);za(dj,c,a,g);za($i,c,a,g);za(ei,c,a,g)}}},Je={},yc=j;da.API={kSceneTransitionInstant:1,kSceneTransitionCrossfade:2,kSceneTransitionSwap:3,kSceneTransitionPushLeftToRight:4,kSceneTransitionPushRightToLeft:5,kSceneTransitionPushBottomToTop:6, +kSceneTransitionPushTopToBottom:7,kHypeGesturePhaseStart:Ej,kHypeGesturePhaseMove:ej,kHypeGesturePhaseEnd:ri,kHypeGesturePhaseCancel:bi,documentName:function(){return $},documentId:function(){return G},sceneNames:Hg,currentSceneName:function(){return Wa[Nb].n},showSceneNamed:function(a,b,c){a=sb(Hg(),a);Hb(a,b,c)},showNextScene:Tf,showPreviousScene:Uf,playTimelineNamed:qg,startTimelineNamed:qg,goToTimeInTimelineNamed:function(a,b){var c=vb(b);c==j&&(c=Ni);kc(a,c,k)},pauseTimelineNamed:function(a){a= +vb(a);a==j&&(a=Ni);qb(a,j)},continueTimelineNamed:function(a,b,c){a=vb(a);a==j&&(a=Ni);b==aa&&(b=0);Kc(a,1==b?g:k,g,c)},getElementById:function(a){var b=Re[a];b==j&&(b=a);return p[Ha](b)},setElementProperty:function(a,b,c,d,e){var f={easein:hi,easeout:ni,easeinout:Qh,linear:mh};b=Mg[b];if(b!=j){var h=b.HYP_r,l=O[a.id];b=W+l+h;0 + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/blank.gif b/static/animations/inbox-zero/oasis/oasis.hyperesources/blank.gif new file mode 100644 index 0000000000..f191b280ce Binary files /dev/null and b/static/animations/inbox-zero/oasis/oasis.hyperesources/blank.gif differ diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-right.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-right.svg new file mode 100644 index 0000000000..ecdde7974f --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-right.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topleft.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topleft.svg new file mode 100644 index 0000000000..5fb4422b10 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topleft.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topright.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topright.svg new file mode 100644 index 0000000000..1712c38997 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left-topright.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left.svg new file mode 100644 index 0000000000..2b458aa6b9 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/bottom-tree-left.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake.png b/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake.png new file mode 100644 index 0000000000..bcf76bb122 Binary files /dev/null and b/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake.png differ diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake_2x.png b/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake_2x.png new file mode 100644 index 0000000000..59282d801a Binary files /dev/null and b/static/animations/inbox-zero/oasis/oasis.hyperesources/check-lake_2x.png differ diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfill.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfill.svg new file mode 100644 index 0000000000..5afe6be74a --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfill.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfreckles.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfreckles.svg new file mode 100644 index 0000000000..f711addf95 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/desertfreckles.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/nuts-cluster.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/nuts-cluster.svg new file mode 100644 index 0000000000..7312b43d14 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/nuts-cluster.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/oasis_hype_generated_script.js b/static/animations/inbox-zero/oasis/oasis.hyperesources/oasis_hype_generated_script.js new file mode 100644 index 0000000000..929bbff10a --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/oasis_hype_generated_script.js @@ -0,0 +1,7 @@ +// HYPE.documents["Oasis"] + +(function(){(function k(){function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=[],window[b].push(k),a=document.getElementsByTagName("head")[0],b=document.createElement("script"),c=h,false==!0&&(c=""),b.type="text/javascript",b.src=c+"/"+d,a.appendChild(b)):window[b].push(k),c=!0);return c}var h="Oasis.hyperesources",c="Oasis",e="oasis_hype_container";if(false==!1)try{for(var f=document.getElementsByTagName("script"), +a=0;aa||false==!0)?"HYPE-526.full.min.js":"HYPE-526.thin.min.js"),false==!0&&(a=a||l("HYPE_w_526","HYPE_wdtl_526","HYPE-526.waypoints.min.js")),a))return; +f=window.HYPE.documents;if(null!=f[c]){b=1;a=c;do c=""+a+"-"+b++;while(null!=f[c]);for(var d=document.getElementsByTagName("div"),b=!1,a=0;a + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/smallnuts-cluster.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/smallnuts-cluster.svg new file mode 100644 index 0000000000..b680f92068 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/smallnuts-cluster.svg @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/top-right-trunk.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-right-trunk.svg new file mode 100644 index 0000000000..33162d0bfa --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-right-trunk.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree--topright.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree--topright.svg new file mode 100644 index 0000000000..5fcc90202c --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree--topright.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-left.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-left.svg new file mode 100644 index 0000000000..7e11b6ef9c --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-left.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-right.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-right.svg new file mode 100644 index 0000000000..13cc1e9d93 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-right.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-topleft.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-topleft.svg new file mode 100644 index 0000000000..2bedf015c0 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/top-tree-topleft.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-left.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-left.svg new file mode 100644 index 0000000000..52e69cebfd --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-left.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-right.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-right.svg new file mode 100644 index 0000000000..1a48b9ba09 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-right.svg @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topleft.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topleft.svg new file mode 100644 index 0000000000..002f55b9d1 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topleft.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topright.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topright.svg new file mode 100644 index 0000000000..84626d09ff --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/topright-tree-topright.svg @@ -0,0 +1,11 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/tree-bottom-trunk.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/tree-bottom-trunk.svg new file mode 100644 index 0000000000..a10fc1d6ec --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/tree-bottom-trunk.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/oasis/oasis.hyperesources/treetrunk-top.svg b/static/animations/inbox-zero/oasis/oasis.hyperesources/treetrunk-top.svg new file mode 100644 index 0000000000..6027b94574 --- /dev/null +++ b/static/animations/inbox-zero/oasis/oasis.hyperesources/treetrunk-top.svg @@ -0,0 +1,12 @@ + + + + + + diff --git a/static/animations/inbox-zero/tron/tron.html b/static/animations/inbox-zero/tron/tron.html new file mode 100644 index 0000000000..f02f652529 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.html @@ -0,0 +1,44 @@ + + + + + + TRON + + + + + + + + + + +
+ +
+ + + + + + + +
+ +
+ +
+ + + + + diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/4982A5-restorable.plist b/static/animations/inbox-zero/tron/tron.hyperesources/4982A5-restorable.plist new file mode 100644 index 0000000000..746ee0a330 Binary files /dev/null and b/static/animations/inbox-zero/tron/tron.hyperesources/4982A5-restorable.plist differ diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/ACtGlowy right.svg b/static/animations/inbox-zero/tron/tron.hyperesources/ACtGlowy right.svg new file mode 100644 index 0000000000..f4029dfbb4 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/ACtGlowy right.svg @@ -0,0 +1,12 @@ + + + + ACtGlowy right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Left.svg b/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Left.svg new file mode 100644 index 0000000000..e456819794 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Left.svg @@ -0,0 +1,12 @@ + + + + ActGlowy Top Left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Right.svg b/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Right.svg new file mode 100644 index 0000000000..a90dbf206e --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/ActGlowy Top Right.svg @@ -0,0 +1,12 @@ + + + + ActGlowy Top Right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Checkmark body.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Checkmark body.svg new file mode 100644 index 0000000000..07d99d5421 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Checkmark body.svg @@ -0,0 +1,10 @@ + + + + Checkmark body + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Combined Shape.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Combined Shape.svg new file mode 100644 index 0000000000..fb893b1887 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Combined Shape.svg @@ -0,0 +1,10 @@ + + + + Combined Shape + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Component top.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Component top.svg new file mode 100644 index 0000000000..c96bd4948f --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Component top.svg @@ -0,0 +1,10 @@ + + + + Component top + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Left.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Left.svg new file mode 100644 index 0000000000..5c7871f691 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Left.svg @@ -0,0 +1,12 @@ + + + + Glowy Top Left + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Right.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Right.svg new file mode 100644 index 0000000000..5d72077681 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy Top Right.svg @@ -0,0 +1,12 @@ + + + + Glowy Top Right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Glowy right.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy right.svg new file mode 100644 index 0000000000..c914c84ab7 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Glowy right.svg @@ -0,0 +1,12 @@ + + + + Glowy right + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/HYPE-526.full.min.js b/static/animations/inbox-zero/tron/tron.hyperesources/HYPE-526.full.min.js new file mode 100644 index 0000000000..5e4ba04454 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/HYPE-526.full.min.js @@ -0,0 +1,183 @@ +(function(){var ca=void 0,h=!0,j=null,m=!1,ga=encodeURIComponent,p=window,ha=Object,ja=Infinity,s=document,u=Math,ka=Number,na=navigator,oa=parseInt,pa=parseFloat;function ra(L,C){return L.width=C}function sa(L,C){return L.innerHTML=C}function ua(L,C){return L.speed=C}function va(L,C){return L.left=C}function wa(L,C){return L.loop=C}function ya(L,C){return L.play=C}function za(L,C){return L.zIndex=C}function Aa(L,C){return L.length=C}function Ba(L,C){return L.position=C} +function Da(L,C){return L.className=C}function Ea(L,C){return L.pause=C}function Fa(L,C){return L.MozPerspective=C}function Ga(L,C){return L.backgroundImage=C}function Ia(L,C){return L.display=C}function Ma(L,C){return L.height=C} +var Na="appendChild",D="push",Oa="direction",Pa="lastPosition",Qa="clearTimeout",Ra="width",Sa="round",Xa="slice",Ya="replace",Za="toFixed",$a="timestamp",ab="ceil",bb="floor",cb="getElementById",ib="offsetWidth",jb="concat",kb="list",pb="extend",qb="charAt",rb="preventDefault",sb="region",tb="button",ub="indexOf",vb="speed",wb="embeds",Bb="MAX_VALUE",Cb="opera",Db="createElement",Eb="atan2",Fb="identifier",Gb="sqrt",Hb="addEventListener",Ib="setAttribute",Jb="play",Kb="parentElement",Ob="type",Pb= +"translate",Qb="clear",Rb="childNodes",Sb="Play",Tb="attachEvent",bc="source",cc="changedTouches",dc="zIndex",ec="keys",fc="getElementsByTagName",gc="MIN_VALUE",hc="clientX",ic="clientY",jc="toString",H="length",I="position",kc="create",sc="className",tc="index",uc="clientWidth",vc="setTimeout",wc="removeEventListener",xc="split",yc="duration",zc="userAgent",Ac="location",Bc="rotate",K="hasOwnProperty",Cc="touches",O="style",Dc="pause",Ec="body",Fc="ownerDocument",Gc="removeChild",Hc="search",Tc= +"group",U="options",Uc="start",Vc="getAttribute",Wc="detachEvent",Xc="clientHeight",Yc="console",Zc="contains",$c="element",ad="startTime",bd="parentNode",cd="update",dd="height",ed="splice",fd="event",Z="",gd="\n",hd=" ",id=" -webkit-gradient(linear,left top,left bottom,from(transparent),color-stop(",jd=" : ",kd=" rotate(",ld=" rotateX(",md=" rotateY(",nd=" rotateY(0) ",od=" scaleX(",pd=" scaleY(",qd=" translateX(",rd=" translateY(",Hd=" translateZ(",Id="#",Jd="#4ECDC4",Kd="#556270",Ld="#666",Md= +"#C44D58",Nd="#C7F464",Od="#FF6B6B",Pd="#eeeeee",Qd="%",Rd="%25",Sd="%27",Td="%c [Matter] ",Ud="&",Vd=" ",Wd="')",Xd="'>",Yd="'autoplay='false'class='video'>",Zd="'classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'codebase='http://apple.com/qtactivex/qtplugin.cab'width='",$d="'controller='",ae="'enablejavascript='true'postdomevents='true'scale='tofit'name='embedobj_",xe="'height='",ye="'id='embedobj_",ze="'loop='",Ae="'volume='",Be="(",Ce=")",De=") ",Ee="*",Fe=",",Ge=",M12=", +He=",M21=",Ie=",M22=",Je=",SizingMethod='auto expand')",Ke=",transparent),to(rgba(255,255,255,.5)))",Le="-10000",Me="-bottom",Ne="-moz-",Oe="-moz-perspective",Pe="-ms-transform",Qe="-ms-transform-origin",Re="-o-",Se="-pie-background",Te="-webkit-",Ue="-webkit-perspective",Ve="-webkit-tap-highlight-color",We="-webkit-transform",Xe=".",Ye=".AlphaImageLoader(sizingMethod='scale',src='",Ze=".HYPE_element{-webkit-transform:rotateY(0);}video.HYPE_element{-webkit-transform:none;}^{color:#000;`size:16px;`weight:normal;`family:Helvetica,Arial,Sans-Serif;`weight:normal;`style:normal;`variant:normal;text-decoration:none;text-align:left;text-transform:none;text-indent:0;text-shadow:none;line-height:normal;letter-spacing:normal;white-space:normal;word-spacing:normal;@:baseline;border:none;background-color:transparent;background-image:none;-webkit-`smoothing:antialiased;-moz-backface-visibility:hidden;}", +$e=".HYPE_scene ",af=".Matrix(M11=",bf=".gif",cf=".gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF)",df=".png",ef="/",Xf="/PIE.htc')",Yf="/blank.gif",Zf="0",$f="0.0",ag="0123456789ABCDEF",bg="0px",cg="1",dg="1.0",eg="100",fg="100%",gg="2d",hg="50%",ig="600px",jg=": ",kg="
",lg="",mg="
",ng="', +qg="=",rg="?",sg="@1x",tg="@2x",ug="APPLY ERR ",vg="Action",wg="Alpha(Opacity=",xg="Android",yg="BD",th="BODY",uh="BackCompat",vh="Body",wh="Composite",xh="Constraint",yh="Error in ",zh="False",Ah="GET",Bh="GHIJKLMNOPQRSTUVWXYZ",Ch="HYPE_element",Dh="HYPE_element ",Eh="HYPE_element HYPE_scene",Fh="HYPE_element HYPE_scene ",Gh="HYPE_element Hype_scene ",Hh="HYPE_element_container",Ih="HYPE_persistent_symbols",Jh="HYPE_scene",Kh="HYPE_scene_index",Lh="HYP_a",Mh="HYP_b",Nh="HYP_c",Oh="HYP_d",Ph="HYP_e", +Qh="HYP_f",Rh="HYP_g",Sh="HYP_h",Th="HYP_i",Uh="HYP_j",Vh="HYP_k",Wh="HYP_l",Xh="HYP_m",Yh="HYP_n",Zh="HYP_o",$h="HYP_p",ai="HYP_q",bi="HYP_t",ci="HYP_u",di="HypeDocumentLoad",ei="HypeSceneLoad",fi="HypeSceneUnload",gi="HypeSwipe",hi="HypeSymbolLoad",ii="HypeSymbolUnload",ji="HypeTimelineAction",ki="HypeTimelineComplete",li="HypeTriggerCustomBehavior",mi="L ",ni="L 0 0 L 40 0 L 40 40 L 0 40",oi="M",pi="MSPointerUp",qi="MouseEvents",ri="MozBoxShadow",si="N",ti="O",ui="P",vi="Q",wi="R",xi="S",yi="T", +zi="True",Ai="U",Bi="V",Ci="W",Di="World",Ei="YES",Kj="^div,^span,^applet,^object,^iframe,^h1,^h2,^h3,^h4,^h5,^h6,^p,^blockquote,^pre,^a,^abbr,^acronym,^address,^big,^cite,^code,^del,^dfn,^em,^img,^ins,^kbd,^q,^s,^samp,^small,^strike,^strong,^sub,^sup,^tt,^var,^b,^u,^i,^center,^dl,^dt,^dd,^ol,^ul,^li,^fieldset,^form,^label,^legend,^table,^caption,^tbody,^tfoot,^thead,^tr,^th,^td,^article,^aside,^canvas,^details,^embed,^figure,^figcaption,^footer,^header,^hgroup,^menu,^nav,^output,^ruby,^section,^summary,^time,^mark,^audio,^video{color:?;`size:?;`weight:?;`family:?;`weight:?;`style:?;`variant:?;text-decoration:?;text-align:?;text-transform:?;text-indent:?;text-shadow:?;line-height:?;letter-spacing:?;white-space:?;word-spacing:?;@:?;border:none;background-color:transparent;background-image:none;padding:0;box-sizing:content-box;}^p{display:block;$:1em 0;}^div,^layer{display:block;}^article,^aside,^footer,^header,^hgroup,^nav,^section{display:block;}^blockquote{display:block;$:1em 40px;}^figcaption{display:block;}^figure{display:block;$:1em 40px;}^q{display:inline;}^q:before{content:open-quote;}^q:after{content:close-quote;}^center{display:block;text-align:center;}^hr{display:block;$:.5em auto;border-style:inset;border-width:1px;}^h1,^h2,^h3,^h4,^h5,^h6{display:block;$-left:0;$-right:0;`weight:bold;}^h1{`size:2em;$-top:.67em;$|:.67em;}^h2{`size:1.5em;$-top:.83em;$|:.83em;}^h3{`size:1.17em;$-top:1em;$|:1em;}^h4{$-top:1.33em;$|:1.33em;}^h5{`size:.83em;$-top:1.67em;$|:1.67em;}^h6{`size:.67em;$-top:2.33em;$|:2.33em;}^table{display:table;border-collapse:separate;border-spacing:2px;border-color:gray;}^thead{display:table-header-group;@:middle;border-color:?;}^tbody{display:table-row-group;@:middle;border-color:?;}^tfoot{display:table-footer-group;@:middle;border-color:?;}^col{display:table-column;}^colgroup{display:table-column-group;}^tr{display:table-row;@:?;border-color:?;}^td,^th{display:table-cell;@:?;}^th{`weight:bold;}^caption{display:table-caption;text-align:center;}^ul,^menu,^dir{display:block;list-style-type:disc;$:1em 0;padding-left:40px;}^ol{display:block;list-style-type:decimal;$:1em 0;padding-left:40px;}^li{display:list-item;$:0;}^ul ul,^ol ul{list-style-type:circle;}^ol ol ul,^ol ul ul,^ul ol ul,^ul ul ul{list-style-type:square;}^dd{display:block;$-left:40px;}^dl{display:block;$:1em 0;}^dt{display:block;}^ol ul,^ul ol,^ul ul,^ol ol{$-top:0;$|:0;}^u,^ins{text-decoration:underline;}^strong,^b{`weight:bolder;}^i,^cite,^em,^var,^address{`style:italic;}^tt,^code,^kbd,^samp{`family:monospace;}^pre,^xmp,^plaintext,^listing{display:block;`family:monospace;white-space:pre;$:1em 0;}^mark{background-color:yellow;color:black;}^big{`size:larger;}^small{`size:smaller;}^s,^strike,^del{text-decoration:line-through;}^sub{@:sub;`size:smaller;}^sup{@:super;`size:smaller;}^nobr{white-space:nowrap;}^a{color:blue;text-decoration:underline;cursor:pointer;}^a:active{color:red;}^noframes{display:none;}^frameset,^frame{display:block;}^frameset{border-color:?;}^iframe{border:0;}^details{display:block;}^summary{display:block;}", +Lj="_",Mj="_blank",Nj="a",Oj="aA",Pj="aB",Qj="aC",Rj="aD",Sj="aE",Tj="aI",Uj="aJ",Vj="aK",Wj="aL",Xj="aM",Yj="aN",Zj="aS",$j="aT",ak="aU",bk="aV",ck="aW",dk="aX",ek="aY",fk="aZ",gk="abort",hk="absolute",ik="acC",jk="afterAdd",kk="afterRemove",lk="afterRender",mk="afterUpdate",nk="alt",ok="aria-busy",pk="aria-flowto",qk="aria-hidden",rk="arraybuffer",sk="audio",tk="audio/ogg",uk="auto",vk="autoplay",wk="autostart",xk="b",yk="bA",zk="bB",Ak="bC",Bk="bF",Ck="bG",Dk="bH",Ek="bI",Fk="bJ",Gk="bK",Hk="bL", +Ik="bM",Jk="bN",Kk="bO",Lk="bP",Mk="bQ",Nk="bR",Ok="bS",Pk="bT",Qk="bU",Rk="bV",Sk="bW",Tk="backdrop-filter",Uk="background-origin",Vk="background-size",Wk="bcC",Xk="beforeAdd",Yk="beforeRemove",Zk="beforeRender",$k="beforeUpdate",al="below ",bl="block",cl="blur(",dl="body",el="body=",fl="boolean",gl="border-radius",hl="box-reflect",il="box-shadow",jl="boxShadow",kl="brightness(",ll="button",ml="c",nl="cB",ol="cC",pl="cD",ql="cF",rl="cG",sl="cH",tl="cI",ul="cJ",vl="cK",wl="cL",xl="cQ",yl="cR",zl= +"cT",Al="cW",Bl="cX",Cl="cY",Dl="cancel",El="canplaythrough",Fl="canvas",Gl="click",Hl="collisionActive",Il="collisionEnd",Jl="collisionStart",Kl="color: coral",Ll="color: red",Ml="composite",Nl="constraint",Ol="contrast(",Pl="controller",Ql="controls",Rl="d",Sl="deg",Tl="deviceorientation",Ul="div",Vl="down",Wl="drag",Xl="dropbox.com",Yl="e",Zl="element",$l="embed",am="embedobj_",bm="end",cm="enter",dm="error",em="exit",fm="f",gm="false",hm="fcC",im="file://",jm="filter",km="flat",lm="font-",mm= +"function",nm="head",om="height",pm="hidden",qm="href",rm="http://",sm="hue-rotate(",tm="hype-obj-",um="hype-scene-",vm="iPad",wm="iPhone",xm="iPod",ym="ibooksimg://",zm="img",Am="img_",Bm="inherit",Cm="j",Dm="kTimelineDefaultIdentifier",Em="kTimelinePhysicsIdentifier: ",Fm="keydown",Gm="keypress",Hm="keyup",Im="l",Jm="left",Km="linear-gradient(",Lm="load",Mm="loop",Nm="m",Om="mailto:",Pm="margin",Qm="mouseConstraint",Rm="mouseclick",Sm="mousedown",Tm="mousemove",Um="mouseout",Vm="mouseover",Wm="mouseup", +Xm="move",Ym="mozHidden",Zm="mozvisibilitychange",$m="msHidden",an="msvisibilitychange",bn="mute",cn="n",dn="no",en="no-repeat",fn="none",gn="number",hn="object",jn="on",kn="onresize",ln="pageshow",mn="pointer-events",nn="pointerup",on="preserve-3d",pn="progid:DXImageTransform.Microsoft",qn="px",rn="px) ",sn="r",tn="resize",un="rgb",vn="rgba",wn="rgba(",xn="rgba(0,0,0,0)",yn="right",zn="role",An="saturate(",Bn="script",Cn="sepia(",Dn="source",En="src",Fn="start",Gn="string",Hn="subject=",In="swipe", +Jn="tX",Kn="tY",Ln="tabindex",Mn="tap",Nn="target",On="title",Pn="touchcancel",Qn="touchend",Rn="touchmove",Sn="touchstart",Tn="transform-origin",Un="transform-style",Vn="true",Wn="type",Xn="up",Yn="url('",Zn="user-select",$n="vertical-align",ao="video",bo="video/ogg",co="video/quicktime",eo="video/webm",fo="visibilitychange",go="warn",ho="webkitHidden",io="webkitvisibilitychange",jo="width",ko="www.",lo="x-ibooks-th://",mo="z";function no(){return function(){}} +p.HYPE_526=function(L,C,La,Ub,Fi,Gi,Lb,x,lc,qo,ff,gf,qa,Hi,zg,hf,ro,so,be){function Ii(a,b,c){var d=ka[Bb],e={x:0,y:0};b=b.aa;a=a[I];for(var f,g,k=b[0],n=b[1],n=0;ne?e=g:g=g){f.nb=g;break}g=a&&(a=1E-6);1==c&&(d=0,e=1,a=ja);b.Xa=d;b.La=e;b.sc=f;V.$a.Xd(b, +a)}}function Ic(a){var b,c,d=sd(a);if(!(qa!=h||a==j||kf==h||d==j||d.Vc==h)){var e=d.ub.ma,f=R[a.id],g=d.yc[f],k=t(a,Ik,0);if(!(0==k&&g==j)){Li(a)==h&&(k=1);var n=t(a,Qk,0.5),q=t(a,Rk,0.1),w=t(a,zl,0.01),l=t(a,Sk,0.0010);0>=l&&(l=1E-6);1==k&&(n=0,q=1,l=ja);var v=t(a,ik,0),Q=t(a,Wk,0),M=t(a,hm,0);b=[1,0,0,1,0,0];c=Bg(a);c[D](a);for(var J=0;JF;F+=G){var P=r*V.Ja.cos(F*u.PI/180)+(d-r),E=y*V.Ja.sin(F*u.PI/180)+y;lb(ba,P*f,E*aa)}lb(ba,d*f,y*aa); +lb(ba,d*f,(e-B)*aa);if(0F;F+=G)P=C*V.Ja.cos(F*u.PI/180)+(d-C),E=B*V.Ja.sin(F*u.PI/180)+(e-B),lb(ba,P*f,E*aa)}lb(ba,(d-C)*f,e*aa);lb(ba,$*f,e*aa);if(0<$||0F;F+=G)P=$*V.Ja.cos(F*u.PI/180)+$,E=x*V.Ja.sin(F*u.PI/180)+(e-x),lb(ba,P*f,E*aa)}lb(ba,0,(e-x)*aa);lb(ba,0,z*aa);if(0F;F+=G)P=A*V.Ja.cos(F*u.PI/180)+A,E=z*V.Ja.sin(F*u.PI/180)+z,lb(ba,P*f,E*aa)}d=Z;for(e=0;e=aa?J:aa),F=b*N,N*=g,b=Q-F,g=v-N,n==h&&l==m?k-=b:n==h&&l==h&&(k-=b/2),q==h&&w==m?c-=g:q==h&& +w==h&&(c-=g/2));b=k}t(f,$h,m)==m&&(Y(f,Jn,0.5),Y(f,Kn,0.5),ia(f,$h,h));Y(f,Nj,b);Y(f,xk,c);Y(f,fm,d[Za](6))}}function Oi(a,b){of=a.Vc=h;var c=u[ab](1E3/60),d=u[bb](1E3*b),e=d-a.Md;a.Md=d;a.hc+=u[bb](e);for(d=0;a.hc>=c&&20>d;)V.Fc[cd](a.ub,c),a.hc-=c,d+=1;V.Fc.ya(a.ub);Hg();a.Vc=m}function pf(a){a=V.zb.Ga(a.ub.ma);for(var b=0;bd?u.PI:0))*(180/u.PI);a.Fd=u[Gb](c*c+d*d);d=a[Fb];qf(d)==h&&(c=rf(d)*a.Fd,d=sf(d)+a.Ed,a.ub.ma.Ub.x=c*V.Ja.cos(d*u.PI/180),a.ub.ma.Ub.y=c*V.Ja.sin(d*u.PI/180));pf(a);Kc()}}function tf(a){for(var b=a;b!=j;){a=t(b,Bk);a==j&&(b=x[G].v[R[b.id]],b!=j&&(a=b.bF));a=Ja(a);if(a==j)break;b=a;if(Eg(b)==h)return b}return j}function Eg(a){return x[G].U[R[a.id]]!=j||t(a,wl)!=j?h:m}function sd(a){a=tf(a);return Ig(a!=j?a.id:j)}function Ig(a){a==j&&(a=C);for(var b=0;bz.ca?e||4==c[tb]:e||1==c[tb]||c.metaKey==h)?9>z.ca||z.Rd||z.Cb!=j?p.open(f,Mj):(9==z.ca||15>z[Cb])&&!(c instanceof MouseEvent)?p.open(f,Mj):(e=s[Db](Nj),e[Ib](qm,f),e[Ib](Nn,Mj),s[Ec][Na](e),f=s.createEvent(qi),f.initMouseEvent(Gl,c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hc],c[ic],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c[tb],s[Ec][bd]),e.dispatchEvent(f),s[Ec][Gc](e)):p.top.location= +f);else if(6==f){g=e.l;k=e.m;e=e.n;f=Om;g!=j&&(f+=escape(g));if(k!=j||e!=j)f+=rg,g=[],k!=j&&g[D](Hn+ga(k)),e!=j&&g[D](el+ga(e)),f+=g.join(Ud);f!=Om&&(p.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=h&&(e=m),f!=j&&(f=Mg(f),wa(f,e),f[Jb]())):13==f?(f=e.o,f!=j&&Mg(f)[Dc]()):14==f&&(e=e.B,e!=j&&Ui(e))}}}function vf(a,b){return function(c){Ng(c,b,R[a.id])}}function Og(a,b){return function(c){Vi(c,b,R[a.id])}}function wf(a){var b=t(a,Vj,Zf),c=t(a,Wj,Zf),d=t(a,Tj,Zf),e=t(a,Uj,Zf),b=typeof b!=gn?b:F(b),c=typeof c!= +gn?c:F(c),d=typeof d!=gn?d:F(d),e=typeof e!=gn?e:F(e);a[O][gl]=Z+b+hd+c+hd+e+hd+d}function ee(){}function Wi(a){var b=t(a,dk,8),c=t(a,ck,0);z.vd==j&&(1==1-c&&a[O].removeProperty!=j?a[O].removeProperty(ma.Oa+hl):a[O][ma.Oa+hl]=al+F(b)+id+(1-c)+Ke)}function Pg(a){var b=t(a,Bi);if(b!=j){var c=Z;b==cg?c=Ti(t(a,Ci)):b==Zf&&(c=Z+Ub+ef+t(a,Ai));b=og+c+Xd;z.kb!=j&&(b=mg+b+kg);sa(a,b)}}function Xi(a,b){var c=b==h?yg:Z,d=t(a,c+Hk,0),e=t(a,c+Ck,0),f=t(a,c+Dk,0),g=t(a,c+Ek,1),k=t(a,c+Fk,1),c=t(a,c+Gk,1),n=Z; +0!=d&&(n+=cl+d+rn);0!=e&&(n+=Cn+e+De);0!=f&&(n+=sm+(Z+f+Sl)+De);1!=g&&(n+=An+g+De);if(1!=k){if(6==z.Wd||z.kb!=j&&536.26>=pa(z.Ra))k-=1,1z.ca||(0!=k?c+=md+(Z+k+Sl)+De:b==h&&(1==w&&1==l&&v==m)&&(c+=nd),0!=g&&(c+=ld+(Z+g+Sl)+De));1!=w&&(c+=od+w+De);1!=l&&(c+=pd+l+De);b=Z+(Z+100*Q+Qd)+hd+(Z+100*M+Qd);a[O][ma.Oa+Tn]=b;a[O].MozTransformOrigin=b;a[O].OTransformOrigin=b;a[O][Qe]=b;a[O][Tn]=b; +a[O][We]=c;a[O].MozTransform=c;a[O].OTransform=c;a[O][Pe]=c;a[O].transform=c}function xd(a){9>z.ca?fe(a):ge(a);qa==h&&Ic(a)}function Rg(a){function b(a,b){return Z+a+Km+(Z+(b==h?(u.abs(e)+180)%360:(360-u.abs(e)+270)%360)+Sl)+Fe+xb(c)+Fe+xb(d)+Ce}var c=t(a,cn);if(!(c==j||c==Z)){var d=t(a,Nm);if(!(d==j||d==Z)){var e=t(a,Im);e!=j&&(z.Ra!=j?Ga(a[O],b(ma.Oa,m)):z.xe!=j?Ga(a[O],b(Ne,m)):10>z.ca?a[O][Se]=b(Z,m):Ga(a[O],15>z[Cb]?b(Re,m):b(Z,h)))}}}function Yi(a){Ia(a[O],t(a,Cl,m)==h?fn:t(a,sn,Z));Sg(R[a.id])} +function Mb(a){Mc[a.id]=j;Nc(a)}function Nc(a){try{if(of==h)he[a.id]=a;else{var b=t(a,Ok,36),c=Qg(a),d=R[a.id],e=mf(d),f=nf(e),g=Gg(e),k=nf(d),n=t(a,Nj,0),q=t(a,xk,0),w=t(a,ml,j),l=t(a,Rl,j),v=e=h;w==j&&(e=m,w=k[Ra]);l==j&&(v=m,l=k[dd]);var Q=Vb(d),M=Wb(d),J=M-l,d=n,k=q,N=Q,A=M,r=m;if(Jc==h&&36!=b){var da=0!=(b&1),$=0!=(b&4),x=0!=(b&2),C=0!=(b&8),y=0!=(b&32),B=0!=(b&16),G=0!=(b&64)&&x==h&&B==h,E=0!=(b&128)&&x==h&&B==h,r=0!=(b&256)&&(x==h||B==h),ba=g[Ra]/f[Ra],T=g[dd]/f[dd];x==h&&(N=da==h&&$==h?Q+ +(g[Ra]-f[Ra]):u[ab](Q*ba));da==h&&$==h&&x==m?(b=n+Q/2,d=u[ab](b*ba-Q/2)):da==h&&$==m&&x==h?d=g[Ra]-f[Ra]+n-(N-Q):da==h&&$==m?d=g[Ra]-f[Ra]+n:da==m&&$==m&&(d=u[ab](n*ba));B==h&&(A=C==h&&y==h?M+(g[dd]-f[dd]):u[ab](M*T));C==h&&y==h&&B==m?k=u[ab]((q+M/2)*T-M/2):C==h&&y==m&&B==h?k=g[dd]-f[dd]+q-(A-M):C==h&&y==m?k=g[dd]-f[dd]+q:C==m&&y==m&&(k=u[ab](q*T));if((G==h||E==h)==h)g=N,f=A,q=N/Q,ba=A/M,T=q,G==h?T=q<=ba?q:ba:E==h&&(T=q>=ba?q:ba),N=u[ab](Q*T),A=u[ab](M*T),G=g-N,E=f-A,da==h&&$==m?d+=G:da==h&&$==h&& +(d+=u[ab](G/2)),C==h&&y==m?k+=E:C==h&&y==h&&(k+=u[ab](E/2))}var V=u.max(0,N-(Q-w)),P=u.max(0,A-J);qa==h&&(ia(a,Yh,V),ia(a,Zh,P));e==h?(r==h&&(d+=t(a,Jn,0.5)*(N-Q),ia(a,bi,u.max(0,N/Q)),V=w),ra(a[O],F(V,2))):ra(a[O],Z);v==h?(r==h&&(k+=t(a,Kn,0.5)*(A-M),ia(a,ci,u.max(0,A/M)),P=l),Ma(a[O],F(P,2))):Ma(a[O],Z);if(8>z.ca){var Y=s[cb](Am+a.id);Y!=j&&(w=function(){ra(Y[O],F(a[uc]));Ma(Y[O],F(a[Xc]))},0==a[uc]&&0==a[Xc]?p[vc](w,0):w())}if(9>z.ca){t(a,fm)!=j&&fe(a);var ea=a[Fc][wb][am+a.id];ea!=j&&(ea[Ib](jo, +V),ea[Ib](om,P))}ia(a,Lh,k);ia(a,Mh,d);c==m&&(k+=t(a,Th,0),d+=t(a,Sh,0),a[O].top=F(k),va(a[O],F(d)));if(c==h||r==h)9>z.ca?fe(a):ge(a);qa==h&&Ic(a);Tg==m&&Ug()}}catch(L){}}function Ti(a){a!=j&&0===a[ub](ko)&&(a=rm+a);return a}function ie(a){return a[Ya](/'/g,Sd)}function mb(a,b){if(a[ub])return a[ub](b);for(var c=0;c=e){d=w!=j?w[Ac].y+(l[Ac].y-w[Ac].y)*(e-w[Ac].x)/(l[Ac].x-w[Ac].x):l[Ac].y;break a}w=l}w=j}d=l[Ac].y}c.ea==h&&(d=1-d);e=n;w=a.a;if(w!=ca){n=Vg[w];if(a.b!=j){if(c.zc[w]==j&&(n=a.o,q=a.a,q!=ca)){v=Vg[q];a={};for(var Q=[],J=0,N=0,M=0;Me;e++)r[e]=c[e]+(g[e]-c[e])*d;e=dj(r)}else 1==d&&(e=q);Y(k,f,e);qa==h&&Fg(k,f,e,b)}function bj(a,b,c){var d;d=a[H];var e=0,f,g=0,g={};if(0>b||1b){var w=a.Ka[0];2<=w.qa[H]&&(f=w.qa[0],e=w.qa[1],k=f)}else n=-1,q=1-b,w=a.Ka[a.Ka[H]-1],2<=w.qa[H]&&(f=w.qa[w.qa[H]-2],k=e=w.qa[w.qa[H]-1]);if(f!=j&&e!=j){a=n*(e[Ac].x-f[Ac].x);b=n*(e[Ac].y-f[Ac].y);d*=q;0==b?(g.y=0,g.x=d):(g.y=u[Gb](u.pow(d,2)/(u.pow(a,2)/ +u.pow(b,2)+1)),g.x=g.y*a/b);if(0a&&0>g.x)g.x*=-1;if(0b&&0>g.y)g.y*=-1;g.x+=k[Ac].x;g.y+=k[Ac].y;g.wb=ej(f[Ac],e[Ac])}}else if(0==d)g={x:a.Ka[0].fb.x,y:a.Ka[0].fb.y,wb:0};else{if(1==b)d=a.Ka,f=d[d[H]-1],g=1;else{for(g=0;gb){f=w;break}e+=w[H]}g=(b-e/d)/(f[H]/d);d=f[H]*g;for(b=a=g=0;b=f)b.eb=d+1,yb[g][k]==b.fa&&(1==e.p&&b.sa==h?(e=x[G].v[g].aH,f=Ja(g),e==h&&f[Jb]&&(f.autoplay=h,f[Jb]())):0==e.p&&b.Da[D](e));else break}c=[];for(d=0;d=f){if(yd[e]==b.fa){var q=b.ea==m?n.G:Ca(n.G+n[yc],k),f=0,f=n.z?q-n[yc]:q+n[yc],f=u.max(0,f);zd(k,m);f=nc(f,k,h,h,m);f==m&&Zb(e,j)}b.ab[ed](d,1);d--}}for(d=b.tb;d=f)){b.tb=d+1;var w=n.E,l=n.z,v=q=b.ea==m?n.G:Ca(n.G+n[yc],k),t=m;b.ea==h&&(l=!l);w&&(f=a-f,f>n[yc]?(w=m,f=n[yc]):(b.ab[D](n),t=h),v=l?v-f:v+f,v=u.max(0,v));if(w){if(f=ud(q,e,h))continue;l&&(zd(k,l),v=Ca(Ha(k)-v,k));if(f=nc(v,k,h,h,h))continue;b.sa?(je(k,b.xa),td(e,l,m,m)):Zb(e,j)}else Zb(e,j),ud(v,e,m);t&&(yd[e]=b.fa)}}}function nc(a,b,c,d,e){of=h;for(var f=b.pa,g=b.ea?b.ac:b.ta,k=[],n=u.min(a*b.xa,Ha(b)),q=b.eb;q=l)&&k[D](w)}e=m;if(0==k[H]||d==m)Yg(n,b,g);else{for(var w=d=0,v=b.sa,t=b.ea,q=0;qe&&(a=e);d.ea==h&&(a=Ca(e-a,xa(b)));d.eb=0;d.tb=0;d.Da=[];d.ab=[];b=zb()/1E3;d.pa=b-a;d.Qa=b-d.pa;d.sa==h&&(p[Qa](d.hb),d.hb=p[vc](function(){ke(d)}, +1E3*((e-a)/d.xa)));hj(d,m);Zg(d,0);ij(d,a);a=nc(a,d,m,h,c);Kc();return a}}function Ad(a,b){var c=xa(a);if(c==j)return 0;var d=0;c.sa==h?(d=zb()/1E3-c.pa,d*=c.xa):d=c.Qa;var e=Ha(c);b==h&&c.ea==h&&(d=e-d);d=u.max(0,d);return d=u.min(e,d)}function ij(a,b){for(var c={},d=a.ea?a.ac:a.ta,e=0;e=b&&(c[g]==j&&(c[g]={}),q!=h&&c[g][k]==j&&(q=Ja(g),n==ca&&(a.ea==h&&0==f.d)&&(n=f.s),Y(q,k,n)),c[g][k]=h)}}}} +function td(a,b,c,d){yd[a]=j;var e=xa(a);e!=j&&(c&&je(e,1),zd(e,b),e.sa==m&&(e.pa!=j?e.Qa==Ha(e)?d&&Yb(a,j,b):(e.sa=h,e.pa=zb()/1E3-e.Qa/e.xa,p[Qa](e.hb),e.hb=p[vc](function(){ke(e)},1E3*((Ha(e)-e.Qa)/e.xa)),e.mb!=h&&(Zg(e,e.Qa),e.eb=0,e.tb=0,e.Da=[],e.ab=[]),nc(e.Qa/e.xa,e,m,m),Kc()):(d==h||0==e.Qa)&&Yb(a,j,b)))}function Zb(a,b){yd[a]=j;var c=xa(a);c!=j&&c.sa==h&&(je(c,1),c.Qa=b!=j?b:zb()/1E3-c.pa,c.sa=m,p[Qa](c.hb))}function ke(a){if(!(qa==h&&a.mb==h)&&!nc(Ha(a),a,h,h))if(le(a),me!=j&&Af==a.fa)a= +me,Af=me=j,a();else if(a={type:ki,timelineName:a.Lb.n},Bf(a,j)!==m){var b=Ta();if(b!=j){var c=x[Cf(Df())].F;c!=j&&ta(b,c.a)(a)}}}function Ca(a,b){return qa==h&&b.mb==h?Ef(a,60):Ef(a,b.Lb.f)}function Ef(a,b){var c=u[bb](a);return c+u[Sa]((a-c)*b)/b}function Ha(a){return qa==h&&a.mb==h?31536E3:Ca(a.Lb.d,a)}function Kc(){if(zf!==h){zf=h;var a=function(a){p[vc](a,1E3/60)};(z.kb!=j?a:p.requestAnimationFrame||p.webkitRequestAnimationFrame||p.mozRequestAnimationFrame||a)(function(){zf=m;gj()})}}function le(a){p[Qa](a.hb); +a.eb=0;a.tb=0;a.Da=[];a.ab=[];a.Xe=j;a.pa=j;a.sa=m;a.xa=1;a.Qa=Ha(a);a=mb(eb,a);-1!=a&&eb[ed](a,1)}function jj(a){for(var b=0;b=b&&(db[f]===ca||db[f][g]===ca||db[f][g]==a.fa))yb[f][g]=a.fa}jj(a)}function Yb(a,b,c){yd[a]=j;for(var d=0;dz.ca&&0==a[ub](vn)&&(a=dj(Xg(a),h));return a} +function dj(a,b){if(1==a[3]||b==h){for(var c=ma.Wc,d=Id,e=0;3>e;e++)d+=c[qb](a[e]/16)+c[qb](a[e]%16);return d}return wn+oa(a[0])+Fe+oa(a[1])+Fe+oa(a[2])+Fe+pa(a[3])+Ce}function F(a,b){var c=u.pow(10,b==j?0:b);return Z+u[Sa](a*c)/c+qn}function Xg(a){var b=[0,0,0,1];if(0==a[ub](un)){var c=a[ub](Be),d=a[ub](Ce);if(3c;c++)b[c]=16*d[ub](a[qb](2*c))+d[ub](a[qb](2*c+1))}return b} +function cj(a){typeof a!=gn&&(a=pa(a));return isNaN(a)?0:a}function mj(a,b,c){Gf=m;c!=j&&delete x[G].T[c];Ia(b[O],bl);Y(b,Mk,0,ek,0);ia(b,Xh,Zf);Y(b,xk,0,Nj,0,mo,1,Yl,1);c=x[G].a;c!=j?(ra(b[O],fg),ra(T[O],c+Qd)):(ra(b[O],F(x[G].Y)),ra(T[O],b[O][Ra]));c=x[G].b;c!=j?(Ma(b[O],fg),Ma(T[O],c+Qd)):(Ma(b[O],F(x[G].Z)),Ma(T[O],b[O][dd]));Mc[T.id]=j;Mc[b.id]=j;fa[R[a.id]]&&(a!=j&&a!=b)&&(Ia(a[O],fn),a[Ib](qk,h),Y(a,Mk,0,ek,0,xk,0,Nj,0,mo,0,Yl,1),ia(a,Xh,Zf));T[O][Ue]=j;T[O][ma.Oa+Un]=km;T[O][Oe]=j;T[O].perspective= +j;if(9>z.ca){a=ne(a);for(c=0;cq;q++)for(var w=0;wu.abs(c.x-pe[b].x)&&25>u.abs(c.y-pe[b].y)&&(a.stopPropagation(),a[rb]())}}function oj(a){var b=[],c=x[G].U,d;for(d in c)c[K](d)!=m&&c[d].n==a&&b[D](oc[d]);return b}function Ui(a){var b={type:li, +customBehaviorName:a},c=Lf[a];if(c!=j)for(var d=0;d=d;d++)c[D]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Db=c;a.Hb=ca;a.Sc=m;var c=a.wa?b[Cc][0]:b,e;e=function(b){dh(a);a.ob=Dl;Of(b,a)};a.Ia=e;b=a.wa?a.Qc:s;a.wa?Ua(Pn,a.Ia,b,m):p.self!=p.top&&(d=function(a){(a.relatedTarget===s.documentElement||a.toElement===j)&&e(a)},a.Ia=d,Ua(Um,d,b,m));c=Jf(c);d=a.Db[0];d[Uc].x=c.x;d.end.x=c.x;d[Pa].x=c.x;d[Uc].y=c.y;d.end.y=c.y;d[Pa].y=c.y;sj(a,c);a.pd=function(b){if(!(a.ob===bm||a.ob===Dl))if(Nf== +h)a.Ia(b);else{if(a.uc==m&&(Mf++,a.uc=h,a[U].ua==Wl)){Pf=h;if(a[U].Ya!=j)for(var c=0;cz.ca&&(a.Qc.ondragstart=function(a){return a==j?m:h});if(a[U].Ya!=j)for(c=0;cw,(l||w==m||Pf==h)&&a.Ia(b)):a[U].ua==Mn&&5=t?Jm:yn:0>=t&&-180<=t?Xn:Vl)!=r,x=v/J;else{r=l=Ad(d.fa,m);for(v=J=0;va[U].gc?(b={type:gi+a[U][Oa][qb](0).toUpperCase()+a[U][Oa][Xa](1)+vg},a.qd(b)):a.Ia(b)):a[U].ua==Mn?1500>d&&a.qd(b):a.Ia(b);dh(a)}};Ua(a.wa?Qn:Wm,a.od,b,m);b.setCapture&&b.setCapture();a.tc=zb();a.Xc=a.tc;Pf=Nf=a.uc=m}}}function dh(a){if(a.Sc!=h){a.Sc=h;db={};var b=a.wa?a.Qc:s;b.releaseCapture&&b.releaseCapture();re(a.wa?Rn:Tm,a.pd,b); +re(a.wa?Qn:Wm,a.od,b);a.wa?re(Pn,a.Ia,b):re(Um,a.Ia,b);a[U].ua==Wl&&(Pf=m);a.uc==h&&Mf--;qa==h&&a[U]&&(Ic(a[U].vb),Kc())}}function Of(a,b){b[U].se==h&&(a.hypeGesturePhase=b.ob,a.hypeGestureXPosition=b.Db[0].end.x,a.hypeGestureYPosition=b.Db[0].end.y,b.qd(a))}function re(a,b,c){c[wc]?c[wc](a,b,m):c[Wc]&&c[Wc](jn+a,b)}function Ua(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Qf[D](e);c[Hb]?c[Hb](a,b,m):c[Tb]&&c[Tb](jn+a,b)}function Jf(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hc]|| +a[ic])b.x=a[hc]+s[Ec].scrollLeft+s.documentElement.scrollLeft,b.y=a[ic]+s[Ec].scrollTop+s.documentElement.scrollTop;return b}function uj(a){var b;0==a.c?0==a.A?b=yn:1==a.A&&(b=Jm):1==a.c&&(0==a.A?b=Xn:1==a.A&&(b=Vl));return b}function sj(a,b){var c=a[U][Oa]==yn||a[U][Oa]==Jm?b.x:b.y;a.Hb=a.Hb==ca?c:a[U][Oa]==yn||a[U][Oa]==Vl?u.max(a.Hb,c):u.min(a.Hb,c)}function tj(a,b,c){a=u[Sa](180*u[Eb](b.y-a.y,b.x-a.x)/u.PI);c=u.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Jm;if(a<=45-c&&a>=-45+c)return yn;if(a< +-45-c&&a>-135+c)return Xn;if(a>45+c&&a<135-c)return Vl}function Mg(a){for(var b=Bd[a],c={},d=0;dz.ca?wo:xo;d={};d.kd=z.kb!=j;var f=Sf[a];f==j&&(f=new b(a,c),f.Lf=a,f.cc=c,f.options=d,f.jd=function(){var a=[],b;for(b in f.cc)f.cc[K](b)!=m&&a[D](b); +return a.sort()});return f}function vj(a){a=Bd[a];if(a!=j){for(var b=1=$b[H]?wj():b==h&&gh==m&&(gh=h,p[vc](function(){xj()},1))}function xj(){0>=$b[H]||(gh=m,yj($b[0],h))}function yj(a,b){var c=La[a].p;if(1==c)if(c=La[a].g,c!=j&&vj(c)!=a)fh(a,b);else{var d=new Image,c=function(c){d=this;if((z.Pc!= +j||z.Wd!=j&&z.kb==j)&&c[Ob]==Lm&&-1!=Ub[ub](Xl)&&-1==d.src[ub](bf))try{var e=s[Db](Fl);ra(e,d[Ra]);Ma(e,d[dd]);e.getContext(gg).drawImage(d,0,0);zj[d.Ne]=e.toDataURL()}catch(k){}fh(a,b)},e=Rf(a);d.onload=c;d.onerror=c;d.onabort=c;d.src=e;d.Ne=a}else 2==c&&(c=function(){for(var c=Bd[La[a].g],d=0;dpa(z.Ra)||9>z.ca?p[vc](c,1):e.load(c,c))}function wj(){gf!=j&&gf(m,T);if(Bf({type:di},T)!==m)if(-1==zg)Lc(Pc);else{se=h;for(var a= +-1,b=0;bc&&(c=f),ra(T[O],F(c)),Mc[T.id]=j,T[O].margin==uk&&(ka&&(a=g),Ma(T[O],F(a)))}function Dd(a){var b=T[bd].offsetHeight,c=x[a].b;return c!=j?c/100*b:x[a].Z}function Cd(a){var b=T[bd][ib],c=x[a].a;return c!=j?c/100*b:x[a].Y}function hh(a,b,c,d){if(!(Aj(a)==j||Gf==h)){c==j&&(c=1.1);c=Ef(c,60);Gf=h;var e=function(){d!=j&&d();nb=[];Lf={};var e=Ta();Jc=x[a].a!=j||x[a].b!=j?h:m;var f=Aj(a),g=G,k=Ta();if(k!=j){for(var n=k[fc](ao),l=0;lF&&(F=l[O][dc]))}else w[D]({container:l,domElement:E,sceneElement:v});la[k].Kd==m&&(qa==h&&Lg(qc[k]),nj(l,h),la[k].Kd=h)}for(l= +0;lg?P:g,fa[C].a=0,fa[C].b=0)):(te(e,ea,h,m),P!=g&&(W[D](ac(Rl,0,S,ml,C,P,g)),fa[C]={},fa[C].c=X>L?X:L,fa[C].d=P,fa[C].a=0,fa[C].b=0)),q=Nj,f=L,r=-1*L,5==b?(f=-1*X,r=X):6==b?(q=xk,f=-1*P,r=P):7==b&&(q=xk,f=g,r=-1*g),e!=j&&(w=R[e.id],Y(e,ml,X,Rl,P),W[D](ac(q,0,S,ml,w,0,f))),W[D](ac(q,0,S,ml,R[ea.id],r,0)),Y(ea,ml,L,Rl,g,q,r),ih(Vh,S,W,e,ea),Ia(ea[O],bl)):(te(e,ea,m,m),mj(e,ea,j));Qc()},f=m,g= +Ta();g[Ib](qk,h);if(Bj==h&&g!=j){var g=Cf(Df()),k={type:fi};if(Bf(k,j)!==m){var n=x[g].B;if(n!=j){for(var q=n.a,w=ta(Ta(),q),n=0;nk;k++){var n=fj(e,k/99),q={};q.location=n;b&&(g=eh(n,g),f+=g,Aa(q,g)); +e.qa[D](q);g=n}c+=f;Aa(e,f)}return c}function fj(a,b){var c=Fd(a.fb,a.Jb,b),d=Fd(a.Jb,a.Bb,b),e=Fd(a.Bb,a.Rb,b),f=Fd(c,d,b),d=Fd(d,e,b),f=Fd(f,d,b),g=m,k=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?k=e:(k=c,g=h));f.wb=ej(f,k);g==h&&(f.wb+=180);return f}function ej(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*u.atan((b.y-a.y)/(b.x-a.x))/u.PI;b.xc)break;b=e}}return b}function Gg(a){var b=qc[Df()];a!=j&&(b=qc[a]);a=Mc[b];a==j&&(a=s[cb](b),a={width:a[ib],height:a.offsetHeight},Mc[b]=a);return a}function nf(a){var b=0,c=0;a==j?(b=x[G].Y,c=x[G].Z):(b=Vb(a),c=Wb(a));return{width:b,height:c}}function Qg(a){return(z.Ra!=j||3.5<=z.Cb||10<=z.ca)&&t(a,Xh)==cg}function Hg(){of=m;Tg=h;for(var a in he)he[K](a)&&Nc(he[a]);Tg=m;Ug();he={}} +function Ug(){p[vc](function(){de!=j&&(kh?lh=h:(kh=h,de.refreshAll(),kh=m,lh&&(lh=m,Ug())))},0)}function mh(a,b,c){var d=b;if(d==j||s[cb](d)!=j){do d=c+Hj();while(s[cb](d)!=j)}qc[a]=d;R[d]=a;return nh[b!=j?b:d]=d}function Ja(a){return s[cb](qc[a])}function zb(){return(new Date).getTime()}function Hj(){for(var a=Z,b=ma.Wc+Bh,c=0;20>c;c++)var d=u[bb](u.random()*b[H]),a=a+b.substring(d,d+1);return a}function xo(a){var b=this;Sf[a]=b;b.bc=function(){var a=s[Db](sk);b.Ha=a;for(var d=b.jd(),e=0;ez.ca&&(b=b.match(/('|")(http.*?css.*?)('|")/),b!=j&&2<=b[H]&&s.createStyleSheet(b[2]));p[vc](Qc,120);p[vc](Qc,1200);a=s[Db](Ul);a.id=Ih;Ia(a[O], +fn);a[Ib](qk,h);T[Na](a);for(b=0;bz.ca)xj();else for(L=0;Lz.ca|| +z.Rd){if(1==oa(b))ia(a,Rh,Z),ia(a,Qh,Z);else{var c=wg+u[Sa](100*b)+Ce;ia(a,Rh,ma.wc+Xe+c);ia(a,Qh,c.toLowerCase());a[O].backgroundColor==Z&&a[O].backgroundImage==Z&&s[cb](Am+a.id)==j&&Ga(a[O],Yn+ie(Z+Ub+Yf)+Wd)}fe(a)}a[O].opacity=b;a[O].MozOpacity=b},aP:function(a,b){a[O].cursor=b},bD:function(a,b){a[O][ma.Oa+Zn]=b;a[O].MozUserSelect=b;a.onselectstart=function(){return m}},N:function(a,b){a[O].borderLeftWidth=F(b);Mb(a)},O:function(a,b){a[O].borderRightWidth=F(b);Mb(a)},P:function(a,b){a[O].borderTopWidth= +F(b);Mb(a)},M:function(a,b){a[O].borderBottomWidth=F(b);Mb(a)},B:function(a,b){a[O].borderLeftColor=xb(b)},C:function(a,b){a[O].borderRightColor=xb(b)},D:function(a,b){a[O].borderTopColor=xb(b)},A:function(a,b){a[O].borderBottomColor=xb(b)},J:function(a,b){a[O].borderLeftStyle=b},K:function(a,b){a[O].borderRightStyle=b},L:function(a,b){a[O].borderTopStyle=b},I:function(a,b){a[O].borderBottomStyle=b},aK:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopLeftRadius=b;a[O].MozBorderRadiusTopleft=b;9> +z.ca&&wf(a)},aL:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderTopRightRadius=b;a[O].MozBorderRadiusTopright=b;9>z.ca&&wf(a)},aI:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomLeftRadius=b;a[O].MozBorderRadiusBottomleft=b;9>z.ca&&wf(a)},aJ:function(a,b){b=typeof b!=gn?b:F(b);a[O].borderBottomRightRadius=b;a[O].MozBorderRadiusBottomright=b;9>z.ca&&wf(a)},bE:function(a,b){sa(a,Z);var c,d=Bd[b];if(d!=j){for(var e=0;ez.ca){d=a[Fc][Db](Ul);Da(d,Ch);for(e=0;ez.ca)try{c.SetControllerVisible(0!=oa(b))}catch(d){p[vc](function(){fb.aO(a,b)},100)}},aR:function(a,b){a[Ib](bn,b);a.volume=0!=b?$f:dg;var c=a[Fc][wb][am+a.id]; +if(c!=j&&9>z.ca)try{c.SetMute(0!=oa(b))}catch(d){p[vc](function(){fb.aR(a,b)},100)}},aQ:function(a,b){a[Ib](Mm,b);wa(a,0!=b);var c=a[Fc][wb][am+a.id];if(c!=j&&9>z.ca)try{c.pf(0!=oa(b))}catch(d){p[vc](function(){fb.aQ(a,b)},100)}},j:function(a,b){Ba(a[O],b)},r:Yi,cY:Yi,aG:function(a,b){a[Ib](On,b);a[Ib](nk,b)},g:function(a,b){a[O].backgroundColor=xb(b)},n:Rg,m:Rg,l:Rg,h:function(a,b){var c=vj(b);if(c!=j){var d=La[c].n,e=Rf(c);if((3.6>z.Cb||9>z.ca)&&(a[O].backgroundRepeat==j||a[O].backgroundRepeat== +Z||a[O].backgroundRepeat==en)){var f=Am+a.id,c=s[cb](f);c!=j?c.src=e:(c=s[Db](zm),c.src=e,c.id=f,Ba(c[O],hk),ra(c[O],fg),Ma(c[O],fg),c[O].top=Zf,va(c[O],Zf),za(c[O],Le),a[Na](c));ia(c,Oh,c.src);9>z.ca&&d.substr(d[H]-4).toLowerCase()==df&&(c.src=Z+Ub+Yf,e=ie(e)[Ya](/\%/gi,Rd),ia(c,Ph,ma.wc+Ye+e+Wd),ia(c,Nh,ma.wc+cf),fe(c));Nc(a)}else d=zj[c],Ga(a[O],d!=j?Yn+d+Wd:Yn+ie(e)+Wd)}},q:function(a,b){a[O].backgroundSize=b;a[O][ma.Oa+Vk]=b;a[O].MozBackgroundSize=b},o:function(a,b){a[O].backgroundOrigin=b;a[O][ma.Oa+ +Uk]=b;a[O].MozBackgroundOrigin=b},p:function(a,b){if(b!=j&&b!=en){var c=s[cb](Am+a.id);c!=j&&(Ga(a[O],Yn+ie(t(c,Oh))+Wd),c[bd][Gc](c))}a[O].backgroundRepeat=b},x:function(a,b){a[O].overflow=b},aT:function(a,b){a[O].paddingLeft=F(b);Mb(a)},aU:function(a,b){a[O].paddingRight=F(b);Mb(a)},aV:function(a,b){a[O].paddingTop=F(b);Mb(a)},aS:function(a,b){a[O].paddingBottom=F(b);Mb(a)},S:yf,T:yf,R:yf,Q:yf,bB:xf,bC:xf,bA:xf,aZ:xf,bL:function(a){vd(a);z.Pc!=j&&a[O][We]==Z&&(a[O][We]=fn)},bG:vd,bH:vd,bI:vd,bJ:vd, +bK:vd,BDbL:wd,BDbG:wd,BDbH:wd,BDbI:wd,BDbJ:wd,BDbK:wd,Z:function(a,b){a[O].wordWrap=b},yy:function(a,b){a[O].whiteSpace=b},y:function(a,b){a[O].whiteSpaceCollapsing=b},z:function(a,b){za(a[O],b);a[bd][sc]==Hh&&za(a[bd][O],b)},aA:function(a,b){var c=ta(a,b.a);be&&(Oc(a,{Eb:1,ua:Mn},c),a[O][Ve]=xn);a[Ib](zn,ll);Va(Gl,a,c,h)},aD:function(a,b){Va(Vm,a,ta(a,b.a),m)},aC:function(a,b){Va(Um,a,ta(a,b.a),m)},aE:function(a,b){var c=ta(a,b.a);be&&(Va(Qn,a,c,h),a[O][Ve]=xn);a[Ib](zn,ll);Va(Wm,a,c,h)},aB:function(a, +b){var c=ta(a,b.a);if(be){var d=m;if(z.kb!=j)for(var e=b.a,f=0;fz.ca?c():Qi(a,c,cm)},cX:function(a,b){9>z.ca||Qi(a,ta(a,b.a),em)},cG:function(a,b){Oc(a,{Eb:1,direction:yn,gc:30,ua:In},ta(a,b.a))},cH:function(a,b){Oc(a,{Eb:1,direction:Jm,gc:30,ua:In},ta(a,b.a))},cI:function(a,b){Oc(a,{Eb:1,direction:Xn,gc:30,ua:In},ta(a,b.a))},cJ:function(a, +b){Oc(a,{Eb:1,direction:Vl,gc:30,ua:In},ta(a,b.a))},cK:ee,cF:ee,aM:function(a,b){Va(Vm,a,Og(a,b),m);Va(Um,a,vf(a,b),m)},aN:function(a,b){be&&(Va(Sn,a,Og(a,b),m),Va(Rn,a,vf(a,b),m),Va(Qn,a,vf(a,b),m),a[O][Ve]=xn);Va(Sm,a,Og(a,b),m);Va(Wm,a,vf(a,b),m)},V:Pg,U:Pg,W:Pg,w:function(a,b){var c=s[cb](Am+a.id),c=c!=j?c.cloneNode(h):j;sa(a,b);for(var d=a[fc](Bn),e=0;ez.ca){var c=function(b){b=b?b:p[fd];if(a[O][mn]==fn){var c=a[O].display;Ia(a[O],fn);var f=s.elementFromPoint(b[hc],b[ic]);Ia(a[O],c?c:Z);s.createEvent?(b[rb](),c=s.createEvent(qi),c.initMouseEvent(b[Ob], +b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hc],b[ic],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b[tb],j),f.dispatchEvent(c)):(c=s.createEventObject(),c.clientX=b[hc],c.clientY=b[ic],f.fireEvent(jn+b[Ob],c),event.cancelBubble=h)}};Ua(pi,c,a,h);Ua(Wm,c,a,h);Ua(Sm,c,a,h);Ua(Gl,c,a,h)}}},Sf={},Gd=j,ce=[Nj,xk,fm],Ka=[],kf=m;fb.bM=Ic;fb.bU=jf;fb.bV=jf;fb.cT=jf;fb.bW=jf;var V,X={},E={ge:4},yo=1,zo=-1;E.create=function(a){var b={id:y.Wb(),type:dl,label:vh,ba:0,aa:S.Id(ni),position:{x:0,y:0}, +Ba:{x:0,y:0},ic:0,ka:{x:0,y:0},Ea:{x:0,y:0,ba:0},speed:0,Sa:0,ha:{x:0,y:0},va:0,da:m,ia:m,rb:0,hd:60,Ab:0.0010,Xa:0,La:0.1,sc:0.01,pc:{Bd:1,Nd:4294967295,group:0},yb:0.05,gb:1,ya:{visible:h,Sf:{Wf:1,Xf:1},lineWidth:1.5}},b=y[pb](b,a);b.ga=b.ga||gb[kc](b.aa);b.$=b.$||r.mc(b[I]);b.oa=b.oa||b.ba;E.Zd(b,b.aa);E.Yd(b,b.da);Wa.set(b,b.ia);S[Bc](b.aa,b.ba,b[I]);Rc[Bc](b.Ua,b.ba);gb[cd](b.ga,b.aa,b.ha);b.Ua=a.Ua||b.Ua;b.Ta=a.Ta||b.Ta;E.Cc(b,a.Wa||b.Wa);E.gd(b,a.qb||b.qb);a=b.da?Pd:y.ne();var c=y.Qe(a);b.ya.fillStyle= +b.ya.fillStyle||a;b.ya.strokeStyle=b.ya.strokeStyle||c;return b};E.If=function(a){return a?zo--:yo++};E.Yd=function(a,b){if(a.da=b)a.Xa=0,a.La=1,a.Wa=a.qb=a.Ab=ja,a.ra=a.Ma=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,a.va=0,ua(a,0),a.Sa=0,a.rb=0};E.Cc=function(a,b){a.Wa=b;a.ra=1/a.Wa;a.Ab=a.Wa/a.Ta};E.Xd=function(a,b){E.Cc(a,b*a.Ta);a.Ab=b};E.gd=function(a,b){a.qb=b;a.Ma=1/a.qb};E.Zd=function(a,b){a.aa=b[0][Ec]===a?b:S[kc](b,a);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);var c=S.Oc(a.aa);S[Pb](a.aa, +c,-1);E.gd(a,E.ge*S.qb(a.aa,a.Wa));S[Pb](a.aa,a[I]);gb[cd](a.ga,a.aa,a.ha)};E.Dc=function(a,b){var c=r.sub(b,a[I]);a[I].x=b.x;a[I].y=b.y;a.$.x+=c.x;a.$.y+=c.y;S[Pb](a.aa,c);gb[cd](a.ga,a.aa,a.ha)};E.fd=function(a,b){var c=b-a.ba;a.ba=b;a.oa+=c;S[Bc](a.aa,c,a[I]);Rc[Bc](a.Ua,c);gb[cd](a.ga,a.aa,a.ha)};E.Pe=function(a,b){a.$.x=a[I].x-b.x;a.$.y=a[I].y-b.y;a.ha.x=b.x;a.ha.y=b.y;ua(a,r.Vb(a.ha))};E.Oe=function(a,b){a.oa=a.ba-b;a.va=b;a.Sa=y.abs(a.va)};E.translate=function(a,b){E.Dc(a,r.add(a[I],b))};E.rotate= +function(a,b){E.fd(a,a.ba+b)};E.scale=function(a,b,c,d){S.scale(a.aa,b,c,d);a.Ua=Rc.Jd(a.aa);a.Ta=S.Ta(a.aa);E.Cc(a,a.Ab*a.Ta);S[Pb](a.aa,{x:-a[I].x,y:-a[I].y});E.gd(a,S.qb(a.aa,a.Wa));S[Pb](a.aa,{x:a[I].x,y:a[I].y});gb[cd](a.ga,a.aa,a.ha)};E.Me=function(a){for(var b=0;be.max.x||g.ga.max.ye.max.y)||E[cd](g,b,c,d))}};E.update=function(a,b,c,d){b=u.pow(b*c*a.gb,2);c=1-a.sc*c*a.gb;var e=a[I].y-a.$.y;a.ha.x=(a[I].x-a.$.x)*c*d+a.Ba.x/a.Wa*b;a.ha.y=e*c*d+a.Ba.y/a.Wa*b;a.$.x=a[I].x;a.$.y=a[I].y;a[I].x+=a.ha.x;a[I].y+=a.ha.y;a.va=(a.ba-a.oa)*c*d+a.ic/a.qb*b;a.oa=a.ba;a.ba+=a.va;ua(a,r.Vb(a.ha));a.Sa=y.abs(a.va);S[Pb](a.aa,a.ha);0!==a.va&&(S[Bc](a.aa,a.va,a[I]),Rc[Bc](a.Ua,a.va));gb[cd](a.ga,a.aa,a.ha)};E.sf=function(a, +b,c){a.Ba.x+=c.x;a.Ba.y+=c.y;a.ic+=((b.x-a[I].x)*c.y-(b.y-a[I].y)*c.x)*a.Ma};var B={create:function(a){return y[pb]({id:y.Wb(),type:Ml,parent:j,vc:m,bb:[],Ob:[],na:[],label:wh},a)},Aa:function(a,b,c,d){a.vc=b;c&&a.parent&&B.Aa(a.parent,b,c,d);if(d)for(var e=0;el.ga.max.x||l.ga.min.x>g.ga[Ra]||0>l.ga.max.y||l.ga.min.y>g.ga[dd])){var v;v=l.ga;v=Ki(u[bb](v.min.x/a.yd),u[bb](v.max.x/a.yd),u[bb](v.min.y/a.xd),u[bb](v.max.y/a.xd));if(!l[sb]||v.id!==l[sb].id||d){r.wd+=1;if(!l[sb]||d)l.region=v;var t;n=v;q=l[sb]; +e=u.min(n.dc,q.dc);f=u.max(n.Qb,q.Qb);t=u.min(n.ec,q.ec);n=u.max(n.Sb,q.Sb);t=Ki(e,f,t,n);for(e=t.dc;e<=t.Qb;e++)for(f=t.ec;f<=t.Sb;f++){q=e+Fe+f;n=k[q];var x=e>=v.dc&&e<=v.Qb&&f>=v.ec&&f<=v.Sb,z=e>=l[sb].dc&&e<=l[sb].Qb&&f>=l[sb].ec&&f<=l[sb].Sb;if(!x&&z&&z&&n){var C=a,A=n,B=l;A[ed](y[ub](A,B),1);for(var E=0;EL*f.La*d&&(F=L*f.La*d* +G);G=r.jb(C,q);L=r.jb(z,q);G=l/(f.ra+k.Ma*G*G+n.Ma*L*L);A*=G;F*=G;0>E&&E*E>4*d?(x.Ib=0,x.Kb=0):(E=x.Ib,x.Ib=u.min(x.Ib+A,0),A=x.Ib-E,E=x.Kb,x.Kb=y.Nb(x.Kb+F,-B,B),F=x.Kb-E);c.x=q.x*A+g.x*F;c.y=q.y*A+g.y*F;!k.da&&!k.ia&&(k.$.x+=c.x*k.ra,k.$.y+=c.y*k.ra,k.oa+=r.jb(C,c)*k.Ma);!n.da&&!n.ia&&(n.$.x-=c.x*n.ra,n.$.y-=c.y*n.ra,n.oa-=r.jb(z,c)*n.Ma)}}}}},qh={Cd:function(a,b,c){var d,e;d=m;c?(e=a[vb]*a[vb]+a.Sa*a.Sa+b[vb]*b[vb]+b.Sa*b.Sa,d=c&&c.ib&&0.2>e,e=c):e={ib:m,ja:a,la:b};if(c&&d){if(c=Ag(c.ja.aa,c.la.aa, +[c.ja.Ua[c.Nc]]),e.Vd=h,0>=c.nb)return e.ib=m,e}else{c=Ag(a.aa,b.aa,a.Ua);if(0>=c.nb)return e.ib=m,e;d=Ag(b.aa,a.aa,b.Ua);if(0>=d.nb)return e.ib=m,e;c.nbd[H]&&(a=Ii(b,a,r.Od(e.Pa)),S[Zc](b.aa,a[0])&&d[D](a[0]), +2>d[H]&&S[Zc](b.aa,a[1])&&d[D](a[1]));2>d[H]&&(d=[c[0]]);e.ld=d;e.We=r.sub(d[0],e.Ce);return e}},Vf={create:function(a){a.ja&&!a.Zb&&(a.Zb={x:0,y:0});a.la&&!a.$b&&(a.$b={x:0,y:0});var b=a.ja?r.add(a.ja[I],a.Zb):a.Zb,c=a.la?r.add(a.la[I],a.$b):a.$b,b=r.Vb(r.sub(b,c));Aa(a,a[H]||b||1E-6);a.ya=y[pb]({visible:h,lineWidth:2,strokeStyle:Ld},a.ya);a.id=a.id||y.Wb();a.label=a.label||xh;a.type=Nl;a.ae=a.ae||1;a.Mc=a.Mc||0;a.Kc=a.ja?a.ja.ba:a.Kc;a.Lc=a.la?a.la.ba:a.Lc;return a},Te:function(a,b){for(var c=0;c< +a[H];c++)Vf.Se(a[c],b)},Se:function(a,b){var c=a.ja,d=a.la,e=a.Zb,f=a.$b;c&&!c.da&&(a.Zb=r[Bc](e,c.ba-a.Kc),a.Kc=c.ba);d&&!d.da&&(a.$b=r[Bc](f,d.ba-a.Lc),a.Lc=d.ba);var g=e,k=f;c&&(g=r.add(c[I],e));d&&(k=r.add(d[I],f));if(g&&k){var e=r.sub(g,k),n=r.Vb(e);0===n&&(n=1E-6);f=r.we(e,n);e=r.sb(e,0.5*((n-a[H])/n)*a.ae*b*b);if(!(y.abs(1-n/a[H])<0.0010*b)){var q,t,l;c&&!c.da?(q={x:g.x-c[I].x+e.x,y:g.y-c[I].y+e.y},c.ha.x=c[I].x-c.$.x,c.ha.y=c[I].y-c.$.y,c.va=c.ba-c.oa,g=r.add(c.ha,r.sb(r.Xb(q),c.va)),n=r.za(q, +f),n=c.ra+c.Ma*n*n):(g={x:0,y:0},n=c?c.ra:0);d&&!d.da?(t={x:k.x-d[I].x-e.x,y:k.y-d[I].y-e.y},d.ha.x=d[I].x-d.$.x,d.ha.y=d[I].y-d.$.y,d.va=d.ba-d.oa,k=r.add(d.ha,r.sb(r.Xb(t),d.va)),l=r.za(t,f),l=d.ra+d.Ma*l*l):(k={x:0,y:0},l=d?d.ra:0);k=r.za(f,r.sub(k,g))/(n+l);0>16)+c;var d=(b>>8&255)+c,b=(b&255)+c;return Id+(16777216+65536*(255>a?1>a?0:a:255)+256*(255>d?1>d?0:d:255)+(255>b?1>b?0:b:255))[jc](16)[Xa](1)},Rf:function(a){for(var b=a[H]- +1;0c?c:a},Re:function(a){return 0>a?-1:1},now:function(){var a=p.performance;return a?(a.now=a.now||a.webkitNow||a.Hf||a.Jf||a.Ff,+a.now()):+new Date},random:function(a,b){a="undefined"!== +typeof a?a:0;y.Gc=(9301*y.Gc+49297)%233280;return a+y.Gc/233280*(("undefined"!==typeof b?b:1)-a)},vf:function(a){a=a[Ya](Id,Z);3==a[H]&&(a=a[qb](0)+a[qb](0)+a[qb](1)+a[qb](1)+a[qb](2)+a[qb](2));return oa(a,16)},log:function(a,b){if(console&&console.log){var c;switch(b){case go:c=Kl;break;case dm:c=Ll}console.log(Td+b+jg+a,c)}},Wb:function(){return y.je++},sin:function(a){return pa(u.sin(a)[Za](8))},cos:function(a){return pa(u.cos(a)[Za](8))},indexOf:function(a,b){if(a[ub])return a[ub](b);for(var c= +0;c=e.hd&&Wa.set(e,h)):0Wa.ie*c&&Wa.set(f,m)}}},set:function(a,b){b?(a.ia=h,a.xb=a.hd,a.ka.x=0,a.ka.y=0,a.$.x=a[I].x,a.$.y=a[I].y,a.oa=a.ba,ua(a,0),a.Sa=0,a.rb=0):(a.ia=m,a.xb=0)}},Rc={Jd:function(a){for(var b={},c=0;ca.max.x&&(a.max.x=e.x);e.xa.max.y&&(a.max.y=e.y);e.y=a.min.x&&b.x<=a.max.x&&b.y>=a.min.y&&b.y<=a.max.y},Pd:function(a,b){return a.min.x<=b.max.x&& +a.max.x>=b.min.x&&a.max.y>=b.min.y&&a.min.y<=b.max.y},translate:function(a,b){a.min.x+=b.x;a.max.x+=b.x;a.min.y+=b.y;a.max.y+=b.y},shift:function(a,b){var c=a.max.x-a.min.x,d=a.max.y-a.min.y;a.min.x=b.x;a.max.x=b.x+c;a.min.y=b.y;a.max.y=b.y+d}},r={mc:function(a){return{x:a.x,y:a.y}},Vb:function(a){return y[Gb](a.x*a.x+a.y*a.y)},Cf:function(a){return a.x*a.x+a.y*a.y},rotate:function(a,b){var c=y.cos(b),d=y.sin(b);return{x:a.x*c-a.y*d,y:a.x*d+a.y*c}},Qf:function(a,b,c){var d=y.cos(b);b=y.sin(b);return{x:c.x+ +((a.x-c.x)*d-(a.y-c.y)*b),y:c.y+((a.x-c.x)*b+(a.y-c.y)*d)}},xc:function(a){var b=r.Vb(a);return 0===b?{x:0,y:0}:{x:a.x/b,y:a.y/b}},za:function(a,b){return a.x*b.x+a.y*b.y},jb:function(a,b){return a.x*b.y-a.y*b.x},add:function(a,b){return{x:a.x+b.x,y:a.y+b.y}},sub:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},sb:function(a,b){return{x:a.x*b,y:a.y*b}},we:function(a,b){return{x:a.x/b,y:a.y/b}},Xb:function(a){var b;b=b===h?-1:1;return{x:b*-a.y,y:b*a.x}},Od:function(a){return{x:-a.x,y:-a.y}},ba:function(a, +b){return u[Eb](b.y-a.y,b.x-a.x)}},S={create:function(a,b){for(var c=[],d=0;dy.oa||y.Db||y.Ka!=j?n.open(f,Of):(9==y.oa||15>y[Sa])&&!(c instanceof MouseEvent)?n.open(f,Of):(e=p[Ta](X),e[B](Ci,f),e[B](Mj,Of),p[zb][ua](e),f=p.createEvent(Af),f.initMouseEvent(ei, +c.bubbles,c.cancelable,c.view,c.detail,c.screenX,c.screenY,c[hb],c[ib],c.ctrlKey,c.altKey,c.shiftKey,c.metaKey,c.button,p[zb][Qb]),e.dispatchEvent(f),p[zb][Ab](e)):n.top.location=f);else if(6==f){h=e.l;l=e.m;e=e.n;f=Xi;h!=j&&(f+=escape(h));if(l!=j||e!=j)f+=ee,h=[],l!=j&&h[A](Gj+ba(l)),e!=j&&h[A](Kh+ba(e)),f+=h.join(zc);f!=Xi&&(n.top.location=f)}else 12==f?(f=e.o,e=e.q,e!=g&&(e=k),f!=j&&(f=oe(f),ka(f,e),f[Va]())):13==f?(f=e.o,f!=j&&oe(f)[yb]()):14==f&&(e=e.B,e!=j&&Wf(e))}}}function zd(a,b){return function(c){pe(c, +b,O[a.id])}}function qe(a,b){return function(c){Xf(c,b,O[a.id])}}function Lc(){}function Yf(a){var b=u(a,$g,8),c=u(a,Zg,0);y.hb==j&&(1==1-c&&a[L].removeProperty!=j?a[L].removeProperty(da.la+Lh):a[L][da.la+Lh]=Hh+x(b)+Wb+(1-c)+Hc)}function re(a){var b=u(a,Kf);if(b!=j){var c=W;b==rd?c=Vf(u(a,Lf)):b==od&&(c=W+jc+nd+u(a,Jf));b=be+c+Cc;y.va!=j&&(b=ae+b+Zd);ja(a,b)}}function Zf(a,b){var c=b==g?ke:W,d=u(a,c+wh,0),e=u(a,c+rh,0),f=u(a,c+sh,0),h=u(a,c+th,1),l=u(a,c+uh,1),c=u(a,c+vh,1),m=W;0!=d&&(m+=Jh+d+rj); +0!=e&&(m+=Bj+e+Fc);0!=f&&(m+=Ei+(W+f+ii)+Fc);1!=h&&(m+=zj+h+Fc);if(1!=l){if(6==y.pb||y.va!=j&&536.26>=ha(y.na))l-=1,1y.oa||(0!=l?c+=$b+(W+l+ii)+Fc:b==g&&(1==q&&1==t&&rb==k)&&(c+=ac),0!=h&&(c+=Zb+(W+h+ii)+Fc));1!=q&&(c+=bc+q+Fc);1!=t&&(c+=cc+t+Fc);b=W+(W+100*w+hc)+Vb+(W+100*I+hc);a[L][da.la+Sj]=b;a[L].MozTransformOrigin=b;a[L].OTransformOrigin= +b;a[L][ed]=b;a[L][Sj]=b;a[L][jd]=c;a[L].MozTransform=c;a[L].OTransform=c;a[L][dd]=c;a[L].transform=c}function oc(a){Mc(a)}function te(a){function b(a,b){return W+a+Ti+(W+(b==g?(z.abs(e)+180)%360:(360-z.abs(e)+270)%360)+ii)+Gc+c+Gc+d+Ec}var c=u(a,gj);if(!(c==j||c==W)){var d=u(a,Wi);if(!(d==j||d==W)){var e=u(a,Ri);e!=j&&(a[L].backgroundImage=y.na!=j?b(da.la,k):y.yb!=j?b(bd,k):15>y[Sa]?b(fd,k):b(W,g))}}}function $f(a){qa(a[L],u(a,ai,k)==g?ij:u(a,sj,W));ue(O[a.id])}function Ya(a){Ib[a.id]=j;pc(a)}function pc(a){try{if(Cd== +g)Nc[a.id]=a;else{var b=u(a,Ch,36),c=se(a),d=O[a.id],e=ve(d),f=ag(e),h=bg(e),l=ag(d),m=u(a,X,0),s=u(a,mh,0),q=u(a,Qh,j),t=u(a,hi,j),rb=e=g;q==j&&(e=k,q=l[Ba]);t==j&&(rb=k,t=l[Rb]);var w=Oc(d),I=Pc(d),d=I-t,l=m,P=s,v=w,M=I,y=k;if(nc==g&&36!=b){var r=0!=(b&1),Jb=0!=(b&4),G=0!=(b&2),Na=0!=(b&8),F=0!=(b&32),D=0!=(b&16),J=0!=(b&64)&&G==g&&D==g,E=0!=(b&128)&&G==g&&D==g,y=0!=(b&256)&&(G==g||D==g),Q=h[Ba]/f[Ba],R=h[Rb]/f[Rb];G==g&&(v=r==g&&Jb==g?w+(h[Ba]-f[Ba]):z[Ga](w*Q));r==g&&Jb==g&&G==k?(b=m+w/2,l=z[Ga](b* +Q-w/2)):r==g&&Jb==k&&G==g?l=h[Ba]-f[Ba]+m-(v-w):r==g&&Jb==k?l=h[Ba]-f[Ba]+m:r==k&&Jb==k&&(l=z[Ga](m*Q));D==g&&(M=Na==g&&F==g?I+(h[Rb]-f[Rb]):z[Ga](I*R));Na==g&&F==g&&D==k?P=z[Ga]((s+I/2)*R-I/2):Na==g&&F==k&&D==g?P=h[Rb]-f[Rb]+s-(M-I):Na==g&&F==k?P=h[Rb]-f[Rb]+s:Na==k&&F==k&&(P=z[Ga](s*R));if((J==g||E==g)==g)h=v,f=M,s=v/w,Q=M/I,R=s,J==g?R=s<=Q?s:Q:E==g&&(R=s>=Q?s:Q),v=z[Ga](w*R),M=z[Ga](I*R),J=h-v,E=f-M,r==g&&Jb==k?l+=J:r==g&&Jb==g&&(l+=z[Ga](J/2)),Na==g&&F==k?P+=E:Na==g&&F==g&&(P+=z[Ga](E/2))}var Y= +z.max(0,v-(w-q)),H=z.max(0,M-d);e==g?(y==g&&(l+=u(a,Ij,0.5)*(v-w),Xa(a,nf,z.max(0,v/w)),Y=q),ia(a[L],x(Y,2))):ia(a[L],W);rb==g?(y==g&&(P+=u(a,Jj,0.5)*(M-I),Xa(a,of,z.max(0,M/I)),H=t),ta(a[L],x(H,2))):ta(a[L],W);Xa(a,ff,P);Xa(a,gf,l);c==k&&(a[L].top=x(P),a[L].left=x(l));(c==g||y==g)&&Mc(a);we==k&&xe()}}catch(Z){}}function Vf(a){a!=j&&0===a[Ma](ak)&&(a=Di+a);return a}function sb(a,b){if(a[Ma])return a[Ma](b);for(var c=0;c=d){b=e!=j?e[wb].y+(t[wb].y-e[wb].y)*(d-e[wb].x)/(t[wb].x-e[wb].x):t[wb].y;break a}e=t}e=j}b=t[wb].y}c.$==g&&(b=1-b);d=m;e=a.a;if(e!=aa){m= +ye[e];if(a.b!=j){if(c.Sa[e]==j&&(m=a.o,s=a.a,s!=aa)){q=ye[s];a={};for(var v=[],I=0,P=0,w=0;wa;a++)c[a]=h[a]+(M[a]-h[a])*b;if(1==c[3]){h=da.Ya;M=gc;for(b=0;3>b;b++)M+=h[Ka](c[b]/16)+h[Ka](c[b]%16);d=M}else d=vj+ga(c[0])+Gc+ga(c[1])+Gc+ga(c[2])+Gc+ha(c[3])+Ec}else 1==b&&(d=s);Q(l,f,d)}function fg(a,b,c){var d;d=a[C];var e=0,f,h=0,h={};if(0>b||1b){var q=a.ka[0];2<=q.ba[C]&&(f=q.ba[0],e= +q.ba[1],l=f)}else m=-1,s=1-b,q=a.ka[a.ka[C]-1],2<=q.ba[C]&&(f=q.ba[q.ba[C]-2],l=e=q.ba[q.ba[C]-1]);if(f!=j&&e!=j){a=m*(e[wb].x-f[wb].x);b=m*(e[wb].y-f[wb].y);d*=s;0==b?(h.y=0,h.x=d):(h.y=z.sqrt(z.pow(d,2)/(z.pow(a,2)/z.pow(b,2)+1)),h.x=h.y*a/b);if(0a&&0>h.x)h.x*=-1;if(0b&&0>h.y)h.y*=-1;h.x+=l[wb].x;h.y+=l[wb].y;h.za=ig(f[wb],e[wb])}}else if(0==d)h={x:a.ka[0].ta.x,y:a.ka[0].ta.y,za:0};else{if(1==b)d=a.ka,f=d[d[C]-1],h=1;else{for(h=0;h +b){f=q;break}e+=q[C]}h=(b-e/d)/(f[C]/d);d=f[C]*h;for(b=a=h=0;b=f)b.sa=d+1,Oa[h][l]==b.aa&&(1==e.p&&b.fa==g?(e=v[D].v[h].aH,f=sa(h),e==g&&f[Va]&&(f.autoplay=g,f[Va]())):0==e.p&&b.ia[A](e));else break}c=[];for(d=0;d=f){if(qc[e]==b.aa){var s=b.$==k?m.G:V(m.G+m[mb],l),f=0,f=m.z?s-m[mb]:s+m[mb],f=z.max(0,f);rc(l,k);f=tb(f,l,g,g,k);f==k&&qb(e,j)}b.qa[Sb](d,1);d--}}for(d=b.ya;d=f)){b.ya=d+1;var q=m.E,t=m.z,u=s=b.$==k?m.G:V(m.G+m[mb],l),w=k;b.$==g&&(t=!t);q&&(f=a-f,f>m[mb]?(q=k,f=m[mb]):(b.qa[A](m),w=g),u=t?u-f:u+f,u=z.max(0,u));if(q){if(f=kc(s,e,g))continue;t&&(rc(l,t),u=V(ca(l)-u,l));if(f=tb(u,l,g,g,g))continue; +b.fa?(Qc(l,b.ha),Kc(e,t,k,k)):qb(e,j)}else qb(e,j),kc(u,e,k);w&&(qc[e]=b.aa)}}}function tb(a,b,c,d,e){Cd=g;var f=b.da,h=b.$?b.Na:b.ea,l=[];a=z.min(a*b.ha,ca(b));for(var m=b.sa;m=q)&&l[A](s)}e=k;if(0==l[C]||d==k)Ae(a,b,h);else{for(var s=d=0,t=b.fa,v=b.$,m=0;me&&(a=e);d.$==g&&(a=V(e-a,S(b)));d.sa=0;d.ya=0;d.ia=[];d.qa=[];b=Pa()/1E3;d.da=b-a;d.ma=b-d.da;d.fa== +g&&(n[xa](d.ua),d.ua=n[kb](function(){Rc(d)},1E3*((e-a)/d.ha)));mg(d,k);Be(d,0);ng(d,a);a=tb(a,d,k,g,c);Dd();return a}}function sc(a,b){var c=S(a);if(c==j)return 0;var d=0;c.fa==g?(d=Pa()/1E3-c.da,d*=c.ha):d=c.ma;var e=ca(c);b==g&&c.$==g&&(d=e-d);d=z.max(0,d);return d=z.min(e,d)}function ng(a,b){for(var c={},d=a.$?a.Na:a.ea,e=0;e=b&&(c[h]==j&&(c[h]={}),s!=g&&c[h][l]==j&&(s=sa(h),m==aa&&(a.$== +g&&0==f.d)&&(m=f.s),Q(s,l,m)),c[h][l]=g)}}}}function Kc(a,b,c,d){qc[a]=j;var e=S(a);e!=j&&(c&&Qc(e,1),rc(e,b),e.fa==k&&(e.da!=j?e.ma==ca(e)?d&&pb(a,j,b):(e.fa=g,e.da=Pa()/1E3-e.ma/e.ha,n[xa](e.ua),e.ua=n[kb](function(){Rc(e)},1E3*((ca(e)-e.ma)/e.ha)),e.Ra!=g&&(Be(e,e.ma),e.sa=0,e.ya=0,e.ia=[],e.qa=[]),tb(e.ma/e.ha,e,k,k),Dd()):(d==g||0==e.ma)&&pb(a,j,b)))}function qb(a,b){qc[a]=j;var c=S(a);c!=j&&c.fa==g&&(Qc(c,1),c.ma=b!=j?b:Pa()/1E3-c.da,c.fa=k,n[xa](c.ua))}function Rc(a){if(!tb(ca(a),a,g,g))if(Sc(a), +Tc!=j&&Fd==a.aa)a=Tc,Fd=Tc=j,a();else if(a={type:wf,timelineName:a.Ha.n},Gd(a,j)!==k){var b=ya();if(b!=j){var c=v[Hd(Id())].F;c!=j&&Y(b,c.a)(a)}}}function V(a,b){return Ce(a,b.Ha.f)}function Ce(a,b){var c=z.floor(a);return c+z[Ca]((a-c)*b)/b}function ca(a){return V(a.Ha.d,a)}function Dd(){if(Ed!==g){Ed=g;var a=function(a){n[kb](a,1E3/60)};(y.va!=j?a:n.requestAnimationFrame||n.webkitRequestAnimationFrame||n.mozRequestAnimationFrame||a)(function(){Ed=k;lg()})}}function Sc(a){n[xa](a.ua);a.sa=0;a.ya= +0;a.ia=[];a.qa=[];a.Fb=j;a.da=j;a.fa=k;a.ha=1;a.ma=ca(a);a=sb(Fa,a);-1!=a&&Fa[Sb](a,1)}function og(a){for(var b=0;b=b&&(Ia[f]===aa||Ia[f][h]===aa||Ia[f][h]==a.aa))Oa[f][h]=a.aa}og(a)}function pb(a,b,c){qc[a]=j;for(var d=0;dc;c++)b[c]=16*d[Ma](a[Ka](2*c))+d[Ma](a[Ka](2*c+1))}return b}function gg(a){typeof a!=jj&&(a=ha(a));return isNaN(a)?0:a}function rg(a,b,c){Kd=k;c!=j&&delete v[D].T[c];qa(b[L],Ih);Q(b,Ah,0,ah,0);Xa(b,lf,od);Q(b,mh,0,X,0,ck,1,ni,1);c=v[D].a;c!=j?(ia(b[L],td),ia(F[L],c+hc)):(ia(b[L],x(v[D].Y)),ia(F[L],b[L][Ba]));c=v[D].b; +c!=j?(ta(b[L],td),ta(F[L],c+hc)):(ta(b[L],x(v[D].Z)),ta(F[L],b[L][Rb]));Ib[F.id]=j;Ib[b.id]=j;J[O[a.id]]&&(a!=j&&a!=b)&&(qa(a[L],ij),a[B](hh,g),Q(a,Ah,0,ah,0,mh,0,X,0,ck,0,ni,1),Xa(a,lf,od));F[L][hd]=j;F[L][da.la+Tj]=yi;F[L][cd]=j;F[L].perspective=j;c=[];a=v[D].v;for(var d in a)if(a[K](d)!=k){var e=a[d],f=e.cL;if(f){c[A](f);var h=R[f][Gb];J[O[h.id]]=j;var l=p[Ta](e.k);oa(l,e.cP?$e+e.cP:Ze);l.id=h.id;l[L].pointerEvents=lh;for(l[L][nj]=lh;0s;s++)for(var q=0;qz.abs(c.x-Vc[b].x)&& +25>z.abs(c.y-Vc[b].y)&&(a.stopPropagation(),a[La]())}}function ug(a){var b=[],c=v[D].U,d;for(d in c)c[K](d)!=k&&c[d].n==a&&b[A](ub[d]);return b}function Wf(a){var b={type:xf,customBehaviorName:a},c=Qd[a];if(c!=j)for(var d=0;d=d;d++)c[A]({start:{x:0,y:0},end:{x:0,y:0},lastPosition:{x:0,y:0}});a.Ca=c;a.Fa=aa;a.Xa=k;var c=a.ga?b[xb][0]:b,e;e=function(b){He(a);a.xa=bi;Td(b,a)};a.ja=e;b=a.ga?a.jb:p;a.ga?za(Oj,a.ja,b,k):n.self!=n.top&&(d=function(a){(a.relatedTarget===p.documentElement||a.toElement=== +j)&&e(a)},a.ja=d,za(bj,d,b,k));c=Od(c);d=a.Ca[0];d[Cb].x=c.x;d.end.x=c.x;d[wa].x=c.x;d[Cb].y=c.y;d.end.y=c.y;d[wa].y=c.y;yg(a,c);a.cb=function(b){if(!(a.xa===ri||a.xa===bi))if(Sd==g)a.ja(b);else{if(a.Qa==k&&(Rd++,a.Qa=g,a[N].ca==li)){Ud=g;if(a[N].pa!=j)for(var c=0;cc,(q||w==k||Ud==g)&&a.ja(b)):a[N].ca==Lj&&5=w?Si:xj:0>=w&&-180<=w?Vj:ki)!=I,G=u/P;else{I=t=sc(d.aa,k);for(u=P=0;ua[N].Oa?(b={type:sf+a[N][va][Ka](0).toUpperCase()+a[N][va][Da](1)+ie},a.eb(b)):a.ja(b)):a[N].ca==Lj?1500>d&&a.eb(b):a.ja(b);He(a)}};za(a.ga?Pj:dj,a.bb,b,k);b.setCapture&&b.setCapture();a.Pa=Pa();a.Za=a.Pa;Ud=Sd=a.Qa=k}}}function He(a){if(a.Xa!=g){a.Xa=g;Ia={};var b=a.ga?a.jb:p;b.releaseCapture&&b.releaseCapture();Xc(a.ga? +Qj:aj,a.cb,b);Xc(a.ga?Pj:dj,a.bb,b);a.ga?Xc(Oj,a.ja,b):Xc(bj,a.ja,b);a[N].ca==li&&(Ud=k);a.Qa==g&&Rd--}}function Td(a,b){b[N].wb==g&&(a.hypeGesturePhase=b.xa,a.hypeGestureXPosition=b.Ca[0].end.x,a.hypeGestureYPosition=b.Ca[0].end.y,b.eb(a))}function Xc(a,b,c){c[lb]?c[lb](a,b,k):c[Eb]&&c[Eb](kj+a,b)}function za(a,b,c,d){var e={eventType:a,handler:b,element:c};d&&Vd[A](e);c[Ua]?c[Ua](a,b,k):c[bb]&&c[bb](kj+a,b)}function Od(a){var b={};if(a.pageX||a.pageY)b.x=a.pageX,b.y=a.pageY;else if(a[hb]||a[ib])b.x= +a[hb]+p[zb].scrollLeft+p.documentElement.scrollLeft,b.y=a[ib]+p[zb].scrollTop+p.documentElement.scrollTop;return b}function Ag(a){var b;0==a.c?0==a.A?b=xj:1==a.A&&(b=Si):1==a.c&&(0==a.A?b=Vj:1==a.A&&(b=ki));return b}function yg(a,b){var c=a[N][va]==xj||a[N][va]==Si?b.x:b.y;a.Fa=a.Fa==aa?c:a[N][va]==xj||a[N][va]==ki?z.max(a.Fa,c):z.min(a.Fa,c)}function zg(a,b,c){a=z[Ca](180*z.atan2(b.y-a.y,b.x-a.x)/z.PI);c=z.min(45,45*c/2E3);if(a>=135+c||a<=-135-c)return Si;if(a<=45-c&&a>=-45+c)return xj;if(a<-45- +c&&a>-135+c)return Vj;if(a>45+c&&a<135-c)return ki}function oe(a){for(var b=tc[a],c={},d=0;d=Mb[C]&&Cg()}function lk(a){var b=U[a].p;if(1==b)if(b=U[a].g,b!=j&&Bg(b)!=a)Ke(a);else{var c=new Image,b=function(b){c=this;if((y.Wa!=j||y.pb!=j&&y.va==j)&&b[ab]==Ui&&-1!=jc[Ma](mi)&&-1==c.src[Ma](md))try{var d=p[Ta](di);ia(d,c[Ba]);ta(d,c[Rb]);d.getContext(ud).drawImage(c, +0,0);Dg[c.Eb]=d.toDataURL()}catch(h){}Ke(a)},d=Wd(a);c.onload=b;c.onerror=b;c.onabort=b;c.src=d;c.Eb=a}else 2==b&&(b=function(){for(var b=tc[U[a].g],c=0;cha(y.na)||9>y.oa?n[kb](b,1):d.load(b,b))}function Cg(){wd!=j&&wd(k,F);if(Gd({type:pf},F)!==k)if(-1==ne)Hb(Nb);else{Yc=g;for(var a=-1,b=0;bc&&(c=f),ia(F[L],x(c)),Ib[F.id]=j,F[L].margin==lh&&(la&&(a=h),ta(F[L],x(a)))}function vc(a){var b=F[Qb].offsetHeight,c=v[a].b;return c!=j?c/100*b:v[a].Z}function uc(a){var b=F[Qb][Ja],c=v[a].a;return c!=j?c/100*b:v[a].Y}function Le(a,b,c,d){if(!(Eg(a)==j||Kd== +g)){c==j&&(c=1.1);c=Ce(c,60);Kd=g;var e=function(){d!=j&&d();Qa=[];Qd={};var e=ya();nc=v[a].a!=j||v[a].b!=j?g:k;var f=Eg(a),h=D,l=ya();if(l!=j){for(var m=l[gb](Zj),r=0;r$&&($=r[L][fb]))}else t[A]({container:r,domElement:S,sceneElement:w}); +R[l].mb==k&&(tg(r,g),R[l].mb=g)}for(r=0;rh?H:h,J[G].a=0,J[G].b=0)):(Zc(e,T,g,k),H!=h&&(U[A](db(hi,0,fa,Qh,G,H,h)),J[G]={},J[G].c=ma>Z?ma:Z,J[G].d=H,J[G].a=0,J[G].b=0)),q=X,f=Z,s=-1*Z,5==b?(f=-1*ma,s=ma):6==b?(q=mh,f=-1*H,s=H):7==b&&(q=mh,f=h,s=-1*h),e!=j&&(t=O[e.id],Q(e,Qh,ma,hi,H),U[A](db(q,0,fa,Qh,t,0,f))),U[A](db(q,0,fa,Qh,O[T.id],s,0)),Q(T,Qh,Z,hi,h,q,s),Me(jf,fa,U,e,T),qa(T[L],Ih)):(Zc(e,T,k,k),rg(e,T,j));Ob()},f=k,h= +ya();h[B](hh,g);if(Fg==g&&h!=j){var h=Hd(Id()),l={type:rf};if(Gd(l,j)!==k){var m=v[h].B;if(m!=j){for(var s=m.a,q=Y(ya(),s),m=0;ml;l++){var m=jg(e,l/99),s={};s.location=m;b&&(h=Ie(m,h),f+=h,na(s,h)); +e.ba[A](s);h=m}c+=f;na(e,f)}return c}function jg(a,b){var c=xc(a.ta,a.Ga,b),d=xc(a.Ga,a.Ba,b),e=xc(a.Ba,a.Ja,b),f=xc(c,d,b),d=xc(d,e,b),f=xc(f,d,b),h=k,l=d;d.x==f.x&&d.y==f.y&&(c.x==f.x&&c.y==f.y?l=e:(l=c,h=g));f.za=ig(f,l);h==g&&(f.za+=180);return f}function ig(a,b){var c=0,c=b.x==a.x?b.y>=a.y?90:-90:180*z.atan((b.y-a.y)/(b.x-a.x))/z.PI;b.xc)break;b=e}}return b}function bg(a){var b=Kb[Id()];a!=j&&(b=Kb[a]);a=Ib[b];a==j&&(a=p[Ha](b),a={width:a[Ja],height:a.offsetHeight},Ib[b]=a);return a}function ag(a){var b=0,c=0;a==j?(b=v[D].Y,c=v[D].Z):(b=Oc(a),c=Pc(a));return{width:b,height:c}}function se(a){return(y.na!=j||3.5<=y.Ka||10<=y.oa)&&u(a,lf)==rd}function kg(){Cd=k;we=g;for(var a in Nc)Nc[K](a)&&pc(Nc[a]);we=k;xe();Nc={}}function xe(){n[kb](function(){Jc!= +j&&(Oe?Pe=g:(Oe=g,Jc.refreshAll(),Oe=k,Pe&&(Pe=k,xe())))},0)}function Qe(a,b,c){var d=b;if(d==j||p[Ha](d)!=j){do d=c+Lg();while(p[Ha](d)!=j)}Kb[a]=d;O[d]=a;return Re[b!=j?b:d]=d}function sa(a){return p[Ha](Kb[a])}function Pa(){return Date.now()}function Lg(){for(var a=W,b=da.Ya+We,c=0;20>c;c++)var d=z.floor(z.random()*b[C]),a=a+b.substring(d,d+1);return a}function kk(a){var b=this;Je[a]=b;b.qb=function(){var a=p[Ta](jh);b.Aa=a;for(var d=b.rb(),e=0;ey.oa){var c=function(b){b=b?b:n[Tb];if(a[L][nj]==ij){var c=a[L].display;qa(a[L], +ij);var f=p.elementFromPoint(b[hb],b[ib]);qa(a[L],c?c:W);p.createEvent&&(b[La](),c=p.createEvent(Af),c.initMouseEvent(b[ab],b.bubbles,b.cancelable,b.view,b.detail,b.screenX,b.screenY,b[hb],b[ib],b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,j),f.dispatchEvent(c))}};za(zf,c,a,g);za(dj,c,a,g);za($i,c,a,g);za(ei,c,a,g)}}},Je={},yc=j;da.API={kSceneTransitionInstant:1,kSceneTransitionCrossfade:2,kSceneTransitionSwap:3,kSceneTransitionPushLeftToRight:4,kSceneTransitionPushRightToLeft:5,kSceneTransitionPushBottomToTop:6, +kSceneTransitionPushTopToBottom:7,kHypeGesturePhaseStart:Ej,kHypeGesturePhaseMove:ej,kHypeGesturePhaseEnd:ri,kHypeGesturePhaseCancel:bi,documentName:function(){return $},documentId:function(){return G},sceneNames:Hg,currentSceneName:function(){return Wa[Nb].n},showSceneNamed:function(a,b,c){a=sb(Hg(),a);Hb(a,b,c)},showNextScene:Tf,showPreviousScene:Uf,playTimelineNamed:qg,startTimelineNamed:qg,goToTimeInTimelineNamed:function(a,b){var c=vb(b);c==j&&(c=Ni);kc(a,c,k)},pauseTimelineNamed:function(a){a= +vb(a);a==j&&(a=Ni);qb(a,j)},continueTimelineNamed:function(a,b,c){a=vb(a);a==j&&(a=Ni);b==aa&&(b=0);Kc(a,1==b?g:k,g,c)},getElementById:function(a){var b=Re[a];b==j&&(b=a);return p[Ha](b)},setElementProperty:function(a,b,c,d,e){var f={easein:hi,easeout:ni,easeinout:Qh,linear:mh};b=Mg[b];if(b!=j){var h=b.HYP_r,l=O[a.id];b=W+l+h;0 + + + + + + + + diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 10.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 10.svg new file mode 100644 index 0000000000..616f40f889 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 10.svg @@ -0,0 +1,10 @@ + + + + Path 10 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 12.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 12.svg new file mode 100644 index 0000000000..0b5cb0b842 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 12.svg @@ -0,0 +1,10 @@ + + + + Path 12 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 3.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 3.svg new file mode 100644 index 0000000000..9b2ae2f1a7 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 3.svg @@ -0,0 +1,10 @@ + + + + Path 3 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 4.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 4.svg new file mode 100644 index 0000000000..0aebcd602b --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 4.svg @@ -0,0 +1,10 @@ + + + + Path 4 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 5.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 5.svg new file mode 100644 index 0000000000..39b49d7ab9 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 5.svg @@ -0,0 +1,10 @@ + + + + Path 5 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 6.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 6.svg new file mode 100644 index 0000000000..e1f48f6c43 --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 6.svg @@ -0,0 +1,10 @@ + + + + Path 6 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/Path 7.svg b/static/animations/inbox-zero/tron/tron.hyperesources/Path 7.svg new file mode 100644 index 0000000000..858da8553e --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/Path 7.svg @@ -0,0 +1,10 @@ + + + + Path 7 + Created with Sketch. + + + + + \ No newline at end of file diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/blank.gif b/static/animations/inbox-zero/tron/tron.hyperesources/blank.gif new file mode 100644 index 0000000000..f191b280ce Binary files /dev/null and b/static/animations/inbox-zero/tron/tron.hyperesources/blank.gif differ diff --git a/static/animations/inbox-zero/tron/tron.hyperesources/tron_hype_generated_script.js b/static/animations/inbox-zero/tron/tron.hyperesources/tron_hype_generated_script.js new file mode 100644 index 0000000000..2cb9ffa7bf --- /dev/null +++ b/static/animations/inbox-zero/tron/tron.hyperesources/tron_hype_generated_script.js @@ -0,0 +1,7 @@ +// HYPE.documents["TRON"] + +(function(){(function k(){function l(a,b,d){var c=!1;null==window[a]&&(null==window[b]?(window[b]=[],window[b].push(k),a=document.getElementsByTagName("head")[0],b=document.createElement("script"),c=h,false==!0&&(c=""),b.type="text/javascript",b.src=c+"/"+d,a.appendChild(b)):window[b].push(k),c=!0);return c}var h="TRON.hyperesources",c="TRON",e="tron_hype_container";if(false==!1)try{for(var f=document.getElementsByTagName("script"), +a=0;aa||false==!0)?"HYPE-526.full.min.js":"HYPE-526.thin.min.js"),false==!0&&(a=a||l("HYPE_w_526","HYPE_wdtl_526","HYPE-526.waypoints.min.js")),a))return; +f=window.HYPE.documents;if(null!=f[c]){b=1;a=c;do c=""+a+"-"+b++;while(null!=f[c]);for(var d=document.getElementsByTagName("div"),b=!1,a=0;ainput { + border: none; + padding: 0; + color: @component-active-bg; + background: transparent; + font-size: inherit; + line-height: 1.5; + border-radius: 0; + &:focus { + box-shadow: none; + } + } + ::-webkit-input-placeholder { + color: @text-color-inverse-very-subtle; + } + } + + .create-item-input { + &>input { + padding: (@padding-small-vertical - 1) @padding-small-horizontal; + border: none; + border-bottom: 1px solid @border-color-divider; + font-size: inherit; + border-radius: 0; + &:focus { + box-shadow: none; + } + } + ::-webkit-input-placeholder { + font-style: italic; + } + } + } + + .buttons-wrapper { + display: flex; + border: 1px solid @border-color-secondary; + border-top: none; + background-color: @background-secondary; + + .btn-editable-list { + display: flex; + justify-content: center; + height: 25px; + width: 25px; + line-height: 25px; + border-right: 1px solid @border-color-secondary; + font-size: 1em; + cursor: default; + color: @text-color-subtle; + + &.btn-disabled { + background-color: transparent; + opacity: 0.4; + } + &:active { + cursor: default; + background-color: darken(@btn-default-bg-color, 9%); + box-shadow: inset 0 1px 0.5px rgba(0, 0, 0, 0.21); + } + } + } +} diff --git a/static/components/editable-table.less b/static/components/editable-table.less new file mode 100644 index 0000000000..2bd18c31b1 --- /dev/null +++ b/static/components/editable-table.less @@ -0,0 +1,26 @@ +@import "ui-variables"; + +.editable-table-container { + display: flex; + align-items: flex-start; + justify-content: flex-start; + height: 100%; + padding-bottom: 5px; + + .column-actions { + display: flex; + margin-left: @padding-small-horizontal; + margin-top: @padding-base-vertical - 1; + + .btn.btn-small { + padding: 0; + border-radius: 100%; + text-align: center; + margin-left: @padding-large-vertical - 2; + margin-top: 1px; + width: 24px; + line-height: 22px; + height: 24px; + } + } +} diff --git a/static/components/empty-list-state.less b/static/components/empty-list-state.less new file mode 100644 index 0000000000..ad8903cc60 --- /dev/null +++ b/static/components/empty-list-state.less @@ -0,0 +1,78 @@ +@import "ui-variables"; + +@duration: 1s; + +.empty-state { + position:absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + overflow:hidden; + z-index: 10; + + > div { + opacity: 0; + transition: opacity @duration ease-in; + width: 100%; + height: 100%; + } + + .perspective-empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + img { + background-color: @text-color-subtle; + } + .message { + color: @text-color-very-subtle; + margin: 1em; + margin-bottom: 0; + font-size: 2em; + font-weight: @font-weight-thin; + text-align: center; + } + } + + .inbox-zero-animation { + // The animation inside the iframe already contains a fade effect, so we + // don't want to animate opacity for this component + opacity: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .animation-wrapper { + text-align: center; + transform: scale(0.8); + transition: transform 100ms ease-in; + + iframe { + width: 600px; + height: 500px; + border: none; + } + .message { + opacity: 0; + transition: opacity @duration ease-in; + font-size: 3.5em; + color: @text-color-subtle; + font-weight: @font-weight-thin; + } + } + } + + &.active { + > div { + opacity: 1; + + .message { + opacity: 1 !important; + } + } + } +} diff --git a/static/components/empty-state.less b/static/components/empty-state.less deleted file mode 100644 index a8d70308be..0000000000 --- a/static/components/empty-state.less +++ /dev/null @@ -1,116 +0,0 @@ -@import "ui-variables"; - -@duration: 1s; - -.empty-state { - position:absolute; - display: none; - left: 0; - top: 0; - right: 0; - bottom: 0; - z-index: 1002; - overflow:hidden; - - > div { - opacity:0; - -webkit-transition: opacity @duration ease-out; - width:100%; - height: 100%; - min-width: 840px; - min-height: 650px; - position: absolute; - transform: translate(-50%, -50%); - left: 50%; - top: 50%; - - .message { - opacity:0; - -webkit-user-select: text; - -webkit-transition: opacity @duration ease-in; - -webkit-transition-delay: 0.6s; - top:45%; - left:50%; - transform: translate(-50%, -50%); - width:50%; - min-width: 500px; - position: absolute; - color: @text-color-very-subtle; - font-size: 28px; - font-weight: @font-weight-blond; - text-align: center; - - // Sequences of whitespace are collapsed. Lines are broken at - // newline characters, at
, and as necessary to fill line boxes. - white-space: pre-line; - - .byline { - padding-top:25px; - font-size:14px; - color: fade(@text-color-very-subtle, 50%); - } - } - - .top-left { - -webkit-transition: all @duration ease-out; - position:absolute; - top:-10px; - left:-20px; - } - - .top-right { - -webkit-transition: all @duration ease-out; - position:absolute; - top:-10px; - right:-20px; - } - - .bottom-left { - -webkit-transition: all @duration ease-out; - position:absolute; - bottom:-10px; - left:-20px; - } - - .bottom-right { - -webkit-transition: all @duration ease-out; - position:absolute; - bottom:-10px; - right:-20px; - } - } - - &.visible { - display:block; - } - - &.active { - > div { - opacity:1; - - .message { - opacity:1; - } - - .top-left { - top:0; - left:0; - } - - .top-right { - top:0; - right:0; - } - - .bottom-left { - bottom:0; - left:0; - } - - .bottom-right { - bottom:0; - right:0; - } - } - } -} \ No newline at end of file diff --git a/static/components/extra.less b/static/components/extra.less index 24a2be5220..477b7136fe 100644 --- a/static/components/extra.less +++ b/static/components/extra.less @@ -1,26 +1,106 @@ @import "ui-variables"; +@import "ui-mixins"; .quoted-text-control { color: @text-color-very-subtle; display: inline-block; + border: 1px solid fade(@text-color-very-subtle, 15%); + border-radius: 3px; + line-height: 10px; + padding: 1px 5px; + font-weight: 600; + font-size: @font-size-smaller; + margin: 5px 0 3px 0; - &.no-quoted-text { - display:none; - } &:hover { cursor: pointer; - color: @text-color; + color: @text-color-subtle; + border: 1px solid fade(@text-color-subtle, 35%); + } + + .dots { + display: inline-block; + font-size: @font-size-smaller * 0.8; + top:-1px; + position:relative; + } +} + +body.platform-win32 { + .quoted-text-control { + .windows-btn-bg; + .windows-btn-border; + &:hover { + color: @text-color-very-subtle; + .windows-btn-border; + } + } + .mail-label { + border-radius: 0; + } +} + +.mail-label { + font-size: 0.9em; + padding: 1px 8px; + margin-right: 6px; + flex-shrink: 0; + border-radius: 3px; + display: inline-block; + cursor:default; + line-height: 22px; + -webkit-user-select: none; + + &:last-child { + margin-right: 0; + } +} +.mail-label.removable { + padding-left:12px; + padding-right:4px; + .inner { + position: relative; + left:0; + transition: left 0.05s linear; } - &.show-quoted-text:before { - font-size: @font-size-smaller; - color: @text-color-very-subtle; - content:'Hide Quoted Text'; - &:hover { color: @text-color; } + .x { + opacity: 0; + left:-4px; + top:-3px; + position: relative; + display:inline-block; + transition: opacity 0.05s ease-in; } - &:before { - font-size: 8px; - color: @text-color-very-subtle; - content:'\2022\2022\2022'; - &:hover { color: @text-color; } +} +.mail-label.removable:hover { + .inner { + left:-6px; + } + .x { + opacity: 1; } } + + +.mail-important-icon { + width: 25px; + height: 25px; + display:inline-block; + background-repeat: no-repeat; + background-position:center; + background-image:url(../static/images/important/Icon-Important-Hover@2x.png); + background-size: 16px; +} +.mail-important-icon.enabled.active { + background-image:url(../static/images/important/Icon-Important-Active@2x.png); + background-size: 16px; +} +.mail-important-icon.enabled:hover { + background-image:url(../static/images/important/Icon-Important-HoverActive@2x.png); + background-size: 16px; +} +.mail-important-icon.enabled.active:hover { + background-image:url(../static/images/important/Icon-Important-Active@2x.png); + background-size: 16px; + -webkit-filter: brightness(90%); +} diff --git a/static/components/feature-used-up-modal.less b/static/components/feature-used-up-modal.less new file mode 100644 index 0000000000..87378e0bbf --- /dev/null +++ b/static/components/feature-used-up-modal.less @@ -0,0 +1,70 @@ +@import "ui-variables"; + +.feature-usage-modal { + position: absolute; + top: 0; + width: 100%; + height: 100%; + + .feature-header { + text-align: center; + padding-top: 32px; + padding-bottom: 30px; + color: @white; + border-radius: 5px 5px 0 0; + } + .header-text { + color: @white; + margin-top: 24px; + margin-bottom: 11px; + } + .recharge-text { + margin: 0; + opacity: 0.67; + } + .feature-cta { + text-align: center; + padding-bottom: 26px; + h2 { + margin-top: 26px; + margin-bottom: 26px; + } + } + .pro-description { + width: 275px; + margin: 0 auto; + padding-bottom: 28px; + border-top: 1px solid rgba(0,0,0,0.1); + border-bottom: 1px solid rgba(0,0,0,0.1); + + ul { + color: rgba(51, 51, 51, 0.67); + text-align: left; + list-style: none; + line-height: 24px; + margin-bottom: 0; + } + li { + &:before { + content: '✓'; + margin-right: 11px; + } + } + h3 { + margin-top: 23px; + margin-bottom: 18px; + } + p { + color: rgba(51, 51, 51, 0.67); + margin: 0; + text-align: left; + padding-left: 62px; + line-height: 24px; + } + } + + .btn { + margin-top: 21px; + padding: 0 33px 25px 33px; + } +} diff --git a/static/components/fixed-popover.less b/static/components/fixed-popover.less new file mode 100644 index 0000000000..119303f36d --- /dev/null +++ b/static/components/fixed-popover.less @@ -0,0 +1,124 @@ +@import "ui-variables"; +@header-color: #afafaf; + +// TODO +// Most of these styles are duplicated from the original popover.less +// Eventually, we will get rid of the original popover and switch to this +// implementation +.fixed-popover-blur-trap { + position: absolute; + z-index: 40; +} + +.fixed-popover-container { + visibility: hidden; + opacity: 0; + position: absolute; + z-index: 40; + + .fixed-popover { + position: absolute; + background-color: @background-secondary; + border-radius: @border-radius-base; + box-shadow: 0 0.5px 0 rgba(0, 0, 0, 0.15), 0 -0.5px 0 rgba(0, 0, 0, 0.15), 0.5px 0 0 rgba(0, 0, 0, 0.15), -0.5px 0 0 rgba(0, 0, 0, 0.15), 0 4px 7px rgba(0,0,0,0.15); + + .menu { + z-index:1; + position: relative; + + .content-container { + background: none; + } + .header-container { + border-top-left-radius: @border-radius-base; + border-top-right-radius: @border-radius-base; + background: none; + color: @header-color; + font-weight: bold; + border-bottom: none; + overflow: hidden; + padding: @padding-base-vertical * 1.5 @padding-base-horizontal; + } + .footer-container { + border-bottom-left-radius: @border-radius-base; + border-bottom-right-radius: @border-radius-base; + background: none; + + .item:last-child:hover { + border-bottom-left-radius: @border-radius-base; + border-bottom-right-radius: @border-radius-base; + } + } + } + + .section { + padding: @padding-base-vertical * 1.5 @padding-base-horizontal; + } + + .divider { + border-top: 1px solid @border-color-divider; + } + + input[type=text] { + border: 1px solid darken(@background-secondary, 10%); + border-radius: 3px; + background-color: @background-primary; + box-shadow: inset 0 1px 0 rgba(0,0,0,0.05), 0 1px 0 rgba(0,0,0,0.05); + color: @text-color; + + &.search { + padding-left: 0; + background-repeat: no-repeat; + background-image: url("../static/images/search/searchloupe@2x.png"); + background-size: 15px 15px; + background-position: 7px 4px; + text-indent: 31px; + } + } + } + + .fixed-popover-pointer,.fixed-popover-pointer.shadow { + position: absolute; + height: 20px; + width: 45px; + } + .fixed-popover-pointer { + -webkit-mask-image: url('images/tooltip/tooltip-bg-pointer@2x.png'); + background-color: @background-secondary; + } + .fixed-popover-pointer.shadow { + -webkit-mask-image: url('images/tooltip/tooltip-bg-pointer-shadow@2x.png'); + background-color: fade(@black, 22%); + } + + &.popout { + visibility: visible; + opacity: 1; + animation: popout-animation 240ms cubic-bezier(.56,.25,.25,1.56); + } + @keyframes popout-animation { + from { + visibility: hidden; + opacity: 0; + transform: scale(0.87); + } + to { + visibility: visible; + opacity: 1; + transform: scale(1); + } + } +} + +body.platform-win32 { + .fixed-popover { + border-radius: 0; + + .menu { + .header-container, + .footer-container { + border-radius: 0; + } + } + } +} diff --git a/static/components/generated-form.less b/static/components/generated-form.less index e57c385559..ed7da65a43 100644 --- a/static/components/generated-form.less +++ b/static/components/generated-form.less @@ -1,59 +1,169 @@ @import "ui-variables"; +@spacing-form: 22px; +@form-margin: 15px; + +body.platform-win32 { + .generated-form { + .tokenizing-field { + border-radius: 0; + border: 0; + border-radius: 0; + box-shadow: 0 0 0 2px @input-border-color; + + &.focused { + border: 0; + border-radius: 0; + box-shadow: 0 0 0 2px darken(@input-border-color, 20%); + } + } + } +} + +body.is-blurred, body.platform-win32.is-blurred { + .generated-form { + .tokenizing-field { + &.focused { + border: 1px solid @input-border-color; + box-shadow: none; + } + } + .form-item .input-area select:focus { + box-shadow: none; + } + .btn:focus { + box-shadow: none; + } + } +} + .generated-form { position: relative; fieldset { legend { - margin-bottom: @spacing-double; color: fade(@black, 40%); - font-weight: @font-weight-semi-bold; + font-size: 1.4em; } margin: 0; - padding: @spacing-double 50px 50px 50px; + padding: 22px @spacing-form 22px @spacing-form; border: 0; - border-bottom: 1px solid fade(@black, 20%); + border-top: 1px solid rgba(0,0,0,0.08); + border-bottom: 1px solid rgba(0,0,0,0.03); + &:first-child { + border-top: 0; + } + } + + .prefilled-message { + text-align: center; + padding: @padding-base-vertical @padding-base-horizontal; + background: @background-secondary; + margin: 20px auto 0; + width: 340px; + border-radius: @border-radius-large; + + .highlighted { + color: @color-success; + } + } + + .tokenizing-field { + border: 1px solid @input-border-color; + border-radius: @border-radius-base; + + &.focused { + border: 1px solid @accent-primary; + box-shadow: 0 0 1.5px @accent-primary; + } } .form-item { display: flex; - flex-direction: row; + margin-top: @form-margin; + &:first-child { margin-top: 0; } + flex-direction: column; + + &.invalid { + .label-area { + color: @color-error; + } + } + .label-area { - padding-top: 0.5em; - width: 125px; - margin-right: @spacing-standard; + } + + .required { + color: @color-danger; + } + + &.prefilled .input-area input { + border: 1px solid @color-success; } .input-area { position: relative; - flex: 2; + margin-top: 0.3em; + + select { + margin-top: 2px; + &:focus { + border: 1px solid @accent-primary; + box-shadow: 0 0 1.5px @accent-primary; + } + } } .form-error { - position: absolute; - color: @error-color; + color: @color-error; font-size: @font-size-smaller; margin-top: 0.3em; } - input { - padding-top: 5px; - padding-bottom: 2px; - padding-left: 5px; + input, select[multiple], textarea { + padding: 5px 8px; + } + .tokenizing-field-input { + overflow: hidden; + padding: 0 5px 5px 5px; + margin-left: 0; + .placeholder { + font-size: 14px; + } + + .token { + padding: 0 20px 0 28px; + margin: 5px 5px 0 0; + + &.selected { + border: 0; + } + } + + input { + margin: 5px 0 0 0; + padding: 0; + line-height: 26px; + } } textarea { width: 100%; - border: 1px solid @input-border; + border: 1px solid @input-border-color; } } + .menu .item { + padding-left: 8px; + padding-right: 8px; + } + .fieldset-form-items { .row { position: relative; - margin-top: @spacing-double; display: flex; flex-direction: row; + margin-top: @form-margin; } .column { flex: 1; @@ -62,35 +172,34 @@ } } .column-spacer { - min-width: 30px; - max-width: 80px; - width: 10%; + width: 22px; } } .form-footer { - background: @background-secondary; - text-align: center; - padding: 22px 0; + background: @background-off-primary; + border-top: 1px solid darken(@background-off-primary, 7%); + padding: 9px 22px; } - button { - font-size: @font-size-larger; - background: #fff; - border: 0; - border-bottom: 3px solid @input-border; - border-radius: 4px; - padding: 7px 35px 2px 35px; + .btn { + &:focus { + box-shadow: 0 0 6px @btn-emphasis-bg-color; + } } - .tokenizing-field-input { - padding: 0; - .token { - padding-top: 0.4em; - margin-bottom: 3px; - } - input { - margin-bottom: 3px; + .form-header-error { + background: @color-error; + color: @text-color-inverse; + text-align: center; + font-weight: @font-weight-semi-bold; + margin-bottom: 5px; + padding: 0.5em; + } + + .last-fieldset { + .content-container { + position: relative; } } diff --git a/static/components/key-commands-region.less b/static/components/key-commands-region.less new file mode 100644 index 0000000000..9989db0130 --- /dev/null +++ b/static/components/key-commands-region.less @@ -0,0 +1,5 @@ +.key-commands-region { + position: relative; + height: 100%; + width: 100%; +} diff --git a/static/components/list-tabular.less b/static/components/list-tabular.less index 0623661327..3ea8c2210d 100644 --- a/static/components/list-tabular.less +++ b/static/components/list-tabular.less @@ -1,5 +1,33 @@ @import "ui-variables"; +.selection-bar-absolute-enter { + opacity: 0; + .inner { + top: -100%; + } +} + +.selection-bar-absolute-enter.selection-bar-absolute-enter-active { + opacity: 1; + .inner { + top:0; + } +} + +.selection-bar-absolute-leave { + opacity: 1; + .inner { + top:0; + } +} + +.selection-bar-absolute-leave.selection-bar-absolute-leave-active { + opacity: 0; + .inner { + top: -100%; + } +} + .sheet-toolbar .selection-bar { // This item sits in the toolbar and takes up all the remaining // space from the toolbar-spacer divs, but flex-shrink means that @@ -11,7 +39,7 @@ width: 100%; flex-shrink:100; - height:49px; + height:38px; z-index: 10000; -webkit-app-region: drag; @@ -20,47 +48,29 @@ left: -1px; right:-1px; top: 0; - height:49px; + height:37px; border-left:1px solid @border-color-divider; border-right:1px solid @border-color-divider; - background-color: @gray-lighter; - opacity:0; + background-color: @background-primary; transition: opacity 0.2s ease-in-out; - pointer-events: none; .inner { - top: -100%; position: absolute; width: 100%; display:flex; - transition: top 0.2s ease-in-out; -webkit-app-region: no-drag; + transition: top 0.2s ease-in-out; .centered { flex: 1; cursor:default; text-align: center; color:@text-color-subtle; - padding-top: 15px; - } - } - } - - // .absolute is positioned full-width over all the other items in the toolbar. - // when .enabled, it transitions to opacity:1, hiding other items beneath it. - - // .inner contains the actual buttons and animates *down* while the opacity animation - // is running. This means the items beneath fade out as the new ones slide in. - - &.enabled { - .absolute { - opacity: 1; - pointer-events: initial; - .inner { - top:0; - .centered { - -webkit-app-region: drag; - } + line-height: 38px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + -webkit-app-region: drag; } } } @@ -68,22 +78,15 @@ .list-container { - position: absolute; - height: 100%; - width: 100%; - overflow-y: scroll; - + .list-rows > div { + // Note: This allows rows to be animated in and out! + transition: top ease-out 120ms; + } .list-item { font-size: @font-size-base; - line-height: @line-height-computed * 1.15; color: @text-color; background: @list-bg; - border-left:0 solid @list-focused-bg; - transition: border-left 0.1s ease-in-out; - &.keyboard-cursor { - border-left:5px solid @list-focused-bg; - } &:hover { background: darken(@list-bg, 5%); } @@ -91,16 +94,34 @@ &.selected { background: @list-selected-bg; color: @list-selected-color; - .list-column { - border-bottom: 1px solid @list-selected-border; - } + border-bottom: 1px solid @list-selected-border; + } + + &.next-is-selected { + border-bottom: 1px solid @list-selected-border; } &.focused { background: @list-focused-bg; color: @list-focused-color; - .list-column { - border-bottom: 1px solid @list-focused-border; + border-bottom: 1px solid @list-focused-border; + } + } +} + +body.is-blurred { + .list-container { + .list-item { + &.selected { + background: fadeout(desaturate(@list-selected-bg, 100%), 65%); + border-bottom: 1px solid fadeout(desaturate(@list-selected-border, 100%), 65%); + color: @text-color; + } + + &.focused { + background: fadeout(desaturate(@list-focused-bg, 100%), 65%); + border-bottom: 1px solid fadeout(desaturate(@list-focused-border, 100%), 65%); + color: @text-color; } } } @@ -109,15 +130,24 @@ .list-tabular { flex: 1; width: 100%; + height: 100%; .list-tabular-item { position: relative; width: 100%; display: flex; + align-items: center; + border-bottom: 1px solid @list-border; + border-left:4px solid transparent; + &:hover { cursor: default; } + &.keyboard-cursor { + border-left:4px solid @list-focused-bg; + } + &.selected { .checkmark .inner { background-color: @accent-primary; @@ -135,16 +165,21 @@ border-radius: 2px; } } + &.focused { + .checkmark .inner { + border:1px solid @accent-primary; + } + } .checkmark { - padding: 12px; + padding: 11px; position: absolute; top: 0; left: 0; .inner { width:14px; height:14px; - border:1px solid @table-border-color; + border:1px solid @list-border; border-radius: 2px; background: transparent; background-size: 12px 9px; @@ -154,40 +189,20 @@ } } - .list-rows { - overflow: auto; - // Add back when when we re-implement list-headers - // padding-top: @font-size-base * 2; /* height of list-headers*/ - } - .list-column { // The width is set by React. - display: inline-block; - padding: @padding-base-vertical @padding-base-horizontal @padding-base-vertical @padding-base-horizontal; + display: inherit; + padding: 0 @padding-base-horizontal; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - border-bottom: 1px solid @list-border; + align-items: center; + &:first-child { + padding-left: @padding-base-horizontal - 4; + } &:last-child { text-align: right; } } - - .list-headers { - display: flex; - position: absolute; - width: 100%; - top: 0; - position: absolute; - background: fade(@list-bg,90%); - font-size: @font-size-base; - line-height: @font-size-base * 1.6; - height:@font-size-base * 2; - z-index: 3; - } - - .list-header { - } - } diff --git a/static/components/menu.less b/static/components/menu.less index 663615fb22..14cbf4a958 100644 --- a/static/components/menu.less +++ b/static/components/menu.less @@ -1,28 +1,27 @@ @import "ui-variables"; .menu { + flex: 1; + display: flex; + flex-direction: column; + .header-container { - background-color: @background-color-secondary; - border-bottom:1px solid @base-border-color; - padding:8px; + flex-shrink: 0; // Don't squish the header! There may be a search box here + background-color: @background-secondary; + border-bottom: 1px solid @border-color-secondary; + padding: 3px; position: relative; - input.search { - border:1px solid darken(@background-color-secondary, 10%); - background-color: white; - border-radius:12px; - padding-left: 10px; - } } .footer-container { position: relative; - border-top:1px solid @base-border-color; } .content-container { - background: @background-color-secondary; + background: @background-secondary; width: 100%; margin-top: -1px; + overflow: auto; } .item { @@ -30,7 +29,7 @@ padding-left: @padding-base-horizontal; padding-top: @padding-base-vertical; padding-bottom: @padding-base-vertical; - cursor: pointer; + cursor: default; color: @text-color; width: 100%; overflow: hidden; @@ -51,9 +50,28 @@ } } - .item.selected, .item:hover { + .item.divider { + font-weight:@headings-font-weight; + color: @border-color-divider; + font-size: @font-size-small; + text-transform: uppercase; + margin-top: 10px; + pointer-events: none; + } + + .item.checked { + background-image:url(./images/menu/checked@2x.png); + background-size: 16px; + background-position: right; + background-repeat: no-repeat; + background-position-x: 97%; + margin-right: 20px; + padding-right: 10%; + } + + .item.selected, .item:active { text-decoration: none; - background: @accent-primary; + background-color: @accent-primary; color: @text-color-inverse; .primary { color: @text-color-inverse; @@ -62,4 +80,19 @@ color: @text-color-inverse-very-subtle; } } + + .item:not(.active):not(.selected):hover { + text-decoration: none; + background-color: fade(@black, 3%); + } + +} +body.platform-win32 { + .menu { + .header-container { + input.search { + box-shadow: none; + } + } + } } diff --git a/static/components/modal.less b/static/components/modal.less new file mode 100644 index 0000000000..20c88fd082 --- /dev/null +++ b/static/components/modal.less @@ -0,0 +1,29 @@ +@import "ui-variables"; + +.nylas-modal-container { + position: absolute; + z-index: 40; + + .modal-close { + margin: 6px; + } + + .modal { + position: absolute; + background-color: @background-primary; + border-radius: @border-radius-base; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.20), 0 0 1px rgba(0, 0, 0, 0.7); + } +} + +@media (-webkit-min-device-pixel-ratio: 2) { + .modal-close { + margin: 12px; + } +} + +body.platform-win32 { + .modal { + border-radius: 0; + } +} \ No newline at end of file diff --git a/static/components/multiselect-dropdown.less b/static/components/multiselect-dropdown.less new file mode 100644 index 0000000000..2343392468 --- /dev/null +++ b/static/components/multiselect-dropdown.less @@ -0,0 +1,15 @@ +@import "ui-variables"; + +.nylas-multiselect-dropdown { + display: inline-block; + + .button-dropdown, .menu, .secondary-items{ + .content-container { + background: @dropdown-default-bg-color; + border-radius: 3px; + .item { + padding: 5px 10px 5px 20px; + } + } + } +} diff --git a/static/components/nylas-calendar.less b/static/components/nylas-calendar.less new file mode 100644 index 0000000000..554df3175d --- /dev/null +++ b/static/components/nylas-calendar.less @@ -0,0 +1,433 @@ +@import 'ui-variables'; +body.platform-win32 { + .calendar-toggles { + .colored-checkbox { + border-radius: 0; + .bg-color { + border-radius: 0; + } + } + } +} + +.nylas-calendar { + + height: 100%; + display: flex; + + .calendar-toggles { + display: flex; + background-color: @source-list-bg; + border-right: 1px solid @border-color-divider; + color: @text-color-subtle; + .calendar-toggles-wrap { + padding: 20px; + padding-top: 6px; + } + .colored-checkbox { + position: relative; + top: 1px; + margin-left: 1px; + display: inline-block; + border-radius: 3px; + width: 12px; + height: 12px; + box-shadow: 0 0 0.5px rgba(0,0,0,0.4), inset 0 1px 0 rgba(0,0,0,0.13); + background: white; + .bg-color { + width: 100%; + height: 100%; + border-radius: 3px; + } + } + label { + padding-left: 0.4em; + } + .toggle-wrap, .account-label { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 2px; + } + .account-calendars-wrap { + &:first-child { + margin-top: 0; + } + } + .account-label { + cursor: default; + color: @text-color-very-subtle; + font-weight: @font-weight-semi-bold; + font-size: @font-size-small * 0.9; + margin-top: @padding-large-vertical; + letter-spacing: -0.2px; + } + } + + background: @background-off-primary; + .calendar-view { + height: 100%; + flex: 1; + position: relative; + } + + .calendar-event { + @interval-height: 21px; + position: absolute; + font-size: 11px; + line-height: 11px; + font-weight: 500; + overflow: hidden; + text-overflow: ellipsis; + min-height: @interval-height; + + border-top: 0; + border-bottom: 2px solid @background-primary; + border-left: 0; + + display: flex; + cursor: default; + .default-header { + overflow: hidden; + text-overflow: ellipsis; + margin: 4px 5px 5px 6px; + cursor: default; + opacity: 0.7; + flex: 1; + } + + &:before { + content: ""; + position: absolute; + width: 2px; + height: 100%; + left: 0; + top: 0; + background: rgba(0,0,0,0.1); + } + + &.horizontal { + white-space: nowrap; + } + &.selected { + background-color: @accent-primary !important; + } + } + + .calendar-mouse-handler { + height: 100%; + display: flex; + flex-direction: column; + } + .week-view { + height: 100%; + + @legend-width: 75px; + + .calendar-body-wrap { + display: flex; + flex-direction: row; + position: relative; + height: 100%; + + .calendar-area-wrap { + &::-webkit-scrollbar { + display: none; + } + flex: 1; + display: flex; + flex-direction: column; + overflow-x: auto; + overflow-y: hidden; + position: relative; + } + + .calendar-legend { + width: @legend-width; + box-shadow: 1px 0 0 rgba(177,177,177,0.15); + z-index: 2; + } + } + + .week-header { + position: relative; + padding-top: 75px; + border-bottom: 1px solid @border-color-divider; + flex-shrink: 0; + } + + .date-labels { + position: absolute; + width: 100%; + top: 0; + left: 0; + height: 100%; + display: flex; + } + + .all-day-events { + position: relative; + width: auto; + z-index: 2; + overflow: hidden; + } + + .all-day-legend { + width: @legend-width; + position: relative; + } + + .legend-text { + font-size: 11px; + position: absolute; + color: #bfbfbf; + right: 10px; + } + + .date-label-legend { + width: @legend-width; + position: relative; + border-bottom: 1px solid #dddddd; + box-shadow: 0 1px 2.5px rgba(0, 0, 0, 0.15); + z-index: 3; + .legend-text { + bottom: 7px; + } + } + + .day-label-wrap { + padding: 15px; + text-align: center; + flex: 1; + box-shadow: inset 1px 0 0 rgba(177,177,177,0.15); + &.is-today { + .date-label { color: @accent-primary; } + .weekday-label { + color: @accent-primary; + } + } + } + .date-label { + display: block; + font-size: 16px; + font-weight: 300; + color: #808080; + } + .weekday-label { + display: block; + font-weight: 500; + text-transform: uppercase; + margin-top: 3px; + font-size: 12px; + color: #ccd4d8; + } + + .event-grid-wrap { + flex: 1; + overflow: auto; + background: @background-primary; + box-shadow: inset 0 1px 2.5px rgba(0,0,0,0.15); + height: 100%; + } + .event-grid { + display: flex; + position: relative; + } + .event-grid-legend-wrap { + overflow: hidden; + box-shadow: 1px 0 0 rgba(177,177,177,0.15); + } + .event-grid-legend { + position: relative; + background: @background-primary; + z-index: 2; + } + .event-grid-bg-wrap { + .event-grid-bg { + position: absolute; + top: 0; + left: 0; + } + .cursor { + background: rgba(0,0,0,0.04); + position: absolute; + } + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 0; + } + + .event-column { + flex: 1; + position: relative; + height: 100%; + z-index: 1; + overflow: hidden; + box-shadow: 1px 0 0 rgba(177,177,177,0.15); + &.weekend { + background: rgba(0,0,0,0.02); + } + } + } + + .month-view { + + } + + .current-time-indicator { + position: absolute; + width: 100%; + height: 1px; + opacity: 0; + border-top: 1px solid rgb(255,100,100); + z-index: 2; + transition: opacity ease-in-out 300ms; + + &.visible { + opacity: 1; + } + div { + position: absolute; + width:11px; + height:11px; + border-radius: 6px; + background-color: rgb(255,100,100); + transform: translate3d(-75%, -50%, 0); + border: 1px solid @background-primary; + } + } + + .top-banner { + color: rgba(33,99,146,0.6); + background: #e0eff6; + font-size: 12px; + line-height: 25px; + text-align: center; + box-shadow: inset 0 -1px 1px rgba(0,0,0,0.07); + } + + .header-controls { + padding: 10px; + display: flex; + color: #808080; + border-bottom: 1px solid @border-color-divider; + box-shadow: inset 0 -1px 1px rgba(191,191,191,0.12); + flex-shrink: 0; + + .title { + display: inline-block; + width: 275px; + } + .title, .btn-icon { + font-size: 15px; + line-height: 25px; + } + + .btn-icon { + margin: 0; + height: auto; + img { + vertical-align: baseline; + } + } + } + + .footer-controls { + padding: 10px; + min-height: 45px; + display: flex; + color: #808080; + background: @background-primary; + border-top: @border-color-divider; + box-shadow: 0 -3px 16px rgba(0,0,0,0.11); + z-index: 2; + } + + .center-controls { + text-align: center; + flex: 1; + order: 0; + } +} + +.mini-month-view { + width: 100%; + height: 100%; + min-width: 200px; + min-height: 200px; + text-align: center; + display: flex; + flex-direction: column; + background: @background-primary; + border: 1px solid @border-color-divider; + border-radius: @border-radius-base; + + .header { + display: flex; + background: @background-secondary; + padding: 4px 0 3px 0; + .month-title { + padding-top: 3px; + color: @text-color; + flex: 1; + } + border-bottom: 1px solid @border-color-divider; + .btn.btn-icon { + line-height: 27px; + height: 27px; + margin-top: -1px; + margin-right: 0; + &:active { + background: transparent; + } + } + } + + .legend { + display: flex; + .weekday { + flex: 1; + } + padding: 3px 0; + border-bottom: 1px solid @border-color-divider; + } + + .day-grid { + display: flex; + flex-direction: column; + flex: 1; + .week { + flex: 1; + display: flex; + min-height: 28px; + } + .day { + display: flex; + flex-direction: column; + justify-content: center; + flex: 1; + min-height: 28px; + color: @text-color-very-subtle; + &.cur-month { + color: @text-color; + } + &:hover { + background: rgba(0,0,0,0.05); + cursor: pointer; + } + &.today { + border: 1px solid @accent-primary; + } + &.cur-day { + background: @accent-primary; + color: @text-color-inverse; + &:hover { + background: darken(@accent-primary, 5%); + } + } + } + } +} diff --git a/static/components/outline-view.less b/static/components/outline-view.less new file mode 100644 index 0000000000..3ba837bf13 --- /dev/null +++ b/static/components/outline-view.less @@ -0,0 +1,149 @@ +@import "ui-variables"; +@import "ui-mixins"; + +@count-color: fadeout(@text-color-subtle, 40%); + +.nylas-outline-view { + order: 1; + + section { + margin-bottom: @padding-base-vertical; + } + + section.item-children { + padding-left: @padding-base-horizontal; + margin-bottom: 0; + } + + .heading { + display: flex; + align-items: center; + cursor: default; + color: @text-color-very-subtle; + font-weight: @font-weight-semi-bold; + font-size: @font-size-small * 0.9; + padding-left:@padding-small-horizontal; + padding-top:@padding-small-horizontal; + padding-right: @padding-xs-horizontal; + letter-spacing: -0.2px; + + span:first-child { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + } + + .add-item-button { + margin-left: @padding-small-horizontal; + margin-right: @padding-small-horizontal; + cursor: pointer; + img {background: @text-color-very-subtle; } + display: none; + } + + .collapse-button { + cursor: pointer; + display: none; + min-width: 30px; + margin-left: auto; + margin-right: 8px; + } + } + + &:hover { + .heading { + .collapse-button,.add-item-button { + display: inherit; + } + } + } + + .item-container { + display:flex; + &.dropping { + background-color: lighten(@source-list-bg, 20%); + .item { + color: @source-list-active-color; + img.content-mask { background-color: @source-list-active-color; } + } + } + } + + .item { + color: @text-color-subtle; + flex: 1; + display: flex; + align-items: baseline; + font-size: @font-size-base; + font-weight: 400; + padding-right: @spacing-standard; + line-height: @line-height-large; + clear: both; + + // The overflow needs to be `hidden` in order for the name to flex + // fit within the contained space. + overflow: hidden; + + img.content-mask { + background-color: @text-color-subtle; + vertical-align: text-bottom; + } + + .icon { + flex-shrink: 0; + order: 1; + } + .name { + order: 2; + padding-left: @padding-small-horizontal * 0.85; + overflow: hidden; + line-height: @line-height-small; + text-overflow: ellipsis; + } + .item-count-box { + order: 3; + flex-shrink: 0; + font-weight: @font-weight-semi-bold; + color: @count-color; + margin-left: @padding-small-horizontal * 0.8; + box-shadow: 0 0.5px 0 @count-color, 0 -0.5px 0 @count-color, 0.5px 0 0 @count-color, -0.5px 0 0 @count-color; + } + .item-count-box.alt-count { + color: @source-list-active-bg; + background: @source-list-active-color; + box-shadow: none; + } + .item-count-box.archive, + .item-count-box.all, + .item-count-box.spam { + display: none; + } + + &.selected { + background: @source-list-active-bg; + color: @source-list-active-color; + img.content-mask { background-color: @source-list-active-color; } + } + &.dropping { + background-color: lighten(@source-list-bg, 20%); + color: @source-list-active-color; + img.content-mask { background-color: @source-list-active-color; } + } + &.editing { + align-items: center; + + .item-input { + order: 2; + font-size: @font-size-small; + margin-left: @padding-small-horizontal * 0.3; + height: 22px; + padding-left: 0; + text-indent: @padding-small-horizontal * 0.55; + width: 85%; + } + } + &:hover { + cursor: default; + } + } +} diff --git a/static/components/popover.less b/static/components/popover.less deleted file mode 100644 index 8fa7eaa63f..0000000000 --- a/static/components/popover.less +++ /dev/null @@ -1,54 +0,0 @@ -@import "ui-variables"; - -.popover-container { - display:inline-block; - position:relative; -} - -.popover { - position: absolute; - top: -10px; - left: 50%; - width: 250px; - max-height:400px; - background-color: @background-color; - transform: translate(-50%,-100%); - box-shadow: 0 4px 30px rgba(0,0,0,0.19), inset 0 0 1px rgba(0,0,0,0.5); - border-radius: @border-radius-base; - z-index: 40; - - .menu { - z-index:1; - position: relative; - .content-container { - background: none; - } - .header-container { - border-top-left-radius: @border-radius-base; - border-top-right-radius: @border-radius-base; - background: none; - } - .footer-container { - border-bottom-left-radius: @border-radius-base; - border-bottom-right-radius: @border-radius-base; - background: none; - - .item:last-child:hover { - border-bottom-left-radius: @border-radius-base; - border-bottom-right-radius: @border-radius-base; - } - } - } - - .popover-pointer { - position: absolute; - width: 22.5px; - height: 11px; - background: transparent url('images/tooltip/tooltip-bg-pointer@2x.png') no-repeat; - background-size: 22.5px 10.5px; - margin-left: 50%; - transform: translateX(-50%); - z-index:0; - bottom: -10px; - } -} diff --git a/static/components/scroll-region.less b/static/components/scroll-region.less new file mode 100644 index 0000000000..0a553c1629 --- /dev/null +++ b/static/components/scroll-region.less @@ -0,0 +1,157 @@ +@import "ui-variables"; + +@tooltipBorderColor: rgba(54, 56, 57, 0.9); +@tooltipBackground: -webkit-gradient(linear, left top, left bottom, from(rgba(99, 102, 103, 0.9)), to(rgba(82, 85, 86, 0.9))); + +.scroll-tooltip { + background: @tooltipBackground; + color: white; + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.25); + padding: @padding-base-vertical @padding-base-horizontal @padding-base-vertical @padding-base-horizontal; + border: 1px solid @tooltipBorderColor; + border-radius: @border-radius-base; + transform: translate(-15px, 0); + position: relative; + white-space:nowrap; + pointer-events: none; +} +.scroll-tooltip:after, .scroll-tooltip:before { + left: 100%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + pointer-events: none; +} +.scroll-tooltip:after { + border-color: transparent; + border-left-color: lighten(rgba(99, 102, 103, 1), 3%); + border-width: 8px; + margin-top: -8px; +} +.scroll-tooltip:before { + border-color: transparent; + border-left-color: darken(@tooltipBorderColor, 20%); + border-width: 9px; + margin-top: -9px; +} + + +.scroll-region { + ::-webkit-scrollbar { + display: none; + } + + position:relative; + + .scroll-region-content { + position: absolute; + height: 100%; + width: 100%; + overflow-y: scroll; + overflow-x: hidden; + z-index: 1; // Important so that content does not repaint with container + } + + .scroll-region-content-inner { + transform:translate3d(0,0,0); + } +} + +.scroll-region.scrolling { + .scroll-region-content-inner { + pointer-events: none; + } +} + +.scrollbar-track { + position: relative; + opacity: 0; + transition: opacity 0.3s; + transition-delay: 0.5s; + padding:3px; + width:17px; + background: @list-bg; + border-left: 1px solid @border-color-divider; + + &:hover { + opacity: 1; + transition-delay: 0s; + } + + &.scrolling { + opacity: 1; + transition-delay: 0s; + } + + &.with-ticks { + opacity: 1; + transition-delay: 0s; + } + + &.dragging { + opacity: 1; + .scrollbar-handle { + cursor: default; + background-color: lighten(@gray, 30%); + border:1px solid lighten(@gray, 20%); + .tooltip { + opacity: 1; + display:block; + } + } + } + + /* Used to read the track height with padding applied. */ + .scrollbar-track-inner { + height:100%; + } + + .scrollbar-handle { + background-color: lighten(@gray, 40%); + border:1px solid lighten(@gray, 30%); + border-radius:8px; + .tooltip { + opacity: 0; + display:none; + transition: opacity 0.3s; + top: 50%; + transform: translate(-100%, -50%); + position: absolute; + pointer-events: none; + } + } + + .scrollbar-ticks { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 2; + .t { + &.match { + background: @text-color-search-current-match; + z-index: 2; + } + position: absolute; + width: 90%; + left: 5%; + height: 2px; + background: @text-color-search-match; + box-shadow: 0 0.5px 0.5px rgba(0,0,0,0.25); + } + } +} +body.platform-win32 { + .scroll-tooltip { + border-radius: 0; + } + .scrollbar-track { + .scrollbar-handle { + border-radius: 0; + } + } +} diff --git a/static/components/search-bar.less b/static/components/search-bar.less new file mode 100644 index 0000000000..4a333ab537 --- /dev/null +++ b/static/components/search-bar.less @@ -0,0 +1,92 @@ +@import "ui-variables"; +@import "ui-mixins"; + +.nylas-search-bar { + height: initial; + + .menu .header-container { + padding: 0; + height: 23px; + background-color: transparent; + border: none; + + input { + padding-left: 26px; + padding-right: 26px; + width: 100%; + height: 23px; + border: 1px solid transparent; + box-shadow: @shadow-border; + } + input.empty { + text-align: left; + } + input.empty:focus { + text-align: left; + } + } + + .menu .footer-container { + border:none; + } + .menu .content-container { + position: absolute; + top: 23px; + z-index: 2; + width: 100%; + + box-shadow: @standard-shadow; + + .item { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + } + + .search-container { + position: relative; + + &.showing-suggestions { + .suggestions { display: inherit; } + .clear { + color: @text-color-subtle; + display: inherit; + } + } + &.showing-query { + .clear { display: inherit; } + } + } + + .search-accessory { + + &.search { + position: absolute; + top: 8px; + left: @padding-base-horizontal; + + &.loading { + top: 4px; + left: 7px; + width: 15px; + height: 15px; + } + } + + &.clear { + position: absolute; + top: 3px; + right: 4px; + color: @text-color-subtle; + display: none; + } + } +} + +body.is-blurred { + .search-bar .menu .header-container input { + background: none; + box-shadow: @shadow-border; + } +} diff --git a/static/components/spinner.less b/static/components/spinner.less index edc1fc2a7c..1a158a3476 100644 --- a/static/components/spinner.less +++ b/static/components/spinner.less @@ -5,7 +5,8 @@ width: 94px; text-align: center; opacity: 1; - -webkit-transition: opacity 0.2s linear; //transition + transition: opacity 0.2s linear; + pointer-events: none; } .spinner.hidden { @@ -14,7 +15,6 @@ .spinner.paused { > div { // important. animating with opacity 0 chews up about 5% cpu - -webkit-animation-play-state: paused; animation-play-state: paused; } } @@ -26,42 +26,36 @@ } .spinner > div { - width: 18px; - height: 18px; - background-color: @gray-light; + width: 14px; + height: 14px; border-radius: 100%; + border: 1px solid @gray-light; display: inline-block; - -webkit-animation: bouncedelay 1.2s infinite ease-in-out; - animation: bouncedelay 1.2s infinite ease-in-out; + animation: bouncedelay 1.1s infinite cubic-bezier(0.45, 0.05, 0.55, 0.95); /* Prevent first frame from flickering when animation starts */ - -webkit-animation-fill-mode: both; animation-fill-mode: both; margin-right:4px; margin-left:4px; } .spinner .bounce1 { - -webkit-animation-delay: -0.32s; - animation-delay: -0.32s; + animation-delay: -0.34s; } - .spinner .bounce2 { - -webkit-animation-delay: -0.16s; - animation-delay: -0.16s; + animation-delay: -0.22s; } - -@-webkit-keyframes bouncedelay { - 0%, 80%, 100% { -webkit-transform: scale(0.0) } - 40% { -webkit-transform: scale(1.0) } +.spinner .bounce3 { + animation-delay: -0.12s; +} +.spinner .bounce4 { + animation-delay: 0s; } @keyframes bouncedelay { - 0%, 80%, 100% { + 0%, 80%, 100% { transform: scale(0.0); - -webkit-transform: scale(0.0); - } 40% { + } 40% { transform: scale(1.0); - -webkit-transform: scale(1.0); } } diff --git a/static/components/switch.less b/static/components/switch.less new file mode 100644 index 0000000000..a6fb9c3610 --- /dev/null +++ b/static/components/switch.less @@ -0,0 +1,30 @@ +@import "ui-variables"; + +.slide-switch { + border-radius: 12px; + box-shadow: inset 0 1px 1.5px rgba(0,0,0,0.3); + background-color: @gray-light; + position: relative; + display: inline-block; + vertical-align: middle; + height: 21px; + width: 40px; + + .handle { + border-radius: 14px; + width: 25px; + height: 25px; + position: absolute; + top: -2px; + left: -3px; + background-color: @white; + box-shadow: 0 0.5px 3px rgba(0,0,0,0.4); + transition: all 150ms cubic-bezier(0.22, 0.61, 0.36, 1); + } + &.active { + background-color: #69ba55; + .handle { + left: 18px; + } + } +} diff --git a/static/components/syncing-list-state.less b/static/components/syncing-list-state.less new file mode 100644 index 0000000000..8553732c07 --- /dev/null +++ b/static/components/syncing-list-state.less @@ -0,0 +1,13 @@ +@import 'ui-variables'; + +.syncing-list-state { + font-size: 105%; + color: @text-color-very-subtle; + padding: 10px 0; + + a { + cursor: pointer; + font-size: 75%; + vertical-align: top; + } +} diff --git a/static/components/table.less b/static/components/table.less new file mode 100644 index 0000000000..036ae577a7 --- /dev/null +++ b/static/components/table.less @@ -0,0 +1,62 @@ +@import 'ui-variables'; + +@row-highlight-color: #e3effc; +@row-highlight-text-color: #3a6fa7; +@row-highlight-border-color: #c9dcf0; + +.nylas-table { + height: 100%; + width: 100%; + overflow-y: hidden; + overflow-x: scroll; + + thead, tbody { + display: block; + } + + .table-row { + + .table-cell { + border: 1px solid lighten(@border-color-secondary, 5%); + color: @text-color-very-subtle; + + &>div { + min-height: 20px; + min-width: 100px; + } + + input { + color: inherit; + border: none; + &:focus { + border: none; + outline: none; + box-shadow: none; + } + } + + &.selected { + // TODO + } + + &.numbered-cell { + width: 20px; + min-width: 20px; + text-align: center; + } + } + + &.selected { + background: @row-highlight-color; + + .table-cell { + color: @row-highlight-text-color; + border: 1px double @row-highlight-border-color; + input { + color: @row-highlight-text-color; + } + } + } + } + +} diff --git a/static/components/time-picker.less b/static/components/time-picker.less new file mode 100644 index 0000000000..4cec8e6bed --- /dev/null +++ b/static/components/time-picker.less @@ -0,0 +1,52 @@ +@import "ui-variables"; + +.time-picker-wrap { + display: inline-block; + width: 5.5em; + position: relative; + input { + width: 5.5em; + &.invalid { + background: fade(@color-error, 10%); + } + } + + .time-options { + max-height: 158px; + overflow: auto; + border: 1px solid #eee; + position: absolute; + width: 100%; + text-align: center; + background: @background-primary; + border-top: 0; + border-radius: 0 0 @border-radius-base @border-radius-base; + box-shadow: 0 0 3px rgba(0,0,0,0.1); + + &.relative-to { + width: 120px; + text-align: left; + + .option { + padding-left: 12px; + } + } + + .option { + line-height: 1.75; + &.selected { + color: @text-color; + &:hover { + background: transparent; + } + } + &.focused, &:hover { + background: rgba(0,0,0,0.05); + } + .rel-text { + font-size: 0.8em; + margin-left: 4px; + } + } + } +} diff --git a/static/components/toast.less b/static/components/toast.less new file mode 100644 index 0000000000..af8ea2edd8 --- /dev/null +++ b/static/components/toast.less @@ -0,0 +1,53 @@ +@import "ui-variables"; + +.nylas-toast { + position: absolute; + bottom: 10px; + z-index: 100; + width:100%; + text-align: center; + pointer-events: none; + + .nylas-toast-wrap { + height: 45px; + display:inline-block; + padding-top: 12px; + opacity: 0.9; + border-radius: @border-radius-base; + background: @gray-darker; + white-space:nowrap; + cursor:default; + pointer-events: initial; + display: inline-flex; + flex-direction:row; + max-width:90%; + } +} + +body.platform-win32 { + .nylas-toast-wrap { + border-radius: 0; + } +} + +.nylas-toast-item-enter { + opacity: 0.01; + transform: translate3d(0, 10px, 0); + transition: all .15s ease-out; +} + +.nylas-toast-item-enter.nylas-toast-item-enter-active { + opacity: 1; + transform: translate3d(0, 0, 0); +} + +.nylas-toast-item-leave { + opacity: 1; + transform: translate3d(0, 0, 0); + transition: all .15s ease-in; +} + +.nylas-toast-item-leave.nylas-toast-item-leave-active { + transform: translate3d(0, 10px, 0); + opacity: 0.01; +} diff --git a/static/components/tokenizing-text-field.less b/static/components/tokenizing-text-field.less index e0b2767403..578819b619 100644 --- a/static/components/tokenizing-text-field.less +++ b/static/components/tokenizing-text-field.less @@ -1,19 +1,54 @@ @import "ui-variables"; +@token-top:lighten(@background-secondary,0.6%); +@token-bottom:darken(@background-secondary, 2.5%); + +@token-hover-top: mix(@token-top, @component-active-color, 92%); +@token-hover-bottom: mix(@token-bottom, @component-active-color, 90%); + +@token-selected-top: mix(@token-top, @component-active-color, 15%); +@token-selected-bottom: mix(@token-bottom, @component-active-color, 0%); + +@token-invalid-selected-top: mix(@token-top, red, 60%); +@token-invalid-selected-bottom: mix(@token-bottom, red, 55%); + +@base-box-shadow: 0 0.5px 0 rgba(0,0,0,0.17), 0 -0.5px 0 rgba(0,0,0,0.17), 0.5px 0 0 rgba(0,0,0,0.17), -0.5px 0 0 rgba(0,0,0,0.17), 0 1px 1px rgba(0, 0, 0, 0.1); + .tokenizing-field { display: block; margin: 0; padding: 0; - border-bottom: 1px solid @border-color-divider; - min-height: 30px; position: relative; + &.disabled { + background: rgba(0,0,0,0.02); + opacity: 0.7; + .token { + background: @token-top; + box-shadow: @base-box-shadow; + &:hover { + background: @token-top; + cursor: default; + box-shadow: @base-box-shadow; + } + } + .tokenizing-field-input { + &:hover { + cursor: default; + } + } + &:hover { + cursor: default; + } + } + .content-container { - border: 1px solid @border-secondary-bg; + border: 1px solid @border-color-secondary; box-shadow: 0 2px 8px rgba(0,0,0,0.2); border-radius: @border-radius-small; - background-color: @background-color; + background-color: @background-primary; position: absolute; + z-index: 2; } .content-container.empty { @@ -28,72 +63,190 @@ border:0; } + .token-editing-input { + max-width: 100%; + font-size: 15px; + line-height: 17px; + padding: 2em;//0.5em @spacing-three-quarters 0.5em @spacing-three-quarters; + padding-right: 1.5em; + margin: 3px 6px 6px 1px; + } + .token { display: inline-block; position: relative; - padding: 0.5em @spacing-half 0.10em @spacing-half; + color: @text-color; + padding: 0 @spacing-three-quarters; padding-right: 1.5em; - margin: 0 5px 5px 0; - border-radius: @border-radius-base; - font-size: 15px; - background-color: @background-secondary; + margin: 1px 5px 1px 1px; + border-radius: @border-radius-base * 0.8; max-width: 100%; + line-height: 1.9em; + + background: linear-gradient(to bottom, @token-top 0%, @token-bottom 100%); + box-shadow: @base-box-shadow; + vertical-align: middle; .action { position:absolute; padding: 0; - padding-top: 1px; - right: 5px; border: 0; margin: 0; + right: 7px; background-color: transparent; color: @text-color-very-subtle; + img { background-color: @text-color-very-subtle; } font-size: 10px; } &:hover { - background-color: darken(@background-secondary, 5%); + background: linear-gradient(to bottom, @token-hover-top 0%, @token-hover-bottom 100%); + box-shadow: 0 0.5px 0 darken(@token-hover-bottom, 35%), 0 -0.5px 0 darken(@token-hover-top, 25%), 0.5px 0 0 darken(@token-hover-bottom, 25%), -0.5px 0 0 darken(@token-hover-bottom, 25%), 0 1px 1px rgba(0, 0, 0, 0.07); cursor: default; } + &.invalid { + border-bottom:1px dashed red; + margin-bottom: -1px; + background: transparent; + &:hover { + box-shadow: 0 -0.5px 0 @token-invalid-selected-top, 0.5px 0 0 @token-invalid-selected-bottom, -0.5px 0 0 @token-invalid-selected-bottom, 0 1px 1px rgba(0, 0, 0, 0.07); + } + } + &.invalid.selected, &.invalid.dragging { + background: linear-gradient(to bottom, @token-invalid-selected-top 0%, @token-invalid-selected-bottom 100%); + box-shadow: inset 0 1.5px 0 rgba(255,255,255,0.3), 0 1px 1px rgba(0, 0, 0, 0.1); + border: 1px solid darken(@token-invalid-selected-bottom, 8%); + border-top: 1px solid darken(@token-invalid-selected-top, 10%); + } + &.selected, &.dragging { - background-color: @background-tertiary; + background: linear-gradient(to bottom, @token-selected-top 0%, @token-selected-bottom 100%); + box-shadow: inset 0 1.5px 0 rgba(255,255,255,0.3), 0 1px 1px rgba(0, 0, 0, 0.1); + border: 1px solid darken(@token-selected-bottom, 8%); + border-top: 1px solid darken(@token-selected-top, 10%); + border-radius: @border-radius-base; + + // Note: we switch from 0.5px borders with box shadows to a real border, + // because the 0.5px shadows can't be as dark as we want. This means + // margins / border radius change by 1px. + margin: 0 4px 0 0; + color: @text-color-inverse; - .action { color: @text-color-inverse-subtle; } + .action { + color: @text-color-inverse-subtle; + img { background-color: @text-color-inverse-subtle; } + } + .secondary, + .participant-secondary { + color: @text-color-inverse-subtle; + } } &.dragging { cursor: -webkit-grabbing; } } - .tokenizing-field-label { color: @text-color-very-subtle; float: left; text-transform: capitalize; - padding-top: 8px; + padding-top: 12px; display: block; + &:hover { + cursor: default; + } } .tokenizing-field-input { position: relative; - padding-left: 2.1em; + margin-left: 2.8em; + padding-top: 9px; + padding-bottom: 3px; + + &:hover { + cursor: text; + } + &.at-max-tokens { + cursor: default; + input { + &:hover { cursor: default; } + opacity: 0; + } + } input { display: inline-block; width: initial; - padding: 6px 0 3px 0; - margin: 0 5px 5px 0; + vertical-align:top; border: none; - min-width: 5em; + min-width: 0.5em; background-color:transparent; - vertical-align:bottom; + + // NOTE: padding-top and padding-bottom need to match that of + // `.token`. to ensure they have the same baseline. + // + // The padding-left and padding-right must be 0 so we can manually + // set the width properly to always match the size of the input + // test. + padding: 0.3em 0 0.3em 0; + + &.noop-input { + position: absolute; + min-width: 0; + padding-left: 0; + margin-right: 0; + box-shadow: none; + &:focus { + box-shadow: none; + } + } } + input:focus { box-shadow: none; } } + + .placeholder { + color: fade(@text-color, 50%); + position: absolute; + top: 50%; + margin-top: -0.75em; + left: 8px; + } } -body.is-blurred .tokenizing-field .token { - background-color: @background-secondary; +body.is-blurred .tokenizing-field .token:not(.invalid) { + background: @background-secondary; + color: @text-color; + &.selected .action img { background-color: @text-color-very-subtle; } +} + +body.platform-win32 { + .tokenizing-field { + .content-container { + border-radius: 0; + } + .tokenizing-field-input { + input, input:focus { + border: 0; + box-shadow: 0 0 0; + } + } + } + .token { + border-radius: 0; + background: @token-bottom; + &.selected, + &.dragging { + border-radius: 0; + background: @token-selected-top; + } + &:hover { + background: @token-hover-bottom; + } + &.invalid.selected, &.invalid.dragging { + background: @token-invalid-selected-top; + } + } } diff --git a/static/components/tutorial-overlay.less b/static/components/tutorial-overlay.less new file mode 100644 index 0000000000..653e7b9989 --- /dev/null +++ b/static/components/tutorial-overlay.less @@ -0,0 +1,83 @@ +tutorial-tip-background { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 20; + pointer-events: none; + opacity: 0; + transition: opacity ease-in-out 250ms; + background-color: rgba(0,0,0,0.25); + -webkit-mask-image: linear-gradient(to top, #fff 0%, #aaa 100%), url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAMAAABrrFhUAAAAt1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABa5Z9DAAAAPHRSTlMABgsQLSgUGDMcOCPy7TxlQCD6dkilTET2zYJgqplQxFhUv1xpcW3kkHrohuDRutmu1ZS2oMiyfordnY2UR3hBAAAS+UlEQVR42uyW2Y4TMRRE2QkgQSI2se8IhECIXfD//4VMOT4uX5sWCt10gOJlZh6Qzqm6Tk78z//8gZzUP3Ji/+/vjqgn8rdqcMh/S0Nb+6lx/kIJHfLp/CUSaL5hPz3KwMJxOoB9DD4t4kiHQPc99nPj9Cwc4Q4ifCQ/36bjAQnHtAOnhx3uiWDBJBzJDHr0jn7h53EN7mDtMzhp+AEe9N0oaDAJOFj1CiI98E5+aZTiAQvBwVpXAD70NbyTn+3FPVQScLDaGTi+0wse8MlgoeNgjSvQ7Xfwga/Zz5AYLNQSooJVjQD8QA98IN94ggckmIP1rUD4lO/0wDv3RdCbv0QJ7kAzWM0KBvjQA19ISUwziNrBChWk4/fx5/KhB97QL/diGpCAg/RfS8FK3gLVDz7lQw98Db7tBRFIwIFmUBT8+RFQf4NvywfeyW/GuAck2C2sSMEYH3qDN/BrMSYCCTgYK1jeAPUP8aGHHfAbMYjAAg76ChYewbh+8Cl/X/0e3sDvx5iIvYT9EJgBCv7cCGL9jr8Bv4I38EcxJqKSgIKNKWAEixrg8Vf9Ed/pgTfwhzEmAgnmICrQCJY0QP2+fvADveAN/EmMiZCE4AAF3MHSIwj1j/GpXuyA3+kFEbLAELoKFh8Br7/Xz/rBz+UXerFDfqUXPMhCcZBngALuwEawxKcB86d+w6d86AXv5E/buAdJwAEzQIGPQGcwr4CTxq/6x/jQC97An8eYCEnAwUgBI1jAgM8/1A++yoc+w9fkz2LwkC2YgzQDFMQRcAYomIuf+Tt+4gff6cUO+dUYPMiCOTAFlxsFnMGsBuAP9af1g38/40MveCN/2QYP2QIOioL7UlDuwEfgBhbip37HV/nQZ3bIP7fBQ7aAA83AFTCCRQxE/lH9wlf50Au+gN/up4iQBBxoBlIwGMHMBuA/Z/zU38OHXvCgv+oFDZKAg44CRuAGzs1joD9/6nd8yhe94Gv0L73UGiRBDpiBK2AE/TNYhJ/6waf8RE/zBf3bj7yooz8VDSwhOWAGKGAEsxpg/8bP/L1+8Clf9Jm9Bn9XpxaRLcgBM0ABI7AzMAO6ghn4OX/NP9QvfMoXveBr8HueWoQkyAEzkIIwAp0BD4EZmInf56/6Iz70Bd7BvxIXUSTgICrQCOwMZjDA9/8+v9Wv9Tt+oRc84B/aSESRgANXoDuwEfQM/L5nYIq/X7/wVb7oBQ/59TZ4kAQ50AykoDuCKQNz8m/FT/0B3+jFDvndOniQBXMQFDACGdhOGJiJX+fP4+/4Kl/0ufkI/jYlitAS5EAzaBTwcaCHYC4DfAEY8Jf5q/50/Ibf0oOtfErhVyTgwBWkpyCPoJzBwIB/HTj8CxD8CR9+5q/6M762v19+gRd2yfsUfsVCdlAUvMgK8gg4AwwkBRg48AsRHwADfs6f+Qs/8dM+9IIXdsmbFH4tFmoHrCAZkALOgIegawABBz8Au92I3+sHP5UveuCFrTx+U37Qj1KBBDlIM0CBj2BkYLezZ+C38m9afl6/VH9aP/h0n+EFPIosSAI7QEG6gzQC3sLWwGZg4PAPgD4/86f+Bh/6iv1BL5UFHDQKGAFn0DNw+EcBDwAfAHr/Mz/PX64/8Wv9uv2MD72zf/S4BRxkBXoLdAfJQB4BT6EM6LOAj4IDngF7AMf85fy9fvCN3shv1TEP5gAFPoLyEEQDBz6E8QCcfxv40/x1/azf8IGHvBuXYAq4g/QS6AyCga0ZOOgI/AEc83P+1A++ys/0sL/uBwtykGeAAkbAQzA24A/hL/L7AzDNr/mr/rR+x8/0sH9nzgxyo4iCGHoBEIgFmhXKKiCEEiVKFqC5/7mQ8DSvq6otaxi6lb6B/e1XnuRp68MFeVAt+NMDhUA1yA5kDOQCAAANAO0/8V/6qT/PX+SjfqX9cX4rF/CgWEAIAIEc0C3QJtQcAAOmBOECbAHA66f+PL/k6/EX9WvtP+u3dmHxQDGQBYQAEFgHtjFwSwE4AF0/9a/PL/Tx+FK/kv6jfisb5AExEA5rCABBd4BTkEuQC7Cl/0vUX+RX9UX61+UrNhQPigXZgS/NAVeCbMAoAADU/t3QX55f3Uc+4hE+vrUJWCAWlBBsOKBVDAhbCbwBuQAAAP0frP4pX29fxH/f+ooJysGwwDvwAQfAwL+VwBVAALy7G/qf0c/zF/l6+6L9ff2KC8pBsYAQ4MDzcODuTiB0JbipAABQ+9/o5/lX8pe3H9K3bFhygAWrEBgH9LsAEN5QAgIwCgAAtX//6v+F/vL8F/moR/y7/mHCxQMsIATFgV9/HdAqBoSUIEUgB6AVQAC8v9f+V/+lX/VHv9An+VX9O/9VD2SBcCgHAIEcEAf0u+D+XiCsJTARyCeQ3wAUoAEA/qFf8dfzV/lN/Kl/zYRqgUKgGuAAJGwYoAT8JiAC2QBfAPRr/zf9PL/S3+QP7c6FaoF6QAi6A/pdgAO2BEQgn0AISAEAAAD0+vX8yK/iP82vmoAFCoF3ABCCAUoAB+0pzAHQBFIBtICyfj1/ld+1WxeqBQpBdkB7SCXQHEoRyAHwBdjUr/rz/F0+6s/zw4NmASEQCLYd8CVoEbguABCQAqD/+XL/0V+fv8nv2q0LxYIWAhxY9sAzDlACODgikDfADIAmkC6gCiAAWv08f338c/5qDAiBdUAgVAl0CzWHSgTsIcgBEAEpgBaQCvDysqVf8ef5jfrsASFQDbYceHlRCbSHVAI4GCIQAgABmUANANp/Vj/hb/KzBRTBOaBN2DHAHIKDIQI5AJ8JwKUAAKDpfyz6o/xsQXPgsTkABi4lIAKfQwSuCwAEXArAAXh4KPrX9Y/yswUrEFQHHh44BZcSNA7mCOQAcAIhYCnAov91yX+Lf5CfLGg1WFrwenGglgAOcgpNBKwBPgAUgAuwAFD7B/3m+W8LAQ5oES0g5BJQAhOBZAAjaAaADVwKAACM/vNtn3EADJQSsIhHBPoYyg1gAxAA/QZqBQj6d3NglkC/iogAW6B3ICBwnoB+AikAANT+QT/yb7YAB7SIACElqKdwHoKOwYzAzQAwgSiAAGj07+OAQEgJmEMbEWgYTAaAQEbgDMAsgPZv1b+DA1rFswQzAsxBMDg7kBvABkA/E6jr/x703+rA9+4AcwgH2AKxA/w7sDWAG9gD8I0A1AIM/bs50EpABL4RgXYJRwfyCCAAMmAEgAIAgJ304wAYoASDg4sBRMBNgdyAicAWABUAAKJ/DwcEQkpQItAweFUHSgMmAtkAMwAUYNF/Qv9/deB0cYASjAiwBSYGawdyA64PAAU47/FRgqsjkDuAARsjgJ+BGoEEQAQ0+nd3QBwkAtoC/CgcU6AYkBvACjQBgIAUYB8AgAFKAAdNBFiDsQMYkBoQApABcDsGUgRCBzDAN2AY4AlAAEwB9ioBEfAUqAb4DnAEWUFqgDWAX0EEYNcCUIIeAX4TWQPUAbYQhzAgoDeAG3h8AHIEuIStAx4C/odQboANwHnfb0YgYNBDIBzBj9YAG4DTQQacXAS8AR/tIcQAEBAbwA3MAdg3AlzC2AEggAEZAaygdQAWAzQCIcCuBISDUEBzcDFgFQG2UIBAXgG5ASkA+0UgdyBDIO/gsYIGAtMJ2OkQVAzOLZTX8DTAIUC/A7gBswEH6ccBOjDvgH4PTAhEAzICaMChCMwYpAMZAhjgGOgRwApSA3YPQI6AOsAW8hAYFAwMzAh4ehMGPAUIZApigGdgQ8DBNyDfgQYBT0FvAEfAMNAh4Gj9OGAgYCg4z0A6AjCQFfAGEGAgMJYAFLRnwA1hw8CJgAMakDswIWAoyBj2BiQGgoDXioBj9ONAg8ArEAgUrAbw15B8BQsDj0RAhsCkYLyD+pvINVdwMvAIBGQIGApecQejAToCb4iBgYKcgWsNmH8NuVxBhvCbYOBv9s7ohGIYhoHZpvtv+Hj0wxQRXFpoAncrHCGSHVuZ3IJphk8djJ5IB+BqA6oSCACL7sC8BQtAVANhBAJA44OiEkgAXx2APAIBoKkGwgkFgN4GlAouFIGUgdLB3gj0AKY2YBcVnOtgGoEeQDrh7W3AUyOQXvg1gGM5gEMAXwEoFdwWwJ+AAAQgAAGoAgK4C0AnaC1gNWg/wI6QPUG7wr4L0F+G8G+Dvg6z5wPwEyLOCDkl5pwgflLUWWH2tDh+X8CNEXeG6Ftjg743iN8cdXcYvz2Ozw8wQcIMEXqKDD5HyCQpfJYYPk2OnidoouQY9ExRfKqsucL4ZGmzxfHp8vj/Bfxh4sfeGau2EQVR1CGQwo1x48KNCbgzuEmX//+woJz39uhmNCxovUtAmj84Z+7clap382+M3F+Zufl3hu4vTT3c+ltjN//a3P29wZt/cfLh4dbfHL35V2fv7w7fX56++bfH76/Pt0dwbuC9N3BJATFQQh3hx/Iv4ff87+f8Gw4AAe0RWIQXDUQIuAMVkAMkMAEuPPQTn/TH+i/yW4DNASBgwxFYhOsGUkE4QIIaRAde+n/xV/ktwA0H4LNTHkHUwGUDVuGi4HPcwdtQgAMkoIGZ6MBDP/HfRvo/F3zr7zK/BeABRANecQTWQG/Aj0GEgBQYAyRgIQZ24F0+24/1W/8tvwVQD2DrEViEGuA34XIGhkAFOkACFpzBDrz04rv+Jf78/pPfAtxwAE4ewZoBi8AQFAU40EKM7NAXfNfv+a/xX3MACsgaaA3wmzCLIBRQhzrAQpnJLj3VF/hx/vz+bfmzABBwzRFYA34KqgGLwBCogBgogSnkwkMf+K7f809+PwBZAN+v5M8a6A08TQOcAU0QCsIBEvQQ5MBLn/hcP/Gf/E8d/7YCyCOwCPkYLgZ+TgMWgSFQgQ6QgAVH9gEvvfiu3/OHn/6Hnw+gBZgHsK0GGgP8L5hnQBOkAh0gAQtlYAde+sTn+mf8+f3f8LcFsN3AYzVAERiCUEAMTg6QgIUysJ/goWf5ge/6Of/K//i1/KUIGwN5BiqgC3CwSMACIn4NbshhB37Sc/viZ/wb/q0FmBHoDPCbcFZhhoA7GAp0gAQsMGLDPuClH/ikP9c/64/ffw2/ArYa8FMwvwUa4AwIwelzgAJTgAMkYGGO2LADv9C7/RM+5c/6ib/8s//9AGznzxpoDHgGdmEqCAdIcM6whQ/6xLf9jH/D/+Nr+FcMUASeQSqgC3DALWBBEQkOO8kf9Nx+4ht/zn+df5cMWIWcQaMgHJCE8JDkbD7oG3zib/3tx79mgCKYIZh3gIJxCThAAhbwwCzksAMPPdkf+DP9c/2c/378KuBj2BigCGoIVKADJSjit+DCSy9+XT/nX/n9ACJgFwP8L6AIDEFRoAMkDAuKCHDYB7z0Bd/1c/78/t+Nvxp4HgbOzwAFGEDBjAEOpgQsKEJw2Cc89MvywYcf/LP4T/7nXfgtQg2UMzAEKjAGOHj9wAIahgjBQYf94xV6ly++6y/xl98C2N9AhCAUGINxC1hAQxnQYR/Jd/mBH+vfmV8DfguyCAxBKDAGOEACFtBQ53WyAw+9yxc/1p/nb//Dv4OBrEJC0CvQgRLQEDPRhZe+wXf9WX/y72rAM6ghQAGXoAMkYAERzgCHHXjpyT74Zf3Gv/AfYcAQVAXEQAdIwAIeHMgHO/DQu3zxy/qP4K8G4gwIgQpepgId/JWABTw4ksMOvPQT/0V81h/x358/DRiCuINQEA6QgAU8OIMcduCDPvBNf6x/f34/h55BhkAF4xJ0gAQs4MGRHHbgpZ/ZFz/Xb/zL5+/L+dMAIWgVhAMkYAERMYDDDnzQt/isP/l3NuAZGIJUQBekAyRgAQ+O5LAP+KTn9hOf9R8V/1oENQQqMAY4QAIW9OBADjvw0Lv8wC/rl/8wA4agU0AMyAESsIAIR3DYgWf3LL/Fd/1H7b8PQSgoDpCABUQ4gsMOfKEP/Gb9x8y3EoKiIB0oAQuIcASHXfikr/jHr7+egXegAmOAAyRMC4hwBId9gYfe5Ytv+o/l75sgFBgDc4AELCDCERx24Nl9LF/849ffG+gUpAMtIMIJcNmDvsWXf93AkQp0oAQtIMIRHHbhpV/BP3Q00CgwBjhAAhb04EgOO/DQx/Ib/KPXX0OQCoiBDlKCIhzBE156lp/4R69/PQQoIAY6UIIayoie8NC7fPD/k/X/6b6OcRiGYSAI/v/XKa4YkIqUdKZ8CNLPWhbgYwINRJDBDB2e/hv/8ccvQXkRWgMRyrrb4Fd9Dv8ofkuwNhBBBzNy+K6fyd8mSAMRVDBjh49+xx9UIJ8HEtQGiZAK2RYee/BNjz/i7jucAg1EUEEHI4+94OlnHn6HIAlag0RQQYcy8tjhq37e4S+TQAMRZDBDr/jowx/79JcEGoggw27o8PR38FuDRFDBNm724C/Ua1AjGKiRr/j79G5EDVQ4jb3rJ198mwRpoIKd4ez36k0EFQ5jv/LgG37+y37J4e9+9BbJX4N/jb5J/pC/zG6d1dXvphdhfvVr8iH5BwNfr46hwrnWAAAAAElFTkSuQmCC"); + -webkit-mask-composite: xor; + -webkit-mask-repeat: no-repeat; + -webkit-mask-size: 100% 100%, 128px 128px; +} + +tutorial-tip-background.visible { + pointer-events: inherit; + opacity: 1; +} + +.tutorial-tip { + position: absolute; + width: 13px; + height: 13px; + border-radius: 50%; + display: inline-block; + border: 2px solid white; + cursor: pointer; + pointer-events: none; + z-index: 100; + transform: translate3d(-50%,-50%,0); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(241, 170, 211)), to(rgb(185, 59, 255))); + opacity: 0; + transition: opacity ease-out 100ms; + box-shadow: 0 1px 2px rgba(0,0,0,0.2); +} + +.tutorial-tip.visible { + opacity: 1; +} + +body { + background: #000; +} + +.tutorial-tip.visible:after { + pointer-events: none; + position: absolute; + width: 100%; + height: 100%; + border-radius: 50%; + content: ''; + + border: 1px solid rgb(185, 59, 255); + transform-origin: 0.4 0.4; + + animation: sonarEffect 3s ease-out 75ms; + animation-iteration-count: infinite; + animation-delay: 1s; +} + +@-webkit-keyframes sonarEffect { + 0% { + opacity: 0; + } + 60% { + opacity: 0; + } + 65% { + opacity: 0.5; + transform: scale3d(1, 1, 1); + } + 80% { + opacity: 0.4; + transform: scale3d(2.6, 2.6, 2.6); + } + 100% { + opacity: 0; + transform: scale3d(3, 3, 3); + } +} diff --git a/static/components/undo-toast.less b/static/components/undo-toast.less new file mode 100644 index 0000000000..7273f11fed --- /dev/null +++ b/static/components/undo-toast.less @@ -0,0 +1,29 @@ +@import "ui-variables"; + +.nylas-undo-toast { + + .undo-message-wrapper { + flex: 1; + flex-shrink: 1; + margin-left: 16px; + margin-right: 30px; + color: @background-primary; + overflow:hidden; + text-overflow: ellipsis; + text-align: left; + } + + .undo-action-wrapper { + flex-shrink: 0; + margin-right: 15px; + white-space:nowrap; + + img { + background-color: @background-primary; + } + .undo-action-text { + margin-left: 5px; + color: @background-primary; + } + } +} diff --git a/static/dropdowns.less b/static/dropdowns.less new file mode 100644 index 0000000000..10cc10fba6 --- /dev/null +++ b/static/dropdowns.less @@ -0,0 +1,8 @@ +@import "ui-variables"; + +select { + // Set `border` property to allow styling for `select` controls + border: 1px solid @dropdown-default-border-color; + color: @dropdown-default-text-color; + background: @dropdown-default-bg-color; +} diff --git a/static/email-frame.less b/static/email-frame.less new file mode 100644 index 0000000000..f629314a37 --- /dev/null +++ b/static/email-frame.less @@ -0,0 +1,142 @@ +@import 'variables/ui-variables'; +@import 'ui-variables'; + +.ignore-in-parent-frame { + // ----- Font Families ----- + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 200; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-Thin.otf'); + } + + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 300; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-Blond.otf'); + } + + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 400; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-Normal.otf'); + } + + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 500; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-Medium.otf'); + } + + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 600; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-SemiBold.otf'); + } + + // Pro-SemiBold doesn't render emoji properly. Override the emjoi unicode + // block so that it uses the "Normal" weight even at font-weight:600. + @font-face { + font-family: 'Nylas-Pro'; + font-style: normal; + font-weight: 600; + src: url('nylas://nylas-private-fonts/fonts/Nylas-Pro-Normal.otf'), Helvetica, sans-serif; + unicode-range: U+1F300-1F5FF, U+1F600-1F64F, U+1F680-1F6FF, U+2600-26FF; + } + + html, body { + font-family: "Nylas-Pro", "Helvetica", "Lucidia Grande", sans-serif; + font-size: 14.5px; + line-height: 1.5; + color: @text-color; + background-color: transparent !important; + border: 0; + margin: 0; + padding: 0; + overflow-x: auto; + + -webkit-text-size-adjust: auto; + word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; + } + + strong, b, .bold { + font-weight: 600; + } + + body { + padding: 0; + margin: auto; + max-width: 840px; + overflow-y: hidden; + word-break: break-word; + -webkit-font-smoothing: antialiased; + } + + a { + color: @text-color-link; + } + + a:hover { + color: @text-color-link-hover; + } + + a:visited { + color: darken(@text-color-link, 10%); + } + a img { + border-bottom: 0; + } + + body.heightDetermined { + overflow-y: hidden; + } + + div,pre { + max-width: 100%; + } + + pre.nylas-plaintext { + // The default font for
 tags is the system monospace font. We want
+    // themes to be able to override with monospace, but not have that be the
+    // default for normal people.
+    font-family: "Nylas-Pro", "Helvetica", "Lucidia Grande", sans-serif;
+    white-space: pre-wrap;
+    word-wrap: break-word;
+  }
+
+  img {
+    border: 0;
+  }
+
+  search-match, .search-match {
+    background: @text-color-search-match;
+    border-radius: @border-radius-base;
+    box-shadow: 0 0.5px 0.5px rgba(0,0,0,0.25);
+    &.current-match {
+      background: @text-color-search-current-match;
+    }
+  }
+
+  .inline-download-prompt {
+    border: solid 1px rgba(0, 0, 0, 0.09);
+    border-radius: 2px;
+    color: @text-color;
+    background: @background-off-primary;
+    margin: 4px 0;
+    padding: 4px 8px;
+    cursor: pointer;
+    display: inline-block;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    overflow: hidden;
+  }
+  .inline-download-prompt:hover {
+    cursor: pointer;
+    color: @text-color;
+    border: solid 1px rgba(0, 0, 0, 0.16);
+  }
+}
diff --git a/static/font-awesome.min.css b/static/font-awesome.min.css
index 5b05c8ea31..127b9e18d3 100644
--- a/static/font-awesome.min.css
+++ b/static/font-awesome.min.css
@@ -1,4 +1,4 @@
 /*!
  *  Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome
  *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url('fonts/FontAwesome/fontawesome-webfont.ttf?v=4.3.0') format('truetype');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}
\ No newline at end of file
+ */@font-face{font-family:'FontAwesome';src:url('fonts/FontAwesome/fontawesome-webfont.ttf?v=4.3.0') format('truetype');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}
diff --git a/static/images/activity-list/activity-list-empty@2x.png b/static/images/activity-list/activity-list-empty@2x.png
new file mode 100644
index 0000000000..2486b5fb94
Binary files /dev/null and b/static/images/activity-list/activity-list-empty@2x.png differ
diff --git a/static/images/activity-list/icon-activity-linkopen@1x.png b/static/images/activity-list/icon-activity-linkopen@1x.png
new file mode 100644
index 0000000000..385caafdcd
Binary files /dev/null and b/static/images/activity-list/icon-activity-linkopen@1x.png differ
diff --git a/static/images/activity-list/icon-activity-linkopen@2x.png b/static/images/activity-list/icon-activity-linkopen@2x.png
new file mode 100644
index 0000000000..9a3d2cd49a
Binary files /dev/null and b/static/images/activity-list/icon-activity-linkopen@2x.png differ
diff --git a/static/images/activity-list/icon-activity-mailopen@1x.png b/static/images/activity-list/icon-activity-mailopen@1x.png
new file mode 100644
index 0000000000..1bd8ed256a
Binary files /dev/null and b/static/images/activity-list/icon-activity-mailopen@1x.png differ
diff --git a/static/images/activity-list/icon-activity-mailopen@2x.png b/static/images/activity-list/icon-activity-mailopen@2x.png
new file mode 100644
index 0000000000..a1f9d2df12
Binary files /dev/null and b/static/images/activity-list/icon-activity-mailopen@2x.png differ
diff --git a/static/images/activity-list/icon-activity-replied@1x.png b/static/images/activity-list/icon-activity-replied@1x.png
new file mode 100644
index 0000000000..5f743e4a16
Binary files /dev/null and b/static/images/activity-list/icon-activity-replied@1x.png differ
diff --git a/static/images/activity-list/icon-activity-replied@2x.png b/static/images/activity-list/icon-activity-replied@2x.png
new file mode 100644
index 0000000000..609d16e3fd
Binary files /dev/null and b/static/images/activity-list/icon-activity-replied@2x.png differ
diff --git a/static/images/activity-list/icon-toolbar-activity@2x.png b/static/images/activity-list/icon-toolbar-activity@2x.png
new file mode 100644
index 0000000000..4cb347ce75
Binary files /dev/null and b/static/images/activity-list/icon-toolbar-activity@2x.png differ
diff --git a/static/images/application-frame/close@1x.png b/static/images/application-frame/close@1x.png
new file mode 100644
index 0000000000..bd9d71d63c
Binary files /dev/null and b/static/images/application-frame/close@1x.png differ
diff --git a/static/images/application-frame/close@2x.png b/static/images/application-frame/close@2x.png
index 50de99a53f..99dd40b9b0 100644
Binary files a/static/images/application-frame/close@2x.png and b/static/images/application-frame/close@2x.png differ
diff --git a/static/images/application-frame/fullscreen@1x.png b/static/images/application-frame/fullscreen@1x.png
new file mode 100644
index 0000000000..eba4f754c6
Binary files /dev/null and b/static/images/application-frame/fullscreen@1x.png differ
diff --git a/static/images/application-frame/fullscreen@2x.png b/static/images/application-frame/fullscreen@2x.png
new file mode 100644
index 0000000000..ad0d84fce2
Binary files /dev/null and b/static/images/application-frame/fullscreen@2x.png differ
diff --git a/static/images/application-frame/maximize@1x.png b/static/images/application-frame/maximize@1x.png
new file mode 100644
index 0000000000..4afdc1523b
Binary files /dev/null and b/static/images/application-frame/maximize@1x.png differ
diff --git a/static/images/application-frame/maximize@2x.png b/static/images/application-frame/maximize@2x.png
index 51b52f7600..4d2c3edca1 100644
Binary files a/static/images/application-frame/maximize@2x.png and b/static/images/application-frame/maximize@2x.png differ
diff --git a/static/images/application-frame/minimize@1x.png b/static/images/application-frame/minimize@1x.png
new file mode 100644
index 0000000000..1be77728cb
Binary files /dev/null and b/static/images/application-frame/minimize@1x.png differ
diff --git a/static/images/application-frame/minimize@2x.png b/static/images/application-frame/minimize@2x.png
index bd1ea04b20..28172d4999 100644
Binary files a/static/images/application-frame/minimize@2x.png and b/static/images/application-frame/minimize@2x.png differ
diff --git a/static/images/application-frame/windows-menu-icon@1x.png b/static/images/application-frame/windows-menu-icon@1x.png
new file mode 100644
index 0000000000..7ba681c8e2
Binary files /dev/null and b/static/images/application-frame/windows-menu-icon@1x.png differ
diff --git a/static/images/application-frame/windows-menu-icon@2x.png b/static/images/application-frame/windows-menu-icon@2x.png
new file mode 100644
index 0000000000..e31e029300
Binary files /dev/null and b/static/images/application-frame/windows-menu-icon@2x.png differ
diff --git a/static/images/attachments/attachment-quicklook@1x.png b/static/images/attachments/attachment-quicklook@1x.png
new file mode 100644
index 0000000000..9e4964649c
Binary files /dev/null and b/static/images/attachments/attachment-quicklook@1x.png differ
diff --git a/static/images/attachments/attachment-quicklook@2x.png b/static/images/attachments/attachment-quicklook@2x.png
new file mode 100644
index 0000000000..db4d8a03ba
Binary files /dev/null and b/static/images/attachments/attachment-quicklook@2x.png differ
diff --git a/static/images/attachments/file-doc@2x.png b/static/images/attachments/file-doc@2x.png
new file mode 100644
index 0000000000..e3030d0fc7
Binary files /dev/null and b/static/images/attachments/file-doc@2x.png differ
diff --git a/static/images/attachments/file-docx@2x.png b/static/images/attachments/file-docx@2x.png
new file mode 100644
index 0000000000..e3030d0fc7
Binary files /dev/null and b/static/images/attachments/file-docx@2x.png differ
diff --git a/static/images/attachments/file-fallback@2x.png b/static/images/attachments/file-fallback@2x.png
new file mode 100644
index 0000000000..f99211ffbe
Binary files /dev/null and b/static/images/attachments/file-fallback@2x.png differ
diff --git a/static/images/attachments/file-ics@2x.png b/static/images/attachments/file-ics@2x.png
new file mode 100644
index 0000000000..d6c97ac98e
Binary files /dev/null and b/static/images/attachments/file-ics@2x.png differ
diff --git a/static/images/attachments/file-pdf@2x.png b/static/images/attachments/file-pdf@2x.png
new file mode 100644
index 0000000000..bbbcf27387
Binary files /dev/null and b/static/images/attachments/file-pdf@2x.png differ
diff --git a/static/images/attachments/file-ppt@2x.png b/static/images/attachments/file-ppt@2x.png
new file mode 100644
index 0000000000..dceab984ea
Binary files /dev/null and b/static/images/attachments/file-ppt@2x.png differ
diff --git a/static/images/attachments/file-pptx@2x.png b/static/images/attachments/file-pptx@2x.png
new file mode 100644
index 0000000000..dceab984ea
Binary files /dev/null and b/static/images/attachments/file-pptx@2x.png differ
diff --git a/static/images/attachments/file-xls@2x.png b/static/images/attachments/file-xls@2x.png
new file mode 100644
index 0000000000..a4fed95cef
Binary files /dev/null and b/static/images/attachments/file-xls@2x.png differ
diff --git a/static/images/attachments/file-xlsx@2x.png b/static/images/attachments/file-xlsx@2x.png
new file mode 100644
index 0000000000..a4fed95cef
Binary files /dev/null and b/static/images/attachments/file-xlsx@2x.png differ
diff --git a/static/images/attachments/file-zip@2x.png b/static/images/attachments/file-zip@2x.png
new file mode 100644
index 0000000000..c1f50aea3e
Binary files /dev/null and b/static/images/attachments/file-zip@2x.png differ
diff --git a/static/images/attachments/ic-attachments-all-clippy@1x.png b/static/images/attachments/ic-attachments-all-clippy@1x.png
new file mode 100644
index 0000000000..a4abd1ac36
Binary files /dev/null and b/static/images/attachments/ic-attachments-all-clippy@1x.png differ
diff --git a/static/images/attachments/ic-attachments-all-clippy@2x.png b/static/images/attachments/ic-attachments-all-clippy@2x.png
new file mode 100644
index 0000000000..8ccfb8de0a
Binary files /dev/null and b/static/images/attachments/ic-attachments-all-clippy@2x.png differ
diff --git a/static/images/attachments/ic-attachments-download-all@1x.png b/static/images/attachments/ic-attachments-download-all@1x.png
new file mode 100644
index 0000000000..66fcdb886f
Binary files /dev/null and b/static/images/attachments/ic-attachments-download-all@1x.png differ
diff --git a/static/images/attachments/ic-attachments-download-all@2x.png b/static/images/attachments/ic-attachments-download-all@2x.png
new file mode 100644
index 0000000000..d3a802f918
Binary files /dev/null and b/static/images/attachments/ic-attachments-download-all@2x.png differ
diff --git a/static/images/attachments/icon-attachment-download@1x.png b/static/images/attachments/icon-attachment-download@1x.png
new file mode 100644
index 0000000000..5859af528d
Binary files /dev/null and b/static/images/attachments/icon-attachment-download@1x.png differ
diff --git a/static/images/attachments/icon-attachment-download@2x.png b/static/images/attachments/icon-attachment-download@2x.png
new file mode 100644
index 0000000000..532d712ab2
Binary files /dev/null and b/static/images/attachments/icon-attachment-download@2x.png differ
diff --git a/static/images/attachments/image-cancel-button@2x.png b/static/images/attachments/image-cancel-button@2x.png
new file mode 100644
index 0000000000..0e4b66729a
Binary files /dev/null and b/static/images/attachments/image-cancel-button@2x.png differ
diff --git a/static/images/attachments/image-download-button@2x.png b/static/images/attachments/image-download-button@2x.png
new file mode 100644
index 0000000000..6c9f5b0326
Binary files /dev/null and b/static/images/attachments/image-download-button@2x.png differ
diff --git a/static/images/attachments/remove-attachment@1x.png b/static/images/attachments/remove-attachment@1x.png
new file mode 100644
index 0000000000..c4b3ba9147
Binary files /dev/null and b/static/images/attachments/remove-attachment@1x.png differ
diff --git a/static/images/attachments/remove-attachment@2x.png b/static/images/attachments/remove-attachment@2x.png
new file mode 100644
index 0000000000..4e657b93b6
Binary files /dev/null and b/static/images/attachments/remove-attachment@2x.png differ
diff --git a/static/images/attachments/transparency-background.png b/static/images/attachments/transparency-background.png
new file mode 100644
index 0000000000..806344a63d
Binary files /dev/null and b/static/images/attachments/transparency-background.png differ
diff --git a/static/images/calendar/ic-calendar-left-arrow@2x.png b/static/images/calendar/ic-calendar-left-arrow@2x.png
new file mode 100644
index 0000000000..a91192fa27
Binary files /dev/null and b/static/images/calendar/ic-calendar-left-arrow@2x.png differ
diff --git a/static/images/calendar/ic-calendar-month@2x.png b/static/images/calendar/ic-calendar-month@2x.png
new file mode 100644
index 0000000000..c142ea00c5
Binary files /dev/null and b/static/images/calendar/ic-calendar-month@2x.png differ
diff --git a/static/images/calendar/ic-calendar-right-arrow@2x.png b/static/images/calendar/ic-calendar-right-arrow@2x.png
new file mode 100644
index 0000000000..e7cee2f264
Binary files /dev/null and b/static/images/calendar/ic-calendar-right-arrow@2x.png differ
diff --git a/static/images/composer-emoji/apple/0023-20e3.png b/static/images/composer-emoji/apple/0023-20e3.png
new file mode 100644
index 0000000000..6132eb9a6e
Binary files /dev/null and b/static/images/composer-emoji/apple/0023-20e3.png differ
diff --git a/static/images/composer-emoji/apple/002a-20e3.png b/static/images/composer-emoji/apple/002a-20e3.png
new file mode 100644
index 0000000000..c66f6fb86c
Binary files /dev/null and b/static/images/composer-emoji/apple/002a-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0030-20e3.png b/static/images/composer-emoji/apple/0030-20e3.png
new file mode 100644
index 0000000000..c0423c7ebe
Binary files /dev/null and b/static/images/composer-emoji/apple/0030-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0031-20e3.png b/static/images/composer-emoji/apple/0031-20e3.png
new file mode 100644
index 0000000000..2c325f7e62
Binary files /dev/null and b/static/images/composer-emoji/apple/0031-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0032-20e3.png b/static/images/composer-emoji/apple/0032-20e3.png
new file mode 100644
index 0000000000..9c08c021fa
Binary files /dev/null and b/static/images/composer-emoji/apple/0032-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0033-20e3.png b/static/images/composer-emoji/apple/0033-20e3.png
new file mode 100644
index 0000000000..6ae19a70c9
Binary files /dev/null and b/static/images/composer-emoji/apple/0033-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0034-20e3.png b/static/images/composer-emoji/apple/0034-20e3.png
new file mode 100644
index 0000000000..b46451a7a8
Binary files /dev/null and b/static/images/composer-emoji/apple/0034-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0035-20e3.png b/static/images/composer-emoji/apple/0035-20e3.png
new file mode 100644
index 0000000000..a48facb9e3
Binary files /dev/null and b/static/images/composer-emoji/apple/0035-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0036-20e3.png b/static/images/composer-emoji/apple/0036-20e3.png
new file mode 100644
index 0000000000..a01c8527e9
Binary files /dev/null and b/static/images/composer-emoji/apple/0036-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0037-20e3.png b/static/images/composer-emoji/apple/0037-20e3.png
new file mode 100644
index 0000000000..f2f526894b
Binary files /dev/null and b/static/images/composer-emoji/apple/0037-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0038-20e3.png b/static/images/composer-emoji/apple/0038-20e3.png
new file mode 100644
index 0000000000..a5c829b13f
Binary files /dev/null and b/static/images/composer-emoji/apple/0038-20e3.png differ
diff --git a/static/images/composer-emoji/apple/0039-20e3.png b/static/images/composer-emoji/apple/0039-20e3.png
new file mode 100644
index 0000000000..14046bf175
Binary files /dev/null and b/static/images/composer-emoji/apple/0039-20e3.png differ
diff --git a/static/images/composer-emoji/apple/00a9.png b/static/images/composer-emoji/apple/00a9.png
new file mode 100644
index 0000000000..1a44ff3b8b
Binary files /dev/null and b/static/images/composer-emoji/apple/00a9.png differ
diff --git a/static/images/composer-emoji/apple/00ae.png b/static/images/composer-emoji/apple/00ae.png
new file mode 100644
index 0000000000..04ffc944e8
Binary files /dev/null and b/static/images/composer-emoji/apple/00ae.png differ
diff --git a/static/images/composer-emoji/apple/1f004.png b/static/images/composer-emoji/apple/1f004.png
new file mode 100644
index 0000000000..8cbb1ad603
Binary files /dev/null and b/static/images/composer-emoji/apple/1f004.png differ
diff --git a/static/images/composer-emoji/apple/1f0cf.png b/static/images/composer-emoji/apple/1f0cf.png
new file mode 100644
index 0000000000..d8ed46906b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f0cf.png differ
diff --git a/static/images/composer-emoji/apple/1f170.png b/static/images/composer-emoji/apple/1f170.png
new file mode 100644
index 0000000000..84caf66ebe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f170.png differ
diff --git a/static/images/composer-emoji/apple/1f171.png b/static/images/composer-emoji/apple/1f171.png
new file mode 100644
index 0000000000..ffa1fd85a0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f171.png differ
diff --git a/static/images/composer-emoji/apple/1f17e.png b/static/images/composer-emoji/apple/1f17e.png
new file mode 100644
index 0000000000..def0c98f67
Binary files /dev/null and b/static/images/composer-emoji/apple/1f17e.png differ
diff --git a/static/images/composer-emoji/apple/1f17f.png b/static/images/composer-emoji/apple/1f17f.png
new file mode 100644
index 0000000000..470e065d19
Binary files /dev/null and b/static/images/composer-emoji/apple/1f17f.png differ
diff --git a/static/images/composer-emoji/apple/1f18e.png b/static/images/composer-emoji/apple/1f18e.png
new file mode 100644
index 0000000000..777d2812e3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f18e.png differ
diff --git a/static/images/composer-emoji/apple/1f191.png b/static/images/composer-emoji/apple/1f191.png
new file mode 100644
index 0000000000..c265fad749
Binary files /dev/null and b/static/images/composer-emoji/apple/1f191.png differ
diff --git a/static/images/composer-emoji/apple/1f192.png b/static/images/composer-emoji/apple/1f192.png
new file mode 100644
index 0000000000..aa6518101e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f192.png differ
diff --git a/static/images/composer-emoji/apple/1f193.png b/static/images/composer-emoji/apple/1f193.png
new file mode 100644
index 0000000000..ed99d05cc3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f193.png differ
diff --git a/static/images/composer-emoji/apple/1f194.png b/static/images/composer-emoji/apple/1f194.png
new file mode 100644
index 0000000000..326b765320
Binary files /dev/null and b/static/images/composer-emoji/apple/1f194.png differ
diff --git a/static/images/composer-emoji/apple/1f195.png b/static/images/composer-emoji/apple/1f195.png
new file mode 100644
index 0000000000..3a0383eee7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f195.png differ
diff --git a/static/images/composer-emoji/apple/1f196.png b/static/images/composer-emoji/apple/1f196.png
new file mode 100644
index 0000000000..99ab7b008f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f196.png differ
diff --git a/static/images/composer-emoji/apple/1f197.png b/static/images/composer-emoji/apple/1f197.png
new file mode 100644
index 0000000000..278c2b261b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f197.png differ
diff --git a/static/images/composer-emoji/apple/1f198.png b/static/images/composer-emoji/apple/1f198.png
new file mode 100644
index 0000000000..181fd9f37a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f198.png differ
diff --git a/static/images/composer-emoji/apple/1f199.png b/static/images/composer-emoji/apple/1f199.png
new file mode 100644
index 0000000000..3b84ad12a5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f199.png differ
diff --git a/static/images/composer-emoji/apple/1f19a.png b/static/images/composer-emoji/apple/1f19a.png
new file mode 100644
index 0000000000..20d36710d5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f19a.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1e8.png b/static/images/composer-emoji/apple/1f1e6-1f1e8.png
new file mode 100644
index 0000000000..1e31bca422
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1e9.png b/static/images/composer-emoji/apple/1f1e6-1f1e9.png
new file mode 100644
index 0000000000..094ffc474c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1ea.png b/static/images/composer-emoji/apple/1f1e6-1f1ea.png
new file mode 100644
index 0000000000..feb296306d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1eb.png b/static/images/composer-emoji/apple/1f1e6-1f1eb.png
new file mode 100644
index 0000000000..06b92ed8ea
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1ec.png b/static/images/composer-emoji/apple/1f1e6-1f1ec.png
new file mode 100644
index 0000000000..56e072b87c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1ee.png b/static/images/composer-emoji/apple/1f1e6-1f1ee.png
new file mode 100644
index 0000000000..b380dec8fa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f1.png b/static/images/composer-emoji/apple/1f1e6-1f1f1.png
new file mode 100644
index 0000000000..710406cb11
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f2.png b/static/images/composer-emoji/apple/1f1e6-1f1f2.png
new file mode 100644
index 0000000000..b92d912468
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f4.png b/static/images/composer-emoji/apple/1f1e6-1f1f4.png
new file mode 100644
index 0000000000..090d9439cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f6.png b/static/images/composer-emoji/apple/1f1e6-1f1f6.png
new file mode 100644
index 0000000000..062b4cb1c4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f6.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f7.png b/static/images/composer-emoji/apple/1f1e6-1f1f7.png
new file mode 100644
index 0000000000..cc0fc407a8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f8.png b/static/images/composer-emoji/apple/1f1e6-1f1f8.png
new file mode 100644
index 0000000000..ec2009f056
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1f9.png b/static/images/composer-emoji/apple/1f1e6-1f1f9.png
new file mode 100644
index 0000000000..5a608e1d93
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1fa.png b/static/images/composer-emoji/apple/1f1e6-1f1fa.png
new file mode 100644
index 0000000000..bbc141d449
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1fc.png b/static/images/composer-emoji/apple/1f1e6-1f1fc.png
new file mode 100644
index 0000000000..c2057f1f50
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1fd.png b/static/images/composer-emoji/apple/1f1e6-1f1fd.png
new file mode 100644
index 0000000000..94ef137f10
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1fd.png differ
diff --git a/static/images/composer-emoji/apple/1f1e6-1f1ff.png b/static/images/composer-emoji/apple/1f1e6-1f1ff.png
new file mode 100644
index 0000000000..cb4daaecd8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e6-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1e6.png b/static/images/composer-emoji/apple/1f1e7-1f1e6.png
new file mode 100644
index 0000000000..c3c4071c0f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1e7.png b/static/images/composer-emoji/apple/1f1e7-1f1e7.png
new file mode 100644
index 0000000000..a97ab48681
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1e7.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1e9.png b/static/images/composer-emoji/apple/1f1e7-1f1e9.png
new file mode 100644
index 0000000000..2fe0f55342
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ea.png b/static/images/composer-emoji/apple/1f1e7-1f1ea.png
new file mode 100644
index 0000000000..d7fb40f5fc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1eb.png b/static/images/composer-emoji/apple/1f1e7-1f1eb.png
new file mode 100644
index 0000000000..f4b76909b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ec.png b/static/images/composer-emoji/apple/1f1e7-1f1ec.png
new file mode 100644
index 0000000000..1f976b3488
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ed.png b/static/images/composer-emoji/apple/1f1e7-1f1ed.png
new file mode 100644
index 0000000000..8b6c3977fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ee.png b/static/images/composer-emoji/apple/1f1e7-1f1ee.png
new file mode 100644
index 0000000000..374723c087
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ef.png b/static/images/composer-emoji/apple/1f1e7-1f1ef.png
new file mode 100644
index 0000000000..93aa94f924
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ef.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f1.png b/static/images/composer-emoji/apple/1f1e7-1f1f1.png
new file mode 100644
index 0000000000..8fd48a5060
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f2.png b/static/images/composer-emoji/apple/1f1e7-1f1f2.png
new file mode 100644
index 0000000000..a30dfb4686
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f3.png b/static/images/composer-emoji/apple/1f1e7-1f1f3.png
new file mode 100644
index 0000000000..d2f21dc005
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f4.png b/static/images/composer-emoji/apple/1f1e7-1f1f4.png
new file mode 100644
index 0000000000..736b376a14
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f6.png b/static/images/composer-emoji/apple/1f1e7-1f1f6.png
new file mode 100644
index 0000000000..28e483b3be
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f6.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f7.png b/static/images/composer-emoji/apple/1f1e7-1f1f7.png
new file mode 100644
index 0000000000..825bc0aeeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f8.png b/static/images/composer-emoji/apple/1f1e7-1f1f8.png
new file mode 100644
index 0000000000..cac941a2bd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1f9.png b/static/images/composer-emoji/apple/1f1e7-1f1f9.png
new file mode 100644
index 0000000000..d086e4a77e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1fb.png b/static/images/composer-emoji/apple/1f1e7-1f1fb.png
new file mode 100644
index 0000000000..d9c274109b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1fc.png b/static/images/composer-emoji/apple/1f1e7-1f1fc.png
new file mode 100644
index 0000000000..3f311d91cf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1fe.png b/static/images/composer-emoji/apple/1f1e7-1f1fe.png
new file mode 100644
index 0000000000..3e0026ce73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1e7-1f1ff.png b/static/images/composer-emoji/apple/1f1e7-1f1ff.png
new file mode 100644
index 0000000000..f6af6b4dfe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e7-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1e6.png b/static/images/composer-emoji/apple/1f1e8-1f1e6.png
new file mode 100644
index 0000000000..289935a4d6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1e8.png b/static/images/composer-emoji/apple/1f1e8-1f1e8.png
new file mode 100644
index 0000000000..f85978777e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1e9.png b/static/images/composer-emoji/apple/1f1e8-1f1e9.png
new file mode 100644
index 0000000000..01737fd975
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1eb.png b/static/images/composer-emoji/apple/1f1e8-1f1eb.png
new file mode 100644
index 0000000000..dc2b306d93
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1ec.png b/static/images/composer-emoji/apple/1f1e8-1f1ec.png
new file mode 100644
index 0000000000..ee0a9ea59d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1ed.png b/static/images/composer-emoji/apple/1f1e8-1f1ed.png
new file mode 100644
index 0000000000..cee04f42f5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1ee.png b/static/images/composer-emoji/apple/1f1e8-1f1ee.png
new file mode 100644
index 0000000000..31ffe16462
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f0.png b/static/images/composer-emoji/apple/1f1e8-1f1f0.png
new file mode 100644
index 0000000000..66e6a1920e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f1.png b/static/images/composer-emoji/apple/1f1e8-1f1f1.png
new file mode 100644
index 0000000000..71a88bb5c5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f2.png b/static/images/composer-emoji/apple/1f1e8-1f1f2.png
new file mode 100644
index 0000000000..4e6f7315be
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f3.png b/static/images/composer-emoji/apple/1f1e8-1f1f3.png
new file mode 100644
index 0000000000..18292849ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f4.png b/static/images/composer-emoji/apple/1f1e8-1f1f4.png
new file mode 100644
index 0000000000..7f827fbe42
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f5.png b/static/images/composer-emoji/apple/1f1e8-1f1f5.png
new file mode 100644
index 0000000000..b15683cbbc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1f7.png b/static/images/composer-emoji/apple/1f1e8-1f1f7.png
new file mode 100644
index 0000000000..e1a7f1a0d2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1fa.png b/static/images/composer-emoji/apple/1f1e8-1f1fa.png
new file mode 100644
index 0000000000..4bcb6552b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1fb.png b/static/images/composer-emoji/apple/1f1e8-1f1fb.png
new file mode 100644
index 0000000000..41ee79e33b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1fc.png b/static/images/composer-emoji/apple/1f1e8-1f1fc.png
new file mode 100644
index 0000000000..92270d7390
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1fd.png b/static/images/composer-emoji/apple/1f1e8-1f1fd.png
new file mode 100644
index 0000000000..a650457034
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1fd.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1fe.png b/static/images/composer-emoji/apple/1f1e8-1f1fe.png
new file mode 100644
index 0000000000..5b545c5a0a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1e8-1f1ff.png b/static/images/composer-emoji/apple/1f1e8-1f1ff.png
new file mode 100644
index 0000000000..77d2314f68
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e8-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1ea.png b/static/images/composer-emoji/apple/1f1e9-1f1ea.png
new file mode 100644
index 0000000000..85e33c57ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1ec.png b/static/images/composer-emoji/apple/1f1e9-1f1ec.png
new file mode 100644
index 0000000000..6fc79d920b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1ef.png b/static/images/composer-emoji/apple/1f1e9-1f1ef.png
new file mode 100644
index 0000000000..614dd34d92
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1ef.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1f0.png b/static/images/composer-emoji/apple/1f1e9-1f1f0.png
new file mode 100644
index 0000000000..6a55c080da
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1f2.png b/static/images/composer-emoji/apple/1f1e9-1f1f2.png
new file mode 100644
index 0000000000..a009291713
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1f4.png b/static/images/composer-emoji/apple/1f1e9-1f1f4.png
new file mode 100644
index 0000000000..c21849144d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1e9-1f1ff.png b/static/images/composer-emoji/apple/1f1e9-1f1ff.png
new file mode 100644
index 0000000000..524eab74f0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1e9-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1e6.png b/static/images/composer-emoji/apple/1f1ea-1f1e6.png
new file mode 100644
index 0000000000..9adbc4faeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1e8.png b/static/images/composer-emoji/apple/1f1ea-1f1e8.png
new file mode 100644
index 0000000000..e95ddd14be
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1ea.png b/static/images/composer-emoji/apple/1f1ea-1f1ea.png
new file mode 100644
index 0000000000..e658602a72
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1ec.png b/static/images/composer-emoji/apple/1f1ea-1f1ec.png
new file mode 100644
index 0000000000..0ef49b2854
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1ed.png b/static/images/composer-emoji/apple/1f1ea-1f1ed.png
new file mode 100644
index 0000000000..8a48f2fd32
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1f7.png b/static/images/composer-emoji/apple/1f1ea-1f1f7.png
new file mode 100644
index 0000000000..64ba8b2f23
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1f8.png b/static/images/composer-emoji/apple/1f1ea-1f1f8.png
new file mode 100644
index 0000000000..9adbc4faeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1f9.png b/static/images/composer-emoji/apple/1f1ea-1f1f9.png
new file mode 100644
index 0000000000..4b91d492a9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ea-1f1fa.png b/static/images/composer-emoji/apple/1f1ea-1f1fa.png
new file mode 100644
index 0000000000..94dc89cc77
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ea-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1ee.png b/static/images/composer-emoji/apple/1f1eb-1f1ee.png
new file mode 100644
index 0000000000..e5fedc2ff1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1ef.png b/static/images/composer-emoji/apple/1f1eb-1f1ef.png
new file mode 100644
index 0000000000..babc295c8c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1ef.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1f0.png b/static/images/composer-emoji/apple/1f1eb-1f1f0.png
new file mode 100644
index 0000000000..4a4c26c562
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1f2.png b/static/images/composer-emoji/apple/1f1eb-1f1f2.png
new file mode 100644
index 0000000000..d41ce4a549
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1f4.png b/static/images/composer-emoji/apple/1f1eb-1f1f4.png
new file mode 100644
index 0000000000..37bdce7c61
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1eb-1f1f7.png b/static/images/composer-emoji/apple/1f1eb-1f1f7.png
new file mode 100644
index 0000000000..b15683cbbc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1eb-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1e6.png b/static/images/composer-emoji/apple/1f1ec-1f1e6.png
new file mode 100644
index 0000000000..e3ac728b49
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1e7.png b/static/images/composer-emoji/apple/1f1ec-1f1e7.png
new file mode 100644
index 0000000000..11bc913641
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1e7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1e9.png b/static/images/composer-emoji/apple/1f1ec-1f1e9.png
new file mode 100644
index 0000000000..ca4725de85
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1ea.png b/static/images/composer-emoji/apple/1f1ec-1f1ea.png
new file mode 100644
index 0000000000..01680ad9d5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1eb.png b/static/images/composer-emoji/apple/1f1ec-1f1eb.png
new file mode 100644
index 0000000000..e42ab76f3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1ec.png b/static/images/composer-emoji/apple/1f1ec-1f1ec.png
new file mode 100644
index 0000000000..ef89121645
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1ed.png b/static/images/composer-emoji/apple/1f1ec-1f1ed.png
new file mode 100644
index 0000000000..2a2d9f7e56
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1ee.png b/static/images/composer-emoji/apple/1f1ec-1f1ee.png
new file mode 100644
index 0000000000..e528567cd0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f1.png b/static/images/composer-emoji/apple/1f1ec-1f1f1.png
new file mode 100644
index 0000000000..fb1dff2190
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f2.png b/static/images/composer-emoji/apple/1f1ec-1f1f2.png
new file mode 100644
index 0000000000..8db2f37052
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f3.png b/static/images/composer-emoji/apple/1f1ec-1f1f3.png
new file mode 100644
index 0000000000..2971d1148e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f5.png b/static/images/composer-emoji/apple/1f1ec-1f1f5.png
new file mode 100644
index 0000000000..8268d85ca2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f6.png b/static/images/composer-emoji/apple/1f1ec-1f1f6.png
new file mode 100644
index 0000000000..2f9ca20e6b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f6.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f7.png b/static/images/composer-emoji/apple/1f1ec-1f1f7.png
new file mode 100644
index 0000000000..4ebbe2fc2a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f8.png b/static/images/composer-emoji/apple/1f1ec-1f1f8.png
new file mode 100644
index 0000000000..84ea839728
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1f9.png b/static/images/composer-emoji/apple/1f1ec-1f1f9.png
new file mode 100644
index 0000000000..72ac56adde
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1fa.png b/static/images/composer-emoji/apple/1f1ec-1f1fa.png
new file mode 100644
index 0000000000..4365341691
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1fc.png b/static/images/composer-emoji/apple/1f1ec-1f1fc.png
new file mode 100644
index 0000000000..a828a3bdf9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1ec-1f1fe.png b/static/images/composer-emoji/apple/1f1ec-1f1fe.png
new file mode 100644
index 0000000000..27cddef44c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ec-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1f0.png b/static/images/composer-emoji/apple/1f1ed-1f1f0.png
new file mode 100644
index 0000000000..8749f744da
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1f2.png b/static/images/composer-emoji/apple/1f1ed-1f1f2.png
new file mode 100644
index 0000000000..bbc141d449
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1f3.png b/static/images/composer-emoji/apple/1f1ed-1f1f3.png
new file mode 100644
index 0000000000..cbc3a69666
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1f7.png b/static/images/composer-emoji/apple/1f1ed-1f1f7.png
new file mode 100644
index 0000000000..b390e32631
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1f9.png b/static/images/composer-emoji/apple/1f1ed-1f1f9.png
new file mode 100644
index 0000000000..0b922d890c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ed-1f1fa.png b/static/images/composer-emoji/apple/1f1ed-1f1fa.png
new file mode 100644
index 0000000000..ec3ec73f42
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ed-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1e8.png b/static/images/composer-emoji/apple/1f1ee-1f1e8.png
new file mode 100644
index 0000000000..4137992ef7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1e9.png b/static/images/composer-emoji/apple/1f1ee-1f1e9.png
new file mode 100644
index 0000000000..01815ec458
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1ea.png b/static/images/composer-emoji/apple/1f1ee-1f1ea.png
new file mode 100644
index 0000000000..c18e75b89c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f1.png b/static/images/composer-emoji/apple/1f1ee-1f1f1.png
new file mode 100644
index 0000000000..3a36d0ba73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f2.png b/static/images/composer-emoji/apple/1f1ee-1f1f2.png
new file mode 100644
index 0000000000..c08419e239
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f3.png b/static/images/composer-emoji/apple/1f1ee-1f1f3.png
new file mode 100644
index 0000000000..94903383e2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f4.png b/static/images/composer-emoji/apple/1f1ee-1f1f4.png
new file mode 100644
index 0000000000..6fc79d920b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f6.png b/static/images/composer-emoji/apple/1f1ee-1f1f6.png
new file mode 100644
index 0000000000..53bd1a5f0f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f6.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f7.png b/static/images/composer-emoji/apple/1f1ee-1f1f7.png
new file mode 100644
index 0000000000..4c5d12cf19
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f8.png b/static/images/composer-emoji/apple/1f1ee-1f1f8.png
new file mode 100644
index 0000000000..69cae7082d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1ee-1f1f9.png b/static/images/composer-emoji/apple/1f1ee-1f1f9.png
new file mode 100644
index 0000000000..2ada571037
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ee-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ef-1f1ea.png b/static/images/composer-emoji/apple/1f1ef-1f1ea.png
new file mode 100644
index 0000000000..bc34763beb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ef-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1ef-1f1f2.png b/static/images/composer-emoji/apple/1f1ef-1f1f2.png
new file mode 100644
index 0000000000..43e51ef476
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ef-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1ef-1f1f4.png b/static/images/composer-emoji/apple/1f1ef-1f1f4.png
new file mode 100644
index 0000000000..73f4010d24
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ef-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1ef-1f1f5.png b/static/images/composer-emoji/apple/1f1ef-1f1f5.png
new file mode 100644
index 0000000000..59133ab971
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ef-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1ea.png b/static/images/composer-emoji/apple/1f1f0-1f1ea.png
new file mode 100644
index 0000000000..0f6d9b6ecd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1ec.png b/static/images/composer-emoji/apple/1f1f0-1f1ec.png
new file mode 100644
index 0000000000..d8497d919a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1ed.png b/static/images/composer-emoji/apple/1f1f0-1f1ed.png
new file mode 100644
index 0000000000..3cc552a858
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1ee.png b/static/images/composer-emoji/apple/1f1f0-1f1ee.png
new file mode 100644
index 0000000000..3bc03c8ebb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1f2.png b/static/images/composer-emoji/apple/1f1f0-1f1f2.png
new file mode 100644
index 0000000000..a332de4e0a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1f3.png b/static/images/composer-emoji/apple/1f1f0-1f1f3.png
new file mode 100644
index 0000000000..1c99094871
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1f5.png b/static/images/composer-emoji/apple/1f1f0-1f1f5.png
new file mode 100644
index 0000000000..194ecd9fb3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1f7.png b/static/images/composer-emoji/apple/1f1f0-1f1f7.png
new file mode 100644
index 0000000000..70cd21f584
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1fc.png b/static/images/composer-emoji/apple/1f1f0-1f1fc.png
new file mode 100644
index 0000000000..67a8144da2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1fe.png b/static/images/composer-emoji/apple/1f1f0-1f1fe.png
new file mode 100644
index 0000000000..d7fd152d8a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1f0-1f1ff.png b/static/images/composer-emoji/apple/1f1f0-1f1ff.png
new file mode 100644
index 0000000000..52970194bf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f0-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1e6.png b/static/images/composer-emoji/apple/1f1f1-1f1e6.png
new file mode 100644
index 0000000000..8126748478
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1e7.png b/static/images/composer-emoji/apple/1f1f1-1f1e7.png
new file mode 100644
index 0000000000..ee9c161ca5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1e7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1e8.png b/static/images/composer-emoji/apple/1f1f1-1f1e8.png
new file mode 100644
index 0000000000..bf7393e006
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1ee.png b/static/images/composer-emoji/apple/1f1f1-1f1ee.png
new file mode 100644
index 0000000000..777ac9c023
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1f0.png b/static/images/composer-emoji/apple/1f1f1-1f1f0.png
new file mode 100644
index 0000000000..fa25dbd65b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1f7.png b/static/images/composer-emoji/apple/1f1f1-1f1f7.png
new file mode 100644
index 0000000000..2d373300ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1f8.png b/static/images/composer-emoji/apple/1f1f1-1f1f8.png
new file mode 100644
index 0000000000..3009f09756
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1f9.png b/static/images/composer-emoji/apple/1f1f1-1f1f9.png
new file mode 100644
index 0000000000..d69a9fd8bb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1fa.png b/static/images/composer-emoji/apple/1f1f1-1f1fa.png
new file mode 100644
index 0000000000..4eeabf1f92
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1fb.png b/static/images/composer-emoji/apple/1f1f1-1f1fb.png
new file mode 100644
index 0000000000..7d0d15441c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f1-1f1fe.png b/static/images/composer-emoji/apple/1f1f1-1f1fe.png
new file mode 100644
index 0000000000..d3c3a263dd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f1-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1e6.png b/static/images/composer-emoji/apple/1f1f2-1f1e6.png
new file mode 100644
index 0000000000..81198c231d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1e8.png b/static/images/composer-emoji/apple/1f1f2-1f1e8.png
new file mode 100644
index 0000000000..c2c00804ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1e9.png b/static/images/composer-emoji/apple/1f1f2-1f1e9.png
new file mode 100644
index 0000000000..1197fd6747
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1ea.png b/static/images/composer-emoji/apple/1f1f2-1f1ea.png
new file mode 100644
index 0000000000..505c64c5b2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1eb.png b/static/images/composer-emoji/apple/1f1f2-1f1eb.png
new file mode 100644
index 0000000000..b15683cbbc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1ec.png b/static/images/composer-emoji/apple/1f1f2-1f1ec.png
new file mode 100644
index 0000000000..7976ce9dec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1ed.png b/static/images/composer-emoji/apple/1f1f2-1f1ed.png
new file mode 100644
index 0000000000..44d545f4f4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f0.png b/static/images/composer-emoji/apple/1f1f2-1f1f0.png
new file mode 100644
index 0000000000..9e5c57012a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f1.png b/static/images/composer-emoji/apple/1f1f2-1f1f1.png
new file mode 100644
index 0000000000..8d9dd4d815
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f2.png b/static/images/composer-emoji/apple/1f1f2-1f1f2.png
new file mode 100644
index 0000000000..3dc5dd29df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f3.png b/static/images/composer-emoji/apple/1f1f2-1f1f3.png
new file mode 100644
index 0000000000..c297a49379
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f4.png b/static/images/composer-emoji/apple/1f1f2-1f1f4.png
new file mode 100644
index 0000000000..8749b90197
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f5.png b/static/images/composer-emoji/apple/1f1f2-1f1f5.png
new file mode 100644
index 0000000000..3426ed3f5d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f6.png b/static/images/composer-emoji/apple/1f1f2-1f1f6.png
new file mode 100644
index 0000000000..700e1e3e47
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f7.png b/static/images/composer-emoji/apple/1f1f2-1f1f7.png
new file mode 100644
index 0000000000..46961e4cfb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f8.png b/static/images/composer-emoji/apple/1f1f2-1f1f8.png
new file mode 100644
index 0000000000..77b55ea085
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1f9.png b/static/images/composer-emoji/apple/1f1f2-1f1f9.png
new file mode 100644
index 0000000000..178a1d53cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1fa.png b/static/images/composer-emoji/apple/1f1f2-1f1fa.png
new file mode 100644
index 0000000000..52d42b1e63
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1fb.png b/static/images/composer-emoji/apple/1f1f2-1f1fb.png
new file mode 100644
index 0000000000..02da51a5b2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1fc.png b/static/images/composer-emoji/apple/1f1f2-1f1fc.png
new file mode 100644
index 0000000000..89a5a325c4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1fd.png b/static/images/composer-emoji/apple/1f1f2-1f1fd.png
new file mode 100644
index 0000000000..6a87a49f0f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1fd.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1fe.png b/static/images/composer-emoji/apple/1f1f2-1f1fe.png
new file mode 100644
index 0000000000..18b427c9d6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1f2-1f1ff.png b/static/images/composer-emoji/apple/1f1f2-1f1ff.png
new file mode 100644
index 0000000000..c815b25f27
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f2-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1e6.png b/static/images/composer-emoji/apple/1f1f3-1f1e6.png
new file mode 100644
index 0000000000..e6b5c71734
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1e8.png b/static/images/composer-emoji/apple/1f1f3-1f1e8.png
new file mode 100644
index 0000000000..109a565ae2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1ea.png b/static/images/composer-emoji/apple/1f1f3-1f1ea.png
new file mode 100644
index 0000000000..fc4563bc7e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1eb.png b/static/images/composer-emoji/apple/1f1f3-1f1eb.png
new file mode 100644
index 0000000000..c065727d28
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1ec.png b/static/images/composer-emoji/apple/1f1f3-1f1ec.png
new file mode 100644
index 0000000000..2627c7621d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1ee.png b/static/images/composer-emoji/apple/1f1f3-1f1ee.png
new file mode 100644
index 0000000000..b3cc09f34c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1f1.png b/static/images/composer-emoji/apple/1f1f3-1f1f1.png
new file mode 100644
index 0000000000..5bd8ffd5b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1f4.png b/static/images/composer-emoji/apple/1f1f3-1f1f4.png
new file mode 100644
index 0000000000..d9c274109b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1f5.png b/static/images/composer-emoji/apple/1f1f3-1f1f5.png
new file mode 100644
index 0000000000..b987004080
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1f5.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1f7.png b/static/images/composer-emoji/apple/1f1f3-1f1f7.png
new file mode 100644
index 0000000000..e7850eae56
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1fa.png b/static/images/composer-emoji/apple/1f1f3-1f1fa.png
new file mode 100644
index 0000000000..14e9014d47
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1f3-1f1ff.png b/static/images/composer-emoji/apple/1f1f3-1f1ff.png
new file mode 100644
index 0000000000..68ad191f3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f3-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1f4-1f1f2.png b/static/images/composer-emoji/apple/1f1f4-1f1f2.png
new file mode 100644
index 0000000000..19e130fc5e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f4-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1e6.png b/static/images/composer-emoji/apple/1f1f5-1f1e6.png
new file mode 100644
index 0000000000..da240cd430
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1ea.png b/static/images/composer-emoji/apple/1f1f5-1f1ea.png
new file mode 100644
index 0000000000..f9d69f7e9a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1eb.png b/static/images/composer-emoji/apple/1f1f5-1f1eb.png
new file mode 100644
index 0000000000..a6cf4b0b24
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1ec.png b/static/images/composer-emoji/apple/1f1f5-1f1ec.png
new file mode 100644
index 0000000000..67524e5a45
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1ed.png b/static/images/composer-emoji/apple/1f1f5-1f1ed.png
new file mode 100644
index 0000000000..9a1baee0a4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f0.png b/static/images/composer-emoji/apple/1f1f5-1f1f0.png
new file mode 100644
index 0000000000..b0fc2da06d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f1.png b/static/images/composer-emoji/apple/1f1f5-1f1f1.png
new file mode 100644
index 0000000000..aaa8a65504
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f2.png b/static/images/composer-emoji/apple/1f1f5-1f1f2.png
new file mode 100644
index 0000000000..99ea3d9aa1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f3.png b/static/images/composer-emoji/apple/1f1f5-1f1f3.png
new file mode 100644
index 0000000000..4739d46558
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f7.png b/static/images/composer-emoji/apple/1f1f5-1f1f7.png
new file mode 100644
index 0000000000..98cfb7cfb3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f8.png b/static/images/composer-emoji/apple/1f1f5-1f1f8.png
new file mode 100644
index 0000000000..29fddc2868
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1f9.png b/static/images/composer-emoji/apple/1f1f5-1f1f9.png
new file mode 100644
index 0000000000..94353d0da7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1fc.png b/static/images/composer-emoji/apple/1f1f5-1f1fc.png
new file mode 100644
index 0000000000..9566b2e10f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1f5-1f1fe.png b/static/images/composer-emoji/apple/1f1f5-1f1fe.png
new file mode 100644
index 0000000000..c8856dcc33
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f5-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1f6-1f1e6.png b/static/images/composer-emoji/apple/1f1f6-1f1e6.png
new file mode 100644
index 0000000000..ccee90f147
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f6-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f7-1f1ea.png b/static/images/composer-emoji/apple/1f1f7-1f1ea.png
new file mode 100644
index 0000000000..6c40f3e88c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f7-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f7-1f1f4.png b/static/images/composer-emoji/apple/1f1f7-1f1f4.png
new file mode 100644
index 0000000000..af39140fc3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f7-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1f7-1f1f8.png b/static/images/composer-emoji/apple/1f1f7-1f1f8.png
new file mode 100644
index 0000000000..1dc4728ddf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f7-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f7-1f1fa.png b/static/images/composer-emoji/apple/1f1f7-1f1fa.png
new file mode 100644
index 0000000000..f243207583
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f7-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1f7-1f1fc.png b/static/images/composer-emoji/apple/1f1f7-1f1fc.png
new file mode 100644
index 0000000000..f3bcd1dcee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f7-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1e6.png b/static/images/composer-emoji/apple/1f1f8-1f1e6.png
new file mode 100644
index 0000000000..bc6ddeb5e0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1e7.png b/static/images/composer-emoji/apple/1f1f8-1f1e7.png
new file mode 100644
index 0000000000..aa7866366c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1e7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1e8.png b/static/images/composer-emoji/apple/1f1f8-1f1e8.png
new file mode 100644
index 0000000000..4af3e7281c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1e9.png b/static/images/composer-emoji/apple/1f1f8-1f1e9.png
new file mode 100644
index 0000000000..ca9d4756f5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ea.png b/static/images/composer-emoji/apple/1f1f8-1f1ea.png
new file mode 100644
index 0000000000..5197de11b6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ec.png b/static/images/composer-emoji/apple/1f1f8-1f1ec.png
new file mode 100644
index 0000000000..c4b39bec3b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ed.png b/static/images/composer-emoji/apple/1f1f8-1f1ed.png
new file mode 100644
index 0000000000..1e31bca422
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ee.png b/static/images/composer-emoji/apple/1f1f8-1f1ee.png
new file mode 100644
index 0000000000..f89a2d8fc0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ef.png b/static/images/composer-emoji/apple/1f1f8-1f1ef.png
new file mode 100644
index 0000000000..d9c274109b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ef.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f0.png b/static/images/composer-emoji/apple/1f1f8-1f1f0.png
new file mode 100644
index 0000000000..6b70ef3cf8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f1.png b/static/images/composer-emoji/apple/1f1f8-1f1f1.png
new file mode 100644
index 0000000000..05622eb692
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f2.png b/static/images/composer-emoji/apple/1f1f8-1f1f2.png
new file mode 100644
index 0000000000..acb0b9353d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f3.png b/static/images/composer-emoji/apple/1f1f8-1f1f3.png
new file mode 100644
index 0000000000..6ccd94a831
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f4.png b/static/images/composer-emoji/apple/1f1f8-1f1f4.png
new file mode 100644
index 0000000000..17ba05ee67
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f7.png b/static/images/composer-emoji/apple/1f1f8-1f1f7.png
new file mode 100644
index 0000000000..da4c1b9619
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f8.png b/static/images/composer-emoji/apple/1f1f8-1f1f8.png
new file mode 100644
index 0000000000..6901c66839
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1f9.png b/static/images/composer-emoji/apple/1f1f8-1f1f9.png
new file mode 100644
index 0000000000..37644ca4db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1fb.png b/static/images/composer-emoji/apple/1f1f8-1f1fb.png
new file mode 100644
index 0000000000..7e77f01518
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1fd.png b/static/images/composer-emoji/apple/1f1f8-1f1fd.png
new file mode 100644
index 0000000000..4d1da0d484
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1fd.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1fe.png b/static/images/composer-emoji/apple/1f1f8-1f1fe.png
new file mode 100644
index 0000000000..4cfaa0ce52
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1f8-1f1ff.png b/static/images/composer-emoji/apple/1f1f8-1f1ff.png
new file mode 100644
index 0000000000..2c7a1668aa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f8-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1e6.png b/static/images/composer-emoji/apple/1f1f9-1f1e6.png
new file mode 100644
index 0000000000..1e31bca422
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1e8.png b/static/images/composer-emoji/apple/1f1f9-1f1e8.png
new file mode 100644
index 0000000000..6cd10ea98f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1e9.png b/static/images/composer-emoji/apple/1f1f9-1f1e9.png
new file mode 100644
index 0000000000..48d84bdc8c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1e9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1eb.png b/static/images/composer-emoji/apple/1f1f9-1f1eb.png
new file mode 100644
index 0000000000..b01ea2822e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1ec.png b/static/images/composer-emoji/apple/1f1f9-1f1ec.png
new file mode 100644
index 0000000000..0c2252c36c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1ed.png b/static/images/composer-emoji/apple/1f1f9-1f1ed.png
new file mode 100644
index 0000000000..523446ba3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1ed.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1ef.png b/static/images/composer-emoji/apple/1f1f9-1f1ef.png
new file mode 100644
index 0000000000..23712cbee7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1ef.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f0.png b/static/images/composer-emoji/apple/1f1f9-1f1f0.png
new file mode 100644
index 0000000000..ce5204f53d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f1.png b/static/images/composer-emoji/apple/1f1f9-1f1f1.png
new file mode 100644
index 0000000000..f964d5e6df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f1.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f2.png b/static/images/composer-emoji/apple/1f1f9-1f1f2.png
new file mode 100644
index 0000000000..7446aea7be
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f3.png b/static/images/composer-emoji/apple/1f1f9-1f1f3.png
new file mode 100644
index 0000000000..73f4b6811e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f4.png b/static/images/composer-emoji/apple/1f1f9-1f1f4.png
new file mode 100644
index 0000000000..04c00dc399
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f4.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f7.png b/static/images/composer-emoji/apple/1f1f9-1f1f7.png
new file mode 100644
index 0000000000..2d791a85a6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f7.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1f9.png b/static/images/composer-emoji/apple/1f1f9-1f1f9.png
new file mode 100644
index 0000000000..79d61ec3da
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1fb.png b/static/images/composer-emoji/apple/1f1f9-1f1fb.png
new file mode 100644
index 0000000000..7fc730ce7a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1fb.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1fc.png b/static/images/composer-emoji/apple/1f1f9-1f1fc.png
new file mode 100644
index 0000000000..65606857ce
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f1f9-1f1ff.png b/static/images/composer-emoji/apple/1f1f9-1f1ff.png
new file mode 100644
index 0000000000..28644ddc78
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1f9-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1e6.png b/static/images/composer-emoji/apple/1f1fa-1f1e6.png
new file mode 100644
index 0000000000..779ccc9233
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1ec.png b/static/images/composer-emoji/apple/1f1fa-1f1ec.png
new file mode 100644
index 0000000000..5607492183
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1f2.png b/static/images/composer-emoji/apple/1f1fa-1f1f2.png
new file mode 100644
index 0000000000..a1bde28cbb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1f8.png b/static/images/composer-emoji/apple/1f1fa-1f1f8.png
new file mode 100644
index 0000000000..a1bde28cbb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1fe.png b/static/images/composer-emoji/apple/1f1fa-1f1fe.png
new file mode 100644
index 0000000000..d1b9504def
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1fe.png differ
diff --git a/static/images/composer-emoji/apple/1f1fa-1f1ff.png b/static/images/composer-emoji/apple/1f1fa-1f1ff.png
new file mode 100644
index 0000000000..cd7c512cac
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fa-1f1ff.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1e6.png b/static/images/composer-emoji/apple/1f1fb-1f1e6.png
new file mode 100644
index 0000000000..c6a5ed09ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1e8.png b/static/images/composer-emoji/apple/1f1fb-1f1e8.png
new file mode 100644
index 0000000000..a9ed288896
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1e8.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1ea.png b/static/images/composer-emoji/apple/1f1fb-1f1ea.png
new file mode 100644
index 0000000000..e667260b9d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1ec.png b/static/images/composer-emoji/apple/1f1fb-1f1ec.png
new file mode 100644
index 0000000000..7c6a6e6180
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1ec.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1ee.png b/static/images/composer-emoji/apple/1f1fb-1f1ee.png
new file mode 100644
index 0000000000..62fc081c57
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1ee.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1f3.png b/static/images/composer-emoji/apple/1f1fb-1f1f3.png
new file mode 100644
index 0000000000..3cbb8ca245
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1f3.png differ
diff --git a/static/images/composer-emoji/apple/1f1fb-1f1fa.png b/static/images/composer-emoji/apple/1f1fb-1f1fa.png
new file mode 100644
index 0000000000..a3e6653818
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fb-1f1fa.png differ
diff --git a/static/images/composer-emoji/apple/1f1fc-1f1eb.png b/static/images/composer-emoji/apple/1f1fc-1f1eb.png
new file mode 100644
index 0000000000..fc23bb498c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fc-1f1eb.png differ
diff --git a/static/images/composer-emoji/apple/1f1fc-1f1f8.png b/static/images/composer-emoji/apple/1f1fc-1f1f8.png
new file mode 100644
index 0000000000..c5f9b69bc2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fc-1f1f8.png differ
diff --git a/static/images/composer-emoji/apple/1f1fd-1f1f0.png b/static/images/composer-emoji/apple/1f1fd-1f1f0.png
new file mode 100644
index 0000000000..ed9cc56256
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fd-1f1f0.png differ
diff --git a/static/images/composer-emoji/apple/1f1fe-1f1ea.png b/static/images/composer-emoji/apple/1f1fe-1f1ea.png
new file mode 100644
index 0000000000..38465e8c44
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fe-1f1ea.png differ
diff --git a/static/images/composer-emoji/apple/1f1fe-1f1f9.png b/static/images/composer-emoji/apple/1f1fe-1f1f9.png
new file mode 100644
index 0000000000..fbc905b3d7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1fe-1f1f9.png differ
diff --git a/static/images/composer-emoji/apple/1f1ff-1f1e6.png b/static/images/composer-emoji/apple/1f1ff-1f1e6.png
new file mode 100644
index 0000000000..a1ef32e54c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ff-1f1e6.png differ
diff --git a/static/images/composer-emoji/apple/1f1ff-1f1f2.png b/static/images/composer-emoji/apple/1f1ff-1f1f2.png
new file mode 100644
index 0000000000..50ef8680fc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ff-1f1f2.png differ
diff --git a/static/images/composer-emoji/apple/1f1ff-1f1fc.png b/static/images/composer-emoji/apple/1f1ff-1f1fc.png
new file mode 100644
index 0000000000..fb6b110d22
Binary files /dev/null and b/static/images/composer-emoji/apple/1f1ff-1f1fc.png differ
diff --git a/static/images/composer-emoji/apple/1f201.png b/static/images/composer-emoji/apple/1f201.png
new file mode 100644
index 0000000000..bbbd9886f6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f201.png differ
diff --git a/static/images/composer-emoji/apple/1f202.png b/static/images/composer-emoji/apple/1f202.png
new file mode 100644
index 0000000000..f7485b8eea
Binary files /dev/null and b/static/images/composer-emoji/apple/1f202.png differ
diff --git a/static/images/composer-emoji/apple/1f21a.png b/static/images/composer-emoji/apple/1f21a.png
new file mode 100644
index 0000000000..fa3257e404
Binary files /dev/null and b/static/images/composer-emoji/apple/1f21a.png differ
diff --git a/static/images/composer-emoji/apple/1f22f.png b/static/images/composer-emoji/apple/1f22f.png
new file mode 100644
index 0000000000..d01eeccc6c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f22f.png differ
diff --git a/static/images/composer-emoji/apple/1f232.png b/static/images/composer-emoji/apple/1f232.png
new file mode 100644
index 0000000000..4ea08f414d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f232.png differ
diff --git a/static/images/composer-emoji/apple/1f233.png b/static/images/composer-emoji/apple/1f233.png
new file mode 100644
index 0000000000..8f21dfb682
Binary files /dev/null and b/static/images/composer-emoji/apple/1f233.png differ
diff --git a/static/images/composer-emoji/apple/1f234.png b/static/images/composer-emoji/apple/1f234.png
new file mode 100644
index 0000000000..c1b0baeb73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f234.png differ
diff --git a/static/images/composer-emoji/apple/1f235.png b/static/images/composer-emoji/apple/1f235.png
new file mode 100644
index 0000000000..cb3d793b2c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f235.png differ
diff --git a/static/images/composer-emoji/apple/1f236.png b/static/images/composer-emoji/apple/1f236.png
new file mode 100644
index 0000000000..988555b1d7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f236.png differ
diff --git a/static/images/composer-emoji/apple/1f237.png b/static/images/composer-emoji/apple/1f237.png
new file mode 100644
index 0000000000..b8aaeae9db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f237.png differ
diff --git a/static/images/composer-emoji/apple/1f238.png b/static/images/composer-emoji/apple/1f238.png
new file mode 100644
index 0000000000..7b95cd9cce
Binary files /dev/null and b/static/images/composer-emoji/apple/1f238.png differ
diff --git a/static/images/composer-emoji/apple/1f239.png b/static/images/composer-emoji/apple/1f239.png
new file mode 100644
index 0000000000..84823af64f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f239.png differ
diff --git a/static/images/composer-emoji/apple/1f23a.png b/static/images/composer-emoji/apple/1f23a.png
new file mode 100644
index 0000000000..b9107c6b9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f23a.png differ
diff --git a/static/images/composer-emoji/apple/1f250.png b/static/images/composer-emoji/apple/1f250.png
new file mode 100644
index 0000000000..f4145153bf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f250.png differ
diff --git a/static/images/composer-emoji/apple/1f251.png b/static/images/composer-emoji/apple/1f251.png
new file mode 100644
index 0000000000..f8c85c9547
Binary files /dev/null and b/static/images/composer-emoji/apple/1f251.png differ
diff --git a/static/images/composer-emoji/apple/1f300.png b/static/images/composer-emoji/apple/1f300.png
new file mode 100644
index 0000000000..38d7798ec2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f300.png differ
diff --git a/static/images/composer-emoji/apple/1f301.png b/static/images/composer-emoji/apple/1f301.png
new file mode 100644
index 0000000000..0d4a5412f6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f301.png differ
diff --git a/static/images/composer-emoji/apple/1f302.png b/static/images/composer-emoji/apple/1f302.png
new file mode 100644
index 0000000000..ba5655c747
Binary files /dev/null and b/static/images/composer-emoji/apple/1f302.png differ
diff --git a/static/images/composer-emoji/apple/1f303.png b/static/images/composer-emoji/apple/1f303.png
new file mode 100644
index 0000000000..2560e54bd0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f303.png differ
diff --git a/static/images/composer-emoji/apple/1f304.png b/static/images/composer-emoji/apple/1f304.png
new file mode 100644
index 0000000000..a1a381f00c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f304.png differ
diff --git a/static/images/composer-emoji/apple/1f305.png b/static/images/composer-emoji/apple/1f305.png
new file mode 100644
index 0000000000..2c04888b43
Binary files /dev/null and b/static/images/composer-emoji/apple/1f305.png differ
diff --git a/static/images/composer-emoji/apple/1f306.png b/static/images/composer-emoji/apple/1f306.png
new file mode 100644
index 0000000000..0dff57b275
Binary files /dev/null and b/static/images/composer-emoji/apple/1f306.png differ
diff --git a/static/images/composer-emoji/apple/1f307.png b/static/images/composer-emoji/apple/1f307.png
new file mode 100644
index 0000000000..649769a422
Binary files /dev/null and b/static/images/composer-emoji/apple/1f307.png differ
diff --git a/static/images/composer-emoji/apple/1f308.png b/static/images/composer-emoji/apple/1f308.png
new file mode 100644
index 0000000000..7f5dd5a44b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f308.png differ
diff --git a/static/images/composer-emoji/apple/1f309.png b/static/images/composer-emoji/apple/1f309.png
new file mode 100644
index 0000000000..e0e2aa38db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f309.png differ
diff --git a/static/images/composer-emoji/apple/1f30a.png b/static/images/composer-emoji/apple/1f30a.png
new file mode 100644
index 0000000000..ed98a3ef2b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30a.png differ
diff --git a/static/images/composer-emoji/apple/1f30b.png b/static/images/composer-emoji/apple/1f30b.png
new file mode 100644
index 0000000000..c2cb050167
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30b.png differ
diff --git a/static/images/composer-emoji/apple/1f30c.png b/static/images/composer-emoji/apple/1f30c.png
new file mode 100644
index 0000000000..a46a1fb5df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30c.png differ
diff --git a/static/images/composer-emoji/apple/1f30d.png b/static/images/composer-emoji/apple/1f30d.png
new file mode 100644
index 0000000000..686286caf8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30d.png differ
diff --git a/static/images/composer-emoji/apple/1f30e.png b/static/images/composer-emoji/apple/1f30e.png
new file mode 100644
index 0000000000..9a60ea91c1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30e.png differ
diff --git a/static/images/composer-emoji/apple/1f30f.png b/static/images/composer-emoji/apple/1f30f.png
new file mode 100644
index 0000000000..3d91d45f6c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f30f.png differ
diff --git a/static/images/composer-emoji/apple/1f310.png b/static/images/composer-emoji/apple/1f310.png
new file mode 100644
index 0000000000..686da7b6bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f310.png differ
diff --git a/static/images/composer-emoji/apple/1f311.png b/static/images/composer-emoji/apple/1f311.png
new file mode 100644
index 0000000000..1d5e160441
Binary files /dev/null and b/static/images/composer-emoji/apple/1f311.png differ
diff --git a/static/images/composer-emoji/apple/1f312.png b/static/images/composer-emoji/apple/1f312.png
new file mode 100644
index 0000000000..e29141da9d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f312.png differ
diff --git a/static/images/composer-emoji/apple/1f313.png b/static/images/composer-emoji/apple/1f313.png
new file mode 100644
index 0000000000..81e9dbb18d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f313.png differ
diff --git a/static/images/composer-emoji/apple/1f314.png b/static/images/composer-emoji/apple/1f314.png
new file mode 100644
index 0000000000..dcb64e8c0a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f314.png differ
diff --git a/static/images/composer-emoji/apple/1f315.png b/static/images/composer-emoji/apple/1f315.png
new file mode 100644
index 0000000000..aef44b2982
Binary files /dev/null and b/static/images/composer-emoji/apple/1f315.png differ
diff --git a/static/images/composer-emoji/apple/1f316.png b/static/images/composer-emoji/apple/1f316.png
new file mode 100644
index 0000000000..b00870ccc6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f316.png differ
diff --git a/static/images/composer-emoji/apple/1f317.png b/static/images/composer-emoji/apple/1f317.png
new file mode 100644
index 0000000000..99fafb0e3d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f317.png differ
diff --git a/static/images/composer-emoji/apple/1f318.png b/static/images/composer-emoji/apple/1f318.png
new file mode 100644
index 0000000000..1d526b1192
Binary files /dev/null and b/static/images/composer-emoji/apple/1f318.png differ
diff --git a/static/images/composer-emoji/apple/1f319.png b/static/images/composer-emoji/apple/1f319.png
new file mode 100644
index 0000000000..19a6c0f79d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f319.png differ
diff --git a/static/images/composer-emoji/apple/1f31a.png b/static/images/composer-emoji/apple/1f31a.png
new file mode 100644
index 0000000000..392d10441f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31a.png differ
diff --git a/static/images/composer-emoji/apple/1f31b.png b/static/images/composer-emoji/apple/1f31b.png
new file mode 100644
index 0000000000..6475ed0e17
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31b.png differ
diff --git a/static/images/composer-emoji/apple/1f31c.png b/static/images/composer-emoji/apple/1f31c.png
new file mode 100644
index 0000000000..e3dc1a8844
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31c.png differ
diff --git a/static/images/composer-emoji/apple/1f31d.png b/static/images/composer-emoji/apple/1f31d.png
new file mode 100644
index 0000000000..83c6b3193c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31d.png differ
diff --git a/static/images/composer-emoji/apple/1f31e.png b/static/images/composer-emoji/apple/1f31e.png
new file mode 100644
index 0000000000..0e33d8a9e5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31e.png differ
diff --git a/static/images/composer-emoji/apple/1f31f.png b/static/images/composer-emoji/apple/1f31f.png
new file mode 100644
index 0000000000..f0ec2bd2eb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f31f.png differ
diff --git a/static/images/composer-emoji/apple/1f320.png b/static/images/composer-emoji/apple/1f320.png
new file mode 100644
index 0000000000..23e7cba03c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f320.png differ
diff --git a/static/images/composer-emoji/apple/1f321.png b/static/images/composer-emoji/apple/1f321.png
new file mode 100644
index 0000000000..01b8429fa3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f321.png differ
diff --git a/static/images/composer-emoji/apple/1f324.png b/static/images/composer-emoji/apple/1f324.png
new file mode 100644
index 0000000000..f8aa774ed4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f324.png differ
diff --git a/static/images/composer-emoji/apple/1f325.png b/static/images/composer-emoji/apple/1f325.png
new file mode 100644
index 0000000000..5006fdf9b4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f325.png differ
diff --git a/static/images/composer-emoji/apple/1f326.png b/static/images/composer-emoji/apple/1f326.png
new file mode 100644
index 0000000000..11fabe65d6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f326.png differ
diff --git a/static/images/composer-emoji/apple/1f327.png b/static/images/composer-emoji/apple/1f327.png
new file mode 100644
index 0000000000..ac73d16df3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f327.png differ
diff --git a/static/images/composer-emoji/apple/1f328.png b/static/images/composer-emoji/apple/1f328.png
new file mode 100644
index 0000000000..f6386cd893
Binary files /dev/null and b/static/images/composer-emoji/apple/1f328.png differ
diff --git a/static/images/composer-emoji/apple/1f329.png b/static/images/composer-emoji/apple/1f329.png
new file mode 100644
index 0000000000..c6c94700de
Binary files /dev/null and b/static/images/composer-emoji/apple/1f329.png differ
diff --git a/static/images/composer-emoji/apple/1f32a.png b/static/images/composer-emoji/apple/1f32a.png
new file mode 100644
index 0000000000..88720f62cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32a.png differ
diff --git a/static/images/composer-emoji/apple/1f32b.png b/static/images/composer-emoji/apple/1f32b.png
new file mode 100644
index 0000000000..4d67d6aaf0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32b.png differ
diff --git a/static/images/composer-emoji/apple/1f32c.png b/static/images/composer-emoji/apple/1f32c.png
new file mode 100644
index 0000000000..0551171aec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32c.png differ
diff --git a/static/images/composer-emoji/apple/1f32d.png b/static/images/composer-emoji/apple/1f32d.png
new file mode 100644
index 0000000000..18715131bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32d.png differ
diff --git a/static/images/composer-emoji/apple/1f32e.png b/static/images/composer-emoji/apple/1f32e.png
new file mode 100644
index 0000000000..dbbce3299d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32e.png differ
diff --git a/static/images/composer-emoji/apple/1f32f.png b/static/images/composer-emoji/apple/1f32f.png
new file mode 100644
index 0000000000..0eed4d9830
Binary files /dev/null and b/static/images/composer-emoji/apple/1f32f.png differ
diff --git a/static/images/composer-emoji/apple/1f330.png b/static/images/composer-emoji/apple/1f330.png
new file mode 100644
index 0000000000..707ac34cd8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f330.png differ
diff --git a/static/images/composer-emoji/apple/1f331.png b/static/images/composer-emoji/apple/1f331.png
new file mode 100644
index 0000000000..f42a410f28
Binary files /dev/null and b/static/images/composer-emoji/apple/1f331.png differ
diff --git a/static/images/composer-emoji/apple/1f332.png b/static/images/composer-emoji/apple/1f332.png
new file mode 100644
index 0000000000..55025809f3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f332.png differ
diff --git a/static/images/composer-emoji/apple/1f333.png b/static/images/composer-emoji/apple/1f333.png
new file mode 100644
index 0000000000..debb45212c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f333.png differ
diff --git a/static/images/composer-emoji/apple/1f334.png b/static/images/composer-emoji/apple/1f334.png
new file mode 100644
index 0000000000..59403cf281
Binary files /dev/null and b/static/images/composer-emoji/apple/1f334.png differ
diff --git a/static/images/composer-emoji/apple/1f335.png b/static/images/composer-emoji/apple/1f335.png
new file mode 100644
index 0000000000..1b0802cc4b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f335.png differ
diff --git a/static/images/composer-emoji/apple/1f336.png b/static/images/composer-emoji/apple/1f336.png
new file mode 100644
index 0000000000..e03cce3029
Binary files /dev/null and b/static/images/composer-emoji/apple/1f336.png differ
diff --git a/static/images/composer-emoji/apple/1f337.png b/static/images/composer-emoji/apple/1f337.png
new file mode 100644
index 0000000000..bda4ce596c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f337.png differ
diff --git a/static/images/composer-emoji/apple/1f338.png b/static/images/composer-emoji/apple/1f338.png
new file mode 100644
index 0000000000..7acebd935f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f338.png differ
diff --git a/static/images/composer-emoji/apple/1f339.png b/static/images/composer-emoji/apple/1f339.png
new file mode 100644
index 0000000000..100e4b4d06
Binary files /dev/null and b/static/images/composer-emoji/apple/1f339.png differ
diff --git a/static/images/composer-emoji/apple/1f33a.png b/static/images/composer-emoji/apple/1f33a.png
new file mode 100644
index 0000000000..dad8e5c328
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33a.png differ
diff --git a/static/images/composer-emoji/apple/1f33b.png b/static/images/composer-emoji/apple/1f33b.png
new file mode 100644
index 0000000000..473dd0bc70
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33b.png differ
diff --git a/static/images/composer-emoji/apple/1f33c.png b/static/images/composer-emoji/apple/1f33c.png
new file mode 100644
index 0000000000..809aba214e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33c.png differ
diff --git a/static/images/composer-emoji/apple/1f33d.png b/static/images/composer-emoji/apple/1f33d.png
new file mode 100644
index 0000000000..067c162f50
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33d.png differ
diff --git a/static/images/composer-emoji/apple/1f33e.png b/static/images/composer-emoji/apple/1f33e.png
new file mode 100644
index 0000000000..fc57c719f4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33e.png differ
diff --git a/static/images/composer-emoji/apple/1f33f.png b/static/images/composer-emoji/apple/1f33f.png
new file mode 100644
index 0000000000..3b8359f281
Binary files /dev/null and b/static/images/composer-emoji/apple/1f33f.png differ
diff --git a/static/images/composer-emoji/apple/1f340.png b/static/images/composer-emoji/apple/1f340.png
new file mode 100644
index 0000000000..00097ecf64
Binary files /dev/null and b/static/images/composer-emoji/apple/1f340.png differ
diff --git a/static/images/composer-emoji/apple/1f341.png b/static/images/composer-emoji/apple/1f341.png
new file mode 100644
index 0000000000..0ec18be958
Binary files /dev/null and b/static/images/composer-emoji/apple/1f341.png differ
diff --git a/static/images/composer-emoji/apple/1f342.png b/static/images/composer-emoji/apple/1f342.png
new file mode 100644
index 0000000000..ce7e3343c8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f342.png differ
diff --git a/static/images/composer-emoji/apple/1f343.png b/static/images/composer-emoji/apple/1f343.png
new file mode 100644
index 0000000000..d9f11553b9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f343.png differ
diff --git a/static/images/composer-emoji/apple/1f344.png b/static/images/composer-emoji/apple/1f344.png
new file mode 100644
index 0000000000..f26ea3fb97
Binary files /dev/null and b/static/images/composer-emoji/apple/1f344.png differ
diff --git a/static/images/composer-emoji/apple/1f345.png b/static/images/composer-emoji/apple/1f345.png
new file mode 100644
index 0000000000..77014ced29
Binary files /dev/null and b/static/images/composer-emoji/apple/1f345.png differ
diff --git a/static/images/composer-emoji/apple/1f346.png b/static/images/composer-emoji/apple/1f346.png
new file mode 100644
index 0000000000..dfd690e7cf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f346.png differ
diff --git a/static/images/composer-emoji/apple/1f347.png b/static/images/composer-emoji/apple/1f347.png
new file mode 100644
index 0000000000..4acd539405
Binary files /dev/null and b/static/images/composer-emoji/apple/1f347.png differ
diff --git a/static/images/composer-emoji/apple/1f348.png b/static/images/composer-emoji/apple/1f348.png
new file mode 100644
index 0000000000..23dce6ca78
Binary files /dev/null and b/static/images/composer-emoji/apple/1f348.png differ
diff --git a/static/images/composer-emoji/apple/1f349.png b/static/images/composer-emoji/apple/1f349.png
new file mode 100644
index 0000000000..980f29fd5e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f349.png differ
diff --git a/static/images/composer-emoji/apple/1f34a.png b/static/images/composer-emoji/apple/1f34a.png
new file mode 100644
index 0000000000..30961ada7f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34a.png differ
diff --git a/static/images/composer-emoji/apple/1f34b.png b/static/images/composer-emoji/apple/1f34b.png
new file mode 100644
index 0000000000..07deefa08d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34b.png differ
diff --git a/static/images/composer-emoji/apple/1f34c.png b/static/images/composer-emoji/apple/1f34c.png
new file mode 100644
index 0000000000..969ce16bc7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34c.png differ
diff --git a/static/images/composer-emoji/apple/1f34d.png b/static/images/composer-emoji/apple/1f34d.png
new file mode 100644
index 0000000000..dc8c8d25ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34d.png differ
diff --git a/static/images/composer-emoji/apple/1f34e.png b/static/images/composer-emoji/apple/1f34e.png
new file mode 100644
index 0000000000..793b09964d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34e.png differ
diff --git a/static/images/composer-emoji/apple/1f34f.png b/static/images/composer-emoji/apple/1f34f.png
new file mode 100644
index 0000000000..80ab4faa14
Binary files /dev/null and b/static/images/composer-emoji/apple/1f34f.png differ
diff --git a/static/images/composer-emoji/apple/1f350.png b/static/images/composer-emoji/apple/1f350.png
new file mode 100644
index 0000000000..f02f4db216
Binary files /dev/null and b/static/images/composer-emoji/apple/1f350.png differ
diff --git a/static/images/composer-emoji/apple/1f351.png b/static/images/composer-emoji/apple/1f351.png
new file mode 100644
index 0000000000..e6845453da
Binary files /dev/null and b/static/images/composer-emoji/apple/1f351.png differ
diff --git a/static/images/composer-emoji/apple/1f352.png b/static/images/composer-emoji/apple/1f352.png
new file mode 100644
index 0000000000..78d102024a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f352.png differ
diff --git a/static/images/composer-emoji/apple/1f353.png b/static/images/composer-emoji/apple/1f353.png
new file mode 100644
index 0000000000..165c4a60de
Binary files /dev/null and b/static/images/composer-emoji/apple/1f353.png differ
diff --git a/static/images/composer-emoji/apple/1f354.png b/static/images/composer-emoji/apple/1f354.png
new file mode 100644
index 0000000000..568315e53e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f354.png differ
diff --git a/static/images/composer-emoji/apple/1f355.png b/static/images/composer-emoji/apple/1f355.png
new file mode 100644
index 0000000000..ed9e63a8fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f355.png differ
diff --git a/static/images/composer-emoji/apple/1f356.png b/static/images/composer-emoji/apple/1f356.png
new file mode 100644
index 0000000000..574990fb3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f356.png differ
diff --git a/static/images/composer-emoji/apple/1f357.png b/static/images/composer-emoji/apple/1f357.png
new file mode 100644
index 0000000000..96cd6e7684
Binary files /dev/null and b/static/images/composer-emoji/apple/1f357.png differ
diff --git a/static/images/composer-emoji/apple/1f358.png b/static/images/composer-emoji/apple/1f358.png
new file mode 100644
index 0000000000..ca078c05bb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f358.png differ
diff --git a/static/images/composer-emoji/apple/1f359.png b/static/images/composer-emoji/apple/1f359.png
new file mode 100644
index 0000000000..ee610b9a10
Binary files /dev/null and b/static/images/composer-emoji/apple/1f359.png differ
diff --git a/static/images/composer-emoji/apple/1f35a.png b/static/images/composer-emoji/apple/1f35a.png
new file mode 100644
index 0000000000..b10016f4fa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35a.png differ
diff --git a/static/images/composer-emoji/apple/1f35b.png b/static/images/composer-emoji/apple/1f35b.png
new file mode 100644
index 0000000000..779ff68057
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35b.png differ
diff --git a/static/images/composer-emoji/apple/1f35c.png b/static/images/composer-emoji/apple/1f35c.png
new file mode 100644
index 0000000000..621d6c1160
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35c.png differ
diff --git a/static/images/composer-emoji/apple/1f35d.png b/static/images/composer-emoji/apple/1f35d.png
new file mode 100644
index 0000000000..a8a02e9307
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35d.png differ
diff --git a/static/images/composer-emoji/apple/1f35e.png b/static/images/composer-emoji/apple/1f35e.png
new file mode 100644
index 0000000000..be35652f56
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35e.png differ
diff --git a/static/images/composer-emoji/apple/1f35f.png b/static/images/composer-emoji/apple/1f35f.png
new file mode 100644
index 0000000000..d233897193
Binary files /dev/null and b/static/images/composer-emoji/apple/1f35f.png differ
diff --git a/static/images/composer-emoji/apple/1f360.png b/static/images/composer-emoji/apple/1f360.png
new file mode 100644
index 0000000000..83abf458b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f360.png differ
diff --git a/static/images/composer-emoji/apple/1f361.png b/static/images/composer-emoji/apple/1f361.png
new file mode 100644
index 0000000000..8144d1b0cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f361.png differ
diff --git a/static/images/composer-emoji/apple/1f362.png b/static/images/composer-emoji/apple/1f362.png
new file mode 100644
index 0000000000..f59d379583
Binary files /dev/null and b/static/images/composer-emoji/apple/1f362.png differ
diff --git a/static/images/composer-emoji/apple/1f363.png b/static/images/composer-emoji/apple/1f363.png
new file mode 100644
index 0000000000..1eb194a66c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f363.png differ
diff --git a/static/images/composer-emoji/apple/1f364.png b/static/images/composer-emoji/apple/1f364.png
new file mode 100644
index 0000000000..5304adaf19
Binary files /dev/null and b/static/images/composer-emoji/apple/1f364.png differ
diff --git a/static/images/composer-emoji/apple/1f365.png b/static/images/composer-emoji/apple/1f365.png
new file mode 100644
index 0000000000..27ef7dbe99
Binary files /dev/null and b/static/images/composer-emoji/apple/1f365.png differ
diff --git a/static/images/composer-emoji/apple/1f366.png b/static/images/composer-emoji/apple/1f366.png
new file mode 100644
index 0000000000..e2f97bfb12
Binary files /dev/null and b/static/images/composer-emoji/apple/1f366.png differ
diff --git a/static/images/composer-emoji/apple/1f367.png b/static/images/composer-emoji/apple/1f367.png
new file mode 100644
index 0000000000..ad8261cb78
Binary files /dev/null and b/static/images/composer-emoji/apple/1f367.png differ
diff --git a/static/images/composer-emoji/apple/1f368.png b/static/images/composer-emoji/apple/1f368.png
new file mode 100644
index 0000000000..e077b21663
Binary files /dev/null and b/static/images/composer-emoji/apple/1f368.png differ
diff --git a/static/images/composer-emoji/apple/1f369.png b/static/images/composer-emoji/apple/1f369.png
new file mode 100644
index 0000000000..f101a7a25a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f369.png differ
diff --git a/static/images/composer-emoji/apple/1f36a.png b/static/images/composer-emoji/apple/1f36a.png
new file mode 100644
index 0000000000..1bb744c3ad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36a.png differ
diff --git a/static/images/composer-emoji/apple/1f36b.png b/static/images/composer-emoji/apple/1f36b.png
new file mode 100644
index 0000000000..377e5a0c25
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36b.png differ
diff --git a/static/images/composer-emoji/apple/1f36c.png b/static/images/composer-emoji/apple/1f36c.png
new file mode 100644
index 0000000000..7dfadfc36a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36c.png differ
diff --git a/static/images/composer-emoji/apple/1f36d.png b/static/images/composer-emoji/apple/1f36d.png
new file mode 100644
index 0000000000..df0f0be7a2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36d.png differ
diff --git a/static/images/composer-emoji/apple/1f36e.png b/static/images/composer-emoji/apple/1f36e.png
new file mode 100644
index 0000000000..e01233e56d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36e.png differ
diff --git a/static/images/composer-emoji/apple/1f36f.png b/static/images/composer-emoji/apple/1f36f.png
new file mode 100644
index 0000000000..f54aa3befb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f36f.png differ
diff --git a/static/images/composer-emoji/apple/1f370.png b/static/images/composer-emoji/apple/1f370.png
new file mode 100644
index 0000000000..218a86415a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f370.png differ
diff --git a/static/images/composer-emoji/apple/1f371.png b/static/images/composer-emoji/apple/1f371.png
new file mode 100644
index 0000000000..624626027e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f371.png differ
diff --git a/static/images/composer-emoji/apple/1f372.png b/static/images/composer-emoji/apple/1f372.png
new file mode 100644
index 0000000000..c3c98c3ff0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f372.png differ
diff --git a/static/images/composer-emoji/apple/1f373.png b/static/images/composer-emoji/apple/1f373.png
new file mode 100644
index 0000000000..6e1e2ce4ed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f373.png differ
diff --git a/static/images/composer-emoji/apple/1f374.png b/static/images/composer-emoji/apple/1f374.png
new file mode 100644
index 0000000000..bb90f3f787
Binary files /dev/null and b/static/images/composer-emoji/apple/1f374.png differ
diff --git a/static/images/composer-emoji/apple/1f375.png b/static/images/composer-emoji/apple/1f375.png
new file mode 100644
index 0000000000..8e6fd103c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f375.png differ
diff --git a/static/images/composer-emoji/apple/1f376.png b/static/images/composer-emoji/apple/1f376.png
new file mode 100644
index 0000000000..b126985d9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f376.png differ
diff --git a/static/images/composer-emoji/apple/1f377.png b/static/images/composer-emoji/apple/1f377.png
new file mode 100644
index 0000000000..4decb4b867
Binary files /dev/null and b/static/images/composer-emoji/apple/1f377.png differ
diff --git a/static/images/composer-emoji/apple/1f378.png b/static/images/composer-emoji/apple/1f378.png
new file mode 100644
index 0000000000..6d3da5f7f3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f378.png differ
diff --git a/static/images/composer-emoji/apple/1f379.png b/static/images/composer-emoji/apple/1f379.png
new file mode 100644
index 0000000000..b23376465e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f379.png differ
diff --git a/static/images/composer-emoji/apple/1f37a.png b/static/images/composer-emoji/apple/1f37a.png
new file mode 100644
index 0000000000..e950429ce8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37a.png differ
diff --git a/static/images/composer-emoji/apple/1f37b.png b/static/images/composer-emoji/apple/1f37b.png
new file mode 100644
index 0000000000..6cb71d78ce
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37b.png differ
diff --git a/static/images/composer-emoji/apple/1f37c.png b/static/images/composer-emoji/apple/1f37c.png
new file mode 100644
index 0000000000..7f52d1e369
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37c.png differ
diff --git a/static/images/composer-emoji/apple/1f37d.png b/static/images/composer-emoji/apple/1f37d.png
new file mode 100644
index 0000000000..3197563681
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37d.png differ
diff --git a/static/images/composer-emoji/apple/1f37e.png b/static/images/composer-emoji/apple/1f37e.png
new file mode 100644
index 0000000000..feeba1aadf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37e.png differ
diff --git a/static/images/composer-emoji/apple/1f37f.png b/static/images/composer-emoji/apple/1f37f.png
new file mode 100644
index 0000000000..28aa56e736
Binary files /dev/null and b/static/images/composer-emoji/apple/1f37f.png differ
diff --git a/static/images/composer-emoji/apple/1f380.png b/static/images/composer-emoji/apple/1f380.png
new file mode 100644
index 0000000000..42688172e5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f380.png differ
diff --git a/static/images/composer-emoji/apple/1f381.png b/static/images/composer-emoji/apple/1f381.png
new file mode 100644
index 0000000000..41706a0ec4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f381.png differ
diff --git a/static/images/composer-emoji/apple/1f382.png b/static/images/composer-emoji/apple/1f382.png
new file mode 100644
index 0000000000..3c3d3455c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f382.png differ
diff --git a/static/images/composer-emoji/apple/1f383.png b/static/images/composer-emoji/apple/1f383.png
new file mode 100644
index 0000000000..599d2b0815
Binary files /dev/null and b/static/images/composer-emoji/apple/1f383.png differ
diff --git a/static/images/composer-emoji/apple/1f384.png b/static/images/composer-emoji/apple/1f384.png
new file mode 100644
index 0000000000..fb638793c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f384.png differ
diff --git a/static/images/composer-emoji/apple/1f385-1f3fb.png b/static/images/composer-emoji/apple/1f385-1f3fb.png
new file mode 100644
index 0000000000..d70075e9ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f385-1f3fc.png b/static/images/composer-emoji/apple/1f385-1f3fc.png
new file mode 100644
index 0000000000..f8794fc465
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f385-1f3fd.png b/static/images/composer-emoji/apple/1f385-1f3fd.png
new file mode 100644
index 0000000000..1b9768411b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f385-1f3fe.png b/static/images/composer-emoji/apple/1f385-1f3fe.png
new file mode 100644
index 0000000000..665da83e1e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f385-1f3ff.png b/static/images/composer-emoji/apple/1f385-1f3ff.png
new file mode 100644
index 0000000000..9ac1b1d608
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f385.png b/static/images/composer-emoji/apple/1f385.png
new file mode 100644
index 0000000000..45b058ee06
Binary files /dev/null and b/static/images/composer-emoji/apple/1f385.png differ
diff --git a/static/images/composer-emoji/apple/1f386.png b/static/images/composer-emoji/apple/1f386.png
new file mode 100644
index 0000000000..0c53a92a2b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f386.png differ
diff --git a/static/images/composer-emoji/apple/1f387.png b/static/images/composer-emoji/apple/1f387.png
new file mode 100644
index 0000000000..741453595e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f387.png differ
diff --git a/static/images/composer-emoji/apple/1f388.png b/static/images/composer-emoji/apple/1f388.png
new file mode 100644
index 0000000000..79dacec749
Binary files /dev/null and b/static/images/composer-emoji/apple/1f388.png differ
diff --git a/static/images/composer-emoji/apple/1f389.png b/static/images/composer-emoji/apple/1f389.png
new file mode 100644
index 0000000000..9de9e1ab83
Binary files /dev/null and b/static/images/composer-emoji/apple/1f389.png differ
diff --git a/static/images/composer-emoji/apple/1f38a.png b/static/images/composer-emoji/apple/1f38a.png
new file mode 100644
index 0000000000..35b0e38359
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38a.png differ
diff --git a/static/images/composer-emoji/apple/1f38b.png b/static/images/composer-emoji/apple/1f38b.png
new file mode 100644
index 0000000000..02ba95e398
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38b.png differ
diff --git a/static/images/composer-emoji/apple/1f38c.png b/static/images/composer-emoji/apple/1f38c.png
new file mode 100644
index 0000000000..503b91e50e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38c.png differ
diff --git a/static/images/composer-emoji/apple/1f38d.png b/static/images/composer-emoji/apple/1f38d.png
new file mode 100644
index 0000000000..24800b1178
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38d.png differ
diff --git a/static/images/composer-emoji/apple/1f38e.png b/static/images/composer-emoji/apple/1f38e.png
new file mode 100644
index 0000000000..9001e4768e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38e.png differ
diff --git a/static/images/composer-emoji/apple/1f38f.png b/static/images/composer-emoji/apple/1f38f.png
new file mode 100644
index 0000000000..c50d4dde61
Binary files /dev/null and b/static/images/composer-emoji/apple/1f38f.png differ
diff --git a/static/images/composer-emoji/apple/1f390.png b/static/images/composer-emoji/apple/1f390.png
new file mode 100644
index 0000000000..5750a798aa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f390.png differ
diff --git a/static/images/composer-emoji/apple/1f391.png b/static/images/composer-emoji/apple/1f391.png
new file mode 100644
index 0000000000..ca19e8c9c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f391.png differ
diff --git a/static/images/composer-emoji/apple/1f392.png b/static/images/composer-emoji/apple/1f392.png
new file mode 100644
index 0000000000..8e4b4dbb6d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f392.png differ
diff --git a/static/images/composer-emoji/apple/1f393.png b/static/images/composer-emoji/apple/1f393.png
new file mode 100644
index 0000000000..01291cd027
Binary files /dev/null and b/static/images/composer-emoji/apple/1f393.png differ
diff --git a/static/images/composer-emoji/apple/1f396.png b/static/images/composer-emoji/apple/1f396.png
new file mode 100644
index 0000000000..0cdafc1848
Binary files /dev/null and b/static/images/composer-emoji/apple/1f396.png differ
diff --git a/static/images/composer-emoji/apple/1f397.png b/static/images/composer-emoji/apple/1f397.png
new file mode 100644
index 0000000000..ff2240ee5a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f397.png differ
diff --git a/static/images/composer-emoji/apple/1f399.png b/static/images/composer-emoji/apple/1f399.png
new file mode 100644
index 0000000000..8e79830f83
Binary files /dev/null and b/static/images/composer-emoji/apple/1f399.png differ
diff --git a/static/images/composer-emoji/apple/1f39a.png b/static/images/composer-emoji/apple/1f39a.png
new file mode 100644
index 0000000000..3311cbbe67
Binary files /dev/null and b/static/images/composer-emoji/apple/1f39a.png differ
diff --git a/static/images/composer-emoji/apple/1f39b.png b/static/images/composer-emoji/apple/1f39b.png
new file mode 100644
index 0000000000..eadc715f34
Binary files /dev/null and b/static/images/composer-emoji/apple/1f39b.png differ
diff --git a/static/images/composer-emoji/apple/1f39e.png b/static/images/composer-emoji/apple/1f39e.png
new file mode 100644
index 0000000000..d338336610
Binary files /dev/null and b/static/images/composer-emoji/apple/1f39e.png differ
diff --git a/static/images/composer-emoji/apple/1f39f.png b/static/images/composer-emoji/apple/1f39f.png
new file mode 100644
index 0000000000..0627751fa1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f39f.png differ
diff --git a/static/images/composer-emoji/apple/1f3a0.png b/static/images/composer-emoji/apple/1f3a0.png
new file mode 100644
index 0000000000..f9ae75920d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a0.png differ
diff --git a/static/images/composer-emoji/apple/1f3a1.png b/static/images/composer-emoji/apple/1f3a1.png
new file mode 100644
index 0000000000..99519899e3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a1.png differ
diff --git a/static/images/composer-emoji/apple/1f3a2.png b/static/images/composer-emoji/apple/1f3a2.png
new file mode 100644
index 0000000000..3fa6158cf3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a2.png differ
diff --git a/static/images/composer-emoji/apple/1f3a3.png b/static/images/composer-emoji/apple/1f3a3.png
new file mode 100644
index 0000000000..1f9c459748
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a3.png differ
diff --git a/static/images/composer-emoji/apple/1f3a4.png b/static/images/composer-emoji/apple/1f3a4.png
new file mode 100644
index 0000000000..5d1316c036
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a4.png differ
diff --git a/static/images/composer-emoji/apple/1f3a5.png b/static/images/composer-emoji/apple/1f3a5.png
new file mode 100644
index 0000000000..6e9dc24bc7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a5.png differ
diff --git a/static/images/composer-emoji/apple/1f3a6.png b/static/images/composer-emoji/apple/1f3a6.png
new file mode 100644
index 0000000000..da1f8f41db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a6.png differ
diff --git a/static/images/composer-emoji/apple/1f3a7.png b/static/images/composer-emoji/apple/1f3a7.png
new file mode 100644
index 0000000000..0949440846
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a7.png differ
diff --git a/static/images/composer-emoji/apple/1f3a8.png b/static/images/composer-emoji/apple/1f3a8.png
new file mode 100644
index 0000000000..c5e10668ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a8.png differ
diff --git a/static/images/composer-emoji/apple/1f3a9.png b/static/images/composer-emoji/apple/1f3a9.png
new file mode 100644
index 0000000000..6051b4d331
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3a9.png differ
diff --git a/static/images/composer-emoji/apple/1f3aa.png b/static/images/composer-emoji/apple/1f3aa.png
new file mode 100644
index 0000000000..ba5baec3cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3aa.png differ
diff --git a/static/images/composer-emoji/apple/1f3ab.png b/static/images/composer-emoji/apple/1f3ab.png
new file mode 100644
index 0000000000..8e8b5d38e2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ab.png differ
diff --git a/static/images/composer-emoji/apple/1f3ac.png b/static/images/composer-emoji/apple/1f3ac.png
new file mode 100644
index 0000000000..cd7625a587
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ac.png differ
diff --git a/static/images/composer-emoji/apple/1f3ad.png b/static/images/composer-emoji/apple/1f3ad.png
new file mode 100644
index 0000000000..60d267f832
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ad.png differ
diff --git a/static/images/composer-emoji/apple/1f3ae.png b/static/images/composer-emoji/apple/1f3ae.png
new file mode 100644
index 0000000000..114bc4575a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ae.png differ
diff --git a/static/images/composer-emoji/apple/1f3af.png b/static/images/composer-emoji/apple/1f3af.png
new file mode 100644
index 0000000000..ab4707385a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3af.png differ
diff --git a/static/images/composer-emoji/apple/1f3b0.png b/static/images/composer-emoji/apple/1f3b0.png
new file mode 100644
index 0000000000..41335029c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b0.png differ
diff --git a/static/images/composer-emoji/apple/1f3b1.png b/static/images/composer-emoji/apple/1f3b1.png
new file mode 100644
index 0000000000..04149eeb7e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b1.png differ
diff --git a/static/images/composer-emoji/apple/1f3b2.png b/static/images/composer-emoji/apple/1f3b2.png
new file mode 100644
index 0000000000..4e455b793c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b2.png differ
diff --git a/static/images/composer-emoji/apple/1f3b3.png b/static/images/composer-emoji/apple/1f3b3.png
new file mode 100644
index 0000000000..a10c2751a8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b3.png differ
diff --git a/static/images/composer-emoji/apple/1f3b4.png b/static/images/composer-emoji/apple/1f3b4.png
new file mode 100644
index 0000000000..6ef38c1df1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b4.png differ
diff --git a/static/images/composer-emoji/apple/1f3b5.png b/static/images/composer-emoji/apple/1f3b5.png
new file mode 100644
index 0000000000..a5d2307797
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b5.png differ
diff --git a/static/images/composer-emoji/apple/1f3b6.png b/static/images/composer-emoji/apple/1f3b6.png
new file mode 100644
index 0000000000..4985ecc95f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b6.png differ
diff --git a/static/images/composer-emoji/apple/1f3b7.png b/static/images/composer-emoji/apple/1f3b7.png
new file mode 100644
index 0000000000..d3406a2020
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b7.png differ
diff --git a/static/images/composer-emoji/apple/1f3b8.png b/static/images/composer-emoji/apple/1f3b8.png
new file mode 100644
index 0000000000..c2e40d69df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b8.png differ
diff --git a/static/images/composer-emoji/apple/1f3b9.png b/static/images/composer-emoji/apple/1f3b9.png
new file mode 100644
index 0000000000..f9ad2514c6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3b9.png differ
diff --git a/static/images/composer-emoji/apple/1f3ba.png b/static/images/composer-emoji/apple/1f3ba.png
new file mode 100644
index 0000000000..ad80d84abc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ba.png differ
diff --git a/static/images/composer-emoji/apple/1f3bb.png b/static/images/composer-emoji/apple/1f3bb.png
new file mode 100644
index 0000000000..18808ad840
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3bb.png differ
diff --git a/static/images/composer-emoji/apple/1f3bc.png b/static/images/composer-emoji/apple/1f3bc.png
new file mode 100644
index 0000000000..0c58109ebe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3bc.png differ
diff --git a/static/images/composer-emoji/apple/1f3bd.png b/static/images/composer-emoji/apple/1f3bd.png
new file mode 100644
index 0000000000..e2c4cd23cc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3bd.png differ
diff --git a/static/images/composer-emoji/apple/1f3be.png b/static/images/composer-emoji/apple/1f3be.png
new file mode 100644
index 0000000000..bef3f00371
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3be.png differ
diff --git a/static/images/composer-emoji/apple/1f3bf.png b/static/images/composer-emoji/apple/1f3bf.png
new file mode 100644
index 0000000000..f6532e5336
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3bf.png differ
diff --git a/static/images/composer-emoji/apple/1f3c0.png b/static/images/composer-emoji/apple/1f3c0.png
new file mode 100644
index 0000000000..027f0cb1fc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c0.png differ
diff --git a/static/images/composer-emoji/apple/1f3c1.png b/static/images/composer-emoji/apple/1f3c1.png
new file mode 100644
index 0000000000..a0f0032dcc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c1.png differ
diff --git a/static/images/composer-emoji/apple/1f3c2.png b/static/images/composer-emoji/apple/1f3c2.png
new file mode 100644
index 0000000000..fcf91580a9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c2.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3-1f3fb.png b/static/images/composer-emoji/apple/1f3c3-1f3fb.png
new file mode 100644
index 0000000000..619cbd1fc0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3-1f3fc.png b/static/images/composer-emoji/apple/1f3c3-1f3fc.png
new file mode 100644
index 0000000000..998e73e6e1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3-1f3fd.png b/static/images/composer-emoji/apple/1f3c3-1f3fd.png
new file mode 100644
index 0000000000..399465995f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3-1f3fe.png b/static/images/composer-emoji/apple/1f3c3-1f3fe.png
new file mode 100644
index 0000000000..56bba27425
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3-1f3ff.png b/static/images/composer-emoji/apple/1f3c3-1f3ff.png
new file mode 100644
index 0000000000..db8c0b2955
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f3c3.png b/static/images/composer-emoji/apple/1f3c3.png
new file mode 100644
index 0000000000..c564a25ca1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c3.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4-1f3fb.png b/static/images/composer-emoji/apple/1f3c4-1f3fb.png
new file mode 100644
index 0000000000..b4e51c7930
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4-1f3fc.png b/static/images/composer-emoji/apple/1f3c4-1f3fc.png
new file mode 100644
index 0000000000..f4807c7abe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4-1f3fd.png b/static/images/composer-emoji/apple/1f3c4-1f3fd.png
new file mode 100644
index 0000000000..6474fb7c82
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4-1f3fe.png b/static/images/composer-emoji/apple/1f3c4-1f3fe.png
new file mode 100644
index 0000000000..6131a5acee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4-1f3ff.png b/static/images/composer-emoji/apple/1f3c4-1f3ff.png
new file mode 100644
index 0000000000..3d206fcf64
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f3c4.png b/static/images/composer-emoji/apple/1f3c4.png
new file mode 100644
index 0000000000..021cdea662
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c4.png differ
diff --git a/static/images/composer-emoji/apple/1f3c5.png b/static/images/composer-emoji/apple/1f3c5.png
new file mode 100644
index 0000000000..a5302f4e2c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c5.png differ
diff --git a/static/images/composer-emoji/apple/1f3c6.png b/static/images/composer-emoji/apple/1f3c6.png
new file mode 100644
index 0000000000..274245e87d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c6.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7-1f3fb.png b/static/images/composer-emoji/apple/1f3c7-1f3fb.png
new file mode 100644
index 0000000000..304e9b6e1f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7-1f3fc.png b/static/images/composer-emoji/apple/1f3c7-1f3fc.png
new file mode 100644
index 0000000000..4f08d57674
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7-1f3fd.png b/static/images/composer-emoji/apple/1f3c7-1f3fd.png
new file mode 100644
index 0000000000..538b21da56
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7-1f3fe.png b/static/images/composer-emoji/apple/1f3c7-1f3fe.png
new file mode 100644
index 0000000000..8473aead0f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7-1f3ff.png b/static/images/composer-emoji/apple/1f3c7-1f3ff.png
new file mode 100644
index 0000000000..cbc7538265
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f3c7.png b/static/images/composer-emoji/apple/1f3c7.png
new file mode 100644
index 0000000000..680584d1a5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c7.png differ
diff --git a/static/images/composer-emoji/apple/1f3c8.png b/static/images/composer-emoji/apple/1f3c8.png
new file mode 100644
index 0000000000..34c6308083
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c8.png differ
diff --git a/static/images/composer-emoji/apple/1f3c9.png b/static/images/composer-emoji/apple/1f3c9.png
new file mode 100644
index 0000000000..47359261ad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3c9.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca-1f3fb.png b/static/images/composer-emoji/apple/1f3ca-1f3fb.png
new file mode 100644
index 0000000000..b1187c4c8f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca-1f3fc.png b/static/images/composer-emoji/apple/1f3ca-1f3fc.png
new file mode 100644
index 0000000000..f8c7d292e2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca-1f3fd.png b/static/images/composer-emoji/apple/1f3ca-1f3fd.png
new file mode 100644
index 0000000000..40eccb4b37
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca-1f3fe.png b/static/images/composer-emoji/apple/1f3ca-1f3fe.png
new file mode 100644
index 0000000000..1f71fe0645
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca-1f3ff.png b/static/images/composer-emoji/apple/1f3ca-1f3ff.png
new file mode 100644
index 0000000000..7cea3e4b78
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f3ca.png b/static/images/composer-emoji/apple/1f3ca.png
new file mode 100644
index 0000000000..77e58b776a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ca.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb-1f3fb.png b/static/images/composer-emoji/apple/1f3cb-1f3fb.png
new file mode 100644
index 0000000000..5252cd2cf7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb-1f3fc.png b/static/images/composer-emoji/apple/1f3cb-1f3fc.png
new file mode 100644
index 0000000000..99a2b3b6bf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb-1f3fd.png b/static/images/composer-emoji/apple/1f3cb-1f3fd.png
new file mode 100644
index 0000000000..73b590d91e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb-1f3fe.png b/static/images/composer-emoji/apple/1f3cb-1f3fe.png
new file mode 100644
index 0000000000..0c11eb9df6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb-1f3ff.png b/static/images/composer-emoji/apple/1f3cb-1f3ff.png
new file mode 100644
index 0000000000..e150da8b06
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f3cb.png b/static/images/composer-emoji/apple/1f3cb.png
new file mode 100644
index 0000000000..cee5e50a2d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cb.png differ
diff --git a/static/images/composer-emoji/apple/1f3cc.png b/static/images/composer-emoji/apple/1f3cc.png
new file mode 100644
index 0000000000..cee40f025e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cc.png differ
diff --git a/static/images/composer-emoji/apple/1f3cd.png b/static/images/composer-emoji/apple/1f3cd.png
new file mode 100644
index 0000000000..e1f2480bf7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cd.png differ
diff --git a/static/images/composer-emoji/apple/1f3ce.png b/static/images/composer-emoji/apple/1f3ce.png
new file mode 100644
index 0000000000..3b7dc98ae0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ce.png differ
diff --git a/static/images/composer-emoji/apple/1f3cf.png b/static/images/composer-emoji/apple/1f3cf.png
new file mode 100644
index 0000000000..5986babd28
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3cf.png differ
diff --git a/static/images/composer-emoji/apple/1f3d0.png b/static/images/composer-emoji/apple/1f3d0.png
new file mode 100644
index 0000000000..a883265d8e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d0.png differ
diff --git a/static/images/composer-emoji/apple/1f3d1.png b/static/images/composer-emoji/apple/1f3d1.png
new file mode 100644
index 0000000000..77a95c65d6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d1.png differ
diff --git a/static/images/composer-emoji/apple/1f3d2.png b/static/images/composer-emoji/apple/1f3d2.png
new file mode 100644
index 0000000000..903084570b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d2.png differ
diff --git a/static/images/composer-emoji/apple/1f3d3.png b/static/images/composer-emoji/apple/1f3d3.png
new file mode 100644
index 0000000000..734482434f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d3.png differ
diff --git a/static/images/composer-emoji/apple/1f3d4.png b/static/images/composer-emoji/apple/1f3d4.png
new file mode 100644
index 0000000000..2490cea66e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d4.png differ
diff --git a/static/images/composer-emoji/apple/1f3d5.png b/static/images/composer-emoji/apple/1f3d5.png
new file mode 100644
index 0000000000..df748b4270
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d5.png differ
diff --git a/static/images/composer-emoji/apple/1f3d6.png b/static/images/composer-emoji/apple/1f3d6.png
new file mode 100644
index 0000000000..49880471eb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d6.png differ
diff --git a/static/images/composer-emoji/apple/1f3d7.png b/static/images/composer-emoji/apple/1f3d7.png
new file mode 100644
index 0000000000..dbcae3d158
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d7.png differ
diff --git a/static/images/composer-emoji/apple/1f3d8.png b/static/images/composer-emoji/apple/1f3d8.png
new file mode 100644
index 0000000000..7ea71b3e76
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d8.png differ
diff --git a/static/images/composer-emoji/apple/1f3d9.png b/static/images/composer-emoji/apple/1f3d9.png
new file mode 100644
index 0000000000..461d5788ed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3d9.png differ
diff --git a/static/images/composer-emoji/apple/1f3da.png b/static/images/composer-emoji/apple/1f3da.png
new file mode 100644
index 0000000000..eb71bae414
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3da.png differ
diff --git a/static/images/composer-emoji/apple/1f3db.png b/static/images/composer-emoji/apple/1f3db.png
new file mode 100644
index 0000000000..e07d34bbca
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3db.png differ
diff --git a/static/images/composer-emoji/apple/1f3dc.png b/static/images/composer-emoji/apple/1f3dc.png
new file mode 100644
index 0000000000..f74f3bff7c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3dc.png differ
diff --git a/static/images/composer-emoji/apple/1f3dd.png b/static/images/composer-emoji/apple/1f3dd.png
new file mode 100644
index 0000000000..11936e3f80
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3dd.png differ
diff --git a/static/images/composer-emoji/apple/1f3de.png b/static/images/composer-emoji/apple/1f3de.png
new file mode 100644
index 0000000000..bb81db87f8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3de.png differ
diff --git a/static/images/composer-emoji/apple/1f3df.png b/static/images/composer-emoji/apple/1f3df.png
new file mode 100644
index 0000000000..707494f3e7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3df.png differ
diff --git a/static/images/composer-emoji/apple/1f3e0.png b/static/images/composer-emoji/apple/1f3e0.png
new file mode 100644
index 0000000000..e4aab47166
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e0.png differ
diff --git a/static/images/composer-emoji/apple/1f3e1.png b/static/images/composer-emoji/apple/1f3e1.png
new file mode 100644
index 0000000000..738541b055
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e1.png differ
diff --git a/static/images/composer-emoji/apple/1f3e2.png b/static/images/composer-emoji/apple/1f3e2.png
new file mode 100644
index 0000000000..34bf8c93b6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e2.png differ
diff --git a/static/images/composer-emoji/apple/1f3e3.png b/static/images/composer-emoji/apple/1f3e3.png
new file mode 100644
index 0000000000..8099b97db6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e3.png differ
diff --git a/static/images/composer-emoji/apple/1f3e4.png b/static/images/composer-emoji/apple/1f3e4.png
new file mode 100644
index 0000000000..fc056bf6cd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e4.png differ
diff --git a/static/images/composer-emoji/apple/1f3e5.png b/static/images/composer-emoji/apple/1f3e5.png
new file mode 100644
index 0000000000..84d2ccf969
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e5.png differ
diff --git a/static/images/composer-emoji/apple/1f3e6.png b/static/images/composer-emoji/apple/1f3e6.png
new file mode 100644
index 0000000000..11a5cf4169
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e6.png differ
diff --git a/static/images/composer-emoji/apple/1f3e7.png b/static/images/composer-emoji/apple/1f3e7.png
new file mode 100644
index 0000000000..e6942f2902
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e7.png differ
diff --git a/static/images/composer-emoji/apple/1f3e8.png b/static/images/composer-emoji/apple/1f3e8.png
new file mode 100644
index 0000000000..4f98ec85a7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e8.png differ
diff --git a/static/images/composer-emoji/apple/1f3e9.png b/static/images/composer-emoji/apple/1f3e9.png
new file mode 100644
index 0000000000..df4c72e37d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3e9.png differ
diff --git a/static/images/composer-emoji/apple/1f3ea.png b/static/images/composer-emoji/apple/1f3ea.png
new file mode 100644
index 0000000000..950ed76db1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ea.png differ
diff --git a/static/images/composer-emoji/apple/1f3eb.png b/static/images/composer-emoji/apple/1f3eb.png
new file mode 100644
index 0000000000..8f10e73e2f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3eb.png differ
diff --git a/static/images/composer-emoji/apple/1f3ec.png b/static/images/composer-emoji/apple/1f3ec.png
new file mode 100644
index 0000000000..7ae311ce57
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ec.png differ
diff --git a/static/images/composer-emoji/apple/1f3ed.png b/static/images/composer-emoji/apple/1f3ed.png
new file mode 100644
index 0000000000..b7eae33dfb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ed.png differ
diff --git a/static/images/composer-emoji/apple/1f3ee.png b/static/images/composer-emoji/apple/1f3ee.png
new file mode 100644
index 0000000000..63abc2c3d0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ee.png differ
diff --git a/static/images/composer-emoji/apple/1f3ef.png b/static/images/composer-emoji/apple/1f3ef.png
new file mode 100644
index 0000000000..66fad24291
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ef.png differ
diff --git a/static/images/composer-emoji/apple/1f3f0.png b/static/images/composer-emoji/apple/1f3f0.png
new file mode 100644
index 0000000000..424c437071
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f0.png differ
diff --git a/static/images/composer-emoji/apple/1f3f3.png b/static/images/composer-emoji/apple/1f3f3.png
new file mode 100644
index 0000000000..3fefdb2354
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f3.png differ
diff --git a/static/images/composer-emoji/apple/1f3f4.png b/static/images/composer-emoji/apple/1f3f4.png
new file mode 100644
index 0000000000..691805a412
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f4.png differ
diff --git a/static/images/composer-emoji/apple/1f3f5.png b/static/images/composer-emoji/apple/1f3f5.png
new file mode 100644
index 0000000000..1d3c7801ff
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f5.png differ
diff --git a/static/images/composer-emoji/apple/1f3f7.png b/static/images/composer-emoji/apple/1f3f7.png
new file mode 100644
index 0000000000..7960a52d14
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f7.png differ
diff --git a/static/images/composer-emoji/apple/1f3f8.png b/static/images/composer-emoji/apple/1f3f8.png
new file mode 100644
index 0000000000..23ad2803c2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f8.png differ
diff --git a/static/images/composer-emoji/apple/1f3f9.png b/static/images/composer-emoji/apple/1f3f9.png
new file mode 100644
index 0000000000..52531d6a5e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3f9.png differ
diff --git a/static/images/composer-emoji/apple/1f3fa.png b/static/images/composer-emoji/apple/1f3fa.png
new file mode 100644
index 0000000000..46a3db00ed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3fa.png differ
diff --git a/static/images/composer-emoji/apple/1f3fb.png b/static/images/composer-emoji/apple/1f3fb.png
new file mode 100644
index 0000000000..85ba398658
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f3fc.png b/static/images/composer-emoji/apple/1f3fc.png
new file mode 100644
index 0000000000..62eb123865
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f3fd.png b/static/images/composer-emoji/apple/1f3fd.png
new file mode 100644
index 0000000000..a074250888
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f3fe.png b/static/images/composer-emoji/apple/1f3fe.png
new file mode 100644
index 0000000000..2c2e797c7c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f3ff.png b/static/images/composer-emoji/apple/1f3ff.png
new file mode 100644
index 0000000000..b4b588900e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f400.png b/static/images/composer-emoji/apple/1f400.png
new file mode 100644
index 0000000000..f617b1c368
Binary files /dev/null and b/static/images/composer-emoji/apple/1f400.png differ
diff --git a/static/images/composer-emoji/apple/1f401.png b/static/images/composer-emoji/apple/1f401.png
new file mode 100644
index 0000000000..48a8cec1c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f401.png differ
diff --git a/static/images/composer-emoji/apple/1f402.png b/static/images/composer-emoji/apple/1f402.png
new file mode 100644
index 0000000000..ae9e3971f8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f402.png differ
diff --git a/static/images/composer-emoji/apple/1f403.png b/static/images/composer-emoji/apple/1f403.png
new file mode 100644
index 0000000000..22c94f6244
Binary files /dev/null and b/static/images/composer-emoji/apple/1f403.png differ
diff --git a/static/images/composer-emoji/apple/1f404.png b/static/images/composer-emoji/apple/1f404.png
new file mode 100644
index 0000000000..0a2b4ef546
Binary files /dev/null and b/static/images/composer-emoji/apple/1f404.png differ
diff --git a/static/images/composer-emoji/apple/1f405.png b/static/images/composer-emoji/apple/1f405.png
new file mode 100644
index 0000000000..1eb1591152
Binary files /dev/null and b/static/images/composer-emoji/apple/1f405.png differ
diff --git a/static/images/composer-emoji/apple/1f406.png b/static/images/composer-emoji/apple/1f406.png
new file mode 100644
index 0000000000..18af499efd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f406.png differ
diff --git a/static/images/composer-emoji/apple/1f407.png b/static/images/composer-emoji/apple/1f407.png
new file mode 100644
index 0000000000..f11452046f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f407.png differ
diff --git a/static/images/composer-emoji/apple/1f408.png b/static/images/composer-emoji/apple/1f408.png
new file mode 100644
index 0000000000..96e1f4a7dc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f408.png differ
diff --git a/static/images/composer-emoji/apple/1f409.png b/static/images/composer-emoji/apple/1f409.png
new file mode 100644
index 0000000000..b5987e39e8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f409.png differ
diff --git a/static/images/composer-emoji/apple/1f40a.png b/static/images/composer-emoji/apple/1f40a.png
new file mode 100644
index 0000000000..fb0b6b3b5c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40a.png differ
diff --git a/static/images/composer-emoji/apple/1f40b.png b/static/images/composer-emoji/apple/1f40b.png
new file mode 100644
index 0000000000..daf50bfd0e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40b.png differ
diff --git a/static/images/composer-emoji/apple/1f40c.png b/static/images/composer-emoji/apple/1f40c.png
new file mode 100644
index 0000000000..e496255a0c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40c.png differ
diff --git a/static/images/composer-emoji/apple/1f40d.png b/static/images/composer-emoji/apple/1f40d.png
new file mode 100644
index 0000000000..1dc8069d11
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40d.png differ
diff --git a/static/images/composer-emoji/apple/1f40e.png b/static/images/composer-emoji/apple/1f40e.png
new file mode 100644
index 0000000000..377adc4e5d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40e.png differ
diff --git a/static/images/composer-emoji/apple/1f40f.png b/static/images/composer-emoji/apple/1f40f.png
new file mode 100644
index 0000000000..4c01bbd13c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f40f.png differ
diff --git a/static/images/composer-emoji/apple/1f410.png b/static/images/composer-emoji/apple/1f410.png
new file mode 100644
index 0000000000..a965eca01a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f410.png differ
diff --git a/static/images/composer-emoji/apple/1f411.png b/static/images/composer-emoji/apple/1f411.png
new file mode 100644
index 0000000000..8d1c3bc539
Binary files /dev/null and b/static/images/composer-emoji/apple/1f411.png differ
diff --git a/static/images/composer-emoji/apple/1f412.png b/static/images/composer-emoji/apple/1f412.png
new file mode 100644
index 0000000000..0b5553327a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f412.png differ
diff --git a/static/images/composer-emoji/apple/1f413.png b/static/images/composer-emoji/apple/1f413.png
new file mode 100644
index 0000000000..26154787b6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f413.png differ
diff --git a/static/images/composer-emoji/apple/1f414.png b/static/images/composer-emoji/apple/1f414.png
new file mode 100644
index 0000000000..ebb0201330
Binary files /dev/null and b/static/images/composer-emoji/apple/1f414.png differ
diff --git a/static/images/composer-emoji/apple/1f415.png b/static/images/composer-emoji/apple/1f415.png
new file mode 100644
index 0000000000..db010c7632
Binary files /dev/null and b/static/images/composer-emoji/apple/1f415.png differ
diff --git a/static/images/composer-emoji/apple/1f416.png b/static/images/composer-emoji/apple/1f416.png
new file mode 100644
index 0000000000..684b5b1148
Binary files /dev/null and b/static/images/composer-emoji/apple/1f416.png differ
diff --git a/static/images/composer-emoji/apple/1f417.png b/static/images/composer-emoji/apple/1f417.png
new file mode 100644
index 0000000000..f2a7a0d92f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f417.png differ
diff --git a/static/images/composer-emoji/apple/1f418.png b/static/images/composer-emoji/apple/1f418.png
new file mode 100644
index 0000000000..3ed8e6e683
Binary files /dev/null and b/static/images/composer-emoji/apple/1f418.png differ
diff --git a/static/images/composer-emoji/apple/1f419.png b/static/images/composer-emoji/apple/1f419.png
new file mode 100644
index 0000000000..d444afa71f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f419.png differ
diff --git a/static/images/composer-emoji/apple/1f41a.png b/static/images/composer-emoji/apple/1f41a.png
new file mode 100644
index 0000000000..7ba06c4012
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41a.png differ
diff --git a/static/images/composer-emoji/apple/1f41b.png b/static/images/composer-emoji/apple/1f41b.png
new file mode 100644
index 0000000000..bb7fdf1ea5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41b.png differ
diff --git a/static/images/composer-emoji/apple/1f41c.png b/static/images/composer-emoji/apple/1f41c.png
new file mode 100644
index 0000000000..9fbed3cbeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41c.png differ
diff --git a/static/images/composer-emoji/apple/1f41d.png b/static/images/composer-emoji/apple/1f41d.png
new file mode 100644
index 0000000000..1b495208a9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41d.png differ
diff --git a/static/images/composer-emoji/apple/1f41e.png b/static/images/composer-emoji/apple/1f41e.png
new file mode 100644
index 0000000000..111b8a582b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41e.png differ
diff --git a/static/images/composer-emoji/apple/1f41f.png b/static/images/composer-emoji/apple/1f41f.png
new file mode 100644
index 0000000000..dc66380412
Binary files /dev/null and b/static/images/composer-emoji/apple/1f41f.png differ
diff --git a/static/images/composer-emoji/apple/1f420.png b/static/images/composer-emoji/apple/1f420.png
new file mode 100644
index 0000000000..382cff6d88
Binary files /dev/null and b/static/images/composer-emoji/apple/1f420.png differ
diff --git a/static/images/composer-emoji/apple/1f421.png b/static/images/composer-emoji/apple/1f421.png
new file mode 100644
index 0000000000..19b9991c8a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f421.png differ
diff --git a/static/images/composer-emoji/apple/1f422.png b/static/images/composer-emoji/apple/1f422.png
new file mode 100644
index 0000000000..f37ea2689a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f422.png differ
diff --git a/static/images/composer-emoji/apple/1f423.png b/static/images/composer-emoji/apple/1f423.png
new file mode 100644
index 0000000000..166d600f49
Binary files /dev/null and b/static/images/composer-emoji/apple/1f423.png differ
diff --git a/static/images/composer-emoji/apple/1f424.png b/static/images/composer-emoji/apple/1f424.png
new file mode 100644
index 0000000000..70027a0989
Binary files /dev/null and b/static/images/composer-emoji/apple/1f424.png differ
diff --git a/static/images/composer-emoji/apple/1f425.png b/static/images/composer-emoji/apple/1f425.png
new file mode 100644
index 0000000000..c27d55395b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f425.png differ
diff --git a/static/images/composer-emoji/apple/1f426.png b/static/images/composer-emoji/apple/1f426.png
new file mode 100644
index 0000000000..3b1c46971e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f426.png differ
diff --git a/static/images/composer-emoji/apple/1f427.png b/static/images/composer-emoji/apple/1f427.png
new file mode 100644
index 0000000000..134cf40824
Binary files /dev/null and b/static/images/composer-emoji/apple/1f427.png differ
diff --git a/static/images/composer-emoji/apple/1f428.png b/static/images/composer-emoji/apple/1f428.png
new file mode 100644
index 0000000000..5509e55a92
Binary files /dev/null and b/static/images/composer-emoji/apple/1f428.png differ
diff --git a/static/images/composer-emoji/apple/1f429.png b/static/images/composer-emoji/apple/1f429.png
new file mode 100644
index 0000000000..c0136ecdb7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f429.png differ
diff --git a/static/images/composer-emoji/apple/1f42a.png b/static/images/composer-emoji/apple/1f42a.png
new file mode 100644
index 0000000000..22a734c1e5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42a.png differ
diff --git a/static/images/composer-emoji/apple/1f42b.png b/static/images/composer-emoji/apple/1f42b.png
new file mode 100644
index 0000000000..cef230e849
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42b.png differ
diff --git a/static/images/composer-emoji/apple/1f42c.png b/static/images/composer-emoji/apple/1f42c.png
new file mode 100644
index 0000000000..5443656f00
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42c.png differ
diff --git a/static/images/composer-emoji/apple/1f42d.png b/static/images/composer-emoji/apple/1f42d.png
new file mode 100644
index 0000000000..8e0d88e30f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42d.png differ
diff --git a/static/images/composer-emoji/apple/1f42e.png b/static/images/composer-emoji/apple/1f42e.png
new file mode 100644
index 0000000000..9725d99f66
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42e.png differ
diff --git a/static/images/composer-emoji/apple/1f42f.png b/static/images/composer-emoji/apple/1f42f.png
new file mode 100644
index 0000000000..0448e1ca95
Binary files /dev/null and b/static/images/composer-emoji/apple/1f42f.png differ
diff --git a/static/images/composer-emoji/apple/1f430.png b/static/images/composer-emoji/apple/1f430.png
new file mode 100644
index 0000000000..b57a1542a8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f430.png differ
diff --git a/static/images/composer-emoji/apple/1f431.png b/static/images/composer-emoji/apple/1f431.png
new file mode 100644
index 0000000000..f794f945a0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f431.png differ
diff --git a/static/images/composer-emoji/apple/1f432.png b/static/images/composer-emoji/apple/1f432.png
new file mode 100644
index 0000000000..710d4cfe63
Binary files /dev/null and b/static/images/composer-emoji/apple/1f432.png differ
diff --git a/static/images/composer-emoji/apple/1f433.png b/static/images/composer-emoji/apple/1f433.png
new file mode 100644
index 0000000000..0cd686f052
Binary files /dev/null and b/static/images/composer-emoji/apple/1f433.png differ
diff --git a/static/images/composer-emoji/apple/1f434.png b/static/images/composer-emoji/apple/1f434.png
new file mode 100644
index 0000000000..c354067f9b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f434.png differ
diff --git a/static/images/composer-emoji/apple/1f435.png b/static/images/composer-emoji/apple/1f435.png
new file mode 100644
index 0000000000..5974b73751
Binary files /dev/null and b/static/images/composer-emoji/apple/1f435.png differ
diff --git a/static/images/composer-emoji/apple/1f436.png b/static/images/composer-emoji/apple/1f436.png
new file mode 100644
index 0000000000..284d3a40cf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f436.png differ
diff --git a/static/images/composer-emoji/apple/1f437.png b/static/images/composer-emoji/apple/1f437.png
new file mode 100644
index 0000000000..e593aedcca
Binary files /dev/null and b/static/images/composer-emoji/apple/1f437.png differ
diff --git a/static/images/composer-emoji/apple/1f438.png b/static/images/composer-emoji/apple/1f438.png
new file mode 100644
index 0000000000..03dd63afeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f438.png differ
diff --git a/static/images/composer-emoji/apple/1f439.png b/static/images/composer-emoji/apple/1f439.png
new file mode 100644
index 0000000000..f479c4e38b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f439.png differ
diff --git a/static/images/composer-emoji/apple/1f43a.png b/static/images/composer-emoji/apple/1f43a.png
new file mode 100644
index 0000000000..7ae4f5860e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43a.png differ
diff --git a/static/images/composer-emoji/apple/1f43b.png b/static/images/composer-emoji/apple/1f43b.png
new file mode 100644
index 0000000000..9bdb586900
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43b.png differ
diff --git a/static/images/composer-emoji/apple/1f43c.png b/static/images/composer-emoji/apple/1f43c.png
new file mode 100644
index 0000000000..254c364df2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43c.png differ
diff --git a/static/images/composer-emoji/apple/1f43d.png b/static/images/composer-emoji/apple/1f43d.png
new file mode 100644
index 0000000000..e4db8b0690
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43d.png differ
diff --git a/static/images/composer-emoji/apple/1f43e.png b/static/images/composer-emoji/apple/1f43e.png
new file mode 100644
index 0000000000..f9faa05285
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43e.png differ
diff --git a/static/images/composer-emoji/apple/1f43f.png b/static/images/composer-emoji/apple/1f43f.png
new file mode 100644
index 0000000000..7e0e9e6f93
Binary files /dev/null and b/static/images/composer-emoji/apple/1f43f.png differ
diff --git a/static/images/composer-emoji/apple/1f440.png b/static/images/composer-emoji/apple/1f440.png
new file mode 100644
index 0000000000..b21ab70189
Binary files /dev/null and b/static/images/composer-emoji/apple/1f440.png differ
diff --git a/static/images/composer-emoji/apple/1f441.png b/static/images/composer-emoji/apple/1f441.png
new file mode 100644
index 0000000000..08b0bee135
Binary files /dev/null and b/static/images/composer-emoji/apple/1f441.png differ
diff --git a/static/images/composer-emoji/apple/1f442-1f3fb.png b/static/images/composer-emoji/apple/1f442-1f3fb.png
new file mode 100644
index 0000000000..a07d967937
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f442-1f3fc.png b/static/images/composer-emoji/apple/1f442-1f3fc.png
new file mode 100644
index 0000000000..621b61b409
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f442-1f3fd.png b/static/images/composer-emoji/apple/1f442-1f3fd.png
new file mode 100644
index 0000000000..2847303a44
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f442-1f3fe.png b/static/images/composer-emoji/apple/1f442-1f3fe.png
new file mode 100644
index 0000000000..924ed4d599
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f442-1f3ff.png b/static/images/composer-emoji/apple/1f442-1f3ff.png
new file mode 100644
index 0000000000..54b6e424bb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f442.png b/static/images/composer-emoji/apple/1f442.png
new file mode 100644
index 0000000000..c42b43d392
Binary files /dev/null and b/static/images/composer-emoji/apple/1f442.png differ
diff --git a/static/images/composer-emoji/apple/1f443-1f3fb.png b/static/images/composer-emoji/apple/1f443-1f3fb.png
new file mode 100644
index 0000000000..1804da10ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f443-1f3fc.png b/static/images/composer-emoji/apple/1f443-1f3fc.png
new file mode 100644
index 0000000000..dcb9287beb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f443-1f3fd.png b/static/images/composer-emoji/apple/1f443-1f3fd.png
new file mode 100644
index 0000000000..0d08cbdc90
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f443-1f3fe.png b/static/images/composer-emoji/apple/1f443-1f3fe.png
new file mode 100644
index 0000000000..63eb67dc43
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f443-1f3ff.png b/static/images/composer-emoji/apple/1f443-1f3ff.png
new file mode 100644
index 0000000000..857b5d46fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f443.png b/static/images/composer-emoji/apple/1f443.png
new file mode 100644
index 0000000000..754c2f5c55
Binary files /dev/null and b/static/images/composer-emoji/apple/1f443.png differ
diff --git a/static/images/composer-emoji/apple/1f444.png b/static/images/composer-emoji/apple/1f444.png
new file mode 100644
index 0000000000..9746b98c77
Binary files /dev/null and b/static/images/composer-emoji/apple/1f444.png differ
diff --git a/static/images/composer-emoji/apple/1f445.png b/static/images/composer-emoji/apple/1f445.png
new file mode 100644
index 0000000000..7bfff35185
Binary files /dev/null and b/static/images/composer-emoji/apple/1f445.png differ
diff --git a/static/images/composer-emoji/apple/1f446-1f3fb.png b/static/images/composer-emoji/apple/1f446-1f3fb.png
new file mode 100644
index 0000000000..d14b392342
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f446-1f3fc.png b/static/images/composer-emoji/apple/1f446-1f3fc.png
new file mode 100644
index 0000000000..a173acb543
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f446-1f3fd.png b/static/images/composer-emoji/apple/1f446-1f3fd.png
new file mode 100644
index 0000000000..0067e64db1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f446-1f3fe.png b/static/images/composer-emoji/apple/1f446-1f3fe.png
new file mode 100644
index 0000000000..fee5047e26
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f446-1f3ff.png b/static/images/composer-emoji/apple/1f446-1f3ff.png
new file mode 100644
index 0000000000..861e6d3f9f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f446.png b/static/images/composer-emoji/apple/1f446.png
new file mode 100644
index 0000000000..6767d56d59
Binary files /dev/null and b/static/images/composer-emoji/apple/1f446.png differ
diff --git a/static/images/composer-emoji/apple/1f447-1f3fb.png b/static/images/composer-emoji/apple/1f447-1f3fb.png
new file mode 100644
index 0000000000..46a0159eb2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f447-1f3fc.png b/static/images/composer-emoji/apple/1f447-1f3fc.png
new file mode 100644
index 0000000000..42f224ddc8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f447-1f3fd.png b/static/images/composer-emoji/apple/1f447-1f3fd.png
new file mode 100644
index 0000000000..5a3cca9a71
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f447-1f3fe.png b/static/images/composer-emoji/apple/1f447-1f3fe.png
new file mode 100644
index 0000000000..8f037493e8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f447-1f3ff.png b/static/images/composer-emoji/apple/1f447-1f3ff.png
new file mode 100644
index 0000000000..f296b580ff
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f447.png b/static/images/composer-emoji/apple/1f447.png
new file mode 100644
index 0000000000..613e9647ba
Binary files /dev/null and b/static/images/composer-emoji/apple/1f447.png differ
diff --git a/static/images/composer-emoji/apple/1f448-1f3fb.png b/static/images/composer-emoji/apple/1f448-1f3fb.png
new file mode 100644
index 0000000000..dbebbf8ae5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f448-1f3fc.png b/static/images/composer-emoji/apple/1f448-1f3fc.png
new file mode 100644
index 0000000000..000b851c9a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f448-1f3fd.png b/static/images/composer-emoji/apple/1f448-1f3fd.png
new file mode 100644
index 0000000000..ef9ac7eedb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f448-1f3fe.png b/static/images/composer-emoji/apple/1f448-1f3fe.png
new file mode 100644
index 0000000000..8adf1cd050
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f448-1f3ff.png b/static/images/composer-emoji/apple/1f448-1f3ff.png
new file mode 100644
index 0000000000..8d7796109d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f448.png b/static/images/composer-emoji/apple/1f448.png
new file mode 100644
index 0000000000..ab66000e29
Binary files /dev/null and b/static/images/composer-emoji/apple/1f448.png differ
diff --git a/static/images/composer-emoji/apple/1f449-1f3fb.png b/static/images/composer-emoji/apple/1f449-1f3fb.png
new file mode 100644
index 0000000000..560130d753
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f449-1f3fc.png b/static/images/composer-emoji/apple/1f449-1f3fc.png
new file mode 100644
index 0000000000..a0070af303
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f449-1f3fd.png b/static/images/composer-emoji/apple/1f449-1f3fd.png
new file mode 100644
index 0000000000..07944f6575
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f449-1f3fe.png b/static/images/composer-emoji/apple/1f449-1f3fe.png
new file mode 100644
index 0000000000..cb328820fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f449-1f3ff.png b/static/images/composer-emoji/apple/1f449-1f3ff.png
new file mode 100644
index 0000000000..562193167f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f449.png b/static/images/composer-emoji/apple/1f449.png
new file mode 100644
index 0000000000..ae93bd2e41
Binary files /dev/null and b/static/images/composer-emoji/apple/1f449.png differ
diff --git a/static/images/composer-emoji/apple/1f44a-1f3fb.png b/static/images/composer-emoji/apple/1f44a-1f3fb.png
new file mode 100644
index 0000000000..c51febe1e1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44a-1f3fc.png b/static/images/composer-emoji/apple/1f44a-1f3fc.png
new file mode 100644
index 0000000000..8df19dc98a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44a-1f3fd.png b/static/images/composer-emoji/apple/1f44a-1f3fd.png
new file mode 100644
index 0000000000..a597a9b05c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44a-1f3fe.png b/static/images/composer-emoji/apple/1f44a-1f3fe.png
new file mode 100644
index 0000000000..ff746e8f3b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44a-1f3ff.png b/static/images/composer-emoji/apple/1f44a-1f3ff.png
new file mode 100644
index 0000000000..37e8adfb1a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44a.png b/static/images/composer-emoji/apple/1f44a.png
new file mode 100644
index 0000000000..cb9b15dfe9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44a.png differ
diff --git a/static/images/composer-emoji/apple/1f44b-1f3fb.png b/static/images/composer-emoji/apple/1f44b-1f3fb.png
new file mode 100644
index 0000000000..76d46503a1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44b-1f3fc.png b/static/images/composer-emoji/apple/1f44b-1f3fc.png
new file mode 100644
index 0000000000..5f87aad517
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44b-1f3fd.png b/static/images/composer-emoji/apple/1f44b-1f3fd.png
new file mode 100644
index 0000000000..22348436b0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44b-1f3fe.png b/static/images/composer-emoji/apple/1f44b-1f3fe.png
new file mode 100644
index 0000000000..e2fabec910
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44b-1f3ff.png b/static/images/composer-emoji/apple/1f44b-1f3ff.png
new file mode 100644
index 0000000000..fb95f4667d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44b.png b/static/images/composer-emoji/apple/1f44b.png
new file mode 100644
index 0000000000..328bbb0dcf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44b.png differ
diff --git a/static/images/composer-emoji/apple/1f44c-1f3fb.png b/static/images/composer-emoji/apple/1f44c-1f3fb.png
new file mode 100644
index 0000000000..2aaf40a09e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44c-1f3fc.png b/static/images/composer-emoji/apple/1f44c-1f3fc.png
new file mode 100644
index 0000000000..c179325e2b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44c-1f3fd.png b/static/images/composer-emoji/apple/1f44c-1f3fd.png
new file mode 100644
index 0000000000..ee8f4fca11
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44c-1f3fe.png b/static/images/composer-emoji/apple/1f44c-1f3fe.png
new file mode 100644
index 0000000000..458ec5c83f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44c-1f3ff.png b/static/images/composer-emoji/apple/1f44c-1f3ff.png
new file mode 100644
index 0000000000..5d7acd6db7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44c.png b/static/images/composer-emoji/apple/1f44c.png
new file mode 100644
index 0000000000..f67d27fe20
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44c.png differ
diff --git a/static/images/composer-emoji/apple/1f44d-1f3fb.png b/static/images/composer-emoji/apple/1f44d-1f3fb.png
new file mode 100644
index 0000000000..49f7da37e0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44d-1f3fc.png b/static/images/composer-emoji/apple/1f44d-1f3fc.png
new file mode 100644
index 0000000000..16ff439111
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44d-1f3fd.png b/static/images/composer-emoji/apple/1f44d-1f3fd.png
new file mode 100644
index 0000000000..11d68af821
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44d-1f3fe.png b/static/images/composer-emoji/apple/1f44d-1f3fe.png
new file mode 100644
index 0000000000..bf139344b0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44d-1f3ff.png b/static/images/composer-emoji/apple/1f44d-1f3ff.png
new file mode 100644
index 0000000000..8b7b316fbc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44d.png b/static/images/composer-emoji/apple/1f44d.png
new file mode 100644
index 0000000000..9f53f6fbcc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44d.png differ
diff --git a/static/images/composer-emoji/apple/1f44e-1f3fb.png b/static/images/composer-emoji/apple/1f44e-1f3fb.png
new file mode 100644
index 0000000000..6188c2286d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44e-1f3fc.png b/static/images/composer-emoji/apple/1f44e-1f3fc.png
new file mode 100644
index 0000000000..1c75945de4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44e-1f3fd.png b/static/images/composer-emoji/apple/1f44e-1f3fd.png
new file mode 100644
index 0000000000..dc78417a59
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44e-1f3fe.png b/static/images/composer-emoji/apple/1f44e-1f3fe.png
new file mode 100644
index 0000000000..c04f2eb365
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44e-1f3ff.png b/static/images/composer-emoji/apple/1f44e-1f3ff.png
new file mode 100644
index 0000000000..b70271f70a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44e.png b/static/images/composer-emoji/apple/1f44e.png
new file mode 100644
index 0000000000..610a00ccba
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44e.png differ
diff --git a/static/images/composer-emoji/apple/1f44f-1f3fb.png b/static/images/composer-emoji/apple/1f44f-1f3fb.png
new file mode 100644
index 0000000000..11f4936b27
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f44f-1f3fc.png b/static/images/composer-emoji/apple/1f44f-1f3fc.png
new file mode 100644
index 0000000000..8418759393
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f44f-1f3fd.png b/static/images/composer-emoji/apple/1f44f-1f3fd.png
new file mode 100644
index 0000000000..1a7fc78555
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f44f-1f3fe.png b/static/images/composer-emoji/apple/1f44f-1f3fe.png
new file mode 100644
index 0000000000..2dcf3e8643
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f44f-1f3ff.png b/static/images/composer-emoji/apple/1f44f-1f3ff.png
new file mode 100644
index 0000000000..e202bbb4bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f44f.png b/static/images/composer-emoji/apple/1f44f.png
new file mode 100644
index 0000000000..39e1197331
Binary files /dev/null and b/static/images/composer-emoji/apple/1f44f.png differ
diff --git a/static/images/composer-emoji/apple/1f450-1f3fb.png b/static/images/composer-emoji/apple/1f450-1f3fb.png
new file mode 100644
index 0000000000..ddfb90f780
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f450-1f3fc.png b/static/images/composer-emoji/apple/1f450-1f3fc.png
new file mode 100644
index 0000000000..7894b469bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f450-1f3fd.png b/static/images/composer-emoji/apple/1f450-1f3fd.png
new file mode 100644
index 0000000000..a70e6a2bbd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f450-1f3fe.png b/static/images/composer-emoji/apple/1f450-1f3fe.png
new file mode 100644
index 0000000000..e39e796f28
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f450-1f3ff.png b/static/images/composer-emoji/apple/1f450-1f3ff.png
new file mode 100644
index 0000000000..eedaf69345
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f450.png b/static/images/composer-emoji/apple/1f450.png
new file mode 100644
index 0000000000..9b795d5f84
Binary files /dev/null and b/static/images/composer-emoji/apple/1f450.png differ
diff --git a/static/images/composer-emoji/apple/1f451.png b/static/images/composer-emoji/apple/1f451.png
new file mode 100644
index 0000000000..3ca5e6d6db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f451.png differ
diff --git a/static/images/composer-emoji/apple/1f452.png b/static/images/composer-emoji/apple/1f452.png
new file mode 100644
index 0000000000..7b6a6b7f9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f452.png differ
diff --git a/static/images/composer-emoji/apple/1f453.png b/static/images/composer-emoji/apple/1f453.png
new file mode 100644
index 0000000000..078ecce848
Binary files /dev/null and b/static/images/composer-emoji/apple/1f453.png differ
diff --git a/static/images/composer-emoji/apple/1f454.png b/static/images/composer-emoji/apple/1f454.png
new file mode 100644
index 0000000000..088cc5d8f9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f454.png differ
diff --git a/static/images/composer-emoji/apple/1f455.png b/static/images/composer-emoji/apple/1f455.png
new file mode 100644
index 0000000000..39272780e0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f455.png differ
diff --git a/static/images/composer-emoji/apple/1f456.png b/static/images/composer-emoji/apple/1f456.png
new file mode 100644
index 0000000000..4e81e4f05f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f456.png differ
diff --git a/static/images/composer-emoji/apple/1f457.png b/static/images/composer-emoji/apple/1f457.png
new file mode 100644
index 0000000000..27afc739b7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f457.png differ
diff --git a/static/images/composer-emoji/apple/1f458.png b/static/images/composer-emoji/apple/1f458.png
new file mode 100644
index 0000000000..0b8ca9643d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f458.png differ
diff --git a/static/images/composer-emoji/apple/1f459.png b/static/images/composer-emoji/apple/1f459.png
new file mode 100644
index 0000000000..20c768346b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f459.png differ
diff --git a/static/images/composer-emoji/apple/1f45a.png b/static/images/composer-emoji/apple/1f45a.png
new file mode 100644
index 0000000000..5b5affda66
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45a.png differ
diff --git a/static/images/composer-emoji/apple/1f45b.png b/static/images/composer-emoji/apple/1f45b.png
new file mode 100644
index 0000000000..810a5a25e9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45b.png differ
diff --git a/static/images/composer-emoji/apple/1f45c.png b/static/images/composer-emoji/apple/1f45c.png
new file mode 100644
index 0000000000..5e8de6e24d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45c.png differ
diff --git a/static/images/composer-emoji/apple/1f45d.png b/static/images/composer-emoji/apple/1f45d.png
new file mode 100644
index 0000000000..ec1180c9eb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45d.png differ
diff --git a/static/images/composer-emoji/apple/1f45e.png b/static/images/composer-emoji/apple/1f45e.png
new file mode 100644
index 0000000000..a739ee4255
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45e.png differ
diff --git a/static/images/composer-emoji/apple/1f45f.png b/static/images/composer-emoji/apple/1f45f.png
new file mode 100644
index 0000000000..0d11dbaa5b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f45f.png differ
diff --git a/static/images/composer-emoji/apple/1f460.png b/static/images/composer-emoji/apple/1f460.png
new file mode 100644
index 0000000000..5b8b5a8c65
Binary files /dev/null and b/static/images/composer-emoji/apple/1f460.png differ
diff --git a/static/images/composer-emoji/apple/1f461.png b/static/images/composer-emoji/apple/1f461.png
new file mode 100644
index 0000000000..9030149a01
Binary files /dev/null and b/static/images/composer-emoji/apple/1f461.png differ
diff --git a/static/images/composer-emoji/apple/1f462.png b/static/images/composer-emoji/apple/1f462.png
new file mode 100644
index 0000000000..909a329e4a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f462.png differ
diff --git a/static/images/composer-emoji/apple/1f463.png b/static/images/composer-emoji/apple/1f463.png
new file mode 100644
index 0000000000..3d0f71bd75
Binary files /dev/null and b/static/images/composer-emoji/apple/1f463.png differ
diff --git a/static/images/composer-emoji/apple/1f464.png b/static/images/composer-emoji/apple/1f464.png
new file mode 100644
index 0000000000..485e958df8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f464.png differ
diff --git a/static/images/composer-emoji/apple/1f465.png b/static/images/composer-emoji/apple/1f465.png
new file mode 100644
index 0000000000..9f75b15bb2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f465.png differ
diff --git a/static/images/composer-emoji/apple/1f466-1f3fb.png b/static/images/composer-emoji/apple/1f466-1f3fb.png
new file mode 100644
index 0000000000..8719e1dac9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f466-1f3fc.png b/static/images/composer-emoji/apple/1f466-1f3fc.png
new file mode 100644
index 0000000000..2f93258687
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f466-1f3fd.png b/static/images/composer-emoji/apple/1f466-1f3fd.png
new file mode 100644
index 0000000000..d2f26e33dc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f466-1f3fe.png b/static/images/composer-emoji/apple/1f466-1f3fe.png
new file mode 100644
index 0000000000..8f055712d1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f466-1f3ff.png b/static/images/composer-emoji/apple/1f466-1f3ff.png
new file mode 100644
index 0000000000..943542c851
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f466.png b/static/images/composer-emoji/apple/1f466.png
new file mode 100644
index 0000000000..cc8368d277
Binary files /dev/null and b/static/images/composer-emoji/apple/1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f467-1f3fb.png b/static/images/composer-emoji/apple/1f467-1f3fb.png
new file mode 100644
index 0000000000..f7cb843c43
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f467-1f3fc.png b/static/images/composer-emoji/apple/1f467-1f3fc.png
new file mode 100644
index 0000000000..4aa2494153
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f467-1f3fd.png b/static/images/composer-emoji/apple/1f467-1f3fd.png
new file mode 100644
index 0000000000..f99835465f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f467-1f3fe.png b/static/images/composer-emoji/apple/1f467-1f3fe.png
new file mode 100644
index 0000000000..5ce3039f0b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f467-1f3ff.png b/static/images/composer-emoji/apple/1f467-1f3ff.png
new file mode 100644
index 0000000000..ecb4ba198a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f467.png b/static/images/composer-emoji/apple/1f467.png
new file mode 100644
index 0000000000..bdebda966d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f468-1f3fb.png b/static/images/composer-emoji/apple/1f468-1f3fb.png
new file mode 100644
index 0000000000..c787f9e402
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f468-1f3fc.png b/static/images/composer-emoji/apple/1f468-1f3fc.png
new file mode 100644
index 0000000000..58b1f931dd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f468-1f3fd.png b/static/images/composer-emoji/apple/1f468-1f3fd.png
new file mode 100644
index 0000000000..82fb868b02
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f468-1f3fe.png b/static/images/composer-emoji/apple/1f468-1f3fe.png
new file mode 100644
index 0000000000..471b14d186
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f468-1f3ff.png b/static/images/composer-emoji/apple/1f468-1f3ff.png
new file mode 100644
index 0000000000..cc75cb19c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..5146484935
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466.png
new file mode 100644
index 0000000000..81fb78d9f5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..b88b606de9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f467.png b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..c79c6e3dfa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467.png b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467.png
new file mode 100644
index 0000000000..254b0695ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f468-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..315081965b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466.png
new file mode 100644
index 0000000000..014f73665c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f466.png b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..e4b081e80c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f467.png b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..ff82544e24
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467.png b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467.png
new file mode 100644
index 0000000000..7f3016588b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-1f469-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f468.png b/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f468.png
new file mode 100644
index 0000000000..620c9e0283
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f468.png differ
diff --git a/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png
new file mode 100644
index 0000000000..2cbfc2e557
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png differ
diff --git a/static/images/composer-emoji/apple/1f468.png b/static/images/composer-emoji/apple/1f468.png
new file mode 100644
index 0000000000..ee6e99f18b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f468.png differ
diff --git a/static/images/composer-emoji/apple/1f469-1f3fb.png b/static/images/composer-emoji/apple/1f469-1f3fb.png
new file mode 100644
index 0000000000..a12160dcc3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f469-1f3fc.png b/static/images/composer-emoji/apple/1f469-1f3fc.png
new file mode 100644
index 0000000000..9f21bddfa5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f469-1f3fd.png b/static/images/composer-emoji/apple/1f469-1f3fd.png
new file mode 100644
index 0000000000..14a8e7257e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f469-1f3fe.png b/static/images/composer-emoji/apple/1f469-1f3fe.png
new file mode 100644
index 0000000000..d7c014fb0a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f469-1f3ff.png b/static/images/composer-emoji/apple/1f469-1f3ff.png
new file mode 100644
index 0000000000..b6a5b7417e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466-200d-1f466.png b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..66147c11b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466.png b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466.png
new file mode 100644
index 0000000000..386a31390e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f466.png b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..ac189ae4df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f467.png b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..678f30255f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467.png b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467.png
new file mode 100644
index 0000000000..8a95f0e631
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-1f469-200d-1f467.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f469.png b/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f469.png
new file mode 100644
index 0000000000..772dbac085
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f469.png differ
diff --git a/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png b/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png
new file mode 100644
index 0000000000..967c6f6cc4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png differ
diff --git a/static/images/composer-emoji/apple/1f469.png b/static/images/composer-emoji/apple/1f469.png
new file mode 100644
index 0000000000..cc9d9a6a7c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f469.png differ
diff --git a/static/images/composer-emoji/apple/1f46a.png b/static/images/composer-emoji/apple/1f46a.png
new file mode 100644
index 0000000000..50c07343f0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46a.png differ
diff --git a/static/images/composer-emoji/apple/1f46b.png b/static/images/composer-emoji/apple/1f46b.png
new file mode 100644
index 0000000000..15abaf67b0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46b.png differ
diff --git a/static/images/composer-emoji/apple/1f46c.png b/static/images/composer-emoji/apple/1f46c.png
new file mode 100644
index 0000000000..7f9adf33ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46c.png differ
diff --git a/static/images/composer-emoji/apple/1f46d.png b/static/images/composer-emoji/apple/1f46d.png
new file mode 100644
index 0000000000..7aed4dac66
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46d.png differ
diff --git a/static/images/composer-emoji/apple/1f46e-1f3fb.png b/static/images/composer-emoji/apple/1f46e-1f3fb.png
new file mode 100644
index 0000000000..c8a9a31736
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f46e-1f3fc.png b/static/images/composer-emoji/apple/1f46e-1f3fc.png
new file mode 100644
index 0000000000..2df752afcf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f46e-1f3fd.png b/static/images/composer-emoji/apple/1f46e-1f3fd.png
new file mode 100644
index 0000000000..41539314b1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f46e-1f3fe.png b/static/images/composer-emoji/apple/1f46e-1f3fe.png
new file mode 100644
index 0000000000..f4c8e65046
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f46e-1f3ff.png b/static/images/composer-emoji/apple/1f46e-1f3ff.png
new file mode 100644
index 0000000000..5d8d9d469b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f46e.png b/static/images/composer-emoji/apple/1f46e.png
new file mode 100644
index 0000000000..70c2ca4139
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46e.png differ
diff --git a/static/images/composer-emoji/apple/1f46f.png b/static/images/composer-emoji/apple/1f46f.png
new file mode 100644
index 0000000000..1b7ae3cfac
Binary files /dev/null and b/static/images/composer-emoji/apple/1f46f.png differ
diff --git a/static/images/composer-emoji/apple/1f470-1f3fb.png b/static/images/composer-emoji/apple/1f470-1f3fb.png
new file mode 100644
index 0000000000..7ee6b2dcb6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f470-1f3fc.png b/static/images/composer-emoji/apple/1f470-1f3fc.png
new file mode 100644
index 0000000000..ce9d5f0fd5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f470-1f3fd.png b/static/images/composer-emoji/apple/1f470-1f3fd.png
new file mode 100644
index 0000000000..14b2b98497
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f470-1f3fe.png b/static/images/composer-emoji/apple/1f470-1f3fe.png
new file mode 100644
index 0000000000..bf5f768c77
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f470-1f3ff.png b/static/images/composer-emoji/apple/1f470-1f3ff.png
new file mode 100644
index 0000000000..e4db6db289
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f470.png b/static/images/composer-emoji/apple/1f470.png
new file mode 100644
index 0000000000..252e9099f1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f470.png differ
diff --git a/static/images/composer-emoji/apple/1f471-1f3fb.png b/static/images/composer-emoji/apple/1f471-1f3fb.png
new file mode 100644
index 0000000000..e870c2162f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f471-1f3fc.png b/static/images/composer-emoji/apple/1f471-1f3fc.png
new file mode 100644
index 0000000000..86f194eccc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f471-1f3fd.png b/static/images/composer-emoji/apple/1f471-1f3fd.png
new file mode 100644
index 0000000000..48f2e990ab
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f471-1f3fe.png b/static/images/composer-emoji/apple/1f471-1f3fe.png
new file mode 100644
index 0000000000..9775d11a3d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f471-1f3ff.png b/static/images/composer-emoji/apple/1f471-1f3ff.png
new file mode 100644
index 0000000000..e5663fe8a3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f471.png b/static/images/composer-emoji/apple/1f471.png
new file mode 100644
index 0000000000..6942ad9ab9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f471.png differ
diff --git a/static/images/composer-emoji/apple/1f472-1f3fb.png b/static/images/composer-emoji/apple/1f472-1f3fb.png
new file mode 100644
index 0000000000..c9b923cb11
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f472-1f3fc.png b/static/images/composer-emoji/apple/1f472-1f3fc.png
new file mode 100644
index 0000000000..b937ca8b56
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f472-1f3fd.png b/static/images/composer-emoji/apple/1f472-1f3fd.png
new file mode 100644
index 0000000000..64635e4dce
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f472-1f3fe.png b/static/images/composer-emoji/apple/1f472-1f3fe.png
new file mode 100644
index 0000000000..39c1815814
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f472-1f3ff.png b/static/images/composer-emoji/apple/1f472-1f3ff.png
new file mode 100644
index 0000000000..afe33df38f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f472.png b/static/images/composer-emoji/apple/1f472.png
new file mode 100644
index 0000000000..3c1524d606
Binary files /dev/null and b/static/images/composer-emoji/apple/1f472.png differ
diff --git a/static/images/composer-emoji/apple/1f473-1f3fb.png b/static/images/composer-emoji/apple/1f473-1f3fb.png
new file mode 100644
index 0000000000..f479ec9bfe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f473-1f3fc.png b/static/images/composer-emoji/apple/1f473-1f3fc.png
new file mode 100644
index 0000000000..4849fdd15b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f473-1f3fd.png b/static/images/composer-emoji/apple/1f473-1f3fd.png
new file mode 100644
index 0000000000..47a59d4f89
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f473-1f3fe.png b/static/images/composer-emoji/apple/1f473-1f3fe.png
new file mode 100644
index 0000000000..a1bfffe296
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f473-1f3ff.png b/static/images/composer-emoji/apple/1f473-1f3ff.png
new file mode 100644
index 0000000000..71679f7b9d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f473.png b/static/images/composer-emoji/apple/1f473.png
new file mode 100644
index 0000000000..cc7593c96f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f473.png differ
diff --git a/static/images/composer-emoji/apple/1f474-1f3fb.png b/static/images/composer-emoji/apple/1f474-1f3fb.png
new file mode 100644
index 0000000000..7b9ac52a0e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f474-1f3fc.png b/static/images/composer-emoji/apple/1f474-1f3fc.png
new file mode 100644
index 0000000000..614a1b5776
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f474-1f3fd.png b/static/images/composer-emoji/apple/1f474-1f3fd.png
new file mode 100644
index 0000000000..bd3332b5bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f474-1f3fe.png b/static/images/composer-emoji/apple/1f474-1f3fe.png
new file mode 100644
index 0000000000..db24877c02
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f474-1f3ff.png b/static/images/composer-emoji/apple/1f474-1f3ff.png
new file mode 100644
index 0000000000..817a0be574
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f474.png b/static/images/composer-emoji/apple/1f474.png
new file mode 100644
index 0000000000..96e41a3cc8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f474.png differ
diff --git a/static/images/composer-emoji/apple/1f475-1f3fb.png b/static/images/composer-emoji/apple/1f475-1f3fb.png
new file mode 100644
index 0000000000..f5e865a0b8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f475-1f3fc.png b/static/images/composer-emoji/apple/1f475-1f3fc.png
new file mode 100644
index 0000000000..f3ddc3cfec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f475-1f3fd.png b/static/images/composer-emoji/apple/1f475-1f3fd.png
new file mode 100644
index 0000000000..2f5232b4dd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f475-1f3fe.png b/static/images/composer-emoji/apple/1f475-1f3fe.png
new file mode 100644
index 0000000000..34bf7c39ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f475-1f3ff.png b/static/images/composer-emoji/apple/1f475-1f3ff.png
new file mode 100644
index 0000000000..84c5b2f31a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f475.png b/static/images/composer-emoji/apple/1f475.png
new file mode 100644
index 0000000000..e15d7f3da6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f475.png differ
diff --git a/static/images/composer-emoji/apple/1f476-1f3fb.png b/static/images/composer-emoji/apple/1f476-1f3fb.png
new file mode 100644
index 0000000000..7689aeaeb1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f476-1f3fc.png b/static/images/composer-emoji/apple/1f476-1f3fc.png
new file mode 100644
index 0000000000..ece778ec7c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f476-1f3fd.png b/static/images/composer-emoji/apple/1f476-1f3fd.png
new file mode 100644
index 0000000000..8e837f4096
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f476-1f3fe.png b/static/images/composer-emoji/apple/1f476-1f3fe.png
new file mode 100644
index 0000000000..453f05f158
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f476-1f3ff.png b/static/images/composer-emoji/apple/1f476-1f3ff.png
new file mode 100644
index 0000000000..cc4698e6a3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f476.png b/static/images/composer-emoji/apple/1f476.png
new file mode 100644
index 0000000000..dc24e7900a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f476.png differ
diff --git a/static/images/composer-emoji/apple/1f477-1f3fb.png b/static/images/composer-emoji/apple/1f477-1f3fb.png
new file mode 100644
index 0000000000..ccdba3b257
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f477-1f3fc.png b/static/images/composer-emoji/apple/1f477-1f3fc.png
new file mode 100644
index 0000000000..fe2d388dd3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f477-1f3fd.png b/static/images/composer-emoji/apple/1f477-1f3fd.png
new file mode 100644
index 0000000000..9172a1e8ee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f477-1f3fe.png b/static/images/composer-emoji/apple/1f477-1f3fe.png
new file mode 100644
index 0000000000..15a00edaa2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f477-1f3ff.png b/static/images/composer-emoji/apple/1f477-1f3ff.png
new file mode 100644
index 0000000000..67ce18f118
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f477.png b/static/images/composer-emoji/apple/1f477.png
new file mode 100644
index 0000000000..0c39388d29
Binary files /dev/null and b/static/images/composer-emoji/apple/1f477.png differ
diff --git a/static/images/composer-emoji/apple/1f478-1f3fb.png b/static/images/composer-emoji/apple/1f478-1f3fb.png
new file mode 100644
index 0000000000..a0d9ffd3c1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f478-1f3fc.png b/static/images/composer-emoji/apple/1f478-1f3fc.png
new file mode 100644
index 0000000000..e8009ef99c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f478-1f3fd.png b/static/images/composer-emoji/apple/1f478-1f3fd.png
new file mode 100644
index 0000000000..6b7a32a852
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f478-1f3fe.png b/static/images/composer-emoji/apple/1f478-1f3fe.png
new file mode 100644
index 0000000000..69cc09dfbd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f478-1f3ff.png b/static/images/composer-emoji/apple/1f478-1f3ff.png
new file mode 100644
index 0000000000..ab9971743c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f478.png b/static/images/composer-emoji/apple/1f478.png
new file mode 100644
index 0000000000..5900e045c6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f478.png differ
diff --git a/static/images/composer-emoji/apple/1f479.png b/static/images/composer-emoji/apple/1f479.png
new file mode 100644
index 0000000000..084622ab62
Binary files /dev/null and b/static/images/composer-emoji/apple/1f479.png differ
diff --git a/static/images/composer-emoji/apple/1f47a.png b/static/images/composer-emoji/apple/1f47a.png
new file mode 100644
index 0000000000..fe21c034df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47a.png differ
diff --git a/static/images/composer-emoji/apple/1f47b.png b/static/images/composer-emoji/apple/1f47b.png
new file mode 100644
index 0000000000..70d09df139
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47b.png differ
diff --git a/static/images/composer-emoji/apple/1f47c-1f3fb.png b/static/images/composer-emoji/apple/1f47c-1f3fb.png
new file mode 100644
index 0000000000..9d1390d147
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f47c-1f3fc.png b/static/images/composer-emoji/apple/1f47c-1f3fc.png
new file mode 100644
index 0000000000..46b045820c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f47c-1f3fd.png b/static/images/composer-emoji/apple/1f47c-1f3fd.png
new file mode 100644
index 0000000000..58c3ffebd1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f47c-1f3fe.png b/static/images/composer-emoji/apple/1f47c-1f3fe.png
new file mode 100644
index 0000000000..66571b0193
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f47c-1f3ff.png b/static/images/composer-emoji/apple/1f47c-1f3ff.png
new file mode 100644
index 0000000000..178574c09b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f47c.png b/static/images/composer-emoji/apple/1f47c.png
new file mode 100644
index 0000000000..0540f43229
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47c.png differ
diff --git a/static/images/composer-emoji/apple/1f47d.png b/static/images/composer-emoji/apple/1f47d.png
new file mode 100644
index 0000000000..d7e44d7aeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47d.png differ
diff --git a/static/images/composer-emoji/apple/1f47e.png b/static/images/composer-emoji/apple/1f47e.png
new file mode 100644
index 0000000000..0ae4a01a92
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47e.png differ
diff --git a/static/images/composer-emoji/apple/1f47f.png b/static/images/composer-emoji/apple/1f47f.png
new file mode 100644
index 0000000000..80fbaafea1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f47f.png differ
diff --git a/static/images/composer-emoji/apple/1f480.png b/static/images/composer-emoji/apple/1f480.png
new file mode 100644
index 0000000000..d082b153ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f480.png differ
diff --git a/static/images/composer-emoji/apple/1f481-1f3fb.png b/static/images/composer-emoji/apple/1f481-1f3fb.png
new file mode 100644
index 0000000000..0b8fbc67ea
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f481-1f3fc.png b/static/images/composer-emoji/apple/1f481-1f3fc.png
new file mode 100644
index 0000000000..e894c5482d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f481-1f3fd.png b/static/images/composer-emoji/apple/1f481-1f3fd.png
new file mode 100644
index 0000000000..2eb753e8b5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f481-1f3fe.png b/static/images/composer-emoji/apple/1f481-1f3fe.png
new file mode 100644
index 0000000000..7316c3da9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f481-1f3ff.png b/static/images/composer-emoji/apple/1f481-1f3ff.png
new file mode 100644
index 0000000000..eaa550cbec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f481.png b/static/images/composer-emoji/apple/1f481.png
new file mode 100644
index 0000000000..82bceda7f4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f481.png differ
diff --git a/static/images/composer-emoji/apple/1f482-1f3fb.png b/static/images/composer-emoji/apple/1f482-1f3fb.png
new file mode 100644
index 0000000000..96c5c95849
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f482-1f3fc.png b/static/images/composer-emoji/apple/1f482-1f3fc.png
new file mode 100644
index 0000000000..9ad835b57e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f482-1f3fd.png b/static/images/composer-emoji/apple/1f482-1f3fd.png
new file mode 100644
index 0000000000..6769a584a3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f482-1f3fe.png b/static/images/composer-emoji/apple/1f482-1f3fe.png
new file mode 100644
index 0000000000..c7b65873ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f482-1f3ff.png b/static/images/composer-emoji/apple/1f482-1f3ff.png
new file mode 100644
index 0000000000..5f38a77b55
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f482.png b/static/images/composer-emoji/apple/1f482.png
new file mode 100644
index 0000000000..b16ff7c713
Binary files /dev/null and b/static/images/composer-emoji/apple/1f482.png differ
diff --git a/static/images/composer-emoji/apple/1f483-1f3fb.png b/static/images/composer-emoji/apple/1f483-1f3fb.png
new file mode 100644
index 0000000000..b1c4374ca2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f483-1f3fc.png b/static/images/composer-emoji/apple/1f483-1f3fc.png
new file mode 100644
index 0000000000..8aa01cb45d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f483-1f3fd.png b/static/images/composer-emoji/apple/1f483-1f3fd.png
new file mode 100644
index 0000000000..7e3bba278f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f483-1f3fe.png b/static/images/composer-emoji/apple/1f483-1f3fe.png
new file mode 100644
index 0000000000..5d5ee902f2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f483-1f3ff.png b/static/images/composer-emoji/apple/1f483-1f3ff.png
new file mode 100644
index 0000000000..f25abcfdf7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f483.png b/static/images/composer-emoji/apple/1f483.png
new file mode 100644
index 0000000000..8766bb2ee9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f483.png differ
diff --git a/static/images/composer-emoji/apple/1f484.png b/static/images/composer-emoji/apple/1f484.png
new file mode 100644
index 0000000000..54a820ccde
Binary files /dev/null and b/static/images/composer-emoji/apple/1f484.png differ
diff --git a/static/images/composer-emoji/apple/1f485-1f3fb.png b/static/images/composer-emoji/apple/1f485-1f3fb.png
new file mode 100644
index 0000000000..97c69ede33
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f485-1f3fc.png b/static/images/composer-emoji/apple/1f485-1f3fc.png
new file mode 100644
index 0000000000..f31569c93d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f485-1f3fd.png b/static/images/composer-emoji/apple/1f485-1f3fd.png
new file mode 100644
index 0000000000..f59bf480ff
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f485-1f3fe.png b/static/images/composer-emoji/apple/1f485-1f3fe.png
new file mode 100644
index 0000000000..0714e923d2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f485-1f3ff.png b/static/images/composer-emoji/apple/1f485-1f3ff.png
new file mode 100644
index 0000000000..42198ff1db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f485.png b/static/images/composer-emoji/apple/1f485.png
new file mode 100644
index 0000000000..f00c406358
Binary files /dev/null and b/static/images/composer-emoji/apple/1f485.png differ
diff --git a/static/images/composer-emoji/apple/1f486-1f3fb.png b/static/images/composer-emoji/apple/1f486-1f3fb.png
new file mode 100644
index 0000000000..fdb33bed70
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f486-1f3fc.png b/static/images/composer-emoji/apple/1f486-1f3fc.png
new file mode 100644
index 0000000000..16fb377f99
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f486-1f3fd.png b/static/images/composer-emoji/apple/1f486-1f3fd.png
new file mode 100644
index 0000000000..0a986f7d21
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f486-1f3fe.png b/static/images/composer-emoji/apple/1f486-1f3fe.png
new file mode 100644
index 0000000000..5d044e9853
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f486-1f3ff.png b/static/images/composer-emoji/apple/1f486-1f3ff.png
new file mode 100644
index 0000000000..2b7a2af1d5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f486.png b/static/images/composer-emoji/apple/1f486.png
new file mode 100644
index 0000000000..649f98a899
Binary files /dev/null and b/static/images/composer-emoji/apple/1f486.png differ
diff --git a/static/images/composer-emoji/apple/1f487-1f3fb.png b/static/images/composer-emoji/apple/1f487-1f3fb.png
new file mode 100644
index 0000000000..0b1c5a0eed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f487-1f3fc.png b/static/images/composer-emoji/apple/1f487-1f3fc.png
new file mode 100644
index 0000000000..a4eb6bf3e2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f487-1f3fd.png b/static/images/composer-emoji/apple/1f487-1f3fd.png
new file mode 100644
index 0000000000..a466600316
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f487-1f3fe.png b/static/images/composer-emoji/apple/1f487-1f3fe.png
new file mode 100644
index 0000000000..f83f463ba5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f487-1f3ff.png b/static/images/composer-emoji/apple/1f487-1f3ff.png
new file mode 100644
index 0000000000..e17f2e652c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f487.png b/static/images/composer-emoji/apple/1f487.png
new file mode 100644
index 0000000000..d26e54e534
Binary files /dev/null and b/static/images/composer-emoji/apple/1f487.png differ
diff --git a/static/images/composer-emoji/apple/1f488.png b/static/images/composer-emoji/apple/1f488.png
new file mode 100644
index 0000000000..55e7143cb9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f488.png differ
diff --git a/static/images/composer-emoji/apple/1f489.png b/static/images/composer-emoji/apple/1f489.png
new file mode 100644
index 0000000000..c0c4feeae8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f489.png differ
diff --git a/static/images/composer-emoji/apple/1f48a.png b/static/images/composer-emoji/apple/1f48a.png
new file mode 100644
index 0000000000..5eacdde66b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48a.png differ
diff --git a/static/images/composer-emoji/apple/1f48b.png b/static/images/composer-emoji/apple/1f48b.png
new file mode 100644
index 0000000000..9708e1d6ce
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48b.png differ
diff --git a/static/images/composer-emoji/apple/1f48c.png b/static/images/composer-emoji/apple/1f48c.png
new file mode 100644
index 0000000000..9c748d6bde
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48c.png differ
diff --git a/static/images/composer-emoji/apple/1f48d.png b/static/images/composer-emoji/apple/1f48d.png
new file mode 100644
index 0000000000..cb46e01567
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48d.png differ
diff --git a/static/images/composer-emoji/apple/1f48e.png b/static/images/composer-emoji/apple/1f48e.png
new file mode 100644
index 0000000000..541e1d095c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48e.png differ
diff --git a/static/images/composer-emoji/apple/1f48f.png b/static/images/composer-emoji/apple/1f48f.png
new file mode 100644
index 0000000000..f48db496c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f48f.png differ
diff --git a/static/images/composer-emoji/apple/1f490.png b/static/images/composer-emoji/apple/1f490.png
new file mode 100644
index 0000000000..a3c1990237
Binary files /dev/null and b/static/images/composer-emoji/apple/1f490.png differ
diff --git a/static/images/composer-emoji/apple/1f491.png b/static/images/composer-emoji/apple/1f491.png
new file mode 100644
index 0000000000..b8760f49ed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f491.png differ
diff --git a/static/images/composer-emoji/apple/1f492.png b/static/images/composer-emoji/apple/1f492.png
new file mode 100644
index 0000000000..f1fbbfa41c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f492.png differ
diff --git a/static/images/composer-emoji/apple/1f493.png b/static/images/composer-emoji/apple/1f493.png
new file mode 100644
index 0000000000..fa979d2a3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f493.png differ
diff --git a/static/images/composer-emoji/apple/1f494.png b/static/images/composer-emoji/apple/1f494.png
new file mode 100644
index 0000000000..d6e0516ada
Binary files /dev/null and b/static/images/composer-emoji/apple/1f494.png differ
diff --git a/static/images/composer-emoji/apple/1f495.png b/static/images/composer-emoji/apple/1f495.png
new file mode 100644
index 0000000000..8e647c5fb1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f495.png differ
diff --git a/static/images/composer-emoji/apple/1f496.png b/static/images/composer-emoji/apple/1f496.png
new file mode 100644
index 0000000000..1bab221d68
Binary files /dev/null and b/static/images/composer-emoji/apple/1f496.png differ
diff --git a/static/images/composer-emoji/apple/1f497.png b/static/images/composer-emoji/apple/1f497.png
new file mode 100644
index 0000000000..ff4ab860f7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f497.png differ
diff --git a/static/images/composer-emoji/apple/1f498.png b/static/images/composer-emoji/apple/1f498.png
new file mode 100644
index 0000000000..8c502e4f30
Binary files /dev/null and b/static/images/composer-emoji/apple/1f498.png differ
diff --git a/static/images/composer-emoji/apple/1f499.png b/static/images/composer-emoji/apple/1f499.png
new file mode 100644
index 0000000000..0fee7d974b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f499.png differ
diff --git a/static/images/composer-emoji/apple/1f49a.png b/static/images/composer-emoji/apple/1f49a.png
new file mode 100644
index 0000000000..1d384c930d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49a.png differ
diff --git a/static/images/composer-emoji/apple/1f49b.png b/static/images/composer-emoji/apple/1f49b.png
new file mode 100644
index 0000000000..024713094b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49b.png differ
diff --git a/static/images/composer-emoji/apple/1f49c.png b/static/images/composer-emoji/apple/1f49c.png
new file mode 100644
index 0000000000..60117b628f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49c.png differ
diff --git a/static/images/composer-emoji/apple/1f49d.png b/static/images/composer-emoji/apple/1f49d.png
new file mode 100644
index 0000000000..f2b664f30a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49d.png differ
diff --git a/static/images/composer-emoji/apple/1f49e.png b/static/images/composer-emoji/apple/1f49e.png
new file mode 100644
index 0000000000..5c1a415def
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49e.png differ
diff --git a/static/images/composer-emoji/apple/1f49f.png b/static/images/composer-emoji/apple/1f49f.png
new file mode 100644
index 0000000000..3aec3de604
Binary files /dev/null and b/static/images/composer-emoji/apple/1f49f.png differ
diff --git a/static/images/composer-emoji/apple/1f4a0.png b/static/images/composer-emoji/apple/1f4a0.png
new file mode 100644
index 0000000000..df4b961092
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a0.png differ
diff --git a/static/images/composer-emoji/apple/1f4a1.png b/static/images/composer-emoji/apple/1f4a1.png
new file mode 100644
index 0000000000..c5e8019352
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a1.png differ
diff --git a/static/images/composer-emoji/apple/1f4a2.png b/static/images/composer-emoji/apple/1f4a2.png
new file mode 100644
index 0000000000..518aa140f1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a2.png differ
diff --git a/static/images/composer-emoji/apple/1f4a3.png b/static/images/composer-emoji/apple/1f4a3.png
new file mode 100644
index 0000000000..fa95c7d1e8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a3.png differ
diff --git a/static/images/composer-emoji/apple/1f4a4.png b/static/images/composer-emoji/apple/1f4a4.png
new file mode 100644
index 0000000000..d60b3ac4f4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a4.png differ
diff --git a/static/images/composer-emoji/apple/1f4a5.png b/static/images/composer-emoji/apple/1f4a5.png
new file mode 100644
index 0000000000..3edc0cbac5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a5.png differ
diff --git a/static/images/composer-emoji/apple/1f4a6.png b/static/images/composer-emoji/apple/1f4a6.png
new file mode 100644
index 0000000000..b7b8a62bb1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a6.png differ
diff --git a/static/images/composer-emoji/apple/1f4a7.png b/static/images/composer-emoji/apple/1f4a7.png
new file mode 100644
index 0000000000..4468254128
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a7.png differ
diff --git a/static/images/composer-emoji/apple/1f4a8.png b/static/images/composer-emoji/apple/1f4a8.png
new file mode 100644
index 0000000000..dafbff1961
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a8.png differ
diff --git a/static/images/composer-emoji/apple/1f4a9.png b/static/images/composer-emoji/apple/1f4a9.png
new file mode 100644
index 0000000000..d13d36f4b9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4a9.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa-1f3fb.png b/static/images/composer-emoji/apple/1f4aa-1f3fb.png
new file mode 100644
index 0000000000..4d5674ea9d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa-1f3fc.png b/static/images/composer-emoji/apple/1f4aa-1f3fc.png
new file mode 100644
index 0000000000..0d61d801bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa-1f3fd.png b/static/images/composer-emoji/apple/1f4aa-1f3fd.png
new file mode 100644
index 0000000000..5b9c1681ea
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa-1f3fe.png b/static/images/composer-emoji/apple/1f4aa-1f3fe.png
new file mode 100644
index 0000000000..2b2264071c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa-1f3ff.png b/static/images/composer-emoji/apple/1f4aa-1f3ff.png
new file mode 100644
index 0000000000..d9b52d54e6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f4aa.png b/static/images/composer-emoji/apple/1f4aa.png
new file mode 100644
index 0000000000..4d41e5cbaa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4aa.png differ
diff --git a/static/images/composer-emoji/apple/1f4ab.png b/static/images/composer-emoji/apple/1f4ab.png
new file mode 100644
index 0000000000..e90dbf88dd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ab.png differ
diff --git a/static/images/composer-emoji/apple/1f4ac.png b/static/images/composer-emoji/apple/1f4ac.png
new file mode 100644
index 0000000000..af62d3a5a8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ac.png differ
diff --git a/static/images/composer-emoji/apple/1f4ad.png b/static/images/composer-emoji/apple/1f4ad.png
new file mode 100644
index 0000000000..78098b0d30
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ad.png differ
diff --git a/static/images/composer-emoji/apple/1f4ae.png b/static/images/composer-emoji/apple/1f4ae.png
new file mode 100644
index 0000000000..df092cb2eb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ae.png differ
diff --git a/static/images/composer-emoji/apple/1f4af.png b/static/images/composer-emoji/apple/1f4af.png
new file mode 100644
index 0000000000..e18708bf4f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4af.png differ
diff --git a/static/images/composer-emoji/apple/1f4b0.png b/static/images/composer-emoji/apple/1f4b0.png
new file mode 100644
index 0000000000..7f5f3068de
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b0.png differ
diff --git a/static/images/composer-emoji/apple/1f4b1.png b/static/images/composer-emoji/apple/1f4b1.png
new file mode 100644
index 0000000000..1d0b781392
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b1.png differ
diff --git a/static/images/composer-emoji/apple/1f4b2.png b/static/images/composer-emoji/apple/1f4b2.png
new file mode 100644
index 0000000000..a4ff603a55
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b2.png differ
diff --git a/static/images/composer-emoji/apple/1f4b3.png b/static/images/composer-emoji/apple/1f4b3.png
new file mode 100644
index 0000000000..190a5137be
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b3.png differ
diff --git a/static/images/composer-emoji/apple/1f4b4.png b/static/images/composer-emoji/apple/1f4b4.png
new file mode 100644
index 0000000000..95d90a9d11
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b4.png differ
diff --git a/static/images/composer-emoji/apple/1f4b5.png b/static/images/composer-emoji/apple/1f4b5.png
new file mode 100644
index 0000000000..020ba1c3fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b5.png differ
diff --git a/static/images/composer-emoji/apple/1f4b6.png b/static/images/composer-emoji/apple/1f4b6.png
new file mode 100644
index 0000000000..af610447c1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b6.png differ
diff --git a/static/images/composer-emoji/apple/1f4b7.png b/static/images/composer-emoji/apple/1f4b7.png
new file mode 100644
index 0000000000..119fb743fb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b7.png differ
diff --git a/static/images/composer-emoji/apple/1f4b8.png b/static/images/composer-emoji/apple/1f4b8.png
new file mode 100644
index 0000000000..4fc12173e3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b8.png differ
diff --git a/static/images/composer-emoji/apple/1f4b9.png b/static/images/composer-emoji/apple/1f4b9.png
new file mode 100644
index 0000000000..f6b4d10eec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4b9.png differ
diff --git a/static/images/composer-emoji/apple/1f4ba.png b/static/images/composer-emoji/apple/1f4ba.png
new file mode 100644
index 0000000000..ee9fa3f43f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ba.png differ
diff --git a/static/images/composer-emoji/apple/1f4bb.png b/static/images/composer-emoji/apple/1f4bb.png
new file mode 100644
index 0000000000..d512824a64
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4bb.png differ
diff --git a/static/images/composer-emoji/apple/1f4bc.png b/static/images/composer-emoji/apple/1f4bc.png
new file mode 100644
index 0000000000..b4304b9b38
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4bc.png differ
diff --git a/static/images/composer-emoji/apple/1f4bd.png b/static/images/composer-emoji/apple/1f4bd.png
new file mode 100644
index 0000000000..e735dc6b44
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4bd.png differ
diff --git a/static/images/composer-emoji/apple/1f4be.png b/static/images/composer-emoji/apple/1f4be.png
new file mode 100644
index 0000000000..54b8143113
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4be.png differ
diff --git a/static/images/composer-emoji/apple/1f4bf.png b/static/images/composer-emoji/apple/1f4bf.png
new file mode 100644
index 0000000000..cb5e09d048
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4bf.png differ
diff --git a/static/images/composer-emoji/apple/1f4c0.png b/static/images/composer-emoji/apple/1f4c0.png
new file mode 100644
index 0000000000..044d3f6f4b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c0.png differ
diff --git a/static/images/composer-emoji/apple/1f4c1.png b/static/images/composer-emoji/apple/1f4c1.png
new file mode 100644
index 0000000000..0a0aa88588
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c1.png differ
diff --git a/static/images/composer-emoji/apple/1f4c2.png b/static/images/composer-emoji/apple/1f4c2.png
new file mode 100644
index 0000000000..aa47e876f8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c2.png differ
diff --git a/static/images/composer-emoji/apple/1f4c3.png b/static/images/composer-emoji/apple/1f4c3.png
new file mode 100644
index 0000000000..2d6ecb904f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c3.png differ
diff --git a/static/images/composer-emoji/apple/1f4c4.png b/static/images/composer-emoji/apple/1f4c4.png
new file mode 100644
index 0000000000..352dfef6a2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c4.png differ
diff --git a/static/images/composer-emoji/apple/1f4c5.png b/static/images/composer-emoji/apple/1f4c5.png
new file mode 100644
index 0000000000..c8527df078
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c5.png differ
diff --git a/static/images/composer-emoji/apple/1f4c6.png b/static/images/composer-emoji/apple/1f4c6.png
new file mode 100644
index 0000000000..a72b264f01
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c6.png differ
diff --git a/static/images/composer-emoji/apple/1f4c7.png b/static/images/composer-emoji/apple/1f4c7.png
new file mode 100644
index 0000000000..d23988e158
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c7.png differ
diff --git a/static/images/composer-emoji/apple/1f4c8.png b/static/images/composer-emoji/apple/1f4c8.png
new file mode 100644
index 0000000000..d0956b7618
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c8.png differ
diff --git a/static/images/composer-emoji/apple/1f4c9.png b/static/images/composer-emoji/apple/1f4c9.png
new file mode 100644
index 0000000000..babec4f011
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4c9.png differ
diff --git a/static/images/composer-emoji/apple/1f4ca.png b/static/images/composer-emoji/apple/1f4ca.png
new file mode 100644
index 0000000000..7943ce9432
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ca.png differ
diff --git a/static/images/composer-emoji/apple/1f4cb.png b/static/images/composer-emoji/apple/1f4cb.png
new file mode 100644
index 0000000000..61cc7c52d3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4cb.png differ
diff --git a/static/images/composer-emoji/apple/1f4cc.png b/static/images/composer-emoji/apple/1f4cc.png
new file mode 100644
index 0000000000..a7de6b1b07
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4cc.png differ
diff --git a/static/images/composer-emoji/apple/1f4cd.png b/static/images/composer-emoji/apple/1f4cd.png
new file mode 100644
index 0000000000..9b43380ff6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4cd.png differ
diff --git a/static/images/composer-emoji/apple/1f4ce.png b/static/images/composer-emoji/apple/1f4ce.png
new file mode 100644
index 0000000000..4da175ab5b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ce.png differ
diff --git a/static/images/composer-emoji/apple/1f4cf.png b/static/images/composer-emoji/apple/1f4cf.png
new file mode 100644
index 0000000000..a1ffa8583b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4cf.png differ
diff --git a/static/images/composer-emoji/apple/1f4d0.png b/static/images/composer-emoji/apple/1f4d0.png
new file mode 100644
index 0000000000..6f565b756c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d0.png differ
diff --git a/static/images/composer-emoji/apple/1f4d1.png b/static/images/composer-emoji/apple/1f4d1.png
new file mode 100644
index 0000000000..603a1ec8cf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d1.png differ
diff --git a/static/images/composer-emoji/apple/1f4d2.png b/static/images/composer-emoji/apple/1f4d2.png
new file mode 100644
index 0000000000..6892190bcf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d2.png differ
diff --git a/static/images/composer-emoji/apple/1f4d3.png b/static/images/composer-emoji/apple/1f4d3.png
new file mode 100644
index 0000000000..6db6a7ad4e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d3.png differ
diff --git a/static/images/composer-emoji/apple/1f4d4.png b/static/images/composer-emoji/apple/1f4d4.png
new file mode 100644
index 0000000000..7efa487c21
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d4.png differ
diff --git a/static/images/composer-emoji/apple/1f4d5.png b/static/images/composer-emoji/apple/1f4d5.png
new file mode 100644
index 0000000000..bc29f4e968
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d5.png differ
diff --git a/static/images/composer-emoji/apple/1f4d6.png b/static/images/composer-emoji/apple/1f4d6.png
new file mode 100644
index 0000000000..ab7da1fb9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d6.png differ
diff --git a/static/images/composer-emoji/apple/1f4d7.png b/static/images/composer-emoji/apple/1f4d7.png
new file mode 100644
index 0000000000..396305abad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d7.png differ
diff --git a/static/images/composer-emoji/apple/1f4d8.png b/static/images/composer-emoji/apple/1f4d8.png
new file mode 100644
index 0000000000..2cbd27c105
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d8.png differ
diff --git a/static/images/composer-emoji/apple/1f4d9.png b/static/images/composer-emoji/apple/1f4d9.png
new file mode 100644
index 0000000000..62a2df3179
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4d9.png differ
diff --git a/static/images/composer-emoji/apple/1f4da.png b/static/images/composer-emoji/apple/1f4da.png
new file mode 100644
index 0000000000..c3f28552c6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4da.png differ
diff --git a/static/images/composer-emoji/apple/1f4db.png b/static/images/composer-emoji/apple/1f4db.png
new file mode 100644
index 0000000000..b262eae0db
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4db.png differ
diff --git a/static/images/composer-emoji/apple/1f4dc.png b/static/images/composer-emoji/apple/1f4dc.png
new file mode 100644
index 0000000000..3b9cb30653
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4dc.png differ
diff --git a/static/images/composer-emoji/apple/1f4dd.png b/static/images/composer-emoji/apple/1f4dd.png
new file mode 100644
index 0000000000..440df1acfd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4dd.png differ
diff --git a/static/images/composer-emoji/apple/1f4de.png b/static/images/composer-emoji/apple/1f4de.png
new file mode 100644
index 0000000000..712d033319
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4de.png differ
diff --git a/static/images/composer-emoji/apple/1f4df.png b/static/images/composer-emoji/apple/1f4df.png
new file mode 100644
index 0000000000..9b8943b54b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4df.png differ
diff --git a/static/images/composer-emoji/apple/1f4e0.png b/static/images/composer-emoji/apple/1f4e0.png
new file mode 100644
index 0000000000..4398454c3c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e0.png differ
diff --git a/static/images/composer-emoji/apple/1f4e1.png b/static/images/composer-emoji/apple/1f4e1.png
new file mode 100644
index 0000000000..6ef16fe61f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e1.png differ
diff --git a/static/images/composer-emoji/apple/1f4e2.png b/static/images/composer-emoji/apple/1f4e2.png
new file mode 100644
index 0000000000..d083d3af5e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e2.png differ
diff --git a/static/images/composer-emoji/apple/1f4e3.png b/static/images/composer-emoji/apple/1f4e3.png
new file mode 100644
index 0000000000..c9165133f6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e3.png differ
diff --git a/static/images/composer-emoji/apple/1f4e4.png b/static/images/composer-emoji/apple/1f4e4.png
new file mode 100644
index 0000000000..46614b1039
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e4.png differ
diff --git a/static/images/composer-emoji/apple/1f4e5.png b/static/images/composer-emoji/apple/1f4e5.png
new file mode 100644
index 0000000000..82f4970528
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e5.png differ
diff --git a/static/images/composer-emoji/apple/1f4e6.png b/static/images/composer-emoji/apple/1f4e6.png
new file mode 100644
index 0000000000..5141d6655d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e6.png differ
diff --git a/static/images/composer-emoji/apple/1f4e7.png b/static/images/composer-emoji/apple/1f4e7.png
new file mode 100644
index 0000000000..a3561b1430
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e7.png differ
diff --git a/static/images/composer-emoji/apple/1f4e8.png b/static/images/composer-emoji/apple/1f4e8.png
new file mode 100644
index 0000000000..3c00181116
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e8.png differ
diff --git a/static/images/composer-emoji/apple/1f4e9.png b/static/images/composer-emoji/apple/1f4e9.png
new file mode 100644
index 0000000000..29bdde4778
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4e9.png differ
diff --git a/static/images/composer-emoji/apple/1f4ea.png b/static/images/composer-emoji/apple/1f4ea.png
new file mode 100644
index 0000000000..8caed381df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ea.png differ
diff --git a/static/images/composer-emoji/apple/1f4eb.png b/static/images/composer-emoji/apple/1f4eb.png
new file mode 100644
index 0000000000..25abf9109f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4eb.png differ
diff --git a/static/images/composer-emoji/apple/1f4ec.png b/static/images/composer-emoji/apple/1f4ec.png
new file mode 100644
index 0000000000..8ef2e770ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ec.png differ
diff --git a/static/images/composer-emoji/apple/1f4ed.png b/static/images/composer-emoji/apple/1f4ed.png
new file mode 100644
index 0000000000..fa94ed599b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ed.png differ
diff --git a/static/images/composer-emoji/apple/1f4ee.png b/static/images/composer-emoji/apple/1f4ee.png
new file mode 100644
index 0000000000..1c41ff6493
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ee.png differ
diff --git a/static/images/composer-emoji/apple/1f4ef.png b/static/images/composer-emoji/apple/1f4ef.png
new file mode 100644
index 0000000000..8dd8706ecb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ef.png differ
diff --git a/static/images/composer-emoji/apple/1f4f0.png b/static/images/composer-emoji/apple/1f4f0.png
new file mode 100644
index 0000000000..a7c3359246
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f0.png differ
diff --git a/static/images/composer-emoji/apple/1f4f1.png b/static/images/composer-emoji/apple/1f4f1.png
new file mode 100644
index 0000000000..2ca0603adf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f1.png differ
diff --git a/static/images/composer-emoji/apple/1f4f2.png b/static/images/composer-emoji/apple/1f4f2.png
new file mode 100644
index 0000000000..343f746d15
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f2.png differ
diff --git a/static/images/composer-emoji/apple/1f4f3.png b/static/images/composer-emoji/apple/1f4f3.png
new file mode 100644
index 0000000000..9db1e43add
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f3.png differ
diff --git a/static/images/composer-emoji/apple/1f4f4.png b/static/images/composer-emoji/apple/1f4f4.png
new file mode 100644
index 0000000000..1faf083271
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f4.png differ
diff --git a/static/images/composer-emoji/apple/1f4f5.png b/static/images/composer-emoji/apple/1f4f5.png
new file mode 100644
index 0000000000..e249b09504
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f5.png differ
diff --git a/static/images/composer-emoji/apple/1f4f6.png b/static/images/composer-emoji/apple/1f4f6.png
new file mode 100644
index 0000000000..7505156da0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f6.png differ
diff --git a/static/images/composer-emoji/apple/1f4f7.png b/static/images/composer-emoji/apple/1f4f7.png
new file mode 100644
index 0000000000..26316dd350
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f7.png differ
diff --git a/static/images/composer-emoji/apple/1f4f8.png b/static/images/composer-emoji/apple/1f4f8.png
new file mode 100644
index 0000000000..82a10e0a8b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f8.png differ
diff --git a/static/images/composer-emoji/apple/1f4f9.png b/static/images/composer-emoji/apple/1f4f9.png
new file mode 100644
index 0000000000..4280c42de0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4f9.png differ
diff --git a/static/images/composer-emoji/apple/1f4fa.png b/static/images/composer-emoji/apple/1f4fa.png
new file mode 100644
index 0000000000..021af955b1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4fa.png differ
diff --git a/static/images/composer-emoji/apple/1f4fb.png b/static/images/composer-emoji/apple/1f4fb.png
new file mode 100644
index 0000000000..21e1443930
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4fb.png differ
diff --git a/static/images/composer-emoji/apple/1f4fc.png b/static/images/composer-emoji/apple/1f4fc.png
new file mode 100644
index 0000000000..82a64fe2b9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4fc.png differ
diff --git a/static/images/composer-emoji/apple/1f4fd.png b/static/images/composer-emoji/apple/1f4fd.png
new file mode 100644
index 0000000000..8744209ef3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4fd.png differ
diff --git a/static/images/composer-emoji/apple/1f4ff.png b/static/images/composer-emoji/apple/1f4ff.png
new file mode 100644
index 0000000000..ba05a7dcee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f4ff.png differ
diff --git a/static/images/composer-emoji/apple/1f500.png b/static/images/composer-emoji/apple/1f500.png
new file mode 100644
index 0000000000..c686f1b878
Binary files /dev/null and b/static/images/composer-emoji/apple/1f500.png differ
diff --git a/static/images/composer-emoji/apple/1f501.png b/static/images/composer-emoji/apple/1f501.png
new file mode 100644
index 0000000000..d9392ef887
Binary files /dev/null and b/static/images/composer-emoji/apple/1f501.png differ
diff --git a/static/images/composer-emoji/apple/1f502.png b/static/images/composer-emoji/apple/1f502.png
new file mode 100644
index 0000000000..bc99d11e2a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f502.png differ
diff --git a/static/images/composer-emoji/apple/1f503.png b/static/images/composer-emoji/apple/1f503.png
new file mode 100644
index 0000000000..f6ff68c6cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f503.png differ
diff --git a/static/images/composer-emoji/apple/1f504.png b/static/images/composer-emoji/apple/1f504.png
new file mode 100644
index 0000000000..a25486fafa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f504.png differ
diff --git a/static/images/composer-emoji/apple/1f505.png b/static/images/composer-emoji/apple/1f505.png
new file mode 100644
index 0000000000..44f4e44461
Binary files /dev/null and b/static/images/composer-emoji/apple/1f505.png differ
diff --git a/static/images/composer-emoji/apple/1f506.png b/static/images/composer-emoji/apple/1f506.png
new file mode 100644
index 0000000000..6a160ef8e3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f506.png differ
diff --git a/static/images/composer-emoji/apple/1f507.png b/static/images/composer-emoji/apple/1f507.png
new file mode 100644
index 0000000000..2ec470b2bd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f507.png differ
diff --git a/static/images/composer-emoji/apple/1f508.png b/static/images/composer-emoji/apple/1f508.png
new file mode 100644
index 0000000000..d383845b21
Binary files /dev/null and b/static/images/composer-emoji/apple/1f508.png differ
diff --git a/static/images/composer-emoji/apple/1f509.png b/static/images/composer-emoji/apple/1f509.png
new file mode 100644
index 0000000000..cde53e84d1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f509.png differ
diff --git a/static/images/composer-emoji/apple/1f50a.png b/static/images/composer-emoji/apple/1f50a.png
new file mode 100644
index 0000000000..1619e05660
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50a.png differ
diff --git a/static/images/composer-emoji/apple/1f50b.png b/static/images/composer-emoji/apple/1f50b.png
new file mode 100644
index 0000000000..34aedfc21d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50b.png differ
diff --git a/static/images/composer-emoji/apple/1f50c.png b/static/images/composer-emoji/apple/1f50c.png
new file mode 100644
index 0000000000..e394c47ab7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50c.png differ
diff --git a/static/images/composer-emoji/apple/1f50d.png b/static/images/composer-emoji/apple/1f50d.png
new file mode 100644
index 0000000000..ce84fd2fe4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50d.png differ
diff --git a/static/images/composer-emoji/apple/1f50e.png b/static/images/composer-emoji/apple/1f50e.png
new file mode 100644
index 0000000000..f14f5f6c31
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50e.png differ
diff --git a/static/images/composer-emoji/apple/1f50f.png b/static/images/composer-emoji/apple/1f50f.png
new file mode 100644
index 0000000000..bf3a3d8718
Binary files /dev/null and b/static/images/composer-emoji/apple/1f50f.png differ
diff --git a/static/images/composer-emoji/apple/1f510.png b/static/images/composer-emoji/apple/1f510.png
new file mode 100644
index 0000000000..4d663811ab
Binary files /dev/null and b/static/images/composer-emoji/apple/1f510.png differ
diff --git a/static/images/composer-emoji/apple/1f511.png b/static/images/composer-emoji/apple/1f511.png
new file mode 100644
index 0000000000..5fc8ad6315
Binary files /dev/null and b/static/images/composer-emoji/apple/1f511.png differ
diff --git a/static/images/composer-emoji/apple/1f512.png b/static/images/composer-emoji/apple/1f512.png
new file mode 100644
index 0000000000..366f266977
Binary files /dev/null and b/static/images/composer-emoji/apple/1f512.png differ
diff --git a/static/images/composer-emoji/apple/1f513.png b/static/images/composer-emoji/apple/1f513.png
new file mode 100644
index 0000000000..7cf1442a5b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f513.png differ
diff --git a/static/images/composer-emoji/apple/1f514.png b/static/images/composer-emoji/apple/1f514.png
new file mode 100644
index 0000000000..c757a3781b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f514.png differ
diff --git a/static/images/composer-emoji/apple/1f515.png b/static/images/composer-emoji/apple/1f515.png
new file mode 100644
index 0000000000..f10ae4d503
Binary files /dev/null and b/static/images/composer-emoji/apple/1f515.png differ
diff --git a/static/images/composer-emoji/apple/1f516.png b/static/images/composer-emoji/apple/1f516.png
new file mode 100644
index 0000000000..fdc4703c6c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f516.png differ
diff --git a/static/images/composer-emoji/apple/1f517.png b/static/images/composer-emoji/apple/1f517.png
new file mode 100644
index 0000000000..5ff8bfb5ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f517.png differ
diff --git a/static/images/composer-emoji/apple/1f518.png b/static/images/composer-emoji/apple/1f518.png
new file mode 100644
index 0000000000..1612526773
Binary files /dev/null and b/static/images/composer-emoji/apple/1f518.png differ
diff --git a/static/images/composer-emoji/apple/1f519.png b/static/images/composer-emoji/apple/1f519.png
new file mode 100644
index 0000000000..bb5945e26c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f519.png differ
diff --git a/static/images/composer-emoji/apple/1f51a.png b/static/images/composer-emoji/apple/1f51a.png
new file mode 100644
index 0000000000..22c6a8abda
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51a.png differ
diff --git a/static/images/composer-emoji/apple/1f51b.png b/static/images/composer-emoji/apple/1f51b.png
new file mode 100644
index 0000000000..5a4ac144cd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51b.png differ
diff --git a/static/images/composer-emoji/apple/1f51c.png b/static/images/composer-emoji/apple/1f51c.png
new file mode 100644
index 0000000000..fb50465775
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51c.png differ
diff --git a/static/images/composer-emoji/apple/1f51d.png b/static/images/composer-emoji/apple/1f51d.png
new file mode 100644
index 0000000000..d371b40bee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51d.png differ
diff --git a/static/images/composer-emoji/apple/1f51e.png b/static/images/composer-emoji/apple/1f51e.png
new file mode 100644
index 0000000000..f67b07bcfd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51e.png differ
diff --git a/static/images/composer-emoji/apple/1f51f.png b/static/images/composer-emoji/apple/1f51f.png
new file mode 100644
index 0000000000..0ba46bed0c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f51f.png differ
diff --git a/static/images/composer-emoji/apple/1f520.png b/static/images/composer-emoji/apple/1f520.png
new file mode 100644
index 0000000000..26baccdfcf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f520.png differ
diff --git a/static/images/composer-emoji/apple/1f521.png b/static/images/composer-emoji/apple/1f521.png
new file mode 100644
index 0000000000..faefcfec10
Binary files /dev/null and b/static/images/composer-emoji/apple/1f521.png differ
diff --git a/static/images/composer-emoji/apple/1f522.png b/static/images/composer-emoji/apple/1f522.png
new file mode 100644
index 0000000000..3cc48135a4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f522.png differ
diff --git a/static/images/composer-emoji/apple/1f523.png b/static/images/composer-emoji/apple/1f523.png
new file mode 100644
index 0000000000..bf6a9da305
Binary files /dev/null and b/static/images/composer-emoji/apple/1f523.png differ
diff --git a/static/images/composer-emoji/apple/1f524.png b/static/images/composer-emoji/apple/1f524.png
new file mode 100644
index 0000000000..1d6fb2ddf5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f524.png differ
diff --git a/static/images/composer-emoji/apple/1f525.png b/static/images/composer-emoji/apple/1f525.png
new file mode 100644
index 0000000000..43ee3ca326
Binary files /dev/null and b/static/images/composer-emoji/apple/1f525.png differ
diff --git a/static/images/composer-emoji/apple/1f526.png b/static/images/composer-emoji/apple/1f526.png
new file mode 100644
index 0000000000..deb8573e1b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f526.png differ
diff --git a/static/images/composer-emoji/apple/1f527.png b/static/images/composer-emoji/apple/1f527.png
new file mode 100644
index 0000000000..e72ce7b6e1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f527.png differ
diff --git a/static/images/composer-emoji/apple/1f528.png b/static/images/composer-emoji/apple/1f528.png
new file mode 100644
index 0000000000..caed93515c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f528.png differ
diff --git a/static/images/composer-emoji/apple/1f529.png b/static/images/composer-emoji/apple/1f529.png
new file mode 100644
index 0000000000..eb8c85ce2d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f529.png differ
diff --git a/static/images/composer-emoji/apple/1f52a.png b/static/images/composer-emoji/apple/1f52a.png
new file mode 100644
index 0000000000..8d898f7b73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52a.png differ
diff --git a/static/images/composer-emoji/apple/1f52b.png b/static/images/composer-emoji/apple/1f52b.png
new file mode 100644
index 0000000000..1a98ba10cd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52b.png differ
diff --git a/static/images/composer-emoji/apple/1f52c.png b/static/images/composer-emoji/apple/1f52c.png
new file mode 100644
index 0000000000..6f91797c36
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52c.png differ
diff --git a/static/images/composer-emoji/apple/1f52d.png b/static/images/composer-emoji/apple/1f52d.png
new file mode 100644
index 0000000000..e0729b92ef
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52d.png differ
diff --git a/static/images/composer-emoji/apple/1f52e.png b/static/images/composer-emoji/apple/1f52e.png
new file mode 100644
index 0000000000..2a751125df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52e.png differ
diff --git a/static/images/composer-emoji/apple/1f52f.png b/static/images/composer-emoji/apple/1f52f.png
new file mode 100644
index 0000000000..e2d7ad368f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f52f.png differ
diff --git a/static/images/composer-emoji/apple/1f530.png b/static/images/composer-emoji/apple/1f530.png
new file mode 100644
index 0000000000..ce355f9ce4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f530.png differ
diff --git a/static/images/composer-emoji/apple/1f531.png b/static/images/composer-emoji/apple/1f531.png
new file mode 100644
index 0000000000..caefe44201
Binary files /dev/null and b/static/images/composer-emoji/apple/1f531.png differ
diff --git a/static/images/composer-emoji/apple/1f532.png b/static/images/composer-emoji/apple/1f532.png
new file mode 100644
index 0000000000..56c8b6c504
Binary files /dev/null and b/static/images/composer-emoji/apple/1f532.png differ
diff --git a/static/images/composer-emoji/apple/1f533.png b/static/images/composer-emoji/apple/1f533.png
new file mode 100644
index 0000000000..78d24f1cfb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f533.png differ
diff --git a/static/images/composer-emoji/apple/1f534.png b/static/images/composer-emoji/apple/1f534.png
new file mode 100644
index 0000000000..8235ee4801
Binary files /dev/null and b/static/images/composer-emoji/apple/1f534.png differ
diff --git a/static/images/composer-emoji/apple/1f535.png b/static/images/composer-emoji/apple/1f535.png
new file mode 100644
index 0000000000..081b1e732c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f535.png differ
diff --git a/static/images/composer-emoji/apple/1f536.png b/static/images/composer-emoji/apple/1f536.png
new file mode 100644
index 0000000000..1af2947585
Binary files /dev/null and b/static/images/composer-emoji/apple/1f536.png differ
diff --git a/static/images/composer-emoji/apple/1f537.png b/static/images/composer-emoji/apple/1f537.png
new file mode 100644
index 0000000000..fe2166c95c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f537.png differ
diff --git a/static/images/composer-emoji/apple/1f538.png b/static/images/composer-emoji/apple/1f538.png
new file mode 100644
index 0000000000..f42f65ac7b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f538.png differ
diff --git a/static/images/composer-emoji/apple/1f539.png b/static/images/composer-emoji/apple/1f539.png
new file mode 100644
index 0000000000..7c8cbee7b9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f539.png differ
diff --git a/static/images/composer-emoji/apple/1f53a.png b/static/images/composer-emoji/apple/1f53a.png
new file mode 100644
index 0000000000..25bfe70ab8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f53a.png differ
diff --git a/static/images/composer-emoji/apple/1f53b.png b/static/images/composer-emoji/apple/1f53b.png
new file mode 100644
index 0000000000..d5b8749a50
Binary files /dev/null and b/static/images/composer-emoji/apple/1f53b.png differ
diff --git a/static/images/composer-emoji/apple/1f53c.png b/static/images/composer-emoji/apple/1f53c.png
new file mode 100644
index 0000000000..1fa5f5bdfe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f53c.png differ
diff --git a/static/images/composer-emoji/apple/1f53d.png b/static/images/composer-emoji/apple/1f53d.png
new file mode 100644
index 0000000000..5f30445af6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f53d.png differ
diff --git a/static/images/composer-emoji/apple/1f549.png b/static/images/composer-emoji/apple/1f549.png
new file mode 100644
index 0000000000..5d61f80471
Binary files /dev/null and b/static/images/composer-emoji/apple/1f549.png differ
diff --git a/static/images/composer-emoji/apple/1f54a.png b/static/images/composer-emoji/apple/1f54a.png
new file mode 100644
index 0000000000..adf1746ae7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f54a.png differ
diff --git a/static/images/composer-emoji/apple/1f54b.png b/static/images/composer-emoji/apple/1f54b.png
new file mode 100644
index 0000000000..d116fa17bb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f54b.png differ
diff --git a/static/images/composer-emoji/apple/1f54c.png b/static/images/composer-emoji/apple/1f54c.png
new file mode 100644
index 0000000000..c26751b8c6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f54c.png differ
diff --git a/static/images/composer-emoji/apple/1f54d.png b/static/images/composer-emoji/apple/1f54d.png
new file mode 100644
index 0000000000..b46ee57f1c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f54d.png differ
diff --git a/static/images/composer-emoji/apple/1f54e.png b/static/images/composer-emoji/apple/1f54e.png
new file mode 100644
index 0000000000..aa4ad6b18f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f54e.png differ
diff --git a/static/images/composer-emoji/apple/1f550.png b/static/images/composer-emoji/apple/1f550.png
new file mode 100644
index 0000000000..fa966767d8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f550.png differ
diff --git a/static/images/composer-emoji/apple/1f551.png b/static/images/composer-emoji/apple/1f551.png
new file mode 100644
index 0000000000..5b4af27beb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f551.png differ
diff --git a/static/images/composer-emoji/apple/1f552.png b/static/images/composer-emoji/apple/1f552.png
new file mode 100644
index 0000000000..21cddc3e7d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f552.png differ
diff --git a/static/images/composer-emoji/apple/1f553.png b/static/images/composer-emoji/apple/1f553.png
new file mode 100644
index 0000000000..8fb49692fc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f553.png differ
diff --git a/static/images/composer-emoji/apple/1f554.png b/static/images/composer-emoji/apple/1f554.png
new file mode 100644
index 0000000000..b32564674a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f554.png differ
diff --git a/static/images/composer-emoji/apple/1f555.png b/static/images/composer-emoji/apple/1f555.png
new file mode 100644
index 0000000000..2d9b8ee5ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f555.png differ
diff --git a/static/images/composer-emoji/apple/1f556.png b/static/images/composer-emoji/apple/1f556.png
new file mode 100644
index 0000000000..940f4647cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f556.png differ
diff --git a/static/images/composer-emoji/apple/1f557.png b/static/images/composer-emoji/apple/1f557.png
new file mode 100644
index 0000000000..53ef006a68
Binary files /dev/null and b/static/images/composer-emoji/apple/1f557.png differ
diff --git a/static/images/composer-emoji/apple/1f558.png b/static/images/composer-emoji/apple/1f558.png
new file mode 100644
index 0000000000..a28d39a1ad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f558.png differ
diff --git a/static/images/composer-emoji/apple/1f559.png b/static/images/composer-emoji/apple/1f559.png
new file mode 100644
index 0000000000..9a3571830b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f559.png differ
diff --git a/static/images/composer-emoji/apple/1f55a.png b/static/images/composer-emoji/apple/1f55a.png
new file mode 100644
index 0000000000..fa47501959
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55a.png differ
diff --git a/static/images/composer-emoji/apple/1f55b.png b/static/images/composer-emoji/apple/1f55b.png
new file mode 100644
index 0000000000..6bebef9659
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55b.png differ
diff --git a/static/images/composer-emoji/apple/1f55c.png b/static/images/composer-emoji/apple/1f55c.png
new file mode 100644
index 0000000000..ead845603f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55c.png differ
diff --git a/static/images/composer-emoji/apple/1f55d.png b/static/images/composer-emoji/apple/1f55d.png
new file mode 100644
index 0000000000..7e88f79c51
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55d.png differ
diff --git a/static/images/composer-emoji/apple/1f55e.png b/static/images/composer-emoji/apple/1f55e.png
new file mode 100644
index 0000000000..c79613f11f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55e.png differ
diff --git a/static/images/composer-emoji/apple/1f55f.png b/static/images/composer-emoji/apple/1f55f.png
new file mode 100644
index 0000000000..6dcffbdacb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f55f.png differ
diff --git a/static/images/composer-emoji/apple/1f560.png b/static/images/composer-emoji/apple/1f560.png
new file mode 100644
index 0000000000..0deee7d81d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f560.png differ
diff --git a/static/images/composer-emoji/apple/1f561.png b/static/images/composer-emoji/apple/1f561.png
new file mode 100644
index 0000000000..5da1c71040
Binary files /dev/null and b/static/images/composer-emoji/apple/1f561.png differ
diff --git a/static/images/composer-emoji/apple/1f562.png b/static/images/composer-emoji/apple/1f562.png
new file mode 100644
index 0000000000..22200e1354
Binary files /dev/null and b/static/images/composer-emoji/apple/1f562.png differ
diff --git a/static/images/composer-emoji/apple/1f563.png b/static/images/composer-emoji/apple/1f563.png
new file mode 100644
index 0000000000..414d286561
Binary files /dev/null and b/static/images/composer-emoji/apple/1f563.png differ
diff --git a/static/images/composer-emoji/apple/1f564.png b/static/images/composer-emoji/apple/1f564.png
new file mode 100644
index 0000000000..d8850d1242
Binary files /dev/null and b/static/images/composer-emoji/apple/1f564.png differ
diff --git a/static/images/composer-emoji/apple/1f565.png b/static/images/composer-emoji/apple/1f565.png
new file mode 100644
index 0000000000..323e52ba07
Binary files /dev/null and b/static/images/composer-emoji/apple/1f565.png differ
diff --git a/static/images/composer-emoji/apple/1f566.png b/static/images/composer-emoji/apple/1f566.png
new file mode 100644
index 0000000000..e2140dc65d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f566.png differ
diff --git a/static/images/composer-emoji/apple/1f567.png b/static/images/composer-emoji/apple/1f567.png
new file mode 100644
index 0000000000..84e245d427
Binary files /dev/null and b/static/images/composer-emoji/apple/1f567.png differ
diff --git a/static/images/composer-emoji/apple/1f56f.png b/static/images/composer-emoji/apple/1f56f.png
new file mode 100644
index 0000000000..14e2f95a08
Binary files /dev/null and b/static/images/composer-emoji/apple/1f56f.png differ
diff --git a/static/images/composer-emoji/apple/1f570.png b/static/images/composer-emoji/apple/1f570.png
new file mode 100644
index 0000000000..915dff622d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f570.png differ
diff --git a/static/images/composer-emoji/apple/1f573.png b/static/images/composer-emoji/apple/1f573.png
new file mode 100644
index 0000000000..cc0c3cf0aa
Binary files /dev/null and b/static/images/composer-emoji/apple/1f573.png differ
diff --git a/static/images/composer-emoji/apple/1f574.png b/static/images/composer-emoji/apple/1f574.png
new file mode 100644
index 0000000000..595ef1ac36
Binary files /dev/null and b/static/images/composer-emoji/apple/1f574.png differ
diff --git a/static/images/composer-emoji/apple/1f575.png b/static/images/composer-emoji/apple/1f575.png
new file mode 100644
index 0000000000..8420971ff8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f575.png differ
diff --git a/static/images/composer-emoji/apple/1f576.png b/static/images/composer-emoji/apple/1f576.png
new file mode 100644
index 0000000000..d7f1dda7c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f576.png differ
diff --git a/static/images/composer-emoji/apple/1f577.png b/static/images/composer-emoji/apple/1f577.png
new file mode 100644
index 0000000000..c0bfb00c13
Binary files /dev/null and b/static/images/composer-emoji/apple/1f577.png differ
diff --git a/static/images/composer-emoji/apple/1f578.png b/static/images/composer-emoji/apple/1f578.png
new file mode 100644
index 0000000000..c965002e6b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f578.png differ
diff --git a/static/images/composer-emoji/apple/1f579.png b/static/images/composer-emoji/apple/1f579.png
new file mode 100644
index 0000000000..b1364fe88e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f579.png differ
diff --git a/static/images/composer-emoji/apple/1f587.png b/static/images/composer-emoji/apple/1f587.png
new file mode 100644
index 0000000000..8fdd7dc29b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f587.png differ
diff --git a/static/images/composer-emoji/apple/1f58a.png b/static/images/composer-emoji/apple/1f58a.png
new file mode 100644
index 0000000000..2d6a36334b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f58a.png differ
diff --git a/static/images/composer-emoji/apple/1f58b.png b/static/images/composer-emoji/apple/1f58b.png
new file mode 100644
index 0000000000..5be85fd376
Binary files /dev/null and b/static/images/composer-emoji/apple/1f58b.png differ
diff --git a/static/images/composer-emoji/apple/1f58c.png b/static/images/composer-emoji/apple/1f58c.png
new file mode 100644
index 0000000000..a4a3b1790c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f58c.png differ
diff --git a/static/images/composer-emoji/apple/1f58d.png b/static/images/composer-emoji/apple/1f58d.png
new file mode 100644
index 0000000000..a9ed6785b3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f58d.png differ
diff --git a/static/images/composer-emoji/apple/1f590-1f3fb.png b/static/images/composer-emoji/apple/1f590-1f3fb.png
new file mode 100644
index 0000000000..5f623f6292
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f590-1f3fc.png b/static/images/composer-emoji/apple/1f590-1f3fc.png
new file mode 100644
index 0000000000..10a53879e7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f590-1f3fd.png b/static/images/composer-emoji/apple/1f590-1f3fd.png
new file mode 100644
index 0000000000..6b8386af9b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f590-1f3fe.png b/static/images/composer-emoji/apple/1f590-1f3fe.png
new file mode 100644
index 0000000000..49c45c7429
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f590-1f3ff.png b/static/images/composer-emoji/apple/1f590-1f3ff.png
new file mode 100644
index 0000000000..90f3134bf5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f590.png b/static/images/composer-emoji/apple/1f590.png
new file mode 100644
index 0000000000..2571c1a5f8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f590.png differ
diff --git a/static/images/composer-emoji/apple/1f595-1f3fb.png b/static/images/composer-emoji/apple/1f595-1f3fb.png
new file mode 100644
index 0000000000..971e4533dc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f595-1f3fc.png b/static/images/composer-emoji/apple/1f595-1f3fc.png
new file mode 100644
index 0000000000..6536d0c69a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f595-1f3fd.png b/static/images/composer-emoji/apple/1f595-1f3fd.png
new file mode 100644
index 0000000000..e5a8ed1150
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f595-1f3fe.png b/static/images/composer-emoji/apple/1f595-1f3fe.png
new file mode 100644
index 0000000000..0030f6db20
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f595-1f3ff.png b/static/images/composer-emoji/apple/1f595-1f3ff.png
new file mode 100644
index 0000000000..715ec08bd2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f595.png b/static/images/composer-emoji/apple/1f595.png
new file mode 100644
index 0000000000..e64dbf9493
Binary files /dev/null and b/static/images/composer-emoji/apple/1f595.png differ
diff --git a/static/images/composer-emoji/apple/1f596-1f3fb.png b/static/images/composer-emoji/apple/1f596-1f3fb.png
new file mode 100644
index 0000000000..034644baac
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f596-1f3fc.png b/static/images/composer-emoji/apple/1f596-1f3fc.png
new file mode 100644
index 0000000000..2ec30c2c73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f596-1f3fd.png b/static/images/composer-emoji/apple/1f596-1f3fd.png
new file mode 100644
index 0000000000..ee93429358
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f596-1f3fe.png b/static/images/composer-emoji/apple/1f596-1f3fe.png
new file mode 100644
index 0000000000..c4c3248265
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f596-1f3ff.png b/static/images/composer-emoji/apple/1f596-1f3ff.png
new file mode 100644
index 0000000000..667597e21d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f596.png b/static/images/composer-emoji/apple/1f596.png
new file mode 100644
index 0000000000..1983de2fdb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f596.png differ
diff --git a/static/images/composer-emoji/apple/1f5a5.png b/static/images/composer-emoji/apple/1f5a5.png
new file mode 100644
index 0000000000..ca207947dc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5a5.png differ
diff --git a/static/images/composer-emoji/apple/1f5a8.png b/static/images/composer-emoji/apple/1f5a8.png
new file mode 100644
index 0000000000..af2074fe75
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5a8.png differ
diff --git a/static/images/composer-emoji/apple/1f5b1.png b/static/images/composer-emoji/apple/1f5b1.png
new file mode 100644
index 0000000000..79e33a37d7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5b1.png differ
diff --git a/static/images/composer-emoji/apple/1f5b2.png b/static/images/composer-emoji/apple/1f5b2.png
new file mode 100644
index 0000000000..a95442536a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5b2.png differ
diff --git a/static/images/composer-emoji/apple/1f5bc.png b/static/images/composer-emoji/apple/1f5bc.png
new file mode 100644
index 0000000000..024250b47d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5bc.png differ
diff --git a/static/images/composer-emoji/apple/1f5c2.png b/static/images/composer-emoji/apple/1f5c2.png
new file mode 100644
index 0000000000..4e9bee4ce2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5c2.png differ
diff --git a/static/images/composer-emoji/apple/1f5c3.png b/static/images/composer-emoji/apple/1f5c3.png
new file mode 100644
index 0000000000..8f292c8e99
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5c3.png differ
diff --git a/static/images/composer-emoji/apple/1f5c4.png b/static/images/composer-emoji/apple/1f5c4.png
new file mode 100644
index 0000000000..80e276b535
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5c4.png differ
diff --git a/static/images/composer-emoji/apple/1f5d1.png b/static/images/composer-emoji/apple/1f5d1.png
new file mode 100644
index 0000000000..e492902dd9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5d1.png differ
diff --git a/static/images/composer-emoji/apple/1f5d2.png b/static/images/composer-emoji/apple/1f5d2.png
new file mode 100644
index 0000000000..c9a0781da5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5d2.png differ
diff --git a/static/images/composer-emoji/apple/1f5d3.png b/static/images/composer-emoji/apple/1f5d3.png
new file mode 100644
index 0000000000..75f2b9ce7e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5d3.png differ
diff --git a/static/images/composer-emoji/apple/1f5dc.png b/static/images/composer-emoji/apple/1f5dc.png
new file mode 100644
index 0000000000..d3d89e7f73
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5dc.png differ
diff --git a/static/images/composer-emoji/apple/1f5dd.png b/static/images/composer-emoji/apple/1f5dd.png
new file mode 100644
index 0000000000..2d9353cb1b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5dd.png differ
diff --git a/static/images/composer-emoji/apple/1f5de.png b/static/images/composer-emoji/apple/1f5de.png
new file mode 100644
index 0000000000..15c92fc580
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5de.png differ
diff --git a/static/images/composer-emoji/apple/1f5e1.png b/static/images/composer-emoji/apple/1f5e1.png
new file mode 100644
index 0000000000..6ae69156e1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5e1.png differ
diff --git a/static/images/composer-emoji/apple/1f5e3.png b/static/images/composer-emoji/apple/1f5e3.png
new file mode 100644
index 0000000000..0b8c9f0f6f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5e3.png differ
diff --git a/static/images/composer-emoji/apple/1f5e8.png b/static/images/composer-emoji/apple/1f5e8.png
new file mode 100644
index 0000000000..94432ae8dd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5e8.png differ
diff --git a/static/images/composer-emoji/apple/1f5ef.png b/static/images/composer-emoji/apple/1f5ef.png
new file mode 100644
index 0000000000..6eb260e3d3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5ef.png differ
diff --git a/static/images/composer-emoji/apple/1f5f3.png b/static/images/composer-emoji/apple/1f5f3.png
new file mode 100644
index 0000000000..8a5ddab472
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5f3.png differ
diff --git a/static/images/composer-emoji/apple/1f5fa.png b/static/images/composer-emoji/apple/1f5fa.png
new file mode 100644
index 0000000000..9111577721
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5fa.png differ
diff --git a/static/images/composer-emoji/apple/1f5fb.png b/static/images/composer-emoji/apple/1f5fb.png
new file mode 100644
index 0000000000..0e0d182df5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5fb.png differ
diff --git a/static/images/composer-emoji/apple/1f5fc.png b/static/images/composer-emoji/apple/1f5fc.png
new file mode 100644
index 0000000000..4a7f3490c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5fc.png differ
diff --git a/static/images/composer-emoji/apple/1f5fd.png b/static/images/composer-emoji/apple/1f5fd.png
new file mode 100644
index 0000000000..7a92c4fdc9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5fd.png differ
diff --git a/static/images/composer-emoji/apple/1f5fe.png b/static/images/composer-emoji/apple/1f5fe.png
new file mode 100644
index 0000000000..f84d3a613b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5fe.png differ
diff --git a/static/images/composer-emoji/apple/1f5ff.png b/static/images/composer-emoji/apple/1f5ff.png
new file mode 100644
index 0000000000..54b90abb57
Binary files /dev/null and b/static/images/composer-emoji/apple/1f5ff.png differ
diff --git a/static/images/composer-emoji/apple/1f600.png b/static/images/composer-emoji/apple/1f600.png
new file mode 100644
index 0000000000..b6db1b90a8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f600.png differ
diff --git a/static/images/composer-emoji/apple/1f601.png b/static/images/composer-emoji/apple/1f601.png
new file mode 100644
index 0000000000..573364ee15
Binary files /dev/null and b/static/images/composer-emoji/apple/1f601.png differ
diff --git a/static/images/composer-emoji/apple/1f602.png b/static/images/composer-emoji/apple/1f602.png
new file mode 100644
index 0000000000..ec8a3efb31
Binary files /dev/null and b/static/images/composer-emoji/apple/1f602.png differ
diff --git a/static/images/composer-emoji/apple/1f603.png b/static/images/composer-emoji/apple/1f603.png
new file mode 100644
index 0000000000..b7c4a9cecb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f603.png differ
diff --git a/static/images/composer-emoji/apple/1f604.png b/static/images/composer-emoji/apple/1f604.png
new file mode 100644
index 0000000000..7ffbe4c229
Binary files /dev/null and b/static/images/composer-emoji/apple/1f604.png differ
diff --git a/static/images/composer-emoji/apple/1f605.png b/static/images/composer-emoji/apple/1f605.png
new file mode 100644
index 0000000000..09d0d92260
Binary files /dev/null and b/static/images/composer-emoji/apple/1f605.png differ
diff --git a/static/images/composer-emoji/apple/1f606.png b/static/images/composer-emoji/apple/1f606.png
new file mode 100644
index 0000000000..d4b913ade4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f606.png differ
diff --git a/static/images/composer-emoji/apple/1f607.png b/static/images/composer-emoji/apple/1f607.png
new file mode 100644
index 0000000000..4a3f451911
Binary files /dev/null and b/static/images/composer-emoji/apple/1f607.png differ
diff --git a/static/images/composer-emoji/apple/1f608.png b/static/images/composer-emoji/apple/1f608.png
new file mode 100644
index 0000000000..6062876cd8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f608.png differ
diff --git a/static/images/composer-emoji/apple/1f609.png b/static/images/composer-emoji/apple/1f609.png
new file mode 100644
index 0000000000..a8d1417f88
Binary files /dev/null and b/static/images/composer-emoji/apple/1f609.png differ
diff --git a/static/images/composer-emoji/apple/1f60a.png b/static/images/composer-emoji/apple/1f60a.png
new file mode 100644
index 0000000000..d525e9f07c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60a.png differ
diff --git a/static/images/composer-emoji/apple/1f60b.png b/static/images/composer-emoji/apple/1f60b.png
new file mode 100644
index 0000000000..b74c099cb3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60b.png differ
diff --git a/static/images/composer-emoji/apple/1f60c.png b/static/images/composer-emoji/apple/1f60c.png
new file mode 100644
index 0000000000..89b5878753
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60c.png differ
diff --git a/static/images/composer-emoji/apple/1f60d.png b/static/images/composer-emoji/apple/1f60d.png
new file mode 100644
index 0000000000..dcf32b905a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60d.png differ
diff --git a/static/images/composer-emoji/apple/1f60e.png b/static/images/composer-emoji/apple/1f60e.png
new file mode 100644
index 0000000000..5eccf99c1a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60e.png differ
diff --git a/static/images/composer-emoji/apple/1f60f.png b/static/images/composer-emoji/apple/1f60f.png
new file mode 100644
index 0000000000..9ae4e9adb1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f60f.png differ
diff --git a/static/images/composer-emoji/apple/1f610.png b/static/images/composer-emoji/apple/1f610.png
new file mode 100644
index 0000000000..73c54e6dd6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f610.png differ
diff --git a/static/images/composer-emoji/apple/1f611.png b/static/images/composer-emoji/apple/1f611.png
new file mode 100644
index 0000000000..a67cbf14c7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f611.png differ
diff --git a/static/images/composer-emoji/apple/1f612.png b/static/images/composer-emoji/apple/1f612.png
new file mode 100644
index 0000000000..162494b19e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f612.png differ
diff --git a/static/images/composer-emoji/apple/1f613.png b/static/images/composer-emoji/apple/1f613.png
new file mode 100644
index 0000000000..c7858914a4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f613.png differ
diff --git a/static/images/composer-emoji/apple/1f614.png b/static/images/composer-emoji/apple/1f614.png
new file mode 100644
index 0000000000..471dd7fc94
Binary files /dev/null and b/static/images/composer-emoji/apple/1f614.png differ
diff --git a/static/images/composer-emoji/apple/1f615.png b/static/images/composer-emoji/apple/1f615.png
new file mode 100644
index 0000000000..761eeddb35
Binary files /dev/null and b/static/images/composer-emoji/apple/1f615.png differ
diff --git a/static/images/composer-emoji/apple/1f616.png b/static/images/composer-emoji/apple/1f616.png
new file mode 100644
index 0000000000..2940748263
Binary files /dev/null and b/static/images/composer-emoji/apple/1f616.png differ
diff --git a/static/images/composer-emoji/apple/1f617.png b/static/images/composer-emoji/apple/1f617.png
new file mode 100644
index 0000000000..ef20749d3e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f617.png differ
diff --git a/static/images/composer-emoji/apple/1f618.png b/static/images/composer-emoji/apple/1f618.png
new file mode 100644
index 0000000000..b90a13dfc8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f618.png differ
diff --git a/static/images/composer-emoji/apple/1f619.png b/static/images/composer-emoji/apple/1f619.png
new file mode 100644
index 0000000000..48a7851621
Binary files /dev/null and b/static/images/composer-emoji/apple/1f619.png differ
diff --git a/static/images/composer-emoji/apple/1f61a.png b/static/images/composer-emoji/apple/1f61a.png
new file mode 100644
index 0000000000..1cb9c55222
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61a.png differ
diff --git a/static/images/composer-emoji/apple/1f61b.png b/static/images/composer-emoji/apple/1f61b.png
new file mode 100644
index 0000000000..4ec3dac473
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61b.png differ
diff --git a/static/images/composer-emoji/apple/1f61c.png b/static/images/composer-emoji/apple/1f61c.png
new file mode 100644
index 0000000000..70e53c92c7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61c.png differ
diff --git a/static/images/composer-emoji/apple/1f61d.png b/static/images/composer-emoji/apple/1f61d.png
new file mode 100644
index 0000000000..1141522394
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61d.png differ
diff --git a/static/images/composer-emoji/apple/1f61e.png b/static/images/composer-emoji/apple/1f61e.png
new file mode 100644
index 0000000000..5207104199
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61e.png differ
diff --git a/static/images/composer-emoji/apple/1f61f.png b/static/images/composer-emoji/apple/1f61f.png
new file mode 100644
index 0000000000..7c3f35bf5d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f61f.png differ
diff --git a/static/images/composer-emoji/apple/1f620.png b/static/images/composer-emoji/apple/1f620.png
new file mode 100644
index 0000000000..41f4701aea
Binary files /dev/null and b/static/images/composer-emoji/apple/1f620.png differ
diff --git a/static/images/composer-emoji/apple/1f621.png b/static/images/composer-emoji/apple/1f621.png
new file mode 100644
index 0000000000..616c87194c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f621.png differ
diff --git a/static/images/composer-emoji/apple/1f622.png b/static/images/composer-emoji/apple/1f622.png
new file mode 100644
index 0000000000..fff864b08e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f622.png differ
diff --git a/static/images/composer-emoji/apple/1f623.png b/static/images/composer-emoji/apple/1f623.png
new file mode 100644
index 0000000000..a1704fc939
Binary files /dev/null and b/static/images/composer-emoji/apple/1f623.png differ
diff --git a/static/images/composer-emoji/apple/1f624.png b/static/images/composer-emoji/apple/1f624.png
new file mode 100644
index 0000000000..c06dd0214f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f624.png differ
diff --git a/static/images/composer-emoji/apple/1f625.png b/static/images/composer-emoji/apple/1f625.png
new file mode 100644
index 0000000000..284bb79a37
Binary files /dev/null and b/static/images/composer-emoji/apple/1f625.png differ
diff --git a/static/images/composer-emoji/apple/1f626.png b/static/images/composer-emoji/apple/1f626.png
new file mode 100644
index 0000000000..6d54ce6dee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f626.png differ
diff --git a/static/images/composer-emoji/apple/1f627.png b/static/images/composer-emoji/apple/1f627.png
new file mode 100644
index 0000000000..546e7e8da3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f627.png differ
diff --git a/static/images/composer-emoji/apple/1f628.png b/static/images/composer-emoji/apple/1f628.png
new file mode 100644
index 0000000000..1964fe3e14
Binary files /dev/null and b/static/images/composer-emoji/apple/1f628.png differ
diff --git a/static/images/composer-emoji/apple/1f629.png b/static/images/composer-emoji/apple/1f629.png
new file mode 100644
index 0000000000..4d9a688f3b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f629.png differ
diff --git a/static/images/composer-emoji/apple/1f62a.png b/static/images/composer-emoji/apple/1f62a.png
new file mode 100644
index 0000000000..fa7048bebb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62a.png differ
diff --git a/static/images/composer-emoji/apple/1f62b.png b/static/images/composer-emoji/apple/1f62b.png
new file mode 100644
index 0000000000..9688c17932
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62b.png differ
diff --git a/static/images/composer-emoji/apple/1f62c.png b/static/images/composer-emoji/apple/1f62c.png
new file mode 100644
index 0000000000..7136e9d154
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62c.png differ
diff --git a/static/images/composer-emoji/apple/1f62d.png b/static/images/composer-emoji/apple/1f62d.png
new file mode 100644
index 0000000000..014ba002e2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62d.png differ
diff --git a/static/images/composer-emoji/apple/1f62e.png b/static/images/composer-emoji/apple/1f62e.png
new file mode 100644
index 0000000000..9ef2eddf9e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62e.png differ
diff --git a/static/images/composer-emoji/apple/1f62f.png b/static/images/composer-emoji/apple/1f62f.png
new file mode 100644
index 0000000000..6ae71dd62c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f62f.png differ
diff --git a/static/images/composer-emoji/apple/1f630.png b/static/images/composer-emoji/apple/1f630.png
new file mode 100644
index 0000000000..dce0893327
Binary files /dev/null and b/static/images/composer-emoji/apple/1f630.png differ
diff --git a/static/images/composer-emoji/apple/1f631.png b/static/images/composer-emoji/apple/1f631.png
new file mode 100644
index 0000000000..195373d31c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f631.png differ
diff --git a/static/images/composer-emoji/apple/1f632.png b/static/images/composer-emoji/apple/1f632.png
new file mode 100644
index 0000000000..e7deefa214
Binary files /dev/null and b/static/images/composer-emoji/apple/1f632.png differ
diff --git a/static/images/composer-emoji/apple/1f633.png b/static/images/composer-emoji/apple/1f633.png
new file mode 100644
index 0000000000..8c719f6907
Binary files /dev/null and b/static/images/composer-emoji/apple/1f633.png differ
diff --git a/static/images/composer-emoji/apple/1f634.png b/static/images/composer-emoji/apple/1f634.png
new file mode 100644
index 0000000000..8d59514717
Binary files /dev/null and b/static/images/composer-emoji/apple/1f634.png differ
diff --git a/static/images/composer-emoji/apple/1f635.png b/static/images/composer-emoji/apple/1f635.png
new file mode 100644
index 0000000000..77f6b38238
Binary files /dev/null and b/static/images/composer-emoji/apple/1f635.png differ
diff --git a/static/images/composer-emoji/apple/1f636.png b/static/images/composer-emoji/apple/1f636.png
new file mode 100644
index 0000000000..fb956a54f4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f636.png differ
diff --git a/static/images/composer-emoji/apple/1f637.png b/static/images/composer-emoji/apple/1f637.png
new file mode 100644
index 0000000000..e7b6b50fd1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f637.png differ
diff --git a/static/images/composer-emoji/apple/1f638.png b/static/images/composer-emoji/apple/1f638.png
new file mode 100644
index 0000000000..c22677092a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f638.png differ
diff --git a/static/images/composer-emoji/apple/1f639.png b/static/images/composer-emoji/apple/1f639.png
new file mode 100644
index 0000000000..156d6c0731
Binary files /dev/null and b/static/images/composer-emoji/apple/1f639.png differ
diff --git a/static/images/composer-emoji/apple/1f63a.png b/static/images/composer-emoji/apple/1f63a.png
new file mode 100644
index 0000000000..7c8a947490
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63a.png differ
diff --git a/static/images/composer-emoji/apple/1f63b.png b/static/images/composer-emoji/apple/1f63b.png
new file mode 100644
index 0000000000..040a44815c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63b.png differ
diff --git a/static/images/composer-emoji/apple/1f63c.png b/static/images/composer-emoji/apple/1f63c.png
new file mode 100644
index 0000000000..1e9475f187
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63c.png differ
diff --git a/static/images/composer-emoji/apple/1f63d.png b/static/images/composer-emoji/apple/1f63d.png
new file mode 100644
index 0000000000..5e06199eb0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63d.png differ
diff --git a/static/images/composer-emoji/apple/1f63e.png b/static/images/composer-emoji/apple/1f63e.png
new file mode 100644
index 0000000000..423faf761e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63e.png differ
diff --git a/static/images/composer-emoji/apple/1f63f.png b/static/images/composer-emoji/apple/1f63f.png
new file mode 100644
index 0000000000..7acf459974
Binary files /dev/null and b/static/images/composer-emoji/apple/1f63f.png differ
diff --git a/static/images/composer-emoji/apple/1f640.png b/static/images/composer-emoji/apple/1f640.png
new file mode 100644
index 0000000000..ea226f15bc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f640.png differ
diff --git a/static/images/composer-emoji/apple/1f641.png b/static/images/composer-emoji/apple/1f641.png
new file mode 100644
index 0000000000..9402086c50
Binary files /dev/null and b/static/images/composer-emoji/apple/1f641.png differ
diff --git a/static/images/composer-emoji/apple/1f642.png b/static/images/composer-emoji/apple/1f642.png
new file mode 100644
index 0000000000..9c78ae464a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f642.png differ
diff --git a/static/images/composer-emoji/apple/1f643.png b/static/images/composer-emoji/apple/1f643.png
new file mode 100644
index 0000000000..b2e6e434cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f643.png differ
diff --git a/static/images/composer-emoji/apple/1f644.png b/static/images/composer-emoji/apple/1f644.png
new file mode 100644
index 0000000000..671780ebfb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f644.png differ
diff --git a/static/images/composer-emoji/apple/1f645-1f3fb.png b/static/images/composer-emoji/apple/1f645-1f3fb.png
new file mode 100644
index 0000000000..1c371e4216
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f645-1f3fc.png b/static/images/composer-emoji/apple/1f645-1f3fc.png
new file mode 100644
index 0000000000..44f4bb5937
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f645-1f3fd.png b/static/images/composer-emoji/apple/1f645-1f3fd.png
new file mode 100644
index 0000000000..20d47d8b05
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f645-1f3fe.png b/static/images/composer-emoji/apple/1f645-1f3fe.png
new file mode 100644
index 0000000000..fdaf1aa043
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f645-1f3ff.png b/static/images/composer-emoji/apple/1f645-1f3ff.png
new file mode 100644
index 0000000000..64c7431432
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f645.png b/static/images/composer-emoji/apple/1f645.png
new file mode 100644
index 0000000000..f2fd5489c3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f645.png differ
diff --git a/static/images/composer-emoji/apple/1f646-1f3fb.png b/static/images/composer-emoji/apple/1f646-1f3fb.png
new file mode 100644
index 0000000000..657112c7e8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f646-1f3fc.png b/static/images/composer-emoji/apple/1f646-1f3fc.png
new file mode 100644
index 0000000000..89e7fb386e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f646-1f3fd.png b/static/images/composer-emoji/apple/1f646-1f3fd.png
new file mode 100644
index 0000000000..bd41c3facc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f646-1f3fe.png b/static/images/composer-emoji/apple/1f646-1f3fe.png
new file mode 100644
index 0000000000..1f52684bd8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f646-1f3ff.png b/static/images/composer-emoji/apple/1f646-1f3ff.png
new file mode 100644
index 0000000000..0f6f8f9dad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f646.png b/static/images/composer-emoji/apple/1f646.png
new file mode 100644
index 0000000000..dcf7e37df0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f646.png differ
diff --git a/static/images/composer-emoji/apple/1f647-1f3fb.png b/static/images/composer-emoji/apple/1f647-1f3fb.png
new file mode 100644
index 0000000000..8205e0ae5d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f647-1f3fc.png b/static/images/composer-emoji/apple/1f647-1f3fc.png
new file mode 100644
index 0000000000..031339a102
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f647-1f3fd.png b/static/images/composer-emoji/apple/1f647-1f3fd.png
new file mode 100644
index 0000000000..bd428fbd29
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f647-1f3fe.png b/static/images/composer-emoji/apple/1f647-1f3fe.png
new file mode 100644
index 0000000000..e81ac42054
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f647-1f3ff.png b/static/images/composer-emoji/apple/1f647-1f3ff.png
new file mode 100644
index 0000000000..f254a33945
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f647.png b/static/images/composer-emoji/apple/1f647.png
new file mode 100644
index 0000000000..0fdd9b6b08
Binary files /dev/null and b/static/images/composer-emoji/apple/1f647.png differ
diff --git a/static/images/composer-emoji/apple/1f648.png b/static/images/composer-emoji/apple/1f648.png
new file mode 100644
index 0000000000..86b56c2470
Binary files /dev/null and b/static/images/composer-emoji/apple/1f648.png differ
diff --git a/static/images/composer-emoji/apple/1f649.png b/static/images/composer-emoji/apple/1f649.png
new file mode 100644
index 0000000000..b5426c5413
Binary files /dev/null and b/static/images/composer-emoji/apple/1f649.png differ
diff --git a/static/images/composer-emoji/apple/1f64a.png b/static/images/composer-emoji/apple/1f64a.png
new file mode 100644
index 0000000000..3456b15c5b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64a.png differ
diff --git a/static/images/composer-emoji/apple/1f64b-1f3fb.png b/static/images/composer-emoji/apple/1f64b-1f3fb.png
new file mode 100644
index 0000000000..3646986b97
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f64b-1f3fc.png b/static/images/composer-emoji/apple/1f64b-1f3fc.png
new file mode 100644
index 0000000000..b7ed2a7432
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f64b-1f3fd.png b/static/images/composer-emoji/apple/1f64b-1f3fd.png
new file mode 100644
index 0000000000..becc4b9f2b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f64b-1f3fe.png b/static/images/composer-emoji/apple/1f64b-1f3fe.png
new file mode 100644
index 0000000000..40671458e6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f64b-1f3ff.png b/static/images/composer-emoji/apple/1f64b-1f3ff.png
new file mode 100644
index 0000000000..2cdfe086a7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f64b.png b/static/images/composer-emoji/apple/1f64b.png
new file mode 100644
index 0000000000..93727d2ed0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64b.png differ
diff --git a/static/images/composer-emoji/apple/1f64c-1f3fb.png b/static/images/composer-emoji/apple/1f64c-1f3fb.png
new file mode 100644
index 0000000000..83d3f8fb02
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f64c-1f3fc.png b/static/images/composer-emoji/apple/1f64c-1f3fc.png
new file mode 100644
index 0000000000..0da11d8ea1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f64c-1f3fd.png b/static/images/composer-emoji/apple/1f64c-1f3fd.png
new file mode 100644
index 0000000000..5b139d2369
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f64c-1f3fe.png b/static/images/composer-emoji/apple/1f64c-1f3fe.png
new file mode 100644
index 0000000000..389a0049cb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f64c-1f3ff.png b/static/images/composer-emoji/apple/1f64c-1f3ff.png
new file mode 100644
index 0000000000..78d39ed2fc
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f64c.png b/static/images/composer-emoji/apple/1f64c.png
new file mode 100644
index 0000000000..0b8e039a6f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64c.png differ
diff --git a/static/images/composer-emoji/apple/1f64d-1f3fb.png b/static/images/composer-emoji/apple/1f64d-1f3fb.png
new file mode 100644
index 0000000000..0340f5405e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f64d-1f3fc.png b/static/images/composer-emoji/apple/1f64d-1f3fc.png
new file mode 100644
index 0000000000..57e8bc95b6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f64d-1f3fd.png b/static/images/composer-emoji/apple/1f64d-1f3fd.png
new file mode 100644
index 0000000000..c4eb91e5ed
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f64d-1f3fe.png b/static/images/composer-emoji/apple/1f64d-1f3fe.png
new file mode 100644
index 0000000000..a6590b4737
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f64d-1f3ff.png b/static/images/composer-emoji/apple/1f64d-1f3ff.png
new file mode 100644
index 0000000000..a0cbb73558
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f64d.png b/static/images/composer-emoji/apple/1f64d.png
new file mode 100644
index 0000000000..96a4cc143d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64d.png differ
diff --git a/static/images/composer-emoji/apple/1f64e-1f3fb.png b/static/images/composer-emoji/apple/1f64e-1f3fb.png
new file mode 100644
index 0000000000..838d1308f6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f64e-1f3fc.png b/static/images/composer-emoji/apple/1f64e-1f3fc.png
new file mode 100644
index 0000000000..a42bc7835d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f64e-1f3fd.png b/static/images/composer-emoji/apple/1f64e-1f3fd.png
new file mode 100644
index 0000000000..2c5eebabe9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f64e-1f3fe.png b/static/images/composer-emoji/apple/1f64e-1f3fe.png
new file mode 100644
index 0000000000..a65dcb33ca
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f64e-1f3ff.png b/static/images/composer-emoji/apple/1f64e-1f3ff.png
new file mode 100644
index 0000000000..eca56c24f9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f64e.png b/static/images/composer-emoji/apple/1f64e.png
new file mode 100644
index 0000000000..245e5960a2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64e.png differ
diff --git a/static/images/composer-emoji/apple/1f64f-1f3fb.png b/static/images/composer-emoji/apple/1f64f-1f3fb.png
new file mode 100644
index 0000000000..62d0dfe628
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f64f-1f3fc.png b/static/images/composer-emoji/apple/1f64f-1f3fc.png
new file mode 100644
index 0000000000..1690c3ccc3
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f64f-1f3fd.png b/static/images/composer-emoji/apple/1f64f-1f3fd.png
new file mode 100644
index 0000000000..bdc3228571
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f64f-1f3fe.png b/static/images/composer-emoji/apple/1f64f-1f3fe.png
new file mode 100644
index 0000000000..671b42a161
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f64f-1f3ff.png b/static/images/composer-emoji/apple/1f64f-1f3ff.png
new file mode 100644
index 0000000000..84e4add8ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f64f.png b/static/images/composer-emoji/apple/1f64f.png
new file mode 100644
index 0000000000..fed834e9c6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f64f.png differ
diff --git a/static/images/composer-emoji/apple/1f680.png b/static/images/composer-emoji/apple/1f680.png
new file mode 100644
index 0000000000..8d18fb196f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f680.png differ
diff --git a/static/images/composer-emoji/apple/1f681.png b/static/images/composer-emoji/apple/1f681.png
new file mode 100644
index 0000000000..ab312854d1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f681.png differ
diff --git a/static/images/composer-emoji/apple/1f682.png b/static/images/composer-emoji/apple/1f682.png
new file mode 100644
index 0000000000..56ca3ca1d0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f682.png differ
diff --git a/static/images/composer-emoji/apple/1f683.png b/static/images/composer-emoji/apple/1f683.png
new file mode 100644
index 0000000000..9d223be64e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f683.png differ
diff --git a/static/images/composer-emoji/apple/1f684.png b/static/images/composer-emoji/apple/1f684.png
new file mode 100644
index 0000000000..63bd0a774d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f684.png differ
diff --git a/static/images/composer-emoji/apple/1f685.png b/static/images/composer-emoji/apple/1f685.png
new file mode 100644
index 0000000000..3da5e9f3af
Binary files /dev/null and b/static/images/composer-emoji/apple/1f685.png differ
diff --git a/static/images/composer-emoji/apple/1f686.png b/static/images/composer-emoji/apple/1f686.png
new file mode 100644
index 0000000000..d73de3dbd0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f686.png differ
diff --git a/static/images/composer-emoji/apple/1f687.png b/static/images/composer-emoji/apple/1f687.png
new file mode 100644
index 0000000000..ae9b85dea7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f687.png differ
diff --git a/static/images/composer-emoji/apple/1f688.png b/static/images/composer-emoji/apple/1f688.png
new file mode 100644
index 0000000000..214c9fd62e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f688.png differ
diff --git a/static/images/composer-emoji/apple/1f689.png b/static/images/composer-emoji/apple/1f689.png
new file mode 100644
index 0000000000..b609e6f181
Binary files /dev/null and b/static/images/composer-emoji/apple/1f689.png differ
diff --git a/static/images/composer-emoji/apple/1f68a.png b/static/images/composer-emoji/apple/1f68a.png
new file mode 100644
index 0000000000..21c18f073a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68a.png differ
diff --git a/static/images/composer-emoji/apple/1f68b.png b/static/images/composer-emoji/apple/1f68b.png
new file mode 100644
index 0000000000..776485347e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68b.png differ
diff --git a/static/images/composer-emoji/apple/1f68c.png b/static/images/composer-emoji/apple/1f68c.png
new file mode 100644
index 0000000000..dd7264cff2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68c.png differ
diff --git a/static/images/composer-emoji/apple/1f68d.png b/static/images/composer-emoji/apple/1f68d.png
new file mode 100644
index 0000000000..fe7e41b0a9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68d.png differ
diff --git a/static/images/composer-emoji/apple/1f68e.png b/static/images/composer-emoji/apple/1f68e.png
new file mode 100644
index 0000000000..2190a2e167
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68e.png differ
diff --git a/static/images/composer-emoji/apple/1f68f.png b/static/images/composer-emoji/apple/1f68f.png
new file mode 100644
index 0000000000..113f911138
Binary files /dev/null and b/static/images/composer-emoji/apple/1f68f.png differ
diff --git a/static/images/composer-emoji/apple/1f690.png b/static/images/composer-emoji/apple/1f690.png
new file mode 100644
index 0000000000..b3c3d8b7df
Binary files /dev/null and b/static/images/composer-emoji/apple/1f690.png differ
diff --git a/static/images/composer-emoji/apple/1f691.png b/static/images/composer-emoji/apple/1f691.png
new file mode 100644
index 0000000000..dd713b4eda
Binary files /dev/null and b/static/images/composer-emoji/apple/1f691.png differ
diff --git a/static/images/composer-emoji/apple/1f692.png b/static/images/composer-emoji/apple/1f692.png
new file mode 100644
index 0000000000..d614ffa5b8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f692.png differ
diff --git a/static/images/composer-emoji/apple/1f693.png b/static/images/composer-emoji/apple/1f693.png
new file mode 100644
index 0000000000..ee1e9dac93
Binary files /dev/null and b/static/images/composer-emoji/apple/1f693.png differ
diff --git a/static/images/composer-emoji/apple/1f694.png b/static/images/composer-emoji/apple/1f694.png
new file mode 100644
index 0000000000..25e75c4ab7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f694.png differ
diff --git a/static/images/composer-emoji/apple/1f695.png b/static/images/composer-emoji/apple/1f695.png
new file mode 100644
index 0000000000..3978086e8b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f695.png differ
diff --git a/static/images/composer-emoji/apple/1f696.png b/static/images/composer-emoji/apple/1f696.png
new file mode 100644
index 0000000000..2109492a71
Binary files /dev/null and b/static/images/composer-emoji/apple/1f696.png differ
diff --git a/static/images/composer-emoji/apple/1f697.png b/static/images/composer-emoji/apple/1f697.png
new file mode 100644
index 0000000000..5b725935d4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f697.png differ
diff --git a/static/images/composer-emoji/apple/1f698.png b/static/images/composer-emoji/apple/1f698.png
new file mode 100644
index 0000000000..74564a7f2d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f698.png differ
diff --git a/static/images/composer-emoji/apple/1f699.png b/static/images/composer-emoji/apple/1f699.png
new file mode 100644
index 0000000000..8017308a75
Binary files /dev/null and b/static/images/composer-emoji/apple/1f699.png differ
diff --git a/static/images/composer-emoji/apple/1f69a.png b/static/images/composer-emoji/apple/1f69a.png
new file mode 100644
index 0000000000..5b364109f2
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69a.png differ
diff --git a/static/images/composer-emoji/apple/1f69b.png b/static/images/composer-emoji/apple/1f69b.png
new file mode 100644
index 0000000000..a843399aeb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69b.png differ
diff --git a/static/images/composer-emoji/apple/1f69c.png b/static/images/composer-emoji/apple/1f69c.png
new file mode 100644
index 0000000000..af41caefdf
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69c.png differ
diff --git a/static/images/composer-emoji/apple/1f69d.png b/static/images/composer-emoji/apple/1f69d.png
new file mode 100644
index 0000000000..52a9f973ec
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69d.png differ
diff --git a/static/images/composer-emoji/apple/1f69e.png b/static/images/composer-emoji/apple/1f69e.png
new file mode 100644
index 0000000000..b22bffd27d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69e.png differ
diff --git a/static/images/composer-emoji/apple/1f69f.png b/static/images/composer-emoji/apple/1f69f.png
new file mode 100644
index 0000000000..87c8d9a61f
Binary files /dev/null and b/static/images/composer-emoji/apple/1f69f.png differ
diff --git a/static/images/composer-emoji/apple/1f6a0.png b/static/images/composer-emoji/apple/1f6a0.png
new file mode 100644
index 0000000000..c4cb7c8253
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a0.png differ
diff --git a/static/images/composer-emoji/apple/1f6a1.png b/static/images/composer-emoji/apple/1f6a1.png
new file mode 100644
index 0000000000..867460d1fb
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a1.png differ
diff --git a/static/images/composer-emoji/apple/1f6a2.png b/static/images/composer-emoji/apple/1f6a2.png
new file mode 100644
index 0000000000..1bdd15510c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a2.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3-1f3fb.png b/static/images/composer-emoji/apple/1f6a3-1f3fb.png
new file mode 100644
index 0000000000..c58c39911c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3-1f3fc.png b/static/images/composer-emoji/apple/1f6a3-1f3fc.png
new file mode 100644
index 0000000000..61be71e432
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3-1f3fd.png b/static/images/composer-emoji/apple/1f6a3-1f3fd.png
new file mode 100644
index 0000000000..68a0731145
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3-1f3fe.png b/static/images/composer-emoji/apple/1f6a3-1f3fe.png
new file mode 100644
index 0000000000..91d3238119
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3-1f3ff.png b/static/images/composer-emoji/apple/1f6a3-1f3ff.png
new file mode 100644
index 0000000000..b6a12086b1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f6a3.png b/static/images/composer-emoji/apple/1f6a3.png
new file mode 100644
index 0000000000..79809931e7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a3.png differ
diff --git a/static/images/composer-emoji/apple/1f6a4.png b/static/images/composer-emoji/apple/1f6a4.png
new file mode 100644
index 0000000000..6e02d8051e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a4.png differ
diff --git a/static/images/composer-emoji/apple/1f6a5.png b/static/images/composer-emoji/apple/1f6a5.png
new file mode 100644
index 0000000000..3cc9ed50ba
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a5.png differ
diff --git a/static/images/composer-emoji/apple/1f6a6.png b/static/images/composer-emoji/apple/1f6a6.png
new file mode 100644
index 0000000000..fa07cc5d62
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a6.png differ
diff --git a/static/images/composer-emoji/apple/1f6a7.png b/static/images/composer-emoji/apple/1f6a7.png
new file mode 100644
index 0000000000..5bb6365c5a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a7.png differ
diff --git a/static/images/composer-emoji/apple/1f6a8.png b/static/images/composer-emoji/apple/1f6a8.png
new file mode 100644
index 0000000000..eb57af35ad
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a8.png differ
diff --git a/static/images/composer-emoji/apple/1f6a9.png b/static/images/composer-emoji/apple/1f6a9.png
new file mode 100644
index 0000000000..691ded5499
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6a9.png differ
diff --git a/static/images/composer-emoji/apple/1f6aa.png b/static/images/composer-emoji/apple/1f6aa.png
new file mode 100644
index 0000000000..f63da9776b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6aa.png differ
diff --git a/static/images/composer-emoji/apple/1f6ab.png b/static/images/composer-emoji/apple/1f6ab.png
new file mode 100644
index 0000000000..3bc50f5192
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ab.png differ
diff --git a/static/images/composer-emoji/apple/1f6ac.png b/static/images/composer-emoji/apple/1f6ac.png
new file mode 100644
index 0000000000..35129ec053
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ac.png differ
diff --git a/static/images/composer-emoji/apple/1f6ad.png b/static/images/composer-emoji/apple/1f6ad.png
new file mode 100644
index 0000000000..1944e79ba6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ad.png differ
diff --git a/static/images/composer-emoji/apple/1f6ae.png b/static/images/composer-emoji/apple/1f6ae.png
new file mode 100644
index 0000000000..594f35091c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ae.png differ
diff --git a/static/images/composer-emoji/apple/1f6af.png b/static/images/composer-emoji/apple/1f6af.png
new file mode 100644
index 0000000000..514b4f852e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6af.png differ
diff --git a/static/images/composer-emoji/apple/1f6b0.png b/static/images/composer-emoji/apple/1f6b0.png
new file mode 100644
index 0000000000..efa1261a8d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b0.png differ
diff --git a/static/images/composer-emoji/apple/1f6b1.png b/static/images/composer-emoji/apple/1f6b1.png
new file mode 100644
index 0000000000..40c953dd0d
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b1.png differ
diff --git a/static/images/composer-emoji/apple/1f6b2.png b/static/images/composer-emoji/apple/1f6b2.png
new file mode 100644
index 0000000000..3e895966a6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b2.png differ
diff --git a/static/images/composer-emoji/apple/1f6b3.png b/static/images/composer-emoji/apple/1f6b3.png
new file mode 100644
index 0000000000..8e7ebed9ae
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b3.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4-1f3fb.png b/static/images/composer-emoji/apple/1f6b4-1f3fb.png
new file mode 100644
index 0000000000..52e408b512
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4-1f3fc.png b/static/images/composer-emoji/apple/1f6b4-1f3fc.png
new file mode 100644
index 0000000000..4a8267938a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4-1f3fd.png b/static/images/composer-emoji/apple/1f6b4-1f3fd.png
new file mode 100644
index 0000000000..847b745133
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4-1f3fe.png b/static/images/composer-emoji/apple/1f6b4-1f3fe.png
new file mode 100644
index 0000000000..e399070874
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4-1f3ff.png b/static/images/composer-emoji/apple/1f6b4-1f3ff.png
new file mode 100644
index 0000000000..1d8066b75c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f6b4.png b/static/images/composer-emoji/apple/1f6b4.png
new file mode 100644
index 0000000000..e083db8682
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b4.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5-1f3fb.png b/static/images/composer-emoji/apple/1f6b5-1f3fb.png
new file mode 100644
index 0000000000..5783b85014
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5-1f3fc.png b/static/images/composer-emoji/apple/1f6b5-1f3fc.png
new file mode 100644
index 0000000000..6cd56fb133
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5-1f3fd.png b/static/images/composer-emoji/apple/1f6b5-1f3fd.png
new file mode 100644
index 0000000000..fa5b634c71
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5-1f3fe.png b/static/images/composer-emoji/apple/1f6b5-1f3fe.png
new file mode 100644
index 0000000000..7820c34799
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5-1f3ff.png b/static/images/composer-emoji/apple/1f6b5-1f3ff.png
new file mode 100644
index 0000000000..6c7a3d423a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f6b5.png b/static/images/composer-emoji/apple/1f6b5.png
new file mode 100644
index 0000000000..141bfab703
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b5.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6-1f3fb.png b/static/images/composer-emoji/apple/1f6b6-1f3fb.png
new file mode 100644
index 0000000000..c4a06ef380
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6-1f3fc.png b/static/images/composer-emoji/apple/1f6b6-1f3fc.png
new file mode 100644
index 0000000000..38f8c70ee1
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6-1f3fd.png b/static/images/composer-emoji/apple/1f6b6-1f3fd.png
new file mode 100644
index 0000000000..3505bd78e0
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6-1f3fe.png b/static/images/composer-emoji/apple/1f6b6-1f3fe.png
new file mode 100644
index 0000000000..ebea10b24a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6-1f3ff.png b/static/images/composer-emoji/apple/1f6b6-1f3ff.png
new file mode 100644
index 0000000000..5e6f3cb1b8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f6b6.png b/static/images/composer-emoji/apple/1f6b6.png
new file mode 100644
index 0000000000..8fa6f7a3c9
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b6.png differ
diff --git a/static/images/composer-emoji/apple/1f6b7.png b/static/images/composer-emoji/apple/1f6b7.png
new file mode 100644
index 0000000000..b8f8e0e1b4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b7.png differ
diff --git a/static/images/composer-emoji/apple/1f6b8.png b/static/images/composer-emoji/apple/1f6b8.png
new file mode 100644
index 0000000000..01b8f2d863
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b8.png differ
diff --git a/static/images/composer-emoji/apple/1f6b9.png b/static/images/composer-emoji/apple/1f6b9.png
new file mode 100644
index 0000000000..7af0424364
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6b9.png differ
diff --git a/static/images/composer-emoji/apple/1f6ba.png b/static/images/composer-emoji/apple/1f6ba.png
new file mode 100644
index 0000000000..add4d5e9c8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ba.png differ
diff --git a/static/images/composer-emoji/apple/1f6bb.png b/static/images/composer-emoji/apple/1f6bb.png
new file mode 100644
index 0000000000..3a2d2bd81a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6bb.png differ
diff --git a/static/images/composer-emoji/apple/1f6bc.png b/static/images/composer-emoji/apple/1f6bc.png
new file mode 100644
index 0000000000..294e0e01d4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6bc.png differ
diff --git a/static/images/composer-emoji/apple/1f6bd.png b/static/images/composer-emoji/apple/1f6bd.png
new file mode 100644
index 0000000000..bec734c7ab
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6bd.png differ
diff --git a/static/images/composer-emoji/apple/1f6be.png b/static/images/composer-emoji/apple/1f6be.png
new file mode 100644
index 0000000000..d90b01dc43
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6be.png differ
diff --git a/static/images/composer-emoji/apple/1f6bf.png b/static/images/composer-emoji/apple/1f6bf.png
new file mode 100644
index 0000000000..031f47d57a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6bf.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0-1f3fb.png b/static/images/composer-emoji/apple/1f6c0-1f3fb.png
new file mode 100644
index 0000000000..84b66b77fd
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0-1f3fc.png b/static/images/composer-emoji/apple/1f6c0-1f3fc.png
new file mode 100644
index 0000000000..b8cb419647
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0-1f3fd.png b/static/images/composer-emoji/apple/1f6c0-1f3fd.png
new file mode 100644
index 0000000000..1bbda06e8c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0-1f3fe.png b/static/images/composer-emoji/apple/1f6c0-1f3fe.png
new file mode 100644
index 0000000000..d6e32ec366
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0-1f3ff.png b/static/images/composer-emoji/apple/1f6c0-1f3ff.png
new file mode 100644
index 0000000000..214a33b5c8
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f6c0.png b/static/images/composer-emoji/apple/1f6c0.png
new file mode 100644
index 0000000000..9051b7a5f5
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c0.png differ
diff --git a/static/images/composer-emoji/apple/1f6c1.png b/static/images/composer-emoji/apple/1f6c1.png
new file mode 100644
index 0000000000..60435837ee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c1.png differ
diff --git a/static/images/composer-emoji/apple/1f6c2.png b/static/images/composer-emoji/apple/1f6c2.png
new file mode 100644
index 0000000000..620f137333
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c2.png differ
diff --git a/static/images/composer-emoji/apple/1f6c3.png b/static/images/composer-emoji/apple/1f6c3.png
new file mode 100644
index 0000000000..5d25447817
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c3.png differ
diff --git a/static/images/composer-emoji/apple/1f6c4.png b/static/images/composer-emoji/apple/1f6c4.png
new file mode 100644
index 0000000000..e45f23c412
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c4.png differ
diff --git a/static/images/composer-emoji/apple/1f6c5.png b/static/images/composer-emoji/apple/1f6c5.png
new file mode 100644
index 0000000000..59d60b975e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6c5.png differ
diff --git a/static/images/composer-emoji/apple/1f6cb.png b/static/images/composer-emoji/apple/1f6cb.png
new file mode 100644
index 0000000000..373ade878a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6cb.png differ
diff --git a/static/images/composer-emoji/apple/1f6cc.png b/static/images/composer-emoji/apple/1f6cc.png
new file mode 100644
index 0000000000..e95e02e21a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6cc.png differ
diff --git a/static/images/composer-emoji/apple/1f6cd.png b/static/images/composer-emoji/apple/1f6cd.png
new file mode 100644
index 0000000000..6b89e7460c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6cd.png differ
diff --git a/static/images/composer-emoji/apple/1f6ce.png b/static/images/composer-emoji/apple/1f6ce.png
new file mode 100644
index 0000000000..147abbae3c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ce.png differ
diff --git a/static/images/composer-emoji/apple/1f6cf.png b/static/images/composer-emoji/apple/1f6cf.png
new file mode 100644
index 0000000000..7342d85c43
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6cf.png differ
diff --git a/static/images/composer-emoji/apple/1f6d0.png b/static/images/composer-emoji/apple/1f6d0.png
new file mode 100644
index 0000000000..659494095c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6d0.png differ
diff --git a/static/images/composer-emoji/apple/1f6e0.png b/static/images/composer-emoji/apple/1f6e0.png
new file mode 100644
index 0000000000..01bd8b7742
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e0.png differ
diff --git a/static/images/composer-emoji/apple/1f6e1.png b/static/images/composer-emoji/apple/1f6e1.png
new file mode 100644
index 0000000000..f16659e951
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e1.png differ
diff --git a/static/images/composer-emoji/apple/1f6e2.png b/static/images/composer-emoji/apple/1f6e2.png
new file mode 100644
index 0000000000..863efaf042
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e2.png differ
diff --git a/static/images/composer-emoji/apple/1f6e3.png b/static/images/composer-emoji/apple/1f6e3.png
new file mode 100644
index 0000000000..40974dfd25
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e3.png differ
diff --git a/static/images/composer-emoji/apple/1f6e4.png b/static/images/composer-emoji/apple/1f6e4.png
new file mode 100644
index 0000000000..12f92ea306
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e4.png differ
diff --git a/static/images/composer-emoji/apple/1f6e5.png b/static/images/composer-emoji/apple/1f6e5.png
new file mode 100644
index 0000000000..f10e0051fe
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e5.png differ
diff --git a/static/images/composer-emoji/apple/1f6e9.png b/static/images/composer-emoji/apple/1f6e9.png
new file mode 100644
index 0000000000..7c88c6f489
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6e9.png differ
diff --git a/static/images/composer-emoji/apple/1f6eb.png b/static/images/composer-emoji/apple/1f6eb.png
new file mode 100644
index 0000000000..8d7350f534
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6eb.png differ
diff --git a/static/images/composer-emoji/apple/1f6ec.png b/static/images/composer-emoji/apple/1f6ec.png
new file mode 100644
index 0000000000..1ecdc22927
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6ec.png differ
diff --git a/static/images/composer-emoji/apple/1f6f0.png b/static/images/composer-emoji/apple/1f6f0.png
new file mode 100644
index 0000000000..210fee4e58
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6f0.png differ
diff --git a/static/images/composer-emoji/apple/1f6f3.png b/static/images/composer-emoji/apple/1f6f3.png
new file mode 100644
index 0000000000..cf0458e414
Binary files /dev/null and b/static/images/composer-emoji/apple/1f6f3.png differ
diff --git a/static/images/composer-emoji/apple/1f910.png b/static/images/composer-emoji/apple/1f910.png
new file mode 100644
index 0000000000..20c3351459
Binary files /dev/null and b/static/images/composer-emoji/apple/1f910.png differ
diff --git a/static/images/composer-emoji/apple/1f911.png b/static/images/composer-emoji/apple/1f911.png
new file mode 100644
index 0000000000..ed04e63846
Binary files /dev/null and b/static/images/composer-emoji/apple/1f911.png differ
diff --git a/static/images/composer-emoji/apple/1f912.png b/static/images/composer-emoji/apple/1f912.png
new file mode 100644
index 0000000000..17f8745b21
Binary files /dev/null and b/static/images/composer-emoji/apple/1f912.png differ
diff --git a/static/images/composer-emoji/apple/1f913.png b/static/images/composer-emoji/apple/1f913.png
new file mode 100644
index 0000000000..5e460be856
Binary files /dev/null and b/static/images/composer-emoji/apple/1f913.png differ
diff --git a/static/images/composer-emoji/apple/1f914.png b/static/images/composer-emoji/apple/1f914.png
new file mode 100644
index 0000000000..503f603064
Binary files /dev/null and b/static/images/composer-emoji/apple/1f914.png differ
diff --git a/static/images/composer-emoji/apple/1f915.png b/static/images/composer-emoji/apple/1f915.png
new file mode 100644
index 0000000000..827e7ec89e
Binary files /dev/null and b/static/images/composer-emoji/apple/1f915.png differ
diff --git a/static/images/composer-emoji/apple/1f916.png b/static/images/composer-emoji/apple/1f916.png
new file mode 100644
index 0000000000..c16e9babc4
Binary files /dev/null and b/static/images/composer-emoji/apple/1f916.png differ
diff --git a/static/images/composer-emoji/apple/1f917.png b/static/images/composer-emoji/apple/1f917.png
new file mode 100644
index 0000000000..6988c3e1a7
Binary files /dev/null and b/static/images/composer-emoji/apple/1f917.png differ
diff --git a/static/images/composer-emoji/apple/1f918-1f3fb.png b/static/images/composer-emoji/apple/1f918-1f3fb.png
new file mode 100644
index 0000000000..be5592e3b6
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/1f918-1f3fc.png b/static/images/composer-emoji/apple/1f918-1f3fc.png
new file mode 100644
index 0000000000..dabaa2a598
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/1f918-1f3fd.png b/static/images/composer-emoji/apple/1f918-1f3fd.png
new file mode 100644
index 0000000000..14f9e674da
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/1f918-1f3fe.png b/static/images/composer-emoji/apple/1f918-1f3fe.png
new file mode 100644
index 0000000000..1220f3d27a
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/1f918-1f3ff.png b/static/images/composer-emoji/apple/1f918-1f3ff.png
new file mode 100644
index 0000000000..49503039de
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/1f918.png b/static/images/composer-emoji/apple/1f918.png
new file mode 100644
index 0000000000..f434e3c077
Binary files /dev/null and b/static/images/composer-emoji/apple/1f918.png differ
diff --git a/static/images/composer-emoji/apple/1f980.png b/static/images/composer-emoji/apple/1f980.png
new file mode 100644
index 0000000000..76fd5e597c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f980.png differ
diff --git a/static/images/composer-emoji/apple/1f981.png b/static/images/composer-emoji/apple/1f981.png
new file mode 100644
index 0000000000..3722ff8bee
Binary files /dev/null and b/static/images/composer-emoji/apple/1f981.png differ
diff --git a/static/images/composer-emoji/apple/1f982.png b/static/images/composer-emoji/apple/1f982.png
new file mode 100644
index 0000000000..8eb9585675
Binary files /dev/null and b/static/images/composer-emoji/apple/1f982.png differ
diff --git a/static/images/composer-emoji/apple/1f983.png b/static/images/composer-emoji/apple/1f983.png
new file mode 100644
index 0000000000..0f9e2d8c93
Binary files /dev/null and b/static/images/composer-emoji/apple/1f983.png differ
diff --git a/static/images/composer-emoji/apple/1f984.png b/static/images/composer-emoji/apple/1f984.png
new file mode 100644
index 0000000000..c62098ab4b
Binary files /dev/null and b/static/images/composer-emoji/apple/1f984.png differ
diff --git a/static/images/composer-emoji/apple/1f9c0.png b/static/images/composer-emoji/apple/1f9c0.png
new file mode 100644
index 0000000000..467505d00c
Binary files /dev/null and b/static/images/composer-emoji/apple/1f9c0.png differ
diff --git a/static/images/composer-emoji/apple/203c.png b/static/images/composer-emoji/apple/203c.png
new file mode 100644
index 0000000000..76f7c49945
Binary files /dev/null and b/static/images/composer-emoji/apple/203c.png differ
diff --git a/static/images/composer-emoji/apple/2049.png b/static/images/composer-emoji/apple/2049.png
new file mode 100644
index 0000000000..405dfa8488
Binary files /dev/null and b/static/images/composer-emoji/apple/2049.png differ
diff --git a/static/images/composer-emoji/apple/2122.png b/static/images/composer-emoji/apple/2122.png
new file mode 100644
index 0000000000..656d3ab5b8
Binary files /dev/null and b/static/images/composer-emoji/apple/2122.png differ
diff --git a/static/images/composer-emoji/apple/2139.png b/static/images/composer-emoji/apple/2139.png
new file mode 100644
index 0000000000..7016684618
Binary files /dev/null and b/static/images/composer-emoji/apple/2139.png differ
diff --git a/static/images/composer-emoji/apple/2194.png b/static/images/composer-emoji/apple/2194.png
new file mode 100644
index 0000000000..bec3acf0d1
Binary files /dev/null and b/static/images/composer-emoji/apple/2194.png differ
diff --git a/static/images/composer-emoji/apple/2195.png b/static/images/composer-emoji/apple/2195.png
new file mode 100644
index 0000000000..8e801f08fd
Binary files /dev/null and b/static/images/composer-emoji/apple/2195.png differ
diff --git a/static/images/composer-emoji/apple/2196.png b/static/images/composer-emoji/apple/2196.png
new file mode 100644
index 0000000000..2c533eebd7
Binary files /dev/null and b/static/images/composer-emoji/apple/2196.png differ
diff --git a/static/images/composer-emoji/apple/2197.png b/static/images/composer-emoji/apple/2197.png
new file mode 100644
index 0000000000..41ca38caad
Binary files /dev/null and b/static/images/composer-emoji/apple/2197.png differ
diff --git a/static/images/composer-emoji/apple/2198.png b/static/images/composer-emoji/apple/2198.png
new file mode 100644
index 0000000000..38521bb2dd
Binary files /dev/null and b/static/images/composer-emoji/apple/2198.png differ
diff --git a/static/images/composer-emoji/apple/2199.png b/static/images/composer-emoji/apple/2199.png
new file mode 100644
index 0000000000..fe8472136c
Binary files /dev/null and b/static/images/composer-emoji/apple/2199.png differ
diff --git a/static/images/composer-emoji/apple/21a9.png b/static/images/composer-emoji/apple/21a9.png
new file mode 100644
index 0000000000..6797eabb8f
Binary files /dev/null and b/static/images/composer-emoji/apple/21a9.png differ
diff --git a/static/images/composer-emoji/apple/21aa.png b/static/images/composer-emoji/apple/21aa.png
new file mode 100644
index 0000000000..9c25993cbc
Binary files /dev/null and b/static/images/composer-emoji/apple/21aa.png differ
diff --git a/static/images/composer-emoji/apple/231a.png b/static/images/composer-emoji/apple/231a.png
new file mode 100644
index 0000000000..cf2d4da04a
Binary files /dev/null and b/static/images/composer-emoji/apple/231a.png differ
diff --git a/static/images/composer-emoji/apple/231b.png b/static/images/composer-emoji/apple/231b.png
new file mode 100644
index 0000000000..61ba070bdd
Binary files /dev/null and b/static/images/composer-emoji/apple/231b.png differ
diff --git a/static/images/composer-emoji/apple/2328.png b/static/images/composer-emoji/apple/2328.png
new file mode 100644
index 0000000000..a876c9637d
Binary files /dev/null and b/static/images/composer-emoji/apple/2328.png differ
diff --git a/static/images/composer-emoji/apple/23e9.png b/static/images/composer-emoji/apple/23e9.png
new file mode 100644
index 0000000000..18ccf97a1b
Binary files /dev/null and b/static/images/composer-emoji/apple/23e9.png differ
diff --git a/static/images/composer-emoji/apple/23ea.png b/static/images/composer-emoji/apple/23ea.png
new file mode 100644
index 0000000000..ee5ee5cc64
Binary files /dev/null and b/static/images/composer-emoji/apple/23ea.png differ
diff --git a/static/images/composer-emoji/apple/23eb.png b/static/images/composer-emoji/apple/23eb.png
new file mode 100644
index 0000000000..1f9104d77a
Binary files /dev/null and b/static/images/composer-emoji/apple/23eb.png differ
diff --git a/static/images/composer-emoji/apple/23ec.png b/static/images/composer-emoji/apple/23ec.png
new file mode 100644
index 0000000000..8f629ddfe4
Binary files /dev/null and b/static/images/composer-emoji/apple/23ec.png differ
diff --git a/static/images/composer-emoji/apple/23ed.png b/static/images/composer-emoji/apple/23ed.png
new file mode 100644
index 0000000000..1fec1e1de9
Binary files /dev/null and b/static/images/composer-emoji/apple/23ed.png differ
diff --git a/static/images/composer-emoji/apple/23ee.png b/static/images/composer-emoji/apple/23ee.png
new file mode 100644
index 0000000000..79312ef02b
Binary files /dev/null and b/static/images/composer-emoji/apple/23ee.png differ
diff --git a/static/images/composer-emoji/apple/23ef.png b/static/images/composer-emoji/apple/23ef.png
new file mode 100644
index 0000000000..1bade16b85
Binary files /dev/null and b/static/images/composer-emoji/apple/23ef.png differ
diff --git a/static/images/composer-emoji/apple/23f0.png b/static/images/composer-emoji/apple/23f0.png
new file mode 100644
index 0000000000..29c4396064
Binary files /dev/null and b/static/images/composer-emoji/apple/23f0.png differ
diff --git a/static/images/composer-emoji/apple/23f1.png b/static/images/composer-emoji/apple/23f1.png
new file mode 100644
index 0000000000..ecc3723425
Binary files /dev/null and b/static/images/composer-emoji/apple/23f1.png differ
diff --git a/static/images/composer-emoji/apple/23f2.png b/static/images/composer-emoji/apple/23f2.png
new file mode 100644
index 0000000000..d9d535e22c
Binary files /dev/null and b/static/images/composer-emoji/apple/23f2.png differ
diff --git a/static/images/composer-emoji/apple/23f3.png b/static/images/composer-emoji/apple/23f3.png
new file mode 100644
index 0000000000..dbe147e9ac
Binary files /dev/null and b/static/images/composer-emoji/apple/23f3.png differ
diff --git a/static/images/composer-emoji/apple/23f8.png b/static/images/composer-emoji/apple/23f8.png
new file mode 100644
index 0000000000..12b4a29efd
Binary files /dev/null and b/static/images/composer-emoji/apple/23f8.png differ
diff --git a/static/images/composer-emoji/apple/23f9.png b/static/images/composer-emoji/apple/23f9.png
new file mode 100644
index 0000000000..5f4a9247ed
Binary files /dev/null and b/static/images/composer-emoji/apple/23f9.png differ
diff --git a/static/images/composer-emoji/apple/23fa.png b/static/images/composer-emoji/apple/23fa.png
new file mode 100644
index 0000000000..4c520e5dbe
Binary files /dev/null and b/static/images/composer-emoji/apple/23fa.png differ
diff --git a/static/images/composer-emoji/apple/24c2.png b/static/images/composer-emoji/apple/24c2.png
new file mode 100644
index 0000000000..b0225e1118
Binary files /dev/null and b/static/images/composer-emoji/apple/24c2.png differ
diff --git a/static/images/composer-emoji/apple/25aa.png b/static/images/composer-emoji/apple/25aa.png
new file mode 100644
index 0000000000..cc5ce66fca
Binary files /dev/null and b/static/images/composer-emoji/apple/25aa.png differ
diff --git a/static/images/composer-emoji/apple/25ab.png b/static/images/composer-emoji/apple/25ab.png
new file mode 100644
index 0000000000..96bed8b3f3
Binary files /dev/null and b/static/images/composer-emoji/apple/25ab.png differ
diff --git a/static/images/composer-emoji/apple/25b6.png b/static/images/composer-emoji/apple/25b6.png
new file mode 100644
index 0000000000..6ea3c420be
Binary files /dev/null and b/static/images/composer-emoji/apple/25b6.png differ
diff --git a/static/images/composer-emoji/apple/25c0.png b/static/images/composer-emoji/apple/25c0.png
new file mode 100644
index 0000000000..4d3d32a274
Binary files /dev/null and b/static/images/composer-emoji/apple/25c0.png differ
diff --git a/static/images/composer-emoji/apple/25fb.png b/static/images/composer-emoji/apple/25fb.png
new file mode 100644
index 0000000000..0fc0ce9378
Binary files /dev/null and b/static/images/composer-emoji/apple/25fb.png differ
diff --git a/static/images/composer-emoji/apple/25fc.png b/static/images/composer-emoji/apple/25fc.png
new file mode 100644
index 0000000000..fb0b6bbde5
Binary files /dev/null and b/static/images/composer-emoji/apple/25fc.png differ
diff --git a/static/images/composer-emoji/apple/25fd.png b/static/images/composer-emoji/apple/25fd.png
new file mode 100644
index 0000000000..f2cce959d9
Binary files /dev/null and b/static/images/composer-emoji/apple/25fd.png differ
diff --git a/static/images/composer-emoji/apple/25fe.png b/static/images/composer-emoji/apple/25fe.png
new file mode 100644
index 0000000000..7a1ec85556
Binary files /dev/null and b/static/images/composer-emoji/apple/25fe.png differ
diff --git a/static/images/composer-emoji/apple/2600.png b/static/images/composer-emoji/apple/2600.png
new file mode 100644
index 0000000000..ca41dc4298
Binary files /dev/null and b/static/images/composer-emoji/apple/2600.png differ
diff --git a/static/images/composer-emoji/apple/2601.png b/static/images/composer-emoji/apple/2601.png
new file mode 100644
index 0000000000..cae1e32527
Binary files /dev/null and b/static/images/composer-emoji/apple/2601.png differ
diff --git a/static/images/composer-emoji/apple/2602.png b/static/images/composer-emoji/apple/2602.png
new file mode 100644
index 0000000000..f4e7f94c69
Binary files /dev/null and b/static/images/composer-emoji/apple/2602.png differ
diff --git a/static/images/composer-emoji/apple/2603.png b/static/images/composer-emoji/apple/2603.png
new file mode 100644
index 0000000000..1b3c1d1071
Binary files /dev/null and b/static/images/composer-emoji/apple/2603.png differ
diff --git a/static/images/composer-emoji/apple/2604.png b/static/images/composer-emoji/apple/2604.png
new file mode 100644
index 0000000000..836392f175
Binary files /dev/null and b/static/images/composer-emoji/apple/2604.png differ
diff --git a/static/images/composer-emoji/apple/260e.png b/static/images/composer-emoji/apple/260e.png
new file mode 100644
index 0000000000..c6cd04b023
Binary files /dev/null and b/static/images/composer-emoji/apple/260e.png differ
diff --git a/static/images/composer-emoji/apple/2611.png b/static/images/composer-emoji/apple/2611.png
new file mode 100644
index 0000000000..a510d9f0b0
Binary files /dev/null and b/static/images/composer-emoji/apple/2611.png differ
diff --git a/static/images/composer-emoji/apple/2614.png b/static/images/composer-emoji/apple/2614.png
new file mode 100644
index 0000000000..84466cd6f7
Binary files /dev/null and b/static/images/composer-emoji/apple/2614.png differ
diff --git a/static/images/composer-emoji/apple/2615.png b/static/images/composer-emoji/apple/2615.png
new file mode 100644
index 0000000000..1964a09899
Binary files /dev/null and b/static/images/composer-emoji/apple/2615.png differ
diff --git a/static/images/composer-emoji/apple/2618.png b/static/images/composer-emoji/apple/2618.png
new file mode 100644
index 0000000000..298db477ea
Binary files /dev/null and b/static/images/composer-emoji/apple/2618.png differ
diff --git a/static/images/composer-emoji/apple/261d-1f3fb.png b/static/images/composer-emoji/apple/261d-1f3fb.png
new file mode 100644
index 0000000000..55efe3c65f
Binary files /dev/null and b/static/images/composer-emoji/apple/261d-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/261d-1f3fc.png b/static/images/composer-emoji/apple/261d-1f3fc.png
new file mode 100644
index 0000000000..0679a718ce
Binary files /dev/null and b/static/images/composer-emoji/apple/261d-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/261d-1f3fd.png b/static/images/composer-emoji/apple/261d-1f3fd.png
new file mode 100644
index 0000000000..6b3d6a574a
Binary files /dev/null and b/static/images/composer-emoji/apple/261d-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/261d-1f3fe.png b/static/images/composer-emoji/apple/261d-1f3fe.png
new file mode 100644
index 0000000000..9729580880
Binary files /dev/null and b/static/images/composer-emoji/apple/261d-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/261d-1f3ff.png b/static/images/composer-emoji/apple/261d-1f3ff.png
new file mode 100644
index 0000000000..1e3456030b
Binary files /dev/null and b/static/images/composer-emoji/apple/261d-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/261d.png b/static/images/composer-emoji/apple/261d.png
new file mode 100644
index 0000000000..de922626e7
Binary files /dev/null and b/static/images/composer-emoji/apple/261d.png differ
diff --git a/static/images/composer-emoji/apple/2620.png b/static/images/composer-emoji/apple/2620.png
new file mode 100644
index 0000000000..005c024c4b
Binary files /dev/null and b/static/images/composer-emoji/apple/2620.png differ
diff --git a/static/images/composer-emoji/apple/2622.png b/static/images/composer-emoji/apple/2622.png
new file mode 100644
index 0000000000..666cacba67
Binary files /dev/null and b/static/images/composer-emoji/apple/2622.png differ
diff --git a/static/images/composer-emoji/apple/2623.png b/static/images/composer-emoji/apple/2623.png
new file mode 100644
index 0000000000..63fa1ab541
Binary files /dev/null and b/static/images/composer-emoji/apple/2623.png differ
diff --git a/static/images/composer-emoji/apple/2626.png b/static/images/composer-emoji/apple/2626.png
new file mode 100644
index 0000000000..df42a78d57
Binary files /dev/null and b/static/images/composer-emoji/apple/2626.png differ
diff --git a/static/images/composer-emoji/apple/262a.png b/static/images/composer-emoji/apple/262a.png
new file mode 100644
index 0000000000..6a50254f47
Binary files /dev/null and b/static/images/composer-emoji/apple/262a.png differ
diff --git a/static/images/composer-emoji/apple/262e.png b/static/images/composer-emoji/apple/262e.png
new file mode 100644
index 0000000000..9c188f0ef2
Binary files /dev/null and b/static/images/composer-emoji/apple/262e.png differ
diff --git a/static/images/composer-emoji/apple/262f.png b/static/images/composer-emoji/apple/262f.png
new file mode 100644
index 0000000000..d94457194d
Binary files /dev/null and b/static/images/composer-emoji/apple/262f.png differ
diff --git a/static/images/composer-emoji/apple/2638.png b/static/images/composer-emoji/apple/2638.png
new file mode 100644
index 0000000000..97664d3af1
Binary files /dev/null and b/static/images/composer-emoji/apple/2638.png differ
diff --git a/static/images/composer-emoji/apple/2639.png b/static/images/composer-emoji/apple/2639.png
new file mode 100644
index 0000000000..8e9aa7a6e9
Binary files /dev/null and b/static/images/composer-emoji/apple/2639.png differ
diff --git a/static/images/composer-emoji/apple/263a.png b/static/images/composer-emoji/apple/263a.png
new file mode 100644
index 0000000000..21f5afae47
Binary files /dev/null and b/static/images/composer-emoji/apple/263a.png differ
diff --git a/static/images/composer-emoji/apple/2648.png b/static/images/composer-emoji/apple/2648.png
new file mode 100644
index 0000000000..1c07938ec7
Binary files /dev/null and b/static/images/composer-emoji/apple/2648.png differ
diff --git a/static/images/composer-emoji/apple/2649.png b/static/images/composer-emoji/apple/2649.png
new file mode 100644
index 0000000000..20dcb4a7a2
Binary files /dev/null and b/static/images/composer-emoji/apple/2649.png differ
diff --git a/static/images/composer-emoji/apple/264a.png b/static/images/composer-emoji/apple/264a.png
new file mode 100644
index 0000000000..59b7112222
Binary files /dev/null and b/static/images/composer-emoji/apple/264a.png differ
diff --git a/static/images/composer-emoji/apple/264b.png b/static/images/composer-emoji/apple/264b.png
new file mode 100644
index 0000000000..1fb6f529a6
Binary files /dev/null and b/static/images/composer-emoji/apple/264b.png differ
diff --git a/static/images/composer-emoji/apple/264c.png b/static/images/composer-emoji/apple/264c.png
new file mode 100644
index 0000000000..e52c654296
Binary files /dev/null and b/static/images/composer-emoji/apple/264c.png differ
diff --git a/static/images/composer-emoji/apple/264d.png b/static/images/composer-emoji/apple/264d.png
new file mode 100644
index 0000000000..4eca65f55a
Binary files /dev/null and b/static/images/composer-emoji/apple/264d.png differ
diff --git a/static/images/composer-emoji/apple/264e.png b/static/images/composer-emoji/apple/264e.png
new file mode 100644
index 0000000000..b1d7aa1c2a
Binary files /dev/null and b/static/images/composer-emoji/apple/264e.png differ
diff --git a/static/images/composer-emoji/apple/264f.png b/static/images/composer-emoji/apple/264f.png
new file mode 100644
index 0000000000..af441664c1
Binary files /dev/null and b/static/images/composer-emoji/apple/264f.png differ
diff --git a/static/images/composer-emoji/apple/2650.png b/static/images/composer-emoji/apple/2650.png
new file mode 100644
index 0000000000..05d4253d57
Binary files /dev/null and b/static/images/composer-emoji/apple/2650.png differ
diff --git a/static/images/composer-emoji/apple/2651.png b/static/images/composer-emoji/apple/2651.png
new file mode 100644
index 0000000000..d7698ed441
Binary files /dev/null and b/static/images/composer-emoji/apple/2651.png differ
diff --git a/static/images/composer-emoji/apple/2652.png b/static/images/composer-emoji/apple/2652.png
new file mode 100644
index 0000000000..4b2e6a2d26
Binary files /dev/null and b/static/images/composer-emoji/apple/2652.png differ
diff --git a/static/images/composer-emoji/apple/2653.png b/static/images/composer-emoji/apple/2653.png
new file mode 100644
index 0000000000..67856676e5
Binary files /dev/null and b/static/images/composer-emoji/apple/2653.png differ
diff --git a/static/images/composer-emoji/apple/2660.png b/static/images/composer-emoji/apple/2660.png
new file mode 100644
index 0000000000..21b302f0ac
Binary files /dev/null and b/static/images/composer-emoji/apple/2660.png differ
diff --git a/static/images/composer-emoji/apple/2663.png b/static/images/composer-emoji/apple/2663.png
new file mode 100644
index 0000000000..03c896200b
Binary files /dev/null and b/static/images/composer-emoji/apple/2663.png differ
diff --git a/static/images/composer-emoji/apple/2665.png b/static/images/composer-emoji/apple/2665.png
new file mode 100644
index 0000000000..b320483fe0
Binary files /dev/null and b/static/images/composer-emoji/apple/2665.png differ
diff --git a/static/images/composer-emoji/apple/2666.png b/static/images/composer-emoji/apple/2666.png
new file mode 100644
index 0000000000..c2fdde9afb
Binary files /dev/null and b/static/images/composer-emoji/apple/2666.png differ
diff --git a/static/images/composer-emoji/apple/2668.png b/static/images/composer-emoji/apple/2668.png
new file mode 100644
index 0000000000..a21aaf5c6b
Binary files /dev/null and b/static/images/composer-emoji/apple/2668.png differ
diff --git a/static/images/composer-emoji/apple/267b.png b/static/images/composer-emoji/apple/267b.png
new file mode 100644
index 0000000000..d950027d8b
Binary files /dev/null and b/static/images/composer-emoji/apple/267b.png differ
diff --git a/static/images/composer-emoji/apple/267f.png b/static/images/composer-emoji/apple/267f.png
new file mode 100644
index 0000000000..b291be4458
Binary files /dev/null and b/static/images/composer-emoji/apple/267f.png differ
diff --git a/static/images/composer-emoji/apple/2692.png b/static/images/composer-emoji/apple/2692.png
new file mode 100644
index 0000000000..2413cf719c
Binary files /dev/null and b/static/images/composer-emoji/apple/2692.png differ
diff --git a/static/images/composer-emoji/apple/2693.png b/static/images/composer-emoji/apple/2693.png
new file mode 100644
index 0000000000..7e23fc0b33
Binary files /dev/null and b/static/images/composer-emoji/apple/2693.png differ
diff --git a/static/images/composer-emoji/apple/2694.png b/static/images/composer-emoji/apple/2694.png
new file mode 100644
index 0000000000..0ef8cfa5f4
Binary files /dev/null and b/static/images/composer-emoji/apple/2694.png differ
diff --git a/static/images/composer-emoji/apple/2696.png b/static/images/composer-emoji/apple/2696.png
new file mode 100644
index 0000000000..5b0a1994db
Binary files /dev/null and b/static/images/composer-emoji/apple/2696.png differ
diff --git a/static/images/composer-emoji/apple/2697.png b/static/images/composer-emoji/apple/2697.png
new file mode 100644
index 0000000000..6d409a4322
Binary files /dev/null and b/static/images/composer-emoji/apple/2697.png differ
diff --git a/static/images/composer-emoji/apple/2699.png b/static/images/composer-emoji/apple/2699.png
new file mode 100644
index 0000000000..28c9e42c6c
Binary files /dev/null and b/static/images/composer-emoji/apple/2699.png differ
diff --git a/static/images/composer-emoji/apple/269b.png b/static/images/composer-emoji/apple/269b.png
new file mode 100644
index 0000000000..9b32d5cf2d
Binary files /dev/null and b/static/images/composer-emoji/apple/269b.png differ
diff --git a/static/images/composer-emoji/apple/269c.png b/static/images/composer-emoji/apple/269c.png
new file mode 100644
index 0000000000..ff7a33effe
Binary files /dev/null and b/static/images/composer-emoji/apple/269c.png differ
diff --git a/static/images/composer-emoji/apple/26a0.png b/static/images/composer-emoji/apple/26a0.png
new file mode 100644
index 0000000000..c9f358d8ac
Binary files /dev/null and b/static/images/composer-emoji/apple/26a0.png differ
diff --git a/static/images/composer-emoji/apple/26a1.png b/static/images/composer-emoji/apple/26a1.png
new file mode 100644
index 0000000000..0b593dd25b
Binary files /dev/null and b/static/images/composer-emoji/apple/26a1.png differ
diff --git a/static/images/composer-emoji/apple/26aa.png b/static/images/composer-emoji/apple/26aa.png
new file mode 100644
index 0000000000..7439138eed
Binary files /dev/null and b/static/images/composer-emoji/apple/26aa.png differ
diff --git a/static/images/composer-emoji/apple/26ab.png b/static/images/composer-emoji/apple/26ab.png
new file mode 100644
index 0000000000..46365ef07f
Binary files /dev/null and b/static/images/composer-emoji/apple/26ab.png differ
diff --git a/static/images/composer-emoji/apple/26b0.png b/static/images/composer-emoji/apple/26b0.png
new file mode 100644
index 0000000000..f5f2d54b9f
Binary files /dev/null and b/static/images/composer-emoji/apple/26b0.png differ
diff --git a/static/images/composer-emoji/apple/26b1.png b/static/images/composer-emoji/apple/26b1.png
new file mode 100644
index 0000000000..8f40bc9b79
Binary files /dev/null and b/static/images/composer-emoji/apple/26b1.png differ
diff --git a/static/images/composer-emoji/apple/26bd.png b/static/images/composer-emoji/apple/26bd.png
new file mode 100644
index 0000000000..63d356d9e4
Binary files /dev/null and b/static/images/composer-emoji/apple/26bd.png differ
diff --git a/static/images/composer-emoji/apple/26be.png b/static/images/composer-emoji/apple/26be.png
new file mode 100644
index 0000000000..8d2d1caeb2
Binary files /dev/null and b/static/images/composer-emoji/apple/26be.png differ
diff --git a/static/images/composer-emoji/apple/26c4.png b/static/images/composer-emoji/apple/26c4.png
new file mode 100644
index 0000000000..b2be443855
Binary files /dev/null and b/static/images/composer-emoji/apple/26c4.png differ
diff --git a/static/images/composer-emoji/apple/26c5.png b/static/images/composer-emoji/apple/26c5.png
new file mode 100644
index 0000000000..bd84dc0427
Binary files /dev/null and b/static/images/composer-emoji/apple/26c5.png differ
diff --git a/static/images/composer-emoji/apple/26c8.png b/static/images/composer-emoji/apple/26c8.png
new file mode 100644
index 0000000000..6e9c37285f
Binary files /dev/null and b/static/images/composer-emoji/apple/26c8.png differ
diff --git a/static/images/composer-emoji/apple/26ce.png b/static/images/composer-emoji/apple/26ce.png
new file mode 100644
index 0000000000..a113066c38
Binary files /dev/null and b/static/images/composer-emoji/apple/26ce.png differ
diff --git a/static/images/composer-emoji/apple/26cf.png b/static/images/composer-emoji/apple/26cf.png
new file mode 100644
index 0000000000..03f815465e
Binary files /dev/null and b/static/images/composer-emoji/apple/26cf.png differ
diff --git a/static/images/composer-emoji/apple/26d1.png b/static/images/composer-emoji/apple/26d1.png
new file mode 100644
index 0000000000..4bf72f620f
Binary files /dev/null and b/static/images/composer-emoji/apple/26d1.png differ
diff --git a/static/images/composer-emoji/apple/26d3.png b/static/images/composer-emoji/apple/26d3.png
new file mode 100644
index 0000000000..b01a04a946
Binary files /dev/null and b/static/images/composer-emoji/apple/26d3.png differ
diff --git a/static/images/composer-emoji/apple/26d4.png b/static/images/composer-emoji/apple/26d4.png
new file mode 100644
index 0000000000..6ff729e0d5
Binary files /dev/null and b/static/images/composer-emoji/apple/26d4.png differ
diff --git a/static/images/composer-emoji/apple/26e9.png b/static/images/composer-emoji/apple/26e9.png
new file mode 100644
index 0000000000..030bef07c0
Binary files /dev/null and b/static/images/composer-emoji/apple/26e9.png differ
diff --git a/static/images/composer-emoji/apple/26ea.png b/static/images/composer-emoji/apple/26ea.png
new file mode 100644
index 0000000000..a45c0bfa48
Binary files /dev/null and b/static/images/composer-emoji/apple/26ea.png differ
diff --git a/static/images/composer-emoji/apple/26f0.png b/static/images/composer-emoji/apple/26f0.png
new file mode 100644
index 0000000000..c033f61738
Binary files /dev/null and b/static/images/composer-emoji/apple/26f0.png differ
diff --git a/static/images/composer-emoji/apple/26f1.png b/static/images/composer-emoji/apple/26f1.png
new file mode 100644
index 0000000000..ac3e2b8998
Binary files /dev/null and b/static/images/composer-emoji/apple/26f1.png differ
diff --git a/static/images/composer-emoji/apple/26f2.png b/static/images/composer-emoji/apple/26f2.png
new file mode 100644
index 0000000000..e65372a016
Binary files /dev/null and b/static/images/composer-emoji/apple/26f2.png differ
diff --git a/static/images/composer-emoji/apple/26f3.png b/static/images/composer-emoji/apple/26f3.png
new file mode 100644
index 0000000000..519071808c
Binary files /dev/null and b/static/images/composer-emoji/apple/26f3.png differ
diff --git a/static/images/composer-emoji/apple/26f4.png b/static/images/composer-emoji/apple/26f4.png
new file mode 100644
index 0000000000..aaaba3d4a8
Binary files /dev/null and b/static/images/composer-emoji/apple/26f4.png differ
diff --git a/static/images/composer-emoji/apple/26f5.png b/static/images/composer-emoji/apple/26f5.png
new file mode 100644
index 0000000000..da39f302a8
Binary files /dev/null and b/static/images/composer-emoji/apple/26f5.png differ
diff --git a/static/images/composer-emoji/apple/26f7.png b/static/images/composer-emoji/apple/26f7.png
new file mode 100644
index 0000000000..4c8edfe542
Binary files /dev/null and b/static/images/composer-emoji/apple/26f7.png differ
diff --git a/static/images/composer-emoji/apple/26f8.png b/static/images/composer-emoji/apple/26f8.png
new file mode 100644
index 0000000000..dbbc6da2ad
Binary files /dev/null and b/static/images/composer-emoji/apple/26f8.png differ
diff --git a/static/images/composer-emoji/apple/26f9-1f3fb.png b/static/images/composer-emoji/apple/26f9-1f3fb.png
new file mode 100644
index 0000000000..a7164e47c9
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/26f9-1f3fc.png b/static/images/composer-emoji/apple/26f9-1f3fc.png
new file mode 100644
index 0000000000..cf8faf4d11
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/26f9-1f3fd.png b/static/images/composer-emoji/apple/26f9-1f3fd.png
new file mode 100644
index 0000000000..ecc4693a09
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/26f9-1f3fe.png b/static/images/composer-emoji/apple/26f9-1f3fe.png
new file mode 100644
index 0000000000..4645bbb8ee
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/26f9-1f3ff.png b/static/images/composer-emoji/apple/26f9-1f3ff.png
new file mode 100644
index 0000000000..688fa0705b
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/26f9.png b/static/images/composer-emoji/apple/26f9.png
new file mode 100644
index 0000000000..5b9dc83863
Binary files /dev/null and b/static/images/composer-emoji/apple/26f9.png differ
diff --git a/static/images/composer-emoji/apple/26fa.png b/static/images/composer-emoji/apple/26fa.png
new file mode 100644
index 0000000000..141b37d898
Binary files /dev/null and b/static/images/composer-emoji/apple/26fa.png differ
diff --git a/static/images/composer-emoji/apple/26fd.png b/static/images/composer-emoji/apple/26fd.png
new file mode 100644
index 0000000000..6250747896
Binary files /dev/null and b/static/images/composer-emoji/apple/26fd.png differ
diff --git a/static/images/composer-emoji/apple/2702.png b/static/images/composer-emoji/apple/2702.png
new file mode 100644
index 0000000000..e9c0e7e409
Binary files /dev/null and b/static/images/composer-emoji/apple/2702.png differ
diff --git a/static/images/composer-emoji/apple/2705.png b/static/images/composer-emoji/apple/2705.png
new file mode 100644
index 0000000000..fce11794dd
Binary files /dev/null and b/static/images/composer-emoji/apple/2705.png differ
diff --git a/static/images/composer-emoji/apple/2708.png b/static/images/composer-emoji/apple/2708.png
new file mode 100644
index 0000000000..f8eed68dae
Binary files /dev/null and b/static/images/composer-emoji/apple/2708.png differ
diff --git a/static/images/composer-emoji/apple/2709.png b/static/images/composer-emoji/apple/2709.png
new file mode 100644
index 0000000000..4b44758368
Binary files /dev/null and b/static/images/composer-emoji/apple/2709.png differ
diff --git a/static/images/composer-emoji/apple/270a-1f3fb.png b/static/images/composer-emoji/apple/270a-1f3fb.png
new file mode 100644
index 0000000000..3a9ae95cdc
Binary files /dev/null and b/static/images/composer-emoji/apple/270a-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/270a-1f3fc.png b/static/images/composer-emoji/apple/270a-1f3fc.png
new file mode 100644
index 0000000000..9056bebf0c
Binary files /dev/null and b/static/images/composer-emoji/apple/270a-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/270a-1f3fd.png b/static/images/composer-emoji/apple/270a-1f3fd.png
new file mode 100644
index 0000000000..80cc8a7d63
Binary files /dev/null and b/static/images/composer-emoji/apple/270a-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/270a-1f3fe.png b/static/images/composer-emoji/apple/270a-1f3fe.png
new file mode 100644
index 0000000000..f5022ff9a8
Binary files /dev/null and b/static/images/composer-emoji/apple/270a-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/270a-1f3ff.png b/static/images/composer-emoji/apple/270a-1f3ff.png
new file mode 100644
index 0000000000..023f598309
Binary files /dev/null and b/static/images/composer-emoji/apple/270a-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/270a.png b/static/images/composer-emoji/apple/270a.png
new file mode 100644
index 0000000000..1b13fd63f2
Binary files /dev/null and b/static/images/composer-emoji/apple/270a.png differ
diff --git a/static/images/composer-emoji/apple/270b-1f3fb.png b/static/images/composer-emoji/apple/270b-1f3fb.png
new file mode 100644
index 0000000000..47e2310b6b
Binary files /dev/null and b/static/images/composer-emoji/apple/270b-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/270b-1f3fc.png b/static/images/composer-emoji/apple/270b-1f3fc.png
new file mode 100644
index 0000000000..8fc0e17b94
Binary files /dev/null and b/static/images/composer-emoji/apple/270b-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/270b-1f3fd.png b/static/images/composer-emoji/apple/270b-1f3fd.png
new file mode 100644
index 0000000000..1931a4bc7f
Binary files /dev/null and b/static/images/composer-emoji/apple/270b-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/270b-1f3fe.png b/static/images/composer-emoji/apple/270b-1f3fe.png
new file mode 100644
index 0000000000..a42e7d8dd8
Binary files /dev/null and b/static/images/composer-emoji/apple/270b-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/270b-1f3ff.png b/static/images/composer-emoji/apple/270b-1f3ff.png
new file mode 100644
index 0000000000..f874a2948b
Binary files /dev/null and b/static/images/composer-emoji/apple/270b-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/270b.png b/static/images/composer-emoji/apple/270b.png
new file mode 100644
index 0000000000..8800ea554b
Binary files /dev/null and b/static/images/composer-emoji/apple/270b.png differ
diff --git a/static/images/composer-emoji/apple/270c-1f3fb.png b/static/images/composer-emoji/apple/270c-1f3fb.png
new file mode 100644
index 0000000000..5990e29673
Binary files /dev/null and b/static/images/composer-emoji/apple/270c-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/270c-1f3fc.png b/static/images/composer-emoji/apple/270c-1f3fc.png
new file mode 100644
index 0000000000..705c98bc42
Binary files /dev/null and b/static/images/composer-emoji/apple/270c-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/270c-1f3fd.png b/static/images/composer-emoji/apple/270c-1f3fd.png
new file mode 100644
index 0000000000..5a405d1513
Binary files /dev/null and b/static/images/composer-emoji/apple/270c-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/270c-1f3fe.png b/static/images/composer-emoji/apple/270c-1f3fe.png
new file mode 100644
index 0000000000..5eb09833d8
Binary files /dev/null and b/static/images/composer-emoji/apple/270c-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/270c-1f3ff.png b/static/images/composer-emoji/apple/270c-1f3ff.png
new file mode 100644
index 0000000000..e9d81bd3b2
Binary files /dev/null and b/static/images/composer-emoji/apple/270c-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/270c.png b/static/images/composer-emoji/apple/270c.png
new file mode 100644
index 0000000000..167c4d402f
Binary files /dev/null and b/static/images/composer-emoji/apple/270c.png differ
diff --git a/static/images/composer-emoji/apple/270d-1f3fb.png b/static/images/composer-emoji/apple/270d-1f3fb.png
new file mode 100644
index 0000000000..f84b0a91cc
Binary files /dev/null and b/static/images/composer-emoji/apple/270d-1f3fb.png differ
diff --git a/static/images/composer-emoji/apple/270d-1f3fc.png b/static/images/composer-emoji/apple/270d-1f3fc.png
new file mode 100644
index 0000000000..a85d4451d7
Binary files /dev/null and b/static/images/composer-emoji/apple/270d-1f3fc.png differ
diff --git a/static/images/composer-emoji/apple/270d-1f3fd.png b/static/images/composer-emoji/apple/270d-1f3fd.png
new file mode 100644
index 0000000000..a90635e79c
Binary files /dev/null and b/static/images/composer-emoji/apple/270d-1f3fd.png differ
diff --git a/static/images/composer-emoji/apple/270d-1f3fe.png b/static/images/composer-emoji/apple/270d-1f3fe.png
new file mode 100644
index 0000000000..963c66e7f4
Binary files /dev/null and b/static/images/composer-emoji/apple/270d-1f3fe.png differ
diff --git a/static/images/composer-emoji/apple/270d-1f3ff.png b/static/images/composer-emoji/apple/270d-1f3ff.png
new file mode 100644
index 0000000000..956be2756e
Binary files /dev/null and b/static/images/composer-emoji/apple/270d-1f3ff.png differ
diff --git a/static/images/composer-emoji/apple/270d.png b/static/images/composer-emoji/apple/270d.png
new file mode 100644
index 0000000000..3f3a6ca012
Binary files /dev/null and b/static/images/composer-emoji/apple/270d.png differ
diff --git a/static/images/composer-emoji/apple/270f.png b/static/images/composer-emoji/apple/270f.png
new file mode 100644
index 0000000000..b03d894db3
Binary files /dev/null and b/static/images/composer-emoji/apple/270f.png differ
diff --git a/static/images/composer-emoji/apple/2712.png b/static/images/composer-emoji/apple/2712.png
new file mode 100644
index 0000000000..513c947916
Binary files /dev/null and b/static/images/composer-emoji/apple/2712.png differ
diff --git a/static/images/composer-emoji/apple/2714.png b/static/images/composer-emoji/apple/2714.png
new file mode 100644
index 0000000000..beb95738c4
Binary files /dev/null and b/static/images/composer-emoji/apple/2714.png differ
diff --git a/static/images/composer-emoji/apple/2716.png b/static/images/composer-emoji/apple/2716.png
new file mode 100644
index 0000000000..774b232d59
Binary files /dev/null and b/static/images/composer-emoji/apple/2716.png differ
diff --git a/static/images/composer-emoji/apple/271d.png b/static/images/composer-emoji/apple/271d.png
new file mode 100644
index 0000000000..9f419a5932
Binary files /dev/null and b/static/images/composer-emoji/apple/271d.png differ
diff --git a/static/images/composer-emoji/apple/2721.png b/static/images/composer-emoji/apple/2721.png
new file mode 100644
index 0000000000..c257dd4041
Binary files /dev/null and b/static/images/composer-emoji/apple/2721.png differ
diff --git a/static/images/composer-emoji/apple/2728.png b/static/images/composer-emoji/apple/2728.png
new file mode 100644
index 0000000000..bc6084140e
Binary files /dev/null and b/static/images/composer-emoji/apple/2728.png differ
diff --git a/static/images/composer-emoji/apple/2733.png b/static/images/composer-emoji/apple/2733.png
new file mode 100644
index 0000000000..3ac10c9baa
Binary files /dev/null and b/static/images/composer-emoji/apple/2733.png differ
diff --git a/static/images/composer-emoji/apple/2734.png b/static/images/composer-emoji/apple/2734.png
new file mode 100644
index 0000000000..27b2328274
Binary files /dev/null and b/static/images/composer-emoji/apple/2734.png differ
diff --git a/static/images/composer-emoji/apple/2744.png b/static/images/composer-emoji/apple/2744.png
new file mode 100644
index 0000000000..9ae9bf0424
Binary files /dev/null and b/static/images/composer-emoji/apple/2744.png differ
diff --git a/static/images/composer-emoji/apple/2747.png b/static/images/composer-emoji/apple/2747.png
new file mode 100644
index 0000000000..a051a7abb5
Binary files /dev/null and b/static/images/composer-emoji/apple/2747.png differ
diff --git a/static/images/composer-emoji/apple/274c.png b/static/images/composer-emoji/apple/274c.png
new file mode 100644
index 0000000000..4b32928a6e
Binary files /dev/null and b/static/images/composer-emoji/apple/274c.png differ
diff --git a/static/images/composer-emoji/apple/274e.png b/static/images/composer-emoji/apple/274e.png
new file mode 100644
index 0000000000..1fc0e5ed6e
Binary files /dev/null and b/static/images/composer-emoji/apple/274e.png differ
diff --git a/static/images/composer-emoji/apple/2753.png b/static/images/composer-emoji/apple/2753.png
new file mode 100644
index 0000000000..e9d8f571a4
Binary files /dev/null and b/static/images/composer-emoji/apple/2753.png differ
diff --git a/static/images/composer-emoji/apple/2754.png b/static/images/composer-emoji/apple/2754.png
new file mode 100644
index 0000000000..9995f51169
Binary files /dev/null and b/static/images/composer-emoji/apple/2754.png differ
diff --git a/static/images/composer-emoji/apple/2755.png b/static/images/composer-emoji/apple/2755.png
new file mode 100644
index 0000000000..288b57c968
Binary files /dev/null and b/static/images/composer-emoji/apple/2755.png differ
diff --git a/static/images/composer-emoji/apple/2757.png b/static/images/composer-emoji/apple/2757.png
new file mode 100644
index 0000000000..a9373deeac
Binary files /dev/null and b/static/images/composer-emoji/apple/2757.png differ
diff --git a/static/images/composer-emoji/apple/2763.png b/static/images/composer-emoji/apple/2763.png
new file mode 100644
index 0000000000..46c53d3e24
Binary files /dev/null and b/static/images/composer-emoji/apple/2763.png differ
diff --git a/static/images/composer-emoji/apple/2764.png b/static/images/composer-emoji/apple/2764.png
new file mode 100644
index 0000000000..911fcd14a7
Binary files /dev/null and b/static/images/composer-emoji/apple/2764.png differ
diff --git a/static/images/composer-emoji/apple/2795.png b/static/images/composer-emoji/apple/2795.png
new file mode 100644
index 0000000000..992e21a6bb
Binary files /dev/null and b/static/images/composer-emoji/apple/2795.png differ
diff --git a/static/images/composer-emoji/apple/2796.png b/static/images/composer-emoji/apple/2796.png
new file mode 100644
index 0000000000..70c3c4fb31
Binary files /dev/null and b/static/images/composer-emoji/apple/2796.png differ
diff --git a/static/images/composer-emoji/apple/2797.png b/static/images/composer-emoji/apple/2797.png
new file mode 100644
index 0000000000..dd14c2238f
Binary files /dev/null and b/static/images/composer-emoji/apple/2797.png differ
diff --git a/static/images/composer-emoji/apple/27a1.png b/static/images/composer-emoji/apple/27a1.png
new file mode 100644
index 0000000000..077a618a73
Binary files /dev/null and b/static/images/composer-emoji/apple/27a1.png differ
diff --git a/static/images/composer-emoji/apple/27b0.png b/static/images/composer-emoji/apple/27b0.png
new file mode 100644
index 0000000000..21dec8abcb
Binary files /dev/null and b/static/images/composer-emoji/apple/27b0.png differ
diff --git a/static/images/composer-emoji/apple/27bf.png b/static/images/composer-emoji/apple/27bf.png
new file mode 100644
index 0000000000..09ee8127bf
Binary files /dev/null and b/static/images/composer-emoji/apple/27bf.png differ
diff --git a/static/images/composer-emoji/apple/2934.png b/static/images/composer-emoji/apple/2934.png
new file mode 100644
index 0000000000..762c9c23fe
Binary files /dev/null and b/static/images/composer-emoji/apple/2934.png differ
diff --git a/static/images/composer-emoji/apple/2935.png b/static/images/composer-emoji/apple/2935.png
new file mode 100644
index 0000000000..cf0e540ffd
Binary files /dev/null and b/static/images/composer-emoji/apple/2935.png differ
diff --git a/static/images/composer-emoji/apple/2b05.png b/static/images/composer-emoji/apple/2b05.png
new file mode 100644
index 0000000000..4374ff59cc
Binary files /dev/null and b/static/images/composer-emoji/apple/2b05.png differ
diff --git a/static/images/composer-emoji/apple/2b06.png b/static/images/composer-emoji/apple/2b06.png
new file mode 100644
index 0000000000..186b42e70e
Binary files /dev/null and b/static/images/composer-emoji/apple/2b06.png differ
diff --git a/static/images/composer-emoji/apple/2b07.png b/static/images/composer-emoji/apple/2b07.png
new file mode 100644
index 0000000000..c04cb08ea1
Binary files /dev/null and b/static/images/composer-emoji/apple/2b07.png differ
diff --git a/static/images/composer-emoji/apple/2b1b.png b/static/images/composer-emoji/apple/2b1b.png
new file mode 100644
index 0000000000..fb0b6bbde5
Binary files /dev/null and b/static/images/composer-emoji/apple/2b1b.png differ
diff --git a/static/images/composer-emoji/apple/2b1c.png b/static/images/composer-emoji/apple/2b1c.png
new file mode 100644
index 0000000000..33dd092749
Binary files /dev/null and b/static/images/composer-emoji/apple/2b1c.png differ
diff --git a/static/images/composer-emoji/apple/2b50.png b/static/images/composer-emoji/apple/2b50.png
new file mode 100644
index 0000000000..94896da5eb
Binary files /dev/null and b/static/images/composer-emoji/apple/2b50.png differ
diff --git a/static/images/composer-emoji/apple/2b55.png b/static/images/composer-emoji/apple/2b55.png
new file mode 100644
index 0000000000..9f59e43fde
Binary files /dev/null and b/static/images/composer-emoji/apple/2b55.png differ
diff --git a/static/images/composer-emoji/apple/3030.png b/static/images/composer-emoji/apple/3030.png
new file mode 100644
index 0000000000..da96eaa289
Binary files /dev/null and b/static/images/composer-emoji/apple/3030.png differ
diff --git a/static/images/composer-emoji/apple/303d.png b/static/images/composer-emoji/apple/303d.png
new file mode 100644
index 0000000000..8237dce927
Binary files /dev/null and b/static/images/composer-emoji/apple/303d.png differ
diff --git a/static/images/composer-emoji/apple/3297.png b/static/images/composer-emoji/apple/3297.png
new file mode 100644
index 0000000000..a15151688a
Binary files /dev/null and b/static/images/composer-emoji/apple/3297.png differ
diff --git a/static/images/composer-emoji/apple/3299.png b/static/images/composer-emoji/apple/3299.png
new file mode 100644
index 0000000000..291eb5e8bf
Binary files /dev/null and b/static/images/composer-emoji/apple/3299.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-activity@1x.png b/static/images/composer-emoji/icon-emojipicker-activity@1x.png
new file mode 100644
index 0000000000..d198bbdbdb
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-activity@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-activity@2x.png b/static/images/composer-emoji/icon-emojipicker-activity@2x.png
new file mode 100644
index 0000000000..386733bd7e
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-activity@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-flags@1x.png b/static/images/composer-emoji/icon-emojipicker-flags@1x.png
new file mode 100644
index 0000000000..dc0acd1390
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-flags@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-flags@2x.png b/static/images/composer-emoji/icon-emojipicker-flags@2x.png
new file mode 100644
index 0000000000..88e12d335d
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-flags@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-food-and-drink@1x.png b/static/images/composer-emoji/icon-emojipicker-food-and-drink@1x.png
new file mode 100644
index 0000000000..a28c04aa04
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-food-and-drink@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-food-and-drink@2x.png b/static/images/composer-emoji/icon-emojipicker-food-and-drink@2x.png
new file mode 100644
index 0000000000..1b981b3f1f
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-food-and-drink@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-frequently-used@1x.png b/static/images/composer-emoji/icon-emojipicker-frequently-used@1x.png
new file mode 100644
index 0000000000..7d6e96e2fc
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-frequently-used@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-frequently-used@2x.png b/static/images/composer-emoji/icon-emojipicker-frequently-used@2x.png
new file mode 100644
index 0000000000..99e7117178
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-frequently-used@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-nature@1x.png b/static/images/composer-emoji/icon-emojipicker-nature@1x.png
new file mode 100644
index 0000000000..bfeac8a8ce
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-nature@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-nature@2x.png b/static/images/composer-emoji/icon-emojipicker-nature@2x.png
new file mode 100644
index 0000000000..d72666b95e
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-nature@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-objects@1x.png b/static/images/composer-emoji/icon-emojipicker-objects@1x.png
new file mode 100644
index 0000000000..9fa775f9d0
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-objects@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-objects@2x.png b/static/images/composer-emoji/icon-emojipicker-objects@2x.png
new file mode 100644
index 0000000000..c8273e4b96
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-objects@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-people@1x.png b/static/images/composer-emoji/icon-emojipicker-people@1x.png
new file mode 100644
index 0000000000..7bd98b53df
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-people@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-people@2x.png b/static/images/composer-emoji/icon-emojipicker-people@2x.png
new file mode 100644
index 0000000000..1e633b6baa
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-people@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-symbols@1x.png b/static/images/composer-emoji/icon-emojipicker-symbols@1x.png
new file mode 100644
index 0000000000..c239c4057d
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-symbols@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-symbols@2x.png b/static/images/composer-emoji/icon-emojipicker-symbols@2x.png
new file mode 100644
index 0000000000..db65eb931e
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-symbols@2x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-travel-and-places@1x.png b/static/images/composer-emoji/icon-emojipicker-travel-and-places@1x.png
new file mode 100644
index 0000000000..4e8378db0c
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-travel-and-places@1x.png differ
diff --git a/static/images/composer-emoji/icon-emojipicker-travel-and-places@2x.png b/static/images/composer-emoji/icon-emojipicker-travel-and-places@2x.png
new file mode 100644
index 0000000000..a1e1a3cd40
Binary files /dev/null and b/static/images/composer-emoji/icon-emojipicker-travel-and-places@2x.png differ
diff --git a/static/images/composer-emoji/twitter/0023-20e3.png b/static/images/composer-emoji/twitter/0023-20e3.png
new file mode 100644
index 0000000000..0a86fc5367
Binary files /dev/null and b/static/images/composer-emoji/twitter/0023-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/002a-20e3.png b/static/images/composer-emoji/twitter/002a-20e3.png
new file mode 100644
index 0000000000..18f100a7f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/002a-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0030-20e3.png b/static/images/composer-emoji/twitter/0030-20e3.png
new file mode 100644
index 0000000000..d8740fa17d
Binary files /dev/null and b/static/images/composer-emoji/twitter/0030-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0031-20e3.png b/static/images/composer-emoji/twitter/0031-20e3.png
new file mode 100644
index 0000000000..d33acdfd73
Binary files /dev/null and b/static/images/composer-emoji/twitter/0031-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0032-20e3.png b/static/images/composer-emoji/twitter/0032-20e3.png
new file mode 100644
index 0000000000..a0fc60a7bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/0032-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0033-20e3.png b/static/images/composer-emoji/twitter/0033-20e3.png
new file mode 100644
index 0000000000..becc305d2b
Binary files /dev/null and b/static/images/composer-emoji/twitter/0033-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0034-20e3.png b/static/images/composer-emoji/twitter/0034-20e3.png
new file mode 100644
index 0000000000..5f05d08832
Binary files /dev/null and b/static/images/composer-emoji/twitter/0034-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0035-20e3.png b/static/images/composer-emoji/twitter/0035-20e3.png
new file mode 100644
index 0000000000..513e50019b
Binary files /dev/null and b/static/images/composer-emoji/twitter/0035-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0036-20e3.png b/static/images/composer-emoji/twitter/0036-20e3.png
new file mode 100644
index 0000000000..5f96c170ed
Binary files /dev/null and b/static/images/composer-emoji/twitter/0036-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0037-20e3.png b/static/images/composer-emoji/twitter/0037-20e3.png
new file mode 100644
index 0000000000..3f38d9573b
Binary files /dev/null and b/static/images/composer-emoji/twitter/0037-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0038-20e3.png b/static/images/composer-emoji/twitter/0038-20e3.png
new file mode 100644
index 0000000000..6d74365213
Binary files /dev/null and b/static/images/composer-emoji/twitter/0038-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/0039-20e3.png b/static/images/composer-emoji/twitter/0039-20e3.png
new file mode 100644
index 0000000000..b473887697
Binary files /dev/null and b/static/images/composer-emoji/twitter/0039-20e3.png differ
diff --git a/static/images/composer-emoji/twitter/00a9.png b/static/images/composer-emoji/twitter/00a9.png
new file mode 100644
index 0000000000..4c6d57610c
Binary files /dev/null and b/static/images/composer-emoji/twitter/00a9.png differ
diff --git a/static/images/composer-emoji/twitter/00ae.png b/static/images/composer-emoji/twitter/00ae.png
new file mode 100644
index 0000000000..608633371e
Binary files /dev/null and b/static/images/composer-emoji/twitter/00ae.png differ
diff --git a/static/images/composer-emoji/twitter/1f004.png b/static/images/composer-emoji/twitter/1f004.png
new file mode 100644
index 0000000000..30161de71d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f004.png differ
diff --git a/static/images/composer-emoji/twitter/1f0cf.png b/static/images/composer-emoji/twitter/1f0cf.png
new file mode 100644
index 0000000000..c31cb12894
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f0cf.png differ
diff --git a/static/images/composer-emoji/twitter/1f170.png b/static/images/composer-emoji/twitter/1f170.png
new file mode 100644
index 0000000000..46180a8e5d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f170.png differ
diff --git a/static/images/composer-emoji/twitter/1f171.png b/static/images/composer-emoji/twitter/1f171.png
new file mode 100644
index 0000000000..c2d4c0d5b4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f171.png differ
diff --git a/static/images/composer-emoji/twitter/1f17e.png b/static/images/composer-emoji/twitter/1f17e.png
new file mode 100644
index 0000000000..41af973e87
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f17e.png differ
diff --git a/static/images/composer-emoji/twitter/1f17f.png b/static/images/composer-emoji/twitter/1f17f.png
new file mode 100644
index 0000000000..9b821cbae9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f17f.png differ
diff --git a/static/images/composer-emoji/twitter/1f18e.png b/static/images/composer-emoji/twitter/1f18e.png
new file mode 100644
index 0000000000..5d47d1768b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f18e.png differ
diff --git a/static/images/composer-emoji/twitter/1f191.png b/static/images/composer-emoji/twitter/1f191.png
new file mode 100644
index 0000000000..9698100354
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f191.png differ
diff --git a/static/images/composer-emoji/twitter/1f192.png b/static/images/composer-emoji/twitter/1f192.png
new file mode 100644
index 0000000000..7fd2b53fc8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f192.png differ
diff --git a/static/images/composer-emoji/twitter/1f193.png b/static/images/composer-emoji/twitter/1f193.png
new file mode 100644
index 0000000000..aa51b2cfd3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f193.png differ
diff --git a/static/images/composer-emoji/twitter/1f194.png b/static/images/composer-emoji/twitter/1f194.png
new file mode 100644
index 0000000000..8b1046fb31
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f194.png differ
diff --git a/static/images/composer-emoji/twitter/1f195.png b/static/images/composer-emoji/twitter/1f195.png
new file mode 100644
index 0000000000..66d97a3490
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f195.png differ
diff --git a/static/images/composer-emoji/twitter/1f196.png b/static/images/composer-emoji/twitter/1f196.png
new file mode 100644
index 0000000000..c0393aed97
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f196.png differ
diff --git a/static/images/composer-emoji/twitter/1f197.png b/static/images/composer-emoji/twitter/1f197.png
new file mode 100644
index 0000000000..88b0e8fae1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f197.png differ
diff --git a/static/images/composer-emoji/twitter/1f198.png b/static/images/composer-emoji/twitter/1f198.png
new file mode 100644
index 0000000000..6635969965
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f198.png differ
diff --git a/static/images/composer-emoji/twitter/1f199.png b/static/images/composer-emoji/twitter/1f199.png
new file mode 100644
index 0000000000..afc9940a58
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f199.png differ
diff --git a/static/images/composer-emoji/twitter/1f19a.png b/static/images/composer-emoji/twitter/1f19a.png
new file mode 100644
index 0000000000..39c916bdec
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f19a.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1e8.png b/static/images/composer-emoji/twitter/1f1e6-1f1e8.png
new file mode 100644
index 0000000000..434964e5ca
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1e9.png b/static/images/composer-emoji/twitter/1f1e6-1f1e9.png
new file mode 100644
index 0000000000..a223867c07
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1ea.png b/static/images/composer-emoji/twitter/1f1e6-1f1ea.png
new file mode 100644
index 0000000000..69a45df92e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1eb.png b/static/images/composer-emoji/twitter/1f1e6-1f1eb.png
new file mode 100644
index 0000000000..8c349d8ab8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1ec.png b/static/images/composer-emoji/twitter/1f1e6-1f1ec.png
new file mode 100644
index 0000000000..9420252beb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1ee.png b/static/images/composer-emoji/twitter/1f1e6-1f1ee.png
new file mode 100644
index 0000000000..693e0a6e24
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f1.png b/static/images/composer-emoji/twitter/1f1e6-1f1f1.png
new file mode 100644
index 0000000000..b233a61961
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f2.png b/static/images/composer-emoji/twitter/1f1e6-1f1f2.png
new file mode 100644
index 0000000000..f6623e4910
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f4.png b/static/images/composer-emoji/twitter/1f1e6-1f1f4.png
new file mode 100644
index 0000000000..aa15d0396d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f6.png b/static/images/composer-emoji/twitter/1f1e6-1f1f6.png
new file mode 100644
index 0000000000..b25d83d5c4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f7.png b/static/images/composer-emoji/twitter/1f1e6-1f1f7.png
new file mode 100644
index 0000000000..a32a3c833e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f8.png b/static/images/composer-emoji/twitter/1f1e6-1f1f8.png
new file mode 100644
index 0000000000..761134c6f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1f9.png b/static/images/composer-emoji/twitter/1f1e6-1f1f9.png
new file mode 100644
index 0000000000..861467be22
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1fa.png b/static/images/composer-emoji/twitter/1f1e6-1f1fa.png
new file mode 100644
index 0000000000..515b5d5d65
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1fc.png b/static/images/composer-emoji/twitter/1f1e6-1f1fc.png
new file mode 100644
index 0000000000..3fe95c5a0f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1fd.png b/static/images/composer-emoji/twitter/1f1e6-1f1fd.png
new file mode 100644
index 0000000000..9967c26224
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e6-1f1ff.png b/static/images/composer-emoji/twitter/1f1e6-1f1ff.png
new file mode 100644
index 0000000000..dbd865c416
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e6-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1e6.png b/static/images/composer-emoji/twitter/1f1e7-1f1e6.png
new file mode 100644
index 0000000000..46c8f74928
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1e7.png b/static/images/composer-emoji/twitter/1f1e7-1f1e7.png
new file mode 100644
index 0000000000..748e2aff83
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1e9.png b/static/images/composer-emoji/twitter/1f1e7-1f1e9.png
new file mode 100644
index 0000000000..2069a1affd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ea.png b/static/images/composer-emoji/twitter/1f1e7-1f1ea.png
new file mode 100644
index 0000000000..d48ab99d9f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1eb.png b/static/images/composer-emoji/twitter/1f1e7-1f1eb.png
new file mode 100644
index 0000000000..81058e4d6f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ec.png b/static/images/composer-emoji/twitter/1f1e7-1f1ec.png
new file mode 100644
index 0000000000..eca7fcf2c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ed.png b/static/images/composer-emoji/twitter/1f1e7-1f1ed.png
new file mode 100644
index 0000000000..51f37a0764
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ee.png b/static/images/composer-emoji/twitter/1f1e7-1f1ee.png
new file mode 100644
index 0000000000..110e741822
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ef.png b/static/images/composer-emoji/twitter/1f1e7-1f1ef.png
new file mode 100644
index 0000000000..23c384bb06
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f1.png b/static/images/composer-emoji/twitter/1f1e7-1f1f1.png
new file mode 100644
index 0000000000..884bda6c02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f2.png b/static/images/composer-emoji/twitter/1f1e7-1f1f2.png
new file mode 100644
index 0000000000..18ed528bc4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f3.png b/static/images/composer-emoji/twitter/1f1e7-1f1f3.png
new file mode 100644
index 0000000000..07cca32f28
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f4.png b/static/images/composer-emoji/twitter/1f1e7-1f1f4.png
new file mode 100644
index 0000000000..24f1254f5b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f6.png b/static/images/composer-emoji/twitter/1f1e7-1f1f6.png
new file mode 100644
index 0000000000..68c2654bb6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f7.png b/static/images/composer-emoji/twitter/1f1e7-1f1f7.png
new file mode 100644
index 0000000000..3309c4089f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f8.png b/static/images/composer-emoji/twitter/1f1e7-1f1f8.png
new file mode 100644
index 0000000000..865cd28efc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1f9.png b/static/images/composer-emoji/twitter/1f1e7-1f1f9.png
new file mode 100644
index 0000000000..43132d3136
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1fb.png b/static/images/composer-emoji/twitter/1f1e7-1f1fb.png
new file mode 100644
index 0000000000..c520efdb71
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1fc.png b/static/images/composer-emoji/twitter/1f1e7-1f1fc.png
new file mode 100644
index 0000000000..682d117e61
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1fe.png b/static/images/composer-emoji/twitter/1f1e7-1f1fe.png
new file mode 100644
index 0000000000..ed10642d1e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e7-1f1ff.png b/static/images/composer-emoji/twitter/1f1e7-1f1ff.png
new file mode 100644
index 0000000000..09905b1fc6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e7-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1e6.png b/static/images/composer-emoji/twitter/1f1e8-1f1e6.png
new file mode 100644
index 0000000000..a80b6ecc2e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1e8.png b/static/images/composer-emoji/twitter/1f1e8-1f1e8.png
new file mode 100644
index 0000000000..f7e8f98ed4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1e9.png b/static/images/composer-emoji/twitter/1f1e8-1f1e9.png
new file mode 100644
index 0000000000..258f8834da
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1eb.png b/static/images/composer-emoji/twitter/1f1e8-1f1eb.png
new file mode 100644
index 0000000000..d5a183b3ff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1ec.png b/static/images/composer-emoji/twitter/1f1e8-1f1ec.png
new file mode 100644
index 0000000000..4bc8b03a08
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1ed.png b/static/images/composer-emoji/twitter/1f1e8-1f1ed.png
new file mode 100644
index 0000000000..a5c5b00106
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1ee.png b/static/images/composer-emoji/twitter/1f1e8-1f1ee.png
new file mode 100644
index 0000000000..ef2eb91562
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f0.png b/static/images/composer-emoji/twitter/1f1e8-1f1f0.png
new file mode 100644
index 0000000000..a2e2152902
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f1.png b/static/images/composer-emoji/twitter/1f1e8-1f1f1.png
new file mode 100644
index 0000000000..2e7b326643
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f2.png b/static/images/composer-emoji/twitter/1f1e8-1f1f2.png
new file mode 100644
index 0000000000..e6705f9a3b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f3.png b/static/images/composer-emoji/twitter/1f1e8-1f1f3.png
new file mode 100644
index 0000000000..9c60cd609c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f4.png b/static/images/composer-emoji/twitter/1f1e8-1f1f4.png
new file mode 100644
index 0000000000..c2f39dd22f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f5.png b/static/images/composer-emoji/twitter/1f1e8-1f1f5.png
new file mode 100644
index 0000000000..e227d0ef4d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1f7.png b/static/images/composer-emoji/twitter/1f1e8-1f1f7.png
new file mode 100644
index 0000000000..cf5a88730e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1fa.png b/static/images/composer-emoji/twitter/1f1e8-1f1fa.png
new file mode 100644
index 0000000000..e211a47cda
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1fb.png b/static/images/composer-emoji/twitter/1f1e8-1f1fb.png
new file mode 100644
index 0000000000..2891c9871b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1fc.png b/static/images/composer-emoji/twitter/1f1e8-1f1fc.png
new file mode 100644
index 0000000000..c084e4e568
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1fd.png b/static/images/composer-emoji/twitter/1f1e8-1f1fd.png
new file mode 100644
index 0000000000..3c1e281675
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1fe.png b/static/images/composer-emoji/twitter/1f1e8-1f1fe.png
new file mode 100644
index 0000000000..2bacab191a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e8-1f1ff.png b/static/images/composer-emoji/twitter/1f1e8-1f1ff.png
new file mode 100644
index 0000000000..e6107e5836
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e8-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1ea.png b/static/images/composer-emoji/twitter/1f1e9-1f1ea.png
new file mode 100644
index 0000000000..ebddbbfe73
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1ec.png b/static/images/composer-emoji/twitter/1f1e9-1f1ec.png
new file mode 100644
index 0000000000..ef6699cab9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1ef.png b/static/images/composer-emoji/twitter/1f1e9-1f1ef.png
new file mode 100644
index 0000000000..cec808b395
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1f0.png b/static/images/composer-emoji/twitter/1f1e9-1f1f0.png
new file mode 100644
index 0000000000..22b72b9a7d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1f2.png b/static/images/composer-emoji/twitter/1f1e9-1f1f2.png
new file mode 100644
index 0000000000..03eac5c14e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1f4.png b/static/images/composer-emoji/twitter/1f1e9-1f1f4.png
new file mode 100644
index 0000000000..969c424460
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1e9-1f1ff.png b/static/images/composer-emoji/twitter/1f1e9-1f1ff.png
new file mode 100644
index 0000000000..34fc106042
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1e9-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1e6.png b/static/images/composer-emoji/twitter/1f1ea-1f1e6.png
new file mode 100644
index 0000000000..d5bc498536
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1e8.png b/static/images/composer-emoji/twitter/1f1ea-1f1e8.png
new file mode 100644
index 0000000000..3513ab5a0e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1ea.png b/static/images/composer-emoji/twitter/1f1ea-1f1ea.png
new file mode 100644
index 0000000000..875414d892
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1ec.png b/static/images/composer-emoji/twitter/1f1ea-1f1ec.png
new file mode 100644
index 0000000000..5a40927fc2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1ed.png b/static/images/composer-emoji/twitter/1f1ea-1f1ed.png
new file mode 100644
index 0000000000..83b8e31d1b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1f7.png b/static/images/composer-emoji/twitter/1f1ea-1f1f7.png
new file mode 100644
index 0000000000..fa534465df
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1f8.png b/static/images/composer-emoji/twitter/1f1ea-1f1f8.png
new file mode 100644
index 0000000000..d5bc498536
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1f9.png b/static/images/composer-emoji/twitter/1f1ea-1f1f9.png
new file mode 100644
index 0000000000..5bf1589c71
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ea-1f1fa.png b/static/images/composer-emoji/twitter/1f1ea-1f1fa.png
new file mode 100644
index 0000000000..a71d9a97d5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ea-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1ee.png b/static/images/composer-emoji/twitter/1f1eb-1f1ee.png
new file mode 100644
index 0000000000..c3e91a6a62
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1ef.png b/static/images/composer-emoji/twitter/1f1eb-1f1ef.png
new file mode 100644
index 0000000000..5fee3d2392
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1f0.png b/static/images/composer-emoji/twitter/1f1eb-1f1f0.png
new file mode 100644
index 0000000000..2b9da24fba
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1f2.png b/static/images/composer-emoji/twitter/1f1eb-1f1f2.png
new file mode 100644
index 0000000000..da963c5846
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1f4.png b/static/images/composer-emoji/twitter/1f1eb-1f1f4.png
new file mode 100644
index 0000000000..6f35267819
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1eb-1f1f7.png b/static/images/composer-emoji/twitter/1f1eb-1f1f7.png
new file mode 100644
index 0000000000..e227d0ef4d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1eb-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1e6.png b/static/images/composer-emoji/twitter/1f1ec-1f1e6.png
new file mode 100644
index 0000000000..77a3bc67a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1e7.png b/static/images/composer-emoji/twitter/1f1ec-1f1e7.png
new file mode 100644
index 0000000000..c1c706bbee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1e9.png b/static/images/composer-emoji/twitter/1f1ec-1f1e9.png
new file mode 100644
index 0000000000..4b672e9c25
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1ea.png b/static/images/composer-emoji/twitter/1f1ec-1f1ea.png
new file mode 100644
index 0000000000..d2ba04f853
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1eb.png b/static/images/composer-emoji/twitter/1f1ec-1f1eb.png
new file mode 100644
index 0000000000..dd01273358
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1ec.png b/static/images/composer-emoji/twitter/1f1ec-1f1ec.png
new file mode 100644
index 0000000000..d105f17e83
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1ed.png b/static/images/composer-emoji/twitter/1f1ec-1f1ed.png
new file mode 100644
index 0000000000..248a33adb3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1ee.png b/static/images/composer-emoji/twitter/1f1ec-1f1ee.png
new file mode 100644
index 0000000000..bb0607421b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f1.png b/static/images/composer-emoji/twitter/1f1ec-1f1f1.png
new file mode 100644
index 0000000000..530624b19f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f2.png b/static/images/composer-emoji/twitter/1f1ec-1f1f2.png
new file mode 100644
index 0000000000..1354b33b03
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f3.png b/static/images/composer-emoji/twitter/1f1ec-1f1f3.png
new file mode 100644
index 0000000000..9e61c7322a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f5.png b/static/images/composer-emoji/twitter/1f1ec-1f1f5.png
new file mode 100644
index 0000000000..c94ee90a21
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f6.png b/static/images/composer-emoji/twitter/1f1ec-1f1f6.png
new file mode 100644
index 0000000000..bdc6d29723
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f7.png b/static/images/composer-emoji/twitter/1f1ec-1f1f7.png
new file mode 100644
index 0000000000..af6158d43c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f8.png b/static/images/composer-emoji/twitter/1f1ec-1f1f8.png
new file mode 100644
index 0000000000..46f7a0088e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1f9.png b/static/images/composer-emoji/twitter/1f1ec-1f1f9.png
new file mode 100644
index 0000000000..899e7bdce2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1fa.png b/static/images/composer-emoji/twitter/1f1ec-1f1fa.png
new file mode 100644
index 0000000000..9570a0ff8a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1fc.png b/static/images/composer-emoji/twitter/1f1ec-1f1fc.png
new file mode 100644
index 0000000000..f5b83e2361
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ec-1f1fe.png b/static/images/composer-emoji/twitter/1f1ec-1f1fe.png
new file mode 100644
index 0000000000..32d13fe5bc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ec-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1f0.png b/static/images/composer-emoji/twitter/1f1ed-1f1f0.png
new file mode 100644
index 0000000000..9444e57122
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1f2.png b/static/images/composer-emoji/twitter/1f1ed-1f1f2.png
new file mode 100644
index 0000000000..515b5d5d65
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1f3.png b/static/images/composer-emoji/twitter/1f1ed-1f1f3.png
new file mode 100644
index 0000000000..c44e3ed3c5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1f7.png b/static/images/composer-emoji/twitter/1f1ed-1f1f7.png
new file mode 100644
index 0000000000..4d8f70e45e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1f9.png b/static/images/composer-emoji/twitter/1f1ed-1f1f9.png
new file mode 100644
index 0000000000..79aae049e9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ed-1f1fa.png b/static/images/composer-emoji/twitter/1f1ed-1f1fa.png
new file mode 100644
index 0000000000..111e483024
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ed-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1e8.png b/static/images/composer-emoji/twitter/1f1ee-1f1e8.png
new file mode 100644
index 0000000000..b76a9d18dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1e9.png b/static/images/composer-emoji/twitter/1f1ee-1f1e9.png
new file mode 100644
index 0000000000..e7632460d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1ea.png b/static/images/composer-emoji/twitter/1f1ee-1f1ea.png
new file mode 100644
index 0000000000..e58602017f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f1.png b/static/images/composer-emoji/twitter/1f1ee-1f1f1.png
new file mode 100644
index 0000000000..589ae9c83b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f2.png b/static/images/composer-emoji/twitter/1f1ee-1f1f2.png
new file mode 100644
index 0000000000..fe3ccb8b60
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f3.png b/static/images/composer-emoji/twitter/1f1ee-1f1f3.png
new file mode 100644
index 0000000000..68ad0e8816
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f4.png b/static/images/composer-emoji/twitter/1f1ee-1f1f4.png
new file mode 100644
index 0000000000..ef6699cab9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f6.png b/static/images/composer-emoji/twitter/1f1ee-1f1f6.png
new file mode 100644
index 0000000000..28bb2bf124
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f7.png b/static/images/composer-emoji/twitter/1f1ee-1f1f7.png
new file mode 100644
index 0000000000..d10427fcea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f8.png b/static/images/composer-emoji/twitter/1f1ee-1f1f8.png
new file mode 100644
index 0000000000..537936976a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ee-1f1f9.png b/static/images/composer-emoji/twitter/1f1ee-1f1f9.png
new file mode 100644
index 0000000000..a9b162b379
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ee-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ef-1f1ea.png b/static/images/composer-emoji/twitter/1f1ef-1f1ea.png
new file mode 100644
index 0000000000..d7deb949e4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ef-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ef-1f1f2.png b/static/images/composer-emoji/twitter/1f1ef-1f1f2.png
new file mode 100644
index 0000000000..8acaa8bb8a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ef-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ef-1f1f4.png b/static/images/composer-emoji/twitter/1f1ef-1f1f4.png
new file mode 100644
index 0000000000..7ffb740394
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ef-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ef-1f1f5.png b/static/images/composer-emoji/twitter/1f1ef-1f1f5.png
new file mode 100644
index 0000000000..e956031c35
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ef-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1ea.png b/static/images/composer-emoji/twitter/1f1f0-1f1ea.png
new file mode 100644
index 0000000000..851fcc962d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1ec.png b/static/images/composer-emoji/twitter/1f1f0-1f1ec.png
new file mode 100644
index 0000000000..c263683b55
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1ed.png b/static/images/composer-emoji/twitter/1f1f0-1f1ed.png
new file mode 100644
index 0000000000..10c20d5529
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1ee.png b/static/images/composer-emoji/twitter/1f1f0-1f1ee.png
new file mode 100644
index 0000000000..3b865e2302
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1f2.png b/static/images/composer-emoji/twitter/1f1f0-1f1f2.png
new file mode 100644
index 0000000000..afd1ef2dc1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1f3.png b/static/images/composer-emoji/twitter/1f1f0-1f1f3.png
new file mode 100644
index 0000000000..c090a694c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1f5.png b/static/images/composer-emoji/twitter/1f1f0-1f1f5.png
new file mode 100644
index 0000000000..4a6dbfdf6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1f7.png b/static/images/composer-emoji/twitter/1f1f0-1f1f7.png
new file mode 100644
index 0000000000..93876b1416
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1fc.png b/static/images/composer-emoji/twitter/1f1f0-1f1fc.png
new file mode 100644
index 0000000000..65505b3d07
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1fe.png b/static/images/composer-emoji/twitter/1f1f0-1f1fe.png
new file mode 100644
index 0000000000..7650e7996f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f0-1f1ff.png b/static/images/composer-emoji/twitter/1f1f0-1f1ff.png
new file mode 100644
index 0000000000..bee3bcf6f5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f0-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1e6.png b/static/images/composer-emoji/twitter/1f1f1-1f1e6.png
new file mode 100644
index 0000000000..85bd83005c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1e7.png b/static/images/composer-emoji/twitter/1f1f1-1f1e7.png
new file mode 100644
index 0000000000..d9052b41e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1e8.png b/static/images/composer-emoji/twitter/1f1f1-1f1e8.png
new file mode 100644
index 0000000000..6cba3d7f69
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1ee.png b/static/images/composer-emoji/twitter/1f1f1-1f1ee.png
new file mode 100644
index 0000000000..e08d2cbef8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1f0.png b/static/images/composer-emoji/twitter/1f1f1-1f1f0.png
new file mode 100644
index 0000000000..507de5a4b3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1f7.png b/static/images/composer-emoji/twitter/1f1f1-1f1f7.png
new file mode 100644
index 0000000000..42b15f99af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1f8.png b/static/images/composer-emoji/twitter/1f1f1-1f1f8.png
new file mode 100644
index 0000000000..41f5b0ee26
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1f9.png b/static/images/composer-emoji/twitter/1f1f1-1f1f9.png
new file mode 100644
index 0000000000..1414d35dd3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1fa.png b/static/images/composer-emoji/twitter/1f1f1-1f1fa.png
new file mode 100644
index 0000000000..16690c8cf0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1fb.png b/static/images/composer-emoji/twitter/1f1f1-1f1fb.png
new file mode 100644
index 0000000000..6b42d7283b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f1-1f1fe.png b/static/images/composer-emoji/twitter/1f1f1-1f1fe.png
new file mode 100644
index 0000000000..b7e2970300
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f1-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1e6.png b/static/images/composer-emoji/twitter/1f1f2-1f1e6.png
new file mode 100644
index 0000000000..ecb52c78b5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1e8.png b/static/images/composer-emoji/twitter/1f1f2-1f1e8.png
new file mode 100644
index 0000000000..56b6da9e67
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1e9.png b/static/images/composer-emoji/twitter/1f1f2-1f1e9.png
new file mode 100644
index 0000000000..5870c2b487
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1ea.png b/static/images/composer-emoji/twitter/1f1f2-1f1ea.png
new file mode 100644
index 0000000000..1c1ea24d45
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1eb.png b/static/images/composer-emoji/twitter/1f1f2-1f1eb.png
new file mode 100644
index 0000000000..e227d0ef4d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1ec.png b/static/images/composer-emoji/twitter/1f1f2-1f1ec.png
new file mode 100644
index 0000000000..22bbfd4794
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1ed.png b/static/images/composer-emoji/twitter/1f1f2-1f1ed.png
new file mode 100644
index 0000000000..9e78bf28f0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f0.png b/static/images/composer-emoji/twitter/1f1f2-1f1f0.png
new file mode 100644
index 0000000000..644176be78
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f1.png b/static/images/composer-emoji/twitter/1f1f2-1f1f1.png
new file mode 100644
index 0000000000..98261f1a30
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f2.png b/static/images/composer-emoji/twitter/1f1f2-1f1f2.png
new file mode 100644
index 0000000000..0ac04d4aef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f3.png b/static/images/composer-emoji/twitter/1f1f2-1f1f3.png
new file mode 100644
index 0000000000..b136a8dae8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f4.png b/static/images/composer-emoji/twitter/1f1f2-1f1f4.png
new file mode 100644
index 0000000000..d6e98057cd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f5.png b/static/images/composer-emoji/twitter/1f1f2-1f1f5.png
new file mode 100644
index 0000000000..6fb15dac3c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f6.png b/static/images/composer-emoji/twitter/1f1f2-1f1f6.png
new file mode 100644
index 0000000000..e148ce49df
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f7.png b/static/images/composer-emoji/twitter/1f1f2-1f1f7.png
new file mode 100644
index 0000000000..0699138ac3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f8.png b/static/images/composer-emoji/twitter/1f1f2-1f1f8.png
new file mode 100644
index 0000000000..500994edc6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1f9.png b/static/images/composer-emoji/twitter/1f1f2-1f1f9.png
new file mode 100644
index 0000000000..e8b62f1969
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1fa.png b/static/images/composer-emoji/twitter/1f1f2-1f1fa.png
new file mode 100644
index 0000000000..fc6ff93c76
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1fb.png b/static/images/composer-emoji/twitter/1f1f2-1f1fb.png
new file mode 100644
index 0000000000..2aff0e1080
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1fc.png b/static/images/composer-emoji/twitter/1f1f2-1f1fc.png
new file mode 100644
index 0000000000..48c63d2f6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1fd.png b/static/images/composer-emoji/twitter/1f1f2-1f1fd.png
new file mode 100644
index 0000000000..e726a7f862
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1fe.png b/static/images/composer-emoji/twitter/1f1f2-1f1fe.png
new file mode 100644
index 0000000000..b4895721db
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f2-1f1ff.png b/static/images/composer-emoji/twitter/1f1f2-1f1ff.png
new file mode 100644
index 0000000000..7a3c54e9ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f2-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1e6.png b/static/images/composer-emoji/twitter/1f1f3-1f1e6.png
new file mode 100644
index 0000000000..a6ac55d9ed
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1e8.png b/static/images/composer-emoji/twitter/1f1f3-1f1e8.png
new file mode 100644
index 0000000000..88e7f97e99
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1ea.png b/static/images/composer-emoji/twitter/1f1f3-1f1ea.png
new file mode 100644
index 0000000000..f0cdad3c0e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1eb.png b/static/images/composer-emoji/twitter/1f1f3-1f1eb.png
new file mode 100644
index 0000000000..74c34bf095
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1ec.png b/static/images/composer-emoji/twitter/1f1f3-1f1ec.png
new file mode 100644
index 0000000000..52f98e035a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1ee.png b/static/images/composer-emoji/twitter/1f1f3-1f1ee.png
new file mode 100644
index 0000000000..b25b49403e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1f1.png b/static/images/composer-emoji/twitter/1f1f3-1f1f1.png
new file mode 100644
index 0000000000..266041766e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1f4.png b/static/images/composer-emoji/twitter/1f1f3-1f1f4.png
new file mode 100644
index 0000000000..e5042df6d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1f5.png b/static/images/composer-emoji/twitter/1f1f3-1f1f5.png
new file mode 100644
index 0000000000..65872ee77e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1f7.png b/static/images/composer-emoji/twitter/1f1f3-1f1f7.png
new file mode 100644
index 0000000000..bd836e3f56
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1fa.png b/static/images/composer-emoji/twitter/1f1f3-1f1fa.png
new file mode 100644
index 0000000000..d0db0b334d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f3-1f1ff.png b/static/images/composer-emoji/twitter/1f1f3-1f1ff.png
new file mode 100644
index 0000000000..567ee97f49
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f3-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f4-1f1f2.png b/static/images/composer-emoji/twitter/1f1f4-1f1f2.png
new file mode 100644
index 0000000000..00c36ad840
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f4-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1e6.png b/static/images/composer-emoji/twitter/1f1f5-1f1e6.png
new file mode 100644
index 0000000000..a7f05c5a97
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1ea.png b/static/images/composer-emoji/twitter/1f1f5-1f1ea.png
new file mode 100644
index 0000000000..1055e1d733
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1eb.png b/static/images/composer-emoji/twitter/1f1f5-1f1eb.png
new file mode 100644
index 0000000000..85fbd3755a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1ec.png b/static/images/composer-emoji/twitter/1f1f5-1f1ec.png
new file mode 100644
index 0000000000..c7f34d9dc0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1ed.png b/static/images/composer-emoji/twitter/1f1f5-1f1ed.png
new file mode 100644
index 0000000000..f3cc6c3551
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f0.png b/static/images/composer-emoji/twitter/1f1f5-1f1f0.png
new file mode 100644
index 0000000000..1427255037
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f1.png b/static/images/composer-emoji/twitter/1f1f5-1f1f1.png
new file mode 100644
index 0000000000..ceadd9342f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f2.png b/static/images/composer-emoji/twitter/1f1f5-1f1f2.png
new file mode 100644
index 0000000000..fc11d9a4ec
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f3.png b/static/images/composer-emoji/twitter/1f1f5-1f1f3.png
new file mode 100644
index 0000000000..3eff93500b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f7.png b/static/images/composer-emoji/twitter/1f1f5-1f1f7.png
new file mode 100644
index 0000000000..8b664fd443
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f8.png b/static/images/composer-emoji/twitter/1f1f5-1f1f8.png
new file mode 100644
index 0000000000..003d573dc6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1f9.png b/static/images/composer-emoji/twitter/1f1f5-1f1f9.png
new file mode 100644
index 0000000000..401a670113
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1fc.png b/static/images/composer-emoji/twitter/1f1f5-1f1fc.png
new file mode 100644
index 0000000000..d4d6f372c5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f5-1f1fe.png b/static/images/composer-emoji/twitter/1f1f5-1f1fe.png
new file mode 100644
index 0000000000..f2b221c289
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f5-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f6-1f1e6.png b/static/images/composer-emoji/twitter/1f1f6-1f1e6.png
new file mode 100644
index 0000000000..53be4bf95d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f6-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f7-1f1ea.png b/static/images/composer-emoji/twitter/1f1f7-1f1ea.png
new file mode 100644
index 0000000000..6f226848ac
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f7-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f7-1f1f4.png b/static/images/composer-emoji/twitter/1f1f7-1f1f4.png
new file mode 100644
index 0000000000..b9af12b959
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f7-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f7-1f1f8.png b/static/images/composer-emoji/twitter/1f1f7-1f1f8.png
new file mode 100644
index 0000000000..e52d7b1711
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f7-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f7-1f1fa.png b/static/images/composer-emoji/twitter/1f1f7-1f1fa.png
new file mode 100644
index 0000000000..3326557dc9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f7-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f7-1f1fc.png b/static/images/composer-emoji/twitter/1f1f7-1f1fc.png
new file mode 100644
index 0000000000..983a04a578
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f7-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1e6.png b/static/images/composer-emoji/twitter/1f1f8-1f1e6.png
new file mode 100644
index 0000000000..2ce170f732
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1e7.png b/static/images/composer-emoji/twitter/1f1f8-1f1e7.png
new file mode 100644
index 0000000000..393e3c692b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1e8.png b/static/images/composer-emoji/twitter/1f1f8-1f1e8.png
new file mode 100644
index 0000000000..e3d9cf873e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1e9.png b/static/images/composer-emoji/twitter/1f1f8-1f1e9.png
new file mode 100644
index 0000000000..7fee8ee9b9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ea.png b/static/images/composer-emoji/twitter/1f1f8-1f1ea.png
new file mode 100644
index 0000000000..5ae23949f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ec.png b/static/images/composer-emoji/twitter/1f1f8-1f1ec.png
new file mode 100644
index 0000000000..5398c14049
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ed.png b/static/images/composer-emoji/twitter/1f1f8-1f1ed.png
new file mode 100644
index 0000000000..c7bd5809dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ee.png b/static/images/composer-emoji/twitter/1f1f8-1f1ee.png
new file mode 100644
index 0000000000..17147a8c7a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ef.png b/static/images/composer-emoji/twitter/1f1f8-1f1ef.png
new file mode 100644
index 0000000000..e5042df6d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f0.png b/static/images/composer-emoji/twitter/1f1f8-1f1f0.png
new file mode 100644
index 0000000000..176a8dfb02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f1.png b/static/images/composer-emoji/twitter/1f1f8-1f1f1.png
new file mode 100644
index 0000000000..279ee6bd46
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f2.png b/static/images/composer-emoji/twitter/1f1f8-1f1f2.png
new file mode 100644
index 0000000000..1f445c751c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f3.png b/static/images/composer-emoji/twitter/1f1f8-1f1f3.png
new file mode 100644
index 0000000000..2a30738b51
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f4.png b/static/images/composer-emoji/twitter/1f1f8-1f1f4.png
new file mode 100644
index 0000000000..ffb255fd78
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f7.png b/static/images/composer-emoji/twitter/1f1f8-1f1f7.png
new file mode 100644
index 0000000000..8410a168dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f8.png b/static/images/composer-emoji/twitter/1f1f8-1f1f8.png
new file mode 100644
index 0000000000..e7b3d0de42
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1f9.png b/static/images/composer-emoji/twitter/1f1f8-1f1f9.png
new file mode 100644
index 0000000000..cd941b9f92
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1fb.png b/static/images/composer-emoji/twitter/1f1f8-1f1fb.png
new file mode 100644
index 0000000000..f6ab4d5934
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1fd.png b/static/images/composer-emoji/twitter/1f1f8-1f1fd.png
new file mode 100644
index 0000000000..128d72a5e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1fe.png b/static/images/composer-emoji/twitter/1f1f8-1f1fe.png
new file mode 100644
index 0000000000..3740d870d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f8-1f1ff.png b/static/images/composer-emoji/twitter/1f1f8-1f1ff.png
new file mode 100644
index 0000000000..6ca87fb5ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f8-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1e6.png b/static/images/composer-emoji/twitter/1f1f9-1f1e6.png
new file mode 100644
index 0000000000..ddd7701c13
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1e8.png b/static/images/composer-emoji/twitter/1f1f9-1f1e8.png
new file mode 100644
index 0000000000..fee308a96a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1e9.png b/static/images/composer-emoji/twitter/1f1f9-1f1e9.png
new file mode 100644
index 0000000000..ac364c5ea2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1eb.png b/static/images/composer-emoji/twitter/1f1f9-1f1eb.png
new file mode 100644
index 0000000000..dfac8328c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1ec.png b/static/images/composer-emoji/twitter/1f1f9-1f1ec.png
new file mode 100644
index 0000000000..a4d3597d6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1ed.png b/static/images/composer-emoji/twitter/1f1f9-1f1ed.png
new file mode 100644
index 0000000000..5f805c3cf2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1ef.png b/static/images/composer-emoji/twitter/1f1f9-1f1ef.png
new file mode 100644
index 0000000000..fd6887fede
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f0.png b/static/images/composer-emoji/twitter/1f1f9-1f1f0.png
new file mode 100644
index 0000000000..c3d5f8ff30
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f1.png b/static/images/composer-emoji/twitter/1f1f9-1f1f1.png
new file mode 100644
index 0000000000..9e32e4163e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f2.png b/static/images/composer-emoji/twitter/1f1f9-1f1f2.png
new file mode 100644
index 0000000000..5ed8306162
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f3.png b/static/images/composer-emoji/twitter/1f1f9-1f1f3.png
new file mode 100644
index 0000000000..ed6a3021b1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f4.png b/static/images/composer-emoji/twitter/1f1f9-1f1f4.png
new file mode 100644
index 0000000000..e4c1d063d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f7.png b/static/images/composer-emoji/twitter/1f1f9-1f1f7.png
new file mode 100644
index 0000000000..3844ab0eff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1f9.png b/static/images/composer-emoji/twitter/1f1f9-1f1f9.png
new file mode 100644
index 0000000000..2257a5b287
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1fb.png b/static/images/composer-emoji/twitter/1f1f9-1f1fb.png
new file mode 100644
index 0000000000..c0a3f05891
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1fc.png b/static/images/composer-emoji/twitter/1f1f9-1f1fc.png
new file mode 100644
index 0000000000..a22b7a1291
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f1f9-1f1ff.png b/static/images/composer-emoji/twitter/1f1f9-1f1ff.png
new file mode 100644
index 0000000000..1490efcfe4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1f9-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1e6.png b/static/images/composer-emoji/twitter/1f1fa-1f1e6.png
new file mode 100644
index 0000000000..85ba5e0312
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1ec.png b/static/images/composer-emoji/twitter/1f1fa-1f1ec.png
new file mode 100644
index 0000000000..c606347899
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1f2.png b/static/images/composer-emoji/twitter/1f1fa-1f1f2.png
new file mode 100644
index 0000000000..a6c19a9070
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1f8.png b/static/images/composer-emoji/twitter/1f1fa-1f1f8.png
new file mode 100644
index 0000000000..a6c19a9070
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1fe.png b/static/images/composer-emoji/twitter/1f1fa-1f1fe.png
new file mode 100644
index 0000000000..94cc81e5fd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fa-1f1ff.png b/static/images/composer-emoji/twitter/1f1fa-1f1ff.png
new file mode 100644
index 0000000000..1d4267b5a1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fa-1f1ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1e6.png b/static/images/composer-emoji/twitter/1f1fb-1f1e6.png
new file mode 100644
index 0000000000..ef95d7f774
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1e8.png b/static/images/composer-emoji/twitter/1f1fb-1f1e8.png
new file mode 100644
index 0000000000..3086896935
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1ea.png b/static/images/composer-emoji/twitter/1f1fb-1f1ea.png
new file mode 100644
index 0000000000..6dc9cf56a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1ec.png b/static/images/composer-emoji/twitter/1f1fb-1f1ec.png
new file mode 100644
index 0000000000..481c1d9fc9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1ee.png b/static/images/composer-emoji/twitter/1f1fb-1f1ee.png
new file mode 100644
index 0000000000..5f6c0f65fe
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1f3.png b/static/images/composer-emoji/twitter/1f1fb-1f1f3.png
new file mode 100644
index 0000000000..e254d1a21f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fb-1f1fa.png b/static/images/composer-emoji/twitter/1f1fb-1f1fa.png
new file mode 100644
index 0000000000..e23c141b91
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fb-1f1fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fc-1f1eb.png b/static/images/composer-emoji/twitter/1f1fc-1f1eb.png
new file mode 100644
index 0000000000..7eba3a8240
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fc-1f1eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fc-1f1f8.png b/static/images/composer-emoji/twitter/1f1fc-1f1f8.png
new file mode 100644
index 0000000000..a8170179cb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fc-1f1f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fd-1f1f0.png b/static/images/composer-emoji/twitter/1f1fd-1f1f0.png
new file mode 100644
index 0000000000..a30fabb9d7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fd-1f1f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fe-1f1ea.png b/static/images/composer-emoji/twitter/1f1fe-1f1ea.png
new file mode 100644
index 0000000000..485a259e56
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fe-1f1ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f1fe-1f1f9.png b/static/images/composer-emoji/twitter/1f1fe-1f1f9.png
new file mode 100644
index 0000000000..d60201c20d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1fe-1f1f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ff-1f1e6.png b/static/images/composer-emoji/twitter/1f1ff-1f1e6.png
new file mode 100644
index 0000000000..38a200f609
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ff-1f1e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ff-1f1f2.png b/static/images/composer-emoji/twitter/1f1ff-1f1f2.png
new file mode 100644
index 0000000000..33d1b55290
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ff-1f1f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f1ff-1f1fc.png b/static/images/composer-emoji/twitter/1f1ff-1f1fc.png
new file mode 100644
index 0000000000..b524208c53
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f1ff-1f1fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f201.png b/static/images/composer-emoji/twitter/1f201.png
new file mode 100644
index 0000000000..e245ef088d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f201.png differ
diff --git a/static/images/composer-emoji/twitter/1f202.png b/static/images/composer-emoji/twitter/1f202.png
new file mode 100644
index 0000000000..161b531598
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f202.png differ
diff --git a/static/images/composer-emoji/twitter/1f21a.png b/static/images/composer-emoji/twitter/1f21a.png
new file mode 100644
index 0000000000..4f43a7924f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f21a.png differ
diff --git a/static/images/composer-emoji/twitter/1f22f.png b/static/images/composer-emoji/twitter/1f22f.png
new file mode 100644
index 0000000000..0ad28df822
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f22f.png differ
diff --git a/static/images/composer-emoji/twitter/1f232.png b/static/images/composer-emoji/twitter/1f232.png
new file mode 100644
index 0000000000..b21f89d207
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f232.png differ
diff --git a/static/images/composer-emoji/twitter/1f233.png b/static/images/composer-emoji/twitter/1f233.png
new file mode 100644
index 0000000000..78fc3441f1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f233.png differ
diff --git a/static/images/composer-emoji/twitter/1f234.png b/static/images/composer-emoji/twitter/1f234.png
new file mode 100644
index 0000000000..6e3e8e3b72
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f234.png differ
diff --git a/static/images/composer-emoji/twitter/1f235.png b/static/images/composer-emoji/twitter/1f235.png
new file mode 100644
index 0000000000..a9f9d98693
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f235.png differ
diff --git a/static/images/composer-emoji/twitter/1f236.png b/static/images/composer-emoji/twitter/1f236.png
new file mode 100644
index 0000000000..a88b847c31
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f236.png differ
diff --git a/static/images/composer-emoji/twitter/1f237.png b/static/images/composer-emoji/twitter/1f237.png
new file mode 100644
index 0000000000..41f07f9f1d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f237.png differ
diff --git a/static/images/composer-emoji/twitter/1f238.png b/static/images/composer-emoji/twitter/1f238.png
new file mode 100644
index 0000000000..60202912f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f238.png differ
diff --git a/static/images/composer-emoji/twitter/1f239.png b/static/images/composer-emoji/twitter/1f239.png
new file mode 100644
index 0000000000..e18579d737
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f239.png differ
diff --git a/static/images/composer-emoji/twitter/1f23a.png b/static/images/composer-emoji/twitter/1f23a.png
new file mode 100644
index 0000000000..45f3828738
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f23a.png differ
diff --git a/static/images/composer-emoji/twitter/1f250.png b/static/images/composer-emoji/twitter/1f250.png
new file mode 100644
index 0000000000..9554b0ef0a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f250.png differ
diff --git a/static/images/composer-emoji/twitter/1f251.png b/static/images/composer-emoji/twitter/1f251.png
new file mode 100644
index 0000000000..c5d0176c5f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f251.png differ
diff --git a/static/images/composer-emoji/twitter/1f300.png b/static/images/composer-emoji/twitter/1f300.png
new file mode 100644
index 0000000000..a8cce39926
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f300.png differ
diff --git a/static/images/composer-emoji/twitter/1f301.png b/static/images/composer-emoji/twitter/1f301.png
new file mode 100644
index 0000000000..ba98929fa7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f301.png differ
diff --git a/static/images/composer-emoji/twitter/1f302.png b/static/images/composer-emoji/twitter/1f302.png
new file mode 100644
index 0000000000..1679a79791
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f302.png differ
diff --git a/static/images/composer-emoji/twitter/1f303.png b/static/images/composer-emoji/twitter/1f303.png
new file mode 100644
index 0000000000..66b9c14982
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f303.png differ
diff --git a/static/images/composer-emoji/twitter/1f304.png b/static/images/composer-emoji/twitter/1f304.png
new file mode 100644
index 0000000000..3a8ec75ba4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f304.png differ
diff --git a/static/images/composer-emoji/twitter/1f305.png b/static/images/composer-emoji/twitter/1f305.png
new file mode 100644
index 0000000000..8ace5b6a11
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f305.png differ
diff --git a/static/images/composer-emoji/twitter/1f306.png b/static/images/composer-emoji/twitter/1f306.png
new file mode 100644
index 0000000000..f8aa9f1250
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f306.png differ
diff --git a/static/images/composer-emoji/twitter/1f307.png b/static/images/composer-emoji/twitter/1f307.png
new file mode 100644
index 0000000000..f3a8e874ba
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f307.png differ
diff --git a/static/images/composer-emoji/twitter/1f308.png b/static/images/composer-emoji/twitter/1f308.png
new file mode 100644
index 0000000000..731b7b97a8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f308.png differ
diff --git a/static/images/composer-emoji/twitter/1f309.png b/static/images/composer-emoji/twitter/1f309.png
new file mode 100644
index 0000000000..eaeea69cf2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f309.png differ
diff --git a/static/images/composer-emoji/twitter/1f30a.png b/static/images/composer-emoji/twitter/1f30a.png
new file mode 100644
index 0000000000..f3b57efb8c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30a.png differ
diff --git a/static/images/composer-emoji/twitter/1f30b.png b/static/images/composer-emoji/twitter/1f30b.png
new file mode 100644
index 0000000000..2888c3ec61
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30b.png differ
diff --git a/static/images/composer-emoji/twitter/1f30c.png b/static/images/composer-emoji/twitter/1f30c.png
new file mode 100644
index 0000000000..c1a912773d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30c.png differ
diff --git a/static/images/composer-emoji/twitter/1f30d.png b/static/images/composer-emoji/twitter/1f30d.png
new file mode 100644
index 0000000000..11b9e002d4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30d.png differ
diff --git a/static/images/composer-emoji/twitter/1f30e.png b/static/images/composer-emoji/twitter/1f30e.png
new file mode 100644
index 0000000000..cec5f1e6a3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30e.png differ
diff --git a/static/images/composer-emoji/twitter/1f30f.png b/static/images/composer-emoji/twitter/1f30f.png
new file mode 100644
index 0000000000..ce863beb09
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f30f.png differ
diff --git a/static/images/composer-emoji/twitter/1f310.png b/static/images/composer-emoji/twitter/1f310.png
new file mode 100644
index 0000000000..84207b803b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f310.png differ
diff --git a/static/images/composer-emoji/twitter/1f311.png b/static/images/composer-emoji/twitter/1f311.png
new file mode 100644
index 0000000000..2d45215cdc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f311.png differ
diff --git a/static/images/composer-emoji/twitter/1f312.png b/static/images/composer-emoji/twitter/1f312.png
new file mode 100644
index 0000000000..63656e4c3d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f312.png differ
diff --git a/static/images/composer-emoji/twitter/1f313.png b/static/images/composer-emoji/twitter/1f313.png
new file mode 100644
index 0000000000..76a5d4d319
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f313.png differ
diff --git a/static/images/composer-emoji/twitter/1f314.png b/static/images/composer-emoji/twitter/1f314.png
new file mode 100644
index 0000000000..464993ae93
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f314.png differ
diff --git a/static/images/composer-emoji/twitter/1f315.png b/static/images/composer-emoji/twitter/1f315.png
new file mode 100644
index 0000000000..faa64567cd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f315.png differ
diff --git a/static/images/composer-emoji/twitter/1f316.png b/static/images/composer-emoji/twitter/1f316.png
new file mode 100644
index 0000000000..fceba0a351
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f316.png differ
diff --git a/static/images/composer-emoji/twitter/1f317.png b/static/images/composer-emoji/twitter/1f317.png
new file mode 100644
index 0000000000..07e9b09595
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f317.png differ
diff --git a/static/images/composer-emoji/twitter/1f318.png b/static/images/composer-emoji/twitter/1f318.png
new file mode 100644
index 0000000000..ea35382ef6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f318.png differ
diff --git a/static/images/composer-emoji/twitter/1f319.png b/static/images/composer-emoji/twitter/1f319.png
new file mode 100644
index 0000000000..a47658055f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f319.png differ
diff --git a/static/images/composer-emoji/twitter/1f31a.png b/static/images/composer-emoji/twitter/1f31a.png
new file mode 100644
index 0000000000..dc9b994462
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31a.png differ
diff --git a/static/images/composer-emoji/twitter/1f31b.png b/static/images/composer-emoji/twitter/1f31b.png
new file mode 100644
index 0000000000..c235740b45
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31b.png differ
diff --git a/static/images/composer-emoji/twitter/1f31c.png b/static/images/composer-emoji/twitter/1f31c.png
new file mode 100644
index 0000000000..edb0c0abf5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31c.png differ
diff --git a/static/images/composer-emoji/twitter/1f31d.png b/static/images/composer-emoji/twitter/1f31d.png
new file mode 100644
index 0000000000..56027ac37a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31d.png differ
diff --git a/static/images/composer-emoji/twitter/1f31e.png b/static/images/composer-emoji/twitter/1f31e.png
new file mode 100644
index 0000000000..2c80f1f491
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31e.png differ
diff --git a/static/images/composer-emoji/twitter/1f31f.png b/static/images/composer-emoji/twitter/1f31f.png
new file mode 100644
index 0000000000..066d1a5b11
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f31f.png differ
diff --git a/static/images/composer-emoji/twitter/1f320.png b/static/images/composer-emoji/twitter/1f320.png
new file mode 100644
index 0000000000..5865e39a23
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f320.png differ
diff --git a/static/images/composer-emoji/twitter/1f321.png b/static/images/composer-emoji/twitter/1f321.png
new file mode 100644
index 0000000000..de65fb772c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f321.png differ
diff --git a/static/images/composer-emoji/twitter/1f324.png b/static/images/composer-emoji/twitter/1f324.png
new file mode 100644
index 0000000000..5ecf67a9f4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f324.png differ
diff --git a/static/images/composer-emoji/twitter/1f325.png b/static/images/composer-emoji/twitter/1f325.png
new file mode 100644
index 0000000000..91fbc2cdc1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f325.png differ
diff --git a/static/images/composer-emoji/twitter/1f326.png b/static/images/composer-emoji/twitter/1f326.png
new file mode 100644
index 0000000000..2b904706bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f326.png differ
diff --git a/static/images/composer-emoji/twitter/1f327.png b/static/images/composer-emoji/twitter/1f327.png
new file mode 100644
index 0000000000..2bd9bd5386
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f327.png differ
diff --git a/static/images/composer-emoji/twitter/1f328.png b/static/images/composer-emoji/twitter/1f328.png
new file mode 100644
index 0000000000..a2b7f4e4de
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f328.png differ
diff --git a/static/images/composer-emoji/twitter/1f329.png b/static/images/composer-emoji/twitter/1f329.png
new file mode 100644
index 0000000000..f6f28c64be
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f329.png differ
diff --git a/static/images/composer-emoji/twitter/1f32a.png b/static/images/composer-emoji/twitter/1f32a.png
new file mode 100644
index 0000000000..d147e5cf93
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32a.png differ
diff --git a/static/images/composer-emoji/twitter/1f32b.png b/static/images/composer-emoji/twitter/1f32b.png
new file mode 100644
index 0000000000..41b81084bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32b.png differ
diff --git a/static/images/composer-emoji/twitter/1f32c.png b/static/images/composer-emoji/twitter/1f32c.png
new file mode 100644
index 0000000000..02e3526282
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32c.png differ
diff --git a/static/images/composer-emoji/twitter/1f32d.png b/static/images/composer-emoji/twitter/1f32d.png
new file mode 100644
index 0000000000..407d714a7f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32d.png differ
diff --git a/static/images/composer-emoji/twitter/1f32e.png b/static/images/composer-emoji/twitter/1f32e.png
new file mode 100644
index 0000000000..2fe0423c7e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32e.png differ
diff --git a/static/images/composer-emoji/twitter/1f32f.png b/static/images/composer-emoji/twitter/1f32f.png
new file mode 100644
index 0000000000..09fee7d680
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f32f.png differ
diff --git a/static/images/composer-emoji/twitter/1f330.png b/static/images/composer-emoji/twitter/1f330.png
new file mode 100644
index 0000000000..3159484f78
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f330.png differ
diff --git a/static/images/composer-emoji/twitter/1f331.png b/static/images/composer-emoji/twitter/1f331.png
new file mode 100644
index 0000000000..c16b3cd2e3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f331.png differ
diff --git a/static/images/composer-emoji/twitter/1f332.png b/static/images/composer-emoji/twitter/1f332.png
new file mode 100644
index 0000000000..844ee77f08
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f332.png differ
diff --git a/static/images/composer-emoji/twitter/1f333.png b/static/images/composer-emoji/twitter/1f333.png
new file mode 100644
index 0000000000..0ef103e297
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f333.png differ
diff --git a/static/images/composer-emoji/twitter/1f334.png b/static/images/composer-emoji/twitter/1f334.png
new file mode 100644
index 0000000000..90c2aac09c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f334.png differ
diff --git a/static/images/composer-emoji/twitter/1f335.png b/static/images/composer-emoji/twitter/1f335.png
new file mode 100644
index 0000000000..12a150bbb3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f335.png differ
diff --git a/static/images/composer-emoji/twitter/1f336.png b/static/images/composer-emoji/twitter/1f336.png
new file mode 100644
index 0000000000..c0502f607a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f336.png differ
diff --git a/static/images/composer-emoji/twitter/1f337.png b/static/images/composer-emoji/twitter/1f337.png
new file mode 100644
index 0000000000..932167fa83
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f337.png differ
diff --git a/static/images/composer-emoji/twitter/1f338.png b/static/images/composer-emoji/twitter/1f338.png
new file mode 100644
index 0000000000..641f9d15e2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f338.png differ
diff --git a/static/images/composer-emoji/twitter/1f339.png b/static/images/composer-emoji/twitter/1f339.png
new file mode 100644
index 0000000000..bca95bd847
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f339.png differ
diff --git a/static/images/composer-emoji/twitter/1f33a.png b/static/images/composer-emoji/twitter/1f33a.png
new file mode 100644
index 0000000000..1d48a4db4d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33a.png differ
diff --git a/static/images/composer-emoji/twitter/1f33b.png b/static/images/composer-emoji/twitter/1f33b.png
new file mode 100644
index 0000000000..2c09ed3786
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33b.png differ
diff --git a/static/images/composer-emoji/twitter/1f33c.png b/static/images/composer-emoji/twitter/1f33c.png
new file mode 100644
index 0000000000..1ccacc4586
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33c.png differ
diff --git a/static/images/composer-emoji/twitter/1f33d.png b/static/images/composer-emoji/twitter/1f33d.png
new file mode 100644
index 0000000000..bfa3b8cf59
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33d.png differ
diff --git a/static/images/composer-emoji/twitter/1f33e.png b/static/images/composer-emoji/twitter/1f33e.png
new file mode 100644
index 0000000000..16b0b6218f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33e.png differ
diff --git a/static/images/composer-emoji/twitter/1f33f.png b/static/images/composer-emoji/twitter/1f33f.png
new file mode 100644
index 0000000000..28b1a38521
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f33f.png differ
diff --git a/static/images/composer-emoji/twitter/1f340.png b/static/images/composer-emoji/twitter/1f340.png
new file mode 100644
index 0000000000..f1f51b333f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f340.png differ
diff --git a/static/images/composer-emoji/twitter/1f341.png b/static/images/composer-emoji/twitter/1f341.png
new file mode 100644
index 0000000000..4497bbb17a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f341.png differ
diff --git a/static/images/composer-emoji/twitter/1f342.png b/static/images/composer-emoji/twitter/1f342.png
new file mode 100644
index 0000000000..ab652bca57
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f342.png differ
diff --git a/static/images/composer-emoji/twitter/1f343.png b/static/images/composer-emoji/twitter/1f343.png
new file mode 100644
index 0000000000..8c59439439
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f343.png differ
diff --git a/static/images/composer-emoji/twitter/1f344.png b/static/images/composer-emoji/twitter/1f344.png
new file mode 100644
index 0000000000..909baac76d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f344.png differ
diff --git a/static/images/composer-emoji/twitter/1f345.png b/static/images/composer-emoji/twitter/1f345.png
new file mode 100644
index 0000000000..72baaa136c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f345.png differ
diff --git a/static/images/composer-emoji/twitter/1f346.png b/static/images/composer-emoji/twitter/1f346.png
new file mode 100644
index 0000000000..616ae70ea7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f346.png differ
diff --git a/static/images/composer-emoji/twitter/1f347.png b/static/images/composer-emoji/twitter/1f347.png
new file mode 100644
index 0000000000..d03cc16b86
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f347.png differ
diff --git a/static/images/composer-emoji/twitter/1f348.png b/static/images/composer-emoji/twitter/1f348.png
new file mode 100644
index 0000000000..b2e02709b9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f348.png differ
diff --git a/static/images/composer-emoji/twitter/1f349.png b/static/images/composer-emoji/twitter/1f349.png
new file mode 100644
index 0000000000..3f14c801b4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f349.png differ
diff --git a/static/images/composer-emoji/twitter/1f34a.png b/static/images/composer-emoji/twitter/1f34a.png
new file mode 100644
index 0000000000..31578828a1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34a.png differ
diff --git a/static/images/composer-emoji/twitter/1f34b.png b/static/images/composer-emoji/twitter/1f34b.png
new file mode 100644
index 0000000000..abfd0eba0b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34b.png differ
diff --git a/static/images/composer-emoji/twitter/1f34c.png b/static/images/composer-emoji/twitter/1f34c.png
new file mode 100644
index 0000000000..6c4a71d941
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34c.png differ
diff --git a/static/images/composer-emoji/twitter/1f34d.png b/static/images/composer-emoji/twitter/1f34d.png
new file mode 100644
index 0000000000..a269a20c56
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34d.png differ
diff --git a/static/images/composer-emoji/twitter/1f34e.png b/static/images/composer-emoji/twitter/1f34e.png
new file mode 100644
index 0000000000..841c336640
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34e.png differ
diff --git a/static/images/composer-emoji/twitter/1f34f.png b/static/images/composer-emoji/twitter/1f34f.png
new file mode 100644
index 0000000000..1dcb2f68ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f34f.png differ
diff --git a/static/images/composer-emoji/twitter/1f350.png b/static/images/composer-emoji/twitter/1f350.png
new file mode 100644
index 0000000000..5bc4decd35
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f350.png differ
diff --git a/static/images/composer-emoji/twitter/1f351.png b/static/images/composer-emoji/twitter/1f351.png
new file mode 100644
index 0000000000..541eb5adf4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f351.png differ
diff --git a/static/images/composer-emoji/twitter/1f352.png b/static/images/composer-emoji/twitter/1f352.png
new file mode 100644
index 0000000000..c5f34735d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f352.png differ
diff --git a/static/images/composer-emoji/twitter/1f353.png b/static/images/composer-emoji/twitter/1f353.png
new file mode 100644
index 0000000000..20013c858c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f353.png differ
diff --git a/static/images/composer-emoji/twitter/1f354.png b/static/images/composer-emoji/twitter/1f354.png
new file mode 100644
index 0000000000..1ca14405ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f354.png differ
diff --git a/static/images/composer-emoji/twitter/1f355.png b/static/images/composer-emoji/twitter/1f355.png
new file mode 100644
index 0000000000..474010e80b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f355.png differ
diff --git a/static/images/composer-emoji/twitter/1f356.png b/static/images/composer-emoji/twitter/1f356.png
new file mode 100644
index 0000000000..ace8d0d4c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f356.png differ
diff --git a/static/images/composer-emoji/twitter/1f357.png b/static/images/composer-emoji/twitter/1f357.png
new file mode 100644
index 0000000000..9b523b631c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f357.png differ
diff --git a/static/images/composer-emoji/twitter/1f358.png b/static/images/composer-emoji/twitter/1f358.png
new file mode 100644
index 0000000000..32b244c9d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f358.png differ
diff --git a/static/images/composer-emoji/twitter/1f359.png b/static/images/composer-emoji/twitter/1f359.png
new file mode 100644
index 0000000000..942c09e211
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f359.png differ
diff --git a/static/images/composer-emoji/twitter/1f35a.png b/static/images/composer-emoji/twitter/1f35a.png
new file mode 100644
index 0000000000..0c7b9a932b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35a.png differ
diff --git a/static/images/composer-emoji/twitter/1f35b.png b/static/images/composer-emoji/twitter/1f35b.png
new file mode 100644
index 0000000000..3462e839a7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35b.png differ
diff --git a/static/images/composer-emoji/twitter/1f35c.png b/static/images/composer-emoji/twitter/1f35c.png
new file mode 100644
index 0000000000..9d0b15a9dd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35c.png differ
diff --git a/static/images/composer-emoji/twitter/1f35d.png b/static/images/composer-emoji/twitter/1f35d.png
new file mode 100644
index 0000000000..6d42855cd4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35d.png differ
diff --git a/static/images/composer-emoji/twitter/1f35e.png b/static/images/composer-emoji/twitter/1f35e.png
new file mode 100644
index 0000000000..81da3410f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35e.png differ
diff --git a/static/images/composer-emoji/twitter/1f35f.png b/static/images/composer-emoji/twitter/1f35f.png
new file mode 100644
index 0000000000..f611573527
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f35f.png differ
diff --git a/static/images/composer-emoji/twitter/1f360.png b/static/images/composer-emoji/twitter/1f360.png
new file mode 100644
index 0000000000..0f65d3a8ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f360.png differ
diff --git a/static/images/composer-emoji/twitter/1f361.png b/static/images/composer-emoji/twitter/1f361.png
new file mode 100644
index 0000000000..b889a06af7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f361.png differ
diff --git a/static/images/composer-emoji/twitter/1f362.png b/static/images/composer-emoji/twitter/1f362.png
new file mode 100644
index 0000000000..fbeb318138
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f362.png differ
diff --git a/static/images/composer-emoji/twitter/1f363.png b/static/images/composer-emoji/twitter/1f363.png
new file mode 100644
index 0000000000..0686ab285a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f363.png differ
diff --git a/static/images/composer-emoji/twitter/1f364.png b/static/images/composer-emoji/twitter/1f364.png
new file mode 100644
index 0000000000..ba806750a8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f364.png differ
diff --git a/static/images/composer-emoji/twitter/1f365.png b/static/images/composer-emoji/twitter/1f365.png
new file mode 100644
index 0000000000..0049466a8e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f365.png differ
diff --git a/static/images/composer-emoji/twitter/1f366.png b/static/images/composer-emoji/twitter/1f366.png
new file mode 100644
index 0000000000..d4ff757a99
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f366.png differ
diff --git a/static/images/composer-emoji/twitter/1f367.png b/static/images/composer-emoji/twitter/1f367.png
new file mode 100644
index 0000000000..b719d47dbe
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f367.png differ
diff --git a/static/images/composer-emoji/twitter/1f368.png b/static/images/composer-emoji/twitter/1f368.png
new file mode 100644
index 0000000000..854c724fb2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f368.png differ
diff --git a/static/images/composer-emoji/twitter/1f369.png b/static/images/composer-emoji/twitter/1f369.png
new file mode 100644
index 0000000000..a6dce5c8c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f369.png differ
diff --git a/static/images/composer-emoji/twitter/1f36a.png b/static/images/composer-emoji/twitter/1f36a.png
new file mode 100644
index 0000000000..d14fde80a1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36a.png differ
diff --git a/static/images/composer-emoji/twitter/1f36b.png b/static/images/composer-emoji/twitter/1f36b.png
new file mode 100644
index 0000000000..3132859428
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36b.png differ
diff --git a/static/images/composer-emoji/twitter/1f36c.png b/static/images/composer-emoji/twitter/1f36c.png
new file mode 100644
index 0000000000..5e518c4eef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36c.png differ
diff --git a/static/images/composer-emoji/twitter/1f36d.png b/static/images/composer-emoji/twitter/1f36d.png
new file mode 100644
index 0000000000..f51ceade35
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36d.png differ
diff --git a/static/images/composer-emoji/twitter/1f36e.png b/static/images/composer-emoji/twitter/1f36e.png
new file mode 100644
index 0000000000..f27bd35c86
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36e.png differ
diff --git a/static/images/composer-emoji/twitter/1f36f.png b/static/images/composer-emoji/twitter/1f36f.png
new file mode 100644
index 0000000000..de9bb41930
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f36f.png differ
diff --git a/static/images/composer-emoji/twitter/1f370.png b/static/images/composer-emoji/twitter/1f370.png
new file mode 100644
index 0000000000..894e6191c5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f370.png differ
diff --git a/static/images/composer-emoji/twitter/1f371.png b/static/images/composer-emoji/twitter/1f371.png
new file mode 100644
index 0000000000..25e1f11ade
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f371.png differ
diff --git a/static/images/composer-emoji/twitter/1f372.png b/static/images/composer-emoji/twitter/1f372.png
new file mode 100644
index 0000000000..953e556f63
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f372.png differ
diff --git a/static/images/composer-emoji/twitter/1f373.png b/static/images/composer-emoji/twitter/1f373.png
new file mode 100644
index 0000000000..b8cb70d917
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f373.png differ
diff --git a/static/images/composer-emoji/twitter/1f374.png b/static/images/composer-emoji/twitter/1f374.png
new file mode 100644
index 0000000000..5e1b73af72
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f374.png differ
diff --git a/static/images/composer-emoji/twitter/1f375.png b/static/images/composer-emoji/twitter/1f375.png
new file mode 100644
index 0000000000..b5f7fd5ced
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f375.png differ
diff --git a/static/images/composer-emoji/twitter/1f376.png b/static/images/composer-emoji/twitter/1f376.png
new file mode 100644
index 0000000000..962d1611ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f376.png differ
diff --git a/static/images/composer-emoji/twitter/1f377.png b/static/images/composer-emoji/twitter/1f377.png
new file mode 100644
index 0000000000..8dd861305e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f377.png differ
diff --git a/static/images/composer-emoji/twitter/1f378.png b/static/images/composer-emoji/twitter/1f378.png
new file mode 100644
index 0000000000..b1eb2b234a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f378.png differ
diff --git a/static/images/composer-emoji/twitter/1f379.png b/static/images/composer-emoji/twitter/1f379.png
new file mode 100644
index 0000000000..5e8dbe22d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f379.png differ
diff --git a/static/images/composer-emoji/twitter/1f37a.png b/static/images/composer-emoji/twitter/1f37a.png
new file mode 100644
index 0000000000..27f4ef2ec5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37a.png differ
diff --git a/static/images/composer-emoji/twitter/1f37b.png b/static/images/composer-emoji/twitter/1f37b.png
new file mode 100644
index 0000000000..79751031d5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37b.png differ
diff --git a/static/images/composer-emoji/twitter/1f37c.png b/static/images/composer-emoji/twitter/1f37c.png
new file mode 100644
index 0000000000..fbc22951a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37c.png differ
diff --git a/static/images/composer-emoji/twitter/1f37d.png b/static/images/composer-emoji/twitter/1f37d.png
new file mode 100644
index 0000000000..93be88ec82
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37d.png differ
diff --git a/static/images/composer-emoji/twitter/1f37e.png b/static/images/composer-emoji/twitter/1f37e.png
new file mode 100644
index 0000000000..b1998d3508
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37e.png differ
diff --git a/static/images/composer-emoji/twitter/1f37f.png b/static/images/composer-emoji/twitter/1f37f.png
new file mode 100644
index 0000000000..bd5a81f1b6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f37f.png differ
diff --git a/static/images/composer-emoji/twitter/1f380.png b/static/images/composer-emoji/twitter/1f380.png
new file mode 100644
index 0000000000..50175224a9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f380.png differ
diff --git a/static/images/composer-emoji/twitter/1f381.png b/static/images/composer-emoji/twitter/1f381.png
new file mode 100644
index 0000000000..0ae24bce67
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f381.png differ
diff --git a/static/images/composer-emoji/twitter/1f382.png b/static/images/composer-emoji/twitter/1f382.png
new file mode 100644
index 0000000000..2296fd776a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f382.png differ
diff --git a/static/images/composer-emoji/twitter/1f383.png b/static/images/composer-emoji/twitter/1f383.png
new file mode 100644
index 0000000000..e0ef18f928
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f383.png differ
diff --git a/static/images/composer-emoji/twitter/1f384.png b/static/images/composer-emoji/twitter/1f384.png
new file mode 100644
index 0000000000..afca30ebcc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f384.png differ
diff --git a/static/images/composer-emoji/twitter/1f385-1f3fb.png b/static/images/composer-emoji/twitter/1f385-1f3fb.png
new file mode 100644
index 0000000000..81e4007e1c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f385-1f3fc.png b/static/images/composer-emoji/twitter/1f385-1f3fc.png
new file mode 100644
index 0000000000..c9f3d596a5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f385-1f3fd.png b/static/images/composer-emoji/twitter/1f385-1f3fd.png
new file mode 100644
index 0000000000..230b4cde26
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f385-1f3fe.png b/static/images/composer-emoji/twitter/1f385-1f3fe.png
new file mode 100644
index 0000000000..7b3dab3394
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f385-1f3ff.png b/static/images/composer-emoji/twitter/1f385-1f3ff.png
new file mode 100644
index 0000000000..76c2da7e5d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f385.png b/static/images/composer-emoji/twitter/1f385.png
new file mode 100644
index 0000000000..6b528611e2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f385.png differ
diff --git a/static/images/composer-emoji/twitter/1f386.png b/static/images/composer-emoji/twitter/1f386.png
new file mode 100644
index 0000000000..13399ad06a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f386.png differ
diff --git a/static/images/composer-emoji/twitter/1f387.png b/static/images/composer-emoji/twitter/1f387.png
new file mode 100644
index 0000000000..777341d2c9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f387.png differ
diff --git a/static/images/composer-emoji/twitter/1f388.png b/static/images/composer-emoji/twitter/1f388.png
new file mode 100644
index 0000000000..5ea44832b2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f388.png differ
diff --git a/static/images/composer-emoji/twitter/1f389.png b/static/images/composer-emoji/twitter/1f389.png
new file mode 100644
index 0000000000..0926139d92
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f389.png differ
diff --git a/static/images/composer-emoji/twitter/1f38a.png b/static/images/composer-emoji/twitter/1f38a.png
new file mode 100644
index 0000000000..b647e1dcbe
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38a.png differ
diff --git a/static/images/composer-emoji/twitter/1f38b.png b/static/images/composer-emoji/twitter/1f38b.png
new file mode 100644
index 0000000000..2163a4948e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38b.png differ
diff --git a/static/images/composer-emoji/twitter/1f38c.png b/static/images/composer-emoji/twitter/1f38c.png
new file mode 100644
index 0000000000..3d07c34a23
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38c.png differ
diff --git a/static/images/composer-emoji/twitter/1f38d.png b/static/images/composer-emoji/twitter/1f38d.png
new file mode 100644
index 0000000000..511be87678
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38d.png differ
diff --git a/static/images/composer-emoji/twitter/1f38e.png b/static/images/composer-emoji/twitter/1f38e.png
new file mode 100644
index 0000000000..f9b480d726
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38e.png differ
diff --git a/static/images/composer-emoji/twitter/1f38f.png b/static/images/composer-emoji/twitter/1f38f.png
new file mode 100644
index 0000000000..c3979c211b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f38f.png differ
diff --git a/static/images/composer-emoji/twitter/1f390.png b/static/images/composer-emoji/twitter/1f390.png
new file mode 100644
index 0000000000..63bb7dda02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f390.png differ
diff --git a/static/images/composer-emoji/twitter/1f391.png b/static/images/composer-emoji/twitter/1f391.png
new file mode 100644
index 0000000000..74525fe9f1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f391.png differ
diff --git a/static/images/composer-emoji/twitter/1f392.png b/static/images/composer-emoji/twitter/1f392.png
new file mode 100644
index 0000000000..0a58a7cd5d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f392.png differ
diff --git a/static/images/composer-emoji/twitter/1f393.png b/static/images/composer-emoji/twitter/1f393.png
new file mode 100644
index 0000000000..b8ff0f8f4b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f393.png differ
diff --git a/static/images/composer-emoji/twitter/1f396.png b/static/images/composer-emoji/twitter/1f396.png
new file mode 100644
index 0000000000..5b1fe49330
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f396.png differ
diff --git a/static/images/composer-emoji/twitter/1f397.png b/static/images/composer-emoji/twitter/1f397.png
new file mode 100644
index 0000000000..bc78b1da94
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f397.png differ
diff --git a/static/images/composer-emoji/twitter/1f399.png b/static/images/composer-emoji/twitter/1f399.png
new file mode 100644
index 0000000000..085f5ff96a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f399.png differ
diff --git a/static/images/composer-emoji/twitter/1f39a.png b/static/images/composer-emoji/twitter/1f39a.png
new file mode 100644
index 0000000000..407583326d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f39a.png differ
diff --git a/static/images/composer-emoji/twitter/1f39b.png b/static/images/composer-emoji/twitter/1f39b.png
new file mode 100644
index 0000000000..e85a334dc3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f39b.png differ
diff --git a/static/images/composer-emoji/twitter/1f39e.png b/static/images/composer-emoji/twitter/1f39e.png
new file mode 100644
index 0000000000..e633bf7034
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f39e.png differ
diff --git a/static/images/composer-emoji/twitter/1f39f.png b/static/images/composer-emoji/twitter/1f39f.png
new file mode 100644
index 0000000000..1ac7e512f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f39f.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a0.png b/static/images/composer-emoji/twitter/1f3a0.png
new file mode 100644
index 0000000000..6c98a4697e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a1.png b/static/images/composer-emoji/twitter/1f3a1.png
new file mode 100644
index 0000000000..e77f93d620
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a1.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a2.png b/static/images/composer-emoji/twitter/1f3a2.png
new file mode 100644
index 0000000000..5b60eb4469
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a2.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a3.png b/static/images/composer-emoji/twitter/1f3a3.png
new file mode 100644
index 0000000000..27d10d5611
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a4.png b/static/images/composer-emoji/twitter/1f3a4.png
new file mode 100644
index 0000000000..cdf9238545
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a5.png b/static/images/composer-emoji/twitter/1f3a5.png
new file mode 100644
index 0000000000..850e61bbcf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a6.png b/static/images/composer-emoji/twitter/1f3a6.png
new file mode 100644
index 0000000000..06dc95008a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a6.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a7.png b/static/images/composer-emoji/twitter/1f3a7.png
new file mode 100644
index 0000000000..d8095fc98f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a8.png b/static/images/composer-emoji/twitter/1f3a8.png
new file mode 100644
index 0000000000..df50d1d6c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3a9.png b/static/images/composer-emoji/twitter/1f3a9.png
new file mode 100644
index 0000000000..665d956b37
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3a9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3aa.png b/static/images/composer-emoji/twitter/1f3aa.png
new file mode 100644
index 0000000000..d50df54c17
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3aa.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ab.png b/static/images/composer-emoji/twitter/1f3ab.png
new file mode 100644
index 0000000000..cb2a8d9250
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ab.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ac.png b/static/images/composer-emoji/twitter/1f3ac.png
new file mode 100644
index 0000000000..733608f6a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ac.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ad.png b/static/images/composer-emoji/twitter/1f3ad.png
new file mode 100644
index 0000000000..6c70b1f4a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ad.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ae.png b/static/images/composer-emoji/twitter/1f3ae.png
new file mode 100644
index 0000000000..a8e4540702
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ae.png differ
diff --git a/static/images/composer-emoji/twitter/1f3af.png b/static/images/composer-emoji/twitter/1f3af.png
new file mode 100644
index 0000000000..8495abb815
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3af.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b0.png b/static/images/composer-emoji/twitter/1f3b0.png
new file mode 100644
index 0000000000..a29b879241
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b1.png b/static/images/composer-emoji/twitter/1f3b1.png
new file mode 100644
index 0000000000..5fa84697dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b1.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b2.png b/static/images/composer-emoji/twitter/1f3b2.png
new file mode 100644
index 0000000000..165be24336
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b2.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b3.png b/static/images/composer-emoji/twitter/1f3b3.png
new file mode 100644
index 0000000000..c17ae96b7c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b4.png b/static/images/composer-emoji/twitter/1f3b4.png
new file mode 100644
index 0000000000..d7f4d7e09f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b5.png b/static/images/composer-emoji/twitter/1f3b5.png
new file mode 100644
index 0000000000..28115ae1da
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b6.png b/static/images/composer-emoji/twitter/1f3b6.png
new file mode 100644
index 0000000000..b444df4adb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b6.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b7.png b/static/images/composer-emoji/twitter/1f3b7.png
new file mode 100644
index 0000000000..a1ef448986
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b8.png b/static/images/composer-emoji/twitter/1f3b8.png
new file mode 100644
index 0000000000..5e74b6f454
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3b9.png b/static/images/composer-emoji/twitter/1f3b9.png
new file mode 100644
index 0000000000..e5d65e93d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3b9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ba.png b/static/images/composer-emoji/twitter/1f3ba.png
new file mode 100644
index 0000000000..19ab95611b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ba.png differ
diff --git a/static/images/composer-emoji/twitter/1f3bb.png b/static/images/composer-emoji/twitter/1f3bb.png
new file mode 100644
index 0000000000..2e93c29362
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3bb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3bc.png b/static/images/composer-emoji/twitter/1f3bc.png
new file mode 100644
index 0000000000..dea5a8a9d5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3bc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3bd.png b/static/images/composer-emoji/twitter/1f3bd.png
new file mode 100644
index 0000000000..9f8f824d3a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3bd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3be.png b/static/images/composer-emoji/twitter/1f3be.png
new file mode 100644
index 0000000000..5f92b14226
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3be.png differ
diff --git a/static/images/composer-emoji/twitter/1f3bf.png b/static/images/composer-emoji/twitter/1f3bf.png
new file mode 100644
index 0000000000..7952364c75
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3bf.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c0.png b/static/images/composer-emoji/twitter/1f3c0.png
new file mode 100644
index 0000000000..c100f6f3e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c1.png b/static/images/composer-emoji/twitter/1f3c1.png
new file mode 100644
index 0000000000..257859e163
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c1.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c2.png b/static/images/composer-emoji/twitter/1f3c2.png
new file mode 100644
index 0000000000..145ee6d7ae
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c2.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3-1f3fb.png b/static/images/composer-emoji/twitter/1f3c3-1f3fb.png
new file mode 100644
index 0000000000..fb6ebec92c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3-1f3fc.png b/static/images/composer-emoji/twitter/1f3c3-1f3fc.png
new file mode 100644
index 0000000000..f93a3c8ea6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3-1f3fd.png b/static/images/composer-emoji/twitter/1f3c3-1f3fd.png
new file mode 100644
index 0000000000..bedf400e22
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3-1f3fe.png b/static/images/composer-emoji/twitter/1f3c3-1f3fe.png
new file mode 100644
index 0000000000..206b2bd6f5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3-1f3ff.png b/static/images/composer-emoji/twitter/1f3c3-1f3ff.png
new file mode 100644
index 0000000000..4441863442
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c3.png b/static/images/composer-emoji/twitter/1f3c3.png
new file mode 100644
index 0000000000..d6a1cd2263
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4-1f3fb.png b/static/images/composer-emoji/twitter/1f3c4-1f3fb.png
new file mode 100644
index 0000000000..aae06de802
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4-1f3fc.png b/static/images/composer-emoji/twitter/1f3c4-1f3fc.png
new file mode 100644
index 0000000000..bf4e223386
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4-1f3fd.png b/static/images/composer-emoji/twitter/1f3c4-1f3fd.png
new file mode 100644
index 0000000000..ff912c57c0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4-1f3fe.png b/static/images/composer-emoji/twitter/1f3c4-1f3fe.png
new file mode 100644
index 0000000000..ac15b5eec0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4-1f3ff.png b/static/images/composer-emoji/twitter/1f3c4-1f3ff.png
new file mode 100644
index 0000000000..605080fb75
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c4.png b/static/images/composer-emoji/twitter/1f3c4.png
new file mode 100644
index 0000000000..697ddee43f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c5.png b/static/images/composer-emoji/twitter/1f3c5.png
new file mode 100644
index 0000000000..1d7bea07ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c6.png b/static/images/composer-emoji/twitter/1f3c6.png
new file mode 100644
index 0000000000..426712aec4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c6.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7-1f3fb.png b/static/images/composer-emoji/twitter/1f3c7-1f3fb.png
new file mode 100644
index 0000000000..e5b48cb39e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7-1f3fc.png b/static/images/composer-emoji/twitter/1f3c7-1f3fc.png
new file mode 100644
index 0000000000..43a06cee6a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7-1f3fd.png b/static/images/composer-emoji/twitter/1f3c7-1f3fd.png
new file mode 100644
index 0000000000..d4eb18ba7d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7-1f3fe.png b/static/images/composer-emoji/twitter/1f3c7-1f3fe.png
new file mode 100644
index 0000000000..d250ecf260
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7-1f3ff.png b/static/images/composer-emoji/twitter/1f3c7-1f3ff.png
new file mode 100644
index 0000000000..4f0f188ee9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c7.png b/static/images/composer-emoji/twitter/1f3c7.png
new file mode 100644
index 0000000000..8f2b7ba188
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c8.png b/static/images/composer-emoji/twitter/1f3c8.png
new file mode 100644
index 0000000000..61ced28132
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3c9.png b/static/images/composer-emoji/twitter/1f3c9.png
new file mode 100644
index 0000000000..06b70299d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3c9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca-1f3fb.png b/static/images/composer-emoji/twitter/1f3ca-1f3fb.png
new file mode 100644
index 0000000000..cf0753cd62
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca-1f3fc.png b/static/images/composer-emoji/twitter/1f3ca-1f3fc.png
new file mode 100644
index 0000000000..294f7acf4b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca-1f3fd.png b/static/images/composer-emoji/twitter/1f3ca-1f3fd.png
new file mode 100644
index 0000000000..c9a0543f66
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca-1f3fe.png b/static/images/composer-emoji/twitter/1f3ca-1f3fe.png
new file mode 100644
index 0000000000..354eecdcc3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca-1f3ff.png b/static/images/composer-emoji/twitter/1f3ca-1f3ff.png
new file mode 100644
index 0000000000..af1d3258ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ca.png b/static/images/composer-emoji/twitter/1f3ca.png
new file mode 100644
index 0000000000..c58aa940eb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ca.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb-1f3fb.png b/static/images/composer-emoji/twitter/1f3cb-1f3fb.png
new file mode 100644
index 0000000000..b7cd47ab16
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb-1f3fc.png b/static/images/composer-emoji/twitter/1f3cb-1f3fc.png
new file mode 100644
index 0000000000..c121465969
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb-1f3fd.png b/static/images/composer-emoji/twitter/1f3cb-1f3fd.png
new file mode 100644
index 0000000000..bf53720372
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb-1f3fe.png b/static/images/composer-emoji/twitter/1f3cb-1f3fe.png
new file mode 100644
index 0000000000..5bb87ef336
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb-1f3ff.png b/static/images/composer-emoji/twitter/1f3cb-1f3ff.png
new file mode 100644
index 0000000000..2d5c95f8dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cb.png b/static/images/composer-emoji/twitter/1f3cb.png
new file mode 100644
index 0000000000..4ea752651e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cc.png b/static/images/composer-emoji/twitter/1f3cc.png
new file mode 100644
index 0000000000..4806dfab29
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cd.png b/static/images/composer-emoji/twitter/1f3cd.png
new file mode 100644
index 0000000000..683355d44f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ce.png b/static/images/composer-emoji/twitter/1f3ce.png
new file mode 100644
index 0000000000..53fa8e6e51
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ce.png differ
diff --git a/static/images/composer-emoji/twitter/1f3cf.png b/static/images/composer-emoji/twitter/1f3cf.png
new file mode 100644
index 0000000000..1428524bcc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3cf.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d0.png b/static/images/composer-emoji/twitter/1f3d0.png
new file mode 100644
index 0000000000..156af03dc7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d1.png b/static/images/composer-emoji/twitter/1f3d1.png
new file mode 100644
index 0000000000..96f61ef7d6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d1.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d2.png b/static/images/composer-emoji/twitter/1f3d2.png
new file mode 100644
index 0000000000..35865a3692
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d2.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d3.png b/static/images/composer-emoji/twitter/1f3d3.png
new file mode 100644
index 0000000000..8fc7046b22
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d4.png b/static/images/composer-emoji/twitter/1f3d4.png
new file mode 100644
index 0000000000..fa9f0ab12a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d5.png b/static/images/composer-emoji/twitter/1f3d5.png
new file mode 100644
index 0000000000..2b80d88aa6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d6.png b/static/images/composer-emoji/twitter/1f3d6.png
new file mode 100644
index 0000000000..81c22bf3b9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d6.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d7.png b/static/images/composer-emoji/twitter/1f3d7.png
new file mode 100644
index 0000000000..c158ecd72c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d8.png b/static/images/composer-emoji/twitter/1f3d8.png
new file mode 100644
index 0000000000..d68314d394
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3d9.png b/static/images/composer-emoji/twitter/1f3d9.png
new file mode 100644
index 0000000000..e5fa117011
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3d9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3da.png b/static/images/composer-emoji/twitter/1f3da.png
new file mode 100644
index 0000000000..525e66e6e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3da.png differ
diff --git a/static/images/composer-emoji/twitter/1f3db.png b/static/images/composer-emoji/twitter/1f3db.png
new file mode 100644
index 0000000000..a2d0aa559e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3db.png differ
diff --git a/static/images/composer-emoji/twitter/1f3dc.png b/static/images/composer-emoji/twitter/1f3dc.png
new file mode 100644
index 0000000000..0a160335be
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3dc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3dd.png b/static/images/composer-emoji/twitter/1f3dd.png
new file mode 100644
index 0000000000..53e24801ab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3dd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3de.png b/static/images/composer-emoji/twitter/1f3de.png
new file mode 100644
index 0000000000..9492631b2d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3de.png differ
diff --git a/static/images/composer-emoji/twitter/1f3df.png b/static/images/composer-emoji/twitter/1f3df.png
new file mode 100644
index 0000000000..e52951cabb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3df.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e0.png b/static/images/composer-emoji/twitter/1f3e0.png
new file mode 100644
index 0000000000..c66db25262
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e1.png b/static/images/composer-emoji/twitter/1f3e1.png
new file mode 100644
index 0000000000..795a510ce3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e1.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e2.png b/static/images/composer-emoji/twitter/1f3e2.png
new file mode 100644
index 0000000000..1504ed88b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e2.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e3.png b/static/images/composer-emoji/twitter/1f3e3.png
new file mode 100644
index 0000000000..f378a4a06d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e4.png b/static/images/composer-emoji/twitter/1f3e4.png
new file mode 100644
index 0000000000..c8789b551b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e5.png b/static/images/composer-emoji/twitter/1f3e5.png
new file mode 100644
index 0000000000..4fd45d091e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e6.png b/static/images/composer-emoji/twitter/1f3e6.png
new file mode 100644
index 0000000000..9cfcc182d1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e7.png b/static/images/composer-emoji/twitter/1f3e7.png
new file mode 100644
index 0000000000..59e2502224
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e8.png b/static/images/composer-emoji/twitter/1f3e8.png
new file mode 100644
index 0000000000..9ee40b0f6b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3e9.png b/static/images/composer-emoji/twitter/1f3e9.png
new file mode 100644
index 0000000000..a6e1e45c34
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ea.png b/static/images/composer-emoji/twitter/1f3ea.png
new file mode 100644
index 0000000000..7b7e49e526
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f3eb.png b/static/images/composer-emoji/twitter/1f3eb.png
new file mode 100644
index 0000000000..cccfc5c4e7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ec.png b/static/images/composer-emoji/twitter/1f3ec.png
new file mode 100644
index 0000000000..27370555f0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ed.png b/static/images/composer-emoji/twitter/1f3ed.png
new file mode 100644
index 0000000000..29407a23e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ee.png b/static/images/composer-emoji/twitter/1f3ee.png
new file mode 100644
index 0000000000..afab64c222
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ef.png b/static/images/composer-emoji/twitter/1f3ef.png
new file mode 100644
index 0000000000..31424ef9e2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f0.png b/static/images/composer-emoji/twitter/1f3f0.png
new file mode 100644
index 0000000000..2e8183a7e0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f3.png b/static/images/composer-emoji/twitter/1f3f3.png
new file mode 100644
index 0000000000..b562c29ec0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f4.png b/static/images/composer-emoji/twitter/1f3f4.png
new file mode 100644
index 0000000000..0e7f50f1e6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f5.png b/static/images/composer-emoji/twitter/1f3f5.png
new file mode 100644
index 0000000000..fac8758f54
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f7.png b/static/images/composer-emoji/twitter/1f3f7.png
new file mode 100644
index 0000000000..751e8a5d4a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f8.png b/static/images/composer-emoji/twitter/1f3f8.png
new file mode 100644
index 0000000000..0688ea277c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f3f9.png b/static/images/composer-emoji/twitter/1f3f9.png
new file mode 100644
index 0000000000..c077588507
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f3fa.png b/static/images/composer-emoji/twitter/1f3fa.png
new file mode 100644
index 0000000000..839ee5b11f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f3fb.png b/static/images/composer-emoji/twitter/1f3fb.png
new file mode 100644
index 0000000000..8766acb361
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f3fc.png b/static/images/composer-emoji/twitter/1f3fc.png
new file mode 100644
index 0000000000..a2167775e1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f3fd.png b/static/images/composer-emoji/twitter/1f3fd.png
new file mode 100644
index 0000000000..3917f178a9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f3fe.png b/static/images/composer-emoji/twitter/1f3fe.png
new file mode 100644
index 0000000000..3b3407ce6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f3ff.png b/static/images/composer-emoji/twitter/1f3ff.png
new file mode 100644
index 0000000000..1a9945668d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f400.png b/static/images/composer-emoji/twitter/1f400.png
new file mode 100644
index 0000000000..121cf1a0b4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f400.png differ
diff --git a/static/images/composer-emoji/twitter/1f401.png b/static/images/composer-emoji/twitter/1f401.png
new file mode 100644
index 0000000000..616fb020d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f401.png differ
diff --git a/static/images/composer-emoji/twitter/1f402.png b/static/images/composer-emoji/twitter/1f402.png
new file mode 100644
index 0000000000..7b2eecf636
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f402.png differ
diff --git a/static/images/composer-emoji/twitter/1f403.png b/static/images/composer-emoji/twitter/1f403.png
new file mode 100644
index 0000000000..8287cdffe1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f403.png differ
diff --git a/static/images/composer-emoji/twitter/1f404.png b/static/images/composer-emoji/twitter/1f404.png
new file mode 100644
index 0000000000..d5c796dd5e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f404.png differ
diff --git a/static/images/composer-emoji/twitter/1f405.png b/static/images/composer-emoji/twitter/1f405.png
new file mode 100644
index 0000000000..ae1ee79277
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f405.png differ
diff --git a/static/images/composer-emoji/twitter/1f406.png b/static/images/composer-emoji/twitter/1f406.png
new file mode 100644
index 0000000000..2ea2c0f89f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f406.png differ
diff --git a/static/images/composer-emoji/twitter/1f407.png b/static/images/composer-emoji/twitter/1f407.png
new file mode 100644
index 0000000000..73d49d086d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f407.png differ
diff --git a/static/images/composer-emoji/twitter/1f408.png b/static/images/composer-emoji/twitter/1f408.png
new file mode 100644
index 0000000000..2434ca7c5d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f408.png differ
diff --git a/static/images/composer-emoji/twitter/1f409.png b/static/images/composer-emoji/twitter/1f409.png
new file mode 100644
index 0000000000..0c91747984
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f409.png differ
diff --git a/static/images/composer-emoji/twitter/1f40a.png b/static/images/composer-emoji/twitter/1f40a.png
new file mode 100644
index 0000000000..8d06bc8f47
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40a.png differ
diff --git a/static/images/composer-emoji/twitter/1f40b.png b/static/images/composer-emoji/twitter/1f40b.png
new file mode 100644
index 0000000000..a0db5704d7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40b.png differ
diff --git a/static/images/composer-emoji/twitter/1f40c.png b/static/images/composer-emoji/twitter/1f40c.png
new file mode 100644
index 0000000000..5c6db67a16
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40c.png differ
diff --git a/static/images/composer-emoji/twitter/1f40d.png b/static/images/composer-emoji/twitter/1f40d.png
new file mode 100644
index 0000000000..d95b31e5f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40d.png differ
diff --git a/static/images/composer-emoji/twitter/1f40e.png b/static/images/composer-emoji/twitter/1f40e.png
new file mode 100644
index 0000000000..5c33622786
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40e.png differ
diff --git a/static/images/composer-emoji/twitter/1f40f.png b/static/images/composer-emoji/twitter/1f40f.png
new file mode 100644
index 0000000000..cbc59d93da
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f40f.png differ
diff --git a/static/images/composer-emoji/twitter/1f410.png b/static/images/composer-emoji/twitter/1f410.png
new file mode 100644
index 0000000000..4caefcc5f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f410.png differ
diff --git a/static/images/composer-emoji/twitter/1f411.png b/static/images/composer-emoji/twitter/1f411.png
new file mode 100644
index 0000000000..febfcf4228
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f411.png differ
diff --git a/static/images/composer-emoji/twitter/1f412.png b/static/images/composer-emoji/twitter/1f412.png
new file mode 100644
index 0000000000..b5a7a520f5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f412.png differ
diff --git a/static/images/composer-emoji/twitter/1f413.png b/static/images/composer-emoji/twitter/1f413.png
new file mode 100644
index 0000000000..d8ac15616b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f413.png differ
diff --git a/static/images/composer-emoji/twitter/1f414.png b/static/images/composer-emoji/twitter/1f414.png
new file mode 100644
index 0000000000..a6a09f9a64
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f414.png differ
diff --git a/static/images/composer-emoji/twitter/1f415.png b/static/images/composer-emoji/twitter/1f415.png
new file mode 100644
index 0000000000..1dd7502546
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f415.png differ
diff --git a/static/images/composer-emoji/twitter/1f416.png b/static/images/composer-emoji/twitter/1f416.png
new file mode 100644
index 0000000000..ecaba119ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f416.png differ
diff --git a/static/images/composer-emoji/twitter/1f417.png b/static/images/composer-emoji/twitter/1f417.png
new file mode 100644
index 0000000000..df23584859
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f417.png differ
diff --git a/static/images/composer-emoji/twitter/1f418.png b/static/images/composer-emoji/twitter/1f418.png
new file mode 100644
index 0000000000..0f68a29289
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f418.png differ
diff --git a/static/images/composer-emoji/twitter/1f419.png b/static/images/composer-emoji/twitter/1f419.png
new file mode 100644
index 0000000000..a522430758
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f419.png differ
diff --git a/static/images/composer-emoji/twitter/1f41a.png b/static/images/composer-emoji/twitter/1f41a.png
new file mode 100644
index 0000000000..7ea57ca8c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41a.png differ
diff --git a/static/images/composer-emoji/twitter/1f41b.png b/static/images/composer-emoji/twitter/1f41b.png
new file mode 100644
index 0000000000..de5154b98c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41b.png differ
diff --git a/static/images/composer-emoji/twitter/1f41c.png b/static/images/composer-emoji/twitter/1f41c.png
new file mode 100644
index 0000000000..776818e04d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41c.png differ
diff --git a/static/images/composer-emoji/twitter/1f41d.png b/static/images/composer-emoji/twitter/1f41d.png
new file mode 100644
index 0000000000..3399c538c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41d.png differ
diff --git a/static/images/composer-emoji/twitter/1f41e.png b/static/images/composer-emoji/twitter/1f41e.png
new file mode 100644
index 0000000000..fc0f4025af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41e.png differ
diff --git a/static/images/composer-emoji/twitter/1f41f.png b/static/images/composer-emoji/twitter/1f41f.png
new file mode 100644
index 0000000000..d581366b45
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f41f.png differ
diff --git a/static/images/composer-emoji/twitter/1f420.png b/static/images/composer-emoji/twitter/1f420.png
new file mode 100644
index 0000000000..0b7a776928
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f420.png differ
diff --git a/static/images/composer-emoji/twitter/1f421.png b/static/images/composer-emoji/twitter/1f421.png
new file mode 100644
index 0000000000..aaf0b636b0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f421.png differ
diff --git a/static/images/composer-emoji/twitter/1f422.png b/static/images/composer-emoji/twitter/1f422.png
new file mode 100644
index 0000000000..284818efa4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f422.png differ
diff --git a/static/images/composer-emoji/twitter/1f423.png b/static/images/composer-emoji/twitter/1f423.png
new file mode 100644
index 0000000000..ebed8467c0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f423.png differ
diff --git a/static/images/composer-emoji/twitter/1f424.png b/static/images/composer-emoji/twitter/1f424.png
new file mode 100644
index 0000000000..1194ed25cb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f424.png differ
diff --git a/static/images/composer-emoji/twitter/1f425.png b/static/images/composer-emoji/twitter/1f425.png
new file mode 100644
index 0000000000..659402a862
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f425.png differ
diff --git a/static/images/composer-emoji/twitter/1f426.png b/static/images/composer-emoji/twitter/1f426.png
new file mode 100644
index 0000000000..aed1388219
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f426.png differ
diff --git a/static/images/composer-emoji/twitter/1f427.png b/static/images/composer-emoji/twitter/1f427.png
new file mode 100644
index 0000000000..e6bc24f125
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f427.png differ
diff --git a/static/images/composer-emoji/twitter/1f428.png b/static/images/composer-emoji/twitter/1f428.png
new file mode 100644
index 0000000000..d3880aa818
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f428.png differ
diff --git a/static/images/composer-emoji/twitter/1f429.png b/static/images/composer-emoji/twitter/1f429.png
new file mode 100644
index 0000000000..28f0a246a5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f429.png differ
diff --git a/static/images/composer-emoji/twitter/1f42a.png b/static/images/composer-emoji/twitter/1f42a.png
new file mode 100644
index 0000000000..fab6134cd2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42a.png differ
diff --git a/static/images/composer-emoji/twitter/1f42b.png b/static/images/composer-emoji/twitter/1f42b.png
new file mode 100644
index 0000000000..15bf4ab280
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42b.png differ
diff --git a/static/images/composer-emoji/twitter/1f42c.png b/static/images/composer-emoji/twitter/1f42c.png
new file mode 100644
index 0000000000..6d5714dcd1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42c.png differ
diff --git a/static/images/composer-emoji/twitter/1f42d.png b/static/images/composer-emoji/twitter/1f42d.png
new file mode 100644
index 0000000000..083738e38f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42d.png differ
diff --git a/static/images/composer-emoji/twitter/1f42e.png b/static/images/composer-emoji/twitter/1f42e.png
new file mode 100644
index 0000000000..fff925e293
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42e.png differ
diff --git a/static/images/composer-emoji/twitter/1f42f.png b/static/images/composer-emoji/twitter/1f42f.png
new file mode 100644
index 0000000000..32cb1f996e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f42f.png differ
diff --git a/static/images/composer-emoji/twitter/1f430.png b/static/images/composer-emoji/twitter/1f430.png
new file mode 100644
index 0000000000..856b231e29
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f430.png differ
diff --git a/static/images/composer-emoji/twitter/1f431.png b/static/images/composer-emoji/twitter/1f431.png
new file mode 100644
index 0000000000..026072773f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f431.png differ
diff --git a/static/images/composer-emoji/twitter/1f432.png b/static/images/composer-emoji/twitter/1f432.png
new file mode 100644
index 0000000000..3220f7c69f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f432.png differ
diff --git a/static/images/composer-emoji/twitter/1f433.png b/static/images/composer-emoji/twitter/1f433.png
new file mode 100644
index 0000000000..626897f176
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f433.png differ
diff --git a/static/images/composer-emoji/twitter/1f434.png b/static/images/composer-emoji/twitter/1f434.png
new file mode 100644
index 0000000000..993f2b847c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f434.png differ
diff --git a/static/images/composer-emoji/twitter/1f435.png b/static/images/composer-emoji/twitter/1f435.png
new file mode 100644
index 0000000000..07a354c789
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f435.png differ
diff --git a/static/images/composer-emoji/twitter/1f436.png b/static/images/composer-emoji/twitter/1f436.png
new file mode 100644
index 0000000000..2102d4e7e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f436.png differ
diff --git a/static/images/composer-emoji/twitter/1f437.png b/static/images/composer-emoji/twitter/1f437.png
new file mode 100644
index 0000000000..9102214e21
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f437.png differ
diff --git a/static/images/composer-emoji/twitter/1f438.png b/static/images/composer-emoji/twitter/1f438.png
new file mode 100644
index 0000000000..ccb11ad2ff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f438.png differ
diff --git a/static/images/composer-emoji/twitter/1f439.png b/static/images/composer-emoji/twitter/1f439.png
new file mode 100644
index 0000000000..1521f91bb2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f439.png differ
diff --git a/static/images/composer-emoji/twitter/1f43a.png b/static/images/composer-emoji/twitter/1f43a.png
new file mode 100644
index 0000000000..b642873832
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43a.png differ
diff --git a/static/images/composer-emoji/twitter/1f43b.png b/static/images/composer-emoji/twitter/1f43b.png
new file mode 100644
index 0000000000..36b8b062b7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43b.png differ
diff --git a/static/images/composer-emoji/twitter/1f43c.png b/static/images/composer-emoji/twitter/1f43c.png
new file mode 100644
index 0000000000..3f86ef40e3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43c.png differ
diff --git a/static/images/composer-emoji/twitter/1f43d.png b/static/images/composer-emoji/twitter/1f43d.png
new file mode 100644
index 0000000000..7dab9e1970
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43d.png differ
diff --git a/static/images/composer-emoji/twitter/1f43e.png b/static/images/composer-emoji/twitter/1f43e.png
new file mode 100644
index 0000000000..e3cae83454
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43e.png differ
diff --git a/static/images/composer-emoji/twitter/1f43f.png b/static/images/composer-emoji/twitter/1f43f.png
new file mode 100644
index 0000000000..3e7d95e5e3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f43f.png differ
diff --git a/static/images/composer-emoji/twitter/1f440.png b/static/images/composer-emoji/twitter/1f440.png
new file mode 100644
index 0000000000..a369d7662f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f440.png differ
diff --git a/static/images/composer-emoji/twitter/1f441.png b/static/images/composer-emoji/twitter/1f441.png
new file mode 100644
index 0000000000..43b621e33f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f441.png differ
diff --git a/static/images/composer-emoji/twitter/1f442-1f3fb.png b/static/images/composer-emoji/twitter/1f442-1f3fb.png
new file mode 100644
index 0000000000..dd42481a17
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f442-1f3fc.png b/static/images/composer-emoji/twitter/1f442-1f3fc.png
new file mode 100644
index 0000000000..76b2f30b7b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f442-1f3fd.png b/static/images/composer-emoji/twitter/1f442-1f3fd.png
new file mode 100644
index 0000000000..7e7cf792b0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f442-1f3fe.png b/static/images/composer-emoji/twitter/1f442-1f3fe.png
new file mode 100644
index 0000000000..18ff13a4fa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f442-1f3ff.png b/static/images/composer-emoji/twitter/1f442-1f3ff.png
new file mode 100644
index 0000000000..58bad64baa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f442.png b/static/images/composer-emoji/twitter/1f442.png
new file mode 100644
index 0000000000..e16fafe143
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f442.png differ
diff --git a/static/images/composer-emoji/twitter/1f443-1f3fb.png b/static/images/composer-emoji/twitter/1f443-1f3fb.png
new file mode 100644
index 0000000000..cbfd6f0b2f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f443-1f3fc.png b/static/images/composer-emoji/twitter/1f443-1f3fc.png
new file mode 100644
index 0000000000..cdfff5354f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f443-1f3fd.png b/static/images/composer-emoji/twitter/1f443-1f3fd.png
new file mode 100644
index 0000000000..28b9e527d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f443-1f3fe.png b/static/images/composer-emoji/twitter/1f443-1f3fe.png
new file mode 100644
index 0000000000..a0cc9f9b6d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f443-1f3ff.png b/static/images/composer-emoji/twitter/1f443-1f3ff.png
new file mode 100644
index 0000000000..9c93bb8aa8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f443.png b/static/images/composer-emoji/twitter/1f443.png
new file mode 100644
index 0000000000..fe5276e8ab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f443.png differ
diff --git a/static/images/composer-emoji/twitter/1f444.png b/static/images/composer-emoji/twitter/1f444.png
new file mode 100644
index 0000000000..6e6fdff293
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f444.png differ
diff --git a/static/images/composer-emoji/twitter/1f445.png b/static/images/composer-emoji/twitter/1f445.png
new file mode 100644
index 0000000000..57d4522aa8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f445.png differ
diff --git a/static/images/composer-emoji/twitter/1f446-1f3fb.png b/static/images/composer-emoji/twitter/1f446-1f3fb.png
new file mode 100644
index 0000000000..06cf62d338
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f446-1f3fc.png b/static/images/composer-emoji/twitter/1f446-1f3fc.png
new file mode 100644
index 0000000000..eda8753d02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f446-1f3fd.png b/static/images/composer-emoji/twitter/1f446-1f3fd.png
new file mode 100644
index 0000000000..14c5b82c4c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f446-1f3fe.png b/static/images/composer-emoji/twitter/1f446-1f3fe.png
new file mode 100644
index 0000000000..fb71330ef1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f446-1f3ff.png b/static/images/composer-emoji/twitter/1f446-1f3ff.png
new file mode 100644
index 0000000000..7c51fcd950
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f446.png b/static/images/composer-emoji/twitter/1f446.png
new file mode 100644
index 0000000000..6d318b85f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f446.png differ
diff --git a/static/images/composer-emoji/twitter/1f447-1f3fb.png b/static/images/composer-emoji/twitter/1f447-1f3fb.png
new file mode 100644
index 0000000000..dcc3b82544
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f447-1f3fc.png b/static/images/composer-emoji/twitter/1f447-1f3fc.png
new file mode 100644
index 0000000000..3547ebd73b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f447-1f3fd.png b/static/images/composer-emoji/twitter/1f447-1f3fd.png
new file mode 100644
index 0000000000..43b1593544
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f447-1f3fe.png b/static/images/composer-emoji/twitter/1f447-1f3fe.png
new file mode 100644
index 0000000000..15c40e8b22
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f447-1f3ff.png b/static/images/composer-emoji/twitter/1f447-1f3ff.png
new file mode 100644
index 0000000000..075a2e34ab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f447.png b/static/images/composer-emoji/twitter/1f447.png
new file mode 100644
index 0000000000..6b06102ab3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f447.png differ
diff --git a/static/images/composer-emoji/twitter/1f448-1f3fb.png b/static/images/composer-emoji/twitter/1f448-1f3fb.png
new file mode 100644
index 0000000000..2460acf036
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f448-1f3fc.png b/static/images/composer-emoji/twitter/1f448-1f3fc.png
new file mode 100644
index 0000000000..6cdd1c7ab4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f448-1f3fd.png b/static/images/composer-emoji/twitter/1f448-1f3fd.png
new file mode 100644
index 0000000000..44f22b5e57
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f448-1f3fe.png b/static/images/composer-emoji/twitter/1f448-1f3fe.png
new file mode 100644
index 0000000000..c22f6244b0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f448-1f3ff.png b/static/images/composer-emoji/twitter/1f448-1f3ff.png
new file mode 100644
index 0000000000..dd03e51969
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f448.png b/static/images/composer-emoji/twitter/1f448.png
new file mode 100644
index 0000000000..d6a96f6398
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f448.png differ
diff --git a/static/images/composer-emoji/twitter/1f449-1f3fb.png b/static/images/composer-emoji/twitter/1f449-1f3fb.png
new file mode 100644
index 0000000000..8bebf6a0ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f449-1f3fc.png b/static/images/composer-emoji/twitter/1f449-1f3fc.png
new file mode 100644
index 0000000000..74e52cb239
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f449-1f3fd.png b/static/images/composer-emoji/twitter/1f449-1f3fd.png
new file mode 100644
index 0000000000..381c7cbb1a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f449-1f3fe.png b/static/images/composer-emoji/twitter/1f449-1f3fe.png
new file mode 100644
index 0000000000..249827562a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f449-1f3ff.png b/static/images/composer-emoji/twitter/1f449-1f3ff.png
new file mode 100644
index 0000000000..fe00ad1b0b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f449.png b/static/images/composer-emoji/twitter/1f449.png
new file mode 100644
index 0000000000..8c6d96ae35
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f449.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a-1f3fb.png b/static/images/composer-emoji/twitter/1f44a-1f3fb.png
new file mode 100644
index 0000000000..89ceea043b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a-1f3fc.png b/static/images/composer-emoji/twitter/1f44a-1f3fc.png
new file mode 100644
index 0000000000..55bced532c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a-1f3fd.png b/static/images/composer-emoji/twitter/1f44a-1f3fd.png
new file mode 100644
index 0000000000..8c49a4d132
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a-1f3fe.png b/static/images/composer-emoji/twitter/1f44a-1f3fe.png
new file mode 100644
index 0000000000..b376c503dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a-1f3ff.png b/static/images/composer-emoji/twitter/1f44a-1f3ff.png
new file mode 100644
index 0000000000..eaa166aa04
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44a.png b/static/images/composer-emoji/twitter/1f44a.png
new file mode 100644
index 0000000000..c41bfa3849
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44a.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b-1f3fb.png b/static/images/composer-emoji/twitter/1f44b-1f3fb.png
new file mode 100644
index 0000000000..757d341db8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b-1f3fc.png b/static/images/composer-emoji/twitter/1f44b-1f3fc.png
new file mode 100644
index 0000000000..7afa1eb9bc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b-1f3fd.png b/static/images/composer-emoji/twitter/1f44b-1f3fd.png
new file mode 100644
index 0000000000..b140608067
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b-1f3fe.png b/static/images/composer-emoji/twitter/1f44b-1f3fe.png
new file mode 100644
index 0000000000..38d970d79a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b-1f3ff.png b/static/images/composer-emoji/twitter/1f44b-1f3ff.png
new file mode 100644
index 0000000000..a16695b92a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44b.png b/static/images/composer-emoji/twitter/1f44b.png
new file mode 100644
index 0000000000..8666727fe0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44b.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c-1f3fb.png b/static/images/composer-emoji/twitter/1f44c-1f3fb.png
new file mode 100644
index 0000000000..c95943976a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c-1f3fc.png b/static/images/composer-emoji/twitter/1f44c-1f3fc.png
new file mode 100644
index 0000000000..8f26a82850
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c-1f3fd.png b/static/images/composer-emoji/twitter/1f44c-1f3fd.png
new file mode 100644
index 0000000000..5376fc4976
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c-1f3fe.png b/static/images/composer-emoji/twitter/1f44c-1f3fe.png
new file mode 100644
index 0000000000..168a6a112e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c-1f3ff.png b/static/images/composer-emoji/twitter/1f44c-1f3ff.png
new file mode 100644
index 0000000000..901f4eec1d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44c.png b/static/images/composer-emoji/twitter/1f44c.png
new file mode 100644
index 0000000000..93373ef03d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44c.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d-1f3fb.png b/static/images/composer-emoji/twitter/1f44d-1f3fb.png
new file mode 100644
index 0000000000..144fcc35be
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d-1f3fc.png b/static/images/composer-emoji/twitter/1f44d-1f3fc.png
new file mode 100644
index 0000000000..23a09dd339
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d-1f3fd.png b/static/images/composer-emoji/twitter/1f44d-1f3fd.png
new file mode 100644
index 0000000000..bc07aade8b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d-1f3fe.png b/static/images/composer-emoji/twitter/1f44d-1f3fe.png
new file mode 100644
index 0000000000..ff576955de
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d-1f3ff.png b/static/images/composer-emoji/twitter/1f44d-1f3ff.png
new file mode 100644
index 0000000000..35174bbff6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44d.png b/static/images/composer-emoji/twitter/1f44d.png
new file mode 100644
index 0000000000..eb53ace649
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44d.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e-1f3fb.png b/static/images/composer-emoji/twitter/1f44e-1f3fb.png
new file mode 100644
index 0000000000..4e1ae8093f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e-1f3fc.png b/static/images/composer-emoji/twitter/1f44e-1f3fc.png
new file mode 100644
index 0000000000..27568075db
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e-1f3fd.png b/static/images/composer-emoji/twitter/1f44e-1f3fd.png
new file mode 100644
index 0000000000..2220f44b5c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e-1f3fe.png b/static/images/composer-emoji/twitter/1f44e-1f3fe.png
new file mode 100644
index 0000000000..46b09fd246
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e-1f3ff.png b/static/images/composer-emoji/twitter/1f44e-1f3ff.png
new file mode 100644
index 0000000000..c3db727035
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44e.png b/static/images/composer-emoji/twitter/1f44e.png
new file mode 100644
index 0000000000..c7e3fce883
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44e.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f-1f3fb.png b/static/images/composer-emoji/twitter/1f44f-1f3fb.png
new file mode 100644
index 0000000000..c82b66a558
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f-1f3fc.png b/static/images/composer-emoji/twitter/1f44f-1f3fc.png
new file mode 100644
index 0000000000..e04b22ac28
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f-1f3fd.png b/static/images/composer-emoji/twitter/1f44f-1f3fd.png
new file mode 100644
index 0000000000..77fb9be237
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f-1f3fe.png b/static/images/composer-emoji/twitter/1f44f-1f3fe.png
new file mode 100644
index 0000000000..504f0c71ec
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f-1f3ff.png b/static/images/composer-emoji/twitter/1f44f-1f3ff.png
new file mode 100644
index 0000000000..cdb402a424
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f44f.png b/static/images/composer-emoji/twitter/1f44f.png
new file mode 100644
index 0000000000..8a26f8bc64
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f44f.png differ
diff --git a/static/images/composer-emoji/twitter/1f450-1f3fb.png b/static/images/composer-emoji/twitter/1f450-1f3fb.png
new file mode 100644
index 0000000000..ddabbf1348
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f450-1f3fc.png b/static/images/composer-emoji/twitter/1f450-1f3fc.png
new file mode 100644
index 0000000000..544c7d68a6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f450-1f3fd.png b/static/images/composer-emoji/twitter/1f450-1f3fd.png
new file mode 100644
index 0000000000..9ba47cb358
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f450-1f3fe.png b/static/images/composer-emoji/twitter/1f450-1f3fe.png
new file mode 100644
index 0000000000..23c089d6ad
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f450-1f3ff.png b/static/images/composer-emoji/twitter/1f450-1f3ff.png
new file mode 100644
index 0000000000..da4f9502cd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f450.png b/static/images/composer-emoji/twitter/1f450.png
new file mode 100644
index 0000000000..3de61473cc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f450.png differ
diff --git a/static/images/composer-emoji/twitter/1f451.png b/static/images/composer-emoji/twitter/1f451.png
new file mode 100644
index 0000000000..120b2173c7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f451.png differ
diff --git a/static/images/composer-emoji/twitter/1f452.png b/static/images/composer-emoji/twitter/1f452.png
new file mode 100644
index 0000000000..116f5ae184
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f452.png differ
diff --git a/static/images/composer-emoji/twitter/1f453.png b/static/images/composer-emoji/twitter/1f453.png
new file mode 100644
index 0000000000..37df108c1c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f453.png differ
diff --git a/static/images/composer-emoji/twitter/1f454.png b/static/images/composer-emoji/twitter/1f454.png
new file mode 100644
index 0000000000..6efdcc0636
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f454.png differ
diff --git a/static/images/composer-emoji/twitter/1f455.png b/static/images/composer-emoji/twitter/1f455.png
new file mode 100644
index 0000000000..fe40c49ed0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f455.png differ
diff --git a/static/images/composer-emoji/twitter/1f456.png b/static/images/composer-emoji/twitter/1f456.png
new file mode 100644
index 0000000000..2392ebb56d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f456.png differ
diff --git a/static/images/composer-emoji/twitter/1f457.png b/static/images/composer-emoji/twitter/1f457.png
new file mode 100644
index 0000000000..2a9bf7170a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f457.png differ
diff --git a/static/images/composer-emoji/twitter/1f458.png b/static/images/composer-emoji/twitter/1f458.png
new file mode 100644
index 0000000000..c7b5f72686
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f458.png differ
diff --git a/static/images/composer-emoji/twitter/1f459.png b/static/images/composer-emoji/twitter/1f459.png
new file mode 100644
index 0000000000..64bea768f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f459.png differ
diff --git a/static/images/composer-emoji/twitter/1f45a.png b/static/images/composer-emoji/twitter/1f45a.png
new file mode 100644
index 0000000000..2be73032f0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45a.png differ
diff --git a/static/images/composer-emoji/twitter/1f45b.png b/static/images/composer-emoji/twitter/1f45b.png
new file mode 100644
index 0000000000..eafb3a148f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45b.png differ
diff --git a/static/images/composer-emoji/twitter/1f45c.png b/static/images/composer-emoji/twitter/1f45c.png
new file mode 100644
index 0000000000..56953f806b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45c.png differ
diff --git a/static/images/composer-emoji/twitter/1f45d.png b/static/images/composer-emoji/twitter/1f45d.png
new file mode 100644
index 0000000000..d9bfba1aca
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45d.png differ
diff --git a/static/images/composer-emoji/twitter/1f45e.png b/static/images/composer-emoji/twitter/1f45e.png
new file mode 100644
index 0000000000..91d459d5ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45e.png differ
diff --git a/static/images/composer-emoji/twitter/1f45f.png b/static/images/composer-emoji/twitter/1f45f.png
new file mode 100644
index 0000000000..6c276be120
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f45f.png differ
diff --git a/static/images/composer-emoji/twitter/1f460.png b/static/images/composer-emoji/twitter/1f460.png
new file mode 100644
index 0000000000..c2ca34c4dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f460.png differ
diff --git a/static/images/composer-emoji/twitter/1f461.png b/static/images/composer-emoji/twitter/1f461.png
new file mode 100644
index 0000000000..e8c8e700df
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f461.png differ
diff --git a/static/images/composer-emoji/twitter/1f462.png b/static/images/composer-emoji/twitter/1f462.png
new file mode 100644
index 0000000000..1bd03e6ada
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f462.png differ
diff --git a/static/images/composer-emoji/twitter/1f463.png b/static/images/composer-emoji/twitter/1f463.png
new file mode 100644
index 0000000000..6837191c4b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f463.png differ
diff --git a/static/images/composer-emoji/twitter/1f464.png b/static/images/composer-emoji/twitter/1f464.png
new file mode 100644
index 0000000000..1e409e222c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f464.png differ
diff --git a/static/images/composer-emoji/twitter/1f465.png b/static/images/composer-emoji/twitter/1f465.png
new file mode 100644
index 0000000000..f1f4797c4c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f465.png differ
diff --git a/static/images/composer-emoji/twitter/1f466-1f3fb.png b/static/images/composer-emoji/twitter/1f466-1f3fb.png
new file mode 100644
index 0000000000..594e602fea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f466-1f3fc.png b/static/images/composer-emoji/twitter/1f466-1f3fc.png
new file mode 100644
index 0000000000..1a2e9f4be6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f466-1f3fd.png b/static/images/composer-emoji/twitter/1f466-1f3fd.png
new file mode 100644
index 0000000000..5e0a0ea47d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f466-1f3fe.png b/static/images/composer-emoji/twitter/1f466-1f3fe.png
new file mode 100644
index 0000000000..2761c77aa7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f466-1f3ff.png b/static/images/composer-emoji/twitter/1f466-1f3ff.png
new file mode 100644
index 0000000000..bcdfd2faae
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f466.png b/static/images/composer-emoji/twitter/1f466.png
new file mode 100644
index 0000000000..b7438d62e3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f467-1f3fb.png b/static/images/composer-emoji/twitter/1f467-1f3fb.png
new file mode 100644
index 0000000000..e5b53cb6d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f467-1f3fc.png b/static/images/composer-emoji/twitter/1f467-1f3fc.png
new file mode 100644
index 0000000000..72cf960846
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f467-1f3fd.png b/static/images/composer-emoji/twitter/1f467-1f3fd.png
new file mode 100644
index 0000000000..06e3b9a5c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f467-1f3fe.png b/static/images/composer-emoji/twitter/1f467-1f3fe.png
new file mode 100644
index 0000000000..7a3a9752c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f467-1f3ff.png b/static/images/composer-emoji/twitter/1f467-1f3ff.png
new file mode 100644
index 0000000000..3a1bc301af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f467.png b/static/images/composer-emoji/twitter/1f467.png
new file mode 100644
index 0000000000..91ceca6d7c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-1f3fb.png b/static/images/composer-emoji/twitter/1f468-1f3fb.png
new file mode 100644
index 0000000000..4cfb7f1817
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-1f3fc.png b/static/images/composer-emoji/twitter/1f468-1f3fc.png
new file mode 100644
index 0000000000..bcb6ee786f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-1f3fd.png b/static/images/composer-emoji/twitter/1f468-1f3fd.png
new file mode 100644
index 0000000000..bff034385f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-1f3fe.png b/static/images/composer-emoji/twitter/1f468-1f3fe.png
new file mode 100644
index 0000000000..6745d2e474
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-1f3ff.png b/static/images/composer-emoji/twitter/1f468-1f3ff.png
new file mode 100644
index 0000000000..20f484c378
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466-200d-1f466.png b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..909dd60012
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466.png b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466.png
new file mode 100644
index 0000000000..7fcd8d67d1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f466.png b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..2d5e5d1b06
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f467.png b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..e26f21fa44
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467.png b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467.png
new file mode 100644
index 0000000000..fc479b2d72
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f468-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f466-200d-1f466.png b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..6e5d3b00ff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f466.png b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..9db69b9890
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f467.png b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..b81979b655
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467.png b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467.png
new file mode 100644
index 0000000000..6ad6757853
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-1f469-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f468.png b/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f468.png
new file mode 100644
index 0000000000..4300b21620
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f468.png differ
diff --git a/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png
new file mode 100644
index 0000000000..0c874156f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png differ
diff --git a/static/images/composer-emoji/twitter/1f468.png b/static/images/composer-emoji/twitter/1f468.png
new file mode 100644
index 0000000000..d6efa1b3ba
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f468.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-1f3fb.png b/static/images/composer-emoji/twitter/1f469-1f3fb.png
new file mode 100644
index 0000000000..dcd74cfc99
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-1f3fc.png b/static/images/composer-emoji/twitter/1f469-1f3fc.png
new file mode 100644
index 0000000000..bea9357943
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-1f3fd.png b/static/images/composer-emoji/twitter/1f469-1f3fd.png
new file mode 100644
index 0000000000..c234e4dcf0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-1f3fe.png b/static/images/composer-emoji/twitter/1f469-1f3fe.png
new file mode 100644
index 0000000000..227203d047
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-1f3ff.png b/static/images/composer-emoji/twitter/1f469-1f3ff.png
new file mode 100644
index 0000000000..a0f99f2aee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466-200d-1f466.png b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466-200d-1f466.png
new file mode 100644
index 0000000000..f32d595804
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466.png b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466.png
new file mode 100644
index 0000000000..932618186e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f466.png b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f466.png
new file mode 100644
index 0000000000..94cfc491b6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f466.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f467.png b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f467.png
new file mode 100644
index 0000000000..ca95d6d2f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467.png b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467.png
new file mode 100644
index 0000000000..2042acea4e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-1f469-200d-1f467.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f469.png b/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f469.png
new file mode 100644
index 0000000000..1909cbc0b3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f469.png differ
diff --git a/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png b/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png
new file mode 100644
index 0000000000..4b9dfd13f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png differ
diff --git a/static/images/composer-emoji/twitter/1f469.png b/static/images/composer-emoji/twitter/1f469.png
new file mode 100644
index 0000000000..b5c75a2665
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f469.png differ
diff --git a/static/images/composer-emoji/twitter/1f46a.png b/static/images/composer-emoji/twitter/1f46a.png
new file mode 100644
index 0000000000..baf0472251
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46a.png differ
diff --git a/static/images/composer-emoji/twitter/1f46b.png b/static/images/composer-emoji/twitter/1f46b.png
new file mode 100644
index 0000000000..f913a89e73
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46b.png differ
diff --git a/static/images/composer-emoji/twitter/1f46c.png b/static/images/composer-emoji/twitter/1f46c.png
new file mode 100644
index 0000000000..8bba6344af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46c.png differ
diff --git a/static/images/composer-emoji/twitter/1f46d.png b/static/images/composer-emoji/twitter/1f46d.png
new file mode 100644
index 0000000000..5bc0cab7a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46d.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e-1f3fb.png b/static/images/composer-emoji/twitter/1f46e-1f3fb.png
new file mode 100644
index 0000000000..39b491998a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e-1f3fc.png b/static/images/composer-emoji/twitter/1f46e-1f3fc.png
new file mode 100644
index 0000000000..2179a9a90d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e-1f3fd.png b/static/images/composer-emoji/twitter/1f46e-1f3fd.png
new file mode 100644
index 0000000000..274d76e892
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e-1f3fe.png b/static/images/composer-emoji/twitter/1f46e-1f3fe.png
new file mode 100644
index 0000000000..3219a58fce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e-1f3ff.png b/static/images/composer-emoji/twitter/1f46e-1f3ff.png
new file mode 100644
index 0000000000..2e01d011ed
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f46e.png b/static/images/composer-emoji/twitter/1f46e.png
new file mode 100644
index 0000000000..52808fc9a4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46e.png differ
diff --git a/static/images/composer-emoji/twitter/1f46f.png b/static/images/composer-emoji/twitter/1f46f.png
new file mode 100644
index 0000000000..26265e36ff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f46f.png differ
diff --git a/static/images/composer-emoji/twitter/1f470-1f3fb.png b/static/images/composer-emoji/twitter/1f470-1f3fb.png
new file mode 100644
index 0000000000..84ee150ae3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f470-1f3fc.png b/static/images/composer-emoji/twitter/1f470-1f3fc.png
new file mode 100644
index 0000000000..723ba003b5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f470-1f3fd.png b/static/images/composer-emoji/twitter/1f470-1f3fd.png
new file mode 100644
index 0000000000..8e7acfcb71
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f470-1f3fe.png b/static/images/composer-emoji/twitter/1f470-1f3fe.png
new file mode 100644
index 0000000000..3d9ce0ac9c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f470-1f3ff.png b/static/images/composer-emoji/twitter/1f470-1f3ff.png
new file mode 100644
index 0000000000..bf08d819d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f470.png b/static/images/composer-emoji/twitter/1f470.png
new file mode 100644
index 0000000000..1966721793
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f470.png differ
diff --git a/static/images/composer-emoji/twitter/1f471-1f3fb.png b/static/images/composer-emoji/twitter/1f471-1f3fb.png
new file mode 100644
index 0000000000..99630c0297
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f471-1f3fc.png b/static/images/composer-emoji/twitter/1f471-1f3fc.png
new file mode 100644
index 0000000000..e4f42c5e84
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f471-1f3fd.png b/static/images/composer-emoji/twitter/1f471-1f3fd.png
new file mode 100644
index 0000000000..8bd1dc6d2b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f471-1f3fe.png b/static/images/composer-emoji/twitter/1f471-1f3fe.png
new file mode 100644
index 0000000000..4a7d58ebf3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f471-1f3ff.png b/static/images/composer-emoji/twitter/1f471-1f3ff.png
new file mode 100644
index 0000000000..0b0b063880
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f471.png b/static/images/composer-emoji/twitter/1f471.png
new file mode 100644
index 0000000000..52939a500f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f471.png differ
diff --git a/static/images/composer-emoji/twitter/1f472-1f3fb.png b/static/images/composer-emoji/twitter/1f472-1f3fb.png
new file mode 100644
index 0000000000..097dee8b7b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f472-1f3fc.png b/static/images/composer-emoji/twitter/1f472-1f3fc.png
new file mode 100644
index 0000000000..5645ef3f02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f472-1f3fd.png b/static/images/composer-emoji/twitter/1f472-1f3fd.png
new file mode 100644
index 0000000000..b01c55b0db
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f472-1f3fe.png b/static/images/composer-emoji/twitter/1f472-1f3fe.png
new file mode 100644
index 0000000000..50f18099a8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f472-1f3ff.png b/static/images/composer-emoji/twitter/1f472-1f3ff.png
new file mode 100644
index 0000000000..f8701111e0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f472.png b/static/images/composer-emoji/twitter/1f472.png
new file mode 100644
index 0000000000..b591ad65ef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f472.png differ
diff --git a/static/images/composer-emoji/twitter/1f473-1f3fb.png b/static/images/composer-emoji/twitter/1f473-1f3fb.png
new file mode 100644
index 0000000000..b3276e7bcf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f473-1f3fc.png b/static/images/composer-emoji/twitter/1f473-1f3fc.png
new file mode 100644
index 0000000000..cfd49bbcd1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f473-1f3fd.png b/static/images/composer-emoji/twitter/1f473-1f3fd.png
new file mode 100644
index 0000000000..de7c9548c1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f473-1f3fe.png b/static/images/composer-emoji/twitter/1f473-1f3fe.png
new file mode 100644
index 0000000000..ccde09d26e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f473-1f3ff.png b/static/images/composer-emoji/twitter/1f473-1f3ff.png
new file mode 100644
index 0000000000..4fbb4fe230
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f473.png b/static/images/composer-emoji/twitter/1f473.png
new file mode 100644
index 0000000000..0f69bbabd0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f473.png differ
diff --git a/static/images/composer-emoji/twitter/1f474-1f3fb.png b/static/images/composer-emoji/twitter/1f474-1f3fb.png
new file mode 100644
index 0000000000..7760a2f6af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f474-1f3fc.png b/static/images/composer-emoji/twitter/1f474-1f3fc.png
new file mode 100644
index 0000000000..59361e6a39
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f474-1f3fd.png b/static/images/composer-emoji/twitter/1f474-1f3fd.png
new file mode 100644
index 0000000000..d4323dced2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f474-1f3fe.png b/static/images/composer-emoji/twitter/1f474-1f3fe.png
new file mode 100644
index 0000000000..a0214584e2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f474-1f3ff.png b/static/images/composer-emoji/twitter/1f474-1f3ff.png
new file mode 100644
index 0000000000..a50e78eb9a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f474.png b/static/images/composer-emoji/twitter/1f474.png
new file mode 100644
index 0000000000..3f2b2fc7ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f474.png differ
diff --git a/static/images/composer-emoji/twitter/1f475-1f3fb.png b/static/images/composer-emoji/twitter/1f475-1f3fb.png
new file mode 100644
index 0000000000..4a6211ee46
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f475-1f3fc.png b/static/images/composer-emoji/twitter/1f475-1f3fc.png
new file mode 100644
index 0000000000..4810940db0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f475-1f3fd.png b/static/images/composer-emoji/twitter/1f475-1f3fd.png
new file mode 100644
index 0000000000..e107b05c59
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f475-1f3fe.png b/static/images/composer-emoji/twitter/1f475-1f3fe.png
new file mode 100644
index 0000000000..52c7763118
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f475-1f3ff.png b/static/images/composer-emoji/twitter/1f475-1f3ff.png
new file mode 100644
index 0000000000..25dcca834b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f475.png b/static/images/composer-emoji/twitter/1f475.png
new file mode 100644
index 0000000000..7ffef93aa3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f475.png differ
diff --git a/static/images/composer-emoji/twitter/1f476-1f3fb.png b/static/images/composer-emoji/twitter/1f476-1f3fb.png
new file mode 100644
index 0000000000..d1aca8c3af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f476-1f3fc.png b/static/images/composer-emoji/twitter/1f476-1f3fc.png
new file mode 100644
index 0000000000..290aead30f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f476-1f3fd.png b/static/images/composer-emoji/twitter/1f476-1f3fd.png
new file mode 100644
index 0000000000..e164edfedd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f476-1f3fe.png b/static/images/composer-emoji/twitter/1f476-1f3fe.png
new file mode 100644
index 0000000000..437551abdc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f476-1f3ff.png b/static/images/composer-emoji/twitter/1f476-1f3ff.png
new file mode 100644
index 0000000000..a8b306ec43
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f476.png b/static/images/composer-emoji/twitter/1f476.png
new file mode 100644
index 0000000000..0b92b234a3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f476.png differ
diff --git a/static/images/composer-emoji/twitter/1f477-1f3fb.png b/static/images/composer-emoji/twitter/1f477-1f3fb.png
new file mode 100644
index 0000000000..e6c90379a0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f477-1f3fc.png b/static/images/composer-emoji/twitter/1f477-1f3fc.png
new file mode 100644
index 0000000000..6c431559ae
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f477-1f3fd.png b/static/images/composer-emoji/twitter/1f477-1f3fd.png
new file mode 100644
index 0000000000..f0d2fccea4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f477-1f3fe.png b/static/images/composer-emoji/twitter/1f477-1f3fe.png
new file mode 100644
index 0000000000..0b65fe686b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f477-1f3ff.png b/static/images/composer-emoji/twitter/1f477-1f3ff.png
new file mode 100644
index 0000000000..bd310df06c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f477.png b/static/images/composer-emoji/twitter/1f477.png
new file mode 100644
index 0000000000..bccb6b0b26
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f477.png differ
diff --git a/static/images/composer-emoji/twitter/1f478-1f3fb.png b/static/images/composer-emoji/twitter/1f478-1f3fb.png
new file mode 100644
index 0000000000..41be4f0e9a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f478-1f3fc.png b/static/images/composer-emoji/twitter/1f478-1f3fc.png
new file mode 100644
index 0000000000..88055b09a4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f478-1f3fd.png b/static/images/composer-emoji/twitter/1f478-1f3fd.png
new file mode 100644
index 0000000000..c913da1d5f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f478-1f3fe.png b/static/images/composer-emoji/twitter/1f478-1f3fe.png
new file mode 100644
index 0000000000..188a05bc6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f478-1f3ff.png b/static/images/composer-emoji/twitter/1f478-1f3ff.png
new file mode 100644
index 0000000000..42dde66b9b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f478.png b/static/images/composer-emoji/twitter/1f478.png
new file mode 100644
index 0000000000..5335769673
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f478.png differ
diff --git a/static/images/composer-emoji/twitter/1f479.png b/static/images/composer-emoji/twitter/1f479.png
new file mode 100644
index 0000000000..0449120a4f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f479.png differ
diff --git a/static/images/composer-emoji/twitter/1f47a.png b/static/images/composer-emoji/twitter/1f47a.png
new file mode 100644
index 0000000000..f7617e192a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47a.png differ
diff --git a/static/images/composer-emoji/twitter/1f47b.png b/static/images/composer-emoji/twitter/1f47b.png
new file mode 100644
index 0000000000..004ab37e2f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47b.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c-1f3fb.png b/static/images/composer-emoji/twitter/1f47c-1f3fb.png
new file mode 100644
index 0000000000..15b2349a30
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c-1f3fc.png b/static/images/composer-emoji/twitter/1f47c-1f3fc.png
new file mode 100644
index 0000000000..a14a8ef64e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c-1f3fd.png b/static/images/composer-emoji/twitter/1f47c-1f3fd.png
new file mode 100644
index 0000000000..70f30d1ecf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c-1f3fe.png b/static/images/composer-emoji/twitter/1f47c-1f3fe.png
new file mode 100644
index 0000000000..07ce741a79
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c-1f3ff.png b/static/images/composer-emoji/twitter/1f47c-1f3ff.png
new file mode 100644
index 0000000000..c0ad3c0c84
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f47c.png b/static/images/composer-emoji/twitter/1f47c.png
new file mode 100644
index 0000000000..a2bc4494b2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47c.png differ
diff --git a/static/images/composer-emoji/twitter/1f47d.png b/static/images/composer-emoji/twitter/1f47d.png
new file mode 100644
index 0000000000..9e9f2fcc0a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47d.png differ
diff --git a/static/images/composer-emoji/twitter/1f47e.png b/static/images/composer-emoji/twitter/1f47e.png
new file mode 100644
index 0000000000..312718dea6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47e.png differ
diff --git a/static/images/composer-emoji/twitter/1f47f.png b/static/images/composer-emoji/twitter/1f47f.png
new file mode 100644
index 0000000000..4768b04514
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f47f.png differ
diff --git a/static/images/composer-emoji/twitter/1f480.png b/static/images/composer-emoji/twitter/1f480.png
new file mode 100644
index 0000000000..44ffa18501
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f480.png differ
diff --git a/static/images/composer-emoji/twitter/1f481-1f3fb.png b/static/images/composer-emoji/twitter/1f481-1f3fb.png
new file mode 100644
index 0000000000..2cadb9d8d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f481-1f3fc.png b/static/images/composer-emoji/twitter/1f481-1f3fc.png
new file mode 100644
index 0000000000..f79058bc64
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f481-1f3fd.png b/static/images/composer-emoji/twitter/1f481-1f3fd.png
new file mode 100644
index 0000000000..49baeaf652
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f481-1f3fe.png b/static/images/composer-emoji/twitter/1f481-1f3fe.png
new file mode 100644
index 0000000000..3de3f93ba2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f481-1f3ff.png b/static/images/composer-emoji/twitter/1f481-1f3ff.png
new file mode 100644
index 0000000000..160ce303ef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f481.png b/static/images/composer-emoji/twitter/1f481.png
new file mode 100644
index 0000000000..156b250d0c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f481.png differ
diff --git a/static/images/composer-emoji/twitter/1f482-1f3fb.png b/static/images/composer-emoji/twitter/1f482-1f3fb.png
new file mode 100644
index 0000000000..411920fe1a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f482-1f3fc.png b/static/images/composer-emoji/twitter/1f482-1f3fc.png
new file mode 100644
index 0000000000..d941ecb278
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f482-1f3fd.png b/static/images/composer-emoji/twitter/1f482-1f3fd.png
new file mode 100644
index 0000000000..c0189f00ed
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f482-1f3fe.png b/static/images/composer-emoji/twitter/1f482-1f3fe.png
new file mode 100644
index 0000000000..c46fd59482
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f482-1f3ff.png b/static/images/composer-emoji/twitter/1f482-1f3ff.png
new file mode 100644
index 0000000000..9c0ed80418
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f482.png b/static/images/composer-emoji/twitter/1f482.png
new file mode 100644
index 0000000000..eb4e211a81
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f482.png differ
diff --git a/static/images/composer-emoji/twitter/1f483-1f3fb.png b/static/images/composer-emoji/twitter/1f483-1f3fb.png
new file mode 100644
index 0000000000..92c00ac13c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f483-1f3fc.png b/static/images/composer-emoji/twitter/1f483-1f3fc.png
new file mode 100644
index 0000000000..35ede92537
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f483-1f3fd.png b/static/images/composer-emoji/twitter/1f483-1f3fd.png
new file mode 100644
index 0000000000..0c13695054
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f483-1f3fe.png b/static/images/composer-emoji/twitter/1f483-1f3fe.png
new file mode 100644
index 0000000000..fa97ed3593
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f483-1f3ff.png b/static/images/composer-emoji/twitter/1f483-1f3ff.png
new file mode 100644
index 0000000000..b7b89ed64b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f483.png b/static/images/composer-emoji/twitter/1f483.png
new file mode 100644
index 0000000000..46b3052cd8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f483.png differ
diff --git a/static/images/composer-emoji/twitter/1f484.png b/static/images/composer-emoji/twitter/1f484.png
new file mode 100644
index 0000000000..3334cdc20e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f484.png differ
diff --git a/static/images/composer-emoji/twitter/1f485-1f3fb.png b/static/images/composer-emoji/twitter/1f485-1f3fb.png
new file mode 100644
index 0000000000..e4e790b041
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f485-1f3fc.png b/static/images/composer-emoji/twitter/1f485-1f3fc.png
new file mode 100644
index 0000000000..8e12f45a64
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f485-1f3fd.png b/static/images/composer-emoji/twitter/1f485-1f3fd.png
new file mode 100644
index 0000000000..0e8d3d99ad
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f485-1f3fe.png b/static/images/composer-emoji/twitter/1f485-1f3fe.png
new file mode 100644
index 0000000000..9b06eeeee1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f485-1f3ff.png b/static/images/composer-emoji/twitter/1f485-1f3ff.png
new file mode 100644
index 0000000000..af8c244fc0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f485.png b/static/images/composer-emoji/twitter/1f485.png
new file mode 100644
index 0000000000..b618e12d38
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f485.png differ
diff --git a/static/images/composer-emoji/twitter/1f486-1f3fb.png b/static/images/composer-emoji/twitter/1f486-1f3fb.png
new file mode 100644
index 0000000000..adfe316c2a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f486-1f3fc.png b/static/images/composer-emoji/twitter/1f486-1f3fc.png
new file mode 100644
index 0000000000..307fd79f31
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f486-1f3fd.png b/static/images/composer-emoji/twitter/1f486-1f3fd.png
new file mode 100644
index 0000000000..13a0afa4da
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f486-1f3fe.png b/static/images/composer-emoji/twitter/1f486-1f3fe.png
new file mode 100644
index 0000000000..323a758940
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f486-1f3ff.png b/static/images/composer-emoji/twitter/1f486-1f3ff.png
new file mode 100644
index 0000000000..9bde2ddd5c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f486.png b/static/images/composer-emoji/twitter/1f486.png
new file mode 100644
index 0000000000..e8efc3aa9a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f486.png differ
diff --git a/static/images/composer-emoji/twitter/1f487-1f3fb.png b/static/images/composer-emoji/twitter/1f487-1f3fb.png
new file mode 100644
index 0000000000..34bf48bc05
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f487-1f3fc.png b/static/images/composer-emoji/twitter/1f487-1f3fc.png
new file mode 100644
index 0000000000..8b18f0efc0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f487-1f3fd.png b/static/images/composer-emoji/twitter/1f487-1f3fd.png
new file mode 100644
index 0000000000..098ed179bb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f487-1f3fe.png b/static/images/composer-emoji/twitter/1f487-1f3fe.png
new file mode 100644
index 0000000000..d0da84c5e3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f487-1f3ff.png b/static/images/composer-emoji/twitter/1f487-1f3ff.png
new file mode 100644
index 0000000000..4931c5f206
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f487.png b/static/images/composer-emoji/twitter/1f487.png
new file mode 100644
index 0000000000..a293b76695
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f487.png differ
diff --git a/static/images/composer-emoji/twitter/1f488.png b/static/images/composer-emoji/twitter/1f488.png
new file mode 100644
index 0000000000..725e3b76f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f488.png differ
diff --git a/static/images/composer-emoji/twitter/1f489.png b/static/images/composer-emoji/twitter/1f489.png
new file mode 100644
index 0000000000..a3af04a74b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f489.png differ
diff --git a/static/images/composer-emoji/twitter/1f48a.png b/static/images/composer-emoji/twitter/1f48a.png
new file mode 100644
index 0000000000..88e22c34a7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48a.png differ
diff --git a/static/images/composer-emoji/twitter/1f48b.png b/static/images/composer-emoji/twitter/1f48b.png
new file mode 100644
index 0000000000..751e0c5334
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48b.png differ
diff --git a/static/images/composer-emoji/twitter/1f48c.png b/static/images/composer-emoji/twitter/1f48c.png
new file mode 100644
index 0000000000..18da02621b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48c.png differ
diff --git a/static/images/composer-emoji/twitter/1f48d.png b/static/images/composer-emoji/twitter/1f48d.png
new file mode 100644
index 0000000000..47183dc1fa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48d.png differ
diff --git a/static/images/composer-emoji/twitter/1f48e.png b/static/images/composer-emoji/twitter/1f48e.png
new file mode 100644
index 0000000000..4fd6069ab2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48e.png differ
diff --git a/static/images/composer-emoji/twitter/1f48f.png b/static/images/composer-emoji/twitter/1f48f.png
new file mode 100644
index 0000000000..97b41d4c45
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f48f.png differ
diff --git a/static/images/composer-emoji/twitter/1f490.png b/static/images/composer-emoji/twitter/1f490.png
new file mode 100644
index 0000000000..345d1fb36c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f490.png differ
diff --git a/static/images/composer-emoji/twitter/1f491.png b/static/images/composer-emoji/twitter/1f491.png
new file mode 100644
index 0000000000..d000c5b5f7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f491.png differ
diff --git a/static/images/composer-emoji/twitter/1f492.png b/static/images/composer-emoji/twitter/1f492.png
new file mode 100644
index 0000000000..d1671b8b36
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f492.png differ
diff --git a/static/images/composer-emoji/twitter/1f493.png b/static/images/composer-emoji/twitter/1f493.png
new file mode 100644
index 0000000000..7d89e616f3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f493.png differ
diff --git a/static/images/composer-emoji/twitter/1f494.png b/static/images/composer-emoji/twitter/1f494.png
new file mode 100644
index 0000000000..9ecdc095b3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f494.png differ
diff --git a/static/images/composer-emoji/twitter/1f495.png b/static/images/composer-emoji/twitter/1f495.png
new file mode 100644
index 0000000000..fc9f7438cc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f495.png differ
diff --git a/static/images/composer-emoji/twitter/1f496.png b/static/images/composer-emoji/twitter/1f496.png
new file mode 100644
index 0000000000..de45917595
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f496.png differ
diff --git a/static/images/composer-emoji/twitter/1f497.png b/static/images/composer-emoji/twitter/1f497.png
new file mode 100644
index 0000000000..03821713a5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f497.png differ
diff --git a/static/images/composer-emoji/twitter/1f498.png b/static/images/composer-emoji/twitter/1f498.png
new file mode 100644
index 0000000000..84c36da15b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f498.png differ
diff --git a/static/images/composer-emoji/twitter/1f499.png b/static/images/composer-emoji/twitter/1f499.png
new file mode 100644
index 0000000000..d242a2c0e2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f499.png differ
diff --git a/static/images/composer-emoji/twitter/1f49a.png b/static/images/composer-emoji/twitter/1f49a.png
new file mode 100644
index 0000000000..99b88a614c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49a.png differ
diff --git a/static/images/composer-emoji/twitter/1f49b.png b/static/images/composer-emoji/twitter/1f49b.png
new file mode 100644
index 0000000000..0c2e294fa5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49b.png differ
diff --git a/static/images/composer-emoji/twitter/1f49c.png b/static/images/composer-emoji/twitter/1f49c.png
new file mode 100644
index 0000000000..408f23aa3b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49c.png differ
diff --git a/static/images/composer-emoji/twitter/1f49d.png b/static/images/composer-emoji/twitter/1f49d.png
new file mode 100644
index 0000000000..142648443d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49d.png differ
diff --git a/static/images/composer-emoji/twitter/1f49e.png b/static/images/composer-emoji/twitter/1f49e.png
new file mode 100644
index 0000000000..373fe9cbbc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49e.png differ
diff --git a/static/images/composer-emoji/twitter/1f49f.png b/static/images/composer-emoji/twitter/1f49f.png
new file mode 100644
index 0000000000..209de3a964
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f49f.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a0.png b/static/images/composer-emoji/twitter/1f4a0.png
new file mode 100644
index 0000000000..0bd99fc30d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a1.png b/static/images/composer-emoji/twitter/1f4a1.png
new file mode 100644
index 0000000000..fe0ee6e79e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a2.png b/static/images/composer-emoji/twitter/1f4a2.png
new file mode 100644
index 0000000000..5cd1d23307
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a3.png b/static/images/composer-emoji/twitter/1f4a3.png
new file mode 100644
index 0000000000..1aae57a2a4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a4.png b/static/images/composer-emoji/twitter/1f4a4.png
new file mode 100644
index 0000000000..2e51e995b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a5.png b/static/images/composer-emoji/twitter/1f4a5.png
new file mode 100644
index 0000000000..c97747e939
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a6.png b/static/images/composer-emoji/twitter/1f4a6.png
new file mode 100644
index 0000000000..f1a956b62d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a7.png b/static/images/composer-emoji/twitter/1f4a7.png
new file mode 100644
index 0000000000..ff179abe4c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a8.png b/static/images/composer-emoji/twitter/1f4a8.png
new file mode 100644
index 0000000000..36a7bf40ec
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4a9.png b/static/images/composer-emoji/twitter/1f4a9.png
new file mode 100644
index 0000000000..15e304ffce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4a9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa-1f3fb.png b/static/images/composer-emoji/twitter/1f4aa-1f3fb.png
new file mode 100644
index 0000000000..78c0ee99f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa-1f3fc.png b/static/images/composer-emoji/twitter/1f4aa-1f3fc.png
new file mode 100644
index 0000000000..2114c3edf7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa-1f3fd.png b/static/images/composer-emoji/twitter/1f4aa-1f3fd.png
new file mode 100644
index 0000000000..fa30a9a0e9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa-1f3fe.png b/static/images/composer-emoji/twitter/1f4aa-1f3fe.png
new file mode 100644
index 0000000000..537f2c8296
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa-1f3ff.png b/static/images/composer-emoji/twitter/1f4aa-1f3ff.png
new file mode 100644
index 0000000000..2a1f7e7d99
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f4aa.png b/static/images/composer-emoji/twitter/1f4aa.png
new file mode 100644
index 0000000000..8f5ee1efc7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4aa.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ab.png b/static/images/composer-emoji/twitter/1f4ab.png
new file mode 100644
index 0000000000..d49f57a7af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ab.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ac.png b/static/images/composer-emoji/twitter/1f4ac.png
new file mode 100644
index 0000000000..3c01803b32
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ac.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ad.png b/static/images/composer-emoji/twitter/1f4ad.png
new file mode 100644
index 0000000000..571e678435
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ad.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ae.png b/static/images/composer-emoji/twitter/1f4ae.png
new file mode 100644
index 0000000000..71c62c9a32
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ae.png differ
diff --git a/static/images/composer-emoji/twitter/1f4af.png b/static/images/composer-emoji/twitter/1f4af.png
new file mode 100644
index 0000000000..c3c838d4aa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4af.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b0.png b/static/images/composer-emoji/twitter/1f4b0.png
new file mode 100644
index 0000000000..7778060483
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b1.png b/static/images/composer-emoji/twitter/1f4b1.png
new file mode 100644
index 0000000000..e807ab934f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b2.png b/static/images/composer-emoji/twitter/1f4b2.png
new file mode 100644
index 0000000000..5b0e64a810
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b3.png b/static/images/composer-emoji/twitter/1f4b3.png
new file mode 100644
index 0000000000..3a82e51195
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b4.png b/static/images/composer-emoji/twitter/1f4b4.png
new file mode 100644
index 0000000000..586adff785
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b5.png b/static/images/composer-emoji/twitter/1f4b5.png
new file mode 100644
index 0000000000..353c778383
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b6.png b/static/images/composer-emoji/twitter/1f4b6.png
new file mode 100644
index 0000000000..7817f72f77
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b7.png b/static/images/composer-emoji/twitter/1f4b7.png
new file mode 100644
index 0000000000..606ab11409
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b8.png b/static/images/composer-emoji/twitter/1f4b8.png
new file mode 100644
index 0000000000..e022f79952
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4b9.png b/static/images/composer-emoji/twitter/1f4b9.png
new file mode 100644
index 0000000000..a3ad5250f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4b9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ba.png b/static/images/composer-emoji/twitter/1f4ba.png
new file mode 100644
index 0000000000..4fc098d440
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ba.png differ
diff --git a/static/images/composer-emoji/twitter/1f4bb.png b/static/images/composer-emoji/twitter/1f4bb.png
new file mode 100644
index 0000000000..a75159aeea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4bb.png differ
diff --git a/static/images/composer-emoji/twitter/1f4bc.png b/static/images/composer-emoji/twitter/1f4bc.png
new file mode 100644
index 0000000000..a5f0647414
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4bc.png differ
diff --git a/static/images/composer-emoji/twitter/1f4bd.png b/static/images/composer-emoji/twitter/1f4bd.png
new file mode 100644
index 0000000000..905d2e4d70
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4bd.png differ
diff --git a/static/images/composer-emoji/twitter/1f4be.png b/static/images/composer-emoji/twitter/1f4be.png
new file mode 100644
index 0000000000..aed11c6833
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4be.png differ
diff --git a/static/images/composer-emoji/twitter/1f4bf.png b/static/images/composer-emoji/twitter/1f4bf.png
new file mode 100644
index 0000000000..05baa59a92
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4bf.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c0.png b/static/images/composer-emoji/twitter/1f4c0.png
new file mode 100644
index 0000000000..c4a7b260bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c1.png b/static/images/composer-emoji/twitter/1f4c1.png
new file mode 100644
index 0000000000..027dc6a75b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c2.png b/static/images/composer-emoji/twitter/1f4c2.png
new file mode 100644
index 0000000000..8160ff662d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c3.png b/static/images/composer-emoji/twitter/1f4c3.png
new file mode 100644
index 0000000000..f6a99df938
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c4.png b/static/images/composer-emoji/twitter/1f4c4.png
new file mode 100644
index 0000000000..a06c45458e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c5.png b/static/images/composer-emoji/twitter/1f4c5.png
new file mode 100644
index 0000000000..d68da5fe77
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c6.png b/static/images/composer-emoji/twitter/1f4c6.png
new file mode 100644
index 0000000000..7e0e3daf43
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c7.png b/static/images/composer-emoji/twitter/1f4c7.png
new file mode 100644
index 0000000000..64c0432300
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c8.png b/static/images/composer-emoji/twitter/1f4c8.png
new file mode 100644
index 0000000000..4e8ab5c0ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4c9.png b/static/images/composer-emoji/twitter/1f4c9.png
new file mode 100644
index 0000000000..85caa2d5ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4c9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ca.png b/static/images/composer-emoji/twitter/1f4ca.png
new file mode 100644
index 0000000000..69a3ab32c9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ca.png differ
diff --git a/static/images/composer-emoji/twitter/1f4cb.png b/static/images/composer-emoji/twitter/1f4cb.png
new file mode 100644
index 0000000000..2e8dc0add6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4cb.png differ
diff --git a/static/images/composer-emoji/twitter/1f4cc.png b/static/images/composer-emoji/twitter/1f4cc.png
new file mode 100644
index 0000000000..bce907958a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4cc.png differ
diff --git a/static/images/composer-emoji/twitter/1f4cd.png b/static/images/composer-emoji/twitter/1f4cd.png
new file mode 100644
index 0000000000..201027511b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4cd.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ce.png b/static/images/composer-emoji/twitter/1f4ce.png
new file mode 100644
index 0000000000..7c7422acda
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ce.png differ
diff --git a/static/images/composer-emoji/twitter/1f4cf.png b/static/images/composer-emoji/twitter/1f4cf.png
new file mode 100644
index 0000000000..a2e14a78b7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4cf.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d0.png b/static/images/composer-emoji/twitter/1f4d0.png
new file mode 100644
index 0000000000..9947c9c1b4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d1.png b/static/images/composer-emoji/twitter/1f4d1.png
new file mode 100644
index 0000000000..e6a8eb52b7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d2.png b/static/images/composer-emoji/twitter/1f4d2.png
new file mode 100644
index 0000000000..1db620caf3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d3.png b/static/images/composer-emoji/twitter/1f4d3.png
new file mode 100644
index 0000000000..e62e3dbbe6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d4.png b/static/images/composer-emoji/twitter/1f4d4.png
new file mode 100644
index 0000000000..4b147aba2b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d5.png b/static/images/composer-emoji/twitter/1f4d5.png
new file mode 100644
index 0000000000..69aeded9be
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d6.png b/static/images/composer-emoji/twitter/1f4d6.png
new file mode 100644
index 0000000000..9279597916
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d7.png b/static/images/composer-emoji/twitter/1f4d7.png
new file mode 100644
index 0000000000..5a1921cf65
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d8.png b/static/images/composer-emoji/twitter/1f4d8.png
new file mode 100644
index 0000000000..3a8deee3e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4d9.png b/static/images/composer-emoji/twitter/1f4d9.png
new file mode 100644
index 0000000000..34e689c792
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4d9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4da.png b/static/images/composer-emoji/twitter/1f4da.png
new file mode 100644
index 0000000000..e99c34224b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4da.png differ
diff --git a/static/images/composer-emoji/twitter/1f4db.png b/static/images/composer-emoji/twitter/1f4db.png
new file mode 100644
index 0000000000..588d829f2d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4db.png differ
diff --git a/static/images/composer-emoji/twitter/1f4dc.png b/static/images/composer-emoji/twitter/1f4dc.png
new file mode 100644
index 0000000000..744f6f6100
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4dc.png differ
diff --git a/static/images/composer-emoji/twitter/1f4dd.png b/static/images/composer-emoji/twitter/1f4dd.png
new file mode 100644
index 0000000000..f8719472df
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4dd.png differ
diff --git a/static/images/composer-emoji/twitter/1f4de.png b/static/images/composer-emoji/twitter/1f4de.png
new file mode 100644
index 0000000000..ab7a9c987d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4de.png differ
diff --git a/static/images/composer-emoji/twitter/1f4df.png b/static/images/composer-emoji/twitter/1f4df.png
new file mode 100644
index 0000000000..dacdc22721
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4df.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e0.png b/static/images/composer-emoji/twitter/1f4e0.png
new file mode 100644
index 0000000000..d6b984471d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e1.png b/static/images/composer-emoji/twitter/1f4e1.png
new file mode 100644
index 0000000000..e7700a83aa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e2.png b/static/images/composer-emoji/twitter/1f4e2.png
new file mode 100644
index 0000000000..c9f5cecd3f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e3.png b/static/images/composer-emoji/twitter/1f4e3.png
new file mode 100644
index 0000000000..2e8cb63aca
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e4.png b/static/images/composer-emoji/twitter/1f4e4.png
new file mode 100644
index 0000000000..425013ebf0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e5.png b/static/images/composer-emoji/twitter/1f4e5.png
new file mode 100644
index 0000000000..e79ac84fed
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e6.png b/static/images/composer-emoji/twitter/1f4e6.png
new file mode 100644
index 0000000000..d1ee679486
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e7.png b/static/images/composer-emoji/twitter/1f4e7.png
new file mode 100644
index 0000000000..d630f4f150
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e8.png b/static/images/composer-emoji/twitter/1f4e8.png
new file mode 100644
index 0000000000..8b5b22e23c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4e9.png b/static/images/composer-emoji/twitter/1f4e9.png
new file mode 100644
index 0000000000..3927996bab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ea.png b/static/images/composer-emoji/twitter/1f4ea.png
new file mode 100644
index 0000000000..043d21299e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ea.png differ
diff --git a/static/images/composer-emoji/twitter/1f4eb.png b/static/images/composer-emoji/twitter/1f4eb.png
new file mode 100644
index 0000000000..2e5fc9af31
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ec.png b/static/images/composer-emoji/twitter/1f4ec.png
new file mode 100644
index 0000000000..c3844ff2c6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ed.png b/static/images/composer-emoji/twitter/1f4ed.png
new file mode 100644
index 0000000000..ab4cc4074b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ed.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ee.png b/static/images/composer-emoji/twitter/1f4ee.png
new file mode 100644
index 0000000000..c4795ec310
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ee.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ef.png b/static/images/composer-emoji/twitter/1f4ef.png
new file mode 100644
index 0000000000..a6110aeacf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f0.png b/static/images/composer-emoji/twitter/1f4f0.png
new file mode 100644
index 0000000000..8392decb60
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f1.png b/static/images/composer-emoji/twitter/1f4f1.png
new file mode 100644
index 0000000000..8afd7662d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f1.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f2.png b/static/images/composer-emoji/twitter/1f4f2.png
new file mode 100644
index 0000000000..43edc21bf5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f2.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f3.png b/static/images/composer-emoji/twitter/1f4f3.png
new file mode 100644
index 0000000000..7e961182d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f4.png b/static/images/composer-emoji/twitter/1f4f4.png
new file mode 100644
index 0000000000..95d3fcbec7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f4.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f5.png b/static/images/composer-emoji/twitter/1f4f5.png
new file mode 100644
index 0000000000..df2b71bd90
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f5.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f6.png b/static/images/composer-emoji/twitter/1f4f6.png
new file mode 100644
index 0000000000..e100dd489e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f6.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f7.png b/static/images/composer-emoji/twitter/1f4f7.png
new file mode 100644
index 0000000000..ed77dd1b60
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f7.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f8.png b/static/images/composer-emoji/twitter/1f4f8.png
new file mode 100644
index 0000000000..39270f2c2b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f8.png differ
diff --git a/static/images/composer-emoji/twitter/1f4f9.png b/static/images/composer-emoji/twitter/1f4f9.png
new file mode 100644
index 0000000000..38f25917d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4f9.png differ
diff --git a/static/images/composer-emoji/twitter/1f4fa.png b/static/images/composer-emoji/twitter/1f4fa.png
new file mode 100644
index 0000000000..b71eb2ed78
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f4fb.png b/static/images/composer-emoji/twitter/1f4fb.png
new file mode 100644
index 0000000000..ae21123462
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f4fc.png b/static/images/composer-emoji/twitter/1f4fc.png
new file mode 100644
index 0000000000..3bd2d488d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f4fd.png b/static/images/composer-emoji/twitter/1f4fd.png
new file mode 100644
index 0000000000..a7e2cf860a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f4ff.png b/static/images/composer-emoji/twitter/1f4ff.png
new file mode 100644
index 0000000000..c7f9c88a2a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f4ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f500.png b/static/images/composer-emoji/twitter/1f500.png
new file mode 100644
index 0000000000..f3e46031fe
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f500.png differ
diff --git a/static/images/composer-emoji/twitter/1f501.png b/static/images/composer-emoji/twitter/1f501.png
new file mode 100644
index 0000000000..fee5713997
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f501.png differ
diff --git a/static/images/composer-emoji/twitter/1f502.png b/static/images/composer-emoji/twitter/1f502.png
new file mode 100644
index 0000000000..903cb63d27
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f502.png differ
diff --git a/static/images/composer-emoji/twitter/1f503.png b/static/images/composer-emoji/twitter/1f503.png
new file mode 100644
index 0000000000..374b2cd71f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f503.png differ
diff --git a/static/images/composer-emoji/twitter/1f504.png b/static/images/composer-emoji/twitter/1f504.png
new file mode 100644
index 0000000000..30167cc450
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f504.png differ
diff --git a/static/images/composer-emoji/twitter/1f505.png b/static/images/composer-emoji/twitter/1f505.png
new file mode 100644
index 0000000000..21809cee60
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f505.png differ
diff --git a/static/images/composer-emoji/twitter/1f506.png b/static/images/composer-emoji/twitter/1f506.png
new file mode 100644
index 0000000000..c2653c269f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f506.png differ
diff --git a/static/images/composer-emoji/twitter/1f507.png b/static/images/composer-emoji/twitter/1f507.png
new file mode 100644
index 0000000000..30a3fcf592
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f507.png differ
diff --git a/static/images/composer-emoji/twitter/1f508.png b/static/images/composer-emoji/twitter/1f508.png
new file mode 100644
index 0000000000..92a3335542
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f508.png differ
diff --git a/static/images/composer-emoji/twitter/1f509.png b/static/images/composer-emoji/twitter/1f509.png
new file mode 100644
index 0000000000..f4c335d575
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f509.png differ
diff --git a/static/images/composer-emoji/twitter/1f50a.png b/static/images/composer-emoji/twitter/1f50a.png
new file mode 100644
index 0000000000..aac4353417
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50a.png differ
diff --git a/static/images/composer-emoji/twitter/1f50b.png b/static/images/composer-emoji/twitter/1f50b.png
new file mode 100644
index 0000000000..21e0558b6c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50b.png differ
diff --git a/static/images/composer-emoji/twitter/1f50c.png b/static/images/composer-emoji/twitter/1f50c.png
new file mode 100644
index 0000000000..a3befdf0cc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50c.png differ
diff --git a/static/images/composer-emoji/twitter/1f50d.png b/static/images/composer-emoji/twitter/1f50d.png
new file mode 100644
index 0000000000..d29c195a02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50d.png differ
diff --git a/static/images/composer-emoji/twitter/1f50e.png b/static/images/composer-emoji/twitter/1f50e.png
new file mode 100644
index 0000000000..549981e6fc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50e.png differ
diff --git a/static/images/composer-emoji/twitter/1f50f.png b/static/images/composer-emoji/twitter/1f50f.png
new file mode 100644
index 0000000000..c713f7206e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f50f.png differ
diff --git a/static/images/composer-emoji/twitter/1f510.png b/static/images/composer-emoji/twitter/1f510.png
new file mode 100644
index 0000000000..72c4a82d91
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f510.png differ
diff --git a/static/images/composer-emoji/twitter/1f511.png b/static/images/composer-emoji/twitter/1f511.png
new file mode 100644
index 0000000000..7109ef5220
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f511.png differ
diff --git a/static/images/composer-emoji/twitter/1f512.png b/static/images/composer-emoji/twitter/1f512.png
new file mode 100644
index 0000000000..0879a28636
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f512.png differ
diff --git a/static/images/composer-emoji/twitter/1f513.png b/static/images/composer-emoji/twitter/1f513.png
new file mode 100644
index 0000000000..4357ffaa64
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f513.png differ
diff --git a/static/images/composer-emoji/twitter/1f514.png b/static/images/composer-emoji/twitter/1f514.png
new file mode 100644
index 0000000000..01bafc9d51
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f514.png differ
diff --git a/static/images/composer-emoji/twitter/1f515.png b/static/images/composer-emoji/twitter/1f515.png
new file mode 100644
index 0000000000..f112966a51
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f515.png differ
diff --git a/static/images/composer-emoji/twitter/1f516.png b/static/images/composer-emoji/twitter/1f516.png
new file mode 100644
index 0000000000..c7982aab28
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f516.png differ
diff --git a/static/images/composer-emoji/twitter/1f517.png b/static/images/composer-emoji/twitter/1f517.png
new file mode 100644
index 0000000000..969ec80d3a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f517.png differ
diff --git a/static/images/composer-emoji/twitter/1f518.png b/static/images/composer-emoji/twitter/1f518.png
new file mode 100644
index 0000000000..ccc0eb1879
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f518.png differ
diff --git a/static/images/composer-emoji/twitter/1f519.png b/static/images/composer-emoji/twitter/1f519.png
new file mode 100644
index 0000000000..8ff85a79f5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f519.png differ
diff --git a/static/images/composer-emoji/twitter/1f51a.png b/static/images/composer-emoji/twitter/1f51a.png
new file mode 100644
index 0000000000..8cedd02614
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51a.png differ
diff --git a/static/images/composer-emoji/twitter/1f51b.png b/static/images/composer-emoji/twitter/1f51b.png
new file mode 100644
index 0000000000..4015bbd7ac
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51b.png differ
diff --git a/static/images/composer-emoji/twitter/1f51c.png b/static/images/composer-emoji/twitter/1f51c.png
new file mode 100644
index 0000000000..e166288906
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51c.png differ
diff --git a/static/images/composer-emoji/twitter/1f51d.png b/static/images/composer-emoji/twitter/1f51d.png
new file mode 100644
index 0000000000..65dc1b246d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51d.png differ
diff --git a/static/images/composer-emoji/twitter/1f51e.png b/static/images/composer-emoji/twitter/1f51e.png
new file mode 100644
index 0000000000..ca131b67b6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51e.png differ
diff --git a/static/images/composer-emoji/twitter/1f51f.png b/static/images/composer-emoji/twitter/1f51f.png
new file mode 100644
index 0000000000..ba8ecdeae1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f51f.png differ
diff --git a/static/images/composer-emoji/twitter/1f520.png b/static/images/composer-emoji/twitter/1f520.png
new file mode 100644
index 0000000000..f03052cf6e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f520.png differ
diff --git a/static/images/composer-emoji/twitter/1f521.png b/static/images/composer-emoji/twitter/1f521.png
new file mode 100644
index 0000000000..418583414f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f521.png differ
diff --git a/static/images/composer-emoji/twitter/1f522.png b/static/images/composer-emoji/twitter/1f522.png
new file mode 100644
index 0000000000..f6babf0ce2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f522.png differ
diff --git a/static/images/composer-emoji/twitter/1f523.png b/static/images/composer-emoji/twitter/1f523.png
new file mode 100644
index 0000000000..636a4a1b8d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f523.png differ
diff --git a/static/images/composer-emoji/twitter/1f524.png b/static/images/composer-emoji/twitter/1f524.png
new file mode 100644
index 0000000000..d9b5a9e519
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f524.png differ
diff --git a/static/images/composer-emoji/twitter/1f525.png b/static/images/composer-emoji/twitter/1f525.png
new file mode 100644
index 0000000000..d294e80d6d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f525.png differ
diff --git a/static/images/composer-emoji/twitter/1f526.png b/static/images/composer-emoji/twitter/1f526.png
new file mode 100644
index 0000000000..552925f9ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f526.png differ
diff --git a/static/images/composer-emoji/twitter/1f527.png b/static/images/composer-emoji/twitter/1f527.png
new file mode 100644
index 0000000000..c4544b452f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f527.png differ
diff --git a/static/images/composer-emoji/twitter/1f528.png b/static/images/composer-emoji/twitter/1f528.png
new file mode 100644
index 0000000000..022b9b0020
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f528.png differ
diff --git a/static/images/composer-emoji/twitter/1f529.png b/static/images/composer-emoji/twitter/1f529.png
new file mode 100644
index 0000000000..79fead9cae
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f529.png differ
diff --git a/static/images/composer-emoji/twitter/1f52a.png b/static/images/composer-emoji/twitter/1f52a.png
new file mode 100644
index 0000000000..b185356d46
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52a.png differ
diff --git a/static/images/composer-emoji/twitter/1f52b.png b/static/images/composer-emoji/twitter/1f52b.png
new file mode 100644
index 0000000000..74b46ae4c5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52b.png differ
diff --git a/static/images/composer-emoji/twitter/1f52c.png b/static/images/composer-emoji/twitter/1f52c.png
new file mode 100644
index 0000000000..655242dab6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52c.png differ
diff --git a/static/images/composer-emoji/twitter/1f52d.png b/static/images/composer-emoji/twitter/1f52d.png
new file mode 100644
index 0000000000..501ed13cb1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52d.png differ
diff --git a/static/images/composer-emoji/twitter/1f52e.png b/static/images/composer-emoji/twitter/1f52e.png
new file mode 100644
index 0000000000..b972d2af3f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52e.png differ
diff --git a/static/images/composer-emoji/twitter/1f52f.png b/static/images/composer-emoji/twitter/1f52f.png
new file mode 100644
index 0000000000..b66c851a01
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f52f.png differ
diff --git a/static/images/composer-emoji/twitter/1f530.png b/static/images/composer-emoji/twitter/1f530.png
new file mode 100644
index 0000000000..aac4528295
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f530.png differ
diff --git a/static/images/composer-emoji/twitter/1f531.png b/static/images/composer-emoji/twitter/1f531.png
new file mode 100644
index 0000000000..eab62c6746
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f531.png differ
diff --git a/static/images/composer-emoji/twitter/1f532.png b/static/images/composer-emoji/twitter/1f532.png
new file mode 100644
index 0000000000..942da22457
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f532.png differ
diff --git a/static/images/composer-emoji/twitter/1f533.png b/static/images/composer-emoji/twitter/1f533.png
new file mode 100644
index 0000000000..a3ab70abfc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f533.png differ
diff --git a/static/images/composer-emoji/twitter/1f534.png b/static/images/composer-emoji/twitter/1f534.png
new file mode 100644
index 0000000000..8cec08a5dd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f534.png differ
diff --git a/static/images/composer-emoji/twitter/1f535.png b/static/images/composer-emoji/twitter/1f535.png
new file mode 100644
index 0000000000..4289053ec4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f535.png differ
diff --git a/static/images/composer-emoji/twitter/1f536.png b/static/images/composer-emoji/twitter/1f536.png
new file mode 100644
index 0000000000..67a7f5ad28
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f536.png differ
diff --git a/static/images/composer-emoji/twitter/1f537.png b/static/images/composer-emoji/twitter/1f537.png
new file mode 100644
index 0000000000..4930a087ea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f537.png differ
diff --git a/static/images/composer-emoji/twitter/1f538.png b/static/images/composer-emoji/twitter/1f538.png
new file mode 100644
index 0000000000..64ef318d7a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f538.png differ
diff --git a/static/images/composer-emoji/twitter/1f539.png b/static/images/composer-emoji/twitter/1f539.png
new file mode 100644
index 0000000000..b36946c682
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f539.png differ
diff --git a/static/images/composer-emoji/twitter/1f53a.png b/static/images/composer-emoji/twitter/1f53a.png
new file mode 100644
index 0000000000..91b8d7a1dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f53a.png differ
diff --git a/static/images/composer-emoji/twitter/1f53b.png b/static/images/composer-emoji/twitter/1f53b.png
new file mode 100644
index 0000000000..08cb8a1e3c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f53b.png differ
diff --git a/static/images/composer-emoji/twitter/1f53c.png b/static/images/composer-emoji/twitter/1f53c.png
new file mode 100644
index 0000000000..12adb310b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f53c.png differ
diff --git a/static/images/composer-emoji/twitter/1f53d.png b/static/images/composer-emoji/twitter/1f53d.png
new file mode 100644
index 0000000000..74c7a53aaf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f53d.png differ
diff --git a/static/images/composer-emoji/twitter/1f549.png b/static/images/composer-emoji/twitter/1f549.png
new file mode 100644
index 0000000000..3840f13410
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f549.png differ
diff --git a/static/images/composer-emoji/twitter/1f54a.png b/static/images/composer-emoji/twitter/1f54a.png
new file mode 100644
index 0000000000..3f5ce253d5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f54a.png differ
diff --git a/static/images/composer-emoji/twitter/1f54b.png b/static/images/composer-emoji/twitter/1f54b.png
new file mode 100644
index 0000000000..8f31a739a9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f54b.png differ
diff --git a/static/images/composer-emoji/twitter/1f54c.png b/static/images/composer-emoji/twitter/1f54c.png
new file mode 100644
index 0000000000..7a4a22fa00
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f54c.png differ
diff --git a/static/images/composer-emoji/twitter/1f54d.png b/static/images/composer-emoji/twitter/1f54d.png
new file mode 100644
index 0000000000..95c4c53d58
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f54d.png differ
diff --git a/static/images/composer-emoji/twitter/1f54e.png b/static/images/composer-emoji/twitter/1f54e.png
new file mode 100644
index 0000000000..217cd3bb28
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f54e.png differ
diff --git a/static/images/composer-emoji/twitter/1f550.png b/static/images/composer-emoji/twitter/1f550.png
new file mode 100644
index 0000000000..82feacfd50
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f550.png differ
diff --git a/static/images/composer-emoji/twitter/1f551.png b/static/images/composer-emoji/twitter/1f551.png
new file mode 100644
index 0000000000..4c669fa626
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f551.png differ
diff --git a/static/images/composer-emoji/twitter/1f552.png b/static/images/composer-emoji/twitter/1f552.png
new file mode 100644
index 0000000000..8274c50c21
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f552.png differ
diff --git a/static/images/composer-emoji/twitter/1f553.png b/static/images/composer-emoji/twitter/1f553.png
new file mode 100644
index 0000000000..95035d00f8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f553.png differ
diff --git a/static/images/composer-emoji/twitter/1f554.png b/static/images/composer-emoji/twitter/1f554.png
new file mode 100644
index 0000000000..e79d504c83
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f554.png differ
diff --git a/static/images/composer-emoji/twitter/1f555.png b/static/images/composer-emoji/twitter/1f555.png
new file mode 100644
index 0000000000..2f917dba89
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f555.png differ
diff --git a/static/images/composer-emoji/twitter/1f556.png b/static/images/composer-emoji/twitter/1f556.png
new file mode 100644
index 0000000000..6332787a9f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f556.png differ
diff --git a/static/images/composer-emoji/twitter/1f557.png b/static/images/composer-emoji/twitter/1f557.png
new file mode 100644
index 0000000000..fcf2b55d7a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f557.png differ
diff --git a/static/images/composer-emoji/twitter/1f558.png b/static/images/composer-emoji/twitter/1f558.png
new file mode 100644
index 0000000000..6d2210b4e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f558.png differ
diff --git a/static/images/composer-emoji/twitter/1f559.png b/static/images/composer-emoji/twitter/1f559.png
new file mode 100644
index 0000000000..5e56ccb25d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f559.png differ
diff --git a/static/images/composer-emoji/twitter/1f55a.png b/static/images/composer-emoji/twitter/1f55a.png
new file mode 100644
index 0000000000..2cd9be9ae6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55a.png differ
diff --git a/static/images/composer-emoji/twitter/1f55b.png b/static/images/composer-emoji/twitter/1f55b.png
new file mode 100644
index 0000000000..48b73a1bf0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55b.png differ
diff --git a/static/images/composer-emoji/twitter/1f55c.png b/static/images/composer-emoji/twitter/1f55c.png
new file mode 100644
index 0000000000..72e157113e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55c.png differ
diff --git a/static/images/composer-emoji/twitter/1f55d.png b/static/images/composer-emoji/twitter/1f55d.png
new file mode 100644
index 0000000000..e50a71b1af
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55d.png differ
diff --git a/static/images/composer-emoji/twitter/1f55e.png b/static/images/composer-emoji/twitter/1f55e.png
new file mode 100644
index 0000000000..7af67efe62
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55e.png differ
diff --git a/static/images/composer-emoji/twitter/1f55f.png b/static/images/composer-emoji/twitter/1f55f.png
new file mode 100644
index 0000000000..1bdf6ff186
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f55f.png differ
diff --git a/static/images/composer-emoji/twitter/1f560.png b/static/images/composer-emoji/twitter/1f560.png
new file mode 100644
index 0000000000..0208d382e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f560.png differ
diff --git a/static/images/composer-emoji/twitter/1f561.png b/static/images/composer-emoji/twitter/1f561.png
new file mode 100644
index 0000000000..8819cd74d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f561.png differ
diff --git a/static/images/composer-emoji/twitter/1f562.png b/static/images/composer-emoji/twitter/1f562.png
new file mode 100644
index 0000000000..103c23d106
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f562.png differ
diff --git a/static/images/composer-emoji/twitter/1f563.png b/static/images/composer-emoji/twitter/1f563.png
new file mode 100644
index 0000000000..ce7b16732a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f563.png differ
diff --git a/static/images/composer-emoji/twitter/1f564.png b/static/images/composer-emoji/twitter/1f564.png
new file mode 100644
index 0000000000..7991963277
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f564.png differ
diff --git a/static/images/composer-emoji/twitter/1f565.png b/static/images/composer-emoji/twitter/1f565.png
new file mode 100644
index 0000000000..4617c72ab0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f565.png differ
diff --git a/static/images/composer-emoji/twitter/1f566.png b/static/images/composer-emoji/twitter/1f566.png
new file mode 100644
index 0000000000..394849c4c9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f566.png differ
diff --git a/static/images/composer-emoji/twitter/1f567.png b/static/images/composer-emoji/twitter/1f567.png
new file mode 100644
index 0000000000..4b68c52767
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f567.png differ
diff --git a/static/images/composer-emoji/twitter/1f56f.png b/static/images/composer-emoji/twitter/1f56f.png
new file mode 100644
index 0000000000..9e1c0c9df4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f56f.png differ
diff --git a/static/images/composer-emoji/twitter/1f570.png b/static/images/composer-emoji/twitter/1f570.png
new file mode 100644
index 0000000000..b05d10dd5b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f570.png differ
diff --git a/static/images/composer-emoji/twitter/1f573.png b/static/images/composer-emoji/twitter/1f573.png
new file mode 100644
index 0000000000..67fb61856c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f573.png differ
diff --git a/static/images/composer-emoji/twitter/1f574.png b/static/images/composer-emoji/twitter/1f574.png
new file mode 100644
index 0000000000..9d5d622794
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f574.png differ
diff --git a/static/images/composer-emoji/twitter/1f575.png b/static/images/composer-emoji/twitter/1f575.png
new file mode 100644
index 0000000000..5bd2d76d1e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f575.png differ
diff --git a/static/images/composer-emoji/twitter/1f576.png b/static/images/composer-emoji/twitter/1f576.png
new file mode 100644
index 0000000000..90d431f493
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f576.png differ
diff --git a/static/images/composer-emoji/twitter/1f577.png b/static/images/composer-emoji/twitter/1f577.png
new file mode 100644
index 0000000000..0f33d3c569
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f577.png differ
diff --git a/static/images/composer-emoji/twitter/1f578.png b/static/images/composer-emoji/twitter/1f578.png
new file mode 100644
index 0000000000..70e8a9c589
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f578.png differ
diff --git a/static/images/composer-emoji/twitter/1f579.png b/static/images/composer-emoji/twitter/1f579.png
new file mode 100644
index 0000000000..8238daaf85
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f579.png differ
diff --git a/static/images/composer-emoji/twitter/1f587.png b/static/images/composer-emoji/twitter/1f587.png
new file mode 100644
index 0000000000..ef50af7f94
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f587.png differ
diff --git a/static/images/composer-emoji/twitter/1f58a.png b/static/images/composer-emoji/twitter/1f58a.png
new file mode 100644
index 0000000000..940363fa02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f58a.png differ
diff --git a/static/images/composer-emoji/twitter/1f58b.png b/static/images/composer-emoji/twitter/1f58b.png
new file mode 100644
index 0000000000..8c4bd5ade0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f58b.png differ
diff --git a/static/images/composer-emoji/twitter/1f58c.png b/static/images/composer-emoji/twitter/1f58c.png
new file mode 100644
index 0000000000..b4a1c4db8a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f58c.png differ
diff --git a/static/images/composer-emoji/twitter/1f58d.png b/static/images/composer-emoji/twitter/1f58d.png
new file mode 100644
index 0000000000..4819eabf2c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f58d.png differ
diff --git a/static/images/composer-emoji/twitter/1f590-1f3fb.png b/static/images/composer-emoji/twitter/1f590-1f3fb.png
new file mode 100644
index 0000000000..b7ee406c25
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f590-1f3fc.png b/static/images/composer-emoji/twitter/1f590-1f3fc.png
new file mode 100644
index 0000000000..b9c20339a3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f590-1f3fd.png b/static/images/composer-emoji/twitter/1f590-1f3fd.png
new file mode 100644
index 0000000000..2e2b9465e8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f590-1f3fe.png b/static/images/composer-emoji/twitter/1f590-1f3fe.png
new file mode 100644
index 0000000000..95cc32761c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f590-1f3ff.png b/static/images/composer-emoji/twitter/1f590-1f3ff.png
new file mode 100644
index 0000000000..2fcf5a6288
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f590.png b/static/images/composer-emoji/twitter/1f590.png
new file mode 100644
index 0000000000..267ce84aa8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f590.png differ
diff --git a/static/images/composer-emoji/twitter/1f595-1f3fb.png b/static/images/composer-emoji/twitter/1f595-1f3fb.png
new file mode 100644
index 0000000000..862076d718
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f595-1f3fc.png b/static/images/composer-emoji/twitter/1f595-1f3fc.png
new file mode 100644
index 0000000000..531e9c444c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f595-1f3fd.png b/static/images/composer-emoji/twitter/1f595-1f3fd.png
new file mode 100644
index 0000000000..63f2ab0ee1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f595-1f3fe.png b/static/images/composer-emoji/twitter/1f595-1f3fe.png
new file mode 100644
index 0000000000..014a6f0cc5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f595-1f3ff.png b/static/images/composer-emoji/twitter/1f595-1f3ff.png
new file mode 100644
index 0000000000..7820559125
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f595.png b/static/images/composer-emoji/twitter/1f595.png
new file mode 100644
index 0000000000..f9381febdb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f595.png differ
diff --git a/static/images/composer-emoji/twitter/1f596-1f3fb.png b/static/images/composer-emoji/twitter/1f596-1f3fb.png
new file mode 100644
index 0000000000..6f7f687f81
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f596-1f3fc.png b/static/images/composer-emoji/twitter/1f596-1f3fc.png
new file mode 100644
index 0000000000..9d962c4412
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f596-1f3fd.png b/static/images/composer-emoji/twitter/1f596-1f3fd.png
new file mode 100644
index 0000000000..863ad7b102
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f596-1f3fe.png b/static/images/composer-emoji/twitter/1f596-1f3fe.png
new file mode 100644
index 0000000000..fe4d60d77e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f596-1f3ff.png b/static/images/composer-emoji/twitter/1f596-1f3ff.png
new file mode 100644
index 0000000000..e9d9f24a1b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f596.png b/static/images/composer-emoji/twitter/1f596.png
new file mode 100644
index 0000000000..fcc19cb74c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f596.png differ
diff --git a/static/images/composer-emoji/twitter/1f5a5.png b/static/images/composer-emoji/twitter/1f5a5.png
new file mode 100644
index 0000000000..9b0b0b89c0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5a5.png differ
diff --git a/static/images/composer-emoji/twitter/1f5a8.png b/static/images/composer-emoji/twitter/1f5a8.png
new file mode 100644
index 0000000000..4bc0e0d427
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5a8.png differ
diff --git a/static/images/composer-emoji/twitter/1f5b1.png b/static/images/composer-emoji/twitter/1f5b1.png
new file mode 100644
index 0000000000..4b15ff7449
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5b1.png differ
diff --git a/static/images/composer-emoji/twitter/1f5b2.png b/static/images/composer-emoji/twitter/1f5b2.png
new file mode 100644
index 0000000000..8322f891c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5b2.png differ
diff --git a/static/images/composer-emoji/twitter/1f5bc.png b/static/images/composer-emoji/twitter/1f5bc.png
new file mode 100644
index 0000000000..f4b2b6afd0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5bc.png differ
diff --git a/static/images/composer-emoji/twitter/1f5c2.png b/static/images/composer-emoji/twitter/1f5c2.png
new file mode 100644
index 0000000000..52b804708f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5c2.png differ
diff --git a/static/images/composer-emoji/twitter/1f5c3.png b/static/images/composer-emoji/twitter/1f5c3.png
new file mode 100644
index 0000000000..5a7de48873
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5c3.png differ
diff --git a/static/images/composer-emoji/twitter/1f5c4.png b/static/images/composer-emoji/twitter/1f5c4.png
new file mode 100644
index 0000000000..0a2722f287
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5c4.png differ
diff --git a/static/images/composer-emoji/twitter/1f5d1.png b/static/images/composer-emoji/twitter/1f5d1.png
new file mode 100644
index 0000000000..c7b5c2e7c1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5d1.png differ
diff --git a/static/images/composer-emoji/twitter/1f5d2.png b/static/images/composer-emoji/twitter/1f5d2.png
new file mode 100644
index 0000000000..a6c8ea5002
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5d2.png differ
diff --git a/static/images/composer-emoji/twitter/1f5d3.png b/static/images/composer-emoji/twitter/1f5d3.png
new file mode 100644
index 0000000000..ebc1a15069
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5d3.png differ
diff --git a/static/images/composer-emoji/twitter/1f5dc.png b/static/images/composer-emoji/twitter/1f5dc.png
new file mode 100644
index 0000000000..6826f43f9e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5dc.png differ
diff --git a/static/images/composer-emoji/twitter/1f5dd.png b/static/images/composer-emoji/twitter/1f5dd.png
new file mode 100644
index 0000000000..d600b4768a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5dd.png differ
diff --git a/static/images/composer-emoji/twitter/1f5de.png b/static/images/composer-emoji/twitter/1f5de.png
new file mode 100644
index 0000000000..28f3677697
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5de.png differ
diff --git a/static/images/composer-emoji/twitter/1f5e1.png b/static/images/composer-emoji/twitter/1f5e1.png
new file mode 100644
index 0000000000..f52ff3e466
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5e1.png differ
diff --git a/static/images/composer-emoji/twitter/1f5e3.png b/static/images/composer-emoji/twitter/1f5e3.png
new file mode 100644
index 0000000000..ce761568d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5e3.png differ
diff --git a/static/images/composer-emoji/twitter/1f5e8.png b/static/images/composer-emoji/twitter/1f5e8.png
new file mode 100644
index 0000000000..65c6a90fc6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5e8.png differ
diff --git a/static/images/composer-emoji/twitter/1f5ef.png b/static/images/composer-emoji/twitter/1f5ef.png
new file mode 100644
index 0000000000..91f740a50b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5ef.png differ
diff --git a/static/images/composer-emoji/twitter/1f5f3.png b/static/images/composer-emoji/twitter/1f5f3.png
new file mode 100644
index 0000000000..f588f29f21
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f5fa.png b/static/images/composer-emoji/twitter/1f5fa.png
new file mode 100644
index 0000000000..1f05582fc2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5fa.png differ
diff --git a/static/images/composer-emoji/twitter/1f5fb.png b/static/images/composer-emoji/twitter/1f5fb.png
new file mode 100644
index 0000000000..2f967108ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f5fc.png b/static/images/composer-emoji/twitter/1f5fc.png
new file mode 100644
index 0000000000..26b5ba6898
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f5fd.png b/static/images/composer-emoji/twitter/1f5fd.png
new file mode 100644
index 0000000000..0f09acdbd1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f5fe.png b/static/images/composer-emoji/twitter/1f5fe.png
new file mode 100644
index 0000000000..974ddd1212
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f5ff.png b/static/images/composer-emoji/twitter/1f5ff.png
new file mode 100644
index 0000000000..f6f748b0cc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f5ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f600.png b/static/images/composer-emoji/twitter/1f600.png
new file mode 100644
index 0000000000..211ca4fed5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f600.png differ
diff --git a/static/images/composer-emoji/twitter/1f601.png b/static/images/composer-emoji/twitter/1f601.png
new file mode 100644
index 0000000000..ffcc5a617e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f601.png differ
diff --git a/static/images/composer-emoji/twitter/1f602.png b/static/images/composer-emoji/twitter/1f602.png
new file mode 100644
index 0000000000..9cc212c3fe
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f602.png differ
diff --git a/static/images/composer-emoji/twitter/1f603.png b/static/images/composer-emoji/twitter/1f603.png
new file mode 100644
index 0000000000..e5dd89a007
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f603.png differ
diff --git a/static/images/composer-emoji/twitter/1f604.png b/static/images/composer-emoji/twitter/1f604.png
new file mode 100644
index 0000000000..cb02291567
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f604.png differ
diff --git a/static/images/composer-emoji/twitter/1f605.png b/static/images/composer-emoji/twitter/1f605.png
new file mode 100644
index 0000000000..e3e051b272
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f605.png differ
diff --git a/static/images/composer-emoji/twitter/1f606.png b/static/images/composer-emoji/twitter/1f606.png
new file mode 100644
index 0000000000..f73aa28c5a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f606.png differ
diff --git a/static/images/composer-emoji/twitter/1f607.png b/static/images/composer-emoji/twitter/1f607.png
new file mode 100644
index 0000000000..81029ad677
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f607.png differ
diff --git a/static/images/composer-emoji/twitter/1f608.png b/static/images/composer-emoji/twitter/1f608.png
new file mode 100644
index 0000000000..ab31645cab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f608.png differ
diff --git a/static/images/composer-emoji/twitter/1f609.png b/static/images/composer-emoji/twitter/1f609.png
new file mode 100644
index 0000000000..d2aa925041
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f609.png differ
diff --git a/static/images/composer-emoji/twitter/1f60a.png b/static/images/composer-emoji/twitter/1f60a.png
new file mode 100644
index 0000000000..8151b95855
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60a.png differ
diff --git a/static/images/composer-emoji/twitter/1f60b.png b/static/images/composer-emoji/twitter/1f60b.png
new file mode 100644
index 0000000000..5cec95aebb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60b.png differ
diff --git a/static/images/composer-emoji/twitter/1f60c.png b/static/images/composer-emoji/twitter/1f60c.png
new file mode 100644
index 0000000000..15e1e48e8a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60c.png differ
diff --git a/static/images/composer-emoji/twitter/1f60d.png b/static/images/composer-emoji/twitter/1f60d.png
new file mode 100644
index 0000000000..b863523889
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60d.png differ
diff --git a/static/images/composer-emoji/twitter/1f60e.png b/static/images/composer-emoji/twitter/1f60e.png
new file mode 100644
index 0000000000..333d7e4487
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60e.png differ
diff --git a/static/images/composer-emoji/twitter/1f60f.png b/static/images/composer-emoji/twitter/1f60f.png
new file mode 100644
index 0000000000..372893c633
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f60f.png differ
diff --git a/static/images/composer-emoji/twitter/1f610.png b/static/images/composer-emoji/twitter/1f610.png
new file mode 100644
index 0000000000..59e1212960
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f610.png differ
diff --git a/static/images/composer-emoji/twitter/1f611.png b/static/images/composer-emoji/twitter/1f611.png
new file mode 100644
index 0000000000..625133b6a2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f611.png differ
diff --git a/static/images/composer-emoji/twitter/1f612.png b/static/images/composer-emoji/twitter/1f612.png
new file mode 100644
index 0000000000..c2e61946c0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f612.png differ
diff --git a/static/images/composer-emoji/twitter/1f613.png b/static/images/composer-emoji/twitter/1f613.png
new file mode 100644
index 0000000000..16512bf443
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f613.png differ
diff --git a/static/images/composer-emoji/twitter/1f614.png b/static/images/composer-emoji/twitter/1f614.png
new file mode 100644
index 0000000000..033a854e4f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f614.png differ
diff --git a/static/images/composer-emoji/twitter/1f615.png b/static/images/composer-emoji/twitter/1f615.png
new file mode 100644
index 0000000000..a31c2fde02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f615.png differ
diff --git a/static/images/composer-emoji/twitter/1f616.png b/static/images/composer-emoji/twitter/1f616.png
new file mode 100644
index 0000000000..864e8abce8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f616.png differ
diff --git a/static/images/composer-emoji/twitter/1f617.png b/static/images/composer-emoji/twitter/1f617.png
new file mode 100644
index 0000000000..226394bd53
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f617.png differ
diff --git a/static/images/composer-emoji/twitter/1f618.png b/static/images/composer-emoji/twitter/1f618.png
new file mode 100644
index 0000000000..d4814c397f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f618.png differ
diff --git a/static/images/composer-emoji/twitter/1f619.png b/static/images/composer-emoji/twitter/1f619.png
new file mode 100644
index 0000000000..4e68792f1c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f619.png differ
diff --git a/static/images/composer-emoji/twitter/1f61a.png b/static/images/composer-emoji/twitter/1f61a.png
new file mode 100644
index 0000000000..3156e9c4c5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61a.png differ
diff --git a/static/images/composer-emoji/twitter/1f61b.png b/static/images/composer-emoji/twitter/1f61b.png
new file mode 100644
index 0000000000..dcf6e0495d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61b.png differ
diff --git a/static/images/composer-emoji/twitter/1f61c.png b/static/images/composer-emoji/twitter/1f61c.png
new file mode 100644
index 0000000000..0a71003a2d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61c.png differ
diff --git a/static/images/composer-emoji/twitter/1f61d.png b/static/images/composer-emoji/twitter/1f61d.png
new file mode 100644
index 0000000000..ce61b27b62
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61d.png differ
diff --git a/static/images/composer-emoji/twitter/1f61e.png b/static/images/composer-emoji/twitter/1f61e.png
new file mode 100644
index 0000000000..bd40e9868b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61e.png differ
diff --git a/static/images/composer-emoji/twitter/1f61f.png b/static/images/composer-emoji/twitter/1f61f.png
new file mode 100644
index 0000000000..c7e4dab936
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f61f.png differ
diff --git a/static/images/composer-emoji/twitter/1f620.png b/static/images/composer-emoji/twitter/1f620.png
new file mode 100644
index 0000000000..cc8a144382
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f620.png differ
diff --git a/static/images/composer-emoji/twitter/1f621.png b/static/images/composer-emoji/twitter/1f621.png
new file mode 100644
index 0000000000..5c6ca5d810
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f621.png differ
diff --git a/static/images/composer-emoji/twitter/1f622.png b/static/images/composer-emoji/twitter/1f622.png
new file mode 100644
index 0000000000..65be89048f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f622.png differ
diff --git a/static/images/composer-emoji/twitter/1f623.png b/static/images/composer-emoji/twitter/1f623.png
new file mode 100644
index 0000000000..60bb97865e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f623.png differ
diff --git a/static/images/composer-emoji/twitter/1f624.png b/static/images/composer-emoji/twitter/1f624.png
new file mode 100644
index 0000000000..d4e8b780ab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f624.png differ
diff --git a/static/images/composer-emoji/twitter/1f625.png b/static/images/composer-emoji/twitter/1f625.png
new file mode 100644
index 0000000000..33d9fc9110
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f625.png differ
diff --git a/static/images/composer-emoji/twitter/1f626.png b/static/images/composer-emoji/twitter/1f626.png
new file mode 100644
index 0000000000..4de2e8963b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f626.png differ
diff --git a/static/images/composer-emoji/twitter/1f627.png b/static/images/composer-emoji/twitter/1f627.png
new file mode 100644
index 0000000000..47592dc219
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f627.png differ
diff --git a/static/images/composer-emoji/twitter/1f628.png b/static/images/composer-emoji/twitter/1f628.png
new file mode 100644
index 0000000000..26d0f43291
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f628.png differ
diff --git a/static/images/composer-emoji/twitter/1f629.png b/static/images/composer-emoji/twitter/1f629.png
new file mode 100644
index 0000000000..3b344bae1e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f629.png differ
diff --git a/static/images/composer-emoji/twitter/1f62a.png b/static/images/composer-emoji/twitter/1f62a.png
new file mode 100644
index 0000000000..0aa3c5b542
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62a.png differ
diff --git a/static/images/composer-emoji/twitter/1f62b.png b/static/images/composer-emoji/twitter/1f62b.png
new file mode 100644
index 0000000000..023fdd77b6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62b.png differ
diff --git a/static/images/composer-emoji/twitter/1f62c.png b/static/images/composer-emoji/twitter/1f62c.png
new file mode 100644
index 0000000000..d76d3ed827
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62c.png differ
diff --git a/static/images/composer-emoji/twitter/1f62d.png b/static/images/composer-emoji/twitter/1f62d.png
new file mode 100644
index 0000000000..c59305d66b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62d.png differ
diff --git a/static/images/composer-emoji/twitter/1f62e.png b/static/images/composer-emoji/twitter/1f62e.png
new file mode 100644
index 0000000000..652fd917ac
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62e.png differ
diff --git a/static/images/composer-emoji/twitter/1f62f.png b/static/images/composer-emoji/twitter/1f62f.png
new file mode 100644
index 0000000000..7e20fef56a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f62f.png differ
diff --git a/static/images/composer-emoji/twitter/1f630.png b/static/images/composer-emoji/twitter/1f630.png
new file mode 100644
index 0000000000..a5af317698
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f630.png differ
diff --git a/static/images/composer-emoji/twitter/1f631.png b/static/images/composer-emoji/twitter/1f631.png
new file mode 100644
index 0000000000..2060be2a0f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f631.png differ
diff --git a/static/images/composer-emoji/twitter/1f632.png b/static/images/composer-emoji/twitter/1f632.png
new file mode 100644
index 0000000000..e6d80e95d3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f632.png differ
diff --git a/static/images/composer-emoji/twitter/1f633.png b/static/images/composer-emoji/twitter/1f633.png
new file mode 100644
index 0000000000..49573056dd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f633.png differ
diff --git a/static/images/composer-emoji/twitter/1f634.png b/static/images/composer-emoji/twitter/1f634.png
new file mode 100644
index 0000000000..166c3e1aea
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f634.png differ
diff --git a/static/images/composer-emoji/twitter/1f635.png b/static/images/composer-emoji/twitter/1f635.png
new file mode 100644
index 0000000000..c7b0df7fdb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f635.png differ
diff --git a/static/images/composer-emoji/twitter/1f636.png b/static/images/composer-emoji/twitter/1f636.png
new file mode 100644
index 0000000000..a1109a8c7b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f636.png differ
diff --git a/static/images/composer-emoji/twitter/1f637.png b/static/images/composer-emoji/twitter/1f637.png
new file mode 100644
index 0000000000..27315dcc44
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f637.png differ
diff --git a/static/images/composer-emoji/twitter/1f638.png b/static/images/composer-emoji/twitter/1f638.png
new file mode 100644
index 0000000000..d6a09726a3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f638.png differ
diff --git a/static/images/composer-emoji/twitter/1f639.png b/static/images/composer-emoji/twitter/1f639.png
new file mode 100644
index 0000000000..d2b45de7f9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f639.png differ
diff --git a/static/images/composer-emoji/twitter/1f63a.png b/static/images/composer-emoji/twitter/1f63a.png
new file mode 100644
index 0000000000..20a70078f3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63a.png differ
diff --git a/static/images/composer-emoji/twitter/1f63b.png b/static/images/composer-emoji/twitter/1f63b.png
new file mode 100644
index 0000000000..e107b27738
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63b.png differ
diff --git a/static/images/composer-emoji/twitter/1f63c.png b/static/images/composer-emoji/twitter/1f63c.png
new file mode 100644
index 0000000000..33c4c89a98
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63c.png differ
diff --git a/static/images/composer-emoji/twitter/1f63d.png b/static/images/composer-emoji/twitter/1f63d.png
new file mode 100644
index 0000000000..fa55e2382c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63d.png differ
diff --git a/static/images/composer-emoji/twitter/1f63e.png b/static/images/composer-emoji/twitter/1f63e.png
new file mode 100644
index 0000000000..8fb59105a4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63e.png differ
diff --git a/static/images/composer-emoji/twitter/1f63f.png b/static/images/composer-emoji/twitter/1f63f.png
new file mode 100644
index 0000000000..4148d1b49f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f63f.png differ
diff --git a/static/images/composer-emoji/twitter/1f640.png b/static/images/composer-emoji/twitter/1f640.png
new file mode 100644
index 0000000000..a3482b4724
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f640.png differ
diff --git a/static/images/composer-emoji/twitter/1f641.png b/static/images/composer-emoji/twitter/1f641.png
new file mode 100644
index 0000000000..c86824ff82
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f641.png differ
diff --git a/static/images/composer-emoji/twitter/1f642.png b/static/images/composer-emoji/twitter/1f642.png
new file mode 100644
index 0000000000..4911ab82f0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f642.png differ
diff --git a/static/images/composer-emoji/twitter/1f643.png b/static/images/composer-emoji/twitter/1f643.png
new file mode 100644
index 0000000000..8fa4fab388
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f643.png differ
diff --git a/static/images/composer-emoji/twitter/1f644.png b/static/images/composer-emoji/twitter/1f644.png
new file mode 100644
index 0000000000..719560e12f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f644.png differ
diff --git a/static/images/composer-emoji/twitter/1f645-1f3fb.png b/static/images/composer-emoji/twitter/1f645-1f3fb.png
new file mode 100644
index 0000000000..574c84cd3c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f645-1f3fc.png b/static/images/composer-emoji/twitter/1f645-1f3fc.png
new file mode 100644
index 0000000000..755116c3cc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f645-1f3fd.png b/static/images/composer-emoji/twitter/1f645-1f3fd.png
new file mode 100644
index 0000000000..0d14852f6e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f645-1f3fe.png b/static/images/composer-emoji/twitter/1f645-1f3fe.png
new file mode 100644
index 0000000000..feb4a909e1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f645-1f3ff.png b/static/images/composer-emoji/twitter/1f645-1f3ff.png
new file mode 100644
index 0000000000..769956f495
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f645.png b/static/images/composer-emoji/twitter/1f645.png
new file mode 100644
index 0000000000..6d812a309d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f645.png differ
diff --git a/static/images/composer-emoji/twitter/1f646-1f3fb.png b/static/images/composer-emoji/twitter/1f646-1f3fb.png
new file mode 100644
index 0000000000..c92b6536d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f646-1f3fc.png b/static/images/composer-emoji/twitter/1f646-1f3fc.png
new file mode 100644
index 0000000000..526ee9afc0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f646-1f3fd.png b/static/images/composer-emoji/twitter/1f646-1f3fd.png
new file mode 100644
index 0000000000..8c086ab136
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f646-1f3fe.png b/static/images/composer-emoji/twitter/1f646-1f3fe.png
new file mode 100644
index 0000000000..73e959c02a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f646-1f3ff.png b/static/images/composer-emoji/twitter/1f646-1f3ff.png
new file mode 100644
index 0000000000..13a0617556
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f646.png b/static/images/composer-emoji/twitter/1f646.png
new file mode 100644
index 0000000000..d7e42b34ef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f646.png differ
diff --git a/static/images/composer-emoji/twitter/1f647-1f3fb.png b/static/images/composer-emoji/twitter/1f647-1f3fb.png
new file mode 100644
index 0000000000..af8f5b48e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f647-1f3fc.png b/static/images/composer-emoji/twitter/1f647-1f3fc.png
new file mode 100644
index 0000000000..ff37eff3e6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f647-1f3fd.png b/static/images/composer-emoji/twitter/1f647-1f3fd.png
new file mode 100644
index 0000000000..17be12d2f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f647-1f3fe.png b/static/images/composer-emoji/twitter/1f647-1f3fe.png
new file mode 100644
index 0000000000..cdb692f6c1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f647-1f3ff.png b/static/images/composer-emoji/twitter/1f647-1f3ff.png
new file mode 100644
index 0000000000..1c6c44f3e6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f647.png b/static/images/composer-emoji/twitter/1f647.png
new file mode 100644
index 0000000000..beb24b5b7b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f647.png differ
diff --git a/static/images/composer-emoji/twitter/1f648.png b/static/images/composer-emoji/twitter/1f648.png
new file mode 100644
index 0000000000..f44c4f58aa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f648.png differ
diff --git a/static/images/composer-emoji/twitter/1f649.png b/static/images/composer-emoji/twitter/1f649.png
new file mode 100644
index 0000000000..ac456b320a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f649.png differ
diff --git a/static/images/composer-emoji/twitter/1f64a.png b/static/images/composer-emoji/twitter/1f64a.png
new file mode 100644
index 0000000000..15ec18e861
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64a.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b-1f3fb.png b/static/images/composer-emoji/twitter/1f64b-1f3fb.png
new file mode 100644
index 0000000000..03c205f993
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b-1f3fc.png b/static/images/composer-emoji/twitter/1f64b-1f3fc.png
new file mode 100644
index 0000000000..4989886619
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b-1f3fd.png b/static/images/composer-emoji/twitter/1f64b-1f3fd.png
new file mode 100644
index 0000000000..7092493194
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b-1f3fe.png b/static/images/composer-emoji/twitter/1f64b-1f3fe.png
new file mode 100644
index 0000000000..8db4d471e9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b-1f3ff.png b/static/images/composer-emoji/twitter/1f64b-1f3ff.png
new file mode 100644
index 0000000000..2c72b4720b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f64b.png b/static/images/composer-emoji/twitter/1f64b.png
new file mode 100644
index 0000000000..619128bc89
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64b.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c-1f3fb.png b/static/images/composer-emoji/twitter/1f64c-1f3fb.png
new file mode 100644
index 0000000000..aa949d5e39
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c-1f3fc.png b/static/images/composer-emoji/twitter/1f64c-1f3fc.png
new file mode 100644
index 0000000000..383b86114f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c-1f3fd.png b/static/images/composer-emoji/twitter/1f64c-1f3fd.png
new file mode 100644
index 0000000000..9f3fbcc34f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c-1f3fe.png b/static/images/composer-emoji/twitter/1f64c-1f3fe.png
new file mode 100644
index 0000000000..def23e854f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c-1f3ff.png b/static/images/composer-emoji/twitter/1f64c-1f3ff.png
new file mode 100644
index 0000000000..5052ba001b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f64c.png b/static/images/composer-emoji/twitter/1f64c.png
new file mode 100644
index 0000000000..54aef70699
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64c.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d-1f3fb.png b/static/images/composer-emoji/twitter/1f64d-1f3fb.png
new file mode 100644
index 0000000000..a20a3b5ab8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d-1f3fc.png b/static/images/composer-emoji/twitter/1f64d-1f3fc.png
new file mode 100644
index 0000000000..29a34b0fa8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d-1f3fd.png b/static/images/composer-emoji/twitter/1f64d-1f3fd.png
new file mode 100644
index 0000000000..8ae208717a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d-1f3fe.png b/static/images/composer-emoji/twitter/1f64d-1f3fe.png
new file mode 100644
index 0000000000..708b29d8a8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d-1f3ff.png b/static/images/composer-emoji/twitter/1f64d-1f3ff.png
new file mode 100644
index 0000000000..9bd2307cab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f64d.png b/static/images/composer-emoji/twitter/1f64d.png
new file mode 100644
index 0000000000..8f4104ba10
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64d.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e-1f3fb.png b/static/images/composer-emoji/twitter/1f64e-1f3fb.png
new file mode 100644
index 0000000000..73657ab56c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e-1f3fc.png b/static/images/composer-emoji/twitter/1f64e-1f3fc.png
new file mode 100644
index 0000000000..1fc8d0eaa2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e-1f3fd.png b/static/images/composer-emoji/twitter/1f64e-1f3fd.png
new file mode 100644
index 0000000000..1eb1094b0f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e-1f3fe.png b/static/images/composer-emoji/twitter/1f64e-1f3fe.png
new file mode 100644
index 0000000000..9da420a606
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e-1f3ff.png b/static/images/composer-emoji/twitter/1f64e-1f3ff.png
new file mode 100644
index 0000000000..81a0528331
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f64e.png b/static/images/composer-emoji/twitter/1f64e.png
new file mode 100644
index 0000000000..1b08858c3c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64e.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f-1f3fb.png b/static/images/composer-emoji/twitter/1f64f-1f3fb.png
new file mode 100644
index 0000000000..7f09dd010a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f-1f3fc.png b/static/images/composer-emoji/twitter/1f64f-1f3fc.png
new file mode 100644
index 0000000000..153b72faa4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f-1f3fd.png b/static/images/composer-emoji/twitter/1f64f-1f3fd.png
new file mode 100644
index 0000000000..50b2d37e42
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f-1f3fe.png b/static/images/composer-emoji/twitter/1f64f-1f3fe.png
new file mode 100644
index 0000000000..0a4bf23e26
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f-1f3ff.png b/static/images/composer-emoji/twitter/1f64f-1f3ff.png
new file mode 100644
index 0000000000..12261e2ad2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f64f.png b/static/images/composer-emoji/twitter/1f64f.png
new file mode 100644
index 0000000000..abbf6ff5fb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f64f.png differ
diff --git a/static/images/composer-emoji/twitter/1f680.png b/static/images/composer-emoji/twitter/1f680.png
new file mode 100644
index 0000000000..6fef0ddd07
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f680.png differ
diff --git a/static/images/composer-emoji/twitter/1f681.png b/static/images/composer-emoji/twitter/1f681.png
new file mode 100644
index 0000000000..851b12a910
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f681.png differ
diff --git a/static/images/composer-emoji/twitter/1f682.png b/static/images/composer-emoji/twitter/1f682.png
new file mode 100644
index 0000000000..3842694818
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f682.png differ
diff --git a/static/images/composer-emoji/twitter/1f683.png b/static/images/composer-emoji/twitter/1f683.png
new file mode 100644
index 0000000000..b45cf53e31
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f683.png differ
diff --git a/static/images/composer-emoji/twitter/1f684.png b/static/images/composer-emoji/twitter/1f684.png
new file mode 100644
index 0000000000..bf0096274e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f684.png differ
diff --git a/static/images/composer-emoji/twitter/1f685.png b/static/images/composer-emoji/twitter/1f685.png
new file mode 100644
index 0000000000..288a7537a8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f685.png differ
diff --git a/static/images/composer-emoji/twitter/1f686.png b/static/images/composer-emoji/twitter/1f686.png
new file mode 100644
index 0000000000..a543a7ce00
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f686.png differ
diff --git a/static/images/composer-emoji/twitter/1f687.png b/static/images/composer-emoji/twitter/1f687.png
new file mode 100644
index 0000000000..ab25b66d49
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f687.png differ
diff --git a/static/images/composer-emoji/twitter/1f688.png b/static/images/composer-emoji/twitter/1f688.png
new file mode 100644
index 0000000000..e4ee82038d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f688.png differ
diff --git a/static/images/composer-emoji/twitter/1f689.png b/static/images/composer-emoji/twitter/1f689.png
new file mode 100644
index 0000000000..9fbbc7daa0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f689.png differ
diff --git a/static/images/composer-emoji/twitter/1f68a.png b/static/images/composer-emoji/twitter/1f68a.png
new file mode 100644
index 0000000000..11113eefd7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68a.png differ
diff --git a/static/images/composer-emoji/twitter/1f68b.png b/static/images/composer-emoji/twitter/1f68b.png
new file mode 100644
index 0000000000..d9dd171d9a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68b.png differ
diff --git a/static/images/composer-emoji/twitter/1f68c.png b/static/images/composer-emoji/twitter/1f68c.png
new file mode 100644
index 0000000000..00cf21a27c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68c.png differ
diff --git a/static/images/composer-emoji/twitter/1f68d.png b/static/images/composer-emoji/twitter/1f68d.png
new file mode 100644
index 0000000000..40b9ad3fb9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68d.png differ
diff --git a/static/images/composer-emoji/twitter/1f68e.png b/static/images/composer-emoji/twitter/1f68e.png
new file mode 100644
index 0000000000..c490327422
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68e.png differ
diff --git a/static/images/composer-emoji/twitter/1f68f.png b/static/images/composer-emoji/twitter/1f68f.png
new file mode 100644
index 0000000000..9d35342168
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f68f.png differ
diff --git a/static/images/composer-emoji/twitter/1f690.png b/static/images/composer-emoji/twitter/1f690.png
new file mode 100644
index 0000000000..edbdeac538
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f690.png differ
diff --git a/static/images/composer-emoji/twitter/1f691.png b/static/images/composer-emoji/twitter/1f691.png
new file mode 100644
index 0000000000..33c7eedb86
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f691.png differ
diff --git a/static/images/composer-emoji/twitter/1f692.png b/static/images/composer-emoji/twitter/1f692.png
new file mode 100644
index 0000000000..2f190d4f80
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f692.png differ
diff --git a/static/images/composer-emoji/twitter/1f693.png b/static/images/composer-emoji/twitter/1f693.png
new file mode 100644
index 0000000000..6cc845a60b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f693.png differ
diff --git a/static/images/composer-emoji/twitter/1f694.png b/static/images/composer-emoji/twitter/1f694.png
new file mode 100644
index 0000000000..bfe89fb2d9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f694.png differ
diff --git a/static/images/composer-emoji/twitter/1f695.png b/static/images/composer-emoji/twitter/1f695.png
new file mode 100644
index 0000000000..2b2aa28a8d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f695.png differ
diff --git a/static/images/composer-emoji/twitter/1f696.png b/static/images/composer-emoji/twitter/1f696.png
new file mode 100644
index 0000000000..97f5ddd2fd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f696.png differ
diff --git a/static/images/composer-emoji/twitter/1f697.png b/static/images/composer-emoji/twitter/1f697.png
new file mode 100644
index 0000000000..7b1fd83229
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f697.png differ
diff --git a/static/images/composer-emoji/twitter/1f698.png b/static/images/composer-emoji/twitter/1f698.png
new file mode 100644
index 0000000000..4bcfc4790b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f698.png differ
diff --git a/static/images/composer-emoji/twitter/1f699.png b/static/images/composer-emoji/twitter/1f699.png
new file mode 100644
index 0000000000..77ab905dcc
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f699.png differ
diff --git a/static/images/composer-emoji/twitter/1f69a.png b/static/images/composer-emoji/twitter/1f69a.png
new file mode 100644
index 0000000000..3b7e0ef2e4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69a.png differ
diff --git a/static/images/composer-emoji/twitter/1f69b.png b/static/images/composer-emoji/twitter/1f69b.png
new file mode 100644
index 0000000000..9b591a5c6d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69b.png differ
diff --git a/static/images/composer-emoji/twitter/1f69c.png b/static/images/composer-emoji/twitter/1f69c.png
new file mode 100644
index 0000000000..215c9acb68
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69c.png differ
diff --git a/static/images/composer-emoji/twitter/1f69d.png b/static/images/composer-emoji/twitter/1f69d.png
new file mode 100644
index 0000000000..40a2563c4a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69d.png differ
diff --git a/static/images/composer-emoji/twitter/1f69e.png b/static/images/composer-emoji/twitter/1f69e.png
new file mode 100644
index 0000000000..37278de115
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69e.png differ
diff --git a/static/images/composer-emoji/twitter/1f69f.png b/static/images/composer-emoji/twitter/1f69f.png
new file mode 100644
index 0000000000..2a0e27c4d4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f69f.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a0.png b/static/images/composer-emoji/twitter/1f6a0.png
new file mode 100644
index 0000000000..caeee36200
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a1.png b/static/images/composer-emoji/twitter/1f6a1.png
new file mode 100644
index 0000000000..607b345e6f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a1.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a2.png b/static/images/composer-emoji/twitter/1f6a2.png
new file mode 100644
index 0000000000..81f6c94383
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a2.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3-1f3fb.png b/static/images/composer-emoji/twitter/1f6a3-1f3fb.png
new file mode 100644
index 0000000000..f2891d8b5f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3-1f3fc.png b/static/images/composer-emoji/twitter/1f6a3-1f3fc.png
new file mode 100644
index 0000000000..3e68a0e47f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3-1f3fd.png b/static/images/composer-emoji/twitter/1f6a3-1f3fd.png
new file mode 100644
index 0000000000..84af572d33
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3-1f3fe.png b/static/images/composer-emoji/twitter/1f6a3-1f3fe.png
new file mode 100644
index 0000000000..510e260dd5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3-1f3ff.png b/static/images/composer-emoji/twitter/1f6a3-1f3ff.png
new file mode 100644
index 0000000000..dfc6dceee4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a3.png b/static/images/composer-emoji/twitter/1f6a3.png
new file mode 100644
index 0000000000..2079240ef9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a3.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a4.png b/static/images/composer-emoji/twitter/1f6a4.png
new file mode 100644
index 0000000000..d18b2554a7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a4.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a5.png b/static/images/composer-emoji/twitter/1f6a5.png
new file mode 100644
index 0000000000..d1f7338874
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a5.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a6.png b/static/images/composer-emoji/twitter/1f6a6.png
new file mode 100644
index 0000000000..d6aafb6c72
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a6.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a7.png b/static/images/composer-emoji/twitter/1f6a7.png
new file mode 100644
index 0000000000..d01c1166de
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a7.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a8.png b/static/images/composer-emoji/twitter/1f6a8.png
new file mode 100644
index 0000000000..52ee472760
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a8.png differ
diff --git a/static/images/composer-emoji/twitter/1f6a9.png b/static/images/composer-emoji/twitter/1f6a9.png
new file mode 100644
index 0000000000..3ae1fec7c7
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6a9.png differ
diff --git a/static/images/composer-emoji/twitter/1f6aa.png b/static/images/composer-emoji/twitter/1f6aa.png
new file mode 100644
index 0000000000..a7a4dbcf9c
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6aa.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ab.png b/static/images/composer-emoji/twitter/1f6ab.png
new file mode 100644
index 0000000000..f76a775a03
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ab.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ac.png b/static/images/composer-emoji/twitter/1f6ac.png
new file mode 100644
index 0000000000..85f6c1f754
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ac.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ad.png b/static/images/composer-emoji/twitter/1f6ad.png
new file mode 100644
index 0000000000..7ff4c62031
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ad.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ae.png b/static/images/composer-emoji/twitter/1f6ae.png
new file mode 100644
index 0000000000..6155a7bbe8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ae.png differ
diff --git a/static/images/composer-emoji/twitter/1f6af.png b/static/images/composer-emoji/twitter/1f6af.png
new file mode 100644
index 0000000000..10951212e4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6af.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b0.png b/static/images/composer-emoji/twitter/1f6b0.png
new file mode 100644
index 0000000000..97a1a58b06
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b1.png b/static/images/composer-emoji/twitter/1f6b1.png
new file mode 100644
index 0000000000..c62f7360c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b1.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b2.png b/static/images/composer-emoji/twitter/1f6b2.png
new file mode 100644
index 0000000000..fc406a09ed
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b2.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b3.png b/static/images/composer-emoji/twitter/1f6b3.png
new file mode 100644
index 0000000000..bde656a750
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b3.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4-1f3fb.png b/static/images/composer-emoji/twitter/1f6b4-1f3fb.png
new file mode 100644
index 0000000000..0a5337328d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4-1f3fc.png b/static/images/composer-emoji/twitter/1f6b4-1f3fc.png
new file mode 100644
index 0000000000..e1d64236a0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4-1f3fd.png b/static/images/composer-emoji/twitter/1f6b4-1f3fd.png
new file mode 100644
index 0000000000..5b0270eee1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4-1f3fe.png b/static/images/composer-emoji/twitter/1f6b4-1f3fe.png
new file mode 100644
index 0000000000..82460c235e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4-1f3ff.png b/static/images/composer-emoji/twitter/1f6b4-1f3ff.png
new file mode 100644
index 0000000000..bee0b745b0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b4.png b/static/images/composer-emoji/twitter/1f6b4.png
new file mode 100644
index 0000000000..0ed665951e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b4.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5-1f3fb.png b/static/images/composer-emoji/twitter/1f6b5-1f3fb.png
new file mode 100644
index 0000000000..70b886da02
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5-1f3fc.png b/static/images/composer-emoji/twitter/1f6b5-1f3fc.png
new file mode 100644
index 0000000000..6f6ea59703
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5-1f3fd.png b/static/images/composer-emoji/twitter/1f6b5-1f3fd.png
new file mode 100644
index 0000000000..04b2660eef
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5-1f3fe.png b/static/images/composer-emoji/twitter/1f6b5-1f3fe.png
new file mode 100644
index 0000000000..29b5ff73c9
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5-1f3ff.png b/static/images/composer-emoji/twitter/1f6b5-1f3ff.png
new file mode 100644
index 0000000000..12f03feb4a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b5.png b/static/images/composer-emoji/twitter/1f6b5.png
new file mode 100644
index 0000000000..8a374f6518
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b5.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6-1f3fb.png b/static/images/composer-emoji/twitter/1f6b6-1f3fb.png
new file mode 100644
index 0000000000..2c128ff60b
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6-1f3fc.png b/static/images/composer-emoji/twitter/1f6b6-1f3fc.png
new file mode 100644
index 0000000000..f5f59e3045
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6-1f3fd.png b/static/images/composer-emoji/twitter/1f6b6-1f3fd.png
new file mode 100644
index 0000000000..5c419ed3c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6-1f3fe.png b/static/images/composer-emoji/twitter/1f6b6-1f3fe.png
new file mode 100644
index 0000000000..14d053a0ad
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6-1f3ff.png b/static/images/composer-emoji/twitter/1f6b6-1f3ff.png
new file mode 100644
index 0000000000..b7e242ced1
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b6.png b/static/images/composer-emoji/twitter/1f6b6.png
new file mode 100644
index 0000000000..2194e54851
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b6.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b7.png b/static/images/composer-emoji/twitter/1f6b7.png
new file mode 100644
index 0000000000..d4b28e4775
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b7.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b8.png b/static/images/composer-emoji/twitter/1f6b8.png
new file mode 100644
index 0000000000..6f55f45109
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b8.png differ
diff --git a/static/images/composer-emoji/twitter/1f6b9.png b/static/images/composer-emoji/twitter/1f6b9.png
new file mode 100644
index 0000000000..24be837e0d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6b9.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ba.png b/static/images/composer-emoji/twitter/1f6ba.png
new file mode 100644
index 0000000000..87fd4581eb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ba.png differ
diff --git a/static/images/composer-emoji/twitter/1f6bb.png b/static/images/composer-emoji/twitter/1f6bb.png
new file mode 100644
index 0000000000..49fd7b9511
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6bb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6bc.png b/static/images/composer-emoji/twitter/1f6bc.png
new file mode 100644
index 0000000000..c27a1a2017
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6bc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6bd.png b/static/images/composer-emoji/twitter/1f6bd.png
new file mode 100644
index 0000000000..cfd492a0ae
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6bd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6be.png b/static/images/composer-emoji/twitter/1f6be.png
new file mode 100644
index 0000000000..2d26ca50e4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6be.png differ
diff --git a/static/images/composer-emoji/twitter/1f6bf.png b/static/images/composer-emoji/twitter/1f6bf.png
new file mode 100644
index 0000000000..24febd80b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6bf.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0-1f3fb.png b/static/images/composer-emoji/twitter/1f6c0-1f3fb.png
new file mode 100644
index 0000000000..8518b53617
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0-1f3fc.png b/static/images/composer-emoji/twitter/1f6c0-1f3fc.png
new file mode 100644
index 0000000000..68cdaa5107
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0-1f3fd.png b/static/images/composer-emoji/twitter/1f6c0-1f3fd.png
new file mode 100644
index 0000000000..8715761eb6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0-1f3fe.png b/static/images/composer-emoji/twitter/1f6c0-1f3fe.png
new file mode 100644
index 0000000000..fa32de5bdb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0-1f3ff.png b/static/images/composer-emoji/twitter/1f6c0-1f3ff.png
new file mode 100644
index 0000000000..3a4d72fcaf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c0.png b/static/images/composer-emoji/twitter/1f6c0.png
new file mode 100644
index 0000000000..6b9e74c497
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c1.png b/static/images/composer-emoji/twitter/1f6c1.png
new file mode 100644
index 0000000000..34713c40ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c1.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c2.png b/static/images/composer-emoji/twitter/1f6c2.png
new file mode 100644
index 0000000000..75ab2648ab
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c2.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c3.png b/static/images/composer-emoji/twitter/1f6c3.png
new file mode 100644
index 0000000000..7991a8a954
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c3.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c4.png b/static/images/composer-emoji/twitter/1f6c4.png
new file mode 100644
index 0000000000..b10a884f6d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c4.png differ
diff --git a/static/images/composer-emoji/twitter/1f6c5.png b/static/images/composer-emoji/twitter/1f6c5.png
new file mode 100644
index 0000000000..70f5b107bf
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6c5.png differ
diff --git a/static/images/composer-emoji/twitter/1f6cb.png b/static/images/composer-emoji/twitter/1f6cb.png
new file mode 100644
index 0000000000..e0d5a978f2
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6cb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6cc.png b/static/images/composer-emoji/twitter/1f6cc.png
new file mode 100644
index 0000000000..c6ada6ddb4
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6cc.png differ
diff --git a/static/images/composer-emoji/twitter/1f6cd.png b/static/images/composer-emoji/twitter/1f6cd.png
new file mode 100644
index 0000000000..54445d9f2a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6cd.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ce.png b/static/images/composer-emoji/twitter/1f6ce.png
new file mode 100644
index 0000000000..77a9c83790
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ce.png differ
diff --git a/static/images/composer-emoji/twitter/1f6cf.png b/static/images/composer-emoji/twitter/1f6cf.png
new file mode 100644
index 0000000000..9ea14a47ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6cf.png differ
diff --git a/static/images/composer-emoji/twitter/1f6d0.png b/static/images/composer-emoji/twitter/1f6d0.png
new file mode 100644
index 0000000000..90b4e0f225
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6d0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e0.png b/static/images/composer-emoji/twitter/1f6e0.png
new file mode 100644
index 0000000000..d2136a566e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e1.png b/static/images/composer-emoji/twitter/1f6e1.png
new file mode 100644
index 0000000000..745341958a
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e1.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e2.png b/static/images/composer-emoji/twitter/1f6e2.png
new file mode 100644
index 0000000000..aa0faae004
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e2.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e3.png b/static/images/composer-emoji/twitter/1f6e3.png
new file mode 100644
index 0000000000..297847347d
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e3.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e4.png b/static/images/composer-emoji/twitter/1f6e4.png
new file mode 100644
index 0000000000..9c052f1727
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e4.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e5.png b/static/images/composer-emoji/twitter/1f6e5.png
new file mode 100644
index 0000000000..b8ef086bff
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e5.png differ
diff --git a/static/images/composer-emoji/twitter/1f6e9.png b/static/images/composer-emoji/twitter/1f6e9.png
new file mode 100644
index 0000000000..7f934e9eb0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6e9.png differ
diff --git a/static/images/composer-emoji/twitter/1f6eb.png b/static/images/composer-emoji/twitter/1f6eb.png
new file mode 100644
index 0000000000..5b261a3b14
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6eb.png differ
diff --git a/static/images/composer-emoji/twitter/1f6ec.png b/static/images/composer-emoji/twitter/1f6ec.png
new file mode 100644
index 0000000000..6c91e47a59
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6ec.png differ
diff --git a/static/images/composer-emoji/twitter/1f6f0.png b/static/images/composer-emoji/twitter/1f6f0.png
new file mode 100644
index 0000000000..0803f9f6d6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6f0.png differ
diff --git a/static/images/composer-emoji/twitter/1f6f3.png b/static/images/composer-emoji/twitter/1f6f3.png
new file mode 100644
index 0000000000..204bd8bffd
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f6f3.png differ
diff --git a/static/images/composer-emoji/twitter/1f910.png b/static/images/composer-emoji/twitter/1f910.png
new file mode 100644
index 0000000000..d9e837d657
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f910.png differ
diff --git a/static/images/composer-emoji/twitter/1f911.png b/static/images/composer-emoji/twitter/1f911.png
new file mode 100644
index 0000000000..cb3dc06d61
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f911.png differ
diff --git a/static/images/composer-emoji/twitter/1f912.png b/static/images/composer-emoji/twitter/1f912.png
new file mode 100644
index 0000000000..8b832a9405
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f912.png differ
diff --git a/static/images/composer-emoji/twitter/1f913.png b/static/images/composer-emoji/twitter/1f913.png
new file mode 100644
index 0000000000..e01edea729
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f913.png differ
diff --git a/static/images/composer-emoji/twitter/1f914.png b/static/images/composer-emoji/twitter/1f914.png
new file mode 100644
index 0000000000..4804fae309
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f914.png differ
diff --git a/static/images/composer-emoji/twitter/1f915.png b/static/images/composer-emoji/twitter/1f915.png
new file mode 100644
index 0000000000..cd244d314e
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f915.png differ
diff --git a/static/images/composer-emoji/twitter/1f916.png b/static/images/composer-emoji/twitter/1f916.png
new file mode 100644
index 0000000000..a9f7024253
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f916.png differ
diff --git a/static/images/composer-emoji/twitter/1f917.png b/static/images/composer-emoji/twitter/1f917.png
new file mode 100644
index 0000000000..8f1cce5cfa
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f917.png differ
diff --git a/static/images/composer-emoji/twitter/1f918-1f3fb.png b/static/images/composer-emoji/twitter/1f918-1f3fb.png
new file mode 100644
index 0000000000..e1949ff903
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/1f918-1f3fc.png b/static/images/composer-emoji/twitter/1f918-1f3fc.png
new file mode 100644
index 0000000000..e26c3e7a0f
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/1f918-1f3fd.png b/static/images/composer-emoji/twitter/1f918-1f3fd.png
new file mode 100644
index 0000000000..f931a5b5c0
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/1f918-1f3fe.png b/static/images/composer-emoji/twitter/1f918-1f3fe.png
new file mode 100644
index 0000000000..b74b03e236
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/1f918-1f3ff.png b/static/images/composer-emoji/twitter/1f918-1f3ff.png
new file mode 100644
index 0000000000..c2a0588041
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/1f918.png b/static/images/composer-emoji/twitter/1f918.png
new file mode 100644
index 0000000000..bc15cb5df5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f918.png differ
diff --git a/static/images/composer-emoji/twitter/1f980.png b/static/images/composer-emoji/twitter/1f980.png
new file mode 100644
index 0000000000..628b98b8b5
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f980.png differ
diff --git a/static/images/composer-emoji/twitter/1f981.png b/static/images/composer-emoji/twitter/1f981.png
new file mode 100644
index 0000000000..9ac422eb43
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f981.png differ
diff --git a/static/images/composer-emoji/twitter/1f982.png b/static/images/composer-emoji/twitter/1f982.png
new file mode 100644
index 0000000000..9ebee91f06
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f982.png differ
diff --git a/static/images/composer-emoji/twitter/1f983.png b/static/images/composer-emoji/twitter/1f983.png
new file mode 100644
index 0000000000..c01874cdc6
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f983.png differ
diff --git a/static/images/composer-emoji/twitter/1f984.png b/static/images/composer-emoji/twitter/1f984.png
new file mode 100644
index 0000000000..37326efdbb
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f984.png differ
diff --git a/static/images/composer-emoji/twitter/1f9c0.png b/static/images/composer-emoji/twitter/1f9c0.png
new file mode 100644
index 0000000000..ba7a5b4695
Binary files /dev/null and b/static/images/composer-emoji/twitter/1f9c0.png differ
diff --git a/static/images/composer-emoji/twitter/203c.png b/static/images/composer-emoji/twitter/203c.png
new file mode 100644
index 0000000000..29c226cc55
Binary files /dev/null and b/static/images/composer-emoji/twitter/203c.png differ
diff --git a/static/images/composer-emoji/twitter/2049.png b/static/images/composer-emoji/twitter/2049.png
new file mode 100644
index 0000000000..de334c2301
Binary files /dev/null and b/static/images/composer-emoji/twitter/2049.png differ
diff --git a/static/images/composer-emoji/twitter/2122.png b/static/images/composer-emoji/twitter/2122.png
new file mode 100644
index 0000000000..c19ac0c692
Binary files /dev/null and b/static/images/composer-emoji/twitter/2122.png differ
diff --git a/static/images/composer-emoji/twitter/2139.png b/static/images/composer-emoji/twitter/2139.png
new file mode 100644
index 0000000000..7da5be2d08
Binary files /dev/null and b/static/images/composer-emoji/twitter/2139.png differ
diff --git a/static/images/composer-emoji/twitter/2194.png b/static/images/composer-emoji/twitter/2194.png
new file mode 100644
index 0000000000..7610139565
Binary files /dev/null and b/static/images/composer-emoji/twitter/2194.png differ
diff --git a/static/images/composer-emoji/twitter/2195.png b/static/images/composer-emoji/twitter/2195.png
new file mode 100644
index 0000000000..f97aabcc2b
Binary files /dev/null and b/static/images/composer-emoji/twitter/2195.png differ
diff --git a/static/images/composer-emoji/twitter/2196.png b/static/images/composer-emoji/twitter/2196.png
new file mode 100644
index 0000000000..8ad8d941fd
Binary files /dev/null and b/static/images/composer-emoji/twitter/2196.png differ
diff --git a/static/images/composer-emoji/twitter/2197.png b/static/images/composer-emoji/twitter/2197.png
new file mode 100644
index 0000000000..6fcf915234
Binary files /dev/null and b/static/images/composer-emoji/twitter/2197.png differ
diff --git a/static/images/composer-emoji/twitter/2198.png b/static/images/composer-emoji/twitter/2198.png
new file mode 100644
index 0000000000..ef1503f451
Binary files /dev/null and b/static/images/composer-emoji/twitter/2198.png differ
diff --git a/static/images/composer-emoji/twitter/2199.png b/static/images/composer-emoji/twitter/2199.png
new file mode 100644
index 0000000000..75515e82bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/2199.png differ
diff --git a/static/images/composer-emoji/twitter/21a9.png b/static/images/composer-emoji/twitter/21a9.png
new file mode 100644
index 0000000000..f71a7906f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/21a9.png differ
diff --git a/static/images/composer-emoji/twitter/21aa.png b/static/images/composer-emoji/twitter/21aa.png
new file mode 100644
index 0000000000..11816ee668
Binary files /dev/null and b/static/images/composer-emoji/twitter/21aa.png differ
diff --git a/static/images/composer-emoji/twitter/231a.png b/static/images/composer-emoji/twitter/231a.png
new file mode 100644
index 0000000000..ecd7d2452c
Binary files /dev/null and b/static/images/composer-emoji/twitter/231a.png differ
diff --git a/static/images/composer-emoji/twitter/231b.png b/static/images/composer-emoji/twitter/231b.png
new file mode 100644
index 0000000000..b9c2101ed7
Binary files /dev/null and b/static/images/composer-emoji/twitter/231b.png differ
diff --git a/static/images/composer-emoji/twitter/2328.png b/static/images/composer-emoji/twitter/2328.png
new file mode 100644
index 0000000000..a4d7b93394
Binary files /dev/null and b/static/images/composer-emoji/twitter/2328.png differ
diff --git a/static/images/composer-emoji/twitter/23e9.png b/static/images/composer-emoji/twitter/23e9.png
new file mode 100644
index 0000000000..66aa960996
Binary files /dev/null and b/static/images/composer-emoji/twitter/23e9.png differ
diff --git a/static/images/composer-emoji/twitter/23ea.png b/static/images/composer-emoji/twitter/23ea.png
new file mode 100644
index 0000000000..46ce5bd05c
Binary files /dev/null and b/static/images/composer-emoji/twitter/23ea.png differ
diff --git a/static/images/composer-emoji/twitter/23eb.png b/static/images/composer-emoji/twitter/23eb.png
new file mode 100644
index 0000000000..285583a36c
Binary files /dev/null and b/static/images/composer-emoji/twitter/23eb.png differ
diff --git a/static/images/composer-emoji/twitter/23ec.png b/static/images/composer-emoji/twitter/23ec.png
new file mode 100644
index 0000000000..3c25431a4e
Binary files /dev/null and b/static/images/composer-emoji/twitter/23ec.png differ
diff --git a/static/images/composer-emoji/twitter/23ed.png b/static/images/composer-emoji/twitter/23ed.png
new file mode 100644
index 0000000000..4f8a228eb5
Binary files /dev/null and b/static/images/composer-emoji/twitter/23ed.png differ
diff --git a/static/images/composer-emoji/twitter/23ee.png b/static/images/composer-emoji/twitter/23ee.png
new file mode 100644
index 0000000000..1abf2caf7a
Binary files /dev/null and b/static/images/composer-emoji/twitter/23ee.png differ
diff --git a/static/images/composer-emoji/twitter/23ef.png b/static/images/composer-emoji/twitter/23ef.png
new file mode 100644
index 0000000000..63ebffd0f7
Binary files /dev/null and b/static/images/composer-emoji/twitter/23ef.png differ
diff --git a/static/images/composer-emoji/twitter/23f0.png b/static/images/composer-emoji/twitter/23f0.png
new file mode 100644
index 0000000000..33e641c512
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f0.png differ
diff --git a/static/images/composer-emoji/twitter/23f1.png b/static/images/composer-emoji/twitter/23f1.png
new file mode 100644
index 0000000000..c4b2147f65
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f1.png differ
diff --git a/static/images/composer-emoji/twitter/23f2.png b/static/images/composer-emoji/twitter/23f2.png
new file mode 100644
index 0000000000..c2f8de320c
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f2.png differ
diff --git a/static/images/composer-emoji/twitter/23f3.png b/static/images/composer-emoji/twitter/23f3.png
new file mode 100644
index 0000000000..68ea287d01
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f3.png differ
diff --git a/static/images/composer-emoji/twitter/23f8.png b/static/images/composer-emoji/twitter/23f8.png
new file mode 100644
index 0000000000..c140647682
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f8.png differ
diff --git a/static/images/composer-emoji/twitter/23f9.png b/static/images/composer-emoji/twitter/23f9.png
new file mode 100644
index 0000000000..1b6f19862f
Binary files /dev/null and b/static/images/composer-emoji/twitter/23f9.png differ
diff --git a/static/images/composer-emoji/twitter/23fa.png b/static/images/composer-emoji/twitter/23fa.png
new file mode 100644
index 0000000000..5920593e8a
Binary files /dev/null and b/static/images/composer-emoji/twitter/23fa.png differ
diff --git a/static/images/composer-emoji/twitter/24c2.png b/static/images/composer-emoji/twitter/24c2.png
new file mode 100644
index 0000000000..eeb2c617e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/24c2.png differ
diff --git a/static/images/composer-emoji/twitter/25aa.png b/static/images/composer-emoji/twitter/25aa.png
new file mode 100644
index 0000000000..a92de0b251
Binary files /dev/null and b/static/images/composer-emoji/twitter/25aa.png differ
diff --git a/static/images/composer-emoji/twitter/25ab.png b/static/images/composer-emoji/twitter/25ab.png
new file mode 100644
index 0000000000..2e99b1d689
Binary files /dev/null and b/static/images/composer-emoji/twitter/25ab.png differ
diff --git a/static/images/composer-emoji/twitter/25b6.png b/static/images/composer-emoji/twitter/25b6.png
new file mode 100644
index 0000000000..220efcd0ba
Binary files /dev/null and b/static/images/composer-emoji/twitter/25b6.png differ
diff --git a/static/images/composer-emoji/twitter/25c0.png b/static/images/composer-emoji/twitter/25c0.png
new file mode 100644
index 0000000000..5f8045f2fe
Binary files /dev/null and b/static/images/composer-emoji/twitter/25c0.png differ
diff --git a/static/images/composer-emoji/twitter/25fb.png b/static/images/composer-emoji/twitter/25fb.png
new file mode 100644
index 0000000000..23310c9ee0
Binary files /dev/null and b/static/images/composer-emoji/twitter/25fb.png differ
diff --git a/static/images/composer-emoji/twitter/25fc.png b/static/images/composer-emoji/twitter/25fc.png
new file mode 100644
index 0000000000..cc6e1d72ad
Binary files /dev/null and b/static/images/composer-emoji/twitter/25fc.png differ
diff --git a/static/images/composer-emoji/twitter/25fd.png b/static/images/composer-emoji/twitter/25fd.png
new file mode 100644
index 0000000000..cf50a99a3c
Binary files /dev/null and b/static/images/composer-emoji/twitter/25fd.png differ
diff --git a/static/images/composer-emoji/twitter/25fe.png b/static/images/composer-emoji/twitter/25fe.png
new file mode 100644
index 0000000000..fcc182ecc0
Binary files /dev/null and b/static/images/composer-emoji/twitter/25fe.png differ
diff --git a/static/images/composer-emoji/twitter/2600.png b/static/images/composer-emoji/twitter/2600.png
new file mode 100644
index 0000000000..8312fd13e7
Binary files /dev/null and b/static/images/composer-emoji/twitter/2600.png differ
diff --git a/static/images/composer-emoji/twitter/2601.png b/static/images/composer-emoji/twitter/2601.png
new file mode 100644
index 0000000000..e3d47ffe99
Binary files /dev/null and b/static/images/composer-emoji/twitter/2601.png differ
diff --git a/static/images/composer-emoji/twitter/2602.png b/static/images/composer-emoji/twitter/2602.png
new file mode 100644
index 0000000000..f0973393bd
Binary files /dev/null and b/static/images/composer-emoji/twitter/2602.png differ
diff --git a/static/images/composer-emoji/twitter/2603.png b/static/images/composer-emoji/twitter/2603.png
new file mode 100644
index 0000000000..224d70ec5c
Binary files /dev/null and b/static/images/composer-emoji/twitter/2603.png differ
diff --git a/static/images/composer-emoji/twitter/2604.png b/static/images/composer-emoji/twitter/2604.png
new file mode 100644
index 0000000000..e73ef99e82
Binary files /dev/null and b/static/images/composer-emoji/twitter/2604.png differ
diff --git a/static/images/composer-emoji/twitter/260e.png b/static/images/composer-emoji/twitter/260e.png
new file mode 100644
index 0000000000..7a29eb455b
Binary files /dev/null and b/static/images/composer-emoji/twitter/260e.png differ
diff --git a/static/images/composer-emoji/twitter/2611.png b/static/images/composer-emoji/twitter/2611.png
new file mode 100644
index 0000000000..e53908feed
Binary files /dev/null and b/static/images/composer-emoji/twitter/2611.png differ
diff --git a/static/images/composer-emoji/twitter/2614.png b/static/images/composer-emoji/twitter/2614.png
new file mode 100644
index 0000000000..ba00648270
Binary files /dev/null and b/static/images/composer-emoji/twitter/2614.png differ
diff --git a/static/images/composer-emoji/twitter/2615.png b/static/images/composer-emoji/twitter/2615.png
new file mode 100644
index 0000000000..da337dc63a
Binary files /dev/null and b/static/images/composer-emoji/twitter/2615.png differ
diff --git a/static/images/composer-emoji/twitter/2618.png b/static/images/composer-emoji/twitter/2618.png
new file mode 100644
index 0000000000..12fe2712ce
Binary files /dev/null and b/static/images/composer-emoji/twitter/2618.png differ
diff --git a/static/images/composer-emoji/twitter/261d-1f3fb.png b/static/images/composer-emoji/twitter/261d-1f3fb.png
new file mode 100644
index 0000000000..591b0174f0
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/261d-1f3fc.png b/static/images/composer-emoji/twitter/261d-1f3fc.png
new file mode 100644
index 0000000000..73ef7d17ee
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/261d-1f3fd.png b/static/images/composer-emoji/twitter/261d-1f3fd.png
new file mode 100644
index 0000000000..0bd7c5db5e
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/261d-1f3fe.png b/static/images/composer-emoji/twitter/261d-1f3fe.png
new file mode 100644
index 0000000000..8126ee500e
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/261d-1f3ff.png b/static/images/composer-emoji/twitter/261d-1f3ff.png
new file mode 100644
index 0000000000..8bf58fc00d
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/261d.png b/static/images/composer-emoji/twitter/261d.png
new file mode 100644
index 0000000000..0ceb9c56dc
Binary files /dev/null and b/static/images/composer-emoji/twitter/261d.png differ
diff --git a/static/images/composer-emoji/twitter/2620.png b/static/images/composer-emoji/twitter/2620.png
new file mode 100644
index 0000000000..2da42d86ac
Binary files /dev/null and b/static/images/composer-emoji/twitter/2620.png differ
diff --git a/static/images/composer-emoji/twitter/2622.png b/static/images/composer-emoji/twitter/2622.png
new file mode 100644
index 0000000000..da6d3c81c1
Binary files /dev/null and b/static/images/composer-emoji/twitter/2622.png differ
diff --git a/static/images/composer-emoji/twitter/2623.png b/static/images/composer-emoji/twitter/2623.png
new file mode 100644
index 0000000000..11faaeef4e
Binary files /dev/null and b/static/images/composer-emoji/twitter/2623.png differ
diff --git a/static/images/composer-emoji/twitter/2626.png b/static/images/composer-emoji/twitter/2626.png
new file mode 100644
index 0000000000..b94862cfdd
Binary files /dev/null and b/static/images/composer-emoji/twitter/2626.png differ
diff --git a/static/images/composer-emoji/twitter/262a.png b/static/images/composer-emoji/twitter/262a.png
new file mode 100644
index 0000000000..9b6547d46e
Binary files /dev/null and b/static/images/composer-emoji/twitter/262a.png differ
diff --git a/static/images/composer-emoji/twitter/262e.png b/static/images/composer-emoji/twitter/262e.png
new file mode 100644
index 0000000000..e1f4fa6a20
Binary files /dev/null and b/static/images/composer-emoji/twitter/262e.png differ
diff --git a/static/images/composer-emoji/twitter/262f.png b/static/images/composer-emoji/twitter/262f.png
new file mode 100644
index 0000000000..dc2ddb2448
Binary files /dev/null and b/static/images/composer-emoji/twitter/262f.png differ
diff --git a/static/images/composer-emoji/twitter/2638.png b/static/images/composer-emoji/twitter/2638.png
new file mode 100644
index 0000000000..ce9e64835c
Binary files /dev/null and b/static/images/composer-emoji/twitter/2638.png differ
diff --git a/static/images/composer-emoji/twitter/2639.png b/static/images/composer-emoji/twitter/2639.png
new file mode 100644
index 0000000000..e8d5df8dbd
Binary files /dev/null and b/static/images/composer-emoji/twitter/2639.png differ
diff --git a/static/images/composer-emoji/twitter/263a.png b/static/images/composer-emoji/twitter/263a.png
new file mode 100644
index 0000000000..d085d9a249
Binary files /dev/null and b/static/images/composer-emoji/twitter/263a.png differ
diff --git a/static/images/composer-emoji/twitter/2648.png b/static/images/composer-emoji/twitter/2648.png
new file mode 100644
index 0000000000..36df1c73d2
Binary files /dev/null and b/static/images/composer-emoji/twitter/2648.png differ
diff --git a/static/images/composer-emoji/twitter/2649.png b/static/images/composer-emoji/twitter/2649.png
new file mode 100644
index 0000000000..ddd6f3ff72
Binary files /dev/null and b/static/images/composer-emoji/twitter/2649.png differ
diff --git a/static/images/composer-emoji/twitter/264a.png b/static/images/composer-emoji/twitter/264a.png
new file mode 100644
index 0000000000..f9e88d6851
Binary files /dev/null and b/static/images/composer-emoji/twitter/264a.png differ
diff --git a/static/images/composer-emoji/twitter/264b.png b/static/images/composer-emoji/twitter/264b.png
new file mode 100644
index 0000000000..31adef8215
Binary files /dev/null and b/static/images/composer-emoji/twitter/264b.png differ
diff --git a/static/images/composer-emoji/twitter/264c.png b/static/images/composer-emoji/twitter/264c.png
new file mode 100644
index 0000000000..2f76dcaf5e
Binary files /dev/null and b/static/images/composer-emoji/twitter/264c.png differ
diff --git a/static/images/composer-emoji/twitter/264d.png b/static/images/composer-emoji/twitter/264d.png
new file mode 100644
index 0000000000..53bbd3d3e5
Binary files /dev/null and b/static/images/composer-emoji/twitter/264d.png differ
diff --git a/static/images/composer-emoji/twitter/264e.png b/static/images/composer-emoji/twitter/264e.png
new file mode 100644
index 0000000000..80ea21e19c
Binary files /dev/null and b/static/images/composer-emoji/twitter/264e.png differ
diff --git a/static/images/composer-emoji/twitter/264f.png b/static/images/composer-emoji/twitter/264f.png
new file mode 100644
index 0000000000..1af321785d
Binary files /dev/null and b/static/images/composer-emoji/twitter/264f.png differ
diff --git a/static/images/composer-emoji/twitter/2650.png b/static/images/composer-emoji/twitter/2650.png
new file mode 100644
index 0000000000..7f3fdd4fab
Binary files /dev/null and b/static/images/composer-emoji/twitter/2650.png differ
diff --git a/static/images/composer-emoji/twitter/2651.png b/static/images/composer-emoji/twitter/2651.png
new file mode 100644
index 0000000000..92b99e4af6
Binary files /dev/null and b/static/images/composer-emoji/twitter/2651.png differ
diff --git a/static/images/composer-emoji/twitter/2652.png b/static/images/composer-emoji/twitter/2652.png
new file mode 100644
index 0000000000..5533bcac84
Binary files /dev/null and b/static/images/composer-emoji/twitter/2652.png differ
diff --git a/static/images/composer-emoji/twitter/2653.png b/static/images/composer-emoji/twitter/2653.png
new file mode 100644
index 0000000000..0239c84536
Binary files /dev/null and b/static/images/composer-emoji/twitter/2653.png differ
diff --git a/static/images/composer-emoji/twitter/2660.png b/static/images/composer-emoji/twitter/2660.png
new file mode 100644
index 0000000000..031d444ed1
Binary files /dev/null and b/static/images/composer-emoji/twitter/2660.png differ
diff --git a/static/images/composer-emoji/twitter/2663.png b/static/images/composer-emoji/twitter/2663.png
new file mode 100644
index 0000000000..7c06c9c655
Binary files /dev/null and b/static/images/composer-emoji/twitter/2663.png differ
diff --git a/static/images/composer-emoji/twitter/2665.png b/static/images/composer-emoji/twitter/2665.png
new file mode 100644
index 0000000000..ccc16411fa
Binary files /dev/null and b/static/images/composer-emoji/twitter/2665.png differ
diff --git a/static/images/composer-emoji/twitter/2666.png b/static/images/composer-emoji/twitter/2666.png
new file mode 100644
index 0000000000..e1f6bd09db
Binary files /dev/null and b/static/images/composer-emoji/twitter/2666.png differ
diff --git a/static/images/composer-emoji/twitter/2668.png b/static/images/composer-emoji/twitter/2668.png
new file mode 100644
index 0000000000..e15c66a462
Binary files /dev/null and b/static/images/composer-emoji/twitter/2668.png differ
diff --git a/static/images/composer-emoji/twitter/267b.png b/static/images/composer-emoji/twitter/267b.png
new file mode 100644
index 0000000000..611ef7e294
Binary files /dev/null and b/static/images/composer-emoji/twitter/267b.png differ
diff --git a/static/images/composer-emoji/twitter/267f.png b/static/images/composer-emoji/twitter/267f.png
new file mode 100644
index 0000000000..8cfd0fd4f6
Binary files /dev/null and b/static/images/composer-emoji/twitter/267f.png differ
diff --git a/static/images/composer-emoji/twitter/2692.png b/static/images/composer-emoji/twitter/2692.png
new file mode 100644
index 0000000000..085e3fae27
Binary files /dev/null and b/static/images/composer-emoji/twitter/2692.png differ
diff --git a/static/images/composer-emoji/twitter/2693.png b/static/images/composer-emoji/twitter/2693.png
new file mode 100644
index 0000000000..35b513cd75
Binary files /dev/null and b/static/images/composer-emoji/twitter/2693.png differ
diff --git a/static/images/composer-emoji/twitter/2694.png b/static/images/composer-emoji/twitter/2694.png
new file mode 100644
index 0000000000..03ab20da4d
Binary files /dev/null and b/static/images/composer-emoji/twitter/2694.png differ
diff --git a/static/images/composer-emoji/twitter/2696.png b/static/images/composer-emoji/twitter/2696.png
new file mode 100644
index 0000000000..11e77eea9c
Binary files /dev/null and b/static/images/composer-emoji/twitter/2696.png differ
diff --git a/static/images/composer-emoji/twitter/2697.png b/static/images/composer-emoji/twitter/2697.png
new file mode 100644
index 0000000000..41b2efa21a
Binary files /dev/null and b/static/images/composer-emoji/twitter/2697.png differ
diff --git a/static/images/composer-emoji/twitter/2699.png b/static/images/composer-emoji/twitter/2699.png
new file mode 100644
index 0000000000..e894ae98cb
Binary files /dev/null and b/static/images/composer-emoji/twitter/2699.png differ
diff --git a/static/images/composer-emoji/twitter/269b.png b/static/images/composer-emoji/twitter/269b.png
new file mode 100644
index 0000000000..644fe0a756
Binary files /dev/null and b/static/images/composer-emoji/twitter/269b.png differ
diff --git a/static/images/composer-emoji/twitter/269c.png b/static/images/composer-emoji/twitter/269c.png
new file mode 100644
index 0000000000..344d8a3116
Binary files /dev/null and b/static/images/composer-emoji/twitter/269c.png differ
diff --git a/static/images/composer-emoji/twitter/26a0.png b/static/images/composer-emoji/twitter/26a0.png
new file mode 100644
index 0000000000..b8e83b1744
Binary files /dev/null and b/static/images/composer-emoji/twitter/26a0.png differ
diff --git a/static/images/composer-emoji/twitter/26a1.png b/static/images/composer-emoji/twitter/26a1.png
new file mode 100644
index 0000000000..882e11dd7d
Binary files /dev/null and b/static/images/composer-emoji/twitter/26a1.png differ
diff --git a/static/images/composer-emoji/twitter/26aa.png b/static/images/composer-emoji/twitter/26aa.png
new file mode 100644
index 0000000000..dbc59e1dbb
Binary files /dev/null and b/static/images/composer-emoji/twitter/26aa.png differ
diff --git a/static/images/composer-emoji/twitter/26ab.png b/static/images/composer-emoji/twitter/26ab.png
new file mode 100644
index 0000000000..b17292d15d
Binary files /dev/null and b/static/images/composer-emoji/twitter/26ab.png differ
diff --git a/static/images/composer-emoji/twitter/26b0.png b/static/images/composer-emoji/twitter/26b0.png
new file mode 100644
index 0000000000..bee9a6cda7
Binary files /dev/null and b/static/images/composer-emoji/twitter/26b0.png differ
diff --git a/static/images/composer-emoji/twitter/26b1.png b/static/images/composer-emoji/twitter/26b1.png
new file mode 100644
index 0000000000..d25e99edd2
Binary files /dev/null and b/static/images/composer-emoji/twitter/26b1.png differ
diff --git a/static/images/composer-emoji/twitter/26bd.png b/static/images/composer-emoji/twitter/26bd.png
new file mode 100644
index 0000000000..7e924534eb
Binary files /dev/null and b/static/images/composer-emoji/twitter/26bd.png differ
diff --git a/static/images/composer-emoji/twitter/26be.png b/static/images/composer-emoji/twitter/26be.png
new file mode 100644
index 0000000000..8e144215d6
Binary files /dev/null and b/static/images/composer-emoji/twitter/26be.png differ
diff --git a/static/images/composer-emoji/twitter/26c4.png b/static/images/composer-emoji/twitter/26c4.png
new file mode 100644
index 0000000000..c9461aed84
Binary files /dev/null and b/static/images/composer-emoji/twitter/26c4.png differ
diff --git a/static/images/composer-emoji/twitter/26c5.png b/static/images/composer-emoji/twitter/26c5.png
new file mode 100644
index 0000000000..d1f7537fb8
Binary files /dev/null and b/static/images/composer-emoji/twitter/26c5.png differ
diff --git a/static/images/composer-emoji/twitter/26c8.png b/static/images/composer-emoji/twitter/26c8.png
new file mode 100644
index 0000000000..a747e842d8
Binary files /dev/null and b/static/images/composer-emoji/twitter/26c8.png differ
diff --git a/static/images/composer-emoji/twitter/26ce.png b/static/images/composer-emoji/twitter/26ce.png
new file mode 100644
index 0000000000..de5bd1310f
Binary files /dev/null and b/static/images/composer-emoji/twitter/26ce.png differ
diff --git a/static/images/composer-emoji/twitter/26cf.png b/static/images/composer-emoji/twitter/26cf.png
new file mode 100644
index 0000000000..87fe674eca
Binary files /dev/null and b/static/images/composer-emoji/twitter/26cf.png differ
diff --git a/static/images/composer-emoji/twitter/26d1.png b/static/images/composer-emoji/twitter/26d1.png
new file mode 100644
index 0000000000..8d0d90a7b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/26d1.png differ
diff --git a/static/images/composer-emoji/twitter/26d3.png b/static/images/composer-emoji/twitter/26d3.png
new file mode 100644
index 0000000000..95292fd956
Binary files /dev/null and b/static/images/composer-emoji/twitter/26d3.png differ
diff --git a/static/images/composer-emoji/twitter/26d4.png b/static/images/composer-emoji/twitter/26d4.png
new file mode 100644
index 0000000000..297deba2b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/26d4.png differ
diff --git a/static/images/composer-emoji/twitter/26e9.png b/static/images/composer-emoji/twitter/26e9.png
new file mode 100644
index 0000000000..f93b0863ca
Binary files /dev/null and b/static/images/composer-emoji/twitter/26e9.png differ
diff --git a/static/images/composer-emoji/twitter/26ea.png b/static/images/composer-emoji/twitter/26ea.png
new file mode 100644
index 0000000000..761849a77e
Binary files /dev/null and b/static/images/composer-emoji/twitter/26ea.png differ
diff --git a/static/images/composer-emoji/twitter/26f0.png b/static/images/composer-emoji/twitter/26f0.png
new file mode 100644
index 0000000000..7e8ef034d0
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f0.png differ
diff --git a/static/images/composer-emoji/twitter/26f1.png b/static/images/composer-emoji/twitter/26f1.png
new file mode 100644
index 0000000000..dd3979979e
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f1.png differ
diff --git a/static/images/composer-emoji/twitter/26f2.png b/static/images/composer-emoji/twitter/26f2.png
new file mode 100644
index 0000000000..ab1269ae55
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f2.png differ
diff --git a/static/images/composer-emoji/twitter/26f3.png b/static/images/composer-emoji/twitter/26f3.png
new file mode 100644
index 0000000000..033067414f
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f3.png differ
diff --git a/static/images/composer-emoji/twitter/26f4.png b/static/images/composer-emoji/twitter/26f4.png
new file mode 100644
index 0000000000..9029306224
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f4.png differ
diff --git a/static/images/composer-emoji/twitter/26f5.png b/static/images/composer-emoji/twitter/26f5.png
new file mode 100644
index 0000000000..213cc16886
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f5.png differ
diff --git a/static/images/composer-emoji/twitter/26f7.png b/static/images/composer-emoji/twitter/26f7.png
new file mode 100644
index 0000000000..6550574017
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f7.png differ
diff --git a/static/images/composer-emoji/twitter/26f8.png b/static/images/composer-emoji/twitter/26f8.png
new file mode 100644
index 0000000000..5a920ade9e
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f8.png differ
diff --git a/static/images/composer-emoji/twitter/26f9-1f3fb.png b/static/images/composer-emoji/twitter/26f9-1f3fb.png
new file mode 100644
index 0000000000..63eb22fb06
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/26f9-1f3fc.png b/static/images/composer-emoji/twitter/26f9-1f3fc.png
new file mode 100644
index 0000000000..64fdeb6600
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/26f9-1f3fd.png b/static/images/composer-emoji/twitter/26f9-1f3fd.png
new file mode 100644
index 0000000000..b48357eecc
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/26f9-1f3fe.png b/static/images/composer-emoji/twitter/26f9-1f3fe.png
new file mode 100644
index 0000000000..47e697b435
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/26f9-1f3ff.png b/static/images/composer-emoji/twitter/26f9-1f3ff.png
new file mode 100644
index 0000000000..af12387b9b
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/26f9.png b/static/images/composer-emoji/twitter/26f9.png
new file mode 100644
index 0000000000..0aa646e8b7
Binary files /dev/null and b/static/images/composer-emoji/twitter/26f9.png differ
diff --git a/static/images/composer-emoji/twitter/26fa.png b/static/images/composer-emoji/twitter/26fa.png
new file mode 100644
index 0000000000..7b08a9d7b8
Binary files /dev/null and b/static/images/composer-emoji/twitter/26fa.png differ
diff --git a/static/images/composer-emoji/twitter/26fd.png b/static/images/composer-emoji/twitter/26fd.png
new file mode 100644
index 0000000000..402a43cc60
Binary files /dev/null and b/static/images/composer-emoji/twitter/26fd.png differ
diff --git a/static/images/composer-emoji/twitter/2702.png b/static/images/composer-emoji/twitter/2702.png
new file mode 100644
index 0000000000..f8e3c01272
Binary files /dev/null and b/static/images/composer-emoji/twitter/2702.png differ
diff --git a/static/images/composer-emoji/twitter/2705.png b/static/images/composer-emoji/twitter/2705.png
new file mode 100644
index 0000000000..b33fa73213
Binary files /dev/null and b/static/images/composer-emoji/twitter/2705.png differ
diff --git a/static/images/composer-emoji/twitter/2708.png b/static/images/composer-emoji/twitter/2708.png
new file mode 100644
index 0000000000..aaedbc0a03
Binary files /dev/null and b/static/images/composer-emoji/twitter/2708.png differ
diff --git a/static/images/composer-emoji/twitter/2709.png b/static/images/composer-emoji/twitter/2709.png
new file mode 100644
index 0000000000..e7a1a0cc95
Binary files /dev/null and b/static/images/composer-emoji/twitter/2709.png differ
diff --git a/static/images/composer-emoji/twitter/270a-1f3fb.png b/static/images/composer-emoji/twitter/270a-1f3fb.png
new file mode 100644
index 0000000000..072d9966b3
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/270a-1f3fc.png b/static/images/composer-emoji/twitter/270a-1f3fc.png
new file mode 100644
index 0000000000..c299bf640a
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/270a-1f3fd.png b/static/images/composer-emoji/twitter/270a-1f3fd.png
new file mode 100644
index 0000000000..21ad82ac8b
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/270a-1f3fe.png b/static/images/composer-emoji/twitter/270a-1f3fe.png
new file mode 100644
index 0000000000..17e002612a
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/270a-1f3ff.png b/static/images/composer-emoji/twitter/270a-1f3ff.png
new file mode 100644
index 0000000000..c85db5dbcb
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/270a.png b/static/images/composer-emoji/twitter/270a.png
new file mode 100644
index 0000000000..1375cfab0f
Binary files /dev/null and b/static/images/composer-emoji/twitter/270a.png differ
diff --git a/static/images/composer-emoji/twitter/270b-1f3fb.png b/static/images/composer-emoji/twitter/270b-1f3fb.png
new file mode 100644
index 0000000000..0e945c21c8
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/270b-1f3fc.png b/static/images/composer-emoji/twitter/270b-1f3fc.png
new file mode 100644
index 0000000000..329097baff
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/270b-1f3fd.png b/static/images/composer-emoji/twitter/270b-1f3fd.png
new file mode 100644
index 0000000000..1e3ecb2a59
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/270b-1f3fe.png b/static/images/composer-emoji/twitter/270b-1f3fe.png
new file mode 100644
index 0000000000..9226efc7b1
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/270b-1f3ff.png b/static/images/composer-emoji/twitter/270b-1f3ff.png
new file mode 100644
index 0000000000..12e9ebf8f3
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/270b.png b/static/images/composer-emoji/twitter/270b.png
new file mode 100644
index 0000000000..67348eae5d
Binary files /dev/null and b/static/images/composer-emoji/twitter/270b.png differ
diff --git a/static/images/composer-emoji/twitter/270c-1f3fb.png b/static/images/composer-emoji/twitter/270c-1f3fb.png
new file mode 100644
index 0000000000..38c33b7563
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/270c-1f3fc.png b/static/images/composer-emoji/twitter/270c-1f3fc.png
new file mode 100644
index 0000000000..8b57de0440
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/270c-1f3fd.png b/static/images/composer-emoji/twitter/270c-1f3fd.png
new file mode 100644
index 0000000000..bd6f5ed213
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/270c-1f3fe.png b/static/images/composer-emoji/twitter/270c-1f3fe.png
new file mode 100644
index 0000000000..e19b08395b
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/270c-1f3ff.png b/static/images/composer-emoji/twitter/270c-1f3ff.png
new file mode 100644
index 0000000000..e032dc5dab
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/270c.png b/static/images/composer-emoji/twitter/270c.png
new file mode 100644
index 0000000000..e38cc7baa5
Binary files /dev/null and b/static/images/composer-emoji/twitter/270c.png differ
diff --git a/static/images/composer-emoji/twitter/270d-1f3fb.png b/static/images/composer-emoji/twitter/270d-1f3fb.png
new file mode 100644
index 0000000000..c89f6f740e
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d-1f3fb.png differ
diff --git a/static/images/composer-emoji/twitter/270d-1f3fc.png b/static/images/composer-emoji/twitter/270d-1f3fc.png
new file mode 100644
index 0000000000..6db747a29d
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d-1f3fc.png differ
diff --git a/static/images/composer-emoji/twitter/270d-1f3fd.png b/static/images/composer-emoji/twitter/270d-1f3fd.png
new file mode 100644
index 0000000000..9e8e0ad16c
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d-1f3fd.png differ
diff --git a/static/images/composer-emoji/twitter/270d-1f3fe.png b/static/images/composer-emoji/twitter/270d-1f3fe.png
new file mode 100644
index 0000000000..b0f49ff559
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d-1f3fe.png differ
diff --git a/static/images/composer-emoji/twitter/270d-1f3ff.png b/static/images/composer-emoji/twitter/270d-1f3ff.png
new file mode 100644
index 0000000000..6ff6df1aab
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d-1f3ff.png differ
diff --git a/static/images/composer-emoji/twitter/270d.png b/static/images/composer-emoji/twitter/270d.png
new file mode 100644
index 0000000000..32b908bdbd
Binary files /dev/null and b/static/images/composer-emoji/twitter/270d.png differ
diff --git a/static/images/composer-emoji/twitter/270f.png b/static/images/composer-emoji/twitter/270f.png
new file mode 100644
index 0000000000..6c443a7179
Binary files /dev/null and b/static/images/composer-emoji/twitter/270f.png differ
diff --git a/static/images/composer-emoji/twitter/2712.png b/static/images/composer-emoji/twitter/2712.png
new file mode 100644
index 0000000000..8e1126664e
Binary files /dev/null and b/static/images/composer-emoji/twitter/2712.png differ
diff --git a/static/images/composer-emoji/twitter/2714.png b/static/images/composer-emoji/twitter/2714.png
new file mode 100644
index 0000000000..03b6cf9013
Binary files /dev/null and b/static/images/composer-emoji/twitter/2714.png differ
diff --git a/static/images/composer-emoji/twitter/2716.png b/static/images/composer-emoji/twitter/2716.png
new file mode 100644
index 0000000000..b8df79cab8
Binary files /dev/null and b/static/images/composer-emoji/twitter/2716.png differ
diff --git a/static/images/composer-emoji/twitter/271d.png b/static/images/composer-emoji/twitter/271d.png
new file mode 100644
index 0000000000..9e495f9d4e
Binary files /dev/null and b/static/images/composer-emoji/twitter/271d.png differ
diff --git a/static/images/composer-emoji/twitter/2721.png b/static/images/composer-emoji/twitter/2721.png
new file mode 100644
index 0000000000..95aef56876
Binary files /dev/null and b/static/images/composer-emoji/twitter/2721.png differ
diff --git a/static/images/composer-emoji/twitter/2728.png b/static/images/composer-emoji/twitter/2728.png
new file mode 100644
index 0000000000..f0e95f358a
Binary files /dev/null and b/static/images/composer-emoji/twitter/2728.png differ
diff --git a/static/images/composer-emoji/twitter/2733.png b/static/images/composer-emoji/twitter/2733.png
new file mode 100644
index 0000000000..3fd94315e6
Binary files /dev/null and b/static/images/composer-emoji/twitter/2733.png differ
diff --git a/static/images/composer-emoji/twitter/2734.png b/static/images/composer-emoji/twitter/2734.png
new file mode 100644
index 0000000000..4974ad4075
Binary files /dev/null and b/static/images/composer-emoji/twitter/2734.png differ
diff --git a/static/images/composer-emoji/twitter/2744.png b/static/images/composer-emoji/twitter/2744.png
new file mode 100644
index 0000000000..cb205fa10c
Binary files /dev/null and b/static/images/composer-emoji/twitter/2744.png differ
diff --git a/static/images/composer-emoji/twitter/2747.png b/static/images/composer-emoji/twitter/2747.png
new file mode 100644
index 0000000000..cdfe5a5cd0
Binary files /dev/null and b/static/images/composer-emoji/twitter/2747.png differ
diff --git a/static/images/composer-emoji/twitter/274c.png b/static/images/composer-emoji/twitter/274c.png
new file mode 100644
index 0000000000..4a91a05031
Binary files /dev/null and b/static/images/composer-emoji/twitter/274c.png differ
diff --git a/static/images/composer-emoji/twitter/274e.png b/static/images/composer-emoji/twitter/274e.png
new file mode 100644
index 0000000000..6d3be04833
Binary files /dev/null and b/static/images/composer-emoji/twitter/274e.png differ
diff --git a/static/images/composer-emoji/twitter/2753.png b/static/images/composer-emoji/twitter/2753.png
new file mode 100644
index 0000000000..8f5c824c65
Binary files /dev/null and b/static/images/composer-emoji/twitter/2753.png differ
diff --git a/static/images/composer-emoji/twitter/2754.png b/static/images/composer-emoji/twitter/2754.png
new file mode 100644
index 0000000000..880b617057
Binary files /dev/null and b/static/images/composer-emoji/twitter/2754.png differ
diff --git a/static/images/composer-emoji/twitter/2755.png b/static/images/composer-emoji/twitter/2755.png
new file mode 100644
index 0000000000..88bd6aa88d
Binary files /dev/null and b/static/images/composer-emoji/twitter/2755.png differ
diff --git a/static/images/composer-emoji/twitter/2757.png b/static/images/composer-emoji/twitter/2757.png
new file mode 100644
index 0000000000..2cec70407d
Binary files /dev/null and b/static/images/composer-emoji/twitter/2757.png differ
diff --git a/static/images/composer-emoji/twitter/2763.png b/static/images/composer-emoji/twitter/2763.png
new file mode 100644
index 0000000000..8311b2424f
Binary files /dev/null and b/static/images/composer-emoji/twitter/2763.png differ
diff --git a/static/images/composer-emoji/twitter/2764.png b/static/images/composer-emoji/twitter/2764.png
new file mode 100644
index 0000000000..e820224352
Binary files /dev/null and b/static/images/composer-emoji/twitter/2764.png differ
diff --git a/static/images/composer-emoji/twitter/2795.png b/static/images/composer-emoji/twitter/2795.png
new file mode 100644
index 0000000000..953e116737
Binary files /dev/null and b/static/images/composer-emoji/twitter/2795.png differ
diff --git a/static/images/composer-emoji/twitter/2796.png b/static/images/composer-emoji/twitter/2796.png
new file mode 100644
index 0000000000..0c6a1e5045
Binary files /dev/null and b/static/images/composer-emoji/twitter/2796.png differ
diff --git a/static/images/composer-emoji/twitter/2797.png b/static/images/composer-emoji/twitter/2797.png
new file mode 100644
index 0000000000..c21aadb99d
Binary files /dev/null and b/static/images/composer-emoji/twitter/2797.png differ
diff --git a/static/images/composer-emoji/twitter/27a1.png b/static/images/composer-emoji/twitter/27a1.png
new file mode 100644
index 0000000000..bf0c7b5eeb
Binary files /dev/null and b/static/images/composer-emoji/twitter/27a1.png differ
diff --git a/static/images/composer-emoji/twitter/27b0.png b/static/images/composer-emoji/twitter/27b0.png
new file mode 100644
index 0000000000..28ea69dc6f
Binary files /dev/null and b/static/images/composer-emoji/twitter/27b0.png differ
diff --git a/static/images/composer-emoji/twitter/27bf.png b/static/images/composer-emoji/twitter/27bf.png
new file mode 100644
index 0000000000..21e878857d
Binary files /dev/null and b/static/images/composer-emoji/twitter/27bf.png differ
diff --git a/static/images/composer-emoji/twitter/2934.png b/static/images/composer-emoji/twitter/2934.png
new file mode 100644
index 0000000000..4987b70a75
Binary files /dev/null and b/static/images/composer-emoji/twitter/2934.png differ
diff --git a/static/images/composer-emoji/twitter/2935.png b/static/images/composer-emoji/twitter/2935.png
new file mode 100644
index 0000000000..72ab03687f
Binary files /dev/null and b/static/images/composer-emoji/twitter/2935.png differ
diff --git a/static/images/composer-emoji/twitter/2b05.png b/static/images/composer-emoji/twitter/2b05.png
new file mode 100644
index 0000000000..7d8bdc64c3
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b05.png differ
diff --git a/static/images/composer-emoji/twitter/2b06.png b/static/images/composer-emoji/twitter/2b06.png
new file mode 100644
index 0000000000..6f260a4b72
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b06.png differ
diff --git a/static/images/composer-emoji/twitter/2b07.png b/static/images/composer-emoji/twitter/2b07.png
new file mode 100644
index 0000000000..6882a55850
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b07.png differ
diff --git a/static/images/composer-emoji/twitter/2b1b.png b/static/images/composer-emoji/twitter/2b1b.png
new file mode 100644
index 0000000000..8874f1c859
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b1b.png differ
diff --git a/static/images/composer-emoji/twitter/2b1c.png b/static/images/composer-emoji/twitter/2b1c.png
new file mode 100644
index 0000000000..da545b29f5
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b1c.png differ
diff --git a/static/images/composer-emoji/twitter/2b50.png b/static/images/composer-emoji/twitter/2b50.png
new file mode 100644
index 0000000000..ab0d2a362f
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b50.png differ
diff --git a/static/images/composer-emoji/twitter/2b55.png b/static/images/composer-emoji/twitter/2b55.png
new file mode 100644
index 0000000000..2886e67293
Binary files /dev/null and b/static/images/composer-emoji/twitter/2b55.png differ
diff --git a/static/images/composer-emoji/twitter/3030.png b/static/images/composer-emoji/twitter/3030.png
new file mode 100644
index 0000000000..12e38a936c
Binary files /dev/null and b/static/images/composer-emoji/twitter/3030.png differ
diff --git a/static/images/composer-emoji/twitter/303d.png b/static/images/composer-emoji/twitter/303d.png
new file mode 100644
index 0000000000..25e6acc808
Binary files /dev/null and b/static/images/composer-emoji/twitter/303d.png differ
diff --git a/static/images/composer-emoji/twitter/3297.png b/static/images/composer-emoji/twitter/3297.png
new file mode 100644
index 0000000000..4691b77e8f
Binary files /dev/null and b/static/images/composer-emoji/twitter/3297.png differ
diff --git a/static/images/composer-emoji/twitter/3299.png b/static/images/composer-emoji/twitter/3299.png
new file mode 100644
index 0000000000..507a7ff6b5
Binary files /dev/null and b/static/images/composer-emoji/twitter/3299.png differ
diff --git a/static/images/composer/composer-caret@2x.png b/static/images/composer/composer-caret@2x.png
index 7385d77672..50dfe1e927 100644
Binary files a/static/images/composer/composer-caret@2x.png and b/static/images/composer/composer-caret@2x.png differ
diff --git a/static/images/composer/composer-drop-to-attach@2x.png b/static/images/composer/composer-drop-to-attach@2x.png
new file mode 100644
index 0000000000..bc8889ac45
Binary files /dev/null and b/static/images/composer/composer-drop-to-attach@2x.png differ
diff --git a/static/images/composer/composer-popout@2x.png b/static/images/composer/composer-popout@2x.png
index 48314ee31b..7ffb8f3baf 100644
Binary files a/static/images/composer/composer-popout@2x.png and b/static/images/composer/composer-popout@2x.png differ
diff --git a/static/images/composer/icon-composer-attachment@1x.png b/static/images/composer/icon-composer-attachment@1x.png
new file mode 100644
index 0000000000..56a27b3dce
Binary files /dev/null and b/static/images/composer/icon-composer-attachment@1x.png differ
diff --git a/static/images/composer/icon-composer-attachment@2x.png b/static/images/composer/icon-composer-attachment@2x.png
new file mode 100644
index 0000000000..6b8f789883
Binary files /dev/null and b/static/images/composer/icon-composer-attachment@2x.png differ
diff --git a/static/images/composer/icon-composer-dropdown@1x.png b/static/images/composer/icon-composer-dropdown@1x.png
new file mode 100644
index 0000000000..82a2823dfc
Binary files /dev/null and b/static/images/composer/icon-composer-dropdown@1x.png differ
diff --git a/static/images/composer/icon-composer-dropdown@2x.png b/static/images/composer/icon-composer-dropdown@2x.png
new file mode 100644
index 0000000000..0cfdb46d0e
Binary files /dev/null and b/static/images/composer/icon-composer-dropdown@2x.png differ
diff --git a/static/images/composer/icon-composer-emoji@1x.png b/static/images/composer/icon-composer-emoji@1x.png
new file mode 100644
index 0000000000..a247b2204d
Binary files /dev/null and b/static/images/composer/icon-composer-emoji@1x.png differ
diff --git a/static/images/composer/icon-composer-emoji@2x.png b/static/images/composer/icon-composer-emoji@2x.png
new file mode 100644
index 0000000000..a58bdb0dde
Binary files /dev/null and b/static/images/composer/icon-composer-emoji@2x.png differ
diff --git a/static/images/composer/icon-composer-eye@2x.png b/static/images/composer/icon-composer-eye@2x.png
new file mode 100644
index 0000000000..08d8dc2ac1
Binary files /dev/null and b/static/images/composer/icon-composer-eye@2x.png differ
diff --git a/static/images/composer/icon-composer-linktracking@1x.png b/static/images/composer/icon-composer-linktracking@1x.png
new file mode 100644
index 0000000000..ef2c79d507
Binary files /dev/null and b/static/images/composer/icon-composer-linktracking@1x.png differ
diff --git a/static/images/composer/icon-composer-linktracking@2x.png b/static/images/composer/icon-composer-linktracking@2x.png
new file mode 100644
index 0000000000..95198e19e4
Binary files /dev/null and b/static/images/composer/icon-composer-linktracking@2x.png differ
diff --git a/static/images/composer/icon-composer-mailmerge@1x.png b/static/images/composer/icon-composer-mailmerge@1x.png
new file mode 100644
index 0000000000..7fff372174
Binary files /dev/null and b/static/images/composer/icon-composer-mailmerge@1x.png differ
diff --git a/static/images/composer/icon-composer-mailmerge@2x.png b/static/images/composer/icon-composer-mailmerge@2x.png
new file mode 100644
index 0000000000..9c779f434d
Binary files /dev/null and b/static/images/composer/icon-composer-mailmerge@2x.png differ
diff --git a/static/images/composer/icon-composer-overflow@1x.png b/static/images/composer/icon-composer-overflow@1x.png
new file mode 100644
index 0000000000..873e6629d5
Binary files /dev/null and b/static/images/composer/icon-composer-overflow@1x.png differ
diff --git a/static/images/composer/icon-composer-overflow@2x.png b/static/images/composer/icon-composer-overflow@2x.png
new file mode 100644
index 0000000000..10f34a6d8a
Binary files /dev/null and b/static/images/composer/icon-composer-overflow@2x.png differ
diff --git a/static/images/composer/icon-composer-reminders@1x.png b/static/images/composer/icon-composer-reminders@1x.png
new file mode 100644
index 0000000000..1e22291c2a
Binary files /dev/null and b/static/images/composer/icon-composer-reminders@1x.png differ
diff --git a/static/images/composer/icon-composer-reminders@2x.png b/static/images/composer/icon-composer-reminders@2x.png
new file mode 100644
index 0000000000..e180a7addb
Binary files /dev/null and b/static/images/composer/icon-composer-reminders@2x.png differ
diff --git a/static/images/composer/icon-composer-send@2x.png b/static/images/composer/icon-composer-send@2x.png
new file mode 100644
index 0000000000..a92b031583
Binary files /dev/null and b/static/images/composer/icon-composer-send@2x.png differ
diff --git a/static/images/composer/icon-composer-sendlater@2x.png b/static/images/composer/icon-composer-sendlater@2x.png
new file mode 100644
index 0000000000..c56e32602e
Binary files /dev/null and b/static/images/composer/icon-composer-sendlater@2x.png differ
diff --git a/static/images/composer/icon-composer-trash@1x.png b/static/images/composer/icon-composer-trash@1x.png
new file mode 100644
index 0000000000..4e31c42290
Binary files /dev/null and b/static/images/composer/icon-composer-trash@1x.png differ
diff --git a/static/images/composer/icon-composer-trash@2x.png b/static/images/composer/icon-composer-trash@2x.png
new file mode 100644
index 0000000000..0f8b000468
Binary files /dev/null and b/static/images/composer/icon-composer-trash@2x.png differ
diff --git a/static/images/composer/sending-spinner.gif b/static/images/composer/sending-spinner.gif
new file mode 100644
index 0000000000..87985e9385
Binary files /dev/null and b/static/images/composer/sending-spinner.gif differ
diff --git a/static/images/composer/tooltip-bold-black@2x.png b/static/images/composer/tooltip-bold-black@2x.png
index 2c5e2b5f0e..b4b224f52c 100644
Binary files a/static/images/composer/tooltip-bold-black@2x.png and b/static/images/composer/tooltip-bold-black@2x.png differ
diff --git a/static/images/composer/tooltip-bold-blue@2x.png b/static/images/composer/tooltip-bold-blue@2x.png
index d55e052e51..879fb448ef 100644
Binary files a/static/images/composer/tooltip-bold-blue@2x.png and b/static/images/composer/tooltip-bold-blue@2x.png differ
diff --git a/static/images/composer/tooltip-italic-black@2x.png b/static/images/composer/tooltip-italic-black@2x.png
index 4eaa441eae..68e2ef079e 100644
Binary files a/static/images/composer/tooltip-italic-black@2x.png and b/static/images/composer/tooltip-italic-black@2x.png differ
diff --git a/static/images/composer/tooltip-italic-blue@2x.png b/static/images/composer/tooltip-italic-blue@2x.png
index 41a9f922b7..b62fe1231a 100644
Binary files a/static/images/composer/tooltip-italic-blue@2x.png and b/static/images/composer/tooltip-italic-blue@2x.png differ
diff --git a/static/images/composer/tooltip-link-black@2x.png b/static/images/composer/tooltip-link-black@2x.png
index d4d79f98d4..c3ce090c16 100644
Binary files a/static/images/composer/tooltip-link-black@2x.png and b/static/images/composer/tooltip-link-black@2x.png differ
diff --git a/static/images/composer/tooltip-link-blue@2x.png b/static/images/composer/tooltip-link-blue@2x.png
index 62fa1c5461..17f931b0cf 100644
Binary files a/static/images/composer/tooltip-link-blue@2x.png and b/static/images/composer/tooltip-link-blue@2x.png differ
diff --git a/static/images/composer/tooltip-underline-black@2x.png b/static/images/composer/tooltip-underline-black@2x.png
index 8a4116ef8c..d2a7dd89f5 100644
Binary files a/static/images/composer/tooltip-underline-black@2x.png and b/static/images/composer/tooltip-underline-black@2x.png differ
diff --git a/static/images/composer/tooltip-underline-blue@2x.png b/static/images/composer/tooltip-underline-blue@2x.png
index c59fdc0515..5136d92049 100644
Binary files a/static/images/composer/tooltip-underline-blue@2x.png and b/static/images/composer/tooltip-underline-blue@2x.png differ
diff --git a/static/images/composer/top-signature-dropdown@2x.png b/static/images/composer/top-signature-dropdown@2x.png
new file mode 100644
index 0000000000..161b4d944e
Binary files /dev/null and b/static/images/composer/top-signature-dropdown@2x.png differ
diff --git a/static/images/editable-list/edit-icon@2x.png b/static/images/editable-list/edit-icon@2x.png
new file mode 100644
index 0000000000..b22893a136
Binary files /dev/null and b/static/images/editable-list/edit-icon@2x.png differ
diff --git a/static/images/empty-state/Setup-Spinner@2x.gif b/static/images/empty-state/Setup-Spinner@2x.gif
new file mode 100644
index 0000000000..558316475b
Binary files /dev/null and b/static/images/empty-state/Setup-Spinner@2x.gif differ
diff --git a/static/images/empty-state/blank-bottom-left@2x.png b/static/images/empty-state/blank-bottom-left@2x.png
deleted file mode 100644
index 4b712b4c00..0000000000
Binary files a/static/images/empty-state/blank-bottom-left@2x.png and /dev/null differ
diff --git a/static/images/empty-state/blank-bottom-right@2x.png b/static/images/empty-state/blank-bottom-right@2x.png
deleted file mode 100644
index 128ad26ed0..0000000000
Binary files a/static/images/empty-state/blank-bottom-right@2x.png and /dev/null differ
diff --git a/static/images/empty-state/blank-top-left@2x.png b/static/images/empty-state/blank-top-left@2x.png
deleted file mode 100644
index efd5483629..0000000000
Binary files a/static/images/empty-state/blank-top-left@2x.png and /dev/null differ
diff --git a/static/images/empty-state/blank-top-right@2x.png b/static/images/empty-state/blank-top-right@2x.png
deleted file mode 100644
index 35443aec41..0000000000
Binary files a/static/images/empty-state/blank-top-right@2x.png and /dev/null differ
diff --git a/static/images/empty-state/ic-emptystate-archive@1x.png b/static/images/empty-state/ic-emptystate-archive@1x.png
new file mode 100644
index 0000000000..547bf29a6a
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-archive@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-archive@2x.png b/static/images/empty-state/ic-emptystate-archive@2x.png
new file mode 100644
index 0000000000..c06e460bb1
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-archive@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-drafts@1x.png b/static/images/empty-state/ic-emptystate-drafts@1x.png
new file mode 100644
index 0000000000..ce989cd497
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-drafts@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-drafts@2x.png b/static/images/empty-state/ic-emptystate-drafts@2x.png
new file mode 100644
index 0000000000..ae19439ed5
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-drafts@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-important@1x.png b/static/images/empty-state/ic-emptystate-important@1x.png
new file mode 100644
index 0000000000..48bfaa751b
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-important@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-important@2x.png b/static/images/empty-state/ic-emptystate-important@2x.png
new file mode 100644
index 0000000000..ec8b30f8af
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-important@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-n1-snoozed@1x.png b/static/images/empty-state/ic-emptystate-n1-snoozed@1x.png
new file mode 100644
index 0000000000..d576ce3403
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-n1-snoozed@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-n1-snoozed@2x.png b/static/images/empty-state/ic-emptystate-n1-snoozed@2x.png
new file mode 100644
index 0000000000..e52ff97fbc
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-n1-snoozed@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-reminders@1x.png b/static/images/empty-state/ic-emptystate-reminders@1x.png
new file mode 100644
index 0000000000..861811824f
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-reminders@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-reminders@2x.png b/static/images/empty-state/ic-emptystate-reminders@2x.png
new file mode 100644
index 0000000000..0a411f0edc
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-reminders@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-sent@1x.png b/static/images/empty-state/ic-emptystate-sent@1x.png
new file mode 100644
index 0000000000..38a8c92673
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-sent@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-sent@2x.png b/static/images/empty-state/ic-emptystate-sent@2x.png
new file mode 100644
index 0000000000..40e6537b61
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-sent@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-spam@1x.png b/static/images/empty-state/ic-emptystate-spam@1x.png
new file mode 100644
index 0000000000..35f56f2ef1
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-spam@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-spam@2x.png b/static/images/empty-state/ic-emptystate-spam@2x.png
new file mode 100644
index 0000000000..1e29f16dae
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-spam@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-starred@1x.png b/static/images/empty-state/ic-emptystate-starred@1x.png
new file mode 100644
index 0000000000..d1039b439d
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-starred@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-starred@2x.png b/static/images/empty-state/ic-emptystate-starred@2x.png
new file mode 100644
index 0000000000..00ed42d43b
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-starred@2x.png differ
diff --git a/static/images/empty-state/ic-emptystate-trash@1x.png b/static/images/empty-state/ic-emptystate-trash@1x.png
new file mode 100644
index 0000000000..6b1c603c02
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-trash@1x.png differ
diff --git a/static/images/empty-state/ic-emptystate-trash@2x.png b/static/images/empty-state/ic-emptystate-trash@2x.png
new file mode 100644
index 0000000000..d58eef220d
Binary files /dev/null and b/static/images/empty-state/ic-emptystate-trash@2x.png differ
diff --git a/static/images/events/Today_Sun@2x.png b/static/images/events/Today_Sun@2x.png
new file mode 100644
index 0000000000..dcb99abc97
Binary files /dev/null and b/static/images/events/Today_Sun@2x.png differ
diff --git a/static/images/events/ic-eventcard-calendar@2x.png b/static/images/events/ic-eventcard-calendar@2x.png
new file mode 100644
index 0000000000..f7bb83c396
Binary files /dev/null and b/static/images/events/ic-eventcard-calendar@2x.png differ
diff --git a/static/images/events/ic-eventcard-description@1x.png b/static/images/events/ic-eventcard-description@1x.png
new file mode 100644
index 0000000000..25e9bcda9e
Binary files /dev/null and b/static/images/events/ic-eventcard-description@1x.png differ
diff --git a/static/images/events/ic-eventcard-description@2x.png b/static/images/events/ic-eventcard-description@2x.png
new file mode 100644
index 0000000000..9151d34815
Binary files /dev/null and b/static/images/events/ic-eventcard-description@2x.png differ
diff --git a/static/images/events/ic-eventcard-disclosure@2x.png b/static/images/events/ic-eventcard-disclosure@2x.png
new file mode 100644
index 0000000000..e7a33775e3
Binary files /dev/null and b/static/images/events/ic-eventcard-disclosure@2x.png differ
diff --git a/static/images/events/ic-eventcard-link@2x.png b/static/images/events/ic-eventcard-link@2x.png
new file mode 100644
index 0000000000..27636e359b
Binary files /dev/null and b/static/images/events/ic-eventcard-link@2x.png differ
diff --git a/static/images/events/ic-eventcard-location@1x.png b/static/images/events/ic-eventcard-location@1x.png
new file mode 100644
index 0000000000..b8827f0dca
Binary files /dev/null and b/static/images/events/ic-eventcard-location@1x.png differ
diff --git a/static/images/events/ic-eventcard-location@2x.png b/static/images/events/ic-eventcard-location@2x.png
new file mode 100644
index 0000000000..9636b72169
Binary files /dev/null and b/static/images/events/ic-eventcard-location@2x.png differ
diff --git a/static/images/events/ic-eventcard-notes@2x.png b/static/images/events/ic-eventcard-notes@2x.png
new file mode 100644
index 0000000000..44b2815c3c
Binary files /dev/null and b/static/images/events/ic-eventcard-notes@2x.png differ
diff --git a/static/images/events/ic-eventcard-people@2x.png b/static/images/events/ic-eventcard-people@2x.png
new file mode 100644
index 0000000000..d4c8a24276
Binary files /dev/null and b/static/images/events/ic-eventcard-people@2x.png differ
diff --git a/static/images/events/ic-eventcard-reminder@2x.png b/static/images/events/ic-eventcard-reminder@2x.png
new file mode 100644
index 0000000000..a604879006
Binary files /dev/null and b/static/images/events/ic-eventcard-reminder@2x.png differ
diff --git a/static/images/events/ic-eventcard-time@1x.png b/static/images/events/ic-eventcard-time@1x.png
new file mode 100644
index 0000000000..2dea5af325
Binary files /dev/null and b/static/images/events/ic-eventcard-time@1x.png differ
diff --git a/static/images/events/ic-eventcard-time@2x.png b/static/images/events/ic-eventcard-time@2x.png
new file mode 100644
index 0000000000..81e8c413d1
Binary files /dev/null and b/static/images/events/ic-eventcard-time@2x.png differ
diff --git a/static/images/events/icon-RSVP-calendar-mini@2x.png b/static/images/events/icon-RSVP-calendar-mini@2x.png
new file mode 100644
index 0000000000..11a076ad90
Binary files /dev/null and b/static/images/events/icon-RSVP-calendar-mini@2x.png differ
diff --git a/static/images/format-bar/chevron-double-native@2x.png b/static/images/format-bar/chevron-double-native@2x.png
index d433c6f125..63403a3f95 100644
Binary files a/static/images/format-bar/chevron-double-native@2x.png and b/static/images/format-bar/chevron-double-native@2x.png differ
diff --git a/static/images/format-bar/chevron-dropdown-native@2x.png b/static/images/format-bar/chevron-dropdown-native@2x.png
index 1dc230c6c9..d7c7551e36 100644
Binary files a/static/images/format-bar/chevron-dropdown-native@2x.png and b/static/images/format-bar/chevron-dropdown-native@2x.png differ
diff --git a/static/images/format-bar/icon-align-center@2x.png b/static/images/format-bar/icon-align-center@2x.png
index e371728386..de07bbb6d0 100644
Binary files a/static/images/format-bar/icon-align-center@2x.png and b/static/images/format-bar/icon-align-center@2x.png differ
diff --git a/static/images/format-bar/icon-align-left@2x.png b/static/images/format-bar/icon-align-left@2x.png
index ee3f457712..b84a36de80 100644
Binary files a/static/images/format-bar/icon-align-left@2x.png and b/static/images/format-bar/icon-align-left@2x.png differ
diff --git a/static/images/format-bar/icon-align-right@2x.png b/static/images/format-bar/icon-align-right@2x.png
index ac1093a5d0..f8a2631407 100644
Binary files a/static/images/format-bar/icon-align-right@2x.png and b/static/images/format-bar/icon-align-right@2x.png differ
diff --git a/static/images/format-bar/icon-bold-active@2x.png b/static/images/format-bar/icon-bold-active@2x.png
index 930ee919b2..523169edb5 100644
Binary files a/static/images/format-bar/icon-bold-active@2x.png and b/static/images/format-bar/icon-bold-active@2x.png differ
diff --git a/static/images/format-bar/icon-bold@2x.png b/static/images/format-bar/icon-bold@2x.png
index 70774fd00b..633a87b2e0 100644
Binary files a/static/images/format-bar/icon-bold@2x.png and b/static/images/format-bar/icon-bold@2x.png differ
diff --git a/static/images/format-bar/icon-indent@2x.png b/static/images/format-bar/icon-indent@2x.png
index 3fcb6d059a..4d5f41829c 100644
Binary files a/static/images/format-bar/icon-indent@2x.png and b/static/images/format-bar/icon-indent@2x.png differ
diff --git a/static/images/format-bar/icon-italic-active@2x.png b/static/images/format-bar/icon-italic-active@2x.png
index 08c04555de..8eded51800 100644
Binary files a/static/images/format-bar/icon-italic-active@2x.png and b/static/images/format-bar/icon-italic-active@2x.png differ
diff --git a/static/images/format-bar/icon-italic@2x.png b/static/images/format-bar/icon-italic@2x.png
index 6c7bd54afb..074e52b90e 100644
Binary files a/static/images/format-bar/icon-italic@2x.png and b/static/images/format-bar/icon-italic@2x.png differ
diff --git a/static/images/format-bar/icon-list@2x.png b/static/images/format-bar/icon-list@2x.png
index ea6427c4ce..d703ecd310 100644
Binary files a/static/images/format-bar/icon-list@2x.png and b/static/images/format-bar/icon-list@2x.png differ
diff --git a/static/images/format-bar/icon-quote@2x.png b/static/images/format-bar/icon-quote@2x.png
index 5bf588e0ee..b0ce45b511 100644
Binary files a/static/images/format-bar/icon-quote@2x.png and b/static/images/format-bar/icon-quote@2x.png differ
diff --git a/static/images/format-bar/icon-underline-active@2x.png b/static/images/format-bar/icon-underline-active@2x.png
index cde5b333a8..7510e2e99f 100644
Binary files a/static/images/format-bar/icon-underline-active@2x.png and b/static/images/format-bar/icon-underline-active@2x.png differ
diff --git a/static/images/format-bar/icon-underline@2x.png b/static/images/format-bar/icon-underline@2x.png
index 059d5d6bde..797083f1de 100644
Binary files a/static/images/format-bar/icon-underline@2x.png and b/static/images/format-bar/icon-underline@2x.png differ
diff --git a/static/images/important/Icon-Important-Active@2x.png b/static/images/important/Icon-Important-Active@2x.png
new file mode 100644
index 0000000000..118a2eef0c
Binary files /dev/null and b/static/images/important/Icon-Important-Active@2x.png differ
diff --git a/static/images/important/Icon-Important-Hover@2x.png b/static/images/important/Icon-Important-Hover@2x.png
new file mode 100644
index 0000000000..cc7c206716
Binary files /dev/null and b/static/images/important/Icon-Important-Hover@2x.png differ
diff --git a/static/images/important/Icon-Important-HoverActive@2x.png b/static/images/important/Icon-Important-HoverActive@2x.png
new file mode 100644
index 0000000000..16f28692d6
Binary files /dev/null and b/static/images/important/Icon-Important-HoverActive@2x.png differ
diff --git a/static/images/inbox-zero/inbox-zero-plain@2x.png b/static/images/inbox-zero/inbox-zero-plain@2x.png
new file mode 100644
index 0000000000..eae5d7f41c
Binary files /dev/null and b/static/images/inbox-zero/inbox-zero-plain@2x.png differ
diff --git a/static/images/labels/label-x@2x.png b/static/images/labels/label-x@2x.png
new file mode 100644
index 0000000000..9098d5e7fd
Binary files /dev/null and b/static/images/labels/label-x@2x.png differ
diff --git a/static/images/labels/tagging-checkbox@2x.png b/static/images/labels/tagging-checkbox@2x.png
new file mode 100644
index 0000000000..1e3ba8e877
Binary files /dev/null and b/static/images/labels/tagging-checkbox@2x.png differ
diff --git a/static/images/labels/tagging-checkmark@2x.png b/static/images/labels/tagging-checkmark@2x.png
new file mode 100644
index 0000000000..552cdcedcd
Binary files /dev/null and b/static/images/labels/tagging-checkmark@2x.png differ
diff --git a/static/images/labels/tagging-conflicted@2x.png b/static/images/labels/tagging-conflicted@2x.png
new file mode 100644
index 0000000000..b25af74382
Binary files /dev/null and b/static/images/labels/tagging-conflicted@2x.png differ
diff --git a/static/images/mail-merge/btn-column-minus@1x.png b/static/images/mail-merge/btn-column-minus@1x.png
new file mode 100644
index 0000000000..1f6952e687
Binary files /dev/null and b/static/images/mail-merge/btn-column-minus@1x.png differ
diff --git a/static/images/mail-merge/btn-column-minus@2x.png b/static/images/mail-merge/btn-column-minus@2x.png
new file mode 100644
index 0000000000..ae6c06ef8d
Binary files /dev/null and b/static/images/mail-merge/btn-column-minus@2x.png differ
diff --git a/static/images/mail-merge/btn-column-plus@1x.png b/static/images/mail-merge/btn-column-plus@1x.png
new file mode 100644
index 0000000000..617960eca3
Binary files /dev/null and b/static/images/mail-merge/btn-column-plus@1x.png differ
diff --git a/static/images/mail-merge/btn-column-plus@2x.png b/static/images/mail-merge/btn-column-plus@2x.png
new file mode 100644
index 0000000000..9255dbd021
Binary files /dev/null and b/static/images/mail-merge/btn-column-plus@2x.png differ
diff --git a/static/images/mail-merge/icon-column-minus@1x.png b/static/images/mail-merge/icon-column-minus@1x.png
new file mode 100644
index 0000000000..6e998b3e0d
Binary files /dev/null and b/static/images/mail-merge/icon-column-minus@1x.png differ
diff --git a/static/images/mail-merge/icon-column-minus@2x.png b/static/images/mail-merge/icon-column-minus@2x.png
new file mode 100644
index 0000000000..182e273557
Binary files /dev/null and b/static/images/mail-merge/icon-column-minus@2x.png differ
diff --git a/static/images/mail-merge/icon-column-plus@1x.png b/static/images/mail-merge/icon-column-plus@1x.png
new file mode 100644
index 0000000000..f1b570ef3b
Binary files /dev/null and b/static/images/mail-merge/icon-column-plus@1x.png differ
diff --git a/static/images/mail-merge/icon-column-plus@2x.png b/static/images/mail-merge/icon-column-plus@2x.png
new file mode 100644
index 0000000000..a12faa0113
Binary files /dev/null and b/static/images/mail-merge/icon-column-plus@2x.png differ
diff --git a/static/images/mail-merge/mailmerge-grabber@1x.png b/static/images/mail-merge/mailmerge-grabber@1x.png
new file mode 100644
index 0000000000..62e30b4485
Binary files /dev/null and b/static/images/mail-merge/mailmerge-grabber@1x.png differ
diff --git a/static/images/mail-merge/mailmerge-grabber@2x.png b/static/images/mail-merge/mailmerge-grabber@2x.png
new file mode 100644
index 0000000000..40a30cdbe7
Binary files /dev/null and b/static/images/mail-merge/mailmerge-grabber@2x.png differ
diff --git a/static/images/menu/checked-selected@2x.png b/static/images/menu/checked-selected@2x.png
new file mode 100644
index 0000000000..81a1573da0
Binary files /dev/null and b/static/images/menu/checked-selected@2x.png differ
diff --git a/static/images/menu/checked@2x.png b/static/images/menu/checked@2x.png
new file mode 100644
index 0000000000..344cfe0a9c
Binary files /dev/null and b/static/images/menu/checked@2x.png differ
diff --git a/static/images/menu/osx-checkmark@2x.svg b/static/images/menu/osx-checkmark@2x.svg
new file mode 100644
index 0000000000..66eab6c3fe
--- /dev/null
+++ b/static/images/menu/osx-checkmark@2x.svg
@@ -0,0 +1,11 @@
+
+  
+    
+  
+  
+
diff --git a/static/images/message-list-toggle-sidebar/icon-thread-hidesidebar@2x.png b/static/images/message-list-toggle-sidebar/icon-thread-hidesidebar@2x.png
new file mode 100644
index 0000000000..b9f74fe0e0
Binary files /dev/null and b/static/images/message-list-toggle-sidebar/icon-thread-hidesidebar@2x.png differ
diff --git a/static/images/message-list-toggle-sidebar/icon-thread-showsidebar@2x.png b/static/images/message-list-toggle-sidebar/icon-thread-showsidebar@2x.png
new file mode 100644
index 0000000000..4cddcbd35b
Binary files /dev/null and b/static/images/message-list-toggle-sidebar/icon-thread-showsidebar@2x.png differ
diff --git a/static/images/message-list/collapse@2x.png b/static/images/message-list/collapse@2x.png
new file mode 100644
index 0000000000..ee74a04e1f
Binary files /dev/null and b/static/images/message-list/collapse@2x.png differ
diff --git a/static/images/message-list/expand@2x.png b/static/images/message-list/expand@2x.png
new file mode 100644
index 0000000000..0e3a33e4b3
Binary files /dev/null and b/static/images/message-list/expand@2x.png differ
diff --git a/static/images/message-list/forward-message-header@2x.png b/static/images/message-list/forward-message-header@2x.png
deleted file mode 100644
index 9ad3f6c389..0000000000
Binary files a/static/images/message-list/forward-message-header@2x.png and /dev/null differ
diff --git a/static/images/message-list/ic-findinthread-close@1x.png b/static/images/message-list/ic-findinthread-close@1x.png
new file mode 100644
index 0000000000..8ad394d59d
Binary files /dev/null and b/static/images/message-list/ic-findinthread-close@1x.png differ
diff --git a/static/images/message-list/ic-findinthread-close@2x.png b/static/images/message-list/ic-findinthread-close@2x.png
new file mode 100644
index 0000000000..e7f649ada8
Binary files /dev/null and b/static/images/message-list/ic-findinthread-close@2x.png differ
diff --git a/static/images/message-list/ic-findinthread-next@1x.png b/static/images/message-list/ic-findinthread-next@1x.png
new file mode 100644
index 0000000000..b8fbace821
Binary files /dev/null and b/static/images/message-list/ic-findinthread-next@1x.png differ
diff --git a/static/images/message-list/ic-findinthread-next@2x.png b/static/images/message-list/ic-findinthread-next@2x.png
new file mode 100644
index 0000000000..5ab98fdacc
Binary files /dev/null and b/static/images/message-list/ic-findinthread-next@2x.png differ
diff --git a/static/images/message-list/ic-findinthread-previous@1x.png b/static/images/message-list/ic-findinthread-previous@1x.png
new file mode 100644
index 0000000000..460dde4069
Binary files /dev/null and b/static/images/message-list/ic-findinthread-previous@1x.png differ
diff --git a/static/images/message-list/ic-findinthread-previous@2x.png b/static/images/message-list/ic-findinthread-previous@2x.png
new file mode 100644
index 0000000000..c46c1307bb
Binary files /dev/null and b/static/images/message-list/ic-findinthread-previous@2x.png differ
diff --git a/static/images/message-list/icon-attachment-@2x.png b/static/images/message-list/icon-attachment-@2x.png
new file mode 100644
index 0000000000..97286b881f
Binary files /dev/null and b/static/images/message-list/icon-attachment-@2x.png differ
diff --git a/static/images/message-list/inline-loading-spinner.gif b/static/images/message-list/inline-loading-spinner.gif
new file mode 100644
index 0000000000..87985e9385
Binary files /dev/null and b/static/images/message-list/inline-loading-spinner.gif differ
diff --git a/static/images/message-list/message-actions-ellipsis@2x.png b/static/images/message-list/message-actions-ellipsis@2x.png
index 8dd0c2580f..84ea6a8bec 100644
Binary files a/static/images/message-list/message-actions-ellipsis@2x.png and b/static/images/message-list/message-actions-ellipsis@2x.png differ
diff --git a/static/images/message-list/message-disclosure-triangle-active@2x.png b/static/images/message-list/message-disclosure-triangle-active@2x.png
index 525f9dac11..78d8d8adb4 100644
Binary files a/static/images/message-list/message-disclosure-triangle-active@2x.png and b/static/images/message-list/message-disclosure-triangle-active@2x.png differ
diff --git a/static/images/message-list/message-disclosure-triangle@2x.png b/static/images/message-list/message-disclosure-triangle@2x.png
index 28f6c905d1..4cb562d345 100644
Binary files a/static/images/message-list/message-disclosure-triangle@2x.png and b/static/images/message-list/message-disclosure-triangle@2x.png differ
diff --git a/static/images/message-list/message-forward@1x.png b/static/images/message-list/message-forward@1x.png
deleted file mode 100644
index 1d9731b6b6..0000000000
Binary files a/static/images/message-list/message-forward@1x.png and /dev/null differ
diff --git a/static/images/message-list/message-forward@2x.png b/static/images/message-list/message-forward@2x.png
deleted file mode 100644
index 578bdb347b..0000000000
Binary files a/static/images/message-list/message-forward@2x.png and /dev/null differ
diff --git a/static/images/message-list/message-reply-all@1x.png b/static/images/message-list/message-reply-all@1x.png
deleted file mode 100644
index 0070fdcef2..0000000000
Binary files a/static/images/message-list/message-reply-all@1x.png and /dev/null differ
diff --git a/static/images/message-list/message-reply-all@2x.png b/static/images/message-list/message-reply-all@2x.png
deleted file mode 100644
index b7c92a685d..0000000000
Binary files a/static/images/message-list/message-reply-all@2x.png and /dev/null differ
diff --git a/static/images/message-list/message-reply@1x.png b/static/images/message-list/message-reply@1x.png
deleted file mode 100644
index 05029623b9..0000000000
Binary files a/static/images/message-list/message-reply@1x.png and /dev/null differ
diff --git a/static/images/message-list/message-reply@2x.png b/static/images/message-list/message-reply@2x.png
deleted file mode 100644
index bbf6a31510..0000000000
Binary files a/static/images/message-list/message-reply@2x.png and /dev/null differ
diff --git a/static/images/message-list/message-show-more@1x.png b/static/images/message-list/message-show-more@1x.png
deleted file mode 100644
index c0b572f382..0000000000
Binary files a/static/images/message-list/message-show-more@1x.png and /dev/null differ
diff --git a/static/images/message-list/message-show-more@2x.png b/static/images/message-list/message-show-more@2x.png
deleted file mode 100644
index 2219cb3d19..0000000000
Binary files a/static/images/message-list/message-show-more@2x.png and /dev/null differ
diff --git a/static/images/message-list/print@2x.png b/static/images/message-list/print@2x.png
new file mode 100644
index 0000000000..d50274453a
Binary files /dev/null and b/static/images/message-list/print@2x.png differ
diff --git a/static/images/message-list/reply-all-footer@2x.png b/static/images/message-list/reply-all-footer@2x.png
index b73847e9b6..72e9bbe88b 100644
Binary files a/static/images/message-list/reply-all-footer@2x.png and b/static/images/message-list/reply-all-footer@2x.png differ
diff --git a/static/images/message-list/reply-all-message-header@2x.png b/static/images/message-list/reply-all-message-header@2x.png
deleted file mode 100644
index 2319844f86..0000000000
Binary files a/static/images/message-list/reply-all-message-header@2x.png and /dev/null differ
diff --git a/static/images/message-list/reply-footer@2x.png b/static/images/message-list/reply-footer@2x.png
index 4ef9fd1ffa..bfda4ff94d 100644
Binary files a/static/images/message-list/reply-footer@2x.png and b/static/images/message-list/reply-footer@2x.png differ
diff --git a/static/images/message-list/reply-message-header@2x.png b/static/images/message-list/reply-message-header@2x.png
deleted file mode 100644
index 6a21ec3e39..0000000000
Binary files a/static/images/message-list/reply-message-header@2x.png and /dev/null differ
diff --git a/static/images/message-list/thread-popin@1x.png b/static/images/message-list/thread-popin@1x.png
new file mode 100644
index 0000000000..0056b6456e
Binary files /dev/null and b/static/images/message-list/thread-popin@1x.png differ
diff --git a/static/images/message-list/thread-popin@2x.png b/static/images/message-list/thread-popin@2x.png
new file mode 100644
index 0000000000..fd21932f65
Binary files /dev/null and b/static/images/message-list/thread-popin@2x.png differ
diff --git a/static/images/message-list/thread-popout@1x.png b/static/images/message-list/thread-popout@1x.png
new file mode 100644
index 0000000000..ae00289459
Binary files /dev/null and b/static/images/message-list/thread-popout@1x.png differ
diff --git a/static/images/message-list/thread-popout@2x.png b/static/images/message-list/thread-popout@2x.png
new file mode 100644
index 0000000000..42fb9ae997
Binary files /dev/null and b/static/images/message-list/thread-popout@2x.png differ
diff --git a/static/images/message-list/toolbar-down-arrow@2x.png b/static/images/message-list/toolbar-down-arrow@2x.png
index 7f95168dfa..d17c6ba139 100644
Binary files a/static/images/message-list/toolbar-down-arrow@2x.png and b/static/images/message-list/toolbar-down-arrow@2x.png differ
diff --git a/static/images/message-list/toolbar-up-arrow@2x.png b/static/images/message-list/toolbar-up-arrow@2x.png
index 81b3d3b6c8..d5d0a9fae1 100644
Binary files a/static/images/message-list/toolbar-up-arrow@2x.png and b/static/images/message-list/toolbar-up-arrow@2x.png differ
diff --git a/static/images/modal/modal-close@1x.png b/static/images/modal/modal-close@1x.png
new file mode 100644
index 0000000000..3f8baa197b
Binary files /dev/null and b/static/images/modal/modal-close@1x.png differ
diff --git a/static/images/modal/modal-close@2x.png b/static/images/modal/modal-close@2x.png
new file mode 100644
index 0000000000..f5bbf29d91
Binary files /dev/null and b/static/images/modal/modal-close@2x.png differ
diff --git a/static/images/notification/icon-alert-onred@1x.png b/static/images/notification/icon-alert-onred@1x.png
new file mode 100644
index 0000000000..ed907e2088
Binary files /dev/null and b/static/images/notification/icon-alert-onred@1x.png differ
diff --git a/static/images/notification/icon-alert-onred@2x.png b/static/images/notification/icon-alert-onred@2x.png
new file mode 100644
index 0000000000..08c7612bde
Binary files /dev/null and b/static/images/notification/icon-alert-onred@2x.png differ
diff --git a/static/images/notification/nylas-identity-seafoam@1x.png b/static/images/notification/nylas-identity-seafoam@1x.png
new file mode 100644
index 0000000000..226e7dca18
Binary files /dev/null and b/static/images/notification/nylas-identity-seafoam@1x.png differ
diff --git a/static/images/notification/nylas-identity-seafoam@2x.png b/static/images/notification/nylas-identity-seafoam@2x.png
new file mode 100644
index 0000000000..82fefc46b5
Binary files /dev/null and b/static/images/notification/nylas-identity-seafoam@2x.png differ
diff --git a/static/images/notification/volstead-defaultclient@2x.png b/static/images/notification/volstead-defaultclient@2x.png
new file mode 100644
index 0000000000..f8435845d0
Binary files /dev/null and b/static/images/notification/volstead-defaultclient@2x.png differ
diff --git a/static/images/notification/volstead-error@2x.png b/static/images/notification/volstead-error@2x.png
new file mode 100644
index 0000000000..18c59730e6
Binary files /dev/null and b/static/images/notification/volstead-error@2x.png differ
diff --git a/static/images/notification/volstead-offline@2x.png b/static/images/notification/volstead-offline@2x.png
new file mode 100644
index 0000000000..2fe9b735a7
Binary files /dev/null and b/static/images/notification/volstead-offline@2x.png differ
diff --git a/static/images/notification/volstead-salesforce@2x.png b/static/images/notification/volstead-salesforce@2x.png
new file mode 100644
index 0000000000..a0f922ce4f
Binary files /dev/null and b/static/images/notification/volstead-salesforce@2x.png differ
diff --git a/static/images/notification/volstead-upgrade@2x.png b/static/images/notification/volstead-upgrade@2x.png
new file mode 100644
index 0000000000..b17835716d
Binary files /dev/null and b/static/images/notification/volstead-upgrade@2x.png differ
diff --git a/static/images/onboarding/icon-copytoclipboard@1x.png b/static/images/onboarding/icon-copytoclipboard@1x.png
new file mode 100644
index 0000000000..e04288b731
Binary files /dev/null and b/static/images/onboarding/icon-copytoclipboard@1x.png differ
diff --git a/static/images/onboarding/icon-copytoclipboard@2x.png b/static/images/onboarding/icon-copytoclipboard@2x.png
new file mode 100644
index 0000000000..8285669205
Binary files /dev/null and b/static/images/onboarding/icon-copytoclipboard@2x.png differ
diff --git a/static/images/onboarding/onboarding-back@2x.png b/static/images/onboarding/onboarding-back@2x.png
index 0e504bb9ea..21a784ac24 100644
Binary files a/static/images/onboarding/onboarding-back@2x.png and b/static/images/onboarding/onboarding-back@2x.png differ
diff --git a/static/images/onboarding/onboarding-close@2x.png b/static/images/onboarding/onboarding-close@2x.png
index 119c2cd1a4..1792a78c99 100644
Binary files a/static/images/onboarding/onboarding-close@2x.png and b/static/images/onboarding/onboarding-close@2x.png differ
diff --git a/static/images/onboarding/onboarding-divider@2x.png b/static/images/onboarding/onboarding-divider@2x.png
index 3acf36e439..556b6f2885 100644
Binary files a/static/images/onboarding/onboarding-divider@2x.png and b/static/images/onboarding/onboarding-divider@2x.png differ
diff --git a/static/images/onboarding/onboarding-logo@2x.png b/static/images/onboarding/onboarding-logo@2x.png
index 5eca2fffba..f35d10606c 100644
Binary files a/static/images/onboarding/onboarding-logo@2x.png and b/static/images/onboarding/onboarding-logo@2x.png differ
diff --git a/static/images/onboarding/pro-plugins@2x.png b/static/images/onboarding/pro-plugins@2x.png
new file mode 100644
index 0000000000..abecb102bf
Binary files /dev/null and b/static/images/onboarding/pro-plugins@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-exchange@2x.png b/static/images/onboarding/providers/setup-icon-provider-exchange@2x.png
new file mode 100644
index 0000000000..d7ebab8aad
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-exchange@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-fastmail@2x.png b/static/images/onboarding/providers/setup-icon-provider-fastmail@2x.png
new file mode 100644
index 0000000000..05ea051241
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-fastmail@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-gmail@2x.png b/static/images/onboarding/providers/setup-icon-provider-gmail@2x.png
new file mode 100644
index 0000000000..523c0e2d30
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-gmail@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-icloud@2x.png b/static/images/onboarding/providers/setup-icon-provider-icloud@2x.png
new file mode 100644
index 0000000000..3e6b775c55
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-icloud@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-imap@2x.png b/static/images/onboarding/providers/setup-icon-provider-imap@2x.png
new file mode 100644
index 0000000000..6985c880e9
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-imap@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-office365@2x.png b/static/images/onboarding/providers/setup-icon-provider-office365@2x.png
new file mode 100644
index 0000000000..d7ebab8aad
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-office365@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-outlook@2x.png b/static/images/onboarding/providers/setup-icon-provider-outlook@2x.png
new file mode 100644
index 0000000000..79b82c9d5c
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-outlook@2x.png differ
diff --git a/static/images/onboarding/providers/setup-icon-provider-yahoo@2x.png b/static/images/onboarding/providers/setup-icon-provider-yahoo@2x.png
new file mode 100644
index 0000000000..e44b116b3f
Binary files /dev/null and b/static/images/onboarding/providers/setup-icon-provider-yahoo@2x.png differ
diff --git a/static/images/onboarding/sending-spinner.gif b/static/images/onboarding/sending-spinner.gif
new file mode 100644
index 0000000000..87985e9385
Binary files /dev/null and b/static/images/onboarding/sending-spinner.gif differ
diff --git a/static/images/onboarding/slider-bg-enabled@2x.png b/static/images/onboarding/slider-bg-enabled@2x.png
new file mode 100644
index 0000000000..ab1e735fd9
Binary files /dev/null and b/static/images/onboarding/slider-bg-enabled@2x.png differ
diff --git a/static/images/onboarding/slider-bg@2x.png b/static/images/onboarding/slider-bg@2x.png
new file mode 100644
index 0000000000..9e3013d7b8
Binary files /dev/null and b/static/images/onboarding/slider-bg@2x.png differ
diff --git a/static/images/onboarding/slider-knob@2x.png b/static/images/onboarding/slider-knob@2x.png
new file mode 100644
index 0000000000..e458494f87
Binary files /dev/null and b/static/images/onboarding/slider-knob@2x.png differ
diff --git a/static/images/preferences/appearance/appearance-mode-list@2x.png b/static/images/preferences/appearance/appearance-mode-list@2x.png
new file mode 100644
index 0000000000..e214690909
Binary files /dev/null and b/static/images/preferences/appearance/appearance-mode-list@2x.png differ
diff --git a/static/images/preferences/appearance/appearance-mode-split@2x.png b/static/images/preferences/appearance/appearance-mode-split@2x.png
new file mode 100644
index 0000000000..a6e9483d1c
Binary files /dev/null and b/static/images/preferences/appearance/appearance-mode-split@2x.png differ
diff --git a/static/images/preferences/identity/ic-refresh@2x.png b/static/images/preferences/identity/ic-refresh@2x.png
new file mode 100644
index 0000000000..07799ae583
Binary files /dev/null and b/static/images/preferences/identity/ic-refresh@2x.png differ
diff --git a/static/images/preferences/identity/ic-upgrade@2x.png b/static/images/preferences/identity/ic-upgrade@2x.png
new file mode 100644
index 0000000000..926170e2ef
Binary files /dev/null and b/static/images/preferences/identity/ic-upgrade@2x.png differ
diff --git a/static/images/preferences/identity/prefs-identity-nylas-logo@2x.png b/static/images/preferences/identity/prefs-identity-nylas-logo@2x.png
new file mode 100644
index 0000000000..8beb18339d
Binary files /dev/null and b/static/images/preferences/identity/prefs-identity-nylas-logo@2x.png differ
diff --git a/static/images/preferences/mail-rules/rules-big@1x.png b/static/images/preferences/mail-rules/rules-big@1x.png
new file mode 100644
index 0000000000..f9a6b1790f
Binary files /dev/null and b/static/images/preferences/mail-rules/rules-big@1x.png differ
diff --git a/static/images/preferences/mail-rules/rules-big@2x.png b/static/images/preferences/mail-rules/rules-big@2x.png
new file mode 100644
index 0000000000..c9dcc477ab
Binary files /dev/null and b/static/images/preferences/mail-rules/rules-big@2x.png differ
diff --git a/static/images/preferences/plugins/plugin-icon-default@2x.png b/static/images/preferences/plugins/plugin-icon-default@2x.png
new file mode 100644
index 0000000000..4dcc522a85
Binary files /dev/null and b/static/images/preferences/plugins/plugin-icon-default@2x.png differ
diff --git a/static/images/preferences/plugins/theme-icon-default@2x.png b/static/images/preferences/plugins/theme-icon-default@2x.png
new file mode 100644
index 0000000000..cab2c95c2a
Binary files /dev/null and b/static/images/preferences/plugins/theme-icon-default@2x.png differ
diff --git a/static/images/preferences/providers/ic-accountsettings-error@1x.png b/static/images/preferences/providers/ic-accountsettings-error@1x.png
new file mode 100644
index 0000000000..11fded2c9c
Binary files /dev/null and b/static/images/preferences/providers/ic-accountsettings-error@1x.png differ
diff --git a/static/images/preferences/providers/ic-accountsettings-error@2x.png b/static/images/preferences/providers/ic-accountsettings-error@2x.png
new file mode 100644
index 0000000000..08a763992f
Binary files /dev/null and b/static/images/preferences/providers/ic-accountsettings-error@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-eas@2x.png b/static/images/preferences/providers/ic-settings-account-eas@2x.png
new file mode 100644
index 0000000000..b6344e9999
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-eas@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-error@2x.png b/static/images/preferences/providers/ic-settings-account-error@2x.png
new file mode 100644
index 0000000000..72c33792cf
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-error@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-fastmail@2x.png b/static/images/preferences/providers/ic-settings-account-fastmail@2x.png
new file mode 100644
index 0000000000..0707867bb3
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-fastmail@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-gmail@2x.png b/static/images/preferences/providers/ic-settings-account-gmail@2x.png
new file mode 100644
index 0000000000..cdfa772bf6
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-gmail@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-icloud@2x.png b/static/images/preferences/providers/ic-settings-account-icloud@2x.png
new file mode 100644
index 0000000000..e0cebeb0d7
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-icloud@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-imap@2x.png b/static/images/preferences/providers/ic-settings-account-imap@2x.png
new file mode 100644
index 0000000000..c3379c60f3
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-imap@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-office365@2x.png b/static/images/preferences/providers/ic-settings-account-office365@2x.png
new file mode 100644
index 0000000000..972c2f165e
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-office365@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-outlook@2x.png b/static/images/preferences/providers/ic-settings-account-outlook@2x.png
new file mode 100644
index 0000000000..972c2f165e
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-outlook@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-unified@2x.png b/static/images/preferences/providers/ic-settings-account-unified@2x.png
new file mode 100644
index 0000000000..035d39db6a
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-unified@2x.png differ
diff --git a/static/images/preferences/providers/ic-settings-account-yahoo@2x.png b/static/images/preferences/providers/ic-settings-account-yahoo@2x.png
new file mode 100644
index 0000000000..3fc90c1124
Binary files /dev/null and b/static/images/preferences/providers/ic-settings-account-yahoo@2x.png differ
diff --git a/static/images/preferences/signatures/signatures-big@2x.png b/static/images/preferences/signatures/signatures-big@2x.png
new file mode 100644
index 0000000000..217f6015c9
Binary files /dev/null and b/static/images/preferences/signatures/signatures-big@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-accounts@1x.png b/static/images/preferences/tabs/icon-preferences-accounts@1x.png
new file mode 100644
index 0000000000..151b1b9a6e
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-accounts@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-accounts@2x.png b/static/images/preferences/tabs/icon-preferences-accounts@2x.png
new file mode 100644
index 0000000000..798c505650
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-accounts@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-appearance@1x.png b/static/images/preferences/tabs/icon-preferences-appearance@1x.png
new file mode 100644
index 0000000000..e46ab409a4
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-appearance@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-appearance@2x.png b/static/images/preferences/tabs/icon-preferences-appearance@2x.png
new file mode 100644
index 0000000000..06f2781786
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-appearance@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-encryption@1x.png b/static/images/preferences/tabs/icon-preferences-encryption@1x.png
new file mode 100644
index 0000000000..d169e4194e
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-encryption@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-encryption@2x.png b/static/images/preferences/tabs/icon-preferences-encryption@2x.png
new file mode 100644
index 0000000000..c88505118b
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-encryption@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-general@1x.png b/static/images/preferences/tabs/icon-preferences-general@1x.png
new file mode 100644
index 0000000000..f0ebb9d0c5
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-general@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-general@2x.png b/static/images/preferences/tabs/icon-preferences-general@2x.png
new file mode 100644
index 0000000000..89b28d9a0e
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-general@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-mail-rules@1x.png b/static/images/preferences/tabs/icon-preferences-mail-rules@1x.png
new file mode 100644
index 0000000000..0a9bb05bd6
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-mail-rules@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-mail-rules@2x.png b/static/images/preferences/tabs/icon-preferences-mail-rules@2x.png
new file mode 100644
index 0000000000..698a6fc88d
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-mail-rules@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-plugins@1x.png b/static/images/preferences/tabs/icon-preferences-plugins@1x.png
new file mode 100644
index 0000000000..dc1276b9fc
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-plugins@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-plugins@2x.png b/static/images/preferences/tabs/icon-preferences-plugins@2x.png
new file mode 100644
index 0000000000..e8266fbf54
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-plugins@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-quick-replies@1x.png b/static/images/preferences/tabs/icon-preferences-quick-replies@1x.png
new file mode 100644
index 0000000000..a422038401
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-quick-replies@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-quick-replies@2x.png b/static/images/preferences/tabs/icon-preferences-quick-replies@2x.png
new file mode 100644
index 0000000000..f708c820a3
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-quick-replies@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-shortcuts@1x.png b/static/images/preferences/tabs/icon-preferences-shortcuts@1x.png
new file mode 100644
index 0000000000..9a8ad3c1c1
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-shortcuts@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-shortcuts@2x.png b/static/images/preferences/tabs/icon-preferences-shortcuts@2x.png
new file mode 100644
index 0000000000..cef3d0b48b
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-shortcuts@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-signatures@1x.png b/static/images/preferences/tabs/icon-preferences-signatures@1x.png
new file mode 100644
index 0000000000..623ea25bcd
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-signatures@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-signatures@2x.png b/static/images/preferences/tabs/icon-preferences-signatures@2x.png
new file mode 100644
index 0000000000..3b084410a9
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-signatures@2x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-subscription@1x.png b/static/images/preferences/tabs/icon-preferences-subscription@1x.png
new file mode 100644
index 0000000000..a8970d0be5
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-subscription@1x.png differ
diff --git a/static/images/preferences/tabs/icon-preferences-subscription@2x.png b/static/images/preferences/tabs/icon-preferences-subscription@2x.png
new file mode 100644
index 0000000000..5a620a4675
Binary files /dev/null and b/static/images/preferences/tabs/icon-preferences-subscription@2x.png differ
diff --git a/static/images/reply-dropdown/ic-dropdown-forward@2x.png b/static/images/reply-dropdown/ic-dropdown-forward@2x.png
new file mode 100644
index 0000000000..3c5e87476e
Binary files /dev/null and b/static/images/reply-dropdown/ic-dropdown-forward@2x.png differ
diff --git a/static/images/reply-dropdown/ic-dropdown-reply@2x.png b/static/images/reply-dropdown/ic-dropdown-reply@2x.png
new file mode 100644
index 0000000000..d87d014ae0
Binary files /dev/null and b/static/images/reply-dropdown/ic-dropdown-reply@2x.png differ
diff --git a/static/images/reply-dropdown/ic-dropdown-replyall@2x.png b/static/images/reply-dropdown/ic-dropdown-replyall@2x.png
new file mode 100644
index 0000000000..956f57cd79
Binary files /dev/null and b/static/images/reply-dropdown/ic-dropdown-replyall@2x.png differ
diff --git a/static/images/reply-dropdown/ic-message-button-reply@2x.png b/static/images/reply-dropdown/ic-message-button-reply@2x.png
new file mode 100644
index 0000000000..d78463f31a
Binary files /dev/null and b/static/images/reply-dropdown/ic-message-button-reply@2x.png differ
diff --git a/static/images/search/searchclear@2x.png b/static/images/search/searchclear@2x.png
new file mode 100644
index 0000000000..d3a93665c6
Binary files /dev/null and b/static/images/search/searchclear@2x.png differ
diff --git a/static/images/search/searchloupe@2x.png b/static/images/search/searchloupe@2x.png
new file mode 100644
index 0000000000..008ac5f4dc
Binary files /dev/null and b/static/images/search/searchloupe@2x.png differ
diff --git a/static/images/sheets/sheet-back@2x.png b/static/images/sheets/sheet-back@2x.png
index 9320a78c7d..847ad49ae2 100644
Binary files a/static/images/sheets/sheet-back@2x.png and b/static/images/sheets/sheet-back@2x.png differ
diff --git a/static/images/sidebar/account-switcher-dropdown@2x.png b/static/images/sidebar/account-switcher-dropdown@2x.png
new file mode 100644
index 0000000000..244b2a3129
Binary files /dev/null and b/static/images/sidebar/account-switcher-dropdown@2x.png differ
diff --git a/static/images/sidebar/facebook-icon@2x.png b/static/images/sidebar/facebook-icon@2x.png
index ffd27de6cb..75f24fafbe 100644
Binary files a/static/images/sidebar/facebook-icon@2x.png and b/static/images/sidebar/facebook-icon@2x.png differ
diff --git a/static/images/sidebar/icon-phone@2x.png b/static/images/sidebar/icon-phone@2x.png
index da816e4c82..def4ae845a 100644
Binary files a/static/images/sidebar/icon-phone@2x.png and b/static/images/sidebar/icon-phone@2x.png differ
diff --git a/static/images/sidebar/linkedin-icon@2x.png b/static/images/sidebar/linkedin-icon@2x.png
index 539e8ab5af..ad4df0262c 100644
Binary files a/static/images/sidebar/linkedin-icon@2x.png and b/static/images/sidebar/linkedin-icon@2x.png differ
diff --git a/static/images/sidebar/sidebar-section-divider@2x.png b/static/images/sidebar/sidebar-section-divider@2x.png
new file mode 100644
index 0000000000..9653e93033
Binary files /dev/null and b/static/images/sidebar/sidebar-section-divider@2x.png differ
diff --git a/static/images/sidebar/twitter-icon@2x.png b/static/images/sidebar/twitter-icon@2x.png
index 5df62ca215..aeff33d751 100644
Binary files a/static/images/sidebar/twitter-icon@2x.png and b/static/images/sidebar/twitter-icon@2x.png differ
diff --git a/static/images/source-list/archive-selected@1x.png b/static/images/source-list/archive-selected@1x.png
deleted file mode 100644
index 5771d3f534..0000000000
Binary files a/static/images/source-list/archive-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/archive-selected@2x.png b/static/images/source-list/archive-selected@2x.png
deleted file mode 100644
index a9f4d792c1..0000000000
Binary files a/static/images/source-list/archive-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/archive@1x.png b/static/images/source-list/archive@1x.png
index baac23306f..9f90e66c46 100644
Binary files a/static/images/source-list/archive@1x.png and b/static/images/source-list/archive@1x.png differ
diff --git a/static/images/source-list/archive@2x.png b/static/images/source-list/archive@2x.png
index 7e7d550aae..accf75725e 100644
Binary files a/static/images/source-list/archive@2x.png and b/static/images/source-list/archive@2x.png differ
diff --git a/static/images/source-list/drafts-selected@1x.png b/static/images/source-list/drafts-selected@1x.png
deleted file mode 100644
index 3fce229d99..0000000000
Binary files a/static/images/source-list/drafts-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/drafts-selected@2x.png b/static/images/source-list/drafts-selected@2x.png
deleted file mode 100644
index ab27c6d3d9..0000000000
Binary files a/static/images/source-list/drafts-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/drafts@1x.png b/static/images/source-list/drafts@1x.png
index eca69e4151..6c33c9caa0 100644
Binary files a/static/images/source-list/drafts@1x.png and b/static/images/source-list/drafts@1x.png differ
diff --git a/static/images/source-list/drafts@2x.png b/static/images/source-list/drafts@2x.png
index 24154b28b4..783b9a8ae0 100644
Binary files a/static/images/source-list/drafts@2x.png and b/static/images/source-list/drafts@2x.png differ
diff --git a/static/images/source-list/folder-selected@1x.png b/static/images/source-list/folder-selected@1x.png
deleted file mode 100644
index 714092c382..0000000000
Binary files a/static/images/source-list/folder-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/folder-selected@2x.png b/static/images/source-list/folder-selected@2x.png
deleted file mode 100644
index 6469c857c4..0000000000
Binary files a/static/images/source-list/folder-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/folder@1x.png b/static/images/source-list/folder@1x.png
index ba9a03e3c6..ef5a0f1a02 100644
Binary files a/static/images/source-list/folder@1x.png and b/static/images/source-list/folder@1x.png differ
diff --git a/static/images/source-list/folder@2x.png b/static/images/source-list/folder@2x.png
index 0651bc3fde..85360dbb87 100644
Binary files a/static/images/source-list/folder@2x.png and b/static/images/source-list/folder@2x.png differ
diff --git a/static/images/source-list/icon-accounts-addnew@2x.png b/static/images/source-list/icon-accounts-addnew@2x.png
new file mode 100644
index 0000000000..c09b8ee4e6
Binary files /dev/null and b/static/images/source-list/icon-accounts-addnew@2x.png differ
diff --git a/static/images/source-list/important@1x.png b/static/images/source-list/important@1x.png
new file mode 100644
index 0000000000..79d03864a8
Binary files /dev/null and b/static/images/source-list/important@1x.png differ
diff --git a/static/images/source-list/important@2x.png b/static/images/source-list/important@2x.png
new file mode 100644
index 0000000000..47b1f1ce8f
Binary files /dev/null and b/static/images/source-list/important@2x.png differ
diff --git a/static/images/source-list/inbox-selected@1x.png b/static/images/source-list/inbox-selected@1x.png
deleted file mode 100644
index 0577f3aad4..0000000000
Binary files a/static/images/source-list/inbox-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/inbox-selected@2x.png b/static/images/source-list/inbox-selected@2x.png
deleted file mode 100644
index 0754bf1fb7..0000000000
Binary files a/static/images/source-list/inbox-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/inbox@1x.png b/static/images/source-list/inbox@1x.png
index 8621596ea5..11470a2960 100644
Binary files a/static/images/source-list/inbox@1x.png and b/static/images/source-list/inbox@1x.png differ
diff --git a/static/images/source-list/inbox@2x.png b/static/images/source-list/inbox@2x.png
index e844df49e4..1a0388e296 100644
Binary files a/static/images/source-list/inbox@2x.png and b/static/images/source-list/inbox@2x.png differ
diff --git a/static/images/source-list/junk@1x.png b/static/images/source-list/junk@1x.png
new file mode 100644
index 0000000000..052575ad84
Binary files /dev/null and b/static/images/source-list/junk@1x.png differ
diff --git a/static/images/source-list/junk@2x.png b/static/images/source-list/junk@2x.png
new file mode 100644
index 0000000000..aee9bcb162
Binary files /dev/null and b/static/images/source-list/junk@2x.png differ
diff --git a/static/images/source-list/plugins@1x.png b/static/images/source-list/plugins@1x.png
new file mode 100644
index 0000000000..677a9907fa
Binary files /dev/null and b/static/images/source-list/plugins@1x.png differ
diff --git a/static/images/source-list/plugins@2x.png b/static/images/source-list/plugins@2x.png
new file mode 100644
index 0000000000..b78801fa3c
Binary files /dev/null and b/static/images/source-list/plugins@2x.png differ
diff --git a/static/images/source-list/reminders@1x.png b/static/images/source-list/reminders@1x.png
new file mode 100644
index 0000000000..776fdddd85
Binary files /dev/null and b/static/images/source-list/reminders@1x.png differ
diff --git a/static/images/source-list/reminders@2x.png b/static/images/source-list/reminders@2x.png
new file mode 100644
index 0000000000..c24c74c798
Binary files /dev/null and b/static/images/source-list/reminders@2x.png differ
diff --git a/static/images/source-list/sent-selected@1x.png b/static/images/source-list/sent-selected@1x.png
deleted file mode 100644
index 8444bf725f..0000000000
Binary files a/static/images/source-list/sent-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/sent-selected@2x.png b/static/images/source-list/sent-selected@2x.png
deleted file mode 100644
index 2002e92f49..0000000000
Binary files a/static/images/source-list/sent-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/sent@1x.png b/static/images/source-list/sent@1x.png
index e89402b5e6..916aee7977 100644
Binary files a/static/images/source-list/sent@1x.png and b/static/images/source-list/sent@1x.png differ
diff --git a/static/images/source-list/sent@2x.png b/static/images/source-list/sent@2x.png
index e9cbc96cbd..7830dec6d7 100644
Binary files a/static/images/source-list/sent@2x.png and b/static/images/source-list/sent@2x.png differ
diff --git a/static/images/source-list/snooze@1x.png b/static/images/source-list/snooze@1x.png
new file mode 100644
index 0000000000..641ae78d28
Binary files /dev/null and b/static/images/source-list/snooze@1x.png differ
diff --git a/static/images/source-list/snooze@2x.png b/static/images/source-list/snooze@2x.png
new file mode 100644
index 0000000000..2ec7e51490
Binary files /dev/null and b/static/images/source-list/snooze@2x.png differ
diff --git a/static/images/source-list/spam@1x.png b/static/images/source-list/spam@1x.png
new file mode 100644
index 0000000000..052575ad84
Binary files /dev/null and b/static/images/source-list/spam@1x.png differ
diff --git a/static/images/source-list/spam@2x.png b/static/images/source-list/spam@2x.png
new file mode 100644
index 0000000000..aee9bcb162
Binary files /dev/null and b/static/images/source-list/spam@2x.png differ
diff --git a/static/images/source-list/starred@1x.png b/static/images/source-list/starred@1x.png
new file mode 100644
index 0000000000..11a63bf35b
Binary files /dev/null and b/static/images/source-list/starred@1x.png differ
diff --git a/static/images/source-list/starred@2x.png b/static/images/source-list/starred@2x.png
new file mode 100644
index 0000000000..b11871f53f
Binary files /dev/null and b/static/images/source-list/starred@2x.png differ
diff --git a/static/images/source-list/tag@1x.png b/static/images/source-list/tag@1x.png
new file mode 100644
index 0000000000..2470b0d641
Binary files /dev/null and b/static/images/source-list/tag@1x.png differ
diff --git a/static/images/source-list/tag@2x.png b/static/images/source-list/tag@2x.png
new file mode 100644
index 0000000000..028ed8b0cd
Binary files /dev/null and b/static/images/source-list/tag@2x.png differ
diff --git a/static/images/source-list/today@1x.png b/static/images/source-list/today@1x.png
new file mode 100644
index 0000000000..e7c8d0fee9
Binary files /dev/null and b/static/images/source-list/today@1x.png differ
diff --git a/static/images/source-list/today@2x.png b/static/images/source-list/today@2x.png
new file mode 100644
index 0000000000..1cbbcca817
Binary files /dev/null and b/static/images/source-list/today@2x.png differ
diff --git a/static/images/source-list/trash-selected@1x.png b/static/images/source-list/trash-selected@1x.png
deleted file mode 100644
index ad3cef520b..0000000000
Binary files a/static/images/source-list/trash-selected@1x.png and /dev/null differ
diff --git a/static/images/source-list/trash-selected@2x.png b/static/images/source-list/trash-selected@2x.png
deleted file mode 100644
index 108d6eb22a..0000000000
Binary files a/static/images/source-list/trash-selected@2x.png and /dev/null differ
diff --git a/static/images/source-list/trash@1x.png b/static/images/source-list/trash@1x.png
index b6bd2871d0..8e61a20b1e 100644
Binary files a/static/images/source-list/trash@1x.png and b/static/images/source-list/trash@1x.png differ
diff --git a/static/images/source-list/trash@2x.png b/static/images/source-list/trash@2x.png
index b84184a0be..906422e46f 100644
Binary files a/static/images/source-list/trash@2x.png and b/static/images/source-list/trash@2x.png differ
diff --git a/static/images/source-list/unread@1x.png b/static/images/source-list/unread@1x.png
new file mode 100644
index 0000000000..5f2aba876b
Binary files /dev/null and b/static/images/source-list/unread@1x.png differ
diff --git a/static/images/source-list/unread@2x.png b/static/images/source-list/unread@2x.png
new file mode 100644
index 0000000000..e5a8105a9f
Binary files /dev/null and b/static/images/source-list/unread@2x.png differ
diff --git a/static/images/splitpane/modeslider-bg@1x.png b/static/images/splitpane/modeslider-bg@1x.png
deleted file mode 100644
index a653608aed..0000000000
Binary files a/static/images/splitpane/modeslider-bg@1x.png and /dev/null differ
diff --git a/static/images/splitpane/modeslider-bg@2x.png b/static/images/splitpane/modeslider-bg@2x.png
deleted file mode 100644
index 028e260370..0000000000
Binary files a/static/images/splitpane/modeslider-bg@2x.png and /dev/null differ
diff --git a/static/images/splitpane/modeslider-knob@1x.png b/static/images/splitpane/modeslider-knob@1x.png
deleted file mode 100644
index ce2f26258f..0000000000
Binary files a/static/images/splitpane/modeslider-knob@1x.png and /dev/null differ
diff --git a/static/images/splitpane/modeslider-knob@2x.png b/static/images/splitpane/modeslider-knob@2x.png
deleted file mode 100644
index c1a327b2a9..0000000000
Binary files a/static/images/splitpane/modeslider-knob@2x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-listmode-active@1x.png b/static/images/splitpane/toolbar-icon-listmode-active@1x.png
deleted file mode 100644
index c660fceb10..0000000000
Binary files a/static/images/splitpane/toolbar-icon-listmode-active@1x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-listmode-active@2x.png b/static/images/splitpane/toolbar-icon-listmode-active@2x.png
deleted file mode 100644
index 4a7e371211..0000000000
Binary files a/static/images/splitpane/toolbar-icon-listmode-active@2x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-listmode@1x.png b/static/images/splitpane/toolbar-icon-listmode@1x.png
deleted file mode 100644
index 0e60f1a798..0000000000
Binary files a/static/images/splitpane/toolbar-icon-listmode@1x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-listmode@2x.png b/static/images/splitpane/toolbar-icon-listmode@2x.png
deleted file mode 100644
index dd9e2cd95c..0000000000
Binary files a/static/images/splitpane/toolbar-icon-listmode@2x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-splitpanes-active@1x.png b/static/images/splitpane/toolbar-icon-splitpanes-active@1x.png
deleted file mode 100644
index 1d9869d76a..0000000000
Binary files a/static/images/splitpane/toolbar-icon-splitpanes-active@1x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-splitpanes-active@2x.png b/static/images/splitpane/toolbar-icon-splitpanes-active@2x.png
deleted file mode 100644
index 8667aa7379..0000000000
Binary files a/static/images/splitpane/toolbar-icon-splitpanes-active@2x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-splitpanes@1x.png b/static/images/splitpane/toolbar-icon-splitpanes@1x.png
deleted file mode 100644
index 41ae4cf153..0000000000
Binary files a/static/images/splitpane/toolbar-icon-splitpanes@1x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-splitpanes@2x.png b/static/images/splitpane/toolbar-icon-splitpanes@2x.png
deleted file mode 100644
index 02f4b2633d..0000000000
Binary files a/static/images/splitpane/toolbar-icon-splitpanes@2x.png and /dev/null differ
diff --git a/static/images/splitpane/toolbar-icon-toggle-pane@2x.png b/static/images/splitpane/toolbar-icon-toggle-pane@2x.png
deleted file mode 100644
index 718e5cca96..0000000000
Binary files a/static/images/splitpane/toolbar-icon-toggle-pane@2x.png and /dev/null differ
diff --git a/static/images/swipe/icon-swipe-archive@2x.png b/static/images/swipe/icon-swipe-archive@2x.png
new file mode 100644
index 0000000000..d684a1576d
Binary files /dev/null and b/static/images/swipe/icon-swipe-archive@2x.png differ
diff --git a/static/images/swipe/icon-swipe-snooze@2x.png b/static/images/swipe/icon-swipe-snooze@2x.png
new file mode 100644
index 0000000000..0a24555bed
Binary files /dev/null and b/static/images/swipe/icon-swipe-snooze@2x.png differ
diff --git a/static/images/swipe/icon-swipe-trash@2x.png b/static/images/swipe/icon-swipe-trash@2x.png
new file mode 100644
index 0000000000..2b48ecc86c
Binary files /dev/null and b/static/images/swipe/icon-swipe-trash@2x.png differ
diff --git a/static/images/thread-list-quick-actions/ic-quick-button-archive@2x.png b/static/images/thread-list-quick-actions/ic-quick-button-archive@2x.png
new file mode 100644
index 0000000000..0dae2bf925
Binary files /dev/null and b/static/images/thread-list-quick-actions/ic-quick-button-archive@2x.png differ
diff --git a/static/images/thread-list-quick-actions/ic-quick-button-trash@2x.png b/static/images/thread-list-quick-actions/ic-quick-button-trash@2x.png
new file mode 100644
index 0000000000..8fb85cca27
Binary files /dev/null and b/static/images/thread-list-quick-actions/ic-quick-button-trash@2x.png differ
diff --git a/static/images/thread-list-quick-actions/ic-quickaction-snooze@2x.png b/static/images/thread-list-quick-actions/ic-quickaction-snooze@2x.png
new file mode 100644
index 0000000000..fd6556f838
Binary files /dev/null and b/static/images/thread-list-quick-actions/ic-quickaction-snooze@2x.png differ
diff --git a/static/images/thread-list/checkbox-checkmark-activerow@2x.png b/static/images/thread-list/checkbox-checkmark-activerow@2x.png
index 4e42403380..344cfe0a9c 100644
Binary files a/static/images/thread-list/checkbox-checkmark-activerow@2x.png and b/static/images/thread-list/checkbox-checkmark-activerow@2x.png differ
diff --git a/static/images/thread-list/checkbox-checkmark@2x.png b/static/images/thread-list/checkbox-checkmark@2x.png
index 8edd343b08..81a1573da0 100644
Binary files a/static/images/thread-list/checkbox-checkmark@2x.png and b/static/images/thread-list/checkbox-checkmark@2x.png differ
diff --git a/static/images/thread-list/ic-timestamp-reminder@2x.png b/static/images/thread-list/ic-timestamp-reminder@2x.png
new file mode 100644
index 0000000000..7dd12fcb7b
Binary files /dev/null and b/static/images/thread-list/ic-timestamp-reminder@2x.png differ
diff --git a/static/images/thread-list/ic-timestamp-snooze@2x.png b/static/images/thread-list/ic-timestamp-snooze@2x.png
new file mode 100644
index 0000000000..c7dcaf6f7e
Binary files /dev/null and b/static/images/thread-list/ic-timestamp-snooze@2x.png differ
diff --git a/static/images/thread-list/icon-attachment-@1x.png b/static/images/thread-list/icon-attachment-@1x.png
index 273c98de10..87d7d56c5c 100644
Binary files a/static/images/thread-list/icon-attachment-@1x.png and b/static/images/thread-list/icon-attachment-@1x.png differ
diff --git a/static/images/thread-list/icon-attachment-@2x.png b/static/images/thread-list/icon-attachment-@2x.png
index 49ad9fa557..848a08c855 100644
Binary files a/static/images/thread-list/icon-attachment-@2x.png and b/static/images/thread-list/icon-attachment-@2x.png differ
diff --git a/static/images/thread-list/icon-draft-pencil@2x.png b/static/images/thread-list/icon-draft-pencil@2x.png
new file mode 100644
index 0000000000..5e08821777
Binary files /dev/null and b/static/images/thread-list/icon-draft-pencil@2x.png differ
diff --git a/static/images/thread-list/icon-forwarded-@1x.png b/static/images/thread-list/icon-forwarded-@1x.png
index c41cafddcb..ab09ca5aa1 100644
Binary files a/static/images/thread-list/icon-forwarded-@1x.png and b/static/images/thread-list/icon-forwarded-@1x.png differ
diff --git a/static/images/thread-list/icon-forwarded-@2x.png b/static/images/thread-list/icon-forwarded-@2x.png
index 7035241be2..0dd9e50b27 100644
Binary files a/static/images/thread-list/icon-forwarded-@2x.png and b/static/images/thread-list/icon-forwarded-@2x.png differ
diff --git a/static/images/thread-list/icon-reminder@1x.png b/static/images/thread-list/icon-reminder@1x.png
new file mode 100644
index 0000000000..704903c9e3
Binary files /dev/null and b/static/images/thread-list/icon-reminder@1x.png differ
diff --git a/static/images/thread-list/icon-reminder@2x.png b/static/images/thread-list/icon-reminder@2x.png
new file mode 100644
index 0000000000..2a820142ec
Binary files /dev/null and b/static/images/thread-list/icon-reminder@2x.png differ
diff --git a/static/images/thread-list/icon-replied-@1x.png b/static/images/thread-list/icon-replied-@1x.png
index 26820616c1..502cb6bb2b 100644
Binary files a/static/images/thread-list/icon-replied-@1x.png and b/static/images/thread-list/icon-replied-@1x.png differ
diff --git a/static/images/thread-list/icon-replied-@2x.png b/static/images/thread-list/icon-replied-@2x.png
index 3806c7a361..d8699ebf9c 100644
Binary files a/static/images/thread-list/icon-replied-@2x.png and b/static/images/thread-list/icon-replied-@2x.png differ
diff --git a/static/images/thread-list/icon-snoozed@1x.png b/static/images/thread-list/icon-snoozed@1x.png
new file mode 100644
index 0000000000..bdf87e44f0
Binary files /dev/null and b/static/images/thread-list/icon-snoozed@1x.png differ
diff --git a/static/images/thread-list/icon-snoozed@2x.png b/static/images/thread-list/icon-snoozed@2x.png
new file mode 100644
index 0000000000..55fc1b51b5
Binary files /dev/null and b/static/images/thread-list/icon-snoozed@2x.png differ
diff --git a/static/images/thread-list/icon-star-@2x.png b/static/images/thread-list/icon-star-@2x.png
new file mode 100644
index 0000000000..81f0a0c6f2
Binary files /dev/null and b/static/images/thread-list/icon-star-@2x.png differ
diff --git a/static/images/thread-list/icon-star-action-hover-@2x.png b/static/images/thread-list/icon-star-action-hover-@2x.png
new file mode 100644
index 0000000000..e95a8cd9ac
Binary files /dev/null and b/static/images/thread-list/icon-star-action-hover-@2x.png differ
diff --git a/static/images/thread-list/icon-star-hover-@2x.png b/static/images/thread-list/icon-star-hover-@2x.png
new file mode 100644
index 0000000000..5a6b2ab549
Binary files /dev/null and b/static/images/thread-list/icon-star-hover-@2x.png differ
diff --git a/static/images/thread-list/icon-thread-disclosure@2x.png b/static/images/thread-list/icon-thread-disclosure@2x.png
new file mode 100644
index 0000000000..2d3281cfec
Binary files /dev/null and b/static/images/thread-list/icon-thread-disclosure@2x.png differ
diff --git a/static/images/thread-list/icon-thread-reply@2x.png b/static/images/thread-list/icon-thread-reply@2x.png
new file mode 100644
index 0000000000..d670cb1368
Binary files /dev/null and b/static/images/thread-list/icon-thread-reply@2x.png differ
diff --git a/static/images/thread-list/icon-unread-@1x.png b/static/images/thread-list/icon-unread-@1x.png
index 9388cfe6c6..7dcc4d60a4 100644
Binary files a/static/images/thread-list/icon-unread-@1x.png and b/static/images/thread-list/icon-unread-@1x.png differ
diff --git a/static/images/thread-list/icon-unread-@2x.png b/static/images/thread-list/icon-unread-@2x.png
index 3e3c375b7c..082022a207 100644
Binary files a/static/images/thread-list/icon-unread-@2x.png and b/static/images/thread-list/icon-unread-@2x.png differ
diff --git a/static/images/thread-list/in-label-bell@1x.png b/static/images/thread-list/in-label-bell@1x.png
new file mode 100644
index 0000000000..04d5505d54
Binary files /dev/null and b/static/images/thread-list/in-label-bell@1x.png differ
diff --git a/static/images/thread-list/in-label-bell@2x.png b/static/images/thread-list/in-label-bell@2x.png
new file mode 100644
index 0000000000..93fbcf7b3a
Binary files /dev/null and b/static/images/thread-list/in-label-bell@2x.png differ
diff --git a/static/images/thread-list/undo-icon@2x.png b/static/images/thread-list/undo-icon@2x.png
new file mode 100644
index 0000000000..437cfd0691
Binary files /dev/null and b/static/images/thread-list/undo-icon@2x.png differ
diff --git a/static/images/toolbar/ic-toolbar-native-reminder@1x.png b/static/images/toolbar/ic-toolbar-native-reminder@1x.png
new file mode 100644
index 0000000000..7794e167a7
Binary files /dev/null and b/static/images/toolbar/ic-toolbar-native-reminder@1x.png differ
diff --git a/static/images/toolbar/ic-toolbar-native-reminder@2x.png b/static/images/toolbar/ic-toolbar-native-reminder@2x.png
new file mode 100644
index 0000000000..59a67bb9c8
Binary files /dev/null and b/static/images/toolbar/ic-toolbar-native-reminder@2x.png differ
diff --git a/static/images/toolbar/ic-toolbar-native-share@1x.png b/static/images/toolbar/ic-toolbar-native-share@1x.png
new file mode 100644
index 0000000000..271b9bfec1
Binary files /dev/null and b/static/images/toolbar/ic-toolbar-native-share@1x.png differ
diff --git a/static/images/toolbar/ic-toolbar-native-share@2x.png b/static/images/toolbar/ic-toolbar-native-share@2x.png
new file mode 100644
index 0000000000..57f6f6424f
Binary files /dev/null and b/static/images/toolbar/ic-toolbar-native-share@2x.png differ
diff --git a/static/images/toolbar/searchloupe@2x.png b/static/images/toolbar/searchloupe@2x.png
index d9f68ed545..63009f7a7f 100644
Binary files a/static/images/toolbar/searchloupe@2x.png and b/static/images/toolbar/searchloupe@2x.png differ
diff --git a/static/images/toolbar/toolbar-archive@1x.png b/static/images/toolbar/toolbar-archive@1x.png
new file mode 100644
index 0000000000..bf64a8732d
Binary files /dev/null and b/static/images/toolbar/toolbar-archive@1x.png differ
diff --git a/static/images/toolbar/toolbar-archive@2x.png b/static/images/toolbar/toolbar-archive@2x.png
index e4f3bba314..21660864b0 100644
Binary files a/static/images/toolbar/toolbar-archive@2x.png and b/static/images/toolbar/toolbar-archive@2x.png differ
diff --git a/static/images/toolbar/toolbar-attach@2x.png b/static/images/toolbar/toolbar-attach@2x.png
index c7c639d7e5..1a0387f28f 100644
Binary files a/static/images/toolbar/toolbar-attach@2x.png and b/static/images/toolbar/toolbar-attach@2x.png differ
diff --git a/static/images/toolbar/toolbar-chevron@2x.png b/static/images/toolbar/toolbar-chevron@2x.png
index aebf30b053..7aab42b70d 100644
Binary files a/static/images/toolbar/toolbar-chevron@2x.png and b/static/images/toolbar/toolbar-chevron@2x.png differ
diff --git a/static/images/toolbar/toolbar-compose@1x.png b/static/images/toolbar/toolbar-compose@1x.png
new file mode 100644
index 0000000000..42cd6d4827
Binary files /dev/null and b/static/images/toolbar/toolbar-compose@1x.png differ
diff --git a/static/images/toolbar/toolbar-compose@2x.png b/static/images/toolbar/toolbar-compose@2x.png
index 5d2085c00b..dc5b3027d6 100644
Binary files a/static/images/toolbar/toolbar-compose@2x.png and b/static/images/toolbar/toolbar-compose@2x.png differ
diff --git a/static/images/toolbar/toolbar-folder@2x.png b/static/images/toolbar/toolbar-folder@2x.png
index 33838abeb3..51717277e0 100644
Binary files a/static/images/toolbar/toolbar-folder@2x.png and b/static/images/toolbar/toolbar-folder@2x.png differ
diff --git a/static/images/toolbar/toolbar-forward@2x.png b/static/images/toolbar/toolbar-forward@2x.png
index b8b1b383b4..ff082a131f 100644
Binary files a/static/images/toolbar/toolbar-forward@2x.png and b/static/images/toolbar/toolbar-forward@2x.png differ
diff --git a/static/images/toolbar/toolbar-icon-toggle-pane@1x.png b/static/images/toolbar/toolbar-icon-toggle-pane@1x.png
new file mode 100644
index 0000000000..f246fb989e
Binary files /dev/null and b/static/images/toolbar/toolbar-icon-toggle-pane@1x.png differ
diff --git a/static/images/toolbar/toolbar-icon-toggle-pane@2x.png b/static/images/toolbar/toolbar-icon-toggle-pane@2x.png
new file mode 100644
index 0000000000..44080c16f7
Binary files /dev/null and b/static/images/toolbar/toolbar-icon-toggle-pane@2x.png differ
diff --git a/static/images/toolbar/toolbar-markasread@1x.png b/static/images/toolbar/toolbar-markasread@1x.png
new file mode 100644
index 0000000000..1378c44e9e
Binary files /dev/null and b/static/images/toolbar/toolbar-markasread@1x.png differ
diff --git a/static/images/toolbar/toolbar-markasread@2x.png b/static/images/toolbar/toolbar-markasread@2x.png
new file mode 100644
index 0000000000..303e9c2516
Binary files /dev/null and b/static/images/toolbar/toolbar-markasread@2x.png differ
diff --git a/static/images/toolbar/toolbar-markasunread@1x.png b/static/images/toolbar/toolbar-markasunread@1x.png
new file mode 100644
index 0000000000..3b4180dd79
Binary files /dev/null and b/static/images/toolbar/toolbar-markasunread@1x.png differ
diff --git a/static/images/toolbar/toolbar-markasunread@2x.png b/static/images/toolbar/toolbar-markasunread@2x.png
new file mode 100644
index 0000000000..703157525d
Binary files /dev/null and b/static/images/toolbar/toolbar-markasunread@2x.png differ
diff --git a/static/images/toolbar/toolbar-more@2x.png b/static/images/toolbar/toolbar-more@2x.png
index 955996cb4c..75f6e93836 100644
Binary files a/static/images/toolbar/toolbar-more@2x.png and b/static/images/toolbar/toolbar-more@2x.png differ
diff --git a/static/images/toolbar/toolbar-movetofolder@1x.png b/static/images/toolbar/toolbar-movetofolder@1x.png
new file mode 100644
index 0000000000..cc63b8f391
Binary files /dev/null and b/static/images/toolbar/toolbar-movetofolder@1x.png differ
diff --git a/static/images/toolbar/toolbar-movetofolder@2x.png b/static/images/toolbar/toolbar-movetofolder@2x.png
new file mode 100644
index 0000000000..e0a1ea723f
Binary files /dev/null and b/static/images/toolbar/toolbar-movetofolder@2x.png differ
diff --git a/static/images/toolbar/toolbar-not-spam@1x.png b/static/images/toolbar/toolbar-not-spam@1x.png
new file mode 100644
index 0000000000..7ace079382
Binary files /dev/null and b/static/images/toolbar/toolbar-not-spam@1x.png differ
diff --git a/static/images/toolbar/toolbar-not-spam@2x.png b/static/images/toolbar/toolbar-not-spam@2x.png
new file mode 100644
index 0000000000..d47d9847e3
Binary files /dev/null and b/static/images/toolbar/toolbar-not-spam@2x.png differ
diff --git a/static/images/toolbar/toolbar-person-sidebar@1x.png b/static/images/toolbar/toolbar-person-sidebar@1x.png
new file mode 100644
index 0000000000..796e6343e8
Binary files /dev/null and b/static/images/toolbar/toolbar-person-sidebar@1x.png differ
diff --git a/static/images/toolbar/toolbar-person-sidebar@2x.png b/static/images/toolbar/toolbar-person-sidebar@2x.png
new file mode 100644
index 0000000000..65ec8838f7
Binary files /dev/null and b/static/images/toolbar/toolbar-person-sidebar@2x.png differ
diff --git a/static/images/toolbar/toolbar-popout@2x.png b/static/images/toolbar/toolbar-popout@2x.png
index 48997accd4..99abe88fef 100644
Binary files a/static/images/toolbar/toolbar-popout@2x.png and b/static/images/toolbar/toolbar-popout@2x.png differ
diff --git a/static/images/toolbar/toolbar-reply-all@2x.png b/static/images/toolbar/toolbar-reply-all@2x.png
index 62e8763274..c96c8d11a9 100644
Binary files a/static/images/toolbar/toolbar-reply-all@2x.png and b/static/images/toolbar/toolbar-reply-all@2x.png differ
diff --git a/static/images/toolbar/toolbar-reply@2x.png b/static/images/toolbar/toolbar-reply@2x.png
index 4cb1d8691e..18a000381a 100644
Binary files a/static/images/toolbar/toolbar-reply@2x.png and b/static/images/toolbar/toolbar-reply@2x.png differ
diff --git a/static/images/toolbar/toolbar-send@2x.png b/static/images/toolbar/toolbar-send@2x.png
index 9d04450b63..76e2da9ef0 100644
Binary files a/static/images/toolbar/toolbar-send@2x.png and b/static/images/toolbar/toolbar-send@2x.png differ
diff --git a/static/images/toolbar/toolbar-snooze@1x.png b/static/images/toolbar/toolbar-snooze@1x.png
new file mode 100644
index 0000000000..6e5f2c3126
Binary files /dev/null and b/static/images/toolbar/toolbar-snooze@1x.png differ
diff --git a/static/images/toolbar/toolbar-snooze@2x.png b/static/images/toolbar/toolbar-snooze@2x.png
new file mode 100644
index 0000000000..b3ec743204
Binary files /dev/null and b/static/images/toolbar/toolbar-snooze@2x.png differ
diff --git a/static/images/toolbar/toolbar-spam@1x.png b/static/images/toolbar/toolbar-spam@1x.png
new file mode 100644
index 0000000000..981bec6689
Binary files /dev/null and b/static/images/toolbar/toolbar-spam@1x.png differ
diff --git a/static/images/toolbar/toolbar-spam@2x.png b/static/images/toolbar/toolbar-spam@2x.png
new file mode 100644
index 0000000000..194dbde284
Binary files /dev/null and b/static/images/toolbar/toolbar-spam@2x.png differ
diff --git a/static/images/toolbar/toolbar-star-selected@1x.png b/static/images/toolbar/toolbar-star-selected@1x.png
new file mode 100644
index 0000000000..2b5f26413e
Binary files /dev/null and b/static/images/toolbar/toolbar-star-selected@1x.png differ
diff --git a/static/images/toolbar/toolbar-star-selected@2x.png b/static/images/toolbar/toolbar-star-selected@2x.png
new file mode 100644
index 0000000000..98d0a038e7
Binary files /dev/null and b/static/images/toolbar/toolbar-star-selected@2x.png differ
diff --git a/static/images/toolbar/toolbar-star@1x.png b/static/images/toolbar/toolbar-star@1x.png
new file mode 100644
index 0000000000..36f51ccea2
Binary files /dev/null and b/static/images/toolbar/toolbar-star@1x.png differ
diff --git a/static/images/toolbar/toolbar-star@2x.png b/static/images/toolbar/toolbar-star@2x.png
new file mode 100644
index 0000000000..c48ba0e58e
Binary files /dev/null and b/static/images/toolbar/toolbar-star@2x.png differ
diff --git a/static/images/toolbar/toolbar-style@2x.png b/static/images/toolbar/toolbar-style@2x.png
index 685fd4aae9..ee097e88f0 100644
Binary files a/static/images/toolbar/toolbar-style@2x.png and b/static/images/toolbar/toolbar-style@2x.png differ
diff --git a/static/images/toolbar/toolbar-tag@1x.png b/static/images/toolbar/toolbar-tag@1x.png
new file mode 100644
index 0000000000..6cf8fbd97d
Binary files /dev/null and b/static/images/toolbar/toolbar-tag@1x.png differ
diff --git a/static/images/toolbar/toolbar-tag@2x.png b/static/images/toolbar/toolbar-tag@2x.png
new file mode 100644
index 0000000000..603fe4171f
Binary files /dev/null and b/static/images/toolbar/toolbar-tag@2x.png differ
diff --git a/static/images/toolbar/toolbar-templates@2x.png b/static/images/toolbar/toolbar-templates@2x.png
index e33ba77c2b..6780a0a4a2 100644
Binary files a/static/images/toolbar/toolbar-templates@2x.png and b/static/images/toolbar/toolbar-templates@2x.png differ
diff --git a/static/images/toolbar/toolbar-trash@1x.png b/static/images/toolbar/toolbar-trash@1x.png
new file mode 100644
index 0000000000..f097815607
Binary files /dev/null and b/static/images/toolbar/toolbar-trash@1x.png differ
diff --git a/static/images/toolbar/toolbar-trash@2x.png b/static/images/toolbar/toolbar-trash@2x.png
index 0b6686974b..c30eec7065 100644
Binary files a/static/images/toolbar/toolbar-trash@2x.png and b/static/images/toolbar/toolbar-trash@2x.png differ
diff --git a/static/images/tooltip/tooltip-bg-pointer-shadow@2x.png b/static/images/tooltip/tooltip-bg-pointer-shadow@2x.png
new file mode 100644
index 0000000000..2bba20b293
Binary files /dev/null and b/static/images/tooltip/tooltip-bg-pointer-shadow@2x.png differ
diff --git a/static/images/tooltip/tooltip-bg-pointer@2x.png b/static/images/tooltip/tooltip-bg-pointer@2x.png
index 2dce92f10a..39402ff3d4 100644
Binary files a/static/images/tooltip/tooltip-bg-pointer@2x.png and b/static/images/tooltip/tooltip-bg-pointer@2x.png differ
diff --git a/static/index.html b/static/index.html
index 531b3867ab..d405a5b580 100644
--- a/static/index.html
+++ b/static/index.html
@@ -1,12 +1,31 @@
 
 
 
-  
+  Nylas Mail
 
-  
+  
+
+  
 
   
 
 
+  
+
+
+ +
+
diff --git a/static/index.js b/static/index.js index 4bf95d5505..5411da416f 100644 --- a/static/index.js +++ b/static/index.js @@ -1,17 +1,77 @@ -// This is to prevent React from displaying an annoying message about -// installing their dev tools. The React dev tools put a variable on the -// global scope. We need to do it here before React loads. -window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = {} - -function registerRuntimeTranspilers() { - // This sets require.extensions['.coffee']. - require('coffee-script').register(); - require('coffee-react/register'); - - // This redefines require.extensions['.js']. - require('../src/6to5').register(); +window.eval = global.eval = function() { + throw new Error("Sorry, N1 does not support window.eval() for security reasons."); } +var util = require('util') +var path = require('path'); +var electron = require('electron'); +var remote = electron.remote; + +console.inspect = function consoleInspect(val) { + console.log(util.inspect(val, true, depth=7, colorize=true)); +} + +function setLoadTime (loadTime) { + if (global.NylasEnv) { + global.NylasEnv.loadTime = loadTime; + if (NylasEnv.inSpecMode()) return; + console.log('Window load time: ' + global.NylasEnv.getWindowLoadTime() + 'ms') + } +} + +function handleSetupError (error) { + var currentWindow = remote.getCurrentWindow() + currentWindow.setSize(800, 600) + currentWindow.center() + currentWindow.show() + currentWindow.openDevTools() + console.error(error.stack || error) +} + +function copyEnvFromMainProcess() { + var _ = require('underscore'); + var remote = require('electron').remote; + var newEnv = _.extend({}, process.env, remote.process.env); + process.env = newEnv; +} + +function setupWindow (loadSettings) { + if (process.platform === 'linux') { + // This will properly inherit process.env from the main process, which it + // doesn't do by default on Linux. See: + // https://github.com/atom/electron/issues/3306 + copyEnvFromMainProcess(); + } + + var CompileCache = require('../src/compile-cache') + CompileCache.setHomeDirectory(loadSettings.configDirPath) + + var ModuleCache = require('../src/module-cache') + ModuleCache.register(loadSettings) + ModuleCache.add(loadSettings.resourcePath) + + // Start the crash reporter before anything else. + // require('crash-reporter').start({ + // productName: 'N1', + // companyName: 'Nylas', + // // By explicitly passing the app version here, we could save the call + // // of "require('electron').remote.app.getVersion()". + // extra: {_version: loadSettings.appVersion} + // }) + + setupVmCompatibility() + + require(loadSettings.bootstrapScript) +} + +function setupVmCompatibility () { + var vm = require('vm') + if (!vm.Script.createContext) { + vm.Script.createContext = vm.createContext + } +} + + window.onload = function() { try { var startTime = Date.now(); @@ -32,49 +92,10 @@ window.onload = function() { // Normalize to make sure drive letter case is consistent on Windows process.resourcesPath = path.normalize(process.resourcesPath); - var devMode = loadSettings.devMode || !loadSettings.resourcePath.startsWith(process.resourcesPath + path.sep); - - // Require before the module cache in dev mode - if (devMode) { - registerRuntimeTranspilers(); - } - - ModuleCache = require('../src/module-cache'); - ModuleCache.register(loadSettings); - ModuleCache.add(loadSettings.resourcePath); - - // Start the crash reporter before anything else. - require('crash-reporter').start({ - productName: 'Atom', - companyName: 'GitHub', - // By explicitly passing the app version here, we could save the call - // of "require('remote').require('app').getVersion()". - extra: {_version: loadSettings.appVersion} - }); - - require('vm-compatibility-layer'); - - if (!devMode) { - registerRuntimeTranspilers(); - } - - require('../src/coffee-cache').register(); - - require(loadSettings.bootstrapScript); - require('ipc').sendChannel('window-command', 'window:loaded'); - - if (global.atom) { - global.atom.loadTime = Date.now() - startTime; - console.log('Window load time: ' + global.atom.getWindowLoadTime() + 'ms'); - } + setupWindow(loadSettings) + setLoadTime(Date.now() - startTime) } catch (error) { - var currentWindow = require('remote').getCurrentWindow(); - currentWindow.setSize(800, 600); - currentWindow.center(); - currentWindow.show(); - currentWindow.openDevTools(); - console.error(error.stack || error); - console.error(error.message, error); + handleSetupError(error) } } diff --git a/static/index.less b/static/index.less index 264e6b0f57..c118bc3ad6 100644 --- a/static/index.less +++ b/static/index.less @@ -8,17 +8,43 @@ @import "type"; @import "inputs"; @import "buttons"; +@import "dropdowns"; @import "workspace"; @import "resizable"; @import "selection"; @import "utilities"; -@import "components/popover"; @import "components/menu"; +@import "components/switch"; @import "components/tokenizing-text-field"; @import "components/extra"; @import "components/list-tabular"; +@import "components/disclosure-triangle"; +@import "components/button-dropdown"; +@import "components/scroll-region"; @import "components/spinner"; @import "components/generated-form"; -@import "components/empty-state"; @import "components/unsafe"; +@import "components/key-commands-region"; +@import "components/contenteditable"; +@import "components/editable-list"; +@import "components/outline-view"; +@import "components/fixed-popover"; +@import "components/date-picker-popover"; +@import "components/modal"; +@import "components/date-input"; +@import "components/nylas-calendar"; +@import "components/empty-list-state"; +@import "components/syncing-list-state"; +@import "components/date-picker"; +@import "components/time-picker"; +@import "components/table"; +@import "components/editable-table"; +@import "components/multiselect-dropdown"; +@import "components/tutorial-overlay"; +@import "components/toast"; +@import "components/undo-toast"; +@import "components/attachment-items"; +@import "components/search-bar"; +@import "components/code-snippet"; +@import "components/feature-used-up-modal"; diff --git a/static/inputs.less b/static/inputs.less index 2b6847271e..1e168d6f7b 100644 --- a/static/inputs.less +++ b/static/inputs.less @@ -2,22 +2,78 @@ @import "ui-mixins"; input[type="text"], -input[type="email"] { +input[type="email"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="month"], +input[type="number"], +input[type="password"], +input[type="range"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"] { width: 100%; padding-left: @padding-xs-horizontal; padding-right: @padding-xs-horizontal; - font-size: @font-size-base; line-height: @line-height-computed; font-weight:400; + background: @input-bg; + color: @text-color; - &.input-bordered { - border-radius: @border-radius-base; - border: 1px solid @input-border; + border-radius: @border-radius-base; + border: 1px solid @input-border-color; + + &:disabled { + background: rgba(0,0,0,0.02); + opacity: 0.7; + } +} + +.search-bar .menu .header-container input, +textarea, +input[type="text"], +input[type="email"], +input[type="date"], +input[type="datetime"], +input[type="datetime-local"], +input[type="month"], +input[type="number"], +input[type="password"], +input[type="range"], +input[type="search"], +input[type="tel"], +input[type="time"], +input[type="url"] { + &:focus { + border: 1px solid @accent-primary; + box-shadow: 0 0 1.5px @accent-primary; } } -input[type="text"]:focus, -input[type="email"]:focus, { - &.input-bordered { - box-shadow: 0 0 3px @accent-primary; + +body.platform-win32 { + input[type="text"], + input[type="email"], + input[type="date"], + input[type="datetime"], + input[type="datetime-local"], + input[type="month"], + input[type="number"], + input[type="password"], + input[type="range"], + input[type="search"], + input[type="tel"], + input[type="time"], + input[type="url"] { + border: 0; + border-radius: 0; + box-shadow: 0 0 0 2px @input-border-color; + + &:focus { + border: 0; + border-radius: 0; + box-shadow: 0 0 0 2px darken(@input-border-color, 20%); + } } -} \ No newline at end of file +} diff --git a/static/jasmine.less b/static/jasmine.less index 655834238c..b0ca65a783 100644 --- a/static/jasmine.less +++ b/static/jasmine.less @@ -14,6 +14,10 @@ body { line-height: 1.6em; color: #333; + .plain-text-output { + display: none; + } + .list-unstyled { list-style: none; } @@ -143,6 +147,8 @@ body { font-weight: bold; color: #d9534f; padding: 5px 0 5px 0; + -webkit-user-select: text; + user-select: text; } .result-message.deprecation-message { diff --git a/static/mixins/background-variant.less b/static/mixins/background-variant.less index 286ec336f5..556e490d45 100644 --- a/static/mixins/background-variant.less +++ b/static/mixins/background-variant.less @@ -5,4 +5,4 @@ a&:hover { background-color: darken(@color, 10%); } -} \ No newline at end of file +} diff --git a/static/mixins/common-ui-elements.less b/static/mixins/common-ui-elements.less index 97f95dfec1..d44d74c813 100644 --- a/static/mixins/common-ui-elements.less +++ b/static/mixins/common-ui-elements.less @@ -5,10 +5,18 @@ // A box to hold counts of things (like number of items in a tag, or // number of messages in a thread) .item-count-box { + min-width: 15px; + height: 15px; + text-align: center; display: inline; - font-size: @font-size-smaller; - padding: @padding-xs-vertical @padding-xs-horizontal @padding-xs-vertical @padding-xs-horizontal; - margin-top: floor(@line-height-large - @line-height-small)/2; - line-height: @line-height-small; + font-size: @font-size-tiny; + padding: 0 0.286em 0 0.286em; + line-height: 15px; border-radius: @border-radius-small; + align-self: center; +} +body.platform-win32 { + .item-count-box { + border-radius: 0; + } } diff --git a/static/mixins/text-emphasis.less b/static/mixins/text-emphasis.less index 4c9b0b151c..0868ef9f2c 100644 --- a/static/mixins/text-emphasis.less +++ b/static/mixins/text-emphasis.less @@ -5,4 +5,4 @@ a&:hover { color: darken(@color, 10%); } -} \ No newline at end of file +} diff --git a/static/mixins/windows.less b/static/mixins/windows.less new file mode 100644 index 0000000000..acec0f421d --- /dev/null +++ b/static/mixins/windows.less @@ -0,0 +1,14 @@ +@import "ui-variables"; + +.windows-btn-bg { + transition: background 300ms, box-shadow 300ms; + background: transparent; + border-radius: 0; + &:hover { + background: fade(@border-color-divider, 80%); + } +} +.windows-btn-border { + border: 0; + box-shadow: 0 0 0 2px fade(@border-color-divider, 80%); +} diff --git a/static/normalize.less b/static/normalize.less index 869336bbb2..2bfc9b0de2 100644 --- a/static/normalize.less +++ b/static/normalize.less @@ -302,4 +302,4 @@ table { td, th { padding: 0; -} \ No newline at end of file +} diff --git a/static/package-template/README.md b/static/package-template/README.md new file mode 100644 index 0000000000..9b93eb9db7 --- /dev/null +++ b/static/package-template/README.md @@ -0,0 +1,4 @@ + +## My Package + +A sample package for N1. It demonstrates how to add components to the composer's action bar and the message sidebar. Enjoy! diff --git a/static/package-template/lib/main.es6 b/static/package-template/lib/main.es6 new file mode 100644 index 0000000000..4ca1b3f686 --- /dev/null +++ b/static/package-template/lib/main.es6 @@ -0,0 +1,33 @@ +import {ComponentRegistry} from 'nylas-exports'; + +import MyComposerButton from './my-composer-button'; +import MyMessageSidebar from './my-message-sidebar'; + +// Activate is called when the package is loaded. If your package previously +// saved state using `serialize` it is provided. +// +export function activate() { + ComponentRegistry.register(MyComposerButton, { + role: 'Composer:ActionButton', + }); + ComponentRegistry.register(MyMessageSidebar, { + role: 'MessageListSidebar:ContactCard', + }); +} + +// Serialize is called when your package is about to be unmounted. +// You can return a state object that will be passed back to your package +// when it is re-activated. +// +export function serialize() { +} + +// This **optional** method is called when the window is shutting down, +// or when your package is being updated or disabled. If your package is +// watching any files, holding external resources, providing commands or +// subscribing to events, release them here. +// +export function deactivate() { + ComponentRegistry.unregister(MyComposerButton); + ComponentRegistry.unregister(MyMessageSidebar); +} diff --git a/static/package-template/lib/my-composer-button.jsx b/static/package-template/lib/my-composer-button.jsx new file mode 100644 index 0000000000..62551d9b02 --- /dev/null +++ b/static/package-template/lib/my-composer-button.jsx @@ -0,0 +1,55 @@ +import {React} from 'nylas-exports'; + +export default class MyComposerButton extends React.Component { + + // Note: You should assign a new displayName to avoid naming + // conflicts when injecting your item + static displayName = 'MyComposerButton'; + + // When you register as a composer button, you receive a + // reference to the draft, and you can look it up to perform + // actions and retrieve data. + static propTypes = { + draft: React.PropTypes.object.isRequired, + session: React.PropTypes.object.isRequired, + }; + + shouldComponentUpdate(nextProps) { + // Our render method doesn't use the provided `draft`, and the draft changes + // constantly (on every keystroke!) `shouldComponentUpdate` helps keep N1 fast. + return nextProps.session !== this.props.session; + } + + _onClick = () => { + const {session, draft} = this.props; + + // To retrieve information about the draft, we fetch the current editing + // session from the draft store. We can access attributes of the draft + // and add changes to the session which will be appear immediately. + const newSubject = `${draft.subject} - It Worked!`; + + const dialog = this._getDialog(); + dialog.showMessageBox({ + title: 'Here we go...', + detail: `Adjusting the subject line To "${newSubject}"`, + buttons: ['OK'], + type: 'info', + }); + + session.changes.add({subject: newSubject}); + } + + _getDialog() { + return require('electron').remote.dialog; + } + + render() { + return ( +
+ +
+ ); + } +} diff --git a/static/package-template/lib/my-message-sidebar.jsx b/static/package-template/lib/my-message-sidebar.jsx new file mode 100644 index 0000000000..2840eb472a --- /dev/null +++ b/static/package-template/lib/my-message-sidebar.jsx @@ -0,0 +1,78 @@ +import { + React, + FocusedContactsStore, +} from 'nylas-exports'; + +export default class MyMessageSidebar extends React.Component { + static displayName = 'MyMessageSidebar'; + + // This sidebar component listens to the FocusedContactStore, + // which gives us access to the Contact object of the currently + // selected person in the conversation. If you wanted to take + // the contact and fetch your own data, you'd want to create + // your own store, so the flow of data would be: + + // FocusedContactStore => Your Store => Your Component + constructor(props) { + super(props); + this.state = this._getStateFromStores(); + } + + componentDidMount() { + this.unsubscribe = FocusedContactsStore.listen(this._onChange); + } + + componentWillUnmount() { + this.unsubscribe(); + } + + _onChange = () => { + this.setState(this._getStateFromStores()); + } + + _getStateFromStores = () => { + return { + contact: FocusedContactsStore.focusedContact(), + }; + } + + _renderContent() { + // Want to include images or other static assets in your components? + // Reference them using the nylas:// URL scheme: + // + // + // + return ( +
+

{this.state.contact.displayName()} is the focused contact.

+
+ ); + } + + _renderPlaceholder() { + return ( +
No Data Available
+ ); + } + + render() { + const content = (this.state.contact) ? this._renderContent() : this._renderPlaceholder(); + return ( +
+ {content} +
+ ); + } +} + + +// Providing container styles tells the app how to constrain +// the column your component is being rendered in. The min and +// max size of the column are chosen automatically based on +// these values. +MyMessageSidebar.containerStyles = { + order: 1, + flexShrink: 0, +}; diff --git a/static/package-template/spec/main-spec.es6 b/static/package-template/spec/main-spec.es6 new file mode 100644 index 0000000000..b2c499317f --- /dev/null +++ b/static/package-template/spec/main-spec.es6 @@ -0,0 +1,23 @@ +import {ComponentRegistry} from 'nylas-exports'; +import {activate, deactivate} from '../lib/main'; + +import MyMessageSidebar from '../lib/my-message-sidebar'; +import MyComposerButton from '../lib/my-composer-button'; + +describe("activate", () => { + it("should register the composer button and sidebar", () => { + spyOn(ComponentRegistry, 'register'); + activate(); + expect(ComponentRegistry.register).toHaveBeenCalledWith(MyComposerButton, {role: 'Composer:ActionButton'}); + expect(ComponentRegistry.register).toHaveBeenCalledWith(MyMessageSidebar, {role: 'MessageListSidebar:ContactCard'}); + }); +}); + +describe("deactivate", () => { + it("should unregister the composer button and sidebar", () => { + spyOn(ComponentRegistry, 'unregister'); + deactivate(); + expect(ComponentRegistry.unregister).toHaveBeenCalledWith(MyComposerButton); + expect(ComponentRegistry.unregister).toHaveBeenCalledWith(MyMessageSidebar); + }); +}); diff --git a/static/package-template/spec/my-composer-button-spec.jsx b/static/package-template/spec/my-composer-button-spec.jsx new file mode 100644 index 0000000000..1aca3968d3 --- /dev/null +++ b/static/package-template/spec/my-composer-button-spec.jsx @@ -0,0 +1,27 @@ +import {React, ReactDOM} from 'nylas-exports'; +const ReactTestUtils = require('react-addons-test-utils') + +import MyComposerButton from '../lib/my-composer-button'; + +describe("MyComposerButton", () => { + beforeEach(() => { + this.component = ReactTestUtils.renderIntoDocument( + + ); + }); + + it("should render into the page", () => { + expect(this.component).toBeDefined(); + }); + + it("should have a displayName", () => { + expect(MyComposerButton.displayName).toBe('MyComposerButton'); + }); + + it("should show a dialog box when clicked", () => { + spyOn(this.component, '_onClick'); + const buttonNode = ReactDOM.findDOMNode(this.component.refs.button); + ReactTestUtils.Simulate.click(buttonNode); + expect(this.component._onClick).toHaveBeenCalled(); + }); +}); diff --git a/static/package-template/stylesheets/main.less b/static/package-template/stylesheets/main.less new file mode 100644 index 0000000000..47f98e9384 --- /dev/null +++ b/static/package-template/stylesheets/main.less @@ -0,0 +1,6 @@ +@import "ui-variables"; +@import "ui-mixins"; + +.my-package .btn { + +} diff --git a/static/selection.less b/static/selection.less index 4dc2f0bc88..9128b86b1f 100644 --- a/static/selection.less +++ b/static/selection.less @@ -11,6 +11,9 @@ input, textarea, div[contenteditable], { user-select: auto; } .selectable { + &:hover { + cursor: text; + } -webkit-user-select: auto; user-select: auto; } diff --git a/static/type.less b/static/type.less index 1457f50291..70351334a2 100644 --- a/static/type.less +++ b/static/type.less @@ -28,7 +28,10 @@ h2 { font-size: @font-size-h2; font-weight: @font-weight-blond; } -h3 { font-size: @font-size-h3; } +h3 { + font-size: @font-size-h3; + font-weight: @font-weight-blond; +} h4 { font-size: @font-size-h4; } h5 { font-size: @font-size-h5; } h6 { font-size: @font-size-h6; } @@ -57,7 +60,7 @@ h4, h5, h6 { // ------------------------- a { color: @text-color-link; } -a:hover { color: @text-color-link-hover; cursor: pointer; } +a:hover { color: @text-color-link; cursor: default; } a:active { color: @text-color-link-active; } a:visisted { color: @text-color-link-active; } @@ -84,7 +87,7 @@ small, mark, .mark { - background-color: @state-warning-bg; + background-color: #fcf8e3; padding: .2em; } @@ -108,16 +111,16 @@ mark, .text-emphasis-variant(@accent-primary); } .text-success { - .text-emphasis-variant(@state-success-text); + .text-emphasis-variant(#3c763d); } .text-info { - .text-emphasis-variant(@state-info-text); + .text-emphasis-variant(#31708f); } .text-warning { - .text-emphasis-variant(@state-warning-text); + .text-emphasis-variant(#8a6d3b); } .text-danger { - .text-emphasis-variant(@state-danger-text); + .text-emphasis-variant(#a94442); } // Contextual backgrounds @@ -130,16 +133,16 @@ mark, .bg-variant(@accent-primary); } .bg-success { - .bg-variant(@state-success-bg); + .bg-variant(#dff0d8); } .bg-info { - .bg-variant(@state-info-bg); + .bg-variant(#d9edf7); } .bg-warning { - .bg-variant(@state-warning-bg); + .bg-variant(#fcf8e3); } .bg-danger { - .bg-variant(@state-danger-bg); + .bg-variant(#f2dede); } @@ -201,7 +204,7 @@ abbr[title], // Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 abbr[data-original-title] { cursor: help; - border-bottom: 1px dotted @abbr-border-color; + border-bottom: 1px dotted @gray-light; } .initialism { font-size: 90%; @@ -212,7 +215,7 @@ abbr[data-original-title] { blockquote { padding: (@line-height-computed / 2) @line-height-computed; margin: 0 0 @line-height-computed; - border-left: 5px solid @blockquote-border-color; + border-left: 5px solid @gray-lighter; p, ul, @@ -230,7 +233,7 @@ blockquote { display: block; font-size: 80%; // back to default font-size line-height: @line-height-base; - color: @blockquote-small-color; + color: @gray-light; &:before { content: '\2014 \00A0'; // em dash, nbsp @@ -245,7 +248,7 @@ blockquote { blockquote.pull-right { padding-right: 15px; padding-left: 0; - border-right: 5px solid @blockquote-border-color; + border-right: 5px solid @gray-lighter; border-left: 0; text-align: right; diff --git a/static/variables/ui-mixins.less b/static/variables/ui-mixins.less index fc2adc2f0c..21e5d2eb11 100644 --- a/static/variables/ui-mixins.less +++ b/static/variables/ui-mixins.less @@ -1,3 +1,5 @@ -@import "../mixins/common-ui-elements.less"; -@import "../mixins/text-emphasis.less"; -@import "../mixins/background-variant.less"; +@import "ui-variables"; +@import "../mixins/common-ui-elements"; +@import "../mixins/text-emphasis"; +@import "../mixins/background-variant"; +@import "../mixins/windows"; diff --git a/static/variables/ui-variables.less b/static/variables/ui-variables.less index 730c894e3d..7647d120d3 100644 --- a/static/variables/ui-variables.less +++ b/static/variables/ui-variables.less @@ -7,26 +7,17 @@ // 5. Application-specific usage (@unread-label-background) // Typography abstraction hierarchy -// 1. Font-face (FaktPro) +// 1. Font-face (Nylas-Pro) // 2. Common name (@bold, @italic) // 3. Generic font descriptor mixins (.bold, .italic, .h1, .h2) // -------- // 4. Generic usage descriptor (.btn-text, .p-body) -// 5. Application-specific usage (.message-list-h1, .salesforce-h1) +// 5. Application-specific usage (.message-list-h1) + //=============================== Colors ===============================// -//== Brand colors -@nilas-yellow: #D5DC28; -@nilas-yellow-dark: #A0C23A; -@nilas-green: #5CB346; -@nilas-green-dark: #078E46; -@nilas-blue: #11A1A2; -@nilas-blue-dark: #0F7982; -@nilas-black: #313435; -@nilas-gray: #434648; - -//== Generic colors -@black: @nilas-black; +//== Color Definitions +@black: #231f20; @gray-base: #0a0b0c; @gray-darker: lighten(@gray-base, 13.5%); // #222 @gray-dark: lighten(@gray-base, 20%); // #333 @@ -35,95 +26,67 @@ @gray-lighter: lighten(@gray-base, 92.5%); // #eee @white: #ffffff; -@blue: #419bf9; @blue-dark: #3187e1; +@blue: #419bf9; +@blue-light: #009ec4; -//== Color descriptors +//== Color Descriptors @accent-primary: @blue; @accent-primary-dark: @blue-dark; -@accent-secondary: @nilas-yellow; -@background-primary: #ffffff; -@background-off-primary: #fbfbfb; +@background-primary: @white; +@background-off-primary: #fdfdfd; @background-secondary: #f6f6f6; @background-tertiary: #6d7987; -@border-primary-bg: darken(@background-primary, 10%); -@border-secondary-bg: darken(@background-secondary, 10%); -@border-tertiary-bg: darken(@background-tertiary, 10%); -@border-color-divider: @border-secondary-bg; +@color-info: @blue-dark; +@color-success: #5CB346; +@color-warning: #f0ad4e; +@color-error: #d9534f; +@color-danger: #d9534f; -@info-color: @blue-dark; -@success-color: @nilas-green; -@warning-color: #f0ad4e; -@error-color: #d9534f; -@danger-color: #d9534f; +@component-active-color: @accent-primary-dark; +@component-active-bg: @background-primary; + +@background-gradient: linear-gradient(to top, rgba(241,241,241,0.75) 0%, +rgba(253,253,253,0.75) 100%); + +@border-color-primary: darken(@background-primary, 10%); +@border-color-secondary: darken(@background-secondary, 10%); +@border-color-tertiary: darken(@background-tertiary, 10%); +@border-color-divider: @border-color-secondary; //============================= Typography =============================// // ----- Colors ----- -@text-color: @black; -@text-color-subtle: fadeout(@text-color, 20%); -@text-color-very-subtle: fadeout(@text-color, 50%); -@text-color-inverse: @white; -@text-color-inverse-subtle: fadeout(@text-color-inverse, 20%); -@text-color-inverse-very-subtle: fadeout(@text-color-inverse, 50%); +@text-color: @black; +@text-color-subtle: fadeout(@text-color, 20%); +@text-color-very-subtle: fadeout(@text-color, 50%); +@text-color-inverse: @white; +@text-color-inverse-subtle: fadeout(@text-color-inverse, 20%); +@text-color-inverse-very-subtle: fadeout(@text-color-inverse, 50%); -@text-color-heading: @nilas-gray; +@text-color-heading: #434648; @text-color-link: @blue; @text-color-link-hover: @blue-dark; @text-color-link-active: @blue-dark; @text-color-selected: @text-color-inverse; -@text-color-highlight: @text-color; - -@text-color-info: @info-color; -@text-color-success: @success-color; -@text-color-warning: @warning-color; -@text-color-error: @error-color; -@text-color-destructive: @danger-color; - -// ----- Font Families ----- -@font-face { - font-family: 'FaktPro'; - font-style: normal; - font-weight: 300; - src: local('FaktPro-Blond'), url('fonts/Fakt/FaktPro-Blond.ttf'), local('Comic Sans MS'); -} - -@font-face { - font-family: 'FaktPro'; - font-style: normal; - font-weight: 400; - src: local('FaktPro-Normal'), url('fonts/Fakt/FaktPro-Normal.ttf'), local('Comic Sans MS'); -} - -@font-face { - font-family: 'FaktPro'; - font-style: normal; - font-weight: 500; - src: local('FaktPro-Medium'), url('fonts/Fakt/FaktPro-Medium.ttf'), local('Comic Sans MS'); -} - -@font-face { - font-family: 'FaktPro'; - font-style: normal; - font-weight: 600; - src: local('FaktPro-SemiBold'), url('fonts/Fakt/FaktPro-SemiBold.ttf'), local('Comic Sans MS'); -} - -@font-family-sans-serif: "FaktPro", "Helvetica", 'Lucida Grande', 'Segoe UI', sans-serif; -@font-family-smallcap: "Proxima Nova Regular Small Cap", "sans-serif"; + +@text-color-search-match: #fff000; +@text-color-search-current-match: #ff8b1a; + +@font-family-sans-serif: "Nylas-Pro", "Helvetica", sans-serif; @font-family-serif: Georgia, "Times New Roman", Times, serif; @font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; -@font-family-base: @font-family-sans-serif; -@font-family: @font-family-base; +@font-family: @font-family-sans-serif; @font-family-heading: @font-family-sans-serif; // ----- Font Weights ----- +@font-weight-thin: 200; @font-weight-blond: 300; @font-weight-normal: 400; @font-weight-medium: 500; @@ -131,20 +94,21 @@ @headings-font-weight: 600; // ----- Font Sizes ----- -@font-size-base: 15px; - -@font-size-smaller: @font-size-base * 0.80; // 12px -@font-size-small: @font-size-base * 0.93; // 14px -@font-size: @font-size-base; // 15px -@font-size-large: @font-size-base * 1.06; // 16px -@font-size-larger: @font-size-base * 1.20; // 18px - -@font-size-h1: @font-size-base * 1.6; // 24px -@font-size-h2: @font-size-base * 1.6; // 24px -@font-size-h3: @font-size-base * 1.7; // 24px -@font-size-h4: @font-size-base * 1.25; // 18px +@font-size-base: 14px; + +@font-size-tiny: @font-size-base * 0.75; // 10.5px +@font-size-smaller: @font-size-base * 0.86; // 12px +@font-size-small: @font-size-base * 0.93; // 13px +@font-size: @font-size-base; // 14px +@font-size-large: @font-size-base * 1.14; // 16px +@font-size-larger: @font-size-base * 1.29; // 18px + +@font-size-h1: @font-size-base * 1.71; // 24px +@font-size-h2: @font-size-base * 1.71; // 24px +@font-size-h3: @font-size-base * 1.43; // 20px +@font-size-h4: @font-size-base * 1.29; // 18px @font-size-h5: @font-size-base; -@font-size-h6: @font-size-base * 0.85; // 12px +@font-size-h6: @font-size-base * 0.86; // 12px // ----- Line Height ----- @line-height-base: 1.5; // 22.5/15 @@ -152,18 +116,6 @@ @line-height-heading: 1.1; -//============================ Iconography =============================// -// Specify custom location and filename of the included Glyphicons icon -// font. Useful for those including Bootstrap via Bower. - -//** Load fonts from this directory. -@icon-font-path: "../fonts/"; -//** File name for all font files. -@icon-font-name: "glyphicons-halflings-regular"; -//** Element ID within SVG icon file. -@icon-font-svg-id: "glyphicons_halflingsregular"; - - //============================== Spacing ===============================// // Define common padding and border radius sizes and more. Values based on // 14px text and 1.428 line-height (~20px to start). @@ -173,19 +125,15 @@ @spacing-quarter: @spacing-standard * 0.25; @spacing-half: @spacing-standard * 0.5; @spacing-three-quarters: @spacing-standard * 0.75; - -@spacing-sub-double: @spacing-standard * 1.75; @spacing-double: @spacing-standard * 2; -@spacing-super-double: @spacing-standard * 2.25; - -@padding-base-vertical: 6px; +@padding-base-vertical: 5px; @padding-base-horizontal: 12px; -@padding-large-vertical: 10px; +@padding-large-vertical: 9px; @padding-large-horizontal: 16px; -@padding-small-vertical: 5px; +@padding-small-vertical: 4px; @padding-small-horizontal: 10px; @padding-xs-vertical: 1px; @@ -194,303 +142,98 @@ @line-height-large: @line-height-computed * 1.3; @line-height-small: @line-height-computed * 0.95; -@border-radius-base: 4px; -@border-radius-large: 6px; -@border-radius-small: 3px; +@border-radius-base: 3px; +@border-radius-large: 5px; +@border-radius-small: 2px; //============================== Shadows ===============================// -@standard-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.21); -@standard-shadow-up: 0 -1px 4px 0 rgba(0, 0, 0, 0.21); - -//============================== Tables ===============================// -// Customizes the `.table` component with basic values, each used across -// all table variations. - -//** Padding for `
- -###Installing Nylas Mail - -Nylas Mail is available for Mac, Windows, and Linux. Download the latest build for your platform below: - -- [Mac OS X](https://edgehill.nylas.com/download?platform=darwin) -- [Linux](https://edgehill.nylas.com/download?platform=linux) -- [Windows](https://edgehill.nylas.com/download?platform=win32) - - - -###Package Architecture - -Packages lie at the heart of Nylas Mail. Each part of the core experience is a separate package that uses the Nilas Package API to add functionality to the client. Learn more about packages and create your first package. - -- [Package Overview](./PackageOverview.md) - -
- -### Dive Deeper - -- [Application Architecture](./Architecture.md) -- [React & Component Injection](./React.md) -- [Core Interface Concepts](./InterfaceConcepts.md) -- [Accessing the Database](./Database.md) -- [Draft Store Extensions](./DraftStoreExtensions.md) - - - -### Debugging Packages - -Nylas Mail is built on top of Electron, which runs the latest version of Chromium. Learn how to access debug tools in Electron and use our Developer Tools Extensions: - -- [Debugging in Nylas](./Debugging.md) - -
-##### Questions? - -Need help? Check out the [FAQ](./FAQ.md) or post a question in the [Nylas Mail Facebook Group](facebook.com/groups/nylas.mail) - -
`s and ``s. -@table-cell-padding: 8px; -//** Padding for cells in `.table-condensed`. -@table-condensed-cell-padding: 5px; - -//** Default background color used for all tables. -@table-bg: transparent; -//** Background color used for `.table-striped`. -@table-bg-accent: #f9f9f9; -//** Background color used for `.table-hover`. -@table-bg-hover: #f5f5f5; -@table-bg-active: @table-bg-hover; - -//** Border color for table and cell borders. -@table-border-color: #ddd; +@standard-shadow-color: rgba(0, 0, 0, 0.15); +@standard-shadow: 0 1px 4px 0 @standard-shadow-color; +@standard-shadow-up: 0 -1px 4px 0 @standard-shadow-color; +@shadow-border: 0 0.5px 0 @standard-shadow-color, 0 -0.5px 0 @standard-shadow-color, +0.5px 0 0 @standard-shadow-color, -0.5px 0 0 @standard-shadow-color; //=============================== Buttons ==============================// @btn-shadow: @standard-shadow; -@btn-default-bg-color: @background-primary; +@btn-default-bg-color: darken(@background-primary, 0.5%); @btn-default-text-color: @text-color; -@btn-action-bg-color: @success-color; +@btn-icon-color: #919191; + +@btn-action-bg-color: @color-success; @btn-action-text-color: @text-color; @btn-emphasis-bg-color: #5b90fb; @btn-emphasis-text-color: @text-color-inverse; -@btn-danger-bg-color: @danger-color; +@btn-danger-bg-color: @color-danger; @btn-danger-text-color: @text-color-inverse; -//=============================== Inputs ===============================// - -//** `` background color -@input-bg: #fff; -//** `` background color -@input-bg-disabled: @gray-lighter; - -@input-background-color: white; - -@input-border-color: fadeout(@border-color, 10%); -@input-border-color-blurred: desaturate(@input-border-color, 100%); -@input-tint-color: fade(@background-color-selected, 10%); -@input-tint-color-hover: fade(@input-tint-color, 30%); -@input-tint-color-blurred: desaturate(@input-tint-color, 100%); +//=============================== Dropdowns ============================// +@dropdown-default-bg-color: @background-primary; +@dropdown-default-text-color: @text-color; +@dropdown-default-border-color: fadeout(@border-color-primary, 10%); -@input-accessory-color-hover: @light-blue; -@input-accessory-color: @cool-gray; -@input-cancel-color: @red; -//** Text color for ``s -@input-color: @gray; -//** `` border color -@input-border: #ccc; - -// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4 -//** Default `.form-control` border radius -@input-border-radius: @border-radius-base; -//** Large `.form-control` border radius -@input-border-radius-large: @border-radius-large; -//** Small `.form-control` border radius -@input-border-radius-small: @border-radius-small; - -//** Border color for inputs on focus -@input-border-focus: #66afe9; - -//** Placeholder text color -@input-color-placeholder: #999; - -//** Default `.form-control` height -@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); -//** Large `.form-control` height -@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); -//** Small `.form-control` height -@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); - -//** Background color for textual input addons -@input-group-addon-bg: @gray-lighter; -//** Border color for textual input addons -@input-group-addon-border-color: @input-border; - - -//=============================== Z-Index ==============================// -//-- Z-index master list -// -// Warning: Avoid customizing these values. They're used for a bird's eye -// view of components dependent on the z-axis and are designed to all work -// together. -// -// Note: These variables are not generated into the Customizer. +//=============================== Inputs ===============================// -@zindex-navbar: 1000; -@zindex-dropdown: 1000; -@zindex-popover: 1060; -@zindex-tooltip: 1070; -@zindex-navbar-fixed: 1030; -@zindex-modal: 1040; +@input-bg: @white; +@input-bg-disabled: @gray-lighter; +@input-border-color: fadeout(@border-color-primary, 10%); +@input-border-color-blurred: desaturate(@input-border-color, 100%); +@input-font-size: 14px; -//** Global color for active items (e.g., navs or dropdowns). -@component-active-color: @accent-primary-dark; -//** Global background color for active items (e.g., navs or dropdowns). -@component-active-bg: @background-primary; -@component-secondary-active-bg: @background-primary; +//=============================== Components ===========================// -//== Source List (used in Sidebar, iTunes-style) -// -// ## +//== Toolbar +@toolbar-background-color: darken(@white, 17.5%); -//** Background color on `.list-group-item` -@source-list-bg: @background-primary; -//** Text color of active list items +//== Account Sidebar +@panel-background-color: @gray-lighter; +@source-list-bg: @panel-background-color; +@source-list-active-bg: @panel-background-color; @source-list-active-color: @component-active-color; -//** Background color of active list items -@source-list-active-bg: @component-active-bg; -//== List -// -//## - -//** Background color on `.list-group-item` -@list-bg: #fff; -//** `.list-item` border color -@list-border: #ddd; -//** List group border radius -@list-border-radius: @border-radius-base; - -//** Background color of single list items on hover -@list-hover-bg: #f5f5f5; - -//** Text color of active list items +//== Thread List (e.g, `.list-group-item`, `.list-item`) +@list-bg: @white; +@list-border: #ddd; +@list-hover-bg: darken(@list-bg, 4%); @list-focused-color: @list-bg; -//** Background color of active list items @list-focused-bg: @component-active-color; -//** Border color of active list elements @list-focused-border: @list-focused-bg; -//** Text color for content within active list items -@list-focused-color-muted: lighten(@list-focused-bg, 40%); - -//** Text color of active list items -@list-selected-color: inherit; -//** Background color of active list items -@list-selected-bg: fade(@component-active-color, 17%); -//** Border color of active list elements -@list-selected-border: fade(@component-active-color, 50%); -//** Text color for content within active list items -@list-selected-color-muted: lighten(@list-selected-bg, 40%); - -//** Text color of disabled list items -@list-disabled-color: @gray-light; -//** Background color of disabled list items -@list-disabled-bg: @gray-lighter; -//** Text color for content within disabled list items -@list-disabled-text-color: @list-disabled-color; - - -//** Abbreviations and acronyms border color -@abbr-border-color: @gray-light; -//** Blockquote small color -@blockquote-small-color: @gray-light; -//** Blockquote font size -@blockquote-font-size: (@font-size-base * 1.25); -//** Blockquote border color -@blockquote-border-color: @gray-lighter; - - - -//== Form states and alerts -// -//## Define colors for form feedback states and, by default, alerts. - -@state-success-text: #3c763d; -@state-success-bg: #dff0d8; -@state-success-border: darken(spin(@state-success-bg, -10), 5%); - -@state-info-text: #31708f; -@state-info-bg: #d9edf7; -@state-info-border: darken(spin(@state-info-bg, -10), 7%); - -@state-warning-text: #8a6d3b; -@state-warning-bg: #fcf8e3; -@state-warning-border: darken(spin(@state-warning-bg, -10), 5%); - -@state-danger-text: #a94442; -@state-danger-bg: #f2dede; -@state-danger-border: darken(spin(@state-danger-bg, -10), 5%); - -///// - -// ------------- -// EVERYTHING BELOW THIS NEEDS TO BE DEPRECATED OR MOVED ABOVE THIS -// old stuff -// ------------- - -// Private -// -// Do not use these colors outside of this file. -// You should choose variables based on the role of your -// interface elements. In other themes, @light-blue may -// not be light or blue. - -@PANTONE-340-UP: #00ac6f; -@PANTONE-7704-UP: #009ec4; -@PANTONE-7547-UP: #3c505f; -@PANTONE-296-UP: #003c56; -@PANTONE-421-UP: #b4babd; -@PANTONE-Red-032-UP: #f15f4b; -@PANTONE-326-UP: #3bbeb4; -@PANTONE-Process-Black-UP: #231f20; -@PANTONE-Cool-Gray-1-UP: #e1e0dc; - -@green: @PANTONE-340-UP; -@light-blue: @PANTONE-7704-UP; -@blue-gray: @PANTONE-7547-UP; -@dark-blue: @PANTONE-296-UP; -@light-gray: @PANTONE-421-UP; -@red: @PANTONE-Red-032-UP; -@teal: @PANTONE-326-UP; -@black: @PANTONE-Process-Black-UP; -@cool-gray: @PANTONE-Cool-Gray-1-UP; - -@blue-grey: @blue-gray; -@light-grey: @light-gray; - -// Public -// -// Use these variables in your packages. Choose the variable -// that best matches the role of the element you are styling. - -// TEXT - -@unread-color: @blue; //! -@action-color: @green; - -@progress-bar-fill: @light-blue; -@progress-bar-background: @light-gray; - -@background-color: #fff; -@background-color-highlight: darken(@background-color, 2.5%); -@background-color-selected: @light-blue; -@background-color-secondary: darken(@background-color, 5%); -@background-color-accent: @blue-gray; - -@background-color-info: @light-blue; -@background-color-success: @green; -@background-color-warning: #ff4800; -@background-color-error: @red; -@background-color-pending: @light-gray; - -@base-border-color: darken(@background-color, 15%); -@border-color: darken(@background-color, 15%); -@border-color-subtle: darken(@background-color, 8%); - -// Inputs +@list-selected-color: inherit; +@list-selected-bg: mix(@component-active-color, @list-bg, 17%); +@list-selected-border: mix(@component-active-color, @list-bg, 50%); -// Menus +//== Notifications +@background-color-info: @blue-light; +@background-color-success: #00ac6f; +@background-color-warning: #ff4800; +@background-color-error: #ca2541; +@background-color-pending: #b4babd; -@menu-color: white; -@menu-divider-color: @light-gray; -@menu-item-color-hover: fade(@background-color-selected, 10%); -@menu-item-color-selected: @background-color-selected; +//== Menus +@menu-item-color-hover: fade(@blue-light, 10%); +@menu-item-color-selected: @blue-light; @menu-text-color-selected: @text-color-inverse; -// Sizes - -@disclosure-arrow-size: 12px; -@input-font-size: 14px; - -@component-padding: 10px; -@component-icon-padding: 5px; -@component-icon-size: 16px; -@component-line-height: 25px; +//== Sizes +@component-padding: 10px; +@component-icon-padding: 5px; +@component-icon-size: 16px; +@component-line-height: 25px; @component-border-radius: 2px; - -@body-bg: @white; -//== Panels and Sidebars -@panel-background-color: @gray-lighter; -@toolbar-background-color: @white; +// Helpers for Specs - Do Not Remove +@spec-test-variable: rgb(152,123,0); diff --git a/static/workspace.less b/static/workspace.less index 0d5c558ae7..11ab280a94 100644 --- a/static/workspace.less +++ b/static/workspace.less @@ -12,19 +12,23 @@ body { -webkit-font-smoothing: antialiased; } -atom-workspace { +nylas-workspace { display: block; height: 100%; overflow: hidden; position: relative; font-family: @font-family; - atom-workspace-axis.horizontal { + // Important: This attribute is used in the theme-manager-specs to check that + // themes load and override each other correctly. Do not remove! + background-color: @background-primary; + + nylas-workspace-axis.horizontal { display: -webkit-flex; height: 100%; } - atom-workspace-axis.vertical { + nylas-workspace-axis.vertical { display: -webkit-flex; -webkit-flex: 1; -webkit-flex-flow: column; @@ -61,8 +65,12 @@ atom-workspace { opacity: 0; } +.toolbar-menu-control { + display:none; +} + .toolbar-window-controls { - margin-top:14px; + margin-top:9px; margin-left:@spacing-half; order: -1000; min-width: 72px; @@ -94,19 +102,37 @@ atom-workspace { } } .close { - background-image: url("images/application-frame/close@2x.png"); + background-image: url("images/application-frame/close@1x.png"); } .minimize { - background-image: url("images/application-frame/minimize@2x.png"); + background-image: url("images/application-frame/minimize@1x.png"); } .maximize { - background-image: url("images/application-frame/maximize@2x.png"); + background-image: url("images/application-frame/fullscreen@1x.png"); + } + &.alt-true { + .maximize { + background-image: url("images/application-frame/maximize@1x.png"); + } } } -body.platform-win32, body.platform-linux { +@media (-webkit-min-device-pixel-ratio: 2) { .toolbar-window-controls { - display:none; + .close { + background-image: url("images/application-frame/close@2x.png"); + } + .minimize { + background-image: url("images/application-frame/minimize@2x.png"); + } + .maximize { + background-image: url("images/application-frame/fullscreen@2x.png"); + } + &.alt-true { + .maximize { + background-image: url("images/application-frame/maximize@2x.png"); + } + } } } @@ -116,24 +142,54 @@ body.is-blurred { background-position: 0 -36px; } } + .sheet-toolbar-container { + background-image: -webkit-linear-gradient(top, lighten(@toolbar-background-color, 14%), lighten(@toolbar-background-color, 14%)); + + .btn.btn-toolbar { + background: none; + box-shadow: 0 0.5px 0 rgba(0,0,0,0.15), 0 -0.5px 0 rgba(0,0,0,0.15), 0.5px 0 0 rgba(0,0,0,0.15), -0.5px 0 0 rgba(0,0,0,0.15); + img { opacity:0.5; } + } + .item-container { + .window-title { + opacity: 0.5; + } + } + } } .sheet-toolbar-container { - background: @toolbar-background-color; + background-image: -webkit-linear-gradient(lighten(@toolbar-background-color, 10%) 0%, lighten(@toolbar-background-color, 10%) 1.9%, lighten(@toolbar-background-color, 9%) 2%, @toolbar-background-color 100%); + color:@text-color-heading; +} + +.layout-mode-popout { + .sheet-toolbar { + background: @background-primary; + height: 35px; + min-height: 35px; + max-height: 35px; + + .btn-toolbar { + margin-top: 6px; + } + } + .toolbar-window-controls { + margin-top: 7px; + } } .sheet-toolbar { position: relative; -webkit-app-region: drag; - background: @toolbar-background-color; - border-bottom: 1px solid @border-color-divider; + border-bottom: 1px solid darken(@toolbar-background-color, 9%); width: 100%; - height: 50px; + height: 38px; // prevent flexbox from ever, ever resizing toolbars, no matter // how much it thinks other content is being squished - min-height: 50px; - max-height: 50px; + min-height: 38px; + max-height: 38px; // cover up the vertical resizing separators, so the toolbar appears // to be one continuous bar. @@ -145,42 +201,84 @@ body.is-blurred { .item-spacer { -webkit-app-region: drag; } + + .item-compose { + order: 101; + } + + .item-container { + .window-title { + position: absolute; + text-align: center; + left: 50%; + transform: translateX(-50%); + -webkit-app-region: drag; + line-height: 36px; + &:hover { + cursor: default; + } + } + } + .item-back { order:-999; - padding-top: 5px; - padding-left: @spacing-three-quarters; + img.content-mask { background-color: @text-color-heading; } flex-grow: 0; flex-shrink: 0; + + .item-back-title { + cursor: default; + color:@text-color-heading; + margin:0; + font-size: @font-size-h4; + font-weight: @font-weight-normal; + vertical-align: middle; + display:inline-block; + } + &:active { + .item-back-title { color: mix(@text-color-heading, @black, 30%); } + img.content-mask { background-color: mix(@text-color-heading, @black, 30%); } + } } .btn-toolbar { - margin-top: @spacing-half; + margin-top: 8px; margin-left: @spacing-three-quarters; + margin-right: 0; + flex-shrink: 0; + line-height: 1.75em; + height: 1.75em; + box-shadow: 0 0.5px 0.05px rgba(0,0,0,0.4), 0 -0.5px 0 rgba(0,0,0,0.12); + img.content-mask { background-color: fade(@text-color-heading, 80%); } + } + .btn-toolbar:active { + img.content-mask { background-color: fade(@text-color-heading, 90%); } + } + .btn-toolbar:only-of-type { margin-right: @spacing-three-quarters; - height:32px; } } -.sheet-toolbar-enter { +.opacity-125ms-enter { opacity:0; transition: opacity .125s ease-out; } -.sheet-toolbar-enter.sheet-toolbar-enter-active { +.opacity-125ms-enter.opacity-125ms-enter-active { opacity:1; } -.sheet-toolbar-leave { +.opacity-125ms-leave { opacity:1; transition: opacity .125s ease-in; } -.sheet-toolbar-leave.sheet-toolbar-leave-active { +.opacity-125ms-leave.opacity-125ms-leave-active { opacity:0; } .flexbox-handle-horizontal { - width: 6px; + width: 8px; top: 0; bottom: 0; z-index: 2; @@ -188,16 +286,16 @@ body.is-blurred { cursor: col-resize; div { height:100%; - border-right: 1px solid @border-color-divider; + box-shadow: 0.5px 0 0 @border-color-divider; } &.flexbox-handle-right { - right:-3px; - padding-right:3px; + right:-4px; + padding-right:4px; } &.flexbox-handle-left { - left:-3px; - padding-right:2px; + left:-4px; + padding-right:4px; } } @@ -211,7 +309,6 @@ body.is-blurred { cursor: row-resize; div { width:100%; - // border-top: 1px solid @border-color-divider; } &.flexbox-handle-top { top:-3px; @@ -245,11 +342,87 @@ body.is-blurred { } } +// WINDOWS + body.platform-win32 { + &.window-type-default { + .toolbar-menu-control { + display:inherit; + order:10000; + .btn-toolbar { + margin-left: 0; + padding: 0 17px; + line-height: 36px; + img.content-mask { + vertical-align: middle; + background-color: @text-color-heading; + } + } + } + + } + + .item-compose { + order: -101; + } + + .btn { + border-radius: 0; + } + .flexbox-handle-vertical { cursor:ns-resize; } .flexbox-handle-horizontal { cursor:ew-resize; } + + .toolbar-window-controls { + display:none; + } + + .sheet-toolbar-container { + background-image: none; + background: @background-primary; + .btn-toolbar { + transition: background 300ms; + margin: 0 0 0 1px; + height: 37px; + padding: 0 14px; + padding-bottom: 2px; + border: 0; + box-shadow: none; + background: none; + &:hover { + background: darken(@list-hover-bg, 5%); + } + } + } + .btn-feedback { + background: @blue; + &:hover { background: lighten(@blue, 5%); } + &:active { background: lighten(@blue, 20%); } + } +} + +body.platform-win32.is-blurred { + .sheet-toolbar-container { + background-image: none; + background: @background-primary; + .btn-toolbar { + box-shadow: none; + } + } +} + +// LINUX + +body.platform-linux { + .toolbar-window-controls { + display:none; + } + .item-compose { + order: -101; + } + } diff --git a/vendor/dblite-custom.js b/vendor/dblite-custom.js deleted file mode 100644 index 9b3e7cbf21..0000000000 --- a/vendor/dblite-custom.js +++ /dev/null @@ -1,906 +0,0 @@ -/*! -Copyright (C) 2013 by WebReflection - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ -/*! -Copyright (C) 2013 by WebReflection - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - -*/ -/*! a zero hassle wrapper for sqlite by Andrea Giammarchi !*/ -var - isArray = Array.isArray, - // used to generate unique "end of the query" identifiers - crypto = require('crypto'), - // relative, absolute, and db paths are normalized anyway - path = require('path'), - // each dblite(fileName) instance is an EventEmitter - EventEmitter = require('events').EventEmitter, - // used to perform some fallback - WIN32 = process.platform === 'win32', - // what kind of Path Separator we have here ? - PATH_SEP = path.sep || ( - WIN32 ? '\\' : '/' - ), - // each dblite instance spawns a process once - // and interact with that shell for the whole session - // one spawn per database and no more (on avg 1 db is it) - spawn = require('child_process').spawn, - // use to re-generate Date objects - DECIMAL = /^[1-9][0-9]*$/, - // verify if it's a select or not - SELECT = /^(?:select|SELECT|pragma|PRAGMA) /, - // for simple query replacements: WHERE field = ? - REPLACE_QUESTIONMARKS = /\?/g, - // for named replacements: WHERE field = :data - REPLACE_PARAMS = /(?:\:|\@|\$)([a-zA-Z_$]+)/g, - // the way CSV threats double quotes - DOUBLE_DOUBLE_QUOTES = /""/g, - // to escape strings - SINGLE_QUOTES = /'/g, - // to use same escaping logic for double quotes - // except it makes escaping easier for JSON data - // which usually is full of " - SINGLE_QUOTES_DOUBLED = "''", - // to verify there are named fields/parametes - HAS_PARAMS = /(?:\?|(?:(?:\:|\@|\$)[a-zA-Z_$]+))/, - // shortcut used as deafault notifier - log = console.log.bind(console), - // the default binary as array of paths - bin = ['sqlite3'], - // private shared variables - // avoid creation of N functions - // keeps memory low and improves performance - paramsIndex, // which index is the current - paramsArray, // which value when Array - paramsObject, // which value when Object (named parameters) - IS_NODE_06 = false, // dirty things to do there ... - // defned later on - EOL, EOL_LENGTH, - SANITIZER, SANITIZER_REPLACER, - defineCSVEOL = function () { - defineCSVEOL = function () {}; - var sqliteVersion = dblite.sqliteVersion || - process.env.SQLITE_VERSION || - ''; - - sqliteVersion = String(dblite.sqliteVersion || '') - .replace(/[^.\d]/g, '') - .split('.') - ; - - // what kind of End Of Line we have here ? - EOL = sqliteVersion.length && sqliteVersion.filter(function (n, i) { - n = parseInt(n, 10); - switch (i) { - case 0: - return n >= 3; - case 1: - return n >= 8; - case 2: - return n >= 6; - } - return false; - }).length === sqliteVersion.length ? - '\r\n' : - require('os').EOL || ( - WIN32 ? '\r\n' : '\n' - ) - ; - - // what's EOL length? Used to properly parse data - EOL_LENGTH = EOL.length; - - // makes EOL safe for strings passed to the shell - SANITIZER = new RegExp("[;" + EOL.split('').map(function(c) { - return '\\x' + ('0' + c.charCodeAt(0).toString(16)).slice(-2); - }).join('') + "]+$"); - - // used to mark the end of each line passed to the shell - SANITIZER_REPLACER = ';' + EOL; - - if (!sqliteVersion.length) { - console.warn([ - '[WARNING] sqlite 3.8.6 changed CSV output', - 'please specify your sqlite version', - 'via `dblite.sqliteVersion = "3.8.5";`', - 'or via SQLITE_VERSION=3.8.5' - ].join(EOL)); - } - - } -; - -/** - * var db = dblite('filename.sqlite'):EventEmitter; - * - * db.query( thismethod has **many** overloads where almost everything is optional - * - * SQL:string, only necessary field. Accepts a query or a command such `.databases` - * - * params:Array|Object, optional, if specified replaces SQL parts with this object - * db.query('INSERT INTO table VALUES(?, ?)', [null, 'content']); - * db.query('INSERT INTO table VALUES(:id, :value)', {id:null, value:'content'}); - * - * fields:Array|Object, optional, if specified is used to normalize the query result with named fields. - * db.query('SELECT table.a, table.other FROM table', ['a', 'b']); - * [{a:'first value', b:'second'},{a:'row2 value', b:'row2'}] - * - * - * db.query('SELECT table.a, table.other FROM table', ['a', 'b']); - * [{a:'first value', b:'second'},{a:'row2 value', b:'row2'}] - * callback:Function - * ); - */ -function dblite() { - defineCSVEOL(); - var - // this is the delimiter of each sqlite3 shell command - SUPER_SECRET = '---' + - crypto.randomBytes(64).toString('base64') + - '---', - // ... I wish .print was introduced before SQLite 3.7.10 ... - // this is a weird way to get rid of the header, if enabled - SUPER_SECRET_SELECT = '"' + SUPER_SECRET + '" AS "' + SUPER_SECRET + '";' + EOL, - // used to check the end of a buffer - SUPER_SECRET_LENGTH = -(SUPER_SECRET.length + EOL_LENGTH), - // the incrementally concatenated buffer - // cleaned up as soon as the current command has been completed - selectResult = '', - // the current dblite "instance" - self = new EventEmitter(), - // usually the database file or ':memory:' only - // the "spawned once" program, will be used for the whole session - program = spawn( - // executable only, folder needs to be specified a part - bin.length === 1 ? bin[0] : ('.' + PATH_SEP + bin[bin.length - 1]), - // normalize file path if not :memory: - normalizeFirstArgument( - // it is possible to eventually send extra sqlite3 args - // so all arguments are passed - Array.prototype.slice.call(arguments) - ).concat('-csv') // but the output MUST be csv - .reverse(), // see https://github.com/WebReflection/dblite/pull/12 - // be sure the dir is the right one - { - // the right folder is important or sqlite3 won't work - cwd: bin.slice(0, -1).join(PATH_SEP) || process.cwd(), - env: process.env, // same env is OK - encoding: 'utf8', // utf8 is OK - detached: true, // asynchronous - stdio: ['pipe', 'pipe', 'pipe'] // handled here - } - ), - // sqlite3 shell can produce one output per time - // evey operation performed through this wrapper - // should not bother the program until next - // available slot. This queue helps keeping - // requests ordered without stressing the system - // once things will be ready, callbacks will be notified - // accordingly. As simple as that ^_^ - queue = [], - // set as true only once db.close() has been called - notWorking = false, - // marks the shell busy or not - busy = false, - // tells if current output needs to be processed - wasSelect = false, - wasNotSelect = false, - wasError = false, - // forces the output not to be processed - // might be handy in some case where it's passed around - // as string instread of needing to serialize/unserialize - // the list of already arrays or objects - dontParseCSV = false, - // one callback per time will be notified - $callback, - // recycled variable for fields operation - $fields - ; - - SUPER_SECRET += EOL; - - // when program is killed or closed for some reason - // the dblite object needs to be notified too - function close(code) { - if (self.listeners('close').length) { - self.emit('close', code); - } else { - log('bye bye'); - } - } - - // as long as there's something else to do ... - function next() { - if (queue.length) { - // ... do that and wait for next check - self.query.apply(self, queue.shift()); - } - } - - // common error helper - function onerror(data) { - if($callback && 1 < $callback.length) { - // there is a callback waiting - // and there is more than an argument in there - // the callback is waiting for errors too - var callback = $callback; - wasSelect = wasNotSelect = dontParseCSV = false; - $callback = $fields = null; - wasError = true; - // should the next be called ? next(); - callback.call(self, new Error(data.toString()), null); - } else if(self.listeners('error').length) { - // notify listeners - self.emit('error', '' + data); - } else { - // log the output avoiding exit 1 - // if no listener was added - console.error('' + data); - } - } - - // all IO handled here - program.stderr.on('data', onerror); - program.stdin.on('error', onerror); - program.stdout.on('error', onerror); - program.stderr.on('error', onerror); - - // invoked each time the sqlite3 shell produces an output - program.stdout.on('data', function (data) { - /*jshint eqnull: true*/ - // big output might require more than a call - var str, result, callback, fields, headers, wasSelectLocal, rows; - if (wasError) { - selectResult = ''; - wasError = false; - if (self.ignoreErrors) { - busy = false; - next(); - } - return; - } - // the whole output is converted into a string here - selectResult += data; - // if the end of the output is the serapator - if (selectResult.slice(SUPER_SECRET_LENGTH) === SUPER_SECRET) { - // time to move forward since sqlite3 has done - str = selectResult.slice(0, SUPER_SECRET_LENGTH); - // drop the secret header if present - headers = str.slice(SUPER_SECRET_LENGTH) === SUPER_SECRET; - if (headers) str = str.slice(0, SUPER_SECRET_LENGTH); - // clean up the outer variabls - selectResult = ''; - // makes the spawned program not busy anymore - busy = false; - // if it was a select - if (wasSelect || wasNotSelect) { - wasSelectLocal = wasSelect; - // set as false all conditions - // only here dontParseCSV could have been true - // set to false that too - wasSelect = wasNotSelect = dontParseCSV = busy; - // which callback should be invoked? - // last expected one for this round - callback = $callback; - // same as fields - fields = $fields; - // parse only if it was a select/pragma - if (wasSelectLocal) { - // unless specified, process the string - // converting the CSV into an Array of rows - result = dontParseCSV ? str : parseCSV(str); - // if there were headers/fields and we have a result ... - if (headers && isArray(result) && result.length) { - // ... and fields is not defined - if (fields == null) { - // fields is the row 0 - fields = result[0]; - } else if(!isArray(fields)) { - // per each non present key, enrich the fields object - // it is then possible to have automatic headers - // with some known field validated/parsed - // e.g. {id:Number} will be {id:Number, value:String} - // if the query was SELECT id, value FROM table - // and the fields object was just {id:Number} - // but headers were active - result[0].forEach(enrichFields, fields); - } - // drop the first row with headers - result.shift(); - } - } - - // Record query duration - $lastQueryTime = Date.now() - $queryStart - - // but next query, should not have - // previously set callbacks or fields - $callback = $fields = null; - // the spawned program can start a new job without current callback - // being able to push another job as soon as executed. This makes - // the queue fair for everyone without granting priority to anyone. - next(); - // if there was actually a callback to call - if (callback) { - rows = fields ? ( - // and if there was a need to parse each row - isArray(fields) ? - // as object with properties - result.map(row2object, fields) : - // or object with validated properties - result.map(row2parsed, parseFields(fields)) - ) : - // go for it ... otherwise returns the result as it is: - // an Array of Arrays - result - ; - // if there was an error signature - if (1 < callback.length) { - callback.call(self, null, rows); - } else { - // invoke it with the db object as context - callback.call(self, rows); - } - } - } else { - // not a select, just a special command - // such .databases or .tables - next(); - // if there is something to notify - if (str.length) { - // and if there was an 'info' listener - if (self.listeners('info').length) { - // notify - self.emit('info', EOL + str); - } else { - // otherwise log - log(EOL + str); - } - } - } - } - }); - - // detach the program from this one - // node 0.6 has not unref - if (program.unref) { - program.on('close', close); - program.unref(); - } else { - IS_NODE_06 = true; - program.stdout.on('close', close); - } - - // WARNING: this can be very unsafe !!! - // if there is an error and this - // property is explicitly set to false - // it keeps running queries no matter what - self.ignoreErrors = false; - // - - - - - - - - - - - - - - - - - - - - - - // safely closes the process - // will emit 'close' once done - self.close = function() { - // close can happen only once - if (!notWorking) { - // this should gently terminate the program - // only once everything scheduled has been completed - self.query('.exit'); - notWorking = true; - // the hardly killed version was like this: - // program.stdin.end(); - // program.kill(); - } - }; - - self.lastQueryTime = function () { - return $lastQueryTime; - }; - - // SELECT last_insert_rowid() FROM table might not work as expected - // This method makes the operation atomic and reliable - self.lastRowID = function(table, callback) { - self.query( - 'SELECT ROWID FROM `' + table + '` ORDER BY ROWID DESC LIMIT 1', - function(result){ - var row = result[0], k; - // if headers are switched on - if (!(row instanceof Array)) { - for (k in row) { - if (row.hasOwnProperty(k)) { - row = [row[k]]; - break; - } - } - } - (callback || log).call(self, row[0]); - } - ); - return self; - }; - - // Handy if for some reason data has to be passed around - // as string instead of being serialized and deserialized - // as Array of Arrays. Don't use if not needed. - self.plain = function() { - dontParseCSV = true; - return self.query.apply(self, arguments); - }; - - // main logic/method/entry point - self.query = function(string, params, fields, callback) { - // notWorking is set once .close() has been called - // it does not make sense to execute anything after - // the program is being closed - if (notWorking) return onerror('closing'), self; - // if something is still going on in the sqlite3 shell - // the progcess is flagged as busy. Just queue other operations - if (busy) return queue.push(arguments), self; - // if a SELECT or a PRAGMA ... - - // Record start time - $queryStart = Date.now() - - wasSelect = SELECT.test(string); - if (wasSelect) { - // SELECT and PRAGMA makes `dblite` busy - busy = true; - switch(arguments.length) { - // all arguments passed, nothing to do - case 4: - $callback = callback; - $fields = fields; - string = replaceString(string, params); - break; - // 3 arguments passed ... - case 3: - // is the last one the callback ? - if (typeof fields == 'function') { - // assign it - $callback = fields; - // has string parameters to repalce - // such ? or :id and others ? - if (HAS_PARAMS.test(string)) { - // no objectification and/or validation needed - $fields = null; - // string replaced wit parameters - string = replaceString(string, params); - } else { - // no replacement in the SQL needed - // objectification with validation - // if specified, will manage the result - $fields = params; - } - } else { - // no callback specified at all, probably in "dev mode" - $callback = log; // just log the result - $fields = fields; // use objectification - string = replaceString(string, params); // replace parameters - } - break; - // in this case ... - case 2: - // simple query with a callback - if (typeof params == 'function') { - // no objectification - $fields = null; - // callback is params argument - $callback = params; - } else { - // "dev mode", just log - $callback = log; - // if there's something to replace - if (HAS_PARAMS.test(string)) { - // no objectification - $fields = null; - string = replaceString(string, params); - } else { - // nothing to replace - // objectification with eventual validation - $fields = params; - } - } - break; - default: - // 1 argument, the SQL string and nothing else - // "dev mode" log will do - $callback = log; - $fields = null; - break; - } - // ask the sqlite3 shell ... - program.stdin.write( - // trick to always know when the console is not busy anymore - // specially for those cases where no result is shown - sanitize(string) + 'SELECT ' + SUPER_SECRET_SELECT - ); - } else { - // if db.plain() was used but this is not a SELECT or PRAGMA - // something is wrong with the logic since no result - // was expected anyhow - if (dontParseCSV) { - dontParseCSV = false; - throw new Error('not a select'); - } else if (string[0] === '.') { - // .commands are special queries .. so - // .commands make `dblite` busy - busy = true; - // same trick with the secret to emit('info', resultAsString) - // once everything is done - program.stdin.write(string + EOL + 'SELECT ' + SUPER_SECRET_SELECT); - } else { - switch(arguments.length) { - case 1: - /* falls through */ - case 2: - if (typeof params !== 'function') { - // no need to make the shell busy - // since no output is shown at all (errors ... eventually) - // sqlite3 shell will take care of the order - // same as writing in a linux shell while something else is going on - // who cares, will show when possible, after current job ^_^ - program.stdin.write(sanitize(HAS_PARAMS.test(string) ? - replaceString(string, params) : - string - )); - // keep checking for possible following operations - process.nextTick(next); - break; - } - fields = params; - // not necessary but guards possible wrong replaceString - params = null; - /* falls through */ - case 3: - // execute a non SELECT/PRAGMA statement - // and be notified once it's done. - // set state as busy - busy = wasNotSelect = true; - $callback = fields; - program.stdin.write( - (sanitize( - HAS_PARAMS.test(string) ? - replaceString(string, params) : - string - )) + - EOL + 'SELECT ' + SUPER_SECRET_SELECT - ); - } - } - } - // chainability just useful here for multiple queries at once - return self; - }; - return self; -} - -// enrich possible fields object with extra headers -function enrichFields(key) { - var had = this.hasOwnProperty(key), - callback = had && this[key]; - delete this[key]; - this[key] = had ? callback : String; -} - -// if not a memory database -// the file path should be resolved as absolute -function normalizeFirstArgument(args) { - var file = args[0]; - if (file !== ':memory:') { - args[0] = path.resolve(args[0]); - } - return args; -} - -// assuming generated CSV is always like -// 1,what,everEOL -// with double quotes when necessary -// 2,"what's up",everEOL -// this parser works like a charm -function parseCSV(output) { - defineCSVEOL(); - for(var - fields = [], - rows = [], - index = 0, - rindex = 0, - length = output.length, - i = 0, - j, loop, - current, - endLine, - iNext, - str; - i < length; i++ - ) { - switch(output[i]) { - case '"': - loop = true; - j = i; - do { - iNext = output.indexOf('"', current = j + 1); - switch(output[j = iNext + 1]) { - case EOL[0]: - if (EOL_LENGTH === 2 && output[j + 1] !== EOL[1]) { - break; - } - /* falls through */ - case ',': - loop = false; - } - } while(loop); - str = output.slice(i + 1, iNext++).replace(DOUBLE_DOUBLE_QUOTES, '"'); - break; - default: - iNext = output.indexOf(',', i); - endLine = output.indexOf(EOL, i); - if (iNext < 0) iNext = length - EOL_LENGTH; - str = output.slice(i, endLine < iNext ? (iNext = endLine) : iNext); - break; - } - fields[index++] = str; - if (output[i = iNext] === EOL[0] && ( - EOL_LENGTH === 1 || ( - output[i + 1] === EOL[1] && ++i - ) - ) - ) { - rows[rindex++] = fields; - fields = []; - index = 0; - } - } - return rows; -} - -// create an object with right validation -// and right fields to simplify the parsing -// NOTE: this is based on ordered key -// which is not specified by old ES specs -// but it works like this in V8 -function parseFields($fields) { - for (var - current, - fields = Object.keys($fields), - parsers = [], - length = fields.length, - i = 0; i < length; i++ - ) { - current = $fields[fields[i]]; - parsers[i] = current === Boolean ? - $Boolean : ( - current === Date ? - $Date : - current || String - ) - ; - } - return {f: fields, p: parsers}; -} - -// transform SQL strings using parameters -function replaceString(string, params) { - // if params is an array - if (isArray(params)) { - // replace all ? occurence ? with right - // incremental params[index++] - paramsIndex = 0; - paramsArray = params; - string = string.replace(REPLACE_QUESTIONMARKS, replaceQuestions); - } else { - // replace :all @fields with the right - // object.all or object.fields occurrences - paramsObject = params; - string = string.replace(REPLACE_PARAMS, replaceParams); - } - paramsArray = paramsObject = null; - return string; -} - -// escape the property found in the SQL -function replaceParams(match, key) { - return escape(paramsObject[key]); -} - -// escape the value found for that ? in the SQL -function replaceQuestions() { - return escape(paramsArray[paramsIndex++]); -} - -// objectification: makes an Array an object -// assuming the context is an array of ordered fields -function row2object(row) { - for (var - out = {}, - length = this.length, - i = 0; i < length; i++ - ) { - out[this[i]] = row[i]; - } - return out; -} - -// objectification with validation: -// makes an Array a validated object -// assuming the context is an object -// produced via parseFields() function -function row2parsed(row) { - for (var - out = {}, - fields = this.f, - parsers = this.p, - length = fields.length, - i = 0; i < length; i++ - ) { - out[fields[i]] = parsers[i](row[i]); - } - return out; -} - -// escape in a smart way generic values -// making them compatible with SQLite types -// or useful for JavaScript once retrieved back -function escape(what) { - defineCSVEOL(); - /*jshint eqnull: true*/ - switch (typeof what) { - case 'string': - return "'" + what.replace( - SINGLE_QUOTES, SINGLE_QUOTES_DOUBLED - ) + "'"; - case 'object': - return what == null ? - 'null' : - ("'" + JSON.stringify(what).replace( - SINGLE_QUOTES, SINGLE_QUOTES_DOUBLED - ) + "'") - ; - // SQLite has no Boolean type - case 'boolean': - return what ? '1' : '0'; // 1 => true, 0 => false - case 'number': - // only finite numbers can be stored - if (isFinite(what)) return '' + what; - case 'undefined': - return 'NULL' - } - // all other cases - throw new Error('unsupported data type'); -} - -// makes an SQL statement OK for dblite <=> sqlite communications -function sanitize(string) { - return string.replace(SANITIZER, '') + SANITIZER_REPLACER; -} - -// no Boolean type in SQLite -// this will replace the possible Boolean validator -// returning the right expected value -function $Boolean(field) { - switch(field.toLowerCase()) { - case '0': - case 'false': - case 'null': - case '': - return false; - } - return true; -} - -// no Date in SQLite, this will -// take care of validating/creating Dates -// when the field is retrieved with a Date validator -function $Date(field) { - return new Date( - DECIMAL.test(field) ? parseInt(field, 10) : field - ); -} - -// which sqlite3 executable ? -// it is possible to specify a different -// sqlite3 executable even in relative paths -// be sure the file exists and is usable as executable -Object.defineProperty( - dblite, - 'bin', - { - get: function () { - // normalized string if was a path - return bin.join(PATH_SEP); - }, - set: function (value) { - var isPath = -1 < value.indexOf(PATH_SEP); - if (isPath) { - // resolve the path - value = path.resolve(value); - // verify it exists - if (!require(IS_NODE_06 ? 'path' : 'fs').existsSync(value)) { - throw 'invalid executable: ' + value; - } - } - // assign as Array in any case - bin = value.split(PATH_SEP); - } - } -); - -// starting from v0.6.0 sqlite version shuold be specified -// specially if SQLite version is 3.8.6 or greater -// var dblite = require('dblite').withSQLite('3.8.6') -dblite.withSQLite = function (sqliteVersion) { - dblite.sqliteVersion = sqliteVersion; - return dblite; -}; - -// to manually parse CSV data if necessary -// mainly to be able to use db.plain(SQL) -// without parsing it right away and pass the string -// around instead of serializing and de-serializing it -// all the time. Ideally this is a scenario for clusters -// no need to usually do manually anything otherwise. -dblite.parseCSV = parseCSV; - -// how to manually escape data -// might be handy to write directly SQL strings -// instead of using handy paramters Array/Object -// usually you don't want to do this -dblite.escape = escape; - -// that's it! -module.exports = dblite; - -/** some simple example -var db = - require('./build/dblite.node.js')('./test/dblite.test.sqlite'). - on('info', console.log.bind(console)). - on('error', console.error.bind(console)). - on('close', console.log.bind(console)); - -// CORE FUNCTIONS: http://www.sqlite.org/lang_corefunc.html - -// PRAGMA: http://www.sqlite.org/pragma.html -db.query('PRAGMA table_info(kvp)'); - -// to test memory database -var db = require('./build/dblite.node.js')(':memory:'); -db.query('CREATE TABLE test (key INTEGER PRIMARY KEY, value TEXT)') && undefined; -db.query('INSERT INTO test VALUES(null, "asd")') && undefined; -db.query('SELECT * FROM test') && undefined; -// db.close(); -*/ \ No newline at end of file diff --git a/vendor/jasmine-jquery.js b/vendor/jasmine-jquery.js deleted file mode 100644 index ef2731784b..0000000000 --- a/vendor/jasmine-jquery.js +++ /dev/null @@ -1,181 +0,0 @@ -(function(jQuery) { - -jasmine.JQuery = function() {}; - -jasmine.JQuery.browserTagCaseIndependentHtml = function(html) { - return jQuery('
').append(html).html(); -}; - -jasmine.JQuery.elementToString = function(element) { - return jQuery('
').append(element.clone()).html(); -}; - -jasmine.JQuery.matchersClass = {}; - -(function(namespace) { - var data = { - spiedEvents: {}, - handlers: [] - }; - - namespace.events = { - spyOn: function(selector, eventName) { - var handler = function(e) { - data.spiedEvents[[selector, eventName]] = e; - }; - jQuery(selector).bind(eventName, handler); - data.handlers.push(handler); - }, - - wasTriggered: function(selector, eventName) { - return !!(data.spiedEvents[[selector, eventName]]); - }, - - cleanUp: function() { - data.spiedEvents = {}; - data.handlers = []; - } - } -})(jasmine.JQuery); - -(function(){ - var jQueryMatchers = { - toHaveClass: function(className) { - return this.actual.hasClass(className); - }, - - toBeVisible: function() { - return this.actual.is(':visible'); - }, - - toBeHidden: function() { - return this.actual.is(':hidden'); - }, - - toBeSelected: function() { - return this.actual.is(':selected'); - }, - - toBeChecked: function() { - return this.actual.is(':checked'); - }, - - toBeEmpty: function() { - return this.actual.is(':empty'); - }, - - toExist: function() { - return this.actual.size() > 0; - }, - - toHaveAttr: function(attributeName, expectedAttributeValue) { - return hasProperty(this.actual.attr(attributeName), expectedAttributeValue); - }, - - toHaveId: function(id) { - return this.actual.attr('id') == id; - }, - - toHaveHtml: function(html) { - return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html); - }, - - toHaveText: function(text) { - if (text && jQuery.isFunction(text.test)) { - return text.test(this.actual.text()); - } else { - return this.actual.text() == text; - } - }, - - toHaveValue: function(value) { - return this.actual.val() == value; - }, - - toHaveData: function(key, expectedValue) { - return hasProperty(this.actual.data(key), expectedValue); - }, - - toMatchSelector: function(selector) { - return this.actual.is(selector); - }, - - toContain: function(selector) { - return this.actual.find(selector).size() > 0; - }, - - toBeDisabled: function(selector){ - return this.actual.is(':disabled'); - }, - - // tests the existence of a specific event binding - toHandle: function(eventName) { - var events = this.actual.data("events"); - return events && events[eventName].length > 0; - }, - - // tests the existence of a specific event binding + handler - toHandleWith: function(eventName, eventHandler) { - var stack = this.actual.data("events")[eventName]; - var i; - for (i = 0; i < stack.length; i++) { - if (stack[i].handler == eventHandler) { - return true; - } - } - return false; - } - }; - - var hasProperty = function(actualValue, expectedValue) { - if (expectedValue === undefined) { - return actualValue !== undefined; - } - return actualValue == expectedValue; - }; - - var bindMatcher = function(methodName) { - var builtInMatcher = jasmine.Matchers.prototype[methodName]; - - jasmine.JQuery.matchersClass[methodName] = function() { - if (this.actual instanceof HTMLElement) { - this.actual = jQuery(this.actual); - } - if (this.actual && this.actual.jquery) { - var result = jQueryMatchers[methodName].apply(this, arguments); - this.actual = jasmine.JQuery.elementToString(this.actual); - return result; - } - - if (builtInMatcher) { - return builtInMatcher.apply(this, arguments); - } - - return false; - }; - }; - - for(var methodName in jQueryMatchers) { - bindMatcher(methodName); - } -})(); - -beforeEach(function() { - this.addMatchers(jasmine.JQuery.matchersClass); - this.addMatchers({ - toHaveBeenTriggeredOn: function(selector) { - this.message = function() { - return [ - "Expected event " + this.actual + " to have been triggered on" + selector, - "Expected event " + this.actual + " not to have been triggered on" + selector - ]; - }; - return jasmine.JQuery.events.wasTriggered(selector, this.actual); - } - }) -}); - -afterEach(function() { - jasmine.JQuery.events.cleanUp(); -}); -})(require('../src/space-pen-extensions').jQuery); diff --git a/vendor/sqlite3-darwin b/vendor/sqlite3-darwin deleted file mode 100755 index cd95ea425b..0000000000 Binary files a/vendor/sqlite3-darwin and /dev/null differ diff --git a/vendor/sqlite3-linux-32 b/vendor/sqlite3-linux-32 deleted file mode 100755 index faeb43a4de..0000000000 Binary files a/vendor/sqlite3-linux-32 and /dev/null differ diff --git a/vendor/sqlite3-linux-64 b/vendor/sqlite3-linux-64 deleted file mode 100755 index e9266d8ef5..0000000000 Binary files a/vendor/sqlite3-linux-64 and /dev/null differ diff --git a/vendor/sqlite3-win32.exe b/vendor/sqlite3-win32.exe deleted file mode 100755 index 0d01b9ab47..0000000000 Binary files a/vendor/sqlite3-win32.exe and /dev/null differ