From d1e85bdd8b7752a33ef840c8af48fefa54281ec3 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 4 Jan 2016 15:18:09 -0500 Subject: [PATCH 001/245] FEATURE: Use virtual dom framework for faster post rendering --- .eslintrc | 1 + app/assets/javascripts/discourse.js | 29 +- .../adapters/post-reply-history.js.es6 | 10 + .../discourse/adapters/post-reply.js.es6 | 9 + .../components/actions-summary.js.es6 | 122 -- .../components/composer-editor.js.es6 | 2 + .../discourse/components/mount-widget.js.es6 | 47 + .../discourse/components/post-gap.js.es6 | 44 - .../discourse/components/post-gutter.js.es6 | 85 - .../discourse/components/post-menu.js.es6 | 440 ----- .../discourse/components/poster-name.js.es6 | 77 - .../components/private-message-map.js.es6 | 27 - .../components/scrolling-post-stream.js.es6 | 145 ++ .../discourse/components/small-action.js.es6 | 35 +- .../discourse/components/time-gap.js.es6 | 21 - .../components/toggle-summary.js.es6 | 12 - .../discourse/components/topic-map.js.es6 | 46 - .../components/topic-participant.js.es6 | 18 - .../discourse/components/who-liked.js.es6 | 26 - .../discourse/controllers/composer.js.es6 | 9 +- .../discourse/controllers/topic.js.es6 | 168 +- .../discourse/ember/resolver.js.es6 | 14 +- .../discourse/helpers/as-hash.js.es6 | 8 + .../discourse/helpers/fa-icon.js.es6 | 23 +- .../discourse/helpers/link-domain.js.es6 | 16 - .../javascripts/discourse/helpers/node.js.es6 | 25 + .../discourse/initializers/signup-cta.js.es6 | 24 +- .../discourse/lib/discourse-location.js.es6 | 34 - .../discourse/lib/plugin-api.js.es6 | 1 - .../lib/posts-with-placeholders.js.es6 | 4 +- .../discourse/lib/safari-hacks.js.es6 | 3 - .../discourse/lib/screen-track.js.es6 | 203 +- .../discourse/lib/transform-post.js.es6 | 191 ++ .../javascripts/discourse/lib/url.js.es6 | 21 +- .../discourse/models/action-summary.js.es6 | 54 +- .../discourse/models/post-stream.js.es6 | 51 +- .../javascripts/discourse/models/post.js.es6 | 92 +- .../javascripts/discourse/models/store.js.es6 | 4 +- .../discourse/models/topic-details.js.es6 | 14 +- .../javascripts/discourse/models/topic.js.es6 | 26 - .../inject-discourse-objects.js.es6 | 17 +- .../discourse/routes/application.js.es6 | 6 - .../discourse/routes/build-topic-route.js.es6 | 3 +- .../javascripts/discourse/routes/topic.js.es6 | 6 +- .../components/private-message-map.hbs | 24 - .../templates/components/small-action.hbs | 5 - .../templates/components/toggle-summary.hbs | 12 - .../components/topic-participant.hbs | 6 - .../discourse/templates/embedded-post.hbs | 16 - .../templates/modal/archetype_options.hbs | 8 - .../discourse/templates/post-small-action.hbs | 9 - .../javascripts/discourse/templates/post.hbs | 141 -- .../javascripts/discourse/templates/topic.hbs | 42 +- .../discourse/views/archetype-options.js.es6 | 20 - .../discourse/views/cloaked-collection.js.es6 | 300 --- .../discourse/views/cloaked.js.es6 | 143 -- .../discourse/views/embedded-post.js.es6 | 17 - .../discourse/views/grouped.js.es6 | 10 - .../discourse/views/option-boolean.js.es6 | 11 - .../javascripts/discourse/views/post.js.es6 | 381 ---- .../discourse/views/reply-history.js.es6 | 7 - .../views/topic-map-container.js.es6 | 46 - .../discourse/widgets/actions-summary.js.es6 | 136 ++ .../discourse/widgets/button.js.es6 | 48 + .../discourse/widgets/click-hook.js.es6 | 61 + .../discourse/widgets/embedded-post.js.es6 | 42 + .../discourse/widgets/event-handler.js.es6 | 0 .../discourse/widgets/post-admin-menu.js.es6 | 66 + .../discourse/widgets/post-cooked.js.es6 | 196 ++ .../widgets/post-edits-indicator.js.es6 | 41 + .../discourse/widgets/post-gap.js.es6 | 26 + .../discourse/widgets/post-gutter.js.es6 | 68 + .../discourse/widgets/post-menu.js.es6 | 306 +++ .../widgets/post-small-action.js.es6 | 59 + .../discourse/widgets/post-stream.js.es6 | 75 + .../javascripts/discourse/widgets/post.js.es6 | 395 ++++ .../discourse/widgets/poster-name.js.es6 | 61 + .../widgets/private-message-map.js.es6 | 76 + .../discourse/widgets/raw-html.js.es6 | 18 + .../discourse/widgets/time-gap.js.es6 | 26 + .../widgets/toggle-topic-summary.js.es6 | 33 + .../discourse/widgets/topic-map.js.es6 | 219 +++ .../discourse/widgets/widget.js.es6 | 214 +++ app/assets/javascripts/main_include.js | 3 +- app/assets/javascripts/vendor.js | 2 + .../stylesheets/desktop/topic-post.scss | 7 +- app/assets/stylesheets/mobile/topic.scss | 2 +- config/locales/client.en.yml | 19 +- config/locales/server.ar.yml | 1 - config/locales/server.de.yml | 1 - config/locales/server.en.yml | 3 - config/locales/server.es.yml | 1 - config/locales/server.fa_IR.yml | 1 - config/locales/server.fi.yml | 1 - config/locales/server.fr.yml | 1 - config/locales/server.he.yml | 1 - config/locales/server.it.yml | 1 - config/locales/server.ja.yml | 1 - config/locales/server.ko.yml | 1 - config/locales/server.nl.yml | 1 - config/locales/server.pt.yml | 1 - config/locales/server.pt_BR.yml | 1 - config/locales/server.ru.yml | 1 - config/locales/server.sq.yml | 1 - config/locales/server.tr_TR.yml | 1 - config/locales/server.zh_CN.yml | 1 - config/locales/server.zh_TW.yml | 1 - config/site_settings.yml | 3 - .../tilt/es6_module_transpiler_template.rb | 2 +- .../acceptance/composer-test.js.es6 | 26 +- .../components/post-menu-test.js.es6 | 52 - .../javascripts/controllers/topic-test.js.es6 | 3 +- .../javascripts/fixtures/site-fixtures.js.es6 | 3 +- .../javascripts/helpers/component-test.js.es6 | 20 +- .../helpers/create-pretender.js.es6 | 19 +- test/javascripts/helpers/qunit-helpers.js.es6 | 1 - test/javascripts/helpers/widget-test.js.es6 | 9 + .../models/post-stream-test.js.es6 | 45 - test/javascripts/models/post-test.js.es6 | 11 - test/javascripts/test_helper.js | 3 - .../widgets/actions-summary-test.js.es6 | 80 + .../widgets/post-gutter-test.js.es6 | 54 + .../widgets/post-stream-test.js.es6 | 66 + test/javascripts/widgets/post-test.js.es6 | 784 ++++++++ .../widgets/poster-name-test.js.es6 | 67 + vendor/assets/javascripts/virtual-dom-amd.js | 4 + vendor/assets/javascripts/virtual-dom.js | 1668 +++++++++++++++++ 127 files changed, 5724 insertions(+), 2827 deletions(-) create mode 100644 app/assets/javascripts/discourse/adapters/post-reply-history.js.es6 create mode 100644 app/assets/javascripts/discourse/adapters/post-reply.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/actions-summary.js.es6 create mode 100644 app/assets/javascripts/discourse/components/mount-widget.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/post-gap.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/post-gutter.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/post-menu.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/poster-name.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/private-message-map.js.es6 create mode 100644 app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/time-gap.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/toggle-summary.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/topic-map.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/topic-participant.js.es6 delete mode 100644 app/assets/javascripts/discourse/components/who-liked.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/as-hash.js.es6 delete mode 100644 app/assets/javascripts/discourse/helpers/link-domain.js.es6 create mode 100644 app/assets/javascripts/discourse/helpers/node.js.es6 create mode 100644 app/assets/javascripts/discourse/lib/transform-post.js.es6 delete mode 100644 app/assets/javascripts/discourse/templates/components/private-message-map.hbs delete mode 100644 app/assets/javascripts/discourse/templates/components/toggle-summary.hbs delete mode 100644 app/assets/javascripts/discourse/templates/components/topic-participant.hbs delete mode 100644 app/assets/javascripts/discourse/templates/embedded-post.hbs delete mode 100644 app/assets/javascripts/discourse/templates/modal/archetype_options.hbs delete mode 100644 app/assets/javascripts/discourse/templates/post-small-action.hbs delete mode 100644 app/assets/javascripts/discourse/templates/post.hbs delete mode 100644 app/assets/javascripts/discourse/views/archetype-options.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/cloaked-collection.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/cloaked.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/embedded-post.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/grouped.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/option-boolean.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/post.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/reply-history.js.es6 delete mode 100644 app/assets/javascripts/discourse/views/topic-map-container.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/actions-summary.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/button.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/click-hook.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/embedded-post.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/event-handler.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-cooked.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-gap.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-gutter.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-menu.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-small-action.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-stream.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/poster-name.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/private-message-map.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/raw-html.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/time-gap.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/toggle-topic-summary.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/topic-map.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/widget.js.es6 delete mode 100644 test/javascripts/components/post-menu-test.js.es6 create mode 100644 test/javascripts/helpers/widget-test.js.es6 create mode 100644 test/javascripts/widgets/actions-summary-test.js.es6 create mode 100644 test/javascripts/widgets/post-gutter-test.js.es6 create mode 100644 test/javascripts/widgets/post-stream-test.js.es6 create mode 100644 test/javascripts/widgets/post-test.js.es6 create mode 100644 test/javascripts/widgets/poster-name-test.js.es6 create mode 100644 vendor/assets/javascripts/virtual-dom-amd.js create mode 100644 vendor/assets/javascripts/virtual-dom.js diff --git a/.eslintrc b/.eslintrc index d2a13ae262..2b3ed3ba7d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -90,6 +90,7 @@ "no-undef": 2, "no-unused-vars": 2, "no-with": 2, + "no-this-before-super": 2, "semi": 2, "strict": 0, "valid-typeof": 2, diff --git a/app/assets/javascripts/discourse.js b/app/assets/javascripts/discourse.js index 5b16593a82..553d70fb45 100644 --- a/app/assets/javascripts/discourse.js +++ b/app/assets/javascripts/discourse.js @@ -152,21 +152,18 @@ window.Discourse = Ember.Application.createWithMixins(Discourse.Ajax, { }) }); -function proxyDep(propName, moduleFunc, msg) { - if (Discourse.hasOwnProperty(propName)) { return; } - Object.defineProperty(Discourse, propName, { - get: function() { - msg = msg || "import the module"; - Ember.warn("DEPRECATION: `Discourse." + propName + "` is deprecated, " + msg + "."); - return moduleFunc(); - } - }); +function RemovedObject(name) { + this._removedName = name; } -proxyDep('computed', function() { return require('discourse/lib/computed'); }); -proxyDep('Formatter', function() { return require('discourse/lib/formatter'); }); -proxyDep('PageTracker', function() { return require('discourse/lib/page-tracker').default; }); -proxyDep('URL', function() { return require('discourse/lib/url').default; }); -proxyDep('Quote', function() { return require('discourse/lib/quote').default; }); -proxyDep('debounce', function() { return require('discourse/lib/debounce').default; }); -proxyDep('View', function() { return Ember.View; }, "Use `Ember.View` instead"); +function methodMissing() { + console.warn("The " + this._removedName + " object has been removed from Discourse " + + "and your plugin needs to be updated."); +}; + +['reopen', 'registerButton'].forEach(function(m) { RemovedObject.prototype[m] = methodMissing; }); + +['discourse/views/post', 'discourse/components/post-menu'].forEach(function(moduleName) { + define(moduleName, [], function() { return new RemovedObject(moduleName); }); +}); + diff --git a/app/assets/javascripts/discourse/adapters/post-reply-history.js.es6 b/app/assets/javascripts/discourse/adapters/post-reply-history.js.es6 new file mode 100644 index 0000000000..335c22b6b5 --- /dev/null +++ b/app/assets/javascripts/discourse/adapters/post-reply-history.js.es6 @@ -0,0 +1,10 @@ +import RestAdapter from 'discourse/adapters/rest'; + +export default RestAdapter.extend({ + find(store, type, findArgs) { + const maxReplies = Discourse.SiteSettings.max_reply_history; + return Discourse.ajax(`/posts/${findArgs.postId}/reply-history?max_replies=${maxReplies}`).then(replies => { + return { post_reply_histories: replies }; + }); + }, +}); diff --git a/app/assets/javascripts/discourse/adapters/post-reply.js.es6 b/app/assets/javascripts/discourse/adapters/post-reply.js.es6 new file mode 100644 index 0000000000..f36299d002 --- /dev/null +++ b/app/assets/javascripts/discourse/adapters/post-reply.js.es6 @@ -0,0 +1,9 @@ +import RestAdapter from 'discourse/adapters/rest'; + +export default RestAdapter.extend({ + find(store, type, findArgs) { + return Discourse.ajax(`/posts/${findArgs.postId}/replies`).then(replies => { + return { post_replies: replies }; + }); + }, +}); diff --git a/app/assets/javascripts/discourse/components/actions-summary.js.es6 b/app/assets/javascripts/discourse/components/actions-summary.js.es6 deleted file mode 100644 index 533438852c..0000000000 --- a/app/assets/javascripts/discourse/components/actions-summary.js.es6 +++ /dev/null @@ -1,122 +0,0 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; -import { autoUpdatingRelativeAge } from 'discourse/lib/formatter'; -import { on } from 'ember-addons/ember-computed-decorators'; - -export default Ember.Component.extend(StringBuffer, { - tagName: 'section', - classNameBindings: [':post-actions', 'hidden'], - actionsSummary: Em.computed.alias('post.actionsWithoutLikes'), - emptySummary: Em.computed.empty('actionsSummary'), - hidden: Em.computed.and('emptySummary', 'post.notDeleted'), - usersByType: null, - - rerenderTriggers: ['actionsSummary.@each', 'post.deleted'], - - @on('init') - initUsersByType() { - this.set('usersByType', {}); - }, - - // This was creating way too many bound ifs and subviews in the handlebars version. - renderString(buffer) { - const usersByType = this.get('usersByType'); - - if (!this.get('emptySummary')) { - this.get('actionsSummary').forEach(function(c) { - const id = c.get('id'); - const users = usersByType[id] || []; - - buffer.push("
"); - - const renderLink = (dataAttribute, text) => { - buffer.push(` ${text}.`); - }; - - // TODO multi line expansion for flags - let iconsHtml = ""; - if (users.length) { - let postUrl; - users.forEach(function(u) { - const username = u.get('username'); - - iconsHtml += ``; - if (u.post_url) { - postUrl = postUrl || u.post_url; - } - iconsHtml += Discourse.Utilities.avatarImg({ - size: 'small', - avatarTemplate: u.get('avatar_template'), - title: u.get('username') - }); - iconsHtml += ""; - }); - - let key = 'post.actions.people.' + c.get('actionType.name_key'); - if (postUrl) { key = key + "_with_url"; } - - // TODO postUrl might be uninitialized? pick a good default - buffer.push(" " + I18n.t(key, { icons: iconsHtml, postUrl }) + "."); - } - - if (users.length === 0) { - renderLink('who-acted', c.get('description')); - } - - if (c.get('can_undo')) { - renderLink('undo', I18n.t("post.actions.undo." + c.get('actionType.name_key'))); - } - if (c.get('can_defer_flags')) { - renderLink('defer-flags', I18n.t("post.actions.defer_flags", { count: c.count })); - } - - - buffer.push("
"); - }); - } - - const post = this.get('post'); - if (post.get('deleted')) { - buffer.push("
" + - iconHTML('fa-trash-o') + ' ' + - Discourse.Utilities.tinyAvatar(post.get('postDeletedBy.avatar_template'), {title: post.get('postDeletedBy.username')}) + - autoUpdatingRelativeAge(new Date(post.get('postDeletedAt'))) + - "
"); - } - - buffer.push("
"); - }, - - actionTypeById(actionTypeId) { - return this.get('actionsSummary').findProperty('id', actionTypeId); - }, - - click(e) { - const $target = $(e.target); - let actionTypeId; - - const post = this.get('post'); - - if (actionTypeId = $target.data('defer-flags')) { - this.actionTypeById(actionTypeId).deferFlags(post); - return false; - } - - // User wants to know who actioned it - const usersByType = this.get('usersByType'); - if (actionTypeId = $target.data('who-acted')) { - this.actionTypeById(actionTypeId).loadUsers(post).then(users => { - usersByType[actionTypeId] = users; - this.rerender(); - }); - return false; - } - - if (actionTypeId = $target.data('undo')) { - this.get('actionsSummary').findProperty('id', actionTypeId).undo(post); - return false; - } - - return false; - } -}); diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index ddc86134cf..ff6193afa0 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -91,6 +91,8 @@ export default Ember.Component.extend({ _syncEditorAndPreviewScroll() { const $input = this.$('.d-editor-input'); + if (!$input) { return; } + const $preview = this.$('.d-editor-preview'); if ($input.scrollTop() === 0) { diff --git a/app/assets/javascripts/discourse/components/mount-widget.js.es6 b/app/assets/javascripts/discourse/components/mount-widget.js.es6 new file mode 100644 index 0000000000..d23485964f --- /dev/null +++ b/app/assets/javascripts/discourse/components/mount-widget.js.es6 @@ -0,0 +1,47 @@ +import { diff, patch } from 'virtual-dom'; +import { WidgetClickHook } from 'discourse/widgets/click-hook'; + +export default Ember.Component.extend({ + _tree: null, + _rootNode: null, + _timeout: null, + _widgetClass: null, + + init() { + this._super(); + this._widgetClass = this.container.lookupFactory(`widget:${this.get('widget')}`); + }, + + didInsertElement() { + WidgetClickHook.setupDocumentCallback(); + + this._rootNode = document.createElement('div'); + this.element.appendChild(this._rootNode); + this._timeout = Ember.run.scheduleOnce('render', this, this.rerenderWidget); + }, + + willDestroyElement() { + Ember.run.cancel(this._timeout); + }, + + queueRerender() { + Ember.run.scheduleOnce('render', this, this.rerenderWidget); + }, + + rerenderWidget() { + Ember.run.cancel(this._timeout); + if (this._rootNode) { + const t0 = new Date().getTime(); + + const opts = { model: this.get('model') }; + const newTree = new this._widgetClass(this.get('args'), this.container, opts); + + newTree._emberView = this; + const patches = diff(this._tree || this._rootNode, newTree); + this._rootNode = patch(this._rootNode, patches); + this._tree = newTree; + console.log('render: ', new Date().getTime() - t0); + } + } + +}); diff --git a/app/assets/javascripts/discourse/components/post-gap.js.es6 b/app/assets/javascripts/discourse/components/post-gap.js.es6 deleted file mode 100644 index 159d047f07..0000000000 --- a/app/assets/javascripts/discourse/components/post-gap.js.es6 +++ /dev/null @@ -1,44 +0,0 @@ -export default Ember.Component.extend({ - classNameBindings: [':gap', ':jagged-border', 'gap::hidden'], - - initGaps: function(){ - this.set('loading', false); - const before = this.get('before') === 'true'; - const gaps = before ? this.get('postStream.gaps.before') : this.get('postStream.gaps.after'); - - if (gaps) { - this.set('gap', gaps[this.get('post.id')]); - } - }.on('init'), - - gapsChanged: function(){ - this.initGaps(); - this.rerender(); - }.observes('post.hasGap'), - - render(buffer) { - if (this.get('loading')) { - buffer.push(I18n.t('loading')); - } else { - const gapLength = this.get('gap.length'); - if (gapLength) { - buffer.push(I18n.t('post.gap', {count: gapLength})); - } - } - }, - - click() { - if (this.get('loading') || (!this.get('gap'))) { return false; } - this.set('loading', true); - this.rerender(); - - const postStream = this.get('postStream'); - const filler = this.get('before') === 'true' ? postStream.fillGapBefore : postStream.fillGapAfter; - - filler.call(postStream, this.get('post'), this.get('gap')).then(() => { - this.set('gap', null); - }); - - return false; - } -}); diff --git a/app/assets/javascripts/discourse/components/post-gutter.js.es6 b/app/assets/javascripts/discourse/components/post-gutter.js.es6 deleted file mode 100644 index 9889184d1f..0000000000 --- a/app/assets/javascripts/discourse/components/post-gutter.js.es6 +++ /dev/null @@ -1,85 +0,0 @@ -const MAX_SHOWN = 5; - -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; -import computed from 'ember-addons/ember-computed-decorators'; - -const { get, isEmpty, Component } = Ember; - -export default Component.extend(StringBuffer, { - classNameBindings: [':gutter'], - - rerenderTriggers: ['expanded'], - - // Roll up links to avoid duplicates - @computed('links') - collapsed(links) { - const seen = {}; - const result = []; - - if (!isEmpty(links)) { - links.forEach(function(l) { - const title = get(l, 'title'); - if (!seen[title]) { - result.pushObject(l); - seen[title] = true; - } - }); - } - return result; - }, - - renderString(buffer) { - const links = this.get('collapsed'); - const collapsed = !this.get('expanded'); - - if (!isEmpty(links)) { - let toRender = links; - if (collapsed) { - toRender = toRender.slice(0, MAX_SHOWN); - } - - buffer.push("'); - } - - if (this.get('canReplyAsNewTopic')) { - buffer.push(`${iconHTML('plus')}${I18n.t('post.reply_as_new_topic')}`); - } - }, - - click(e) { - const $target = $(e.target); - if ($target.hasClass('toggle-more')) { - this.toggleProperty('expanded'); - return false; - } else if ($target.closest('.reply-new').length) { - this.sendAction('newTopicAction', this.get('post')); - return false; - } - return true; - } -}); diff --git a/app/assets/javascripts/discourse/components/post-menu.js.es6 b/app/assets/javascripts/discourse/components/post-menu.js.es6 deleted file mode 100644 index ef63cd9d24..0000000000 --- a/app/assets/javascripts/discourse/components/post-menu.js.es6 +++ /dev/null @@ -1,440 +0,0 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; -import { iconHTML } from 'discourse/helpers/fa-icon'; - -// Helper class for rendering a button -export const Button = function(action, label, icon, opts) { - this.action = action; - this.label = label; - - if (typeof icon === "object") { - this.opts = icon; - } else { - this.icon = icon; - } - this.opts = this.opts || opts || {}; -}; - -function animateHeart($elem, start, end, complete) { - if (Ember.testing) { return Ember.run(this, complete); } - - $elem.stop() - .css('textIndent', start) - .animate({ textIndent: end }, { - complete, - step(now) { - $(this).css('transform','scale('+now+')'); - }, - duration: 150 - }, 'linear'); -} - -Button.prototype.render = function(buffer) { - const opts = this.opts; - - const label = I18n.t(this.label, opts.labelOptions); - if (opts.prefixHTML) { - buffer.push(opts.prefixHTML); - } - buffer.push(""); -}; - -let hiddenButtons; - -const PostMenuComponent = Ember.Component.extend(StringBuffer, { - tagName: 'section', - classNames: ['post-menu-area', 'clearfix'], - - rerenderTriggers: [ - 'post.deleted_at', - 'post.likeAction.count', - 'post.likeAction.users.length', - 'post.reply_count', - 'post.showRepliesBelow', - 'post.can_delete', - 'post.bookmarked', - 'post.shareUrl', - 'post.topic.deleted_at', - 'post.replies.length', - 'post.wiki', - 'post.post_type', - 'collapsed'], - - _collapsedByDefault: function() { - this.set('collapsed', true); - }.on('init'), - - renderString(buffer) { - const post = this.get('post'); - - buffer.push(""); - }, - - // Delegate click actions - click(e) { - const $target = $(e.target); - const action = $target.data('action') || $target.parent().data('action'); - - if ($target.prop('disabled') || $target.parent().prop('disabled')) { return; } - - if (!action) return; - const handler = this["click" + action.classify()]; - if (!handler) return; - - handler.call(this, this.get('post')); - }, - - // Replies Button - renderReplies(post, buffer) { - if (!post.get('showRepliesBelow')) return; - - const replyCount = post.get('reply_count'); - buffer.push(""); - }, - - renderButtons(post, buffer) { - const self = this; - const allButtons = []; - let visibleButtons = []; - - if (typeof hiddenButtons === "undefined") { - if (!Em.isEmpty(this.siteSettings.post_menu_hidden_items)) { - hiddenButtons = this.siteSettings.post_menu_hidden_items.split('|'); - } else { - hiddenButtons = []; - } - } - - if (post.get("bookmarked")) { - hiddenButtons.removeObject("bookmark"); - } - - const yours = post.get('yours'); - this.siteSettings.post_menu.split("|").forEach(function(i) { - const creator = self["buttonFor" + i.classify()]; - if (creator) { - const button = creator.call(self, post); - if (button) { - allButtons.push(button); - if ((yours && button.opts.alwaysShowYours) || - (post.get('wiki') && button.opts.alwaysShowWiki) || - (hiddenButtons.indexOf(i) === -1)) { - visibleButtons.push(button); - } - } - } - }); - - // Only show ellipsis if there is more than one button hidden - // if there are no more buttons, we are not collapsed - const collapsed = this.get('collapsed'); - if (!collapsed || (allButtons.length <= visibleButtons.length + 1)) { - visibleButtons = allButtons; - if (collapsed) { this.set('collapsed', false); } - } else { - visibleButtons.splice(visibleButtons.length - 1, 0, this.buttonForShowMoreActions(post)); - } - - const callbacks = PostMenuComponent._registerButtonCallbacks; - if (callbacks) { - _.each(callbacks, function(callback) { - callback.apply(self, [visibleButtons]); - }); - } - - buffer.push('
'); - visibleButtons.forEach((b) => b.render(buffer)); - buffer.push("
"); - }, - - clickLikeCount() { - this.sendActionTarget('toggleWhoLiked'); - }, - - sendActionTarget(action, arg) { - const target = this.get(`${action}Target`); - return target ? target.send(this.get(action), arg) : this.sendAction(action, arg); - }, - - clickReplies() { - if (this.get('post.replies.length') > 0) { - this.set('post.replies', []); - } else { - this.get('post').loadReplies(); - } - }, - - // Delete button - buttonForDelete(post) { - let label, icon; - - if (post.get('post_number') === 1) { - // If it's the first post, the delete/undo actions are related to the topic - const topic = post.get('topic'); - if (topic.get('deleted_at')) { - if (!topic.get('details.can_recover')) { return; } - label = "topic.actions.recover"; - icon = "undo"; - } else { - if (!topic.get('details.can_delete')) { return; } - label = "topic.actions.delete"; - icon = "trash-o"; - } - - } else { - // The delete actions target the post iteself - if (post.get('deleted_at') || post.get('user_deleted')) { - if (!post.get('can_recover')) { return; } - label = "post.controls.undelete"; - icon = "undo"; - } else { - if (!post.get('can_delete')) { return; } - label = "post.controls.delete"; - icon = "trash-o"; - } - } - const action = (icon === 'trash-o') ? 'delete' : 'recover'; - let opts; - if (icon === "trash-o"){ - opts = {className: 'delete'}; - } - return new Button(action, label, icon, opts); - }, - - clickRecover(post) { - this.sendAction('recoverPost', post); - }, - - clickDelete(post) { - this.sendAction('deletePost', post); - }, - - // Like button - buttonForLike() { - const likeAction = this.get('post.likeAction'); - if (!likeAction) { return; } - - const className = likeAction.get('acted') ? 'has-like fade-out' : 'like'; - const opts = {className: className}; - - if (likeAction.get('canToggle')) { - const descKey = likeAction.get('acted') ? 'post.controls.undo_like' : 'post.controls.like'; - return new Button('like', descKey, 'heart', opts); - } else if (likeAction.get('acted')) { - opts.disabled = true; - return new Button('like', 'post.controls.has_liked', 'heart', opts); - } - }, - - buttonForLikeCount() { - const likeCount = this.get('post.likeAction.count') || 0; - if (likeCount > 0) { - const likedPost = !!this.get('post.likeAction.acted'); - - const label = likedPost - ? likeCount === 1 ? 'post.has_likes_title_only_you' : 'post.has_likes_title_you' - : 'post.has_likes_title'; - - return new Button('like-count', label, undefined, { - className: 'like-count highlight-action', - innerHTML: I18n.t("post.has_likes", { count: likeCount }), - labelOptions: {count: likedPost ? (likeCount-1) : likeCount} - }); - } - }, - - clickLike(post) { - const $heart = this.$('.fa-heart'), - $likeButton = this.$('button[data-action=like]'), - acted = post.get('likeAction.acted'), - self = this; - - if (acted) { - this.sendActionTarget('toggleLike'); - $likeButton.removeClass('has-like').addClass('like'); - } else { - const scale = [1.0, 1.5]; - animateHeart($heart, scale[0], scale[1], function() { - animateHeart($heart, scale[1], scale[0], function() { - self.sendActionTarget('toggleLike'); - $likeButton.removeClass('like').addClass('has-like'); - }); - }); - } - }, - - // Flag button - buttonForFlag(post) { - if (Em.isEmpty(post.get('flagsAvailable'))) return; - return new Button('flag', 'post.controls.flag', 'flag'); - }, - - clickFlag(post) { - this.sendAction('showFlags', post); - }, - - // Edit button - buttonForEdit(post) { - if (!post.get('can_edit')) return; - return new Button('edit', 'post.controls.edit', 'pencil', { - alwaysShowYours: true, - alwaysShowWiki: true - }); - }, - - clickEdit(post) { - this.sendAction('editPost', post); - }, - - // Share button - buttonForShare(post) { - const options = { - shareUrl: post.get('shareUrl'), - postNumber: post.get('post_number') - }; - return new Button('share', 'post.controls.share', 'link', options); - }, - - // Reply button - buttonForReply() { - if (!this.get('canCreatePost')) return; - const options = {className: 'create fade-out'}; - - if(!Discourse.Mobile.mobileView) { - options.textLabel = 'topic.reply.title'; - } - - return new Button('reply', 'post.controls.reply', 'reply', options); - }, - - clickReply(post) { - this.sendAction('replyToPost', post); - }, - - // Bookmark button - buttonForBookmark(post) { - if (!Discourse.User.current()) return; - - let iconClass = 'read-icon', - buttonClass = 'bookmark', - tooltip = 'bookmarks.not_bookmarked'; - - if (post.get('bookmarked')) { - iconClass += ' bookmarked'; - buttonClass += ' bookmarked'; - tooltip = 'bookmarks.created'; - } - - return new Button('bookmark', tooltip, {className: buttonClass, innerHTML: "
"}); - }, - - clickBookmark(post) { - this.sendAction('toggleBookmark', post); - }, - - // Wiki button - buttonForWiki(post) { - if (!post.get('can_wiki')) return; - - if (post.get('wiki')) { - return new Button('wiki', 'post.controls.unwiki', 'pencil-square-o', {className: 'wiki wikied'}); - } else { - return new Button('wiki', 'post.controls.wiki', 'pencil-square-o', {className: 'wiki'}); - } - }, - - clickWiki(post) { - this.sendAction('toggleWiki', post); - }, - - buttonForAdmin() { - if (!Discourse.User.currentProp('canManageTopic')) { return; } - return new Button('admin', 'post.controls.admin', 'wrench'); - }, - - renderAdminPopup(post, buffer) { - if (!Discourse.User.currentProp('canManageTopic')) { return; } - - const isModerator = post.get('post_type') === this.site.get('post_types.moderator_action'), - postTypeIcon = iconHTML('shield'), - postTypeText = isModerator ? I18n.t('post.controls.revert_to_regular') : I18n.t('post.controls.convert_to_moderator'), - rebakePostIcon = iconHTML('cog'), - rebakePostText = I18n.t('post.controls.rebake'), - unhidePostIcon = iconHTML('eye'), - unhidePostText = I18n.t('post.controls.unhide'), - changePostOwnerIcon = iconHTML('user'), - changePostOwnerText = I18n.t('post.controls.change_owner'); - - const html = '
' + - '

' + I18n.t('admin_title') + '

' + - '
    ' + - (Discourse.User.currentProp('staff') ? '
  • ' + postTypeIcon + postTypeText + '
  • ' : '') + - '
  • ' + rebakePostIcon + rebakePostText + '
  • ' + - (post.hidden ? '
  • ' + unhidePostIcon + unhidePostText + '
  • ' : '') + - (Discourse.User.currentProp('admin') ? '
  • ' + changePostOwnerIcon + changePostOwnerText + '
  • ' : '') + - '
' + - '
'; - - buffer.push(html); - }, - - clickAdmin() { - const $postAdminMenu = this.$(".post-admin-menu"); - $postAdminMenu.show(); - $("html").on("mouseup.post-admin-menu", function() { - $postAdminMenu.hide(); - $("html").off("mouseup.post-admin-menu"); - }); - }, - - clickTogglePostType() { - this.sendAction("togglePostType", this.get("post")); - }, - - clickRebakePost() { - this.sendAction("rebakePost", this.get("post")); - }, - - clickUnhidePost() { - this.sendAction("unhidePost", this.get("post")); - }, - - clickChangePostOwner() { - this.sendAction("changePostOwner", this.get("post")); - }, - - buttonForShowMoreActions() { - return new Button('showMoreActions', 'show_more', 'ellipsis-h'); - }, - - clickShowMoreActions() { - this.set('collapsed', false); - } - -}); - -PostMenuComponent.reopenClass({ - registerButton(callback){ - this._registerButtonCallbacks = this._registerButtonCallbacks || []; - this._registerButtonCallbacks.push(callback); - } -}); - -export default PostMenuComponent; diff --git a/app/assets/javascripts/discourse/components/poster-name.js.es6 b/app/assets/javascripts/discourse/components/poster-name.js.es6 deleted file mode 100644 index 7f213f7c00..0000000000 --- a/app/assets/javascripts/discourse/components/poster-name.js.es6 +++ /dev/null @@ -1,77 +0,0 @@ -import { setting } from 'discourse/lib/computed'; - -const PosterNameComponent = Em.Component.extend({ - classNames: ['names', 'trigger-user-card'], - displayNameOnPosts: setting('display_name_on_posts'), - - // sanitize name for comparison - sanitizeName(name){ - return name.toLowerCase().replace(/[\s_-]/g,''); - }, - - render(buffer) { - const post = this.get('post'); - - if (post) { - const username = post.get('username'), - primaryGroupName = post.get('primary_group_name'), - url = post.get('usernameUrl'); - - var linkClass = 'username', - name = post.get('name'); - - if (post.get('staff')) { linkClass += ' staff'; } - if (post.get('admin')) { linkClass += ' admin'; } - if (post.get('moderator')) { linkClass += ' moderator'; } - if (post.get('new_user')) { linkClass += ' new-user'; } - - if (!Em.isEmpty(primaryGroupName)) { - linkClass += ' ' + primaryGroupName; - } - // Main link - buffer.push("" + username + ""); - - // Add a glyph if we have one - const glyph = this.posterGlyph(post); - if (!Em.isEmpty(glyph)) { - buffer.push(glyph); - } - buffer.push(""); - - // Are we showing full names? - if (name && this.get('displayNameOnPosts') && (this.sanitizeName(name) !== this.sanitizeName(username))) { - name = Discourse.Utilities.escapeExpression(name); - buffer.push("" + name + ""); - } - - // User titles - let title = post.get('user_title'); - if (!Em.isEmpty(title)) { - - title = Discourse.Utilities.escapeExpression(title); - buffer.push(''); - if (Em.isEmpty(primaryGroupName)) { - buffer.push(title); - } else { - buffer.push("" + title + ""); - } - buffer.push(""); - } - - PosterNameComponent.trigger('renderedName', buffer, post); - } - }, - - // Overwrite this to give a user a custom font awesome glyph. - posterGlyph(post) { - if(post.get('moderator')) { - const desc = I18n.t('user.moderator_tooltip'); - return ''; - } - } -}); - -// Support for event triggering -PosterNameComponent.reopenClass(Em.Evented); - -export default PosterNameComponent; diff --git a/app/assets/javascripts/discourse/components/private-message-map.js.es6 b/app/assets/javascripts/discourse/components/private-message-map.js.es6 deleted file mode 100644 index 0d01910c72..0000000000 --- a/app/assets/javascripts/discourse/components/private-message-map.js.es6 +++ /dev/null @@ -1,27 +0,0 @@ -export default Ember.Component.extend({ - layoutName: 'components/private-message-map', - tagName: 'section', - classNames: ['information'], - details: Em.computed.alias('topic.details'), - - actions: { - removeAllowedUser: function(user) { - var self = this; - bootbox.dialog(I18n.t("private_message_info.remove_allowed_user", {name: user.get('username')}), [ - {label: I18n.t("no_value"), - 'class': 'btn-danger right'}, - {label: I18n.t("yes_value"), - 'class': 'btn-primary', - callback: function() { - self.get('topic.details').removeAllowedUser(user); - } - } - ]); - }, - - showPrivateInvite: function() { - this.sendAction('showPrivateInviteAction'); - } - } - -}); diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 new file mode 100644 index 0000000000..a8ae4b7afa --- /dev/null +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -0,0 +1,145 @@ +import { keyDirty } from 'discourse/widgets/widget'; +import MountWidget from 'discourse/components/mount-widget'; + +function findTopView($posts, viewportTop, min, max) { + if (max < min) { return min; } + + while(max>min){ + const mid = Math.floor((min + max) / 2); + const $post = $($posts[mid]); + const viewBottom = $post.position().top + $post.height(); + + if (viewBottom > viewportTop) { + max = mid-1; + } else { + min = mid+1; + } + } + + return min; +} + +export default MountWidget.extend({ + widget: 'post-stream', + _topVisible: null, + _bottomVisible: null, + + args: Ember.computed(function() { + return this.getProperties('posts', + 'canCreatePost', + 'multiSelect', + 'selectedQuery', + 'selectedPostsCount', + 'searchService'); + }).volatile(), + + scrolled() { + const $w = $(window); + const windowHeight = window.innerHeight ? window.innerHeight : $w.height(); + const slack = Math.round(windowHeight * 15); + const onscreen = []; + + let windowTop = $w.scrollTop(); + + const $posts = this.$('article.boxed'); + const viewportTop = windowTop - slack; + const topView = findTopView($posts, viewportTop, 0, $posts.length-1); + + let windowBottom = windowTop + windowHeight; + let viewportBottom = windowBottom + slack; + + const bodyHeight = $('body').height(); + if (windowBottom > bodyHeight) { windowBottom = bodyHeight; } + if (viewportBottom > bodyHeight) { viewportBottom = bodyHeight; } + + let bottomView = topView; + while (bottomView < $posts.length) { + const post = $posts[bottomView]; + const $post = $(post); + + if (!$post) { break; } + + const viewTop = $post.offset().top; + const viewBottom = viewTop + $post.height(); + + if (viewTop > viewportBottom) { break; } + + if (viewBottom > windowTop && viewTop <= windowBottom) { + onscreen.push(bottomView); + } + + bottomView++; + } + + const posts = this.posts; + if (onscreen.length) { + + const refresh = () => this.queueRerender(); + const first = posts.objectAt(onscreen[0]); + if (this._topVisible !== first) { + this._topVisible = first; + const $body = $('body'); + const elem = $posts[onscreen[0]]; + const elemId = elem.id; + const $elem = $(elem); + const elemPos = $elem.position(); + const distToElement = elemPos ? $body.scrollTop() - elemPos.top : 0; + + const topRefresh = () => { + refresh(); + + Ember.run.next(() => { + const $refreshedElem = $(elemId); + + // Quickly going back might mean the element is destroyed + const position = $refreshedElem.position(); + if (position && position.top) { + $('html, body').scrollTop(position.top + distToElement); + } + }); + }; + this.sendAction('topVisibleChanged', { post: first, refresh: topRefresh }); + } + + const last = posts.objectAt(onscreen[onscreen.length-1]); + if (this._bottomVisible !== last) { + this._bottomVisible = last; + this.sendAction('bottomVisibleChanged', { post: last, refresh }); + } + } else { + this._topVisible = null; + this._bottomVisible = null; + } + + const onscreenPostNumbers = onscreen.map(idx => posts.objectAt(idx).post_number); + this.screenTrack.setOnscreen(onscreenPostNumbers); + }, + + _scrollTriggered() { + Ember.run.scheduleOnce('afterRender', this, this.scrolled); + }, + + didInsertElement() { + this._super(); + const debouncedScroll = () => Ember.run.debounce(this, this._scrollTriggered, 10); + + $(document).bind('touchmove.post-stream', debouncedScroll); + $(window).bind('scroll.post-stream', debouncedScroll); + this._scrollTriggered(); + + this.appEvents.on('post-stream:refresh', postId => { + if (postId) { + keyDirty(`post-${postId}`); + } + this.queueRerender(); + }); + }, + + willDestroyElement() { + this._super(); + $(document).unbind('touchmove.post-stream'); + $(window).unbind('scroll.post-stream'); + this.appEvents.off('post-stream:refresh'); + } + +}); diff --git a/app/assets/javascripts/discourse/components/small-action.js.es6 b/app/assets/javascripts/discourse/components/small-action.js.es6 index 5674363489..b66024987e 100644 --- a/app/assets/javascripts/discourse/components/small-action.js.es6 +++ b/app/assets/javascripts/discourse/components/small-action.js.es6 @@ -1,33 +1,17 @@ import { autoUpdatingRelativeAge } from 'discourse/lib/formatter'; -import computed from 'ember-addons/ember-computed-decorators'; -const icons = { - 'closed.enabled': 'lock', - 'closed.disabled': 'unlock-alt', - 'autoclosed.enabled': 'lock', - 'autoclosed.disabled': 'unlock-alt', - 'archived.enabled': 'folder', - 'archived.disabled': 'folder-open', - 'pinned.enabled': 'thumb-tack', - 'pinned.disabled': 'thumb-tack unpinned', - 'pinned_globally.enabled': 'thumb-tack', - 'pinned_globally.disabled': 'thumb-tack unpinned', - 'visible.enabled': 'eye', - 'visible.disabled': 'eye-slash', - 'split_topic': 'sign-out', - 'invited_user': 'plus-circle', - 'removed_user': 'minus-circle' -}; +export function actionDescriptionHtml(actionCode, createdAt, username) { + const dt = new Date(createdAt); + const when = autoUpdatingRelativeAge(dt, { format: 'medium-with-ago' }); + const who = username ? `@${username}` : ""; + return I18n.t(`action_codes.${actionCode}`, { who, when }).htmlSafe(); +} export function actionDescription(actionCode, createdAt, username) { return function() { const ac = this.get(actionCode); if (ac) { - const dt = new Date(this.get(createdAt)); - const when = autoUpdatingRelativeAge(dt, { format: 'medium-with-ago' }); - const u = this.get(username); - const who = u ? `@${u}` : ""; - return I18n.t(`action_codes.${ac}`, { who, when }).htmlSafe(); + return actionDescriptionHtml(ac, this.get(createdAt), this.get(username)); } }.property(actionCode, createdAt); } @@ -38,11 +22,6 @@ export default Ember.Component.extend({ description: actionDescription('actionCode', 'post.created_at', 'post.action_code_who'), - @computed("actionCode") - icon(actionCode) { - return icons[actionCode] || 'exclamation'; - }, - actions: { edit() { this.sendAction('editPost', this.get('post')); diff --git a/app/assets/javascripts/discourse/components/time-gap.js.es6 b/app/assets/javascripts/discourse/components/time-gap.js.es6 deleted file mode 100644 index 9e410c4b73..0000000000 --- a/app/assets/javascripts/discourse/components/time-gap.js.es6 +++ /dev/null @@ -1,21 +0,0 @@ -import SmallActionComponent from 'discourse/components/small-action'; - -export default SmallActionComponent.extend({ - classNames: ['time-gap'], - classNameBindings: ['hideTimeGap::hidden'], - hideTimeGap: Em.computed.alias('postStream.hasNoFilters'), - icon: 'clock-o', - - description: function() { - const gapDays = this.get('daysAgo'); - if (gapDays < 30) { - return I18n.t('dates.later.x_days', {count: gapDays}); - } else if (gapDays < 365) { - const gapMonths = Math.floor(gapDays / 30); - return I18n.t('dates.later.x_months', {count: gapMonths}); - } else { - const gapYears = Math.floor(gapDays / 365); - return I18n.t('dates.later.x_years', {count: gapYears}); - } - }.property(), -}); diff --git a/app/assets/javascripts/discourse/components/toggle-summary.js.es6 b/app/assets/javascripts/discourse/components/toggle-summary.js.es6 deleted file mode 100644 index 45dad26601..0000000000 --- a/app/assets/javascripts/discourse/components/toggle-summary.js.es6 +++ /dev/null @@ -1,12 +0,0 @@ -export default Ember.Component.extend({ - layoutName: 'components/toggle-summary', - tagName: 'section', - classNames: ['information'], - postStream: Em.computed.alias('topic.postStream'), - - actions: { - toggleSummary() { - this.get('postStream').toggleSummary(); - } - } -}); diff --git a/app/assets/javascripts/discourse/components/topic-map.js.es6 b/app/assets/javascripts/discourse/components/topic-map.js.es6 deleted file mode 100644 index b09d1a2d8e..0000000000 --- a/app/assets/javascripts/discourse/components/topic-map.js.es6 +++ /dev/null @@ -1,46 +0,0 @@ -var LINKS_SHOWN = 5; - -export default Ember.Component.extend({ - mapCollapsed: true, - layoutName: 'components/topic-map', - details: Em.computed.alias('topic.details'), - allLinksShown: false, - - init: function() { - this._super(); - - // If the topic has a summary, expand the map by default - this.set('mapCollapsed', Discourse.Mobile.mobileView || (!this.get('topic.has_summary'))); - }, - - showPosterAvatar: Em.computed.gt('topic.posts_count', 2), - - toggleMapClass: function() { - return this.get('mapCollapsed') ? 'chevron-down' : 'chevron-up'; - }.property('mapCollapsed'), - - showAllLinksControls: function() { - if (this.get('allLinksShown')) return false; - if ((this.get('details.links.length') || 0) <= LINKS_SHOWN) return false; - return true; - }.property('allLinksShown', 'topic.details.links'), - - infoLinks: function() { - var allLinks = this.get('details.links'); - if (Em.isNone(allLinks)) return []; - - if (this.get('allLinksShown')) return allLinks; - return allLinks.slice(0, LINKS_SHOWN); - - }.property('details.links', 'allLinksShown'), - - actions: { - toggleMap: function() { - this.toggleProperty('mapCollapsed'); - }, - - showAllLinks: function() { - this.set('allLinksShown', true); - } - } -}); diff --git a/app/assets/javascripts/discourse/components/topic-participant.js.es6 b/app/assets/javascripts/discourse/components/topic-participant.js.es6 deleted file mode 100644 index e8e58ea34f..0000000000 --- a/app/assets/javascripts/discourse/components/topic-participant.js.es6 +++ /dev/null @@ -1,18 +0,0 @@ -export default Ember.Component.extend({ - - postStream: Em.computed.alias('participant.topic.postStream'), - showPostCount: Em.computed.gte('participant.post_count', 2), - - toggled: function() { - return this.get('postStream.userFilters').contains(this.get('participant.username')); - }.property('postStream.userFilters.[]'), - - actions: { - toggle() { - const postStream = this.get('postStream'); - if (postStream) { - postStream.toggleParticipant(this.get('participant.username')); - } - } - } -}); diff --git a/app/assets/javascripts/discourse/components/who-liked.js.es6 b/app/assets/javascripts/discourse/components/who-liked.js.es6 deleted file mode 100644 index 412dfecdeb..0000000000 --- a/app/assets/javascripts/discourse/components/who-liked.js.es6 +++ /dev/null @@ -1,26 +0,0 @@ -import StringBuffer from 'discourse/mixins/string-buffer'; - -export default Ember.Component.extend(StringBuffer, { - rerenderTriggers: ['users.length'], - - renderString(buffer) { - const users = this.get('users'); - if (users && users.get('length') > 0) { - buffer.push("
"); - let iconsHtml = ""; - users.forEach(function(u) { - iconsHtml += ""; - iconsHtml += Discourse.Utilities.avatarImg({ - size: 'small', - avatarTemplate: u.get('avatar_template'), - title: u.get('username') - }); - iconsHtml += ""; - }); - buffer.push(I18n.t('post.actions.people.like',{icons: iconsHtml})); - buffer.push("
"); - } else { - buffer.push(""); - } - } -}); diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index 88e6c532be..b7c1ae0d00 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -289,6 +289,7 @@ export default Ember.Controller.extend({ self.destroyDraft(); } + self.appEvents.trigger('post-stream:refresh'); self.close(); const currentUser = Discourse.User.current(); @@ -587,14 +588,6 @@ export default Ember.Controller.extend({ $('.d-editor-input').autocomplete({ cancel: true }); }, - showOptions() { - var _ref; - return (_ref = this.get('controllers.modal')) ? _ref.show(Discourse.ArchetypeOptionsModalView.create({ - archetype: this.get('model.archetype'), - metaData: this.get('model.metaData') - })) : void 0; - }, - canEdit: function() { return this.get("model.action") === "edit" && Discourse.User.current().get("can_edit"); }.property("model.action"), diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index 2fe9e6ee7b..b4bb45fd08 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -19,7 +19,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { loadedAllPosts: Em.computed.or('model.postStream.loadedAllPosts', 'model.postStream.loadingLastPost'), enteredAt: null, retrying: false, - firstPostExpanded: false, adminMenuVisible: false, showRecover: Em.computed.and('model.deleted', 'model.details.can_recover'), @@ -100,7 +99,60 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { DiscourseURL.routeTo(url); }, + selectedQuery: function() { + return post => this.postSelected(post); + }.property(), + actions: { + + fillGapBefore(args) { + return this.get('model.postStream').fillGapBefore(args.post, args.gap); + }, + + fillGapAfter(args) { + return this.get('model.postStream').fillGapAfter(args.post, args.gap); + }, + + // Called the the topmost visible post on the page changes. + topVisibleChanged(event) { + const { post, refresh } = event; + + if (!post) { return; } + + const postStream = this.get('model.postStream'); + const firstLoadedPost = postStream.get('posts.firstObject'); + + this.set('model.currentPost', post.get('post_number')); + + if (post.get('post_number') === 1) { return; } + + if (firstLoadedPost && firstLoadedPost === post) { + postStream.prependMore().then(() => refresh()); + } + }, + + // Called the the bottommost visible post on the page changes. + bottomVisibleChanged(event) { + const { post, refresh } = event; + + const postStream = this.get('model.postStream'); + const lastLoadedPost = postStream.get('posts.lastObject'); + + this.set('controllers.topic-progress.progressPosition', postStream.progressIndexOfPost(post)); + + if (lastLoadedPost && lastLoadedPost === post) { + postStream.appendMore().then(() => refresh()); + } + }, + + toggleSummary() { + return this.get('model.postStream').toggleSummary(); + }, + + removeAllowedUser(user) { + return this.get('model.details').removeAllowedUser(user); + }, + showTopicAdminMenu() { this.set('adminMenuVisible', true); }, @@ -113,7 +165,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { this.deleteTopic(); }, - archiveMessage() { const topic = this.get('model'); topic.archiveMessage().then(()=>{ @@ -176,8 +227,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { // Deleting the first post deletes the topic if (post.get('post_number') === 1) { - this.deleteTopic(); - return; + return this.deleteTopic(); } else if (!post.can_delete) { // check if current user can delete post return false; @@ -210,7 +260,9 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { } ]); } else { - post.destroy(user).catch(function(error) { + return post.destroy(user).then(() => { + this.appEvents.trigger('post-stream:refresh'); + }).catch(error => { popupAjaxError(error); post.undoDeleteState(); }); @@ -245,7 +297,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, toggleBookmark(post) { - if (!Discourse.User.current()) { + if (!this.currentUser) { alert(I18n.t("bookmarks.not_bookmarked")); return; } @@ -261,18 +313,20 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, selectAll() { - const posts = this.get('model.postStream.posts'), - selectedPosts = this.get('selectedPosts'); + const posts = this.get('model.postStream.posts'); + const selectedPosts = this.get('selectedPosts'); if (posts) { selectedPosts.addObjects(posts); } this.set('allPostsSelected', true); + this.appEvents.trigger('post-stream:refresh'); }, deselectAll() { this.get('selectedPosts').clear(); this.get('selectedReplies').clear(); this.set('allPostsSelected', false); + this.appEvents.trigger('post-stream:refresh'); }, toggleParticipant(user) { @@ -293,6 +347,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { toggleMultiSelect() { this.toggleProperty('multiSelect'); + this.appEvents.trigger('post-stream:refresh'); }, finishedEditingTopic() { @@ -447,18 +502,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }); }, - expandFirstPost(post) { - const self = this; - this.set('loadingExpanded', true); - post.expand().then(function() { - self.set('firstPostExpanded', true); - }).catch(function(error) { - bootbox.alert($.parseJSON(error.responseText).errors); - }).finally(function() { - self.set('loadingExpanded', false); - }); - }, - retryLoading() { const self = this; self.set('retrying', true); @@ -470,22 +513,22 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, toggleWiki(post) { - post.updatePostField('wiki', !post.get('wiki')); + return post.updatePostField('wiki', !post.get('wiki')); }, togglePostType(post) { const regular = this.site.get('post_types.regular'); const moderator = this.site.get('post_types.moderator_action'); - post.updatePostField('post_type', post.get('post_type') === moderator ? regular : moderator); + return post.updatePostField('post_type', post.get('post_type') === moderator ? regular : moderator); }, rebakePost(post) { - post.rebake(); + return post.rebake(); }, unhidePost(post) { - post.unhide(); + return post.unhide(); }, changePostOwner(post) { @@ -498,11 +541,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { this.send('togglePinnedForUser'); }, - showExpandButton: function() { - const post = this.get('post'); - return post.get('post_number') === 1 && post.get('topic.expandable_first_post'); - }.property(), - canMergeTopic: function() { if (!this.get('model.details.can_move_posts')) return false; return this.get('selectedPostsCount') > 0; @@ -598,9 +636,10 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { // Unsubscribe before subscribing again this.unsubscribe(); - const self = this; - this.messageBus.subscribe("/topic/" + this.get('model.id'), function(data) { - const topic = self.get('model'); + const refresh = (id) => this.appEvents.trigger('post-stream:refresh', id); + + this.messageBus.subscribe("/topic/" + this.get('model.id'), data => { + const topic = this.get('model'); if (data.notification_level_change) { topic.set('details.notification_level', data.notification_level_change); @@ -608,26 +647,26 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { return; } - const postStream = self.get('model.postStream'); + const postStream = this.get('model.postStream'); switch (data.type) { case "revised": case "acted": case "rebaked": { // TODO we could update less data for "acted" (only post actions) - postStream.triggerChangedPost(data.id, data.updated_at); + postStream.triggerChangedPost(data.id, data.updated_at).then(() => refresh(data.id)); return; } case "deleted": { - postStream.triggerDeletedPost(data.id, data.post_number); + postStream.triggerDeletedPost(data.id, data.post_number).then(() => refresh(data.id)); return; } case "recovered": { - postStream.triggerRecoveredPost(data.id, data.post_number); + postStream.triggerRecoveredPost(data.id, data.post_number).then(() => refresh(data.id)); return; } case "created": { - postStream.triggerNewPostInStream(data.id); - if (self.get('currentUser.id') !== data.user_id) { + postStream.triggerNewPostInStream(data.id).then(() => refresh()); + if (this.get('currentUser.id') !== data.user_id) { Discourse.notifyBackgroundCountIncrement(); } return; @@ -709,59 +748,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { } }, - // Called the the topmost visible post on the page changes. - topVisibleChanged(post) { - if (!post) { return; } - - const postStream = this.get('model.postStream'); - const firstLoadedPost = postStream.get('posts.firstObject'); - - this.set('model.currentPost', post.get('post_number')); - - if (post.get('post_number') === 1) { return; } - - if (firstLoadedPost && firstLoadedPost === post) { - // Note: jQuery shouldn't be done in a controller, but how else can we - // trigger a scroll after a promise resolves in a controller? We need - // to do this to preserve upwards infinte scrolling. - const $body = $('body'); - const elemId = `#post_${post.get('post_number')}`; - const $elem = $(elemId).closest('.post-cloak'); - const elemPos = $elem.position(); - const distToElement = elemPos ? $body.scrollTop() - elemPos.top : 0; - - postStream.prependMore().then(function() { - Em.run.next(function () { - const $refreshedElem = $(elemId).closest('.post-cloak'); - - // Quickly going back might mean the element is destroyed - const position = $refreshedElem.position(); - if (position && position.top) { - $('html, body').scrollTop(position.top + distToElement); - } - }); - }); - } - }, - - /** - Called the the bottommost visible post on the page changes. - - @method bottomVisibleChanged - @params {Discourse.Post} post that is at the bottom - **/ - bottomVisibleChanged(post) { - if (!post) { return; } - - const postStream = this.get('model.postStream'); - const lastLoadedPost = postStream.get('posts.lastObject'); - - this.set('controllers.topic-progress.progressPosition', postStream.progressIndexOfPost(post)); - - if (lastLoadedPost && lastLoadedPost === post) { - postStream.appendMore(); - } - }, _showFooter: function() { const showFooter = this.get("model.postStream.loaded") && this.get("model.postStream.loadedAllPosts"); diff --git a/app/assets/javascripts/discourse/ember/resolver.js.es6 b/app/assets/javascripts/discourse/ember/resolver.js.es6 index c8c2a3eeea..85d3ce61ac 100644 --- a/app/assets/javascripts/discourse/ember/resolver.js.es6 +++ b/app/assets/javascripts/discourse/ember/resolver.js.es6 @@ -22,13 +22,11 @@ function loadingResolver(cb) { } function parseName(fullName) { - /*jshint validthis:true */ - const nameParts = fullName.split(":"), - type = nameParts[0], fullNameWithoutType = nameParts[1], - name = fullNameWithoutType, - namespace = get(this, 'namespace'), - root = namespace; + type = nameParts[0], fullNameWithoutType = nameParts[1], + name = fullNameWithoutType, + namespace = get(this, 'namespace'), + root = namespace; return { fullName: fullName, @@ -85,6 +83,10 @@ export default Ember.DefaultResolver.extend({ return module; }, + resolveWidget(parsedName) { + return this.customResolve(parsedName) || this._super(parsedName); + }, + resolveAdapter(parsedName) { return this.customResolve(parsedName) || this._super(parsedName); }, diff --git a/app/assets/javascripts/discourse/helpers/as-hash.js.es6 b/app/assets/javascripts/discourse/helpers/as-hash.js.es6 new file mode 100644 index 0000000000..c5c67a64e0 --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/as-hash.js.es6 @@ -0,0 +1,8 @@ +// Note: Later versions of ember include `hash` +export default function hashHelper(params) { + const hash = {}; + Object.keys(params.hash).forEach(k => { + hash[k] = params.data.view.getStream(params.hash[k]).value(); + }); + return hash; +} diff --git a/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 b/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 index 456f876054..fa35b02d9b 100644 --- a/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 +++ b/app/assets/javascripts/discourse/helpers/fa-icon.js.es6 @@ -1,3 +1,4 @@ +import { h } from 'virtual-dom'; import registerUnbound from 'discourse/helpers/register-unbound'; function iconClasses(icon, params) { @@ -7,7 +8,7 @@ function iconClasses(icon, params) { return classes; } -function iconHTML(icon, params) { +export function iconHTML(icon, params) { params = params || {}; var html = "" + domain + ""); - } - } - } -}); diff --git a/app/assets/javascripts/discourse/helpers/node.js.es6 b/app/assets/javascripts/discourse/helpers/node.js.es6 new file mode 100644 index 0000000000..3f34a804cc --- /dev/null +++ b/app/assets/javascripts/discourse/helpers/node.js.es6 @@ -0,0 +1,25 @@ +import { h } from 'virtual-dom'; +import { relativeAge, longDate } from 'discourse/lib/formatter'; +import { number } from 'discourse/lib/formatter'; + +export function dateNode(dt) { + if (typeof dt === "string") { dt = new Date(dt); } + if (dt) { + return h('span', { attributes: { title: longDate(dt) } }, relativeAge(dt)); + } +} + +export function numberNode(num, opts) { + opts = opts || {}; + num = parseInt(num, 10); + if (isNaN(num)) { num = 0; } + + const numString = num.toString(); + const attributes = { }; + const formatted = number(num); + if (formatted !== numString) { + attributes.title = numString; + } + + return h('span.number', { className: opts.className, attributes }, formatted); +} diff --git a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 index fad9e45634..4074d293f2 100644 --- a/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 +++ b/app/assets/javascripts/discourse/initializers/signup-cta.js.es6 @@ -1,25 +1,23 @@ -import ScreenTrack from 'discourse/lib/screen-track'; import Session from 'discourse/models/session'; -const ANON_TOPIC_IDS = 2, - ANON_PROMPT_READ_TIME = 2 * 60 * 1000, - ONE_DAY = 24 * 60 * 60 * 1000, - PROMPT_HIDE_DURATION = ONE_DAY; +const ANON_TOPIC_IDS = 2; +const ANON_PROMPT_READ_TIME = 2 * 60 * 1000; +const ONE_DAY = 24 * 60 * 60 * 1000; +const PROMPT_HIDE_DURATION = ONE_DAY; export default { name: "signup-cta", initialize(container) { - const screenTrack = ScreenTrack.current(), - session = Session.current(), - siteSettings = container.lookup('site-settings:main'), - keyValueStore = container.lookup('key-value-store:main'), - user = container.lookup('current-user:main'); + const screenTrack = container.lookup('screen-track:main'); + const session = Session.current(); + const siteSettings = container.lookup('site-settings:main'); + const keyValueStore = container.lookup('key-value-store:main'); + const user = container.lookup('current-user:main'); - screenTrack.set('keyValueStore', keyValueStore); + screenTrack.keyValueStore = keyValueStore; // Preconditions - if (user) return; // must not be logged in if (keyValueStore.get('anon-cta-never')) return; // "never show again" if (!siteSettings.allow_new_registrations) return; @@ -63,7 +61,7 @@ export default { session.set('showSignupCta', true); } - screenTrack.set('anonFlushCallback', checkSignupCtaRequirements); + screenTrack.registerAnonCallback(checkSignupCtaRequirements); checkSignupCtaRequirements(); } diff --git a/app/assets/javascripts/discourse/lib/discourse-location.js.es6 b/app/assets/javascripts/discourse/lib/discourse-location.js.es6 index a126bf783a..48e7ef4aaf 100644 --- a/app/assets/javascripts/discourse/lib/discourse-location.js.es6 +++ b/app/assets/javascripts/discourse/lib/discourse-location.js.es6 @@ -1,5 +1,3 @@ -import CloakedCollectionView from 'discourse/views/cloaked-collection'; - /** @module Discourse */ @@ -221,36 +219,4 @@ const DiscourseLocation = Ember.Object.extend({ }); -/** - Since we're using pushState/replaceState let's add extra hooks to cloakedView to - eject itself when the popState occurs. This results in better back button - behavior. -**/ -CloakedCollectionView.reopen({ - _watchForPopState: function() { - const self = this, - cb = function() { - // Sam: This is a hack, but a very important one - // Due to the way we use replace state the back button works strangely - // - // If you visit a topic from the front page, scroll a bit around and then hit back - // you notice that first the page scrolls a bit (within the topic) and then it goes back - // this transition is jarring and adds uneeded rendering costs. - // - // To repro comment the hack out and wack a debugger statement here and in - // topic_route deactivate - $('.posts,#topic-title').hide(); - self.cleanUp(); - self.set('controller.model.postStream.loaded', false); - }; - this.set('_callback', cb); - popstateCallbacks.addObject(cb); - }.on('didInsertElement'), - - _disbandWatcher: function() { - popstateCallbacks.removeObject(this.get('_callback')); - this.set('_callback', null); - }.on('willDestroyElement') -}); - export default DiscourseLocation; diff --git a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 index b7a7ece912..8b51a87fad 100644 --- a/app/assets/javascripts/discourse/lib/plugin-api.js.es6 +++ b/app/assets/javascripts/discourse/lib/plugin-api.js.es6 @@ -12,6 +12,5 @@ export function decorateCooked(container, cb) { decorate(postView, 'postViewInserted', cb); decorate(postView, 'postViewUpdated', cb); decorate(ComposerEditor, 'previewRefreshed', cb); - decorate(container.lookupFactory('view:embedded-post'), 'didInsertElement', cb); decorate(container.lookupFactory('view:user-stream'), 'didInsertElement', cb); } diff --git a/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 b/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 index db7f1238a7..d6d62ee1d1 100644 --- a/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 +++ b/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 @@ -1,6 +1,8 @@ -import { Placeholder } from 'discourse/views/cloaked'; import { default as computed } from 'ember-addons/ember-computed-decorators'; +export function Placeholder(viewName) { + this.viewName = viewName; +} export default Ember.Object.extend(Ember.Array, { posts: null, diff --git a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 index 93e584f239..3506b06d6b 100644 --- a/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 +++ b/app/assets/javascripts/discourse/lib/safari-hacks.js.es6 @@ -37,8 +37,6 @@ function positioningWorkaround($fixedElement) { if (evt) { evt.target.removeEventListener('blur', blurred); } - - $('body').removeData('disable-cloaked-view'); }; var blurred = _.debounce(blurredNow, 250); @@ -63,7 +61,6 @@ function positioningWorkaround($fixedElement) { // take care of body - $('body').data('disable-cloaked-view',true); $('#main-outlet').hide(); $('header').hide(); diff --git a/app/assets/javascripts/discourse/lib/screen-track.js.es6 b/app/assets/javascripts/discourse/lib/screen-track.js.es6 index 2bc9373870..60704ac4bb 100644 --- a/app/assets/javascripts/discourse/lib/screen-track.js.es6 +++ b/app/assets/javascripts/discourse/lib/screen-track.js.es6 @@ -1,22 +1,21 @@ // We use this class to track how long posts in a topic are on the screen. +const PAUSE_UNLESS_SCROLLED = 1000 * 60 * 3; +const MAX_TRACKING_TIME = 1000 * 60 * 6; +const ANON_MAX_TOPIC_IDS = 5; -import Singleton from 'discourse/mixins/singleton'; +const getTime = () => new Date().getTime(); -const PAUSE_UNLESS_SCROLLED = 1000 * 60 * 3, - MAX_TRACKING_TIME = 1000 * 60 * 6, - ANON_MAX_TOPIC_IDS = 5; - -const ScreenTrack = Ember.Object.extend({ - - init() { +export default class { + constructor(topicTrackingState, siteSettings, session, currentUser) { + this.topicTrackingState = topicTrackingState; + this.siteSettings = siteSettings; + this.session = session; + this.currentUser = currentUser; this.reset(); - - // TODO: Move `ScreenTrack` to injection and remove this - this.set('topicTrackingState', Discourse.__container__.lookup('topic-tracking-state:main')); - }, + } start(topicId, topicController) { - const currentTopicId = this.get('topicId'); + const currentTopicId = this._topicId; if (currentTopicId && (currentTopicId !== topicId)) { this.tick(); this.flush(); @@ -25,90 +24,81 @@ const ScreenTrack = Ember.Object.extend({ this.reset(); // Create an interval timer if we don't have one. - if (!this.get('interval')) { - const self = this; - this.set('interval', setInterval(function () { - self.tick(); - }, 1000)); - - $(window).on('scroll.screentrack', function(){self.scrolled();}); + if (!this._interval) { + this._interval = setInterval(() => this.tick(), 1000); + $(window).on('scroll.screentrack', () => this.scrolled()); } - this.set('topicId', topicId); - this.set('topicController', topicController); - }, + this._topicId = topicId; + this._topicController = topicController; + } stop() { - if(!this.get('topicId')) { - // already stopped no need to "extra stop" - return; - } + // already stopped no need to "extra stop" + if(!this._topicId) { return; } + $(window).off('scroll.screentrack'); this.tick(); this.flush(); this.reset(); - this.set('topicId', null); - this.set('topicController', null); - if (this.get('interval')) { - clearInterval(this.get('interval')); - this.set('interval', null); + + this._topicId = null; + this._topicController = null; + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; } - }, + } - track(elementId, postNumber) { - this.get('timings')["#" + elementId] = { - time: 0, - postNumber: postNumber - }; - }, - - stopTracking(elementId) { - delete this.get('timings')['#' + elementId]; - }, + setOnscreen(onscreen) { + this._onscreen = onscreen; + } // Reset our timers reset() { - this.setProperties({ - lastTick: new Date().getTime(), - lastScrolled: new Date().getTime(), - lastFlush: 0, - cancelled: false, - timings: {}, - totalTimings: {}, - topicTime: 0 - }); - }, + const now = getTime(); + this._lastTick = now; + this._lastScrolled = now; + this._lastFlush = 0; + this._timings = {}; + this._totalTimings = {}; + this._topicTime = 0; + this._onscreen = []; + } scrolled() { - this.set('lastScrolled', new Date().getTime()); - }, + this._lastScrolled = getTime(); + } + + registerAnonCallback(cb) { + this._anonCallback = cb; + } flush() { - if (this.get('cancelled')) { return; } + const newTimings = {}; + const totalTimings = this._totalTimings; - const newTimings = {}, - totalTimings = this.get('totalTimings'), - self = this; + const timings = this._timings; + Object.keys(this._timings).forEach(postNumber => { + const time = timings[postNumber]; + totalTimings[postNumber] = totalTimings[postNumber] || 0; - _.each(this.get('timings'), function(timing) { - if (!totalTimings[timing.postNumber]) - totalTimings[timing.postNumber] = 0; - - if (timing.time > 0 && totalTimings[timing.postNumber] < MAX_TRACKING_TIME) { - totalTimings[timing.postNumber] += timing.time; - newTimings[timing.postNumber] = timing.time; + if (time > 0 && totalTimings[postNumber] < MAX_TRACKING_TIME) { + totalTimings[postNumber] += time; + newTimings[postNumber] = time; } - timing.time = 0; + timings[postNumber] = 0; }); - const topicId = parseInt(this.get('topicId'), 10); + const topicId = parseInt(this._topicId, 10); let highestSeen = 0; - _.each(newTimings, function(time,postNumber) { + Object.keys(newTimings).forEach(postNumber => { highestSeen = Math.max(highestSeen, parseInt(postNumber, 10)); }); - const highestSeenByTopic = Discourse.Session.currentProp('highestSeenByTopic'); + const highestSeenByTopic = this.session.get('highestSeenByTopic'); if ((highestSeenByTopic[topicId] || 0) < highestSeen) { highestSeenByTopic[topicId] = highestSeen; } @@ -116,11 +106,11 @@ const ScreenTrack = Ember.Object.extend({ this.topicTrackingState.updateSeen(topicId, highestSeen); if (!$.isEmptyObject(newTimings)) { - if (Discourse.User.current()) { + if (this.currentUser) { Discourse.ajax('/topics/timings', { data: { timings: newTimings, - topic_time: this.get('topicTime'), + topic_time: this._topicTime, topic_id: topicId }, cache: false, @@ -128,22 +118,20 @@ const ScreenTrack = Ember.Object.extend({ headers: { 'X-SILENCE-LOGGER': 'true' } - }).then(function() { - const controller = self.get('topicController'); + }).then(() => { + const controller = this._topicController; if (controller) { - const postNumbers = Object.keys(newTimings).map(function(v) { - return parseInt(v, 10); - }); + const postNumbers = Object.keys(newTimings).map(v => parseInt(v, 10)); controller.readPosts(topicId, postNumbers); } }); - } else if (this.get('anonFlushCallback')) { + } else if (this._anonCallback) { // Anonymous viewer - save to localStorage - const storage = this.get('keyValueStore'); + const storage = this.keyValueStore; // Save total time const existingTime = storage.getInt('anon-topic-time'); - storage.setItem('anon-topic-time', existingTime + this.get('topicTime')); + storage.setItem('anon-topic-time', existingTime + this._topicTime); // Save unique topic IDs up to a max let topicIds = storage.get('anon-topic-ids'); @@ -158,64 +146,47 @@ const ScreenTrack = Ember.Object.extend({ } // Inform the observer - this.get('anonFlushCallback')(); + this._anonCallback(); // No need to call controller.readPosts() } - this.set('topicTime', 0); + this._topicTime = 0; } - this.set('lastFlush', 0); - }, + + this._lastFlush = 0; + } tick() { + const now = new Date().getTime(); // If the user hasn't scrolled the browser in a long time, stop tracking time read - const sinceScrolled = new Date().getTime() - this.get('lastScrolled'); + const sinceScrolled = now - this._lastScrolled; if (sinceScrolled > PAUSE_UNLESS_SCROLLED) { return; } - const diff = new Date().getTime() - this.get('lastTick'); - this.set('lastFlush', this.get('lastFlush') + diff); - this.set('lastTick', new Date().getTime()); + const diff = now - this._lastTick; + this._lastFlush += diff; + this._lastTick = now; - const totalTimings = this.get('totalTimings'), timings = this.get('timings'); - const nextFlush = Discourse.SiteSettings.flush_timings_secs * 1000; + const totalTimings = this._totalTimings; + const timings = this._timings; + const nextFlush = this.siteSettings.flush_timings_secs * 1000; - // rush new post numbers - const rush = _.any(_.filter(timings, function(t){return t.time>0;}), function(t){ - return !totalTimings[t.postNumber]; + const rush = Object.keys(timings).some(postNumber => { + return timings[postNumber] > 0 && !totalTimings[postNumber]; }); - if (this.get('lastFlush') > nextFlush || rush) { + if (this._lastFlush > nextFlush || rush) { this.flush(); } // Don't track timings if we're not in focus if (!Discourse.get("hasFocus")) return; - this.set('topicTime', this.get('topicTime') + diff); - const docViewTop = $(window).scrollTop() + $('header').height(), - docViewBottom = docViewTop + $(window).height(); + this._topicTime += diff; - // TODO: Eyeline has a smarter more accurate function here. It's bad to do jQuery - // in a model like component, so we should refactor this out later. - _.each(this.get('timings'),function(timing,id) { - const $element = $(id); - if ($element.length === 1) { - const elemTop = $element.offset().top, - elemBottom = elemTop + $element.height(); - - // If part of the element is on the screen, increase the counter - if (((docViewTop <= elemTop && elemTop <= docViewBottom)) || ((docViewTop <= elemBottom && elemBottom <= docViewBottom))) { - timing.time = timing.time + diff; - } - } - }); + this._onscreen.forEach(postNumber => timings[postNumber] = (timings[postNumber] || 0) + diff); } -}); - - -ScreenTrack.reopenClass(Singleton); -export default ScreenTrack; +} diff --git a/app/assets/javascripts/discourse/lib/transform-post.js.es6 b/app/assets/javascripts/discourse/lib/transform-post.js.es6 new file mode 100644 index 0000000000..55ca190419 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/transform-post.js.es6 @@ -0,0 +1,191 @@ +function actionDescription(action, acted, count) { + if (acted) { + if (count <= 1) { + return I18n.t(`post.actions.by_you.${action}`); + } else { + return I18n.t(`post.actions.by_you_and_others.${action}`, { count: count - 1 }); + } + } else { + return I18n.t(`post.actions.by_others.${action}`, { count }); + } +} + +export function transformBasicPost(post) { + // Note: it can be dangerous to not use `get` in Ember code, but this is significantly + // faster and has tests to confirm it works. We only call `get` when the property is a CP + return { + id: post.id, + hidden: post.hidden, + deleted: post.get('deleted'), + deleted_at: post.deleted_at, + user_deleted: post.user_deleted, + isDeleted: post.deleted_at || post.user_deleted, + deletedByAvatarTemplate: null, + deletedByUsername: null, + primary_group_name: post.primary_group_name, + wiki: post.wiki, + firstPost: post.post_number === 1, + post_number: post.post_number, + cooked: post.cooked, + via_email: post.via_email, + user_id: post.user_id, + usernameUrl: Discourse.getURL(`/users/${post.username}`), + username: post.username, + avatar_template: post.avatar_template, + bookmarked: post.bookmarked, + yours: post.yours, + shareUrl: post.get('shareUrl'), + staff: post.staff, + admin: post.admin, + moderator: post.moderator, + new_user: post.trust_level === 0, + name: post.name, + user_title: post.user_title, + created_at: post.created_at, + updated_at: post.updated_at, + canDelete: post.can_delete, + canRecover: post.can_recover, + canEdit: post.can_edit, + canFlag: !Ember.isEmpty(post.flagsAvailable), + version: post.version, + canRecoverTopic: false, + canDeletedTopic: false, + canViewEditHistory: post.can_view_edit_history, + canWiki: post.can_wiki, + showLike: false, + liked: false, + canToggleLike: false, + likeCount: false, + actionsSummary: null, + read: post.read, + replyToUsername: null, + replyToAvatarTemplate: null, + reply_to_post_number: post.reply_to_post_number, + cooked_hidden: !!post.cooked_hidden, + expandablePost: false, + replyCount: post.reply_count, + }; +} + + +export default function transformPost(currentUser, site, post, prevPost, nextPost) { + // Note: it can be dangerous to not use `get` in Ember code, but this is significantly + // faster and has tests to confirm it works. We only call `get` when the property is a CP + const postType = post.post_type; + const postTypes = site.post_types; + const topic = post.topic; + const details = topic.get('details'); + + const postAtts = transformBasicPost(post); + + postAtts.topicId = topic.id; + postAtts.topicOwner = details.created_by.id === post.user_id; + postAtts.post_type = postType; + postAtts.via_email = post.via_email; + postAtts.isModeratorAction = postType === postTypes.moderator_action; + postAtts.isWhisper = postType === postTypes.whisper; + postAtts.isSmallAction = postType === postTypes.small_action; + postAtts.canBookmark = !!currentUser; + postAtts.canManage = currentUser && currentUser.get('canManageTopic'); + postAtts.canViewRawEmail = currentUser && (currentUser.id === post.user_id || currentUser.staff); + postAtts.canReplyAsNewTopic = details.can_reply_as_new_topic; + postAtts.isWarning = topic.is_warning; + postAtts.links = post.get('internalLinks'); + postAtts.replyDirectlyBelow = nextPost && nextPost.reply_to_post_number === post.post_number; + postAtts.replyDirectlyAbove = prevPost && post.reply_to_post_number === prevPost.post_number; + postAtts.linkCounts = post.link_counts; + postAtts.actionCode = post.action_code; + postAtts.actionCodeWho = post.action_code_who; + + const showPMMap = topic.archetype === 'private_message' && post.post_number === 1; + if (showPMMap) { + postAtts.showPMMap = true; + postAtts.allowedGroups = details.allowed_groups; + postAtts.allowedUsers = details.allowed_users; + postAtts.canRemoveAllowedUsers = details.can_remove_allowed_users; + postAtts.canInvite = details.can_invite_to; + } + + const showTopicMap = showPMMap || (post.post_number === 1 && topic.archetype === 'regular' && topic.posts_count > 1); + if (showTopicMap) { + postAtts.showTopicMap = true; + postAtts.topicUrl = topic.get('url'); + postAtts.topicCreatedAt = topic.created_at; + postAtts.createdByUsername = details.created_by.username; + postAtts.createdByAvatarTemplate = details.created_by.avatar_template; + + postAtts.lastPostUrl = topic.get('lastPostUrl'); + postAtts.lastPostUsername = details.last_poster.username; + postAtts.lastPostAvatarTemplate = details.last_poster.avatar_template; + postAtts.lastPostAt = topic.last_posted_at; + + postAtts.topicReplyCount = topic.get('replyCount'); + postAtts.topicViews = topic.views; + postAtts.topicViewsHeat = topic.get('viewsHeat'); + + postAtts.participantCount = topic.participant_count; + postAtts.topicLikeCount = topic.like_count; + postAtts.topicLinks = details.links; + if (postAtts.topicLinks) { + postAtts.topicLinkLength = details.links.length; + } + postAtts.topicPostsCount = topic.posts_count; + + postAtts.participants = details.participants; + + const postStream = topic.get('postStream'); + postAtts.userFilters = postStream.userFilters; + postAtts.topicSummaryEnabled = postStream.summary; + postAtts.topicWordCount = topic.word_count; + postAtts.hasTopicSummary = topic.has_summary; + } + + if (postAtts.isDeleted) { + postAtts.deletedByAvatarTemplate = post.get('postDeletedBy.avatar_template'); + postAtts.deletedByUsername = post.get('postDeletedBy.username'); + } + + const replyToUser = post.get('reply_to_user'); + if (replyToUser) { + postAtts.replyToUsername = replyToUser.username; + postAtts.replyToAvatarTemplate = replyToUser.avatar_template; + } + + if (post.actions_summary) { + postAtts.actionsSummary = post.actions_summary.filter(a => { + return a.actionType.name_key !== 'like' && a.count > 0; + }).map(a => { + const acted = a.acted; + const action = a.actionType.name_key; + const count = a.count; + + return { id: a.id, + postId: post.id, + action, + acted, + count, + canUndo: a.can_undo, + canDeferFlags: a.can_defer_flags, + description: actionDescription(action, acted, count) }; + }); + } + + const likeAction = post.likeAction; + if (likeAction) { + postAtts.showLike = true; + postAtts.liked = likeAction.acted; + postAtts.canToggleLike = likeAction.get('canToggle'); + postAtts.likeCount = likeAction.count; + } + + if (postAtts.post_number === 1) { + postAtts.canRecoverTopic = topic.deleted_at && details.can_recover; + postAtts.canDeleteTopic = !topic.deleted_at && details.can_delete; + postAtts.expandablePost = topic.expandable_first_post; + } else { + postAtts.canRecover = postAtts.isDeleted && postAtts.canRecover; + postAtts.canDelete = !postAtts.isDeleted && postAtts.canDelete; + } + + return postAtts; +} diff --git a/app/assets/javascripts/discourse/lib/url.js.es6 b/app/assets/javascripts/discourse/lib/url.js.es6 index c35cffba30..3c76d4f514 100644 --- a/app/assets/javascripts/discourse/lib/url.js.es6 +++ b/app/assets/javascripts/discourse/lib/url.js.es6 @@ -14,10 +14,9 @@ const DiscourseURL = Ember.Object.createWithMixins({ /** Jumps to a particular post in the stream **/ - jumpToPost: function(postNumber, opts) { - const holderId = `.post-cloak[data-post-number=${postNumber}]`; - const offset = function() { - + jumpToPost(postNumber, opts) { + const holderId = `#post_${postNumber}`; + const offset = () => { const $header = $('header'); const $title = $('#topic-title'); const windowHeight = $(window).height() - $title.height(); @@ -26,8 +25,7 @@ const DiscourseURL = Ember.Object.createWithMixins({ return $header.outerHeight(true) + ((expectedOffset < 0) ? 0 : expectedOffset); }; - - Em.run.schedule('afterRender', function() { + Em.run.schedule('afterRender', () => { if (postNumber === 1) { $(window).scrollTop(0); return; @@ -37,21 +35,18 @@ const DiscourseURL = Ember.Object.createWithMixins({ const holder = $(holderId); if (holder.length > 0 && opts && opts.skipIfOnScreen){ - // if we are on screen skip const elementTop = lockon.elementTop(), - scrollTop = $(window).scrollTop(), - windowHeight = $(window).height()-offset(), - height = holder.height(); + scrollTop = $(window).scrollTop(), + windowHeight = $(window).height()-offset(), + height = holder.height(); - if (elementTop > scrollTop && - (elementTop + height) < (scrollTop + windowHeight)) { + if (elementTop > scrollTop && (elementTop + height) < (scrollTop + windowHeight)) { return; } } lockon.lock(); - }); }, diff --git a/app/assets/javascripts/discourse/models/action-summary.js.es6 b/app/assets/javascripts/discourse/models/action-summary.js.es6 index a8f75cd537..a39d78fb50 100644 --- a/app/assets/javascripts/discourse/models/action-summary.js.es6 +++ b/app/assets/javascripts/discourse/models/action-summary.js.es6 @@ -3,20 +3,6 @@ import { popupAjaxError } from 'discourse/lib/ajax-error'; export default RestModel.extend({ - // Description for the action - description: function() { - const action = this.get('actionType.name_key'); - if (this.get('acted')) { - if (this.get('count') <= 1) { - return I18n.t('post.actions.by_you.' + action); - } else { - return I18n.t('post.actions.by_you_and_others.' + action, { count: this.get('count') - 1 }); - } - } else { - return I18n.t('post.actions.by_others.' + action, { count: this.get('count') }); - } - }.property('count', 'acted', 'actionType'), - canToggle: function() { return this.get('can_undo') || this.get('can_act'); }.property('can_undo', 'can_act'), @@ -31,7 +17,14 @@ export default RestModel.extend({ }); }, - toggle: function(post) { + togglePromise(post) { + if (!this.get('acted')) { + return this.act(post).then(() => true); + } + return this.undo(post).then(() => false); + }, + + toggle(post) { if (!this.get('acted')) { this.act(post); return true; @@ -42,7 +35,7 @@ export default RestModel.extend({ }, // Perform this action - act: function(post, opts) { + act(post, opts) { if (!opts) opts = {}; @@ -83,37 +76,20 @@ export default RestModel.extend({ }, // Undo this action - undo: function(post) { + undo(post) { this.removeAction(post); // Remove our post action return Discourse.ajax("/post_actions/" + post.get('id'), { type: 'DELETE', - data: { - post_action_type_id: this.get('id') - } - }).then(function(result) { - return post.updateActionsSummary(result); - }); + data: { post_action_type_id: this.get('id') } + }).then(result => post.updateActionsSummary(result)); }, - deferFlags: function(post) { - const self = this; + deferFlags(post) { return Discourse.ajax("/post_actions/defer_flags", { type: "POST", - data: { - post_action_type_id: this.get("id"), - id: post.get('id') - } - }).then(function () { - self.set("count", 0); - }); - }, - - loadUsers(post) { - return this.store.find('post-action-user', { - id: post.get('id'), - post_action_type_id: this.get('id') - }); + data: { post_action_type_id: this.get("id"), id: post.get('id') } + }).then(() => this.set('count', 0)); } }); diff --git a/app/assets/javascripts/discourse/models/post-stream.js.es6 b/app/assets/javascripts/discourse/models/post-stream.js.es6 index 02511e01f0..2b5136ccc4 100644 --- a/app/assets/javascripts/discourse/models/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/post-stream.js.es6 @@ -4,21 +4,6 @@ import PostsWithPlaceholders from 'discourse/lib/posts-with-placeholders'; import { default as computed } from 'ember-addons/ember-computed-decorators'; import { loadTopicView } from 'discourse/models/topic'; -function calcDayDiff(p1, p2) { - if (!p1) { return; } - - const date = p1.get('created_at'); - if (date && p2) { - const lastDate = p2.get('created_at'); - if (lastDate) { - const delta = new Date(date).getTime() - new Date(lastDate).getTime(); - const days = Math.round(delta / (1000 * 60 * 60 * 24)); - - p1.set('daysSincePrevious', days); - } - } -} - export default RestModel.extend({ _identityMap: null, posts: null, @@ -414,7 +399,6 @@ export default RestModel.extend({ const stored = this.storePost(post); if (stored) { const posts = this.get('posts'); - calcDayDiff(posts.get('firstObject'), stored); posts.unshiftObject(stored); } @@ -426,7 +410,6 @@ export default RestModel.extend({ if (stored) { const posts = this.get('posts'); - calcDayDiff(stored, this.get('lastAppended')); if (!posts.contains(stored)) { if (!this.get('loadingBelow')) { this.get('postsWithPlaceholders').appendPost(() => posts.pushObject(stored)); @@ -471,10 +454,12 @@ export default RestModel.extend({ have no filters. **/ triggerNewPostInStream(postId) { - if (!postId) { return; } + const resolved = Ember.RSVP.Promise.resolve(); + + if (!postId) { return resolved; } // We only trigger if there are no filters active - if (!this.get('hasNoFilters')) { return; } + if (!this.get('hasNoFilters')) { return resolved; } const loadedAllPosts = this.get('loadedAllPosts'); @@ -482,25 +467,27 @@ export default RestModel.extend({ this.get('stream').addObject(postId); if (loadedAllPosts) { this.set('loadingLastPost', true); - this.findPostsByIds([postId]).then(posts => { + return this.findPostsByIds([postId]).then(posts => { posts.forEach(p => this.appendPost(p)); }).finally(() => { this.set('loadingLastPost', false); }); } } + + return resolved; }, triggerRecoveredPost(postId) { const existing = this._identityMap[postId]; if (existing) { - this.triggerChangedPost(postId, new Date()); + return this.triggerChangedPost(postId, new Date()); } else { // need to insert into stream const url = "/posts/" + postId; const store = this.store; - Discourse.ajax(url).then(p => { + return Discourse.ajax(url).then(p => { const post = store.createRecord('post', p); const stream = this.get("stream"); const posts = this.get("posts"); @@ -541,34 +528,26 @@ export default RestModel.extend({ const url = "/posts/" + postId; const store = this.store; - Discourse.ajax(url).then(p => { + return Discourse.ajax(url).then(p => { this.storePost(store.createRecord('post', p)); }).catch(() => { this.removePosts([existing]); }); } + return Ember.RSVP.Promise.resolve(); }, triggerChangedPost(postId, updatedAt) { - if (!postId) { return; } + const resolved = Ember.RSVP.Promise.resolve(); + if (!postId) { return resolved; } const existing = this._identityMap[postId]; if (existing && existing.updated_at !== updatedAt) { const url = "/posts/" + postId; const store = this.store; - Discourse.ajax(url).then(p => this.storePost(store.createRecord('post', p))); + return Discourse.ajax(url).then(p => this.storePost(store.createRecord('post', p))); } - }, - - // Returns the "thread" of posts in the history of a post. - findReplyHistory(post) { - const url = `/posts/${post.get('id')}/reply-history.json?max_replies=${Discourse.SiteSettings.max_reply_history}`; - const store = this.store; - return Discourse.ajax(url).then(result => { - return result.map(p => this.storePost(store.createRecord('post', p))); - }).then(replyHistory => { - post.set('replyHistory', replyHistory); - }); + return resolved; }, /** diff --git a/app/assets/javascripts/discourse/models/post.js.es6 b/app/assets/javascripts/discourse/models/post.js.es6 index ff638cef69..8565cfc7d1 100644 --- a/app/assets/javascripts/discourse/models/post.js.es6 +++ b/app/assets/javascripts/discourse/models/post.js.es6 @@ -7,10 +7,6 @@ import computed from 'ember-addons/ember-computed-decorators'; const Post = RestModel.extend({ - init() { - this.set('replyHistory', []); - }, - @computed() siteSettings() { // TODO: Remove this once one instantiate all `Discourse.Post` models via the store. @@ -35,11 +31,6 @@ const Post = RestModel.extend({ deletedViaTopic: Em.computed.and('firstPost', 'topic.deleted_at'), deleted: Em.computed.or('deleted_at', 'deletedViaTopic'), notDeleted: Em.computed.not('deleted'), - userDeleted: Em.computed.empty('user_id'), - - hasTimeGap: function() { - return (this.get('daysSincePrevious') || 0) > Discourse.SiteSettings.show_time_gap_days; - }.property('daysSincePrevious'), showName: function() { const name = this.get('name'); @@ -68,25 +59,13 @@ const Post = RestModel.extend({ usernameUrl: url('username', '/users/%@'), - showUserReplyTab: function() { - return this.get('reply_to_user') && ( - !Discourse.SiteSettings.suppress_reply_directly_above || - this.get('reply_to_post_number') < (this.get('post_number') - 1) - ); - }.property('reply_to_user', 'reply_to_post_number', 'post_number'), - topicOwner: propertyEqual('topic.details.created_by.id', 'user_id'), - hasHistory: Em.computed.gt('version', 1), - - canViewRawEmail: function() { - return this.get("user_id") === Discourse.User.currentProp("id") || Discourse.User.currentProp('staff'); - }.property("user_id"), updatePostField(field, value) { const data = {}; data[field] = value; - Discourse.ajax(`/posts/${this.get('id')}/${field}`, { type: 'PUT', data }).then(() => { + return Discourse.ajax(`/posts/${this.get('id')}/${field}`, { type: 'PUT', data }).then(() => { this.set(field, value); this.incrementProperty("version"); }).catch(popupAjaxError); @@ -97,9 +76,6 @@ const Post = RestModel.extend({ return this.get('link_counts').filterProperty('internal').filterProperty('title'); }.property('link_counts.@each.internal'), - // Edits are the version - 1, so version 2 = 1 edit - editCount: function() { return this.get('version') - 1; }.property('version'), - flagsAvailable: function() { const post = this; return Discourse.Site.currentProp('flagTypes').filter(function(item) { @@ -107,17 +83,6 @@ const Post = RestModel.extend({ }); }.property('actions_summary.@each.can_act'), - actionsWithoutLikes: function() { - if (!!Ember.isEmpty(this.get('actions_summary'))) return null; - - return this.get('actions_summary').filter(function(i) { - if (i.get('count') === 0) return false; - if (i.get('actionType.name_key') === 'like') { return false; } - if (i.get('users') && i.get('users').length > 0) return true; - return !i.get('hidden'); - }); - }.property('actions_summary.@each.users', 'actions_summary.@each.count'), - afterUpdate(res) { if (res.category) { Discourse.Site.current().updateCategory(res.category); @@ -246,10 +211,6 @@ const Post = RestModel.extend({ let value = otherPost[key], oldValue = self[key]; - if (key === "replyHistory") { - return; - } - if (!value) { value = null; } if (!oldValue) { oldValue = null; } @@ -267,56 +228,9 @@ const Post = RestModel.extend({ }); }, - // Load replies to this post - loadReplies() { - if(this.get('loadingReplies')){ - return; - } - - this.set('loadingReplies', true); - this.set('replies', []); - - const self = this; - return Discourse.ajax("/posts/" + (this.get('id')) + "/replies") - .then(function(loaded) { - const replies = self.get('replies'); - _.each(loaded,function(reply) { - const post = Discourse.Post.create(reply); - post.set('topic', self.get('topic')); - replies.pushObject(post); - }); - }) - ['finally'](function(){ - self.set('loadingReplies', false); - }); - }, - - // Whether to show replies directly below - showRepliesBelow: function() { - const replyCount = this.get('reply_count'); - - // We don't show replies if there aren't any - if (replyCount === 0) return false; - - // Always show replies if the setting `suppress_reply_directly_below` is false. - if (!Discourse.SiteSettings.suppress_reply_directly_below) return true; - - // Always show replies if there's more than one - if (replyCount > 1) return true; - - // If we have *exactly* one reply, we have to consider if it's directly below us - const topic = this.get('topic'); - return !topic.isReplyDirectlyBelow(this); - - }.property('reply_count'), - expandHidden() { - const self = this; - return Discourse.ajax("/posts/" + this.get('id') + "/cooked.json").then(function (result) { - self.setProperties({ - cooked: result.cooked, - cooked_hidden: false - }); + return Discourse.ajax("/posts/" + this.get('id') + "/cooked.json").then(result => { + this.setProperties({ cooked: result.cooked, cooked_hidden: false }); }); }, diff --git a/app/assets/javascripts/discourse/models/store.js.es6 b/app/assets/javascripts/discourse/models/store.js.es6 index a7f4edcf9b..52246ff349 100644 --- a/app/assets/javascripts/discourse/models/store.js.es6 +++ b/app/assets/javascripts/discourse/models/store.js.es6 @@ -37,7 +37,9 @@ function findAndRemoveMap(type, id) { flushMap(); export default Ember.Object.extend({ - _plurals: {}, + _plurals: {'post-reply': 'post-replies', + 'post-reply-history': 'post_reply_histories'}, + pluralize(thing) { return this._plurals[thing] || thing + "s"; }, diff --git a/app/assets/javascripts/discourse/models/topic-details.js.es6 b/app/assets/javascripts/discourse/models/topic-details.js.es6 index c40213a72e..a92174bc97 100644 --- a/app/assets/javascripts/discourse/models/topic-details.js.es6 +++ b/app/assets/javascripts/discourse/models/topic-details.js.es6 @@ -34,12 +34,6 @@ const TopicDetails = RestModel.extend({ this.set('loaded', true); }, - fewParticipants: function() { - if (!!Ember.isEmpty(this.get('participants'))) return null; - return this.get('participants').slice(0, 3); - }.property('participants'), - - notificationReasonText: function() { var level = this.get('notification_level'); if(typeof level !== 'number'){ @@ -68,13 +62,13 @@ const TopicDetails = RestModel.extend({ }, removeAllowedUser(user) { - var users = this.get('allowed_users'), - username = user.get('username'); + const users = this.get('allowed_users'); + const username = user.get('username'); - Discourse.ajax("/t/" + this.get('topic.id') + "/remove-allowed-user", { + return Discourse.ajax("/t/" + this.get('topic.id') + "/remove-allowed-user", { type: 'PUT', data: { username: username } - }).then(function() { + }).then(() => { users.removeObject(users.findProperty('username', username)); }); } diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index 24d0638a53..247825184a 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -224,13 +224,6 @@ const Topic = RestModel.extend({ .then(function () { self.set('archetype', 'regular'); }); }, - estimatedReadingTime: function() { - const wordCount = this.get('word_count'); - if (!wordCount) return; - - return Math.floor(wordCount / Discourse.SiteSettings.read_time_word_count); - }.property('word_count'), - toggleBookmark() { if (this.get("bookmarking")) { return; } this.set("bookmarking", true); @@ -390,25 +383,6 @@ const Topic = RestModel.extend({ }); }, - // Is the reply to a post directly below it? - isReplyDirectlyBelow(post) { - const posts = this.get('postStream.posts'); - const postNumber = post.get('post_number'); - if (!posts) return; - - const postBelow = posts[posts.indexOf(post) + 1]; - - // If the post directly below's reply_to_post_number is our post number or we are quoted, - // it's considered directly below. - // - // TODO: we don't carry information about quoting, this leaves this code fairly fragile - // instead we should start shipping quote meta data with posts, but this will add at least - // 1 query to the topics page - // - return postBelow && (postBelow.get('reply_to_post_number') === postNumber || - postBelow.get('cooked').indexOf('data-post="'+ postNumber + '"') >= 0 - ); - }, hasExcerpt: Em.computed.notEmpty('excerpt'), diff --git a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 index 7d66de697d..96c4cea329 100644 --- a/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 +++ b/app/assets/javascripts/discourse/pre-initializers/inject-discourse-objects.js.es6 @@ -6,6 +6,7 @@ import DiscourseURL from 'discourse/lib/url'; import DiscourseLocation from 'discourse/lib/discourse-location'; import SearchService from 'discourse/services/search'; import { startTracking, default as TopicTrackingState } from 'discourse/models/topic-tracking-state'; +import ScreenTrack from 'discourse/lib/screen-track'; function inject() { const app = arguments[0], @@ -38,23 +39,29 @@ export default { const currentUser = Discourse.User.current(); app.register('current-user:main', currentUser, { instantiate: false }); - const tracking = TopicTrackingState.create({ messageBus, currentUser }); - app.register('topic-tracking-state:main', tracking, { instantiate: false }); + const topicTrackingState = TopicTrackingState.create({ messageBus, currentUser }); + app.register('topic-tracking-state:main', topicTrackingState, { instantiate: false }); injectAll(app, 'topicTrackingState'); const site = Discourse.Site.current(); app.register('site:main', site, { instantiate: false }); injectAll(app, 'site'); - app.register('site-settings:main', Discourse.SiteSettings, { instantiate: false }); + const siteSettings = Discourse.SiteSettings; + app.register('site-settings:main', siteSettings, { instantiate: false }); injectAll(app, 'siteSettings'); app.register('search-service:main', SearchService); injectAll(app, 'searchService'); - app.register('session:main', Session.current(), { instantiate: false }); + const session = Session.current(); + app.register('session:main', session, { instantiate: false }); injectAll(app, 'session'); + const screenTrack = new ScreenTrack(topicTrackingState, siteSettings, session, currentUser); + app.register('screen-track:main', screenTrack, { instantiate: false }); + inject(app, 'screenTrack', 'component', 'route'); + inject(app, 'currentUser', 'component', 'route', 'controller'); app.register('location:discourse-location', DiscourseLocation); @@ -63,6 +70,6 @@ export default { app.register('key-value-store:main', keyValueStore, { instantiate: false }); injectAll(app, 'keyValueStore'); - startTracking(tracking); + startTracking(topicTrackingState); } }; diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index 8c1637b7af..54892bcd9a 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -37,12 +37,6 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { return this._super(); }, - // This is here as a bugfix for when an Ember Cloaked view triggers - // a scroll after a controller has been torn down. The real fix - // should be to fix ember cloaking to not do that, but this catches - // it safely just in case. - postChangedRoute: Ember.K, - showTopicEntrance(data) { this.controllerFor('topic-entrance').send('show', data); }, diff --git a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 index 890f0729f8..990a882157 100644 --- a/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 +++ b/app/assets/javascripts/discourse/routes/build-topic-route.js.es6 @@ -1,4 +1,3 @@ -import ScreenTrack from 'discourse/lib/screen-track'; import { queryParams } from 'discourse/controllers/discovery-sortable'; // A helper to build a topic route for a filter @@ -69,7 +68,7 @@ export default function(filter, extras) { model(data, transition) { // attempt to stop early cause we need this to be called before .sync - ScreenTrack.current().stop(); + this.screenTrack.stop(); const findOpts = filterQueryParams(data), findExtras = { cached: this.isPoppedState(transition) }; diff --git a/app/assets/javascripts/discourse/routes/topic.js.es6 b/app/assets/javascripts/discourse/routes/topic.js.es6 index a4a6fa58cc..6e17a41b5b 100644 --- a/app/assets/javascripts/discourse/routes/topic.js.es6 +++ b/app/assets/javascripts/discourse/routes/topic.js.es6 @@ -1,4 +1,3 @@ -import ScreenTrack from 'discourse/lib/screen-track'; import DiscourseURL from 'discourse/lib/url'; let isTransitioning = false, @@ -186,7 +185,7 @@ const TopicRoute = Discourse.Route.extend({ topicController.set('multiSelect', false); topicController.unsubscribe(); this.controllerFor('composer').set('topic', null); - ScreenTrack.current().stop(); + this.screenTrack.stop(); const headerController = this.controllerFor('header'); if (headerController) { @@ -215,8 +214,9 @@ const TopicRoute = Discourse.Route.extend({ controller.subscribe(); this.controllerFor('topic-progress').set('model', model); + // We reset screen tracking every time a topic is entered - ScreenTrack.current().start(model.get('id'), controller); + this.screenTrack.start(model.get('id'), controller); } }); diff --git a/app/assets/javascripts/discourse/templates/components/private-message-map.hbs b/app/assets/javascripts/discourse/templates/components/private-message-map.hbs deleted file mode 100644 index eb2d2dd5f2..0000000000 --- a/app/assets/javascripts/discourse/templates/components/private-message-map.hbs +++ /dev/null @@ -1,24 +0,0 @@ -

{{fa-icon 'envelope'}} {{i18n 'private_message_info.title'}}

-
- {{#each details.allowed_groups as |ag|}} -
- {{fa-icon 'users'}} {{#link-to "group.index" ag.name}}{{unbound ag.name}}{{/link-to}} -
- {{/each}} - {{#each details.allowed_users as |au|}} -
- {{#user-link user=au}} - {{avatar au imageSize="small"}} - {{unbound au.username}} - {{/user-link}} - {{#if details.can_remove_allowed_users}} - {{fa-icon "times"}} - {{/if}} -
- {{/each}} -
-{{#if details.can_invite_to}} -
- -
-{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/small-action.hbs b/app/assets/javascripts/discourse/templates/components/small-action.hbs index 091f0e07df..821ed4ff91 100644 --- a/app/assets/javascripts/discourse/templates/components/small-action.hbs +++ b/app/assets/javascripts/discourse/templates/components/small-action.hbs @@ -1,4 +1,3 @@ -
{{fa-icon icon}}
{{#if post}} {{#if post.can_delete}} @@ -11,8 +10,4 @@ {{avatar post imageSize="small"}} {{/if}} -

{{description}}

- {{#if post.cooked}} -
{{{post.cooked}}}
- {{/if}}
diff --git a/app/assets/javascripts/discourse/templates/components/toggle-summary.hbs b/app/assets/javascripts/discourse/templates/components/toggle-summary.hbs deleted file mode 100644 index 6eed02a1cd..0000000000 --- a/app/assets/javascripts/discourse/templates/components/toggle-summary.hbs +++ /dev/null @@ -1,12 +0,0 @@ -{{#if postStream.summary}} -

{{{i18n 'summary.enabled_description'}}}

- -{{else}} - {{#if topic.estimatedReadingTime}} -

{{{i18n 'summary.description_time' count=topic.posts_count readingTime=topic.estimatedReadingTime}}}

- {{else}} -

{{{i18n 'summary.description' count=topic.posts_count}}}

- {{/if}} - - -{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/topic-participant.hbs b/app/assets/javascripts/discourse/templates/components/topic-participant.hbs deleted file mode 100644 index 0389b002ff..0000000000 --- a/app/assets/javascripts/discourse/templates/components/topic-participant.hbs +++ /dev/null @@ -1,6 +0,0 @@ - - {{#if showPostCount}} - {{unbound participant.post_count}} - {{/if}} - {{avatar participant imageSize="medium"}} - diff --git a/app/assets/javascripts/discourse/templates/embedded-post.hbs b/app/assets/javascripts/discourse/templates/embedded-post.hbs deleted file mode 100644 index 03bfc30a26..0000000000 --- a/app/assets/javascripts/discourse/templates/embedded-post.hbs +++ /dev/null @@ -1,16 +0,0 @@ -
-
- {{raw "post/poster-avatar" post=this classNames="main-avatar"}} -
-
- -
- {{{unbound cooked}}} -
-
-
diff --git a/app/assets/javascripts/discourse/templates/modal/archetype_options.hbs b/app/assets/javascripts/discourse/templates/modal/archetype_options.hbs deleted file mode 100644 index d8c949d9b0..0000000000 --- a/app/assets/javascripts/discourse/templates/modal/archetype_options.hbs +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/app/assets/javascripts/discourse/templates/post-small-action.hbs b/app/assets/javascripts/discourse/templates/post-small-action.hbs deleted file mode 100644 index 42c11c5246..0000000000 --- a/app/assets/javascripts/discourse/templates/post-small-action.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{post-gap post=this postStream=controller.model.postStream before="true"}} - -{{small-action actionCode=action_code - post=this - daysAgo=view.daysAgo - editPost="editPost" - deletePost="deletePost"}} - -{{post-gap post=this postStream=controller.model.postStream before="false"}} diff --git a/app/assets/javascripts/discourse/templates/post.hbs b/app/assets/javascripts/discourse/templates/post.hbs deleted file mode 100644 index 1606d6d6f8..0000000000 --- a/app/assets/javascripts/discourse/templates/post.hbs +++ /dev/null @@ -1,141 +0,0 @@ -{{post-gap post=this postStream=controller.model.postStream before="true"}} - -{{#if hasTimeGap}} - {{time-gap daysAgo=daysSincePrevious postStream=controller.model.postStream}} -{{/if}} - -
- {{view 'reply-history' content=replyHistory}} -
- -
-
- -
- {{#if userDeleted}} - - {{else}} - {{raw "post/poster-avatar" post=this classNames="main-avatar"}} - {{/if}} -
- {{plugin-outlet "poster-avatar-bottom"}} -
- -
- - -
- - -
- - -
-
- {{{cooked}}} - {{plugin-outlet "post-after-cooked"}} - {{#if firstPost}} - {{plugin-outlet "topic-after-cooked"}} - {{/if}} -
- {{#if cooked_hidden}} - {{i18n 'post.show_hidden'}} - {{/if}} - {{#if view.showExpandButton}} - {{#if controller.loadingExpanded}} - - {{else}} - - {{/if}} - {{/if}} - - {{post-menu post=this - canCreatePost=controller.model.details.can_create_post - replyToPost="replyToPost" - recoverPost="recoverPost" - deletePost="deletePost" - toggleLike="toggleLike" - toggleLikeTarget=view - showFlags="showFlags" - editPost="editPost" - toggleBookmark="toggleBookmark" - toggleWiki="toggleWiki" - togglePostType="togglePostType" - rebakePost="rebakePost" - unhidePost="unhidePost" - changePostOwner="changePostOwner" - toggleWhoLiked="toggleWhoLiked" - toggleWhoLikedTarget=view}} -
- - {{who-liked users=view.likedUsers}} - {{#if replies}} -
- {{#each reply in replies}} - {{view 'embedded-post' content=reply}} - {{/each}} -
- {{/if}} - - {{actions-summary post=this}} - {{view 'topic-map-container' post=this topic=controller.model}} -
- - {{post-gutter post=this - links=internalLinks - canReplyAsNewTopic=topic.details.can_reply_as_new_topic - newTopicAction="replyAsNewTopic"}} -
- -
- -{{post-gap post=this postStream=controller.model.postStream before="false"}} -{{plugin-outlet "post-bottom"}} diff --git a/app/assets/javascripts/discourse/templates/topic.hbs b/app/assets/javascripts/discourse/templates/topic.hbs index 93358cf1b2..d6083d0f30 100644 --- a/app/assets/javascripts/discourse/templates/topic.hbs +++ b/app/assets/javascripts/discourse/templates/topic.hbs @@ -69,15 +69,39 @@ {{conditional-loading-spinner condition=model.postStream.loadingAbove}} {{#unless model.postStream.loadingFilter}} - {{cloaked-collection itemViewClass="post" - defaultHeight="200" - content=postsToRender - slackRatio="15" - loadingHTML="" - preservesContext="true" - uncloakDefault="true" - offsetFixedTop="header" - offsetFixedBottom="#reply-control"}} + {{scrolling-post-stream + posts=postsToRender + canCreatePost=model.details.can_create_post + multiSelect=multiSelect + selectedPostsCount=selectedPostsCount + selectedQuery=selectedQuery + gaps=model.postStream.gaps + showFlags="showFlags" + editPost="editPost" + showHistory="showHistory" + showRawEmail="showRawEmail" + deletePost="deletePost" + recoverPost="recoverPost" + expandHidden="expandHidden" + newTopicAction="replyAsNewTopic" + expandFirstPost="expandFirstPost" + toggleBookmark="toggleBookmark" + togglePostType="togglePostType" + rebakePost="rebakePost" + changePostOwner="changePostOwner" + unhidePost="unhidePost" + replyToPost="replyToPost" + toggleWiki="toggleWiki" + toggleParticipant="toggleParticipant" + toggleSummary="toggleSummary" + removeAllowedUser="removeAllowedUser" + showInvite="showInvite" + topVisibleChanged="topVisibleChanged" + bottomVisibleChanged="bottomVisibleChanged" + selectPost="toggledSelectedPost" + selectReplies="toggledSelectedPostReplies" + fillGapBefore="fillGapBefore" + fillGapAfter="fillGapAfter"}} {{/unless}}
diff --git a/app/assets/javascripts/discourse/views/archetype-options.js.es6 b/app/assets/javascripts/discourse/views/archetype-options.js.es6 deleted file mode 100644 index 8cf0c4bd34..0000000000 --- a/app/assets/javascripts/discourse/views/archetype-options.js.es6 +++ /dev/null @@ -1,20 +0,0 @@ -import DiscourseContainerView from 'discourse/views/container'; - -export default DiscourseContainerView.extend({ - metaDataBinding: 'parentView.metaData', - - init: function() { - this._super(); - var metaData = this.get('metaData'); - var archetypeOptionsView = this; - return this.get('archetype.options').forEach(function(a) { - if (a.option_type === 1) { - archetypeOptionsView.attachViewWithArgs({ - content: a, - checked: metaData.get(a.key) === 'true' - }, Discourse.OptionBooleanView); - } - - }); - } -}); diff --git a/app/assets/javascripts/discourse/views/cloaked-collection.js.es6 b/app/assets/javascripts/discourse/views/cloaked-collection.js.es6 deleted file mode 100644 index 4bf5f9f2f8..0000000000 --- a/app/assets/javascripts/discourse/views/cloaked-collection.js.es6 +++ /dev/null @@ -1,300 +0,0 @@ -/*eslint no-bitwise:0 */ -const CloakedCollectionView = Ember.CollectionView.extend({ - cloakView: Ember.computed.alias('itemViewClass'), - topVisible: null, - bottomVisible: null, - offsetFixedTopElement: null, - offsetFixedBottomElement: null, - loadingHTML: 'Loading...', - scrollDebounce: 10, - - init() { - const cloakView = this.get('cloakView'), - idProperty = this.get('idProperty'), - uncloakDefault = !!this.get('uncloakDefault'); - - // Set the slack ratio differently to allow for more or less slack in preloading - const slackRatio = parseFloat(this.get('slackRatio')); - if (!slackRatio) { this.set('slackRatio', 1.0); } - - const CloakedView = this.container.lookupFactory('view:cloaked'); - this.set('itemViewClass', CloakedView.extend({ - classNames: [cloakView + '-cloak'], - cloaks: cloakView, - preservesContext: this.get('preservesContext') === 'true', - cloaksController: this.get('itemController'), - defaultHeight: this.get('defaultHeight'), - - init() { - this._super(); - if (idProperty) { - this.set('elementId', cloakView + '-cloak-' + this.get('content.' + idProperty)); - } - if (uncloakDefault) { - this.uncloak(); - } else { - this.cloak(); - } - } - })); - - this._super(); - Ember.run.next(this, 'scrolled'); - }, - - /** - If the topmost visible view changed, we will notify the controller if it has an appropriate hook. - - @method _topVisibleChanged - @observes topVisible - **/ - _topVisibleChanged: function() { - const controller = this.get('controller'); - if (controller.topVisibleChanged) { controller.topVisibleChanged(this.get('topVisible')); } - }.observes('topVisible'), - - /** - If the bottommost visible view changed, we will notify the controller if it has an appropriate hook. - - @method _bottomVisible - @observes bottomVisible - **/ - _bottomVisible: function() { - const controller = this.get('controller'); - if (controller.bottomVisibleChanged) { controller.bottomVisibleChanged(this.get('bottomVisible')); } - }.observes('bottomVisible'), - - /** - Binary search for finding the topmost view on screen. - - @method findTopView - @param {Array} childViews the childViews to search through - @param {Number} windowTop The top of the viewport to search against - @param {Number} min The minimum index to search through of the child views - @param {Number} max The max index to search through of the child views - @returns {Number} the index into childViews of the topmost view - **/ - findTopView(childViews, viewportTop, min, max) { - if (max < min) { return min; } - - const wrapperTop = this.get('wrapperTop')>>0; - - while(max>min){ - const mid = Math.floor((min + max) / 2), - // in case of not full-window scrolling - $view = childViews[mid].$(), - - // .position is quite expensive, shortcut here to get a slightly rougher - // but much faster value - parentOffsetTop = $view.offsetParent().offset().top, - offsetTop = $view.offset().top, - viewBottom = (offsetTop - parentOffsetTop) + wrapperTop + $view.height(); - - if (viewBottom > viewportTop) { - max = mid-1; - } else { - min = mid+1; - } - } - - return min; - }, - - - /** - Determine what views are onscreen and cloak/uncloak them as necessary. - - @method scrolled - **/ - scrolled() { - if (!this.get('scrollingEnabled')) { return; } - - const childViews = this.get('childViews'); - if ((!childViews) || (childViews.length === 0)) { return; } - - const self = this, - toUncloak = [], - onscreen = [], - onscreenCloaks = [], - $w = $(window), - windowHeight = this.get('wrapperHeight') || ( window.innerHeight ? window.innerHeight : $w.height() ), - slack = Math.round(windowHeight * this.get('slackRatio')), - offsetFixedTopElement = this.get('offsetFixedTopElement'), - offsetFixedBottomElement = this.get('offsetFixedBottomElement'), - bodyHeight = this.get('wrapperHeight') ? this.$().height() : $('body').height(); - - let windowTop = this.get('wrapperTop') || $w.scrollTop(); - - const viewportTop = windowTop - slack, - topView = this.findTopView(childViews, viewportTop, 0, childViews.length-1); - - let windowBottom = windowTop + windowHeight; - let viewportBottom = windowBottom + slack; - - if (windowBottom > bodyHeight) { windowBottom = bodyHeight; } - if (viewportBottom > bodyHeight) { viewportBottom = bodyHeight; } - - if (offsetFixedTopElement) { - windowTop += (offsetFixedTopElement.outerHeight(true) || 0); - } - - if (offsetFixedBottomElement) { - windowBottom -= (offsetFixedBottomElement.outerHeight(true) || 0); - } - - // Find the bottom view and what's onscreen - let bottomView = topView; - let bottomVisible = null; - while (bottomView < childViews.length) { - const view = childViews[bottomView]; - const $view = view.$(); - - if (!$view) { break; } - - // in case of not full-window scrolling - const scrollOffset = this.get('wrapperTop') || 0; - const viewTop = $view.offset().top + scrollOffset; - const viewBottom = viewTop + $view.height(); - - if (viewTop > viewportBottom) { break; } - toUncloak.push(view); - - if (viewBottom > windowTop && viewTop <= windowBottom) { - const content = view.get('content'); - onscreen.push(content); - - if (!view.get('isPlaceholder')) { - bottomVisible = content; - } - onscreenCloaks.push(view); - } - - bottomView++; - } - if (bottomView >= childViews.length) { bottomView = childViews.length - 1; } - - // If our controller has a `sawObjects` method, pass the on screen objects to it. - const controller = this.get('controller'); - if (onscreen.length) { - this.setProperties({topVisible: onscreen[0], bottomVisible }); - if (controller && controller.sawObjects) { - Em.run.schedule('afterRender', function() { - controller.sawObjects(onscreen); - }); - } - } else { - this.setProperties({topVisible: null, bottomVisible: null}); - } - - const toCloak = childViews.slice(0, topView).concat(childViews.slice(bottomView+1)); - - this._uncloak = toUncloak; - if(this._nextUncloak){ - Em.run.cancel(this._nextUncloak); - this._nextUncloak = null; - } - - Em.run.schedule('afterRender', this, function() { - onscreenCloaks.forEach(function (v) { - if(v && v.uncloak) { - v.uncloak(); - } - }); - toCloak.forEach(function (v) { v.cloak(); }); - if (self._nextUncloak) { Em.run.cancel(self._nextUncloak); } - self._nextUncloak = Em.run.later(self, self.uncloakQueue,50); - }); - - for (let j=bottomView; j0){ - const view = this._uncloak.shift(); - if(view && view.uncloak && !view._containedView){ - Em.run.schedule('afterRender', view, view.uncloak); - processed++; - } - } - if(this._uncloak.length === 0){ - this._uncloak = null; - } else { - Em.run.schedule('afterRender', self, function(){ - if(self._nextUncloak){ - Em.run.cancel(self._nextUncloak); - } - self._nextUncloak = Em.run.next(self, function(){ - if(self._nextUncloak){ - Em.run.cancel(self._nextUncloak); - } - self._nextUncloak = Em.run.later(self,self.uncloakQueue,delay); - }); - }); - } - } - }, - - scrollTriggered() { - if ($('body').data('disable-cloaked-view')) { - return; - } - Em.run.scheduleOnce('afterRender', this, 'scrolled'); - }, - - _startEvents: function() { - if (this.get('offsetFixed')) { - Em.warn("Cloaked-collection's `offsetFixed` is deprecated. Use `offsetFixedTop` instead."); - } - - const self = this, - offsetFixedTop = this.get('offsetFixedTop') || this.get('offsetFixed'), - offsetFixedBottom = this.get('offsetFixedBottom'), - scrollDebounce = this.get('scrollDebounce'), - onScrollMethod = function() { - Ember.run.debounce(self, 'scrollTriggered', scrollDebounce); - }; - - if (offsetFixedTop) { - this.set('offsetFixedTopElement', $(offsetFixedTop)); - } - - if (offsetFixedBottom) { - this.set('offsetFixedBottomElement', $(offsetFixedBottom)); - } - - $(document).bind('touchmove.ember-cloak', onScrollMethod); - $(window).bind('scroll.ember-cloak', onScrollMethod); - this.addObserver('wrapperTop', self, onScrollMethod); - this.addObserver('wrapperHeight', self, onScrollMethod); - this.addObserver('content.@each', self, onScrollMethod); - this.scrollTriggered(); - - this.set('scrollingEnabled', true); - }.on('didInsertElement'), - - cleanUp() { - $(document).unbind('touchmove.ember-cloak'); - $(window).unbind('scroll.ember-cloak'); - this.set('scrollingEnabled', false); - }, - - _endEvents: function() { - this.cleanUp(); - }.on('willDestroyElement') -}); - -Ember.Handlebars.helper('cloaked-collection', Ember.testing ? Ember.CollectionView : CloakedCollectionView); -export default CloakedCollectionView; diff --git a/app/assets/javascripts/discourse/views/cloaked.js.es6 b/app/assets/javascripts/discourse/views/cloaked.js.es6 deleted file mode 100644 index ae96413c76..0000000000 --- a/app/assets/javascripts/discourse/views/cloaked.js.es6 +++ /dev/null @@ -1,143 +0,0 @@ -export function Placeholder(viewName) { - this.viewName = viewName; -} - -export default Ember.View.extend({ - attributeBindings: ['style'], - _containedView: null, - _scheduled: null, - isPlaceholder: null, - - init() { - this._super(); - this._scheduled = false; - this._childViews = []; - }, - - setContainedView(cv) { - if (this._childViews[0]) { - this._childViews[0].destroy(); - this._childViews[0] = cv; - } - - this.set('isPlaceholder', cv && (cv.get('content') instanceof Placeholder)); - - if (cv) { - cv.set('_parentView', this); - cv.set('templateData', this.get('templateData')); - this._childViews[0] = cv; - } else { - this._childViews.clear(); - } - - if (this._scheduled) return; - this._scheduled = true; - this.set('_containedView', cv); - Ember.run.schedule('render', this, this.updateChildView); - }, - - render(buffer) { - const element = buffer.element(); - const dom = buffer.dom; - - this._childViewsMorph = dom.appendMorph(element); - }, - - updateChildView() { - this._scheduled = false; - if (!this._elementCreated || this.isDestroying || this.isDestroyed) { return; } - - const childView = this._containedView; - if (childView && !childView._elementCreated) { - this._renderer.renderTree(childView, this, 0); - } - }, - - /** - Triggers the set up for rendering a view that is cloaked. - - @method uncloak - */ - uncloak() { - const state = this._state || this.state; - if (state !== 'inDOM' && state !== 'preRender') { return; } - - if (!this._containedView) { - const model = this.get('content'); - const container = this.get('container'); - - let controller; - - // Wire up the itemController if necessary - const controllerName = this.get('cloaksController'); - if (controllerName) { - const controllerFullName = 'controller:' + controllerName; - let factory = container.lookupFactory(controllerFullName); - - // let ember generate controller if needed - if (!factory) { - factory = Ember.generateControllerFactory(container, controllerName, model); - - // inform developer about typo - Ember.Logger.warn('ember-cloaking: can\'t lookup controller by name "' + controllerFullName + '".'); - Ember.Logger.warn('ember-cloaking: using ' + factory.toString() + '.'); - } - - const parentController = this.get('controller'); - controller = factory.create({ model, parentController, target: parentController }); - } - - const createArgs = {}; - const target = controller || model; - - if (this.get('preservesContext')) { - createArgs.content = target; - } else { - createArgs.context = target; - } - if (controller) { createArgs.controller = controller; } - this.setProperties({ style: ''.htmlSafe(), loading: false }); - - const cloaks = target && (target instanceof Placeholder) ? target.viewName : this.get('cloaks'); - this.setContainedView(this.createChildView(cloaks, createArgs)); - } - }, - - /** - Removes the view from the DOM and tears down all observers. - - @method cloak - */ - cloak() { - const self = this; - - if (this._containedView && (this._state || this.state) === 'inDOM') { - const style = `height: ${this.$().height()}px;`.htmlSafe(); - this.set('style', style); - this.$().prop('style', style); - - - // We need to remove the container after the height of the element has taken - // effect. - Ember.run.schedule('afterRender', function() { - self.setContainedView(null); - }); - } - }, - - _setHeights: function(){ - if (!this._containedView) { - // setting default height - // but do not touch if height already defined - if(!this.$().height()){ - let defaultHeight = 100; - if(this.get('defaultHeight')) { - defaultHeight = this.get('defaultHeight'); - } - - this.$().css('height', defaultHeight); - } - } - }.on('didInsertElement') -}); - diff --git a/app/assets/javascripts/discourse/views/embedded-post.js.es6 b/app/assets/javascripts/discourse/views/embedded-post.js.es6 deleted file mode 100644 index e6d85a85c2..0000000000 --- a/app/assets/javascripts/discourse/views/embedded-post.js.es6 +++ /dev/null @@ -1,17 +0,0 @@ -import ScreenTrack from 'discourse/lib/screen-track'; - -export default Discourse.GroupedView.extend({ - templateName: 'embedded-post', - classNames: ['reply'], - attributeBindings: ['data-post-id'], - 'data-post-id': Em.computed.alias('content.id'), - - _startTracking: function() { - const post = this.get('content'); - ScreenTrack.current().track(this.get('elementId'), post.get('post_number')); - }.on('didInsertElement'), - - _stopTracking: function() { - ScreenTrack.current().stopTracking(this.get('elementId')); - }.on('willDestroyElement') -}); diff --git a/app/assets/javascripts/discourse/views/grouped.js.es6 b/app/assets/javascripts/discourse/views/grouped.js.es6 deleted file mode 100644 index 988c166127..0000000000 --- a/app/assets/javascripts/discourse/views/grouped.js.es6 +++ /dev/null @@ -1,10 +0,0 @@ -export default Ember.View.extend({ - _groupInit: function() { - this.set('context', this.get('content')); - - const templateData = this.get('templateData'); - if (templateData) { - this.set('templateData.insideGroup', true); - } - }.on('init') -}); diff --git a/app/assets/javascripts/discourse/views/option-boolean.js.es6 b/app/assets/javascripts/discourse/views/option-boolean.js.es6 deleted file mode 100644 index 813677edcd..0000000000 --- a/app/assets/javascripts/discourse/views/option-boolean.js.es6 +++ /dev/null @@ -1,11 +0,0 @@ -export default Discourse.GroupedView.extend({ - classNames: ['archetype-option'], - composerControllerBinding: 'Discourse.router.composerController', - templateName: "modal/option_boolean", - - _checkedChanged: function() { - var metaData = this.get('parentView.metaData'); - metaData.set(this.get('content.key'), this.get('checked') ? 'true' : 'false'); - this.get('controller.controllers.composer').saveDraft(); - }.observes('checked') -}); diff --git a/app/assets/javascripts/discourse/views/post.js.es6 b/app/assets/javascripts/discourse/views/post.js.es6 deleted file mode 100644 index 21535c72d5..0000000000 --- a/app/assets/javascripts/discourse/views/post.js.es6 +++ /dev/null @@ -1,381 +0,0 @@ -import ScreenTrack from 'discourse/lib/screen-track'; -import { number } from 'discourse/lib/formatter'; -import DiscourseURL from 'discourse/lib/url'; -import { default as computed, on } from 'ember-addons/ember-computed-decorators'; -import { fmt } from 'discourse/lib/computed'; -import { isValidLink } from 'discourse/lib/click-track'; - -const DAY = 60 * 50 * 1000; - -const PostView = Discourse.GroupedView.extend(Ember.Evented, { - classNames: ['topic-post', 'clearfix'], - classNameBindings: ['needsModeratorClass:moderator:regular', - 'selected', - 'post.hidden:post-hidden', - 'post.deleted:deleted', - 'post.topicOwner:topic-owner', - 'groupNameClass', - 'post.wiki:wiki', - 'whisper'], - - post: Ember.computed.alias('content'), - postElementId: fmt('post.post_number', 'post_%@'), - likedUsers: null, - - @on('init') - initLikedUsers() { - this.set('likedUsers', []); - }, - - @computed('post.post_type') - whisper(postType) { - return postType === this.site.get('post_types.whisper'); - }, - - templateName: function() { - return (this.get('post.post_type') === this.site.get('post_types.small_action')) ? 'post-small-action' : 'post'; - }.property('post.post_type'), - - historyHeat: function() { - const updatedAt = this.get('post.updated_at'); - if (!updatedAt) { return; } - - // Show heat on age - const rightNow = new Date().getTime(), - updatedAtDate = new Date(updatedAt).getTime(); - - if (updatedAtDate > (rightNow - DAY * Discourse.SiteSettings.history_hours_low)) return 'heatmap-high'; - if (updatedAtDate > (rightNow - DAY * Discourse.SiteSettings.history_hours_medium)) return 'heatmap-med'; - if (updatedAtDate > (rightNow - DAY * Discourse.SiteSettings.history_hours_high)) return 'heatmap-low'; - }.property('post.updated_at'), - - needsModeratorClass: function() { - return (this.get('post.post_type') === this.site.get('post_types.moderator_action')) || - (this.get('post.topic.is_warning') && this.get('post.firstPost')); - }.property('post.post_type'), - - groupNameClass: function() { - const primaryGroupName = this.get('post.primary_group_name'); - if (primaryGroupName) { - return "group-" + primaryGroupName; - } - }.property('post.primary_group_name'), - - showExpandButton: function() { - if (this.get('controller.firstPostExpanded')) { return false; } - - const post = this.get('post'); - return post.get('post_number') === 1 && post.get('topic.expandable_first_post'); - }.property('post.post_number', 'controller.firstPostExpanded'), - - // If the cooked content changed, add the quote controls - cookedChanged: function() { - Em.run.scheduleOnce('afterRender', this, '_cookedWasChanged'); - }.observes('post.cooked'), - - _cookedWasChanged() { - this.trigger('postViewUpdated', this.$()); - this._insertQuoteControls(); - }, - - mouseUp(e) { - if (this.get('controller.multiSelect') && (e.metaKey || e.ctrlKey)) { - this.get('controller').toggledSelectedPost(this.get('post')); - } - }, - - selected: function() { - return this.get('controller').postSelected(this.get('post')); - }.property('controller.selectedPostsCount'), - - canSelectReplies: function() { - if (this.get('post.reply_count') === 0) { return false; } - return !this.get('selected'); - }.property('post.reply_count', 'selected'), - - selectPostText: function() { - return this.get('selected') ? I18n.t('topic.multi_select.selected', { count: this.get('controller.selectedPostsCount') }) : I18n.t('topic.multi_select.select'); - }.property('selected', 'controller.selectedPostsCount'), - - repliesShown: Em.computed.gt('post.replies.length', 0), - - _updateQuoteElements($aside, desc) { - let navLink = ""; - const quoteTitle = I18n.t("post.follow_quote"), - postNumber = $aside.data('post'); - - if (postNumber) { - - // If we have a topic reference - let topicId, topic; - if (topicId = $aside.data('topic')) { - topic = this.get('controller.content'); - - // If it's the same topic as ours, build the URL from the topic object - if (topic && topic.get('id') === topicId) { - navLink = ``; - } else { - // Made up slug should be replaced with canonical URL - navLink = ``; - } - - } else if (topic = this.get('controller.content')) { - // assume the same topic - navLink = ``; - } - } - // Only add the expand/contract control if it's not a full post - let expandContract = ""; - if (!$aside.data('full')) { - expandContract = ``; - $('.title', $aside).css('cursor', 'pointer'); - } - $('.quote-controls', $aside).html(expandContract + navLink); - }, - - _toggleQuote($aside) { - if (this.get('expanding')) { return; } - - this.set('expanding', true); - - $aside.data('expanded', !$aside.data('expanded')); - - const finished = () => this.set('expanding', false); - - if ($aside.data('expanded')) { - this._updateQuoteElements($aside, 'chevron-up'); - // Show expanded quote - const $blockQuote = $('blockquote', $aside); - $aside.data('original-contents', $blockQuote.html()); - - const originalText = $blockQuote.text().trim(); - $blockQuote.html(I18n.t("loading")); - let topicId = this.get('post.topic_id'); - if ($aside.data('topic')) { - topicId = $aside.data('topic'); - } - - const postId = parseInt($aside.data('post'), 10); - topicId = parseInt(topicId, 10); - - Discourse.ajax(`/posts/by_number/${topicId}/${postId}`).then(result => { - const div = $("
"); - div.html(result.cooked); - div.highlight(originalText, {caseSensitive: true, element: 'span', className: 'highlighted'}); - $blockQuote.showHtml(div, 'fast', finished); - }); - } else { - // Hide expanded quote - this._updateQuoteElements($aside, 'chevron-down'); - $('blockquote', $aside).showHtml($aside.data('original-contents'), 'fast', finished); - } - return false; - }, - - // Show how many times links have been clicked on - _showLinkCounts() { - const self = this, - link_counts = this.get('post.link_counts'); - - if (!link_counts) { return; } - - link_counts.forEach(function(lc) { - if (!lc.clicks || lc.clicks < 1) { return; } - - self.$(".cooked a[href]").each(function() { - const $link = $(this), - href = $link.attr('href'); - - let valid = !lc.internal && href === lc.url; - - // this might be an attachment - if (lc.internal) { valid = href.indexOf(lc.url) >= 0; } - - if (valid) { - // don't display badge counts on category badge & oneboxes (unless when explicitely stated) - if (isValidLink($link)) { - $link.append("" + number(lc.clicks) + ""); - } - } - }); - }); - }, - - actions: { - toggleLike() { - const currentUser = this.get('controller.currentUser'); - const post = this.get('post'); - const likeAction = post.get('likeAction'); - if (likeAction && likeAction.get('canToggle')) { - const users = this.get('likedUsers'); - const store = this.get('controller.store'); - const action = store.createRecord('post-action-user', - currentUser.getProperties('id', 'username', 'avatar_template') - ); - - if (likeAction.toggle(post) && users.get('length')) { - users.addObject(action); - } else { - users.removeObject(action); - } - } - }, - - toggleWhoLiked() { - const post = this.get('post'); - const likeAction = post.get('likeAction'); - if (likeAction) { - const users = this.get('likedUsers'); - if (users.get('length')) { - users.clear(); - } else { - likeAction.loadUsers(post).then(newUsers => this.set('likedUsers', newUsers)); - } - } - }, - - // Toggle the replies this post is a reply to - toggleReplyHistory(post) { - const replyHistory = post.get('replyHistory'), - topicController = this.get('controller'), - origScrollTop = $(window).scrollTop(), - replyPostNumber = this.get('post.reply_to_post_number'), - postNumber = this.get('post.post_number'), - self = this; - - if (Discourse.Mobile.mobileView) { - DiscourseURL.routeTo(this.get('post.topic').urlForPostNumber(replyPostNumber)); - return; - } - - const stream = topicController.get('model.postStream'); - const offsetFromTop = this.$().position().top - $(window).scrollTop(); - - if(Discourse.SiteSettings.experimental_reply_expansion) { - if(postNumber - replyPostNumber > 1) { - stream.collapsePosts(replyPostNumber + 1, postNumber - 1); - } - - Em.run.next(function() { - PostView.highlight(replyPostNumber); - $(window).scrollTop(self.$().position().top - offsetFromTop); - }); - return; - } - - if (replyHistory.length > 0) { - const origHeight = this.$('.embedded-posts.top').height(); - - replyHistory.clear(); - Em.run.next(function() { - $(window).scrollTop(origScrollTop - origHeight); - }); - } else { - post.set('loadingReplyHistory', true); - - stream.findReplyHistory(post).then(function () { - post.set('loadingReplyHistory', false); - - Em.run.next(function() { - $(window).scrollTop(origScrollTop + self.$('.embedded-posts.top').height()); - }); - }); - } - } - }, - - // Add the quote controls to a post - _insertQuoteControls() { - const self = this, - $quotes = this.$('aside.quote'); - - // Safety check - in some cases with cloackedView this seems to be `undefined`. - if (Em.isEmpty($quotes)) { return; } - - $quotes.each(function(i, e) { - const $aside = $(e); - if ($aside.data('post')) { - self._updateQuoteElements($aside, 'chevron-down'); - const $title = $('.title', $aside); - - // Unless it's a full quote, allow click to expand - if (!($aside.data('full') || $title.data('has-quote-controls'))) { - $title.on('click', function(e2) { - if ($(e2.target).is('a')) return true; - self._toggleQuote($aside); - }); - $title.data('has-quote-controls', true); - } - } - }); - }, - - _destroyedPostView: function() { - ScreenTrack.current().stopTracking(this.get('elementId')); - }.on('willDestroyElement'), - - _postViewInserted: function() { - const $post = this.$(), - postNumber = this.get('post').get('post_number'); - - this._showLinkCounts(); - - ScreenTrack.current().track($post.prop('id'), postNumber); - - this.trigger('postViewInserted', $post); - - // Find all the quotes - Em.run.scheduleOnce('afterRender', this, '_insertQuoteControls'); - - $post.closest('.post-cloak').attr('data-post-number', postNumber); - this._applySearchHighlight(); - }.on('didInsertElement'), - - _fixImageSizes: function(){ - var maxWidth; - this.$('img:not(.avatar)').each(function(idx,img){ - - // deferring work only for posts with images - // we got to use screen here, cause nothing is rendered yet. - // long term we may want to allow for weird margins that are enforced, instead of hardcoding at 70/20 - maxWidth = maxWidth || $(window).width() - (Discourse.Mobile.mobileView ? 20 : 70); - if (Discourse.SiteSettings.max_image_width < maxWidth) { - maxWidth = Discourse.SiteSettings.max_image_width; - } - - var aspect = img.height / img.width; - if (img.width > maxWidth) { - img.width = maxWidth; - img.height = parseInt(maxWidth * aspect,10); - } - - // very unlikely but lets fix this too - if (img.height > Discourse.SiteSettings.max_image_height) { - img.height = Discourse.SiteSettings.max_image_height; - img.width = parseInt(maxWidth / aspect,10); - } - - }); - }.on('willInsertElement'), - - _applySearchHighlight: function() { - const highlight = this.get('searchService.highlightTerm'); - const cooked = this.$('.cooked'); - - if (!cooked) { return; } - - if (highlight && highlight.length > 2) { - if (this._highlighted) { - cooked.unhighlight(); - } - cooked.highlight(highlight.split(/\s+/)); - this._highlighted = true; - - } else if (this._highlighted) { - cooked.unhighlight(); - this._highlighted = false; - } - }.observes('searchService.highlightTerm', 'cooked') -}); - -export default PostView; diff --git a/app/assets/javascripts/discourse/views/reply-history.js.es6 b/app/assets/javascripts/discourse/views/reply-history.js.es6 deleted file mode 100644 index e1f2cb45bc..0000000000 --- a/app/assets/javascripts/discourse/views/reply-history.js.es6 +++ /dev/null @@ -1,7 +0,0 @@ -export default Em.CollectionView.extend({ - tagName: 'section', - classNameBindings: [':embedded-posts', ':top', ':topic-body', ':offset2', 'hidden'], - itemViewClass: 'embedded-post', - hidden: Em.computed.equal('content.length', 0), - previousPost: true -}); diff --git a/app/assets/javascripts/discourse/views/topic-map-container.js.es6 b/app/assets/javascripts/discourse/views/topic-map-container.js.es6 deleted file mode 100644 index 5bd42eb367..0000000000 --- a/app/assets/javascripts/discourse/views/topic-map-container.js.es6 +++ /dev/null @@ -1,46 +0,0 @@ -import ContainerView from 'discourse/views/container'; -import { default as computed, observes, on } from 'ember-addons/ember-computed-decorators'; - -export default ContainerView.extend({ - classNameBindings: ['hidden', ':topic-map'], - - @observes('topic.posts_count') - _postsChanged() { - Ember.run.once(this, 'rerender'); - }, - - @computed - hidden() { - if (!this.get('post.firstPost')) return true; - - const topic = this.get('topic'); - if (topic.get('archetype') === 'private_message') return false; - if (topic.get('archetype') !== 'regular') return true; - return topic.get('posts_count') < 2; - }, - - @on('init') - startAppending() { - if (this.get('hidden')) return; - - this.attachViewWithArgs({ topic: this.get('topic') }, 'topic-map'); - this.trigger('appendMapInformation', this); - }, - - appendMapInformation(view) { - const topic = this.get('topic'); - - if (topic.get('has_summary')) { - view.attachViewWithArgs({ topic, filterBinding: 'controller.filter' }, 'toggle-summary'); - } - - const currentUser = this.get('controller.currentUser'); - if (currentUser && currentUser.get('staff') && topic.get('has_deleted')) { - view.attachViewWithArgs({ topic, filterBinding: 'controller.filter' }, 'topic-deleted'); - } - - if (this.get('topic.isPrivateMessage')) { - view.attachViewWithArgs({ topic, showPrivateInviteAction: 'showInvite' }, 'private-message-map'); - } - } -}); diff --git a/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 b/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 new file mode 100644 index 0000000000..a09bc5b36b --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 @@ -0,0 +1,136 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { avatarFor } from 'discourse/widgets/post'; +import { iconNode } from 'discourse/helpers/fa-icon'; +import { h } from 'virtual-dom'; +import { dateNode } from 'discourse/helpers/node'; + +export function avatarAtts(user) { + return { template: user.avatar_template, + username: user.username, + post_url: user.post_url, + url: Discourse.getURL('/users/') + user.username_lower }; +} + +createWidget('small-user-list', { + tagName: 'div.clearfix', + + buildClasses(atts) { + return atts.listClassName; + }, + + html(atts) { + let users = atts.users; + if (users) { + const currentUser = this.currentUser; + if (atts.addSelf && !users.some(u => u.username === currentUser.username)) { + users = users.concat(avatarAtts(currentUser)); + } + + let description = I18n.t(atts.description, { icons: '' }); + + // oddly post_url is on the user + let postUrl; + const icons = users.map(u => { + postUrl = postUrl || u.post_url; + return avatarFor.call(this, 'small', u); + }); + + if (postUrl) { + description = h('a', { attributes: { href: Discourse.getURL(postUrl) } }, description); + } + return [icons, description, '.']; + } + } +}); + +createWidget('action-link', { + tagName: 'span.action-link', + + buildClasses(attrs) { + return attrs.className; + }, + + html(attrs) { + return h('a', [attrs.text, '. ']); + }, + + click() { + this.sendWidgetAction(this.attrs.action); + } +}); + +createWidget('actions-summary-item', { + tagName: 'div.post-action', + + defaultState() { + return { users: [] }; + }, + + html(attrs, state) { + const users = state.users; + + const result = []; + const action = attrs.action; + + if (users.length === 0) { + result.push(this.attach('action-link', { action: 'whoActed', text: attrs.description })); + } else { + result.push(this.attach('small-user-list', { users, description: `post.actions.people.${action}` })); + } + + if (attrs.canUndo) { + result.push(this.attach('action-link', { action: 'undo', className: 'undo', text: I18n.t(`post.actions.undo.${action}`)})); + } + + if (attrs.canDeferFlags) { + const flagsDesc = I18n.t(`post.actions.defer_flags`, { count: attrs.count }); + result.push(this.attach('action-link', { action: 'deferFlags', className: 'defer-flags', text: flagsDesc })); + } + + return result; + }, + + whoActed() { + const attrs = this.attrs; + const state = this.state; + return this.store.find('post-action-user', { id: attrs.postId, post_action_type_id: attrs.id }).then(users => { + state.users = users.map(avatarAtts); + }); + }, + + undo() { + this.sendWidgetAction('undoPostAction', this.attrs.id); + }, + + deferFlags() { + this.sendWidgetAction('deferPostActionFlags', this.attrs.id); + } +}); + +export default createWidget('actions-summary', { + tagName: 'section.post-actions', + + html(attrs) { + const actionsSummary = attrs.actionsSummary || []; + const body = []; + actionsSummary.forEach(as => { + body.push(this.attach('actions-summary-item', as)); + body.push(h('div.clearfix')); + }); + + if (attrs.isDeleted) { + body.push(h('div.post-action', [ + iconNode('trash-o'), + ' ', + avatarFor.call(this, 'small', { + template: attrs.deletedByAvatarTemplate, + username: attrs.deletedByUsername + }), + ' ', + dateNode(attrs.deleted_at) + ])); + } + + return body; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/button.js.es6 b/app/assets/javascripts/discourse/widgets/button.js.es6 new file mode 100644 index 0000000000..278d00d243 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/button.js.es6 @@ -0,0 +1,48 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { iconNode } from 'discourse/helpers/fa-icon'; + +export default createWidget('button', { + tagName: 'button', + + buildClasses() { + if (this.attrs.className) { return this.attrs.className; } + }, + + buildAttributes() { + const attrs = this.attrs; + + let title; + if (attrs.title) { + title = I18n.t(attrs.title, attrs.titleOptions); + } + + const attributes = { "aria-label": title, title }; + if (attrs.disabled) { attributes.disabled = "true"; } + + if (attrs.data) { + Object.keys(attrs.data).forEach(k => attributes[`data-${k}`] = attrs.data[k]); + } + + return attributes; + }, + + html(attrs) { + const contents = []; + + const left = !attrs.iconRight; + if (attrs.icon && left) { contents.push(iconNode(attrs.icon)); } + if (attrs.label) { contents.push(I18n.t(attrs.label, attrs.labelOptions)); } + if (attrs.contents) { contents.push(attrs.contents); } + if (attrs.icon && !left) { contents.push(iconNode(attrs.icon)); } + + return contents; + }, + + click() { + const attrs = this.attrs; + if (attrs.disabled) { return; } + + $(`button`).blur(); + return this.sendWidgetAction(attrs.action); + } +}); diff --git a/app/assets/javascripts/discourse/widgets/click-hook.js.es6 b/app/assets/javascripts/discourse/widgets/click-hook.js.es6 new file mode 100644 index 0000000000..2b6066eb59 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/click-hook.js.es6 @@ -0,0 +1,61 @@ +const CLICK_ATTRIBUTE_NAME = '_discourse_click_widget'; +const CLICK_OUTSIDE_ATTRIBUTE_NAME = '_discourse_click_outside_widget'; + +export class WidgetClickHook { + constructor(widget) { + this.widget = widget; + } + + hook(node) { + node[CLICK_ATTRIBUTE_NAME] = this.widget; + } + + unhook(node) { + node[CLICK_ATTRIBUTE_NAME] = null; + } +}; + +export class WidgetClickOutsideHook { + constructor(widget) { + this.widget = widget; + } + + hook(node) { + node.setAttribute('data-click-outside', true); + node[CLICK_OUTSIDE_ATTRIBUTE_NAME] = this.widget; + } + + unhook(node) { + node.removeAttribute('data-click-outside'); + node[CLICK_OUTSIDE_ATTRIBUTE_NAME] = null; + } +}; + +let _watchingDocument = false; +WidgetClickHook.setupDocumentCallback = function() { + if (_watchingDocument) { return; } + + $(document).on('click.discourse-widget', e => { + let node = e.target; + while (node) { + const widget = node[CLICK_ATTRIBUTE_NAME]; + if (widget) { + return widget.click(e); + } + node = node.parentNode; + } + + node = e.target; + const $outside = $('[data-click-outside]'); + $outside.each((i, outNode) => { + if (outNode.contains(node)) { return; } + const widget = outNode[CLICK_OUTSIDE_ATTRIBUTE_NAME]; + if (widget) { + return widget.clickOutside(e); + } + }); + }); + + + _watchingDocument = true; +}; diff --git a/app/assets/javascripts/discourse/widgets/embedded-post.js.es6 b/app/assets/javascripts/discourse/widgets/embedded-post.js.es6 new file mode 100644 index 0000000000..62da30e9b3 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/embedded-post.js.es6 @@ -0,0 +1,42 @@ +import RawHtml from 'discourse/widgets/raw-html'; +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; +import { iconNode } from 'discourse/helpers/fa-icon'; +import DiscourseURL from 'discourse/lib/url'; + +createWidget('post-link-arrow', { + html(attrs) { + if (attrs.above) { + return h('a.post-info.arrow', { + attributes: { title: I18n.t('topic.jump_reply_up') } + }, iconNode('arrow-up')); + } else { + return h('a.post-info.arrow', { + attributes: { title: I18n.t('topic.jump_reply_down') } + }, iconNode('arrow-down')); + } + }, + + click() { + DiscourseURL.jumpToPost(this.attrs.post_number); + } +}); + +export default createWidget('embedded-post', { + buildKey: attrs => `embedded-post-${attrs.id}`, + + html(attrs, state) { + return [ + h('div.row', [ + this.attach('post-avatar', attrs), + h('div.topic-body', [ + h('div.topic-meta-data', [ + this.attach('poster-name', attrs), + this.attach('post-link-arrow', { above: state.above, post_number: attrs.post_number }) + ]), + new RawHtml({html: `
${attrs.cooked}
`}) + ]) + ]) + ]; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/event-handler.js.es6 b/app/assets/javascripts/discourse/widgets/event-handler.js.es6 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 b/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 new file mode 100644 index 0000000000..16590124ff --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 @@ -0,0 +1,66 @@ +import { iconNode } from 'discourse/helpers/fa-icon'; +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; + +createWidget('post-admin-menu-button', { + tagName: 'li.btn', + buildClasses(attrs) { + return attrs.className; + }, + html(attrs) { + return [iconNode(attrs.icon), I18n.t(attrs.label)]; + }, + click() { + this.sendWidgetAction('closeAdminMenu'); + return this.sendWidgetAction(this.attrs.action); + } +}); + +export default createWidget('post-admin-menu', { + tagName: 'div.post-admin-menu.popup-menu', + + html(attrs) { + const contents = []; + contents.push(h('h3', I18n.t('admin_title'))); + + if (this.currentUser.staff) { + const buttonAtts = { action: 'togglePostType', icon: 'shield', className: 'toggle-post-type' }; + + if (attrs.isModeratorAction) { + buttonAtts.label = 'post.controls.revert_to_regular'; + } else { + buttonAtts.label = 'post.controls.convert_to_moderator'; + } + contents.push(this.attach('post-admin-menu-button', buttonAtts)); + } + + contents.push(this.attach('post-admin-menu-button', { + icon: 'cog', label: 'post.controls.rebake', action: 'rebakePost', className: 'rebuild-html' + })); + + if (attrs.hidden) { + contents.push(this.attach('post-admin-menu-button', { + icon: 'eye', + label: 'post.controls.unhide', + action: 'unhidePost', + className: 'unhide-post' + })); + } + + if (this.currentUser.admin) { + contents.push(this.attach('post-admin-menu-button', { + icon: 'user', + label: 'post.controls.change_owner', + action: 'changePostOwner', + className: 'change-owner' + })); + } + + return contents; + }, + + clickOutside() { + this.sendWidgetAction('closeAdminMenu'); + } +}); + diff --git a/app/assets/javascripts/discourse/widgets/post-cooked.js.es6 b/app/assets/javascripts/discourse/widgets/post-cooked.js.es6 new file mode 100644 index 0000000000..b4d0a7bde4 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-cooked.js.es6 @@ -0,0 +1,196 @@ +import { isValidLink } from 'discourse/lib/click-track'; +import { number } from 'discourse/lib/formatter'; + +export default class PostCooked { + + constructor(attrs) { + this.attrs = attrs; + this.expanding = false; + this._highlighted = false; + } + + update(prev) { + if (prev.attrs.cooked !== this.attrs.cooked) { + return this.init(); + } + } + + init() { + const $html = $(`
${this.attrs.cooked}
`); + this._insertQuoteControls($html); + this._showLinkCounts($html); + this._fixImageSizes($html); + this._applySearchHighlight($html); + return $html[0]; + } + + _applySearchHighlight($html) { + const highlight = this.attrs.highlightTerm; + + if (highlight && highlight.length > 2) { + if (this._highlighted) { + $html.unhighlight(); + } + $html.highlight(highlight.split(/\s+/)); + this._highlighted = true; + + } else if (this._highlighted) { + $html.unhighlight(); + this._highlighted = false; + } + } + + _fixImageSizes($html) { + const maxImageWidth = Discourse.SiteSettings.max_image_width; + const maxImageHeight = Discourse.SiteSettings.max_image_height; + + let maxWindowWidth; + $html.find('img:not(.avatar)').each((idx,img) => { + // deferring work only for posts with images + // we got to use screen here, cause nothing is rendered yet. + // long term we may want to allow for weird margins that are enforced, instead of hardcoding at 70/20 + maxWindowWidth = maxWindowWidth || $(window).width() - (Discourse.Mobile.mobileView ? 20 : 70); + if (maxImageWidth < maxWindowWidth) { + maxWindowWidth = maxImageWidth; + } + + const aspect = img.height / img.width; + if (img.width > maxWindowWidth) { + img.width = maxWindowWidth; + img.height = parseInt(maxWindowWidth * aspect,10); + } + + // very unlikely but lets fix this too + if (img.height > maxImageHeight) { + img.height = maxImageHeight; + img.width = parseInt(maxWindowWidth / aspect,10); + } + }); + } + + _showLinkCounts($html) { + const linkCounts = this.attrs.linkCounts; + if (!linkCounts) { return; } + + linkCounts.forEach(lc => { + if (!lc.clicks || lc.clicks < 1) { return; } + + $html.find('a[href]').each((i, e) => { + const $link = $(e); + const href = $link.attr('href'); + + let valid = !lc.internal && href === lc.url; + + // this might be an attachment + if (lc.internal) { valid = href.indexOf(lc.url) >= 0; } + + // don't display badge counts on category badge & oneboxes (unless when explicitely stated) + if (valid && isValidLink($link)) { + const title = I18n.t("topic_map.clicks", {count: lc.clicks}); + $link.append(`${number(lc.clicks)}`); + } + }); + }); + } + + _toggleQuote($aside) { + if (this.expanding) { return; } + + this.expanding = true; + + $aside.data('expanded', !$aside.data('expanded')); + + const finished = () => this.expanding = false; + + if ($aside.data('expanded')) { + this._updateQuoteElements($aside, 'chevron-up'); + // Show expanded quote + const $blockQuote = $('blockquote', $aside); + $aside.data('original-contents', $blockQuote.html()); + + const originalText = $blockQuote.text().trim(); + $blockQuote.html(I18n.t("loading")); + let topicId = this.attrs.topicId; + if ($aside.data('topic')) { + topicId = $aside.data('topic'); + } + + const postId = parseInt($aside.data('post'), 10); + topicId = parseInt(topicId, 10); + + Discourse.ajax(`/posts/by_number/${topicId}/${postId}`).then(result => { + const div = $("
"); + div.html(result.cooked); + div.highlight(originalText, {caseSensitive: true, element: 'span', className: 'highlighted'}); + $blockQuote.showHtml(div, 'fast', finished); + }); + } else { + // Hide expanded quote + this._updateQuoteElements($aside, 'chevron-down'); + $('blockquote', $aside).showHtml($aside.data('original-contents'), 'fast', finished); + } + return false; + } + + _urlForPostNumber(postNumber) { + return (postNumber > 0) ? `${this.topicUrl}/${postNumber}` : this.topicUrl; + } + + _updateQuoteElements($aside, desc) { + let navLink = ""; + const quoteTitle = I18n.t("post.follow_quote"); + const postNumber = $aside.data('post'); + + if (postNumber) { + + // If we have a topic reference + const asideTopicId = parseInt($aside.data('topic')); + + if (asideTopicId) { + // If it's the same topic as ours, build the URL from the topic object + if (this.topicId === asideTopicId) { + navLink = ``; + } else { + // Made up slug should be replaced with canonical URL + const asideLink = Discourse.getURL("/t/via-quote/") + asideTopicId + "/" + postNumber; + navLink = ``; + } + + } else { + // assume the same topic + navLink = ``; + } + } + // Only add the expand/contract control if it's not a full post + let expandContract = ""; + if (!$aside.data('full')) { + expandContract = ``; + $('.title', $aside).css('cursor', 'pointer'); + } + $('.quote-controls', $aside).html(expandContract + navLink); + } + + _insertQuoteControls($html) { + const $quotes = $html.find('aside.quote'); + if ($quotes.length === 0) { return; } + + $quotes.each((i, e) => { + const $aside = $(e); + if ($aside.data('post')) { + this._updateQuoteElements($aside, 'chevron-down'); + const $title = $('.title', $aside); + + // Unless it's a full quote, allow click to expand + if (!($aside.data('full') || $title.data('has-quote-controls'))) { + $title.on('click', e2 => { + if ($(e2.target).is('a')) return true; + this._toggleQuote($aside); + }); + $title.data('has-quote-controls', true); + } + } + }); + } +} + +PostCooked.prototype.type = 'Widget'; diff --git a/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 new file mode 100644 index 0000000000..5ae62a3f1c --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-edits-indicator.js.es6 @@ -0,0 +1,41 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { iconNode } from 'discourse/helpers/fa-icon'; +import { longDate } from 'discourse/lib/formatter'; +import { h } from 'virtual-dom'; + +const FIFTY_HOURS = 60 * 50 * 1000; + +export default createWidget('post-edits-indicator', { + tagName: 'div.post-info.edits', + + historyHeat(updatedAt) { + if (!updatedAt) { return; } + + // Show heat on age + const rightNow = new Date().getTime(); + const updatedAtTime = updatedAt.getTime(); + + const siteSettings = this.siteSettings; + if (updatedAtTime > (rightNow - FIFTY_HOURS * siteSettings.history_hours_low)) return 'heatmap-high'; + if (updatedAtTime > (rightNow - FIFTY_HOURS * siteSettings.history_hours_medium)) return 'heatmap-med'; + if (updatedAtTime > (rightNow - FIFTY_HOURS * siteSettings.history_hours_high)) return 'heatmap-low'; + }, + + html(attrs) { + const contents = [attrs.version - 1, ' ', iconNode('pencil')]; + const updatedAt = new Date(attrs.updated_at); + + const title = `${I18n.t('post.last_edited_on')} ${longDate(updatedAt)}`; + return h('a', { + className: this.historyHeat(updatedAt), + attributes: { title } + }, contents); + }, + + click() { + if (this.attrs.canViewEditHistory) { + this.sendWidgetAction('showHistory'); + } + } +}); + diff --git a/app/assets/javascripts/discourse/widgets/post-gap.js.es6 b/app/assets/javascripts/discourse/widgets/post-gap.js.es6 new file mode 100644 index 0000000000..d14d1b811a --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-gap.js.es6 @@ -0,0 +1,26 @@ +import { createWidget } from 'discourse/widgets/widget'; + +export default createWidget('post-gap', { + tagName: 'div.gap.jagged-border', + buildKey: (attrs) => `post-gap-${attrs.pos}-${attrs.postId}`, + + defaultState() { + return { loading: false }; + }, + + html(attrs, state) { + return state.loading ? I18n.t('loading') : I18n.t('post.gap', {count: attrs.gap.length}); + }, + + click() { + const { attrs, state } = this; + + if (state.loading) { return; } + state.loading = true; + + this.scheduleRerender(); + + const args = { gap: attrs.gap, post: this.model }; + return this.sendWidgetAction(attrs.pos === 'before' ? 'fillGapBefore' : 'fillGapAfter', args); + } +}); diff --git a/app/assets/javascripts/discourse/widgets/post-gutter.js.es6 b/app/assets/javascripts/discourse/widgets/post-gutter.js.es6 new file mode 100644 index 0000000000..514ee4a924 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-gutter.js.es6 @@ -0,0 +1,68 @@ +import { iconNode } from 'discourse/helpers/fa-icon'; +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; + +const MAX_GUTTER_LINKS = 5; + +export default createWidget('post-gutter', { + tagName: 'div.gutter', + + defaultState() { + return { collapsed: true }; + }, + + html(attrs, state) { + const links = this.attrs.links || []; + + const result = []; + let toShow = links.length; + if (state.collapsed && toShow > MAX_GUTTER_LINKS) { toShow = MAX_GUTTER_LINKS; } + + const seenTitles = {}; + + + let i = 0; + while (i < links.length && result.length < toShow) { + const l = links[i++]; + + let title = l.title; + if (title && !seenTitles[title]) { + seenTitles[title] = true; + const linkBody = [Discourse.Emoji.unescape(title)]; + if (l.clicks) { + linkBody.push(h('span.badge.badge-notification.clicks', l.clicks.toString())); + } + + const link = h('a.track-link', { attributes: { href: l.url } }, linkBody); + result.push(h('li', link)); + } + } + + if (state.collapsed) { + const remaining = links.length - MAX_GUTTER_LINKS; + if (remaining > 0) { + result.push(h('li', h('a.toggle-more', I18n.t('post.more_links', {count: remaining})))); + } + } + + if (attrs.canReplyAsNewTopic) { + result.push(h('a.reply-new', [iconNode('plus'), I18n.t('post.reply_as_new_topic')])); + } + + return h('ul.post-links', result); + }, + + click(e) { + const $target = $(e.target); + if ($target.hasClass('toggle-more')) { + this.sendWidgetAction('showAll'); + } else if ($target.closest('.reply-new').length) { + this.sendWidgetAction('newTopicAction'); + } + return true; + }, + + showAll() { + this.state.collapsed = false; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/post-menu.js.es6 b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 new file mode 100644 index 0000000000..f4c4d9150a --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 @@ -0,0 +1,306 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { avatarAtts } from 'discourse/widgets/actions-summary'; +import { h } from 'virtual-dom'; + +const LIKE_ACTION = 2; + +function animateHeart($elem, start, end, complete) { + if (Ember.testing) { return Ember.run(this, complete); } + + $elem.stop() + .css('textIndent', start) + .animate({ textIndent: end }, { + complete, + step(now) { + $(this).css('transform','scale('+now+')'); + }, + duration: 150 + }, 'linear'); +} + +const _builders = {}; + +function registerButton(name, builder) { + _builders[name] = builder; +} + +registerButton('like', attrs => { + if (!attrs.showLike) { return; } + const className = attrs.liked ? 'has-like fade-out' : 'like'; + + if (attrs.canToggleLike) { + const descKey = attrs.liked ? 'post.controls.undo_like' : 'post.controls.like'; + return { action: 'like', title: descKey, icon: 'heart', className }; + } else if (attrs.liked) { + return { action: 'like', title: 'post.controls.has_liked', icon: 'heart', className, disabled: true }; + } +}); + +registerButton('like-count', attrs => { + const count = attrs.likeCount; + + if (count > 0) { + const title = attrs.liked + ? count === 1 ? 'post.has_likes_title_only_you' : 'post.has_likes_title_you' + : 'post.has_likes_title'; + + return { action: 'toggleWhoLiked', + title, + className: 'like-count highlight-action', + contents: I18n.t("post.has_likes", { count }), + titleOptions: {count: attrs.liked ? (count-1) : count } + }; + } +}); + +registerButton('flag', attrs => { + if (attrs.canFlag) { + return { action: 'showFlags', + title: 'post.controls.flag', + icon: 'flag', + className: 'create-flag' }; + } +}); + +registerButton('edit', attrs => { + if (attrs.canEdit) { + return { + action: 'editPost', + className: 'edit', + title: 'post.controls.edit', + icon: 'pencil', + alwaysShowYours: true, + alwaysShowWiki: true + }; + } +}); + +registerButton('replies', (attrs, state, siteSettings) => { + const replyCount = attrs.replyCount; + + if (!replyCount) { return; } + + // Omit replies if the setting `suppress_reply_directly_below` is enabled + if (replyCount === 1 && + attrs.replyDirectlyBelow && + siteSettings.suppress_reply_directly_below) { + return; + } + + return { + action: 'toggleRepliesBelow', + className: 'show-replies', + icon: state.repliesShown ? 'chevron-up' : 'chevron-down', + titleOptions: { count: replyCount }, + title: 'post.has_replies', + labelOptions: { count: replyCount }, + label: 'post.has_replies', + iconRight: true + }; +}); + + +registerButton('share', attrs => { + return { + action: 'share', + title: 'post.controls.share', + icon: 'link', + data: { + 'share-url': attrs.shareUrl, + 'post-number': attrs.post_number + } + }; +}); + +registerButton('reply', attrs => { + const args = { + action: 'replyToPost', + title: 'post.controls.reply', + icon: 'reply', + className: 'reply create fade-out' + }; + + if (!attrs.canCreatePost) { return; } + + if (!Discourse.Mobile.mobileView) { + args.label = 'topic.reply.title'; + } + + return args; +}); + +registerButton('bookmark', attrs => { + if (!attrs.canBookmark) { return; } + + let iconClass = 'read-icon'; + let buttonClass = 'bookmark'; + let tooltip = 'bookmarks.not_bookmarked'; + + if (attrs.bookmarked) { + iconClass += ' bookmarked'; + buttonClass += ' bookmarked'; + tooltip = 'bookmarks.created'; + } + + return { action: 'toggleBookmark', + title: tooltip, + className: buttonClass, + contents: h('div', { className: iconClass }) }; +}); + +registerButton('admin', attrs => { + if (!attrs.canManage) { return; } + return { action: 'openAdminMenu', + title: 'post.controls.admin', + className: 'show-post-admin-menu', + icon: 'wrench' }; +}); + +registerButton('delete', attrs => { + if (attrs.canRecoverTopic) { + return { action: 'recoverPost', title: 'topic.actions.recover', icon: 'undo', className: 'recover' }; + } else if (attrs.canDeleteTopic) { + return { action: 'deletePost', title: 'topic.actions.delete', icon: 'trash-o', className: 'delete' }; + } else if (attrs.canRecover) { + return { action: 'recoverPost', title: 'post.controls.undelete', icon: 'undo', className: 'recover' }; + } else if (attrs.canDelete) { + return { action: 'deletePost', title: 'post.controls.delete', icon: 'trash-o', className: 'delete' }; + } +}); + +registerButton('wiki', attrs => { + if (!attrs.canWiki) { return; } + + if (attrs.wiki) { + return { action: 'toggleWiki', + title: 'post.controls.unwiki', + icon: 'pencil-square-o', + className: 'wiki wikied' }; + } else { + return { action: 'toggleWiki', + title: 'post.controls.wiki', + icon: 'pencil-square-o', + className: 'wiki' }; + } +}); + +export default createWidget('post-menu', { + tagName: 'section.post-menu-area.clearfix', + + defaultState() { + return { collapsed: true, likedUsers: [], adminVisible: false }; + }, + + buildKey: attrs => `post-menu-${attrs.id}`, + + attachButton(name, attrs) { + const builder = _builders[name]; + if (builder) { + const buttonAtts = builder(attrs, this.state, this.siteSettings); + if (buttonAtts) { + return this.attach('button', buttonAtts); + } + } + }, + + html(attrs, state) { + const { siteSettings } = this; + + const hiddenSetting = (siteSettings.post_menu_hidden_items || ''); + const hiddenButtons = hiddenSetting.split('|').filter(s => { + return !attrs.bookmarked || s !== 'bookmark'; + }); + + const allButtons = []; + let visibleButtons = []; + siteSettings.post_menu.split('|').forEach(i => { + const button = this.attachButton(i, attrs); + if (button) { + allButtons.push(button); + if ((attrs.yours && button.attrs.alwaysShowYours) || + (attrs.wiki && button.attrs.alwaysShowWiki) || + (hiddenButtons.indexOf(i) === -1)) { + visibleButtons.push(button); + } + } + }); + + // Only show ellipsis if there is more than one button hidden + // if there are no more buttons, we are not collapsed + if (!state.collapsed || (allButtons.length <= visibleButtons.length + 1)) { + visibleButtons = allButtons; + if (state.collapsed) { state.collapsed = false; } + } else { + const showMore = this.attach('button', { + action: 'showMoreActions', + title: 'show_more', + className: 'show-more-actions', + icon: 'ellipsis-h' }); + visibleButtons.splice(visibleButtons.length - 1, 0, showMore); + } + + const postControls = []; + + const repliesButton = this.attachButton('replies', attrs); + if (repliesButton) { + postControls.push(repliesButton); + } + + postControls.push(h('div.actions', visibleButtons)); + if (state.adminVisible) { + postControls.push(this.attach('post-admin-menu', attrs)); + } + + const contents = [ h('nav.post-controls.clearfix', postControls) ]; + if (state.likedUsers.length) { + contents.push(this.attach('small-user-list', { + users: state.likedUsers, + addSelf: attrs.liked, + listClassName: 'who-liked', + description: 'post.actions.people.like' + })); + } + + return contents; + }, + + openAdminMenu() { + this.state.adminVisible = true; + }, + + closeAdminMenu() { + this.state.adminVisible = false; + }, + + showMoreActions() { + this.state.collapsed = false; + }, + + like() { + const attrs = this.attrs; + if (attrs.liked) { + return this.sendWidgetAction('toggleLike'); + } + + const $heart = $(`[data-post-id=${attrs.id}] .fa-heart`); + const scale = [1.0, 1.5]; + return new Ember.RSVP.Promise(resolve => { + animateHeart($heart, scale[0], scale[1], () => { + animateHeart($heart, scale[1], scale[0], () => { + this.sendWidgetAction('toggleLike').then(() => resolve()); + }); + }); + }); + }, + + toggleWhoLiked() { + const { attrs, state } = this; + if (state.likedUsers.length) { + state.likedUsers = []; + } else { + return this.store.find('post-action-user', { id: attrs.id, post_action_type_id: LIKE_ACTION }).then(users => { + state.likedUsers = users.map(avatarAtts); + }); + } + }, +}); diff --git a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 new file mode 100644 index 0000000000..e4590e1d40 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 @@ -0,0 +1,59 @@ +import { createWidget } from 'discourse/widgets/widget'; +import RawHtml from 'discourse/widgets/raw-html'; +import { iconNode } from 'discourse/helpers/fa-icon'; +import { h } from 'virtual-dom'; +import { actionDescriptionHtml } from 'discourse/components/small-action'; + +const icons = { + 'closed.enabled': 'lock', + 'closed.disabled': 'unlock-alt', + 'autoclosed.enabled': 'lock', + 'autoclosed.disabled': 'unlock-alt', + 'archived.enabled': 'folder', + 'archived.disabled': 'folder-open', + 'pinned.enabled': 'thumb-tack', + 'pinned.disabled': 'thumb-tack unpinned', + 'pinned_globally.enabled': 'thumb-tack', + 'pinned_globally.disabled': 'thumb-tack unpinned', + 'visible.enabled': 'eye', + 'visible.disabled': 'eye-slash', + 'split_topic': 'sign-out', + 'invited_user': 'plus-circle', + 'removed_user': 'minus-circle' +}; + +export default createWidget('post-small-action', { + tagName: 'div.small-action.clearfix', + + html(attrs) { + const contents = []; + + if (attrs.canDelete) { + contents.push(this.attach('button', { + icon: 'times', + action: 'deletePost', + title: 'post.controls.delete' + })); + } + + if (attrs.canEdit) { + contents.push(this.attach('button', { + icon: 'pencil', + action: 'editPost', + title: 'post.controls.edit' + })); + } + + const description = actionDescriptionHtml(attrs.actionCode, attrs.created_at, attrs.actionCodeWho); + contents.push(new RawHtml({ html: `

${description}

` })); + + if (attrs.cooked) { + contents.push(new RawHtml({ html: `
${attrs.cooked}
` })); + } + + return [ + h('div.topic-avatar', iconNode(icons[attrs.actionCode] || 'exclamation')), + h('div.small-action-desc', contents) + ]; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 new file mode 100644 index 0000000000..723ef1ab46 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 @@ -0,0 +1,75 @@ +import { createWidget } from 'discourse/widgets/widget'; +import transformPost from 'discourse/lib/transform-post'; + +const DAY = 1000 * 60 * 60 * 24; + +export default createWidget('post-stream', { + tagName: 'div.post-stream', + + + html(attrs) { + const posts = attrs.posts || []; + const postArray = posts.toArray(); + + const result = []; + + const before = attrs.gaps && attrs.gaps.before ? attrs.gaps.before : {}; + const after = attrs.gaps && attrs.gaps.before ? attrs.gaps.after : {}; + + let prevPost; + let prevDate; + + for (let i=0; i this.siteSettings.show_time_gap_days) { + result.push(this.attach('time-gap', { daysSince })); + } + } + prevDate = curTime; + + // actual post contents + if (transformed.isSmallAction) { + result.push(this.attach('post-small-action', transformed, { model: post })); + } else { + result.push(this.attach('post', transformed, { model: post })); + } + + // Post gap - after + const afterGap = after[post.id]; + if (afterGap) { + result.push(this.attach('post-gap', { pos: 'after', postId: post.id, gap: afterGap }, { model: post })); + } + + prevPost = post; + } + return result; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/post.js.es6 b/app/assets/javascripts/discourse/widgets/post.js.es6 new file mode 100644 index 0000000000..06916e942d --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post.js.es6 @@ -0,0 +1,395 @@ +import PostCooked from 'discourse/widgets/post-cooked'; +import { createWidget } from 'discourse/widgets/widget'; +import { iconNode } from 'discourse/helpers/fa-icon'; +import { transformBasicPost } from 'discourse/lib/transform-post'; +import { h } from 'virtual-dom'; +import DiscourseURL from 'discourse/lib/url'; +import { dateNode } from 'discourse/helpers/node'; + +export function avatarImg(wanted, attrs) { + const size = Discourse.Utilities.translateSize(wanted); + const url = Discourse.Utilities.avatarUrl(attrs.template, size); + + // We won't render an invalid url + if (!url || url.length === 0) { return; } + const title = attrs.username; + + const properties = { + attributes: { alt: '', width: size, height: size, src: Discourse.getURLWithCDN(url), title }, + className: 'avatar' + }; + + return h('img', properties); +} + +export function avatarFor(wanted, attrs) { + return h('a', { + className: `trigger-user-card ${attrs.className || ''}`, + attributes: { href: attrs.url, 'data-user-card': attrs.username } + }, avatarImg(wanted, attrs)); +} + +createWidget('select-post', { + tagName: 'div.select-posts', + + html(attrs) { + const buttons = []; + + if (attrs.replyCount > 0 && !attrs.selected) { + buttons.push(this.attach('button', { label: 'topic.multi_select.select_replies', action: 'selectReplies' })); + } + + const selectPostKey = attrs.selected ? 'topic.multi_select.selected' : 'topic.multi_select.select'; + buttons.push(this.attach('button', { className: 'select-post', + label: selectPostKey, + labelOptions: { count: attrs.selectedPostsCount }, + action: 'selectPost' })); + return buttons; + } +}); + +createWidget('reply-to-tab', { + tagName: 'a.reply-to-tab', + + defaultState() { + return { loading: false }; + }, + + html(attrs, state) { + if (state.loading) { return I18n.t('loading'); } + + return [iconNode('mail-forward'), + ' ', + avatarFor.call(this, 'small', { + template: attrs.replyToAvatarTemplate, + username: attrs.replyToUsername + }), + ' ', + h('span', attrs.replyToUsername)]; + }, + + click() { + this.state.loading = true; + this.sendWidgetAction('toggleReplyAbove').then(() => this.state.loading = false); + } +}); + +createWidget('post-avatar', { + tagName: 'div.topic-avatar', + + html(attrs) { + let body; + if (!attrs.user_id) { + body = h('i', { className: 'fa fa-trash-o deleted-user-avatar' }); + } else { + body = avatarFor.call(this, 'large', { + template: attrs.avatar_template, + username: attrs.username, + url: attrs.usernameUrl, + className: 'main-avatar' + }); + } + + return [body, h('div.poster-avatar-extra')]; + } +}); + + +createWidget('wiki-edit-button', { + tagName: 'div.post-info.wiki', + title: 'post.wiki.about', + + html() { + return iconNode('pencil-square-o'); + }, + + click() { + this.sendWidgetAction('editPost'); + } +}); + +createWidget('post-email-indicator', { + tagName: 'div.post-info.via-email', + title: 'post.via_email', + + buildClasses(attrs) { + return attrs.canViewRawEmail ? 'raw-email' : null; + }, + + html() { + return iconNode('envelope-o'); + }, + + click() { + if (this.attrs.canViewRawEmail) { + this.sendWidgetAction('showRawEmail'); + } + } +}); + +function showReplyTab(attrs, siteSettings) { + return attrs.replyToUsername && + (!attrs.replyDirectlyAbove || !siteSettings.suppress_reply_directly_above); +} + +createWidget('post-meta-data', { + tagName: 'div.topic-meta-data', + html(attrs) { + const result = [this.attach('poster-name', attrs)]; + + if (attrs.isWhisper) { + result.push(h('div.post-info.whisper', { + attributes: { title: I18n.t('post.whisper') }, + }, iconNode('eye-slash'))); + } + + const createdAt = new Date(attrs.created_at); + if (createdAt) { + result.push(h('div.post-info', + h('a.post-date', { + attributes: { + href: attrs.shareUrl, + 'data-share-url': attrs.shareUrl, + 'data-post-number': attrs.post_number + } + }, dateNode(createdAt)) + )); + } + + if (attrs.via_email) { + result.push(this.attach('post-email-indicator', attrs)); + } + + if (attrs.version > 1) { + result.push(this.attach('post-edits-indicator', attrs)); + } + + if (attrs.wiki) { + result.push(this.attach('wiki-edit-button', attrs)); + } + + if (attrs.multiSelect) { + result.push(this.attach('select-post', attrs)); + } + + if (showReplyTab(attrs, this.siteSettings)) { + result.push(this.attach('reply-to-tab', attrs)); + } + + result.push(h('div.read-state', { + className: attrs.read ? 'read' : null, + attributes: { + title: I18n.t('post.unread') + } + }, iconNode('circle'))); + + return result; + } +}); + +createWidget('expand-hidden', { + tagName: 'a.expand-hidden', + + html() { + return I18n.t('post.show_hidden'); + }, + + click() { + this.sendWidgetAction('expandHidden'); + } +}); + +createWidget('expand-post-button', { + tagName: 'button.btn.expand-post', + buildKey: attrs => `expand-post-button-${attrs.id}`, + + defaultState() { + return { loadingExpanded: false }; + }, + + html(attrs, state) { + if (state.loadingExpanded) { + return I18n.t('loading'); + } else { + return [I18n.t('post.show_full'), "..."]; + } + }, + + click() { + this.state.loadingExpanded = true; + this.sendWidgetAction('expandFirstPost'); + } +}); + +createWidget('post-contents', { + buildKey: attrs => `post-contents-${attrs.id}`, + + buildClasses(attrs) { + const classes = []; + if (!this.state.repliesShown) { + classes.push('contents'); + } + if (showReplyTab(attrs, this.siteSettings)) { + classes.push('avoid-tab'); + } + return classes; + }, + + html(attrs) { + return new PostCooked(attrs); + } +}); + +createWidget('post-body', { + tagName: 'div.topic-body', + buildKey: attrs => `topic-body-${attrs.id}`, + + defaultState() { + return { expandedFirstPost: false, repliesBelow: [] }; + }, + + html(attrs, state) { + const extraState = { state: { repliesShown: !!state.repliesBelow.length } }; + const regular = [this.attach('post-contents', attrs, extraState)]; + + if (attrs.cooked_hidden) { + regular.push(this.attach('expand-hidden', attrs)); + } + + if (!state.expandedFirstPost && attrs.expandablePost) { + regular.push(this.attach('expand-post-button', attrs)); + } + + regular.push(this.attach('post-menu', attrs, extraState)); + + const repliesBelow = state.repliesBelow; + if (repliesBelow.length) { + regular.push(h('section.embedded-posts.bottom', + repliesBelow.map(p => this.attach('embedded-post', p)))); + } + + const result = [this.attach('post-meta-data', attrs), h('div.regular', regular)]; + result.push(this.attach('actions-summary', attrs)); + if (attrs.showTopicMap) { + result.push(this.attach('topic-map', attrs)); + } + + return result; + }, + + toggleRepliesBelow() { + if (this.state.repliesBelow.length) { + this.state.repliesBelow = []; + return; + } + + return this.store.find('post-reply', { postId: this.attrs.id }).then(posts => { + this.state.repliesBelow = posts.map(transformBasicPost); + }); + }, + + expandFirstPost() { + const post = this.findAncestorModel(); + return post.expand().then(() => this.state.expandedFirstPost = true); + } +}); + +createWidget('post-article', { + tagName: 'article.boxed', + buildKey: attrs => `post-article-${attrs.id}`, + + defaultState() { + return { repliesAbove: [] }; + }, + + buildId(attrs) { + return `post_${attrs.post_number}`; + }, + + buildClasses(attrs) { + if (attrs.via_email) { return 'via-email'; } + }, + + buildAttributes(attrs) { + return { 'data-post-id': attrs.id, 'data-user-id': attrs.user_id }; + }, + + html(attrs, state) { + const rows = []; + if (state.repliesAbove.length) { + const replies = state.repliesAbove.map(p => this.attach('embedded-post', p, { state: { above: true } })); + rows.push(h('div.row', h('section.embedded-posts.top.topic-body.offset2', replies))); + } + + rows.push(h('div.row', [this.attach('post-avatar', attrs), + this.attach('post-body', attrs), + this.attach('post-gutter', attrs)])); + return rows; + }, + + toggleReplyAbove() { + const replyPostNumber = this.attrs.reply_to_post_number; + + // jump directly on mobile + if (Discourse.Mobile.mobileView) { + DiscourseURL.jumpToPost(replyPostNumber); + return Ember.RSVP.Promise.resolve(); + } + + if (this.state.repliesAbove.length) { + this.state.repliesAbove = []; + return Ember.RSVP.Promise.resolve(); + } else { + return this.store.find('post-reply-history', { postId: this.attrs.id }).then(posts => { + this.state.repliesAbove = posts.map(transformBasicPost); + }); + } + }, + +}); + +export default createWidget('post', { + buildKey: attrs => `post-${attrs.id}`, + shadowTree: true, + + buildClasses(attrs) { + const classNames = ['topic-post', 'clearfix']; + + if (attrs.selected) { classNames.push('selected'); } + if (attrs.topicOwner) { classNames.push('topic-owner'); } + if (attrs.hidden) { classNames.push('post-hidden'); } + if (attrs.deleted) { classNames.push('deleted'); } + if (attrs.primary_group_name) { classNames.push(`group-${attrs.primary_group_name}`); } + if (attrs.wiki) { classNames.push(`wiki`); } + if (attrs.isWhisper) { classNames.push('whisper'); } + if (attrs.isModeratorAction || (attrs.isWarning && attrs.firstPost)) { + classNames.push('moderator'); + } else { + classNames.push('regular'); + } + return classNames; + }, + + html(attrs) { + return this.attach('post-article', attrs); + }, + + toggleLike() { + const post = this.model; + const likeAction = post.get('likeAction'); + + if (likeAction && likeAction.get('canToggle')) { + return likeAction.togglePromise(post); + } + }, + + undoPostAction(typeId) { + const post = this.model; + return post.get('actions_summary').findProperty('id', typeId).undo(post); + }, + + deferPostActionFlags(typeId) { + const post = this.model; + return post.get('actions_summary').findProperty('id', typeId).deferFlags(post); + } +}); diff --git a/app/assets/javascripts/discourse/widgets/poster-name.js.es6 b/app/assets/javascripts/discourse/widgets/poster-name.js.es6 new file mode 100644 index 0000000000..3c91a68d5c --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/poster-name.js.es6 @@ -0,0 +1,61 @@ +import { iconNode } from 'discourse/helpers/fa-icon'; +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; + +function sanitizeName(name){ + return name.toLowerCase().replace(/[\s_-]/g,''); +} + +export default createWidget('poster-name', { + tagName: 'div.names.trigger-user-card', + + // TODO: Allow extensibility + posterGlyph(attrs) { + if (attrs.moderator) { + return iconNode('shield', { title: I18n.t('user.moderator_tooltip') }); + } + }, + + userLink(attrs, text) { + return h('a', { attributes: { + href: attrs.usernameUrl, + 'data-auto-route': true, + 'data-user-card': attrs.username + } }, text); + }, + + html(attrs) { + const username = attrs.username; + const classNames = ['username']; + + if (attrs.staff) { classNames.push('staff'); } + if (attrs.admin) { classNames.push('admin'); } + if (attrs.moderator) { classNames.push('moderator'); } + if (attrs.new_user) { classNames.push('new-user'); } + + const primaryGroupName = attrs.primary_group_name; + if (primaryGroupName && primaryGroupName.length) { + classNames.push(primaryGroupName); + } + const nameContents = [ this.userLink(attrs, attrs.username) ]; + const glyph = this.posterGlyph(attrs); + if (glyph) { nameContents.push(glyph); } + + const contents = [h('span', { className: classNames.join(' ') }, nameContents)]; + const name = attrs.name; + if (name && this.siteSettings.display_name_on_posts && sanitizeName(name) !== sanitizeName(username)) { + contents.push(h('span.full-name', this.userLink(attrs, name))); + } + const title = attrs.user_title; + if (title && title.length) { + let titleContents = title; + if (primaryGroupName) { + const href = Discourse.getURL(`/groups/${primaryGroupName}`); + titleContents = h('a.user-group', { attributes: { href } }, title); + } + contents.push(h('span.user-title', titleContents)); + } + + return contents; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 b/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 new file mode 100644 index 0000000000..9fe250d5c6 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/private-message-map.js.es6 @@ -0,0 +1,76 @@ +import { iconNode } from 'discourse/helpers/fa-icon'; +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; +import { avatarFor } from 'discourse/widgets/post'; + +createWidget('pm-map-user-group', { + tagName: 'div.user.group', + + html(attrs) { + const link = h('a', { attributes: { href: Discourse.getURL(`/groups/${attrs.name}`) } }, attrs.name); + return [iconNode('users'), ' ', link]; + } +}); + +createWidget('pm-remove-link', { + tagName: 'a.remove-invited', + + html() { + return iconNode('times'); + }, + + click() { + bootbox.confirm(I18n.t("private_message_info.remove_allowed_user", {name: this.attrs.username}), + () => this.sendWidgetAction('removeAllowedUser', this.attrs) + ); + } +}); + +createWidget('pm-map-user', { + tagName: 'div.user', + + html(attrs) { + const user = attrs.user; + const avatar = avatarFor('small', { template: user.avatar_template, username: user.username }); + const link = h('a', { attributes: { href: user.get('path') } }, [ avatar, ' ', user.username ]); + + const result = [link]; + if (attrs.canRemoveAllowedUsers) { + result.push(' '); + result.push(this.attach('pm-remove-link', user)); + } + + return result; + } +}); + +export default createWidget('private-message-map', { + tagName: 'section.information.private-message-map', + + html(attrs) { + const participants = []; + + if (attrs.allowedGroups.length) { + participants.push(attrs.allowedGroups.map(ag => this.attach('pm-map-user-group', ag))); + } + + if (attrs.allowedUsers.length) { + participants.push(attrs.allowedUsers.map(ag => { + return this.attach('pm-map-user', { user: ag, canRemoveAllowedUsers: attrs.canRemoveAllowedUsers }); + })); + } + + const result = [ h('h3', [iconNode('envelope'), ' ', I18n.t('private_message_info.title')]), + h('div.participants.clearfix', participants) ]; + + if (attrs.canInvite) { + result.push(h('div.controls', this.attach('button', { + action: 'showInvite', + label: 'private_message_info.invite', + className: 'btn' + }))); + } + + return result; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/raw-html.js.es6 b/app/assets/javascripts/discourse/widgets/raw-html.js.es6 new file mode 100644 index 0000000000..a1eddd74b1 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/raw-html.js.es6 @@ -0,0 +1,18 @@ +export default class RawHtml { + constructor(attrs) { + this.html = attrs.html; + } + + init() { + return $(this.html)[0]; + } + + update(prev) { + if (prev.html === this.html) { return; } + return this.init(); + } + + destroy() { } +} + +RawHtml.prototype.type = 'Widget'; diff --git a/app/assets/javascripts/discourse/widgets/time-gap.js.es6 b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 new file mode 100644 index 0000000000..cb1b558106 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 @@ -0,0 +1,26 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; +import { iconNode } from 'discourse/helpers/fa-icon'; + +function description(attrs) { + const daysSince = attrs.daysSince; + + if (daysSince < 30) { + return I18n.t('dates.later.x_days', {count: daysSince}); + } else if (daysSince < 365) { + const gapMonths = Math.floor(daysSince / 30); + return I18n.t('dates.later.x_months', {count: gapMonths}); + } else { + const gapYears = Math.floor(daysSince / 365); + return I18n.t('dates.later.x_years', {count: gapYears}); + } +} + +export default createWidget('time-gap', { + tagName: 'div.time-gap.small-action', + + html(attrs) { + return [h('div.topic-avatar', iconNode('clock-o')), + h('div.small-action-desc', description(attrs))]; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/toggle-topic-summary.js.es6 b/app/assets/javascripts/discourse/widgets/toggle-topic-summary.js.es6 new file mode 100644 index 0000000000..33580af7fd --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/toggle-topic-summary.js.es6 @@ -0,0 +1,33 @@ +import RawHtml from 'discourse/widgets/raw-html'; +import { createWidget } from 'discourse/widgets/widget'; + +createWidget('toggle-summary-description', { + description(attrs) { + if (attrs.topicSummaryEnabled) { + return I18n.t('summary.enabled_description'); + } + + if (attrs.topicWordCount) { + const readingTime = Math.floor(attrs.topicWordCount / this.siteSettings.read_time_word_count); + return I18n.t('summary.description_time', { count: attrs.topicPostsCount, readingTime }); + } + return I18n.t('summary.description', { count: attrs.topicPostsCount }); + }, + + html(attrs) { + // vdom makes putting html in the i18n difficult + return new RawHtml({ html: `

${this.description(attrs)}

` }); + } +}); + +export default createWidget('toggle-topic-summary', { + tagName: 'section.information.toggle-summary', + html(attrs) { + return [ this.attach('toggle-summary-description', attrs), + this.attach('button', { + className: 'btn btn-primary', + label: attrs.topicSummaryEnabled ? 'summary.disable' : 'summary.enable', + action: 'toggleSummary' + }) ]; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/topic-map.js.es6 b/app/assets/javascripts/discourse/widgets/topic-map.js.es6 new file mode 100644 index 0000000000..00d6f7e93e --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/topic-map.js.es6 @@ -0,0 +1,219 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; +import { avatarImg, avatarFor } from 'discourse/widgets/post'; +import { dateNode, numberNode } from 'discourse/helpers/node'; + +const LINKS_SHOWN = 5; + +function renderParticipants(userFilters, participants) { + if (!participants) { return; } + + userFilters = userFilters || []; + return participants.map(p => { + return this.attach('topic-participant', p, { state: { toggled: userFilters.contains(p.username) } }); + }); +} + +createWidget('topic-map-show-links', { + tagName: 'div.link-summary', + html(attrs) { + return h('a', I18n.t('topic_map.links_shown', { totalLinks: attrs.totalLinks })); + }, + + click() { + this.sendWidgetAction('showAllLinks'); + } +}); + +createWidget('topic-participant', { + html(attrs, state) { + const linkContents = [avatarImg('medium', { username: attrs.username, template: attrs.avatar_template })]; + + if (attrs.post_count > 2) { + linkContents.push(h('span.post-count', attrs.post_count.toString())); + } + + return h('a.poster', { className: state.toggled ? 'toggled' : null, attributes: { title: attrs.username } }, + linkContents + ); + }, + + click() { + this.sendWidgetAction('toggleParticipant', this.attrs); + } +}); + +createWidget('topic-map-summary', { + tagName: 'section.map', + + buildClasses(attrs, state) { + if (state.collapsed) { return 'map-collapsed'; } + }, + + html(attrs, state) { + const contents = []; + contents.push(h('li', + [ + h('h4', I18n.t('created_lowercase')), + avatarFor('tiny', { username: attrs.createdByUsername, template: attrs.createdByAvatarTemplate }), + dateNode(attrs.topicCreatedAt) + ] + )); + contents.push(h('li', + h('a', { attributes: { href: attrs.lastPostUrl } }, [ + h('h4', I18n.t('last_reply_lowercase')), + avatarFor('tiny', { username: attrs.lastPostUsername, template: attrs.lastPostAvatarTemplate }), + dateNode(attrs.lastPostAt) + ]) + )); + contents.push(h('li', [ + numberNode(attrs.topicReplyCount), + h('h4', I18n.t('replies_lowercase', { count: attrs.topicReplyCount })) + ])); + contents.push(h('li.secondary', [ + numberNode(attrs.topicViews, { className: attrs.topicViewsHeat }), + h('h4', I18n.t('views_lowercase', { count: attrs.topicViews })) + ])); + contents.push(h('li.secondary', [ + numberNode(attrs.participantCount), + h('h4', I18n.t('users_lowercase', { count: attrs.participantCount })) + ])); + + if (attrs.topicLikeCount) { + contents.push(h('li.secondary', [ + numberNode(attrs.likeCount), + h('h4', I18n.t('likes_lowercase', { count: attrs.likeCount })) + ])); + } + + if (attrs.topicLinkLength > 0) { + contents.push(h('li.secondary', [ + numberNode(attrs.topicLinkLength), + h('h4', I18n.t('links_lowercase', { count: attrs.topicLinkLength })) + ])); + } + + if (state.collapsed && attrs.topicPostsCount > 2 && attrs.participants.length > 0) { + const participants = renderParticipants.call(this, attrs.userFilters, attrs.participants.slice(0, 3)); + contents.push(h('li.avatars', participants)); + } + + return h('ul.clearfix', contents); + } +}); + +createWidget('topic-map-link', { + tagName: 'a.topic-link.track-link', + + buildClasses(attrs) { + if (attrs.attachment) { return 'attachment'; } + }, + + buildAttributes(attrs) { + return { href: attrs.url, + target: "_blank", + 'data-user-id': attrs.user_id, + 'data-ignore-post-id': 'true', + title: attrs.url }; + }, + + html(attrs) { + if (attrs.title) { return attrs.title; } + return attrs.url; + } +}); + +createWidget('topic-map-expanded', { + tagName: 'section.topic-map-expanded', + + defaultState() { + return { allLinksShown: false }; + }, + + html(attrs, state) { + const avatars = h('section.avatars.clearfix', [ + h('h3', I18n.t('topic_map.participants_title')), + renderParticipants.call(this, attrs.userFilters, attrs.participants) + ]); + + const result = [avatars]; + if (attrs.topicLinks) { + + const toShow = state.allLinksShown ? attrs.topicLinks : attrs.topicLinks.slice(0, LINKS_SHOWN); + const links = toShow.map(l => { + + let host = ''; + if (l.title && l.title.length) { + const domain = l.domain; + if (domain && domain.length) { + const s = domain.split('.'); + host = h('span.domain', s[s.length-2] + "." + s[s.length-1]); + } + } + + return h('tr', [ + h('td', + h('span.badge.badge-notification.clicks', { + attributes: { title: I18n.t('topic_map.clicks', { count: l.clicks }) } + }, l.clicks.toString()) + ), + h('td', [this.attach('topic-map-link', l), ' ', host]) + ]); + }); + + const showAllLinksContent = [ + h('h3', I18n.t('topic_map.links_title')), + h('table.topic-links', links) + ]; + + if (!state.allLinksShown && links.length < attrs.topicLinks.length) { + showAllLinksContent.push(this.attach('topic-map-show-links', { totalLinks: attrs.topicLinks.length })); + } + + const section = h('section.links', showAllLinksContent); + result.push(section); + } + return result; + }, + + showAllLinks() { + this.state.allLinksShown = true; + } +}); + +export default createWidget('topic-map', { + tagName: 'div.topic-map', + buildKey: attrs => `topic-map-${attrs.id}`, + + defaultState() { + return { collapsed: true }; + }, + + html(attrs, state) { + const nav = h('nav.buttons', this.attach('button', { + title: 'topic.toggle_information', + icon: state.collapsed ? 'chevron-down' : 'chevron-up', + action: 'toggleMap', + className: 'btn', + })); + + const contents = [nav, this.attach('topic-map-summary', attrs, { state })]; + + if (!state.collapsed) { + contents.push(this.attach('topic-map-expanded', attrs)); + } + + if (attrs.hasTopicSummary) { + contents.push(this.attach('toggle-topic-summary', attrs)); + } + + if (attrs.showPMMap) { + contents.push(this.attach('private-message-map', attrs)); + } + return contents; + }, + + toggleMap() { + this.state.collapsed = !this.state.collapsed; + } +}); diff --git a/app/assets/javascripts/discourse/widgets/widget.js.es6 b/app/assets/javascripts/discourse/widgets/widget.js.es6 new file mode 100644 index 0000000000..aeff961925 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/widget.js.es6 @@ -0,0 +1,214 @@ +import { WidgetClickHook, WidgetClickOutsideHook } from 'discourse/widgets/click-hook'; +import { h } from 'virtual-dom'; + +function emptyContent() { } + +const _registry = {}; +const _dirty = {}; + +export function keyDirty(key) { + _dirty[key] = true; +} + +function drawWidget(builder, attrs, state) { + const properties = {}; + + if (this.buildClasses) { + let classes = this.buildClasses(attrs, state) || []; + if (!Array.isArray(classes)) { classes = [classes]; } + if (classes.length) { + properties.className = classes.join(' '); + } + } + if (this.buildId) { + properties.id = this.buildId(attrs); + } + + if (this.buildAttributes) { + properties.attributes = this.buildAttributes(attrs); + } + if (this.clickOutside) { + properties['widget-click-outside'] = new WidgetClickOutsideHook(this); + } + if (this.click) { + properties['widget-click'] = new WidgetClickHook(this); + } + + const attributes = properties['attributes'] || {}; + properties.attributes = attributes; + if (this.title) { + attributes.title = I18n.t(this.title); + } + + return h(this.tagName || 'div', properties, this.html(attrs, state)); +} + +export function createWidget(name, opts) { + const result = class CustomWidget extends Widget {}; + + if (name) { + _registry[name] = result; + } + + opts.html = opts.html || emptyContent; + opts.draw = drawWidget; + + Object.keys(opts).forEach(k => result.prototype[k] = opts[k]); + return result; +} + +export default class Widget { + constructor(attrs, container, opts) { + opts = opts || {}; + this.attrs = attrs || {}; + this.mergeState = opts.state; + this.container = container; + this.model = opts.model; + + this.key = this.buildKey ? this.buildKey(attrs) : null; + + this.site = container.lookup('site:main'); + this.siteSettings = container.lookup('site-settings:main'); + this.currentUser = container.lookup('current-user:main'); + this.store = container.lookup('store:main'); + } + + defaultState() { + return {}; + } + + destroy() { + console.log('destroy called'); + } + + render(prev) { + if (prev && prev.state) { + this.state = prev.state; + } else { + this.state = this.defaultState(); + } + + // Sometimes we pass state down from the parent + if (this.mergeState) { + this.state = _.merge(this.state, this.mergeState); + } + + if (prev && prev.shadowTree) { + this.shadowTree = true; + if (!_dirty[prev.key]) { return prev.vnode; } + } + + return this.draw(h, this.attrs, this.state); + } + + _findAncestorWithProperty(property) { + let widget = this; + while (widget) { + const value = widget[property]; + if (value) { + return widget; + } + widget = widget.parentWidget; + } + } + + _findView() { + const widget = this._findAncestorWithProperty('_emberView'); + if (widget) { + return widget._emberView; + } + } + + attach(widgetName, attrs, opts) { + let WidgetClass = _registry[widgetName]; + + if (!WidgetClass) { + if (!this.container) { + console.error("couldn't find container"); + return; + } + WidgetClass = this.container.lookupFactory(`widget:${widgetName}`); + } + + if (WidgetClass) { + const result = new WidgetClass(attrs, this.container, opts); + result.parentWidget = this; + return result; + } else { + throw `Couldn't find ${widgetName} factory`; + } + } + + scheduleRerender() { + let widget = this; + while (widget) { + if (widget.shadowTree) { + keyDirty(widget.key); + } + + const emberView = widget._emberView; + if (emberView) { + return emberView.queueRerender(); + } + widget = widget.parentWidget; + } + } + + sendComponentAction(name, param) { + const view = this._findAncestorWithProperty('_emberView'); + + let promise; + if (view) { + // Peek into ember internals to allow us to return promises from actions + const ev = view._emberView; + const target = ev.get('targetObject'); + + const actionName = ev.get(name); + if (!actionName) { + Ember.warn(`${name} not found`); + return; + } + + if (target) { + const actions = target._actions || target.actionHooks; + const method = actions[actionName]; + if (method) { + promise = method.call(target, param); + if (!promise || !promise.then) { + promise = Ember.RSVP.resolve(promise); + } + } else { + return ev.sendAction(name, param); + } + } + } + + if (promise) { + return promise.then(() => this.scheduleRerender()); + } + } + + findAncestorModel() { + const modelWidget = this._findAncestorWithProperty('model'); + if (modelWidget) { + return modelWidget.model; + } + } + + sendWidgetAction(name, param) { + const widget = this._findAncestorWithProperty(name); + if (widget) { + const result = widget[name](param); + if (result && result.then) { + return result.then(() => this.scheduleRerender()); + } else { + this.scheduleRerender(); + return result; + } + } + + return this.sendComponentAction(name, param || this.findAncestorModel()); + } +} + +Widget.prototype.type = 'Thunk'; diff --git a/app/assets/javascripts/main_include.js b/app/assets/javascripts/main_include.js index 43379cc09c..dd6a27e138 100644 --- a/app/assets/javascripts/main_include.js +++ b/app/assets/javascripts/main_include.js @@ -58,11 +58,9 @@ //= require ./discourse/models/user-badge //= require ./discourse/controllers/discovery-sortable //= require ./discourse/controllers/navigation/default -//= require ./discourse/views/grouped //= require ./discourse/views/container //= require ./discourse/views/modal-body //= require ./discourse/views/flag -//= require ./discourse/views/cloaked //= require ./discourse/components/combo-box //= require ./discourse/components/edit-category-panel //= require ./discourse/views/button @@ -110,3 +108,4 @@ //= require_tree ./discourse/pre-initializers //= require_tree ./discourse/initializers //= require_tree ./discourse/services +//= require_tree ./discourse/widgets diff --git a/app/assets/javascripts/vendor.js b/app/assets/javascripts/vendor.js index 29ee2c5328..d2143d3201 100644 --- a/app/assets/javascripts/vendor.js +++ b/app/assets/javascripts/vendor.js @@ -38,4 +38,6 @@ //= require break_string //= require buffered-proxy //= require jquery.autoellipsis-1.0.10.min.js +//= require virtual-dom +//= require virtual-dom-amd //= require_tree ./discourse/ember diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index e5db38f831..0d4aa675d4 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -19,7 +19,7 @@ h1 .topic-statuses .topic-status i { max-height: 40px; } -.post-cloak { +.topic-body { padding: 0; &:first-of-type { @@ -208,7 +208,6 @@ nav.post-controls { bottom: -2px; right: 15px; z-index: 1000; - display: none; h3 { margin-top: 0; @@ -1003,9 +1002,9 @@ and (max-width : 870px) { width: 45px; } - .post-cloak .reply-to-tab { + .topic-post .reply-to-tab { right: 15%; - } + } .topic-body { box-sizing: border-box; diff --git a/app/assets/stylesheets/mobile/topic.scss b/app/assets/stylesheets/mobile/topic.scss index 75b772802f..2583073057 100644 --- a/app/assets/stylesheets/mobile/topic.scss +++ b/app/assets/stylesheets/mobile/topic.scss @@ -163,7 +163,7 @@ position: absolute; } -.post-cloak:last-of-type {padding-bottom: 40px;} +.topic-post:last-of-type {padding-bottom: 40px;} .heatmap-high {color: scale-color($danger, $lightness: -25%) !important;} .heatmap-med {color: $danger !important;} diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 97dbc78ac3..5ae311e510 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1530,17 +1530,14 @@ en: like: "Undo like" vote: "Undo vote" people: - off_topic: "{{icons}} flagged this as off-topic" - spam: "{{icons}} flagged this as spam" - spam_with_url: "{{icons}} flagged this as spam" - inappropriate: "{{icons}} flagged this as inappropriate" - notify_moderators: "{{icons}} notified moderators" - notify_moderators_with_url: "{{icons}} notified moderators" - notify_user: "{{icons}} sent a message" - notify_user_with_url: "{{icons}} sent a message" - bookmark: "{{icons}} bookmarked this" - like: "{{icons}} liked this" - vote: "{{icons}} voted for this" + off_topic: "flagged this as off-topic" + spam: "flagged this as spam" + inappropriate: "flagged this as inappropriate" + notify_moderators: "notified moderators" + notify_user: "sent a message" + bookmark: "bookmarked this" + like: "liked this" + vote: "voted for this" by_you: off_topic: "You flagged this as off-topic" spam: "You flagged this as spam" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index a63a9a598e..9cfde3e211 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -928,7 +928,6 @@ ar: suppress_reply_directly_above: "لا تظهر للتوسع في الرد لعلى وظيفة عندما يكون هناك سوى رد واحد مباشرة فوق هذا المنصب." suppress_reply_when_quoting: "لا تظهر للتوسع في الرد لعلى وظيفة عندما يكون هناك سوى رد واحد مباشرة فوق هذا المنصب." max_reply_history: "الحد الأقصى لعدد الردود على توسيع عند توسيع في الرد ل" - experimental_reply_expansion: "إخفاء ردود المتوسطة عند توسيع ردا على (تجريبي)" topics_per_period_in_top_summary: "عدد من أهم الموضوعات هو مبين في موجز أعلى الافتراضية المواضيع." topics_per_period_in_top_page: "عدد من أهم الموضوعات هو مبين في موجز أعلى الافتراضية المواضيع." redirect_users_to_top_page: "إعادة توجيه تلقائيا للمستخدمين الجدد وغائبة لمدة طويلة إلى أعلى الصفحة." diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 66051a31ff..f3d2eb1929 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -758,7 +758,6 @@ de: suppress_reply_directly_above: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der beantwortete Beitrag direkt darüber angezeigt wird." suppress_reply_when_quoting: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der Beitrag den beantworteten Beitrag zitiert." max_reply_history: "Maximale Anzahl an Antworten beim Ausklappen von in-reply-to" - experimental_reply_expansion: "Verstecke dazwischenliegende Beiträge, wenn der beantwortete Beitrag erweitert wird (experimentell)." topics_per_period_in_top_summary: "Anzahl der Themen, die in der Top-Themübersicht angezeigt werden." topics_per_period_in_top_page: "Anzahl der Themen, die in der mit \"Mehr zeigen\" erweiterten Top-Themenübersicht angezeigt werden." redirect_users_to_top_page: "Verweise neue und länger abwesende Nutzer automatisch zur Top Übersichtsseite" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index f0f4c26cd4..7c1a72820a 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -877,9 +877,6 @@ en: suppress_reply_directly_above: "Don't show the expandable in-reply-to on a post when there is only a single reply directly above this post." suppress_reply_when_quoting: "Don't show the expandable in-reply-to on a post when post quotes reply." max_reply_history: "Maximum number of replies to expand when expanding in-reply-to" - - experimental_reply_expansion: "Hide intermediate replies when expanding a reply to (experimental)" - topics_per_period_in_top_summary: "Number of top topics shown in the default top topics summary." topics_per_period_in_top_page: "Number of top topics shown on the expanded 'Show More' top topics." redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index e4cd55c408..5cb5d2a301 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -773,7 +773,6 @@ es: suppress_reply_directly_above: "No mostrar el en-respuesta-a desplegable en un post cuando solo hay una sola respuesta justo encima del post." suppress_reply_when_quoting: "No mostrar el desplegable en-respuesta-a en un post cuando el post cite la respuesta." max_reply_history: "Número máximo de respuestas a mostrar al expandir en-respuesta-a" - experimental_reply_expansion: "Ocultar respuestas intermedias cuando se expande una respuesta (experimental)" topics_per_period_in_top_summary: "Número de mejores temas mostrados en el resumen de mejores temas." topics_per_period_in_top_page: "Número de mejores temas mostrados en la vista expandida al clicar en 'ver más'." redirect_users_to_top_page: "Redirigir automáticamente a los nuevos usuarios y a los ausentes de larga duración a la página de mejores temas." diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 5b66093ba5..d96cbb7f1e 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -699,7 +699,6 @@ fa_IR: suppress_reply_directly_above: "in-reply-to قابل بزرگ شدن را نشان نده در یک نوشته وقتی فقط یک پاسخ بالای این نوشته است." suppress_reply_when_quoting: "in-reply-to قابل بزرگ شدن را نشان نده در یک نوشته وقتی به یک نوشته پاسخ داده می شود." max_reply_history: "حداکثر تعداد پاسخ ها به توسعه زمان گسترش in-reply-to" - experimental_reply_expansion: "پاسخ های میانی را مخفی کن زمان توسعه یک پاسخ به (آزمایشی) " topics_per_period_in_top_summary: "تعداد بهتریت جستارهای نشان داده شده در بخش پیش فرض خلاصه بهترین جستارها." topics_per_period_in_top_page: "تعداد جستارهای خوب نشان داده شود در بخش گسترش یافته \" بیشتر نشان بده\" بهترین جستارها. " redirect_users_to_top_page: "بطور خودکار کاربران جدید و کاربران غایب را به بهترین صفحه هدایت کن." diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 48c387f366..143c58ccf2 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -781,7 +781,6 @@ fi: suppress_reply_directly_above: "Älä näytä vastauksena-painiketta viestin yläreunassa, jos viestissä on vastattu vain edelliseen viestiin." suppress_reply_when_quoting: "Älä näytä vastauksena-painiketta viestin yläreunassa, kun viestissä on lainaus." max_reply_history: "Maksimimäärä vastauksia, jotka avataan klikattaessa 'vastauksena' painiketta" - experimental_reply_expansion: "Piilota välilliset vastaukset, kun 'vastauksena' avataan (kokeellinen)" topics_per_period_in_top_summary: "Ketjujen lukumäärä, joka näytetään oletuksena Huiput-listauksissa." topics_per_period_in_top_page: "Ketjujen lukumäärä, joka näytetään laajennetussa Huiput-listauksessa." redirect_users_to_top_page: "Ohjaa uudet ja kauan poissa olleet käyttäjät automaattisesti huiput-sivulle." diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index d07d23a93b..105b6be96b 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -775,7 +775,6 @@ fr: suppress_reply_directly_above: "Ne pas afficher 'en réponse à' sur un message quand la seule réponse est juste en dessus de ce dernier." suppress_reply_when_quoting: "Ne pas affiché le panneau \"En réponse à\" sur un message qui répond à une citation." max_reply_history: "Nombre maximum de réponses à développer lors du développement d'une \"réponse à\"" - experimental_reply_expansion: "Masquer les réponses intermédiaires lors de l'ouverture d'une répondre à (expérimental)" topics_per_period_in_top_summary: "Nombre de meilleurs sujets affichés dans le résumé par défaut des meilleurs sujets." topics_per_period_in_top_page: "Nombre de meilleurs sujets affichés lorsqu'on sélectionne \"Voir plus\" des meilleurs sujets." redirect_users_to_top_page: "Rediriger automatiquement les nouveaux utilisateurs et les longues absences sur la page Top." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 008299cdde..e79e6d50eb 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -727,7 +727,6 @@ he: suppress_reply_directly_above: "אל תציגו את את אפשרות ההרחבה \"בתגובה ל..\" לפרסום כאשר יש רק תגובה אחת ישירה מעל לפרסום זה." suppress_reply_when_quoting: "אל תציגו את הפרסום המקורי בפרסומים שמצטטים תגובות" max_reply_history: "מספר התגובות המקסימלי להרחבה כאשר מרחיבים \"בתגובה ל\"" - experimental_reply_expansion: "החבא תגובות ביניים כאשר מרחיבים תגובה (ניסיוני)" topics_per_period_in_top_summary: "מספר הנושאים המוצגים בבריכת המחדל של סיכום הנושאים." topics_per_period_in_top_page: "מספר הנושאים הראשונים המוצגים בתצוגה המורחבת של \"הצג עוד\"." redirect_users_to_top_page: "כוון באופן אוטומטי משתמשים חדשים וכאלה שנעדרו במשך זמן לראש העמוד." diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 3d12040e83..969ba7c39d 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -728,7 +728,6 @@ it: suppress_reply_directly_above: "Non mostrare in-risposta-a espandibile in un messaggio quando c'è una sola risposta sopra quel messaggio. " suppress_reply_when_quoting: "Non mostrare in-risposta-a espandibile in un messaggio quando il messaggio include la citazione." max_reply_history: "Numero massimo di risposte da espandere quando si espande in-risposta-a" - experimental_reply_expansion: "Nascondi le risposte intermedie quando si espande una risposta (sperimentale)" topics_per_period_in_top_summary: "Numero di argomenti di punta mostrati nel riepilogo di default." topics_per_period_in_top_page: "Numero di argomenti di punta mostrati nella vista espansa 'Mostra Altro'" redirect_users_to_top_page: "Redirigi automaticamente i nuovi utenti e quelli assenti da tempo sulla pagina degli argomenti di punta." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index dcfe7301db..0d4381c44c 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -624,7 +624,6 @@ ja: suppress_reply_directly_above: "ポストに回答が1つしかない場合、ポストのin-reply-toを表示しない" suppress_reply_when_quoting: "ポストが引用返信だった場合、ポストのin-reply-toを表示しない" max_reply_history: "回答のin-reply-toを展開する最大数" - experimental_reply_expansion: "回答を展開するときに、その間にある回答を非表示にする(実験)" topics_per_period_in_top_summary: "デフォルトのトピックサマリに表示されるトップトピックの数" topics_per_period_in_top_page: "'もっと見る'を展開したときに表示するトップトピックの数" redirect_users_to_top_page: "新規ユーザーと長く不在のユーザーをトップページに自動的にリダイレクトさせる" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 14b7ff0b02..8c7773eddd 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -643,7 +643,6 @@ ko: suppress_reply_directly_above: "단 하나의 댓글 위의 글이 하나 있는 상황에서 '~에 대한 댓글'을 보여주지 않음." suppress_reply_when_quoting: "글안에 답글이 인용될 때 in-reply-to를 보여주지 않습니다." max_reply_history: "덧글 확장해서 보여지는 최대 갯수" - experimental_reply_expansion: "답글을 펼쳤을 때 중간 답글을 숨깁니다(실험 중)" topics_per_period_in_top_summary: "인기 글타래 요약에 기본으로 보여질 글타래 수" topics_per_period_in_top_page: "인기 글타래에서 '더 보기'를 요청할 시 보여질 글타래 수" redirect_users_to_top_page: "자동으로 신규 사용자와 오래간만에 들어온 사용자를 탑 페이지로 리다이렉트 시킴" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index b1f0239457..75d7199454 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -746,7 +746,6 @@ nl: suppress_reply_directly_above: "Verberg de uitklapbare 'in antwoord op' knop bij een bericht als er maar één reactie direct boven staat." suppress_reply_when_quoting: "Verberg de uitklapbare 'in antwoord op' knop bij een bericht als er er gequoteerd is." max_reply_history: "Maximaal aantal uit te klappen antwoorden als een 'in antwoord op' uitgeklapt wordt." - experimental_reply_expansion: "Verberg tussenliggende antwoorden als een antwoord uitgeklapt wordt (experimenteel)" topics_per_period_in_top_summary: "Aantal topics in het top-topics overzicht" topics_per_period_in_top_page: "Aantal topics in het uitgeklapte ´Meer...´ top-topics overzicht" redirect_users_to_top_page: "Stuur nieuwe en lang-niet-geziene gebruikers door naar de top-pagina" diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index f90e504063..adabb2c274 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -781,7 +781,6 @@ pt: suppress_reply_directly_above: "Não mostrar em-resposta-a expansível quando há apenas uma única resposta diretamente acima desta publicação." suppress_reply_when_quoting: "Não mostraR em-resposta-a expansível numa mensagem quando esta cita uma resposta." max_reply_history: "Número máximo de respostas a serem expandidas quando se expande em-resposta-a" - experimental_reply_expansion: "Esconder respostas intermédias ao expandir uma resposta-a (experimental)" topics_per_period_in_top_summary: "Número de tópicos principais mostrados no resumo padrão de tópicos principais." topics_per_period_in_top_page: "Número de tópicos principais mostrados em 'Mostrar Mais' tópicos principais expandido." redirect_users_to_top_page: "Redirecionar automaticamente os utilizadores novos e ausentes por períodos longos para o topo da página." diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 160aca462f..d21721249d 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -747,7 +747,6 @@ pt_BR: suppress_reply_directly_above: "Não mostrar a em-resposta-à expansível em um post quando há apenas uma única resposta diretamente acima deste post." suppress_reply_when_quoting: "Não mostrar a em-resposta-à expansível em um post quando o post cita a resposta." max_reply_history: "Número máximo de respostas para expandir quando expandindo em-resposta-à" - experimental_reply_expansion: "Esconder respostas intermediárias quando expandindo uma resposta à (experimental)" topics_per_period_in_top_summary: "Número de melhores tópicos mostrados no sumário padrão de melhores tópicos." topics_per_period_in_top_page: "Número de melhores tópicos mostrados no 'Exibir Mais' melhores tópicos quando expandido." redirect_users_to_top_page: "Automaticamente redirecionar usuários novos e há muito ausentes para a página melhores." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 415b548b5d..c3b75bbc73 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -767,7 +767,6 @@ ru: suppress_reply_directly_above: "Не показывать разворачивемый блок \"в ответ на\" для сообщения, если есть всего лишь одно сообщение непосредственно выше." suppress_reply_when_quoting: "Не показывать разворачивемый блок \"в ответ на\", если сообщение уже содержит цитату." max_reply_history: "Максимальное число разворачивающихся ответов в блоке \"в ответ на\"" - experimental_reply_expansion: "Скрыть промежуточные ответы, когда раскрывается все ответы (эксперементальная функция)" topics_per_period_in_top_summary: "Количество рекомендованных тем, отображаемых внизу текущей темы." topics_per_period_in_top_page: "Количество рекомендованных тем, отображаемых при нажатии 'Показать больше' в низу текущей темы." redirect_users_to_top_page: "Автоматически перенаправлять новых и давно отсутствующих пользователей к началу страницы." diff --git a/config/locales/server.sq.yml b/config/locales/server.sq.yml index 63eb1ece99..a2c0e78469 100644 --- a/config/locales/server.sq.yml +++ b/config/locales/server.sq.yml @@ -698,7 +698,6 @@ sq: suppress_reply_directly_above: "Don't show the expandable in-reply-to on a post when there is only a single reply directly above this post." suppress_reply_when_quoting: "Don't show the expandable in-reply-to on a post when post quotes reply." max_reply_history: "Maximum number of replies to expand when expanding in-reply-to" - experimental_reply_expansion: "Hide intermediate replies when expanding a reply to (experimental)" topics_per_period_in_top_summary: "Number of top topics shown in the default top topics summary." topics_per_period_in_top_page: "Number of top topics shown on the expanded 'Show More' top topics." redirect_users_to_top_page: "Automatically redirect new and long absent users to the top page." diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index c56bf44e29..0f044e9a0c 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -713,7 +713,6 @@ tr_TR: suppress_reply_directly_above: "Bu gönderinin direk üstünde sadece tek bir cevap varsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." suppress_reply_when_quoting: "Gönderi cevabı alıntılarsa, gönderideki açılabilir hangi-cevaba-istinaden-cevapla bölümünü gösterme." max_reply_history: "Hangi-cevaba-istinaden-cevapla bölümü açılınca gösterilecek en fazla cevap sayısı" - experimental_reply_expansion: "Hangi-cevaba-istinaden-cevapla bölümü açılınca ara cevapları gizle (deneysel)" topics_per_period_in_top_summary: "Popüler konular özetinde gösterilen popüler konu sayısı." topics_per_period_in_top_page: "'Daha Fazla Göster' ile genişletilen popüler konular bölümünde gösterilecek popüler konu sayısı. " redirect_users_to_top_page: "Yeni ve uzun süredir giriş yapmamış kullanıcıları otomatik olarak Popüler sayfasına yönlendir." diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index eda4df6eb0..d6be75f4a6 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -736,7 +736,6 @@ zh_CN: suppress_reply_directly_above: "当一个帖子只有一个回复时,不显示回复到该贴的回复。" suppress_reply_when_quoting: "当帖子引用回复时,不显示可展开的回复到某贴的标记。" max_reply_history: "扩展回复至时显示的最大回复数量" - experimental_reply_expansion: "当展开回复至内容时隐藏直接回复(实验性)" topics_per_period_in_top_summary: "在一个主题底部显示的默认推荐主题的数量。" topics_per_period_in_top_page: "在展开“显示更多”推荐主题列表显示的主题数量。" redirect_users_to_top_page: "自动重定向至新用户或者长时间未登入的用户至热门页面。" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 04ee6a797f..2a93ce0121 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -588,7 +588,6 @@ zh_TW: suppress_reply_directly_above: "當帖子只有一個回覆時,不顯示回覆到該帖的回覆。" suppress_reply_when_quoting: "當帖子引用回覆時,不顯示可展開的回覆到某帖的標記。" max_reply_history: "擴展回覆到某帖時顯示的最大回覆數量" - experimental_reply_expansion: "當展開回覆到某帖時隱藏直接回覆(實驗性)" topics_per_period_in_top_summary: "預設推薦話題的顯示數量" topics_per_period_in_top_page: "在展開 \"顯示更多\" 推薦話題列表的顯示數量" redirect_users_to_top_page: "將新用戶或長時間未使用的用戶自動重新導向至熱門頁面" diff --git a/config/site_settings.yml b/config/site_settings.yml index 6937a8de35..b95667162a 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -430,9 +430,6 @@ posting: max_reply_history: default: 1 client: true - experimental_reply_expansion: - default: false - client: true post_undo_action_window_mins: 10 max_mentions_per_post: 10 max_users_notified_per_group_mention: 100 diff --git a/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb b/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb index 169985693c..d54524fe68 100644 --- a/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb +++ b/lib/es6_module_transpiler/tilt/es6_module_transpiler_template.rb @@ -143,7 +143,7 @@ module Tilt def generate_source(scope) js_source = ::JSON.generate(data, quirks_mode: true) - js_source = "babel.transform(#{js_source}, {ast: false, whitelist: ['es6.constants', 'es6.properties.shorthand', 'es6.arrowFunctions', 'es6.blockScoping', 'es6.destructuring', 'es6.spread', 'es6.parameters', 'es6.templateLiterals', 'es6.regex.unicode', 'es7.decorators']})['code']" + js_source = "babel.transform(#{js_source}, {ast: false, whitelist: ['es6.constants', 'es6.properties.shorthand', 'es6.arrowFunctions', 'es6.blockScoping', 'es6.destructuring', 'es6.spread', 'es6.parameters', 'es6.templateLiterals', 'es6.regex.unicode', 'es7.decorators', 'es6.classes']})['code']" "new module.exports.Compiler(#{js_source}, '#{module_name(scope.root_path, scope.logical_path)}', #{compiler_options}).#{compiler_method}()" end diff --git a/test/javascripts/acceptance/composer-test.js.es6 b/test/javascripts/acceptance/composer-test.js.es6 index e8d8e8dbf5..38789579c1 100644 --- a/test/javascripts/acceptance/composer-test.js.es6 +++ b/test/javascripts/acceptance/composer-test.js.es6 @@ -192,8 +192,8 @@ test("Edit the first post", () => { ok(!exists('.topic-post:eq(0) .post-info.edits'), 'it has no edits icon at first'); - click('.topic-post:eq(0) button[data-action=showMoreActions]'); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.show-more-actions'); + click('.topic-post:eq(0) button.edit'); andThen(() => { equal(find('.d-editor-input').val().indexOf('Any plans to support'), 0, 'it populates the input with the post text'); }); @@ -212,11 +212,11 @@ test("Edit the first post", () => { test("Composer can switch between edits", () => { visit("/t/this-is-a-test-topic/9"); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); andThen(() => { equal(find('.d-editor-input').val().indexOf('This is the first post.'), 0, 'it populates the input with the post text'); }); - click('.topic-post:eq(1) button[data-action=edit]'); + click('.topic-post:eq(1) button.edit'); andThen(() => { equal(find('.d-editor-input').val().indexOf('This is the second post.'), 0, 'it populates the input with the post text'); }); @@ -225,9 +225,9 @@ test("Composer can switch between edits", () => { test("Composer with dirty edit can toggle to another edit", () => { visit("/t/this-is-a-test-topic/9"); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); fillIn('.d-editor-input', 'This is a dirty reply'); - click('.topic-post:eq(1) button[data-action=edit]'); + click('.topic-post:eq(1) button.edit'); andThen(() => { ok(exists('.bootbox.modal'), 'it pops up a confirmation dialog'); }); @@ -240,15 +240,15 @@ test("Composer with dirty edit can toggle to another edit", () => { test("Composer can toggle between edit and reply", () => { visit("/t/this-is-a-test-topic/9"); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); andThen(() => { equal(find('.d-editor-input').val().indexOf('This is the first post.'), 0, 'it populates the input with the post text'); }); - click('.topic-post:eq(0) button[data-action=reply]'); + click('.topic-post:eq(0) button.reply'); andThen(() => { equal(find('.d-editor-input').val(), "", 'it clears the input'); }); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); andThen(() => { equal(find('.d-editor-input').val().indexOf('This is the first post.'), 0, 'it populates the input with the post text'); }); @@ -257,9 +257,9 @@ test("Composer can toggle between edit and reply", () => { test("Composer with dirty reply can toggle to edit", () => { visit("/t/this-is-a-test-topic/9"); - click('.topic-post:eq(0) button[data-action=reply]'); + click('.topic-post:eq(0) button.reply'); fillIn('.d-editor-input', 'This is a dirty reply'); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); andThen(() => { ok(exists('.bootbox.modal'), 'it pops up a confirmation dialog'); }); @@ -272,10 +272,10 @@ test("Composer with dirty reply can toggle to edit", () => { test("Composer draft with dirty reply can toggle to edit", () => { visit("/t/this-is-a-test-topic/9"); - click('.topic-post:eq(0) button[data-action=reply]'); + click('.topic-post:eq(0) button.reply'); fillIn('.d-editor-input', 'This is a dirty reply'); click('.toggler'); - click('.topic-post:eq(0) button[data-action=edit]'); + click('.topic-post:eq(0) button.edit'); andThen(() => { ok(exists('.bootbox.modal'), 'it pops up a confirmation dialog'); }); diff --git a/test/javascripts/components/post-menu-test.js.es6 b/test/javascripts/components/post-menu-test.js.es6 deleted file mode 100644 index a027bb660f..0000000000 --- a/test/javascripts/components/post-menu-test.js.es6 +++ /dev/null @@ -1,52 +0,0 @@ -import componentTest from 'helpers/component-test'; - -moduleForComponent('post-menu', {integration: true}); - -function setup(store) { - const topic = store.createRecord('topic', {id: 123}); - const post = store.createRecord('post', { - id: 1, - post_number: 1, - topic, - like_count: 3, - actions_summary: [ - {id: 2, count: 3, hidden: false, can_act: true} - ] - }); - - this.on('toggleLike', function() { - post.toggleProperty('likeAction.acted'); - }); - - this.set('post', post); -} - -componentTest('basic render', { - template: '{{post-menu post=post}}', - setup, - test(assert) { - assert.ok(!!this.$('.post-menu-area').length, 'it renders a post menu'); - assert.ok(!!this.$('.actions button[data-share-url]').length, 'it renders a share button'); - } -}); - -componentTest('liking', { - template: '{{post-menu post=post toggleLike="toggleLike"}}', - setup, - test(assert) { - assert.ok(!!this.$('.actions button.like').length); - assert.ok(!!this.$('.actions button.like-count').length); - - click('.actions button.like'); - andThen(() => { - assert.ok(!this.$('.actions button.like').length); - assert.ok(!!this.$('.actions button.has-like').length); - }); - - click('.actions button.has-like'); - andThen(() => { - assert.ok(!!this.$('.actions button.like').length); - assert.ok(!this.$('.actions button.has-like').length); - }); - } -}); diff --git a/test/javascripts/controllers/topic-test.js.es6 b/test/javascripts/controllers/topic-test.js.es6 index 13fdc144eb..48f0bcdbd0 100644 --- a/test/javascripts/controllers/topic-test.js.es6 +++ b/test/javascripts/controllers/topic-test.js.es6 @@ -6,6 +6,7 @@ moduleFor('controller:topic', 'controller:topic', { }); import Topic from 'discourse/models/topic'; +import AppEvents from 'discourse/lib/app-events'; var buildTopic = function() { return Topic.create({ @@ -62,7 +63,7 @@ test("toggledSelectedPost", function() { }); test("selectAll", function() { - var tc = this.subject({model: buildTopic()}), + var tc = this.subject({model: buildTopic(), appEvents: AppEvents.create()}), post = Discourse.Post.create({id: 123, post_number: 2}), postStream = tc.get('model.postStream'); diff --git a/test/javascripts/fixtures/site-fixtures.js.es6 b/test/javascripts/fixtures/site-fixtures.js.es6 index 9e29ee832f..81ce4b8697 100644 --- a/test/javascripts/fixtures/site-fixtures.js.es6 +++ b/test/javascripts/fixtures/site-fixtures.js.es6 @@ -19,7 +19,8 @@ export default { "post_types":{ "regular":1, "moderator_action":2, - "small_action":3 + "small_action":3, + "whisper":4 }, "group_names":[ "admins", diff --git a/test/javascripts/helpers/component-test.js.es6 b/test/javascripts/helpers/component-test.js.es6 index 3ff28d3c94..cda11724be 100644 --- a/test/javascripts/helpers/component-test.js.es6 +++ b/test/javascripts/helpers/component-test.js.es6 @@ -6,21 +6,27 @@ export default function(name, opts) { opts = opts || {}; test(name, function(assert) { - if (opts.setup) { - const store = createStore(); - opts.setup.call(this, store); - } const appEvents = AppEvents.create(); - - loadAllHelpers(); - this.container.register('site-settings:main', Discourse.SiteSettings, { instantiate: false }); this.container.register('app-events:main', appEvents, { instantiate: false }); this.container.register('capabilities:main', Ember.Object); + this.container.register('site:main', Discourse.Site.current(), { instantiate: false }); this.container.injection('component', 'siteSettings', 'site-settings:main'); this.container.injection('component', 'appEvents', 'app-events:main'); this.container.injection('component', 'capabilities', 'capabilities:main'); + this.siteSettings = Discourse.SiteSettings; + + loadAllHelpers(); + + if (opts.setup) { + const store = createStore(); + this.currentUser = Discourse.User.create(); + this.container.register('store:main', store, { instantiate: false }); + this.container.register('current-user:main', this.currentUser, { instantiate: false }); + opts.setup.call(this, store); + } + andThen(() => this.render(opts.template)); andThen(() => opts.test.call(this, assert)); }); diff --git a/test/javascripts/helpers/create-pretender.js.es6 b/test/javascripts/helpers/create-pretender.js.es6 index fca63e935b..0aaad1ff90 100644 --- a/test/javascripts/helpers/create-pretender.js.es6 +++ b/test/javascripts/helpers/create-pretender.js.es6 @@ -85,7 +85,23 @@ export default function() { this.get('/users/:username/staff-info.json', () => response({})); - this.put('/categories/:category_id', function(request) { + this.get('/post_action_users', () => { + return response({ + post_action_users: [ + {id: 1, username: 'eviltrout', avatar_template: '/user_avatar/default/eviltrout/{size}/1.png', username_lower: 'eviltrout' } + ] + }); + }); + + this.get('/post_replies', () => { + return response({ post_replies: [{ id: 1234, cooked: 'wat' }] }); + }); + + this.get('/post_reply_histories', () => { + return response({ post_reply_histories: [{ id: 1234, cooked: 'wat' }] }); + }); + + this.put('/categories/:category_id', request => { const category = parsePostData(request.requestBody); return response({category}); }); @@ -132,6 +148,7 @@ export default function() { this.delete('/posts/:post_id', success); this.put('/posts/:post_id/recover', success); + this.get('/posts/:post_id/expand-embed', success); this.put('/posts/:post_id', request => { const data = parsePostData(request.requestBody); diff --git a/test/javascripts/helpers/qunit-helpers.js.es6 b/test/javascripts/helpers/qunit-helpers.js.es6 index 44812f7ec6..c690585661 100644 --- a/test/javascripts/helpers/qunit-helpers.js.es6 +++ b/test/javascripts/helpers/qunit-helpers.js.es6 @@ -41,7 +41,6 @@ function acceptance(name, options) { Discourse.Utilities.avatarImg = () => ""; // For now don't do scrolling stuff in Test Mode - Ember.CloakedCollectionView.scrolled = Ember.K; HeaderView.reopen({examineDockHeader: Ember.K}); var siteJson = siteFixtures['site.json'].site; diff --git a/test/javascripts/helpers/widget-test.js.es6 b/test/javascripts/helpers/widget-test.js.es6 new file mode 100644 index 0000000000..d30170ff1d --- /dev/null +++ b/test/javascripts/helpers/widget-test.js.es6 @@ -0,0 +1,9 @@ +import componentTest from 'helpers/component-test'; + +export function moduleForWidget(name) { + moduleForComponent(name, `widget:${name}`, { integration: true }); +} + +export function widgetTest(name, opts) { + return componentTest(name, opts); +} diff --git a/test/javascripts/models/post-stream-test.js.es6 b/test/javascripts/models/post-stream-test.js.es6 index 41098560ad..0b9a7d3dfa 100644 --- a/test/javascripts/models/post-stream-test.js.es6 +++ b/test/javascripts/models/post-stream-test.js.es6 @@ -27,40 +27,6 @@ test('defaults', function() { present(postStream.get('topic')); }); -test('daysSincePrevious when appending', function(assert) { - const postStream = buildStream(10000001, [1,2,3]); - const store = postStream.store; - - const p1 = store.createRecord('post', {id: 1, post_number: 1, created_at: "2015-05-29T18:17:35.868Z"}), - p2 = store.createRecord('post', {id: 2, post_number: 2, created_at: "2015-06-01T01:07:25.761Z"}), - p3 = store.createRecord('post', {id: 3, post_number: 3, created_at: "2015-06-02T01:07:25.761Z"}); - - postStream.appendPost(p1); - postStream.appendPost(p2); - postStream.appendPost(p3); - - assert.ok(!p1.get('daysSincePrevious')); - assert.equal(p2.get('daysSincePrevious'), 2); - assert.equal(p3.get('daysSincePrevious'), 1); -}); - -test('daysSincePrevious when prepending', function(assert) { - const postStream = buildStream(10000001, [1,2,3]); - const store = postStream.store; - - const p1 = store.createRecord('post', {id: 1, post_number: 1, created_at: "2015-05-29T18:17:35.868Z"}), - p2 = store.createRecord('post', {id: 2, post_number: 2, created_at: "2015-06-01T01:07:25.761Z"}), - p3 = store.createRecord('post', {id: 3, post_number: 3, created_at: "2015-06-02T01:07:25.761Z"}); - - postStream.prependPost(p3); - postStream.prependPost(p2); - postStream.prependPost(p1); - - assert.ok(!p1.get('daysSincePrevious')); - assert.equal(p2.get('daysSincePrevious'), 2); - assert.equal(p3.get('daysSincePrevious'), 1); -}); - test('appending posts', function() { const postStream = buildStream(4567, [1, 3, 4]); const store = postStream.store; @@ -320,17 +286,6 @@ test("loadIntoIdentityMap with post ids", function() { }); }); -test("loading a post's history", function() { - const postStream = buildStream(1234); - const store = postStream.store; - const post = store.createRecord('post', {id: 4321}); - - postStream.findReplyHistory(post).then(function() { - present(postStream.findLoadedPost(2222), "it stores the returned post in the identity map"); - present(post.get('replyHistory'), "it sets the replyHistory attribute for the post"); - }); -}); - test("staging and undoing a new post", function() { const postStream = buildStream(10101, [1]); const store = postStream.store; diff --git a/test/javascripts/models/post-test.js.es6 b/test/javascripts/models/post-test.js.es6 index 7736577500..1f881df120 100644 --- a/test/javascripts/models/post-test.js.es6 +++ b/test/javascripts/models/post-test.js.es6 @@ -14,7 +14,6 @@ test('defaults', function() { var post = Discourse.Post.create({id: 1}); blank(post.get('deleted_at'), "it has no deleted_at by default"); blank(post.get('deleted_by'), "there is no deleted_by by default"); - equal(post.get('replyHistory.length'), 0, "there is no reply history by default"); }); test('new_user', function() { @@ -47,16 +46,6 @@ test('updateFromPost', function() { equal(post.get('raw'), "different raw", "raw field updated"); }); -test('hasHistory', function() { - var post = Discourse.Post.create({id: 1}); - ok(!post.get('hasHistory'), 'posts without versions have no history'); - post.set('version', 1); - ok(!post.get('hasHistory'), 'posts with one version have no history'); - post.set('version', 2); - ok(post.get('hasHistory'), 'posts with more than one version have a history'); -}); - - test('destroy by staff', function() { var user = Discourse.User.create({username: 'staff', staff: true}), post = buildPost({user: user}); diff --git a/test/javascripts/test_helper.js b/test/javascripts/test_helper.js index 08f9256f6f..d8ca4fe860 100644 --- a/test/javascripts/test_helper.js +++ b/test/javascripts/test_helper.js @@ -111,9 +111,6 @@ QUnit.testStart(function(ctx) { } }); -// Don't cloak in testing -Ember.CloakedCollectionView = Ember.CollectionView; - QUnit.testDone(function() { Ember.run.debounce = origDebounce; window.sandbox.restore(); diff --git a/test/javascripts/widgets/actions-summary-test.js.es6 b/test/javascripts/widgets/actions-summary-test.js.es6 new file mode 100644 index 0000000000..17cb172c60 --- /dev/null +++ b/test/javascripts/widgets/actions-summary-test.js.es6 @@ -0,0 +1,80 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; + +moduleForWidget('actions-summary'); + +widgetTest('listing actions', { + template: '{{mount-widget widget="actions-summary" args=args}}', + setup() { + this.set('args', { + actionsSummary: [ + {action: 'off_topic', description: 'very off topic'}, + {action: 'spam', description: 'suspicious message'} + ] + }); + }, + test(assert) { + assert.equal(this.$('.post-actions .post-action').length, 2); + + click('.post-action:eq(0) .action-link a'); + andThen(() => { + assert.equal(this.$('.post-action:eq(0) img.avatar').length, 1, 'clicking it shows the user'); + }); + } +}); + +widgetTest('undo', { + template: '{{mount-widget widget="actions-summary" args=args undoPostAction="undoPostAction"}}', + setup() { + this.set('args', { + actionsSummary: [ + {action: 'off_topic', description: 'very off topic', canUndo: true}, + ] + }); + + this.on('undoPostAction', () => this.undid = true); + }, + test(assert) { + assert.equal(this.$('.post-actions .post-action').length, 1); + + click('.action-link.undo'); + andThen(() => { + assert.ok(this.undid, 'it triggered the action'); + }); + } +}); + +widgetTest('deferFlags', { + template: '{{mount-widget widget="actions-summary" args=args deferPostActionFlags="deferPostActionFlags"}}', + setup() { + this.set('args', { + actionsSummary: [ + {action: 'off_topic', description: 'very off topic', canDeferFlags: true, count: 1}, + ] + }); + + this.on('deferPostActionFlags', () => this.deferred = true); + }, + test(assert) { + assert.equal(this.$('.post-actions .post-action').length, 1); + + click('.action-link.defer-flags'); + andThen(() => { + assert.ok(this.deferred, 'it triggered the action'); + }); + } +}); + +widgetTest('post deleted', { + template: '{{mount-widget widget="actions-summary" args=args}}', + setup() { + this.set('args', { + isDeleted: true, + deletedByUsername: 'eviltrout', + deletedByAvatarTemplate: '/images/avatar.png' + }); + }, + test(assert) { + assert.ok(this.$('.post-action .fa-trash-o').length === 1, 'it has the deleted icon'); + assert.ok(this.$('.avatar[title=eviltrout]').length === 1, 'it has the deleted by avatar'); + } +}); diff --git a/test/javascripts/widgets/post-gutter-test.js.es6 b/test/javascripts/widgets/post-gutter-test.js.es6 new file mode 100644 index 0000000000..55c4152cb2 --- /dev/null +++ b/test/javascripts/widgets/post-gutter-test.js.es6 @@ -0,0 +1,54 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; + +moduleForWidget('post-gutter'); + +widgetTest("duplicate links", { + template: '{{mount-widget widget="post-gutter" args=args}}', + setup() { + this.set('args', { + links: [ + { title: "Evil Trout Link", url: "http://eviltrout.com" }, + { title: "Evil Trout Link", url: "http://dupe.eviltrout.com" } + ] + }); + }, + test(assert) { + assert.equal(this.$('.post-links a.track-link').length, 1, 'it hides the dupe link'); + } +}); + +widgetTest("collapsed links", { + template: '{{mount-widget widget="post-gutter" args=args}}', + setup() { + this.set('args', { + links: [ + { title: "Link 1", url: "http://eviltrout.com?1" }, + { title: "Link 2", url: "http://eviltrout.com?2" }, + { title: "Link 3", url: "http://eviltrout.com?3" }, + { title: "Link 4", url: "http://eviltrout.com?4" }, + { title: "Link 5", url: "http://eviltrout.com?5" }, + { title: "Link 6", url: "http://eviltrout.com?6" }, + { title: "Link 7", url: "http://eviltrout.com?7" }, + ] + }); + }, + test(assert) { + assert.equal(this.$('.post-links a.track-link').length, 5, 'collapses by default'); + click('a.toggle-more'); + andThen(() => { + assert.equal(this.$('.post-links a.track-link').length, 7); + }); + } +}); + +widgetTest("reply as new topic", { + template: '{{mount-widget widget="post-gutter" args=args newTopicAction="newTopicAction"}}', + setup() { + this.set('args', { canReplyAsNewTopic: true }); + this.on('newTopicAction', () => this.newTopicTriggered = true); + }, + test(assert) { + click('a.reply-new'); + andThen(() => assert.ok(this.newTopicTriggered)); + } +}); diff --git a/test/javascripts/widgets/post-stream-test.js.es6 b/test/javascripts/widgets/post-stream-test.js.es6 new file mode 100644 index 0000000000..62966d7b07 --- /dev/null +++ b/test/javascripts/widgets/post-stream-test.js.es6 @@ -0,0 +1,66 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; +import Topic from 'discourse/models/topic'; +import Post from 'discourse/models/post'; + +moduleForWidget('post-stream'); + +function postStreamTest(name, attrs) { + widgetTest(name, { + template: `{{mount-widget widget="post-stream" args=(as-hash posts=posts)}}`, + setup() { + this.set('posts', attrs.posts.call(this)); + }, + test: attrs.test + }); +} + +postStreamTest('basics', { + posts() { + const site = this.container.lookup('site:main'); + const topic = Topic.create({ details: { created_by: { id: 123 } } }); + return [ + Post.create({ topic, id: 1, post_number: 1, user_id: 123, primary_group_name: 'trout', + avatar_template: '/images/avatar.png' }), + Post.create({ topic, id: 2, post_number: 2, post_type: site.get('post_types.moderator_action') }), + Post.create({ topic, id: 3, post_number: 3, hidden: true }), + Post.create({ topic, id: 4, post_number: 4, post_type: site.get('post_types.whisper') }), + Post.create({ topic, id: 5, post_number: 5, wiki: true, via_email: true }) + ]; + }, + + test(assert) { + assert.equal(this.$('.post-stream').length, 1); + assert.equal(this.$('.topic-post').length, 5, 'renders all posts'); + + // look for special class bindings + assert.equal(this.$('.topic-post:eq(0).topic-owner').length, 1, 'it applies the topic owner class'); + assert.equal(this.$('.topic-post:eq(0).group-trout').length, 1, 'it applies the primary group class'); + assert.equal(this.$('.topic-post:eq(0).regular').length, 1, 'it applies the regular class'); + assert.equal(this.$('.topic-post:eq(1).moderator').length, 1, 'it applies the moderator class'); + assert.equal(this.$('.topic-post:eq(2).post-hidden').length, 1, 'it applies the hidden class'); + assert.equal(this.$('.topic-post:eq(3).whisper').length, 1, 'it applies the whisper class'); + assert.equal(this.$('.topic-post:eq(4).wiki').length, 1, 'it applies the wiki class'); + + // it renders an article for the body with appropriate attributes + assert.equal(this.$('article#post_2').length, 1); + assert.equal(this.$('article[data-user-id=123]').length, 1); + assert.equal(this.$('article[data-post-id=3]').length, 1); + assert.equal(this.$('article#post_5.via-email').length, 1); + + assert.equal(this.$('article:eq(0) .main-avatar').length, 1, 'renders the main avatar'); + } +}); + +postStreamTest('deleted posts', { + posts() { + const topic = Topic.create({ details: { created_by: { id: 123 } } }); + return [ + Post.create({ topic, id: 1, post_number: 1, deleted_at: new Date().getTime() }), + ]; + }, + + test(assert) { + assert.equal(this.$('.topic-post.deleted').length, 1, 'it applies the deleted class'); + assert.equal(this.$('.deleted-user-avatar').length, 1, 'it has the trash avatar'); + } +}); diff --git a/test/javascripts/widgets/post-test.js.es6 b/test/javascripts/widgets/post-test.js.es6 new file mode 100644 index 0000000000..5c853c0dd6 --- /dev/null +++ b/test/javascripts/widgets/post-test.js.es6 @@ -0,0 +1,784 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; + +moduleForWidget('post'); + +widgetTest('basic elements', { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { shareUrl: '/example', post_number: 1 }); + }, + test(assert) { + assert.ok(this.$('.names').length, 'includes poster name'); + + assert.ok(this.$('a.post-date').length, 'includes post date'); + assert.ok(this.$('a.post-date[data-share-url]').length); + assert.ok(this.$('a.post-date[data-post-number]').length); + } +}); + +widgetTest('wiki', { + template: '{{mount-widget widget="post" args=args editPost="editPost"}}', + setup() { + this.set('args', { wiki: true }); + this.on('editPost', () => this.editPostCalled = true); + }, + test(assert) { + click('.post-info.wiki'); + andThen(() => { + assert.ok(this.editPostCalled, 'clicking the wiki icon edits the post'); + }); + } +}); + +widgetTest('via-email', { + template: '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', + setup() { + this.set('args', { via_email: true, canViewRawEmail: true }); + this.on('showRawEmail', () => this.rawEmailShown = true); + }, + test(assert) { + click('.post-info.via-email'); + andThen(() => { + assert.ok(this.rawEmailShown, 'clicking the enveloppe shows the raw email'); + }); + } +}); + +widgetTest('via-email without permission', { + template: '{{mount-widget widget="post" args=args showRawEmail="showRawEmail"}}', + setup() { + this.set('args', { via_email: true, canViewRawEmail: false }); + this.on('showRawEmail', () => this.rawEmailShown = true); + }, + test(assert) { + click('.post-info.via-email'); + andThen(() => { + assert.ok(!this.rawEmailShown, `clicking the enveloppe doesn't show the raw email`); + }); + } +}); + +widgetTest('history', { + template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', + setup() { + this.set('args', { version: 3, canViewEditHistory: true }); + this.on('showHistory', () => this.historyShown = true); + }, + test(assert) { + click('.post-info.edits'); + andThen(() => { + assert.ok(this.historyShown, 'clicking the pencil shows the history'); + }); + } +}); + +widgetTest('history without view permission', { + template: '{{mount-widget widget="post" args=args showHistory="showHistory"}}', + setup() { + this.set('args', { version: 3, canViewEditHistory: false }); + this.on('showHistory', () => this.historyShown = true); + }, + test(assert) { + click('.post-info.edits'); + andThen(() => { + assert.ok(!this.historyShown, `clicking the pencil doesn't show the history`); + }); + } +}); + +widgetTest('whisper', { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { isWhisper: true }); + }, + test(assert) { + assert.ok(this.$('.topic-post.whisper').length === 1); + assert.ok(this.$('.post-info.whisper').length === 1); + } +}); + +widgetTest('like count button', { + template: '{{mount-widget widget="post" model=post args=args}}', + setup(store) { + const topic = store.createRecord('topic', {id: 123}); + const post = store.createRecord('post', { + id: 1, + post_number: 1, + topic, + like_count: 3, + actions_summary: [ {id: 2, count: 1, hidden: false, can_act: true} ] + }); + this.set('post', post); + this.set('args', { likeCount: 1 }); + }, + test(assert) { + assert.ok(this.$('button.like-count').length === 1); + assert.ok(this.$('.who-liked').length === 0); + + // toggle it on + click('button.like-count'); + andThen(() => { + assert.ok(this.$('.who-liked').length === 1); + assert.ok(this.$('.who-liked a.trigger-user-card').length === 1); + }); + + // toggle it off + click('button.like-count'); + andThen(() => { + assert.ok(this.$('.who-liked').length === 0); + assert.ok(this.$('.who-liked a.trigger-user-card').length === 0); + }); + } +}); + +widgetTest(`like count with no likes`, { + template: '{{mount-widget widget="post" model=post args=args}}', + setup() { + this.set('args', { likeCount: 0 }); + }, + test(assert) { + assert.ok(this.$('button.like-count').length === 0); + } +}); + +widgetTest('share button', { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { shareUrl: 'http://share-me.example.com' }); + }, + test(assert) { + assert.ok(!!this.$('.actions button[data-share-url]').length, 'it renders a share button'); + } +}); + +widgetTest('liking', { + template: '{{mount-widget widget="post-menu" args=args toggleLike="toggleLike"}}', + setup() { + const args = { showLike: true, canToggleLike: true }; + this.set('args', args); + this.on('toggleLike', () => { + args.liked = !args.liked; + args.likeCount = args.liked ? 1 : 0; + }); + }, + test(assert) { + assert.ok(!!this.$('.actions button.like').length); + assert.ok(this.$('.actions button.like-count').length === 0); + + click('.actions button.like'); + andThen(() => { + assert.ok(!this.$('.actions button.like').length); + assert.ok(!!this.$('.actions button.has-like').length); + assert.ok(this.$('.actions button.like-count').length === 1); + }); + + click('.actions button.has-like'); + andThen(() => { + assert.ok(!!this.$('.actions button.like').length); + assert.ok(!this.$('.actions button.has-like').length); + assert.ok(this.$('.actions button.like-count').length === 0); + }); + } +}); + +widgetTest('edit button', { + template: '{{mount-widget widget="post" args=args editPost="editPost"}}', + setup() { + this.set('args', { canEdit: true }); + this.on('editPost', () => this.editPostCalled = true); + }, + test(assert) { + click('button.edit'); + andThen(() => { + assert.ok(this.editPostCalled, 'it triggered the edit action'); + }); + } +}); + +widgetTest(`edit button - can't edit`, { + template: '{{mount-widget widget="post" args=args editPost="editPost"}}', + setup() { + this.set('args', { canEdit: false }); + }, + test(assert) { + assert.equal(this.$('button.edit').length, 0, `button is not displayed`); + } +}); + +widgetTest('recover button', { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canDelete: true }); + this.on('deletePost', () => this.deletePostCalled = true); + }, + test(assert) { + click('button.delete'); + andThen(() => { + assert.ok(this.deletePostCalled, 'it triggered the delete action'); + }); + } +}); + +widgetTest('delete topic button', { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canDeleteTopic: true }); + this.on('deletePost', () => this.deletePostCalled = true); + }, + test(assert) { + click('button.delete'); + andThen(() => { + assert.ok(this.deletePostCalled, 'it triggered the delete action'); + }); + } +}); + +widgetTest(`delete topic button - can't delete`, { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canDeleteTopic: false }); + }, + test(assert) { + assert.equal(this.$('button.delete').length, 0, `button is not displayed`); + } +}); + +widgetTest('recover topic button', { + template: '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', + setup() { + this.set('args', { canRecoverTopic: true }); + this.on('recoverPost', () => this.recovered = true); + }, + test(assert) { + click('button.recover'); + andThen(() => assert.ok(this.recovered)); + } +}); + +widgetTest(`recover topic button - can't recover`, { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canRecoverTopic: false }); + }, + test(assert) { + assert.equal(this.$('button.recover').length, 0, `button is not displayed`); + } +}); + +widgetTest('delete post button', { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canDelete: true }); + this.on('deletePost', () => this.deletePostCalled = true); + }, + test(assert) { + click('button.delete'); + andThen(() => { + assert.ok(this.deletePostCalled, 'it triggered the delete action'); + }); + } +}); + +widgetTest(`delete post button - can't delete`, { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canDelete: false }); + }, + test(assert) { + assert.equal(this.$('button.delete').length, 0, `button is not displayed`); + } +}); + +widgetTest('recover post button', { + template: '{{mount-widget widget="post" args=args recoverPost="recoverPost"}}', + setup() { + this.set('args', { canRecover: true }); + this.on('recoverPost', () => this.recovered = true); + }, + test(assert) { + click('button.recover'); + andThen(() => assert.ok(this.recovered)); + } +}); + +widgetTest(`recover post button - can't recover`, { + template: '{{mount-widget widget="post" args=args deletePost="deletePost"}}', + setup() { + this.set('args', { canRecover: false }); + }, + test(assert) { + assert.equal(this.$('button.recover').length, 0, `button is not displayed`); + } +}); + +widgetTest(`flagging`, { + template: '{{mount-widget widget="post" args=args showFlags="showFlags"}}', + setup() { + this.set('args', { canFlag: true }); + this.on('showFlags', () => this.flagsShown = true); + }, + test(assert) { + assert.ok(this.$('button.create-flag').length === 1); + + click('button.create-flag'); + andThen(() => { + assert.ok(this.flagsShown, 'it triggered the action'); + }); + } +}); + +widgetTest(`flagging: can't flag`, { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canFlag: false }); + }, + test(assert) { + assert.ok(this.$('button.create-flag').length === 0); + } +}); + +widgetTest(`read indicator`, { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { read: true }); + }, + test(assert) { + assert.ok(this.$('.read-state.read').length); + } +}); + +widgetTest(`unread indicator`, { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { read: false }); + }, + test(assert) { + assert.ok(this.$('.read-state').length); + } +}); + +widgetTest("reply directly above (supressed)", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + replyToUsername: 'eviltrout', + replyToAvatarTemplate: '/images/avatar.png', + replyDirectlyAbove: true + }); + }, + test(assert) { + assert.equal(this.$('a.reply-to-tab').length, 0, 'hides the tab'); + assert.equal(this.$('.avoid-tab').length, 0, "doesn't have the avoid tab class"); + } +}); + +widgetTest("reply a few posts above (supressed)", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + replyToUsername: 'eviltrout', + replyToAvatarTemplate: '/images/avatar.png', + replyDirectlyAbove: false + }); + }, + test(assert) { + assert.ok(this.$('a.reply-to-tab').length, 'shows the tab'); + assert.equal(this.$('.avoid-tab').length, 1, "has the avoid tab class"); + } +}); + +widgetTest("reply directly above", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + replyToUsername: 'eviltrout', + replyToAvatarTemplate: '/images/avatar.png', + replyDirectlyAbove: true + }); + this.siteSettings.suppress_reply_directly_above = false; + }, + test(assert) { + assert.equal(this.$('.avoid-tab').length, 1, "has the avoid tab class"); + click('a.reply-to-tab'); + andThen(() => { + assert.equal(this.$('section.embedded-posts.top .cooked').length, 1); + assert.equal(this.$('section.embedded-posts i.fa-arrow-up').length, 1); + }); + } +}); + +widgetTest("cooked content hidden", { + template: '{{mount-widget widget="post" args=args expandHidden="expandHidden"}}', + setup() { + this.set('args', { cooked_hidden: true }); + this.on('expandHidden', () => this.unhidden = true); + }, + test(assert) { + click('.topic-body .expand-hidden'); + andThen(() => { + assert.ok(this.unhidden, 'triggers the action'); + }); + } +}); + +widgetTest("expand first post", { + template: '{{mount-widget widget="post" model=post args=args}}', + setup(store) { + this.set('args', { expandablePost: true }); + this.set('post', store.createRecord('post', { id: 1234 })); + }, + test(assert) { + click('.topic-body .expand-post'); + andThen(() => { + assert.equal(this.$('.expand-post').length, 0, 'button is gone'); + }); + } +}); + +widgetTest("can't bookmark", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canBookmark: false }); + }, + test(assert) { + assert.equal(this.$('button.bookmark').length, 0); + assert.equal(this.$('button.bookmarked').length, 0); + } +}); + +widgetTest("bookmark", { + template: '{{mount-widget widget="post" args=args toggleBookmark="toggleBookmark"}}', + setup() { + const args = { canBookmark: true }; + + this.set('args', args); + this.on('toggleBookmark', () => args.bookmarked = true); + }, + test(assert) { + assert.equal(this.$('.post-menu-area .bookmark').length, 1); + assert.equal(this.$('button.bookmarked').length, 0); + + click('button.bookmark'); + andThen(() => { + assert.equal(this.$('button.bookmarked').length, 1); + }); + } +}); + +widgetTest("can't show admin menu when you can't manage", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canManage: false }); + }, + test(assert) { + assert.equal(this.$('.post-menu-area .show-post-admin-menu').length, 0); + } +}); + +widgetTest("show admin menu", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canManage: true }); + }, + test(assert) { + assert.equal(this.$('.post-admin-menu').length, 0); + click('.post-menu-area .show-post-admin-menu'); + andThen(() => { + assert.equal(this.$('.post-admin-menu').length, 1, 'it shows the popup'); + }); + click('.post-menu-area'); + andThen(() => { + assert.equal(this.$('.post-admin-menu').length, 0, 'clicking outside clears the popup'); + }); + } +}); + +widgetTest("toggle moderator post", { + template: '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', + setup() { + this.set('args', { canManage: true }); + this.on('togglePostType', () => this.toggled = true); + }, + test(assert) { + click('.post-menu-area .show-post-admin-menu'); + click('.post-admin-menu .toggle-post-type'); + andThen(() => { + assert.ok(this.toggled); + assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); + }); + } +}); +widgetTest("toggle moderator post", { + template: '{{mount-widget widget="post" args=args togglePostType="togglePostType"}}', + setup() { + this.set('args', { canManage: true }); + this.on('togglePostType', () => this.toggled = true); + }, + test(assert) { + click('.post-menu-area .show-post-admin-menu'); + click('.post-admin-menu .toggle-post-type'); + andThen(() => { + assert.ok(this.toggled); + assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); + }); + } +}); + +widgetTest("rebake post", { + template: '{{mount-widget widget="post" args=args rebakePost="rebakePost"}}', + setup() { + this.set('args', { canManage: true }); + this.on('rebakePost', () => this.baked = true); + }, + test(assert) { + click('.post-menu-area .show-post-admin-menu'); + click('.post-admin-menu .rebuild-html'); + andThen(() => { + assert.ok(this.baked); + assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); + }); + } +}); + +widgetTest("unhide post", { + template: '{{mount-widget widget="post" args=args unhidePost="unhidePost"}}', + setup() { + this.set('args', { canManage: true, hidden: true }); + this.on('unhidePost', () => this.unhidden = true); + }, + test(assert) { + click('.post-menu-area .show-post-admin-menu'); + click('.post-admin-menu .unhide-post'); + andThen(() => { + assert.ok(this.unhidden); + assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); + }); + } +}); + +widgetTest("change owner", { + template: '{{mount-widget widget="post" args=args changePostOwner="changePostOwner"}}', + setup() { + this.currentUser.admin = true; + this.set('args', { canManage: true }); + this.on('changePostOwner', () => this.owned = true); + }, + test(assert) { + click('.post-menu-area .show-post-admin-menu'); + click('.post-admin-menu .change-owner'); + andThen(() => { + assert.ok(this.owned); + assert.equal(this.$('.post-admin-menu').length, 0, 'also hides the menu'); + }); + } +}); + +widgetTest("reply", { + template: '{{mount-widget widget="post" args=args replyToPost="replyToPost"}}', + setup() { + this.set('args', { canCreatePost: true }); + this.on('replyToPost', () => this.replied = true); + }, + test(assert) { + click('.post-controls .create'); + andThen(() => { + assert.ok(this.replied); + }); + } +}); + +widgetTest("reply - without permissions", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { canCreatePost: false }); + }, + test(assert) { + assert.equal(this.$('.post-controls .create').length, 0); + } +}); + +widgetTest("replies - no replies", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', {replyCount: 0}); + }, + test(assert) { + assert.equal(this.$('button.show-replies').length, 0); + } +}); + +widgetTest("replies - multiple replies", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.siteSettings.suppress_reply_directly_below = true; + this.set('args', {replyCount: 2, replyDirectlyBelow: true}); + }, + test(assert) { + assert.equal(this.$('button.show-replies').length, 1); + } +}); + +widgetTest("replies - one below, suppressed", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.siteSettings.suppress_reply_directly_below = true; + this.set('args', {replyCount: 1, replyDirectlyBelow: true}); + }, + test(assert) { + assert.equal(this.$('button.show-replies').length, 0); + } +}); + +widgetTest("replies - one below, not suppressed", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.siteSettings.suppress_reply_directly_below = false; + this.set('args', {id: 6654, replyCount: 1, replyDirectlyBelow: true}); + }, + test(assert) { + click('button.show-replies'); + andThen(() => { + assert.equal(this.$('section.embedded-posts.bottom .cooked').length, 1); + assert.equal(this.$('section.embedded-posts i.fa-arrow-down').length, 1); + }); + } +}); + +widgetTest("topic map not shown", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { showTopicMap: false }); + }, + test(assert) { + assert.equal(this.$('.topic-map').length, 0); + } +}); + +widgetTest("topic map - few posts", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + showTopicMap: true, + topicPostsCount: 2, + participants: [ + {username: 'eviltrout'}, + {username: 'codinghorror'}, + ] + }); + }, + test(assert) { + assert.equal(this.$('li.avatars a.poster').length, 0, 'shows no participants when collapsed'); + + click('nav.buttons button'); + andThen(() => { + assert.equal(this.$('.topic-map-expanded a.poster').length, 2, 'shows all when expanded'); + }); + } +}); + +widgetTest("topic map - participants", { + template: '{{mount-widget widget="post" args=args toggleParticipant="toggleParticipant"}}', + setup() { + this.set('args', { + showTopicMap: true, + topicPostsCount: 10, + participants: [ + {username: 'eviltrout'}, + {username: 'codinghorror'}, + {username: 'sam'}, + {username: 'ZogStrIP'}, + ], + userFilters: ['sam', 'codinghorror'] + }); + + this.on('toggleParticipant', () => this.participantToggled = true); + }, + test(assert) { + assert.equal(this.$('li.avatars a.poster').length, 3, 'limits to three participants'); + + click('nav.buttons button'); + andThen(() => { + assert.equal(this.$('li.avatars a.poster').length, 0); + assert.equal(this.$('.topic-map-expanded a.poster').length, 4, 'shows all when expanded'); + assert.equal(this.$('a.poster.toggled').length, 2, 'two are toggled'); + }); + + click('.topic-map-expanded a.poster:eq(0)'); + andThen(() => assert.ok(this.participantToggled)); + } +}); + +widgetTest("topic map - links", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + showTopicMap: true, + topicLinks: [ + {url: 'http://link1.example.com', clicks: 0}, + {url: 'http://link2.example.com', clicks: 0}, + {url: 'http://link3.example.com', clicks: 0}, + {url: 'http://link4.example.com', clicks: 0}, + {url: 'http://link5.example.com', clicks: 0}, + {url: 'http://link6.example.com', clicks: 0}, + ] + }); + }, + test(assert) { + assert.equal(this.$('.topic-map').length, 1); + assert.equal(this.$('.map.map-collapsed').length, 1); + assert.equal(this.$('.topic-map-expanded').length, 0); + + click('nav.buttons button'); + andThen(() => { + assert.equal(this.$('.map.map-collapsed').length, 0); + assert.equal(this.$('.topic-map i.fa-chevron-up').length, 1); + assert.equal(this.$('.topic-map-expanded').length, 1); + assert.equal(this.$('.topic-map-expanded .topic-link').length, 5, 'it limits the links displayed'); + }); + + click('.link-summary a'); + andThen(() => { + assert.equal(this.$('.topic-map-expanded .topic-link').length, 6, 'all links now shown'); + }); + } +}); + +widgetTest("topic map - no summary", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { showTopicMap: true }); + }, + test(assert) { + assert.equal(this.$('.toggle-summary').length, 0); + } +}); + +widgetTest("topic map - has summary", { + template: '{{mount-widget widget="post" args=args toggleSummary="toggleSummary"}}', + setup() { + this.set('args', { showTopicMap: true, hasTopicSummary: true }); + this.on('toggleSummary', () => this.summaryToggled = true); + }, + test(assert) { + assert.equal(this.$('.toggle-summary').length, 1); + + click('.toggle-summary button'); + andThen(() => assert.ok(this.summaryToggled)); + } +}); + +widgetTest("pm map", { + template: '{{mount-widget widget="post" args=args}}', + setup() { + this.set('args', { + showTopicMap: true, + showPMMap: true, + allowedGroups: [], + allowedUsers: [ Ember.Object.create({ username: 'eviltrout' }) ] + }); + }, + test(assert) { + assert.equal(this.$('.private-message-map').length, 1); + assert.equal(this.$('.private-message-map .user').length, 1); + } +}); diff --git a/test/javascripts/widgets/poster-name-test.js.es6 b/test/javascripts/widgets/poster-name-test.js.es6 new file mode 100644 index 0000000000..5e6782625a --- /dev/null +++ b/test/javascripts/widgets/poster-name-test.js.es6 @@ -0,0 +1,67 @@ +import { moduleForWidget, widgetTest } from 'helpers/widget-test'; + +moduleForWidget('poster-name'); + +widgetTest('basic rendering', { + template: '{{mount-widget widget="poster-name" args=args}}', + setup() { + this.set('args', { + username: 'eviltrout', + usernameUrl: '/users/eviltrout', + name: 'Robin Ward', + user_title: 'Trout Master' }); + }, + test(assert) { + assert.ok(this.$('.names').length); + assert.ok(this.$('span.username').length); + assert.ok(this.$('a[data-auto-route=true]').length); + assert.ok(this.$('a[data-user-card=eviltrout]').length); + assert.equal(this.$('.username a').text(), 'eviltrout'); + assert.equal(this.$('.full-name a').text(), 'Robin Ward'); + assert.equal(this.$('.user-title').text(), 'Trout Master'); + } +}); + +widgetTest('extra classes and glyphs', { + template: '{{mount-widget widget="poster-name" args=args}}', + setup() { + this.set('args', { + username: 'eviltrout', + usernameUrl: '/users/eviltrout', + staff: true, + admin: true, + moderator: true, + new_user: true, + primary_group_name: 'fish' + }); + }, + test(assert) { + assert.ok(this.$('span.staff').length); + assert.ok(this.$('span.admin').length); + assert.ok(this.$('span.moderator').length); + assert.ok(this.$('i.fa-shield').length); + assert.ok(this.$('span.new-user').length); + assert.ok(this.$('span.fish').length); + } +}); + +widgetTest('disable display name on posts', { + template: '{{mount-widget widget="poster-name" args=args}}', + setup() { + this.siteSettings.display_name_on_posts = false; + this.set('args', { username: 'eviltrout', name: 'Robin Ward' }); + }, + test(assert) { + assert.equal(this.$('.full-name').length, 0); + } +}); + +widgetTest("doesn't render a name if it's similar to the username", { + template: '{{mount-widget widget="poster-name" args=args}}', + setup() { + this.set('args', { username: 'eviltrout', name: 'evil-trout' }); + }, + test(assert) { + assert.equal(this.$('.full-name').length, 0); + } +}); diff --git a/vendor/assets/javascripts/virtual-dom-amd.js b/vendor/assets/javascripts/virtual-dom-amd.js new file mode 100644 index 0000000000..75ee9dccf1 --- /dev/null +++ b/vendor/assets/javascripts/virtual-dom-amd.js @@ -0,0 +1,4 @@ +// Just a wrapper from the standalone browserified virtual-dom +define("virtual-dom", [], function() { + return virtualDom; +}); diff --git a/vendor/assets/javascripts/virtual-dom.js b/vendor/assets/javascripts/virtual-dom.js new file mode 100644 index 0000000000..ef7710be94 --- /dev/null +++ b/vendor/assets/javascripts/virtual-dom.js @@ -0,0 +1,1668 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.virtualDom=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o + * Available under the MIT License + * ECMAScript compliant, uniform cross-browser split method + */ + +/** + * Splits a string into an array of strings using a regex or string separator. Matches of the + * separator are not included in the result array. However, if `separator` is a regex that contains + * capturing groups, backreferences are spliced into the result each time `separator` is matched. + * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably + * cross-browser. + * @param {String} str String to split. + * @param {RegExp|String} separator Regex or string to use for separating the string. + * @param {Number} [limit] Maximum number of items to include in the result array. + * @returns {Array} Array of substrings. + * @example + * + * // Basic use + * split('a b c d', ' '); + * // -> ['a', 'b', 'c', 'd'] + * + * // With limit + * split('a b c d', ' ', 2); + * // -> ['a', 'b'] + * + * // Backreferences in result array + * split('..word1 word2..', /([a-z]+)(\d+)/i); + * // -> ['..', 'word', '1', ' ', 'word', '2', '..'] + */ +module.exports = (function split(undef) { + + var nativeSplit = String.prototype.split, + compliantExecNpcg = /()??/.exec("")[1] === undef, + // NPCG: nonparticipating capturing group + self; + + self = function(str, separator, limit) { + // If `separator` is not a regex, use `nativeSplit` + if (Object.prototype.toString.call(separator) !== "[object RegExp]") { + return nativeSplit.call(str, separator, limit); + } + var output = [], + flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6 + (separator.sticky ? "y" : ""), + // Firefox 3+ + lastLastIndex = 0, + // Make `global` and avoid `lastIndex` issues by working with a copy + separator = new RegExp(separator.source, flags + "g"), + separator2, match, lastIndex, lastLength; + str += ""; // Type-convert + if (!compliantExecNpcg) { + // Doesn't need flags gy, but they don't hurt + separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); + } + /* Values for `limit`, per the spec: + * If undefined: 4294967295 // Math.pow(2, 32) - 1 + * If 0, Infinity, or NaN: 0 + * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; + * If negative number: 4294967296 - Math.floor(Math.abs(limit)) + * If other: Type-convert, then use the above rules + */ + limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1 + limit >>> 0; // ToUint32(limit) + while (match = separator.exec(str)) { + // `separator.lastIndex` is not reliable cross-browser + lastIndex = match.index + match[0].length; + if (lastIndex > lastLastIndex) { + output.push(str.slice(lastLastIndex, match.index)); + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1) { + match[0].replace(separator2, function() { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undef) { + match[i] = undef; + } + } + }); + } + if (match.length > 1 && match.index < str.length) { + Array.prototype.push.apply(output, match.slice(1)); + } + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= limit) { + break; + } + } + if (separator.lastIndex === match.index) { + separator.lastIndex++; // Avoid an infinite loop + } + } + if (lastLastIndex === str.length) { + if (lastLength || !separator.test("")) { + output.push(""); + } + } else { + output.push(str.slice(lastLastIndex)); + } + return output.length > limit ? output.slice(0, limit) : output; + }; + + return self; +})(); + +},{}],6:[function(require,module,exports){ + +},{}],7:[function(require,module,exports){ +'use strict'; + +var OneVersionConstraint = require('individual/one-version'); + +var MY_VERSION = '7'; +OneVersionConstraint('ev-store', MY_VERSION); + +var hashKey = '__EV_STORE_KEY@' + MY_VERSION; + +module.exports = EvStore; + +function EvStore(elem) { + var hash = elem[hashKey]; + + if (!hash) { + hash = elem[hashKey] = {}; + } + + return hash; +} + +},{"individual/one-version":9}],8:[function(require,module,exports){ +(function (global){ +'use strict'; + +/*global window, global*/ + +var root = typeof window !== 'undefined' ? + window : typeof global !== 'undefined' ? + global : {}; + +module.exports = Individual; + +function Individual(key, value) { + if (key in root) { + return root[key]; + } + + root[key] = value; + + return value; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],9:[function(require,module,exports){ +'use strict'; + +var Individual = require('./index.js'); + +module.exports = OneVersion; + +function OneVersion(moduleName, version, defaultValue) { + var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName; + var enforceKey = key + '_ENFORCE_SINGLETON'; + + var versionValue = Individual(enforceKey, version); + + if (versionValue !== version) { + throw new Error('Can only have one copy of ' + + moduleName + '.\n' + + 'You already have version ' + versionValue + + ' installed.\n' + + 'This means you cannot install version ' + version); + } + + return Individual(key, defaultValue); +} + +},{"./index.js":8}],10:[function(require,module,exports){ +(function (global){ +var topLevel = typeof global !== 'undefined' ? global : + typeof window !== 'undefined' ? window : {} +var minDoc = require('min-document'); + +if (typeof document !== 'undefined') { + module.exports = document; +} else { + var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; + + if (!doccy) { + doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; + } + + module.exports = doccy; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"min-document":6}],11:[function(require,module,exports){ +"use strict"; + +module.exports = function isObject(x) { + return typeof x === "object" && x !== null; +}; + +},{}],12:[function(require,module,exports){ +var nativeIsArray = Array.isArray +var toString = Object.prototype.toString + +module.exports = nativeIsArray || isArray + +function isArray(obj) { + return toString.call(obj) === "[object Array]" +} + +},{}],13:[function(require,module,exports){ +var patch = require("./vdom/patch.js") + +module.exports = patch + +},{"./vdom/patch.js":18}],14:[function(require,module,exports){ +var isObject = require("is-object") +var isHook = require("../vnode/is-vhook.js") + +module.exports = applyProperties + +function applyProperties(node, props, previous) { + for (var propName in props) { + var propValue = props[propName] + + if (propValue === undefined) { + removeProperty(node, propName, propValue, previous); + } else if (isHook(propValue)) { + removeProperty(node, propName, propValue, previous) + if (propValue.hook) { + propValue.hook(node, + propName, + previous ? previous[propName] : undefined) + } + } else { + if (isObject(propValue)) { + patchObject(node, props, previous, propName, propValue); + } else { + node[propName] = propValue + } + } + } +} + +function removeProperty(node, propName, propValue, previous) { + if (previous) { + var previousValue = previous[propName] + + if (!isHook(previousValue)) { + if (propName === "attributes") { + for (var attrName in previousValue) { + node.removeAttribute(attrName) + } + } else if (propName === "style") { + for (var i in previousValue) { + node.style[i] = "" + } + } else if (typeof previousValue === "string") { + node[propName] = "" + } else { + node[propName] = null + } + } else if (previousValue.unhook) { + previousValue.unhook(node, propName, propValue) + } + } +} + +function patchObject(node, props, previous, propName, propValue) { + var previousValue = previous ? previous[propName] : undefined + + // Set attributes + if (propName === "attributes") { + for (var attrName in propValue) { + var attrValue = propValue[attrName] + + if (attrValue === undefined) { + node.removeAttribute(attrName) + } else { + node.setAttribute(attrName, attrValue) + } + } + + return + } + + if(previousValue && isObject(previousValue) && + getPrototype(previousValue) !== getPrototype(propValue)) { + node[propName] = propValue + return + } + + if (!isObject(node[propName])) { + node[propName] = {} + } + + var replacer = propName === "style" ? "" : undefined + + for (var k in propValue) { + var value = propValue[k] + node[propName][k] = (value === undefined) ? replacer : value + } +} + +function getPrototype(value) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(value) + } else if (value.__proto__) { + return value.__proto__ + } else if (value.constructor) { + return value.constructor.prototype + } +} + +},{"../vnode/is-vhook.js":26,"is-object":11}],15:[function(require,module,exports){ +var document = require("global/document") + +var applyProperties = require("./apply-properties") + +var isVNode = require("../vnode/is-vnode.js") +var isVText = require("../vnode/is-vtext.js") +var isWidget = require("../vnode/is-widget.js") +var handleThunk = require("../vnode/handle-thunk.js") + +module.exports = createElement + +function createElement(vnode, opts) { + var doc = opts ? opts.document || document : document + var warn = opts ? opts.warn : null + + vnode = handleThunk(vnode).a + + if (isWidget(vnode)) { + return vnode.init() + } else if (isVText(vnode)) { + return doc.createTextNode(vnode.text) + } else if (!isVNode(vnode)) { + if (warn) { + warn("Item is not a valid virtual dom node", vnode) + } + return null + } + + var node = (vnode.namespace === null) ? + doc.createElement(vnode.tagName) : + doc.createElementNS(vnode.namespace, vnode.tagName) + + var props = vnode.properties + applyProperties(node, props) + + var children = vnode.children + + for (var i = 0; i < children.length; i++) { + var childNode = createElement(children[i], opts) + if (childNode) { + node.appendChild(childNode) + } + } + + return node +} + +},{"../vnode/handle-thunk.js":24,"../vnode/is-vnode.js":27,"../vnode/is-vtext.js":28,"../vnode/is-widget.js":29,"./apply-properties":14,"global/document":10}],16:[function(require,module,exports){ +// Maps a virtual DOM tree onto a real DOM tree in an efficient manner. +// We don't want to read all of the DOM nodes in the tree so we use +// the in-order tree indexing to eliminate recursion down certain branches. +// We only recurse into a DOM node if we know that it contains a child of +// interest. + +var noChild = {} + +module.exports = domIndex + +function domIndex(rootNode, tree, indices, nodes) { + if (!indices || indices.length === 0) { + return {} + } else { + indices.sort(ascending) + return recurse(rootNode, tree, indices, nodes, 0) + } +} + +function recurse(rootNode, tree, indices, nodes, rootIndex) { + nodes = nodes || {} + + + if (rootNode) { + if (indexInRange(indices, rootIndex, rootIndex)) { + nodes[rootIndex] = rootNode + } + + var vChildren = tree.children + + if (vChildren) { + + var childNodes = rootNode.childNodes + + for (var i = 0; i < tree.children.length; i++) { + rootIndex += 1 + + var vChild = vChildren[i] || noChild + var nextIndex = rootIndex + (vChild.count || 0) + + // skip recursion down the tree if there are no nodes down here + if (indexInRange(indices, rootIndex, nextIndex)) { + recurse(childNodes[i], vChild, indices, nodes, rootIndex) + } + + rootIndex = nextIndex + } + } + } + + return nodes +} + +// Binary search for an index in the interval [left, right] +function indexInRange(indices, left, right) { + if (indices.length === 0) { + return false + } + + var minIndex = 0 + var maxIndex = indices.length - 1 + var currentIndex + var currentItem + + while (minIndex <= maxIndex) { + currentIndex = ((maxIndex + minIndex) / 2) >> 0 + currentItem = indices[currentIndex] + + if (minIndex === maxIndex) { + return currentItem >= left && currentItem <= right + } else if (currentItem < left) { + minIndex = currentIndex + 1 + } else if (currentItem > right) { + maxIndex = currentIndex - 1 + } else { + return true + } + } + + return false; +} + +function ascending(a, b) { + return a > b ? 1 : -1 +} + +},{}],17:[function(require,module,exports){ +var applyProperties = require("./apply-properties") + +var isWidget = require("../vnode/is-widget.js") +var VPatch = require("../vnode/vpatch.js") + +var updateWidget = require("./update-widget") + +module.exports = applyPatch + +function applyPatch(vpatch, domNode, renderOptions) { + var type = vpatch.type + var vNode = vpatch.vNode + var patch = vpatch.patch + + switch (type) { + case VPatch.REMOVE: + return removeNode(domNode, vNode) + case VPatch.INSERT: + return insertNode(domNode, patch, renderOptions) + case VPatch.VTEXT: + return stringPatch(domNode, vNode, patch, renderOptions) + case VPatch.WIDGET: + return widgetPatch(domNode, vNode, patch, renderOptions) + case VPatch.VNODE: + return vNodePatch(domNode, vNode, patch, renderOptions) + case VPatch.ORDER: + reorderChildren(domNode, patch) + return domNode + case VPatch.PROPS: + applyProperties(domNode, patch, vNode.properties) + return domNode + case VPatch.THUNK: + return replaceRoot(domNode, + renderOptions.patch(domNode, patch, renderOptions)) + default: + return domNode + } +} + +function removeNode(domNode, vNode) { + var parentNode = domNode.parentNode + + if (parentNode) { + parentNode.removeChild(domNode) + } + + destroyWidget(domNode, vNode); + + return null +} + +function insertNode(parentNode, vNode, renderOptions) { + var newNode = renderOptions.render(vNode, renderOptions) + + if (parentNode) { + parentNode.appendChild(newNode) + } + + return parentNode +} + +function stringPatch(domNode, leftVNode, vText, renderOptions) { + var newNode + + if (domNode.nodeType === 3) { + domNode.replaceData(0, domNode.length, vText.text) + newNode = domNode + } else { + var parentNode = domNode.parentNode + newNode = renderOptions.render(vText, renderOptions) + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + } + + return newNode +} + +function widgetPatch(domNode, leftVNode, widget, renderOptions) { + var updating = updateWidget(leftVNode, widget) + var newNode + + if (updating) { + newNode = widget.update(leftVNode, domNode) || domNode + } else { + newNode = renderOptions.render(widget, renderOptions) + } + + var parentNode = domNode.parentNode + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + + if (!updating) { + destroyWidget(domNode, leftVNode) + } + + return newNode +} + +function vNodePatch(domNode, leftVNode, vNode, renderOptions) { + var parentNode = domNode.parentNode + var newNode = renderOptions.render(vNode, renderOptions) + + if (parentNode && newNode !== domNode) { + parentNode.replaceChild(newNode, domNode) + } + + return newNode +} + +function destroyWidget(domNode, w) { + if (typeof w.destroy === "function" && isWidget(w)) { + w.destroy(domNode) + } +} + +function reorderChildren(domNode, moves) { + var childNodes = domNode.childNodes + var keyMap = {} + var node + var remove + var insert + + for (var i = 0; i < moves.removes.length; i++) { + remove = moves.removes[i] + node = childNodes[remove.from] + if (remove.key) { + keyMap[remove.key] = node + } + domNode.removeChild(node) + } + + var length = childNodes.length + for (var j = 0; j < moves.inserts.length; j++) { + insert = moves.inserts[j] + node = keyMap[insert.key] + // this is the weirdest bug i've ever seen in webkit + domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to]) + } +} + +function replaceRoot(oldRoot, newRoot) { + if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { + oldRoot.parentNode.replaceChild(newRoot, oldRoot) + } + + return newRoot; +} + +},{"../vnode/is-widget.js":29,"../vnode/vpatch.js":32,"./apply-properties":14,"./update-widget":19}],18:[function(require,module,exports){ +var document = require("global/document") +var isArray = require("x-is-array") + +var render = require("./create-element") +var domIndex = require("./dom-index") +var patchOp = require("./patch-op") +module.exports = patch + +function patch(rootNode, patches, renderOptions) { + renderOptions = renderOptions || {} + renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch + ? renderOptions.patch + : patchRecursive + renderOptions.render = renderOptions.render || render + + return renderOptions.patch(rootNode, patches, renderOptions) +} + +function patchRecursive(rootNode, patches, renderOptions) { + var indices = patchIndices(patches) + + if (indices.length === 0) { + return rootNode + } + + var index = domIndex(rootNode, patches.a, indices) + var ownerDocument = rootNode.ownerDocument + + if (!renderOptions.document && ownerDocument !== document) { + renderOptions.document = ownerDocument + } + + for (var i = 0; i < indices.length; i++) { + var nodeIndex = indices[i] + rootNode = applyPatch(rootNode, + index[nodeIndex], + patches[nodeIndex], + renderOptions) + } + + return rootNode +} + +function applyPatch(rootNode, domNode, patchList, renderOptions) { + if (!domNode) { + return rootNode + } + + var newNode + + if (isArray(patchList)) { + for (var i = 0; i < patchList.length; i++) { + newNode = patchOp(patchList[i], domNode, renderOptions) + + if (domNode === rootNode) { + rootNode = newNode + } + } + } else { + newNode = patchOp(patchList, domNode, renderOptions) + + if (domNode === rootNode) { + rootNode = newNode + } + } + + return rootNode +} + +function patchIndices(patches) { + var indices = [] + + for (var key in patches) { + if (key !== "a") { + indices.push(Number(key)) + } + } + + return indices +} + +},{"./create-element":15,"./dom-index":16,"./patch-op":17,"global/document":10,"x-is-array":12}],19:[function(require,module,exports){ +var isWidget = require("../vnode/is-widget.js") + +module.exports = updateWidget + +function updateWidget(a, b) { + if (isWidget(a) && isWidget(b)) { + if ("name" in a && "name" in b) { + return a.id === b.id + } else { + return a.init === b.init + } + } + + return false +} + +},{"../vnode/is-widget.js":29}],20:[function(require,module,exports){ +'use strict'; + +var EvStore = require('ev-store'); + +module.exports = EvHook; + +function EvHook(value) { + if (!(this instanceof EvHook)) { + return new EvHook(value); + } + + this.value = value; +} + +EvHook.prototype.hook = function (node, propertyName) { + var es = EvStore(node); + var propName = propertyName.substr(3); + + es[propName] = this.value; +}; + +EvHook.prototype.unhook = function(node, propertyName) { + var es = EvStore(node); + var propName = propertyName.substr(3); + + es[propName] = undefined; +}; + +},{"ev-store":7}],21:[function(require,module,exports){ +'use strict'; + +module.exports = SoftSetHook; + +function SoftSetHook(value) { + if (!(this instanceof SoftSetHook)) { + return new SoftSetHook(value); + } + + this.value = value; +} + +SoftSetHook.prototype.hook = function (node, propertyName) { + if (node[propertyName] !== this.value) { + node[propertyName] = this.value; + } +}; + +},{}],22:[function(require,module,exports){ +'use strict'; + +var isArray = require('x-is-array'); + +var VNode = require('../vnode/vnode.js'); +var VText = require('../vnode/vtext.js'); +var isVNode = require('../vnode/is-vnode'); +var isVText = require('../vnode/is-vtext'); +var isWidget = require('../vnode/is-widget'); +var isHook = require('../vnode/is-vhook'); +var isVThunk = require('../vnode/is-thunk'); + +var parseTag = require('./parse-tag.js'); +var softSetHook = require('./hooks/soft-set-hook.js'); +var evHook = require('./hooks/ev-hook.js'); + +module.exports = h; + +function h(tagName, properties, children) { + var childNodes = []; + var tag, props, key, namespace; + + if (!children && isChildren(properties)) { + children = properties; + props = {}; + } + + props = props || properties || {}; + tag = parseTag(tagName, props); + + // support keys + if (props.hasOwnProperty('key')) { + key = props.key; + props.key = undefined; + } + + // support namespace + if (props.hasOwnProperty('namespace')) { + namespace = props.namespace; + props.namespace = undefined; + } + + // fix cursor bug + if (tag === 'INPUT' && + !namespace && + props.hasOwnProperty('value') && + props.value !== undefined && + !isHook(props.value) + ) { + props.value = softSetHook(props.value); + } + + transformProperties(props); + + if (children !== undefined && children !== null) { + addChild(children, childNodes, tag, props); + } + + + return new VNode(tag, props, childNodes, key, namespace); +} + +function addChild(c, childNodes, tag, props) { + if (typeof c === 'string') { + childNodes.push(new VText(c)); + } else if (typeof c === 'number') { + childNodes.push(new VText(String(c))); + } else if (isChild(c)) { + childNodes.push(c); + } else if (isArray(c)) { + for (var i = 0; i < c.length; i++) { + addChild(c[i], childNodes, tag, props); + } + } else if (c === null || c === undefined) { + return; + } else { + throw UnexpectedVirtualElement({ + foreignObject: c, + parentVnode: { + tagName: tag, + properties: props + } + }); + } +} + +function transformProperties(props) { + for (var propName in props) { + if (props.hasOwnProperty(propName)) { + var value = props[propName]; + + if (isHook(value)) { + continue; + } + + if (propName.substr(0, 3) === 'ev-') { + // add ev-foo support + props[propName] = evHook(value); + } + } + } +} + +function isChild(x) { + return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x); +} + +function isChildren(x) { + return typeof x === 'string' || isArray(x) || isChild(x); +} + +function UnexpectedVirtualElement(data) { + var err = new Error(); + + err.type = 'virtual-hyperscript.unexpected.virtual-element'; + err.message = 'Unexpected virtual child passed to h().\n' + + 'Expected a VNode / Vthunk / VWidget / string but:\n' + + 'got:\n' + + errorString(data.foreignObject) + + '.\n' + + 'The parent vnode is:\n' + + errorString(data.parentVnode) + '\n' + + 'Suggested fix: change your `h(..., [ ... ])` callsite.'; + err.foreignObject = data.foreignObject; + err.parentVnode = data.parentVnode; + + return err; +} + +function errorString(obj) { + try { + return JSON.stringify(obj, null, ' '); + } catch (e) { + return String(obj); + } +} + +},{"../vnode/is-thunk":25,"../vnode/is-vhook":26,"../vnode/is-vnode":27,"../vnode/is-vtext":28,"../vnode/is-widget":29,"../vnode/vnode.js":31,"../vnode/vtext.js":33,"./hooks/ev-hook.js":20,"./hooks/soft-set-hook.js":21,"./parse-tag.js":23,"x-is-array":12}],23:[function(require,module,exports){ +'use strict'; + +var split = require('browser-split'); + +var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/; +var notClassId = /^\.|#/; + +module.exports = parseTag; + +function parseTag(tag, props) { + if (!tag) { + return 'DIV'; + } + + var noId = !(props.hasOwnProperty('id')); + + var tagParts = split(tag, classIdSplit); + var tagName = null; + + if (notClassId.test(tagParts[1])) { + tagName = 'DIV'; + } + + var classes, part, type, i; + + for (i = 0; i < tagParts.length; i++) { + part = tagParts[i]; + + if (!part) { + continue; + } + + type = part.charAt(0); + + if (!tagName) { + tagName = part; + } else if (type === '.') { + classes = classes || []; + classes.push(part.substring(1, part.length)); + } else if (type === '#' && noId) { + props.id = part.substring(1, part.length); + } + } + + if (classes) { + if (props.className) { + classes.push(props.className); + } + + props.className = classes.join(' '); + } + + return props.namespace ? tagName : tagName.toUpperCase(); +} + +},{"browser-split":5}],24:[function(require,module,exports){ +var isVNode = require("./is-vnode") +var isVText = require("./is-vtext") +var isWidget = require("./is-widget") +var isThunk = require("./is-thunk") + +module.exports = handleThunk + +function handleThunk(a, b) { + var renderedA = a + var renderedB = b + + if (isThunk(b)) { + renderedB = renderThunk(b, a) + } + + if (isThunk(a)) { + renderedA = renderThunk(a, null) + } + + return { + a: renderedA, + b: renderedB + } +} + +function renderThunk(thunk, previous) { + var renderedThunk = thunk.vnode + + if (!renderedThunk) { + renderedThunk = thunk.vnode = thunk.render(previous) + } + + if (!(isVNode(renderedThunk) || + isVText(renderedThunk) || + isWidget(renderedThunk))) { + throw new Error("thunk did not return a valid node"); + } + + return renderedThunk +} + +},{"./is-thunk":25,"./is-vnode":27,"./is-vtext":28,"./is-widget":29}],25:[function(require,module,exports){ +module.exports = isThunk + +function isThunk(t) { + return t && t.type === "Thunk" +} + +},{}],26:[function(require,module,exports){ +module.exports = isHook + +function isHook(hook) { + return hook && + (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || + typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) +} + +},{}],27:[function(require,module,exports){ +var version = require("./version") + +module.exports = isVirtualNode + +function isVirtualNode(x) { + return x && x.type === "VirtualNode" && x.version === version +} + +},{"./version":30}],28:[function(require,module,exports){ +var version = require("./version") + +module.exports = isVirtualText + +function isVirtualText(x) { + return x && x.type === "VirtualText" && x.version === version +} + +},{"./version":30}],29:[function(require,module,exports){ +module.exports = isWidget + +function isWidget(w) { + return w && w.type === "Widget" +} + +},{}],30:[function(require,module,exports){ +module.exports = "2" + +},{}],31:[function(require,module,exports){ +var version = require("./version") +var isVNode = require("./is-vnode") +var isWidget = require("./is-widget") +var isThunk = require("./is-thunk") +var isVHook = require("./is-vhook") + +module.exports = VirtualNode + +var noProperties = {} +var noChildren = [] + +function VirtualNode(tagName, properties, children, key, namespace) { + this.tagName = tagName + this.properties = properties || noProperties + this.children = children || noChildren + this.key = key != null ? String(key) : undefined + this.namespace = (typeof namespace === "string") ? namespace : null + + var count = (children && children.length) || 0 + var descendants = 0 + var hasWidgets = false + var hasThunks = false + var descendantHooks = false + var hooks + + for (var propName in properties) { + if (properties.hasOwnProperty(propName)) { + var property = properties[propName] + if (isVHook(property) && property.unhook) { + if (!hooks) { + hooks = {} + } + + hooks[propName] = property + } + } + } + + for (var i = 0; i < count; i++) { + var child = children[i] + if (isVNode(child)) { + descendants += child.count || 0 + + if (!hasWidgets && child.hasWidgets) { + hasWidgets = true + } + + if (!hasThunks && child.hasThunks) { + hasThunks = true + } + + if (!descendantHooks && (child.hooks || child.descendantHooks)) { + descendantHooks = true + } + } else if (!hasWidgets && isWidget(child)) { + if (typeof child.destroy === "function") { + hasWidgets = true + } + } else if (!hasThunks && isThunk(child)) { + hasThunks = true; + } + } + + this.count = count + descendants + this.hasWidgets = hasWidgets + this.hasThunks = hasThunks + this.hooks = hooks + this.descendantHooks = descendantHooks +} + +VirtualNode.prototype.version = version +VirtualNode.prototype.type = "VirtualNode" + +},{"./is-thunk":25,"./is-vhook":26,"./is-vnode":27,"./is-widget":29,"./version":30}],32:[function(require,module,exports){ +var version = require("./version") + +VirtualPatch.NONE = 0 +VirtualPatch.VTEXT = 1 +VirtualPatch.VNODE = 2 +VirtualPatch.WIDGET = 3 +VirtualPatch.PROPS = 4 +VirtualPatch.ORDER = 5 +VirtualPatch.INSERT = 6 +VirtualPatch.REMOVE = 7 +VirtualPatch.THUNK = 8 + +module.exports = VirtualPatch + +function VirtualPatch(type, vNode, patch) { + this.type = Number(type) + this.vNode = vNode + this.patch = patch +} + +VirtualPatch.prototype.version = version +VirtualPatch.prototype.type = "VirtualPatch" + +},{"./version":30}],33:[function(require,module,exports){ +var version = require("./version") + +module.exports = VirtualText + +function VirtualText(text) { + this.text = String(text) +} + +VirtualText.prototype.version = version +VirtualText.prototype.type = "VirtualText" + +},{"./version":30}],34:[function(require,module,exports){ +var isObject = require("is-object") +var isHook = require("../vnode/is-vhook") + +module.exports = diffProps + +function diffProps(a, b) { + var diff + + for (var aKey in a) { + if (!(aKey in b)) { + diff = diff || {} + diff[aKey] = undefined + } + + var aValue = a[aKey] + var bValue = b[aKey] + + if (aValue === bValue) { + continue + } else if (isObject(aValue) && isObject(bValue)) { + if (getPrototype(bValue) !== getPrototype(aValue)) { + diff = diff || {} + diff[aKey] = bValue + } else if (isHook(bValue)) { + diff = diff || {} + diff[aKey] = bValue + } else { + var objectDiff = diffProps(aValue, bValue) + if (objectDiff) { + diff = diff || {} + diff[aKey] = objectDiff + } + } + } else { + diff = diff || {} + diff[aKey] = bValue + } + } + + for (var bKey in b) { + if (!(bKey in a)) { + diff = diff || {} + diff[bKey] = b[bKey] + } + } + + return diff +} + +function getPrototype(value) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(value) + } else if (value.__proto__) { + return value.__proto__ + } else if (value.constructor) { + return value.constructor.prototype + } +} + +},{"../vnode/is-vhook":26,"is-object":11}],35:[function(require,module,exports){ +var isArray = require("x-is-array") + +var VPatch = require("../vnode/vpatch") +var isVNode = require("../vnode/is-vnode") +var isVText = require("../vnode/is-vtext") +var isWidget = require("../vnode/is-widget") +var isThunk = require("../vnode/is-thunk") +var handleThunk = require("../vnode/handle-thunk") + +var diffProps = require("./diff-props") + +module.exports = diff + +function diff(a, b) { + var patch = { a: a } + walk(a, b, patch, 0) + return patch +} + +function walk(a, b, patch, index) { + if (a === b) { + return + } + + var apply = patch[index] + var applyClear = false + + if (isThunk(a) || isThunk(b)) { + thunks(a, b, patch, index) + } else if (b == null) { + + // If a is a widget we will add a remove patch for it + // Otherwise any child widgets/hooks must be destroyed. + // This prevents adding two remove patches for a widget. + if (!isWidget(a)) { + clearState(a, patch, index) + apply = patch[index] + } + + apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b)) + } else if (isVNode(b)) { + if (isVNode(a)) { + if (a.tagName === b.tagName && + a.namespace === b.namespace && + a.key === b.key) { + var propsPatch = diffProps(a.properties, b.properties) + if (propsPatch) { + apply = appendPatch(apply, + new VPatch(VPatch.PROPS, a, propsPatch)) + } + apply = diffChildren(a, b, patch, apply, index) + } else { + apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) + applyClear = true + } + } else { + apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) + applyClear = true + } + } else if (isVText(b)) { + if (!isVText(a)) { + apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) + applyClear = true + } else if (a.text !== b.text) { + apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) + } + } else if (isWidget(b)) { + if (!isWidget(a)) { + applyClear = true + } + + apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) + } + + if (apply) { + patch[index] = apply + } + + if (applyClear) { + clearState(a, patch, index) + } +} + +function diffChildren(a, b, patch, apply, index) { + var aChildren = a.children + var orderedSet = reorder(aChildren, b.children) + var bChildren = orderedSet.children + + var aLen = aChildren.length + var bLen = bChildren.length + var len = aLen > bLen ? aLen : bLen + + for (var i = 0; i < len; i++) { + var leftNode = aChildren[i] + var rightNode = bChildren[i] + index += 1 + + if (!leftNode) { + if (rightNode) { + // Excess nodes in b need to be added + apply = appendPatch(apply, + new VPatch(VPatch.INSERT, null, rightNode)) + } + } else { + walk(leftNode, rightNode, patch, index) + } + + if (isVNode(leftNode) && leftNode.count) { + index += leftNode.count + } + } + + if (orderedSet.moves) { + // Reorder nodes last + apply = appendPatch(apply, new VPatch( + VPatch.ORDER, + a, + orderedSet.moves + )) + } + + return apply +} + +function clearState(vNode, patch, index) { + // TODO: Make this a single walk, not two + unhook(vNode, patch, index) + destroyWidgets(vNode, patch, index) +} + +// Patch records for all destroyed widgets must be added because we need +// a DOM node reference for the destroy function +function destroyWidgets(vNode, patch, index) { + if (isWidget(vNode)) { + if (typeof vNode.destroy === "function") { + patch[index] = appendPatch( + patch[index], + new VPatch(VPatch.REMOVE, vNode, null) + ) + } + } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) { + var children = vNode.children + var len = children.length + for (var i = 0; i < len; i++) { + var child = children[i] + index += 1 + + destroyWidgets(child, patch, index) + + if (isVNode(child) && child.count) { + index += child.count + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} + +// Create a sub-patch for thunks +function thunks(a, b, patch, index) { + var nodes = handleThunk(a, b) + var thunkPatch = diff(nodes.a, nodes.b) + if (hasPatches(thunkPatch)) { + patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch) + } +} + +function hasPatches(patch) { + for (var index in patch) { + if (index !== "a") { + return true + } + } + + return false +} + +// Execute hooks when two nodes are identical +function unhook(vNode, patch, index) { + if (isVNode(vNode)) { + if (vNode.hooks) { + patch[index] = appendPatch( + patch[index], + new VPatch( + VPatch.PROPS, + vNode, + undefinedKeys(vNode.hooks) + ) + ) + } + + if (vNode.descendantHooks || vNode.hasThunks) { + var children = vNode.children + var len = children.length + for (var i = 0; i < len; i++) { + var child = children[i] + index += 1 + + unhook(child, patch, index) + + if (isVNode(child) && child.count) { + index += child.count + } + } + } + } else if (isThunk(vNode)) { + thunks(vNode, null, patch, index) + } +} + +function undefinedKeys(obj) { + var result = {} + + for (var key in obj) { + result[key] = undefined + } + + return result +} + +// List diff, naive left to right reordering +function reorder(aChildren, bChildren) { + // O(M) time, O(M) memory + var bChildIndex = keyIndex(bChildren) + var bKeys = bChildIndex.keys + var bFree = bChildIndex.free + + if (bFree.length === bChildren.length) { + return { + children: bChildren, + moves: null + } + } + + // O(N) time, O(N) memory + var aChildIndex = keyIndex(aChildren) + var aKeys = aChildIndex.keys + var aFree = aChildIndex.free + + if (aFree.length === aChildren.length) { + return { + children: bChildren, + moves: null + } + } + + // O(MAX(N, M)) memory + var newChildren = [] + + var freeIndex = 0 + var freeCount = bFree.length + var deletedItems = 0 + + // Iterate through a and match a node in b + // O(N) time, + for (var i = 0 ; i < aChildren.length; i++) { + var aItem = aChildren[i] + var itemIndex + + if (aItem.key) { + if (bKeys.hasOwnProperty(aItem.key)) { + // Match up the old keys + itemIndex = bKeys[aItem.key] + newChildren.push(bChildren[itemIndex]) + + } else { + // Remove old keyed items + itemIndex = i - deletedItems++ + newChildren.push(null) + } + } else { + // Match the item in a with the next free item in b + if (freeIndex < freeCount) { + itemIndex = bFree[freeIndex++] + newChildren.push(bChildren[itemIndex]) + } else { + // There are no free items in b to match with + // the free items in a, so the extra free nodes + // are deleted. + itemIndex = i - deletedItems++ + newChildren.push(null) + } + } + } + + var lastFreeIndex = freeIndex >= bFree.length ? + bChildren.length : + bFree[freeIndex] + + // Iterate through b and append any new keys + // O(M) time + for (var j = 0; j < bChildren.length; j++) { + var newItem = bChildren[j] + + if (newItem.key) { + if (!aKeys.hasOwnProperty(newItem.key)) { + // Add any new keyed items + // We are adding new items to the end and then sorting them + // in place. In future we should insert new items in place. + newChildren.push(newItem) + } + } else if (j >= lastFreeIndex) { + // Add any leftover non-keyed items + newChildren.push(newItem) + } + } + + var simulate = newChildren.slice() + var simulateIndex = 0 + var removes = [] + var inserts = [] + var simulateItem + + for (var k = 0; k < bChildren.length;) { + var wantedItem = bChildren[k] + simulateItem = simulate[simulateIndex] + + // remove items + while (simulateItem === null && simulate.length) { + removes.push(remove(simulate, simulateIndex, null)) + simulateItem = simulate[simulateIndex] + } + + if (!simulateItem || simulateItem.key !== wantedItem.key) { + // if we need a key in this position... + if (wantedItem.key) { + if (simulateItem && simulateItem.key) { + // if an insert doesn't put this key in place, it needs to move + if (bKeys[simulateItem.key] !== k + 1) { + removes.push(remove(simulate, simulateIndex, simulateItem.key)) + simulateItem = simulate[simulateIndex] + // if the remove didn't put the wanted item in place, we need to insert it + if (!simulateItem || simulateItem.key !== wantedItem.key) { + inserts.push({key: wantedItem.key, to: k}) + } + // items are matching, so skip ahead + else { + simulateIndex++ + } + } + else { + inserts.push({key: wantedItem.key, to: k}) + } + } + else { + inserts.push({key: wantedItem.key, to: k}) + } + k++ + } + // a key in simulate has no matching wanted key, remove it + else if (simulateItem && simulateItem.key) { + removes.push(remove(simulate, simulateIndex, simulateItem.key)) + } + } + else { + simulateIndex++ + k++ + } + } + + // remove all the remaining nodes from simulate + while(simulateIndex < simulate.length) { + simulateItem = simulate[simulateIndex] + removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) + } + + // If the only moves we have are deletes then we can just + // let the delete patch remove these items. + if (removes.length === deletedItems && !inserts.length) { + return { + children: newChildren, + moves: null + } + } + + return { + children: newChildren, + moves: { + removes: removes, + inserts: inserts + } + } +} + +function remove(arr, index, key) { + arr.splice(index, 1) + + return { + from: index, + key: key + } +} + +function keyIndex(children) { + var keys = {} + var free = [] + var length = children.length + + for (var i = 0; i < length; i++) { + var child = children[i] + + if (child.key) { + keys[child.key] = i + } else { + free.push(i) + } + } + + return { + keys: keys, // A hash of key name to index + free: free // An array of unkeyed item indices + } +} + +function appendPatch(apply, patch) { + if (apply) { + if (isArray(apply)) { + apply.push(patch) + } else { + apply = [apply, patch] + } + + return apply + } else { + return patch + } +} + +},{"../vnode/handle-thunk":24,"../vnode/is-thunk":25,"../vnode/is-vnode":27,"../vnode/is-vtext":28,"../vnode/is-widget":29,"../vnode/vpatch":32,"./diff-props":34,"x-is-array":12}]},{},[4])(4) +}); From 2b1e7306e151cfd41f75b365a1fbda3b970dbb63 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 12:14:34 -0500 Subject: [PATCH 002/245] FIX: Regression with `time-gap` showing decimals and no clearfix --- app/assets/javascripts/discourse/widgets/post-stream.js.es6 | 2 +- app/assets/javascripts/discourse/widgets/time-gap.js.es6 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 index 723ef1ab46..f2d3b69d82 100644 --- a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 @@ -48,7 +48,7 @@ export default createWidget('post-stream', { // Handle time gaps const curTime = new Date(transformed.created_at).getTime(); if (prevDate) { - const daysSince = (curTime - prevDate) / DAY; + const daysSince = Math.floor((curTime - prevDate) / DAY); if (daysSince > this.siteSettings.show_time_gap_days) { result.push(this.attach('time-gap', { daysSince })); } diff --git a/app/assets/javascripts/discourse/widgets/time-gap.js.es6 b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 index cb1b558106..721a048032 100644 --- a/app/assets/javascripts/discourse/widgets/time-gap.js.es6 +++ b/app/assets/javascripts/discourse/widgets/time-gap.js.es6 @@ -17,7 +17,7 @@ function description(attrs) { } export default createWidget('time-gap', { - tagName: 'div.time-gap.small-action', + tagName: 'div.time-gap.small-action.clearfix', html(attrs) { return [h('div.topic-avatar', iconNode('clock-o')), From bad98351204c30586b73e206981c2b3085e7eea0 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 12:41:56 -0500 Subject: [PATCH 003/245] FIX: Regression with quickly hitting back button in vdom branch --- .../discourse/components/scrolling-post-stream.js.es6 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index a8ae4b7afa..0e8fc7751c 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -34,6 +34,8 @@ export default MountWidget.extend({ }).volatile(), scrolled() { + if (this.isDestroyed || this.isDestroying) { return; } + const $w = $(window); const windowHeight = window.innerHeight ? window.innerHeight : $w.height(); const slack = Math.round(windowHeight * 15); From 81a0b25324165f603325f05f780469760f5a0908 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 12:48:48 -0500 Subject: [PATCH 004/245] FIX: `postChangedRoute` was firing after destruction sometimes --- .../javascripts/discourse/controllers/topic.js.es6 | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index b4bb45fd08..7f91beeb19 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -122,7 +122,9 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { const postStream = this.get('model.postStream'); const firstLoadedPost = postStream.get('posts.firstObject'); - this.set('model.currentPost', post.get('post_number')); + const currentPostNumber = post.get('post_number'); + this.set('model.currentPost', currentPostNumber); + this.send('postChangedRoute', currentPostNumber); if (post.get('post_number') === 1) { return; } @@ -712,14 +714,6 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { } }, - // If our current post is changed, notify the router - _currentPostChanged: function() { - const currentPost = this.get('model.currentPost'); - if (currentPost) { - this.send('postChangedRoute', currentPost); - } - }.observes('model.currentPost'), - readPosts(topicId, postNumbers) { const topic = this.get("model"), postStream = topic.get("postStream"); From c76e6e173e936bbb5833e41b50e768d0ec663331 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 13:22:14 -0500 Subject: [PATCH 005/245] FIX: Include small actions when determining what's on screen --- .../discourse/components/scrolling-post-stream.js.es6 | 2 +- .../javascripts/discourse/widgets/post-small-action.js.es6 | 2 +- app/assets/javascripts/discourse/widgets/post.js.es6 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index 0e8fc7751c..83cbcbebb2 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -43,7 +43,7 @@ export default MountWidget.extend({ let windowTop = $w.scrollTop(); - const $posts = this.$('article.boxed'); + const $posts = this.$('.onscreen-post'); const viewportTop = windowTop - slack; const topView = findTopView($posts, viewportTop, 0, $posts.length-1); diff --git a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 index e4590e1d40..699e97dd0d 100644 --- a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 @@ -23,7 +23,7 @@ const icons = { }; export default createWidget('post-small-action', { - tagName: 'div.small-action.clearfix', + tagName: 'div.small-action.onscreen-post.clearfix', html(attrs) { const contents = []; diff --git a/app/assets/javascripts/discourse/widgets/post.js.es6 b/app/assets/javascripts/discourse/widgets/post.js.es6 index 06916e942d..26ed9f4e4b 100644 --- a/app/assets/javascripts/discourse/widgets/post.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post.js.es6 @@ -295,7 +295,7 @@ createWidget('post-body', { }); createWidget('post-article', { - tagName: 'article.boxed', + tagName: 'article.boxed.onscreen-post', buildKey: attrs => `post-article-${attrs.id}`, defaultState() { From befae52c09218083f51b1b99beef90af5612f742 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 13:40:52 -0500 Subject: [PATCH 006/245] FIX: Read post icon was not fading --- .../javascripts/discourse/controllers/topic.js.es6 | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index 7f91beeb19..8a7548bc05 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -715,14 +715,16 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { }, readPosts(topicId, postNumbers) { - const topic = this.get("model"), - postStream = topic.get("postStream"); + const topic = this.get("model"); + const postStream = topic.get("postStream"); + + if (topic.get('id') === topicId) { - if (topic.get("id") === topicId) { // TODO identity map for postNumber - _.each(postStream.get('posts'), post => { - if (_.include(postNumbers, post.post_number) && !post.read) { - post.set("read", true); + postStream.get('posts').forEach(post => { + if (!post.read && postNumbers.indexOf(post.post_number) !== -1) { + post.set('read', true); + this.appEvents.trigger('post-stream:refresh', post.id); } }); From 363cf5c5dab90b00095229584eeac3d801d91bf2 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 15:52:45 -0500 Subject: [PATCH 007/245] FIX: Couldn't like via keyboard --- .../discourse/lib/keyboard-shortcuts.js.es6 | 9 ++------- .../discourse/widgets/post-menu.js.es6 | 15 +++++++++++---- .../javascripts/discourse/widgets/post.js.es6 | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index 45e888395f..ccb4bd0fda 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -28,7 +28,7 @@ const bindings = { 'home': {handler: 'goToFirstPost', anonymous: true}, 'j': {handler: 'selectDown', anonymous: true}, 'k': {handler: 'selectUp', anonymous: true}, - 'l': {click: '.topic-post.selected button[data-action="like"]'}, + 'l': {click: '.topic-post.selected button.toggle-like'}, 'm m': {click: 'div.notification-options li[data-id="0"] a'}, // mark topic as muted 'm r': {click: 'div.notification-options li[data-id="1"] a'}, // mark topic as regular 'm t': {click: 'div.notification-options li[data-id="2"] a'}, // mark topic as tracking @@ -312,12 +312,7 @@ export default { } if ($article.is('.topic-post')) { - let tabLoc = $article.find('a.tabLoc'); - if (tabLoc.length === 0) { - tabLoc = $(''); - $article.prepend(tabLoc); - } - tabLoc.focus(); + $('a.tabLoc', $article).focus(); } this._scrollList($article, direction); diff --git a/app/assets/javascripts/discourse/widgets/post-menu.js.es6 b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 index f4c4d9150a..ec0d9b9151 100644 --- a/app/assets/javascripts/discourse/widgets/post-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-menu.js.es6 @@ -26,14 +26,21 @@ function registerButton(name, builder) { registerButton('like', attrs => { if (!attrs.showLike) { return; } - const className = attrs.liked ? 'has-like fade-out' : 'like'; + const className = attrs.liked ? 'toggle-like has-like fade-out' : 'toggle-like like'; + + const button = { + action: 'like', + icon: 'heart', + className + }; if (attrs.canToggleLike) { - const descKey = attrs.liked ? 'post.controls.undo_like' : 'post.controls.like'; - return { action: 'like', title: descKey, icon: 'heart', className }; + button.title = attrs.liked ? 'post.controls.undo_like' : 'post.controls.like'; } else if (attrs.liked) { - return { action: 'like', title: 'post.controls.has_liked', icon: 'heart', className, disabled: true }; + button.title = 'post.controls.has_liked'; + button.disabled = true; } + return button; }); registerButton('like-count', attrs => { diff --git a/app/assets/javascripts/discourse/widgets/post.js.es6 b/app/assets/javascripts/discourse/widgets/post.js.es6 index 26ed9f4e4b..c55a6f855b 100644 --- a/app/assets/javascripts/discourse/widgets/post.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post.js.es6 @@ -315,7 +315,7 @@ createWidget('post-article', { }, html(attrs, state) { - const rows = []; + const rows = [h('a.tabLoc')]; if (state.repliesAbove.length) { const replies = state.repliesAbove.map(p => this.attach('embedded-post', p, { state: { above: true } })); rows.push(h('div.row', h('section.embedded-posts.top.topic-body.offset2', replies))); From cd412976d75c726748196a20c1420db796c61fc0 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 8 Feb 2016 16:01:09 -0500 Subject: [PATCH 008/245] FIX: Bookmark by keyboard was broken --- .../discourse/lib/keyboard-shortcuts.js.es6 | 10 +++++++--- app/assets/javascripts/discourse/widgets/widget.js.es6 | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index ccb4bd0fda..968665045b 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -222,10 +222,14 @@ export default { // TODO: We should keep track of the post without a CSS class const selectedPostId = parseInt($('.topic-post.selected article.boxed').data('post-id'), 10); if (selectedPostId) { - const topicController = container.lookup('controller:topic'), - post = topicController.get('model.postStream.posts').findBy('id', selectedPostId); + const topicController = container.lookup('controller:topic'); + const post = topicController.get('model.postStream.posts').findBy('id', selectedPostId); if (post) { - topicController.send(action, post); + // TODO: Use ember closure actions + const result = topicController._actions[action].call(topicController, post); + if (result && result.then) { + this.appEvents.trigger('post-stream:refresh', selectedPostId) + } } } }, diff --git a/app/assets/javascripts/discourse/widgets/widget.js.es6 b/app/assets/javascripts/discourse/widgets/widget.js.es6 index aeff961925..9b1af297a1 100644 --- a/app/assets/javascripts/discourse/widgets/widget.js.es6 +++ b/app/assets/javascripts/discourse/widgets/widget.js.es6 @@ -170,6 +170,7 @@ export default class Widget { } if (target) { + // TODO: Use ember closure actions const actions = target._actions || target.actionHooks; const method = actions[actionName]; if (method) { From bd967ba38c4eeb8b80acccda10f0335b9d3741fb Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 13:45:59 -0500 Subject: [PATCH 009/245] FIX: Placeholders were missing when scrolling downwards --- .../discourse/controllers/topic.js.es6 | 2 ++ .../discourse/lib/keyboard-shortcuts.js.es6 | 2 +- .../discourse/templates/post-placeholder.hbs | 13 ------------- .../discourse/views/post-placeholder.js.es6 | 1 - .../discourse/widgets/post-placeholder.js.es6 | 17 +++++++++++++++++ .../discourse/widgets/post-stream.js.es6 | 7 +++++++ 6 files changed, 27 insertions(+), 15 deletions(-) delete mode 100644 app/assets/javascripts/discourse/templates/post-placeholder.hbs delete mode 100644 app/assets/javascripts/discourse/views/post-placeholder.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/post-placeholder.js.es6 diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index 8a7548bc05..2f1adf877f 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -144,6 +144,8 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { if (lastLoadedPost && lastLoadedPost === post) { postStream.appendMore().then(() => refresh()); + // show loading stuff + refresh(); } }, diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index 968665045b..c83d2f9cbc 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -228,7 +228,7 @@ export default { // TODO: Use ember closure actions const result = topicController._actions[action].call(topicController, post); if (result && result.then) { - this.appEvents.trigger('post-stream:refresh', selectedPostId) + this.appEvents.trigger('post-stream:refresh', selectedPostId); } } } diff --git a/app/assets/javascripts/discourse/templates/post-placeholder.hbs b/app/assets/javascripts/discourse/templates/post-placeholder.hbs deleted file mode 100644 index 936863f191..0000000000 --- a/app/assets/javascripts/discourse/templates/post-placeholder.hbs +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
-
- -
-
-
-
-
-
-
diff --git a/app/assets/javascripts/discourse/views/post-placeholder.js.es6 b/app/assets/javascripts/discourse/views/post-placeholder.js.es6 deleted file mode 100644 index d73c6ce754..0000000000 --- a/app/assets/javascripts/discourse/views/post-placeholder.js.es6 +++ /dev/null @@ -1 +0,0 @@ -export default Ember.View.extend({ templateName: 'post-placeholder' }); diff --git a/app/assets/javascripts/discourse/widgets/post-placeholder.js.es6 b/app/assets/javascripts/discourse/widgets/post-placeholder.js.es6 new file mode 100644 index 0000000000..f12fb26f34 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/post-placeholder.js.es6 @@ -0,0 +1,17 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; + +export default createWidget('post-placeholder', { + tagName: 'article.placeholder', + + html() { + return h('div.row', [ + h('div.topic-avatar', h('div.placeholder-avatar')), + h('div.topic-body', [ + h('div.placeholder-text'), + h('div.placeholder-text'), + h('div.placeholder-text') + ]) + ]); + } +}); diff --git a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 index f2d3b69d82..2dc7432d17 100644 --- a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 @@ -1,5 +1,6 @@ import { createWidget } from 'discourse/widgets/widget'; import transformPost from 'discourse/lib/transform-post'; +import { Placeholder } from 'discourse/lib/posts-with-placeholders'; const DAY = 1000 * 60 * 60 * 24; @@ -21,6 +22,12 @@ export default createWidget('post-stream', { for (let i=0; i Date: Tue, 9 Feb 2016 14:04:56 -0500 Subject: [PATCH 010/245] FIX: Small actions weren't showing the avatar of who did it --- .../javascripts/discourse/widgets/post-small-action.js.es6 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 index 699e97dd0d..3aaa48f0c3 100644 --- a/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-small-action.js.es6 @@ -3,6 +3,7 @@ import RawHtml from 'discourse/widgets/raw-html'; import { iconNode } from 'discourse/helpers/fa-icon'; import { h } from 'virtual-dom'; import { actionDescriptionHtml } from 'discourse/components/small-action'; +import { avatarFor } from 'discourse/widgets/post'; const icons = { 'closed.enabled': 'lock', @@ -44,6 +45,8 @@ export default createWidget('post-small-action', { })); } + contents.push(avatarFor.call(this, 'small', { template: attrs.avatar_template, username: attrs.avatar })); + const description = actionDescriptionHtml(attrs.actionCode, attrs.created_at, attrs.actionCodeWho); contents.push(new RawHtml({ html: `

${description}

` })); From 0b84426a3ae19bccb405a8c1e10c3dc1382dbfd9 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 14:15:34 -0500 Subject: [PATCH 011/245] FIX: Could like your own posts if they already had likes --- app/assets/javascripts/discourse/lib/transform-post.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/lib/transform-post.js.es6 b/app/assets/javascripts/discourse/lib/transform-post.js.es6 index 55ca190419..7cb3989697 100644 --- a/app/assets/javascripts/discourse/lib/transform-post.js.es6 +++ b/app/assets/javascripts/discourse/lib/transform-post.js.es6 @@ -172,9 +172,9 @@ export default function transformPost(currentUser, site, post, prevPost, nextPos const likeAction = post.likeAction; if (likeAction) { - postAtts.showLike = true; postAtts.liked = likeAction.acted; postAtts.canToggleLike = likeAction.get('canToggle'); + postAtts.showLike = postAtts.liked || postAtts.canToggleLike; postAtts.likeCount = likeAction.count; } From eeafa679844b86b1b4fa0935e8e37d13317dc0fa Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 14:23:12 -0500 Subject: [PATCH 012/245] FIX: Reply as New Topic was not fading in properly --- .../stylesheets/desktop/topic-post.scss | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index 0d4aa675d4..3c3db86001 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -34,16 +34,6 @@ h1 .topic-statuses .topic-status i { color: dark-light-choose(scale-color($primary, $lightness: 50%), scale-color($secondary, $lightness: 50%)); } - .gutter { - .reply-new { - .discourse-no-touch & { - opacity:0; - transition: opacity 0.7s ease-in-out; - } - .discourse-touch & {opacity: 1;} - } - } - .actions .fade-out { .discourse-no-touch & { opacity: 0.7; @@ -55,14 +45,25 @@ h1 .topic-statuses .topic-status i { &:hover .actions .fade-out, .selected .actions .fade-out { opacity: 1; } +} - &:hover .gutter, .selected .gutter { - .reply-new, - .track-link { - opacity:1; +.topic-post { + .gutter { + .reply-new { + .discourse-no-touch & { + opacity:0; + transition: opacity 0.7s ease-in-out; } + .discourse-touch & {opacity: 1;} + } } + &:hover .gutter, .selected .gutter { + .reply-new, + .track-link { + opacity:1; + } + } } section.post-menu-area { From 2998fe1ee5bd6e4de26ba41afe4b2aefa6cc2b15 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 14:42:20 -0500 Subject: [PATCH 013/245] FIX: Quoted text wasn't inserted when replying as new topic --- .../discourse/views/quote-button.js.es6 | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/views/quote-button.js.es6 b/app/assets/javascripts/discourse/views/quote-button.js.es6 index da9ba9040c..681523377b 100644 --- a/app/assets/javascripts/discourse/views/quote-button.js.es6 +++ b/app/assets/javascripts/discourse/views/quote-button.js.es6 @@ -1,3 +1,11 @@ +// we don't want to deselect when we click on buttons that use it +function ignoreElements(e) { + const $target = $(e.target); + return $target.hasClass('quote-button') || + $target.closest('.create').length || + $target.closest('.reply-new').length; +} + export default Ember.View.extend({ classNames: ['quote-button'], classNameBindings: ['visible'], @@ -45,11 +53,7 @@ export default Ember.View.extend({ .on("mousedown.quote-button", function(e) { view.set('isMouseDown', true); - const $target = $(e.target); - // we don't want to deselect when we click on buttons that use it - if ($target.hasClass('quote-button') || - $target.closest('.create').length || - $target.closest('.reply-new').length) return; + if (ignoreElements(e)) { return; } // deselects only when the user left click // (allows anyone to `extend` their selection using shift+click) @@ -58,6 +62,8 @@ export default Ember.View.extend({ !e.shiftKey) controller.deselectText(); }) .on('mouseup.quote-button', function(e) { + if (ignoreElements(e)) { return; } + view.selectText(e.target, controller); view.set('isMouseDown', false); }) From 9ec44f755c848c0affa1580738acf77677d54d5a Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 15:53:34 -0500 Subject: [PATCH 014/245] FIX: If last post was deleted the gap was not displayed --- .../discourse/components/scrolling-post-stream.js.es6 | 1 + app/assets/javascripts/discourse/models/post-stream.js.es6 | 1 + app/assets/javascripts/discourse/widgets/post-stream.js.es6 | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index 83cbcbebb2..42721e87b1 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -28,6 +28,7 @@ export default MountWidget.extend({ return this.getProperties('posts', 'canCreatePost', 'multiSelect', + 'gaps', 'selectedQuery', 'selectedPostsCount', 'searchService'); diff --git a/app/assets/javascripts/discourse/models/post-stream.js.es6 b/app/assets/javascripts/discourse/models/post-stream.js.es6 index 2b5136ccc4..b1a311bc8b 100644 --- a/app/assets/javascripts/discourse/models/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/post-stream.js.es6 @@ -280,6 +280,7 @@ export default RestModel.extend({ if (idx !== -1) { stream.pushObjects(gap); return this.appendMore().then(() => { + delete this.get('gaps.after')[postId]; this.get('stream').enumerableContentDidChange(); }); } diff --git a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 index 2dc7432d17..719384d1d2 100644 --- a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 @@ -15,7 +15,7 @@ export default createWidget('post-stream', { const result = []; const before = attrs.gaps && attrs.gaps.before ? attrs.gaps.before : {}; - const after = attrs.gaps && attrs.gaps.before ? attrs.gaps.after : {}; + const after = attrs.gaps && attrs.gaps.after ? attrs.gaps.after : {}; let prevPost; let prevDate; From 65d0426ff112bb6ce87b1f08d5e40f0f09bd7651 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 9 Feb 2016 17:45:32 -0500 Subject: [PATCH 015/245] FIX: Janky animations when liking or expanding the post menu --- .../components/scrolling-post-stream.js.es6 | 11 +++ .../discourse/widgets/button.js.es6 | 4 +- .../stylesheets/desktop/topic-post.scss | 95 +++++++++---------- 3 files changed, 60 insertions(+), 50 deletions(-) diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index 42721e87b1..4489e5aa65 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -130,6 +130,15 @@ export default MountWidget.extend({ $(window).bind('scroll.post-stream', debouncedScroll); this._scrollTriggered(); + this.$().on('mouseenter.post-stream', 'button.widget-button', e => { + $('button.widget-button').removeClass('d-hover'); + $(e.target).addClass('d-hover'); + }); + + this.$().on('mouseleave.post-stream', 'button.widget-button', () => { + $('button.widget-button').removeClass('d-hover'); + }); + this.appEvents.on('post-stream:refresh', postId => { if (postId) { keyDirty(`post-${postId}`); @@ -143,6 +152,8 @@ export default MountWidget.extend({ $(document).unbind('touchmove.post-stream'); $(window).unbind('scroll.post-stream'); this.appEvents.off('post-stream:refresh'); + this.$().off('mouseenter.post-stream'); + this.$().off('mouseleave.post-stream'); } }); diff --git a/app/assets/javascripts/discourse/widgets/button.js.es6 b/app/assets/javascripts/discourse/widgets/button.js.es6 index 278d00d243..5b4f6e1194 100644 --- a/app/assets/javascripts/discourse/widgets/button.js.es6 +++ b/app/assets/javascripts/discourse/widgets/button.js.es6 @@ -2,7 +2,7 @@ import { createWidget } from 'discourse/widgets/widget'; import { iconNode } from 'discourse/helpers/fa-icon'; export default createWidget('button', { - tagName: 'button', + tagName: 'button.widget-button', buildClasses() { if (this.attrs.className) { return this.attrs.className; } @@ -42,7 +42,7 @@ export default createWidget('button', { const attrs = this.attrs; if (attrs.disabled) { return; } - $(`button`).blur(); + $(`button.widget-button`).removeClass('d-hover').blur(); return this.sendWidgetAction(attrs.action); } }); diff --git a/app/assets/stylesheets/desktop/topic-post.scss b/app/assets/stylesheets/desktop/topic-post.scss index 3c3db86001..c1d6c9d198 100644 --- a/app/assets/stylesheets/desktop/topic-post.scss +++ b/app/assets/stylesheets/desktop/topic-post.scss @@ -139,65 +139,64 @@ nav.post-controls { background: transparent; border: none; margin-left: 3px; - transition: all linear 0.15s; - &:hover { - background: dark-light-diff($primary, $secondary, 90%, -60%); - color: $primary; - } + &.d-hover { + background: dark-light-diff($primary, $secondary, 90%, -60%); + color: $primary; + } - &:active { - box-shadow: inset 0 1px 3px rgba(0,0,0, .4); - } + &:active { + box-shadow: inset 0 1px 3px rgba(0,0,0, .4); + } - &.hidden { - display: none; - } - &.admin { - position: relative; - } + &.hidden { + display: none; + } + &.admin { + position: relative; + } - &.delete:hover { - background: $danger; - color: $secondary; - } + &.delete.d-hover { + background: $danger; + color: $secondary; + } - &.like:hover { - color: $love; - background: dark-light-diff($love, $secondary, 85%, -60%) - } + &.like.d-hover { + color: $love; + background: dark-light-diff($love, $secondary, 85%, -60%) + } - &.has-like {color: $love;} - &.has-like[disabled]:hover { - background: transparent; - } - &.has-like[disabled]:active { - box-shadow: none; - } + &.has-like {color: $love;} + &.has-like[disabled]:hover { + background: transparent; + } + &.has-like[disabled]:active { + box-shadow: none; + } - &.wikied { - color: green; - } + &.wikied { + color: green; + } - &.bookmark {padding: 8px 11px; } + &.bookmark {padding: 8px 11px; } - .read-icon { - &:before { - font-family: "FontAwesome"; - content: "\f02e"; - } - &.unseen { - &:before { - content: "\f097"; - } - } - &.bookmarked { - &:before { - color: $tertiary; - } - } + .read-icon { + &:before { + font-family: "FontAwesome"; + content: "\f02e"; + } + &.unseen { + &:before { + content: "\f097"; } } + &.bookmarked { + &:before { + color: $tertiary; + } + } + } + } .post-admin-menu { background-color: $secondary; From 9b60551d4ebb1669548879f059b3b2473ae76b54 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 10 Feb 2016 12:14:37 -0500 Subject: [PATCH 016/245] Upgrade jQuery --- app/assets/javascripts/env.js | 4 + app/views/layouts/application.html.erb | 5 + vendor/assets/javascripts/jquery.debug.js | 4548 ++++++++++++--------- vendor/assets/javascripts/jquery.prod.js | 8 +- 4 files changed, 2600 insertions(+), 1965 deletions(-) diff --git a/app/assets/javascripts/env.js b/app/assets/javascripts/env.js index e3035e2623..5537a6c10b 100644 --- a/app/assets/javascripts/env.js +++ b/app/assets/javascripts/env.js @@ -2,3 +2,7 @@ window.ENV = { }; window.Discourse = {}; Discourse.SiteSettings = {}; + +window.EmberENV = window.EmberENV || {}; +window.EmberENV['FORCE_JQUERY'] = true; + diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 4d6575b777..ff7d545b57 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -17,6 +17,11 @@ <%- end %> + + <%= script "preload_store" %> <%= script "locales/#{I18n.locale}" %> <%= script "ember_jquery" %> diff --git a/vendor/assets/javascripts/jquery.debug.js b/vendor/assets/javascripts/jquery.debug.js index 79d631ff46..1e0ba99740 100644 --- a/vendor/assets/javascripts/jquery.debug.js +++ b/vendor/assets/javascripts/jquery.debug.js @@ -1,15 +1,15 @@ /*! - * jQuery JavaScript Library v2.1.3 + * jQuery JavaScript Library v2.2.0 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2014-12-18T15:11Z + * Date: 2016-01-08T20:02Z */ (function( global, factory ) { @@ -41,10 +41,11 @@ // Can't be in strict mode, several libs including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) -// - +//"use strict"; var arr = []; +var document = window.document; + var slice = arr.slice; var concat = arr.concat; @@ -64,13 +65,11 @@ var support = {}; var - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - version = "2.1.3", + version = "2.2.0", // Define a local copy of jQuery jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); @@ -90,6 +89,7 @@ var }; jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used jquery: version, @@ -133,16 +133,14 @@ jQuery.fn = jQuery.prototype = { }, // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); + each: function( callback ) { + return jQuery.each( this, callback ); }, map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { return callback.call( elem, i, elem ); - })); + } ) ); }, slice: function() { @@ -160,11 +158,11 @@ jQuery.fn = jQuery.prototype = { eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); }, end: function() { - return this.prevObject || this.constructor(null); + return this.prevObject || this.constructor(); }, // For internal use only. @@ -176,7 +174,7 @@ jQuery.fn = jQuery.prototype = { jQuery.extend = jQuery.fn.extend = function() { var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, + target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; @@ -191,7 +189,7 @@ jQuery.extend = jQuery.fn.extend = function() { } // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } @@ -202,8 +200,10 @@ jQuery.extend = jQuery.fn.extend = function() { } for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { + if ( ( options = arguments[ i ] ) != null ) { + // Extend the base object for ( name in options ) { src = target[ name ]; @@ -215,13 +215,15 @@ jQuery.extend = jQuery.fn.extend = function() { } // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + if ( copyIsArray ) { copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; + clone = src && jQuery.isArray( src ) ? src : []; } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; + clone = src && jQuery.isPlainObject( src ) ? src : {}; } // Never move original objects, clone them @@ -239,7 +241,8 @@ jQuery.extend = jQuery.fn.extend = function() { return target; }; -jQuery.extend({ +jQuery.extend( { + // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), @@ -253,7 +256,7 @@ jQuery.extend({ noop: function() {}, isFunction: function( obj ) { - return jQuery.type(obj) === "function"; + return jQuery.type( obj ) === "function"; }, isArray: Array.isArray, @@ -263,14 +266,17 @@ jQuery.extend({ }, isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) - return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; }, isPlainObject: function( obj ) { + // Not plain objects: // - Any object or value whose internal [[Class]] property is not "[object Object]" // - DOM nodes @@ -301,9 +307,10 @@ jQuery.extend({ if ( obj == null ) { return obj + ""; } + // Support: Android<4.0, iOS<6 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : + class2type[ toString.call( obj ) ] || "object" : typeof obj; }, @@ -315,16 +322,19 @@ jQuery.extend({ code = jQuery.trim( code ); if ( code ) { + // If the code includes a valid, prologue position // strict mode pragma, execute code by injecting a // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); + if ( code.indexOf( "use strict" ) === 1 ) { + script = document.createElement( "script" ); script.text = code; document.head.appendChild( script ).parentNode.removeChild( script ); } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval + + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); } } @@ -341,49 +351,20 @@ jQuery.extend({ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); + each: function( obj, callback ) { + var length, i = 0; - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; } } - - // A special, fast, case for the most common use of each } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; } } } @@ -403,7 +384,7 @@ jQuery.extend({ var ret = results || []; if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { + if ( isArrayLike( Object( arr ) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr @@ -455,14 +436,13 @@ jQuery.extend({ // arg is for internal usage only map: function( elems, callback, arg ) { - var value, + var length, value, i = 0, - length = elems.length, - isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values - if ( isArray ) { + if ( isArrayLike( elems ) ) { + length = elems.length; for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); @@ -523,38 +503,50 @@ jQuery.extend({ // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support -}); +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} +/* jshint ignore: end */ // Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); +} ); -function isArraylike( obj ) { - var length = obj.length, +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } - if ( obj.nodeType === 1 && length ) { - return true; - } - return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.2.0-pre + * Sizzle CSS Selector Engine v2.2.1 * http://sizzlejs.com/ * - * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2014-12-16 + * Date: 2015-10-17 */ (function( window ) { @@ -622,25 +614,21 @@ var i, // Regular expressions - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", - pseudos = ":(" + characterEncoding + ")(?:\\((" + + pseudos = ":(" + identifier + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + @@ -663,9 +651,9 @@ var i, ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + @@ -743,103 +731,129 @@ try { } function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; - context = context || document; results = results || []; - nodeType = context.nodeType; + // Return early from calls with invalid selector or context if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } - if ( !seed && documentIsHTML ) { + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { - // Try to shortcut find operations when possible (e.g., not under DocumentFragment) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { results.push( elem ); return results; } - } else { - return results; } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType !== 1 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } } } } @@ -852,7 +866,7 @@ function Sizzle( selector, context, results, seed ) { /** * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * @returns {function(string, object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ @@ -907,7 +921,7 @@ function assert( fn ) { */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), - i = attrs.length; + i = arr.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; @@ -1020,33 +1034,29 @@ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc; - // If no document and documentElement is available, return + // Return early if doc is invalid or already selected if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } - // Set our document + // Update global variables document = doc; - docElem = doc.documentElement; - parent = doc.defaultView; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", unloadHandler ); } } - /* Support tests - ---------------------------------------------------------------------- */ - documentIsHTML = !isXML( doc ); - /* Attributes ---------------------------------------------------------------------- */ @@ -1063,12 +1073,12 @@ setDocument = Sizzle.setDocument = function( node ) { // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); + div.appendChild( document.createComment("") ); return !div.getElementsByTagName("*").length; }); // Support: IE<9 - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name @@ -1076,7 +1086,7 @@ setDocument = Sizzle.setDocument = function( node ) { // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + return !document.getElementsByName || !document.getElementsByName( expando ).length; }); // ID find and filter @@ -1084,9 +1094,7 @@ setDocument = Sizzle.setDocument = function( node ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [ m ] : []; + return m ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { @@ -1103,7 +1111,8 @@ setDocument = Sizzle.setDocument = function( node ) { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); return node && node.value === attrId; }; }; @@ -1143,7 +1152,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( documentIsHTML ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } }; @@ -1163,7 +1172,7 @@ setDocument = Sizzle.setDocument = function( node ) { // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { @@ -1173,7 +1182,7 @@ setDocument = Sizzle.setDocument = function( node ) { // since its presence should be enough // http://bugs.jquery.com/ticket/12359 docElem.appendChild( div ).innerHTML = "" + - "" + ""; // Support: IE8, Opera 11-12.16 @@ -1190,7 +1199,7 @@ setDocument = Sizzle.setDocument = function( node ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } - // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } @@ -1213,7 +1222,7 @@ setDocument = Sizzle.setDocument = function( node ) { assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); + var input = document.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" ); @@ -1261,7 +1270,7 @@ setDocument = Sizzle.setDocument = function( node ) { hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another - // Purposefully does not implement inclusive descendent + // Purposefully self-exclusive // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { @@ -1315,10 +1324,10 @@ setDocument = Sizzle.setDocument = function( node ) { (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } @@ -1346,8 +1355,8 @@ setDocument = Sizzle.setDocument = function( node ) { // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : + return a === document ? -1 : + b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? @@ -1384,7 +1393,7 @@ setDocument = Sizzle.setDocument = function( node ) { 0; }; - return doc; + return document; }; Sizzle.matches = function( expr, elements ) { @@ -1401,6 +1410,7 @@ Sizzle.matchesSelector = function( elem, expr ) { expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { @@ -1674,11 +1684,12 @@ Expr = Sizzle.selectors = { } : function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, + var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; + useCache = !xml && !ofType, + diff = false; if ( parent ) { @@ -1687,7 +1698,10 @@ Expr = Sizzle.selectors = { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + return false; } } @@ -1701,11 +1715,21 @@ Expr = Sizzle.selectors = { // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { + // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || @@ -1715,29 +1739,55 @@ Expr = Sizzle.selectors = { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); - if ( node === elem ) { - break; + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } } } } @@ -2099,10 +2149,10 @@ function addCombinator( matcher, combinator, base ) { // Check against all ancestor/preceding elements function( elem, context, xml ) { - var oldCache, outerCache, + var oldCache, uniqueCache, outerCache, newCache = [ dirruns, doneName ]; - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { @@ -2115,14 +2165,19 @@ function addCombinator( matcher, combinator, base ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; + uniqueCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { @@ -2347,18 +2402,21 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { len = elems.length; if ( outermost ) { - outermostContext = context !== document && context; + outermostContext = context === document || context || outermost; } // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { + if ( matcher( elem, context || document, xml) ) { results.push( elem ); break; } @@ -2382,8 +2440,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { } } - // Apply set filters to unmatched elements + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { @@ -2475,10 +2542,11 @@ select = Sizzle.select = function( selector, context, results, seed ) { results = results || []; - // Try to minimize operations if there is no seed and only one group + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) if ( match.length === 1 ) { - // Take a shortcut and set the context if the root selector is an ID + // Reduce context if the leading compound selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && @@ -2533,7 +2601,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { context, !documentIsHTML, results, - rsibling.test( selector ) && testContext( context.parentNode ) || context + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; @@ -2609,17 +2677,46 @@ return Sizzle; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + var rneedsContext = jQuery.expr.match.needsContext; -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); @@ -2631,14 +2728,14 @@ function winnow( elements, qualifier, not ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; - }); + } ); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; - }); + } ); } @@ -2651,8 +2748,8 @@ function winnow( elements, qualifier, not ) { } return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); } jQuery.filter = function( expr, elems, not ) { @@ -2666,10 +2763,10 @@ jQuery.filter = function( expr, elems, not ) { jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; - })); + } ) ); }; -jQuery.fn.extend({ +jQuery.fn.extend( { find: function( selector ) { var i, len = this.length, @@ -2677,13 +2774,13 @@ jQuery.fn.extend({ self = this; if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { + return this.pushStack( jQuery( selector ).filter( function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } - }) ); + } ) ); } for ( i = 0; i < len; i++ ) { @@ -2696,10 +2793,10 @@ jQuery.fn.extend({ return ret; }, filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); + return this.pushStack( winnow( this, selector || [], false ) ); }, not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); + return this.pushStack( winnow( this, selector || [], true ) ); }, is: function( selector ) { return !!winnow( @@ -2713,7 +2810,7 @@ jQuery.fn.extend({ false ).length; } -}); +} ); // Initialize a jQuery object @@ -2727,7 +2824,7 @@ var rootjQuery, // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - init = jQuery.fn.init = function( selector, context ) { + init = jQuery.fn.init = function( selector, context, root ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) @@ -2735,9 +2832,16 @@ var rootjQuery, return this; } + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + // Handle HTML strings if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; @@ -2746,23 +2850,24 @@ var rootjQuery, } // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { + if ( match && ( match[ 1 ] || !context ) ) { // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( - match[1], + match[ 1 ], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { + // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); @@ -2778,14 +2883,15 @@ var rootjQuery, // HANDLE: $(#id) } else { - elem = document.getElementById( match[2] ); + elem = document.getElementById( match[ 2 ] ); // Support: Blackberry 4.6 // gEBID returns nodes no longer in the document (#6963) if ( elem && elem.parentNode ) { + // Inject the element directly into the jQuery object this.length = 1; - this[0] = elem; + this[ 0 ] = elem; } this.context = document; @@ -2795,7 +2901,7 @@ var rootjQuery, // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); + return ( context || root ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) @@ -2805,15 +2911,16 @@ var rootjQuery, // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { - this.context = this[0] = selector; + this.context = this[ 0 ] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : + return root.ready !== undefined ? + root.ready( selector ) : + // Execute immediately if ready is not present selector( jQuery ); } @@ -2834,6 +2941,7 @@ rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, + // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, @@ -2842,48 +2950,19 @@ var rparentsprev = /^(?:parents|prev(?:Until|All))/, prev: true }; -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ +jQuery.fn.extend( { has: function( target ) { var targets = jQuery( target, this ), l = targets.length; - return this.filter(function() { + return this.filter( function() { var i = 0; for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { + if ( jQuery.contains( this, targets[ i ] ) ) { return true; } } - }); + } ); }, closest: function( selectors, context ) { @@ -2896,14 +2975,15 @@ jQuery.fn.extend({ 0; for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { + jQuery.find.matchesSelector( cur, selectors ) ) ) { matched.push( cur ); break; @@ -2911,7 +2991,7 @@ jQuery.fn.extend({ } } - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); }, // Determine the position of an element within the set @@ -2937,7 +3017,7 @@ jQuery.fn.extend({ add: function( selector, context ) { return this.pushStack( - jQuery.unique( + jQuery.uniqueSort( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); @@ -2945,26 +3025,26 @@ jQuery.fn.extend({ addBack: function( selector ) { return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) + this.prevObject : this.prevObject.filter( selector ) ); } -}); +} ); function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} return cur; } -jQuery.each({ +jQuery.each( { parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); + return dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); + return dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); @@ -2973,22 +3053,22 @@ jQuery.each({ return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); + return dir( elem, "nextSibling" ); }, prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); + return dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); + return dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); + return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + return siblings( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { - return jQuery.sibling( elem.firstChild ); + return siblings( elem.firstChild ); }, contents: function( elem ) { return elem.contentDocument || jQuery.merge( [], elem.childNodes ); @@ -3006,9 +3086,10 @@ jQuery.each({ } if ( this.length > 1 ) { + // Remove duplicates if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); + jQuery.uniqueSort( matched ); } // Reverse order for parents* and prev-derivatives @@ -3019,20 +3100,17 @@ jQuery.each({ return this.pushStack( matched ); }; -}); -var rnotwhite = (/\S+/g); +} ); +var rnotwhite = ( /\S+/g ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache +// Convert String-formatted options into Object-formatted ones function createOptions( options ) { - var object = optionsCache[ options ] = {}; + var object = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; - }); + } ); return object; } @@ -3063,156 +3141,186 @@ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : + createOptions( options ) : jQuery.extend( {}, options ); - var // Last fire value (for non-forgettable lists) + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists memory, + // Flag to know if list was already fired fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, + + // Flag to prevent firing + locked, + // Actual callback list list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } } } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { list = []; + + // Otherwise, this object is spent } else { - self.disable(); + list = ""; } } }, + // Actual Callbacks object self = { + // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { + if ( jQuery.isFunction( arg ) ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } - } else if ( arg && arg.length && type !== "string" ) { + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + // Inspect recursively add( arg ); } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); } } return this; }, + // Remove a callback from the list remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; } - }); - } + } + } ); return this; }, + // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; }, + // Remove all callbacks from the list empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); + if ( list ) { + list = []; } return this; }, - // Is it locked? - locked: function() { - return !stack; + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + // Call all callbacks with the given context and arguments fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { + if ( !locked ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); + queue.push( args ); + if ( !firing ) { + fire(); } } return this; }, + // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, + // To know if the callbacks have already been called at least once fired: function() { return !!fired; @@ -3223,14 +3331,15 @@ jQuery.Callbacks = function( options ) { }; -jQuery.extend({ +jQuery.extend( { Deferred: function( func ) { var tuples = [ + // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] ], state = "pending", promise = { @@ -3243,25 +3352,30 @@ jQuery.extend({ }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; - return jQuery.Deferred(function( newDefer ) { + return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { + deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() + .progress( newDefer.notify ) .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); + .fail( newDefer.reject ); } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); } - }); - }); + } ); + } ); fns = null; - }).promise(); + } ).promise(); }, + // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { @@ -3279,11 +3393,12 @@ jQuery.extend({ stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; + promise[ tuple[ 1 ] ] = list.add; // Handle state if ( stateString ) { - list.add(function() { + list.add( function() { + // state = [ resolved | rejected ] state = stateString; @@ -3292,12 +3407,12 @@ jQuery.extend({ } // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); // Make the deferred a promise promise.promise( deferred ); @@ -3318,9 +3433,11 @@ jQuery.extend({ length = resolveValues.length, // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values @@ -3346,9 +3463,9 @@ jQuery.extend({ for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); + .fail( deferred.reject ); } else { --remaining; } @@ -3362,20 +3479,22 @@ jQuery.extend({ return deferred.promise(); } -}); +} ); // The deferred used on DOM ready var readyList; jQuery.fn.ready = function( fn ) { + // Add the callback jQuery.ready.promise().done( fn ); return this; }; -jQuery.extend({ +jQuery.extend( { + // Is the DOM ready to be used? Set to true once it occurs. isReady: false, @@ -3417,14 +3536,14 @@ jQuery.extend({ jQuery( document ).off( "ready" ); } } -}); +} ); /** * The ready event handler and self cleanup method */ function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); jQuery.ready(); } @@ -3433,20 +3552,23 @@ jQuery.ready.promise = function( obj ) { readyList = jQuery.Deferred(); - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // We once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE9-10 only + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); + window.setTimeout( jQuery.ready ); } else { // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); + document.addEventListener( "DOMContentLoaded", completed ); // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); + window.addEventListener( "load", completed ); } } return readyList.promise( obj ); @@ -3460,7 +3582,7 @@ jQuery.ready.promise(); // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, len = elems.length, bulk = key == null; @@ -3469,7 +3591,7 @@ var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGe if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + access( elems, fn, i, key[ i ], true, emptyGet, raw ); } // Sets one value @@ -3481,6 +3603,7 @@ var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGe } if ( bulk ) { + // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); @@ -3497,7 +3620,11 @@ var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGe if ( fn ) { for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); } } } @@ -3508,14 +3635,10 @@ var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGe // Gets bulk ? fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; + len ? fn( elems[ 0 ], key ) : emptyGet; }; +var acceptData = function( owner ) { - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { // Accepts only: // - Node // - Node.ELEMENT_NODE @@ -3527,66 +3650,79 @@ jQuery.acceptData = function( owner ) { }; -function Data() { - // Support: Android<4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); + +function Data() { this.expando = jQuery.expando + Data.uid++; } Data.uid = 1; -Data.accepts = jQuery.acceptData; Data.prototype = { - key: function( owner ) { + + register: function( owner, initial ) { + var value = initial || {}; + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable, non-writable property + // configurability must be true to allow the property to be + // deleted with the delete operator + } else { + Object.defineProperty( owner, this.expando, { + value: value, + writable: true, + configurable: true + } ); + } + return owner[ this.expando ]; + }, + cache: function( owner ) { + // We can accept data for non-element nodes in modern browsers, // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; + // Always return an empty object. + if ( !acceptData( owner ) ) { + return {}; } - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; + // Check if the owner object already has a cache + var value = owner[ this.expando ]; // If not, create one - if ( !unlock ) { - unlock = Data.uid++; + if ( !value ) { + value = {}; - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { - // Support: Android<4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } } } - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; + return value; }, set: function( owner, data, value ) { var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; + cache = this.cache( owner ); // Handle: [ owner, key, value ] args if ( typeof data === "string" ) { @@ -3594,30 +3730,22 @@ Data.prototype = { // Handle: [ owner, { properties } ] args } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ prop ] = data[ prop ]; } } return cache; }, get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - return key === undefined ? - cache : cache[ key ]; + this.cache( owner ) : + owner[ this.expando ] && owner[ this.expando ][ key ]; }, access: function( owner, key, value ) { var stored; + // In cases where either: // // 1. No key was specified @@ -3630,15 +3758,15 @@ Data.prototype = { // 2. The data stored at the key // if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { + ( ( key && typeof key === "string" ) && value === undefined ) ) { stored = this.get( owner, key ); return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); + stored : this.get( owner, jQuery.camelCase( key ) ); } - // [*]When the key is not a string, or both a key and value + // When the key is not a string, or both a key and value // are specified, set or extend (existing objects) with either: // // 1. An object of properties @@ -3652,15 +3780,20 @@ Data.prototype = { }, remove: function( owner, key ) { var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } if ( key === undefined ) { - this.cache[ unlock ] = {}; + this.register( owner ); } else { + // Support array or space separated string of keys if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. @@ -3670,10 +3803,12 @@ Data.prototype = { name = key.concat( key.map( jQuery.camelCase ) ); } else { camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation if ( key in cache ) { name = [ key, camel ]; } else { + // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace name = camel; @@ -3683,25 +3818,34 @@ Data.prototype = { } i = name.length; + while ( i-- ) { delete cache[ name[ i ] ]; } } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <= 35-45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } }, hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); } }; -var data_priv = new Data(); +var dataPriv = new Data(); -var data_user = new Data(); +var dataUser = new Data(); @@ -3716,7 +3860,7 @@ var data_user = new Data(); // 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; + rmultiDash = /[A-Z]/g; function dataAttr( elem, key, data ) { var name; @@ -3724,7 +3868,7 @@ function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { @@ -3732,14 +3876,15 @@ function dataAttr( elem, key, data ) { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : + // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; - } catch( e ) {} + } catch ( e ) {} // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); + dataUser.set( elem, key, data ); } else { data = undefined; } @@ -3747,31 +3892,31 @@ function dataAttr( elem, key, data ) { return data; } -jQuery.extend({ +jQuery.extend( { hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); }, data: function( elem, name, data ) { - return data_user.access( elem, name, data ); + return dataUser.access( elem, name, data ); }, removeData: function( elem, name ) { - data_user.remove( elem, name ); + dataUser.remove( elem, name ); }, // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. + // with direct calls to dataPriv methods, these can be deprecated. _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); + return dataPriv.access( elem, name, data ); }, _removeData: function( elem, name ) { - data_priv.remove( elem, name ); + dataPriv.remove( elem, name ); } -}); +} ); -jQuery.fn.extend({ +jQuery.fn.extend( { data: function( key, value ) { var i, name, data, elem = this[ 0 ], @@ -3780,9 +3925,9 @@ jQuery.fn.extend({ // Gets all values if ( key === undefined ) { if ( this.length ) { - data = data_user.get( elem ); + data = dataUser.get( elem ); - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { @@ -3791,12 +3936,12 @@ jQuery.fn.extend({ if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); + name = jQuery.camelCase( name.slice( 5 ) ); dataAttr( elem, name, data[ name ] ); } } } - data_priv.set( elem, "hasDataAttrs", true ); + dataPriv.set( elem, "hasDataAttrs", true ); } } @@ -3805,14 +3950,13 @@ jQuery.fn.extend({ // Sets multiple values if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); + return this.each( function() { + dataUser.set( this, key ); + } ); } return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); + var data, camelKey; // The calling jQuery object (element matches) is not empty // (and therefore has an element appears at this[ 0 ]) and the @@ -3820,16 +3964,24 @@ jQuery.fn.extend({ // will result in `undefined` for elem = this[ 0 ] which will // throw an exception if an attempt to read a data cache is made. if ( elem && value === undefined ) { + // Attempt to get data from the cache // with the key as-is - data = data_user.get( elem, key ); + data = dataUser.get( elem, key ) || + + // Try to find dashed key if it exists (gh-2779) + // This is for 2.2.x only + dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() ); + if ( data !== undefined ) { return data; } + camelKey = jQuery.camelCase( key ); + // Attempt to get data from the cache // with the key camelized - data = data_user.get( elem, camelKey ); + data = dataUser.get( elem, camelKey ); if ( data !== undefined ) { return data; } @@ -3846,46 +3998,48 @@ jQuery.fn.extend({ } // Set the data... - this.each(function() { + camelKey = jQuery.camelCase( key ); + this.each( function() { + // First, attempt to store a copy or reference of any // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); + var data = dataUser.get( this, camelKey ); // For HTML5 data-* attribute interop, we have to // store property names with dashes in a camelCase form. // This might not apply to all properties...* - data_user.set( this, camelKey, value ); + dataUser.set( this, camelKey, value ); // *... In the case of properties that might _actually_ // have dashes, we need to also store a copy of that // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); + if ( key.indexOf( "-" ) > -1 && data !== undefined ) { + dataUser.set( this, key, value ); } - }); + } ); }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); + return this.each( function() { + dataUser.remove( this, key ); + } ); } -}); +} ); -jQuery.extend({ +jQuery.extend( { queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); + queue = dataPriv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); } else { queue.push( data ); } @@ -3932,15 +4086,15 @@ jQuery.extend({ // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); } -}); +} ); -jQuery.fn.extend({ +jQuery.fn.extend( { queue: function( type, data ) { var setter = 2; @@ -3951,30 +4105,31 @@ jQuery.fn.extend({ } if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); + return jQuery.queue( this[ 0 ], type ); } return data === undefined ? this : - this.each(function() { + this.each( function() { var queue = jQuery.queue( this, type, data ); // Ensure a hooks for this queue jQuery._queueHooks( this, type ); - if ( type === "fx" && queue[0] !== "inprogress" ) { + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { jQuery.dequeue( this, type ); } - }); + } ); }, dequeue: function( type ) { - return this.each(function() { + return this.each( function() { jQuery.dequeue( this, type ); - }); + } ); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, + // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { @@ -3996,7 +4151,7 @@ jQuery.fn.extend({ type = type || "fx"; while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); @@ -4005,28 +4160,243 @@ jQuery.fn.extend({ resolve(); return defer.promise( obj ); } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHidden = function( elem, el ) { + // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); }; -var rcheckableType = (/^(?:checkbox|radio)$/i); + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); -(function() { +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE9 + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +// Support: IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE9-11+ + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + []; + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { var fragment = document.createDocumentFragment(), div = fragment.appendChild( document.createElement( "div" ) ), input = document.createElement( "input" ); - // Support: Safari<=5.1 + // Support: Android 4.0-4.3, Safari<=5.1 // Check state lost if the name is set (#11217) // Support: Windows Web Apps (WWA) // `name` and `type` must use .setAttribute for WWA (#14901) @@ -4044,19 +4414,13 @@ var rcheckableType = (/^(?:checkbox|radio)$/i); // Make sure textarea (and checkbox) defaultValue is properly cloned div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; +} )(); var rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; function returnTrue() { return true; @@ -4066,12 +4430,75 @@ function returnFalse() { return false; } +// Support: IE9 +// See #13393 for more info function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. @@ -4085,7 +4512,7 @@ jQuery.event = { var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); + elemData = dataPriv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { @@ -4105,14 +4532,15 @@ jQuery.event = { } // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { + if ( !( events = elemData.events ) ) { events = elemData.events = {}; } - if ( !(eventHandle = elemData.handle) ) { + if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; } @@ -4121,9 +4549,9 @@ jQuery.event = { types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { @@ -4140,7 +4568,7 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers - handleObj = jQuery.extend({ + handleObj = jQuery.extend( { type: type, origType: origType, data: data, @@ -4148,18 +4576,20 @@ jQuery.event = { guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") + namespace: namespaces.join( "." ) }, handleObjIn ); // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { + if ( !( handlers = events[ type ] ) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); + elem.addEventListener( type, eventHandle ); } } } @@ -4191,9 +4621,9 @@ jQuery.event = { var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - if ( !elemData || !(events = elemData.events) ) { + if ( !elemData || !( events = elemData.events ) ) { return; } @@ -4201,9 +4631,9 @@ jQuery.event = { types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { @@ -4216,7 +4646,8 @@ jQuery.event = { special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; @@ -4226,7 +4657,8 @@ jQuery.event = { if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { @@ -4241,7 +4673,9 @@ jQuery.event = { // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); } @@ -4249,145 +4683,12 @@ jQuery.event = { } } - // Remove the expando if it's no longer used + // Remove data and the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); + dataPriv.remove( elem, "handle events" ); } }, - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - dispatch: function( event ) { // Make a writable jQuery.Event from the native event object @@ -4396,11 +4697,11 @@ jQuery.event = { var i, j, ret, matched, handleObj, handlerQueue = [], args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; + args[ 0 ] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired @@ -4413,24 +4714,25 @@ jQuery.event = { // Run delegates first; they may want to stop propagation beneath us i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or 2) have namespace(s) // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { + if ( ( event.result = ret ) === false ) { event.preventDefault(); event.stopPropagation(); } @@ -4453,15 +4755,20 @@ jQuery.event = { delegateCount = handlers.delegateCount, cur = event.target; + // Support (at least): Chrome, IE9 // Find delegate handlers // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { for ( ; cur !== this; cur = cur.parentNode || this ) { + // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; @@ -4471,7 +4778,7 @@ jQuery.event = { if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : + jQuery( sel, this ).index( cur ) > -1 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { @@ -4479,7 +4786,7 @@ jQuery.event = { } } if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); + handlerQueue.push( { elem: cur, handlers: matches } ); } } } @@ -4487,19 +4794,20 @@ jQuery.event = { // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); } return handlerQueue; }, // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), fixHooks: {}, keyHooks: { - props: "char charCode key keyCode".split(" "), + props: "char charCode key keyCode".split( " " ), filter: function( event, original ) { // Add which for key events @@ -4512,7 +4820,8 @@ jQuery.event = { }, mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " + + "screenX screenY toElement" ).split( " " ), filter: function( event, original ) { var eventDoc, doc, body, button = original.button; @@ -4523,8 +4832,12 @@ jQuery.event = { doc = eventDoc.documentElement; body = eventDoc.body; - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add which for click: 1 === left; 2 === middle; 3 === right @@ -4581,10 +4894,12 @@ jQuery.event = { special: { load: { + // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { + // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { @@ -4604,6 +4919,7 @@ jQuery.event = { delegateType: "focusout" }, click: { + // For checkbox, fire native event so checked state will be right trigger: function() { if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { @@ -4628,41 +4944,21 @@ jQuery.event = { } } } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } } }; jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); + elem.removeEventListener( type, handle ); } }; jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { + if ( !( this instanceof jQuery.Event ) ) { return new jQuery.Event( src, props ); } @@ -4675,6 +4971,7 @@ jQuery.Event = function( src, props ) { // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && + // Support: Android<4.0 src.returnValue === false ? returnTrue : @@ -4700,6 +4997,7 @@ jQuery.Event = function( src, props ) { // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { + constructor: jQuery.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, @@ -4709,7 +5007,7 @@ jQuery.Event.prototype = { this.isDefaultPrevented = returnTrue; - if ( e && e.preventDefault ) { + if ( e ) { e.preventDefault(); } }, @@ -4718,7 +5016,7 @@ jQuery.Event.prototype = { this.isPropagationStopped = returnTrue; - if ( e && e.stopPropagation ) { + if ( e ) { e.stopPropagation(); } }, @@ -4727,7 +5025,7 @@ jQuery.Event.prototype = { this.isImmediatePropagationStopped = returnTrue; - if ( e && e.stopImmediatePropagation ) { + if ( e ) { e.stopImmediatePropagation(); } @@ -4736,8 +5034,14 @@ jQuery.Event.prototype = { }; // Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", @@ -4753,9 +5057,9 @@ jQuery.each({ related = event.relatedTarget, handleObj = event.handleObj; - // For mousenter/leave call the handler if related is outside the target. + // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; @@ -4763,115 +5067,32 @@ jQuery.each({ return ret; } }; -}); +} ); -// Support: Firefox, Chrome, Safari -// Create "bubbling" focus and blur events -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); +jQuery.fn.extend( { + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); }, one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); + return on( this, types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { + // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); @@ -4879,6 +5100,7 @@ jQuery.fn.extend({ return this; } if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) fn = selector; selector = undefined; @@ -4886,70 +5108,39 @@ jQuery.fn.extend({ if ( fn === false ) { fn = returnFalse; } - return this.each(function() { + return this.each( function() { jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } + } ); } -}); +} ); var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + rcleanScript = /^\s*\s*$/g; - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + if ( jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; + return elem.getElementsByTagName( "tbody" )[ 0 ] || elem; + } + + return elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; return elem; } function restoreScript( elem ) { @@ -4958,24 +5149,12 @@ function restoreScript( elem ) { if ( match ) { elem.type = match[ 1 ]; } else { - elem.removeAttribute("type"); + elem.removeAttribute( "type" ); } return elem; } -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - function cloneCopyEvent( src, dest ) { var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; @@ -4984,9 +5163,9 @@ function cloneCopyEvent( src, dest ) { } // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); events = pdataOld.events; if ( events ) { @@ -5002,24 +5181,14 @@ function cloneCopyEvent( src, dest ) { } // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); udataCur = jQuery.extend( {}, udataOld ); - data_user.set( dest, udataCur ); + dataUser.set( dest, udataCur ); } } -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - // Fix IE bugs, see support tests function fixInput( src, dest ) { var nodeName = dest.nodeName.toLowerCase(); @@ -5034,7 +5203,122 @@ function fixInput( src, dest ) { } } -jQuery.extend({ +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + clone: function( elem, dataAndEvents, deepDataAndEvents ) { var i, l, srcElements, destElements, clone = elem.cloneNode( true ), @@ -5077,102 +5361,14 @@ jQuery.extend({ return clone; }, - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit, PhantomJS - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - cleanData: function( elems ) { - var data, elem, type, key, + var data, elem, type, special = jQuery.event.special, i = 0; - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { @@ -5184,91 +5380,86 @@ jQuery.extend({ } } } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <= 35-45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; } } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; } } -}); +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, -jQuery.fn.extend({ text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : - this.empty().each(function() { + this.empty().each( function() { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { this.textContent = value; } - }); + } ); }, null, value, arguments.length ); }, append: function() { - return this.domManip( arguments, function( elem ) { + return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } - }); + } ); }, prepend: function() { - return this.domManip( arguments, function( elem ) { + return domManip( this, arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } - }); + } ); }, before: function() { - return this.domManip( arguments, function( elem ) { + return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } - }); + } ); }, after: function() { - return this.domManip( arguments, function( elem ) { + return domManip( this, arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; + } ); }, empty: function() { var elem, i = 0; - for ( ; (elem = this[i]) != null; i++ ) { + for ( ; ( elem = this[ i ] ) != null; i++ ) { if ( elem.nodeType === 1 ) { // Prevent memory leaks @@ -5286,9 +5477,9 @@ jQuery.fn.extend({ dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - return this.map(function() { + return this.map( function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); + } ); }, html: function( value ) { @@ -5305,7 +5496,7 @@ jQuery.fn.extend({ if ( typeof value === "string" && !rnoInnerhtml.test( value ) && !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - value = value.replace( rxhtmlTag, "<$1>" ); + value = jQuery.htmlPrefilter( value ); try { for ( ; i < l; i++ ) { @@ -5321,7 +5512,7 @@ jQuery.fn.extend({ elem = 0; // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} + } catch ( e ) {} } if ( elem ) { @@ -5331,115 +5522,25 @@ jQuery.fn.extend({ }, replaceWith: function() { - var arg = arguments[ 0 ]; + var ignored = []; - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); } } - } - return this; + // Force callback invocation + }, ignored ); } -}); +} ); -jQuery.each({ +jQuery.each( { appendTo: "append", prependTo: "prepend", insertBefore: "before", @@ -5464,28 +5565,29 @@ jQuery.each({ return this.pushStack( ret ); }; -}); +} ); var iframe, - elemdisplay = {}; + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ + // Called only from within defaultDisplay function actualDisplay( name, doc ) { - var style, - elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - - // Use of this method is a temporary fix (more like optimization) until something better comes along, - // since it was removed from specification and supported only in FF - style.display : jQuery.css( elem[ 0 ], "display" ); + display = jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element @@ -5509,7 +5611,8 @@ function defaultDisplay( nodeName ) { if ( display === "none" || !display ) { // Use the already-created iframe if possible - iframe = (iframe || jQuery( "') .addClass('lazyYT-video-loaded'); } + + if (settings.onPlay) { + settings.onPlay(e, $el); + } }); } @@ -122,4 +130,4 @@ }); }; -}(jQuery)); +})(jQuery); From be5a54d67dd4b46f86183682e3d2bcadebeb12da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Mon, 29 Feb 2016 22:39:24 +0100 Subject: [PATCH 177/245] FEATURE: new 'allow_all_attachments_for_group_messages' site setting --- app/models/upload.rb | 11 ++++++-- config/locales/server.en.yml | 2 ++ config/site_settings.yml | 2 +- lib/email/receiver.rb | 25 +++++++++++++++--- lib/validators/upload_validator.rb | 2 ++ spec/components/email/receiver_spec.rb | 6 +++++ spec/fixtures/emails/attached_rb_file.eml | 31 +++++++++++++++++++++++ 7 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 spec/fixtures/emails/attached_rb_file.eml diff --git a/app/models/upload.rb b/app/models/upload.rb index 060cf187ab..8d2c0ffeb9 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -14,6 +14,8 @@ class Upload < ActiveRecord::Base has_many :optimized_images, dependent: :destroy + attr_accessor :is_attachment_for_group_message + validates_presence_of :filesize validates_presence_of :original_filename @@ -62,8 +64,9 @@ class Upload < ActiveRecord::Base # options # - content_type - # - origin - # - image_type + # - origin (url) + # - image_type ("avatar", "profile_background", "card_background") + # - is_attachment_for_group_message (boolean) def self.create_for(user_id, file, filename, filesize, options = {}) DistributedMutex.synchronize("upload_#{user_id}_#{filename}") do # do some work on images @@ -141,6 +144,10 @@ class Upload < ActiveRecord::Base upload.height = height upload.origin = options[:origin][0...1000] if options[:origin] + if options[:is_attachment_for_group_message] + upload.is_attachment_for_group_message = true + end + if is_dimensionless_image?(filename, upload.width, upload.height) upload.errors.add(:base, I18n.t("upload.images.size_not_found")) return upload diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 1a4fa4ec2a..093fd5449a 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1001,6 +1001,8 @@ en: default_opengraph_image_url: "URL of the default opengraph image." + allow_all_attachments_for_group_messages: "Allow all email attachments for group messages." + enable_flash_video_onebox: "Enable embedding of swf and flv (Adobe Flash) links in oneboxes. WARNING: may introduce security risks." default_invitee_trust_level: "Default trust level (0-4) for invited users." diff --git a/config/site_settings.yml b/config/site_settings.yml index 9657a80997..15e68c3070 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -617,8 +617,8 @@ files: client: true regex: '^((https?:)?\/)?\/.+[^\/]' shadowed_by_global: true - default_opengraph_image_url: '' + allow_all_attachments_for_group_messages: false trust: default_trust_level: diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb index f094631da2..fa7f81b912 100644 --- a/lib/email/receiver.rb +++ b/lib/email/receiver.rb @@ -72,20 +72,35 @@ module Email case destination[:type] when :group group = destination[:obj] - create_topic(user: user, raw: body, title: subject, archetype: Archetype.private_message, target_group_names: [group.name], skip_validations: true) + create_topic(user: user, + raw: body, + title: subject, + archetype: Archetype.private_message, + target_group_names: [group.name], + is_group_message: true, + skip_validations: true) + when :category category = destination[:obj] raise StrangersNotAllowedError if user.staged? && !category.email_in_allow_strangers raise InsufficientTrustLevelError if !user.has_trust_level?(SiteSetting.email_in_min_trust) - create_topic(user: user, raw: body, title: subject, category: category.id, skip_validations: user.staged?) + create_topic(user: user, + raw: body, + title: subject, + category: category.id, + skip_validations: user.staged?) + when :reply email_log = destination[:obj] raise ReplyUserNotMatchingError if email_log.user_id != user.id - create_reply(user: user, raw: body, post: email_log.post, topic: email_log.post.topic) + create_reply(user: user, + raw: body, + post: email_log.post, + topic: email_log.post.topic) end end end @@ -271,6 +286,7 @@ module Email else options[:topic_id] = options[:post].try(:topic_id) options[:reply_to_post_number] = options[:post].try(:post_number) + options[:is_group_message] = options[:topic].private_message? && options[:topic].allowed_groups.exists? create_post_with_attachments(options) end end @@ -291,7 +307,8 @@ module Email # read attachment File.open(tmp.path, "w+b") { |f| f.write attachment.body.decoded } # create the upload for the user - upload = Upload.create_for(options[:user].id, tmp, attachment.filename, tmp.size) + opts = { is_attachment_for_group_message: options[:is_group_message] } + upload = Upload.create_for(options[:user].id, tmp, attachment.filename, tmp.size, opts) if upload && upload.errors.empty? # try to inline images if attachment.content_type.start_with?("image/") && options[:raw][/\[image: .+ \d+\]/] diff --git a/lib/validators/upload_validator.rb b/lib/validators/upload_validator.rb index 985fe928d9..b200fc16c3 100644 --- a/lib/validators/upload_validator.rb +++ b/lib/validators/upload_validator.rb @@ -5,6 +5,8 @@ module Validators; end class Validators::UploadValidator < ActiveModel::Validator def validate(upload) + return true if upload.is_attachment_for_group_message && SiteSetting.allow_all_attachments_for_group_messages + extension = File.extname(upload.original_filename)[1..-1] || "" if is_authorized?(upload, extension) diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb index bdb42a0a22..734276c6a7 100644 --- a/spec/components/email/receiver_spec.rb +++ b/spec/components/email/receiver_spec.rb @@ -271,6 +271,12 @@ describe Email::Receiver do expect { process(:email_reply_4) }.to change { topic.posts.count } end + it "supports any kind of attachments when 'allow_all_attachments_for_group_messages' is enabled" do + SiteSetting.allow_all_attachments_for_group_messages = true + expect { process(:attached_rb_file) }.to change(Topic, :count) + expect(Post.last.raw).to match(/discourse\.rb/) + end + end context "new topic in a category" do diff --git a/spec/fixtures/emails/attached_rb_file.eml b/spec/fixtures/emails/attached_rb_file.eml new file mode 100644 index 0000000000..960b3e6d67 --- /dev/null +++ b/spec/fixtures/emails/attached_rb_file.eml @@ -0,0 +1,31 @@ +Return-Path: +From: Foo Bar +To: team@bar.com +Date: Mon, 29 Feb 2016 21:54:01 +0100 +Message-ID: <56d4afe991ed0_3ab83fdf94441a20677f0@HAL.lan.mail> +Subject: Email with .rb file attached +Mime-Version: 1.0 +Content-Type: multipart/mixed; + boundary="--==_mimepart_56d4afe991d17_3ab83fdf94441a206765"; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + + +----==_mimepart_56d4afe991d17_3ab83fdf94441a206765 +Content-Type: text/plain; + charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Please find the source code of Discourse attached. +----==_mimepart_56d4afe991d17_3ab83fdf94441a206765 +Content-Type: application/x-ruby; + charset=UTF-8; + filename=discourse.rb +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename=discourse.rb +Content-ID: <56d4afe992cb6_3ab83fdf94441a20678c3@HAL.lan.mail> + +cHV0cyAiSGVsbG8gRGlzY291cnNlIgo= + +----==_mimepart_56d4afe991d17_3ab83fdf94441a206765-- From 01a6e103723bcbac89046d4ba250e9c098b427df Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Sat, 27 Feb 2016 00:09:07 +0100 Subject: [PATCH 178/245] FEATURE: Add importer for SourceForge discussions --- script/import_scripts/sourceforge.rb | 137 +++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 script/import_scripts/sourceforge.rb diff --git a/script/import_scripts/sourceforge.rb b/script/import_scripts/sourceforge.rb new file mode 100644 index 0000000000..d1b85366f4 --- /dev/null +++ b/script/import_scripts/sourceforge.rb @@ -0,0 +1,137 @@ +require_relative 'base.rb' + +# Import script for SourceForge discussions. +# +# See the following instructions on how to export your discussions from SourceForge: +# https://sourceforge.net/p/forge/documentation/Project%20Data%20Export/ +# +# Change the constants (PROJECT_NAME and JSON_FILE) before running the importer! +# +# Use the following command to run the importer within the Docker container: +# su discourse -c 'ruby /var/www/discourse/script/import_scripts/sourceforge.rb' + +class ImportScripts::Sourceforge < ImportScripts::Base + # When the URL of your project is https://sourceforge.net/projects/foo/ + # than the value of PROJECT_NAME is 'foo' + PROJECT_NAME = 'project_name' + + # This is the path to the discussion.json that you exported from SourceForge. + JSON_FILE = '/path/to/discussion.json' + + def initialize + super + + @system_user = Discourse.system_user + end + + def execute + puts '', 'Importing from SourceForge...' + + load_json + + import_categories + import_topics + end + + def load_json + @json = MultiJson.load(File.read(JSON_FILE), :symbolize_keys => true) + end + + def import_categories + puts '', 'importing categories' + + create_categories(@json[:forums]) do |forum| + { + id: forum[:shortname], + name: forum[:name], + post_create_action: proc do |category| + changes = {raw: forum[:description]} + opts = {revised_at: Time.now, bypass_bump: true} + + post = category.topic.first_post + post.revise(@system_user, changes, opts) + end + } + end + end + + def import_topics + puts '', 'importing posts' + imported_post_count = 0 + total_post_count = count_posts + + @json[:forums].each do |forum| + imported_category_id = @lookup.category_id_from_imported_category_id(forum[:shortname]) + + forum[:threads].each do |thread| + posts = thread[:posts] + next if posts.size == 0 + + first_post = posts[0] + first_post_id = post_id_of(thread, first_post) + imported_topic = nil + + create_posts(posts, total: total_post_count, offset: imported_post_count) do |post| + mapped = { + id: "#{thread[:_id]}_#{post[:slug]}", + user_id: @system_user, + created_at: Time.zone.parse(post[:timestamp]), + raw: process_post_text(forum, thread, post) + } + + if post == first_post + mapped[:category] = imported_category_id + mapped[:title] = thread[:subject][0...255] + else + if imported_topic.nil? + imported_topic = @lookup.topic_lookup_from_imported_post_id(first_post_id) + end + + mapped[:topic_id] = imported_topic[:topic_id] + end + + imported_post_count += 1 + mapped + end + end + end + end + + def count_posts + total_count = 0 + + @json[:forums].each do |forum| + forum[:threads].each do |thread| + total_count += thread[:posts].size + end + end + + total_count + end + + def post_id_of(thread, post) + "#{thread[:_id]}_#{post[:slug]}" + end + + def process_post_text(forum, thread, post) + text = post[:text] + text.gsub!(/~{3,}/, '```') # Discourse doesn't recognize ~~~ as beginning/end of code blocks + + # SourceForge doesn't allow symbols in usernames, so we are safe here. + # Well, unless it's the anonymous user, which has an evil asterisk in the JSON file... + username = post[:author] + username = 'anonymous' if username == '*anonymous' + + # anonymous and nobody are nonexistent users. Make sure we don't create links for them. + user_without_profile = username == 'anonymous' || username == 'nobody' + user_link = user_without_profile ? username : "[#{username}](https://sourceforge.net/u/#{username}/)" + + # Create a nice looking header for each imported post that links to the author's user profile and the old post. + post_date = Time.zone.parse(post[:timestamp]).strftime('%A, %B %d, %Y') + post_url = "https://sourceforge.net/p/#{PROJECT_NAME}/discussion/#{forum[:shortname]}/thread/#{thread[:_id]}/##{post[:slug]}" + + "**#{user_link}** wrote on [#{post_date}](#{post_url}):\n\n#{text}" + end +end + +ImportScripts::Sourceforge.new.perform From 01726847194123bf9417516dbdbbbc41fdc7bc47 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 1 Mar 2016 10:20:27 +0800 Subject: [PATCH 179/245] Some fixes for phpbb importer. --- script/import_scripts/phpbb3/importer.rb | 5 ++++- .../import_scripts/phpbb3/importers/user_importer.rb | 10 ++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/script/import_scripts/phpbb3/importer.rb b/script/import_scripts/phpbb3/importer.rb index ffcccae7bd..9f88a73b2b 100644 --- a/script/import_scripts/phpbb3/importer.rb +++ b/script/import_scripts/phpbb3/importer.rb @@ -111,7 +111,10 @@ module ImportScripts::PhpBB3 # uncomment below lines to create permalink for categories # def create_category(opts, import_id) # new_category = super - # Permalink.create(url: "viewforum.php?f=#{import_id}", category_id: new_category.id) + # url = "viewforum.php?f=#{import_id}" + # if !Permalink.find_by(url: url) + # Permalink.create(url: url, category_id: new_category.id) + # end # new_category # end diff --git a/script/import_scripts/phpbb3/importers/user_importer.rb b/script/import_scripts/phpbb3/importers/user_importer.rb index f1958ef147..ca50197a95 100644 --- a/script/import_scripts/phpbb3/importers/user_importer.rb +++ b/script/import_scripts/phpbb3/importers/user_importer.rb @@ -91,10 +91,12 @@ module ImportScripts::PhpBB3 end if disable_email - user.email_digests = false - user.email_private_messages = false - user.email_direct = false - user.email_always = false + user_option = user.user_option + user_option.email_digests = false + user_option.email_private_messages = false + user_option.email_direct = false + user_option.email_always = false + user_option.save! end if user.save From a45dd6e491db4c6c5dab4b416285a073c54f22fd Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 1 Mar 2016 15:58:30 +1100 Subject: [PATCH 180/245] update rails --- Gemfile.lock | 60 ++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index b300d9fe85..a563b17407 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,38 +1,38 @@ GEM remote: https://rubygems.org/ specs: - actionmailer (4.2.5.1) - actionpack (= 4.2.5.1) - actionview (= 4.2.5.1) - activejob (= 4.2.5.1) + actionmailer (4.2.5.2) + actionpack (= 4.2.5.2) + actionview (= 4.2.5.2) + activejob (= 4.2.5.2) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.5.1) - actionview (= 4.2.5.1) - activesupport (= 4.2.5.1) + actionpack (4.2.5.2) + actionview (= 4.2.5.2) + activesupport (= 4.2.5.2) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.5.1) - activesupport (= 4.2.5.1) + actionview (4.2.5.2) + activesupport (= 4.2.5.2) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) active_model_serializers (0.8.3) activemodel (>= 3.0) - activejob (4.2.5.1) - activesupport (= 4.2.5.1) + activejob (4.2.5.2) + activesupport (= 4.2.5.2) globalid (>= 0.3.0) - activemodel (4.2.5.1) - activesupport (= 4.2.5.1) + activemodel (4.2.5.2) + activesupport (= 4.2.5.2) builder (~> 3.1) - activerecord (4.2.5.1) - activemodel (= 4.2.5.1) - activesupport (= 4.2.5.1) + activerecord (4.2.5.2) + activemodel (= 4.2.5.2) + activesupport (= 4.2.5.2) arel (~> 6.0) - activesupport (4.2.5.1) + activesupport (4.2.5.2) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -160,7 +160,7 @@ GEM rack (>= 1.1.3) metaclass (0.0.4) method_source (0.8.2) - mime-types (2.99) + mime-types (2.99.1) mini_portile2 (2.0.0) minitest (5.8.4) mocha (1.1.0) @@ -240,16 +240,16 @@ GEM rack rack-test (0.6.3) rack (>= 1.0) - rails (4.2.5.1) - actionmailer (= 4.2.5.1) - actionpack (= 4.2.5.1) - actionview (= 4.2.5.1) - activejob (= 4.2.5.1) - activemodel (= 4.2.5.1) - activerecord (= 4.2.5.1) - activesupport (= 4.2.5.1) + rails (4.2.5.2) + actionmailer (= 4.2.5.2) + actionpack (= 4.2.5.2) + actionview (= 4.2.5.2) + activejob (= 4.2.5.2) + activemodel (= 4.2.5.2) + activerecord (= 4.2.5.2) + activesupport (= 4.2.5.2) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.5.1) + railties (= 4.2.5.2) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) @@ -262,9 +262,9 @@ GEM rails-observers (0.1.2) activemodel (~> 4.0) rails_multisite (1.0.3) - railties (4.2.5.1) - actionpack (= 4.2.5.1) - activesupport (= 4.2.5.1) + railties (4.2.5.2) + actionpack (= 4.2.5.2) + activesupport (= 4.2.5.2) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) raindrops (0.15.0) From f0653563ee5cf7376be5b236c5104661bbcd400b Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 1 Mar 2016 10:48:05 +0530 Subject: [PATCH 181/245] add Vietnamese locale js file --- app/assets/javascripts/locales/vi.js.erb | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 app/assets/javascripts/locales/vi.js.erb diff --git a/app/assets/javascripts/locales/vi.js.erb b/app/assets/javascripts/locales/vi.js.erb new file mode 100644 index 0000000000..d08cb397f5 --- /dev/null +++ b/app/assets/javascripts/locales/vi.js.erb @@ -0,0 +1,3 @@ +//= depend_on 'client.vi.yml' +//= require locales/i18n +<%= JsLocaleHelper.output_locale(:vi) %> From 39c3f0637958c31364fa0e835ae8830f6ecebe9d Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 1 Mar 2016 16:47:47 +0800 Subject: [PATCH 182/245] FIX: `j` keyboard shortcut skipping first post in topic. --- app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index f67a1e682b..2a8a3ad3d7 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -291,7 +291,7 @@ export default { index = 0; $articles.each(function() { const top = $(this).position().top; - if (top > scrollTop) { + if (top >= scrollTop) { return false; } index += 1; From d70e4ac5b6fad2b076e5c37c964a10c08f2e5008 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 1 Mar 2016 14:16:46 +0530 Subject: [PATCH 183/245] Update Translations --- config/locales/client.da.yml | 98 ++++++++++ config/locales/client.de.yml | 12 +- config/locales/client.ja.yml | 1 + config/locales/client.ko.yml | 7 +- config/locales/client.pt.yml | 73 +++++++ config/locales/client.ro.yml | 30 +-- config/locales/client.ru.yml | 3 + config/locales/client.sk.yml | 15 ++ config/locales/client.zh_CN.yml | 64 +++--- config/locales/server.de.yml | 47 +++-- config/locales/server.pt.yml | 129 ++++++++++-- config/locales/server.sk.yml | 71 ++++++- config/locales/server.vi.yml | 66 ++++++- config/locales/server.zh_CN.yml | 334 +++++++++++++++++++++++++++----- 14 files changed, 808 insertions(+), 142 deletions(-) diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 9c65da8741..34c0c0175e 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -100,6 +100,8 @@ da: x_years: one: "1 år senere" other: "%{count} år senere" + previous_month: 'Forrige måned' + next_month: 'Næste måned' share: topic: 'del et link til dette emne' post: 'indlæg #%{postNumber}' @@ -110,6 +112,8 @@ da: email: 'send dette link i en e-mail' action_codes: split_topic: "delte dette emne op %{when}" + invited_user: "Inviterede %{who} %{when}" + removed_user: "fjernede %{who} %{when}" autoclosed: enabled: 'lukket %{when}' disabled: 'åbnet %{when}' @@ -173,6 +177,7 @@ da: other: "{{count}} tegn" suggested_topics: title: "Foreslåede emner" + pm_title: "Foreslåede beskeder" about: simple_title: "Om" title: "Om %{title}" @@ -294,6 +299,12 @@ da: one: "1 bruger" other: "%{count} brugere" groups: + empty: + posts: "Der er ingen indlæg af medlemmer af denne gruppe." + members: "Der er ingen medlemmer i denne gruppe." + mentions: "Denne gruppe er ikke nævnt." + messages: "Der er ingen besked til denne gruppe." + topics: "Der er intet emne af medlemmer af denne gruppe." add: "Tilføj" selector_placeholder: "Tilføj medlemmer" owner: "ejer" @@ -313,6 +324,19 @@ da: trust_levels: title: "Tillidsniveau der automatisk tildeles medlemmer når de oprettes:" none: "Ingen" + notifications: + watching: + title: "Kigger" + description: "Du får beskeder om hvert nyt indlæg i hver besked og antallet af nye svar bliver vist." + tracking: + title: "Følger" + description: "Du får besked hvis nogen nævner dit @navn eller svarer dig og antallet af nye svar bliver vist." + regular: + title: "Normal" + description: "Du får besked hvis nogen nævner dit @navn " + muted: + title: "Tavs" + description: "Du får aldrig beskeder om nye emner i denne gruppe." user_action_groups: '1': "Likes givet" '2': "Likes modtaget" @@ -331,6 +355,7 @@ da: all_subcategories: "Alle" no_subcategory: "ingen" category: "Kategori" + category_list: "Vis liste over kategorier" reorder: title: "Ret kategoriernes rækkefølge " title_long: "Omorganiser listen over kategorier" @@ -387,11 +412,13 @@ da: invited_by: "Inviteret af" trust_level: "Tillidsniveau" notifications: "Underretninger" + statistics: "Statistik" desktop_notifications: label: "Desktop-notifikationer" not_supported: "Notifikationer understøttes ikke af denne browser. Beklager." perm_default: "Slå notifikationer til" perm_denied_btn: "Tilladelse nægtet" + perm_denied_expl: "Du nægtede adgang for notifikationer. Tillad notifikationer via indstillingerne i din browser." disable: "Deaktiver notifikationer" currently_enabled: "(slået til)" enable: "Aktiver notifikationer" @@ -439,7 +466,15 @@ da: warnings_received: "advarsler" messages: all: "Alle" + inbox: "Indbakke" + sent: "Sendt" + archive: "Arkiv" groups: "Mine grupper" + bulk_select: "Vælg beskeder" + move_to_inbox: "Flyt til Indbakke" + move_to_archive: "Arkiv" + failed_to_move: "Kunne ikke flytte valgt beskeder (måske problemer med netværket)" + select_all: "Vælg alle" change_password: success: "(e-mail sendt)" in_progress: "(sender e-mail)" @@ -596,6 +631,21 @@ da: same_as_email: "Dit password er det samme som din email adresse." ok: "Din adgangskode ser fin ud." instructions: "Mindst %{count} tegn" + summary: + title: "Resume" + stats: "Statistik" + topic_count: "Emner oprettet" + post_count: "Indlæg oprettet" + likes_given: "Likes givet" + likes_received: "Likes modtaget" + days_visited: "Dage besøgt" + posts_read_count: "Indlæg læst" + top_replies: "Top svar" + top_topics: "Top emner" + top_badges: "Top badges" + more_topics: "Flere emner" + more_replies: "Flere svar" + more_badges: "Flere badges" associated_accounts: "Logins" ip_address: title: "Sidste IP-adresse" @@ -752,6 +802,7 @@ da: ctrl: 'Ctrl' alt: 'Alt' composer: + emoji: "Emoji :)" more_emoji: "mere..." options: "Indstillinger" whisper: "hvisken" @@ -848,6 +899,9 @@ da: moved_post: "

{{username}} moved {{description}}

" linked: "

{{username}} {{description}}

" granted_badge: "

Du blev tildelt '{{description}}'

" + group_message_summary: + one: "

{{count}} besked i din {{group_name}} inbox

" + other: "

{{count}} beskeder i din {{group_name}} inbox

" alt: mentioned: "Nævnt af" quoted: "Citeret af" @@ -862,8 +916,10 @@ da: moved_post: "Dit indlæg blev flyttet af" linked: "Link til dit indlæg" granted_badge: "Badge tildelt" + group_message_summary: "Besker i gruppens indbakke" popup: mentioned: '{{username}} nævnte dig i "{{topic}}" - {{site_title}}' + group_mentioned: '{{username}} nævnte dig i "{{topic}}" - {{site_title}}' quoted: '{{username}} citerede dig i "{{topic}}" - {{site_title}}' replied: '{{username}} svarede dig i "{{topic}}" - {{site_title}}' posted: '{{username}} skrev i "{{topic}}" - {{site_title}}' @@ -964,6 +1020,12 @@ da: create: 'Nyt emne' create_long: 'Opret et nyt emne i debatten' private_message: 'Start en besked' + archive_message: + help: 'Flyt beskeder til dit arkiv' + title: 'Arkiv' + move_to_inbox: + title: 'Flyt til Indbakke' + help: 'Flyt beskeder tilbage til Indbakke' list: 'Emner' new: 'nyt emne' unread: 'ulæste' @@ -1014,6 +1076,7 @@ da: auto_close_title: 'Indstillinger for automatisk lukning' auto_close_save: "Gem" auto_close_remove: "Luk ikke dette emne automatisk" + auto_close_immediate: "Seneste indlæg i emnet er allerede %{hours} timer gammelt så emnet bliver lukket med det samme." progress: title: emnestatus go_top: "top" @@ -1134,6 +1197,7 @@ da: success: "Vi har inviteret denne bruger til at være med i denne besked." error: "Beklager, der skete en fejl, da vi forsøgte at invitere brugeren." group_name: "gruppe navn" + controls: "Emnestyring" invite_reply: title: 'Invitér' username_placeholder: "brugernavn" @@ -1250,6 +1314,8 @@ da: yes_value: "Ja" via_email: "dette indlæg blev oprettet via email" whisper: "dette indlæg er en privat hvisken for moderatorer" + wiki: + about: "dette indlæg er en wiki" archetypes: save: 'Gem indstillinger' controls: @@ -1682,6 +1748,7 @@ da: refresh_report: "Genopfrisk rapporten" start_date: "Start dato" end_date: "Slut dato" + groups: "Alle grupper" commits: latest_changes: "Seneste ændringer: opdatér ofte!" by: "af" @@ -1964,13 +2031,17 @@ da: name: 'wiki' description: "Basis farven der bruges som baggrund i wiki posts." email: + title: "Emails" settings: "Indstillinger" + templates: "Skabeloner" preview_digest: "Forhåndsvisning af sammendrag" sending_test: "Sender test email..." error: "ERROR - %{server_error}" test_error: "Der opstod et problem med at sende test emailen. Dobbelt check dine email indstillinger, verificer at din server ikke blokerer email forbindelser og prøv så igen." sent: "Sendt" skipped: "Droppet" + received: "Modtaget" + rejected: "Afvist" sent_at: "Sendt" time: "Tidspunkt" user: "Bruger" @@ -1988,6 +2059,19 @@ da: last_seen_user: "Sidst sete bruge:" reply_key: "Svarnøgle" skipped_reason: "Begrundelse" + incoming_emails: + from_address: "Fra" + to_addresses: "Til" + cc_addresses: "Cc" + subject: "Emne" + error: "Fejl" + none: "Ingen indkommende emails fundet" + filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Emne..." + error_placeholder: "Fejl" logs: none: "Ingen logs fundet" filters: @@ -2037,6 +2121,7 @@ da: change_site_setting: "skift indstillinger for site" change_site_customization: "skift tilpasning af site" delete_site_customization: "slet tilpasning af site" + change_site_text: "skift tekst for site" suspend_user: "suspendér user" unsuspend_user: "ophæv suspendering af bruger" grant_badge: "tildel badge" @@ -2050,6 +2135,12 @@ da: change_category_settings: "ret kategori-indstillinger" delete_category: "slet kategori" create_category: "opret kategori" + block_user: "bloker bruger" + unblock_user: "fjern blokering af bruger" + grant_admin: "tildel admin" + revoke_admin: "fjern admin" + grant_moderation: "tildel moderation" + revoke_moderation: "fjern moderation" screened_emails: title: "Blokerede e-mails" description: "Følgende e-mail-adresser kontrolleres når nogen prøver at oprette en konto, og oprettelsen vil enten blive blokeret, eller der vil blive foretaget en anden handling." @@ -2215,6 +2306,8 @@ da: deactivate_failed: "Der opstod et problem ved deaktivering af brugeren." unblock_failed: 'Der opstod et problem ved ophævelsen af brugerens blokering.' block_failed: 'Der opstod et problem ved blokering af brugeren.' + block_confirm: 'Er du sikker på, at du vil blokere brugeren? Bruger kan ikke længere oprette emner eller indlæg.' + block_accept: 'Ja, bloker brugeren' deactivate_explanation: "En deaktiveret bruger skal genvalidere deres e-mail." suspended_explanation: "En suspenderet bruger kan ikke logge ind." block_explanation: "En blokeret bruger kan ikke oprette indlæg eller starte emner." @@ -2228,6 +2321,7 @@ da: unlock_trust_level: "Lås tillidsniveau op" tl3_requirements: title: "Krav for fortrolighedsniveau 3" + table_title: "I de sidste %{time_period} dage:" value_heading: "værdi" requirement_heading: "Obligatoriske" visits: "Besøg" @@ -2495,6 +2589,10 @@ da: mark_tracking: 'm, t Følg emne' mark_watching: 'm, w Iagtag emne' badges: + earned_n_times: + one: "Fortjente dette badge 1 gang" + other: "Fortjente dette badge %{count} gange." + more_with_badge: "Andre med dette badge" title: Badges allow_title: "kan bruges som titel" multiple_grant: "kan gives flere gange" diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 30a9605535..5f206011d8 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -372,7 +372,7 @@ de: reorder: title: "Kategorien neu sortieren" title_long: "Neustrukturierung der Kategorieliste" - fix_order: "Positionen fixieren" + fix_order: "Positionen korrigieren" fix_order_tooltip: "Nicht alle Kategorien haben eine eindeutige Positionsnummer, was zu unerwarteten Ergebnissen führen kann." save: "Reihenfolge speichern" apply_all: "Anwenden" @@ -459,7 +459,7 @@ de: tracked_categories: "Verfolgt" tracked_categories_instructions: "Du wirst automatisch allen neuen Themen in diesen Kategorien folgen. Die Anzahl der neuen Antworten wird bei den betroffenen Themen angezeigt." muted_categories: "Stummgeschaltet" - muted_categories_instructions: "Du erhältst keine Benachrichtigungen über neue Themen in dieser Kategorie und die Themen werden auch nicht in der Liste der letzten Themen erscheinen." + muted_categories_instructions: "Du erhältst keine Benachrichtigungen über neue Themen in dieser Kategorie und die Themen werden auch nicht in der Liste der aktuellen Themen erscheinen." delete_account: "Lösche mein Benutzerkonto" delete_account_confirm: "Möchtest du wirklich dein Benutzerkonto permanent löschen? Diese Aktion kann nicht rückgängig gemacht werden!" deleted_yourself: "Dein Benutzerkonto wurde erfolgreich gelöscht." @@ -2068,7 +2068,7 @@ de: format: "Format" html: "HTML" text: "Text" - last_seen_user: "Letzter Benutzer:" + last_seen_user: "Benutzer zuletzt gesehen:" reply_key: "Antwort-Schlüssel" skipped_reason: "Grund des Überspringens" incoming_emails: @@ -2254,7 +2254,7 @@ de: moderator: "Moderator?" admin: "Administrator?" blocked: "Geblockt?" - staged: "Insziniert?" + staged: "Vorbereitet?" show_admin_profile: "Administration" edit_title: "Titel bearbeiten" save_title: "Titel speichern" @@ -2324,7 +2324,7 @@ de: deactivate_explanation: "Ein deaktivierter Benutzer muss seine E-Mail-Adresse erneut bestätigen." suspended_explanation: "Ein gesperrter Benutzer kann sich nicht anmelden." block_explanation: "Ein geblockter Benutzer kann keine Themen erstellen oder Beiträge veröffentlichen." - stage_explanation: "Ein inszenierter Nutzer kann nur via E-Mail zu gewissen Themen beitragen." + stage_explanation: "Ein vorbereiteter Nutzer kann nur via E-Mail zu gewissen Themen beitragen." trust_level_change_failed: "Beim Wechsel der Vertrauensstufe ist ein Fehler aufgetreten." suspend_modal_title: "Benutzer sperren" trust_level_2_users: "Benutzer mit Vertrauensstufe 2" @@ -2525,7 +2525,7 @@ de: crawling_description: "Wenn Discourse Themen für deine Beiträge erstellt wird es falls kein RSS/ATOM-Feed verfügbar ist versuchen, den Inhalt aus dem HTML-Code zu extrahieren. Dies ist teilweise schwierig, weshalb hier CSS-Regeln angegeben werden können, die die Extraktion erleichtern." embed_by_username: "Benutzername für Beitragserstellung" embed_post_limit: "Maximale Anzahl der Beiträge, welche eingebettet werden" - embed_username_key_from_feed: "Schlüssel, um Discourse-Benutzernamen aus Feed zu extrahieren." + embed_username_key_from_feed: "Schlüssel, um Discourse-Benutzernamen aus Feed zu ermitteln." embed_truncate: "Kürze die eingebetteten Beiträge" embed_whitelist_selector: "CSS Selektor für Elemente, die in Einbettungen erlaubt sind." embed_blacklist_selector: "CSS Selektor für Elemente, die in Einbettungen entfernt werden." diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index dd1989681a..21de46261f 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -199,6 +199,7 @@ ja: revert: "戻す" failed: "失敗" switch_to_anon: "匿名モード" + switch_from_anon: "匿名モード停止" banner: close: "バナーを閉じる。" edit: "このバナーを編集 >>" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index b68af57710..005377aabf 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -902,6 +902,7 @@ ko: from_my_computer: "컴퓨터에서 가져오기" from_the_web: "인터넷에서 가져오기" remote_tip: "이미지 링크" + remote_tip_with_attachments: "이미니자 파일 링크 {{authorized_extensions}}" local_tip: "기기에서 이미지 선택" hint: "(드래그&드랍으로 업로드 가능)" uploading: "업로드 중입니다..." @@ -1085,7 +1086,7 @@ ko: auto_close: "자동으로 닫기..." pin: "토픽 고정..." unpin: "토픽 고정 취소..." - unarchive: "보관 안된 토픽" + unarchive: "토픽 보관 취소" archive: "토픽 보관" invisible: "목록에서 제외하기" visible: "목록에 넣기" @@ -1902,6 +1903,10 @@ ko: last_seen_user: "마지막으로 본 사용자" reply_key: "답글 단축키" skipped_reason: "생략 이유" + incoming_emails: + error: "에러" + filters: + error_placeholder: "에러" logs: none: "로그가 없습니다." filters: diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index a555464c5e..1bc7d3a0ed 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -100,6 +100,8 @@ pt: x_years: one: "1 ano mais tarde" other: "%{count} anos mais tarde" + previous_month: 'Mês Anterior' + next_month: 'Mês Seguinte' share: topic: 'partilhar uma hiperligação para este tópico' post: 'Mensagem #%{postNumber}' @@ -110,6 +112,8 @@ pt: email: 'enviar esta hiperligação por email' action_codes: split_topic: "dividir este tópico %{when}" + invited_user: "Convidou %{who} %{when}" + removed_user: "Removeu %{who} %{when}" autoclosed: enabled: 'fechado %{when}' disabled: 'aberto %{when}' @@ -130,6 +134,19 @@ pt: disabled: 'removido da lista %{when}' topic_admin_menu: "Ações administrativas dos Tópicos" emails_are_disabled: "Todos os envios de e-mail foram globalmente desativados por um administrador. Nenhum e-mail de notificação será enviado." + s3: + regions: + us_east_1: "Este dos E.U.A. (Virgínia do Norte)" + us_west_1: "Oeste dos E.U.A. (California do Norte)" + us_west_2: "Oeste dos E.U.A. (Óregon)" + us_gov_west_1: "AWS GovCloud (E.U.A.)" + eu_west_1: "U.E. (Irlanda)" + eu_central_1: "U.E. (Francoforte)" + ap_southeast_1: "Ásia-Pacífico (Singapura)" + ap_southeast_2: "Ásia-Pacífico (Sydney)" + ap_northeast_1: "Ásia-Pacífico (Tóquio)" + ap_northeast_2: "Ásia-Pacífico (Seoul)" + sa_east_1: "América do Sul (São Paulo)" edit: 'editar o título e a categoria deste tópico' not_implemented: "Essa funcionalidade ainda não foi implementada, pedimos desculpa!" no_value: "Não" @@ -173,6 +190,7 @@ pt: other: "{{count}} caracteres" suggested_topics: title: "Tópicos Sugeridos" + pm_title: "Mensagens Sugeridas" about: simple_title: "Acerca" title: "Acerca de %{title}" @@ -413,6 +431,7 @@ pt: not_supported: "Não são suportadas notificações neste navegador. Desculpe." perm_default: "Ligar Notificações" perm_denied_btn: "Permissão Negada" + perm_denied_expl: "Negou a permissão para as notificações. Autorize as notificações através das configurações do seu navegador." disable: "Desativar Notificações" currently_enabled: "(atualmente ativo)" enable: "Ativar Notificações" @@ -466,6 +485,7 @@ pt: groups: "Os Meus Grupos" bulk_select: "Selecionar mensagens" move_to_inbox: "Mover para Caixa de Entrada" + move_to_archive: "Arquivo" failed_to_move: "Falha ao mover as mensagens selecionadas (talvez a sua rede esteja em baixo)" select_all: "Selecionar Tudo" change_password: @@ -624,6 +644,21 @@ pt: same_as_email: "A sua palavra-passe é a mesma que o seu email." ok: "A sua palavra-passe parece correta." instructions: "Pelo menos %{count} caracteres." + summary: + title: "Sumário" + stats: "Estatísticas" + topic_count: "Tópicos Criados" + post_count: "Mensagens Criadas" + likes_given: "Gostos Dados" + likes_received: "Gostos Recebidos" + days_visited: "Dias Visitados" + posts_read_count: "Mensagens Lidas" + top_replies: "Respostas" + top_topics: "Melhores Tópicos" + top_badges: "Melhores Distintivos" + more_topics: "Mais Tópicos" + more_replies: "Mais Respostas" + more_badges: "Mais Distintivos" associated_accounts: "Contas associadas" ip_address: title: "Último endereço IP" @@ -666,6 +701,7 @@ pt: logout: "A sua sessão estava encerrada." refresh: "Atualizar" read_only_mode: + enabled: "Este sítio encontra-se no modo só de leitura. Por favor continue a navegar mas responder, dar gostos e outras acções estão de momento desativadas." login_disabled: "A função de início de sessão está desativada enquanto o sítio se encontrar no modo só de leitura." too_few_topics_and_posts_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópicos e %{currentPosts} / %{requiredPosts} mensagens. Novos visitantes precisam de conversações para ler e responder a." too_few_topics_notice: "Vamos começar esta discussão! Atualmente existem %{currentTopics} / %{requiredTopics} tópios. Novos visitantes precisam de algumas conversações para ler e responder a." @@ -780,6 +816,7 @@ pt: ctrl: 'Ctrl' alt: 'Alt' composer: + emoji: "Emoji :)" more_emoji: "mais..." options: "Opções" whisper: "susurro" @@ -876,6 +913,9 @@ pt: moved_post: "

{{username}} moveu {{description}}

" linked: "

{{username}} {{description}}

" granted_badge: "

Ganhou '{{description}}'

" + group_message_summary: + one: "

{{count}} mensagem na caixa de entrada do seu grupo {{group_name}}

" + other: "

{{count}} mensagens na caixa de entrada do seu grupo {{group_name}}

" alt: mentioned: "Mencionado por" quoted: "Citado por" @@ -890,6 +930,7 @@ pt: moved_post: "A sua mensagem foi movida por" linked: "Hiperligação para a sua mensagem" granted_badge: "Distintivo concedido" + group_message_summary: "Mensagens na caixa de entrada do seu grupo" popup: mentioned: '{{username}} mencionou-o em "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} mencionou-o em "{{topic}}" - {{site_title}}' @@ -1721,6 +1762,7 @@ pt: refresh_report: "Atualizar relatório" start_date: "Data de Início" end_date: "Data final" + groups: "Todos os grupos" commits: latest_changes: "Últimas alterações: atualize com frequência!" by: "por" @@ -2003,13 +2045,17 @@ pt: name: 'wiki' description: "Cor base utilizada para o fundo de mensagens wiki" email: + title: "Emails" settings: "Configurações" + templates: "Templates" preview_digest: "Pré-visualizar Resumo" sending_test: "A enviar Email de teste..." error: "ERRO - %{server_error}" test_error: "Occorreu um problema no envio do email de teste. Por favor verifique novamente as suas definições de email, verifique se o seu host não está a bloquear conexões de email, e tente novamente." sent: "Enviado" skipped: "Ignorado" + received: "Recebido" + rejected: "Rejeitado" sent_at: "Enviado em" time: "Tempo" user: "Utilizador" @@ -2027,6 +2073,19 @@ pt: last_seen_user: "Último Utilizador Visto:" reply_key: "Chave de Resposta" skipped_reason: "Ignorar Motivo" + incoming_emails: + from_address: "De" + to_addresses: "Para" + cc_addresses: "Cc" + subject: "Assunto" + error: "Erro" + none: "Nenhum email de entrada encontrado." + filters: + from_placeholder: "de@exemplo.com" + to_placeholder: "para@exemplo.com" + cc_placeholder: "cc@exemplo.com" + subject_placeholder: "Assunto..." + error_placeholder: "Erro" logs: none: "Nenhuns logs encontrados." filters: @@ -2090,6 +2149,12 @@ pt: change_category_settings: "alterar configurações de categoria" delete_category: "eliminar categoria" create_category: "criar categoria" + block_user: "utilizador bloqueado" + unblock_user: "Desbloquear utilizador" + grant_admin: "conceder administração" + revoke_admin: "revogar administração" + grant_moderation: "conceder moderação" + revoke_moderation: "revogar moderação" screened_emails: title: "Emails Filtrados" description: "Quando alguém tenta criar uma nova conta, os seguintes endereços de email serão verificados e o registo será bloqueado, ou outra ação será executada." @@ -2191,6 +2256,7 @@ pt: moderator: "Moderador?" admin: "Administração?" blocked: "Bloqueado?" + staged: "Temporário?" show_admin_profile: "Administração" edit_title: "Editar Título" save_title: "Guardar Título" @@ -2255,9 +2321,12 @@ pt: deactivate_failed: "Ocorreu um problema ao desativar o utilizador." unblock_failed: 'Ocorreu um problema ao desbloquear o utilizador.' block_failed: 'Ocorreu um problema ao bloquear o utilizador.' + block_confirm: 'Tem a certeza que pretende bloquear este utilizador? Este não será capaz de criar novos tópicos ou mensagens.' + block_accept: 'Sim, bloquear este utilizador' deactivate_explanation: "Um utilizador desativado deve revalidar o seu email." suspended_explanation: "Um utilizador suspenso não pode iniciar sessão." block_explanation: "Um utilizador bloqueado não pode publicar mensagens ou iniciar tópicos." + stage_explanation: "Um utilizador em estado temporário pode apenas publicar por email em tópicos específicos." trust_level_change_failed: "Ocorreu um problema ao alterar o Nível de Confiança do utilizador." suspend_modal_title: "Utilizador Suspenso" trust_level_2_users: "Utilizadores no Nível de Confiança 2" @@ -2536,6 +2605,10 @@ pt: mark_tracking: 'm, t Acompanhar tópico' mark_watching: 'm, w Vigiar este tópico' badges: + earned_n_times: + one: "Ganhou este distintivo 1 vez" + other: "Ganhou este distintivo %{count} vezes" + more_with_badge: "Outros com este distintivo" title: Distintivos allow_title: "pode ser usado como título" multiple_grant: "pode ser premiado múltiplas vezes" diff --git a/config/locales/client.ro.yml b/config/locales/client.ro.yml index d0ddfd41d7..aadd4603e9 100644 --- a/config/locales/client.ro.yml +++ b/config/locales/client.ro.yml @@ -173,7 +173,7 @@ ro: sign_up: "Înregistrare" log_in: "Autentificare" age: "Vârsta" - joined: "Adăugat" + joined: "Înregistrat" admin_title: "Admin" flags_title: "Semnalare" show_more: "Detaliază" @@ -661,7 +661,7 @@ ro: network_fixed: "Se pare ca și-a revenit." server: "Ceva nu a funcționat." forbidden: "Nu sunteţi autorizat să vedeţi aceasta." - not_found: "Oops, aplicatia incearca sa incarce un URL care nu exista." + not_found: "Oops, aplicația încearcă să încarce un URL care nu există." unknown: "Ceva nu a funcționat." buttons: back: "Înapoi" @@ -698,8 +698,8 @@ ro: value_prop: "Cand creati un cont nou, vom retine exact ce ati citit, astfel continuati intotdeauna de unde ati ramas. Deasemenea primiti notificari, aici sau prin email atunci se posteaza ceva nou. Puteti \"aprecia\" postari pentru a impartasi iubire :heartbeat:" summary: enabled_description: "Vizualizați sumarul discuției: cea mai interesantă postare, așa cum a fost determinată de comunitate. Pentru toate postările, faceți click dedesubt." - description: "Există {{count}} de răspunsuri." - description_time: "Există {{count}} de răspunsuri cu timp de citit estimat la {{readingTime}} de minute." + description: "Există {{replyCount}} de răspunsuri." + description_time: "Există {{replyCount}} de răspunsuri cu timp de citit estimat la {{readingTime}} de minute." enable: 'Fă sumarul discuției' disable: 'Arată toate postările' deleted_filter: @@ -906,6 +906,7 @@ ro: category: "Caută în categoria\"{{category}}\" " topic: "Caută în această discuție" private_messages: "Caută mesaje" + new_item: "nou" go_back: 'înapoi' not_logged_in_user: 'pagina utilizatorului cu sumarul activităților și preferințelor' current_user: 'mergi la pagina proprie de utilizator' @@ -960,7 +961,7 @@ ro: new: 'discuție nouă' unread: 'necitită' new_topics: - one: '1 subiect nou' + one: 'Un subiect nou' few: '{{count}} subiecte noi' other: '{{count}} subiecte noi' unread_topics: @@ -987,7 +988,7 @@ ro: few: "aveţi {{count}} mesaje vechi necitite în această discuţie." other: "aveţi {{count}} mesaje vechi necitite în această discuţie." new_posts: - one: "este 1 mesaj nou în această discuţie de la ultima citire" + one: "este un mesaj nou în această discuţie de la ultima citire" few: "sunt {{count}} mesaje noi în această discuţie de la ultima citire" other: "sunt {{count}} mesaje noi în această discuţie de la ultima citire" likes: @@ -1055,8 +1056,8 @@ ro: actions: recover: "Rescrie discuție" delete: "Șterge Discuție" - open: "Deschide discuție" - close: "Închide discuție" + open: "Redeschide discuția" + close: "Închide discuția" multi_select: "Selectează discuţiile ..." auto_close: "Închide automat" pin: "Fixează discuţia pe pagină..." @@ -1155,6 +1156,9 @@ ro: few: "Va rugăm să alegeţi noul propietar pentru cele {{count}} mesajele postate de {{old_user}}." other: "Va rugăm să alegeţi noul propietar pentru cele {{count}} mesajele postate de {{old_user}}." instructions_warn: " aveți în vedere că nicio notificare ce privește această postare nu va fi transferabilă retroactiv către noul utilizator.
Avertisment: Acum, nicio informație ce depinde de postare nu va fi transferată noului utilizator. Folosiți cu grijă." + change_timestamp: + title: "Schimbă data publicării" + action: "schimbă data publicării" multi_select: select: 'selectează' selected: 'selectate ({{count}})' @@ -1539,8 +1543,12 @@ ro: other: "Necitite ({{count}})" help: "discuțiile pe care le vizualizați sau urmariți momentan ce includ postări necitite" new: - lower_title: "noi" - title: "Nou" + lower_title: "nou" + title: "Noi" + title_with_count: + one: "Nou (1)" + few: "Noi ({{count}})" + other: "Noi ({{count}})" help: "discuții create în ultimele zile" posted: title: "Postările mele" @@ -1772,7 +1780,7 @@ ro: title: "Dezactivearea modului doar-citire" label: "Dezactivează modul doar-citire" logs: - none: "Nu exista rapoarte..." + none: "Nu există rapoarte..." columns: filename: "Numele fișierului" size: "Mărime" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 7d8afc6506..1344b2f784 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -138,6 +138,8 @@ ru: few: "%{count} года спустя" many: "%{count} лет спустя" other: "%{count} лет спустя" + previous_month: 'Предыдущий Месяц' + next_month: 'Следующий Месяц' share: topic: 'Поделиться ссылкой на эту тему' post: 'Ссылка на сообщение №%{postNumber}' @@ -229,6 +231,7 @@ ru: other: "{{count}} букв" suggested_topics: title: "Похожие темы" + pm_title: "Похожие Сообщения" about: simple_title: "Информация" title: "Информация про %{title}" diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index f8b621c609..a9ce4e02a5 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -119,6 +119,8 @@ sk: one: "1 rok neskôr" few: "%{count} roky neskôr" other: "%{count} rokov neskôr" + previous_month: 'Predchádzajúci mesiac' + next_month: 'Nasledujúci mesiac' share: topic: 'zdieľaj odkaz na túto tému' post: 'príspevok #%{postNumber}' @@ -209,6 +211,7 @@ sk: other: "{{count}} znakov" suggested_topics: title: "Odporúčané témy" + pm_title: "Odporúčané správy" about: simple_title: "O fóre" title: "O %{title}" @@ -458,6 +461,7 @@ sk: not_supported: "Tento prehliadač nepodporuje upozornenia. Prepáčte." perm_default: "Zapnúť upozornenia" perm_denied_btn: "Prístup zamietnutý" + perm_denied_expl: "Povolenie pre zobrazenie notifikácií ste zakázali. Notifikácie povolíte v nastaveniach vášho prehliadača." disable: "Zakázať upozornenia" currently_enabled: "(momentálne povolené)" enable: "Povoliť upozornenia" @@ -511,6 +515,7 @@ sk: groups: "Moje skupiny" bulk_select: "Označ správy" move_to_inbox: "Presuň do prijatej pošty" + move_to_archive: "Archív" failed_to_move: "Zlyhalo presunutie označených správ (možno je chyba vo vašom pripojení)" select_all: "Označ všetky" change_password: @@ -941,6 +946,10 @@ sk: moved_post: "

{{username}} presunul {{description}}

" linked: "

{{username}} {{description}}

" granted_badge: "

Získal '{{description}}'

" + group_message_summary: + one: "

{{count}} správa vo vašej {{group_name}} schránke

" + few: "

{{count}} správy vo vašej {{group_name}} schránke

" + other: "

{{count}} správ vo vašej {{group_name}} schránke

" alt: mentioned: "Spomenutý od" quoted: "Citovaný od" @@ -955,6 +964,7 @@ sk: moved_post: "Váš príspevok bol presunutý " linked: "Odkaz na váš príspevok" granted_badge: "Priznaný odznak" + group_message_summary: "Správy v skupinovej schránke" popup: mentioned: '{{username}} vás spomenul v "{{topic}}" - {{site_title}}' group_mentioned: '{{username}} vás spomenul v "{{topic}}" - {{site_title}}' @@ -1836,6 +1846,7 @@ sk: refresh_report: "Obnoviť report" start_date: "Od" end_date: "Do" + groups: "Všetky skupiny" commits: latest_changes: "Najnov3ie zmeny. Prosime aktualizujte čo najčastejšie!" by: "podľa" @@ -2229,6 +2240,10 @@ sk: create_category: "vytvoriť kategóriu" block_user: "blokovať používateľa" unblock_user: "odblokovať používateľa" + grant_admin: "udeliť admin" + revoke_admin: "odobrať admin" + grant_moderation: "udeliť moderovanie" + revoke_moderation: "odvolať moderovanie" screened_emails: title: "Kontrolované emaily" description: "Keď niekto skúsi vytvoriť nový účet, nasledujúce emailove adresy budú preverené a registrácia bude zablokovaná, alebo bude vykonaná nejaka iná akcia. " diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index e65ef2746d..81282dc183 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -58,7 +58,7 @@ zh_CN: almost_x_years: other: "近%{count}年" date_month: "MMMDo" - date_year: "YY-MM-D" + date_year: "YY年MMM" medium: x_minutes: other: "%{count}分钟" @@ -93,6 +93,8 @@ zh_CN: email: '用电子邮件发送这个链接' action_codes: split_topic: "于%{when}分割了该主题" + invited_user: "于%{when}邀请%{who}" + removed_user: "于%{when}移除%{who}" autoclosed: enabled: '于%{when}关闭' disabled: '于%{when}开启' @@ -161,7 +163,7 @@ zh_CN: weekly: "每周" every_two_weeks: "每两周" every_three_days: "每三天" - max_of_count: "最多 {{count}}" + max_of_count: "不超过 {{count}}" alternation: "或" character_count: other: "%{count} 个字符" @@ -172,8 +174,8 @@ zh_CN: simple_title: "关于" title: "关于%{title}" stats: "站点统计" - our_admins: "我们的管理员们" - our_moderators: "我们的版主们" + our_admins: "我们的管理员" + our_moderators: "我们的版主" stat: all_time: "所有时间内" last_7_days: "7 天以内" @@ -184,7 +186,7 @@ zh_CN: user_count: "新用户" active_user_count: "活跃用户" contact: "联系我们" - contact_info: "在遇到影响站点的重大错误或者紧急事件时,请通过 %{contact_info} 联系我们。" + contact_info: "当有重大或者紧急事件时,请通过 %{contact_info} 联系我们。" bookmarked: title: "书签" clear_bookmarks: "删除书签" @@ -199,7 +201,7 @@ zh_CN: remove: "删除书签" confirm_clear: "你确定要删除该主题的所有书签吗?" topic_count_latest: - other: "{{count}} 个新主题或更新的主题。" + other: "{{count}} 个近期的主题或更新的主题。" topic_count_unread: other: "{{count}} 未读主题。" topic_count_new: @@ -216,14 +218,14 @@ zh_CN: uploaded: "上传完成!" enable: "启用" disable: "禁用" - undo: "重做" + undo: "重置" revert: "撤销" failed: "失败" switch_to_anon: "匿名模式" switch_from_anon: "退出匿名模式" banner: close: "隐藏横幅。" - edit: "编辑横幅>>" + edit: "编辑该横幅 >>" choose_topic: none_found: "没有找到主题。" title: @@ -284,11 +286,11 @@ zh_CN: other: "%{count} 位用户" groups: empty: - posts: "此小组成员没有回复" - members: "此小组没有成员" - mentions: "此小组没有通知" - messages: "此小组没有消息" - topics: "此小组成员没有主题帖" + posts: "此小组的成员没有发表过帖子。" + members: "此小组没有成员。" + mentions: "此小组没有被提及过。" + messages: "此小组没有发送过消息。" + topics: "此小组的成员没有发表过主题。" add: "添加" selector_placeholder: "添加成员" owner: "所有者" @@ -964,7 +966,7 @@ zh_CN: selected: other: "你已经选择了 {{count}}个主题" none: - unread: "你没有未阅主题。" + unread: "你没有未读主题。" new: "你没有新主题可读。" read: "你尚未阅读任何主题。" posted: "你尚未在任何主题中发帖。" @@ -994,7 +996,7 @@ zh_CN: change_notification_state: "您现在的提醒状态是" filter_to: "本主题中的 {{post_count}} 帖" create: '新主题' - create_long: '创建一个新主题' + create_long: '创建新主题' private_message: '发送消息' archive_message: help: '移动消息到存档' @@ -1277,7 +1279,7 @@ zh_CN: save: '保存选项' controls: reply: "开始给本帖撰写回复" - like: "赞本帖" + like: "点个赞" has_liked: "你已经赞了本帖" undo_like: "撤销赞" edit: "编辑本帖" @@ -1295,8 +1297,8 @@ zh_CN: admin: "帖子管理" wiki: "使其成为维基帖子" unwiki: "使其成为普通帖子" - convert_to_moderator: "增加职员颜色" - revert_to_regular: "移除职员颜色" + convert_to_moderator: "添加管理人员颜色标记" + revert_to_regular: "移除管理人员颜色标记" rebake: "重建 HTML" unhide: "显示" change_owner: "更改所有权" @@ -1458,14 +1460,14 @@ zh_CN: title: "追踪" description: "你将会自动追踪这些分类中的所有新主题。你会在别人@你或回复你的帖子时才会收到通知,并且新帖数量也将在这些主题后显示。" regular: - title: "常规" + title: "普通" description: "如果某人@你或者回复你,你将收到通知。" muted: title: "免打扰" description: "你不会收到这些分类中的任何新主题通知,并且他们将不会出现在最新列表中。" flagging: title: '感谢帮助社群远离邪恶!' - private_reminder: '标记是不公开的,只有职员才可以见到' + private_reminder: '标记是不公开的,只有管理人员才可以见到' action: '报告帖子' take_action: "立即执行" notify_action: '消息' @@ -1494,7 +1496,7 @@ zh_CN: notify_action: "消息" topic_map: title: "主题概要" - participants_title: "频繁发帖者" + participants_title: "主要发帖者" links_title: "热门链接" links_shown: "显示所有 {{totalLinks}} 个链接..." clicks: @@ -1856,7 +1858,7 @@ zh_CN: button_text: "导出" button_title: user: "以CSV格式导出所有用户列表" - staff_action: "以CSV格式导出所有职员操作历史记录" + staff_action: "以CSV格式导出所有管理人员操作历史记录" screened_email: "以 CSV 格式导出所有已显示的电子邮件列表。" screened_ip: "以 CSV 格式导出所有已显示的IP地址列表。" screened_url: "以 CSV 格式导出所有已显示的URL列表。" @@ -1916,7 +1918,7 @@ zh_CN: new_name: "新的颜色方案" copy_name_prefix: "复制于" delete_confirm: "删除这个颜色方案?" - undo: "重做" + undo: "重置" undo_title: "撤销你对这个颜色的编辑至上一次保存的状态。" revert: "撤销" revert_title: "重置这个颜色至 Discourse 的默认颜色方案" @@ -2113,7 +2115,7 @@ zh_CN: new: "新建" active: "活跃" pending: "待定" - staff: '职员' + staff: '管理人员' suspended: '禁止登录' blocked: '禁止参与讨论' suspect: '怀疑' @@ -2130,8 +2132,8 @@ zh_CN: basic: '信用等级为1的用户(基本用户)' member: '信用等级为2的用户(成员)' regular: '信用等级为3的用户(活跃)' - leader: '信用等级为4的用户(领导)' - staff: "职员" + leader: '信用等级为4的用户(资深)' + staff: "管理人员" admins: '管理员' moderators: '版主' blocked: '被封用户' @@ -2232,16 +2234,16 @@ zh_CN: trust_level_change_failed: "改变用户等级时出现了一个问题。" suspend_modal_title: "被禁用户" trust_level_2_users: "二级信任等级用户" - trust_level_3_requirements: "三级信任等级需求" + trust_level_3_requirements: "信任等级 3 要求" trust_level_locked_tip: "信任等级已经被锁定,系统将不会升降用户的信任等级" trust_level_unlocked_tip: "信任等级已经解锁,系统将自动升降用户的信任等级" lock_trust_level: "锁定信任等级" unlock_trust_level: "解锁信任等级" tl3_requirements: - title: "3 级信任等级的需求" + title: "信任等级 3 的要求" table_title: "在最近%{time_period}天:" value_heading: "价值" - requirement_heading: "需求" + requirement_heading: "要求" visits: "访问" days: "天数" topics_replied_to: "回复的主题" @@ -2253,7 +2255,7 @@ zh_CN: flagged_by_users: "标记的用户" likes_given: "给出的赞" likes_received: "收到的赞" - likes_received_days: "收到的赞:每天" + likes_received_days: "收到的赞:独立天数" likes_received_users: "收到的赞:每用户" qualifies: "符合等级3的信用度" does_not_qualify: "未符合等级3的信用度" @@ -2545,7 +2547,7 @@ zh_CN: name: 活跃用户 description: 已授予重分类、重命名、跟踪链接和贵宾室 leader: - name: 领导 + name: 资深 description: 已授予 全局编辑、固定、关闭、存档、分割和合并 welcome: name: 欢迎 diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index c522619eb6..443387ca58 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -676,7 +676,6 @@ de: min_search_term_length: "Minimale zulässige Länge der Suche in Zeichen." search_tokenize_chinese_japanese_korean: "Zwinge die Suche, Chinesisch, Japanisch und Koreanisch zu erkennen, auch wenn die Seite keine dieser Sprachen nutzt" allow_uncategorized_topics: "Erlaube Themen ohne Kategorie zu erstellen. ACHTUNG: Falls es unkategorisierte Themen gibt, musst du sie neu kategorisieren, bevor du diese Option abschaltest." - uncategorized_description: "Beschreibung der Kategorie für unkategorisierte Themen. Leer lassen, wenn keine Beschreibung erwünscht ist." allow_duplicate_topic_titles: "Erlaube Themen mit identischen und doppelten Titeln." unique_posts_mins: "Minuten, nach denen ein Nutzer denselben Inhalt noch einmal posten kann." educate_until_posts: "Zeige das Hilfe-Panel im Editor sobald ein Nutzer einen seiner ersten (n) Beiträge zu schreiben beginnt." @@ -762,6 +761,7 @@ de: suppress_reply_directly_above: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der beantwortete Beitrag direkt darüber angezeigt wird." suppress_reply_when_quoting: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der Beitrag den beantworteten Beitrag zitiert." max_reply_history: "Maximale Anzahl an Antworten beim Ausklappen von in-reply-to" + experimental_reply_expansion: "Verstecke dazwischenliegende Beiträge, wenn der beantwortete Beitrag erweitert wird (experimentell)." topics_per_period_in_top_summary: "Anzahl der Themen, die in der Top-Themübersicht angezeigt werden." topics_per_period_in_top_page: "Anzahl der Themen, die in der mit \"Mehr zeigen\" erweiterten Top-Themenübersicht angezeigt werden." redirect_users_to_top_page: "Verweise neue und länger abwesende Nutzer automatisch zur Top Übersichtsseite" @@ -1013,7 +1013,7 @@ de: feed_polling_enabled: "NUR WENN EINGEBETTET: Bestimmt, ob Inhalte eines RSS-/ATOM-Feeds als zusätzliche Beiträge dargestellt werden." feed_polling_url: "NUR WENN EINGEBETTET: URL des einzubettenden RSS-/ATOM-Feeds." embed_by_username: "Discourse-Benutzername des Benutzers, der die eingebetteten Themen erstellt." - embed_username_key_from_feed: "Schlüsse, um Discourse-Benutzernamen aus Feed zu ziehen." + embed_username_key_from_feed: "Schlüssel, um Discourse-Benutzernamen aus Feed zu ermitteln." embed_truncate: "Kürze die eingebetteten Beiträge" embed_post_limit: "Maximale Anzahl der Beiträge die eingebettet werden." embed_username_required: "Der Benutzername ist für die Betragserstellung notwendig" @@ -1452,8 +1452,22 @@ de: Dein Benutzerkonto, assoziiert mit dieser E-Mail Adresse ist nicht aktiviert. Bitte aktiviere dein Konto bevor du E-Mails sendest. email_reject_reply_user_not_matching: subject_template: "[%{site_name}] E-Mail Problem -- Antwort Nutzer stimmt nicht überein" + text_body_template: | + Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (mit dem Titel %{former_title}) hat nicht funktioniert. + + Deine Antwort wurde von einer anderen E-Mail-Adresse versandt als wir erwartet haben, weshalb wir nicht sicher wissen ob das die gleiche Person ist. Probiere eine andere Absenderadresse oder wende dich an einen Mitarbeiter. + email_reject_no_message_id: + subject_template: "[%{site_name}] E-Mail-Problem -- Keine Message-Id" + text_body_template: | + Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (mit dem Titel %{former_title}) hat nicht funktioniert. + + Wir konnten keinen `Message-Id`-Header in der E-Mail finden. Probiere eine andere Absenderadresse oder wende dich an einen Mitarbeiter. email_reject_no_account: subject_template: "[%{site_name}] E-Mail-Problem -- Unbekanntes Konto" + text_body_template: | + Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (mit dem Titel %{former_title}) hat nicht funktioniert. + + Wir konnten keinen Account finden, der zu deiner E-Mail-Adresse passt. Probiere eine andere Absenderadresse oder wende dich an einen Mitarbeiter. email_reject_empty: subject_template: "[%{site_name}] E-Mail-Problem -- Kein Inhalt" text_body_template: | @@ -1474,17 +1488,24 @@ de: Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (Titel: %{former_title}) hat nicht funktioniert. Dein Nutzerkonto verfügt nicht über die nötigen Rechte, um in dieser Kategorie ein neues Thema anzulegen. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem unserer Mitarbeiter auf. + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] E-Mail-Problem -- Zugriff nicht erlaubt" + text_body_template: | + Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (mit dem Titel %{former_title}) hat nicht funktioniert. + + Die Kategorie, an die du diese E-Mail gesendet hast, erlaubt nur Antworten von Nutzern mit gültigem Konto und bekannter E-Mail-Adresse. Wenn du glaubst, dass dies ein Fehler ist, wende dich bitte an einen Mitarbeiter. + email_reject_invalid_post: + subject_template: "[%{site_name}] E-Mail-Problem -- Ungültiger Beitrag" + text_body_template: | + Es tut uns leid, aber deine E-Mail-Nachricht an %{destination} (mit dem Titel %{former_title}) hat nicht funktioniert. + + Mögliche Gründe sind komplizierte Formatierung und zu lange oder kurze Nachrichten. Bitte versuche es erneut oder schreibe deinen Beitrag über die Website. + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] E-Mail-Problem -- Ungültiger Beitrag" email_reject_reply_key: subject_template: "[%{site_name}] E-Mail-Problem -- Unbekannter Antwort-Schlüssel" - text_body_template: | - Es tut uns leid, aber die E-Mail-Nachricht an %{destination} (Titel: „%{former_title}“) hat nicht geklappt. - Der angegebene Antwort-Schlüssel ist ungültig oder unbekannt. Wir wissen daher nicht auf welchen Beitrag diese E-Mail antwortet. Kontaktiere einen Mitarbeiter. email_reject_topic_not_found: subject_template: "[%{site_name}] E-Mail Problem -- Thema nicht gefunden" - text_body_template: | - Entschuldigung, aber mit deiner E-Mail-Nachricht an %{destination} (Titel: %{former_title}) gab es ein Problem. - - Das Thema ist uns nicht bekannt oder es wurde gelöscht bzw. geschlossen. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem unserer Mitarbeiter auf. email_reject_topic_closed: subject_template: "[%{site_name}] E-Mail Problem -- Thema geschlossen" text_body_template: | @@ -1493,16 +1514,8 @@ de: Das Thema ist uns nicht bekannt oder es wurde gelöscht bzw. geschlossen. Wenn du glaubst, dass dies ein Irrtum ist, nimm bitte Kontakt mit einem unserer Mitarbeiter auf. email_reject_auto_generated: subject_template: "[%{site_name}] E-Mail Problem -- Automatisch erzeugte Antwort" - text_body_template: | - Entschuldigung, aber mit deiner E-Mail-Nachricht an %{destination} (Titel: %{former_title}) gab es ein Problem. - - Das Thema wurde geschlossen. Wenn du glaubst das dies ein Irrtum ist, nimm bitte Kontakt mit einem unserer Mitarbeiter auf. email_error_notification: subject_template: "[%{site_name}] E-Mail-Problem -- POP-Authentifizierungsfehler" - text_body_template: | - Es gab einen Authentifizierungsfehler beim Abrufen von Mails vom POP-Server. - - Bitte stelle sicher, dass du die POP-Zugangsdaten in [den Seiteneinstellungen](%{base_url}/admin/site_settings/category/email) korrekt konfiguriert hast. too_many_spam_flags: subject_template: "Neues Benutzerkonto gesperrt" text_body_template: | diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index adabb2c274..aa0bd45b17 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -27,6 +27,9 @@ pt: purge_reason: "Automaticamente eliminado devido a abandono, conta inativada" disable_remote_images_download_reason: "O download remoto de imagens foi desativado por não haver espaço disponível no disco." anonymous: "Anónimo" + emails: + incoming: + default_subject: "Email de entrada de %{email}" errors: &errors format: '%{attribute} %{message}' messages: @@ -311,6 +314,7 @@ pt: one: "Não é possível eliminar esta categoria porque contém 1 tópico. O tópico mais antigo é %{topic_link}." other: "Não é possível eliminar esta categoria porque contém %{count} tópicos. O tópico mais antigo é %{topic_link}." topic_exists_no_oldest: "Não é possível eliminar esta categoria porque a contagem de tópicos é de %{count}." + uncategorized_description: "Tópicos que não precisam de uma categoria ou que não se encaixam em nenhuma outra categoria existente." trust_levels: newuser: title: "novo utilizador" @@ -695,7 +699,6 @@ pt: min_search_term_length: "Tamanho mínimo válido para termos de pesquisa, em caracteres" search_tokenize_chinese_japanese_korean: "Forçar pesquisa para atomizar Chinês/Japonês/Coreano mesmo em sites que não sejam CJC" allow_uncategorized_topics: "Permitir a criação de tópicos sem categoria. AVISO: Se houver quaisquer tópicos não categorizados, tem que re-categorizá-los antes de desligar isto." - uncategorized_description: "Descrição da categoria sem classificação. Deixar em branco para nenhuma descrição." allow_duplicate_topic_titles: "Permitir tópicos com títulos idênticos e duplicados." unique_posts_mins: "Quantos minutos antes que um utilizador possa criar uma mensagem com o mesmo conteúdo outra vez?" educate_until_posts: "Quando um utilizador começar a escrever as primeiras (n) novas mensagens, mostrar o painel pop-up de educação do novo utilizador no editor." @@ -781,6 +784,7 @@ pt: suppress_reply_directly_above: "Não mostrar em-resposta-a expansível quando há apenas uma única resposta diretamente acima desta publicação." suppress_reply_when_quoting: "Não mostraR em-resposta-a expansível numa mensagem quando esta cita uma resposta." max_reply_history: "Número máximo de respostas a serem expandidas quando se expande em-resposta-a" + experimental_reply_expansion: "Esconder respostas intermédias ao expandir uma resposta-a (experimental)" topics_per_period_in_top_summary: "Número de tópicos principais mostrados no resumo padrão de tópicos principais." topics_per_period_in_top_page: "Número de tópicos principais mostrados em 'Mostrar Mais' tópicos principais expandido." redirect_users_to_top_page: "Redirecionar automaticamente os utilizadores novos e ausentes por períodos longos para o topo da página." @@ -844,6 +848,9 @@ pt: active_user_rate_limit_secs: "Qual a frequência de atualização do campo 'última vez visto em', em segundos." verbose_localization: "Mostrar extensas dicas de localização na IU" previous_visit_timeout_hours: "Quanto tempo dura uma visita antes de a considerarmos como 'visita anterior', em horas." + top_topics_formula_log_views_multiplier: "fórmula do multiplicador (n) de visualizações logarítmica nos melhores tópicos: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "fórmula do multiplicador (n) de primeiros gostos nos melhores tópicos: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "fórmula do multiplicador (n) de menos gostos nos melhores tópicos: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" rate_limit_create_topic: "Após a criação de um tópico, os utilizadores devem esperar (n) segundos antes de criarem um novo tópico." rate_limit_create_post: "Após a publicação, os utilizadores devem esperar (n) segundos antes de criarem outra mensagem." rate_limit_new_user_create_topic: "Após a criação de um tópico, os novos utilizadores devem esperar (n) segundos antes de criarem um novo tópico." @@ -900,6 +907,7 @@ pt: tl3_links_no_follow: "Não remover rel=nofollow das hiperligações publicadas por utilizadores com Nível de Confiança 3." min_trust_to_create_topic: "O Nível de Confiança mínimo necessário para criar um novo tópico." min_trust_to_edit_wiki_post: "O nível mínimo de confiança necessário para editar mensagens marcadas como wiki." + min_trust_to_allow_self_wiki: "O nível mínimo de confiança necessário para criar mensagens wiki próprias." min_trust_to_send_messages: "O nível de confiança mínimo necessário para criar mensagens privadas." newuser_max_links: "Quantas hiperligações um novo utilizador pode adicionar a uma mensagem." newuser_max_images: "Quantas imagens um novo utilizador pode adicionar a uma mensagem." @@ -910,6 +918,7 @@ pt: max_users_notified_per_group_mention: "Número máximo de utilizadores que podem receber uma notificação se um grupo é mencionado (se o limite é atingido, nenhuma notificação será levantada)" create_thumbnails: "Criar imagens miniatura e lightbox que são demasiado largas para caber numa mensagem." email_time_window_mins: "Esperar (n) minutos antes de enviar quaisquer emails de notificação, para dar aos utilizadores a hipótese de editarem e finalizarem as suas mensagens." + private_email_time_window_seconds: "Espere (n) segundos antes de enviar emails de notificação privados, para dar aos utilizadores a oportunidade de editar e finalizar as suas mensagens." email_posts_context: "Quantas respostas prévias a serem incluídas como contexto em emails de notificação." flush_timings_secs: "Com que frequência o servidor é alimentado com dados de sincronização, em segundos." title_max_word_length: "Tamanho máximo permitido de comprimento de palavras, em caracteres, no título de um tópico." @@ -964,6 +973,9 @@ pt: strip_images_from_short_emails: "Remover imagens de emails cujo tamanho seja inferior a 2800 Bytes" short_email_length: "Comprimento de email curto, em Bytes" display_name_on_email_from: "Exibir nomes completos em campos do formulário de email" + unsubscribe_via_email: "Permitir aos utilizadores cancelar a subscrição de emails enviando um email com \"unsubscribe\" no assunto ou no corpo do email" + unsubscribe_via_email_footer: "Adicionar uma hiperligação de cancelamento de subscrição ao rodapé de emails enviados" + delete_email_logs_after_days: "Apagar registos de email após (N) dias. 0 para os manter indefinidamente" pop3_polling_enabled: "Solicitação através de POP3 para respostas de emails" pop3_polling_ssl: "Utilize SSL ao ligar a um servidor POP3. (Recomendado)" pop3_polling_period_mins: "Período em minutos entre a verificação da conta POP3 para o email. NOTA: requer reinicialização." @@ -1190,12 +1202,23 @@ pt: must_begin_with_alphanumeric: "tem que começar com uma letra ou número ou um sublinhado" must_end_with_alphanumeric: "tem que terminar com uma letra ou número ou um sublinhado" must_not_contain_two_special_chars_in_seq: "não deve conter uma sequência de 2 ou mais caracteres especiais (.-_)" + must_not_end_with_confusing_suffix: "não deve terminar com um sufixo confuso tal como .json ou .png etc." email: not_allowed: "este provedor de emails não é permitido. Por favor utilize outro endereço de email." blocked: "não é permitido." ip_address: blocked: "Novos registos não são permitidos a partir do seu endereço IP." max_new_accounts_per_registration_ip: "Novos registos não são permitidos a partir do seu endereço IP (limite máximo atingido).Contacte um membro do pessoal." + unsubscribe_mailer: + subject_template: "Confirme que não quer receber emails com actualizações de %{site_title}" + text_body_template: | + Alguém (possivelmente você?) pediu para não receber mais emails com com actualizações de %{site_domain_name} neste endereço. + Se confirma este pedido por favor carregue nesta hiperligação: + + %{confirm_unsubscribe_link} + + + Se quiser continuar a receber emails com actualizações pode ignorar este email. invite_mailer: subject_template: "%{invitee_name} convidou-o a juntar-se a '%{topic_title}' em %{site_domain_name}" text_body_template: | @@ -1280,6 +1303,8 @@ pt: post_hidden: subject_template: "Mensagem oculta devido a sinalizações da comunidade" text_body_template: "Olá,\n\nEsta é uma mensagem automática de %{site_name} para informá-lo que a sua mensagem foi oculta. \n\n%{base_url}%{url} \n\n%{flag_reason}\n\nMúltiplos membros da comunidade sinalizaram esta mensagem antes de ser escondida, por isso considere como poderá rever a sua mensagem para refletir o seu feedback. **Pode editar a sua mensagem após %{edit_delay} minutos, e esta será automaticamente exibida.**\n\nContudo, se a mensagem for escondida pela comunidade uma segunda vez, irá manter-se escondida até ser tratada pelo pessoal – e poderão ainda ocorrer ações, incluindo uma possível suspensão da sua conta.\n\nPara orientação adicional, por favor consulte as [diretrizes da comunidade](%{base_url}/guidelines).\n" + usage_tips: + text_body_template: "Aqui ficam algumas dicas para que possa começar:\n\n## Leitura \n\nPara ler mais, **simplesmente continue a arrastar para baixo!** \n\nÀ medida que novas mensagens ou novos tópicos surgem, estes irão surgir automaticamente – não é necessário actualizar a página.\n\n## Navegação\n\nPara pesquisar, a sua página de utilizador, ou o menu , utilize **o ícone no canto superior direito**.\n\n- A selecção de um título do tópico leva-o sempre para a **próxima resposta não lida** no tópico. Para entrar na parte superior ou inferior, seleccione a contagem de resposta ou última data de resposta em seu lugar.\n\n \n\n- Ao ler um tópico, selecione a barra de progresso no canto inferior direito para controlos de navegação completos. Salte rapidamente para o topo ao selecionar o título do tópico. Pressione ? para uma lista rápida de atalhos do teclado.\n\n \n\n## Responder\n\n- Para responder ao **tópico em geral**, utilize no final de cada tópico.\n\n- Para responder a uma **pessoa específica**, utilize nas suas mensagens.\n\n- Para responder com um **novo tópico**, utilize à direita desta mensagem. Tanto os tópicos antigos como os novos serão ligados automaticamente.\n\nA sua resposta pode ser formatada com HTML simplificado, BBCode ou [Markdown](http://commonmark.org/help/):\n\n Isto é **negrito**.\n Isto é negrito.\n Isto é [b]negrito[/b].\n\nQuer aprender Markdown [Faça o nosso curso interactivo de 10 minutos!](http://commonmark.org/help/tutorial/)\n\nPara inserir uma citação, seleccione o texto que deseja citar e de seguida pressione qualquer botão de Resposta. Repetir para múltiplas citações.\n\n\n\nPara notificar alguém da sua resposta, mencione o seu nome. Digite `@` para começar a seleccionar um nome de utilizador.\n\n\n\nPara utilizar [Emoji padrão](http://www.emoji.codes/), simplesmente digite `:` para encontrar por nome, ou os tradicionais risonhos `;)`\n\n\n\nPara gerar um sumário para uma hiperligação, cole-o numa linha por si só:\n\n\n\n## Acções\n\nExistem botões de acção no final de cada mensagem:\n\n\n\nPara deixar alguém saber que gostou e apreciou as suas mensagens, utilize o botão **gosto**. Partilhe o amor!\n\nSe vir um problema com uma mensagem de alguém, avise a pessoa em privado, ou avise [o nosso pessoal](%{base_url}/about), sobre a mesma utilizando o botão **sinalizar**. Pode também **partilhar** uma hiperligação para uma mensagem, ou **marcá-la** para mais tarde ter a referência na sua página de utilizador.\n\n## Notificações\n\nQuando alguém lhe responde, cita a sua mensagem ou menciona o seu `@nome-de-utilizador`, um número irá aparecer imediatamente no canto superior direito na página. Utilize-o para aceder às suas **notificações**.\n\n\n\nNão se preocupe em falhar uma resposta – irá receber notificações por email que chegam quando está ausente.\n\n## As Suas Preferências\n\n - Todos os tópicos com menos de **dois dias** são considerados novos.\n\n - Qualquer tópico em que tenha **participado activamente** (respondido, criado, ou lido por um extenso período) será acompanhado automaticamente.\n\nVerá o indicador numérico e o indicador azul novo junto desses tópicos:\n\n\n\nPode alterar as suas notificações para qualquer tópico através do controlo de notificações no final do tópico.\n\n\n\nPode também configurar estados de notificação por categoria, se quer observar cada novo tópico numa categoria específica.\n\nTo change any of these settings, see [your user preferences](%{base_url}/my/preferences).\n\n## Confiança da Comunidade\n\nÀ medida que for participando aqui, irá ganhar confiança por parte da comunidade, tornar-se um cidadão completo e limitações de novos utilizadores serão automaticamente removidas. Com um [nível de confiança] suficientemente alto (https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), irá ganhar novas capacidades para ajudar-nos a gerir a comunidade em conjunto.\n" welcome_user: subject_template: "Bem-vindo a %{site_name}!" text_body_template: | @@ -1364,12 +1389,38 @@ pt: csv_export_failed: subject_template: "A exportação dos dados falhou" text_body_template: "Pedimos desculpa mas a sua exportação de dados falhou. Por favor verifique os registos do log ou contacte um membro do pessoal." - email_reject_no_account: - subject_template: "[%{site_name}] Problema de email -- Conta Desconhecida" + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problema com Email -- Insuficiente nível de confiança" + text_body_template: | + Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) falhou. + + A sua conta não possui o nível de confiança necessário para criar novos tópicos para este endereço de email. Se acredita que isto é um erro contacte alguém do pessoal. + email_reject_inactive_user: + subject_template: "[%{site_name}] Problema de email -- Utilizador inactivo" text_body_template: | Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. - Não há nenhuma conta de utilizador conhecida com este endereço de email. Tente enviar a partir de um endereço de email diferente, ou contacte um membro do pessoal. + A sua conta associada com este email não está activa. Por favor active a sua conta antes de enviar emails. + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] Problema de email -- Utilizador de resposta não encontrado" + text_body_template: |+ + Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. + + A sua resposta foi enviada de um email diferente daquele que esperávamos, por esta razão não temos a certeza que seja a mesma pessoa. Tente enviar de outro endereço de email ou contacte um membro do pessoal. + + email_reject_no_message_id: + subject_template: "[%{site_name}] Problema de email -- Sem identificador de mensagem" + text_body_template: | + Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. + + Não conseguimos encontrar o `Message-Id` nos cabeçalhos do email. Tente enviar através de outro endereço de email ou contacte um membro do pessoal. + email_reject_no_account: + subject_template: "[%{site_name}] Problema de email -- Conta Desconhecida" + text_body_template: |+ + Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. + + Não conseguimos encontrar nenhuma conta com combine com o seu endereço de email. Tente enviar de outro endereço de email ou contacte um membro do pessoal. + email_reject_empty: subject_template: "[%{site_name}] Problema de email -- Sem Conteúdo" text_body_template: | @@ -1390,18 +1441,53 @@ pt: Pedimos desculpa, mas a sua mensagem de email para %{destination} (título %{former_title}) não funcionou. A sua conta não tem privilégios para publicar novos tópicos nessa categoria. Se acredita que isto é um erro, contacte um membro do pessoal. - email_reject_reply_key: - subject_template: "[%{site_name}] Problema de email -- Chave de Resposta Desconhecida" + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] Problema de email -- Acesso Inválido" + text_body_template: |+ + Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) não funcionou. + + A categoria que enviou neste email apenas permite respostas de utilizadores com contas validadas e endereços de email conhecidos. Se acredita ser um erro contacto um membro do pessoal. + + email_reject_invalid_post: + subject_template: "[%{site_name}] Problema de email -- Erro de publicação" text_body_template: | Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) não funcionou. - A chave de resposta fornecida é inválida ou desconhecida, por isso não sabemos a que resposta corresponde este email. Contacte um membro do pessoal. + Algumas causas possíveis são: formatação complexa, mensagem demasiado grande, mensagem demasiado pequena. Por favor tente novamente, ou publique através do sítio se isto continuar. + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] Problema de email -- Erro de publicação" + text_body_template: | + Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) não funcionou. + + Motivo: + + %{post_error} + + Se conseguir corrigir o problema, tente novamente. + email_reject_invalid_post_action: + subject_template: "[%{site_name}] Problema de email -- Acção de Post inválida" + text_body_template: | + Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) não funcionou. + + A acção Post não foi reconhecida. Por favor tente novamente, ou publique através do sítio se isto continuar. + email_reject_reply_key: + subject_template: "[%{site_name}] Problema de email -- Chave de Resposta Desconhecida" + text_body_template: | + Pedimos desculpa, mas a sua mensagem de email para %{destination} (título %{former_title}) não funcionou. + + A chave de resposta no email é inválida ou desconhecida e por isso não conseguimos determinar a que email estava a responder. Contacte um membro do pessoal. + email_reject_bad_destination_address: + subject_template: "[%{site_name}] Problema de email -- Endereço Para: Desconhecido" + text_body_template: | + Pedimos desculpa mas a sua mensagem de email para %{destination} (titled %{former_title}) não funcionou. + + Nenhum dos endereços de destino é reconhecido. Por favor, certifique-se que está a enviar o endereço de email correcto fornecido pelo pessoal. email_reject_topic_not_found: subject_template: "[%{site_name}] Problema de email -- Tópico Não Encontrado" text_body_template: | Pedimos desculpa, mas a sua mensagem de email para %{destination} (título %{former_title}) não funcionou. - O tópico ao qual está a responder já não existe, talvez tenha sido eliminado? Se acredita que isto é um erro, contacte um membro do pessoal. + O tópico ao qual está a responder já não existe -- talvez tenha sido apagado. Se acredita que isto é um erro, contacte um membro do pessoal. email_reject_topic_closed: subject_template: "[%{site_name}] Problema de email -- Tópico Encerrado" text_body_template: | @@ -1413,13 +1499,15 @@ pt: text_body_template: | Pedimos desculpa, mas a sua mensagem de email para %{destination} (título %{former_title}) não funcionou. - O seu email foi marcado como "auto gerado", o qual não podemos aceitar. Se acredita que isto é um erro, contacte um membro do pessoal. + O seu email foi marcado como "gerado automaticamente", o que quer dizer que foi automaticamente criado por um computador em vez de ser escrito por uma pessoa; não podemos aceitar esse tipo de emails. Se acredita que isto é um erro, contacte um membro do pessoal. email_error_notification: subject_template: "[%{site_name}] Problema de email -- Erro de autenticação POP" text_body_template: | - Ocorreu um erro de autenticação ao recuperar emails do servidor POP. + Ocorreu um erro de autenticação ao recuperar emails do servidor POP. - Por favor certifique-se que configurou corretamente as credenciais POP em [configurações do sítio](%{base_url}/admin/site_settings/category/email). + Por favor certifique-se que configurou correctamente as credenciais POP em [configurações do sítio](%{base_url}/admin/site_settings/category/email). + + Se existe uma interface web para a sua conta de POP de email pode necessitar se iniciar sessão na interface web e verificar a suas configurações aí. too_many_spam_flags: subject_template: "Nova conta bloqueada" text_body_template: | @@ -1470,6 +1558,10 @@ pt: download_remote_images_disabled: subject_template: "Descarregamento de imagens remotas desativado" text_body_template: "A configuração `download_remote_images_to_local` foi desativada porque o limite de espaço em disco em `download_remote_images_threshold` foi alcançado." + unsubscribe_link: | + Para parar de receber notificações para este tópico em particular, [clique aqui](%{unsubscribe_url}). Para cancelar a subscrição destes emails, altere as suas [preferências de utilizador](%{user_preferences_url}). + unsubscribe_via_email_link: | + ou, [carregue aqui](mailto:reply@%{hostname}?subject=unsubscribe) para cancelar a subscrição via email. subject_re: "Re:" subject_pm: "[MP]" user_notifications: @@ -1477,6 +1569,10 @@ pt: unsubscribe: title: "Cancelar a Subscrição" description: "Não está interessado em receber estes emails? Não há problema! Clique em baixo para cancelar a subscrição instantaneamente:" + reply_by_email: "[Consultar Tópico](%{base_url}%{url}) ou responda a este email para responder" + visit_link_to_respond: "[Consultar Tópico](%{base_url}%{url}) para responder" + reply_by_email_pm: "[Consultar Mensagem](%{base_url}%{url}) ou responda a este email para responder" + visit_link_to_respond_pm: "[Consultar Mensagem](%{base_url}%{url}) para responder" posted_by: "Publicado por %{username} em %{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} convidou-o para uma mensagem '%{topic_title}'" @@ -1533,6 +1629,17 @@ pt: %{context} + --- + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [MP] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + --- %{respond_instructions} user_quoted: diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index 5ad1ce158b..6cc8e3a3b4 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -735,7 +735,6 @@ sk: min_search_term_length: "Minimálny povolený počet znakov vo vyhľadávaní" search_tokenize_chinese_japanese_korean: "Prinúť vyhľádávanie rozložiť Čínštinu/Japončinu/Kórejčinu dokonca i pre nie CJK stránky" allow_uncategorized_topics: "Pvoliť vytváranie tém bez kategórií. UPOZORNENIE: Pokiaľ existujú nekategorizované témy, musíte ich zaradiť do kategórii skôr než túto možnosť vypnete." - uncategorized_description: "Popis nekategorizovanej kategórie. Nechajte prázdne pre žiadny popis.." allow_duplicate_topic_titles: "Povoliť témy s rovnakými, duplikovanými názvami" unique_posts_mins: "Koľko minút musí byť medzi dvomi rovnakými príspevkami od jedného užívateľa." educate_until_posts: "Ked užívateľ začne písať svojich prvých (n) príspevkov, zobraz sprievodcu vzdelávania pre nového užívateľa. " @@ -1414,6 +1413,20 @@ sk: system_messages: post_hidden: subject_template: "Príspevok skrytý z dôvodu konumitného označenia vlajkou" + text_body_template: | + Dobrý deň, + + toto je automaticky generovaná správa od %{site_name}, aby ste boli informovaní, že váš príspevok bol skrytý. + + %{base_url}%{url} + + %{flag_reason} + + Viacero členov komunity označilo tento príspevok predtým, ako bol skrytý, takže skúste, prosím, zvážiť, ako by ste mohli príspevok upraviť, aby odrážal ich spätnú väzbu. **Váš príspevok môžete upraviť po %{edit_delay} minútach a bude automaticky opäť zobrazený.** + + Avšak pokiaľ bude príspevok skrytý komunitou druhýkrát, ostane skrytý dovtedy, pokiaľ sa o to nepostarajú moderátori – a tam môže dôjsť k ďalším akciám, ako napr. možné pozastavenie vášho účtu. + + Ohľadom ďalšieho poradenstva si, prosím, pozrite naše [community guidelines](%{base_url}/pokyny). usage_tips: text_body_template: | Tu je niekoľko rád, ako začať: @@ -1554,6 +1567,8 @@ sk: subject_template: "Export dát kompletný" csv_export_failed: subject_template: "Export dát zlyhal" + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Problém s emailom -- Nízka úroveň dôvery" email_reject_inactive_user: subject_template: "[%{site_name}] Problém s emailom -- Neaktívny užívateľ" email_reject_no_account: @@ -1584,6 +1599,8 @@ sk: subject_template: "[%{site_name}] Problém s emailom -- Chyba pri uverejnení" email_reject_invalid_post_specified: subject_template: "[%{site_name}] Problém s emailom -- Chyba pri uverejnení" + email_reject_invalid_post_action: + subject_template: "[%{site_name}] Problém s emailom -- Neplatná akcia k príspevku" email_reject_reply_key: subject_template: "[%{site_name}] Problém s emailom -- Neznámy kľúč odpovede" email_reject_bad_destination_address: @@ -1598,20 +1615,16 @@ sk: Téma, na ktorú odpovedáte je s súčasnosti uzavretá a ďalelšie odpovede nie sú akceptované. Ak si myslíte, že ide o chybu, kontaktujte zamestnanca stránok. email_reject_auto_generated: subject_template: "[%{site_name}] Problém s emailom -- Automaticky generovaná odpoveď" - text_body_template: | - Prepáčte, ale Vaša emailová správa na %{destination} (titled %{former_title}) nefungovala. - - Váš email bol označený ako "automaticky generovaný", čo neakceptujeme. Ak si myslíte, že ide o problém, kontaktujte zamestnanca stránok. email_error_notification: subject_template: "[%{site_name}] Problém s emailom -- Chyba pri POP autentifikácií" - text_body_template: | - V priebehu načítania emailov z POP serveru nastala autintifikačná chyba. - - Prosíme, uistite sa, že ste v [the site settings](%{base_url}/admin/site_settings/category/email) správne nastavili POP parametre. too_many_spam_flags: subject_template: "Nový účet je zablokovaný" blocked_by_staff: subject_template: "Účet je zablokovaný" + user_automatically_blocked: + subject_template: "Nový uživateľ %{username} je zablokovaný kôli označeniu komunitou" + spam_post_blocked: + subject_template: "Nový uživateľ %{username} je zablokovaný kôli opakovaným odkazom" unblocked: subject_template: "Učet je odblokovaný" text_body_template: | @@ -1625,13 +1638,29 @@ sk: one: "1 užívateľ čaká na schválenie" few: "%{count} užívateľia čakajú na schválenie" other: "%{count} užívateľov čaká na schválenie" + download_remote_images_disabled: + subject_template: "Sťahovanie vzdialených obrázkov je zablokované." + unsubscribe_via_email_link: |+ + alebo, [kliknite sem](mailto:reply@%{hostname}?subject=unsubscribe) pre odhlásenie prostredníctvom emailu. + subject_re: "Re:" subject_pm: "[PM]" user_notifications: previous_discussion: "Prechádzajúce odpovede" unsubscribe: title: "Odhlásiť" + description: "Nezaujímajú Vás už tieto emaily? Žiadny problém! Pre okamžité odhlásenie kliknite nižšie: " + reply_by_email: "[Pozrite tému](%{base_url}%{url}), alebo zareagujte odpoveďou na tento email" + visit_link_to_respond: "[Pozrite tému](%{base_url}%{url}) pre reakciu" + reply_by_email_pm: "[Pozrite správu](%{base_url}%{url}), alebo zareagujte odpoveďou na tento email" + visit_link_to_respond_pm: "[Pozrite správu](%{base_url}%{url}) pre reakciu" + posted_by: "Príspevok od %{username} dňa %{post_date}" + user_invited_to_private_message_pm: + subject_template: "[%{site_name}] %{username} Vás pozval k správe '%{topic_title}'" + user_invited_to_private_message_pm_staged: + subject_template: "[%{site_name}] %{username} Vás pozval k správe '%{topic_title}'" user_invited_to_topic: + subject_template: "[%{site_name}] %{username} Vás pozval k téme '%{topic_title}'" text_body_template: |2 %{username} Vás pozval do diskusie @@ -1654,6 +1683,17 @@ sk: %{context} + --- + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + --- %{respond_instructions} user_quoted: @@ -1728,15 +1768,28 @@ sk: click_here: "kliknite tu" from: "%{site_name} výber" read_more: "Čítať viac" + more_topics: "Boli vytvorené %{new_topics_since_seen} ďalšie nové témy." more_topics_category: "Viac nových tém:" forgot_password: subject_template: "[%{site_name}] Obnovenie hesla" + text_body_template: | + Niekto si vyžiadal reset Vášho hesla na [%{site_name}](%{base_url}). + + Ak ste to neboli Vy, môžte ignorovať tento email. + + Pre zmenu hesl kliknite na nasledujúci odkaz + %{base_url}/users/password-reset/%{email_token} set_password: subject_template: "[%{site_name}] Nastaviť heslo" admin_login: subject_template: "[%{site_name}] Prihlásenie" account_created: subject_template: "[%{site_name}] Váš nový účet" + text_body_template: | + Nový účet bol pre Vás vytvorený na %{site_name} + + Kliknite na nasledujúci odkaz pre nastavenie hesla k Vášmu novému účtu: + %{base_url}/users/password-reset/%{email_token} authorize_email: subject_template: "[%{site_name}] Potvrďte Vašu novú email adresu" text_body_template: | diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index 094d7b1162..15dc847ba8 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -734,9 +734,14 @@ vi: max_reply_history: "Số tối đa trả lời được mở rộng khi trả lời mở rộng" experimental_reply_expansion: "Ẩn các trả lời trung gian khi mở rộng trả lời (thử nghiệm)" topics_per_period_in_top_summary: "Số lượng chủ đề top hiển thị trong tóm tắt các chủ đề top theo mặc định." + topics_per_period_in_top_page: "Số lượng chủ đề top hiển thị khi click 'Xem thêm'." + redirect_users_to_top_page: "Tự động chuyển thành viên mới và vắng mặt lâu ngày lên trên cùng trang." + top_page_default_timeframe: "Khung thời gian mặc định cho trang xem trên cùng." + show_email_on_profile: "Hiển thị email thành viên trên trang hồ hơ (chỉ cho họ và quản trị viên)" email_token_valid_hours: "Token quyên mật khẩu / kích hoạt tài khoản có giá trị trong (n) giờ." email_token_grace_period_hours: "Token quyên mật khẩu / kích hoạt tài khoản vẫn còn giá trị (n) giờ sau khi được gia hạn" enable_badges: "Kích hoạt hệ thống huy hiệu" + enable_whispers: "Cho phép quản trị viên giao tiếp riêng trong chủ đề. (thực nghiệm)" allow_index_in_robots_txt: "Chỉ rõ trong robots.txt trang web này cho phép tạo chỉ mục bởi web search engines." email_domains_blacklist: "Một danh sách đuôi email mà người dùng không được phép dùng để đăng ký tài khoản. Ví dụ: maillinator.com|trashmail.net. Lưu ý mỗi tên miền cách nhau bởi dấu \"|\"." email_domains_whitelist: "Danh sách tên miền người dùng ĐƯỢC PHÉP đăng ký tài khoản. CẢNH BÁO: người dùng với tên miền email khác trong danh sách sẽ không được phép đăng ký!" @@ -747,6 +752,7 @@ vi: port: "DEVELOPER ONLY! WARNING! Sử dụng HTTP port thay vì mặc định port 80. Để trống mặc định port 80." force_hostname: "DEVELOPER ONLY! LƯU Ý! Chỉ rõ hostname trong URL. Để trống là mặc định." invite_expiry_days: "Key mời người dùng có giới hạn bao lâu? tính theo ngày" + invite_passthrough_hours: "Bao lâu người dùng có thể sử dụng mã lời mời trước đó để đăng nhập, theo giờ" invite_only: "Đăng ký tự do đã khóa, tất cả người dùng phải được mời bởi những thành viên khác hoặc nhân viên." login_required: "Yêu cầu chứng thực để đọc nội dung trên trang web, không cho phép người dùng nặc danh truy cập." min_username_length: "Chiều dài username tối thiểu." @@ -755,10 +761,17 @@ vi: min_password_length: "Chiều dài mật khẩu tối thiểu." block_common_passwords: "Không cho phép mật khẩu trong danh sách 10.000 mật khẩu phổ biến." enable_sso: "Cho phép dùng single sign on bằng trang ngoài (CẢNH BÁO: ĐỊA CHỈ EMAIL CỦA NGƯỜI DÙNG PHẢI ĐƯỢC CHỨNG THỰC BỞI TRANG NGOÀI!)" + enable_sso_provider: "Thực hiện giao thức cung cấp Discourse SSO tại điểm cuối /session/sso_provider, yêu cầu phải thiết lập sso_secret" sso_url: "URL của single sign on enpoint" sso_secret: "Chuỗi bảo mật đã được sử dụng để chứng thực thông tin SSO, chắc chắn nó có ít nhất 10 ký tự." + sso_overrides_email: "Ghi đè email cục bộ với email trang ngoài từ SSO cho tất cả các lần đăng nhập, và ngăn chặn những thay đổi cục bộ. (LƯU Ý: sự khác biệt có thể xảy ra do sự bình thường hóa các email cục bộ)" + sso_overrides_username: "Ghi đè tên tài khoản cục bộ với tài khoản trang ngoài từ SSO cho tất cả các lần đăng nhập, và ngăn chặn những thay đổi cục bộ. (LƯU Ý: sự khác biệt có thể xảy ra do yêu cầu độ dài tên tài khoản khác nhau)" + sso_overrides_name: "Ghi đè tên thành viên cục bộ với tên thành viên trang ngoài từ SSO cho tất cả các lần đăng nhập, và ngăn chặn những thay đổi cục bộ." + sso_overrides_avatar: "Ghi đè avatar thành viên cục bộ với avatar thành viên trang ngoài từ SSO. Nếu bật, bạn nên vô hiệu hóa allow_uploaded_avatars" sso_not_approved_url: "Chuyển những tài khoản SSO chưa duyệt tới URL này" + enable_local_logins: "Bật tên tài khoản và mật khẩu đăng nhập cục bộ dựa trên tài khoản. (Chú ý: bật thiết lập này để kích hoạt chức năng gửi lời mời)" allow_new_registrations: "Cho phép đăng ký người dùng mới. Bỏ chọn để bất cứ ai cũng có thể tạo tài khoản mới." + enable_signup_cta: "Hiện thông báo với thành viên ẩn danh khi họ quay lại để yêu cầu họ đăng ký tài khoản." enable_yahoo_logins: "Cho phé chứng thực qua Yahoo" enable_google_oauth2_logins: "Cho phép chứng thực qua Google Oauth2. Nó là cách chứng thực mà Google hỗ trợ. Yêu cầu key và secret." google_oauth2_client_id: "Client ID ứng dụng Google của bạn." @@ -777,7 +790,15 @@ vi: automatic_backups_enabled: "Chạy sao lưu tự động như cấu hình trong tần số sao lưu" backup_frequency: "Tần số sao lưu trang web, trong ngày." enable_s3_backups: "Tải bản sao lưu lên S3 khi hoàn tất. QUAN TRỌNG: yêu cầu chứng thực S3 đã được nhập trong cấu hình File." + s3_backup_bucket: "Địa chỉ tách biệt lưu trữ backup. LƯU Ý: đây phải là địa chỉ được giành riêng." + backup_time_of_day: "Thời gian theo ngày UTC khi backup." + backup_with_uploads: "Kèm theo cả thư mục uploads theo lịch trình backup. Tắt tính năng này sẽ chỉ backup csdl." active_user_rate_limit_secs: "Tần số cập nhật trường 'last_seen_at, tính theo giây" + verbose_localization: "Hiển thị các mẹo trong giao diện người dùng" + previous_visit_timeout_hours: "Bao lâu lần ghé thăm cuối cùng được coi như lần ghé thăm 'trước', theo giờ" + top_topics_formula_log_views_multiplier: "giá trị nhật ký lượt xem nhân với (n) trong công thức chủ đề top: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "giá trị của lượt like bài viết đầu tiên nhân với (n) trong công thức chủ đề top: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "giá trị số lượt like tối thiểu của mỗi bài viết nhân với (n) trong công thức chủ đề top: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" rate_limit_create_topic: "Sau khi tạo một chủ đề, người dùng phải chờ (n) giây trước khi tạo một chủ đề khác." rate_limit_create_post: "Sau khi đăn bài, người dùng phải chờ (n) giây trước khi đăng bài khác." rate_limit_new_user_create_topic: "Sau khi tạo một chủ đề, người dùng mới phải chờ (n) giây trước khi tạo chủ đề khác." @@ -789,31 +810,69 @@ vi: max_topics_per_day: "Số chủ đề tối đa người dùng có thể tạo mỗi ngày." max_private_messages_per_day: "Số tin nhắn tối đa người dùng có thể tạo mỗi ngày." max_invites_per_day: "Số tối đa người dùng có thể gửi lời mời mỗi ngày." + max_topic_invitations_per_day: "Số tối đa lời mời chủ đề thành viên có thể gửi mỗi ngày." suggested_topics: "Số chủ đề gợi ý hiện ở cuối một chủ đề" limit_suggested_to_category: "Chỉ hiện thị những chủ đề từ danh mục hiện tại trong chủ đề gợi ý." + clean_up_uploads: "Loại bỏ không triệt các dòng mồ côi khi upload để ngăn chặn hosting bất hợp pháp. LƯU Ý: bạn cần phải backup thư mục /uploads trước khi bật thiết lập này." + clean_orphan_uploads_grace_period_hours: "Thời gian gia hạn (theo giờ) trước khi dòng mồ côi upload được loại bỏ." + purge_deleted_uploads_grace_period_days: "Thời gian gia hạn (theo ngày) trước khi upload cần xóa được xóa." + purge_unactivated_users_grace_period_days: "Thời gian gia hạn (theo ngày) trước khi người dùng chưa kích hoạt tài khoản sẽ được xóa." + enable_s3_uploads: "Đặt thư mục upload trên Amazon S3. QUAN TRỌNG: yêu cầu chứng thực S3 (cả ID khóa truy cập & khóa bảo mật)." + s3_use_iam_profile: 'Sử dụng AWS EC2 IAM để lấy khóa. LƯU Ý: bật thiết lập này sẽ ghi đè thiết lập "s3 access key id" và "s3 secret access key".' + s3_upload_bucket: "Tên Amazon S3 để lưu trữ các file sẽ được upload. CHÚ Ý: phải là chữ thường, không cách và không gạch dưới." s3_access_key_id: "Amazon S3 access key id này sẽ được sử dụng để tải lên ảnh." s3_secret_access_key: "Amazon S3 secret access key này sẽ được sử dụng để tải lên ảnh." s3_region: "Amazon S3 region name sẽ được sử dụng để tải lên ảnh." + s3_cdn_url: "CDN URL được sử dụng cho tất cả các tài nguyên S3 (vd: https://cdn.somewhere.com). CHÚ Ý: sau khi thay đổi thiết lập này bạn phải tạo lại các bài viết cũ." avatar_sizes: "Danh sách những kích thước hình đại diện tự động khởi tạo." external_system_avatars_enabled: "Sử dụng dịch vụ ảnh đại diện bên ngoài." + external_system_avatars_url: "URL của dịch vụ avatar ngoài, cho phép thay thế {username} {first_letter} {color} {size}" + default_opengraph_image_url: "URL của ảnh opengraph mặc định." + enable_flash_video_onebox: "Cho phép nhúng liên kết swf và flv (Adobe Flash). CHÚ Ý: có thể chứa đựng các rủi ro bảo mật." default_invitee_trust_level: "Bậc tin tưởng mặc định (0-4) cho thành viên được mời." + default_trust_level: "Cấp độ tin cậy mặc định (0-4) cho tất cả các thành viên mới. CHÚ Ý! Thay đổi thiết lập này sẽ đặt bạn vào nguy cơ spam cao." tl1_requires_topics_entered: "Số chủ đề một thành viên mới phải truy cập trước khi được lên bậc tin tưởng 1" tl1_requires_read_posts: "Số chủ đề một thành viên mới phải đọc trước khi được lên bậc tin tưởng 1" tl1_requires_time_spent_mins: "Số phút một thành viên mới phải đọc trước khi được lên bậc tin tưởng 1" tl2_requires_topics_entered: "Số chủ đề một thành viên mới phải truy cập trước khi được lên bậc tin tưởng 2" tl2_requires_read_posts: "Số chủ đề một thành viên mới phải đọc trước khi được lên bậc tin tưởng 2" tl2_requires_time_spent_mins: "Số phút một thành viên mới phải đọc trước khi được lên bậc tin tưởng 2" + tl2_requires_days_visited: "Số ngày một thành viên phải ghé thăm site trước khi được thăng lên bậc tin cậy cấp 2." + tl2_requires_likes_received: "Số like một thành viên phải nhận được trước khi được thăng lên bậc tin cậy cấp 2." + tl2_requires_likes_given: "Số like một thành viên phải thực hiện trước khi được thăng lên bậc tin cậy cấp 2." + tl2_requires_topic_reply_count: "Số chủ đề thành viên phải trả lời trước khi được thăng lên bậc tin cậy cấp 2." + tl3_time_period: "Khoảng thời gian độ tin cậy cấp 3 yêu cầu" + tl3_requires_days_visited: "Số ngày tối thiểu thành viên cần phải ghé thăm site trong khoảng 100 ngày gần đây trước khi được thăng lên độ tin cậy cấp 3. Đặt cao hơn khoảng thời gian tl3 để vô hiệu hóa thăng hạng tl3. (0 hoặc cao hơn)" + tl3_requires_topics_replied_to: "Số tối thiểu chủ đề thành viên phải trả lời trong 100 ngày gần đây trước khi được thăng lên bậc tin cậy cấp 3. (0 hoặc cao hơn)" + tl3_requires_topics_viewed: "Số phần trăm chủ đề được tạo trong khoảng 100 ngày gần đây mà thành viên cần phải xem trước khi được thăng lên độ tin cậy cấp 3. (từ 0 đến 100)" + tl3_requires_posts_read: "Phần trăm số bài viết được tạo trong khoảng 100 ngày gần đây mà thành viên cần xem để được thăng lên độ tin cậy cấp 3. (từ 0 tới 100)" + tl3_requires_topics_viewed_all_time: "Số lượng chủ đề tối thiểu mà thành viên phải xem trước khi được thăng lên độ tin cậy cấp 3." + tl3_requires_posts_read_all_time: "Tổng số bài viết tối thiểu mà thành viên phải đọc trước khi được thăng lên độ tin cậy cấp 3." + tl3_requires_max_flagged: "Thành viên phải không có nhiều hơn x bài viết bị đánh dấu bởi x thành viên khác trong khoảng 100 ngày gần đây để được thăng lên độ tin cậy cấp 3, với x là giá trị thiết lập. (0 hoặc cao hơn)" + tl3_promotion_min_duration: "Số ngày tối thiểu chương trình thăng hạng cấp 3 kéo dài trước khi thành viên có thể bị giáng cấp xuống độ tin cậy cấp 2." + tl3_requires_likes_given: "Số like tối thiểu mà thành viên phải thực hiện trong khoảng 100 ngày gần đây để được thăng lên độ tin cậy cấp 3." + tl3_requires_likes_received: "Số like tối thiểu mà thành viên phải nhận được trong khoảng 100 ngày gần đây để được thăng lên độ tin cậy cấp 3." + tl3_links_no_follow: "Không loại bỏ rel=nofollow khỏi các liên kết trong bài viết của thành viên có độ tin cậy cấp 3." min_trust_to_create_topic: "Bậc tin tưởng tối thiểu để tạo một chủ đề mới." + min_trust_to_edit_wiki_post: "Bậc tin cậy tối thiểu cần thiết để có thể sửa bài viết được đánh dấu là wiki." + min_trust_to_allow_self_wiki: "Bậc tin cậy tối thiểu cần thiết để người dùng có thể đánh dấu bài viết của họ là wiki." + min_trust_to_send_messages: "Bậc tin cậy tối thiểu cần thiết để có thể tạo hội thoại riêng." newuser_max_links: "Bao nhiêu liên kết tài khoản mới có thể thêm vào bài viết." newuser_max_images: "Bao nhiêu hình tài khoản mới có thể thêm vào bài viết." newuser_max_attachments: "Bao nhiêu đính kèm tài khoản mới có thể thêm vào bài viết" + newuser_max_mentions_per_post: "Số tối đa thông báo @name mà thành viên mới có thể sử dụng trong bài viết." + newuser_max_replies_per_topic: "Số lượng tối đa trả lời mà thành viên có thể thực hiện trong một chủ đề cho đến khi có ai đó gửi trả lời." + max_mentions_per_post: "Số tối đa thông báo @name mà tất cả mọi người có thể sử dụng trong bài viết." email_time_window_mins: "Chờ (n) phút trước khi gửi bất kỳ một email thông báo nào, để cung cấp cho người dùng cơ hội để chỉnh sửa và hoàn tất bài viết của họ." title_max_word_length: "Chiều dài tối đa chữ cho phép, tính theo ký tự, trong một tiêu đề chủ đề." + allow_uppercase_posts: "Cho phép viết hoa tất cả các chữ trong tên chủ đề hoặc nội dung bài viết." + title_fancy_entities: "Chuyển đổi các ký tự ASCII thành các đối tượng HTML trong tên chủ đề, http://daringfireball.net/projects/smartypants/" min_title_similar_length: "Chiều dài tối thiểu của tiêu đề trước khi kiểm tra trùng chủ đề." min_body_similar_length: "Chiều dài tối thiểu của nội dung bài viết trước khi kiểm trang chủ đề tương tự." category_colors: "Danh sách mã màu hexa cho phép cho danh mục." max_attachment_size_kb: "Kích thước file tải lên tối đa tính theo kB. đã cấu hình trong nginx (client_max_body_size) / apache hoặc proxy." authorized_extensions: "Danh sách định dạng file cho phép tải lên (sử dụng '*' để cho phép tất cả loại tập tin)" + max_similar_results: "Số lượng chủ đề tương tự hiển thị phía trên bộ soạn thảo khi soạn chủ đề mới, so sánh dựa trên tiêu đề và nội dung." reply_by_email_enabled: "Cho phép trả lời chủ đề qua email." pop3_polling_ssl: "Sử dụng SSL khi kết nối tới POP3 server. (Đề nghị sử dụng)" email_in_min_trust: "Bậc tin tưởng tối thiểu cho phép một thành viên gửi chủ đề mới qua email." @@ -916,7 +975,6 @@ vi: blank: "phải hiện hành" must_begin_with_alphanumeric: "phải bắt đầu bằng ký tự hoặc số hoặc gạch dưới" must_end_with_alphanumeric: "phải kết thúc bằng ký tự hoặc số hoặc gạch dưới" - must_not_contain_confusing_suffix: "không chứ từ gây hiểu lầm như .json hoặc .png v.v..." email: not_allowed: "không được chấp nhận từ nhà cung cấp email đó. Vui long sử dụng địa chỉ email khác." blocked: "không được chấp nhận." @@ -993,14 +1051,8 @@ vi: subject_template: "[%{site_name}] Vấn đề Email-- Không nhận dạng được nội dung" email_reject_invalid_access: subject_template: "[%{site_name}] Vấn đề Email -- truy cập không phù hợp" - email_reject_post_error: - subject_template: "[%{site_name}] Vấn đề Email -- Lỗi đăng bài" - email_reject_post_error_specified: - subject_template: "[%{site_name}] Vấn đề Email -- Lỗi đăng bài" email_reject_reply_key: subject_template: "[%{site_name}] Vấn đề Email -- Không xác định được key trả lời" - email_reject_destination: - subject_template: "[%{site_name}] Vấn đề Email -- Không xác định địa chỉ Đến:" email_reject_topic_not_found: subject_template: "[%{site_name}] Vấn đề Email -- Không tìm thấy chủ đề" email_reject_topic_closed: diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index b7bbdfc4b7..1a9b11270f 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -27,6 +27,9 @@ zh_CN: purge_reason: "自动删除被遗弃、未激活账户" disable_remote_images_download_reason: "磁盘空间不足,远程图像下载已经被禁用。" anonymous: "匿名" + emails: + incoming: + default_subject: "来自%{email}的邮件" errors: &errors format: '%{attribute} %{message}' messages: @@ -153,7 +156,7 @@ zh_CN: everyone: "任何人" admins: "管理面板" moderators: "版主" - staff: "员工" + staff: "管理人员" trust_level_0: "trust_level_0" trust_level_1: "trust_level_1" trust_level_2: "trust_level_2" @@ -253,9 +256,9 @@ zh_CN: vip_category_description: "高于信任等级3的用户参与讨论的分类。" meta_category_name: "页面反馈" meta_category_description: "讨论该站点的站务、组织、如何运作和如何改善它。" - staff_category_name: "职员" - staff_category_description: "职员私有的分类。只有管理员和版主才能阅览主题。" - assets_topic_body: "这是一个永久主题,仅对职员可见,用于存储论坛设计使用的图像和文件。不要删除它!\n\n\n详细教程:\n\n\n1. 回复到这个主题。\n2. 上传你想用作站点标志、图标和其他所有图片到这儿。(使用帖子编辑器工具栏中的上传图标,或者拖拽或者粘贴图像。)\n3. 提交你的回复添加帖子。\n4. 在你的新帖子里右键点击图片获得这些已上传图片的链接,或者点击编辑按钮来编辑帖子,获得到图片的相对地址。复制这些相对地址。\n5. 粘贴这些图像的路径到[基础设置](/admin/site_settings/category/required)。\n\n\n如果你需要运行额外的上传文件类型,在[文件设置](/admin/site_settings/category/files)中编辑 `authorized_extensions`。" + staff_category_name: "管理人员" + staff_category_description: "管理人员私有的分类。只有管理员和版主才能阅览主题。" + assets_topic_body: "这是一个永久主题,仅对管理人员可见,用于存储论坛设计使用的图像和文件。不要删除它!\n\n\n详细教程:\n\n\n1. 回复到这个主题。\n2. 上传你想用作站点标志、图标和其他所有图片到这儿。(使用帖子编辑器工具栏中的上传图标,或者拖拽或者粘贴图像。)\n3. 提交你的回复添加帖子。\n4. 在你的新帖子里右键点击图片获得这些已上传图片的链接,或者点击编辑按钮来编辑帖子,获得到图片的相对地址。复制这些相对地址。\n5. 粘贴这些图像的路径到[基础设置](/admin/site_settings/category/required)。\n\n\n如果你需要运行额外的上传文件类型,在[文件设置](/admin/site_settings/category/files)中编辑 `authorized_extensions`。" lounge_welcome: title: "欢迎来到贵宾室" body: |2 @@ -281,6 +284,8 @@ zh_CN: [trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924 category: topic_prefix: "关于分类:%{category}" + replace_paragraph: "(将第一段话修改成你的新分类的简述。这段文字将出现在用户选择分类的地方,所以尝试保持在 200 个字符内。 **除非你编辑了这段文字或者在这分类中创建了主题,这个分类不会出现在分类页面中。**)" + post_template: "%{replace_paragraph}\n\n在接下来的这段话中多写一些分类的用途,或者设定一个该分类的规则:\n\n- 为什么我们要用这个分类?它用来做什么?\n\n- 这个分类和我们已经有的分类究竟有什么不同?\n\n- 这个分类中一般会包含哪些主题?\n\n- 我们需要这个分类么?我们可以把它和别的分类、或者子分类合并吗?\n\n" errors: uncategorized_parent: "未分类不能有一个父分类" self_parent: "一个子分类不能属于它自己。" @@ -292,6 +297,7 @@ zh_CN: topic_exists: other: "不能删除该分类,因为它有 %{count} 个主题。最老的主题是 %{topic_link}。" topic_exists_no_oldest: "不能删除该分类,因为主题数量为 %{count}。" + uncategorized_description: "不需要分类或者不适合放在现在的任何分类中的主题。" trust_levels: newuser: title: "新用户" @@ -302,7 +308,7 @@ zh_CN: regular: title: "活跃用户" leader: - title: "领导" + title: "资深" change_failed_explanation: "你尝试将 %{user_name} 降至 '%{new_trust_level}'。然而他们的信任等级已经是 '%{current_trust_level}'。%{user_name} 将仍是 '%{current_trust_level}' —— 如果你想要降级用户,先锁定信任等级" rate_limiter: slow_down: "你执行这个操作太多次了,请稍后再试。" @@ -633,7 +639,7 @@ zh_CN: title_nag: "为站点指定一个名字。在站点设置中更新标题。" site_description_missing: "输入一句话作为你站点的简介,将出现在搜索结果中。在站点设置中更新 site_description。" consumer_email_warning: "你的站点被设置为使用 Gmail 或者其他客户邮箱服务发送邮件。Gmail 限制每日邮件发送数量。请考虑使用其他邮件服务商来保证邮件的成功发送,例如 mandrill.com。" - site_contact_username_warning: "输入一个友善的职员账户名,并以他的名义发送重要的自动消息。在站点设置中更新 site_contact_username。" + site_contact_username_warning: "输入一个友善的管理人员账户名,并以他的名义发送重要的自动消息。在站点设置中更新 site_contact_username。" notification_email_warning: "通知邮件不是从你域名的一个有效地址发出的;邮件分发将会变得危险和不可靠。请在站点设置中将 notification_email 设置为一个有效的本地邮件地址。" subfolder_ends_in_slash: "你的子目录设置不正确;DISCOURSE_RELATIVE_URL_ROOT以斜杠结尾。" site_settings: @@ -651,7 +657,6 @@ zh_CN: min_search_term_length: "搜索条件允许的最少字符数" search_tokenize_chinese_japanese_korean: "在非中/日/韩语站点强制切割中/日/韩语搜索分词" allow_uncategorized_topics: "允许发表没有分类的帖子。警告:如果又任何未分类的帖子,你必须给他们重新分类后才能关闭该选项。" - uncategorized_description: "未分类分类的描述。留空则无描述。" allow_duplicate_topic_titles: "允许主题有相同,重复的标题" unique_posts_mins: "多少分钟之后才允许一个用户再次发表包含相同内容的帖子" educate_until_posts: "当用户开始键入他们的前几个(n)新帖子时,在编辑器上显示教育面板弹窗。" @@ -666,7 +671,7 @@ zh_CN: disabled_image_download_domains: "域名列表,链接到这些站点的图片不会被下载。用 | 分割。" editing_grace_period: "在 (n) 秒之内,对帖子的编辑不生成帖子历史。" post_edit_time_limit: "作者可以在发布帖子后的(n)分钟内编辑或删除他们的帖子。设置 0 为永远。" - edit_history_visible_to_public: "允许任何人查看编辑过的帖子的老版本。当禁用时,只有职员才能查看浏览。" + edit_history_visible_to_public: "允许任何人查看编辑过的帖子的老版本。当禁用时,只有管理人员才能查看浏览。" delete_removed_posts_after: "帖子被作者删除,将在(n)小时后被自动删除。" max_image_width: "帖子中图片允许的最大缩略图宽度" max_image_height: "帖子中图片允许的最大缩略图宽度" @@ -707,14 +712,15 @@ zh_CN: max_replies_in_first_day: "新用户在第一天内最大可以创建的回复数" tl2_additional_likes_per_day_multiplier: "增加信任等级 2(成员)的赞限制,可提供一个乘数与原始值相乘" tl3_additional_likes_per_day_multiplier: "增加信任等级 3(常规)的赞限制,可提供一个乘数与原始值相乘" - tl4_additional_likes_per_day_multiplier: "增加信任等级 4(领导)的赞限制,可提供一个乘数与原始值相乘" + tl4_additional_likes_per_day_multiplier: "增加信任等级 4(资深)的赞限制,可提供一个乘数与原始值相乘" num_flags_to_block_new_user: "如果一个新用户的帖子被其他 num_users_to_block_new_user 个用户标记为垃圾,隐藏他们的所有帖子并阻止其之后的发帖。0 表示禁用这个特性。" num_users_to_block_new_user: "如果一个新用户的帖子被许多其他用户 num_flags_to_block_new_user 标记为垃圾,隐藏他们的所有帖子并阻止其之后发帖。0 表示禁用这个特性。" notify_mods_when_user_blocked: "如果一个用户被自动封禁了,发送一个消息给所有管理员。" flag_sockpuppets: "如果一个新用户开始了一个主题,并且同时另一个新用户以同一个 IP 在该主题回复,他们所有的帖子都将被自动标记为垃圾。" traditional_markdown_linebreaks: "在 Markdown 中使用传统换行符,即用两个尾随空格来换行" + allow_html_tables: "允许在输入 Markdown 文本时使用表格 HTML 标签。标签 TABLE、THEAD、TD、TR、TH 将被允许使用,即白名单这些标签(需要重置所有包含表格的老帖子的 HTML)" post_undo_action_window_mins: "允许用户在帖子上进行撤销操作(赞、标记等)所需等待的间隔分钟数" - must_approve_users: "新用户在被允许访问站点前需要由职员批准。警告:在运行的站点中启用将解除所有非职员用户的访问权限!" + must_approve_users: "新用户在被允许访问站点前需要由管理人员批准。警告:在运行的站点中启用将解除所有非管理人员用户的访问权限!" pending_users_reminder_delay: "如果新用户等待批准时间超过此小时设置则通知版主。设置-1关闭通知。" ga_tracking_code: "Google 分析追踪代码(ga.js),例如:UA-12345678-9。参考 http://google.com/analytics" ga_domain_name: "Google 分析域名(ga.js),例如:mysite.com;参考 http://google.com/analytics" @@ -736,15 +742,16 @@ zh_CN: suppress_reply_directly_above: "当一个帖子只有一个回复时,不显示回复到该贴的回复。" suppress_reply_when_quoting: "当帖子引用回复时,不显示可展开的回复到某贴的标记。" max_reply_history: "扩展回复至时显示的最大回复数量" + experimental_reply_expansion: "当展开回复至内容时隐藏直接回复(实验性)" topics_per_period_in_top_summary: "在一个主题底部显示的默认推荐主题的数量。" topics_per_period_in_top_page: "在展开“显示更多”推荐主题列表显示的主题数量。" redirect_users_to_top_page: "自动重定向至新用户或者长时间未登入的用户至热门页面。" top_page_default_timeframe: "顶部查看页面的默认时间表" - show_email_on_profile: "在用户页面显示用户的邮件地址(只有用户和职员可见)" + show_email_on_profile: "在用户页面显示用户的邮件地址(只有用户和管理人员可见)" email_token_valid_hours: "“忘记密码”/“激活账户” token 有效的小时数(n)。" email_token_grace_period_hours: "“忘记密码”/“激活账户” token 在使用后仍旧有效的小时数(n)。" enable_badges: "启用徽章系统" - enable_whispers: "允许在主题中给职员密频。(experimental)" + enable_whispers: "允许在主题中给管理人员密频。(experimental)" allow_index_in_robots_txt: "在 robots.txt 中详细指出这个站点允许被网页搜索引擎检索。" email_domains_blacklist: "用管道符“|”分隔的邮箱域名黑名单列表,其中的域名将不能用来注册账户,例如:mailinator.com|trashmail.net" email_domains_whitelist: "用管道符“|”分隔的电子邮箱域名的列表,用户必须使用这些邮箱域名注册。警告:用户使用不包含在这个列表里的邮箱域名,将无法成功注册。" @@ -756,7 +763,7 @@ zh_CN: force_hostname: "仅限开发者设定!警告!指定 URL 里的主机名。留空为默认" invite_expiry_days: "多少天以内用户的邀请码是有效的" invite_passthrough_hours: "用户多久才能使用一个已经使用过的邀请代码,以小时计" - invite_only: "公开注册已禁用,新用户必须被其他成员或职员邀请。" + invite_only: "公开注册已禁用,新用户必须被其他成员或管理人员邀请。" login_required: "需要验证才能继续在该站阅读,不允许匿名访问。" min_username_length: "最小用户名长度。" max_username_length: "最大用户名长度。" @@ -799,6 +806,9 @@ zh_CN: active_user_rate_limit_secs: "更新'最后一次见到'数据的间隔,单位为秒" verbose_localization: "在界面上显示详细的本地化提示" previous_visit_timeout_hours: "系统判断一次访问之后多少小时后为'上一次'访问" + top_topics_formula_log_views_multiplier: "热门主题公式中访问次数因子的值(n):`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "热门主题公式中首贴赞的数量的因子的值(n):`log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "热门主题公式中赞和帖子数量的比例的最小值(n):`log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" rate_limit_create_topic: "在创建一个主题之后,用户必须间隔多少秒(n)才能创建另一个主题" rate_limit_create_post: "在创建一个帖子之后,用户必须间隔多少秒(n)才能创建另一个帖子" rate_limit_new_user_create_topic: "在创建一个主题后,新用户必须等待(n)秒才能创建另一个主题。" @@ -842,11 +852,12 @@ zh_CN: tl2_requires_likes_given: "一个初级用户升级到信任等级2所需要给出的赞数。" tl2_requires_topic_reply_count: "一个初级用户升级到信任等级2所需要回复的主题数量。" tl3_time_period: "3级信任等级时间期" + tl3_requires_days_visited: "要维持信任等级 3 升级的用户,需要在最近 100 天内访问的最低次数。将其设置为高于信任等级 3 的评估时间来禁用升级至信任等级 3 功能。(设置为 0 或比那个值更高)" tl3_requires_topics_replied_to: "在最近 100 天内升至信任等级3所需的回复主题的最小数量。(0或更高)" - tl3_requires_topics_viewed: "在最近 100 天内升至信任等级3所需的创建主题的百分比。(0到100)" - tl3_requires_posts_read: "在最近 100 天内升信任等级3所需的创建帖子的百分比。(0到100)" - tl3_requires_topics_viewed_all_time: "用户升至领导信任等级3所需查看的最小主题数量。" - tl3_requires_posts_read_all_time: "用户升至领导信任等级3所需查看的最小帖子数量。" + tl3_requires_topics_viewed: "升至信任等级 3 所需阅读的最近 100 天内新创建主题的百分比。(0到100)" + tl3_requires_posts_read: "升至信任等级 3 所需阅读的最近 100 天内新创建帖子的百分比。(0到100)" + tl3_requires_topics_viewed_all_time: "用户升至信任等级 3 所需查看的最小主题数量。" + tl3_requires_posts_read_all_time: "用户升至信任等级 3 所需查看的最小帖子数量。" tl3_requires_max_flagged: "用户在最近 100 天内升至信任等级3所需的必须没有超过 x 个帖子被 x 个不同的用户标记数量,x为数量。(0或更高)" tl3_promotion_min_duration: "信任等级3的用户可被降级至信任等级2前最小持续天数。" tl3_requires_likes_given: "在最近 100 天内升至信任等级3所需给出的赞。" @@ -854,6 +865,7 @@ zh_CN: tl3_links_no_follow: "不移除信任等级3用户帖子中的链接中的 rel=nofollow 属性。" min_trust_to_create_topic: "创建主题所需的最低信任等级。" min_trust_to_edit_wiki_post: "能编辑维基模式帖子的最小信任等级" + min_trust_to_allow_self_wiki: "用户将自己的帖子设置为维基模式的最低信任等级。" min_trust_to_send_messages: "发送消息所需的最低信任等级。" newuser_max_links: "一个访问者可以添加到一个帖子里的链接数量。" newuser_max_images: "一个访问者可以加入到一个帖子里的图片数量。" @@ -861,8 +873,10 @@ zh_CN: newuser_max_mentions_per_post: "一个访问者可以在一个帖子里使用 @name 提及的最大数量。" newuser_max_replies_per_topic: "直至有人回复他们前,新用户在一个帖子里的最大回复数量。" max_mentions_per_post: "你可以在一个帖子里使用 @name 提及的最大数量。" + max_users_notified_per_group_mention: "当整个群组被提及,用户可能收到的最多提醒数量(超过阈值后将不会有更多新提醒)" create_thumbnails: "为太大而无法恰当地显示在帖子里的图片创建 lightbox 缩略图。" email_time_window_mins: "等待多少(n)分钟才给用户发送通知电子邮件,好让他们有机会自己来编辑和完善他们的帖子。" + private_email_time_window_seconds: "等待多少(n)秒后再给用户发送通知私人通知邮件,这让用户有机会编辑和完善他们的帖子。" email_posts_context: "在通知邮件中包含的作为上下文的回复数量。" flush_timings_secs: "向服务器刷新时间数据的频率,以秒为单位。" title_max_word_length: "在主题的标题中,允许的词语长度的最大字符数。" @@ -896,11 +910,11 @@ zh_CN: privacy_policy_url: "如果你的隐私政策文档在外部,那么请在此填写其完整 URL 地址。" newuser_spam_host_threshold: "用户在一篇帖子中能添加多少此指向同一主机的链接,取决于之前该用户有`newuser_spam_host_threshold`篇帖子被认为是垃圾帖。" white_listed_spam_host_domains: "广告主机白名单域名列表。新用户可以任意链接至这些域名。" - staff_like_weight: "职员赞时的额外权重。" + staff_like_weight: "管理人员赞时的额外权重。" topic_view_duration_hours: "按照每 IP/用户每 N 小时来记录一次新的主题访问" user_profile_view_duration_hours: "按照每 IP/用户每 N 小时来记录用户资料访问数" levenshtein_distance_spammer_emails: "当匹配广告邮件时,模糊匹配判断差异的字符数。" - max_new_accounts_per_registration_ip: "如果已经有了从这个 IP 创建的(n)个信任等级0的账户(并且没有一个是职员或者是信任等级2以上的用户),不再允许来自该 IP 地址的注册请求。" + max_new_accounts_per_registration_ip: "如果已经有了从这个 IP 创建的(n)个信任等级0的账户(并且没有一个是管理人员或者是信任等级2以上的用户),不再允许来自该 IP 地址的注册请求。" min_ban_entries_for_roll_up: "当点击折叠按钮时,且至少 (N) 条记录时,将会创建一个子网封禁记录" max_age_unmatched_emails: "在 (N) 天后删除不匹配的邮件地址。" max_age_unmatched_ips: "在 (N) 天后删除不匹配的 IP 记录。" @@ -917,6 +931,9 @@ zh_CN: strip_images_from_short_emails: "从邮件中除去小于 2800 比特的图片" short_email_length: "短邮件地址长度(以比特作为单位)" display_name_on_email_from: "在Email栏显示全名" + unsubscribe_via_email: "允许用户在发送的邮件的主题或正文中包含“unsubscribe”(未知中文版用什么)来退订邮件" + unsubscribe_via_email_footer: "在发出的邮件底部包含退订链接" + delete_email_logs_after_days: "在(N)天后删除邮件日志。设置为 0 无限期保留" pop3_polling_enabled: "轮询 POP3 收取邮件回复。" pop3_polling_ssl: "连接至 POP3 服务器时使用 SSL。(推荐)" pop3_polling_period_mins: "查询用于邮件的 POP3 账户的间隔(以分钟计)。注意:需要重新启动。" @@ -943,26 +960,29 @@ zh_CN: automatically_download_gravatars: "为注册或更改邮箱的用户下载 Gravatar 头像。" digest_topics: "邮件摘要中显示的最大主题数目。" digest_min_excerpt_length: "在邮件摘要中每个帖子最少显示的字符数量。" - delete_digest_email_after_days: "不发送摘要邮件给超过 (n) 天未出现的用户。" + delete_digest_email_after_days: "不发送摘要邮件给超过(n)天没访问的用户" disable_digest_emails: "为所有用户禁用摘要邮件。" detect_custom_avatars: "检测用户是否上传了自定义个人头像。" max_daily_gravatar_crawls: "一天内 Discourse 将自动检查 gravatar 自定义头像的次数" public_user_custom_fields: "可公开显示的用户自定义属性白名单" - staff_user_custom_fields: "可给职员公开显示的用户自定义属性白名单。" + staff_user_custom_fields: "可给管理人员公开显示的用户自定义属性白名单。" enable_user_directory: "提供可供浏览的用户目录" allow_anonymous_posting: "允许用户切换至匿名模式" anonymous_posting_min_trust_level: "启用匿名发帖所需的最小信任等级" anonymous_account_duration_minutes: "为了匿名性,为每个用户每 N 分钟创建一个匿名账户。例如:如果设置为 600,只要发帖后 600 分钟到了,并且用户切换至了匿名模式,就会创建一个新的匿名账户。" hide_user_profiles_from_public: "对来访用户关闭关闭用户信息卡,用户资料和用户目录。" allow_profile_backgrounds: "允许用户上传个人资料背景图片。" + sequential_replies_threshold: "在被提醒回复了太多连续的回复前,用户在主题中可以连续回复的帖子的数量。" enable_mobile_theme: "为移动设备启用移动友好的主题,但也能切换回完整站点。如果你想要使用自定义的响应式主题请禁用它。" dominating_topic_minimum_percent: "用户在主题中的帖子占到多少百分比时使得用户主导话题。" - daily_performance_report: "每日分析 NGINX 日志并且发布详情主题到职员才能看到的主题" + disable_avatar_education_message: "禁用更改头像操作的教育消息。" + daily_performance_report: "每日分析 NGINX 日志并且发布详情主题到管理人员才能看到的主题" suppress_uncategorized_badge: "不要为主题列表中的未分类主题显示徽章。" permalink_normalizations: "在匹配永久链接之前应用如下正则表达式,例如:/(\\/topic.*)\\?.*/\\1 将去掉所有主题路径的参数字符串。格式为使用正则表达式,以及在字符串使用 \\1 等等来访问捕获内容" global_notice: "为所有访客显示“紧急的”全局横幅,留空隐藏它(可以使用 HTML)" disable_edit_notifications: "当 'download_remote_images_to_local' 启用时禁用系统编辑提醒。" automatically_unpin_topics: "当用户到达底部时自动解除主题置顶。" + read_time_word_count: "一分钟阅读的词的数量,用于估计阅读时间。" full_name_required: "全名是用户个人信息的必填项。" enable_names: "在用户的个人信息、用户卡片和邮件中显示全名。禁用将在所有地方隐藏全名。" display_name_on_posts: "在用户的帖子中显示他们的全名以及他们的 @username。" @@ -1000,7 +1020,7 @@ zh_CN: default_email_direct: "默认在有人引用、回复、提及或者邀请用户时发送一封邮件通知。" default_email_mailing_list_mode: "默认为每一个新帖子发送一封邮件通知。" default_email_always: "即使用户活跃时,仍默认发送邮件通知。" - default_other_new_topic_duration_minutes: "一个主题在多少分钟之内被系统判断为新主题的全局缺省设置" + default_other_new_topic_duration_minutes: "新主题条件的全局缺省设置" default_other_auto_track_topics_after_msecs: "经过多少毫秒之后一个主题就被自动追踪的全局缺省设置" default_other_external_links_in_new_tab: "默认在新的标签页打开外部链接" default_other_enable_quoting: "默认在高亮选择文字时启用引用回复" @@ -1025,6 +1045,10 @@ zh_CN: invalid_string_min: "必须超过 %{min} 个字符。" invalid_string_max: "必须不超过 %{max} 个字符。" invalid_reply_by_email_address: "值必须包含 '%{reply_key' 并且要与通知邮件不同。" + pop3_polling_host_is_empty: "在启用 POP3 轮询前,你必须设置 'pop3 polling host'。" + pop3_polling_username_is_empty: "在启用 POP3 轮询前,你必须设置 'pop3 polling username'。" + pop3_polling_password_is_empty: "在启用 POP3 轮询前,你必须设置 'pop3 polling password'。" + pop3_polling_authentication_failed: "POP3 验证失败。请验证你的 pop3 账户信息。" notification_types: group_mentioned: "%{group_name} 在 %{link} @ 了你" mentioned: "%{display_username} 在 %{link} @ 了你" @@ -1089,9 +1113,9 @@ zh_CN: other: "本主题在最后一个回复创建后 %{count} 分钟后自动关闭。不再允许添加新回复。" autoclosed_disabled: "本主题是开放的,可以添加新的回复。" autoclosed_disabled_lastpost: "本主题现在开放了。可以添加新的回复。" - pinned_enabled: "本主题已置顶,它将始终显示在它所属分类的顶部。可由职员对所有人解除置顶,或者由用户自己取消置顶。" + pinned_enabled: "本主题已置顶,它将始终显示在它所属分类的顶部。可由管理人员对所有人解除置顶,或者由用户自己取消置顶。" pinned_disabled: "本主题已被解除置顶,它将不再显示在它所属分类的顶部。" - pinned_globally_enabled: "本主题已全局置顶,它将始终显示在它所属分类的顶部。可由职员对所有人解除置顶,或者由用户自己取消置顶。" + pinned_globally_enabled: "本主题已全局置顶,它将始终显示在它所属分类的顶部。可由管理人员对所有人解除置顶,或者由用户自己取消置顶。" pinned_globally_disabled: "本主题已被解除置顶,它将不再显示在它所属分类的顶部。" visible_enabled: "本主题已设置为显示在主题列表中。" visible_disabled: "本主题设置为不显示在主题列表中。只能通过直达链接来访问。" @@ -1128,12 +1152,23 @@ zh_CN: must_begin_with_alphanumeric: "必须以一个字母或数字或下划线开头" must_end_with_alphanumeric: "必须以字母或数字结尾或是下划线" must_not_contain_two_special_chars_in_seq: "必须不包括连续的 2 个或更多的特殊字符(.-_)" + must_not_end_with_confusing_suffix: "不能以难以分辨的后缀结尾,比如 .json 或者 .png 等" email: not_allowed: "本站不允许使用该邮箱服务商提供的电子邮箱,请使用其它邮箱地址。" blocked: "不被允许。" ip_address: blocked: "不允许从你的 IP 地址注册新用户。" - max_new_accounts_per_registration_ip: "不允许从你的 IP 地址注册新用户(达到上限)。联系一个职员。" + max_new_accounts_per_registration_ip: "不允许从你的 IP 地址注册新用户(达到上限)。联系一个管理人员。" + unsubscribe_mailer: + subject_template: "确认你不想要收到%{site_title}的电子邮件更新" + text_body_template: | + 有人(可能是你?)请求不再接受来自%{site_domain_name}的邮件更新。 + 点击链接以确认退订: + + %{confirm_unsubscribe_link} + + + 如果你想要继续接受邮件更新,你可以忽略这封邮件。 invite_mailer: subject_template: "%{invitee_name} 邀请你参与 %{site_domain_name} 主题 '%{topic_title}' " text_body_template: | @@ -1268,7 +1303,7 @@ zh_CN: off_topic: "你的帖子被标记为 **偏离主题**:鉴于当前的主题标题和第一个帖子,社群成员们感觉它不适合处于这个主题中。" inappropriate: "你的帖子被标记为 **不恰当**:社群成员感觉它有冒犯或者侮辱的意味,亦或是它违反了[社群准则](/guidelines)。" spam: "你的帖子被标记为 **广告**:社群成员觉得它是广告,像是在过度地推广着什么,而不是预期中与主题有关的内容。" - notify_moderators: "你的帖子被标记为 **需要版主关注**:社群成员认为帖子需要职员介入。" + notify_moderators: "你的帖子被标记为 **需要版主关注**:社群成员认为帖子需要管理人员介入。" flags_dispositions: agreed: "感谢通知我们。我们认为这是一个问题,并且我们正在了解情况。" agreed_and_deleted: "感谢通知我们。我们认为这是一个问题,并且我们已经删除了帖子。" @@ -1293,6 +1328,99 @@ zh_CN: 然而,如果帖子再次被社群标记并隐藏,它将被隐藏并等待版主处理——并且可能导致进一步的措施,包括禁止你的用户帐号的可能。 想了解更多,请查看我们的[社群指引](%{base_url}/guidelines)。 + usage_tips: + text_body_template: | + 这一条消息是一些使用的小技巧: + + ## 阅读 + + 要阅读更多,**只需要继续向下滚动页面!** + + 当有新的回复或者新主题时,他们将自动出现 —— 不用刷新页面。 + + ## 导航 + + - 想要搜索,用你的用户页面,或者点菜单,这个在页面**右上角的图标**。 + + - 点击主题标题会跳转至至这个主题中**你还没有读的**那个帖子。要找主题顶部或底部,分别点击回复数量或者最后一次回复时间。 + + + + - 当在阅读主题时,点击右下角的进度条打开导航控制。点击帖子标题可回到顶部。按键盘上的 ? 键获取快速键盘快捷键列表。 + + + + ## 回复 + + - 要泛泛地回复**整个主题**,使用主题最底下的 。 + + - 要回复**特定的人**,使用他们帖子里的 。 + + - 要用**一个新主题**回复,使用帖子右边的 。老的和新的主题将自动关联至一起。 + + 你可以用简单的 HTML 标签、BBCode 或者 [Markdown](http://commonmark.cn/help/) 来格式化: + + 这是**加粗**。 + 这是加粗。 + 这是[b]加粗[b]。 + + 想学习 Markdown?[试试我们有趣的 10 分钟交互教程!](http://commonmark.cn/help/tutorial/) + + 要插入引用,先选择想要引用的文字,然后点击任意地方的回复按钮。重复以上步骤创建多个引用! + + + + 要提醒某人关注你的回复,你需要提及他们的名字。键入 `@` 开始选择一个用户名。 + + + + 想使用[标准绘文字(Emoji)](http://www.emoji.codes/),只要键入 `:`,然后用名字匹配,或使用传统表情符 `;)` + + + + 要生成链接概要,直接将链接粘贴至单独的一行: + + + + ## 操作 + + 每一个帖子底部有几个操作按钮: + + + + 要让别人知道你喜欢并且感谢他们的帖子,使用**赞**按钮。分享爱! + + 如果你觉得某人的帖子有问题,使用**标记**按钮私下告诉他,或者找[我们的管理人员](%{base_url}/about)。你还可以**分享**至该帖子的链接,或者标记**书签**,这样你之后可以在你的用户页查看。 + + ## 通知 + + 当有人回复你、引用你的帖子或者提到`@你`的时候,一个数字将会立即出现在页面右上角。使用它查看**通知**。 + + + + 不用担心错过别人的回复 —— 当你不怎么逛的时后,你会收到邮件提醒。 + + ## 你的设置 + + - 所有小于**两天**的主题算新主题。 + + - 任何你**积极参与**(指你创建、回复或者阅读较长时间)的主题将被自动追踪。 + + 你将会在主题名字后见到蓝色的新主题提示和未读帖子数字指示: + + + + 你可以通过主题下方的通知控制改变通知设置。 + + + + 你也可以为每个分类设置通知状态,比如你可以监控某分类中的每个新主题。 + + 要修改以上任何设置,见[你的用户设置页面](%{base_url}/my/preferences)。 + + ## 社群信任 + + 只要你参与社群,随着时间推移你会慢慢获得社群信任,成为一个真正的公民,那些针对新用户的限制将被移除。当达到了一个足够的[信任等级](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924)时,你将会得到适当的能力一起帮助管理社群。 welcome_user: subject_template: "欢迎来到 %{site_name}!" text_body_template: | @@ -1304,10 +1432,10 @@ zh_CN: 好好享受你在论坛的时光吧! - (如果你在新用户级别需要和[职员](%{base_url}/about)沟通的话,直接回复这个消息。) + (如果你在新用户级别需要和[管理人员](%{base_url}/about)沟通的话,直接回复这个消息。) welcome_invite: subject_template: "欢迎来到 %{site_name}!" - text_body_template: "感谢你接受邀请加入%{site_name} —— 欢迎!\n\n我们为你创建了账号:**%{username}**,同时你已经登录了。你可以在任何时候访问[你的用户设置][prefs]来修改它。\n\n要再次登入,或者:\n\n1. 永远 **使用收到邀请的邮箱地址**登录,。否则我们就无法分辨是不是你本人!\n\n2. 在 %{site_name} 的[用户设置][prefs]页面创建一个密码,然后使用该密码来登入。 \n\n%{new_user_tips}\n\n我们始终相信[讨论应该文明](%{base_url}/guidelines)。\n\n好好享受你在论坛的时光吧!\n\n(如果你在新用户级别需要和[职员](%{base_url}/about)沟通的话,直接回复这个消息。)\n\n[prefs]: %{user_preferences_url}\n" + text_body_template: "感谢你接受邀请加入%{site_name} —— 欢迎!\n\n我们为你创建了账号:**%{username}**,同时你已经登录了。你可以在任何时候访问[你的用户设置][prefs]来修改它。\n\n要再次登入,或者:\n\n1. 永远 **使用收到邀请的邮箱地址**登录,。否则我们就无法分辨是不是你本人!\n\n2. 在 %{site_name} 的[用户设置][prefs]页面创建一个密码,然后使用该密码来登入。 \n\n%{new_user_tips}\n\n我们始终相信[讨论应该文明](%{base_url}/guidelines)。\n\n好好享受你在论坛的时光吧!\n\n(如果你在新用户级别需要和[管理人员](%{base_url}/about)沟通的话,直接回复这个消息。)\n\n[prefs]: %{user_preferences_url}\n" backup_succeeded: subject_template: "备份成功完成" text_body_template: "备份成功。\n\n访问[管理 > 备份](%{base_url}/admin/backups)下载你的新备份文件。" @@ -1357,13 +1485,37 @@ zh_CN: 以上的下载链接将在 48 小时后失效。 csv_export_failed: subject_template: "数据导出失败" - text_body_template: "我们很抱歉,但是你的数据导出请求失败了。请检查日志或联系一位职员。" + text_body_template: "我们很抱歉,但是你的数据导出请求失败了。请检查日志或联系一位管理人员。" + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] 电子邮件错误 -- 信任等级不足" + text_body_template: | + 我们非常抱歉,你发送至 %{destination}(名为 %{former_title})的邮件出问题了。 + + 你的账户没有足够的信任等级向该邮件地址发布新主题。如果你坚信这是错误,联系管理人员。 + email_reject_inactive_user: + subject_template: "[%{site_name}] 电子邮件错误 -- 未激活用户" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 与你账户管理的邮件地址没有激活,请先激活你的账号再发送邮件。 + email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] 电子邮件错误 -- 回复用户不符" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 你发送回复的邮件地址与我们等待的地址不同,所以我们不确定你是不是同一个人。试试从另外一个邮件地址发送,或者联系管理人员。 + email_reject_no_message_id: + subject_template: "[%{site_name}] 电子邮件错误 -- 无信息ID" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 我们没法在邮件里找到 `Message-Id`。试试从另外一个邮件地址发送,或者联系管理人员。 email_reject_no_account: subject_template: "[%{site_name}] 电子邮件错误 -- 未知账户" text_body_template: | - 我们很抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件无法发送。 + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 - 该邮件没有与已知的账户关联。试试从不同的邮件地址发送或联系一个职员。 + 我们找不到匹配你邮件地址的账号。试试从另外一个邮件地址发送,或者联系管理人员。 email_reject_empty: subject_template: "[%{site_name}] 电子邮件错误 -- 无内容" text_body_template: | @@ -1383,37 +1535,73 @@ zh_CN: text_body_template: | 我们很抱歉,但是您发送至 %{destination}(名为 %{former_title})的邮件无法发送。 - 您的账户没有足够的权限在该分类发布一个新主题。如果您坚信这是一个错误,联系一个职员。 + 您的账户没有足够的权限在该分类发布一个新主题。如果您坚信这是一个错误,联系一个管理人员。 + email_reject_strangers_not_allowed: + subject_template: "[%{site_name}] 电子邮件错误 -- 无权限" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 你发邮件到的分类只接受已知邮件的合法账户。如果你坚信这是错误,联系管理人员。 + email_reject_invalid_post: + subject_template: "[%{site_name}] 邮件问题 -- 发表错误" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 可能的原因是:复杂的格式、消息超长、消息太短。请再试一次,如果还不行,使用网站发表。 + email_reject_invalid_post_specified: + subject_template: "[%{site_name}] 邮件问题 -- 发表错误" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 原因: + + %{post_error} + + 如果你能解决错误,请再试一次。 + email_reject_invalid_post_action: + subject_template: "[%{site_name}] 电子邮件错误 -- 无发表权限" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 发送的命令无法被识别。请再试一次,如果还有问题,使用网站发表。 email_reject_reply_key: subject_template: "[%{site_name}] 电子邮件错误 -- 未知回复指纹" text_body_template: | - 我们很抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件无法发送。 + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 - 提供的回复 key 是无效或者未知的,所以我们不知道邮件是回复给谁的。联系一个职员。 + 邮件中的回复信令是无效或者未知的,所以我们不知道这封邮件回复给谁了。请联系管理人员。 + email_reject_bad_destination_address: + subject_template: "[%{site_name}] 电子邮件错误 -- 未知的回复至地址" + text_body_template: | + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 + + 目标邮件地址无法识别。请确保你是向管理人员提供的邮件地址发信。 email_reject_topic_not_found: subject_template: "[%{site_name}] 邮件问题 -- 主题未找到" text_body_template: | - 十分抱歉,无法将你的信息发表到 %{destination} (titled %{former_title}) 。 + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 - 你回复的主题不存在了,可能它已被删除?如果你确定这是个错误,联系职员。 + 你回复的主题已经不存在了 —— 可能已经被深处了?如果你确定这是错误,请联系管理人员。 email_reject_topic_closed: subject_template: "[%{site_name}] 邮件问题 -- 主题已关闭" text_body_template: | 我们很抱歉,但是你发送至 %{destination}(名为 %{former_title})的邮件无法发送。 - 你回复的主题现在已经被关闭并不再接受回复。如果你确定这是个错误,联系职员。 + 你回复的主题现在已经被关闭并不再接受回复。如果你确定这是个错误,联系管理人员。 email_reject_auto_generated: subject_template: "[%{site_name}] 邮件问题 -- 自动生成的回复" text_body_template: | - 我们很抱歉,但是你发送至 %{destination}(名为 %{former_title})的邮件无法发送。 + 我们非常抱歉,但是你发送至 %{destination}(名为%{former_title}) 的邮件出问题了。 - 你的邮件回复被标记为“自动生成的”,我们不接受这种内容。如果你确定这是个错误,联系职员。 + 你的邮件被标记为“自动生成”的,即邮件是由电脑生成而不是人类所写;我们不接受这样的邮件。如果你确信这是错误,请联系管理人员。 email_error_notification: subject_template: "[%{site_name}] 电子邮件错误 -- POP 验证错误" text_body_template: | - 在从 POP 服务器查询邮件时遇到了一个验证错误。 + 不幸的是,从 POP 服务器查询邮件时遇到了验证错误。 请确认你在[站点设置](%{base_url}/admin/site_settings/category/email)中已经正确配置了 POP 验证信息。 + + 如果 POP 邮件账号有图形界面,你可以登录后查看邮箱设置。 too_many_spam_flags: subject_template: "新账号被封禁" text_body_template: | @@ -1421,7 +1609,7 @@ zh_CN: 这是一封自 %{site_name} 自动发出的邮件,以告知你的帖子已因被社群多次标记而被自动隐藏。 - 处于谨慎的考虑,你的新账户被禁止创建新回复或主题。除非一个职员能复核你的账户。 + 处于谨慎的考虑,你的新账户被禁止创建新回复或主题。除非一个管理人员能复核你的账户。 欲查看额外的指导,请查看我们的[社群指引](%{base_url}/guidelines)。 blocked_by_staff: @@ -1429,19 +1617,35 @@ zh_CN: text_body_template: | 你好, - 这是一封自 %{site_name} 自动发出的邮件,以告知你的账户被职员封禁。 + 这是一封自 %{site_name} 自动发出的邮件,以告知你的账户被管理人员封禁。 欲查看额外的指导,请查看我们的[社群指引](%{base_url}/guidelines)。 user_automatically_blocked: subject_template: "因标记而被封禁的新用户 %{username}" + text_body_template: | + 这是一封自动发出的邮件。 + + 因多位用户标记%{username}的帖子,新用户[%{username}](%{base_url}%{user_url})已被自动封禁。 + + 请[查看这些标记](%{base_url}/admin/flags)。如果%{username}被意外禁用了编辑功能,点击[该用户管理页面](%{base_url}%{user_url})内的解封按钮。 + + 该阈值可以通过站点设置中的 `block_new_user` 更改。 spam_post_blocked: subject_template: "新用户 %{username} 因重复发布链接而被禁止发表相关帖子" + text_body_template: | + 这是一封自动发出的邮件。 + + 新用户[%{username}](%{base_url}%{user_url})试图创建多个链接至 %{domains} 的帖子,但这些帖子因为反垃圾策略而被阻挡了。用户仍能够发表不包含到 %{domains} 的帖子。 + + 请[审核该用户](%{base_url}%{user_url})。 + + 该阈值可以通过站点设置中的 `newuser_spam_host_threshold` 和 `white_listed_spam_host_domains` 更改。 unblocked: subject_template: "账户解封 unblocked" text_body_template: | 你好, - 这是一封自 %{site_name} 自动发出的邮件,以告知你的账户已经在职员审核后被解封。 + 这是一封自 %{site_name} 自动发出的邮件,以告知你的账户已经在管理人员审核后被解封。 你现在又可以创建新的回复和主题了。 pending_users_reminder: @@ -1454,6 +1658,10 @@ zh_CN: download_remote_images_disabled: subject_template: "远程图片下载已禁用。" text_body_template: "`download_remote_images_to_local` 设定已被禁用,因为已经达到 ``download_remote_images_threshold` 设定中的磁盘空间限制。" + unsubscribe_link: | + 不想再接受该主题的通知,[点击这里](%{unsubscribe_url})。要退订这些邮件,修改你的[用户设置](%{user_preferences_url}) + unsubscribe_via_email_link: | + 或者,[点击这儿](mailto:reply@%{hostname}?subject=unsubscribe)发邮件退订。 subject_re: "回复:" subject_pm: "[私信]" user_notifications: @@ -1461,6 +1669,10 @@ zh_CN: unsubscribe: title: "取消订阅" description: "不再对这些邮件感兴趣?没问题!点击下面按钮来立即取消订阅:" + reply_by_email: "访问[visit the topic](%{base_url}%{url})或回复邮件以回复" + visit_link_to_respond: "访问[Visit Topic](%{base_url}%{url})以回复" + reply_by_email_pm: "[访问消息](%{base_url}%{url})或者用邮件回复" + visit_link_to_respond_pm: "访问[Visit Message](%{base_url}%{url})以回复" posted_by: "%{username}发表于%{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} 邀请你加入消息交流:'%{topic_title}'" @@ -1479,6 +1691,19 @@ zh_CN: 请访问 %{base_url}%{url} 来查看该主题。 user_invited_to_private_message_pm_staged: subject_template: "[%{site_name}] %{username} 邀请你加入消息交流:'%{topic_title}'" + text_body_template: |2 + + %{username} 邀请你至消息交流: + + > **%{topic_title}** + > + > %{topic_excerpt} + + 论坛: + + > %{site_title} -- %{site_description} + + 请访问 %{base_url}%{url} 来查看该主题。 user_invited_to_topic: subject_template: "[%{site_name}] %{username} 邀请你至主题:'%{topic_title}'" text_body_template: |2 @@ -1503,6 +1728,17 @@ zh_CN: %{context} + --- + %{respond_instructions} + user_replied_pm: + subject_template: "[%{site_name}] [PM] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + --- %{respond_instructions} user_quoted: @@ -1625,7 +1861,7 @@ zh_CN: text_body_template: | 欢迎加入%{site_name}! - 一个职员批准了你在%{site_name}的账户。 + 一个管理人员批准了你在%{site_name}的账户。 点击下面的链接来确认并激活你在 %{site_name} 上的新账号: %{base_url}/users/activate-account/%{email_token} @@ -1638,7 +1874,7 @@ zh_CN: 好好享受你在论坛的时光吧! - (如果你在新用户级别需要和[职员](%{base_url/about)沟通的话,直接回复这个消息。) + (如果你在新用户级别需要和[管理人员](%{base_url/about)沟通的话,直接回复这个消息。) signup: subject_template: "[%{site_name}] 确认你的新账户" text_body_template: | @@ -1707,7 +1943,7 @@ zh_CN: 编辑本主题的第一帖以改变 %{page_name} 页面的内容。 guidelines_topic: title: "FAQ/指引" - body: "\n\n## [这是一个文明讨论的地方](#civilized)\n\n在论坛上请表现得像在公共公园一样得体。我们一群人共享着一个公共社群资源 — 一个通过不断进行讨论以分享我们技能、知识和兴趣的地方。\n\n这些都不是死规矩或者是草率决定,只是一些帮助社群的人们来判断的规定。试用这些指引来保持干净和充满灵感的文明的公开论坛。 \n\n\n\n## [改善讨论](#improve)\n\n帮助我们让这个地方变成一个讨论的好地方。你可以总是一致的做一些帮助改善讨论的事,即使是小事也行。如果你不确定你的帖子有益于讨论,认真想一想你要说什么再发布。\n\n这里讨论的主题对我们很重要,并且我们希望你也觉得这些内容对你很重要。尊重这些讨论的主题,以及讨论他们的人们,特别是当你不同意他们所说的时候。\n\n改善讨论的一种方法是找一找已经发生过的事。请在发帖或创建你自己的主题前,花一些时间浏览这些主题,这样你更有机会遇见和你有共同爱好的人。 \n\n\n\n## [即使你不同意他人时,尊重他人](#agreeable)\n\n你可能想表达你的不同意。这没问题。但是,记住_批评观点,而不是人_。请避免:\n\n* 指名道姓。\n* 人生攻击。\n* 回复帖子无关于帖子的内容。\n* 下意识的反驳。\n\n相反,提供合理的观点改善讨论。 \n\n\n\n## [你的参与有意义](#participate)\n\n我们在这儿的讨论为大家树立了榜样。通过选择参与有意义的讨论,帮助我们将论坛变成一个有意思的地方 — 并且避免那些没有帮助的行为。\n\nDiscourse 提供了让社群共同鉴别最棒(或最差)的贡献的工具:收藏、书签、赞、标记、回复和编辑等等。使用这些工具不仅能改善你自己的体验,也能改善其他人的体验。\n\n让我们创造一个更美好的社群。\n\n\n\n## [如果你发现问题了,标记它](#flag-problems)\n版主有特别的权力;他们对论坛负责。但是你也是。有了你的帮助,版主能成为社群监察者,而不仅是守卫或者警察。\n\n当你见到不合适的行为,不要回复。这种承认变相鼓励了这种不合适的行为,浪费了你的精力,并且浪费了每一个人的时间。_只要标记它。_如果收到了足够的标记,将会有相应的处理,这个处理可能是自动地,也可能由版主介入。\n\n为了维护我们的社群,版主保留了任何情况下删除任何内容和任何用户的权力。版主没有预先审核任何新帖子;版主和站点维护人员对社群里发表的任何言论均不负责任。 \n\n\n\n## [永远保持文明](#be-civil)\n\n粗鲁这样的行为会破坏健康的讨论:\n\n* 文明。不要发表任何理智的人会认为冒犯的、过分的或招致怨恨的言论。\n* 拒绝色情。不要发表任何淫秽或性暗示的东西。\n* 尊重每一个人。不要骚扰或者让别人难过,检视别人,或暴露他们的个人信息。\n* 尊重我们的论坛。不要发表广告或者其他垃圾信息。\n\n这些条款不是法律条文,并且没有准确的定义 — 避免任何做关于他们的_可能擦边_的事。如果你不确定,问问自己的帖子是否能出现在纽约时报的头版头条上。\n\n这是一个公共论坛,并且搜索引擎会索引这些讨论。注意发表的语言、链接和图片,不要在其中包含你的家庭和朋友。 \n\n\n\n## [保持整洁](#keep-tidy)\n\n花一点时间让东西出现在正确的位置,这样我们能花更多的时间在讨论上而非清理格式。所以:\n\n* 不要在错误的分类发表新主题。\n* 不要在多个主题中回复同样的内容。\n* 不要发布没有内容的回复。\n* 不要在中途改变主题。\n* 不要在你的帖子中签名 — 每一贴都附有你的个人信息。\n\n比起发表“+1”或者“同意”,使用赞按钮。比起将帖子带向一个决然不同的方向,使用“回复为关联主题”。\n\n\n\n## [只发表你自己的东西](#stealing)\n\n你不能在没有他人授权的情况下发表任何属于他人的数字资产。你可能不能发表关于窃据他人知识产权(软件、视频、音频和图像)的任何简介、链接或方法,或其他任何违反法律的内容。 \n\n\n\n## [有你参与](#power)\n\n这个站点由[一群友善的职员](/about)、你和社群一起运营。如果你对这里的事情仍有疑问,在[站点反馈](/c/site-feedback)分类新建一个主题并且开始讨论!如果遇到了重要或紧急的事情,并且不能用站务分类的主题或标记解决,通过[职员页面](/about)联系我们。\n\n\n\n## [使用条款](#tos)\n\n是的,法律很无聊,但是我们必须保护我们自己 – 引申开来,你和你的数据 – 用于针对不友好的家伙们。我们有一个[使用条款](/tos)描述你的(以及我们)关于内容、隐私和法律的行为和权力。要使用我们的服务,你必须同意遵守[使用条款](/tos)。\n" + body: "\n\n## [这是一个文明讨论的地方](#civilized)\n\n在论坛上请表现得像在公共公园一样得体。我们一群人共享着一个公共社群资源 — 一个通过不断进行讨论以分享我们技能、知识和兴趣的地方。\n\n这些都不是死规矩或者是草率决定,只是一些帮助社群的人们来判断的规定。试用这些指引来保持干净和充满灵感的文明的公开论坛。 \n\n\n\n## [改善讨论](#improve)\n\n帮助我们让这个地方变成一个讨论的好地方。你可以总是一致的做一些帮助改善讨论的事,即使是小事也行。如果你不确定你的帖子有益于讨论,认真想一想你要说什么再发布。\n\n这里讨论的主题对我们很重要,并且我们希望你也觉得这些内容对你很重要。尊重这些讨论的主题,以及讨论他们的人们,特别是当你不同意他们所说的时候。\n\n改善讨论的一种方法是找一找已经发生过的事。请在发帖或创建你自己的主题前,花一些时间浏览这些主题,这样你更有机会遇见和你有共同爱好的人。 \n\n\n\n## [即使你不同意他人时,尊重他人](#agreeable)\n\n你可能想表达你的不同意。这没问题。但是,记住_批评观点,而不是人_。请避免:\n\n* 指名道姓。\n* 人生攻击。\n* 回复帖子无关于帖子的内容。\n* 下意识的反驳。\n\n相反,提供合理的观点改善讨论。 \n\n\n\n## [你的参与有意义](#participate)\n\n我们在这儿的讨论为大家树立了榜样。通过选择参与有意义的讨论,帮助我们将论坛变成一个有意思的地方 — 并且避免那些没有帮助的行为。\n\nDiscourse 提供了让社群共同鉴别最棒(或最差)的贡献的工具:收藏、书签、赞、标记、回复和编辑等等。使用这些工具不仅能改善你自己的体验,也能改善其他人的体验。\n\n让我们创造一个更美好的社群。\n\n\n\n## [如果你发现问题了,标记它](#flag-problems)\n版主有特别的权力;他们对论坛负责。但是你也是。有了你的帮助,版主能成为社群监察者,而不仅是守卫或者警察。\n\n当你见到不合适的行为,不要回复。这种承认变相鼓励了这种不合适的行为,浪费了你的精力,并且浪费了每一个人的时间。_只要标记它。_如果收到了足够的标记,将会有相应的处理,这个处理可能是自动地,也可能由版主介入。\n\n为了维护我们的社群,版主保留了任何情况下删除任何内容和任何用户的权力。版主没有预先审核任何新帖子;版主和站点维护人员对社群里发表的任何言论均不负责任。 \n\n\n\n## [永远保持文明](#be-civil)\n\n粗鲁这样的行为会破坏健康的讨论:\n\n* 文明。不要发表任何理智的人会认为冒犯的、过分的或招致怨恨的言论。\n* 拒绝色情。不要发表任何淫秽或性暗示的东西。\n* 尊重每一个人。不要骚扰或者让别人难过,检视别人,或暴露他们的个人信息。\n* 尊重我们的论坛。不要发表广告或者其他垃圾信息。\n\n这些条款不是法律条文,并且没有准确的定义 — 避免任何做关于他们的_可能擦边_的事。如果你不确定,问问自己的帖子是否能出现在纽约时报的头版头条上。\n\n这是一个公共论坛,并且搜索引擎会索引这些讨论。注意发表的语言、链接和图片,不要在其中包含你的家庭和朋友。 \n\n\n\n## [保持整洁](#keep-tidy)\n\n花一点时间让东西出现在正确的位置,这样我们能花更多的时间在讨论上而非清理格式。所以:\n\n* 不要在错误的分类发表新主题。\n* 不要在多个主题中回复同样的内容。\n* 不要发布没有内容的回复。\n* 不要在中途改变主题。\n* 不要在你的帖子中签名 — 每一贴都附有你的个人信息。\n\n比起发表“+1”或者“同意”,使用赞按钮。比起将帖子带向一个决然不同的方向,使用“回复为关联主题”。\n\n\n\n## [只发表你自己的东西](#stealing)\n\n你不能在没有他人授权的情况下发表任何属于他人的数字资产。你可能不能发表关于窃据他人知识产权(软件、视频、音频和图像)的任何简介、链接或方法,或其他任何违反法律的内容。 \n\n\n\n## [有你参与](#power)\n\n这个站点由[一群友善的管理人员](/about)、你和社群一起运营。如果你对这里的事情仍有疑问,在[站点反馈](/c/site-feedback)分类新建一个主题并且开始讨论!如果遇到了重要或紧急的事情,并且不能用站务分类的主题或标记解决,通过[管理人员页面](/about)联系我们。\n\n\n\n## [使用条款](#tos)\n\n是的,法律很无聊,但是我们必须保护我们自己 – 引申开来,你和你的数据 – 用于针对不友好的家伙们。我们有一个[使用条款](/tos)描述你的(以及我们)关于内容、隐私和法律的行为和权力。要使用我们的服务,你必须同意遵守[使用条款](/tos)。\n" tos_topic: title: "服务条款" body: | @@ -1908,7 +2144,7 @@ zh_CN: ## [儿童在线隐私保护法案合规](#coppa) - 我们的站点、产品和服务提供给 13 岁以上的人们。如果服务器位于美国,并且你小于 13 岁,根据 COPPA([儿童在线隐私保护法案合规](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act)),不要使用这个站点。 + 我们的站点、产品和服务提供给 13 岁以上的人们。如果服务器位于美国,并且你小于 13 岁,根据[儿童在线隐私保护法案合规](https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act),不要使用这个站点。 @@ -1984,7 +2220,7 @@ zh_CN: regular: | 该徽章授予给用户等级达到 3 的成员。感谢你在社群的这几月的活跃参与,并且是我们最活跃的读者质疑,也是社群中的可靠贡献者。你现在可以重新分类和重命名主题、访问隐藏的贵宾分类、使用更多强大的防骚扰标记功能,以及每天可以赞更多次了。 leader: | - 该徽章授予给用户等级达到 4 的成员。你是由职员选择的社群领袖,鉴于你在社群的话语和贡献,你为社群树立了一个正面的例子。你有权限编辑所有的帖子,使用主题管理操作,例如置顶、关闭、不在列表中显示、存档、分割和合并,并且可以每天点赞非常多次。 + 该徽章授予给用户等级达到 4 的成员。你是由管理人员选择的社群领袖,鉴于你在社群的话语和贡献,你为社群树立了一个正面的例子。你有权限编辑所有的帖子,使用主题管理操作,例如置顶、关闭、不在列表中显示、存档、分割和合并,并且可以每天点赞非常多次。 admin_login: success: "邮件已发送" error: "错误!" From bfea842d324c9f62ac33da64e5ec356493cbd635 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Tue, 1 Mar 2016 17:36:30 +0800 Subject: [PATCH 184/245] UX: Better error message when logging out in read only mode. --- .../javascripts/discourse/routes/application.js.es6 | 12 +++++++----- config/locales/client.en.yml | 1 + 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index b25208f6ce..184646a9cc 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -4,10 +4,10 @@ import showModal from 'discourse/lib/show-modal'; import OpenComposer from "discourse/mixins/open-composer"; import Category from 'discourse/models/category'; -function unlessReadOnly(method) { +function unlessReadOnly(method, message) { return function() { if (this.site.get("isReadOnly")) { - bootbox.alert(I18n.t("read_only_mode.login_disabled")); + bootbox.alert(message); } else { this[method](); } @@ -19,7 +19,9 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { actions: { - logout() { + logout: unlessReadOnly('_handleLogout', I18n.t("read_only_mode.logout_disabled")), + + _handleLogout() { if (this.currentUser) { this.currentUser.destroySession().then(() => logout(this.siteSettings, this.keyValueStore)); } @@ -83,9 +85,9 @@ const ApplicationRoute = Discourse.Route.extend(OpenComposer, { return true; }, - showLogin: unlessReadOnly('handleShowLogin'), + showLogin: unlessReadOnly('handleShowLogin', I18n.t("read_only_mode.login_disabled")), - showCreateAccount: unlessReadOnly('handleShowCreateAccount'), + showCreateAccount: unlessReadOnly('handleShowCreateAccount', I18n.t("read_only_mode.login_disabled")), showForgotPassword() { showModal('forgotPassword', { title: 'forgot_password.title' }); diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index d4d17f0a10..d4d246a005 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -777,6 +777,7 @@ en: read_only_mode: enabled: "This site is in read only mode. Please continue to browse, but replying, likes, and other actions are disabled for now." login_disabled: "Login is disabled while the site is in read only mode." + logout_disabled: "Logout is disabled while the site is in read only mode." too_few_topics_and_posts_notice: "Let's get this discussion started! There are currently %{currentTopics} / %{requiredTopics} topics and %{currentPosts} / %{requiredPosts} posts. New visitors need some conversations to read and respond to." too_few_topics_notice: "Let's get this discussion started! There are currently %{currentTopics} / %{requiredTopics} topics. New visitors need some conversations to read and respond to." too_few_posts_notice: "Let's get this discussion started! There are currently %{currentPosts} / %{requiredPosts} posts. New visitors need some conversations to read and respond to." From a66c236adb613f2c1971156f844fcb35ed9b8675 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Garc=C3=ADa-Navas=20L=C3=B3pez=20de=20Cu=C3=A9llar?= Date: Tue, 1 Mar 2016 12:06:27 +0100 Subject: [PATCH 185/245] very little typo [ci skip] [ci skip] --- config/locales/server.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 093fd5449a..841cf5108f 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -59,7 +59,7 @@ en: blocked_user_error: "Happens when the sender has been blocked." bad_destination_address: "Happens when none of the email addresses in To/Cc/Bcc fields matched a configured incoming email address." strangers_not_allowed_error: "Happens when a user tried to create a new topic in a category they're not a member of." - insufficient_trust_level_error: "Happens when a use tried to create a new topic in a category they don't have the required trust level for." + insufficient_trust_level_error: "Happens when a user tried to create a new topic in a category they don't have the required trust level for." reply_user_not_matching_error: "Happens when a reply came in from a different email address the notification was sent to." topic_not_found_error: "Happens when a reply came in but the related topic has been deleted." topic_closed_error: "Happens when a reply came in but the related topic has been closed." From 9dc533a26c716c52e01a68f1701f8e0e9ef15b61 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Tue, 1 Mar 2016 22:52:55 +0530 Subject: [PATCH 186/245] fix broken locale --- config/locales/client.ar.yml | 4 ++-- config/locales/client.bs_BA.yml | 4 ++-- config/locales/client.cs.yml | 4 ++-- config/locales/client.da.yml | 4 ++-- config/locales/client.de.yml | 4 ++-- config/locales/client.es.yml | 4 ++-- config/locales/client.fa_IR.yml | 4 ++-- config/locales/client.fi.yml | 4 ++-- config/locales/client.fr.yml | 4 ++-- config/locales/client.he.yml | 4 ++-- config/locales/client.it.yml | 4 ++-- config/locales/client.ja.yml | 4 ++-- config/locales/client.ko.yml | 4 ++-- config/locales/client.nb_NO.yml | 4 ++-- config/locales/client.nl.yml | 4 ++-- config/locales/client.pl_PL.yml | 4 ++-- config/locales/client.pt.yml | 4 ++-- config/locales/client.pt_BR.yml | 4 ++-- config/locales/client.ru.yml | 4 ++-- config/locales/client.sk.yml | 4 ++-- config/locales/client.sq.yml | 4 ++-- config/locales/client.sv.yml | 4 ++-- config/locales/client.te.yml | 4 ++-- config/locales/client.tr_TR.yml | 4 ++-- config/locales/client.vi.yml | 4 ++-- config/locales/client.zh_CN.yml | 4 ++-- config/locales/client.zh_TW.yml | 4 ++-- 27 files changed, 54 insertions(+), 54 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index c89836ac16..e83aab1db7 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -849,8 +849,8 @@ ar: value_prop: "عندما تنشئ حساب، ننحن نتذكر ما كنت تقرأه بالضبط، و سترجع دائما في المكان الذي تركته، و ستصلك الاشعارات ايضا، هنا و عبر البريد الإلكتروني، في اي وقت ينشأ فيه منشور جديد، و تستطيع أن تُعجب بالمنشورارت لتشارك ما يعجبك :heartbeat:" summary: enabled_description: "أنت تنظر الى ملخص لهذا الموضوع , مشاركات مثيرة للإهتمام بحسب رأي المجتمع" - description: "هناك {{count}} ردود" - description_time: "هناك {{count}} ردود مع تقدير وقت القراءة {{readingTime}} دقائق." + description: "هناك {{replyCount}} ردود" + description_time: "هناك {{replyCount}} ردود مع تقدير وقت القراءة {{readingTime}} دقائق." enable: 'لخّص هذا الموضوع' disable: 'عرض جميع المشاركات' deleted_filter: diff --git a/config/locales/client.bs_BA.yml b/config/locales/client.bs_BA.yml index d2dc34c974..822c23ebde 100644 --- a/config/locales/client.bs_BA.yml +++ b/config/locales/client.bs_BA.yml @@ -515,8 +515,8 @@ bs_BA: last_post: Zadnji post summary: enabled_description: "You're viewing a summary of this topic: the most interesting posts as determined by the community." - description: "There are {{count}} replies." - description_time: "There are {{count}} replies with an estimated read time of {{readingTime}} minutes." + description: "There are {{replyCount}} replies." + description_time: "There are {{replyCount}} replies with an estimated read time of {{readingTime}} minutes." enable: 'Summarize This Topic' disable: 'Show All Posts' deleted_filter: diff --git a/config/locales/client.cs.yml b/config/locales/client.cs.yml index 187f5a0080..1c5aa2ea00 100644 --- a/config/locales/client.cs.yml +++ b/config/locales/client.cs.yml @@ -697,8 +697,8 @@ cs: value_prop: "Pokud si založíš účet, budeme si přesně pomatovat, co jsi četly, takže se vždycky vrátíš do bodu, odkud jsi odešel. Také budeš dostávat upozornění, zde a přes e-mail, kdykoli přibydou nově příspěvky. A můžeš přidávat 'to se mi líbí' a šířit tak lásku. :heartbeat:" summary: enabled_description: "Čtete shrnutí tohoto tématu: nejzajímavější příspěvky podle komunity." - description: "Obsahuje {{count}} odpovědí." - description_time: "Obsahuje {{count}} odpovědí o odhadovaném času čtení {{readingTime}} minut." + description: "Obsahuje {{replyCount}} odpovědí." + description_time: "Obsahuje {{replyCount}} odpovědí o odhadovaném času čtení {{readingTime}} minut." enable: 'Přepnout na "nejlepší příspěvky"' disable: 'Přepnout na normální zobrazení' deleted_filter: diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index 34c0c0175e..e971423ded 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -717,8 +717,8 @@ da: value_prop: "Når du opretter en konto, så kan vi huske hvad du har læst, så du altid kan fortsætte, hvor du er kommet til. Du får også notifikationer - her og på email - når nye interessante indlæg postes. Og du kan like indlæg og dele begejstringen. :heartbeat:" summary: enabled_description: "Du ser et sammendrag af dette emne: kun de mest interessante indlæg som andre finder interresante." - description: "Der er {{count}} svar." - description_time: "Der er {{count}} svar og det vil tage ca. {{readingTime}} minutter at læse." + description: "Der er {{replyCount}} svar." + description_time: "Der er {{replyCount}} svar og det vil tage ca. {{readingTime}} minutter at læse." enable: 'Opsummér dette emne' disable: 'Vis alle indlæg' deleted_filter: diff --git a/config/locales/client.de.yml b/config/locales/client.de.yml index 5f206011d8..f726d1e024 100644 --- a/config/locales/client.de.yml +++ b/config/locales/client.de.yml @@ -731,8 +731,8 @@ de: value_prop: "Wenn du ein Benutzerkonto anlegst, merken wir uns, was du gelesen hast, damit du immer dort fortsetzten kannst, wo du aufgehört hast. Du kannst auch Benachrichtigungen – hier oder per E-Mail – erhalten, wenn neue Beiträge verfasst werden. Beiträge, die dir gefallen, kannst du mit einem Like versehen und diese Freude mit allen teilen. :heartbeat:" summary: enabled_description: "Du siehst gerade eine Zusammenfassung des Themas: die interessantesten Beiträge, die von der Community bestimmt wurden." - description: "Es gibt {{count}} Antworten." - description_time: "Es gibt {{count}} Antworten mit einer geschätzten Lesezeit von {{readingTime}} Minuten." + description: "Es gibt {{replyCount}} Antworten." + description_time: "Es gibt {{replyCount}} Antworten mit einer geschätzten Lesezeit von {{readingTime}} Minuten." enable: 'Zusammenfassung vom Thema erstellen' disable: 'Alle Beiträge anzeigen' deleted_filter: diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index b65b513439..1bc738d842 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -731,8 +731,8 @@ es: value_prop: "Cuando te registras, recordamos lo que has leído, para que puedas volver justo donde estabas leyendo. También recibes notificaciones, por aquí y por email, cuando se publican nuevos mensajes. ¡También puedes darle a Me gusta a los mensajes! :heartbeat:" summary: enabled_description: "Estás viendo un resumen de este tema: los posts más interesantes determinados por la comunidad." - description: "Hay {{count}} respuestas." - description_time: "Hay {{count}} respuestas con un tiempo de lectura estimado de {{readingTime}} minutos." + description: "Hay {{replyCount}} respuestas." + description_time: "Hay {{replyCount}} respuestas con un tiempo de lectura estimado de {{readingTime}} minutos." enable: 'Resumir este Tema' disable: 'Ver Todos los Posts' deleted_filter: diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index ae24711f45..9db99547a1 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -662,8 +662,8 @@ fa_IR: value_prop: "وقتی که شما یک حساب کابری ایجاد میکنید, ما به خاطر میسپاریم که شما دقیقا در حال خواندن چه چیزی بودید, بنابراین شما همیشه برمی گردید از جایی که خواندن را رها کردید. همچنین شما اعلانات را دریافت میکنید, اینجا و از طریق ایمیل, هر زمان که ارسال جدیدی فرستاده شود. و شما میتوانید ارسال ها را پسند کنید تا در محبت آن سهیم باشید. :heartbeat:" summary: enabled_description: "شما خلاصه ای از این موضوع را می بینید: بالاترین‌ نوشته های انتخاب شده توسط انجمن." - description: "{{count}} پاسخ" - description_time: "وجود دارد {{count}} پاسخ ها برا اساس زمان خواندن{{readingTime}} دقیقه." + description: "{{replyCount}} پاسخ" + description_time: "وجود دارد {{replyCount}} پاسخ ها برا اساس زمان خواندن{{readingTime}} دقیقه." enable: 'خلاصه این موضوع' disable: 'نمایش همه نوشته‌ها' deleted_filter: diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index e3f9a11817..42423b650e 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -731,8 +731,8 @@ fi: value_prop: "Kun luot tilin, muistamme mitä olet lukenut, jotta voit aina palata keskusteluissa takaisin oikeaan kohtaan. Saat myös ilmoituksia, täällä tai sähköpostilla, kun uusia viestejä kirjoitetaan. Voit myös tykätä viesteistä. :heartbeat:" summary: enabled_description: "Tarkastelet tiivistelmää tästä ketjusta, sen mielenkiintoisimpia viestejä käyttäjien toiminnan perusteella." - description: "Tässä ketjussa on {{count}} viestiä." - description_time: "Ketjussa on {{count}} viestiä, joiden arvioitu lukemisaika on {{readingTime}} minuuttia." + description: "Tässä ketjussa on {{replyCount}} viestiä." + description_time: "Ketjussa on {{replyCount}} viestiä, joiden arvioitu lukemisaika on {{readingTime}} minuuttia." enable: 'Näytä ketjun tiivistelmä' disable: 'Näytä kaikki viestit' deleted_filter: diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 9b5f0f066b..468058cc8d 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -731,8 +731,8 @@ fr: value_prop: "Quand vous créez votre compte, nous stockons ce que vous avez lu pour vous positionner systématiquement sur le bon emplacement à votre retour. Vous avez également des notifications, ici et par courriel, quand de nouveaux messages sont postés. Et vous pouvez aimer les messages pour partager vos coups de cœurs. :heartbeat:" summary: enabled_description: "Vous visualisez un résumé de ce sujet : les messages importants choisis par la communauté." - description: "Il y a {{count}} réponses." - description_time: "Il y a {{count}} réponses avec un temps estimé de lecture de {{readingTime}} minutes." + description: "Il y a {{replyCount}} réponses." + description_time: "Il y a {{replyCount}} réponses avec un temps estimé de lecture de {{readingTime}} minutes." enable: 'Résumer ce sujet' disable: 'Afficher tous les messages' deleted_filter: diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index dcd24e4f39..c2a191f2ae 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -686,8 +686,8 @@ he: value_prop: "כשאתה נרשם, אנחנו זוכרים בדיוק מה קראת כך כשאתה חוזר אתה ממשיך בדיוק מאיפה שהפסקת. בנוסף אתה תקבל התראות דרך האתר ודרך הדואר האלקטרוני שלך כשפוסטים חדשים נוצרים ועוד משהו, אתה יכול לעשות לייק לפוסטים שאהבת. :heartbeat:" summary: enabled_description: "אתם צופים בסיכום פוסט זה: הפרסומים המעניינים ביותר כפי שסומנו על ידי הקהילה." - description: "ישנן {{count}} תגובות" - description_time: "ישנן {{count}} תגובות, עם הערכת זמן קריאה של כ- {{readingTime}} דקות ." + description: "ישנן {{replyCount}} תגובות" + description_time: "ישנן {{replyCount}} תגובות, עם הערכת זמן קריאה של כ- {{readingTime}} דקות ." enable: 'סכם פוסט זה' disable: 'הצג את כל ההודעות' deleted_filter: diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 01638e495a..4a714c6e7d 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -712,8 +712,8 @@ it: value_prop: "Quando hai un account ci ricordiamo esattamente cosa stavi leggendo, così potrai riprendere da dove ti eri fermato. Inoltre ricevi le notifiche, sia qui sia via email, ogni volta che ci saranno nuovi messaggi. Inoltre potrai metterei i \"Mi piace\" ai messaggi e condividerne l'apprezzamento. :heartbeat:" summary: enabled_description: "Stai visualizzando un riepilogo dell'argomento: è la comunità a determinare quali sono i messaggi più interessanti." - description: "Ci sono {{count}} risposte." - description_time: "Ci sono {{count}} risposte con un tempo stimato di lettura di {{readingTime}} minuti." + description: "Ci sono {{replyCount}} risposte." + description_time: "Ci sono {{replyCount}} risposte con un tempo stimato di lettura di {{readingTime}} minuti." enable: 'Riassumi Questo Argomento' disable: 'Mostra Tutti i Messaggi' deleted_filter: diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index 21de46261f..481d6608ef 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -594,8 +594,8 @@ ja: sign_up: "新しいアカウントを作成" summary: enabled_description: "トピックのまとめを表示されています。" - description: "{{count}} 返信があります。" - description_time: "全てを確認するのに {{readingTime}} 分 前後を要する {{count}} 個の回答があります。" + description: "{{replyCount}} 返信があります。" + description_time: "全てを確認するのに {{readingTime}} 分 前後を要する {{replyCount}} 個の回答があります。" enable: 'このトピックを要訳する' disable: '全ての投稿を表示する' deleted_filter: diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 005377aabf..4146b79063 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -695,8 +695,8 @@ ko: value_prop: "회원가입 하시면 글을 어디까지 읽으셨는지 저희가 기억하기 때문에, 언제든지 마지막 읽은 위치로 바로 돌아갈 수 있답니다. 그리고 새글이 뜰때마다 이 화면과 이메일로 알림을 받을수도 있고, 좋아요를 클릭해서 글에 대한 애정을 표현하실 수도 있어요. :heartbeat:" summary: enabled_description: "현재 커뮤니티에서 가장 인기있는 토픽의 요약본을 보고 있습니다:" - description: "{{count}}개의 답글이 있습니다." - description_time: "총 {{count}}개의 댓글이 있습니다. 예상 소요 시간은 {{readingTime}}분입니다.." + description: "{{replyCount}}개의 답글이 있습니다." + description_time: "총 {{replyCount}}개의 댓글이 있습니다. 예상 소요 시간은 {{readingTime}}분입니다.." enable: '이 토픽을 요약Show All Posts' disable: '모든 포스트 보기' deleted_filter: diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index 4a19e0c17e..64f5311e8a 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -645,8 +645,8 @@ nb_NO: value_prop: "Når du registrerer deg husker vi hvor langt du har lest, så du starter på riktig sted neste gang du åpner en tråd. Du får også varsler, her og på e-post når det skjer ting i diskusjonene du vil følge. I tillegg kan du like innlegg :heartbeat:" summary: enabled_description: "Du ser for øyeblikket en oppsummering av dette emnet: de mest interessante innleggene i følge nettsamfunnet." - description: "Det er {{count}} svar." - description_time: "Det er {{count}} svar med en estimert lesetid på {{readingTime}} minutter." + description: "Det er {{replyCount}} svar." + description_time: "Det er {{replyCount}} svar med en estimert lesetid på {{readingTime}} minutter." enable: 'Oppsummer dette emnet' disable: 'Vis alle innlegg' deleted_filter: diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index daab5b8e4b..0c4ea992f0 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -662,8 +662,8 @@ nl: value_prop: "Wanneer je een account aangemaakt hebt, herinneren deze wat je gelezen hebt, zodat je direct door kan lezen vanaf waar je gestopt bent. Je krijgt ook notificaties, hier en via email, wanneer nieuwe posts gemaakt zijn. En je kan ook nog posts liken :heartbeat:" summary: enabled_description: "Je leest een samenvatting van dit topic: alleen de meeste interessante berichten zoals bepaald door de community. " - description: "Er zijn {{count}} reacties." - description_time: "Er zijn {{count}} reacties met een gemiddelde leestijd van {{readingTime}} minuten." + description: "Er zijn {{replyCount}} reacties." + description_time: "Er zijn {{replyCount}} reacties met een gemiddelde leestijd van {{readingTime}} minuten." enable: 'Samenvatting Topic' disable: 'Alle berichten' deleted_filter: diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 2d9005ccb5..cd19d4c817 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -700,8 +700,8 @@ pl_PL: value_prop: "Jeśli stworzysz konto, zapamiętamy przeczytane przez Ciebie wpisy i tematy, dzięki czemu zawsze powrócisz do odpowiedniego miejsca. Otrzymasz też powiadomienia o nowych wpisach. Dodatkowo możliwe będzie polubienie ciekawych wpisów :heartbeat:" summary: enabled_description: "Przeglądasz podsumowanie tego tematu: widoczne są jedynie najbardziej wartościowe wpisy zdaniem uczestników. " - description: "Istnieją {{count}} odpowiedzi." - description_time: "Istnieją {{count}} odpowiedzi z czasem czytania oszacowanym na {{readingTime}} minut." + description: "Istnieją {{replyCount}} odpowiedzi." + description_time: "Istnieją {{replyCount}} odpowiedzi z czasem czytania oszacowanym na {{readingTime}} minut." enable: 'Podsumuj ten temat' disable: 'Pokaż wszystkie wpisy' deleted_filter: diff --git a/config/locales/client.pt.yml b/config/locales/client.pt.yml index 1bc7d3a0ed..ebd3179847 100644 --- a/config/locales/client.pt.yml +++ b/config/locales/client.pt.yml @@ -731,8 +731,8 @@ pt: value_prop: "Quando cria uma conta, nós lembramo-nos exatamente do que leu, por isso volta sempre ao sítio onde ficou. Também recebe notificações, aqui ou por email, sempre que novas mensagens são feitas. E pode gostar de mensagens para partilhar o amor. :heartbeat:" summary: enabled_description: "Está a ver um resumo deste tópico: as mensagens mais interessantes são determinados pela comunidade." - description: "Existem {{count}} respostas." - description_time: "Existem {{count}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." + description: "Existem {{replyCount}} respostas." + description_time: "Existem {{replyCount}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." enable: 'Resumir Este Tópico' disable: 'Mostrar Todas As Mensagens' deleted_filter: diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index 84dbeab8a2..3bb279e16f 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -688,8 +688,8 @@ pt_BR: value_prop: "Quando você cria uma conta, nós lembramos exatamente o que você leu, assim você sempre volta exatamente aonde estava. Você também recebe notificações, aqui e por e-mail, quando novas mensagens são feitas. E você pode curtir tópicos para compartilhar o amor. :heartbeat:" summary: enabled_description: "Você está vendo um sumário deste tópico: os posts mais interessantes conforme determinados pela comunidade." - description: "Há {{count}} respostas." - description_time: "Há {{count}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." + description: "Há {{replyCount}} respostas." + description_time: "Há {{replyCount}} respostas com um tempo de leitura estimado de {{readingTime}} minutos." enable: 'Resumir Este Tópico' disable: 'Exibir Todas as Mensagens' deleted_filter: diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 1344b2f784..52ecb1d2eb 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -770,8 +770,8 @@ ru: value_prop: "После регистрации мы сможем запоминать, где вы закончили чтение, а когда вы заглянете в ту или иную тему снова, мы откроем ее там, где вы остановились в прошлый раз. Мы также сможем уведомлять вас о новых ответах в любимых темах в вашем личном кабинете или по электронной почте. А самое приятное - после регистрации можно ставить сердечки, тем самым выражая свою симпатию автору. :heartbeat:" summary: enabled_description: "Вы просматриваете выдержку из темы - только самые интересные сообщения по мнению сообщества." - description: "Есть {{count}} ответ(ов)." - description_time: "В теме {{count}} сообщений с ожидаемым временем чтения {{readingTime}} минут." + description: "Есть {{replyCount}} ответ(ов)." + description_time: "В теме {{replyCount}} сообщений с ожидаемым временем чтения {{readingTime}} минут." enable: 'Сводка по теме' disable: 'Показать все сообщения' deleted_filter: diff --git a/config/locales/client.sk.yml b/config/locales/client.sk.yml index a9ce4e02a5..1785589903 100644 --- a/config/locales/client.sk.yml +++ b/config/locales/client.sk.yml @@ -764,8 +764,8 @@ sk: value_prop: "Keď si vytvoríte účet, zapamätáme si čo ste čítali, takže sa môžete vrátiť presne tam, kde ste prestali. Okrem toho dostanete upozornenie tu, aj na váš e-mail, vždy keď pribudnú nové príspevky. A môžete označiť príspevky ktoré sa vám páčia. :heartbeat:" summary: enabled_description: "Pozeráte sa na zhrnutie tejto témy: najzaujímavejšie príspevky podľa výberu komunity." - description: "Je tu {{count}} odpovedí." - description_time: "Je tu {{count}} odpovedí s priemerným časom čítania {{readingTime}} minút." + description: "Je tu {{replyCount}} odpovedí." + description_time: "Je tu {{replyCount}} odpovedí s priemerným časom čítania {{readingTime}} minút." enable: 'Zhrnutie tejto témy' disable: 'Zobraziť všetky príspevky' deleted_filter: diff --git a/config/locales/client.sq.yml b/config/locales/client.sq.yml index d8fe81d4fa..85c7110c0f 100644 --- a/config/locales/client.sq.yml +++ b/config/locales/client.sq.yml @@ -615,8 +615,8 @@ sq: hide_forever: "jo faleminderit" summary: enabled_description: "You're viewing a summary of this topic: the most interesting posts as determined by the community." - description: "Janë {{count}} përgjigje." - description_time: "There are {{count}} replies with an estimated read time of {{readingTime}} minutes." + description: "Janë {{replyCount}} përgjigje." + description_time: "There are {{replyCount}} replies with an estimated read time of {{readingTime}} minutes." enable: 'Përmbidhë këtë Diskutim' disable: 'Shfaq të gjithë Postimet' deleted_filter: diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 7f9de18c7d..3917f6b597 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -633,8 +633,8 @@ sv: hide_forever: "Nej tack" summary: enabled_description: "Sammanfattning över de inlägg som användarna tycker är mest intressanta." - description: "Det finns {{count}} svar." - description_time: "Det finns {{count}} svar med en uppskattad lästid på {{readingTime}} minuter." + description: "Det finns {{replyCount}} svar." + description_time: "Det finns {{replyCount}} svar med en uppskattad lästid på {{readingTime}} minuter." enable: 'Sammanfatta detta ämne' disable: 'Visa alla inlägg' deleted_filter: diff --git a/config/locales/client.te.yml b/config/locales/client.te.yml index 78510ca5d0..a9a8ab6c39 100644 --- a/config/locales/client.te.yml +++ b/config/locales/client.te.yml @@ -489,8 +489,8 @@ te: last_post: చివరి టపా summary: enabled_description: "మీరు ఈ విషయపు సారాంశము చదువుతున్నారు. ఆసక్తికర టపాలు కమ్యునిటీ ఎంచుకుంటుంది. " - description: "అక్కడ మొత్తం {{count}} జవాబులు ఉన్నాయి" - description_time: "అక్కడ మొత్తం {{count}} జవాబులు ఉన్నాయి. వీటిని చదవడానికి సుమారుగా {{readingTime}} నిమిషాలు పడ్తాయి." + description: "అక్కడ మొత్తం {{replyCount}} జవాబులు ఉన్నాయి" + description_time: "అక్కడ మొత్తం {{replyCount}} జవాబులు ఉన్నాయి. వీటిని చదవడానికి సుమారుగా {{readingTime}} నిమిషాలు పడ్తాయి." enable: 'ఈ విషయాన్ని సంగ్రహించు' disable: 'అన్ని టపాలూ చూపు' deleted_filter: diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index dd61fc96fb..140fafe2ff 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -659,8 +659,8 @@ tr_TR: value_prop: "Bir hesap oluşturduğunuzda, tam olarak neyi okuyor olduğunuzu hatırlarız, böylece her zaman okumayı bırakmış olduğunuz yere geri gelirsiniz. Ayrıca burada, yeni gönderiler yağıldığında email yoluyla bildirim alırsınız. Ve sevgiyi paylaşmak için gönderileri beğenebilirsiniz. :heartbeat:" summary: enabled_description: "Bu konunun özetini görüntülemektesiniz: topluluğun en çok ilgisini çeken gönderiler" - description: "{{count}} sayıda cevap var." - description_time: "Tahmini okunma süresi {{readingTime}} dakika olan {{count}} sayıda cevap var." + description: "{{replyCount}} sayıda cevap var." + description_time: "Tahmini okunma süresi {{readingTime}} dakika olan {{replyCount}} sayıda cevap var." enable: 'Bu Konuyu Özetle.' disable: 'Tüm Gönderileri Göster' deleted_filter: diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 7623c339b5..b3451cc2dd 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -698,8 +698,8 @@ vi: value_prop: "Khi bạn tạo tài khoản, website nhớ chính xác những gì bạn đã đọc, vì vậy bạn sẽ luôn trở lại đúng nơi đã rời đi. Bạn cũng có thể nhận thông báo ở đây hoặc qua email mỗi khi có bài viết mới. Bạn cũng có thể like bài viết để chia sẻ cảm xúc của mình. :heartbeat:" summary: enabled_description: "Bạn đang xem một bản tóm tắt của chủ đề này: các bài viết thú vị nhất được xác định bởi cộng đồng." - description: "Có {{count}} trả lời" - description_time: "Đây là {{count}} trả lời tương ứng với thời gian đọc {{readingTime}} phút." + description: "Có {{replyCount}} trả lời" + description_time: "Đây là {{replyCount}} trả lời tương ứng với thời gian đọc {{readingTime}} phút." enable: 'Tóm tắt lại chủ đề' disable: 'HIển thị tất cả các bài viết' deleted_filter: diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 81282dc183..0995c1f992 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -698,8 +698,8 @@ zh_CN: value_prop: "当你创建了账户,我们能准确地追踪你的阅读进度,所以你能够在下一次访问时回到你上次阅读到的地方。你也可以在有新帖子的时候收到网页和邮件通知。并且你可以赞任何帖子来分享你的感谢。:heartbeat:" summary: enabled_description: "你正在查看这个主题的概括版本:由社群认定的最有意思的帖子。" - description: "有 {{count}} 个回复。" - description_time: "主题有 {{count}} 个回复,大约要花 {{readingTime}} 分钟阅读。" + description: "有 {{replyCount}} 个回复。" + description_time: "主题有 {{replyCount}} 个回复,大约要花 {{readingTime}} 分钟阅读。" enable: '概括本主题' disable: '显示所有帖子' deleted_filter: diff --git a/config/locales/client.zh_TW.yml b/config/locales/client.zh_TW.yml index 708c7307f7..3100d87adb 100644 --- a/config/locales/client.zh_TW.yml +++ b/config/locales/client.zh_TW.yml @@ -601,8 +601,8 @@ zh_TW: sign_up: "註冊" summary: enabled_description: "你正在檢視此討論話題的摘要:在這個社群裡最熱門的文章。" - description: "共有 {{count}} 個回覆。" - description_time: "共有 {{count}} 個回覆,大約需要 {{readingTime}} 分鐘閱讀。" + description: "共有 {{replyCount}} 個回覆。" + description_time: "共有 {{replyCount}} 個回覆,大約需要 {{readingTime}} 分鐘閱讀。" enable: '以摘要檢視此討論話題' disable: '顯示所有文章' deleted_filter: From 3d5dfab54e313a6020d973e1b034889abc25038b Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 12:48:40 -0500 Subject: [PATCH 187/245] FIX: Jump on mobile when cloaking --- app/assets/javascripts/discourse/widgets/post-stream.js.es6 | 2 +- app/assets/stylesheets/mobile/topic-post.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 index cae7057627..704b671f24 100644 --- a/app/assets/javascripts/discourse/widgets/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-stream.js.es6 @@ -17,7 +17,7 @@ export function cloak(post, component) { if (!CLOAKING_ENABLED || _cloaked[post.id] || _dontCloak[post.id]) { return; } const $post = $(`#post_${post.post_number}`); - _cloaked[post.id] = $post.height(); + _cloaked[post.id] = $post.outerHeight(); Ember.run.debounce(component, 'queueRerender', 1000); } diff --git a/app/assets/stylesheets/mobile/topic-post.scss b/app/assets/stylesheets/mobile/topic-post.scss index 5b5c02021d..ac5adc6de8 100644 --- a/app/assets/stylesheets/mobile/topic-post.scss +++ b/app/assets/stylesheets/mobile/topic-post.scss @@ -14,7 +14,7 @@ margin-top: 5px; } -.topic-post { +.topic-post article { border-top: 1px solid dark-light-diff($primary, $secondary, 90%, -60%); padding: 6px 0; } From 41a0f9b7fd7f7523c98611642112ba41bf6597b4 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Mar 2016 00:14:25 +0530 Subject: [PATCH 188/245] UX: better error message when inviting user to a topic --- app/models/topic.rb | 4 ++++ config/locales/server.en.yml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/app/models/topic.rb b/app/models/topic.rb index de5ea80d0d..bfec8ac390 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -582,6 +582,8 @@ class Topic < ActiveRecord::Base if private_message? # If the user exists, add them to the message. user = User.find_by_username_or_email(username_or_email) + raise StandardError.new I18n.t("topic_invite_user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? + if user && topic_allowed_users.create!(user_id: user.id) # Create a small action message add_small_action(invited_by, "invited_user", user.username) @@ -605,6 +607,8 @@ class Topic < ActiveRecord::Base else # invite existing member to a topic user = User.find_by_username(username_or_email) + raise StandardError.new I18n.t("topic_invite_user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? + if user && topic_allowed_users.create!(user_id: user.id) # rate limit topic invite RateLimiter.new(invited_by, "topic-invitations-per-day", SiteSetting.max_topic_invitations_per_day, 1.day.to_i).performed! diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 841cf5108f..6e7d5c342c 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -138,6 +138,8 @@ en: reading_time: "Reading time" likes: "Likes" + topic_invite_user_exists: "Sorry, that user has already been invited. You may only invite a user to a topic once." + too_many_replies: one: "We're sorry, but new users are temporarily limited to 1 reply in the same topic." other: "We're sorry, but new users are temporarily limited to %{count} replies in the same topic." From 618eef680e0ebd3a66eb724b97bd7ab01c1ca7bd Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 14:01:51 -0500 Subject: [PATCH 189/245] FEATURE: Disable removal of backups from S3 --- app/models/backup.rb | 2 +- config/locales/server.en.yml | 1 + config/site_settings.yml | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/models/backup.rb b/app/models/backup.rb index 40e5b1f71b..dfa5381219 100644 --- a/app/models/backup.rb +++ b/app/models/backup.rb @@ -34,7 +34,7 @@ class Backup end def after_remove_hook - remove_from_s3 if SiteSetting.enable_s3_backups? + remove_from_s3 if SiteSetting.enable_s3_backups? && !SiteSetting.s3_disable_cleanup? end def s3_bucket diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 6e7d5c342c..b40600e6ca 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -956,6 +956,7 @@ en: backup_frequency: "How frequently we create a site backup, in days." enable_s3_backups: "Upload backups to S3 when complete. IMPORTANT: requires valid S3 credentials entered in Files settings." s3_backup_bucket: "The remote bucket to hold backups. WARNING: Make sure it is a private bucket." + s3_disable_cleanup: "Disable the removal of backups from S3 when removed locally." backup_time_of_day: "Time of day UTC when the backup should occur." backup_with_uploads: "Include uploads in scheduled backups. Disabling this will only backup the database." diff --git a/config/site_settings.yml b/config/site_settings.yml index 15e68c3070..a35c30b598 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -885,6 +885,8 @@ backups: default: '' regex: "^[^A-Z_.]+$" # can't use '.' when using HTTPS shadowed_by_global: true + s3_disable_cleanup: + default: false backup_time_of_day: default: '3:30' regex: "^((0?(0|1|2|3|4|5|6|7|8|9)|(10|11|12|13|14|15|16|17|18|19|20|21|22|23))):\\d\\d$" From fff119a55443176e7f7e32e322daac08d19f5abc Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 14:08:39 -0500 Subject: [PATCH 190/245] FIX: Regression with categories when replying as linked topic --- app/assets/javascripts/discourse/controllers/topic.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index cfcc6ec0b8..a87f854e76 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -498,7 +498,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { composerController.open({ action: Composer.CREATE_TOPIC, draftKey: Composer.REPLY_AS_NEW_TOPIC_KEY, - categoryId: this.get('category.id') + categoryId: this.get('model.category.id') }).then(() => { return Em.isEmpty(quotedText) ? "" : quotedText; }).then(q => { From 8349669f8e206ec20155037890f03b7a53823bbf Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Mar 2016 00:37:04 +0530 Subject: [PATCH 191/245] streamline topic_invite locale --- app/models/topic.rb | 4 ++-- config/locales/server.en.yml | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/models/topic.rb b/app/models/topic.rb index bfec8ac390..1db44a557f 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -582,7 +582,7 @@ class Topic < ActiveRecord::Base if private_message? # If the user exists, add them to the message. user = User.find_by_username_or_email(username_or_email) - raise StandardError.new I18n.t("topic_invite_user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? + raise StandardError.new I18n.t("topic_invite.user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? if user && topic_allowed_users.create!(user_id: user.id) # Create a small action message @@ -607,7 +607,7 @@ class Topic < ActiveRecord::Base else # invite existing member to a topic user = User.find_by_username(username_or_email) - raise StandardError.new I18n.t("topic_invite_user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? + raise StandardError.new I18n.t("topic_invite.user_exists") if user.present? && topic_allowed_users.where(user_id: user.id).exists? if user && topic_allowed_users.create!(user_id: user.id) # rate limit topic invite diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index b40600e6ca..df555c7546 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -138,8 +138,6 @@ en: reading_time: "Reading time" likes: "Likes" - topic_invite_user_exists: "Sorry, that user has already been invited. You may only invite a user to a topic once." - too_many_replies: one: "We're sorry, but new users are temporarily limited to 1 reply in the same topic." other: "We're sorry, but new users are temporarily limited to %{count} replies in the same topic." @@ -2747,3 +2745,6 @@ en: performance_report: initial_post_raw: This topic includes daily performance reports for your site. initial_topic_title: Website performance reports + + topic_invite: + user_exists: "Sorry, that user has already been invited. You may only invite a user to a topic once." From 08e43588f6316e29bb6fe51c308712196f591fee Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 15:16:58 -0500 Subject: [PATCH 192/245] FIX: Autocomplete wasn't properly updating `d-editor` --- app/assets/javascripts/discourse/components/d-editor.js.es6 | 3 +++ app/assets/javascripts/discourse/lib/autocomplete.js.es6 | 4 ++++ app/assets/javascripts/discourse/templates/discovery.hbs | 2 ++ 3 files changed, 9 insertions(+) diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index 1fcb1b7616..c4cc4f88a3 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -301,6 +301,9 @@ export default Ember.Component.extend({ $editorInput.autocomplete({ template: template, key: ":", + afterComplete(text) { + self.set('value', text); + }, transformComplete(v) { if (v.code) { diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 index 5de6838211..0d158734bd 100644 --- a/app/assets/javascripts/discourse/lib/autocomplete.js.es6 +++ b/app/assets/javascripts/discourse/lib/autocomplete.js.es6 @@ -146,6 +146,10 @@ export default function(options) { text = text.substring(0, completeStart) + (options.key || "") + term + ' ' + text.substring(completeEnd + 1, text.length); me.val(text); Discourse.Utilities.setCaretPosition(me[0], completeStart + 1 + term.length); + + if (options && options.afterComplete) { + options.afterComplete(text); + } } } } diff --git a/app/assets/javascripts/discourse/templates/discovery.hbs b/app/assets/javascripts/discourse/templates/discovery.hbs index 1e4548bbe2..069be994ba 100644 --- a/app/assets/javascripts/discourse/templates/discovery.hbs +++ b/app/assets/javascripts/discourse/templates/discovery.hbs @@ -27,3 +27,5 @@ + +{{plugin-outlet "discovery-below"}} From e6b95e56d7cd21e7d0ee9a4ab966ba720fe01441 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 15:30:28 -0500 Subject: [PATCH 193/245] FIX: You shouldn't be able to convert a whisper to a moderator post --- .../javascripts/discourse/widgets/post-admin-menu.js.es6 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 b/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 index 16590124ff..37e4c642a7 100644 --- a/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 +++ b/app/assets/javascripts/discourse/widgets/post-admin-menu.js.es6 @@ -23,7 +23,8 @@ export default createWidget('post-admin-menu', { const contents = []; contents.push(h('h3', I18n.t('admin_title'))); - if (this.currentUser.staff) { + + if (!attrs.isWhisper && this.currentUser.staff) { const buttonAtts = { action: 'togglePostType', icon: 'shield', className: 'toggle-post-type' }; if (attrs.isModeratorAction) { From bff965327c0677768e58dd9eaf2b834a22d2342f Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Tue, 1 Mar 2016 16:50:46 -0500 Subject: [PATCH 194/245] FIX: Use much less aggressive cloaking --- .../components/scrolling-post-stream.js.es6 | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index 0afa3afa6d..e5303d3d84 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -41,8 +41,9 @@ export default MountWidget.extend({ const $w = $(window); const windowHeight = window.innerHeight ? window.innerHeight : $w.height(); - const slack = Math.round(windowHeight * 15); + const slack = Math.round(windowHeight * 5); const onscreen = []; + const nearby = []; let windowTop = $w.scrollTop(); @@ -72,6 +73,7 @@ export default MountWidget.extend({ if (viewBottom > windowTop && viewTop <= windowBottom) { onscreen.push(bottomView); } + nearby.push(bottomView); bottomView++; } @@ -114,20 +116,23 @@ export default MountWidget.extend({ } const onscreenPostNumbers = []; - const prev = this._previouslyOnscreen; + const prev = this._previouslyNearby; const newPrev = {}; - onscreen.forEach(idx => { + nearby.forEach(idx => { const post = posts.objectAt(idx); const postNumber = post.post_number; delete prev[postNumber]; - onscreenPostNumbers.push(postNumber); + + if (onscreen.indexOf(idx) !== -1) { + onscreenPostNumbers.push(postNumber); + } newPrev[postNumber] = post; uncloak(post, this); }); Object.keys(prev).forEach(pn => cloak(prev[pn], this)); - this._previouslyOnscreen = newPrev; + this._previouslyNearby = newPrev; this.screenTrack.setOnscreen(onscreenPostNumbers); }, @@ -139,7 +144,7 @@ export default MountWidget.extend({ this._super(); const debouncedScroll = () => Ember.run.debounce(this, this._scrollTriggered, 10); - this._previouslyOnscreen = {}; + this._previouslyNearby = {}; this.appEvents.on('post-stream:refresh', debouncedScroll); $(document).bind('touchmove.post-stream', debouncedScroll); From 83fda03495f75614d002bdfab955e7a18fa0563e Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Tue, 1 Mar 2016 14:22:30 -0800 Subject: [PATCH 195/245] remove modal flag hint, no longer needed --- app/assets/javascripts/discourse/templates/modal/flag.hbs | 1 - app/assets/stylesheets/desktop/modal.scss | 6 ------ app/assets/stylesheets/mobile/modal.scss | 2 -- config/locales/client.en.yml | 3 +-- 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/app/assets/javascripts/discourse/templates/modal/flag.hbs b/app/assets/javascripts/discourse/templates/modal/flag.hbs index 290c321a91..51709ea2dd 100644 --- a/app/assets/javascripts/discourse/templates/modal/flag.hbs +++ b/app/assets/javascripts/discourse/templates/modal/flag.hbs @@ -45,5 +45,4 @@ {{#if canDeleteSpammer}} {{/if}} - {{{i18n 'flagging.private_reminder'}}} diff --git a/app/assets/stylesheets/desktop/modal.scss b/app/assets/stylesheets/desktop/modal.scss index 77e4ea12e7..82a1ee16f4 100644 --- a/app/assets/stylesheets/desktop/modal.scss +++ b/app/assets/stylesheets/desktop/modal.scss @@ -46,12 +46,6 @@ margin-left: -1px; } -.modal-footer span.hint { - color: dark-light-choose(scale-color($primary, $lightness: 70%), scale-color($secondary, $lightness: 30%)); - float: right; - line-height: 30px; -} - .modal-header { border-bottom: 1px solid dark-light-diff($primary, $secondary, 90%, -60%); h3 { diff --git a/app/assets/stylesheets/mobile/modal.scss b/app/assets/stylesheets/mobile/modal.scss index 6431e56b99..bc1689b97c 100644 --- a/app/assets/stylesheets/mobile/modal.scss +++ b/app/assets/stylesheets/mobile/modal.scss @@ -48,8 +48,6 @@ margin-left: -1px; } -.modal-footer span.hint { display: none; } - .modal-header { // we need tighter spacing on mobile for header // this clearfix under the modal title h3 pushes it way down diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index d4d246a005..1c33b99827 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1700,7 +1700,6 @@ en: flagging: title: 'Thanks for helping to keep our community civil!' - private_reminder: 'flags are private, only visible to staff' action: 'Flag Post' take_action: "Take Action" notify_action: 'Message' @@ -1712,7 +1711,7 @@ en: submit_tooltip: "Submit the private flag" take_action_tooltip: "Reach the flag threshold immediately, rather than waiting for more community flags" cant: "Sorry, you can't flag this post at this time." - notify_staff: 'Notify Staff' + notify_staff: 'Notify staff privately' formatted_name: off_topic: "It's Off-Topic" inappropriate: "It's Inappropriate" From 280ca372a34f5629ca22723595246c49e594910b Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 2 Mar 2016 11:18:32 +1100 Subject: [PATCH 196/245] FIX: logout not working --- .../javascripts/discourse/routes/application.js.es6 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/discourse/routes/application.js.es6 b/app/assets/javascripts/discourse/routes/application.js.es6 index 184646a9cc..b057bcba8c 100644 --- a/app/assets/javascripts/discourse/routes/application.js.es6 +++ b/app/assets/javascripts/discourse/routes/application.js.es6 @@ -17,16 +17,16 @@ function unlessReadOnly(method, message) { const ApplicationRoute = Discourse.Route.extend(OpenComposer, { siteTitle: setting('title'), + _handleLogout() { + if (this.currentUser) { + this.currentUser.destroySession().then(() => logout(this.siteSettings, this.keyValueStore)); + } + }, + actions: { logout: unlessReadOnly('_handleLogout', I18n.t("read_only_mode.logout_disabled")), - _handleLogout() { - if (this.currentUser) { - this.currentUser.destroySession().then(() => logout(this.siteSettings, this.keyValueStore)); - } - }, - _collectTitleTokens(tokens) { tokens.push(this.get('siteTitle')); Discourse.set('_docTitle', tokens.join(' - ')); From c15c48393143dab0837e11853728c98e51df8346 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Wed, 2 Mar 2016 18:23:29 +1100 Subject: [PATCH 197/245] PERF: stop rebuilding full directory item table on refresh --- app/models/directory_item.rb | 66 +++++++++++++++---- ...63432_rebuild_directory_item_with_index.rb | 12 ++++ spec/models/directory_item_spec.rb | 8 ++- 3 files changed, 72 insertions(+), 14 deletions(-) create mode 100644 db/migrate/20160302063432_rebuild_directory_item_with_index.rb diff --git a/app/models/directory_item.rb b/app/models/directory_item.rb index 680b35c082..9582b42986 100644 --- a/app/models/directory_item.rb +++ b/app/models/directory_item.rb @@ -40,19 +40,39 @@ class DirectoryItem < ActiveRecord::Base end ActiveRecord::Base.transaction do - exec_sql "DELETE FROM directory_items WHERE period_type = :period_type", period_type: period_types[period_type] - exec_sql "INSERT INTO directory_items - (period_type, user_id, likes_received, likes_given, topics_entered, days_visited, posts_read, topic_count, post_count) - SELECT + exec_sql "DELETE FROM directory_items + USING directory_items di + LEFT JOIN users u ON u.id = user_id + WHERE di.id = directory_items.id AND + u.id IS NULL AND + di.period_type = :period_type", period_type: period_types[period_type] + + + exec_sql "INSERT INTO directory_items(period_type, user_id, likes_received, likes_given, topics_entered, days_visited, posts_read, topic_count, post_count) + SELECT :period_type, u.id, - SUM(CASE WHEN ua.action_type = :was_liked_type THEN 1 ELSE 0 END), - SUM(CASE WHEN ua.action_type = :like_type THEN 1 ELSE 0 END), - COALESCE((SELECT COUNT(topic_id) FROM topic_views AS v WHERE v.user_id = u.id AND v.viewed_at >= :since), 0), - COALESCE((SELECT COUNT(id) FROM user_visits AS uv WHERE uv.user_id = u.id AND uv.visited_at >= :since), 0), - COALESCE((SELECT SUM(posts_read) FROM user_visits AS uv2 WHERE uv2.user_id = u.id AND uv2.visited_at >= :since), 0), - SUM(CASE WHEN ua.action_type = :new_topic_type THEN 1 ELSE 0 END), - SUM(CASE WHEN ua.action_type = :reply_type THEN 1 ELSE 0 END) + 0, + 0, + 0, + 0, + 0, + 0, + 0 + FROM users u + LEFT JOIN directory_items di ON di.user_id = u.id AND di.period_type = :period_type + WHERE di.id IS NULL AND u.id > 0 + ", period_type: period_types[period_type] + + exec_sql "WITH x AS (SELECT + u.id user_id, + SUM(CASE WHEN ua.action_type = :was_liked_type THEN 1 ELSE 0 END) likes_received, + SUM(CASE WHEN ua.action_type = :like_type THEN 1 ELSE 0 END) likes_given, + COALESCE((SELECT COUNT(topic_id) FROM topic_views AS v WHERE v.user_id = u.id AND v.viewed_at >= :since), 0) topics_entered, + COALESCE((SELECT COUNT(id) FROM user_visits AS uv WHERE uv.user_id = u.id AND uv.visited_at >= :since), 0) days_visited, + COALESCE((SELECT SUM(posts_read) FROM user_visits AS uv2 WHERE uv2.user_id = u.id AND uv2.visited_at >= :since), 0) posts_read, + SUM(CASE WHEN ua.action_type = :new_topic_type THEN 1 ELSE 0 END) topic_count, + SUM(CASE WHEN ua.action_type = :reply_type THEN 1 ELSE 0 END) post_count FROM users AS u LEFT OUTER JOIN user_actions AS ua ON ua.user_id = u.id LEFT OUTER JOIN topics AS t ON ua.target_topic_id = t.id AND t.archetype = 'regular' @@ -67,7 +87,28 @@ class DirectoryItem < ActiveRecord::Base AND (NOT (COALESCE(p.hidden, false))) AND COALESCE(p.post_type, :regular_post_type) = :regular_post_type AND u.id > 0 - GROUP BY u.id", + GROUP BY u.id) + UPDATE directory_items di SET + likes_received = x.likes_received, + likes_given = x.likes_given, + topics_entered = x.likes_given, + days_visited = x.days_visited, + posts_read = x.posts_read, + topic_count = x.topic_count, + post_count = x.post_count + FROM x + WHERE + x.user_id = di.user_id AND + di.period_type = :period_type AND ( + di.likes_received <> x.likes_received OR + di.likes_given <> x.likes_given OR + di.topics_entered <> x.likes_given OR + di.days_visited <> x.days_visited OR + di.posts_read <> x.posts_read OR + di.topic_count <> x.topic_count OR + di.post_count <> x.post_count ) + + ", period_type: period_types[period_type], since: since, like_type: UserAction::LIKE, @@ -76,6 +117,7 @@ class DirectoryItem < ActiveRecord::Base reply_type: UserAction::REPLY, regular_post_type: Post.types[:regular] + if period_type == :all exec_sql < Date: Wed, 2 Mar 2016 14:01:38 +0530 Subject: [PATCH 198/245] FEATURE: new setting min_admin_password_length and better default --- app/views/users/password_reset.html.erb | 2 +- config/locales/server.en.yml | 1 + config/site_settings.yml | 6 +++++- lib/validators/password_validator.rb | 2 ++ .../components/validators/password_validator_spec.rb | 12 +++++++++++- spec/controllers/users_controller_spec.rb | 6 +++--- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/app/views/users/password_reset.html.erb b/app/views/users/password_reset.html.erb index 93a5fd40cb..2371150d55 100644 --- a/app/views/users/password_reset.html.erb +++ b/app/views/users/password_reset.html.erb @@ -37,7 +37,7 @@

- +

diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index df555c7546..e26431ed98 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -915,6 +915,7 @@ en: reserved_usernames: "Usernames for which signup is not allowed." min_password_length: "Minimum password length." + min_admin_password_length: "Minimum password length for Admin." block_common_passwords: "Don't allow passwords that are in the 10,000 most common passwords." enable_sso: "Enable single sign on via an external site (WARNING: USERS' EMAIL ADDRESSES *MUST* BE VALIDATED BY THE EXTERNAL SITE!)" diff --git a/config/site_settings.yml b/config/site_settings.yml index a35c30b598..e868cb0921 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -292,7 +292,11 @@ users: default: "admin|moderator|administrator|mod|sys|system|community|info|you|name|username|user|nickname|discourse|discourseorg|discourseforum|support" min_password_length: client: true - default: 8 + default: 10 + min: 1 + min_admin_password_length: + client: true + default: 15 min: 1 block_common_passwords: true enforce_global_nicknames: diff --git a/lib/validators/password_validator.rb b/lib/validators/password_validator.rb index 015f08f12e..3eb94a095a 100644 --- a/lib/validators/password_validator.rb +++ b/lib/validators/password_validator.rb @@ -6,6 +6,8 @@ class PasswordValidator < ActiveModel::EachValidator return unless record.password_required? if value.nil? record.errors.add(attribute, :blank) + elsif value.length < SiteSetting.min_admin_password_length && record.admin? + record.errors.add(attribute, :too_short, count: SiteSetting.min_admin_password_length) elsif value.length < SiteSetting.min_password_length record.errors.add(attribute, :too_short, count: SiteSetting.min_password_length) elsif record.username.present? && value == record.username diff --git a/spec/components/validators/password_validator_spec.rb b/spec/components/validators/password_validator_spec.rb index d95c0d5505..3cfe4f4357 100644 --- a/spec/components/validators/password_validator_spec.rb +++ b/spec/components/validators/password_validator_spec.rb @@ -40,6 +40,15 @@ describe PasswordValidator do validate expect(record.errors[:password]).to be_present end + + it "adds an error when user is admin and password is less than 15 chars" do + SiteSetting.min_admin_password_length = 15 + + @password = "12345678912" + record.admin = true + validate + expect(record.errors[:password]).to be_present + end end context "min password length is 12" do @@ -55,6 +64,7 @@ describe PasswordValidator do context "password is commonly used" do before do + SiteSetting.stubs(:min_password_length).returns(8) CommonPasswords.stubs(:common_password?).returns(true) end @@ -74,7 +84,7 @@ describe PasswordValidator do end it "adds an error when password is the same as the username" do - @password = "porkchops1" + @password = "porkchops1234" record.username = @password validate expect(record.errors[:password]).to be_present diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index eb83ce115f..042cd40377 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -723,7 +723,7 @@ describe UsersController do context "with values for the fields" do let(:create_params) { { name: @user.name, - password: 'watwatwat', + password: 'watwatwatwat', username: @user.username, email: @user.email, user_fields: { @@ -773,7 +773,7 @@ describe UsersController do context "without values for the fields" do let(:create_params) { { name: @user.name, - password: 'watwatwat', + password: 'watwatwatwat', username: @user.username, email: @user.email, } } @@ -793,7 +793,7 @@ describe UsersController do let!(:staged) { Fabricate(:staged, email: "staged@account.com") } it "succeeds" do - xhr :post, :create, email: staged.email, username: "zogstrip", password: "P4ssw0rd" + xhr :post, :create, email: staged.email, username: "zogstrip", password: "P4ssw0rd$$" result = ::JSON.parse(response.body) expect(result["success"]).to eq(true) expect(User.find_by(email: staged.email).staged).to eq(false) From 5f4075a6cf563a0c4a3ac1c0c2b5d9c1efc1d251 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Wed, 2 Mar 2016 23:16:52 +1100 Subject: [PATCH 199/245] FEATURE: users can select how frequently they are notified on likes - first time - first time and daily (default) - always --- .../discourse/controllers/preferences.js.es6 | 4 +++ .../javascripts/discourse/models/user.js.es6 | 3 +- .../discourse/templates/user/preferences.hbs | 5 ++++ ...ike_notification_frequency_site_setting.rb | 22 +++++++++++++++ app/models/user_option.rb | 6 ++++ app/serializers/user_option_serializer.rb | 3 +- app/services/post_alerter.rb | 28 ++++++++++++++++--- app/services/user_updater.rb | 3 +- config/locales/client.en.yml | 5 ++++ config/locales/server.en.yml | 2 ++ config/site_settings.yml | 3 ++ ..._notification_frequency_to_user_options.rb | 5 ++++ spec/services/post_alerter_spec.rb | 27 +++++++++++++++++- 13 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 app/models/like_notification_frequency_site_setting.rb create mode 100644 db/migrate/20160302104253_add_like_notification_frequency_to_user_options.rb diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index 5231e4fa43..64ea8b7945 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -73,6 +73,10 @@ export default Ember.Controller.extend(CanCheckEmails, { { name: I18n.t('user.email_digests.weekly'), value: 7 }, { name: I18n.t('user.email_digests.every_two_weeks'), value: 14 }], + likeNotificationFrequencies: [{ name: I18n.t('user.like_notification_frequency.always'), value: 0 }, + { name: I18n.t('user.like_notification_frequency.first_time_and_daily'), value: 1 }, + { name: I18n.t('user.like_notification_frequency.first_time'), value: 2 }], + autoTrackDurations: [{ name: I18n.t('user.auto_track_options.never'), value: -1 }, { name: I18n.t('user.auto_track_options.immediately'), value: 0 }, { name: I18n.t('user.auto_track_options.after_30_seconds'), value: 30000 }, diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index 57c4893fe2..7d20d12936 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -167,7 +167,8 @@ const User = RestModel.extend({ 'automatically_unpin_topics', 'digest_after_days', 'new_topic_duration_minutes', - 'auto_track_topics_after_msecs' + 'auto_track_topics_after_msecs', + 'like_notification_frequency' ].forEach(s => { data[s] = this.get(`user_option.${s}`); }); diff --git a/app/assets/javascripts/discourse/templates/user/preferences.hbs b/app/assets/javascripts/discourse/templates/user/preferences.hbs index c0aa984089..c48736827c 100644 --- a/app/assets/javascripts/discourse/templates/user/preferences.hbs +++ b/app/assets/javascripts/discourse/templates/user/preferences.hbs @@ -218,6 +218,11 @@ {{combo-box valueAttribute="value" content=autoTrackDurations value=model.user_option.auto_track_topics_after_msecs}} +

+ + {{combo-box valueAttribute="value" content=likeNotificationFrequencies value=model.user_option.like_notification_frequency}} +
+ {{preference-checkbox labelKey="user.external_links_in_new_tab" checked=model.user_option.external_links_in_new_tab}} {{preference-checkbox labelKey="user.enable_quoting" checked=model.user_option.enable_quoting}} {{preference-checkbox labelKey="user.dynamic_favicon" checked=model.user_option.dynamic_favicon}} diff --git a/app/models/like_notification_frequency_site_setting.rb b/app/models/like_notification_frequency_site_setting.rb new file mode 100644 index 0000000000..7ff681d674 --- /dev/null +++ b/app/models/like_notification_frequency_site_setting.rb @@ -0,0 +1,22 @@ +require_dependency 'enum_site_setting' + +class LikeNotificationFrequencySiteSetting < EnumSiteSetting + + def self.valid_value?(val) + val.to_i.to_s == val.to_s && + values.any? { |v| v[:value] == val.to_i } + end + + def self.values + @values ||= [ + { name: 'user.like_notification_frequency.always', value: 0 }, + { name: 'user.like_notification_frequency.first_time_and_daily', value: 1 }, + { name: 'user.like_notification_frequency.first_time', value: 2 }, + ] + end + + def self.translate_names? + true + end + +end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 0e40e9e81e..8aaca554d2 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -9,6 +9,10 @@ class UserOption < ActiveRecord::Base @previous_replies_type ||= Enum.new(always: 0, unless_emailed: 1, never: 2) end + def self.like_notification_frequency_type + @like_notification_frequency_type ||= Enum.new(always: 0, first_time_and_daily: 1, first_time: 2) + end + def set_defaults self.email_always = SiteSetting.default_email_always self.mailing_list_mode = SiteSetting.default_email_mailing_list_mode @@ -27,6 +31,8 @@ class UserOption < ActiveRecord::Base self.new_topic_duration_minutes = SiteSetting.default_other_new_topic_duration_minutes self.auto_track_topics_after_msecs = SiteSetting.default_other_auto_track_topics_after_msecs + self.like_notification_frequency = SiteSetting.default_other_like_notification_frequency + if SiteSetting.default_email_digest_frequency.to_i <= 0 self.email_digests = false diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb index 413ee9c2ed..11edfbf2bd 100644 --- a/app/serializers/user_option_serializer.rb +++ b/app/serializers/user_option_serializer.rb @@ -15,7 +15,8 @@ class UserOptionSerializer < ApplicationSerializer :auto_track_topics_after_msecs, :new_topic_duration_minutes, :email_previous_replies, - :email_in_reply_to + :email_in_reply_to, + :like_notification_frequency def include_edit_history_public? diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index ae507d4fe2..5f67f8f3c0 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -194,6 +194,29 @@ class PostAlerter # TODO decide if it makes sense to also publish a desktop notification end + def should_notify_edit?(notification, opts) + return existing_notification.data_hash["display_username"] != opts[:display_username] + end + + def should_notify_like?(user, notification) + + return true if user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:always] + + return true if user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:first_time_and_daily] && notification.created_at < 1.day.ago + + return false + end + + def should_notify_previous?(user, notification, opts) + type = notification.notification_type + if type == Notification.types[:edited] + return should_notify_edit?(notification, opts) + elsif type == Notification.types[:liked] + return should_notify_like?(user, notification) + end + return false + end + def create_notification(user, type, post, opts=nil) return if user.blank? return if user.id == Discourse::SYSTEM_USER_ID @@ -226,10 +249,7 @@ class PostAlerter post_number: post.post_number, notification_type: type) - if existing_notification - return unless existing_notification.notification_type == Notification.types[:edited] && - existing_notification.data_hash["display_username"] == opts[:display_username] - end + return if existing_notification && !should_notify_previous?(user, existing_notification, opts) collapsed = false diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb index 0fa1f0b6fe..d898640bb4 100644 --- a/app/services/user_updater.rb +++ b/app/services/user_updater.rb @@ -22,7 +22,8 @@ class UserUpdater :new_topic_duration_minutes, :auto_track_topics_after_msecs, :email_previous_replies, - :email_in_reply_to + :email_in_reply_to, + :like_notification_frequency ] def initialize(actor, user) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 1c33b99827..47536fdab0 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -627,6 +627,11 @@ en: website: "Web Site" email_settings: "Email" + like_notification_frequency: + title: "Notify when liked" + always: "Always" + first_time_and_daily: "First time a post is liked and daily" + first_time: "First time a post is liked" email_previous_replies: title: "Include previous replies at the bottom of emails" unless_emailed: "unless previously sent" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index e26431ed98..dd707fe8ba 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1258,6 +1258,8 @@ en: default_other_disable_jump_reply: "Don't jump to user's post after they reply by default." default_other_edit_history_public: "Make the post revisions public by default." + default_other_like_notification_frequency: "Notify users on likes by default" + default_topics_automatic_unpin: "Automatically unpin topics when the user reaches the bottom by default." default_categories_watching: "List of categories that are watched by default." diff --git a/config/site_settings.yml b/config/site_settings.yml index e868cb0921..14ecb6fce1 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1084,6 +1084,9 @@ user_preferences: default_other_dynamic_favicon: false default_other_disable_jump_reply: false default_other_edit_history_public: false + default_other_like_notification_frequency: + enum: 'LikeNotificationFrequencySiteSetting' + default: 1 default_topics_automatic_unpin: default: true diff --git a/db/migrate/20160302104253_add_like_notification_frequency_to_user_options.rb b/db/migrate/20160302104253_add_like_notification_frequency_to_user_options.rb new file mode 100644 index 0000000000..d5c00d7305 --- /dev/null +++ b/db/migrate/20160302104253_add_like_notification_frequency_to_user_options.rb @@ -0,0 +1,5 @@ +class AddLikeNotificationFrequencyToUserOptions < ActiveRecord::Migration + def change + add_column :user_options, :like_notification_frequency, :integer, null: false, default: 1 + end +end diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index f4cf7699c2..98d6e5f16e 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -25,7 +25,7 @@ describe PostAlerter do end context 'likes' do - it 'does not double notify users on likes' do + it 'notifies on likes correctly' do ActiveRecord::Base.observers.enable :all post = Fabricate(:post, raw: 'I love waffles') @@ -38,6 +38,31 @@ describe PostAlerter do # one like and one edit notification expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(2) + + + post.user.user_option.update_columns(like_notification_frequency: + UserOption.like_notification_frequency_type[:always]) + + admin2 = Fabricate(:admin) + PostAction.act(admin2, post, PostActionType.types[:like]) + # two likes one edit + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(3) + + post.user.user_option.update_columns(like_notification_frequency: + UserOption.like_notification_frequency_type[:first_time_and_daily]) + + # this gets skipped + admin3 = Fabricate(:admin) + PostAction.act(admin3, post, PostActionType.types[:like]) + + Timecop.freeze(2.days.from_now) do + admin4 = Fabricate(:admin) + PostAction.act(admin4, post, PostActionType.types[:like]) + end + + # first happend within the same day, no need to notify + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(4) + end end From b41aa27a84582d41be7c65b1a879683404a15fde Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 29 Feb 2016 18:58:42 +0800 Subject: [PATCH 200/245] FEATURE: Support multisite in PostgreSQL fallback adapter. --- .../postgresql_fallback_adapter.rb | 102 ++++++++++++------ lib/discourse.rb | 13 ++- .../postgresql_fallback_adapter_spec.rb | 63 ++++++++--- spec/components/discourse_spec.rb | 15 ++- 4 files changed, 143 insertions(+), 50 deletions(-) diff --git a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb index 8ade56f644..1f54e8a5c1 100644 --- a/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb +++ b/lib/active_record/connection_adapters/postgresql_fallback_adapter.rb @@ -5,65 +5,103 @@ require 'discourse' class PostgreSQLFallbackHandler include Singleton - attr_reader :running - attr_accessor :master - def initialize - @master = true - @running = false - @mutex = Mutex.new + @master = {} + @running = {} + @mutex = {} + @last_check = {} + + setup! end def verify_master - @mutex.synchronize do - return if @running || recently_checked? - @running = true + @mutex[namespace].synchronize do + return if running || recently_checked? + @running[namespace] = true end + current_namespace = namespace Thread.new do - begin - logger.warn "#{self.class}: Checking master server..." - connection = ActiveRecord::Base.postgresql_connection(config) + RailsMultisite::ConnectionManagement.with_connection(current_namespace) do + begin + logger.warn "#{log_prefix}: Checking master server..." + connection = ActiveRecord::Base.postgresql_connection(config) - if connection.active? - connection.disconnect! - logger.warn "#{self.class}: Master server is active. Reconnecting..." - ActiveRecord::Base.establish_connection(config) - Discourse.disable_readonly_mode - @master = true - end - rescue => e - if e.message.include?("could not connect to server") - logger.warn "#{self.class}: Connection to master PostgreSQL server failed with '#{e.message}'" - else - raise e - end - ensure - @mutex.synchronize do - @last_check = Time.zone.now - @running = false + if connection.active? + connection.disconnect! + ActiveRecord::Base.clear_all_connections! + logger.warn "#{log_prefix}: Master server is active. Reconnecting..." + + if namespace == RailsMultisite::ConnectionManagement::DEFAULT + ActiveRecord::Base.establish_connection(config) + else + RailsMultisite::ConnectionManagement.establish_connection(db: namespace) + end + + Discourse.disable_readonly_mode + master = true + end + rescue => e + if e.message.include?("could not connect to server") + logger.warn "#{log_prefix}: Connection to master PostgreSQL server failed with '#{e.message}'" + else + raise e + end + ensure + @mutex[namespace].synchronize do + @last_check[namespace] = Time.zone.now + @running[namespace] = false + end end end end end + def master + @master[namespace] + end + + def master=(args) + @master[namespace] = args + end + + def running + @running[namespace] + end + + def setup! + RailsMultisite::ConnectionManagement.all_dbs.each do |db| + @master[db] = true + @running[db] = false + @mutex[db] = Mutex.new + end + end + private def config - ActiveRecord::Base.configurations[Rails.env] + ActiveRecord::Base.connection_config end def logger Rails.logger end + def log_prefix + "#{self.class} [#{namespace}]" + end + def recently_checked? - if @last_check - Time.zone.now <= (@last_check + 5.seconds) + if @last_check[namespace] + Time.zone.now <= (@last_check[namespace] + 5.seconds) else false end end + + def namespace + RailsMultisite::ConnectionManagement.current_db + end end module ActiveRecord diff --git a/lib/discourse.rb b/lib/discourse.rb index 3e6f4a57a3..8252b5da76 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -112,17 +112,22 @@ module Discourse end end + def self.last_read_only + @last_read_only ||= {} + end + def self.recently_readonly? - return false unless @last_read_only - @last_read_only > 15.seconds.ago + read_only = last_read_only[$redis.namespace] + return false unless read_only + read_only > 15.seconds.ago end def self.received_readonly! - @last_read_only = Time.now + last_read_only[$redis.namespace] = Time.zone.now end def self.clear_readonly! - @last_read_only = nil + last_read_only[$redis.namespace] = nil end def self.disabled_plugin_names diff --git a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb index 35a3487d26..0456f616d4 100644 --- a/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb +++ b/spec/components/active_record/connection_adapters/postgresql_fallback_adapter_spec.rb @@ -3,10 +3,10 @@ require_dependency 'active_record/connection_adapters/postgresql_fallback_adapte describe ActiveRecord::ConnectionHandling do let(:replica_host) { "1.1.1.1" } - let(:replica_port) { "6432" } + let(:replica_port) { 6432 } let(:config) do - ActiveRecord::Base.configurations["test"].merge({ + ActiveRecord::Base.configurations[Rails.env].merge({ "adapter" => "postgresql_fallback", "replica_host" => replica_host, "replica_port" => replica_port @@ -14,8 +14,7 @@ describe ActiveRecord::ConnectionHandling do end after do - Discourse.disable_readonly_mode - ::PostgreSQLFallbackHandler.instance.master = true + ::PostgreSQLFallbackHandler.instance.setup! end describe "#postgresql_fallback_connection" do @@ -25,17 +24,39 @@ describe ActiveRecord::ConnectionHandling do end context 'when master server is down' do + let(:multisite_db) { "database_2" } + + let(:multisite_config) do + { + host: 'localhost1', + port: 5432, + replica_host: replica_host, + replica_port: replica_port + } + end + before do @replica_connection = mock('replica_connection') end - it 'should failover to a replica server' do - ActiveRecord::Base.expects(:postgresql_connection).with(config).raises(PG::ConnectionBad) - ActiveRecord::Base.expects(:verify_replica).with(@replica_connection) + after do + with_multisite_db(multisite_db) { Discourse.disable_readonly_mode } + Discourse.disable_readonly_mode + ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[Rails.env]) + end - ActiveRecord::Base.expects(:postgresql_connection).with(config.merge({ - host: replica_host, port: replica_port - })).returns(@replica_connection) + it 'should failover to a replica server' do + RailsMultisite::ConnectionManagement.stubs(:all_dbs).returns(['default', multisite_db]) + ::PostgreSQLFallbackHandler.instance.setup! + + [config, multisite_config].each do |configuration| + ActiveRecord::Base.expects(:postgresql_connection).with(configuration).raises(PG::ConnectionBad) + ActiveRecord::Base.expects(:verify_replica).with(@replica_connection) + + ActiveRecord::Base.expects(:postgresql_connection).with(configuration.merge({ + host: replica_host, port: replica_port + })).returns(@replica_connection) + end expect { ActiveRecord::Base.postgresql_fallback_connection(config) } .to raise_error(PG::ConnectionBad) @@ -43,6 +64,14 @@ describe ActiveRecord::ConnectionHandling do expect{ ActiveRecord::Base.postgresql_fallback_connection(config) } .to change{ Discourse.readonly_mode? }.from(false).to(true) + with_multisite_db(multisite_db) do + expect { ActiveRecord::Base.postgresql_fallback_connection(multisite_config) } + .to raise_error(PG::ConnectionBad) + + expect{ ActiveRecord::Base.postgresql_fallback_connection(multisite_config) } + .to change{ Discourse.readonly_mode? }.from(false).to(true) + end + ActiveRecord::Base.unstub(:postgresql_connection) current_threads = Thread.list @@ -59,7 +88,7 @@ describe ActiveRecord::ConnectionHandling do end # Wait for the thread to finish execution - threads = (Thread.list - current_threads).each(&:join) + (Thread.list - current_threads).each(&:join) expect(Discourse.readonly_mode?).to eq(false) @@ -72,7 +101,11 @@ describe ActiveRecord::ConnectionHandling do context 'when both master and replica server is down' do it 'should raise the right error' do - ActiveRecord::Base.expects(:postgresql_connection).raises(PG::ConnectionBad).twice + ActiveRecord::Base.expects(:postgresql_connection).with(config).raises(PG::ConnectionBad).once + + ActiveRecord::Base.expects(:postgresql_connection).with(config.dup.merge({ + host: replica_host, port: replica_port + })).raises(PG::ConnectionBad).once 2.times do expect { ActiveRecord::Base.postgresql_fallback_connection(config) } @@ -81,4 +114,10 @@ describe ActiveRecord::ConnectionHandling do end end end + + def with_multisite_db(dbname) + RailsMultisite::ConnectionManagement.expects(:current_db).returns(dbname).at_least_once + yield + RailsMultisite::ConnectionManagement.unstub(:current_db) + end end diff --git a/spec/components/discourse_spec.rb b/spec/components/discourse_spec.rb index a66cecda46..b8b108519e 100644 --- a/spec/components/discourse_spec.rb +++ b/spec/components/discourse_spec.rb @@ -111,8 +111,12 @@ describe Discourse do end it "returns true when the key is present in redis" do - $redis.expects(:get).with(Discourse.readonly_mode_key).returns("1") - expect(Discourse.readonly_mode?).to eq(true) + begin + $redis.set(Discourse.readonly_mode_key, 1) + expect(Discourse.readonly_mode?).to eq(true) + ensure + $redis.del(Discourse.readonly_mode_key) + end end it "returns true when Discourse is recently read only" do @@ -121,6 +125,13 @@ describe Discourse do end end + context ".received_readonly!" do + it "sets the right time" do + time = Discourse.received_readonly! + expect(Discourse.last_read_only['default']).to eq(time) + end + end + context "#handle_exception" do class TempSidekiqLogger < Sidekiq::ExceptionHandler::Logger From fdd6920ae7173a355f4fb533c9888657022d9ad4 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 17 Feb 2016 16:44:53 +0800 Subject: [PATCH 201/245] FEATURE: Admin Banner when Logster logs is getting flooded. --- .../discourse/components/global-notice.js.es6 | 32 ++++++++- .../discourse/initializers/logs-notice.js.es6 | 18 +++++ .../discourse/services/logs-notice.js.es6 | 69 +++++++++++++++++++ config/initializers/100-logster.rb | 19 +++++ config/locales/client.en.yml | 1 + config/locales/server.en.yml | 3 + config/site_settings.yml | 8 +++ 7 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 app/assets/javascripts/discourse/initializers/logs-notice.js.es6 create mode 100644 app/assets/javascripts/discourse/services/logs-notice.js.es6 diff --git a/app/assets/javascripts/discourse/components/global-notice.js.es6 b/app/assets/javascripts/discourse/components/global-notice.js.es6 index 080427d80f..852f19ecd8 100644 --- a/app/assets/javascripts/discourse/components/global-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/global-notice.js.es6 @@ -1,4 +1,7 @@ +import { on } from 'ember-addons/ember-computed-decorators'; import StringBuffer from 'discourse/mixins/string-buffer'; +import { iconHTML } from 'discourse/helpers/fa-icon'; +import LogsNotice from 'discourse/services/logs-notice'; export default Ember.Component.extend(StringBuffer, { rerenderTriggers: ['site.isReadOnly'], @@ -18,8 +21,33 @@ export default Ember.Component.extend(StringBuffer, { notices.push([this.siteSettings.global_notice, 'alert-global-notice']); } - if (notices.length > 0) { - buffer.push(_.map(notices, n => "
" + n[0] + "
").join("")); + if (!LogsNotice.currentProp('hidden')) { + notices.push([LogsNotice.currentProp('message'), 'alert-logs-notice', `
${iconHTML('times')}
`]); } + + if (notices.length > 0) { + buffer.push(_.map(notices, n => { + var html = `
${n[0]}`; + if (n[2]) html += n[2]; + html += '
'; + return html; + }).join("")); + } + }, + + @on('didInsertElement') + _setupLogsNotice() { + LogsNotice.current().addObserver('hidden', () => { + this.rerenderString(); + }); + + this.$().on('click.global-notice', '.alert-logs-notice .close', () => { + LogsNotice.currentProp('text', ''); + }); + }, + + @on('willDestroyElement') + _teardownLogsNotice() { + this.$().off('click.global-notice'); } }); diff --git a/app/assets/javascripts/discourse/initializers/logs-notice.js.es6 b/app/assets/javascripts/discourse/initializers/logs-notice.js.es6 new file mode 100644 index 0000000000..424d84298d --- /dev/null +++ b/app/assets/javascripts/discourse/initializers/logs-notice.js.es6 @@ -0,0 +1,18 @@ +import LogsNotice from 'discourse/services/logs-notice'; +import Singleton from 'discourse/mixins/singleton'; + +export default { + name: "logs-notice", + after: "message-bus", + + initialize: function (container) { + const siteSettings = container.lookup('site-settings:main'); + const messageBus = container.lookup('message-bus:main'); + const keyValueStore = container.lookup('key-value-store:main'); + LogsNotice.reopenClass(Singleton, { + createCurrent() { + return this.create({ messageBus, keyValueStore, siteSettings}); + } + }); + } +}; diff --git a/app/assets/javascripts/discourse/services/logs-notice.js.es6 b/app/assets/javascripts/discourse/services/logs-notice.js.es6 new file mode 100644 index 0000000000..8948de3a16 --- /dev/null +++ b/app/assets/javascripts/discourse/services/logs-notice.js.es6 @@ -0,0 +1,69 @@ +import { on, observes } from 'ember-addons/ember-computed-decorators'; +import computed from 'ember-addons/ember-computed-decorators'; + +const LOGS_NOTICE_KEY = "logs-notice-text"; + +const LogsNotice = Ember.Object.extend({ + text: "", + + @on('init') + _setup() { + if (!this.get('isActivated')) return; + + const text = this.keyValueStore.getItem(LOGS_NOTICE_KEY); + if (text) this.set('text', text); + + this.messageBus.subscribe("/logs_error_rate_exceeded", data => { + const duration = data.duration; + var siteSettingLimit = 0; + + if (duration === 'minute') { + siteSettingLimit = this.siteSettings.alert_admins_if_errors_per_minute; + } else if (duration === 'hour') { + siteSettingLimit = this.siteSettings.alert_admins_if_errors_per_hour; + } + + this.set('text', + I18n.t('logs_error_rate_exceeded_notice', { + timestamp: moment().format("YYYY-MM-DD H:mm:ss"), + siteSettingLimit: siteSettingLimit, + rate: data.rate, + duration: duration, + url: Discourse.getURL('/logs') + }) + ); + }); + }, + + @computed('text') + isEmpty(text) { + return Ember.isEmpty(text); + }, + + @computed('text') + message(text) { + return new Handlebars.SafeString(text); + }, + + @computed('currentUser') + isAdmin(currentUser) { + return currentUser && currentUser.admin; + }, + + @computed('isEmpty', 'isAdmin') + hidden(isEmpty, isAdmin) { + return !isAdmin || isEmpty; + }, + + @observes('text') + _updateKeyValueStore() { + this.keyValueStore.setItem(LOGS_NOTICE_KEY, this.get('text')); + }, + + @computed('siteSettings.alert_admins_if_errors_per_hour', 'siteSettings.alert_admins_if_errors_per_minute') + isActivated(errorsPerHour, errorsPerMinute) { + return errorsPerHour > 0 || errorsPerMinute > 0; + } +}); + +export default LogsNotice; diff --git a/config/initializers/100-logster.rb b/config/initializers/100-logster.rb index 2daf7200fe..80bbead412 100644 --- a/config/initializers/100-logster.rb +++ b/config/initializers/100-logster.rb @@ -55,3 +55,22 @@ Logster.config.current_context = lambda{|env,&blk| Logster.config.subdirectory = "#{GlobalSetting.relative_url_root}/logs" Logster.config.application_version = Discourse.git_version + +redis = Logster.store.redis +Logster.config.redis_prefix = "#{redis.namespace}" +Logster.config.redis_raw_connection = redis.without_namespace + +%w{minute hour}.each do |duration| + site_setting_error_rate = SiteSetting.public_send("alert_admins_if_errors_per_#{duration}") + + if site_setting_error_rate > 0 + Logster.store.public_send( + "register_rate_limit_per_#{duration}", + [Logger::WARN, Logger::ERROR, Logger::FATAL, Logger::UNKNOWN], + site_setting_error_rate + ) do |rate| + + MessageBus.publish("/logs_error_rate_exceeded", { rate: rate, duration: duration }) + end + end +end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 8e434f3bd3..0eea80d835 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -779,6 +779,7 @@ en: too_few_topics_and_posts_notice: "Let's get this discussion started! There are currently %{currentTopics} / %{requiredTopics} topics and %{currentPosts} / %{requiredPosts} posts. New visitors need some conversations to read and respond to." too_few_topics_notice: "Let's get this discussion started! There are currently %{currentTopics} / %{requiredTopics} topics. New visitors need some conversations to read and respond to." too_few_posts_notice: "Let's get this discussion started! There are currently %{currentPosts} / %{requiredPosts} posts. New visitors need some conversations to read and respond to." + logs_error_rate_exceeded_notice: "%{timestamp}: Current rate of %{rate} errors/%{duration} has exceeded site settings's limit of %{siteSettingLimit} errors/%{duration}." learn_more: "learn more..." diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 85ac95eb2a..5c5d98e355 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -977,6 +977,9 @@ en: max_invites_per_day: "Maximum number of invites a user can send per day." max_topic_invitations_per_day: "Maximum number of topic invitations a user can send per day." + alert_admins_if_errors_per_minute: "Number of errors per minute in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart." + alert_admins_if_errors_per_hour: "Number of errors per hour in order to trigger an admin alert. A value of 0 disables this feature. NOTE: requires restart." + suggested_topics: "Number of suggested topics shown at the bottom of a topic." limit_suggested_to_category: "Only show topics from the current category in suggested topics." diff --git a/config/site_settings.yml b/config/site_settings.yml index 64990a3e2e..069ffe4050 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -761,6 +761,14 @@ rate_limits: tl2_additional_likes_per_day_multiplier: 1.5 tl3_additional_likes_per_day_multiplier: 2 tl4_additional_likes_per_day_multiplier: 3 + alert_admins_if_errors_per_minute: + client: true + shadowed_by_global: true + default: 0 + alert_admins_if_errors_per_hour: + client: true + shadowed_by_global: true + default: 0 developer: force_hostname: From 94f5aa6015221baabd0f0461053d6de000bf4c1b Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Mar 2016 13:20:13 -0500 Subject: [PATCH 202/245] FIX: Have the `approve post count` setting work as advertised --- lib/new_post_manager.rb | 2 +- spec/components/new_post_manager_spec.rb | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb index f66421d667..2054374af2 100644 --- a/lib/new_post_manager.rb +++ b/lib/new_post_manager.rb @@ -71,7 +71,7 @@ class NewPostManager return false if user.staff? || user.staged - (user.post_count < SiteSetting.approve_post_count) || + (user.trust_level == TrustLevel.levels[:newuser] && user.post_count < SiteSetting.approve_post_count) || (user.trust_level < SiteSetting.approve_unless_trust_level.to_i) || is_fast_typer?(manager) || matches_auto_block_regex?(manager) diff --git a/spec/components/new_post_manager_spec.rb b/spec/components/new_post_manager_spec.rb index 57be6bfe3b..689ad16054 100644 --- a/spec/components/new_post_manager_spec.rb +++ b/spec/components/new_post_manager_spec.rb @@ -72,6 +72,7 @@ describe NewPostManager do context 'with a high approval post count' do before do SiteSetting.approve_post_count = 100 + topic.user.trust_level = 0 end it "will return an enqueue result" do result = NewPostManager.default_handler(manager) @@ -80,6 +81,17 @@ describe NewPostManager do end end + context 'with a high approval post count, but TL1' do + before do + SiteSetting.approve_post_count = 100 + topic.user.trust_level = 1 + end + it "will return an enqueue result" do + result = NewPostManager.default_handler(manager) + expect(result).to be_nil + end + end + context 'with a high trust level setting' do before do SiteSetting.approve_unless_trust_level = 4 From bfaa4cdb379ade4bb39625768435abdaae45ec78 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Wed, 2 Mar 2016 23:48:17 +0530 Subject: [PATCH 203/245] FEATURE: compose a new pre-filled private message to a group via URL --- .../discourse/routes/new-message.js.es6 | 40 ++++++++++++++----- app/models/group.rb | 4 ++ app/serializers/basic_group_serializer.rb | 7 +++- .../admin/groups_controller_spec.rb | 3 +- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/routes/new-message.js.es6 b/app/assets/javascripts/discourse/routes/new-message.js.es6 index c5d3ab849b..05767d3422 100644 --- a/app/assets/javascripts/discourse/routes/new-message.js.es6 +++ b/app/assets/javascripts/discourse/routes/new-message.js.es6 @@ -1,20 +1,38 @@ +import Group from 'discourse/models/group'; + export default Discourse.Route.extend({ beforeModel: function(transition) { const self = this; if (Discourse.User.current()) { // User is logged in self.replaceWith('discovery.latest').then(function(e) { - Discourse.User.findByUsername(transition.queryParams.username).then((user) => { - if (user.can_send_private_message_to_user) { - Ember.run.next(function() { - e.send('createNewMessageViaParams', user.username, transition.queryParams.title, transition.queryParams.body); - }); - } else { - bootbox.alert(I18n.t("composer.cant_send_pm", {username: user.username})); - } - }).catch(() => { - bootbox.alert(I18n.t("generic_error")); - }); + if (transition.queryParams.username) { + // send a message to user + Discourse.User.findByUsername(transition.queryParams.username).then((user) => { + if (user.can_send_private_message_to_user) { + Ember.run.next(function() { + e.send('createNewMessageViaParams', user.username, transition.queryParams.title, transition.queryParams.body); + }); + } else { + bootbox.alert(I18n.t("composer.cant_send_pm", {username: user.username})); + } + }).catch(() => { + bootbox.alert(I18n.t("generic_error")); + }); + } else { + // send a message to group + Group.find(transition.queryParams.groupname).then((group) => { + if (!group.automatic && group.mentionable) { + Ember.run.next(function() { + e.send('createNewMessageViaParams', group.name, transition.queryParams.title, transition.queryParams.body); + }); + } else { + bootbox.alert(I18n.t("composer.cant_send_pm", {username: group.name})); + } + }).catch(() => { + bootbox.alert(I18n.t("generic_error")); + }); + } }); } else { // User is not logged in diff --git a/app/models/group.rb b/app/models/group.rb index dfb21f2f04..527955fbd6 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -362,6 +362,10 @@ class Group < ActiveRecord::Base true end + def mentionable?(user, group_id) + Group.mentionable(user).where(id: group_id).exists? + end + protected def name_format_validator diff --git a/app/serializers/basic_group_serializer.rb b/app/serializers/basic_group_serializer.rb index d9a50ef124..725de396e5 100644 --- a/app/serializers/basic_group_serializer.rb +++ b/app/serializers/basic_group_serializer.rb @@ -12,7 +12,8 @@ class BasicGroupSerializer < ApplicationSerializer :grant_trust_level, :incoming_email, :notification_level, - :has_messages + :has_messages, + :mentionable def include_incoming_email? scope.is_staff? @@ -27,4 +28,8 @@ class BasicGroupSerializer < ApplicationSerializer scope.authenticated? end + def mentionable + object.mentionable?(scope.user, object.id) + end + end diff --git a/spec/controllers/admin/groups_controller_spec.rb b/spec/controllers/admin/groups_controller_spec.rb index 028945d226..96fb3d229a 100644 --- a/spec/controllers/admin/groups_controller_spec.rb +++ b/spec/controllers/admin/groups_controller_spec.rb @@ -33,7 +33,8 @@ describe Admin::GroupsController do "grant_trust_level"=>nil, "incoming_email"=>nil, "notification_level"=>2, - "has_messages"=>false + "has_messages"=>false, + "mentionable"=>false }]) end From 0167f6bb57e4c7eb68e734a4cb2ac4ff0e53813e Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Mar 2016 14:31:32 -0500 Subject: [PATCH 204/245] FIX: Don't substitute emojis within code blocks --- .../discourse/lib/emoji/emoji.js.erb | 22 +++++++++++++++++++ app/models/emoji.rb | 8 ++----- lib/pretty_text.rb | 7 +++++- spec/components/pretty_text_spec.rb | 8 +++++++ 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb index 67313d67fb..057404585e 100644 --- a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb +++ b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb @@ -12,6 +12,15 @@ Discourse.Dialect.registerEmoji = function(code, url) { extendedEmoji[code] = url; }; +var _unicodeReplacements; +var _unicodeRegexp; +Discourse.Dialect.setUnicodeReplacements = function(replacements) { + _unicodeReplacements = replacements; + if (replacements) { + _unicodeRegexp = new RegExp(Object.keys(replacements).join("|"), "g"); + } +} + // This method is used by PrettyText to reset custom emojis in multisites Discourse.Dialect.resetEmojis = function() { extendedEmoji = {}; @@ -151,6 +160,19 @@ Object.keys(translations).forEach(function (t) { } }); +Discourse.Dialect.addPreProcessor(function(text) { + if (_unicodeReplacements) { + _unicodeRegexp.lastIndex = 0; + + var m; + while ((m = _unicodeRegexp.exec(text)) !== null) { + text = text.replace(m[0], ":" + _unicodeReplacements[m[0]] + ":"); + } + } + + return text; +}); + function escapeRegExp(s) { return s.replace(/[-/\\^$*+?.()|[\]{}]/gi, '\\$&'); } diff --git a/app/models/emoji.rb b/app/models/emoji.rb index e65b91e0d7..986a7288a5 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -131,12 +131,8 @@ class Emoji @unicode_replacements end - def self.unicode_regexp - @unicode_regexp ||= Regexp.union(unicode_replacements.keys) - end - - def self.sub_unicode!(text) - text.gsub!(unicode_regexp) {|m| ":#{unicode_replacements[m]}:"} + def self.unicode_replacements_json + @unicode_replacements_json ||= unicode_replacements.to_json end end diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index e41a8ad413..6dacab922d 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -201,6 +201,12 @@ module PrettyText end end + if SiteSetting.enable_emoji? + context.eval("Discourse.Dialect.setUnicodeReplacements(#{Emoji.unicode_replacements_json})"); + else + context.eval("Discourse.Dialect.setUnicodeReplacements(null)"); + end + # reset emojis (v8 context is shared amongst multisites) context.eval("Discourse.Dialect.resetEmojis();") # custom emojis @@ -259,7 +265,6 @@ module PrettyText options[:topicId] = opts[:topic_id] working_text = text.dup - Emoji.sub_unicode!(working_text) if SiteSetting.enable_emoji? sanitized = markdown(working_text, options) doc = Nokogiri::HTML.fragment(sanitized) diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index a098509f65..44a7c5dde1 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -395,6 +395,14 @@ HTML expect(PrettyText.cook("💣")).to match(/\:bomb\:/) end + it "doesn't replace emoji in inline code blocks with our emoji sets if emoji is enabled" do + expect(PrettyText.cook("`💣`")).not_to match(/\:bomb\:/) + end + + it "doesn't replace emoji in code blocks with our emoji sets if emoji is enabled" do + expect(PrettyText.cook("```\n💣`\n```\n")).not_to match(/\:bomb\:/) + end + it "replaces some glyphs that are not in the emoji range" do expect(PrettyText.cook("☺")).to match(/\:slightly_smiling\:/) end From be257225b649010e1ecf93168ef92e510251b419 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Mar 2016 14:54:03 -0500 Subject: [PATCH 205/245] Adjustment: New User Posts must be reviewed at TL0 + TL1 --- config/locales/server.en.yml | 2 +- lib/new_post_manager.rb | 2 +- spec/components/new_post_manager_spec.rb | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index eb4d3f2e96..490a94ff9b 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1240,7 +1240,7 @@ en: emoji_set: "How would you like your emoji?" enforce_square_emoji: "Force a square aspect ratio to all emojis." - approve_post_count: "The amount of posts from a new user that must be approved" + approve_post_count: "The amount of posts from a new or basic user that must be approved" approve_unless_trust_level: "Posts for users below this trust level must be approved" notify_about_queued_posts_after: "If there are posts that have been waiting to be reviewed for more than this many hours, an email will be sent to the contact email. Set to 0 to disable these emails." diff --git a/lib/new_post_manager.rb b/lib/new_post_manager.rb index 2054374af2..923315d915 100644 --- a/lib/new_post_manager.rb +++ b/lib/new_post_manager.rb @@ -71,7 +71,7 @@ class NewPostManager return false if user.staff? || user.staged - (user.trust_level == TrustLevel.levels[:newuser] && user.post_count < SiteSetting.approve_post_count) || + (user.trust_level <= TrustLevel.levels[:basic] && user.post_count < SiteSetting.approve_post_count) || (user.trust_level < SiteSetting.approve_unless_trust_level.to_i) || is_fast_typer?(manager) || matches_auto_block_regex?(manager) diff --git a/spec/components/new_post_manager_spec.rb b/spec/components/new_post_manager_spec.rb index 689ad16054..955292e7b3 100644 --- a/spec/components/new_post_manager_spec.rb +++ b/spec/components/new_post_manager_spec.rb @@ -69,7 +69,7 @@ describe NewPostManager do end end - context 'with a high approval post count' do + context 'with a high approval post count and TL0' do before do SiteSetting.approve_post_count = 100 topic.user.trust_level = 0 @@ -81,11 +81,23 @@ describe NewPostManager do end end - context 'with a high approval post count, but TL1' do + context 'with a high approval post count and TL1' do before do SiteSetting.approve_post_count = 100 topic.user.trust_level = 1 end + it "will return an enqueue result" do + result = NewPostManager.default_handler(manager) + expect(NewPostManager.queue_enabled?).to eq(true) + expect(result.action).to eq(:enqueued) + end + end + + context 'with a high approval post count, but TL2' do + before do + SiteSetting.approve_post_count = 100 + topic.user.trust_level = 2 + end it "will return an enqueue result" do result = NewPostManager.default_handler(manager) expect(result).to be_nil From c1aea91d63cbfd3aafdb5a56061d2ec04776de40 Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 2 Mar 2016 15:26:27 -0500 Subject: [PATCH 206/245] FEATURE: More digest email frequency options. Digests can be sent as often as every 30 minutes. --- .../discourse/controllers/preferences.js.es6 | 10 ++++++---- app/assets/javascripts/discourse/models/user.js.es6 | 2 +- .../discourse/templates/user/preferences.hbs | 2 +- app/jobs/scheduled/enqueue_digest_emails.rb | 8 ++++---- app/models/digest_email_site_setting.rb | 10 ++++++---- app/models/user_option.rb | 4 ++-- app/serializers/user_option_serializer.rb | 2 +- app/services/user_updater.rb | 2 +- config/locales/client.en.yml | 4 ++++ config/site_settings.yml | 2 +- ...ame_digest_after_days_to_digest_after_minutes.rb | 13 +++++++++++++ spec/models/digest_email_site_setting_spec.rb | 4 ++-- spec/models/user_spec.rb | 4 ++-- spec/services/user_updater_spec.rb | 4 ++-- test/javascripts/fixtures/user_fixtures.js.es6 | 2 +- 15 files changed, 47 insertions(+), 26 deletions(-) create mode 100644 db/migrate/20160302170230_rename_digest_after_days_to_digest_after_minutes.rb diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index 64ea8b7945..4ca145f2d9 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -68,10 +68,12 @@ export default Ember.Controller.extend(CanCheckEmails, { {name: I18n.t('user.email_previous_replies.never'), value: 2} ], - digestFrequencies: [{ name: I18n.t('user.email_digests.daily'), value: 1 }, - { name: I18n.t('user.email_digests.every_three_days'), value: 3 }, - { name: I18n.t('user.email_digests.weekly'), value: 7 }, - { name: I18n.t('user.email_digests.every_two_weeks'), value: 14 }], + digestFrequencies: [{ name: I18n.t('user.email_digests.every_30_minutes'), value: 30 }, + { name: I18n.t('user.email_digests.every_hour'), value: 60 }, + { name: I18n.t('user.email_digests.daily'), value: 1440 }, + { name: I18n.t('user.email_digests.every_three_days'), value: 4320 }, + { name: I18n.t('user.email_digests.weekly'), value: 10080 }, + { name: I18n.t('user.email_digests.every_two_weeks'), value: 20160 }], likeNotificationFrequencies: [{ name: I18n.t('user.like_notification_frequency.always'), value: 0 }, { name: I18n.t('user.like_notification_frequency.first_time_and_daily'), value: 1 }, diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index 7d20d12936..5ae7433316 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -165,7 +165,7 @@ const User = RestModel.extend({ 'enable_quoting', 'disable_jump_reply', 'automatically_unpin_topics', - 'digest_after_days', + 'digest_after_minutes', 'new_topic_duration_minutes', 'auto_track_topics_after_msecs', 'like_notification_frequency' diff --git a/app/assets/javascripts/discourse/templates/user/preferences.hbs b/app/assets/javascripts/discourse/templates/user/preferences.hbs index c48736827c..b2fd4443d7 100644 --- a/app/assets/javascripts/discourse/templates/user/preferences.hbs +++ b/app/assets/javascripts/discourse/templates/user/preferences.hbs @@ -172,7 +172,7 @@ {{preference-checkbox labelKey="user.email_digests.title" checked=model.user_option.email_digests}} {{#if model.user_option.email_digests}}
- {{combo-box valueAttribute="value" content=digestFrequencies value=model.user_option.digest_after_days}} + {{combo-box valueAttribute="value" content=digestFrequencies value=model.user_option.digest_after_minutes}}
{{/if}} {{/if}} diff --git a/app/jobs/scheduled/enqueue_digest_emails.rb b/app/jobs/scheduled/enqueue_digest_emails.rb index 9c10f69573..2ee87d6799 100644 --- a/app/jobs/scheduled/enqueue_digest_emails.rb +++ b/app/jobs/scheduled/enqueue_digest_emails.rb @@ -2,7 +2,7 @@ module Jobs # A daily job that will enqueue digest emails to be sent to users class EnqueueDigestEmails < Jobs::Scheduled - every 6.hours + every 30.minutes def execute(args) unless SiteSetting.disable_digest_emails? @@ -13,14 +13,14 @@ module Jobs end def target_user_ids - # Users who want to receive emails and haven't been emailed in the last day + # Users who want to receive digest email within their chosen digest email frequency query = User.real .where(active: true, staged: false) .joins(:user_option) .not_suspended .where(user_options: {email_digests: true}) - .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * user_options.digest_after_days)") - .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * user_options.digest_after_days)") + .where("COALESCE(last_emailed_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)") + .where("COALESCE(last_seen_at, '2010-01-01') <= CURRENT_TIMESTAMP - ('1 MINUTE'::INTERVAL * user_options.digest_after_minutes)") .where("COALESCE(last_seen_at, '2010-01-01') >= CURRENT_TIMESTAMP - ('1 DAY'::INTERVAL * #{SiteSetting.delete_digest_email_after_days})") # If the site requires approval, make sure the user is approved diff --git a/app/models/digest_email_site_setting.rb b/app/models/digest_email_site_setting.rb index 5276fe3b3e..e9a817ad4c 100644 --- a/app/models/digest_email_site_setting.rb +++ b/app/models/digest_email_site_setting.rb @@ -10,10 +10,12 @@ class DigestEmailSiteSetting < EnumSiteSetting def self.values @values ||= [ { name: 'never', value: 0 }, - { name: 'daily', value: 1 }, - { name: 'every_three_days', value: 3 }, - { name: 'weekly', value: 7 }, - { name: 'every_two_weeks', value: 14 } + { name: 'every_30_minutes', value: 30 }, + { name: 'every_hour', value: 60 }, + { name: 'daily', value: 1440 }, + { name: 'every_three_days', value: 4320 }, + { name: 'weekly', value: 10080 }, + { name: 'every_two_weeks', value: 20160 } ] end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 8aaca554d2..25ecee9aa6 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -38,7 +38,7 @@ class UserOption < ActiveRecord::Base self.email_digests = false else self.email_digests = true - self.digest_after_days ||= SiteSetting.default_email_digest_frequency.to_i + self.digest_after_minutes ||= SiteSetting.default_email_digest_frequency.to_i end true @@ -127,7 +127,7 @@ end # disable_jump_reply :boolean default(FALSE), not null # edit_history_public :boolean default(FALSE), not null # automatically_unpin_topics :boolean default(TRUE), not null -# digest_after_days :integer +# digest_after_minutes :integer # auto_track_topics_after_msecs :integer # new_topic_duration_minutes :integer # last_redirected_to_top_at :datetime diff --git a/app/serializers/user_option_serializer.rb b/app/serializers/user_option_serializer.rb index 11edfbf2bd..6a40c7a260 100644 --- a/app/serializers/user_option_serializer.rb +++ b/app/serializers/user_option_serializer.rb @@ -9,7 +9,7 @@ class UserOptionSerializer < ApplicationSerializer :dynamic_favicon, :enable_quoting, :disable_jump_reply, - :digest_after_days, + :digest_after_minutes, :automatically_unpin_topics, :edit_history_public, :auto_track_topics_after_msecs, diff --git a/app/services/user_updater.rb b/app/services/user_updater.rb index d898640bb4..25510fd250 100644 --- a/app/services/user_updater.rb +++ b/app/services/user_updater.rb @@ -18,7 +18,7 @@ class UserUpdater :disable_jump_reply, :edit_history_public, :automatically_unpin_topics, - :digest_after_days, + :digest_after_minutes, :new_topic_duration_minutes, :auto_track_topics_after_msecs, :email_previous_replies, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index fdb8467e11..9ecbee2a7c 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -193,6 +193,8 @@ en: more: "More" less: "Less" never: "never" + every_30_minutes: "every 30 minutes" + every_hour: "every hour" daily: "daily" weekly: "weekly" every_two_weeks: "every two weeks" @@ -639,6 +641,8 @@ en: never: "never" email_digests: title: "When I don't visit here, send an email digest of what's new:" + every_30_minutes: "every 30 minutes" + every_hour: "hourly" daily: "daily" every_three_days: "every three days" weekly: "weekly" diff --git a/config/site_settings.yml b/config/site_settings.yml index 7400a72ee6..765e6e7484 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1070,7 +1070,7 @@ uncategorized: user_preferences: default_email_digest_frequency: enum: 'DigestEmailSiteSetting' - default: 7 + default: 10080 default_email_private_messages: true default_email_direct: true default_email_mailing_list_mode: false diff --git a/db/migrate/20160302170230_rename_digest_after_days_to_digest_after_minutes.rb b/db/migrate/20160302170230_rename_digest_after_days_to_digest_after_minutes.rb new file mode 100644 index 0000000000..9c9cfdd0cc --- /dev/null +++ b/db/migrate/20160302170230_rename_digest_after_days_to_digest_after_minutes.rb @@ -0,0 +1,13 @@ +class RenameDigestAfterDaysToDigestAfterMinutes < ActiveRecord::Migration + def up + rename_column :user_options, :digest_after_days, :digest_after_minutes + execute "UPDATE user_options SET digest_after_minutes = digest_after_minutes * 1440 WHERE digest_after_minutes IS NOT NULL" + execute "UPDATE site_settings SET value = value::integer * 1440 WHERE name = 'default_email_digest_frequency' AND value IS NOT NULL" + end + + def down + rename_column :user_options, :digest_after_minutes, :digest_after_days + execute "UPDATE user_options SET digest_after_days = digest_after_days / 1440 WHERE digest_after_days IS NOT NULL" + execute "UPDATE site_settings SET value = value::integer / 1440 WHERE name = 'default_email_digest_frequency' AND value IS NOT NULL" + end +end diff --git a/spec/models/digest_email_site_setting_spec.rb b/spec/models/digest_email_site_setting_spec.rb index 5eb899928a..cebcfb2342 100644 --- a/spec/models/digest_email_site_setting_spec.rb +++ b/spec/models/digest_email_site_setting_spec.rb @@ -3,11 +3,11 @@ require 'rails_helper' describe DigestEmailSiteSetting do describe 'valid_value?' do it 'returns true for a valid value as an int' do - expect(DigestEmailSiteSetting.valid_value?(1)).to eq true + expect(DigestEmailSiteSetting.valid_value?(1440)).to eq true end it 'returns true for a valid value as a string' do - expect(DigestEmailSiteSetting.valid_value?('1')).to eq true + expect(DigestEmailSiteSetting.valid_value?('1440')).to eq true end it 'returns false for an invalid value' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index dfbabbe039..35a9e72725 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1157,7 +1157,7 @@ describe User do context "when user preferences are overriden" do before do - SiteSetting.default_email_digest_frequency = 1 # daily + SiteSetting.default_email_digest_frequency = 1440 # daily SiteSetting.default_email_private_messages = false SiteSetting.default_email_direct = false SiteSetting.default_email_mailing_list_mode = true @@ -1183,7 +1183,7 @@ describe User do options = user.user_option expect(options.email_always).to eq(true) expect(options.mailing_list_mode).to eq(true) - expect(options.digest_after_days).to eq(1) + expect(options.digest_after_minutes).to eq(1440) expect(options.email_private_messages).to eq(false) expect(options.external_links_in_new_tab).to eq(true) expect(options.enable_quoting).to eq(false) diff --git a/spec/services/user_updater_spec.rb b/spec/services/user_updater_spec.rb index f1ff985dc9..d061509025 100644 --- a/spec/services/user_updater_spec.rb +++ b/spec/services/user_updater_spec.rb @@ -46,7 +46,7 @@ describe UserUpdater do updater.update(bio_raw: 'my new bio', email_always: 'true', mailing_list_mode: true, - digest_after_days: "8", + digest_after_minutes: "45", new_topic_duration_minutes: 100, auto_track_topics_after_msecs: 101, email_in_reply_to: false @@ -56,7 +56,7 @@ describe UserUpdater do expect(user.user_profile.bio_raw).to eq 'my new bio' expect(user.user_option.email_always).to eq true expect(user.user_option.mailing_list_mode).to eq true - expect(user.user_option.digest_after_days).to eq 8 + expect(user.user_option.digest_after_minutes).to eq 45 expect(user.user_option.new_topic_duration_minutes).to eq 100 expect(user.user_option.auto_track_topics_after_msecs).to eq 101 expect(user.user_option.email_in_reply_to).to eq false diff --git a/test/javascripts/fixtures/user_fixtures.js.es6 b/test/javascripts/fixtures/user_fixtures.js.es6 index c18d6f2fe9..c123605c3a 100644 --- a/test/javascripts/fixtures/user_fixtures.js.es6 +++ b/test/javascripts/fixtures/user_fixtures.js.es6 @@ -1,6 +1,6 @@ /*jshint maxlen:10000000 */ export default { -"/users/eviltrout.json": {"user_badges":[{"id":5870,"granted_at":"2014-05-16T02:39:38.388Z","badge_id":4,"user_id":19,"granted_by_id":-1},{"id":40673,"granted_at":"2014-03-31T14:23:18.060Z","post_id":7241,"post_number":19,"badge_id":23,"user_id":19,"granted_by_id":-1,"topic_id":3153},{"id":5868,"granted_at":"2014-05-16T02:39:38.380Z","badge_id":3,"user_id":19,"granted_by_id":-1}],"badges":[{"id":4,"name":"Leader","description":null,"grant_count":7,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_type_id":1},{"id":23,"name":"Great Share","description":null,"grant_count":14,"allow_title":false,"multiple_grant":true,"icon":"fa-certificate","image":null,"listable":true,"enabled":true,"badge_grouping_id":2,"system":true,"badge_type_id":1},{"id":3,"name":"Regular","description":null,"grant_count":30,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_type_id":2}],"badge_types":[{"id":1,"name":"Gold","sort_order":9},{"id":2,"name":"Silver","sort_order":8},{"id":3,"name":"Bronze","sort_order":7}],"users":[{"id":19,"username":"eviltrout","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/eviltrout/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"},{"id":-1,"username":"system","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/system/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"}],"topics":[{"id":3153,"title":"Is it better for Discourse to use JavaScript or CoffeeScript?","fancy_title":"Is it better for Discourse to use JavaScript or CoffeeScript?","slug":"is-it-better-for-discourse-to-use-javascript-or-coffeescript","posts_count":56}],"user":{"user_option":{},"id":19,"username":"eviltrout","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/eviltrout/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png","name":"Robin Ward","email":"robin.ward@gmail.com","last_posted_at":"2015-05-07T15:23:35.074Z","last_seen_at":"2015-05-13T14:34:23.188Z","bio_raw":"Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.","bio_cooked":"

Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.

","created_at":"2013-02-03T15:19:22.704Z","website":"http://eviltrout.com","location":"Toronto","can_edit":false,"can_edit_username":true,"can_edit_email":true,"can_edit_name":true,"stats":[{"action_type":13,"count":342,"id":null},{"action_type":12,"count":109,"id":null},{"action_type":4,"count":27,"id":null},{"action_type":5,"count":1607,"id":null},{"action_type":6,"count":771,"id":null},{"action_type":1,"count":333,"id":null},{"action_type":2,"count":2671,"id":null},{"action_type":7,"count":949,"id":null},{"action_type":9,"count":42,"id":null},{"action_type":3,"count":8,"id":null},{"action_type":11,"count":20,"id":null}],"can_send_private_messages":true,"can_send_private_message_to_user":false,"bio_excerpt":"Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.","trust_level":4,"moderator":true,"admin":true,"title":"co-founder","badge_count":23,"notification_count":3244,"has_title_badges":true,"custom_fields":{},"user_fields":{"1":"33"},"pending_count":0,"post_count":1987,"can_be_deleted":false,"can_delete_all_posts":false,"locale":"","email_digests":true,"email_private_messages":true,"email_direct":true,"email_always":true,"digest_after_days":7,"mailing_list_mode":false,"auto_track_topics_after_msecs":60000,"new_topic_duration_minutes":1440,"external_links_in_new_tab":false,"dynamic_favicon":true,"enable_quoting":true,"muted_category_ids":[],"tracked_category_ids":[],"watched_category_ids":[3],"private_messages_stats":{"all":101,"mine":13,"unread":3},"disable_jump_reply":false,"gravatar_avatar_upload_id":5275,"custom_avatar_upload_id":1573,"card_image_badge":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","card_image_badge_id":120,"muted_usernames":[],"invited_by":{"id":1,"username":"sam","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/sam/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"},"custom_groups":[{"id":44,"automatic":false,"name":"ubuntu","user_count":11,"alias_level":0,"visible":true,"automatic_membership_email_domains":null,"automatic_membership_retroactive":false,"primary_group":false,"title":null},{"id":47,"automatic":false,"name":"discourse","user_count":7,"alias_level":0,"visible":true,"automatic_membership_email_domains":null,"automatic_membership_retroactive":false,"primary_group":false,"title":null}],"featured_user_badge_ids":[5870,40673,5868],"card_badge":{"id":120,"name":"Garbage Man","description":"This Discourse developer successfully called something \"garbage!\"","grant_count":3,"allow_title":false,"multiple_grant":false,"icon":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","image":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","listable":false,"enabled":false,"badge_grouping_id":8,"system":false,"badge_type_id":3}}}, +"/users/eviltrout.json": {"user_badges":[{"id":5870,"granted_at":"2014-05-16T02:39:38.388Z","badge_id":4,"user_id":19,"granted_by_id":-1},{"id":40673,"granted_at":"2014-03-31T14:23:18.060Z","post_id":7241,"post_number":19,"badge_id":23,"user_id":19,"granted_by_id":-1,"topic_id":3153},{"id":5868,"granted_at":"2014-05-16T02:39:38.380Z","badge_id":3,"user_id":19,"granted_by_id":-1}],"badges":[{"id":4,"name":"Leader","description":null,"grant_count":7,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_type_id":1},{"id":23,"name":"Great Share","description":null,"grant_count":14,"allow_title":false,"multiple_grant":true,"icon":"fa-certificate","image":null,"listable":true,"enabled":true,"badge_grouping_id":2,"system":true,"badge_type_id":1},{"id":3,"name":"Regular","description":null,"grant_count":30,"allow_title":true,"multiple_grant":false,"icon":"fa-user","image":null,"listable":true,"enabled":true,"badge_grouping_id":4,"system":true,"badge_type_id":2}],"badge_types":[{"id":1,"name":"Gold","sort_order":9},{"id":2,"name":"Silver","sort_order":8},{"id":3,"name":"Bronze","sort_order":7}],"users":[{"id":19,"username":"eviltrout","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/eviltrout/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"},{"id":-1,"username":"system","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/system/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"}],"topics":[{"id":3153,"title":"Is it better for Discourse to use JavaScript or CoffeeScript?","fancy_title":"Is it better for Discourse to use JavaScript or CoffeeScript?","slug":"is-it-better-for-discourse-to-use-javascript-or-coffeescript","posts_count":56}],"user":{"user_option":{},"id":19,"username":"eviltrout","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/eviltrout/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png","name":"Robin Ward","email":"robin.ward@gmail.com","last_posted_at":"2015-05-07T15:23:35.074Z","last_seen_at":"2015-05-13T14:34:23.188Z","bio_raw":"Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.","bio_cooked":"

Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.

","created_at":"2013-02-03T15:19:22.704Z","website":"http://eviltrout.com","location":"Toronto","can_edit":false,"can_edit_username":true,"can_edit_email":true,"can_edit_name":true,"stats":[{"action_type":13,"count":342,"id":null},{"action_type":12,"count":109,"id":null},{"action_type":4,"count":27,"id":null},{"action_type":5,"count":1607,"id":null},{"action_type":6,"count":771,"id":null},{"action_type":1,"count":333,"id":null},{"action_type":2,"count":2671,"id":null},{"action_type":7,"count":949,"id":null},{"action_type":9,"count":42,"id":null},{"action_type":3,"count":8,"id":null},{"action_type":11,"count":20,"id":null}],"can_send_private_messages":true,"can_send_private_message_to_user":false,"bio_excerpt":"Co-founder of Discourse. Previously, I created Forumwarz. Follow me on Twitter.","trust_level":4,"moderator":true,"admin":true,"title":"co-founder","badge_count":23,"notification_count":3244,"has_title_badges":true,"custom_fields":{},"user_fields":{"1":"33"},"pending_count":0,"post_count":1987,"can_be_deleted":false,"can_delete_all_posts":false,"locale":"","email_digests":true,"email_private_messages":true,"email_direct":true,"email_always":true,"digest_after_minutes":10080,"mailing_list_mode":false,"auto_track_topics_after_msecs":60000,"new_topic_duration_minutes":1440,"external_links_in_new_tab":false,"dynamic_favicon":true,"enable_quoting":true,"muted_category_ids":[],"tracked_category_ids":[],"watched_category_ids":[3],"private_messages_stats":{"all":101,"mine":13,"unread":3},"disable_jump_reply":false,"gravatar_avatar_upload_id":5275,"custom_avatar_upload_id":1573,"card_image_badge":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","card_image_badge_id":120,"muted_usernames":[],"invited_by":{"id":1,"username":"sam","uploaded_avatar_id":null,"avatar_template":"/letter_avatar/sam/{size}/3_f9720745f5ce6dfc2b5641fca999d934.png"},"custom_groups":[{"id":44,"automatic":false,"name":"ubuntu","user_count":11,"alias_level":0,"visible":true,"automatic_membership_email_domains":null,"automatic_membership_retroactive":false,"primary_group":false,"title":null},{"id":47,"automatic":false,"name":"discourse","user_count":7,"alias_level":0,"visible":true,"automatic_membership_email_domains":null,"automatic_membership_retroactive":false,"primary_group":false,"title":null}],"featured_user_badge_ids":[5870,40673,5868],"card_badge":{"id":120,"name":"Garbage Man","description":"This Discourse developer successfully called something \"garbage!\"","grant_count":3,"allow_title":false,"multiple_grant":false,"icon":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","image":"https://meta-discourse.global.ssl.fastly.net/uploads/default/36220/15b19c80dd99d5a5.png","listable":false,"enabled":false,"badge_grouping_id":8,"system":false,"badge_type_id":3}}}, "/user_actions.json": {"user_actions":[{"action_type":7,"created_at":"2014-01-16T14:13:05Z","excerpt":"So again, \n\nWhat is the problem?\n\nI need to check user_trust_level , i get the 'username' from a form via ajax, i need to check what level he is on discourse \n\nAlso, if possible, i would like to get other details as well, like email address etc. \n\nI took a look at : https://github.com/discourse/dis…","avatar_template":"//www.gravatar.com/avatar/bdab7e61b3191e483492fd680f563fed.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/bdab7e61b3191e483492fd680f563fed.png?s={size}&r=pg&d=identicon","slug":"how-to-check-the-user-level-via-ajax","topic_id":11993,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":1,"reply_to_post_number":null,"username":"Abhishek_Gupta","name":"Abhishek Gupta","user_id":8021,"acting_username":"Abhishek_Gupta","acting_name":"Abhishek Gupta","acting_user_id":8021,"title":"How to check the user level via ajax?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-15T16:53:49Z","excerpt":"A good fix would be to have the ERB template do an if statement. We'd happily accept a PR that did this if you feel up to it: \n\n <% if SiteSetting.logo_url.present? %>\n display logo html\n<% else %>\n display title html\n<% end %>","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"users-activate-account-pulling-blank-logo-instead-of-defaulting-to-h2","topic_id":10911,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"/users/activate-account pulling blank logo instead of defaulting to h2","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-15T15:21:37Z","excerpt":"A good fix would be to have the ERB template do an if statement. We'd happily accept a PR that did this if you feel up to it: \n\n <% if SiteSetting.logo_url.present? %>\n display logo html\n<% else %>\n display title html\n<% end %>","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"users-activate-account-pulling-blank-logo-instead-of-defaulting-to-h2","topic_id":10911,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"/users/activate-account pulling blank logo instead of defaulting to h2","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-15T12:22:12Z","excerpt":"OK - i see what you mean. From the piwik code I should add: \n\n_paq.push(["setDocumentTitle", document.domain + "/" + document.title]);\n\n? \n\nUnfortunately I have had to give up on Piwik for now because I have switched the forum to SSL on a free cert and have used up the free subdomain for the forum. …","avatar_template":"//localhost:3000/uploads/default/avatars/2a8/a3c/8fddcac642/{size}.jpg","acting_avatar_template":"//localhost:3000/uploads/default/avatars/2a8/a3c/8fddcac642/{size}.jpg","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":26,"reply_to_post_number":25,"username":"citkane","name":"Michael Jonker","user_id":7604,"acting_username":"citkane","acting_name":"Michael Jonker","acting_user_id":7604,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-15T11:16:36Z","excerpt":"@eviltrout recently added support for multiple API keys [wink] \n\n[]","avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"allow-for-multiple-api-keys","topic_id":7444,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":null,"username":"zogstrip","name":"Régis Hanol","user_id":1995,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Allow for multiple API Keys","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-15T10:58:46Z","excerpt":"@eviltrout added a tooltip when you click on the user's avatar which allows you to show the posts made by that user \n\n[image]","avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"to-group-posts-by-a-user","topic_id":7412,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":4,"reply_to_post_number":3,"username":"zogstrip","name":"Régis Hanol","user_id":1995,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"To group posts by a user","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-15T10:36:15Z","excerpt":"@eviltrout implemented per-user API key a while ago [wink] \n\n [image]\nTopics_-_Discourse_Meta-5.png884x339 29.6 KB\n","avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"auth-using-rest-api","topic_id":5937,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"zogstrip","name":"Régis Hanol","user_id":1995,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Auth using REST API?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-15T09:55:17Z","excerpt":"@eviltrout has recently introduced this feature and has even blogged about it: \n\n \n \n \n \n eviltrout.com\n \n \n \n \n \n Hiding Offscreen Content in Ember.js - Evil Trout's Blog","avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"infinite-scrolling-reusing-dom-nodes","topic_id":5186,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":null,"username":"zogstrip","name":"Régis Hanol","user_id":1995,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Infinite scrolling: Reusing DOM nodes","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-15T00:54:32Z","excerpt":"You can retrieve a user's JSON by making a call to /users/username.json but that assumes you know the user's username. If that's impossible, I would be happy to accept a PR that would return the current user JSON from /session/current-user or something like that. \n\nAdditionally, if you're looking to…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/035d12bad251759d8fbc9fb10574d1f6.png?s={size}&r=pg&d=identicon","slug":"get-current-user-information-via-json","topic_id":11959,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"watchmanmonitor","acting_name":"Watchman Monitoring","acting_user_id":8085,"title":"Get current user information via JSON","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-14T21:59:51Z","excerpt":"You can retrieve a user's JSON by making a call to /users/username.json but that assumes you know the user's username. If that's impossible, I would be happy to accept a PR that would return the current user JSON from /session/current-user or something like that. \n\nAdditionally, if you're looking to…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/9cfd2536afac32d209335b092094c12c.png?s={size}&r=pg&d=identicon","slug":"get-current-user-information-via-json","topic_id":11959,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"znation","acting_name":"znation","acting_user_id":8163,"title":"Get current user information via JSON","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-14T21:46:50Z","excerpt":"Okay I've fixed the https [point_right] http links on the server side and in the Javascript click tracking as @BhaelOchon pointed out. \n\nLet me know if you find anything else broken.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"broken-links-possibly-related-to-https","topic_id":11831,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":18,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Broken links, possibly related to HTTPS","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-14T21:43:28Z","excerpt":"Thanks for your help @eviltrout! I will consider making that change and sending a pull request. I may not get to it for a while. \n\nI am embedding Discourse on another site and it is mostly going well. I have indeed been using your blog for inspiration.","avatar_template":"//www.gravatar.com/avatar/9cfd2536afac32d209335b092094c12c.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/9cfd2536afac32d209335b092094c12c.png?s={size}&r=pg&d=identicon","slug":"get-current-user-information-via-json","topic_id":11959,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"znation","name":"znation","user_id":8163,"acting_username":"znation","acting_name":"znation","acting_user_id":8163,"title":"Get current user information via JSON","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-14T21:21:52Z","excerpt":"Okay I've fixed the https [point_right] http links on the server side and in the Javascript click tracking as @BhaelOchon pointed out. \n\nLet me know if you find anything else broken.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"broken-links-possibly-related-to-https","topic_id":11831,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":18,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Broken links, possibly related to HTTPS","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T21:03:07Z","excerpt":"Okay I've fixed the https [point_right] http links on the server side and in the Javascript click tracking as @BhaelOchon pointed out. \n\nLet me know if you find anything else broken.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"broken-links-possibly-related-to-https","topic_id":11831,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":18,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Broken links, possibly related to HTTPS","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-14T20:42:51Z","excerpt":"You can retrieve a user's JSON by making a call to /users/username.json but that assumes you know the user's username. If that's impossible, I would be happy to accept a PR that would return the current user JSON from /session/current-user or something like that. \n\nAdditionally, if you're looking to…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"get-current-user-information-via-json","topic_id":11959,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Get current user information via JSON","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T20:29:23Z","excerpt":"You can retrieve a user's JSON by making a call to /users/username.json but that assumes you know the user's username. If that's impossible, I would be happy to accept a PR that would return the current user JSON from /session/current-user or something like that. \n\nAdditionally, if you're looking to…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"get-current-user-information-via-json","topic_id":11959,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Get current user information via JSON","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T19:20:28Z","excerpt":"Perhaps the ['trackpageView'] is not the correct API call? We can probably send more information across such as the URL.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":25,"reply_to_post_number":24,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T19:19:46Z","excerpt":"Nope but I bet you can find one!","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"how-far-to-take-user-documentation","topic_id":11943,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":4,"reply_to_post_number":3,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"How far to take user documentation?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-14T18:37:05Z","excerpt":"I'd be glad to write a pull request to take use there. Is there a specific part of their documentation you have in mind?","avatar_template":"//www.gravatar.com/avatar/035d12bad251759d8fbc9fb10574d1f6.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/035d12bad251759d8fbc9fb10574d1f6.png?s={size}&r=pg&d=identicon","slug":"how-far-to-take-user-documentation","topic_id":11943,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"watchmanmonitor","name":"Watchman Monitoring","user_id":8085,"acting_username":"watchmanmonitor","acting_name":"Watchman Monitoring","acting_user_id":8085,"title":"How far to take user documentation?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-14T16:04:28Z","excerpt":"Thanks @eviltrout , the code in the 'bottom of pages' now reads: \n\n<script type="text/javascript">\nDiscourse.PageTracker.current().on('change', function() {\n console.log('tracked!')\n _paq.push(['trackPageView']);\n});\n</script>\n\nThe console is logging 'tracked!' and piwik is logging for each page c…","avatar_template":"//localhost:3000/uploads/default/avatars/2a8/a3c/8fddcac642/{size}.jpg","acting_avatar_template":"//localhost:3000/uploads/default/avatars/2a8/a3c/8fddcac642/{size}.jpg","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":23,"reply_to_post_number":22,"username":"citkane","name":"Michael Jonker","user_id":7604,"acting_username":"citkane","acting_name":"Michael Jonker","acting_user_id":7604,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T15:58:27Z","excerpt":"This topic is now archived. It is frozen and cannot be changed in any way.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"regression-cannot-sort-topic-list","topic_id":11944,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":4,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Regression: Cannot sort topic list","deleted":false,"hidden":false,"moderator_action":true,"edit_reason":null},{"action_type":5,"created_at":"2014-01-14T15:26:57Z","excerpt":"I do think that leading them into the official rails documentation at that point is not a bad idea. Like "congratulations, everything is ready but now you'll need to understand the platform we built it in to be productive."","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"how-far-to-take-user-documentation","topic_id":11943,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"How far to take user documentation?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-14T08:28:00Z","excerpt":"I've just added the ability to list reply counts on your blog index and archive pages as you can see here. \n\nIt works with a similar API to embedding comments: \n\n <script type="text/javascript">\n var discourseUrl = "http://fishtank.eviltrout.com/";\n\n (function() {\n var d = document.createEleme…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"discourse-plugin-for-static-site-generators-like-jekyll-or-octopress","topic_id":7965,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":98,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Discourse plugin for static site generators like Jekyll or Octopress","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-14T00:21:26Z","excerpt":"In pull request 1821, @eviltrout asked: \n\n "About rails s: I wouldn't be against adding it but at what point do we stop holding their hand and expect them to know how rails works? I'm sure rails documentation could do a better job than us. Actually maybe we should just link to that? \n\nWhat point to …","avatar_template":"//www.gravatar.com/avatar/035d12bad251759d8fbc9fb10574d1f6.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/035d12bad251759d8fbc9fb10574d1f6.png?s={size}&r=pg&d=identicon","slug":"how-far-to-take-user-documentation","topic_id":11943,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":1,"reply_to_post_number":null,"username":"watchmanmonitor","name":"Watchman Monitoring","user_id":8085,"acting_username":"watchmanmonitor","acting_name":"Watchman Monitoring","acting_user_id":8085,"title":"How far to take user documentation?","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-13T21:58:28Z","excerpt":"It looks uneeded, but you need to review a fair amount of code to confirm it is not needed. \n\nI am going to keep it for now cause its safer under some weird edge conditions.","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"ruby-question-about-use-of-klass-self-in-the-site-customization-rb","topic_id":11889,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":2,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Ruby question about use of klass=self in the site_customization.rb","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T21:11:32Z","excerpt":"I had to fix an issue with Google analytics so I added a new API hook that can be used. \n\nIf you add the following it should work: \n\n Discourse.PageTracker.current().on('change', function() {\n _paq.push(['trackPageView']);\n});","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-13T21:10:57Z","excerpt":"Having a look, the fix is a bit scary imho, we should fix the root issue.","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"error-after-update-to-0-9-8-1","topic_id":11903,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":11,"reply_to_post_number":10,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Error after update to 0.9.8.1","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T20:50:34Z","excerpt":"I've just added the ability to list reply counts on your blog index and archive pages as you can see here. \n\nIt works with a similar API to embedding comments: \n\n <script type="text/javascript">\n var discourseUrl = "http://fishtank.eviltrout.com/";\n\n (function() {\n var d = document.createEleme…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//localhost:3000/uploads/default/avatars/527/614/d16e1504d9/{size}.jpg","slug":"discourse-plugin-for-static-site-generators-like-jekyll-or-octopress","topic_id":7965,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":98,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"trident","acting_name":"Ben T","acting_user_id":5707,"title":"Discourse plugin for static site generators like Jekyll or Octopress","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T20:44:56Z","excerpt":"I had to fix an issue with Google analytics so I added a new API hook that can be used. \n\nIf you add the following it should work: \n\n Discourse.PageTracker.current().on('change', function() {\n _paq.push(['trackPageView']);\n});","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T20:40:21Z","excerpt":"I had to fix an issue with Google analytics so I added a new API hook that can be used. \n\nIf you add the following it should work: \n\n Discourse.PageTracker.current().on('change', function() {\n _paq.push(['trackPageView']);\n});","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T19:52:04Z","excerpt":"@Sam do you have any idea why only some people are getting this issue? I dont' mind the proposed fix but I'd prefer to know why it happens in the first place.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"error-after-update-to-0-9-8-1","topic_id":11903,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":10,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Error after update to 0.9.8.1","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T19:01:19Z","excerpt":"I've just added the ability to list reply counts on your blog index and archive pages as you can see here. \n\nIt works with a similar API to embedding comments: \n\n <script type="text/javascript">\n var discourseUrl = "http://fishtank.eviltrout.com/";\n\n (function() {\n var d = document.createEleme…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"discourse-plugin-for-static-site-generators-like-jekyll-or-octopress","topic_id":7965,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":98,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Discourse plugin for static site generators like Jekyll or Octopress","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T18:50:14Z","excerpt":"I've just added the ability to list reply counts on your blog index and archive pages as you can see here. \n\nIt works with a similar API to embedding comments: \n\n <script type="text/javascript">\n var discourseUrl = "http://fishtank.eviltrout.com/";\n\n (function() {\n var d = document.createEleme…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"discourse-plugin-for-static-site-generators-like-jekyll-or-octopress","topic_id":7965,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":98,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Discourse plugin for static site generators like Jekyll or Octopress","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T18:47:33Z","excerpt":"I am pretty sure that the denizens of SO are correct and the variable is unneeded. @sam can confirm but it seems like it was once needed for something that has since been removed and the variable declaration was left intact.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"ruby-question-about-use-of-klass-self-in-the-site-customization-rb","topic_id":11889,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Ruby question about use of klass=self in the site_customization.rb","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T18:45:41Z","excerpt":"I've just added the ability to list reply counts on your blog index and archive pages as you can see here. \n\nIt works with a similar API to embedding comments: \n\n <script type="text/javascript">\n var discourseUrl = "http://fishtank.eviltrout.com/";\n\n (function() {\n var d = document.createEleme…","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"discourse-plugin-for-static-site-generators-like-jekyll-or-octopress","topic_id":7965,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":98,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Discourse plugin for static site generators like Jekyll or Octopress","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T17:19:08Z","excerpt":"@Sam do you have any idea why only some people are getting this issue? I dont' mind the proposed fix but I'd prefer to know why it happens in the first place.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/5120fc4e345db0d1a964888272073819.png?s={size}&r=pg&d=identicon","slug":"error-after-update-to-0-9-8-1","topic_id":11903,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":10,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"riking","acting_name":"Kane York","acting_user_id":6626,"title":"Error after update to 0.9.8.1","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-13T16:41:31Z","excerpt":"I'd love to see API support. @sam and @eviltrout, I can facilitate an intro to the piwik guys if you want—I've written about them before and they're typically super-responsive. Because I know you guys are totally hunting for new stuff to do [wink]","avatar_template":"//localhost:3000/uploads/default/avatars/95a/06d/c337428568/{size}.png","acting_avatar_template":"//localhost:3000/uploads/default/avatars/95a/06d/c337428568/{size}.png","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":20,"reply_to_post_number":null,"username":"Lee_Ars","name":"Lee_Ars","user_id":4457,"acting_username":"Lee_Ars","acting_name":"Lee_Ars","acting_user_id":4457,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-13T16:15:51Z","excerpt":"The code looks okay but it's hard to debug this way. \n\nOne thing you could do is add a: console.log('tracked!') just before line 8. Then open a developer console and see if the javascript is running properly.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":18,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T15:10:41Z","excerpt":"This is really interesting. I'd like to hear your findings.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"focus-events-track-which-window-is-the-last-active-instance-of-a-forum-edit","topic_id":11872,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":9,"reply_to_post_number":8,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Focus events: Track which window is the last active instance of a forum Edit","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T15:02:45Z","excerpt":"The code looks okay but it's hard to debug this way. \n\nOne thing you could do is add a: console.log('tracked!') just before line 8. Then open a developer console and see if the javascript is running properly.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":18,"reply_to_post_number":16,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":5,"created_at":"2014-01-13T14:53:13Z","excerpt":"@Sam do you have any idea why only some people are getting this issue? I dont' mind the proposed fix but I'd prefer to know why it happens in the first place.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"error-after-update-to-0-9-8-1","topic_id":11903,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":10,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Error after update to 0.9.8.1","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-13T06:27:26Z","excerpt":"Can this be archived @eviltrout?","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"search-not-working-for-staff-users","topic_id":11371,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":13,"reply_to_post_number":null,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Search not working for Staff users","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-13T05:32:46Z","excerpt":"When you navigate to another topic using the "suggested topics" area we are not registering a page view with Google. \n\n@eviltrout perhaps we should do this from discourse location instead of application controller?","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"google-analytics-is-not-registering-page-views","topic_id":11914,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":1,"reply_to_post_number":null,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Google analytics is not registering page views","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-13T02:50:25Z","excerpt":"@eviltrout any ideas here, the code seems correct","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"support-for-piwik-analytics-as-an-alternative-to-google-analytics","topic_id":7512,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":17,"reply_to_post_number":16,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Support for Piwik Analytics as an alternative to Google Analytics","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-12T22:31:35Z","excerpt":"This is an interesting approach an an interesting feature. @eviltrout your thoughts. Essentially allows us to have notifications cross tabs.","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"focus-events-track-which-window-is-the-last-active-instance-of-a-forum-edit","topic_id":11872,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":4,"reply_to_post_number":1,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Focus events: Track which window is the last active instance of a forum Edit","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-12T18:01:04Z","excerpt":"This was the link \n\nmetric_fu \n\n[metric_fu](https://github.com/metricfu/metric_fu/blob/b1bf8feb921916fc265f041efa3157a6a6530a9b/lib/metric_fu/logging/mf_debugger.rb#L24)\n\nSeems to work fine now that @eviltrout worked so hard to get us MDTest 1.1 compliant.","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"underscores-in-linked-text-can-cause-markdown-bug","topic_id":10848,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":null,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Underscores in linked text can cause markdown bug","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-12T04:14:06Z","excerpt":"Awesome plugin, but doesn't seem to work out of the box with images \n\nhttps://github.com/discourse/discourse-spoiler-alert/issues/2","avatar_template":"//localhost:3000/uploads/default/avatars/276/f19/3826efe463/{size}.jpg","acting_avatar_template":"//localhost:3000/uploads/default/avatars/276/f19/3826efe463/{size}.jpg","slug":"brand-new-plugin-interface","topic_id":8793,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":64,"reply_to_post_number":44,"username":"xrvk","name":"Eero Heikkinen","user_id":8068,"acting_username":"xrvk","acting_name":"Eero Heikkinen","acting_user_id":8068,"title":"Brand new plugin interface","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-11T23:36:11Z","excerpt":"A few things, \n\n@eviltrout myself and many others have discourse_docker hosted on DigitalOcean, my user cpu is usually around 2% I have plenty of capacity. \n\nI know that stonehearth and other larger scale discourse work on DigitalOcean fine. Officially we strongly recommend a 2GB instance, thoug…","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon","slug":"performance-issue-on-digital-ocean-with-discourse-docker","topic_id":11895,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":2,"reply_to_post_number":null,"username":"sam","name":"Sam Saffron","user_id":1,"acting_username":"sam","acting_name":"Sam Saffron","acting_user_id":1,"title":"Performance issue on DigitalOcean with discourse_docker","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-11T00:58:23Z","excerpt":"Confirmed on try.discourse.org, this is still an issue. \n\n@eviltrout can you add that to your list -- unless you are a staff member you should not be able to delete (your own) posts from an archived topic.","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"archived-discussions-still-allow-posts-to-be-deleted","topic_id":6479,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":3,"reply_to_post_number":null,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Archived discussions still allow posts to be deleted","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-11T00:35:38Z","excerpt":"Agree, @eviltrout can you make sure the usercard is using the same logic as the user page in displaying profile info?","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"usercard-does-not-resize-for-obnoxiously-large-images","topic_id":11007,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":5,"reply_to_post_number":4,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Usercard does not resize for obnoxiously large images","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-11T00:34:06Z","excerpt":"@eviltrout can you make sure the "import post" button is suppressed on the user page when editing "about me"? \n\n(I agree it is like a "lose all my work" button on that page if you happen to press it..) \n\nThen I can archive this.","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"quote-post-button-should-be-disabled-or-raise-an-error-when-creating-a-new-topic","topic_id":834,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":5,"reply_to_post_number":4,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"\"Quote Post\" button should be disabled or raise an error when creating a new topic","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":7,"created_at":"2014-01-10T21:00:11Z","excerpt":">\n\nLooks good now. Thanks for these fixes @eviltrout, we (and markdown-js) are now MDTest 1.1 compliant!","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"text-editor-issue-with-the-code-block","topic_id":10050,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":5,"reply_to_post_number":null,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Text Editor issue with the code block","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":1,"created_at":"2014-01-10T20:07:46Z","excerpt":"We can't repro that one, also seems a bit obscure. But thank you very much for all the reports, whenever I see a bug entry from YOU I always know it is going to be a good one based on experience here and elsewhere. [trophy]","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","slug":"security-error-on-console-noticed-on-meta","topic_id":11825,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":12,"reply_to_post_number":11,"username":"codinghorror","name":"Jeff Atwood","user_id":32,"acting_username":"eviltrout","acting_name":"Robin Ward","acting_user_id":19,"title":"Security Error on console (noticed on meta)","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T19:48:08Z","excerpt":"Thanks for letting us know. It turns out that by using minutely(5) instead of minutely causes ice_cube to peg a core at 100% usage. I've pushed out a fix in master.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"codinghorror","acting_name":"Jeff Atwood","acting_user_id":32,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T19:47:17Z","excerpt":"Thanks for letting us know. It turns out that by using minutely(5) instead of minutely causes ice_cube to peg a core at 100% usage. I've pushed out a fix in master.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/42776c4982dff1fa45ee8248532f8ad0.png?s={size}&r=pg&d=identicon","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"neil","acting_name":"Neil","acting_user_id":2,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T17:39:24Z","excerpt":"We should consider doing what Google Drive does: they intercept cmd-f and pop up a box that allows you to dynamically search.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/5120fc4e345db0d1a964888272073819.png?s={size}&r=pg&d=identicon","slug":"ctrl-f-search-is-interrupted-by-quotation-popup","topic_id":7114,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":12,"reply_to_post_number":11,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"riking","acting_name":"Kane York","acting_user_id":6626,"title":"Ctrl+F search is interrupted by quotation popup","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T17:29:15Z","excerpt":"Thanks for letting us know. It turns out that by using minutely(5) instead of minutely causes ice_cube to peg a core at 100% usage. I've pushed out a fix in master.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/5120fc4e345db0d1a964888272073819.png?s={size}&r=pg&d=identicon","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"riking","acting_name":"Kane York","acting_user_id":6626,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T17:24:37Z","excerpt":"Thanks for letting us know. It turns out that by using minutely(5) instead of minutely causes ice_cube to peg a core at 100% usage. I've pushed out a fix in master.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"zogstrip","acting_name":"Régis Hanol","acting_user_id":1995,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":6,"created_at":"2014-01-10T17:02:35Z","excerpt":"Fixed [smile] \n\ntop - 12:02:00 up 12 days, 2:16, 1 user, load average: 0.28, 0.92, 0.97\nTasks: 115 total, 1 running, 114 sleeping, 0 stopped, 0 zombie\nCpu0 : 0.7%us, 0.3%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st\nCpu1 : 0.7%us, 0.3%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi,…","avatar_template":"//localhost:3000/uploads/default/avatars/886/ea8/e533d87fd9/{size}.png","acting_avatar_template":"//localhost:3000/uploads/default/avatars/886/ea8/e533d87fd9/{size}.png","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":23,"reply_to_post_number":22,"username":"michaeld","name":"Michael","user_id":6548,"acting_username":"michaeld","acting_name":"Michael","acting_user_id":6548,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null},{"action_type":2,"created_at":"2014-01-10T16:58:12Z","excerpt":"Thanks for letting us know. It turns out that by using minutely(5) instead of minutely causes ice_cube to peg a core at 100% usage. I've pushed out a fix in master.","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon","acting_avatar_template":"//localhost:3000/uploads/default/avatars/527/614/d16e1504d9/{size}.jpg","slug":"sidekiq-cpu-load-since-latest-release","topic_id":9515,"target_user_id":19,"target_name":"Robin Ward","target_username":"eviltrout","post_number":22,"reply_to_post_number":null,"username":"eviltrout","name":"Robin Ward","user_id":19,"acting_username":"trident","acting_name":"Ben T","acting_user_id":5707,"title":"Sidekiq CPU load since latest release","deleted":false,"hidden":false,"moderator_action":false,"edit_reason":null}]}, "/topics/created-by/eviltrout.json": {"users":[{"id":19,"username":"eviltrout","avatar_template":"//www.gravatar.com/avatar/c6e17f2ae2a215e87ff9e878a4e63cd9.png?s={size}&r=pg&d=identicon"},{"id":5460,"username":"ned","avatar_template":"//localhost:3000/uploads/default/avatars/06b/90d/3b3ea7e56b/{size}.png"},{"id":402,"username":"thebrianbarlow","avatar_template":"//www.gravatar.com/avatar/5ddf2459e8edd6cf52dfff6cb41ca70d.png?s={size}&r=pg&d=identicon"},{"id":5707,"username":"trident","avatar_template":"//localhost:3000/uploads/default/avatars/527/614/d16e1504d9/{size}.jpg"},{"id":32,"username":"codinghorror","avatar_template":"//www.gravatar.com/avatar/51d623f33f8b83095db84ff35e15dbe8.png?s={size}&r=pg&d=identicon"},{"id":1995,"username":"zogstrip","avatar_template":"//www.gravatar.com/avatar/b7797beb47cfb7aa0fe60d09604aaa09.png?s={size}&r=pg&d=identicon"},{"id":2702,"username":"ryanflorence","avatar_template":"//www.gravatar.com/avatar/749001c9fe6927c4b069a45c2a3d68f7.png?s={size}&r=pg&d=identicon"},{"id":9,"username":"tms","avatar_template":"//www.gravatar.com/avatar/3981cd271c302f5cba628c6b6d2b32ee.png?s={size}&r=pg&d=identicon"},{"id":1,"username":"sam","avatar_template":"//www.gravatar.com/avatar/3dcae8378d46c244172a115c28ca49ce.png?s={size}&r=pg&d=identicon"},{"id":2636,"username":"lonnon","avatar_template":"//www.gravatar.com/avatar/9489ef302fbff6c19bba507d09f8cd1d.png?s={size}&r=pg&d=identicon"}],"topic_list":{"can_create_topic":false,"draft":null,"draft_key":"new_topic","draft_sequence":null,"topics":[{"id":7764,"title":"New: Reply via Email Support!","fancy_title":"New: Reply via Email Support!","slug":"new-reply-via-email-support","posts_count":32,"reply_count":24,"highest_post_number":35,"image_url":"/uploads/meta_discourse/1227/8f4e5818dfaa56c7.png","created_at":"2013-06-25T11:58:39.000-04:00","last_posted_at":"2014-01-09T18:53:06.000-05:00","bumped":true,"bumped_at":"2014-01-09T17:09:40.000-05:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":2201,"like_count":46,"has_summary":false,"archetype":"regular","last_poster_username":"codinghorror","category_id":2,"posters":[{"extras":null,"description":"Original Poster","user_id":19},{"extras":null,"description":"Most Posts","user_id":5460},{"extras":null,"description":"Frequent Poster","user_id":402},{"extras":null,"description":"Frequent Poster","user_id":5707},{"extras":"latest","description":"Most Recent Poster","user_id":32}]},{"id":9318,"title":"Discourse has a new Markdown Parser!","fancy_title":"Discourse has a new Markdown Parser!","slug":"discourse-has-a-new-markdown-parser","posts_count":1,"reply_count":0,"highest_post_number":1,"image_url":null,"created_at":"2013-08-24T14:08:06.000-04:00","last_posted_at":"2013-08-24T14:08:06.000-04:00","bumped":true,"bumped_at":"2013-08-24T14:13:25.000-04:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":812,"like_count":13,"has_summary":false,"archetype":"regular","last_poster_username":"eviltrout","category_id":7,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user_id":19}]},{"id":7019,"title":"Discourse Ember Refactorings","fancy_title":"Discourse Ember Refactorings","slug":"discourse-ember-refactorings","posts_count":5,"reply_count":3,"highest_post_number":5,"image_url":null,"created_at":"2013-05-30T11:16:36.000-04:00","last_posted_at":"2013-06-02T11:22:58.000-04:00","bumped":true,"bumped_at":"2013-06-02T11:22:58.000-04:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":1075,"like_count":15,"has_summary":false,"archetype":"regular","last_poster_username":"eviltrout","category_id":7,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user_id":19},{"extras":null,"description":"Most Posts","user_id":1995},{"extras":null,"description":"Frequent Poster","user_id":2702}]},{"id":4650,"title":"Migrating off Active Record Observers","fancy_title":"Migrating off Active Record Observers","slug":"migrating-off-active-record-observers","posts_count":8,"reply_count":7,"highest_post_number":8,"image_url":null,"created_at":"2013-03-11T11:26:13.000-04:00","last_posted_at":"2013-05-14T18:40:16.000-04:00","bumped":true,"bumped_at":"2013-05-14T18:40:16.000-04:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":377,"like_count":3,"has_summary":false,"archetype":"regular","last_poster_username":"sam","category_id":7,"posters":[{"extras":null,"description":"Original Poster","user_id":19},{"extras":null,"description":"Most Posts","user_id":9},{"extras":null,"description":"Frequent Poster","user_id":1995},{"extras":null,"description":"Frequent Poster","user_id":32},{"extras":"latest","description":"Most Recent Poster","user_id":1}]},{"id":4960,"title":"Vagrant Updates!","fancy_title":"Vagrant Updates!","slug":"vagrant-updates","posts_count":5,"reply_count":3,"highest_post_number":5,"image_url":"/plugins/emoji/images/fish.png","created_at":"2013-03-20T22:29:22.000-04:00","last_posted_at":"2013-03-21T19:06:40.000-04:00","bumped":true,"bumped_at":"2013-03-21T19:06:40.000-04:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":500,"like_count":4,"has_summary":false,"archetype":"regular","last_poster_username":"zogstrip","category_id":7,"posters":[{"extras":null,"description":"Original Poster","user_id":19},{"extras":null,"description":"Most Posts","user_id":1},{"extras":null,"description":"Frequent Poster","user_id":32},{"extras":"latest","description":"Most Recent Poster","user_id":1995}]},{"id":2918,"title":"New: Updated Docs","fancy_title":"New: Updated Docs","slug":"new-updated-docs","posts_count":3,"reply_count":2,"highest_post_number":3,"image_url":null,"created_at":"2013-02-12T12:13:02.000-05:00","last_posted_at":"2013-02-15T17:57:19.000-05:00","bumped":true,"bumped_at":"2013-02-15T17:57:19.000-05:00","unseen":false,"pinned":false,"visible":true,"closed":false,"archived":false,"views":457,"like_count":10,"has_summary":false,"archetype":"regular","last_poster_username":"eviltrout","category_id":10,"posters":[{"extras":"latest","description":"Original Poster, Most Recent Poster","user_id":19},{"extras":null,"description":"Most Posts","user_id":2636}]}]}} }; From 917546d43b5ff27263c041f5b8bfb16fe8d2b600 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Mar 2016 16:52:03 -0500 Subject: [PATCH 207/245] FIX: Wrong flag images --- public/images/emoji/apple/cn.png | Bin 2146 -> 2616 bytes public/images/emoji/apple/de.png | Bin 2236 -> 2240 bytes public/images/emoji/apple/es.png | Bin 2205 -> 3730 bytes public/images/emoji/apple/gb.png | Bin 2375 -> 5677 bytes public/images/emoji/apple/it.png | Bin 1922 -> 2088 bytes public/images/emoji/apple/jp.png | Bin 2240 -> 2144 bytes public/images/emoji/apple/kr.png | Bin 2336 -> 3770 bytes public/images/emoji/apple/ru.png | Bin 2239 -> 2801 bytes public/images/emoji/apple/us.png | Bin 2147 -> 5770 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/images/emoji/apple/cn.png b/public/images/emoji/apple/cn.png index 22db7b69bcae552d6e49a175e1f40482a3e52c9e..4be941fa0b31d323c903c88a642b26e99a7195e4 100644 GIT binary patch literal 2616 zcmV-83di+{P)AIEM!_f;1*2dTi~{DN;?P|s)xy!1c1lqeHU^Ov)~=D}R<7Y@R`%hh7Or7H z9ByK12Bh`FjLkJdP0WSDjm-h=nFEj{%eRNWbF!+dd!`3Fd)IolZQHhO+rekswr%?b z@88z$|9Xr@WuEhDGWtzaR7}s?xyF7SUm5v3nK`VR?cGLBQhx9AzKkamXI5A5a^a2L zc?-v13$tq}*)>n;vd4JNQY<|tysoj7@MM^KBe;S~z*UeUtZT2hsYUNuWzc`3uKy8u z1s&v%KmUmq9I|Cmws&{lg$~8`t8UV!uBubY|XTh2Eh;)O`VSeaNa6vlH66uyzI1Z(Qw1%XpA|ar&A)iLd>W57UYmQCGxCjm) z080P$od>>W$jz@_Vf&94DDDz$ClFs95M)*e+RmqwDBF(RS$9Jr;N4<&)b0UVj|V~I zP_U7r6`cRl5!E%rwgV!a8|+uj_1dROa-D1n`kCc_>gns7!YQ{U*@z+ty7mBTW??m}XHx3_{;?P!Y$r zB=2AQp*>#f$9D4byq+JlT^i|rZfmM^=uD4OO@X+hEWbz1)$iD4_;xj6)fqPX3M{;J z1i&6pd?J+R9q9qqdTl9SLhrQ`OoZM4sgTN{0FmQEwvU_!pYugj`2Q*9Ra1j=@a%%~ zUq0gcw;!)%JYaCu35$RW$T4qCWUy|qM;GDr=t&Rr1jULWKz*+wi%#!~ zQC_sB07VnNqJK3J`VI+%js;9!6zILC(Ys-!Ey>4lo-`;YA&|C|YAtcsr;pJ9+kaVM zo65=uP8hy@jjb#5usvb$W|50ue!%q~+GX$-iMXyHPmuzMKs{B~K4p@7@s*#o%u7CV zg;##g64jEi_6cL^k<1NbBl2iD^Pv+4Zyc##rHDB26e)lkl#7Pf@S=BL<)Pmmuy{VQ z^|uu-_|P*=xJ3VI#3w=<1U!KbVDi#}o8LanE*b8w5ho$y5Q)**!=ZA8;xm0^RcH+0RWFeSa!+_h9|(m zBUCqxw5P--l$2!r0LsgU*CvMVRpZI?oR@*of9(VU7*DMNWCZZ;^dR@96i1=(T1Z>M z^`G72#t-bU@HP>ff+)E0q(pf%2~OM=dY284l83w$ba=WJKmZr2*D&t+)pgd;yDSim@W7O_}N79n8?9{iE%|EC(_^*QMbq$YzKepk!0l}Y`Dc}*L@06Dk zS~=953O}7k$cfJrPNH~BxjU&=1kqPlN1@p#3M6~okGJD9(_ATQRH^<%99A6S=DDGzqQ7R(KB+f`e ztY9K^LB8YK>(gfAp>@9+N-j3`G*GG%R8SPn+lq=HhucAs*}kgI6ht(ONH#U*z&K-! zu^Iao*`Ea-S!%RgjM}Y^?k{tAF7PtjdO<0*T?j=~8gp1| zW&+~ODbCo9(V>>|dSY3k`+CA&?8x&3f0iIG5OVNaJX++!>@SsN`M$%l_rbtt(?Y)L z@@vy(b7S)}$Jhr0@6!`q>1&{`N;VfEP>N8@3P27GIkZ4cqeH|S$?HVkzUlb$1$hp_ za|C&=!b^d5o@}LN} z9JxnD?h)bDptpj^i#6~fAn|15i!Zt&Yc3>DZn$FI|aB?fM+;&3UH?Y&us1# a;C}&b6(OAM+Bg*e00008Iq delta 2144 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 N002ovPDHLkV1imNDl-58 delta 2235 zcmV;s2t@b55xfzQ8Gi!+005o0f$RVP00d`2O+f$vv5yPmngQO3r`1wI|d#>U6T$8>ab2t*-clz4BLfx^PVb%%OmfMauWb9IAz za+QE`a&intBw&?xyu7>zK_3S|9|=Gqz`(%8#l^qBzskzWW`CD@%F4=fb8}>tc!h<9 z4o4gwv#)6?hY=kV|E9F0r-{r%$N;_2z>-rnBw^78!q`wf0P`uh3{d^)PCstI{G z0dOxEiAEukP!fYcsi~>!007j~)E+uI?GO(m35 z5`{qtdpHw>LhkPFvAQ_4W1e@bK#;B=ht0FWLi5$`G~`5z=wsdWutFzf5<(9qDozrPiI zK+DU^q<^HOkB^TjmR9=z|1XA1=O!iZA|eJ@CsVF@n3$NIot+d~F(r{u`@g^Setrju zK8IL2_!%DaPEPFX>;XX>5l|}_cs~J2A3Ty@Ac06fgk17iSOK3>5|mHzMMV#uRsG!E z{n66>@$>hLjFVG01cyEC0Rex1f4aK57;QT;lz&?VYA;%tbUA}f2%1p#W@rY5JN@M3 zY+W<*UtiuPBkc4WwIeYe7=Ega%(L5`;mo zudiX3cPem4QkZYMw7497MPZtFN118(rKR_upBkA|vOzEH1qGyOP(rwVE6j?}I4%IH zOMd{iVjZ4Xa&mHacX!;>*x=sZI+|iWnq;0xFm9`eM0i66f;vlGDhP=_`)+UvN+d^v zOp2{aSO5S3K6Fw}QveV_q!?`J{jL*vA_de+LB(X%$>q{aUzvpMd&_#f{kdBH%BP8A zooO%7?CkI>bFGV_>?XIPV06vqXGDj*cx zwOU7=-Fv?QUlbE*NfenvOcAjmslkL+34|;_0tp0aP#_^}WR)o!*+Uc%Sz_JWy1MuC z^xijbB0-?$bNPSDhxhz)&bjCQ&z&)2TGRT!Y38fOrsn307n_?dG@fZ-sIlpy7k{6B zP7oa}5C{?z6Pue~p1Ww_(?Mo`XbM6j6=ak^U;`1*07c|c2ofaD)qS;M_Jpz4>prsm zD^4s$CMiA3&&huwn1ya_1Tl}IEL2!ac`PcOYUYl)SGr7rSq>vc=sT=l`VYwe}K z*SY%$DI^k!A`~6m;TCLf=Lm98D1T6Pu)=;>Gs%%a^ZT z|Mi#6=|~g_6D3@95MgmZ_q_D+0lM#0E59{4fFV^@o|GU>JS8pt*EDxv;YDQ&@TaRfeUN_0B~d~ zEdH(%L70Gmu!oGw>KqNR$Bp(8Eque!iI3&l*U8@qI(m{{+A>_!7W`k!XQ9pXFo5Le}ClBvGk~a=tI3jIo(o&0G%p{B$V60N;#H}AO($b30BvnNI+`olEx}Sd!PZp3`S!IPj?qc5X6&e zSP1}t^-F@L()G}aFQi2m;xF!q{FzaKk3S202)VPaBi_wdAIxTcioId zlvFUt6urel9)Gu3be@O0CnY4=q-%KzAxSfTfoe^we zbmA4?q|D3=pv)xS=4doJNq>-VfD?WUniBp@kp4`JZhyXzl#!hLLX+8?XMyIJnf>r% zQ*u&L#^d##*5)^+2XK-+IGmW6va4<7S2989hS%R%y2jc9f5=!Gy|ZHJ`({naIzUm8 zL)!VaHcc0fKou9aw6tVpWtDuqVeJ|#i-}%9MpkQezimujDJm*)NJ~5a4W_KDZ-L%j zzS?HJ(KJ&&fo4?#-watR{meWt;X-&%j{R8(! diff --git a/public/images/emoji/apple/es.png b/public/images/emoji/apple/es.png index c3eef9db3fea1fa1a4ab1843854b4794d6178f87..2e7761c07a5d7f4b892772268f49193a39f49715 100644 GIT binary patch literal 3730 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 delta 2204 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 TIfx%400000NkvXXu0mjfYDW(I literal 2375 zcmd5-`8(7L7yn`miY(EHG-K@Bn6iv5#@Oc$A=$UFgvd@xF-WqtAlWOVdF|PkEYV^s zlZl9!GnA?qBep=bX>yoX=06=Q+=LPNKP)5!W%HV*mhfnHcL^9x?Xs zVrMzR{KlAN0AM~eCs-K}e1hWZv;1Esgje1VElUn~5${(RXP+GsQkoc0ayP6ZC9w3~ zHFCT+InJf%rhP%UYhHv`!L6W*M8C=eVpWV)>2-WnD30u_MfO%Ha?{9mHOlod&+-rO z^RubFO=!7+tqWAD_EIkQlp#Ay726}9S;O-zg>xi{_0KFFb#f6b>8SI5BYK;yxVR9u+e3PXR3mT% z2acJ&nWo3L7Xk_LLki~~$}7zF=zyd6NmVUS&*YnmMu>!DVzl!7msm!Ht&F(mE!m!Vzc#0y-_Y20$+V=Xzy8{I!#^n^ zY;mD)EV!=CuFY-$OmFN6h)Cm!4v~zB7D02MH30-G8~rJ>v~A`f$E;jQxu`FHb-+7* z=4Q2ynVKg4nQI2FhPib<9E$5WBJi+fhW)k;JZycwL=JE_f^^uQ%sR4{`C3 zVC({@YzP1qQUbDBanMlTW!~~7A;NyIE=6NWZr8x~FYQbX*kxh~3@jJujXHe6c zBco^v)3Hx~HcZik5jYa3(Sn}PECI}^y`aj(PSjXKkbhdrepWtART8^?czF`VfrWG5 ziFPKX-nK39-jX>W63LI7%NV+2c)lLZSTQX6&U=!^3GX+^#DXj3o84XFA#Co9i$6bbv;W2C`t#b3i5Tj{pJ_kgyGQY9S90!7_4zOs zsn?z?ohIfRo$ALzBU-G@O!LDf3183dA5R!~{b(8Bydjckb*oY_`DOLDLvOov-@L#v z_a8r*(Jp42E=pA*X!?za7=twY^FJ{aO-1?N@Ls4k)`)a{hHgzO^ireF!p7mS^+nOD z<{NPht_N?ZtMqLTe}z%zN&a2;_~>UJ(g))@^q<@Kv>e>Q2dR7m&}EUEtoi3uW_syE z?2~QmcYaWimU1Ys$j-cy>&}5SZius==+nJ~DDcY84O6VAZ`+L;ZaL2XW40K#!Hk^w$o|mbW`;VQuR2`fY z)i$dA)8*CAC?oj+^V+oyG?N`f+4?Ffv6E#C7}*h{Jf>$b{L3#NF349N)KtoE=b(^! z88v~wO=WIX_aAE3L8RbdB%bG&(T1aCr^W0FjFZ-QQY73|f!QRu`J!=n7|>V1ZHy)H z5YurxL>>8HPv@;zJ)ozLp)A9k4)&#Yimyt|+C=&Fx%>`CeLs2#fQf;bekIN|_AkB8 B-zfk9 diff --git a/public/images/emoji/apple/it.png b/public/images/emoji/apple/it.png index fdee93be2a5b14437b4d0673f5faa6e3e80893f6..c332890a00df16dbbafb86bd7c34d9cf1cad08ca 100644 GIT binary patch delta 2075 zcmV+$2;}#I52z53B!BNoL_t(|0qvOuY&^LY#((eGyBki9nVIjzWo8nUnZ#0=xx%8b z%oUWGMCDdY$IN$srtl^+&96Pd%r35VS*@#pX#8U5++;1H#!fzwg}?us z13&&Ler5{R3x7fpRZ^8Dp{xj@q6$U;f(qsx!MBi!G2G-NGCoEbf)z*R{|h{WKK#6(E;%s~Bl-Hj3%rjcfpT1rd zX8;$55H3;GiMXoKTr}J1bkggnIHszINEDdS0<;W-`2}QZiV(}cETj2e8)78{s!$O^ z=*f(LK!3N3@2=Bc8pDN>)$R&8eszAHes14;gu;jElicyInyfmn8q*eSZ3XY#y-wXe z6CCR;-`2RCbS1QACwaTt#Wo?lZfoxa!fch%g8A-fb2KN_dv|Vpnl&q<(P$V|O)EUWaDRWgwg9S8f{GF_WaCI6 z8^(ozK$O_VIfAI`jfj%t^G?LY@?u|io+G+~k0q;~mapY}G+!$kafm7@gkT`TzV!vH z@_$TEPBA$)ffZduBpOdffjop1=vIV?q=TVk>Fl0V022n`$w3ftU_wz9l%Zl>3#8KC z%DbK!w;6y6A`;u!$8yo7Tb3Ar4P4ozJb)ZYV<6BRLVixxBQRtD(vye~50xkd5h7v$ z$sJ;#8*@bz7o`HylMIlmHk;4;O@Q2S8h=MH5E6=E$mU2wj2wL4na59VWOHAMMv+WK z35cdSc>n<0y$57{`4|Zy9a}5PK!j9zBAa8`e#r0$127^;c9v#Wl1)iI7eTkJfTk61 ze2+jFj4)s{^KHYw2Oy-6=*g+MBi{&c8gf^Ej9#@<(8WtMDsgR^M4y) zGui5sYXHLbZ}>9w7D$t`Y(WMXM+Rx2@g{>0hW;QdYKZwcUTDAo9T2%>w=n!lCOuw$ z+v{)}Oa_`y6NDt&XeG6h^ms&vtFeXw;R%hBBaI#T&=VeIhcgOb6u>BeosH)SO#WTf zhMAk;?TK$bVe!};kSAaTnAx^Jk$(+xC1hYK`8)$72R|Uj#*TzNjD{Zu@=%N%d5{%g z+jNS7N%Luzj7AM*I-esV*hXJ|L@)>zdOeoBVtqFs9?}+&=1qldm894C4gUvNH-GYI}Hfi5`Th02pEGaAbTFT?f(k{P?i-1fieWvtEyI6_tmPZS|y4s;Y{jC<@lr)>vO( zr@OjJbFrk$hEVLt^d z)m=&hv0iKa;ebdg5|RuI>5Yk^QQA|)%(j^AcDt6#sxZXmz!_Cd@URqw+wPx&g!FCyTKvfUdA|qaB%*-ZB?1aL&v`ca6QV}jc5XxtC zTCJmJIvsN4!xvmeKVLj^*`g_#ZX=Vm#yr~bNZX^{q0S+$XMbFrqT+A@io}D%t4o|U zbv(a#(I;q`a$xZ=t1GL?blpayQ8AQ*RaM<;W;ck)HMMT4bvxgvovL16>vrHEk0J8;&wrjleCBW8p96cUq8DLy zg(#Pbx}!y9s@5z{y@*&mLjo+hoZ zyLKar-?6nq4S#GdRhfc+iHefel&^->m1<#4okoO1ScHOQ^%@^E382uR#!Z=STAMYP zN-xYBe9kv!_R^(GxN+kKZr{F*2M-?L$>S$@4dAbhTX4v+5Q58A!-2wOLG5xYj_po` zu-V=d8*SYXXzhaamQJA7+PHxVaw!bLAuK|f;a(Uf0e@KcsfH>e+CObHsdr%W>HT_j znm?>;=gB^nEo&A|U{0O#THX^H8rtS)#L=OQY)D8*7|ljR{7=>F(8QRe)S5} zn>VjPeFX4t;3n+PV~@i$?^zQ2+=^j`OA&0f_xNny${FhlIABdaJ5Vd~*n;9Q0^03f z9P8YQVt<^St7!o7n>m6IijHfA3R63w?&KaHsTQ*a{@ZG{_pz3<2JLP$$9J8ixxU*d zp5rz3XZ1zfg+oBIXHT4#4AbmC|NJ8&OS5vLN(m5A0T{H;vjhP^$^dIu1XxNCg!r9+ zc&+&WV%4=m>@IFdKfEIHjj9cY(G4jAp-^U0JAZyw2dQK#+x#b^urcG%jUD6A===9Z_2I*ZXaVeYE`Lk_*lgn-DFfE!{RDtzp&bC4Pc){MrCu^a((efT(}-04!+9)F%M>!lwp6{iQL0365U}K>qU=8NjIW zF#*8zS26ta0$>K11i;^a{sIs{{D1LfKLaq-K0bf|MD72209XPhGho7>3}9U4Uj%>- zKnI`$&;jTGbO7TWero{YY48^Y@KGTR9*2Ko07|nzEdW!`0_p(Fei~GY*HGrP#0Y>r zLA92c=m=?_0optc^Lw;1qbbS^(6lS8(hrC^0HYlt6)Ad!(E*UR#Tji40DoxG5HZ;j zi(bmMxNqeFblq_DXM6T3jlmK zB?2&eFe26fLQn$u-feN^TtH-j(Xm)`lOY0-4@bpVe3QWpN8e%$zTCo*;zU?3Z6`wl z07U>?2nj)11_Yos8dJ^(gn#&*=Lm}Tab(VEGDqm=AKb_8$pa7s~jSB!KM`Oag5Wn*{C&!#3(kI!=NL4(E(9yhK>&jyX_x5<>Ve3Q(% zEXrBrPN}v*gPS;-B!AD6med%CKQ3kMA7H(W%O`-b$5l0TDl t06G92fDS+hpaakW=m2y8IshHO{{cdtB4L*rBE|p!002ovPDHLkV1j0|e|-P| diff --git a/public/images/emoji/apple/jp.png b/public/images/emoji/apple/jp.png index eacde525337ff87536561143ac2a23295cc867ea..beb79a4acea135fe1ee5e553fa45e2deb8e39bf2 100644 GIT binary patch delta 2131 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 IM6N<$g8Hoj>;M1& literal 2147 zcmdT^`8(8$8vl;bp)f|mjAX`|U6zimnlX`)T{MOUS&K@Ma=2+oS?Zib41+O*vCLR< z7)zF{EogL(wXrMv(i9Qnd)?>W`@{Vc?)$v&=ktD^=l$vZJnx(6Xm2HUNcIo_0Akj7 z3+H{t{;Pzc`^^<6Gzp&`{ejd%Nr#%+C{Ha z3STL`XppDXLLyV8ZbTpO3i+dR*x3lxJabo&F-N$nQ_gyZ9-Si57NW7lw7oO|pf6toei*Yu# zaF;*t{rW?{UC@J$Q1V1<(%R#U9ZCV8QO1AWw#)gjURL+zkCeY7W4nUy*q`$N@b2sL zv$K!Vz&r*Bg4-bY9Rydlx8`~4i;Ii1pFdAePmj*dj4UloZhl+X+gnY~`UlR^>&$sR zpTD)ey}7Z$BsCMPGy#>PsE3b{r3wb%U3>;m*%Z?XJEarkRvJz41v^9Q1#57+#^UC#9qq7p-L@N`ko_IdR4gj`gkrd!;&okgfYuRLG?J(+ z<%)(m$Vz&k5d`fmEF6xzft~|l6}Yi6Yc+P{>=yeSN;ZR3wtPVyp|_}0fkpF*RC zj9cvnvgu4&AAyriLIi5m$b0K5HfIET*L_B|Qp*=smost+bCo47fhDOl`M&qVL>inI zHtV;SUtR#nZdGlkT6-D=vZ=qI*UdLp=G(C64`-tVbB0YsOxMxq-5=V&m#p5BNMtlz z7?eVMP|CiU)^o7uPoE4c!E;f&jXf{1@Z57x8PetP@shM%i1&fzhRr+V)t-0LlzQZ;dDCIj`SHqEf{984jgKE>Xo%V?#9q@i zMWV3*(5!m_EDgT4H#1YnF})MWi=ciPS`hzUhb)2>8(u z@xZz0&?1Wz!QW68nes_MSwT)E>oxBTKxi|ynuGe(mcG3O@suKVdENHKdDuZe)U#Yv zG#BFO#^&y9Z@fgP-+ggZa#l5p+Og*==s8V^pyTro2@9j+=D~`yTM^`C4LrnrmN2Uz zV4{b`ZA-lo=_8@_`^LD4hp0v{6 zdhPalm;sPjCjVAbr2i&uYbuJu>O13p8)%Z@BN6#?fesijQp@3 zG3-F9!}H*P1zalu+p>U4`TUT~Lx}(qLY&yW>0NOdfoY5!FlPtNpfn5H#|xsrLGXvw zKE?KU#s?wuCdi3rp=v$Q?DtqsNb(!YFek+&0kX8{S#IH3$j>Eijc^Mj#Y6_Dyjii# zMHU8&|GZ%C{R}#*x+^)@wgm8jM5xDUSDn${@){RIYPB40O(exZnX3*pq6mbSXiT|) zh1u~kL~)iK3Rb>&m<@gYS eOF#$GJ&ut<-SQf*SAg$-O~BgH-l81m9s5t~dUlck From 53a463d7c187abbf96db9f091a90289ff71688ed Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Wed, 2 Mar 2016 17:50:42 -0500 Subject: [PATCH 208/245] Hub must be called with https --- lib/discourse_hub.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discourse_hub.rb b/lib/discourse_hub.rb index 4309647b02..e174cf065a 100644 --- a/lib/discourse_hub.rb +++ b/lib/discourse_hub.rb @@ -42,7 +42,7 @@ module DiscourseHub def self.hub_base_url if Rails.env.production? - 'http://api.discourse.org/api' + 'https://api.discourse.org/api' else ENV['HUB_BASE_URL'] || 'http://local.hub:3000/api' end From 5f8e20aa1de551b7ff01de731eb2f4df5d029264 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Thu, 3 Mar 2016 08:26:45 +0800 Subject: [PATCH 209/245] FIX: Topic view not working when Redis is readonly. --- app/services/random_topic_selector.rb | 7 ++++++- spec/services/random_topic_selector_spec.rb | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/services/random_topic_selector.rb b/app/services/random_topic_selector.rb index 7486311cb6..705bcd51d1 100644 --- a/app/services/random_topic_selector.rb +++ b/app/services/random_topic_selector.rb @@ -47,7 +47,12 @@ class RandomTopicSelector $redis.ltrim(key, count, -1) end - results = results[0] + if !results.is_a?(Array) # Redis is in readonly mode + results = $redis.lrange(key, 0, count-1) + else + results = results[0] + end + results.map!(&:to_i) left = count - results.length diff --git a/spec/services/random_topic_selector_spec.rb b/spec/services/random_topic_selector_spec.rb index dd2d1cccb3..d57f5519d2 100644 --- a/spec/services/random_topic_selector_spec.rb +++ b/spec/services/random_topic_selector_spec.rb @@ -11,8 +11,15 @@ describe RandomTopicSelector do $redis.rpush key, t end + expect(RandomTopicSelector.next(0)).to eq([]) expect(RandomTopicSelector.next(2)).to eq([0,1]) + + $redis.expects(:multi).returns(Discourse.received_readonly!) expect(RandomTopicSelector.next(2)).to eq([2,3]) + $redis.unstub(:multi) + + expect(RandomTopicSelector.next(2)).to eq([2,3]) + expect(RandomTopicSelector.next(2)).to eq([]) end it 'can correctly backfill' do From 5a6c34fb8ade7260325d8f100e26240e04b52978 Mon Sep 17 00:00:00 2001 From: Sam Date: Thu, 3 Mar 2016 16:00:14 +1100 Subject: [PATCH 210/245] regression, unable to edit posts --- app/services/post_alerter.rb | 2 +- spec/services/post_alerter_spec.rb | 39 +++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 5f67f8f3c0..8fff00b59b 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -195,7 +195,7 @@ class PostAlerter end def should_notify_edit?(notification, opts) - return existing_notification.data_hash["display_username"] != opts[:display_username] + return notification.data_hash["display_username"] != opts[:display_username] end def should_notify_like?(user, notification) diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 98d6e5f16e..b481c88986 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -24,20 +24,41 @@ describe PostAlerter do end end + context 'edits' do + it 'notifies correctly on edits' do + + ActiveRecord::Base.observers.enable :all + + post = Fabricate(:post, raw: 'I love waffles') + + admin = Fabricate(:admin) + post.revise(admin, {raw: 'I made a revision'}) + + # skip this notification cause we already notified on a similar edit + Timecop.freeze(2.hours.from_now) do + post.revise(admin, {raw: 'I made another revision'}) + end + + post.revise(Fabricate(:admin), {raw: 'I made a revision'}) + + Timecop.freeze(4.hours.from_now) do + post.revise(admin, {raw: 'I made another revision'}) + end + + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(3) + end + end + context 'likes' do it 'notifies on likes correctly' do ActiveRecord::Base.observers.enable :all post = Fabricate(:post, raw: 'I love waffles') PostAction.act(evil_trout, post, PostActionType.types[:like]) + PostAction.act(Fabricate(:admin), post, PostActionType.types[:like]) - admin = Fabricate(:admin) - post.revise(admin, {raw: 'I made a revision'}) - - PostAction.act(admin, post, PostActionType.types[:like]) - - # one like and one edit notification - expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(2) + # one like + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) post.user.user_option.update_columns(like_notification_frequency: @@ -46,7 +67,7 @@ describe PostAlerter do admin2 = Fabricate(:admin) PostAction.act(admin2, post, PostActionType.types[:like]) # two likes one edit - expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(3) + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(2) post.user.user_option.update_columns(like_notification_frequency: UserOption.like_notification_frequency_type[:first_time_and_daily]) @@ -61,7 +82,7 @@ describe PostAlerter do end # first happend within the same day, no need to notify - expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(4) + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(3) end end From f3c868e7bb7bc3c33d1c86f4f4ca22589113bf3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 3 Mar 2016 12:01:13 +0100 Subject: [PATCH 211/245] run the BackupChunksMerger job in 5 seconds --- app/controllers/admin/backups_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/admin/backups_controller.rb b/app/controllers/admin/backups_controller.rb index 286d3e6ef9..22e57fcc9a 100644 --- a/app/controllers/admin/backups_controller.rb +++ b/app/controllers/admin/backups_controller.rb @@ -134,7 +134,7 @@ class Admin::BackupsController < Admin::AdminController # when all chunks are uploaded if uploaded_file_size + current_chunk_size >= total_size # merge all the chunks in a background thread - Jobs.enqueue(:backup_chunks_merger, filename: filename, identifier: identifier, chunks: chunk_number) + Jobs.enqueue_in(5.seconds, :backup_chunks_merger, filename: filename, identifier: identifier, chunks: chunk_number) end render nothing: true From 57c518eee1ecb170352bec5e1e71c63e270059e7 Mon Sep 17 00:00:00 2001 From: Jeff Atwood Date: Thu, 3 Mar 2016 04:06:50 -0800 Subject: [PATCH 212/245] update common password checker for 10 char+ --- .../10-char-common-passwords.txt | 2344 +++++ lib/common_passwords/common_passwords.rb | 6 +- .../long-common-passwords.txt | 2086 ----- .../short-common-passwords.txt | 7914 ----------------- 4 files changed, 2348 insertions(+), 10002 deletions(-) create mode 100644 lib/common_passwords/10-char-common-passwords.txt delete mode 100755 lib/common_passwords/long-common-passwords.txt delete mode 100644 lib/common_passwords/short-common-passwords.txt diff --git a/lib/common_passwords/10-char-common-passwords.txt b/lib/common_passwords/10-char-common-passwords.txt new file mode 100644 index 0000000000..e1c2542faf --- /dev/null +++ b/lib/common_passwords/10-char-common-passwords.txt @@ -0,0 +1,2344 @@ +0000000000 +000000000000 +0000000000d +0000000000o +000777fffa +0102030405 +010203040506 +0123456789 +01234567890 +012345678910 +0123654789 +0123698745 +014702580369 +0147258369 +0147852369 +0147896325 +0192837465 +01telemike01 +02987654321 +050605rostik +0528325452mr +070793monolit +0987612345 +0987654321 +0987654321a +0987654321q +0995359291 +0cDh0v99uE +0o9i8u7y6t +100894olol +1010101010 +1010810108 +1020304050 +102030405060 +1029384756 +1029384756q +10293847qp +10987654321 +1111111111 +11111111111 +111111111111 +1111111111111 +111111111111111 +11111111111111111111 +1111111111a +1111111111q +1111111111zz +1111122222 +11111aaaaa +1112131415 +111222333000 +111222333444 +111222333444555 +111222333a +111222333q +1122112211 +1122334455 +112233445566 +1123581321 +112358132134 +1133557799 +1212121212 +1212312121 +1213141516 +1213141516171819 +1223334444 +122333444455555 +1223505sayana +123123123123 +123123123123123 +1231231234 +123123123a +123123123q +123123123z +123123qweqwe +123321123321 +123321456654 +123321qweewq +123412341234 +1234509876 +1234512345 +123451234512345 +1234554321 +1234554321a +1234554321q +123456123456 +1234562000 +12345654321 +123456654321 +123456654321a +12345672000 +12345677654321 +1234567812345678 +123456782000 +1234567887654321 +123456789. +123456789* +1234567890- +1234567890 +12345678900 +123456789000 +12345678900987654321 +12345678901 +123456789012 +1234567890123 +12345678901234567890 +1234567890987654321 +1234567890a +1234567890d +1234567890g +1234567890l +1234567890m +1234567890o +1234567890p +1234567890q +1234567890qaz +1234567890qw +1234567890qwe +1234567890qwerty +1234567890qwertyuiop +1234567890s +1234567890v +1234567890w +1234567890z +1234567890zzz +1234567891 +12345678910 +123456789101 +1234567891011 +123456789101112 +12345678912 +123456789123 +123456789123456 +123456789123456789 +1234567892000 +12345678987654321 +1234567899 +123456789987 +1234567899876543 +123456789987654321 +12345678999 +123456789a +123456789A +123456789aa +123456789aaa +123456789abc +123456789as +123456789asd +123456789azat +123456789b +123456789c +123456789d +123456789e +123456789f +123456789g +123456789i +123456789j +123456789k +123456789l +123456789m +123456789n +123456789o +123456789p +123456789q +123456789Q +123456789qaz +123456789qq +123456789qqq +123456789qw +123456789qwe +123456789qwer +123456789qwerty +123456789r +123456789s +123456789t +123456789v +123456789w +123456789x +123456789y +123456789z +123456789Z +123456789zx +123456789zxc +123456789zz +12345678qwe +12345678qwertyu +1234567qwerty +1234567qwertyu +123456qwer +123456qwert +123456qwerty +123456zxcvbn +12345abcde +12345asdfg +12345q12345 +12345qazwsx +12345qwert +12345qwert7 +12345qwerty +12345trewq +12345zxcvb +1234qw1234qw +1234qwerasdf +1234qwerasdfzxcv +1234qwerty +1236547890 +123654789a +1236987005 +12369874123 +123698745a +123ewqasdcxz +123hfjdk147 +123qazwsxedc +123qwe123qwe +123qwe456rty +123qweasdzx +123qweasdzxc +123qwerty123 +123qwerty456 +123qwertyuiop +123sas4758 +125712571257d +12andriy14 +12qw34er56ty +1302alex1994 +1313131313 +131313131313 +1324354657 +1324354657687980 +132Forever +1346798520 +1357908642 +1357913579 +1357924680 +1357997531 +141312190296q +1472583690 +147258369a +147258369q +1478963215 +1488ss1488 +14bestlist +159357159357 +159753159753 +1597532486 +159753258456 +159753456852 +17171717aa +1928374650 +1928374655 +192837465q +193570356033 +193711101994a +1958proman +1986irachka +198719871987 +198919891989 +1994200414 +19952009sa +19960610ilja +19mtpgam19 +1a2a3a4a5a +1a2a3a4a5a6a +1a2b3c4d5e +1a2s3d4f5g +1a2s3d4f5g6h +1pass1page +1q2q3q4q5q +1q2w3e4r5t +1q2w3e4r5t6y +1q3e5t7u9o +1qa2ws3ed4rf +1qa2ws3ed4rf5tg +1qaz1qaz1qaz +1qaz2wsx3ed +1qaz2wsx3edc +1qaz2wsx3edc4rfv +1qazwsxedc +1qazxsw23edc +1qazxsw23edcvfr4 +1qwertyuiop +1rus27540102 +1z2x3c4v5b +20102010ss +20162016up +2143658709 +2222222222 +2222333344445555 +2244668800 +2267137151 +23176djivanfros +2347172123 +23WKoa0FP78dk +2468013579 +2507905048 +2606642yra +26429vadim +277rte87hryloitru +2dumb2live +2pacshakur +3012292113 +30secondstomars +31217221027711 +31321dj51982 +3141592654 +3216732167 +3240500777 +32615948worms +3322607093 +3333333333 +3454051maksim +3478526129 +38gjgeuftd +3f3fphT7oP +3rJs1la7qE +3sYqo15hiL +413276191q +41d8cd98f00b +420842084208555 +4294967296 +42qwerty42 +4444444444 +4465134444 +456456456q +4648246482 +4815162342 +4815162342a +4815162342lf +4815162342lost +4815162342q +4815162342s +4815162342z +4904s677075 +4rdf_king7 +51051051051 +5152535455 +541233432442 +5432112345 +5432167890 +54322q22345 +5544332211 +5555555555 +5566778899 +5647382910 +5858855abc +59382113kevinp +5hsU75kpoT +5t4r3e2w1q +6215mila6215 +6666666666 +671fsa75yt +675675675a +68iypNeg6U +6969696969 +70780070780 +7410258963 +7410852963 +7418529630 +741852963q +742617000027 +7777755102q +7777777777 +777777777777 +787898mich +7894561230 +789456123a +789456123q +7elephants +7jokx7b9DU +7uGd5HIp2J +80070633pc +80361665abc +80633459472qw +80637852730 +80663635606 +80672091913 +80679047880 +8096468644q +80966095182z +80969260620 +80972694711 +80988218126 +80990606390 +87654321vv +87e5nclizry +88002000600 +8888888888 +89015173454 +89023346574 +89032073168 +89055521933 +89057003343 +89063032220m +89128830153 +89132664230 +89172735872 +89181502334 +89211375759 +89231243658s +89600506779 +89614774181 +89876065093rax +89semtsriuty +8PHroWZ622 +8PHroWZ624 +9021090210 +9085084232 +9085603566 +9105425888 +9293709b13 +92k2cizCdP +951753852456 +9638527410 +9731553197 +9874563210 +9876543210 +987654321a +987654321d +987654321g +987654321q +987654321w +987654321z +989244342a +9988776655 +999111999q +9999999999 +99999999999 +999999999999 +99strenght +9Z5ve9rrcZ +a123456789 +A123456789 +a1234567890 +a123456789a +a1a2a3a4a5 +a1b2c3d4e5 +a1s2d3f4g5 +a1s2d3f4g5h6 +a3eilm2s2y +A514527514 +a550777954 +a58Wtjuz4U +a789456123 +a987654321 +aaaaaaaaaa +aaaaaaaaaaa +aaaaaaaaaaaa +ababagalamaga +abc123456789 +abc123abc123 +abcd123456 +abcde12345 +abcdefghij +abcdefghijk +abcdefghijkl +abdullayev +abercrombie +abracadabr +abracadabra +abrakadabra +absolutely +Accessibilit +accountant +accountbloc +accounting +activation +Ad12345678 +admin18533362 +administrato +administrator +adoxreadme +adrenaline +aezakmi123 +afghanistan +afireinside +afrika2002 +agnieszka1 +aionrusian +AjcuiVd289 +ajnjuhfabz +aksjdlasdakj89879 +alabama123 +alejandro1 +aleksandar +aleksander +aleksandra +Aleksandra +aleksandrov +aleksandrova +aleksey1986 +alertemailms +alertpaydoubl +alessandra +alessandro +alexander1 +Alexander1 +alexandra1 +alexandria +alexsander +alinaalina +alisaalisa +alisokskok +alkanaft123 +allahakbar +allahuakbar +alpha135792468 +alphabravo +alphaomega +alteclansing +alternativ +alternativa +alternative +am4h39d8nh +amadeusptfcor +ambassador +amsterdam1 +an83546921an13 +anastasija +anastasiya +Anastasiya +anderlecht +andrewjackie +andrey1234 +andrey1992 +andrey2010 +angelangel +angelochek +angelofwar +animal2000 +anniversary +antananarivu +antichrist +antihero77 +antikiller +antoshenechka +anytimetoday +apocalipsis +apocalypse +apokalipsis +applejuice +applesauce +armageddon +arsenal123 +artemartem +asasasasas +asd123asd123 +asdasdasdasd +asdf123456 +asdfdsasdf +asdfg12345 +asdfgh123456 +asdfghjkl; +asdfghjkl1 +asdfghjkl123 +ashleigh69 +asshole123 +astalavista +astonmartin +astonvilla +astra334566 +auckland2010 +australia1 +automobile +avadakedavra +avrillavigne +awdqseawdssa +awdrgyjilp +awesome123 +awo8rx3wa8t +azerbaijan +azerbaycan +azertyuiop +azsxdcfvgb +azsxdcfvgbhn +azwebitalia +BaBeMaGnEt +badiman28200 +badnaamhere +badreligion +bangladesh +barabashka +barbariska +barbarossa +barcelona1 +bartsimpson +baseball10 +baseball11 +baseball12 +baseball123 +baseball14 +baseball17 +baseball21 +basketball +Basketball +basketball1 +bassmaster +battlefield +battlestar +bbbbbbbbbb +bbbbbbbbbbbb +beautiful1 +belladonna +berezuckiy +bernadette +bestfriend +bestpker09 +bezparolya +BhRh0h2Oof6XbqJEH +biblioteka +bigbrother +billionaire +birmingham +birthday10 +birthday100 +birthday133 +birthday21 +birthday26 +birthday27 +birthday28 +birthday299 +birthday36 +birthday52 +birthday54 +blackadder +blackangel +blackberry +blackdragon +blackhawks +blackheart +blackhorse +blacklabel +blackmagic +blackmetal +blackshadow +blacksheep +blacksonblon +blackstone +blackwhite +bladerunner +blahblahblah +blingbling +blitzkrieg +bltynbabrfwbz +blueberry1 +bluedevils +bluedragon +bluemonkey +bmvm3e46gtr +bobmarley1 +bondarenko +bonneville +boredboi4u +bossyak123 +bot_schokk +boy1cool23 +Boy4u2OwnNYC +bpgjldsgjldthnf +braveheart +breakdance +brotherhood +brucewayne +bruteforce +buccaneers +bujhmbujhm +bulletproof +bullnuts2003 +bullwinkle +burgerking +bushmaster +businessbabe +butterbean +butterfly1 +bvncnbnvvbn +byajhvfnbrf +byyjrtynbq +c123456789 +c43dae874d +c43qpul5RZ +c7e4f8EzqH +cagliostro +calculator +california +California +callofduty +callofduty4 +CallSceSetup +candyeater +candyfinger +cannondale +casablanca +caterpillar +cbvtycbyjrbz +cccccccccc +cegthgegth +cegthgfhjkm +celtic1888 +cfifvfif211 +cfkfvfylhf +cfvfzcxfcnkbdfz +cfvfzkexifz +cfvfzrhfcbdfz +cgfhnfrvjcrdf +cgfhnfrxtvgbjy +cghfdjxybr +cgtkcbyuth +cgtwbfkbcn +challenger +ChangeLangMs +characters +charleston +charlie111 +charlie123 +charliedog +charlotte1 +charmander +cheaphornybastard +cheburashka +checkitout +cheerleader +cheerleaers +cheeseburger +cheesecake +chessmaster +chester123 +chesterfield +chicken123 +chickenwing101 +chinchilla +chocolate1 +chocolate2 +chrisbrown +christiaan +christian1 +christophe +christopher +Christopher +christopher1 +chucknorris +chupakabra +cincinnati +cinderella +cippalippa +civilization +cjcfnmdctv +cjdthitycndj +cjybthbrcjy +ckfltymrfz +clementine +clubpenguin +cnfc35762209 +cnfdhjgjkm +cnfhjghfvty +cnfnbcnbrf +cnhjbntkmcndj +cnjvfnjkju +coccinella +cockgobbler +cocksucker +colchester +collection +combat123654 +comedyclub +comicbookdb +comicbooks +commercial +compatible +compliance +computador +computadora +computer12 +computer123 +confidence +connection +constantin +constantine +constitution +construction +consultant +consulting +contortionist +contrasena +controller +coolbugi2000 +coorslight +copenhagen +corinthians +CORPerfMonSy +cosanostra +cosmopolitan +counterstrike +cranberries +crazyhorse +crepusculo +cristopher +ctdfcnjgjkm +cthnbabrfn +ctrnjhufpf +cumberland +cuntfinger +cuntlicker +cvzefh1gkc +cxfcnkbdfz +cxfcnkbdxbr +cxfcnmttcnm +cyberonline +cyecvevhbr +cyjdsvujljv +cytuehjxrf +CzPS5NYNDWCkSC +daddysgirl +dance4life +dancedance +danildanil +dantheman123 +darjeeling +darkknight +darthvader +dashadasha +daugavpils1 +dazdraperma +dbrnjhjdbx +dbrnjhjdyf +dctvcjcfnm +dctvghbdtn +dddddddddd +december12 +deeppurple +deepthroat +deerhunter +degenerationx +deltaforce +demolition +den1020834880 +denis12345 +denisdenis +department +depechemode +Description +desperados +destination +destruction +deutschland +devastator +DeviceClass +devildriver +devilmaycry +devilmaycry4 +dfcbkmtdyf +dfgdrb5se4 +dfktynbyrf +dhjnvytyjub +dictionary +difference +DigitalProdu +dirtysouth +dirtywhore +disneyland +diunilaobu8* +djljghjdjl +dkflbdjcnjr +dkflbvbhjdbx +dkflbvbhjdyf +dmiller12as +dodgeviper +doggystyle +dogphil3650 +dollarbill +domainlock2005 +domination +domodedovo +donaldduck +donkeykong +dontforget +dragonball +dragonballz +dragonfire +dragonforce +dragonlord +dragonslayer +dreamonline +dreamworks +drumandbass +dtynbkznjh +dunnowho89 +duranduran +dvtcntyfdctulf +e1l2e3n4a5 +e6pz84qfCJ +earthquake +edwardcullen +EFBCAPA201 +Efwe5tgwa5twhgd +eghfdktybt +ejaculation +ekaterina20 +ekx1x3k9BS +electrical +electronic +electronics +elizabeth1 +elsalvador +engineering +enterprise +Enterprise +entertainment +eqeS606898 +ereyes4269 +escaflowne +EulaComplete +evanescence +evangeline +evangelion +everything +excellence +expedition +experience +experienced +eybdthcbntn +F64579820f +fallenangel +falloutboy +fartripper +fatima753357 +fcbarcelona +fcnfkfdbcnf +fdnjhbpfwbz +felicidade +fenerbahce +ferrari360 +ffffffffff +fggjkbyfhbz +fgjkbyfhbz +fgjrfkbgcbc +fgtkmcbyrf +fgtkmcbyxbr +fighting54 +finalfantasy +Findaupair007 +fiorentina +firefighter +firestarter +firstone123 +fishfinger +fitzgerald +fkg7h4f3v6 +fkmnthyfnbdf +fktrcfylh1 +fktrcfylhf +Fktrcfylhf +fktrcfylhjd +fktrcfylhjdbx +fktrcfylhjdf +fktrcfylhjdyf +fktrcfylth +flashlight +flashpoint +flintstone +flvbybcnhfnjh +flvbybcnhfwbz +flyfishing +football10 +football11 +football12 +football123 +football22 +football24 +foreverlove +foreveryoung +forgetmenot +Formatters +forzainter +forzamilan +foundation +frankenstein +frankzappa +frederiksberg +freeaccess +freedom123 +freelancer +freelander +freetraffic +freyfvfnfnf +friendship +friendster +FROINLAVEN +FromVermine +frozenfish +fuckfuckfuck +fuckinglove +fuckingshit +fuck_inside +fuckinside +FUCK_INSIDE +fuckintits +fuckmehard +fuckmylife +fuckoff123 +fuckoff666 +fuckthemall +fucktheworld +fuckthroat +fuckyou123 +fuckyoubitch +fuckyouguys +fufnfrhbcnb +funnybunny +fyfnjkmtdbx +fyfnjkmtdyf +fynfyfyfhbde +g00dPa$$w0rD +galatasara +galatasaray +gamemaster +gangbanged +Gankutsuou1989 +gatekeeper +gblfhfcbyf +gearsofwar +general007 +generation +geniusgenius +GenuineIntel +georgetown +gerasimova +gettysburg +gfhfcjkmrf +gfhfktkjuhfv +gfhfvgfvgfv +gfhjkm1234 +gfhjkm123456 +gfhjkm2011 +gfhjkmgfhjkm +gggggggggg +ghbdtn12345 +ghbdtncerf +ghbdtndctv +ghbdtnghbdtn +ghbdtngjrf +ghbdtnrfrltkf +ghhh47hj764 +ghhh47hj7649 +ghjatccbjyfk +ghjbpdjlcndj +ghjcnbnenrf +ghjcnbnewbz +ghjcnbvtyz +ghjcnhfycndj +ghjcnjabkz +ghjcnjdkfl +ghjcnjgbpltw +ghjcnjgfhjkm +ghjcnjghjcnj +ghjcnjnfr1 +ghjcnjqgfhjkm +ghjcnjrdfibyj +ghjcnjrdfif +ghjgfufylf +ghjnbdjcnjzybt +ghjnbdjufp +ghjrehfnehf +ghjrjgtyrj +ghjuhfvbcn +ghjuhfvvbcn +ghostrecon +ghostrider +ghtdtlvtldtl +ghtpthdfnbd +gianfranco +gilbert2707 +gillingham +girlfriend +gjdtkbntkm +gjhjlfcjqrb +gjikbdctyf +gjkbnjkjubz +gjkyjkeybt +gjkysqgbpltw +gjyjvfhtdf +gjyjvfhtyrj +gjytltkmybr +gladiator5 +godisgreat +godzils4s7 +goldfinger +goldhill25 +Good123654 +goodfellas +goodmorning +googlecheckou +gordolee85 +gossipgirl +grandmaster +grandorgue +grasshopper +greatwhite +greedisgood +greenapple +greenfield +greengrass +greengreen +greenhouse +greenlantern +grimreaper +Groupd2013 +gtasanandreas +gthcgtrnbdf +gthgtylbrekzh +gthtcnhjqrf +gthtrfnbgjkt +gthtrhtcnjr +gtnhj328903 +gtnhjpfdjlcr +guadalajara +guitarhero +gunayka1995 +gundamwing +gunslinger +gunsnroses +gxLMXBeWYm +Gy3Yt2RGLs +H1Y4dUa229 +H2Tmc4g358 +h72sfibbnl +hakunamatata +hallelujah +hammerfall +hammerhead +hammertime +handkerchief +hannover96 +happyhappy +HardwareId +harekrishna +harrypotte +harrypotter +Hd764nW5d7E1vb1 +Hd764nW5d7E1vbv +headhunter +heartagram +heartbreaker +heavymetal +hedimaptfcor +heidelberg +heisenberg +helicopter +hellohello +hellokitty +hellothere +helloworld +hellraiser +hesoyam123 +h_froeschl7 +hhhhhhhhhh +hhhhhhhhhhh +highlander +highschool +hijodeputa +hilaryduff +hjpjxrf23062007 +hocuspocus +hollister1 +hollywood1 +holyspirit +hondacivic +hondas2000 +hondastars +horsepower +housemusic +housewifes +HshFD4n279 +htubcnhfwbz +huangjin1987 +hubbabubba +hubbahubba +hunnybunny +hurricanes +HypnoDanny +iaapptfcor +iamawesome +iampurehaha2 +ibpjahtybz +ibragimova +iddqdiddqd +iddqdidkfa +IdeDeviceP0T +idontknow1 +idspispopd +igeldcheat +ihateniggers +iiiiiiiiii +ilikecheese +ilikepussy +illuminati +iloveboobies +ilovegirls +iloveindia +ilovejesus +ilovemusic +ilovemyfamily +ilovemylife +ilovemyself +ilovepussy +iloveyou11 +iloveyou12 +iloveyou123 +iloveyou143 +iloveyou22 +iloveyoubaby +imagination +imjakie123 +impossible +includecatal +incredible +independent +Infalicall +informatic +information +Information +ingodwetrust +insertions +INSTALLDEVIC +InstallSqlSt +InstallUtil +intelinside +intelligence +interacial +interceptor +intercourse +interfaces +intermilan +internacional +international +intervention +investment +invincible +ipo54tj45uy856 +ironmaiden +iseedeadpeople +isvipebaby +Itachi1995 +itsasecret +ivanivanov +j123456789 +j3qq4h7h2v +jackdaniels +jackhammer +jacksparrow +jacqueline +jamesbond007 +jamesjames +jameslewis +jamiroquai +jasmine123 +jediknight +jedimaster +jeffgordon +jessejames +jesuschris +jesuschrist +jesuscristo +jesusfreak +jesusislord +jesuslives +jesuslovesme +jesussaves +jetbalance +Jhon@ta2011 +jigei743ks +Jimandanne +jjjjjjjjjj +jjjjjjjjjjjj +jkh4545jhk +jlbyjxtcndj +jmhj5464dcx +jNe990pQ23 +jobshop200 +jokerjoker +josephphone7 +juancarlos +juggernaut +juicyfruit +jumpmaster +justforfun +justinbiebe +justinbieber +JwHw6N1742 +jxfhjdfirf +k123456789 +kalashnikov +kalifornia +kaliningrad +kamehameha +kamelia2011 +kanmax1994 +karapetyan +kasablanka +katastrofa +katyakatya +kazakhstan +kbndbytyrj +kbnthfnehf +kbytqrfpkj +kd189nLciH +kensington +keraskeras +keysersoze +kickboxing +kilimanjaro +killer1234 +killkillkill +kingfisher +kirill1995 +kirill1996 +kirill1999 +kirill2002 +kirill2010 +kittykitty +kkkkkkkkkk +klapaucius +KL?benhavn +klubnichka +kmh12025476 +knickerless +knightrider +knucklehead +kobebryant +kolesnikov +kolesnikova +komltptfcor +konovalova +konstantin +kournikova +kozanostra +krasavchik +kravchenko +kriginegor +kristina123 +kristopher +kryptonite +Krzysiek12 +ktjynsq40147 +ktutjyth333 +Kudos4Ever +kurtcobain +kwiatuszek +l0sk2e8S7a +ladyffesta +lalalalala +lamborghini +lamborgini +LarterLarter +lastchance +leadership +leavemealone +Leavemealone +ledzeppelin +leedsunited +left4dead2 +leprechaun +letmein123 +letmeinnow +lfplhfgthvf +lhbjkjubz2957704 +lifeisgood +lighthouse +lightsaber +limon32988 +limpbizkit +lineage123 +linkinpark +lissalissa +littlebear +littlebitch +littlecunt +littlefuck +littlefucker +littlegirl +littlehole +littleminge +littleslut +littlewhore +liverpool1 +Liverpool1 +liverpoolfc +livestrong +lizardsquad +ljcnjtdcrbq +lk9slwGh3x +lkjhgfdsaz +lkjhgfdsazx +llllllllll +lockerroom +LockingServi +lololyo123 +loneranger +lonestar44 +loploprock +losangeles +lost4815162342 +LOST4815162342 +lothlorien +lotrfotr34 +louisvuitton +love777321777 +loveforever +lovehurts1 +loveislife +lovelovelove +loveplanet +lovezp1314 +LP2568cskt +l.qvjdjxrf +lsIA9Dnb9y +luansantana +lucifer666 +luckycharm +luckycharm3 +ludicgirls +lumberjack +luojianhua +lytdybrbdfvgbhf +lytghjgtnhjdcr +Lzhan16889 +m123456789 +m6cJy69u35 +ma123123123 +madagascar +madagaskar +made40media +magical123 +Mailcreated5240 +maintenance +maisuradze +management +manchester +Manchester +manchester1 +manchesterunited +mandarinka +mandragora +mangust6403 +mapet123456 +mapleleafs +marcuseckos +margherita +mariamaria +marinamarina +marinochka +markhegarty +marmeladka +mashamasha +masseffect +massimiliano +master1234 +masterbaiting +masterbate +masterbating +mastercard +masterchief +mastermind +masturbate +masturbation +matchbox20 +matematica +matematika +mathematics +matheus123 +mattylad10 +maurolarastefy +maximilian +maximiliano +maxmotives +mechanical +meditation +metallica1 +metropolis +MeveFalkcakk +michael123 +michaeljackson +michelangelo +mickeymouse +microphone +miguelange +milesdavis +milfhunter +millennium +millerlite +millertime +millionaire +minecraft1 +minecraft123 +minhasenha +minicooper +minnesota_hp +minniemouse +mishaoooyeah +misiaczek1 +mississipp +mississippi +mitsubishi +mmmmmmmmmm +mogwai1976 +momsanaladventure +moneymaker +moneymoney +monkeybutt +monkeynuts +monster123 +monsterkill +montecarlo +montenegro +montgom240 +montgomery +morganstanley +mortalkombat +mostwanted +motdepasse +motherfuck +motherfucker +motherlode +motorcycle +mountaindew +mousemouse +msoracle32re +multimedia +multiplelo +multiplelog +murcielago +musiclover +myjdxtcxks +mypassword +n123456789 +nakedteens +naruto2010 +narutouzumaki +nastya1995 +nastya1996 +nastya1997 +nastya1999 +nastya2010 +nastyanastya +natasha123 +naughtyboy +navigation +nccpl25282 +necromancer +necronomicon +need4speed +needforspeed +ne_e_pod_chehyl +nEMvXyHeqDd5OQxyXYZI +nesterenko +Networkingpe +NetworkingPe +neveragain +nevergiveup +neversaymypassword +neversaynever +neversmile +neverwinter +neworleans +newpassword +newproject2004 +newt7899onrs +newzealand +neznakomka +nhbujyjvtnhbz +nhbybnhjnjkejk +nhecsyfujkjdt +nhfdvfnjkju123 +nhfrnjhbcn +nhfycajhvth +nhfycajhvths +NICK1234-rem936 +Nicrasow212 +nightcrawler +nightmare1 +nightrider +nightshade +nikiforova +nikita1994 +nikita1996 +nikita1997 +nikita1998 +nikita2000 +nikita2002 +nikita2010 +nikita2011 +nikolaevna +ninjamonkey +nintendo64 +nintendods +nissan350z +Nloq_010101 +nnnnnnnnnn +nochnik104 +nokia6230i +nokiadermo +nokianokia +nomeacuerdo +nondriversig +noonehackme +nopassword +nostradamus +nottingham +novosibirsk +nthvbyfnjh +nthvbyfnjh2 +ntktdbpjh1994 +nUADdN9561 +nuttertools +nwctrinity +Oap9UTO293 +oc247ngUcZ +oduvanchik +OlCRackMaster +oldsmobile +olegnaruto +omgkremidia +onetwothree +ontheoutside +ontherocks +oooooooooo +opensesame +operations +ordinateur +orochimaru +P030710P$E4O +p0o9i8u7y6 +p51mustang +p9uJkuf36D +packardbell +painkiller +paintball1 +pandemonium +parabellum +Paraklast1974 +parliament +parolparol +pashademon +passionate +passmaster +passtrader +password00 +password01 +Password01 +password10 +password101 +password11 +password12 +Password12 +password123 +Password123 +password1234 +password13 +password21 +password22 +password23 +password33 +password69 +password88 +password99 +PASSWoRDassword +passwordpassword +passwordstandard +pathfinder +peacemaker +peanutbutter +penetrating +penetration +peppermint +perasperaadastra +percussion +perfectexploiter +perfection +performance +Performing +persephone +peternorth +peterpeter +peugeot406 +pfhfnecnhf +pflhjncndj +pfqwtd27121988 +Phezc419hV +philadelphia +philippines +philosophy +phoenix123 +photography +piggy15708 +pineapple1 +pittsburgh +pjsheridan +playground +playstatio +playstation +playstation2 +playstation3 +plextsofttm +plhfdcndeq +pocahontas +pointblank +pointbreak +poiuytrewq +pokemon123 +polina2005 +polina2008 +polina2009 +polniypizdec0211 +PolniyPizdec0211 +PolniyPizdec1102 +polniypizdec110211 +PolniyPizdec110211 +polopolo09 +ponomarenko +pornografia +pornographic +pornography +pornoporno +porovoz123 +porsche911 +portishead +portsmouth +postov1000 +powerlifting +powerpower +powerrangers +pppppppppp +praetorian +pratap1245 +premiumcash +presidente +prettygirl +primetime21 +princess12 +prisonbreak +ProductId20F +production +professional +programmer +progressive +prokopenko +prometheus +properties +prosperity +protection +providence +psychnaut1 +ptybnxtvgbjy +puertorico +pufunga7782 +pulpfiction +punksnotdead +purplehaze +pussybitch +pussyeater +pussylicker +pussylover +pussypussy +pyfrjvcndf +pyfrjvcndj +q1205199333 +q123123123 +q123456789 +q1234567890 +q1q2q3q4q5 +q1q2q3q4q5q6 +q1w2e3r4t5 +Q1w2e3r4t5 +q1w2e3r4t5y +q1w2e3r4t5y6 +q1w2e3r4t5y6u7 +q1w2e3r4t5y6u7i8 +q1w2e3r4t5y6u7i8o9p0 +q2w3e4r5t6 +q2w3e4r5t6y7 +q80661658441 +qawsedrftg +qawsedrftgyh +qaz123wsx456 +qaz1wsx2edc3 +qaz26101778 +qazwsx1234 +qazwsx12345 +qazwsx123456 +qazwsxedc1 +qazwsxedc12 +qazWSXedc12 +qazwsxedc123 +qazwsxedcrf +qazwsxedcrfv +qazwsxedcrfvtgb +qazwsxqazwsx +qazxswedc123 +qazxswedcvfr +..qlVVcvDeeRo +qpwoeiruty +qq123456789 +qqqqqqqqqq +qrg7t8rhqy +quant4307s +quarantine +queenas8151 +quicksilver +quiksilver +qw12er34ty56 +qwaszxerdfcv +qwaszxqwaszx +Qwe1234567 +qwe123qwe123 +qweasdzxc1 +qweasdzxc12 +qweasdzxc123 +qwerasdfzxcv +qwert12345 +qwert54321 +qwertasdfg +qwertasdfgzxcvb +qwertgfdsa +qwertqwert +qwerttrewq +qwerty123321 +qwerty1234 +qwerty12345 +Qwerty12345 +qwerty123456 +qwerty123456789 +qwerty1992 +qwerty1993 +qwerty2000 +qwerty2010 +qwerty54321 +qwertyasdf +qwertyasdfg +qwertyasdfgh +qwertyqwerty +qwertyu123 +qwertyuiop +QWERTYUIOP +qwertyuiop1 +qwertyuiop10 +qwertyuiop12 +qwertyuiop123 +qwertyuiop12345 +qwertyuiop123456789 +qwertyuiopasdfg +qwertyuiopasdfgh +qwertyuiopasdfghjkl +qwertyytrewq +qwertzuiop +qwqwqwqwqw +r3r3vi3wacc3ss +R3Vi3Wpass +rainbowsix +rainforest +rammstein1 +rangerover +rashley198 +rattlesnake +razorblade +realmadrid +reanimator +redemption +registration +relentless +rendezvous +rerhsybrcs +residentevil +resistance +respublika +retribution +revelation +reviewpass +revolution +reymisterio +reymysterio +rfcgthcrbq +rfgecnfcerf +rfhfrfnbwf +rfhfvtkmrf +rfkbajhybz +rfkbybyuhfl +rfkfiybrjd +rfkmrekznjh +rfnfcnhjaf +rfnfgekmnf +Rfnthbyf1988 +rfnthbyjxrf +rfrfirf123 +rhbcnbyf123 +rhbcnbyjxrf +rhfcyjzhcr +rhfvfnjhcr +richardson +rikitikitavi +riverplate +rjcvtnbxrf +rjhjkmbien +rjirfrgbde +rjkjrjkmxbr +rjycnbnewbz +rjycnfynby +Rjycnfynby +rjyjdfkjdf +rjytwcdtnf +rkfdbfnehf +roadrunner +rockandroll +rockbottom +rockhopper +rockohamster +roflcopter +romanroman +ronaldinho +ronaldinho10 +ronaldo123 +rottweiler +rrrrrrrrrr +rubberduck +ruffryders +runescape1 +runescape123 +s123456789 +s456123789 +sacramento +sagitarius +sagittarius +sailormoon +salamander +salamandra +salmankhan +salocaluimsg +samsung123 +samsungs5230 +sanandreas +sanfrancisco +santaclaus +santaklaus +santamaria +saqartvelo +sasa123321 +sasasasasa +sasha12345 +sashasasha +Sataniv1993 +satisfaction +SaUn24865709 +scandinavian +schoolgirlie +schumacher +scoubidou2 +scoubidou6 +scratchman +scubadiver +sdh686drth +sdicmt7seytn +sebastian1 +seemnemaailm +sektorgaza +selfok2013 +seniseviyor +seo21SAAfd23 +serendipity +serg123111 +sergeevich +sergey2010 +serggalant +sersolution +service321 +sevastopol +sexmachine +sexpistols +sfhj5484fgh +shadow1212 +shakespeare +shamanking +shevchenko +shithappens +showmethemoney +sidewinder +silenthill +silmarillion +silvermoon +silverstar +silverstone +simferopol +simpleplan +skateboard +skateboarding +skateordie +skorpion39 +skylinegtr +skyliner34 +skywalker1 +sleepyhollow +slipknot123 +slipknot66 +slipknot666 +slonopotam +slushslush +sm4llville +smallville +smeshariki +Smokie1994 +snusmumrik +Sojdlg123aljg +solidsnake +something1 +sonnenschein +sonyericsson +Soso123aljg +Soso123bbb +southampton +spam967888 +spartak1922 +spartan117 +SpecialInsta +specialist +specialized +spiderman1 +spiderman2 +spiderman3 +splurgeola +spongebob1 +springfield +sS6z2sw6lU +ssssssssss +stabilmente +stalingrad +stalker123 +stalker2010 +stalker777 +starcraft1 +starcraft2 +stargatesg1 +starscream +starwars12 +starwars123 +statistika +steamforums +stefanescu +stensten12 +stephanie1 +stevesmojo +stickdaddy77 +stinkyfinger +stomatolog +stonehenge +stratocaster +strawberry +streetball +stronghold +studioworks +studmuffin +subhanallah +submission +subscriber +successful +suckmyballs +suckmycock +suckmydick +summer2010 +summertime +sundaypunch +sunderland +sunflower1 +sunglasses +sunshine69 +superduper +superman12 +superman123 +superman69 +SuperManBoy +supermario +supermodel +supernatural +superpower +superpuper +supersonic +supersport +supersuper +supervisor +sutherland +sutvsc5ysaa +svensps820 +svetasveta +sweepstakes +sweetdream +sweetdreams +sweetheart +sweetiepie +sweetpussy +sweetsweet +sylviahans +syncmaster +SyncMaster +syncmaster740n +systemofadown +t123456789 +t34vfrc1991 +t5r4e3w2q1 +table54781 +tadmichaels +tAMwsN3sja +taser334455 +taylormade +tdfyutkbjy +technician +techniques +technology +telecaster +television +TempPassWord +terminator +testing123 +tfjunwptzsjp +thebeatles +thecakeisalie +thegreatone +thesimpsons +thiaguinho +thirteen13 +throatfuck +thugstools +thunder123 +thunderbird +thunderbolt +thundercat +ticketmaster +tigertiger +tigerwoods +tihomirova +timberlake +timberland +timberwolf +tinkerbell +Tojiik85521133 +tokiohotel +TokioHotel +tombraider +tottenham1 +trafficracer +traktorist +transexual +transformer +transformers +transistor +Translator +transporter +travelmate +trustnoone +tttttttttt +tumbleweed +tupacshakur +tylerca310 +ublhjgjybrf +ubnkthrfgen +ubvyfcnbrf +uehby92pac +ufdyfrecjr +ufhhbgjnnth +ujkjdjkjvrf +unbelievable +uncencored +undercover +undergroun +underground +understand +undertaker +underwater +underworld +unforgiven +UninstallSql +uniqueness +universidad +university +userexecute +Usuckballz1 +utyyflmtdyf +uuuuuuuuuu +v123456789 +vaffanculo +valentinka +vanderbilt +vanyarespekt +vbhjndjhtw +vbybcnthcndj +vbyfcnbhbn +vEf6g55frZ +velocidade +venom121293 +verygoodbot +vesy7csae64 +vfhbyfvfhbyf +vfhufhbnrf +vfhvtkflrf +vflfufcrfh +vfntvfnbrf +vfrcbvtyrj +vfrcbvvfrcbv +vfuybnjajy +vfvfgfgf123 +vfvfvskfhfve +vfylfhbyrf +vfylhfujhf +viktorovich +villeneuve +vinogradov +vinogradova +virtuagirl +vitalik123 +vladimirovna +vladislava +vladivostok +volkswagen +volkswagon +volleyball +voxstrange +vp3whbjvp8 +VQsaBLPzLa +Vsavb7rtUI +vSjasnel12 +vtkmybrjdf +vtnhjgjkbnty +vvvvvvvvvv +vyjujltytu +vyjujnjxbt +w123456789w +w1w2w3w4w5 +w2dlWw3v5P +wachtwoord +walkman555 +wallstreet +warhammer40k +washington +waterfalls +watermelon +wazzkaprivet +wcrfxtvgbjy +weaknesspays +webhompass +websolutions +websolutionssu +WebUIValidat +weihnachte +weihnachten +weihnachtsbau +welcome123 +wellington +wenef45313 +werty12345 +westminster +wethepeople +whatthefuck +whatthehell +whitehouse +whitepower +whiterabbit +whosyourdaddy +widescreen +widespread +wildflower +winchester +winnipeg261 +winstonone +wishmaster +witchblade +wolfenstein +wolverines +wonderland +wonderwall +wonderwoman +wrestling1 +writerspace +wsx22wsx22 +wutangclan +wwwooo1234 +wwwwwwwwww +xiaoyuA123 +xpressmusic +xtkjdtrgfer +xxPa33bq.aDNA +xxxp455w0rd5 +xxxxxxxxxx +yanshi1982 +ybrjkftdbx +ybrjkftdyf +yfcnhjtybt +yfcnzyfcnz +yflz13041976 +yfnfif2010 +yfnfitymrf +yjdjrepytwr +yjdjvjcrjdcr +yjdsqgfhjkm +yK66o2kzpZ +yoshimitsu +youngmoney +yourmother +ytdpkjvfti +ytpfdbcbvjcnm +ytpyfrjvrf +ytrhjvfycth +ytrhjvfyn10 +yurkamaliy +z123456789 +z1234567890 +z1x2c3v4b5 +z1x2c3v4b5n6 +z1x2c3v4b5n6m7 +z1z2z3z4z5 +zaq12wsxcde3 +zaq1xsw2cde3 +zaqwsxcderfv +zaqxswcde123 +zaratustra +zcfvfzkexifz +zcfvfzrhfcbdfz +zcxfcnkbdf +zcxfcnkbdfz +zelenograd +zexts364325 +zghjcnjcegth +zjses9evpa +zn87x54mxma +zobrdjlrb1 +zQjphsyf6ctifgu +zsxmr7sztmr +zx123456789 +zxcasdqwe123 +zxcvasdfqwer +zxcvb09876 +zxcvb12345 +Zxcvb12345 +zxcvbasdfg +zxcvbn123456 +zxcvbn3215 +zxcvbnm123 +zxcvbnm123456789 +zxcvbnmmnbvcxz +zxcvbnmzxcvbnm +zxcvbzxcvb +zzzzzzzzzz \ No newline at end of file diff --git a/lib/common_passwords/common_passwords.rb b/lib/common_passwords/common_passwords.rb index 9925b60827..47ef7c5ec0 100644 --- a/lib/common_passwords/common_passwords.rb +++ b/lib/common_passwords/common_passwords.rb @@ -1,5 +1,7 @@ # CommonPasswords will check a given password against a list of the most commonly used passwords. -# The list comes from https://xato.net/passwords/more-top-worst-passwords/#.UrR1AHmpxs4 +# The list comes from https://github.com/danielmiessler/SecLists/tree/master/Passwords +# specifically the list of 10 million passwords, top 100k, filtered by length +# # The list is stored in Redis at a key that is shared by all sites in a multisite config. # # If the password file is changed, you need to add a migration that deletes the list from redis @@ -9,7 +11,7 @@ class CommonPasswords - PASSWORD_FILE = File.join(Rails.root, 'lib', 'common_passwords', 'long-common-passwords.txt') + PASSWORD_FILE = File.join(Rails.root, 'lib', 'common_passwords', '10-char-common-passwords.txt') LIST_KEY = 'discourse-common-passwords' @mutex = Mutex.new diff --git a/lib/common_passwords/long-common-passwords.txt b/lib/common_passwords/long-common-passwords.txt deleted file mode 100755 index 72e120360c..0000000000 --- a/lib/common_passwords/long-common-passwords.txt +++ /dev/null @@ -1,2086 +0,0 @@ -password -12345678 -baseball -football -jennifer -superman -trustno1 -michelle -sunshine -123456789 -starwars -computer -corvette -princess -iloveyou -maverick -samantha -steelers -whatever -hardcore -internet -mercedes -bigdaddy -midnight -11111111 -marlboro -victoria -butthead -startrek -liverpoo -danielle -redskins -mountain -shithead -xxxxxxxx -88888888 -nicholas -metallic -qwertyui -dolphins -cocacola -rush2112 -jonathan -scorpion -asdfasdf -godzilla -williams -lifehack -platinum -garfield -69696969 -jordan23 -bullshit -airborne -elephant -explorer -christin -december -benjamin -dickhead -brooklyn -redwings -michigan -87654321 -guinness -einstein -snowball -alexande -passw0rd -lasvegas -slipknot -kimberly -1q2w3e4r -carolina -colorado -creative -bollocks -darkness -asdfghjk -poohbear -nintendo -november -password1 -lacrosse -paradise -maryjane -spitfire -anderson -cherokee -drowssap -marshall -1qaz2wsx -caroline -franklin -snickers -courtney -westside -patricia -semperfi -freeuser -babygirl -champion -softball -security -wildcats -veronica -abcd1234 -wolverin -remember -freepass -pearljam -mistress -peekaboo -budlight -electric -stargate -brittany -swimming -scotland -swordfis -blink182 -virginia -passport -aaaaaaaa -rolltide -bulldogs -liverpool -chevelle -mitchell -spiderma -patriots -cardinal -kawasaki -ncc1701d -airplane -scarface -elizabet -wolfpack -lawrence -american -stingray -simpsons -srinivas -panthers -pussycat -loverboy -tarheels -wolfgang -testtest -michael1 -pakistan -infinity -letmein1 -hercules -billybob -pavilion -changeme -darkside -zeppelin -darkstar -charlie1 -wrangler -qwerty12 -bobafett -business -sterling -babydoll -cheyenne -longhorn -presario -mustang1 -21122112 -q1w2e3r4 -12341234 -devildog -bluebird -metallica -access14 -enterpri -blizzard -asdf1234 -harrison -thailand -1234567890 -cadillac -hellfire -lonewolf -12121212 -fireball -precious -engineer -basketba -valentin -wetpussy -morpheus -hotstuff -fuck_inside -goldberg -wrinkle1 -consumer -serenity -99999999 -bigboobs -chocolat -christia -birthday -stephani -1234qwer -98765432 -77777777 -highland -seminole -airforce -hamilton -buckeyes -abcdefgh -goldfish -deftones -icecream -pleasure -juventus -ncc1701e -51505150 -cavalier -aardvark -babylon5 -savannah -yankees1 -fredfred -concrete -shamrock -atlantis -wordpass -predator -marathon -montreal -kathleen -jessica1 -diamonds -stallion -letmein2 -clitoris -sundance -renegade -hollywoo -hello123 -sweetpea -stocking -campbell -christop -rockstar -geronimo -chandler -lovelove -greenday -987654321 -creampie -trombone -55555555 -mongoose -tottenha -butterfl -clifford -fuckyou2 -infantry -skywalke -raistlin -vanhalen -sherlock -dietcoke -ultimate -superfly -freedom1 -drpepper -lesbians -musicman -warcraft -microsoft -morrison -isabelle -thuglife -stonecol -logitech -florence -1passwor -bluemoon -22222222 -stardust -margaret -66666666 -charlott -waterloo -11223344 -standard -alexandr -hannibal -frontier -welcome1 -spanking -japanese -kristina -deepthroat -bonehead -showtime -squirrel -mustangs -septembe -leonardo -makaveli -vacation -passwor1 -columbia -napoleon -motorola -william1 -matthew1 -robinson -penguins -8j4ye3uz -californ -qwertyuiop -portland -asdfghjkl -overlord -stranger -socrates -spiderman -13131313 -national -intrepid -megadeth -bigballs -chargers -discover -isabella -megapass -grateful -mushroom -cristina -hongkong -basketball -satan666 -kingkong -penelope -thompson -anything -knickers -playtime -lightnin -slapshot -titleist -werewolf -fernando -blackcat -tacobell -kittycat -thunder1 -thankyou -scoobydo -coltrane -lonestar -heather1 -beefcake -zzzzzzzz -personal -anthony1 -fuckface -lowrider -punkrock -dodgeram -dingdong -qqqqqqqq -johnjohn -asshole1 -crusader -syracuse -meridian -turkey50 -keyboard -ilovesex -blackman -richmond -sandiego -cooldude -mariners -caliente -fletcher -porsche9 -kangaroo -springer -goodtime -chelsea1 -freckles -nebraska -webmaster -blueeyes -director -monopoly -blackjac -southern -peterpan -fuckyou1 -a1b2c3d4 -sentinel -richard1 -1234abcd -guardian -candyman -mandingo -munchkin -billyboy -rootbeer -assassin -frederic -giovanni -scarlett -achilles -warriors -plymouth -cameltoe -fuckfuck -sithlord -backdoor -chevrole -lorraine -cosworth -eternity -verbatim -chocolate -deadhead -pineappl -rosemary -porkchop -blackdog -alexander -valhalla -santiago -portugal -1qazxsw2 -stripper -sebastia -hurrican -1x2zkg8w -atlantic -hyperion -44444444 -skittles -hastings -gangbang -sailboat -immortal -maryland -columbus -beautiful -swordfish -ncc1701a -spartans -threesom -dilligaf -pinkfloy -catalina -formula1 -scooter1 -colombia -lancelot -angelica -rockhard -poontang -starship -starbuck -catherin -kentucky -33333333 -12344321 -sapphire -raiders1 -excalibu -imperial -phillips -golfball -front242 -macdaddy -qwer1234 -cowboys1 -dannyboy -martinez -aquarius -pppppppp -clarence -eatpussy -beatrice -phillies -research -gggggggg -doughboy -lollipop -qazwsxed -crazybab -brothers -butthole -rightnow -greatone -gateway1 -wildfire -jackson1 -0.0.0.000 -snuggles -phoenix1 -technics -gesperrt -brucelee -woofwoof -theodore -richards -punisher -username -bunghole -elizabeth -lifetime -masterbate -diamond1 -abnormal -davidson -starfish -penetration -michaela -caligula -railroad -bradford -military -bearbear -patrick1 -christine -swinging -labrador -justdoit -meatball -saturday -defender -piercing -microsof -mechanic -robotech -universe -newpass6 -hellyeah -zaq12wsx -spectrum -jjjjjjjj -oklahoma -mmmmmmmm -blueblue -wolverine -sniffing -keystone -bbbbbbbb -handsome -tttttttt -ssssssss -somethin -melissa1 -marcius2 -godsmack -rangers1 -deeznuts -kingston -yosemite -tommyboy -masterbating -marianne -happyday -manchest -unbelievable -aberdeen -nathalie -intercourse -supersta -bcfields -hardrock -children -commando -sinclair -squerting -jeanette -meathead -gandalf1 -magnolia -kenworth -redalert -homemade -webmaste -insertion -temptress -gretchen -celebrity -ragnarok -trinidad -kingfish -blackhaw -thursday -meatloaf -interacial -streaming -pertinant -pool6123 -animated -gordon24 -fantasies -touching -homepage -ejaculation -whocares -jamesbon -amsterda -february -luckydog -businessbabe -brandon1 -experience -software -thirteen -rasputin -greenbay -pa55word -contortionist -sneakers -sonyfuck -test1234 -roadkill -cheerleaers -madeline -christian -brighton -housewifes -emmanuel -bigmoney -seductive -sexygirl -canadian -gangbanged -crawford -hotpussy -implants -intruder -andyod22 -barcelon -chainsaw -chickens -downtown -magicman -clevelan -designer -budweise -experienced -pitchers -passwords -jeremiah -alliance -halflife -saratoga -positive -transexual -close-up -sunnyday -starfire -pictuers -testing1 -tiberius -lisalisa -golfgolf -flounder -majestic -trailers -mikemike -whitesox -angelina -goodluck -charlton -fingerig -gallaries -lockerroom -treasure -absolutely -homepage- -beerbeer -testerer -fordf150 -pa55w0rd -kamikaze -japanees -masterbaiting -callaway -panasoni -housewife -18436572 -sullivan -terrapin -masturbation -hardcock -freeporn -pornographic -traveler -moneyman -shopping -thumbnils -amateurs -apollo13 -goldwing -doghouse -pounding -truelove -underdog -wrestlin -sherwood -johannes -balloons -happy123 -flamingo -paintbal -llllllll -twilight -christie -bullseye -knickerless -binladen -peterson -thanatos -albatros -getsdown -nwo4life -underwear -dddddddd -deeznutz -enterprise -misfit99 -solution -meredith -barefoot -50spanks -scandinavian -original -shannon1 -techniques -chemical -salvador -manchester -buckshot -thegreat -goldstar -triangle -kristine -snowboar -penetrating -roadking -rockford -chicago1 -ferrari1 -galeries -godfathe -gargoyle -gangster -pussyman -pooppoop -newcastl -mortgage -snoopdog -assholes -property -broadway -butterfly -earthlink -westwood -blackbir -slippery -pianoman -tomorrow -roadrunn -attitude -seahawks -tunafish -cinnamon -northern -23232323 -zerocool -limewire -films+pic+galeries -francois -fuckthis -girfriend -uncencored -chrisbln -netscape -hhhhhhhh -knockers -tazmania -pharmacy -arsenal1 -anaconda -australi -gotohell -bulldog1 -monalisa -whiteout -james007 -bitchass -southpar -lionking -megatron -hawaiian -gymnastic -panther1 -wp2003wp -passwort -friendly -oooooooo -bullfrog -holyshit -jasmine1 -sergeant -babyblue -pass1234 -poseidon -confused -hollywood -insertions -juliette -hayabusa -hawkeyes -geoffrey -chuckles -hounddog -philippe -thunderb -marino13 -handyman -cerberus -gamecock -magician -preacher -chrysler -contains -hedgehog -hoosiers -dutchess -wareagle -ihateyou -sunflowe -senators -terminal -laurence -maradona -america1 -chicken1 -passpass -r2d2c3po -myxworld -missouri -wishbone -infiniti -wonderboy -stanford -smeghead -titanium -charlene -fishing1 -fullmoon -absolute -seinfeld -pingpong -matthews -recovery -babyface -gladiato -paranoid -packers1 -longjohn -clarinet -mortimer -modelsne -vladimir -together -avalanch -55bgates -cccccccc -paradigm -operator -valencia -cocksuck -creature -borussia -browning -heritage -millions -starcraf -spaceman -chester1 -rrrrrrrr -sandwich -magazine -buttfuck -yeahbaby -11235813 -bangbang -charles1 -ffffffff -doberman -overkill -claymore -brewster -electron -eastside -minimoni -wildbill -wildcard -yyyyyyyy -sweetnes -skywalker -alphabet -babybaby -graphics -florida1 -flexible -fuckinside -ursitesux -christma -wwwwwwww -just4fun -rebecca1 -adrienne -19691969 -silverad -rhiannon -10101010 -ashleigh -qwerasdf -presiden -newyork1 -brigitte -buddyboy -heineken -millwall -beautifu -sinister -smashing -teddybea -ticklish -lipstick -reynolds -applepie -digital1 -dinosaur -icehouse -insanity -bluefish -strength -sentnece -temppass -medicine -hahahaha -casanova -fountain -dolphin1 -porsche1 -vampires -highheel -kkkkkkkk -illinois -21212121 -stonecold -testpass -jiggaman -federico -scorpio1 -rt6ytere -madison1 -coolness -christina -coldbeer -brittney -washingt -stephanie -shepherd -tiffany1 -mephisto -dragonba -nygiants -password2 -corleone -kittykat -vikings1 -splinter -pipeline -meowmeow -chestnut -longdong -quant4307s -eastwood -moonligh -illusion -jayhawks -swingers -stefanie -jefferso -michael2 -fastball -scrabble -dirtbike -customer -nemrac58 -bobdylan -hopeless -kcj9wx5n -killbill -volkswag -windmill -iloveyou1 -starligh -soulmate -mcdonald -rochelle -oblivion -valkyrie -concorde -costello -delaware -nocturne -herewego -earnhard -eeeeeeee -mobydick -reddevil -reckless -radiohea -coolcool -classics -choochoo -wireless -bigblock -summer99 -sexysexy -platypus -telephon -12qwaszx -fishhead -paramedi -lonesome -katherin -moonbeam -monster1 -monkeybo -windsurf -31415926 -sebastian -smoothie -snowflak -playstat -playboy1 -roadster -hardware -captain1 -undertak -uuuuuuuu -criminal -1a2b3c4d -thedoors -annabell -catwoman -faithful -farscape -genesis1 -pumpkins -training -islander -jamesbond -19841984 -shitface -maxwell1 -armstron -alejandr -augustus -care1839 -fantasia -freefall -sandrine -qwerqwer -crystal1 -nineinch -broncos1 -winston1 -warrior1 -iiiiiiii -iloveyou2 -straight -specialk -tinkerbe -jellybea -cbr900rr -gabriell -gertrude -glennwei -sausages -vanguard -trinitro -eldorado -whiskers -wildwood -istheman -interest -25802580 -woodland -strawber -amsterdam -catherine -football1 -vancouve -vauxhall -acidburn -myspace1 -buttercu -minemine -bigpoppa -blackout -blowfish -talisman -sundevil -shanghai -spencer1 -slowhand -jonathon -michaels -resident -redbaron -andromed -harddick -5wr2i7h8 -charlotte -fredrick -francesc -ferguson -fairlane -dogpound -pornporn -clippers -daylight -nnnnnnnn -budapest -whistler -whatwhat -wanderer -idontkno -thisisit -robotics -gonzalez -drummer1 -private1 -cornwall -christopher -corvet07 -iverson3 -bluesman -terminat -johnson1 -bastards -fuckoff1 -doomsday -pornking -bookworm -highbury -mischief -ministry -bigbooty -yogibear -september -lkjhgfds -123123123 -carpedie -foxylady -gatorade -valdepen -deadpool -hotmail1 -kordell1 -vvvvvvvv -jackson5 -bergkamp -zanzibar -services -sheridan -checkers -luv2epus -rainbow6 -qwerty123 -commande -nightwin -hotmail0 -enternow -viewsoni -berkeley -woodstoc -starstar -patience -hawaii50 -gorgeous -challeng -callisto -firewall -firefire -passmast -transfer -clarissa -moonshin -jakejake -bluejays -southpark -tomahawk -leedsutd -jermaine -jeepster -josephin -matthias -marriage -antelope -cabernet -cheshire -california -fuckhead -dominion -trucking -nostromo -honolulu -dynamite -mollydog -windows1 -washburn -vincent1 -irishman -bearcats -sylveste -marijuan -reddwarf -12312312 -hardball -goldfing -chambers -fandango -festival -scrapper -cromwell -entrance -klondike -mohammed -insomnia -24682468 -24242424 -billbill -blessing -solitude -pimpdadd -johndeer -babylove -barbados -carpente -fishbone -fireblad -scissors -screamer -obsidian -progress -tottenham -comanche -monsters -veronika -20202020 -blueball -yankees2 -wrestler -sealteam -sidekick -smackdow -sporting -remingto -arkansas -andersen -barcelona -baltimor -fortress -fishfish -firefigh -rsalinas -dontknow -universa -heinrich -enforcer -katherine -waterboy -23skidoo -zildjian -stoppedby -sexybabe -speakers -polopolo -perfect1 -thrasher -lakeside -masamune -cherries -chipmunk -cezer121 -carnival -fearless -funstuff -salasana -pantera1 -qwert123 -creation -nascar24 -estrella -erection -ericsson -internal -1michael -19781978 -25252525 -sheepdog -snowbird -toriamos -tennesse -mazdarx7 -revolver -babycake -hallowee -cannabis -dolemite -dodgers1 -painting -coventry -christmas -cocksucker -hotgirls -eggplant -mustang6 -monkey12 -wapapapa -volleyba -birthday4 -stephen1 -suburban -soccer10 -something -starcraft -soccer12 -plastics -penthous -peterbil -lakewood -reginald -goodgirl -gotyoass -capricor -getmoney -godfather -gilligan -dudedude -pasadena -opendoor -magellan -printing -pressure -killkill -whiteboy -voyager1 -jackjack -success1 -spongebo -phialpha -password9 -tickling -lexingky -redheads -apple123 -backbone -aviation -green123 -carlitos -cartman1 -camaross -favorite6 -ginscoot -sabrina1 -devil666 -doughnut -paintball -rainbow1 -umbrella -abc12345 -complete -deerhunt -darklord -holidays -hetfield -hillbill -hugetits -evolutio -whiplash -wg8e3wjf -istanbul -bluebell -wrestling -superior -suckdick -stephane -playball -marcello -marjorie -rockwell -baritone -gladiator -cricket1 -clemente -exchange -kisskiss -kristian -montecar -mississi -washington -20012001 -bigdick1 -penguin1 -pathfind -testibil -lightning -lighting -republic -anthony7 -goldeney -cameron1 -freefree -screwyou -passthie -postov1000 -puppydog -a1234567 -cleopatr -contract -buffalo1 -bordeaux -sunlight -sprinter -peaches1 -pinetree -theforce -jupiter1 -mckenzie -annmarie -austin31 -78945612 -calimero -chevrolet -favorite -fellatio -f00tball -francine -gateway2 -gamecube -giovanna -scheisse -offshore -macaroni -pringles -trouble1 -coolhand -colonial -darthvad -cygnusx1 -natalie1 -eighteen -elcamino -blueberr -yamahar1 -stafford -snowboard -speedway -playboy2 -toonarmy -mariposa -baberuth -gonzales -chiquita -charisma -capslock -cashmone -gizmodo1 -dragonfl -rachelle -tropical -crescent -nathanie -espresso -kikimora -20002000 -birthday1 -beatles1 -bigdicks -beethove -blacklab -woodwork -survivor -pinnacle -lemonade -lalakers -lebowski -lalalala -mercury1 -rocknrol -riversid -11112222 -alleycat -ambrosia -australia -hattrick -cassandr -charlie123 -fighting -gabriela -outoutout -pussy123 -randolph -coldplay -novifarm -notredam -honeybee -wednesda -waterfal -billabon -zachary1 -01234567 -superstar -stiletto -sigmachi -somerset -smithers -playmate -pinkfloyd -laetitia -revoluti -archange -handball -chewbacc -fullback -dominiqu -mandrake -vagabond -csfbr5yy -deadspin -ncc74656 -houston1 -hurricane -horseman -virginie -idontknow -151nxjmt -bendover -surprise -supernov -phantom1 -playoffs -johngalt -maserati -riffraff -architec -cambridg -foreplay -sanity72 -salesman -dreaming -palmtree -luckyone -treefrog -usmarine -darkange -cyclones -bubba123 -building -eclipse1 -kayleigh -mustang2 -bigtruck -yeahyeah -stickman -skipper1 -singapor -southpaw -slamdunk -therock1 -tiger123 -mccarthy -13576479 -greywolf -candyass -catfight -frankie1 -qazwsxedc -pregnant -death666 -negative -hooligan -everlast -mulligan -motocros -waterman -inspiron -bigblack -zaq1xsw2 -yy5rbfsc -takehana -skydiver -special1 -slimshad -sopranos -patches1 -thething -mash4077 -matchbox -14789632 -amethyst -baseball1 -greenman -goofball -castillo -capitals -favorite2 -forsaken -feelgood -gfxqx686 -dilbert1 -dukeduke -downhill -longhair -lockdown -mamacita -rainyday -pumpkin1 -prospect -rainbows -trinity1 -trooper1 -citation -bukowski -bubbles1 -humphrey -kcchiefs -morticia -montrose -154ugeiu -year2005 -wonderfu -tampabay -slapnuts -spartan1 -sprocket -sometime -stanley1 -thinking -lavalamp -laserjet -jediknig -mazda626 -alexandra -hairball -graduate -cartoons -cashflow -outsider -mallrats -primetime21 -valleywa -abcdefg1 -natedogg -nineball -normandy -nicetits -buddy123 -highlife -earthlin -eatmenow -kirkland -money123 -warhamme -instinct -jackass1 -20spanks -blackjack -085tzzqi -383pdjvl -sparhawk -pavement -johnston -material -melanie1 -redlight -aolsucks -alexalex -b929ezzh -goodyear -griffith -863abgsg -carebear -checkmat -forgetit -rushmore -question -ptfe3xxp -prophecy -aircraft -access99 -cocktail -civilwar -cleveland -claudia1 -dapzu455 -daisydog -eldiablo -kingrich -mudvayne -vipergts -italiano -innocent -yqlgr667 -zxcvbnm1 -suckcock -stephens -380zliki -sexylady -sixtynin -sleeping -sparkles -letsdoit -landmark -marauder -register -basebal1 -azertyui -hawkwind -capetown -flathead -fisherma -flipmode -gabriel1 -dreamcas -dirtydog -dickdick -destiny1 -trumpet1 -aaaaaaa1 -conquest -creepers -constant -cornhole -nirvana1 -elisabet -musician -milamber -isacs155 -1million -1letmein -stonewal -sexsexsex -sonysony -smirnoff -pentagon -paulpaul -lighthou -letmein22 -letmesee -merchant -redstorm -14141414 -allison1 -basement -hartford -hardwood -fatluvr69 -fidelity -feathers -gogators -general1 -dragon69 -dragonball -papillon -optimist -longshot -undertow -copenhag -delldell -culinary -ibilltes -hihje863 -envelope -express1 -mustang5 -wellingt -waterski -infinite -iloveyou! -063dyjuy -survival -stockton -softtail -slimed123 -pizzaman -pathetic -tigercat -jennings -rootedit -riverrat -atreides -happines -chadwick -ffvdj474 -foreskin -gameover -scoobydoo -saxophon -macintos -lollypop -qwertzui -adelaide -acapulco -cybersex -davecole -davedave -nineteen -highlander -kristin1 -knuckles -katarina -montana1 -wingchun -watching -illmatic -bigpenis -blue1234 -xxxxxxx1 -svetlana -368ejhih -playstation -pescator -jo9k2jw2 -jupiter2 -jurassic -marines1 -14725836 -12345679 -alessand -angelika -alpha123 -barefeet -badabing -gsxr1000 -gregory1 -766rglqy -69camaro -calendar -fishcake -giuseppe -gnasher23 -fuzzball -save13tx -russell1 -dripping -dragon12 -dragster -mainland -poophead -porn4life -producer -rapunzel -velocity -vanessa1 -trueblue -vampire1 -navyseal -nightowl -nonenone -nightmar -bulletin -hillside -hzze929b -hellohel -edgewise -embalmer -excalibur -mounta1n -muffdive -vivitron -winfield -wednesday -17171717 -17011701 -tangerin -stewart1 -summer69 -sweetness -surveyor -stirling -ssptx452 -thriller -master12 -anastasi -almighty -argentin -flanders -flyers88 -firehawk -flashman -godspeed -giveitup -funtimes -frenchie -disaster -lovelife -qcmfd454 -undertaker -911turbo -cristian -daughter -notebook -borabora -brisbane -mohammad -bettyboo -blackice -yvtte545 -tailgate -shitshit -sooners1 -smartass -pennywis -thetruth -reindeer -allstate -greatest -caldwell -fussball -geneviev -samadams -dipstick -losangel -loverman -pussy4me -university -troubles -churchil -crazyman -cutiepie -bullwink -bulldawg -horsemen -escalade -minnesot -moonlight -mwq6qlzo -verygood -bellagio -sickness -skeeter1 -phaedrus -thumper1 -tmjxn151 -thematri -letmeinn -jeffjeff -johnmish -11001001 -allnight -amatuers -attorney -happyman -graywolf -474jdvff -551scasi -fishtank -freewill -glendale -frogfrog -gerhardt -scirocco -devilman -pallmall -lunchbox -manhatta -mandarin -pxx3eftp -president -chris123 -daedalus -natasha1 -nancy123 -nevermin -newcastle -edmonton -monterey -violator -wildstar -winter99 -iqzzt580 -19741974 -1q2w3e4r5t -bigbucks -blackcoc -yesterda -skinhead -shadow12 -snapshot -soccer11 -pleasant -pimpdaddy -lionhear -littlema -lincoln1 -laughing -redshift -12locked -arizona1 -alfarome -hawthorn -goodfell -554uzpad -flipflop -garrison -rustydog -sandberg -samsung1 -dreamer1 -detectiv -dominick -paladin1 -papabear -panasonic -nyyankee -pussyeat -princeto -climbing -dad2ownu -daredevi -necklace -huskers1 -hornyman -england1 -motherfucker -ilovegod -201jedlz -wrinkle5 -zoomzoom -09876543 -starlite -peternorth -jeepjeep -joystick -junkmail -jojojojo -rockrock -rasta220 -andyandy -auckland -gooseman -happydog -charlie2 -cardinals -fortune12 -generals -division -ozlq6qwm -macgyver -mallorca -prelude1 -trousers -aerosmit -clueless -delpiero -nounours -buckaroo -honeydew -hooters1 -hugohugo -evangeli \ No newline at end of file diff --git a/lib/common_passwords/short-common-passwords.txt b/lib/common_passwords/short-common-passwords.txt deleted file mode 100644 index d6f602362c..0000000000 --- a/lib/common_passwords/short-common-passwords.txt +++ /dev/null @@ -1,7914 +0,0 @@ -123456 -1234 -qwerty -12345 -dragon -pussy -letmein -monkey -696969 -abc123 -mustang -michael -shadow -master -111111 -2000 -jordan -harley -1234567 -fuckme -hunter -fuckyou -ranger -buster -thomas -tigger -robert -soccer -fuck -batman -test -pass -killer -hockey -george -charlie -andrew -love -jessica -asshole -6969 -pepper -daniel -access -654321 -joshua -maggie -silver -william -dallas -yankees -123123 -ashley -666666 -hello -amanda -orange -biteme -freedom -sexy -thunder -nicole -ginger -heather -hammer -summer -taylor -fucker -austin -1111 -merlin -matthew -121212 -golfer -cheese -martin -chelsea -patrick -richard -diamond -yellow -bigdog -secret -asdfgh -sparky -cowboy -camaro -anthony -matrix -falcon -bailey -guitar -jackson -purple -scooter -phoenix -aaaaaa -morgan -tigers -porsche -mickey -cookie -nascar -peanut -justin -131313 -money -horny -panties -joseph -snoopy -boomer -iceman -smokey -gateway -dakota -cowboys -eagles -chicken -dick -black -zxcvbn -please -andrea -ferrari -knight -melissa -compaq -coffee -booboo -bitch -johnny -bulldog -xxxxxx -welcome -james -player -ncc1701 -wizard -scooby -charles -junior -bigdick -mike -brandy -tennis -blowjob -banana -monster -spider -lakers -miller -rabbit -enter -brandon -steven -fender -john -yamaha -diablo -chris -boston -tiger -marine -chicago -rangers -gandalf -winter -bigtits -barney -edward -raiders -porn -badboy -blowme -spanky -johnson -chester -london -blue -fishing -000000 -hannah -slayer -rachel -sexsex -redsox -thx1138 -asdf -panther -zxcvbnm -arsenal -oliver -qazwsx -mother -7777777 -jasper -angel -david -winner -crystal -golden -viking -jack -iwantu -shannon -murphy -angels -prince -cameron -girls -madison -wilson -carlos -hooters -willie -captain -maddog -jasmine -butter -booger -angela -golf -lauren -rocket -tiffany -theman -dennis -flower -forever -green -jackie -muffin -turtle -sophie -toyota -jason -sierra -winston -debbie -giants -packers -newyork -jeremy -casper -bubba -112233 -sandra -lovers -united -cooper -driver -tucker -helpme -fucking -pookie -lucky -maxwell -8675309 -bear -suckit -gators -5150 -222222 -fuckoff -jaguar -monica -fred -happy -hotdog -tits -gemini -lover -777777 -canada -nathan -victor -florida -rosebud -doctor -trouble -success -stupid -tomcat -warrior -peaches -apples -fish -magic -buddy -rainbow -gunner -987654 -freddy -alexis -braves -cock -2112 -1212 -xavier -dolphin -testing -bond007 -member -calvin -voodoo -7777 -samson -alex -apollo -fire -tester -walter -beavis -voyager -peter -porno -bonnie -beer -apple -scorpio -skippy -sydney -scott -red123 -power -gordon -travis -beaver -star -jackass -flyers -boobs -232323 -zzzzzz -steve -rebecca -doggie -legend -ou812 -yankee -blazer -bill -runner -birdie -bitches -555555 -parker -topgun -heaven -viper -animal -2222 -bigboy -4444 -arthur -baby -private -donald -phantom -dave -rock -august -sammy -cool -brian -jake -bronco -paul -mark -frank -heka6w2 -copper -billy -cumshot -willow -cunt -little -carter -slut -albert -kitten -super -eagle1 -shelby -america -11111 -jessie -house -free -123321 -chevy -white -broncos -horney -surfer -nissan -999999 -saturn -marvin -shit -action -adidas -qwert -kevin -1313 -walker -police -wolf -sweet -therock -king -online -teresa -cricket -sharon -dexter -racing -penis -gregory -0000 -teens -dreams -hentai -magnum -nothing -donkey -trinity -digital -333333 -stella -cartman -123abc -speedy -buffalo -kitty -pimpin -eagle -kelly -nelson -nirvana -vampire -xxxx -playboy -louise -pumpkin -test123 -girl -sucker -mexico -beatles -fantasy -ford -gibson -celtic -marcus -cherry -cassie -888888 -natasha -sniper -chance -genesis -hotrod -reddog -college -jester -bigcock -smith -carmen -3333 -death -1q2w3e -eclipse -stanley -samuel -drummer -homer -montana -music -aaaa -spencer -jimmy -hello1 -rocky -goober -friday -scotty -abcdef -bubbles -hawaii -fluffy -mine -stephen -horses -thumper -5555 -pussies -pamela -boobies -buddha -vanessa -sandman -naughty -douglas -honda -matt -azerty -6666 -shorty -money1 -beach -loveme -4321 -simple -444444 -badass -destiny -sarah -denise -vikings -lizard -melanie -assman -sabrina -water -good -howard -time -123qwe -xxxxx -october -leather -bastard -young -101010 -extreme -hard -vincent -pussy1 -hotmail -spooky -amateur -alaska -badger -poop -crazy -mozart -video -russell -vagina -norman -eric -cougar -barbara -long -420420 -family -horse -enigma -allison -raider -brazil -blonde -jones -55555 -dude -jeff -school -lovely -jeffrey -booty -molly -leslie -nipples -diesel -rocks -eminem -suzuki -daddy -passion -hummer -ladies -zachary -frankie -elvis -reggie -alpha -suckme -simpson -147147 -pirate -tommy -jupiter -redrum -wanker -stinky -ducati -paris -natalie -bishop -windows -spirit -pantera -monday -patches -brutus -houston -smooth -penguin -marley -forest -cream -212121 -flash -maximus -nipple -bobby -bradley -vision -pokemon -fireman -indian -picard -system -clinton -cobra -enjoy -lucky1 -claire -claudia -boogie -timothy -marines -dirty -admin -pimp -dancer -hardon -fucked -abcdefg -ironman -great -bigred -squirt -justice -francis -hobbes -kermit -mercury -domino -9999 -denver -brooke -rascal -hitman -simon -tony -bbbbbb -friend -naked -sluts -saints -bondage -bigman -zombie -duke -qwerty1 -babes -disney -rooster -brenda -mookie -candy -duncan -olivia -hunting -alicia -8888 -samsung -bubba1 -whore -general -erotic -liberty -arizona -jesus -abcd -newport -skipper -balls -happy1 -galore -christ -weasel -242424 -wombat -digger -classic -poopoo -accord -popcorn -turkey -jenny -amber -bunny -mouse -007007 -titanic -dreamer -everton -friends -carrie -gabriel -psycho -nemesis -burton -pontiac -connor -eatme -lickme -roland -cumming -ireland -lincoln -arnold -goblue -devils -eugene -empire -asdfg -brown -shaggy -froggy -qwer -kodiak -people -phpbb -light -54321 -kramer -chopper -hooker -honey -whynot -lesbian -lisa -baxter -adam -snake -teen -qqqqqq -britney -avalon -sandy -sugar -sublime -stewart -wildcat -raven -123654 -trucks -pervert -raymond -redhead -alyssa -bambam -movie -woody -shaved -snowman -tiger1 -chicks -raptor -1969 -shooter -france -stars -madmax -kristen -sports -jerry -789456 -garcia -lights -ryan -looking -chronic -alison -hahaha -packard -hendrix -perfect -service -spring -spike -katie -252525 -oscar -brother -bigmac -suck -single -cannon -georgia -popeye -tattoo -texas -party -bullet -taurus -sailor -wolves -japan -strike -flowers -chris1 -berlin -sticky -marina -fisher -russia -connie -mature -bass -catch22 -juice -nigger -159753 -women -alpha1 -trooper -hawkeye -head -freaky -dodgers -machine -pyramid -vegeta -katana -moose -tinker -coyote -inside -pepsi -bang -control -morris -james1 -tickle -outlaw -browns -pickle -test1 -michele -antonio -sucks -caesar -prelude -tanner -adrian -bowling -wutang -sunset -robbie -alabama -danger -juan -rusty -pppppp -nick -2001 -ping -madonna -qwe123 -bigone -casino -cheryl -mmmmmm -integra -apache -tweety -simone -none -trevor -transam -dustin -harvey -england -2323 -seattle -ssssss -rose -harry -openup -pandora -pussys -trucker -wallace -indigo -storm -malibu -weed -review -doggy -dilbert -pegasus -joker -catfish -flipper -valerie -herman -fuckit -detroit -kenneth -bruins -stacey -smoke -joey -seven -marino -fetish -xfiles -wonder -stinger -pizza -babe -pretty -stealth -manutd -gracie -gundam -cessna -mnbvcxz -wicked -victory -shelly -awesome -athena -help -holiday -knicks -street -redneck -casey -gizmo -scully -dragon1 -triumph -eddie -shotgun -peewee -ronnie -angel1 -daisy -special -madman -country -impala -lennon -roscoe -omega -miranda -search -smitty -unicorn -tight -rick -ronald -trigger -truck -danny -home -winnie -beauty -castle -tyler -bobcat -buddy1 -sunny -stones -asian -freddie -chuck -butt -loveyou -norton -hotsex -indiana -short -panzer -trumpet -colors -blaster -logan -aaron -elaine -jungle -atlanta -gold -corona -curtis -nikki -polaris -timber -theone -baller -chipper -orlando -island -skyline -dragons -dogs -benson -licker -goldie -kong -pencil -open -hornet -world -linda -barbie -chan -farmer -indians -larry -redman -foobar -travel -bernie -target -141414 -photos -laura -savage -holly -rocky1 -dollar -turbo -design -newton -hottie -moon -202020 -blondes -4128 -lestat -avatar -future -goforit -random -abgrtyu -jjjjjj -cancer -q1w2e3 -smiley -express -virgin -zipper -stone -andy -babylon -dong -powers -dudley -monkey1 -samurai -skeeter -lindsay -joejoe -master1 -aaaaa -tang -alfred -ball -maria -sexual -maxima -sampson -buckeye -kristin -reaper -bassman -nugget -lucifer -nasty -watson -warlock -2121 -philip -always -dodge -chrissy -burger -bird -snatch -missy -pink -gang -maddie -holmes -huskers -piglet -photo -joanne -dodger -paladin -christy -chubby -hamlet -bigfoot -sunday -manson -garden -blondie -spartan -julie -harold -charger -brandi -stormy -sherry -rodney -galaxy -holland -escort -zxcvb -planet -jerome -wesley -blues -song -peace -david1 -1966 -gambit -karen -sidney -ripper -oicu812 -jamie -sister -marie -martha -nylons -nadine -minnie -whiskey -bing -plastic -anal -chang -loser -racecar -insane -mememe -hansolo -chiefs -freak -frog -salmon -yvonne -zxcv -warren -julian -mariah -rommel -1010 -harris -sylvia -massive -cats -sammy1 -mister -stud -rubber -ding -trunks -desire -justme -faster -irish -1999 -bertha -alpine -sammie -tristan -00000 -swinger -shan -pitbull -roberto -ready -april -palmer -ming -shadow1 -audrey -chong -wang -shirley -fuckers -jackoff -bluesky -151515 -bernard -wolfman -soldier -picture -pierre -ling -goddess -manager -nikita -sweety -titans -hang -fang -ficken -niners -bottom -bubble -ibanez -webster -323232 -tornado -lindsey -content -bruce -buck -aragorn -griffin -chen -trojan -newman -wayne -tina -father -pascal -crimson -brooks -hector -penny -anna -google -camera -fatcat -cody -cunts -waters -stimpy -finger -cindy -wheels -viper1 -latin -robin -brendan -hiphop -willy -snapper -funtime -duck -adult -cotton -cookies -kaiser -mulder -westham -latino -jeep -ravens -aurora -drizzt -madness -energy -kinky -314159 -sophia -stefan -slick -rocker -freeman -french -speed -dddddd -hong -henry -hungry -yang -catdog -cheng -ghost -gogogo -randy -curious -mission -january -singer -sherman -shark -techno -lancer -lalala -autumn -chichi -orion -trixie -delta -bobbob -bomber -holden -kang -kiss -1968 -spunky -liquid -mary -beagle -granny -network -bond -kkkkkk -millie -1973 -biggie -beetle -teacher -susan -toronto -anakin -genius -dream -cocks -dang -bush -karate -snakes -bangkok -callie -pacific -daytona -kelsey -foster -felix -sailing -huang -herbert -jacob -blackie -tarzan -strider -lang -gong -sang -tree -shai -sprite -ting -artist -chai -chao -devil -python -ninja -misty -ytrewq -sweetie -456789 -tian -jing -jesus1 -dian -potter -chou -darren -hobbit -violet -yong -shen -phillip -maurice -gloria -nolimit -mylove -biscuit -yahoo -shasta -sex4me -smoker -smile -pebbles -pics -philly -tong -tintin -marlin -cactus -frank1 -tttttt -chun -danni -emerald -showme -pirates -lian -dogg -colleen -xiao -xian -tazman -tanker -patton -toshiba -richie -alberto -gotcha -graham -dillon -rang -emily -keng -jazz -bigguy -yuan -woman -tomtom -marion -greg -chaos -fossil -flight -racerx -tuan -creamy -boss -bobo -window -blade -shuang -sheila -shun -lick -jian -rong -allen -feng -getsome -sally -quality -kennedy -1977 -beng -wwwwww -yoyoyo -zhang -seng -teddy -joanna -andreas -harder -luke -qazxsw -qian -cong -chuan -deng -nang -boeing -keeper -western -1963 -subaru -sheng -teng -jiong -miao -martina -mang -maniac -pussie -tracey -a1b2c3 -clayton -zhou -zhuang -xing -snow -spyder -liang -jiang -memphis -regina -ceng -magic1 -chuang -dark -million -blow -sesame -shao -poison -titty -terry -kuan -kuai -kyle -mian -guan -hamster -guai -ferret -geng -duan -pang -maiden -quan -velvet -nong -neng -nookie -buttons -bian -bingo -biao -zhong -zeng -xiong -zhun -ying -zong -xuan -zang -0.0.000 -suan -shei -shui -sharks -shang -shua -small -peng -pian -piao -liao -meng -miami -reng -guang -cang -change -ruan -diao -luan -lucas -qing -chui -chuo -cuan -nuan -ning -heng -huan -kansas -muscle -monroe -weng -whitney -zhui -zhua -xiang -zheng -zhen -zhei -zhao -zhan -yomama -zhai -zhuo -zuan -tarheel -shou -shuo -tiao -lady -leonard -leng -kuang -jiao -13579 -basket -qiao -qiong -qiang -chuai -nian -niao -niang -huai -bianca -zhuan -zhuai -shuan -shuai -jumper -archie -forget -qwertz -bones -history -milton -2002 -stuff -office -oldman -preston -trains -murray -vertigo -246810 -black1 -swallow -smiles -parrot -luther -user -nicolas -1976 -surfing -pioneer -pete -masters -apple1 -asdasd -auburn -panama -lucy -buffy -brianna -vette -blue22 -shemale -111222 -baggins -groovy -global -turner -181818 -1979 -blades -life -byteme -lobster -collins -dawg -hilton -1970 -1964 -2424 -polo -markus -coco -deedee -mikey -1972 -171717 -1701 -strip -jersey -green1 -capital -sasha -sadie -putter -vader -seven7 -lester -marcel -banshee -grendel -gilbert -dicks -dead -hidden -iloveu -1980 -sound -ledzep -michel -147258 -female -bugger -buffett -bryan -hell -molson -2020 -wookie -sprint -thanks -jericho -102030 -grace -fuckin -mandy -ranger1 -trebor -molly1 -mirage -models -1984 -2468 -stuart -pentium -mario -anime -gator -powder -twister -connect -neptune -bruno -butts -engine -eatshit -woody1 -shogun -pooh -jimbo -roger -annie -bacon -center -russian -sabine -damien -mollie -voyeur -2525 -363636 -camel -chair -germany -giant -qqqq -nudist -bone -sleepy -tequila -megan -fighter -garrett -dominic -obiwan -walnut -1974 -ladybug -cantona -ccbill -satan -rusty1 -dusty -kissme -1967 -zzzz -skater -smut -play -valley -coolio -dagger -boner -bull -horndog -jason1 -blake -rescue -griffey -champs -queen -colt45 -boat -xxxxxxx -xanadu -tacoma -mason -carpet -gggggg -safety -palace -italia -stevie -picturs -picasso -thongs -tempest -ricardo -roberts -asd123 -hairy -foxtrot -gary -nimrod -hotboy -343434 -1111111 -goose -blood -wood -454545 -shaolin -sooners -peanuts -maxine -rogers -andrew1 -filthy -donnie -ohyeah -africa -kenny -keith -monique -jasmin -pickles -assass -fright -potato -darwin -hhhhhh -kingdom -weezer -424242 -pepsi1 -throat -romeo -gerard -looker -puppy -butch -monika -suzanne -sweets -temple -laurie -josh -analsex -nymets -ddddddd -support -stick -today -down -oakland -oooooo -qweasd -chucky -bridge -carrot -dookie -condor -night -butler -hoover -horny1 -sunrise -sinner -jojo -martini -assfuck -ffffff -abigail -esther -janice -jamaica -wright -sims -space -there -timmy -7654321 -77777 -cccccc -gizmodo -roxanne -ralph -tractor -dance -mypass -helena -1975 -blue123 -pissing -thomas1 -redred -rich -attack -cash -drunk -dixie -dublin -bollox -katrina -miles -1971 -22222 -272727 -sexx -bbbb -battle -grizzly -passat -porter -tracy -defiant -bowler -monitor -wisdom -wild -slappy -thor -letsgo -robert1 -feet -rush -brownie -hudson -098765 -playing -melvin -atomic -bart -hawk -goku -glory -llllll -qwaszx -cosmos -bosco -knights -bentley -beast -lewis -assword -frosty -gillian -sara -dumbass -mallard -dddd -deanna -elwood -wally -159357 -angelo -aussie -guest -golfing -doobie -loveit -chloe -elliott -vipers -janine -1965 -blabla -surf -sucking -tardis -serena -shelley -thegame -legion -rebels -fast -gerald -sarah1 -double -onelove -loulou -toto -crash -0007 -soccer1 -jedi -manuel -method -river -chase -ludwig -poopie -derrick -boob -breast -isabel -belly -pikachu -jose -celeste -celtics -frances -frogger -sabbath -budman -willis -jackal -bigger -zzzzz -silvia -sooner -licking -gopher -geheim -primus -pooper -newpass -brasil -husker -element -moomoo -tammy -shitty -smokin -jjjj -anubis -backup -gorilla -painter -traffic -claude -daniela -dale -delta1 -nancy -boys -easy -kissing -kelley -wendy -theresa -amazon -alan -fatass -malcolm -breasts -boots -honda1 -spidey -poker -temp -miguel -147852 -archer -dogdog -tricky -weather -spankme -speaker -amadeus -back -harley1 -falcons -dorothy -kenwood -1978 -shazam -shalom -lickit -jimbob -roller -carson -check -fatman -funny -garbage -loving -magnus -clover -mobile -bell -payton -plumber -texas1 -tool -topper -jenna -rebel -harmony -celica -german -diana -oxford -osiris -orgasm -punkin -tuesday -close -breeze -bossman -billie -latinas -judith -astros -scruffy -donna -qwertyu -davis -hearts -kathy -jammer -java -rhonda -ricky -1122 -flyboy -doodle -city -bootie -kicker -vulcan -iverson -191919 -stoner -321321 -farside -rugby -pussy69 -power1 -bobbie -hershey -hermes -west -birdman -blessed -thumbs -lawyer -melinda -fingers -rrrrrr -coke -nicola -bohica -heart -elvis1 -kids -blacky -stories -snake1 -phoebe -jesse -fisting -scarlet -dildo -pancho -lucky7 -condom -summer1 -student -sword -skiing -sergio -site -sony -thong -cassidy -fffff -fitness -durango -postal -dawn -dylan -kisses -imagine -topdog -asterix -hallo -bridget -eeeeee -mouth -weird -will -sommer -toby -theking -juliet -avenger -goodbye -faith -trance -brad -houses -homers -kingpin -incubus -1961 -blond -zaphod -shiloh -spurs -station -jennie -maynard -mighty -aliens -hank -charly -running -dogman -omega1 -printer -aggies -hope -javier -bitch1 -stone55 -thekid -lizzie -rockets -ashton -camels -formula -forrest -oracle -rain -pussey -abcde -clancy -nellie -mystic -inferno -steve1 -pauline -alice -alfa -grumpy -flames -scream -lonely -puffy -proxy -unreal -cynthia -herbie -engage -yyyyyy -010101 -solomon -pistol -melody -celeb -flying -gggg -scottie -oakley -a12345 -newbie -mmmm -venus -beverly -zorro -work -writer -spread -phil -tobias -links -members -metal -1221 -andre -565656 -funfun -trojans -again -cyber -moneys -zeus -thing -tomato -lion -celine -usa123 -trans -account -aaaaaaa -homerun -kevin1 -blacks -sean -fart -fubar -older -oilers -craig -conrad -church -damian -dean -broken -buster1 -hithere -sticks -pilot -peters -lexmark -jerkoff -anders -cheers -possum -cutter -muppet -stolen -sport -sonic -peter1 -jethro -rockon -asdfghj -pass123 -paper -pornos -bootys -buttman -bonjour -escape -1960 -becky -bears -362436 -tinman -lemons -maxmax -1414 -bbbbb -camelot -chad -chewie -gogo -fusion -saint -nopass -myself -hustler -hunter1 -whitey -beast1 -yesyes -spank -smudge -patriot -lespaul -annette -hammers -finish -sausage -orioles -oscar1 -over -cramps -natural -eating -exotic -iguana -bella -suckers -strong -sheena -start -slave -pearl -topcat -magelan -racer -ramona -crunch -british -button -eileen -steph -456123 -skinny -seeking -chief -filter -first -freaks -sakura -pacman -dalton -newlife -homer1 -klingon -watcher -walleye -tasha -tasty -sinatra -steel -poncho -amber1 -gonzo -grover -carol -candle -firefly -goblin -scotch -diver -usmc -huskies -eleven -kitkat -israel -beckham -bicycle -yourmom -studio -tara -shane -splash -jimmy1 -reality -caitlin -focus -mailman -clark -ddddd -hopper -more -wilbur -illini -lansing -maxx -gothic -carlton -camille -facial -vectra -crazy1 -jane -betty -benny -bennett -leader -barkley -hayden -caught -franky -ffff -floyd -sassy -pppp -prodigy -noodle -vortex -wanking -billy1 -siemens -pedro -groups -carolyn -chevy1 -cccc -fritz -dracula -nurses -loco -madrid -trout -utopia -chrono -cooler -conner -nevada -wibble -werner -summit -marco -marilyn -1225 -babies -capone -fugazi -panda -mama -puppies -triton -9876 -command -nnnnnn -ernest -momoney -iforgot -wolfie -studly -shawn -renee -alien -hamburg -81fukkc -741852 -catman -china -forgot -gagging -scott1 -drew -oregon -qweqwe -train -daniel1 -cutlass -holes -heidi -mothers -music1 -what -walrus -1957 -bigtime -bike -xtreme -simba -ssss -rookie -angie -bathing -fresh -sanchez -rotten -maestro -luis -look -turbo1 -99999 -hhhh -elijah -monty -bender -yoda -shania -shock -phish -thecat -reagan -baddog -asia -randall -abstr -napster -brian1 -bogart -high -hitler -emma -kill -weaver -isaiah -1981 -belinda -beaner -yoyo -super1 -select -slutty -some -toon -raven1 -rayray -123789 -1066 -albion -greens -fashion -santana -paint -powell -credit -darling -mystery -bowser -bottle -hehehe -kelly1 -mojo -1998 -bikini -yyyy -strap -sites -spears -julius -amelia -central -f**k -nyjets -vanilla -twisted -bryant -brent -here -erica -kimber -viagra -veritas -pony -pool -titts -labtec -jenny1 -mayhem -redbull -govols -gremlin -505050 -gmoney -rupert -rovers -lorenzo -trident -deskjet -cuddles -nice -bristol -karina -milano -vh5150 -jarhead -1982 -bigbird -bizkit -sixers -slider -star69 -tommy1 -john316 -meghan -market -grant -carl -flicks -films -madden -cosmo -cthulhu -br0d3r -swedish -spawn -polly -these -todd -reds -anarchy -groove -franco -fuckher -oooo -tyrone -vegas -airbus -cobra1 -clips -delete -duster -kitty1 -mouse1 -monkeys -jazzman -1919 -262626 -stroke -stocks -sting -pippen -jordan1 -females -park -vector -cooter -desert -demon -nike -bubbas -bonkers -english -kahuna -wildman -4121 -sirius -static -terror -teenage -leelee -marissa -rated -hailey -chaser -sanders -salsero -nuts -macross -quantum -rachael -tsunami -daddy1 -cruise -nguyen -nudes -vernon -1959 -striker -sixty -steele -spice -smegma -thumb -mellow -astrid -cancun -cartoon -sabres -samiam -pants -oranges -lust -coleman -denali -nude -noodles -buzz -brest -hooter -warthog -bloody -zappa -lance -jean -jjjjj -harper -calico -freee -rover -door -pooter -closeup -bonsai -evelyn -emily1 -kathryn -iiii -1955 -yzerman -theboss -tolkien -jill -megaman -rasta -bean -hal9000 -goofy -gringo -gofish -gizmo1 -samsam -scuba -onlyme -corrado -clown -clapton -deborah -boris -bulls -vivian -jayhawk -bethany -wwww -sharky -seeker -pillow -thesims -lighter -lkjhgf -barry -guiness -gymnast -casey1 -goalie -doug -lolo -poppy -abby -clemson -clipper -nobody -holly1 -elliot -eeee -miriam -belle -sucked -sex123 -sexy69 -pic\'s -lamont -meat -marc -gretzky -frisco -scratch -orchid -orange1 -quincy -dawson -ne1469 -boxing -hill -korn -161616 -1985 -ziggy -stoney -senior -amature -barber -babyboy -goliath -hack -frodo -scout -scrappy -rosie -qazqaz -tracker -active -craving -cohiba -deep -cyclone -dana -bubba69 -katie1 -mpegs -vsegda -jade -irish1 -better -sexy1 -smelly -lions -jokers -julia -jojojo -ashley1 -groucho -cheetah -champ -firefox -packer -love69 -tyler1 -typhoon -tundra -bobby1 -village -volley -beth -wolf359 -0420 -000007 -swimmer -skydive -smokes -patty -peugeot -pompey -legolas -kristy -redhot -rodman -having -grapes -4runner -carrera -floppy -dollars -ou8122 -quattro -adams -cloud9 -davids -nofear -busty -mmmmm -whisper -vermont -wives -jayjay -philips -phone -topher -tongue -midget -ripken -havefun -canon -five -getting -ghetto -direct -otto -usnavy -conover -cruiser -dalshe -nicole1 -buzzard -hottest -misfit -moore -milfnew -warlord -wassup -bigsexy -zippy -shearer -tights -kungfu -labia -journey -marlene -rider -area51 -batman1 -bananas -636363 -cancel -ggggg -paradox -mack -lynn -queens -adults -aikido -cigars -nova -hoosier -eeyore -moose1 -warez -313131 -mayday -rivers -revenge -banker -baddest -ccccc -fortune -aisan -deadman -iscool -1956 -1pussy -womam -sweden -skidoo -spock -sssss -petra -pepper1 -pinhead -micron -allsop -army -aside -gunnar -666999 -chip -foot -fowler -face -fletch -george1 -sapper -science -sasha1 -lover1 -magick -popopo -public -ultima -derek -cypress -booker -edwards -vulva -vvvv -jabroni -bigbear -yummy -010203 -searay -secret1 -showing -sinbad -sexxxx -soleil -piccolo -leopard -legacy -jensen -justine -memorex -marisa -mathew -redwing -134679 -anfield -gore -catcat -feather -scanner -danzig -daisy1 -hores -erik -exodus -vinnie -iiiiii -zero -1001 -subway -tank -second -snapple -picks -poodle -their -llll -junebug -june -marker -mellon -ronaldo -amanda1 -asdfjkl -beaches -greene -great1 -force -doitnow -ozzy -radio -tyson -daphne -boxster -emerson -kkkk -mnbvcx -moocow -vides -wagner -janet -1717 -blonds -1000 -storys -stereo -4545 -420247 -lesbean -live -justin1 -124578 -animals -balance -hansen -cabbage -dodge1 -dimas -lori -loud -malaka -puss -probes -adriana -coolman -dante -nacked -erotica -kool -mirror -wearing -bigass -zenith -woohoo -womans -tanya -tango -stacy -pisces -laguna -krystal -maxell -flash1 -orgasms -profit -pusyy -pothead -coconut -chuckie -contact -builder -hotshot -horizon -hole -mondeo -wifes -1962 -strange -stumpy -smiths -sparks -slacker -piper -laptop -allmine -bbbbbbb -asscock -grandma -hayley -88888 -cecilia -chacha -sandy1 -santos -doogie -number -qwert40 -crow -darrell -bonita -ib6ub9 -volvo -jacob1 -iiiii -beastie -stoned -sonics -snapon -pepe -lesbain -litle -retard -ripple -austin1 -badgirl -garage -royals -dragoon -dickie -passwor -ocean -poppop -dammit -nokia -bobobo -br549 -emmitt -knock -minime -1954 -3232 -353535 -seamus -solo -sparkle -sluttey -pictere -titten -lback -1024 -goat -ruby -passme -oasis -logan1 -rainman -twins -club -custom -cyclops -nipper -bucket -hhhhh -momsuck -indain -2345 -bimmer -susanne -stunner -stevens -456456 -shell -sheba -tootsie -tiny -reefer -really -1012 -harcore -gollum -545454 -chico -caveman -carole -fishes -gaymen -saleen -doodoo -looney -presto -qqqqq -cigar -bogey -brewer -helloo -dutch -monte -wasser -vietnam -visa -0123 -swords -slapper -peach -jump -marvel -march -redwood -rolling -1005 -ametuer -chiks -cathy -fucing -sadie1 -mamas -race -rambo -unknown -absolut -deacon -dallas1 -kristi -keywest -kirsten -kipper -morning -wings -idiot -1515 -beating -zxczxc -303030 -shaman -sparrow -jeffery -mick -redfish -1492 -angus -barrett -goirish -felicia -forfun -galary -duchess -olivier -lotus -ramses -purdue -crave -brando -enter1 -killme -welder -windsor -wifey -indon -yyyyy -stretch -taylor1 -4417 -picher -pickup -johnboy -jets -jess -maureen -anne -ameteur -hambone -5050 -charley -sally1 -padres -quest -trader -crack -climber -bolitas -bravo -hohoho -model -italian -beanie -beretta -stroker -tabitha -sexyman -jewels -mets -marcos -rhino -bdsm -goodman -grils -games -route66 -devo -dino -outkast -magpie -critter -cupcake -nickel -krista -mimi -murder -videoes -xerxes -slim -slinky -pinky -meister -menace -ripley -retired -balloon -bank -goten -5551212 -donuts -divorce -lord -lost -tttt -comet -deer -damnit -nasty1 -nonono -nina -eeeee -milkman -vvvvvv -isaac -1818 -blueboy -beans -bigbutt -wyatt -tech -poetry -toolman -laurel -juggalo -jetski -gobears -truman -cubbies -nitram -briana -ebony -kings -warner -bilbo -yumyum -zzzzzzz -stylus -321654 -server -secure -silly -squash -starman -steeler -staples -phrases -laser -135790 -allan -barker -athens -cbr600 -fester -gangsta -fucku2 -freeze -game -droopy -objects -passwd -lllll -loaded -louis -losers -vedder -clit -chunky -darkman -damage -buddah -boobed -henti -hillary -webber -winter1 -ingrid -bigmike -beta -zidane -talon -slave1 -pissoff -person -living -lexus -matador -readers -riley -roberta -armani -ashlee -5656 -cards -fmale -ferris -fuking -gaston -fucku -ggggggg -sauron -diggler -pacers -looser -pounded -premier -pulled -town -trisha -cornell -collin -cosmic -deeper -depeche -norway -bright -helmet -kendall -mustard -misty1 -watch -jagger -bertie -berger -word -3x7pxr -silver1 -smoking -sonny -paula -photoes -lesbens -lambert -lindros -lillian -1357 -143143 -asasas -goodboy -898989 -card -gawker -rubble -rrrr -onetime -trapper -twenty -abraham -cinder -company -boricua -bunny1 -boxer -hotred -hockey1 -hooper -edward1 -evan -kris -misery -moscow -milk -bigtit -show -three -lionel -leanne -joshua1 -july -1230 -cedric -fallen -farley -gene -frisky -sanity -script -divine -dharma -lucky13 -tricia -akira -desiree -hunt -hotbox -hootie -heat -howdy -karma -kiteboy -motley -1988 -bert -biggles -wrench -working -wrestle -pheonix -penny1 -thedude -jenn -jonjon -jones1 -mattie -memory -micheal -arrow -azzer -diehard -dotcom -lola -chivas -clouds -deluxe -nuclear -north -boom -boobie -hurley -krishna -momomo -modles -volume -bluedog -wwwwwww -yousuck -pluto -link -joung -marcia -awnyce -gonavy -haha -fabian -girsl -rufus -drive -a123456 -airport -clay -combat -cygnus -cupoi -never -brett -eagles1 -elite -kendra -mommy -1958 -shonuf -piano -thedog -lips -jillian -jenkins -midway -gromit -787878 -66666 -carmex2 -camber -gator1 -ginger1 -fuzzy -seadoo -dorian -lovesex -rancid -uuuuuu -911911 -nature -helen -health -heater -higgins -kirk -mmmmmmm -virtual -ventura -jamie1 -japanes -2727 -2469 -blam -believe -zephyr -stiffy -sweet1 -silent -spectre -tigger1 -tekken -lenny -lakota -jjjjjjj -medical -1369 -golfer1 -gunners -7779311 -515151 -famous -glass -screen -rudy -royal -sanfran -drake -optimus -love1 -mail -maggie1 -pudding -venice -aaron1 -delphi -niceass -bounce -busted -house1 -killer1 -miracle -momo -musashi -jammin -2003 -234567 -submit -silence -sssssss -state -spikes -sleeper -toledo -kume -media -meme -medusa -mantis -remote -reading -reebok -1017 -artemis -hampton -harry1 -cafc91 -fettish -oceans -mango -ppppp -trainer -troy -uuuu -909090 -cross -death1 -news -hokies -eeeeeee -mitch -& -& -spinner -leon -jockey -records -right -hans -gooner -474747 -cheeks -cars -candice -fight -glow -parola -okokok -pablo -magical -major -ramsey -989898 -circle -crusher -cubswin -nnnn -erin -kotaku -milo -mittens -whatsup -vvvvv -iomega -bengals -bermuda -biit -yellow1 -012345 -spike1 -south -sowhat -pitures -peacock -pecker -theend -jimmie -romance -augusta -castro -florian -dolly -lulu -qaz123 -usarmy -twinkle -cloud -cold -hover -hothot -europa -ernie -kenshin -kojak -mikey1 -water1 -196969 -because -wraith -zebra -wwwww -33333 -simon1 -spider1 -snuffy -teddy1 -lesley -maria1 -redline -renault -aloha -antoine -gobucks -freesex -duffman -ooooo -papa -nuggets -longbow -porno1 -county -dalejr -darius -darlene -dell -navy -buffy1 -honey1 -hott -heyhey -europe -everest -3434 -shag -spoon -sonoma -stalker -poochie -terefon -maryann -marty -roman -1007 -142536 -alibaba -bartman -astro -goth -century -cheater -four -ghost1 -oral -civic -cicero -kkkkk -jameson -1a2b3c -1qwerty -skip -shojou -sparky1 -poiuy -torres -lantern -jelly -jeanne -meier -1213 -bayern -basset -gsxr750 -cattle -gilles -dima -obelix -popo -prissy -ramrod -unique -bummer -hotone -dynasty -entry -konyor -missy1 -moses -282828 -yeah -xyz123 -stop -426hemi -404040 -simmons -lazarus -marine1 -manning -12345a -beamer -greece -gustav -7007 -charity -camilla -ccccccc -faggot -foxy -frozen -duckie -dogfood -radical -tuna -claudio -circus -danny1 -novell -nights -bonbon -kashmir -kiki -moondog -monaco -insert -1953 -zxc123 -supreme -3131 -sexxx -selena -softail -poipoi -pong -mars -martin1 -rogue -alone -audia4 -chick -came11 -figaro -geneva -dogboy -dnsadm -dipshit -othello -officer -malone -post -rafael -tripod -choice -chopin -coucou -coach -common -book -hiziad -homerj -eight -earth -mullet -whisky -jacques -store -4242 -speedo -skylar -piggy -pierce -tiger2 -legos -lala -jezebel -judy -joker1 -mazda -barton -baker -727272 -fishman -food -dundee -lumber -radar -ppppppp -tranny -aaliyah -admiral -comics -cleo -delight -homeboy -eternal -kilroy -kellie -khan -violin -wingman -walmart -bigblue -blaze -beemer -beowulf -bigfish -yyyyyyy -woodie -0123456 -tbone -style -syzygy -starter -lemon -linda1 -merlot -mexican -anita -banner -badman -barfly -grease -carla -screw -diane -dogshit -counter -coolguy -demons -demo -nomore -normal -hhhhhhh -hondas -iamgod -enterme -everett -kayla -mybaby -ipswich -200000 -bearcat -zigzag -xander -369369 -skyler -pigeon -peyton -tipper -lilly -asdf123 -asdzxc -banane -barnes -guyver -grand -chinook -otis -tototo -trust -tower -adam12 -corey -chrome -buddie -bombers -bunker -hippie -keegan -misfits -vickie -292929 -woofer -stubby -sheep -secrets -sparta -stang -spud -sporty -pinball -jorge -johanna -maxxxx -gunther -fatima -fffffff -freeway -garion -score -rrrrr -sancho -outback -maggot -puddin -trial -987456 -colton -clyde -brain -brains -hoops -eleanor -dwayne -kirby -mydick -villa -bigcat -becker -shiner -spanish -templar -lamer -juicy -marsha -mike1 -maximum -real -1223 -arrows -andres -alucard -baldwin -baron -avenue -haggis -channel -cheech -safari -ross -dog123 -orion1 -paloma -vegitto -trees -969696 -adonis -colonel -cookie1 -hellos -dwight -eraser -kerstin -motion -moritz -visual -jaybird -1983 -bitter -yvette -zodiac -steven1 -slammer -slick1 -sponge -theater -this -jonny -massage -mann -ring -1211 -amazing -aptiva -bailey1 -guitar1 -chanel -canyon -gagged -fuckme1 -rough -punk -98765 -90210 -clowns -cubs -daniels -deejay -nigga -naruto -boxcar -hotties -electra -kent -widget -india -1986 -2004 -best -bingo1 -***** -stratus -sultan -storm1 -44444 -4200 -season -sexyboy -sigma -smokie -spam -point -pippo -ticket -joel -manman -1022 -anton -almond -bacchus -aztnm -axio -awful -bamboo -hakr -gregor -5678 -caprice -camero1 -fellow -dupont -dianne -paddle -magnet -qwert1 -pyon -tripper -coming -noway -burrito -bozo -hughes -hookem -eddie1 -ellie -entropy -kkkkkkk -jacobs -1945 -1951 -24680 -100000 -taco -subzero -sharp -sexxxy -skolko -shanna -skyhawk -spurs1 -sputnik -piazza -letter -lane -kurt -matilda -1224 -harvard -hannah1 -525252 -4ever -carbon -chef -ghosts -gina -loki -raquel -promise -citadel -highway -evil -monarch -morgan1 -1997 -bella1 -berry -yaya -yolanda -superb -taxman -studman -3636 -sherri -sheriff -poland -pizzas -toilet -latina -lassie -larry1 -joseph1 -meagan -marian -reptile -rico -razor -1013 -barron -hammer1 -gypsy -grande -carroll -camper -chippy -cat123 -call -chimera -fiesta -glock -glenn -domain -dieter -onetwo -odessa -louie -quartz -prowler -prophet -towers -ultra -cocker -dakota1 -cumm -nnnnnnn -natalia -boxers -hugo -heynow -hollow -iceberg -elvira -kate -kitchen -wasabi -impact -beerman -string -sleep -snoopy1 -pocket -legs -maple -mickey1 -manuela -mermaid -micro -redbird -alisha -baura -battery -grass -chevys -caravan -carina -charmed -fraser -frogman -diving -dogger -draven -drifter -oatmeal -paris1 -rachel1 -vegitta -cole -cobras -corsair -dadada -noelle -mylife -nine -bowwow -body -hotrats -modena -wave -iiiiiii -birgit -zone -sutton -susana -shocker -shrimp -sexgod -squall -squeeze -soul -patrice -poiu -players -tigers1 -toejam -tickler -line -julie1 -jimbo1 -juanita -rodeo -robot -1023 -annie1 -bball -guess -happy2 -charter -farm -flasher -falcon1 -fiction -gadget -diaper -dinner -oliver1 -partner -paco -lucille -macman -poopy -popper -postman -ttttttt -ursula -acura -cowboy1 -conan -daewoo -cyrus -nation -nnnnn -nextel -bolton -eureka -extra -kimmie -musica -wage -wert -vintage -itsme -bessie -zippo -311311 -smokey1 -spot -snappy -plasma -thelma -tonight -krusty -just4me -marius -rebel1 -1123 -alfredo -aubrey -audi -chantal -fick -goaway -roses -sales -rusty2 -dirt -dogbone -doofus -ooooooo -mankind -luck -mahler -lllllll -pumper -puck -pulsar -tupac -compass -cougars -niceguy -bob123 -boating -bronze -hopkins -hewlett -houhou -hubert -keller -mingus -venture -verizon -imation -1950 -1948 -1949 -223344 -bigbig -blossom -zack -wowwow -sissy -skinner -spiker -square -snooker -sluggo -player1 -junk -jeannie -jsbach -jumbo -jewel -medic -robins -123456a -1125 -1031 -beacon -astra -gumby -hammond -hassan -757575 -585858 -chillin -fuck1 -sander -lowell -upyours -trek -courage -darryl -nikki1 -nitro -bugs -boytoy -ellen -excite -kirsty -kane -wingnut -icu812 -1master -beatle -blanca -wolfen -sugar1 -tartar -senna -sexman -sick -someone -soprano -pippin -pixies -land -laura1 -laurent -rimmer -road -report -1020 -arturo -around -hamish -halifax -forum -dododo -doit -outside -mandy1 -twist -uuuuu -uranus -ttttt -butcher -bruce1 -helper -hopeful -eduard -dusty1 -kathy1 -muscles -morton -vvvvvvv -vivid -install -1947 -187187 -1941 -1952 -tatiana -susan1 -sinned -sexxy -senator -shadows -playa -toaster -jerry1 -marie1 -mason1 -merlin1 -roger1 -112358 -1121 -andrea1 -bacardi -auto -hardy -789789 -5555555 -flores -fergus -sascha -rrrrrrr -dome -onion -nutter -lololo -qqqqqqq -quick -uuuuuuu -cobain -cindy1 -coors -dani -descent -nimbus -nomad -nanook -norwich -bomb -bombay -broker -hookup -kiwi -winners -jackpot -1776 -beardog -bighead -blast -bird33 -0987 -stress -shot -spooge -pelican -peepee -perry -pointer -titan -jeremy1 -altima -baba -hallie -hate -hardone -5454 -candace -flip -finance -farmboy -salomon -destroy -papers -option -page -loser1 -lopez -r2d2 -chriss -cumcum -ninjas -ninja1 -hung -erika -eduardo -killers -miller1 -intel -jarvis -2626 -bizzare -blue12 -biker -yoyoma -sushi -styles -series -shanti -spanker -steffi -smart -sphinx -please1 -paulie -pistons -tiburon -limited -mdogg -rockies -alexia -arlene -arctic -banger -audio -asimov -grandpa -753951 -4you -chilly -chapman -flyfish -santa -oreo -ohshit -macbeth -madcat -loveya -mallory -rage -quentin -project -ramirez -colnago -citizen -chocha -cobalt -dabears -nevets -helene -huge -edgar -epsilon -easter -kestrel -moron -virgil -1616 -beat -bettina -woowoo -zander -shower -sloppy -reader -romero -redsox1 -ride -1215 -1112 -annika -arcadia -answer -baggio -base -guido -555666 -carmel -cayman -chips -roxy -disco -pass1 -luna -lovebug -macmac -queenie -puffin -trip -airwolf -abbott -aaa111 -cocaine -cisco -cottage -dayton -deadly -datsun -bricks -bumper -kidrock -wizard1 -wind -italy -benoit -bigones -wolfpac -suicide -3030 -sheba1 -sixpack -peace1 -physics -pearson -tigger2 -toad -megan1 -meow -ringo -roll -717171 -686868 -5424 -canuck -footjob -fulham -seagull -orgy -lobo -mancity -truth -trace -derf -boozer -howell -hola -easton -munch -jared -1dragon -biology -bestbuy -bmw325 -bigbob -stream -tazz -3333333 -skate -shutup -shop -polish -pinky1 -tootie -thecrow -leroy -jubilee -jingle -martine -matrix1 -manowar -messiah -mclaren -reilly -rollins -romans -return -rivera -athlon -beach1 -badgers -guitars -harald -gotribe -6996 -7grout -635241 -chase1 -carver -fallout -fiddle -fenris -fortuna -felipe -felix1 -forward -gasman -frost -fucks -sahara -sassy1 -dogbert -divx1 -manila -loretta -priest -quasar -venom -987987 -access1 -decker -daman -data -dentist -crusty -nathan1 -bruno1 -bucks -brodie -kittens -kerouac -mother1 -waldo1 -wedding -1942 -1946 -bigdawg -bigpimp -zaqwsx -414141 -3000gt -434343 -shoes -serpent -starr -smurf -pasword -tommie -lake -john1 -redeye -rebelz -1011 -alatam -asses -asians -bama -banzai -harvest -hair -hanson -575757 -5329 -cascade -chinese -fatty -fender1 -flower2 -funky -sambo -dogcat -dottie -oedipus -osama -macleod -prozac -rampage -punch -presley -concord -cook -cinema -cleaner -ciccio -corinne -clutch -daemon -bruiser -boiler -hjkl -eyes -egghead -expert -ethan -kasper -mordor -wasted -jamess -zouzou -090909 -1002 -switch -stone1 -4040 -sisters -sexo -shawna -smith1 -sperma -sneaky -polska -thewho -krypton -lawson -library -lekker -jules -johann -justus -rockie -romano -aspire -goodie -cheese1 -fenway -fishon -fishin -girls1 -sawyer -dolores -desmond -duane -ramones -rabbits -transit -aaaaa1 -clock -delilah -noel -boyz -bongo -bunnies -brady -buceta -henry1 -heels -eastern -krissy -mopar -vienna -weston -wildone -vodka -jayson -beavis1 -betsy -xxxxxx1 -000001 -0815 -zulu -420000 -sigmar -sprout -stalin -peggy -patch -lagnaf -rolex -redfox -referee -1231 -angus1 -ariana -ballin -attila -hall -greedy -grunt -747474 -cecile -caramel -field -gidget -futbol -frosch -saiyan -schmidt -drums -donner -doggy1 -drum -doudou -pack -pain -nutmeg -quebec -trash -triple -tosser -tuscl -track -comfort -choke -comein -cola -deputy -bremen -borders -bronson -break -hotass -eskimo -eggman -koko -kieran -katrin -komodo -mone -munich -winger -jaeger -ivan -2222222 -bennie -bigben -worm -xxx123 -sunny1 -373737 -slater -slayer1 -snoop -stacie -peachy -thecure -times -little1 -jennaj -marquis -middle -rasta69 -1114 -aries -havana -gratis -calgary -flanker -salope -dirty1 -draco -dogface -umpire -turnip -vbnm -tucson -troll -aileen -codered -damon -nana -neon -nico -neil -boomer1 -bushido -horace -kaitlyn -keepout -karen1 -mindy -mnbv -volcom -wizards -wine -1995 -bite -zach -tarpon -shinobi -phat -patrol -toolbox -julien -johnny1 -joebob -marble -riders -reflex -120676 -1235 -angelus -anthrax -atlas -hawks -grandam -harlem -655321 -cabron -fischer -flyer -flower1 -factory -federal -gambler -frodo1 -funk -sand -sam123 -scania -dingo -papito -olive -palermo -ou8123 -lock -ranch -pride -randy1 -twiggy -travis1 -treetop -addict -admin1 -963852 -aceace -cliff -cirrus -clifton -colin -bobdole -bonner -bogus -bonjovi -bootsy -boater -elway7 -edison -kelvin -kenny1 -montag -moreno -wayne1 -white1 -jazzy -1994 -1991 -2828 -blunt -beau -belmont -worthy -systems -sensei -stan -peeper -pharao -pigpen -teensex -larkin -jimjim -melons -marlon -robocop -1003 -1027 -azsxdc -gordo -hazard -granada -8989 -7894 -ceasar -chelle -candy1 -fergie -fanny -fidelio -giorgio -ruth -sanford -diego -devon -panic -longer -mackie -qawsed -twelve -chloe1 -coral -daddyo -boyboy -booster -bucky -esquire -motor -wilder -waffle -wallet -warning -virus -wealth -jabber -jaguars -javelin -idefix -bigdog1 -blue42 -blanked -blue32 -biteme1 -blaine -yessir -team -stephan -sunfire -tbird -stryker -3ip76k2 -sevens -sheldon -pilgrim -tenchi -titman -leeds -lithium -lander -linkin -landon -mariner -markie -midnite -1129 -123asd -allstar -albany -asdf12 -antonia -aspen -7734 -49ers -carlo -cable -carnage -callum -carlos1 -fitter -flame -gofast -gamma -fucmy69 -dogwood -django -magneto -loose -premium -addison -9999999 -abc1234 -newyear -nichole -bookie -burns -bounty -brown1 -bologna -earl -elway -killjoy -kerry -keenan -kick -mini -mouser -wayer -impreza -irene -2580 -bellaco -blues1 -bedford -blanco -blunts -stinks -teaser -streets -sf49ers -shovel -spikey -sonia -timeout -toffee -lefty -johndoe -mega -manolo -mentor -margie -ratman -ridge -record -rhodes -robin1 -1124 -1210 -1028 -1226 -another -harbor -gramma -646464 -chaos1 -glasgow -frogs -salem -scuba1 -ducks -driven -doggies -dicky -donovan -rams -aikman -corolla -clarke -conway -cumslut -cyborg -dancing -boston1 -bong -houdini -helmut -elvisp -edge -keksa12 -misha -monty1 -wetter -watford -wiseguy -visitor -janelle -1989 -1987 -biatch -beezer -bigguns -bitchy -wyoming -stupid1 -simple1 -spiral -smeller -sperm -plato -tophat -test2 -theatre -thick -toomuch -leigh -jello -jewish -junkie -maxim -maxime -meadow -roofer -124038 -1018 -1269 -1227 -123457 -alberta -aramis -beaker -googoo -goochi -852456 -4711 -catcher -carman -champ1 -chess -geezer -samuel1 -saigon -scooby1 -doors -dick1 -devin -doom -dirk -doris -load -magpies -manfred -raleigh -vader1 -tulips -defense -mygirl -burn -bowtie -bowman -holycow -honeys -minerva -wheeler -witch -jaime -irving -1992 -bimbo -blue11 -birddog -woodman -womble -030303 -stinker -slugger -spotty -smoke1 -things -torpedo -tender -lilith -jimmys -jerk -junior1 -marsh -rice -root -1214 -april1 -allgood -bambi -grinch -767676 -5252 -capecod -finder -flint -goats -gideon -savior -seabee -sandro -schalke -disney1 -duckman -options -pancake -malice -lookin -love123 -lloyd -puppet -prayers -union -tracer -crap -cwoui -hookers -hollie -hewitt -ernesto -edthom -kaylee -kokoko -kokomo -kimball -morales -mooses -monk -walton -weekend -inter -1993 -worker -summers -surgery -shibby -shamus -skibum -sex69 -spliff -slipper -spoons -spanner -slow -temp123 -lakers1 -jomama -julio -rosario -recon -riddle -room -1025 -1101 -barney1 -baylor -gotham -gravity -hancock -616161 -515000 -caca -castor -chilli -fdsa -getout -fuck69 -gators1 -sail -sable -rumble -dork -dickens -duffer -onions -logger -lorena -lookout -magic32 -port -poon -prime -twat -citroen -civicsi -coochie -compaq1 -nancy1 -buzzer -boulder -butkus -bungle -hogtied -honor -hero -hilary -heidi1 -mortal -wendy1 -vibrate -vicky -bledsoe -blink -woof -xxxxx1 -talk -stock -tabatha -sheeba -start1 -peanut1 -tools -tetsuo -torino -tennis1 -termite -ladder -last -lemmein -jughead -melrose -megane -redone -request -angela1 -alive -alissa -gonzo1 -golden1 -656565 -626262 -chains -calvin1 -foolish -fallon -gabber -runaway -salami -dummy -dungeon -dumb -dope -opus -paragon -oxygen -panhead -odyssey -lottie -prince1 -trustme -christa -court -davies -neville -nono -bread -buffet -hound -kajak -mona -moto -mildred -winner1 -vixen -versace -winona -instant -indy -bigal -beech -biggun -blake1 -blue99 -big1 -woods -synergy -336699 -sixty9 -shark1 -skin -simba1 -sharpe -sebring -spunk -springs -sliver -pizza1 -plane -perkins -pookey -lawman -joe123 -jolly -mike123 -romeo1 -reserve -alanis -ariane -antony -band -hand -haley -byebye -camden -chewy -forumwp -franks -fruity -pantie -oldone -lumina -prosper -total -true -ajax -951753 -achtung -compact -color -corn -christi -closer -corndog -dank -nimitz -brandy1 -bowl -breanna -holein1 -east -kenobi -waldo -wing -invis -1996 -benton -bigjohn -beef -beater -benji -bluejay -xyzzy -storage -taichi -stellar -shaker -skirt -seymour -semper -splurge -squeak -pearls -pitch -phyllis -pooky -piss -tomas -titfuck -joemama -johnny5 -married -maxi -rhubarb -ratboy -reload -rooney -redd -1029 -1030 -1220 -anchor -bbking -gryphon -gone -57chevy -494949 -celeron -fishy -fucker1 -roswell -dougie -downer -dicker -diva -domingo -donjuan -nympho -omar -praise -racers -trick -trauma -truck1 -trample -acer -corwin -climax -denmark -cuervo -notnow -nittany -neutron -native -bosco1 -buffa -breaker -hello2 -hydro -estelle -explore -kittys -modem -mooney -weiner -bibi -benfica -yahoo1 -striper -tabasco -supra -383838 -456654 -seneca -serious -shuttle -socks -stanton -thethe -listen -jeter2 -marma -mark1 -metoo -rollin -redleg -redbone -redskin -rocco -1245 -armand -altoids -andrews -barley -away -asswipe -bauhaus -bbbbbb1 -gohome -harrier -golfpro -818181 -6666666 -5000 -5rxypn -calling -checker -calibra -fields -faith1 -fist -fdm7ed -finally -giraffe -glasses -giggles -fringe -gate -georgie -scamper -rrpass1 -duffy -deville -dimples -pacino -ontario -oberon -quest1 -puffer -raining -protect -qwerty7 -trey -tribe -ulysses -tribal -adam25 -compton -collie -davide -norris -namaste -myrtle -bonovox -buckley -bukkake -burning -burner -burly -hun999 -emilie -elmo -enters -enrique -keisha -mohawk -willard -vgirl -whale -vince -jayden -jarrett -1812 -1943 -222333 -bigjim -bigd -zoom -wordup -ziggy1 -yahooo -workout -young1 -written -xmas -zzzzzz1 -surfer1 -strife -tasha1 -skunk -shauna -seth -soft -planes -plum -pimping -thedon -toocool -leeann -laddie -list -lkjh -lara -joke -matty -rene -redrose -1200 -102938 -alexa -antares -ground -goose1 -737373 -789987 -6464 -caster -casper1 -cement -chessie -caddy -chill -child -canucks -feeling -gigi -rugby1 -dshade -dudes -dixie1 -owen -olympia -lucas1 -manga -puff -tribble -ussy -core -clint -colt -debra -dealer -newark -husband -hiking -errors -emmett -emilia -koolaid -knight1 -murphy1 -volcano -idunno -2005 -2233 -block -benito -biguns -zapper -zorro1 -0911 -3006 -sixsix -shopper -siobhan -sextoy -sounds -pokey -peabody -titi -think -toast -lister -lambda -joecool -jonas -joyce -juniper -mercer -max123 -manny -massimo -met2002 -reggae -ricky1 -1236 -1228 -1016 -all4one -arianna -asgard -484848 -5683 -6669 -catnip -chat -figure -galant -frenchy -girlies -gabby -garner -screwy -doubled -divers -dte4uw -done -maker -locks -treble -twinkie -trailer -acid -cooking -cococo -cory -dabomb -daffy -dandfa -cyrano -briggs -boners -helium -horton -hoffman -hellas -emperor -killa -wanda -w4g8at -verona -ilikeit -iforget -1944 -blue1 -blazers -benny1 -0069 -0101 -taffy -susie -swim -stokes -4567 -shodan -spoiled -steffen -pissed -pavlov -place -petunia -terrell -thirty -toni -tito -teenie -lily -lillie -ladyboy -jeeper -joyjoy -mantle -mannn -reeves -123aaa -121314 -1021 -1004 -1120 -allen1 -ambers -amstel -ambrose -alice1 -allegro -alley -hatred -gspot -graves -goodsex -harpoon -878787 -8inches -4wwvte -case -chavez -gatsby -fudge -gerry -generic -gareth -fuckme2 -samm -sage -seadog -satchmo -scxakv -santafe -dipper -dingle -dizzy -madmad -london1 -qbg26i -vaughn -tzpvaw -vamp -comedy -comp -cowgirl -dawgs -delaney -nt5d27 -needles -newness -mykids -bryan1 -bouncer -hihihi -iceman1 -herring -horn -hook -hotlips -dynamo -klaus -kittie -kappa -kahlua -muffy -mizzou -mohamed -musical -wannabe -whatup -weller -willy1 -invest -blanche -bear1 -youknow -zelda -yyyyyy1 -070462 -zurich -storms -tail -strat -427900 -shelter -shells -sexy123 -smile1 -sophie1 -stefano -stayout -phish1 -payday -thebear -telefon -kswbdu -larson -jetta -jerky -melina -metro -retire -respect -1216 -1201 -1204 -1222 -1115 -barry1 -676767 -chandra -flesh -furball -gocubs -fruit -gman -gentle -dunbar -dewalt -diver1 -dhip6a -olemiss -ollie -mangos -pretzel -pusssy -tripleh -valdez -clean -comment -crew -clovis -deaths -dandan -darrel -ninguna -noah -bootsie -bp2002 -bourbon -brennan -bumble -books -hose -heyyou -hemlock -hippo -hornets -hogan -excess -extensa -muffin1 -werdna -info -iron -jack1 -1bitch -bmwbmw -bills -zaq123 -wxcvbn -tahoe -talbot -simona -shakur -sexyone -seviyi -sonja -smart1 -speed1 -pepito -terry1 -terrier -laser1 -lite -lancia -jenjen -jolene -midori -message -matteo -mental -miami1 -ronald1 -reason -rhythm -1218 -1026 -123987 -1015 -1103 -armada -austria -gotmilk -hawkins -gray -camila -camp -charge -camero -flex -getoff -glacier -glotest -froggie -gerbil -rugger -donna1 -deutsch -orchard -oyster -ophelia -pajero -m5wkqf -magenta -vantage -tyvugq -uptown -abacab -aaaaaa1 -advance -chuck1 -delmar -nate -navajo -nope -border -iawgk2 -hrfzlz -dylan1 -enrico -encore -emilio -killian -mutant -mizuno -video1 -viewer -weed420 -whales -jaguar1 -insight -1990 -159159 -1love -bliss -bears1 -binder -bigboss -blitz -xqgann -zeke -zardoz -table -3825 -signal -sentra -side -shiva -sonora -squid -slimjim -placid -photon -placebo -pearl1 -test12 -leinad -legman -jeepers -joeblow -mike23 -redcar -rhinos -rjw7x4 -1102 -112211 -alcohol -gwju3g -7bgiqk -7878 -535353 -4snz9g -cccccc1 -carola -cali -fister -fosters -finland -gizzmo -fuller -royalty -rugrat -sandie -rudolf -dooley -dive -doreen -dodo -drop -oemdlg -out3xf -paddy -opennow -puppy1 -quinn -ramjet -under -uncle -abraxas -corner -creed -cocoa -crown -cows -cn42qj -dancer1 -damned -nudity -nimda2k -buick -bobb -braves1 -brook -henrik -higher -dust -karachi -mortis -monies -wally1 -weapon -view -willie1 -vicki -1test -2929 -xytfu7 -yackwin -100100 -0660 -tahiti -talks -332211 -3535 -sedona -seawolf -shine -spleen -slash -spjfet -spooner -spock1 -penis1 -terri -thierry -toohot -large -limpone -johnnie -masterp -maxdog -ribbit -reed -rita -rockin -redhat -rising -1113 -1331 -allday -aladin -andrey -ariel -anytime -athome -basil -goofy1 -gustavo -ha8fyp -goodday -778899 -charon -chappy -caracas -cardiff -canada1 -cajun -catter -freddy1 -frazier -forme -follow -gavin -garlic -sarge -saskia -sanjose -russ -salsa -loop -locutus -malachi -lolipop -punker -rambo1 -quake -twin -aimee -coolcat -crappy -default -dental -deniro -d9ungl -daddys -napoli -nautica -nermal -brick -bogota -board -branch -breath -buds -hulk -hitachi -evans -ender -export -kikiki -kram -mongo -waqw3p -wizzard -visited -whdbtp -whkzyc -image -1fuck -binky -blind -bigred1 -blubber -benz -becky1 -wooden -xrated -0001 -survey -tammy1 -stuffer -3mpz4r -3000 -3some -selina -sierra1 -shampoo -silk -shyshy -standby -poker1 -plus -thought -theshit -torture -light1 -jjjjj1 -jocelyn -menthol -maximo -margaux -medic1 -release -richter -rhino1 -roach -renate -repair -reveal -1209 -1234321 -amigos -apricot -asdfgh1 -hatter -grimace -7xm5rq -6789 -capcom -cheesy -carrots -camping -fanatic -fool -format -fleming -girlie -glover -gilmore -gardner -safeway -ruthie -dogfart -dondon -diapers -odin -opiate -lollol -love12 -loomis -prague -pugsley -program -r29hqq -touch -airman -darkone -cummer -dempsey -damn -nadia -ndeyl5 -natchez -newone -buddys -homely -husky -iceland -hr3ytm -holla -exeter -kimkim -karine -k2trix -kernel -moonman -miles1 -mufasa -mousey -wilma -wilhelm -whites -2277 -blobby -blair -blinky -bikers -becca -blue23 -xman -wyvern -zxzxzx -zsmj2v -suede -t26gn4 -sugars -sylvie -tantra -swoosh -swiss -4226 -4271 -321123 -shoe -shane1 -shelby1 -spades -spain -smother -soup -pisser -photo1 -pebble -phones -peavey -picnic -terra -thistle -tokyo -therapy -lives -linden -kronos -lilbit -linux -marbles -reno -recall -1208 -1138 -1008 -alchemy -atticus -auditt -ballet -hanna -gubber -7474 -797979 -464646 -543210 -4zqauf -4949 -ch5nmk -carlito -chewey -caleb -cheddar -chachi -fever -fine -forlife -giants1 -gates -getit -gamble -gerhard -galileo -g3ujwg -ganja -rufus1 -scouts -discus -dudeman -olympus -oscars -osprey -madcow -locust -loyola -mammoth -proton -rabbit1 -pwxd5x -purple1 -punkass -uyxnyd -tyson1 -abcabc -colts -contour -clement -dddddd1 -cypher -denied -dagmar -name -noles -butters -buford -hoochie -hotel -hoser -eddy -ellis -motown -mp8o6d -wife -2055 -2211 -beavers -bloke -blade1 -yamato -zooropa -050505 -zw6syj -tango1 -swing -stern -swampy -susanna -tammie -445566 -333666 -sexpot -sickboy -spiffy -skylark -slam -pintail -phreak -places -teller -timtim -tires -thighs -left -latex -llamas -lkjhg -letters -lizzard -marlins -metal1 -manu -righton -1127 -alain -alcat -amigo -attract -azrael -hamper -gotenks -golfgti -gutter -h2slca -harman -grace1 -6chid8 -789654 -canine -casio -cazzo -chamber -cbr900 -cabrio -calypso -feline -fungus -goal -g9zns4 -full -giggle -fuck123 -saffron -dogmeat -dunlop -douche -dresden -pappy -oaktree -lydia -luft4 -puta -prayer -ramada -vcradq -tulip -tracy71 -tycoon -click -chitown -corps -couples -code -danman -dada -density -d9ebk7 -cummins -darth -cute -nash -nixon -norbert -nestle -brenda1 -bonanza -bundy -buddies -hotspur -heavy -horror -hufmqw -electro -erasure -enough -etvww4 -ewyuza -eric1 -kinder -kenken -kismet -klaatu -willi -waiting -igor -x35v8l -yogi -ywvxpz -xngwoj -zippy1 -020202 -**** -sweeney -story -sentry -spence -star12 -solace -sledge -states -snyder -star1 -paxton -pkxe62 -pilot1 -pommes -plants -tical -tictac -toes -lemans -kubrick -jys6wz -jonesy -jjjjjj1 -jigga -joelle -mate -riley1 -rosa -relief -1126 -badboy1 -asthma -auggie -hartley -gumbo -616913 -57np39 -56qhxs -4mnveh -cake -forbes -fqkw5m -fresno -godiva -gecko -gladys -gibson1 -fridge -saxman -rowing -sammys -scotts -scout1 -sasasa -samoht -ducky -driller -p3wqaw -nurse -oneone -openit -portia -rapier -pussy2 -ralphie -tuxedo -ulrike -trenton -come -deltas -mytime -nicky -nickie -noname -noles1 -bucker -bopper -bullock -burnout -bryce -hedges -hitter -ekim -espana -eatme69 -elpaso -eeeeee1 -eatme1 -karaoke -kara -misses -willem -webcam -jasons -jakarta -belair -bigdad -beerme -yoshi -yinyang -zimmer -x24ik3 -0000007 -ztmfcq -stopit -stooges -symow8 -strato -2hot4u -ship -simons -skins -shakes -sex1 -shield -snacks -pipe -pitt -pinto -tonton -lager -lizzy -juju -john123 -josiah -jesse1 -jordon -jingles -martian -mario1 -rochard -redwine -requiem -rats -1117 -1014 -1205 -althea -allie -amor -amiga -alpina -alert -banana1 -bahamut -hart -golfman -7uftyx -5432 -5353 -5151 -4747 -byron -chatham -cherie -foxfire -freaked -gayboy -gggggg1 -glenda -glitter -funny1 -scroll -rudolph -saddle -dingbat -digimon -omicron -parsons -ohio -panda1 -loloxx -lululu -racer1 -queen1 -prick -upnfmc -tyrant -trout1 -9skw5g -aceman -acls2h -aaabbb -aggie -comcast -craft -crissy -cloudy -cq2kph -custer -d6o8pm -darian -crumbs -daisey -dasani -needle -mzepab -myporn -narnia -booger1 -bravo1 -budgie -btnjey -hotel6 -humbug -edwin -ewtosi -kobe -keith1 -muff -muschi -wiggle -whatthe -walking -vette1 -vols -virago -intj3a -ishmael -intern -jachin -199999 -2010 -beck -blender -bengal -your -zaqxsw -xray -zebras -yanks -worlds -tadpole -stripes -3737 -4343 -3728 -4444444 -solar -sonne -smalls -sniffer -sonata -squirts -pitcher -pktmxr -points -texaco -lesbos -lilian -l8v53x -jimbeam -josie -jimi -maya -rocket1 -ringer -1219 -123098 -1233 -althor -arch -armando -basher -balboa -bbbbb1 -banks -harriet -gopack -golfnut -8520 -753159 -8dihc6 -666777 -cheeba -chino -cheeky -camel1 -falling -flubber -gianni -gloves -frisbee -fuzzy1 -sauce -schatz -sandra1 -scrotum -scumbag -sabre -samdog -paige -orwell -lunatic -lonnie -lotion -maine -maddux -qn632o -rapper -tracks -ulrich -abacus -902100 -crispy -corky -crane -chooch -d6wnro -cutie -deal -dabulls -dehpye -njqcw4 -nownow -nigger1 -bustle -buddy2 -boingo -bugman -bosshog -bowie -hybrid -hilltop -hotlegs -honesty -hhhhh1 -eloise -evilone -e5pftu -eded -elefant -kenzie -karl -karin -killah -kleenex -mouses -motors -mutley -w00t88 -iloveit -jarjar -incest -indycar -1664 -222777 -2663 -beelch -benben -yitbos -yyyyy1 -yasmin -zapata -zzzzz1 -stooge -taztaz -system1 -3qvqod -3way -456321 -sizzle -simhrq -shrink -shawnee -someday -sparty -sphere -spark -slammed -sober -persian -peppers -ploppy -pn5jvw -poobear -pianos -plaster -testme -tiff -larissa -lennox -jewell -messier -rockey -1229 -1217 -1478 -1009 -amonra -aragon -albino -azazel -grinder -6uldv8 -83y6pv -8888888 -4tlved -515051 -carsten -changes -ffffff1 -foreman -firedog -ggggg1 -gerber -galway -gohan -giveme -geryfe -sayang -rudeboy -savanna -sandals -devine -dougal -drag0n -dga9la -desktop -only -onlyone -otter -pandas -mafia -lombard -luckys -lovejoy -manders -product -qqh92r -pork -radar1 -punani -ptbdhw -turtles -trs8f7 -tramp -ugejvp -abba -acdc -abcd123 -clever -corina -create -crash1 -colony -crosby -delboy -daniele -davinci -niki -nitrox -bonzai -budd -hotter -heeled -heroes -hooyah -hotgirl -i62gbq -horse1 -hills -hpk2qc -epvjb6 -echo -korean -kristie -mnbvc -mind -mommy1 -munster -wade -wiccan -wanted -jacket -2369 -blondy -bismark -beanbag -bjhgfi -ynot -yess -zlzfrh -wolvie -007bond -****** -tanya1 -sxhq65 -stinky1 -3234412 -3ki42x -seville -shimmer -sheryl -sienna -skillet -seaman -solaris -pastor -pasta -pedros -pfloyd -tobydog -lethal -letme1n -leland -jenifer -mario66 -micky -rocky2 -rewq -ripped -1128 -1207 -1104 -1432 -aprilia -alyson -bagels -basic -baggies -barb -barrage -gomez -guru -guard -72d5tn -606060 -4wcqjn -chance1 -catalog -faust -film -flange -fran -fartman -geil -gbhcf2 -glen -fuaqz4 -gameboy -garnet -rotary -seahawk -russel -saab -seal -devlt4 -ditto -drevil -drinker -deuce -donut -octopus -ottawa -porky -q9umoz -rapture -pump -triplex -ue8fpw -trent -trophy -turbos -agent -aaa340 -consult -creepy -craven -class -ddddd1 -dejavu -cuxldv -nettie -nbvibt -nikon -niko -norwood -nascar1 -nolan -bubba2 -boobear -boogers -buff -bully -editor -eagle2 -dynamic -ella -efyreg -edition -kidney -mogwai -morrow -msnxbi -wars -werder -voodoo1 -wheel -iiiiii1 -159951 -1624 -1911a1 -2244 -bedlam -belkin -bill1 -woodrow -xirt2k -worship -?????? -tanaka -swift -susieq -sundown -sukebe -tales -swifty -2fast4u -senate -sexe -shroom -shaun -seaweed -status -snicker -sorrow -spanky1 -spook -patti -pilots -pinch -peddler -theo -tessie -tiger7 -l2g7k3 -lazy -joan -mantra -mariana -mike69 -marshal -mart -mazda6 -riptide -robots -rental -1107 -1130 -142857 -1134 -armored -alvin -alec -alright -bartok -astral -baboon -bahamas -balls1 -bassoon -hcleeb -granite -golf1 -gomets -8vjzus -7890 -789123 -8uiazp -5757 -50cent -camaro1 -cherry1 -chemist -final -firenze -farrell -ganesh -same -doodles -dinger -okinawa -olympic -nursing -orpheus -ohmygod -paisley -null -lounge -mahalo -qwqwqw -qguvyt -rambler -puzzle -poppy1 -turk182 -trotter -vdlxuc -trish -tugboat -valiant -tracie -uwrl7c -coaster -cmfnpu -decimal -debbie1 -dandy -dede -nissan1 -napalm -boats -branden -britt -bonghit -hester -ibxnsm -hhhhhh1 -holger -durham -erwin -equinox -dvader -kimmy -knulla -mustafa -monsoon -mistral -morgana -monica1 -mojave -month -mrbill -vkaxcs -victor1 -wacker -wendell -vfdhif -wilson1 -wavpzt -verena -jarrod -imback -1914 -1monkey -2500 -2255 -blank -bigshow -zoomer -wtcacq -wobble -xmen -xjznq5 -yhwnqc -zzzxxx -streak -393939 -2fchbg -skilled -shakira -shaft -seaside -sigrid -sinful -silicon -smk7366 -sniper1 -staff -slap -smutty -peepers -plokij -pdiddy -thrust -terran -topaz -today1 -lauren1 -lgnu9d -juneau -methos -medina -merlyn -rogue1 -romulus -1202 -1469 -al9agd -aol123 -altec -apollo1 -arse -baker1 -bbb747 -bach -axeman -astro1 -hawks1 -gstring -hannes -8543852 -868686 -4ng62t -5401 -567890 -5232 -catfood -frame -flow -fire1 -fffff1 -fozzie -fluff -fzappa -furious -round -scarab -satin -ruger -destin -diablo2 -doqvq3 -drywall -offroad -luetdi -qcfmtz -pyf8ah -puddles -privacy -rainer -ralph1 -trivia -trewq -tri5a3 -advent -9898 -agyvorc -clarkie -coach1 -courier -contest -christo -corinna -chowder -concept -cyzkhw -davidb -days -de7mdf -nose -nazgul -booboo1 -broad -bonzo -brenna -boot -butch1 -hgfdsa -elmer -elektra -elodie -kermit1 -knife -kaboom -minute -modern -morten -mocha -monday1 -morgoth -ward -weewee -weenie -walters -vorlon -website -wahoo -insider -jayman -1911 -1dallas -1900 -1ranger -2501 -1qaz -bertram -bignuts -bigbad -beebee -billows -belize -bebe -wvj5np -wu4etd -yamaha1 -zebra1 -yankee1 -0311 -????? -stjabn -tainted -3tmnej -shoot -skooter -skelter -sixteen -smack -spice1 -stacey1 -smithy -perrin -pollux -pixie -paulina -piston -pick -poets -pine -toons -tooth -topspin -kugm7b -legends -juliana -jonboy -judge -midland -meteor -mccabe -matter -mayfair -meeting -merrill -raul -riches -reznor -reboot -reject -robyn -renee1 -roadway -1411 -1478963 -1019 -archery -allman -barks -bagpuss -hazmat -gucci -guns -grammy -greek -7kbe9d -7676 -6bjvpe -5lyedn -5858 -5291 -chas -c7lrwu -candys -chateau -ccccc1 -fear -fihdfv -gocats -gaelic -fwsadn -godboy -gldmeo -fx3tuo -fubar1 -garland -gforce -rxmtkp -rulz -sairam -dunhill -dogggg -detect -details -doll -drinks -ov3ajy -lockout -makayla -loves -prima -pvjegu -qhxbij -raphael -totoro -tusymo -tunnel -valeria -tulane -turtle1 -tracy1 -abbey1 -address -clticic -cooper1 -comets -collect -corbin -derick -cyprus -dante1 -dave1 -neal -nexus6 -nero -nogard -norfolk -brent1 -booyah -bootleg -bulls23 -bulls1 -booper -heretic -icecube -hellno -hounds -hoes -howie -hevnm4 -eighty -epson -eeeee1 -eyphed \ No newline at end of file From 166a0564972845465aca14e7fbf6772c50af39d7 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 3 Mar 2016 10:48:04 -0500 Subject: [PATCH 213/245] FIX: Don't show trash can for user deleted posts --- app/assets/javascripts/discourse/widgets/actions-summary.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 b/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 index a09bc5b36b..b776b9a5eb 100644 --- a/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 +++ b/app/assets/javascripts/discourse/widgets/actions-summary.js.es6 @@ -118,7 +118,7 @@ export default createWidget('actions-summary', { body.push(h('div.clearfix')); }); - if (attrs.isDeleted) { + if (attrs.deleted_at) { body.push(h('div.post-action', [ iconNode('trash-o'), ' ', From 79cc602bccd1fd4d4189ae6ba85e957d32333e51 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 3 Mar 2016 11:40:35 -0500 Subject: [PATCH 214/245] FIX: Broken test :fired: --- test/javascripts/widgets/actions-summary-test.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/javascripts/widgets/actions-summary-test.js.es6 b/test/javascripts/widgets/actions-summary-test.js.es6 index 17cb172c60..8d549ff499 100644 --- a/test/javascripts/widgets/actions-summary-test.js.es6 +++ b/test/javascripts/widgets/actions-summary-test.js.es6 @@ -68,7 +68,7 @@ widgetTest('post deleted', { template: '{{mount-widget widget="actions-summary" args=args}}', setup() { this.set('args', { - isDeleted: true, + deleted_at: "2016-01-01", deletedByUsername: 'eviltrout', deletedByAvatarTemplate: '/images/avatar.png' }); From 3b18a5d59d62626ea7060a5670971f9d92c6a1fa Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Thu, 3 Mar 2016 11:58:58 -0500 Subject: [PATCH 215/245] FIX: redirect url after anonymizing a user --- app/assets/javascripts/admin/models/admin-user.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6 index 14b7e3edc3..5c0660fedd 100644 --- a/app/assets/javascripts/admin/models/admin-user.js.es6 +++ b/app/assets/javascripts/admin/models/admin-user.js.es6 @@ -328,7 +328,7 @@ const AdminUser = Discourse.User.extend({ }).then(function(data) { if (data.success) { if (data.username) { - document.location = Discourse.getURL("/admin/users/" + data.username); + document.location = Discourse.getURL("/admin/users/" + user.get('id') + "/" + data.username); } else { document.location = Discourse.getURL("/admin/users/list/active"); } From 341037d6fbd847539fb0f802b339d552bf0db7f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 3 Mar 2016 18:52:32 +0100 Subject: [PATCH 216/245] FIX: less restricting 'BACKUP_ROUTE_FORMAT' --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 8b77b6fc91..f324bca3ae 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -7,9 +7,9 @@ require_dependency "permalink_constraint" # This used to be User#username_format, but that causes a preload of the User object # and makes Guard not work properly. -USERNAME_ROUTE_FORMAT = /[A-Za-z0-9\_.\-]+/ unless defined? USERNAME_ROUTE_FORMAT +USERNAME_ROUTE_FORMAT = /[\w.\-]+/ unless defined? USERNAME_ROUTE_FORMAT -BACKUP_ROUTE_FORMAT = /[a-zA-Z0-9\-_]*\d{4}(-\d{2}){2}-\d{6}\.(tar\.gz|t?gz)/i unless defined? BACKUP_ROUTE_FORMAT +BACKUP_ROUTE_FORMAT = /[\w.\-]+\.(tar\.gz|tgz)/i unless defined? BACKUP_ROUTE_FORMAT Discourse::Application.routes.draw do From 8d4bac7da2715c44c5a9c62aa23e2e01a304dd49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Thu, 3 Mar 2016 19:39:22 +0100 Subject: [PATCH 217/245] fix build & add migration to clear common passwords cache --- db/migrate/20160303183607_clear_common_passwords_cache.rb | 7 +++++++ lib/common_passwords/common_passwords.rb | 1 - spec/controllers/users_controller_spec.rb | 6 +++--- 3 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20160303183607_clear_common_passwords_cache.rb diff --git a/db/migrate/20160303183607_clear_common_passwords_cache.rb b/db/migrate/20160303183607_clear_common_passwords_cache.rb new file mode 100644 index 0000000000..c4ba8042a4 --- /dev/null +++ b/db/migrate/20160303183607_clear_common_passwords_cache.rb @@ -0,0 +1,7 @@ +require "common_passwords/common_passwords" + +class ClearCommonPasswordsCache < ActiveRecord::Migration + def change + $redis.without_namespace.del CommonPasswords::LIST_KEY + end +end diff --git a/lib/common_passwords/common_passwords.rb b/lib/common_passwords/common_passwords.rb index 47ef7c5ec0..0045cc8a36 100644 --- a/lib/common_passwords/common_passwords.rb +++ b/lib/common_passwords/common_passwords.rb @@ -21,7 +21,6 @@ class CommonPasswords password_list.include?(password) end - private class RedisPasswordList diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 042cd40377..9aeeb1b565 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -333,7 +333,7 @@ describe UsersController do old_token = user.auth_token get :password_reset, token: token - put :password_reset, token: token, password: 'newpassword' + put :password_reset, token: token, password: 'hg9ow8yhg98o' expect(response).to be_success expect(assigns[:error]).to be_blank @@ -372,14 +372,14 @@ describe UsersController do end it "logs in the user" do - put :password_reset, token: token, password: 'newpassword' + put :password_reset, token: token, password: 'ksjafh928r' expect(assigns(:user).errors).to be_blank expect(session[:current_user_id]).to be_present end it "doesn't log in the user when not approved" do SiteSetting.expects(:must_approve_users?).returns(true) - put :password_reset, token: token, password: 'newpassword' + put :password_reset, token: token, password: 'ksjafh928r' expect(assigns(:user).errors).to be_blank expect(session[:current_user_id]).to be_blank end From 04990e7c5cd5a6a75a47b8ec5f81f7ce5a032552 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 3 Mar 2016 13:43:43 -0500 Subject: [PATCH 218/245] PERF: Use widgets to render categories in hamburger menu Small change results in 1.3x faster on initial render, 1.7x on subsequent renders. --- .../components/hamburger-category.js.es6 | 13 ------- .../components/hamburger-category.hbs | 9 ----- .../templates/components/hamburger-menu.hbs | 14 +------- .../discourse/widgets/category-link.js.es6 | 10 ++++++ .../widgets/hamburger-categories.js.es6 | 36 +++++++++++++++++++ 5 files changed, 47 insertions(+), 35 deletions(-) delete mode 100644 app/assets/javascripts/discourse/components/hamburger-category.js.es6 delete mode 100644 app/assets/javascripts/discourse/templates/components/hamburger-category.hbs create mode 100644 app/assets/javascripts/discourse/widgets/category-link.js.es6 create mode 100644 app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 diff --git a/app/assets/javascripts/discourse/components/hamburger-category.js.es6 b/app/assets/javascripts/discourse/components/hamburger-category.js.es6 deleted file mode 100644 index 63b08fd70e..0000000000 --- a/app/assets/javascripts/discourse/components/hamburger-category.js.es6 +++ /dev/null @@ -1,13 +0,0 @@ -import computed from 'ember-addons/ember-computed-decorators'; - -export default Ember.Component.extend({ - tagName: 'li', - classNames: ['category-link'], - - @computed('category.unreadTopics', 'category.newTopics') - unreadTotal(unreadTopics, newTopics) { - return parseInt(unreadTopics, 10) + parseInt(newTopics, 10); - }, - - showTopicCount: Ember.computed.not('currentUser') -}); diff --git a/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs b/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs deleted file mode 100644 index 9204b3d42d..0000000000 --- a/app/assets/javascripts/discourse/templates/components/hamburger-category.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{{category-link category allowUncategorized="true"}} - -{{#if unreadTotal}} - {{unreadTotal}} -{{/if}} - -{{#if showTopicCount}} - {{category.topic_count}} -{{/if}} diff --git a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs index 6c3640a6c7..f0bc9397ab 100644 --- a/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs +++ b/app/assets/javascripts/discourse/templates/components/hamburger-menu.hbs @@ -74,19 +74,7 @@ {{plugin-outlet "site-map-links-last"}} {{/menu-links}} - {{#if categories}} - - {{/if}} + {{mount-widget widget='hamburger-categories' args=(as-hash categories=categories)}}
{{#menu-links omitRule="true"}} diff --git a/app/assets/javascripts/discourse/widgets/category-link.js.es6 b/app/assets/javascripts/discourse/widgets/category-link.js.es6 new file mode 100644 index 0000000000..509f531f8a --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/category-link.js.es6 @@ -0,0 +1,10 @@ +import RawHtml from 'discourse/widgets/raw-html'; +import { categoryBadgeHTML } from 'discourse/helpers/category-link'; + +// Right now it's RawHTML. Eventually it should emit nodes +export default class CategoryLink extends RawHtml { + constructor(attrs) { + attrs.html = categoryBadgeHTML(attrs.category, attrs); + super(attrs); + } +}; diff --git a/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 new file mode 100644 index 0000000000..cb86752c36 --- /dev/null +++ b/app/assets/javascripts/discourse/widgets/hamburger-categories.js.es6 @@ -0,0 +1,36 @@ +import { createWidget } from 'discourse/widgets/widget'; +import { h } from 'virtual-dom'; + +createWidget('hamburger-category', { + tagName: 'li.category-link', + + html(c) { + const results = [ this.attach('category_link', { category: c, allowUncategorized: true }) ]; + + const unreadTotal = parseInt(c.get('unreadTopics'), 10) + parseInt(c.get('newTopics'), 10); + if (unreadTotal) { + results.push(h('a.badge.badge-notification', { attributes: { href: c.get('url') } }, unreadTotal.toString())); + } + + if (!this.currentUser) { + results.push(h('b.topics-count', c.get('topic_count').toString())); + } + + return results; + } +}); + +export default createWidget('hamburger-categories', { + tagName: 'ul.category-links.clearfix', + + html(attrs) { + const href = Discourse.getURL('/categories'); + const result = [h('li.heading', + h('a.d-link.categories-link', { attributes: { href } }, I18n.t('filters.categories.title')) + )]; + + const categories = attrs.categories; + if (categories.length === 0) { return; } + return result.concat(categories.map(c => this.attach('hamburger-category', c))); + } +}); From 36f82aa68c1f0f47fb70412b762a01c5fd966abf Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Thu, 3 Mar 2016 23:31:31 +0530 Subject: [PATCH 219/245] FEATURE: enforce admin password validation when signing up via developer email --- .../controllers/create-account.js.es6 | 60 +++++++++---------- app/controllers/users_controller.rb | 3 +- app/services/username_checker_service.rb | 10 +++- lib/validators/password_validator.rb | 6 +- 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index adbd78f6c5..33efac1000 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -16,6 +16,7 @@ export default Ember.Controller.extend(ModalFunctionality, { rejectedPasswords: Em.A([]), prefilledUsername: null, userFields: null, + isDeveloper: false, hasAuthOptions: Em.computed.notEmpty('authOptions'), canCreateLocal: setting('enable_local_logins'), @@ -37,6 +38,7 @@ export default Ember.Controller.extend(ModalFunctionality, { rejectedEmails: [], rejectedPasswords: [], prefilledUsername: null, + isDeveloper: false }); this._createUserFields(); }, @@ -70,8 +72,8 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('authOptions.auth_provider'), passwordInstructions: function() { - return I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); - }.property(), + return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); + }.property('isDeveloper'), nameInstructions: function() { return I18n.t(Discourse.SiteSettings.full_name_required ? 'user.name.instructions_required' : 'user.name.instructions'); @@ -228,41 +230,27 @@ export default Ember.Controller.extend(ModalFunctionality, { const _this = this; if (this.shouldCheckUsernameMatch()) { return Discourse.User.checkUsername(this.get('accountUsername'), this.get('accountEmail')).then(function(result) { - _this.set('globalNicknameExists', false); + _this.set('isDeveloper', false); if (result.available) { - if (result.global_match) { - _this.set('globalNicknameExists', true); - return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ - ok: true, - reason: I18n.t('user.username.global_match') - })); - } else { - return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ - ok: true, - reason: I18n.t('user.username.available') - })); + if (result.is_developer) { + _this.set('isDeveloper', true); } + return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ + ok: true, + reason: I18n.t('user.username.available') + })); } else { if (result.suggestion) { - if (result.global_match !== void 0 && result.global_match === false) { - _this.set('globalNicknameExists', true); - return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ - failed: true, - reason: I18n.t('user.username.global_mismatch', result) - })); - } else { - return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ - failed: true, - reason: I18n.t('user.username.not_available', result) - })); - } + return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ + failed: true, + reason: I18n.t('user.username.not_available', result) + })); } else if (result.errors) { return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ failed: true, reason: result.errors.join(' ') })); } else { - _this.set('globalNicknameExists', true); return _this.set('uniqueUsernameValidation', Discourse.InputValidation.create({ failed: true, reason: I18n.t('user.username.enter_email') @@ -296,8 +284,16 @@ export default Ember.Controller.extend(ModalFunctionality, { return Discourse.InputValidation.create({ failed: true }); } - // If too short - if (password.length < Discourse.SiteSettings.min_password_length) { + // If too short for Admin + if (this.get('isDeveloper') && password.length < Discourse.SiteSettings.min_admin_password_length) { + return Discourse.InputValidation.create({ + failed: true, + reason: I18n.t('user.password.too_short') + }); + } + + // If too short for normal user + if (!this.get('isDeveloper') && password.length < Discourse.SiteSettings.min_password_length) { return Discourse.InputValidation.create({ failed: true, reason: I18n.t('user.password.too_short') @@ -330,7 +326,7 @@ export default Ember.Controller.extend(ModalFunctionality, { ok: true, reason: I18n.t('user.password.ok') }); - }.property('accountPassword', 'rejectedPasswords.@each', 'accountUsername', 'accountEmail'), + }.property('accountPassword', 'rejectedPasswords.@each', 'accountUsername', 'accountEmail', 'isDeveloper'), @on('init') fetchConfirmationValue() { @@ -360,6 +356,7 @@ export default Ember.Controller.extend(ModalFunctionality, { this.set('formSubmitted', true); return Discourse.User.createAccount(attrs).then(function(result) { + self.set('isDeveloper', false); if (result.success) { // Trigger the browser's password manager using the hidden static login form: const $hidden_login_form = $('#hidden-login-form'); @@ -369,6 +366,9 @@ export default Ember.Controller.extend(ModalFunctionality, { $hidden_login_form.submit(); } else { self.flash(result.message || I18n.t('create_account.failed'), 'error'); + if (result.is_developer) { + self.set('isDeveloper', true); + } if (result.errors && result.errors.email && result.errors.email.length > 0 && result.values) { self.get('rejectedEmails').pushObject(result.values.email); } diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 3a9f77942f..574354022c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -343,7 +343,8 @@ class UsersController < ApplicationController errors: user.errors.full_messages.join("\n") ), errors: user.errors.to_hash, - values: user.attributes.slice('name', 'username', 'email') + values: user.attributes.slice('name', 'username', 'email'), + is_developer: UsernameCheckerService.new.is_developer?(user.email) } end rescue ActiveRecord::StatementInvalid diff --git a/app/services/username_checker_service.rb b/app/services/username_checker_service.rb index caeea977ae..64beba09b6 100644 --- a/app/services/username_checker_service.rb +++ b/app/services/username_checker_service.rb @@ -6,17 +6,21 @@ class UsernameCheckerService if !validator.valid_format? {errors: validator.errors} else - check_username_availability(username) + check_username_availability(username, email) end end end - def check_username_availability(username) + def check_username_availability(username, email) if User.username_available?(username) - { available: true } + { available: true, is_developer: is_developer?(email) } else { available: false, suggestion: UserNameSuggester.suggest(username) } end end + def is_developer?(value) + Rails.configuration.respond_to?(:developer_emails) && Rails.configuration.developer_emails.include?(value) + end + end diff --git a/lib/validators/password_validator.rb b/lib/validators/password_validator.rb index 3eb94a095a..7b8ee765e2 100644 --- a/lib/validators/password_validator.rb +++ b/lib/validators/password_validator.rb @@ -6,7 +6,7 @@ class PasswordValidator < ActiveModel::EachValidator return unless record.password_required? if value.nil? record.errors.add(attribute, :blank) - elsif value.length < SiteSetting.min_admin_password_length && record.admin? + elsif value.length < SiteSetting.min_admin_password_length && (record.admin? || is_developer?(record.email)) record.errors.add(attribute, :too_short, count: SiteSetting.min_admin_password_length) elsif value.length < SiteSetting.min_password_length record.errors.add(attribute, :too_short, count: SiteSetting.min_password_length) @@ -19,4 +19,8 @@ class PasswordValidator < ActiveModel::EachValidator end end + def is_developer?(value) + Rails.configuration.respond_to?(:developer_emails) && Rails.configuration.developer_emails.include?(value) + end + end From 7ddb7ff4290600f5bcb64ec230ee36197fb56880 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 4 Mar 2016 01:12:41 +0530 Subject: [PATCH 220/245] code optimization --- .../discourse/controllers/create-account.js.es6 | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index 33efac1000..5b0864df78 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -72,7 +72,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('authOptions.auth_provider'), passwordInstructions: function() { - return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); + return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: this.siteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: this.siteSettings.min_password_length}); }.property('isDeveloper'), nameInstructions: function() { @@ -284,16 +284,9 @@ export default Ember.Controller.extend(ModalFunctionality, { return Discourse.InputValidation.create({ failed: true }); } - // If too short for Admin - if (this.get('isDeveloper') && password.length < Discourse.SiteSettings.min_admin_password_length) { - return Discourse.InputValidation.create({ - failed: true, - reason: I18n.t('user.password.too_short') - }); - } - - // If too short for normal user - if (!this.get('isDeveloper') && password.length < Discourse.SiteSettings.min_password_length) { + // If too short + const passwordLength = this.get('isDeveloper') ? this.siteSettings.min_admin_password_length : this.siteSettings.min_password_length; + if (password.length < passwordLength) { return Discourse.InputValidation.create({ failed: true, reason: I18n.t('user.password.too_short') From a20a52b25f3671ba2553b72c4f528eb3e3f24aa8 Mon Sep 17 00:00:00 2001 From: scossar Date: Tue, 9 Feb 2016 15:54:13 -0800 Subject: [PATCH 221/245] add user locale --- app/mailers/user_notifications.rb | 14 ++++++- lib/email/message_builder.rb | 6 +-- spec/mailers/user_notifications_spec.rb | 51 +++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index 9aca0902eb..81ea701312 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -11,37 +11,43 @@ class UserNotifications < ActionMailer::Base def signup(user, opts={}) build_email(user.email, template: "user_notifications.signup", + locale: user_locale(user), email_token: opts[:email_token]) end def signup_after_approval(user, opts={}) build_email(user.email, template: 'user_notifications.signup_after_approval', + locale: user_locale(user), email_token: opts[:email_token], - new_user_tips: I18n.t('system_messages.usage_tips.text_body_template', base_url: Discourse.base_url)) + new_user_tips: I18n.t('system_messages.usage_tips.text_body_template', base_url: Discourse.base_url, locale: locale)) end def authorize_email(user, opts={}) build_email(user.email, template: "user_notifications.authorize_email", + locale: user_locale(user), email_token: opts[:email_token]) end def forgot_password(user, opts={}) build_email(user.email, template: user.has_password? ? "user_notifications.forgot_password" : "user_notifications.set_password", + locale: user_locale(user), email_token: opts[:email_token]) end def admin_login(user, opts={}) build_email(user.email, template: "user_notifications.admin_login", + locale: user_locale(user), email_token: opts[:email_token]) end def account_created(user, opts={}) build_email(user.email, template: "user_notifications.account_created", + locale: user_locale(user), email_token: opts[:email_token]) end @@ -181,6 +187,10 @@ class UserNotifications < ActionMailer::Base protected + def user_locale(user) + user.respond_to?(:locale) ? user.locale : nil + end + def email_post_markdown(post) result = "[email-indent]\n" result << "#{post.raw}\n\n" @@ -264,6 +274,7 @@ class UserNotifications < ActionMailer::Base from_alias = opts[:from_alias] notification_type = opts[:notification_type] user = opts[:user] + locale = user_locale(user) # category name category = Topic.find_by(id: post.topic_id).category @@ -338,6 +349,7 @@ class UserNotifications < ActionMailer::Base site_description: SiteSetting.site_description, site_title: SiteSetting.title, style: :notification, + locale: locale } # If we have a display name, change the from address diff --git a/lib/email/message_builder.rb b/lib/email/message_builder.rb index efa0eeab40..991620e3ad 100644 --- a/lib/email/message_builder.rb +++ b/lib/email/message_builder.rb @@ -28,7 +28,7 @@ module Email }.merge!(@opts) if @template_args[:url].present? - @template_args[:header_instructions] = I18n.t('user_notifications.header_instructions') + @template_args[:header_instructions] = I18n.t('user_notifications.header_instructions', locale: @opts[:locale]) if @opts[:include_respond_instructions] == false @template_args[:respond_instructions] = '' @@ -67,7 +67,7 @@ module Email html_override.gsub!("%{unsubscribe_link}", unsubscribe_link) if SiteSetting.unsubscribe_via_email_footer && @opts[:add_unsubscribe_via_email_link] - unsubscribe_via_email_link = PrettyText.cook(I18n.t('unsubscribe_via_email_link', hostname: Discourse.current_hostname), sanitize: false).html_safe + unsubscribe_via_email_link = PrettyText.cook(I18n.t('unsubscribe_via_email_link', hostname: Discourse.current_hostname, locale: @opts[:locale]), sanitize: false).html_safe html_override.gsub!("%{unsubscribe_via_email_link}", unsubscribe_via_email_link) else html_override.gsub!("%{unsubscribe_via_email_link}", "") @@ -114,7 +114,7 @@ module Email body << "\n" body << I18n.t('unsubscribe_link', template_args) if SiteSetting.unsubscribe_via_email_footer && @opts[:add_unsubscribe_via_email_link] - body << I18n.t('unsubscribe_via_email_link', hostname: Discourse.current_hostname) + body << I18n.t('unsubscribe_via_email_link', hostname: Discourse.current_hostname, locale: @opts[:locale]) end end diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb index 4123b40da1..29466c08c0 100644 --- a/spec/mailers/user_notifications_spec.rb +++ b/spec/mailers/user_notifications_spec.rb @@ -268,6 +268,15 @@ describe UserNotifications do end end + # The parts of emails that are derived from templates are translated + shared_examples "sets user locale" do + context "set locale for translating templates" do + it "sets the locale" do + expects_build_with(has_key(:locale)) + end + end + end + shared_examples "notification email building" do let(:post) { Fabricate(:post, user: user) } let(:mail_type) { "user_#{notification_type}"} @@ -341,6 +350,7 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :mentioned } include_examples "supports reply by email" + include_examples "sets user locale" end end @@ -348,6 +358,7 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :replied } include_examples "supports reply by email" + include_examples "sets user locale" end end @@ -355,6 +366,7 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :quoted } include_examples "supports reply by email" + include_examples "sets user locale" end end @@ -362,6 +374,7 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :posted } include_examples "supports reply by email" + include_examples "sets user locale" end end @@ -369,6 +382,7 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :invited_to_private_message } include_examples "no reply by email" + include_examples "sets user locale" end end @@ -376,7 +390,44 @@ describe UserNotifications do include_examples "notification email building" do let(:notification_type) { :invited_to_topic } include_examples "no reply by email" + include_examples "sets user locale" end end + # notification emails derived from templates are translated into the user's locale + shared_examples "notification derived from template" do + let(:user) { Fabricate(:user, locale: locale) } + let(:mail_type) { mail_type } + let(:notification) { Fabricate(:notification, user: user) } + end + + describe "notifications from template" do + + context "user locale has been set" do + + %w(signup signup_after_approval authorize_email forgot_password admin_login account_created).each do |mail_type| + include_examples "notification derived from template" do + SiteSetting.default_locale = "en" + let(:locale) { "fr" } + let(:mail_type) { mail_type } + it "sets the locale" do + expects_build_with(has_entry(:locale, "fr")) + end + end + end + end + + context "user locale has not been set" do + %w(signup signup_after_approval authorize_email forgot_password admin_login account_created).each do |mail_type| + include_examples "notification derived from template" do + SiteSetting.default_locale = "en" + let(:locale) { nil } + let(:mail_type) { mail_type } + it "sets the locale" do + expects_build_with(has_entry(:locale, nil)) + end + end + end + end + end end From 71911a4c67e325bb83a3ef9f2641ec6dd8a93fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 4 Mar 2016 10:52:23 +0100 Subject: [PATCH 222/245] fix build --- .../javascripts/discourse/controllers/create-account.js.es6 | 4 ++-- test/javascripts/controllers/create-account-test.js.es6 | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index 5b0864df78..8d07058990 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -72,7 +72,7 @@ export default Ember.Controller.extend(ModalFunctionality, { }.property('authOptions.auth_provider'), passwordInstructions: function() { - return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: this.siteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: this.siteSettings.min_password_length}); + return this.get('isDeveloper') ? I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_admin_password_length}) : I18n.t('user.password.instructions', {count: Discourse.SiteSettings.min_password_length}); }.property('isDeveloper'), nameInstructions: function() { @@ -285,7 +285,7 @@ export default Ember.Controller.extend(ModalFunctionality, { } // If too short - const passwordLength = this.get('isDeveloper') ? this.siteSettings.min_admin_password_length : this.siteSettings.min_password_length; + const passwordLength = this.get('isDeveloper') ? Discourse.SiteSettings.min_admin_password_length : Discourse.SiteSettings.min_password_length; if (password.length < passwordLength) { return Discourse.InputValidation.create({ failed: true, diff --git a/test/javascripts/controllers/create-account-test.js.es6 b/test/javascripts/controllers/create-account-test.js.es6 index 4c202880aa..0f7284be6f 100644 --- a/test/javascripts/controllers/create-account-test.js.es6 +++ b/test/javascripts/controllers/create-account-test.js.es6 @@ -28,11 +28,11 @@ test('passwordValidation', function() { var controller = subject(); controller.set('passwordRequired', true); - controller.set('accountEmail', 'pork@chops.com'); - controller.set('accountUsername', 'porkchops'); + controller.set('accountEmail', 'pork@chops.com'); + controller.set('accountUsername', 'porkchops'); controller.set('prefilledUsername', 'porkchops'); - controller.set('accountPassword', 'b4fcdae11f9167'); + controller.set('accountPassword', 'b4fcdae11f9167'); equal(controller.get('passwordValidation.ok'), true, 'Password is ok'); equal(controller.get('passwordValidation.reason'), I18n.t('user.password.ok'), 'Password is valid'); From 8b1772ac0fbb32dafa8a18e4600161d7095df411 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Fri, 4 Mar 2016 22:55:49 +1100 Subject: [PATCH 223/245] FIX: if user undos like, and relikes notify FEATURE: roll up likes for notify on all likes --- .../components/notification-item.js.es6 | 12 +++- app/models/post_action.rb | 7 ++- app/models/post_alert_observer.rb | 61 ++++++++++++++++++- app/services/post_alerter.rb | 17 +++++- config/locales/client.en.yml | 4 ++ spec/models/post_alert_observer_spec.rb | 5 +- spec/services/post_alerter_spec.rb | 43 +++++++++++-- 7 files changed, 132 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/discourse/components/notification-item.js.es6 b/app/assets/javascripts/discourse/components/notification-item.js.es6 index 844bf83edf..64411038df 100644 --- a/app/assets/javascripts/discourse/components/notification-item.js.es6 +++ b/app/assets/javascripts/discourse/components/notification-item.js.es6 @@ -1,3 +1,4 @@ +const LIKED_TYPE = 5; const INVITED_TYPE = 8; const GROUP_SUMMARY_TYPE = 16; @@ -80,7 +81,16 @@ export default Ember.Component.extend({ const count = notification.get('data.inbox_count'); const group_name = notification.get('data.group_name'); text = I18n.t(this.get('scope'), {count, group_name}); - } else { + } else if (notification.get('notification_type') === LIKED_TYPE && notification.get("data.count") > 1) { + const count = notification.get('data.count') - 2; + const username2 = notification.get('data.username2'); + if (count===0) { + text = I18n.t('notifications.liked_2', {description, username, username2}); + } else { + text = I18n.t('notifications.liked_many', {description, username, username2, count}); + } + } + else { text = I18n.t(this.get('scope'), {description, username}); } text = Discourse.Emoji.unescape(text); diff --git a/app/models/post_action.rb b/app/models/post_action.rb index 943dbc8ebd..d84c9a808f 100644 --- a/app/models/post_action.rb +++ b/app/models/post_action.rb @@ -147,10 +147,10 @@ SQL # so callback is called action.save action.add_moderator_post_if_needed(moderator, :agreed, delete_post) - @trigger_spam = true if action.post_action_type_id == PostActionType.types[:spam] + trigger_spam = true if action.post_action_type_id == PostActionType.types[:spam] end - DiscourseEvent.trigger(:confirmed_spam_post, post) if @trigger_spam + DiscourseEvent.trigger(:confirmed_spam_post, post) if trigger_spam update_flagged_posts_count end @@ -272,6 +272,7 @@ SQL post_action.recover! action_attrs.each { |attr, val| post_action.send("#{attr}=", val) } post_action.save + PostAlertObserver.after_create_post_action(post_action) else post_action = create(where_attrs.merge(action_attrs)) if post_action && post_action.errors.count == 0 @@ -480,7 +481,7 @@ SQL elsif PostActionType.auto_action_flag_types.include?(post_action_type) && SiteSetting.flags_required_to_hide_post > 0 - old_flags, new_flags = PostAction.flag_counts_for(post.id) + _old_flags, new_flags = PostAction.flag_counts_for(post.id) if new_flags >= SiteSetting.flags_required_to_hide_post hide_post!(post, post_action_type, guess_hide_reason(post)) diff --git a/app/models/post_alert_observer.rb b/app/models/post_alert_observer.rb index ce2b366526..f1913ab776 100644 --- a/app/models/post_alert_observer.rb +++ b/app/models/post_alert_observer.rb @@ -1,10 +1,14 @@ class PostAlertObserver < ActiveRecord::Observer observe :post_action, :post_revision - def alerter + def self.alerter @alerter ||= PostAlerter.new end + def alerter + self.class.alerter + end + # Dispatch to an after_save_#{class_name} method def after_save(model) method_name = callback_for('after_save', model) @@ -17,13 +21,60 @@ class PostAlertObserver < ActiveRecord::Observer send(method_name, model) if respond_to?(method_name) end + def refresh_like_notification(post, read) + return unless post && post.user_id + + usernames = post.post_actions.where(post_action_type_id: PostActionType.types[:like]) + .joins(:user) + .order('post_actions.created_at desc') + .where('post_actions.created_at > ?', 1.day.ago) + .pluck(:username) + + if usernames.length > 0 + data = { + topic_title: post.topic.title, + username: usernames[0], + display_username: usernames[0], + username2: usernames[1], + count: usernames.length + } + Notification.create( + notification_type: Notification.types[:liked], + topic_id: post.topic_id, + post_number: post.post_number, + user_id: post.user_id, + read: read, + data: data.to_json + ) + end + end + def after_save_post_action(post_action) # We only care about deleting post actions for now return if post_action.deleted_at.blank? - Notification.where(post_action_id: post_action.id).each(&:destroy) + + if post_action.post_action_type_id == PostActionType.types[:like] && post_action.post + + read = true + + Notification.where( + topic_id: post_action.post.topic_id, + user_id: post_action.post.user_id, + post_number: post_action.post.post_number, + notification_type: Notification.types[:liked] + ).each do |notification| + read = false unless notification.read + notification.destroy + end + + refresh_like_notification(post_action.post, read) + else + # not using destroy_all cause we want stuff to trigger + Notification.where(post_action_id: post_action.id).each(&:destroy) + end end - def after_create_post_action(post_action) + def self.after_create_post_action(post_action) # We only notify on likes for now return unless post_action.is_like? @@ -40,6 +91,10 @@ class PostAlertObserver < ActiveRecord::Observer ) end + def after_create_post_action(post_action) + self.class.after_create_post_action(post_action) + end + def after_create_post_revision(post_revision) post = post_revision.post diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 8fff00b59b..97cbcfc482 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -251,6 +251,19 @@ class PostAlerter return if existing_notification && !should_notify_previous?(user, existing_notification, opts) + notification_data = {} + + if existing_notification && + existing_notification.created_at > 1.day.ago && + user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:always] + + data = existing_notification.data_hash + notification_data["username2"] = data["display_username"] + notification_data["count"] = (data["count"] || 1).to_i + 1 + # don't use destroy so we don't trigger a notification count refresh + Notification.where(id: existing_notification.id).destroy_all + end + collapsed = false if type == Notification.types[:replied] || type == Notification.types[:posted] @@ -287,13 +300,13 @@ class PostAlerter end end - notification_data = { + notification_data.merge!({ topic_title: topic_title, original_post_id: original_post.id, original_post_type: original_post.post_type, original_username: original_username, display_username: opts[:display_username] || post.user.username - } + }) if group = opts[:group] notification_data[:group_id] = group.id diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 9ecbee2a7c..78ce98f7f6 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1014,6 +1014,10 @@ en: posted: "

{{username}} {{description}}

" edited: "

{{username}} {{description}}

" liked: "

{{username}} {{description}}

" + liked_2: "

{{username}}, {{username2}} {{description}}

" + liked_many: + one: "

{{username}}, {{username2}} and 1 other {{description}}

" + other: "

{{username}}, {{username2}} and {{count}} others {{description}}

" private_message: "

{{username}} {{description}}

" invited_to_private_message: "

{{username}} {{description}}

" invited_to_topic: "

{{username}} {{description}}

" diff --git a/spec/models/post_alert_observer_spec.rb b/spec/models/post_alert_observer_spec.rb index c4de604173..be6f8c7876 100644 --- a/spec/models/post_alert_observer_spec.rb +++ b/spec/models/post_alert_observer_spec.rb @@ -21,11 +21,8 @@ describe PostAlertObserver do end context 'when removing a liked post' do - before do - PostAction.act(evil_trout, post, PostActionType.types[:like]) - end - it 'removes a notification' do + PostAction.act(evil_trout, post, PostActionType.types[:like]) expect { PostAction.remove_act(evil_trout, post, PostActionType.types[:like]) }.to change(Notification, :count).by(-1) diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index b481c88986..82f3a0a274 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -50,12 +50,27 @@ describe PostAlerter do end context 'likes' do + + it 'notifies on likes after an undo' do + ActiveRecord::Base.observers.enable :all + + post = Fabricate(:post, raw: 'I love waffles') + + PostAction.act(evil_trout, post, PostActionType.types[:like]) + PostAction.remove_act(evil_trout, post, PostActionType.types[:like]) + PostAction.act(evil_trout, post, PostActionType.types[:like]) + + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) + end + it 'notifies on likes correctly' do ActiveRecord::Base.observers.enable :all post = Fabricate(:post, raw: 'I love waffles') + PostAction.act(evil_trout, post, PostActionType.types[:like]) - PostAction.act(Fabricate(:admin), post, PostActionType.types[:like]) + admin = Fabricate(:admin) + PostAction.act(admin, post, PostActionType.types[:like]) # one like expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) @@ -66,8 +81,28 @@ describe PostAlerter do admin2 = Fabricate(:admin) PostAction.act(admin2, post, PostActionType.types[:like]) - # two likes one edit - expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(2) + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) + + # adds info to the notification + notification = Notification.find_by(post_number: 1, + topic_id: post.topic_id) + + + expect(notification.data_hash["count"].to_i).to eq(2) + expect(notification.data_hash["username2"]).to eq(evil_trout.username) + + # this is a tricky thing ... removing a like should fix up the notifications + PostAction.remove_act(evil_trout, post, PostActionType.types[:like]) + + # rebuilds the missing notification + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) + notification = Notification.find_by(post_number: 1, + topic_id: post.topic_id) + + expect(notification.data_hash["count"]).to eq(2) + expect(notification.data_hash["username"]).to eq(admin2.username) + expect(notification.data_hash["username2"]).to eq(admin.username) + post.user.user_option.update_columns(like_notification_frequency: UserOption.like_notification_frequency_type[:first_time_and_daily]) @@ -82,7 +117,7 @@ describe PostAlerter do end # first happend within the same day, no need to notify - expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(3) + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(2) end end From 759803708077dc061ec4449395abb3505486e4fd Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Fri, 4 Mar 2016 23:17:14 +1100 Subject: [PATCH 224/245] Only pull in gem if it is being used, remove middleware --- Gemfile | 2 +- app/controllers/application_controller.rb | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index bac86ca0c2..9ccf3da501 100644 --- a/Gemfile +++ b/Gemfile @@ -45,7 +45,7 @@ gem 'active_model_serializers', '~> 0.8.3' gem 'onebox' -gem 'http_accept_language', '~>2.0.5' +gem 'http_accept_language', '~>2.0.5', require: false gem 'ember-rails' gem 'ember-source', '1.12.2' diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 2e2462ec96..8a09c8fbee 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -321,8 +321,10 @@ class ApplicationController < ActionController::Base begin # Rails I18n uses underscores between the locale and the region; the request # headers use hyphens. + require 'http_accept_language' unless defined? HttpAcceptLanguage available_locales = I18n.available_locales.map { |locale| locale.to_s.gsub(/_/, '-') } - http_accept_language.language_region_compatible_from(available_locales).gsub(/-/, '_') + parser = HttpAcceptLanguage::Parser.new(request.env["HTTP_ACCEPT_LANGUAGE"]) + parser.language_region_compatible_from(available_locales).gsub(/-/, '_') rescue # If Accept-Language headers are not set. I18n.default_locale From b2b7342d53523d8a7170dc8d5769c00b0b1f9a66 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Fri, 4 Mar 2016 22:33:47 +0530 Subject: [PATCH 225/245] UX: Mobile specific style for Admin IP Lookup box --- app/assets/stylesheets/common/admin/admin_base.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index 15e1ff697b..7be08fb75e 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -1850,6 +1850,12 @@ table#user-badges { margin: 0; } +// Mobile specific style for Admin IP Lookup box +.mobile-view .admin-contents .ip-lookup .location-box { + width: 300px; + left: 20px; +} + .cboxcontainer { display: inline-block; padding: 8px; From 8d6579c72975a4f877413f86ab4ef7069d871345 Mon Sep 17 00:00:00 2001 From: Joe Buhlig Date: Thu, 25 Feb 2016 10:22:23 -0600 Subject: [PATCH 226/245] Added ability to create topic sorts in plugins with custom_fields --- lib/topic_query.rb | 5 +++++ spec/components/topic_query_spec.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/topic_query.rb b/lib/topic_query.rb index cdd5abbb4b..1c061107c4 100644 --- a/lib/topic_query.rb +++ b/lib/topic_query.rb @@ -401,6 +401,11 @@ class TopicQuery return result.includes(:first_post).order("(SELECT like_count FROM posts p3 WHERE p3.topic_id = topics.id AND p3.post_number = 1) #{sort_dir}") end + if sort_column.start_with?('custom_fields') + field = sort_column.split('.')[1] + return result.order("(SELECT CASE WHEN EXISTS (SELECT true FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') THEN (SELECT value::integer FROM topic_custom_fields tcf WHERE tcf.topic_id::integer = topics.id::integer AND tcf.name = '#{field}') ELSE 0 END) #{sort_dir}") + end + result.order("topics.#{sort_column} #{sort_dir}") end diff --git a/spec/components/topic_query_spec.rb b/spec/components/topic_query_spec.rb index fad4faaea0..276ee76567 100644 --- a/spec/components/topic_query_spec.rb +++ b/spec/components/topic_query_spec.rb @@ -232,6 +232,33 @@ describe TopicQuery do # returns the topics in reverse posters order if requested" do expect(ids_in_order('posters', false)).to eq([archived_topic, closed_topic, invisible_topic, future_topic, regular_topic, pinned_topic].map(&:id)) + + # sets a custom field for each topic to emulate a plugin + regular_topic.custom_fields["sheep"] = 26 + pinned_topic.custom_fields["sheep"] = 47 + archived_topic.custom_fields["sheep"] = 69 + invisible_topic.custom_fields["sheep"] = 12 + closed_topic.custom_fields["sheep"] = 31 + future_topic.custom_fields["sheep"] = 53 + + regular_topic.save + pinned_topic.save + archived_topic.save + invisible_topic.save + closed_topic.save + future_topic.save + + # adds the custom field as a viable sort option + class ::TopicQuery + SORTABLE_MAPPING["sheep"] = "custom_fields.sheep" + end + # returns the topics in the sheep order if requested" do + expect(ids_in_order('sheep')).to eq([archived_topic, future_topic, pinned_topic, closed_topic, regular_topic, invisible_topic].map(&:id)) + + # returns the topics in reverse sheep order if requested" do + expect(ids_in_order('sheep', false)).to eq([invisible_topic, regular_topic, closed_topic, pinned_topic, future_topic, archived_topic].map(&:id)) + + end end From 396713718b033b578c44aa3156727b178f61a8ac Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Fri, 4 Mar 2016 14:20:44 -0500 Subject: [PATCH 227/245] FEATURE: Adds ~200 more emoji This includes all new emoji from Unicode 7 and Unicode 8 with the exception of skin tones which will require a new interface. --- .../discourse/components/d-editor.js.es6 | 2 +- .../discourse/lib/emoji/emoji-groups.js.es6 | 1114 +- .../discourse/lib/emoji/emoji.js.erb | 7 +- app/models/emoji.rb | 38 +- lib/emoji/db.json | 12593 ++++++---------- .../images/emoji/apple/airplane_arriving.png | Bin 0 -> 6379 bytes .../images/emoji/apple/airplane_departure.png | Bin 0 -> 6298 bytes public/images/emoji/apple/airplane_small.png | Bin 0 -> 3806 bytes public/images/emoji/apple/alembic.png | Bin 0 -> 4687 bytes public/images/emoji/apple/amphora.png | Bin 0 -> 5081 bytes public/images/emoji/apple/anger_right.png | Bin 0 -> 3300 bytes public/images/emoji/apple/atom.png | Bin 0 -> 6731 bytes public/images/emoji/apple/badminton.png | Bin 0 -> 6848 bytes public/images/emoji/apple/ballot_box.png | Bin 0 -> 4767 bytes .../images/emoji/apple/basketball_player.png | Bin 0 -> 5129 bytes public/images/emoji/apple/beach.png | Bin 0 -> 6293 bytes public/images/emoji/apple/beach_umbrella.png | Bin 0 -> 7094 bytes public/images/emoji/apple/bed.png | Bin 0 -> 2411 bytes public/images/emoji/apple/bellhop.png | Bin 0 -> 4764 bytes public/images/emoji/apple/biohazard.png | Bin 0 -> 5757 bytes public/images/emoji/apple/bow_and_arrow.png | Bin 0 -> 6596 bytes public/images/emoji/apple/burrito.png | Bin 0 -> 6398 bytes public/images/emoji/apple/calendar_spiral.png | Bin 0 -> 4927 bytes .../images/emoji/apple/camera_with_flash.png | Bin 0 -> 7186 bytes public/images/emoji/apple/camping.png | Bin 0 -> 5693 bytes public/images/emoji/apple/candle.png | Bin 0 -> 2997 bytes public/images/emoji/apple/card_box.png | Bin 0 -> 4779 bytes public/images/emoji/apple/chains.png | Bin 0 -> 4581 bytes public/images/emoji/apple/champagne.png | Bin 0 -> 5186 bytes public/images/emoji/apple/cheese.png | Bin 0 -> 4706 bytes public/images/emoji/apple/chipmunk.png | Bin 0 -> 8137 bytes public/images/emoji/apple/city_dusk.png | Bin 0 -> 4326 bytes public/images/emoji/apple/cityscape.png | Bin 0 -> 6286 bytes .../images/emoji/apple/classical_building.png | Bin 0 -> 5950 bytes public/images/emoji/apple/clock.png | Bin 0 -> 5849 bytes public/images/emoji/apple/cloud_lightning.png | Bin 0 -> 4792 bytes public/images/emoji/apple/cloud_rain.png | Bin 0 -> 6007 bytes public/images/emoji/apple/cloud_snow.png | Bin 0 -> 6207 bytes public/images/emoji/apple/cloud_tornado.png | Bin 0 -> 7365 bytes public/images/emoji/apple/coffin.png | Bin 0 -> 6337 bytes public/images/emoji/apple/comet.png | Bin 0 -> 3492 bytes public/images/emoji/apple/compression.png | Bin 0 -> 3847 bytes .../images/emoji/apple/construction_site.png | Bin 0 -> 6007 bytes public/images/emoji/apple/control_knobs.png | Bin 0 -> 5054 bytes public/images/emoji/apple/couch.png | Bin 0 -> 4822 bytes public/images/emoji/apple/crab.png | Bin 0 -> 8303 bytes public/images/emoji/apple/crayon.png | Bin 0 -> 3819 bytes public/images/emoji/apple/cricket.png | Bin 0 -> 4574 bytes public/images/emoji/apple/cross.png | Bin 0 -> 4104 bytes public/images/emoji/apple/crossed_swords.png | Bin 0 -> 6822 bytes public/images/emoji/apple/cruise_ship.png | Bin 0 -> 4211 bytes public/images/emoji/apple/dagger.png | Bin 0 -> 3095 bytes public/images/emoji/apple/dark_sunglasses.png | Bin 0 -> 1215 bytes public/images/emoji/apple/desert.png | Bin 0 -> 6692 bytes public/images/emoji/apple/desktop.png | Bin 0 -> 2904 bytes public/images/emoji/apple/dividers.png | Bin 0 -> 4082 bytes public/images/emoji/apple/dove.png | Bin 0 -> 6214 bytes public/images/emoji/apple/eye.png | Bin 0 -> 4859 bytes public/images/emoji/apple/ferry.png | Bin 0 -> 4362 bytes public/images/emoji/apple/field_hockey.png | Bin 0 -> 3364 bytes public/images/emoji/apple/file_cabinet.png | Bin 0 -> 2817 bytes public/images/emoji/apple/film_frames.png | Bin 0 -> 3336 bytes public/images/emoji/apple/flag_black.png | Bin 0 -> 1738 bytes public/images/emoji/apple/flag_cn.png | Bin 0 -> 2688 bytes public/images/emoji/apple/flag_de.png | Bin 0 -> 2277 bytes public/images/emoji/apple/flag_es.png | Bin 0 -> 3912 bytes public/images/emoji/apple/flag_fr.png | Bin 0 -> 2132 bytes public/images/emoji/apple/flag_gb.png | Bin 0 -> 5805 bytes public/images/emoji/apple/flag_it.png | Bin 0 -> 2114 bytes public/images/emoji/apple/flag_jp.png | Bin 0 -> 2143 bytes public/images/emoji/apple/flag_kr.png | Bin 0 -> 3853 bytes public/images/emoji/apple/flag_ru.png | Bin 0 -> 2834 bytes public/images/emoji/apple/flag_us.png | Bin 0 -> 5817 bytes public/images/emoji/apple/flag_white.png | Bin 0 -> 1842 bytes public/images/emoji/apple/fleur-de-lis.png | Bin 0 -> 5364 bytes public/images/emoji/apple/fog.png | Bin 0 -> 5766 bytes .../images/emoji/apple/fork_knife_plate.png | Bin 0 -> 4119 bytes public/images/emoji/apple/frame_photo.png | Bin 0 -> 5020 bytes public/images/emoji/apple/frowning2.png | Bin 0 -> 4716 bytes public/images/emoji/apple/gear.png | Bin 0 -> 7066 bytes public/images/emoji/apple/golfer.png | Bin 0 -> 4446 bytes public/images/emoji/apple/hammer_pick.png | Bin 0 -> 5409 bytes public/images/emoji/apple/hand_splayed.png | Bin 0 -> 4605 bytes public/images/emoji/apple/head_bandage.png | Bin 0 -> 5719 bytes .../images/emoji/apple/heart_exclamation.png | Bin 0 -> 2815 bytes .../images/emoji/apple/helmet_with_cross.png | Bin 0 -> 6377 bytes public/images/emoji/apple/hockey.png | Bin 0 -> 3498 bytes public/images/emoji/apple/hole.png | Bin 0 -> 1988 bytes public/images/emoji/apple/homes.png | Bin 0 -> 6956 bytes public/images/emoji/apple/hot_pepper.png | Bin 0 -> 3723 bytes public/images/emoji/apple/hotdog.png | Bin 0 -> 5832 bytes public/images/emoji/apple/house_abandoned.png | Bin 0 -> 4999 bytes public/images/emoji/apple/hugging.png | Bin 0 -> 7156 bytes public/images/emoji/apple/ice_skate.png | Bin 0 -> 5876 bytes public/images/emoji/apple/island.png | Bin 0 -> 6610 bytes public/images/emoji/apple/joystick.png | Bin 0 -> 4867 bytes public/images/emoji/apple/kaaba.png | Bin 0 -> 3686 bytes public/images/emoji/apple/key2.png | Bin 0 -> 3543 bytes public/images/emoji/apple/keyboard.png | Bin 0 -> 3863 bytes public/images/emoji/apple/label.png | Bin 0 -> 1944 bytes public/images/emoji/apple/level_slider.png | Bin 0 -> 2619 bytes public/images/emoji/apple/levitate.png | Bin 0 -> 2533 bytes public/images/emoji/apple/lifter.png | Bin 0 -> 6129 bytes public/images/emoji/apple/lion_face.png | Bin 0 -> 7534 bytes public/images/emoji/apple/map.png | Bin 0 -> 5432 bytes public/images/emoji/apple/medal.png | Bin 0 -> 4438 bytes public/images/emoji/apple/menorah.png | Bin 0 -> 6915 bytes public/images/emoji/apple/metal.png | Bin 0 -> 3590 bytes public/images/emoji/apple/microphone2.png | Bin 0 -> 3975 bytes public/images/emoji/apple/middle_finger.png | Bin 0 -> 2764 bytes public/images/emoji/apple/military_medal.png | Bin 0 -> 3871 bytes public/images/emoji/apple/money_mouth.png | Bin 0 -> 6007 bytes public/images/emoji/apple/mosque.png | Bin 0 -> 5900 bytes public/images/emoji/apple/motorboat.png | Bin 0 -> 2343 bytes public/images/emoji/apple/motorcycle.png | Bin 0 -> 5145 bytes public/images/emoji/apple/motorway.png | Bin 0 -> 6657 bytes public/images/emoji/apple/mountain.png | Bin 0 -> 5672 bytes public/images/emoji/apple/mountain_snow.png | Bin 0 -> 5737 bytes .../images/emoji/apple/mouse_three_button.png | Bin 0 -> 2711 bytes public/images/emoji/apple/nerd.png | Bin 0 -> 6303 bytes public/images/emoji/apple/newspaper2.png | Bin 0 -> 6528 bytes public/images/emoji/apple/notepad_spiral.png | Bin 0 -> 3445 bytes public/images/emoji/apple/oil.png | Bin 0 -> 2655 bytes public/images/emoji/apple/om_symbol.png | Bin 0 -> 6341 bytes public/images/emoji/apple/orthodox_cross.png | Bin 0 -> 4714 bytes public/images/emoji/apple/paintbrush.png | Bin 0 -> 4190 bytes public/images/emoji/apple/paperclips.png | Bin 0 -> 4946 bytes public/images/emoji/apple/park.png | Bin 0 -> 6440 bytes public/images/emoji/apple/pause_button.png | Bin 0 -> 4109 bytes public/images/emoji/apple/peace.png | Bin 0 -> 5994 bytes public/images/emoji/apple/pen_ballpoint.png | Bin 0 -> 5729 bytes public/images/emoji/apple/pen_fountain.png | Bin 0 -> 2240 bytes public/images/emoji/apple/pick.png | Bin 0 -> 4136 bytes public/images/emoji/apple/ping_pong.png | Bin 0 -> 5450 bytes .../images/emoji/apple/place_of_worship.png | Bin 0 -> 6133 bytes public/images/emoji/apple/play_pause.png | Bin 0 -> 4559 bytes public/images/emoji/apple/popcorn.png | Bin 0 -> 5759 bytes public/images/emoji/apple/prayer_beads.png | Bin 0 -> 7387 bytes public/images/emoji/apple/printer.png | Bin 0 -> 4456 bytes public/images/emoji/apple/projector.png | Bin 0 -> 4510 bytes public/images/emoji/apple/race_car.png | Bin 0 -> 3003 bytes public/images/emoji/apple/radioactive.png | Bin 0 -> 4851 bytes public/images/emoji/apple/railway_track.png | Bin 0 -> 7488 bytes public/images/emoji/apple/record_button.png | Bin 0 -> 4342 bytes public/images/emoji/apple/reminder_ribbon.png | Bin 0 -> 3867 bytes public/images/emoji/apple/robot.png | Bin 0 -> 7397 bytes public/images/emoji/apple/rolling_eyes.png | Bin 0 -> 4765 bytes public/images/emoji/apple/rosette.png | Bin 0 -> 6174 bytes .../images/emoji/apple/satellite_orbital.png | Bin 0 -> 4862 bytes public/images/emoji/apple/scales.png | Bin 0 -> 6133 bytes public/images/emoji/apple/scorpion.png | Bin 0 -> 7934 bytes public/images/emoji/apple/shamrock.png | Bin 0 -> 6001 bytes public/images/emoji/apple/shield.png | Bin 0 -> 4456 bytes public/images/emoji/apple/shinto_shrine.png | Bin 0 -> 4256 bytes public/images/emoji/apple/shopping_bags.png | Bin 0 -> 7607 bytes public/images/emoji/apple/skier.png | Bin 0 -> 6883 bytes .../images/emoji/apple/skull_crossbones.png | Bin 0 -> 5394 bytes .../emoji/apple/sleeping_accommodation.png | Bin 0 -> 2818 bytes public/images/emoji/apple/slight_frown.png | Bin 0 -> 4043 bytes public/images/emoji/apple/slight_smile.png | Bin 0 -> 4048 bytes public/images/emoji/apple/snowman2.png | Bin 0 -> 9856 bytes public/images/emoji/apple/speaking_head.png | Bin 0 -> 3640 bytes public/images/emoji/apple/spider.png | Bin 0 -> 3525 bytes public/images/emoji/apple/spider_web.png | Bin 0 -> 4862 bytes public/images/emoji/apple/spy.png | Bin 0 -> 7834 bytes public/images/emoji/apple/stadium.png | Bin 0 -> 6065 bytes .../images/emoji/apple/star_and_crescent.png | Bin 0 -> 5723 bytes public/images/emoji/apple/star_of_david.png | Bin 0 -> 5695 bytes public/images/emoji/apple/stop_button.png | Bin 0 -> 3737 bytes public/images/emoji/apple/stopwatch.png | Bin 0 -> 4635 bytes public/images/emoji/apple/synagogue.png | Bin 0 -> 5436 bytes public/images/emoji/apple/taco.png | Bin 0 -> 6767 bytes public/images/emoji/apple/ten.png | Bin 0 -> 3496 bytes public/images/emoji/apple/thermometer.png | Bin 0 -> 2404 bytes .../images/emoji/apple/thermometer_face.png | Bin 0 -> 6019 bytes public/images/emoji/apple/thinking.png | Bin 0 -> 5886 bytes .../images/emoji/apple/thunder_cloud_rain.png | Bin 0 -> 6139 bytes public/images/emoji/apple/tickets.png | Bin 0 -> 5048 bytes public/images/emoji/apple/timer.png | Bin 0 -> 7066 bytes public/images/emoji/apple/tools.png | Bin 0 -> 7368 bytes public/images/emoji/apple/track_next.png | Bin 0 -> 4752 bytes public/images/emoji/apple/track_previous.png | Bin 0 -> 4711 bytes public/images/emoji/apple/trackball.png | Bin 0 -> 5625 bytes public/images/emoji/apple/turkey.png | Bin 0 -> 10190 bytes public/images/emoji/apple/umbrella2.png | Bin 0 -> 5020 bytes public/images/emoji/apple/unicorn.png | Bin 0 -> 7746 bytes public/images/emoji/apple/upside_down.png | Bin 0 -> 4105 bytes public/images/emoji/apple/urn.png | Bin 0 -> 4502 bytes public/images/emoji/apple/volleyball.png | Bin 0 -> 6904 bytes public/images/emoji/apple/vulcan.png | Bin 0 -> 4977 bytes public/images/emoji/apple/wastebasket.png | Bin 0 -> 7408 bytes public/images/emoji/apple/wheel_of_dharma.png | Bin 0 -> 6250 bytes public/images/emoji/apple/white_sun_cloud.png | Bin 0 -> 4547 bytes .../emoji/apple/white_sun_rain_cloud.png | Bin 0 -> 5434 bytes .../emoji/apple/white_sun_small_cloud.png | Bin 0 -> 6259 bytes .../images/emoji/apple/wind_blowing_face.png | Bin 0 -> 5480 bytes public/images/emoji/apple/writing_hand.png | Bin 0 -> 5238 bytes public/images/emoji/apple/yin_yang.png | Bin 0 -> 5844 bytes public/images/emoji/apple/zipper_mouth.png | Bin 0 -> 6076 bytes .../emoji/emoji_one/airplane_arriving.png | Bin 0 -> 1088 bytes .../emoji/emoji_one/airplane_departure.png | Bin 0 -> 1064 bytes .../images/emoji/emoji_one/airplane_small.png | Bin 0 -> 1209 bytes public/images/emoji/emoji_one/alembic.png | Bin 0 -> 903 bytes public/images/emoji/emoji_one/amphora.png | Bin 0 -> 1043 bytes public/images/emoji/emoji_one/anger_right.png | Bin 0 -> 579 bytes public/images/emoji/emoji_one/atom.png | Bin 0 -> 706 bytes public/images/emoji/emoji_one/badminton.png | Bin 0 -> 1234 bytes public/images/emoji/emoji_one/ballot_box.png | Bin 0 -> 1292 bytes .../emoji/emoji_one/basketball_player.png | Bin 0 -> 1517 bytes public/images/emoji/emoji_one/beach.png | Bin 0 -> 916 bytes .../images/emoji/emoji_one/beach_umbrella.png | Bin 0 -> 1523 bytes public/images/emoji/emoji_one/bed.png | Bin 0 -> 1527 bytes public/images/emoji/emoji_one/bellhop.png | Bin 0 -> 862 bytes public/images/emoji/emoji_one/biohazard.png | Bin 0 -> 775 bytes .../images/emoji/emoji_one/bow_and_arrow.png | Bin 0 -> 1357 bytes public/images/emoji/emoji_one/burrito.png | Bin 0 -> 3251 bytes .../emoji/emoji_one/calendar_spiral.png | Bin 0 -> 1256 bytes .../emoji/emoji_one/camera_with_flash.png | Bin 0 -> 2007 bytes public/images/emoji/emoji_one/camping.png | Bin 0 -> 1521 bytes public/images/emoji/emoji_one/candle.png | Bin 0 -> 1194 bytes public/images/emoji/emoji_one/card_box.png | Bin 0 -> 1553 bytes public/images/emoji/emoji_one/chains.png | Bin 0 -> 618 bytes public/images/emoji/emoji_one/champagne.png | Bin 0 -> 1913 bytes public/images/emoji/emoji_one/cheese.png | Bin 0 -> 1521 bytes public/images/emoji/emoji_one/chipmunk.png | Bin 0 -> 1374 bytes public/images/emoji/emoji_one/city_dusk.png | Bin 0 -> 440 bytes public/images/emoji/emoji_one/cityscape.png | Bin 0 -> 563 bytes .../emoji/emoji_one/classical_building.png | Bin 0 -> 1001 bytes public/images/emoji/emoji_one/clock.png | Bin 0 -> 575 bytes .../emoji/emoji_one/cloud_lightning.png | Bin 0 -> 724 bytes public/images/emoji/emoji_one/cloud_rain.png | Bin 0 -> 851 bytes public/images/emoji/emoji_one/cloud_snow.png | Bin 0 -> 803 bytes .../images/emoji/emoji_one/cloud_tornado.png | Bin 0 -> 1453 bytes public/images/emoji/emoji_one/coffin.png | Bin 0 -> 2194 bytes public/images/emoji/emoji_one/comet.png | Bin 0 -> 1732 bytes public/images/emoji/emoji_one/compression.png | Bin 0 -> 1754 bytes .../emoji/emoji_one/construction_site.png | Bin 0 -> 659 bytes .../images/emoji/emoji_one/control_knobs.png | Bin 0 -> 1084 bytes public/images/emoji/emoji_one/couch.png | Bin 0 -> 1371 bytes public/images/emoji/emoji_one/crab.png | Bin 0 -> 1348 bytes public/images/emoji/emoji_one/crayon.png | Bin 0 -> 575 bytes public/images/emoji/emoji_one/cricket.png | Bin 0 -> 994 bytes public/images/emoji/emoji_one/cross.png | Bin 0 -> 398 bytes .../images/emoji/emoji_one/crossed_swords.png | Bin 0 -> 1601 bytes public/images/emoji/emoji_one/cruise_ship.png | Bin 0 -> 2544 bytes public/images/emoji/emoji_one/dagger.png | Bin 0 -> 935 bytes .../emoji/emoji_one/dark_sunglasses.png | Bin 0 -> 784 bytes public/images/emoji/emoji_one/desert.png | Bin 0 -> 1470 bytes public/images/emoji/emoji_one/desktop.png | Bin 0 -> 491 bytes public/images/emoji/emoji_one/dividers.png | Bin 0 -> 811 bytes public/images/emoji/emoji_one/dove.png | Bin 0 -> 965 bytes public/images/emoji/emoji_one/eye.png | Bin 0 -> 670 bytes public/images/emoji/emoji_one/ferry.png | Bin 0 -> 607 bytes .../images/emoji/emoji_one/field_hockey.png | Bin 0 -> 1012 bytes .../images/emoji/emoji_one/file_cabinet.png | Bin 0 -> 1393 bytes public/images/emoji/emoji_one/film_frames.png | Bin 0 -> 645 bytes public/images/emoji/emoji_one/flag_black.png | Bin 0 -> 640 bytes public/images/emoji/emoji_one/flag_cn.png | Bin 0 -> 674 bytes public/images/emoji/emoji_one/flag_de.png | Bin 0 -> 496 bytes public/images/emoji/emoji_one/flag_es.png | Bin 0 -> 1286 bytes public/images/emoji/emoji_one/flag_fr.png | Bin 0 -> 439 bytes public/images/emoji/emoji_one/flag_gb.png | Bin 0 -> 899 bytes public/images/emoji/emoji_one/flag_it.png | Bin 0 -> 463 bytes public/images/emoji/emoji_one/flag_jp.png | Bin 0 -> 452 bytes public/images/emoji/emoji_one/flag_kr.png | Bin 0 -> 905 bytes public/images/emoji/emoji_one/flag_ru.png | Bin 0 -> 518 bytes public/images/emoji/emoji_one/flag_us.png | Bin 0 -> 770 bytes public/images/emoji/emoji_one/flag_white.png | Bin 0 -> 638 bytes .../images/emoji/emoji_one/fleur-de-lis.png | Bin 0 -> 1178 bytes public/images/emoji/emoji_one/fog.png | Bin 0 -> 716 bytes .../emoji/emoji_one/fork_knife_plate.png | Bin 0 -> 923 bytes public/images/emoji/emoji_one/frame_photo.png | Bin 0 -> 593 bytes public/images/emoji/emoji_one/frowning2.png | Bin 0 -> 598 bytes public/images/emoji/emoji_one/gear.png | Bin 0 -> 997 bytes public/images/emoji/emoji_one/golfer.png | Bin 0 -> 1224 bytes public/images/emoji/emoji_one/hammer_pick.png | Bin 0 -> 1076 bytes .../images/emoji/emoji_one/hand_splayed.png | Bin 0 -> 1025 bytes .../images/emoji/emoji_one/head_bandage.png | Bin 0 -> 1147 bytes .../emoji/emoji_one/heart_exclamation.png | Bin 0 -> 444 bytes .../emoji/emoji_one/helmet_with_cross.png | Bin 0 -> 958 bytes public/images/emoji/emoji_one/hockey.png | Bin 0 -> 1014 bytes public/images/emoji/emoji_one/hole.png | Bin 0 -> 1392 bytes public/images/emoji/emoji_one/homes.png | Bin 0 -> 1008 bytes public/images/emoji/emoji_one/hot_pepper.png | Bin 0 -> 671 bytes public/images/emoji/emoji_one/hotdog.png | Bin 0 -> 1654 bytes .../emoji/emoji_one/house_abandoned.png | Bin 0 -> 1574 bytes public/images/emoji/emoji_one/hugging.png | Bin 0 -> 1285 bytes public/images/emoji/emoji_one/ice_skate.png | Bin 0 -> 1523 bytes public/images/emoji/emoji_one/island.png | Bin 0 -> 1255 bytes public/images/emoji/emoji_one/joystick.png | Bin 0 -> 1013 bytes public/images/emoji/emoji_one/kaaba.png | Bin 0 -> 1161 bytes public/images/emoji/emoji_one/key2.png | Bin 0 -> 366 bytes public/images/emoji/emoji_one/keyboard.png | Bin 0 -> 543 bytes public/images/emoji/emoji_one/label.png | Bin 0 -> 653 bytes .../images/emoji/emoji_one/level_slider.png | Bin 0 -> 659 bytes public/images/emoji/emoji_one/levitate.png | Bin 0 -> 862 bytes public/images/emoji/emoji_one/lifter.png | Bin 0 -> 1336 bytes public/images/emoji/emoji_one/lion_face.png | Bin 0 -> 1856 bytes public/images/emoji/emoji_one/map.png | Bin 0 -> 1698 bytes public/images/emoji/emoji_one/medal.png | Bin 0 -> 1663 bytes public/images/emoji/emoji_one/menorah.png | Bin 0 -> 1308 bytes public/images/emoji/emoji_one/metal.png | Bin 0 -> 893 bytes public/images/emoji/emoji_one/microphone2.png | Bin 0 -> 635 bytes .../images/emoji/emoji_one/middle_finger.png | Bin 0 -> 915 bytes .../images/emoji/emoji_one/military_medal.png | Bin 0 -> 901 bytes public/images/emoji/emoji_one/money_mouth.png | Bin 0 -> 933 bytes public/images/emoji/emoji_one/mosque.png | Bin 0 -> 937 bytes public/images/emoji/emoji_one/motorboat.png | Bin 0 -> 995 bytes public/images/emoji/emoji_one/motorcycle.png | Bin 0 -> 2418 bytes public/images/emoji/emoji_one/motorway.png | Bin 0 -> 1074 bytes public/images/emoji/emoji_one/mountain.png | Bin 0 -> 1395 bytes .../images/emoji/emoji_one/mountain_snow.png | Bin 0 -> 1177 bytes .../emoji/emoji_one/mouse_three_button.png | Bin 0 -> 918 bytes public/images/emoji/emoji_one/nerd.png | Bin 0 -> 915 bytes public/images/emoji/emoji_one/newspaper2.png | Bin 0 -> 973 bytes .../images/emoji/emoji_one/notepad_spiral.png | Bin 0 -> 1315 bytes public/images/emoji/emoji_one/oil.png | Bin 0 -> 654 bytes public/images/emoji/emoji_one/om_symbol.png | Bin 0 -> 980 bytes .../images/emoji/emoji_one/orthodox_cross.png | Bin 0 -> 269 bytes public/images/emoji/emoji_one/paintbrush.png | Bin 0 -> 943 bytes public/images/emoji/emoji_one/paperclips.png | Bin 0 -> 625 bytes public/images/emoji/emoji_one/park.png | Bin 0 -> 890 bytes .../images/emoji/emoji_one/pause_button.png | Bin 0 -> 151 bytes public/images/emoji/emoji_one/peace.png | Bin 0 -> 921 bytes .../images/emoji/emoji_one/pen_ballpoint.png | Bin 0 -> 681 bytes .../images/emoji/emoji_one/pen_fountain.png | Bin 0 -> 627 bytes public/images/emoji/emoji_one/pick.png | Bin 0 -> 931 bytes public/images/emoji/emoji_one/ping_pong.png | Bin 0 -> 811 bytes .../emoji/emoji_one/place_of_worship.png | Bin 0 -> 567 bytes public/images/emoji/emoji_one/play_pause.png | Bin 0 -> 277 bytes public/images/emoji/emoji_one/popcorn.png | Bin 0 -> 1997 bytes .../images/emoji/emoji_one/prayer_beads.png | Bin 0 -> 1489 bytes public/images/emoji/emoji_one/printer.png | Bin 0 -> 961 bytes public/images/emoji/emoji_one/projector.png | Bin 0 -> 950 bytes public/images/emoji/emoji_one/race_car.png | Bin 0 -> 2101 bytes public/images/emoji/emoji_one/radioactive.png | Bin 0 -> 842 bytes .../images/emoji/emoji_one/railway_track.png | Bin 0 -> 1505 bytes .../images/emoji/emoji_one/record_button.png | Bin 0 -> 374 bytes .../emoji/emoji_one/reminder_ribbon.png | Bin 0 -> 932 bytes public/images/emoji/emoji_one/robot.png | Bin 0 -> 1182 bytes .../images/emoji/emoji_one/rolling_eyes.png | Bin 0 -> 670 bytes public/images/emoji/emoji_one/rosette.png | Bin 0 -> 1316 bytes .../emoji/emoji_one/satellite_orbital.png | Bin 0 -> 752 bytes public/images/emoji/emoji_one/scales.png | Bin 0 -> 1130 bytes public/images/emoji/emoji_one/scorpion.png | Bin 0 -> 1739 bytes public/images/emoji/emoji_one/shamrock.png | Bin 0 -> 1004 bytes public/images/emoji/emoji_one/shield.png | Bin 0 -> 1473 bytes .../images/emoji/emoji_one/shinto_shrine.png | Bin 0 -> 553 bytes .../images/emoji/emoji_one/shopping_bags.png | Bin 0 -> 1247 bytes public/images/emoji/emoji_one/skier.png | Bin 0 -> 1559 bytes .../emoji/emoji_one/skull_crossbones.png | Bin 0 -> 713 bytes .../emoji_one/sleeping_accommodation.png | Bin 0 -> 355 bytes .../images/emoji/emoji_one/slight_frown.png | Bin 0 -> 561 bytes .../images/emoji/emoji_one/slight_smile.png | Bin 0 -> 582 bytes public/images/emoji/emoji_one/snowman2.png | Bin 0 -> 2549 bytes .../images/emoji/emoji_one/speaking_head.png | Bin 0 -> 530 bytes public/images/emoji/emoji_one/spider.png | Bin 0 -> 1824 bytes public/images/emoji/emoji_one/spider_web.png | Bin 0 -> 925 bytes public/images/emoji/emoji_one/spy.png | Bin 0 -> 1120 bytes public/images/emoji/emoji_one/stadium.png | Bin 0 -> 1517 bytes .../emoji/emoji_one/star_and_crescent.png | Bin 0 -> 498 bytes .../images/emoji/emoji_one/star_of_david.png | Bin 0 -> 456 bytes public/images/emoji/emoji_one/stop_button.png | Bin 0 -> 148 bytes public/images/emoji/emoji_one/stopwatch.png | Bin 0 -> 1255 bytes public/images/emoji/emoji_one/synagogue.png | Bin 0 -> 1032 bytes public/images/emoji/emoji_one/taco.png | Bin 0 -> 3383 bytes public/images/emoji/emoji_one/ten.png | Bin 0 -> 557 bytes public/images/emoji/emoji_one/thermometer.png | Bin 0 -> 1234 bytes .../emoji/emoji_one/thermometer_face.png | Bin 0 -> 1284 bytes public/images/emoji/emoji_one/thinking.png | Bin 0 -> 1355 bytes .../emoji/emoji_one/thunder_cloud_rain.png | Bin 0 -> 979 bytes public/images/emoji/emoji_one/tickets.png | Bin 0 -> 1694 bytes public/images/emoji/emoji_one/timer.png | Bin 0 -> 1743 bytes public/images/emoji/emoji_one/tools.png | Bin 0 -> 1194 bytes public/images/emoji/emoji_one/track_next.png | Bin 0 -> 327 bytes .../images/emoji/emoji_one/track_previous.png | Bin 0 -> 323 bytes public/images/emoji/emoji_one/trackball.png | Bin 0 -> 882 bytes public/images/emoji/emoji_one/turkey.png | Bin 0 -> 1224 bytes public/images/emoji/emoji_one/umbrella2.png | Bin 0 -> 919 bytes public/images/emoji/emoji_one/unicorn.png | Bin 0 -> 2071 bytes public/images/emoji/emoji_one/upside_down.png | Bin 0 -> 585 bytes public/images/emoji/emoji_one/urn.png | Bin 0 -> 713 bytes public/images/emoji/emoji_one/volleyball.png | Bin 0 -> 1149 bytes public/images/emoji/emoji_one/vulcan.png | Bin 0 -> 1062 bytes public/images/emoji/emoji_one/wastebasket.png | Bin 0 -> 2401 bytes .../emoji/emoji_one/wheel_of_dharma.png | Bin 0 -> 1258 bytes .../emoji/emoji_one/white_sun_cloud.png | Bin 0 -> 910 bytes .../emoji/emoji_one/white_sun_rain_cloud.png | Bin 0 -> 1136 bytes .../emoji/emoji_one/white_sun_small_cloud.png | Bin 0 -> 971 bytes .../emoji/emoji_one/wind_blowing_face.png | Bin 0 -> 1962 bytes .../images/emoji/emoji_one/writing_hand.png | Bin 0 -> 991 bytes public/images/emoji/emoji_one/yin_yang.png | Bin 0 -> 815 bytes .../images/emoji/emoji_one/zipper_mouth.png | Bin 0 -> 1019 bytes .../images/emoji/google/airplane_arriving.png | Bin 0 -> 1200 bytes .../emoji/google/airplane_departure.png | Bin 0 -> 1275 bytes public/images/emoji/google/airplane_small.png | Bin 0 -> 1742 bytes public/images/emoji/google/alembic.png | Bin 0 -> 2101 bytes public/images/emoji/google/amphora.png | Bin 0 -> 1213 bytes public/images/emoji/google/anger_right.png | Bin 0 -> 1670 bytes public/images/emoji/google/atom.png | Bin 0 -> 1149 bytes public/images/emoji/google/badminton.png | Bin 0 -> 2808 bytes public/images/emoji/google/ballot_box.png | Bin 0 -> 1624 bytes .../images/emoji/google/basketball_player.png | Bin 0 -> 2087 bytes public/images/emoji/google/beach.png | Bin 0 -> 2496 bytes public/images/emoji/google/beach_umbrella.png | Bin 0 -> 1819 bytes public/images/emoji/google/bed.png | Bin 0 -> 835 bytes public/images/emoji/google/bellhop.png | Bin 0 -> 1676 bytes public/images/emoji/google/biohazard.png | Bin 0 -> 2015 bytes public/images/emoji/google/bow_and_arrow.png | Bin 0 -> 2600 bytes public/images/emoji/google/burrito.png | Bin 0 -> 2777 bytes .../images/emoji/google/calendar_spiral.png | Bin 0 -> 1001 bytes .../images/emoji/google/camera_with_flash.png | Bin 0 -> 2657 bytes public/images/emoji/google/camping.png | Bin 0 -> 2945 bytes public/images/emoji/google/candle.png | Bin 0 -> 1272 bytes public/images/emoji/google/card_box.png | Bin 0 -> 1519 bytes public/images/emoji/google/chains.png | Bin 0 -> 1689 bytes public/images/emoji/google/champagne.png | Bin 0 -> 2219 bytes public/images/emoji/google/cheese.png | Bin 0 -> 1496 bytes public/images/emoji/google/chipmunk.png | Bin 0 -> 2771 bytes public/images/emoji/google/city_dusk.png | Bin 0 -> 1985 bytes public/images/emoji/google/cityscape.png | Bin 0 -> 866 bytes .../emoji/google/classical_building.png | Bin 0 -> 1003 bytes public/images/emoji/google/clock.png | Bin 0 -> 1225 bytes .../images/emoji/google/cloud_lightning.png | Bin 0 -> 1480 bytes public/images/emoji/google/cloud_rain.png | Bin 0 -> 1461 bytes public/images/emoji/google/cloud_snow.png | Bin 0 -> 1738 bytes public/images/emoji/google/cloud_tornado.png | Bin 0 -> 1923 bytes public/images/emoji/google/coffin.png | Bin 0 -> 1569 bytes public/images/emoji/google/comet.png | Bin 0 -> 7989 bytes public/images/emoji/google/compression.png | Bin 0 -> 1376 bytes .../images/emoji/google/construction_site.png | Bin 0 -> 1509 bytes public/images/emoji/google/control_knobs.png | Bin 0 -> 2326 bytes public/images/emoji/google/couch.png | Bin 0 -> 1271 bytes public/images/emoji/google/crab.png | Bin 0 -> 2174 bytes public/images/emoji/google/crayon.png | Bin 0 -> 1249 bytes public/images/emoji/google/cricket.png | Bin 0 -> 1944 bytes public/images/emoji/google/cross.png | Bin 0 -> 212 bytes public/images/emoji/google/crossed_swords.png | Bin 0 -> 1409 bytes public/images/emoji/google/cruise_ship.png | Bin 0 -> 1852 bytes public/images/emoji/google/dagger.png | Bin 0 -> 1238 bytes .../images/emoji/google/dark_sunglasses.png | Bin 0 -> 1168 bytes public/images/emoji/google/desert.png | Bin 0 -> 1945 bytes public/images/emoji/google/desktop.png | Bin 0 -> 1008 bytes public/images/emoji/google/dividers.png | Bin 0 -> 605 bytes public/images/emoji/google/dove.png | Bin 0 -> 2477 bytes public/images/emoji/google/eye.png | Bin 0 -> 1507 bytes public/images/emoji/google/ferry.png | Bin 0 -> 1241 bytes public/images/emoji/google/field_hockey.png | Bin 0 -> 1765 bytes public/images/emoji/google/file_cabinet.png | Bin 0 -> 477 bytes public/images/emoji/google/film_frames.png | Bin 0 -> 323 bytes public/images/emoji/google/flag_black.png | Bin 0 -> 1391 bytes public/images/emoji/google/flag_cn.png | Bin 0 -> 1021 bytes public/images/emoji/google/flag_de.png | Bin 0 -> 1374 bytes public/images/emoji/google/flag_es.png | Bin 0 -> 1945 bytes public/images/emoji/google/flag_fr.png | Bin 0 -> 1375 bytes public/images/emoji/google/flag_gb.png | Bin 0 -> 3126 bytes public/images/emoji/google/flag_it.png | Bin 0 -> 1383 bytes public/images/emoji/google/flag_jp.png | Bin 0 -> 1515 bytes public/images/emoji/google/flag_kr.png | Bin 0 -> 2575 bytes public/images/emoji/google/flag_ru.png | Bin 0 -> 1381 bytes public/images/emoji/google/flag_us.png | Bin 0 -> 3160 bytes public/images/emoji/google/flag_white.png | Bin 0 -> 1395 bytes public/images/emoji/google/fleur-de-lis.png | Bin 0 -> 1303 bytes public/images/emoji/google/fog.png | Bin 0 -> 1563 bytes .../images/emoji/google/fork_knife_plate.png | Bin 0 -> 1530 bytes public/images/emoji/google/frame_photo.png | Bin 0 -> 1645 bytes public/images/emoji/google/frowning2.png | Bin 0 -> 1162 bytes public/images/emoji/google/gear.png | Bin 0 -> 1730 bytes public/images/emoji/google/golfer.png | Bin 0 -> 2053 bytes public/images/emoji/google/hammer_pick.png | Bin 0 -> 1478 bytes public/images/emoji/google/hand_splayed.png | Bin 0 -> 1308 bytes public/images/emoji/google/head_bandage.png | Bin 0 -> 1971 bytes .../images/emoji/google/heart_exclamation.png | Bin 0 -> 902 bytes .../images/emoji/google/helmet_with_cross.png | Bin 0 -> 1880 bytes public/images/emoji/google/hockey.png | Bin 0 -> 1455 bytes public/images/emoji/google/hole.png | Bin 0 -> 1011 bytes public/images/emoji/google/homes.png | Bin 0 -> 1865 bytes public/images/emoji/google/hot_pepper.png | Bin 0 -> 1284 bytes public/images/emoji/google/hotdog.png | Bin 0 -> 1764 bytes .../images/emoji/google/house_abandoned.png | Bin 0 -> 1808 bytes public/images/emoji/google/hugging.png | Bin 0 -> 3638 bytes public/images/emoji/google/ice_skate.png | Bin 0 -> 2010 bytes public/images/emoji/google/island.png | Bin 0 -> 1788 bytes public/images/emoji/google/joystick.png | Bin 0 -> 1554 bytes public/images/emoji/google/kaaba.png | Bin 0 -> 1932 bytes public/images/emoji/google/key2.png | Bin 0 -> 1089 bytes public/images/emoji/google/keyboard.png | Bin 0 -> 1483 bytes public/images/emoji/google/label.png | Bin 0 -> 1407 bytes public/images/emoji/google/level_slider.png | Bin 0 -> 804 bytes public/images/emoji/google/levitate.png | Bin 0 -> 1357 bytes public/images/emoji/google/lifter.png | Bin 0 -> 1726 bytes public/images/emoji/google/lion_face.png | Bin 0 -> 2094 bytes public/images/emoji/google/map.png | Bin 0 -> 1412 bytes public/images/emoji/google/medal.png | Bin 0 -> 1304 bytes public/images/emoji/google/menorah.png | Bin 0 -> 1818 bytes public/images/emoji/google/metal.png | Bin 0 -> 1422 bytes public/images/emoji/google/microphone2.png | Bin 0 -> 2334 bytes public/images/emoji/google/middle_finger.png | Bin 0 -> 714 bytes public/images/emoji/google/military_medal.png | Bin 0 -> 1094 bytes public/images/emoji/google/money_mouth.png | Bin 0 -> 1801 bytes public/images/emoji/google/mosque.png | Bin 0 -> 1804 bytes public/images/emoji/google/motorboat.png | Bin 0 -> 1785 bytes public/images/emoji/google/motorcycle.png | Bin 0 -> 1610 bytes public/images/emoji/google/motorway.png | Bin 0 -> 2098 bytes public/images/emoji/google/mountain.png | Bin 0 -> 1213 bytes public/images/emoji/google/mountain_snow.png | Bin 0 -> 1601 bytes .../emoji/google/mouse_three_button.png | Bin 0 -> 1288 bytes public/images/emoji/google/nerd.png | Bin 0 -> 1808 bytes public/images/emoji/google/newspaper2.png | Bin 0 -> 4185 bytes public/images/emoji/google/notepad_spiral.png | Bin 0 -> 988 bytes public/images/emoji/google/oil.png | Bin 0 -> 1222 bytes public/images/emoji/google/om_symbol.png | Bin 0 -> 1354 bytes public/images/emoji/google/orthodox_cross.png | Bin 0 -> 418 bytes public/images/emoji/google/paintbrush.png | Bin 0 -> 1501 bytes public/images/emoji/google/paperclips.png | Bin 0 -> 2372 bytes public/images/emoji/google/park.png | Bin 0 -> 2485 bytes public/images/emoji/google/pause_button.png | Bin 0 -> 139 bytes public/images/emoji/google/peace.png | Bin 0 -> 1148 bytes public/images/emoji/google/pen_ballpoint.png | Bin 0 -> 1505 bytes public/images/emoji/google/pen_fountain.png | Bin 0 -> 1295 bytes public/images/emoji/google/pick.png | Bin 0 -> 1104 bytes public/images/emoji/google/ping_pong.png | Bin 0 -> 1306 bytes .../images/emoji/google/place_of_worship.png | Bin 0 -> 1064 bytes public/images/emoji/google/play_pause.png | Bin 0 -> 383 bytes public/images/emoji/google/popcorn.png | Bin 0 -> 2250 bytes public/images/emoji/google/prayer_beads.png | Bin 0 -> 1812 bytes public/images/emoji/google/printer.png | Bin 0 -> 1394 bytes public/images/emoji/google/projector.png | Bin 0 -> 2031 bytes public/images/emoji/google/race_car.png | Bin 0 -> 1099 bytes public/images/emoji/google/radioactive.png | Bin 0 -> 1392 bytes public/images/emoji/google/railway_track.png | Bin 0 -> 2480 bytes public/images/emoji/google/record_button.png | Bin 0 -> 425 bytes .../images/emoji/google/reminder_ribbon.png | Bin 0 -> 1480 bytes public/images/emoji/google/robot.png | Bin 0 -> 2296 bytes public/images/emoji/google/rolling_eyes.png | Bin 0 -> 1268 bytes public/images/emoji/google/rosette.png | Bin 0 -> 2061 bytes .../images/emoji/google/satellite_orbital.png | Bin 0 -> 2619 bytes public/images/emoji/google/scales.png | Bin 0 -> 1636 bytes public/images/emoji/google/scorpion.png | Bin 0 -> 2377 bytes public/images/emoji/google/shamrock.png | Bin 0 -> 1128 bytes public/images/emoji/google/shield.png | Bin 0 -> 1417 bytes public/images/emoji/google/shinto_shrine.png | Bin 0 -> 799 bytes public/images/emoji/google/shopping_bags.png | Bin 0 -> 2276 bytes public/images/emoji/google/skier.png | Bin 0 -> 2555 bytes .../images/emoji/google/skull_crossbones.png | Bin 0 -> 2135 bytes .../emoji/google/sleeping_accommodation.png | Bin 0 -> 1353 bytes public/images/emoji/google/slight_frown.png | Bin 0 -> 1078 bytes public/images/emoji/google/slight_smile.png | Bin 0 -> 1090 bytes public/images/emoji/google/snowman2.png | Bin 0 -> 2012 bytes public/images/emoji/google/speaking_head.png | Bin 0 -> 1529 bytes public/images/emoji/google/spider.png | Bin 0 -> 2403 bytes public/images/emoji/google/spider_web.png | Bin 0 -> 2329 bytes public/images/emoji/google/spy.png | Bin 0 -> 2300 bytes public/images/emoji/google/stadium.png | Bin 0 -> 7475 bytes .../images/emoji/google/star_and_crescent.png | Bin 0 -> 1024 bytes public/images/emoji/google/star_of_david.png | Bin 0 -> 816 bytes public/images/emoji/google/stop_button.png | Bin 0 -> 120 bytes public/images/emoji/google/stopwatch.png | Bin 0 -> 2366 bytes public/images/emoji/google/synagogue.png | Bin 0 -> 2145 bytes public/images/emoji/google/taco.png | Bin 0 -> 2761 bytes public/images/emoji/google/ten.png | Bin 0 -> 1214 bytes public/images/emoji/google/thermometer.png | Bin 0 -> 1058 bytes .../images/emoji/google/thermometer_face.png | Bin 0 -> 3029 bytes public/images/emoji/google/thinking.png | Bin 0 -> 1668 bytes .../emoji/google/thunder_cloud_rain.png | Bin 0 -> 2234 bytes public/images/emoji/google/tickets.png | Bin 0 -> 528 bytes public/images/emoji/google/timer.png | Bin 0 -> 2156 bytes public/images/emoji/google/tools.png | Bin 0 -> 1675 bytes public/images/emoji/google/track_next.png | Bin 0 -> 492 bytes public/images/emoji/google/track_previous.png | Bin 0 -> 501 bytes public/images/emoji/google/trackball.png | Bin 0 -> 1936 bytes public/images/emoji/google/turkey.png | Bin 0 -> 2475 bytes public/images/emoji/google/umbrella2.png | Bin 0 -> 999 bytes public/images/emoji/google/unicorn.png | Bin 0 -> 2611 bytes public/images/emoji/google/upside_down.png | Bin 0 -> 1078 bytes public/images/emoji/google/urn.png | Bin 0 -> 1371 bytes public/images/emoji/google/volleyball.png | Bin 0 -> 2426 bytes public/images/emoji/google/vulcan.png | Bin 0 -> 1454 bytes public/images/emoji/google/wastebasket.png | Bin 0 -> 3115 bytes .../images/emoji/google/wheel_of_dharma.png | Bin 0 -> 1050 bytes .../images/emoji/google/white_sun_cloud.png | Bin 0 -> 1582 bytes .../emoji/google/white_sun_rain_cloud.png | Bin 0 -> 1764 bytes .../emoji/google/white_sun_small_cloud.png | Bin 0 -> 1811 bytes .../images/emoji/google/wind_blowing_face.png | Bin 0 -> 1803 bytes public/images/emoji/google/writing_hand.png | Bin 0 -> 1667 bytes public/images/emoji/google/yin_yang.png | Bin 0 -> 1739 bytes public/images/emoji/google/zipper_mouth.png | Bin 0 -> 1268 bytes .../emoji/twitter/airplane_arriving.png | Bin 0 -> 910 bytes .../emoji/twitter/airplane_departure.png | Bin 0 -> 934 bytes .../images/emoji/twitter/airplane_small.png | Bin 0 -> 1117 bytes public/images/emoji/twitter/alembic.png | Bin 0 -> 945 bytes public/images/emoji/twitter/amphora.png | Bin 0 -> 979 bytes public/images/emoji/twitter/anger_right.png | Bin 0 -> 1422 bytes public/images/emoji/twitter/atom.png | Bin 0 -> 1027 bytes public/images/emoji/twitter/badminton.png | Bin 0 -> 1211 bytes public/images/emoji/twitter/ballot_box.png | Bin 0 -> 783 bytes .../emoji/twitter/basketball_player.png | Bin 0 -> 1134 bytes public/images/emoji/twitter/beach.png | Bin 0 -> 1034 bytes .../images/emoji/twitter/beach_umbrella.png | Bin 0 -> 995 bytes public/images/emoji/twitter/bed.png | Bin 0 -> 520 bytes public/images/emoji/twitter/bellhop.png | Bin 0 -> 678 bytes public/images/emoji/twitter/biohazard.png | Bin 0 -> 1365 bytes public/images/emoji/twitter/bow_and_arrow.png | Bin 0 -> 1018 bytes public/images/emoji/twitter/burrito.png | Bin 0 -> 1256 bytes .../images/emoji/twitter/calendar_spiral.png | Bin 0 -> 623 bytes .../emoji/twitter/camera_with_flash.png | Bin 0 -> 1133 bytes public/images/emoji/twitter/camping.png | Bin 0 -> 1118 bytes public/images/emoji/twitter/candle.png | Bin 0 -> 802 bytes public/images/emoji/twitter/card_box.png | Bin 0 -> 872 bytes public/images/emoji/twitter/chains.png | Bin 0 -> 994 bytes public/images/emoji/twitter/champagne.png | Bin 0 -> 960 bytes public/images/emoji/twitter/cheese.png | Bin 0 -> 1005 bytes public/images/emoji/twitter/chipmunk.png | Bin 0 -> 1248 bytes public/images/emoji/twitter/city_dusk.png | Bin 0 -> 596 bytes public/images/emoji/twitter/cityscape.png | Bin 0 -> 618 bytes .../emoji/twitter/classical_building.png | Bin 0 -> 686 bytes public/images/emoji/twitter/clock.png | Bin 0 -> 977 bytes .../images/emoji/twitter/cloud_lightning.png | Bin 0 -> 775 bytes public/images/emoji/twitter/cloud_rain.png | Bin 0 -> 870 bytes public/images/emoji/twitter/cloud_snow.png | Bin 0 -> 803 bytes public/images/emoji/twitter/cloud_tornado.png | Bin 0 -> 1277 bytes public/images/emoji/twitter/coffin.png | Bin 0 -> 1149 bytes public/images/emoji/twitter/comet.png | Bin 0 -> 1187 bytes public/images/emoji/twitter/compression.png | Bin 0 -> 742 bytes .../emoji/twitter/construction_site.png | Bin 0 -> 1194 bytes public/images/emoji/twitter/control_knobs.png | Bin 0 -> 1260 bytes public/images/emoji/twitter/couch.png | Bin 0 -> 843 bytes public/images/emoji/twitter/crab.png | Bin 0 -> 1738 bytes public/images/emoji/twitter/crayon.png | Bin 0 -> 807 bytes public/images/emoji/twitter/cricket.png | Bin 0 -> 765 bytes public/images/emoji/twitter/cross.png | Bin 0 -> 409 bytes .../images/emoji/twitter/crossed_swords.png | Bin 0 -> 899 bytes public/images/emoji/twitter/cruise_ship.png | Bin 0 -> 590 bytes public/images/emoji/twitter/dagger.png | Bin 0 -> 878 bytes .../images/emoji/twitter/dark_sunglasses.png | Bin 0 -> 650 bytes public/images/emoji/twitter/desert.png | Bin 0 -> 1001 bytes public/images/emoji/twitter/desktop.png | Bin 0 -> 491 bytes public/images/emoji/twitter/dividers.png | Bin 0 -> 638 bytes public/images/emoji/twitter/dove.png | Bin 0 -> 1149 bytes public/images/emoji/twitter/eye.png | Bin 0 -> 1022 bytes public/images/emoji/twitter/ferry.png | Bin 0 -> 650 bytes public/images/emoji/twitter/field_hockey.png | Bin 0 -> 862 bytes public/images/emoji/twitter/file_cabinet.png | Bin 0 -> 385 bytes public/images/emoji/twitter/film_frames.png | Bin 0 -> 153 bytes public/images/emoji/twitter/flag_black.png | Bin 0 -> 600 bytes public/images/emoji/twitter/flag_cn.png | Bin 0 -> 600 bytes public/images/emoji/twitter/flag_de.png | Bin 0 -> 398 bytes public/images/emoji/twitter/flag_es.png | Bin 0 -> 518 bytes public/images/emoji/twitter/flag_fr.png | Bin 0 -> 418 bytes public/images/emoji/twitter/flag_gb.png | Bin 0 -> 878 bytes public/images/emoji/twitter/flag_it.png | Bin 0 -> 417 bytes public/images/emoji/twitter/flag_jp.png | Bin 0 -> 573 bytes public/images/emoji/twitter/flag_kr.png | Bin 0 -> 915 bytes public/images/emoji/twitter/flag_ru.png | Bin 0 -> 401 bytes public/images/emoji/twitter/flag_us.png | Bin 0 -> 519 bytes public/images/emoji/twitter/flag_white.png | Bin 0 -> 600 bytes public/images/emoji/twitter/fleur-de-lis.png | Bin 0 -> 1007 bytes public/images/emoji/twitter/fog.png | Bin 0 -> 1194 bytes .../images/emoji/twitter/fork_knife_plate.png | Bin 0 -> 1160 bytes public/images/emoji/twitter/frame_photo.png | Bin 0 -> 716 bytes public/images/emoji/twitter/frowning2.png | Bin 0 -> 916 bytes public/images/emoji/twitter/gear.png | Bin 0 -> 925 bytes public/images/emoji/twitter/golfer.png | Bin 0 -> 1128 bytes public/images/emoji/twitter/hammer_pick.png | Bin 0 -> 896 bytes public/images/emoji/twitter/hand_splayed.png | Bin 0 -> 1230 bytes public/images/emoji/twitter/head_bandage.png | Bin 0 -> 1070 bytes .../emoji/twitter/heart_exclamation.png | Bin 0 -> 811 bytes .../emoji/twitter/helmet_with_cross.png | Bin 0 -> 1146 bytes public/images/emoji/twitter/hockey.png | Bin 0 -> 798 bytes public/images/emoji/twitter/hole.png | Bin 0 -> 736 bytes public/images/emoji/twitter/homes.png | Bin 0 -> 779 bytes public/images/emoji/twitter/hot_pepper.png | Bin 0 -> 828 bytes public/images/emoji/twitter/hotdog.png | Bin 0 -> 1066 bytes .../images/emoji/twitter/house_abandoned.png | Bin 0 -> 689 bytes public/images/emoji/twitter/hugging.png | Bin 0 -> 1374 bytes public/images/emoji/twitter/ice_skate.png | Bin 0 -> 842 bytes public/images/emoji/twitter/island.png | Bin 0 -> 1083 bytes public/images/emoji/twitter/joystick.png | Bin 0 -> 655 bytes public/images/emoji/twitter/kaaba.png | Bin 0 -> 372 bytes public/images/emoji/twitter/key2.png | Bin 0 -> 1032 bytes public/images/emoji/twitter/keyboard.png | Bin 0 -> 429 bytes public/images/emoji/twitter/label.png | Bin 0 -> 754 bytes public/images/emoji/twitter/level_slider.png | Bin 0 -> 604 bytes public/images/emoji/twitter/levitate.png | Bin 0 -> 838 bytes public/images/emoji/twitter/lifter.png | Bin 0 -> 906 bytes public/images/emoji/twitter/lion_face.png | Bin 0 -> 1375 bytes public/images/emoji/twitter/map.png | Bin 0 -> 1304 bytes public/images/emoji/twitter/medal.png | Bin 0 -> 949 bytes public/images/emoji/twitter/menorah.png | Bin 0 -> 1141 bytes public/images/emoji/twitter/metal.png | Bin 0 -> 789 bytes public/images/emoji/twitter/microphone2.png | Bin 0 -> 1015 bytes public/images/emoji/twitter/middle_finger.png | Bin 0 -> 713 bytes .../images/emoji/twitter/military_medal.png | Bin 0 -> 755 bytes public/images/emoji/twitter/money_mouth.png | Bin 0 -> 1282 bytes public/images/emoji/twitter/mosque.png | Bin 0 -> 826 bytes public/images/emoji/twitter/motorboat.png | Bin 0 -> 563 bytes public/images/emoji/twitter/motorcycle.png | Bin 0 -> 1220 bytes public/images/emoji/twitter/motorway.png | Bin 0 -> 1064 bytes public/images/emoji/twitter/mountain.png | Bin 0 -> 806 bytes public/images/emoji/twitter/mountain_snow.png | Bin 0 -> 854 bytes .../emoji/twitter/mouse_three_button.png | Bin 0 -> 812 bytes public/images/emoji/twitter/nerd.png | Bin 0 -> 1302 bytes public/images/emoji/twitter/newspaper2.png | Bin 0 -> 1137 bytes .../images/emoji/twitter/notepad_spiral.png | Bin 0 -> 674 bytes public/images/emoji/twitter/oil.png | Bin 0 -> 217 bytes public/images/emoji/twitter/om_symbol.png | Bin 0 -> 1187 bytes .../images/emoji/twitter/orthodox_cross.png | Bin 0 -> 597 bytes public/images/emoji/twitter/paintbrush.png | Bin 0 -> 799 bytes public/images/emoji/twitter/paperclips.png | Bin 0 -> 1578 bytes public/images/emoji/twitter/park.png | Bin 0 -> 1020 bytes public/images/emoji/twitter/pause_button.png | Bin 0 -> 354 bytes public/images/emoji/twitter/peace.png | Bin 0 -> 1106 bytes public/images/emoji/twitter/pen_ballpoint.png | Bin 0 -> 887 bytes public/images/emoji/twitter/pen_fountain.png | Bin 0 -> 771 bytes public/images/emoji/twitter/pick.png | Bin 0 -> 771 bytes public/images/emoji/twitter/ping_pong.png | Bin 0 -> 889 bytes .../images/emoji/twitter/place_of_worship.png | Bin 0 -> 1009 bytes public/images/emoji/twitter/play_pause.png | Bin 0 -> 560 bytes public/images/emoji/twitter/popcorn.png | Bin 0 -> 877 bytes public/images/emoji/twitter/prayer_beads.png | Bin 0 -> 1282 bytes public/images/emoji/twitter/printer.png | Bin 0 -> 691 bytes public/images/emoji/twitter/projector.png | Bin 0 -> 1153 bytes public/images/emoji/twitter/race_car.png | Bin 0 -> 923 bytes public/images/emoji/twitter/radioactive.png | Bin 0 -> 1061 bytes public/images/emoji/twitter/railway_track.png | Bin 0 -> 1054 bytes public/images/emoji/twitter/record_button.png | Bin 0 -> 697 bytes .../images/emoji/twitter/reminder_ribbon.png | Bin 0 -> 1003 bytes public/images/emoji/twitter/robot.png | Bin 0 -> 841 bytes public/images/emoji/twitter/rolling_eyes.png | Bin 0 -> 999 bytes public/images/emoji/twitter/rosette.png | Bin 0 -> 994 bytes .../emoji/twitter/satellite_orbital.png | Bin 0 -> 1104 bytes public/images/emoji/twitter/scales.png | Bin 0 -> 921 bytes public/images/emoji/twitter/scorpion.png | Bin 0 -> 1298 bytes public/images/emoji/twitter/shamrock.png | Bin 0 -> 973 bytes public/images/emoji/twitter/shield.png | Bin 0 -> 1060 bytes public/images/emoji/twitter/shinto_shrine.png | Bin 0 -> 704 bytes public/images/emoji/twitter/shopping_bags.png | Bin 0 -> 805 bytes public/images/emoji/twitter/skier.png | Bin 0 -> 1240 bytes .../images/emoji/twitter/skull_crossbones.png | Bin 0 -> 1138 bytes .../emoji/twitter/sleeping_accommodation.png | Bin 0 -> 647 bytes public/images/emoji/twitter/slight_frown.png | Bin 0 -> 905 bytes public/images/emoji/twitter/slight_smile.png | Bin 0 -> 888 bytes public/images/emoji/twitter/snowman2.png | Bin 0 -> 1047 bytes public/images/emoji/twitter/speaking_head.png | Bin 0 -> 904 bytes public/images/emoji/twitter/spider.png | Bin 0 -> 1351 bytes public/images/emoji/twitter/spider_web.png | Bin 0 -> 1756 bytes public/images/emoji/twitter/spy.png | Bin 0 -> 1084 bytes public/images/emoji/twitter/stadium.png | Bin 0 -> 1186 bytes .../emoji/twitter/star_and_crescent.png | Bin 0 -> 954 bytes public/images/emoji/twitter/star_of_david.png | Bin 0 -> 790 bytes public/images/emoji/twitter/stop_button.png | Bin 0 -> 348 bytes public/images/emoji/twitter/stopwatch.png | Bin 0 -> 978 bytes public/images/emoji/twitter/synagogue.png | Bin 0 -> 989 bytes public/images/emoji/twitter/taco.png | Bin 0 -> 1035 bytes public/images/emoji/twitter/ten.png | Bin 0 -> 922 bytes public/images/emoji/twitter/thermometer.png | Bin 0 -> 868 bytes .../images/emoji/twitter/thermometer_face.png | Bin 0 -> 1130 bytes public/images/emoji/twitter/thinking.png | Bin 0 -> 1085 bytes .../emoji/twitter/thunder_cloud_rain.png | Bin 0 -> 993 bytes public/images/emoji/twitter/tickets.png | Bin 0 -> 1010 bytes public/images/emoji/twitter/timer.png | Bin 0 -> 1171 bytes public/images/emoji/twitter/tools.png | Bin 0 -> 963 bytes public/images/emoji/twitter/track_next.png | Bin 0 -> 656 bytes .../images/emoji/twitter/track_previous.png | Bin 0 -> 657 bytes public/images/emoji/twitter/trackball.png | Bin 0 -> 1253 bytes public/images/emoji/twitter/turkey.png | Bin 0 -> 1098 bytes public/images/emoji/twitter/umbrella2.png | Bin 0 -> 987 bytes public/images/emoji/twitter/unicorn.png | Bin 0 -> 998 bytes public/images/emoji/twitter/upside_down.png | Bin 0 -> 917 bytes public/images/emoji/twitter/urn.png | Bin 0 -> 893 bytes public/images/emoji/twitter/volleyball.png | Bin 0 -> 1693 bytes public/images/emoji/twitter/vulcan.png | Bin 0 -> 1212 bytes public/images/emoji/twitter/wastebasket.png | Bin 0 -> 1463 bytes .../images/emoji/twitter/wheel_of_dharma.png | Bin 0 -> 1118 bytes .../images/emoji/twitter/white_sun_cloud.png | Bin 0 -> 807 bytes .../emoji/twitter/white_sun_rain_cloud.png | Bin 0 -> 989 bytes .../emoji/twitter/white_sun_small_cloud.png | Bin 0 -> 931 bytes .../emoji/twitter/wind_blowing_face.png | Bin 0 -> 1047 bytes public/images/emoji/twitter/writing_hand.png | Bin 0 -> 1156 bytes public/images/emoji/twitter/yin_yang.png | Bin 0 -> 1074 bytes public/images/emoji/twitter/zipper_mouth.png | Bin 0 -> 979 bytes .../phpbb3/support/smiley_processor.rb | 2 +- spec/components/pretty_text_spec.rb | 2 +- test/javascripts/lib/emoji-test.js.es6 | 14 +- test/javascripts/models/topic-test.js.es6 | 4 +- 785 files changed, 5592 insertions(+), 8184 deletions(-) create mode 100644 public/images/emoji/apple/airplane_arriving.png create mode 100644 public/images/emoji/apple/airplane_departure.png create mode 100644 public/images/emoji/apple/airplane_small.png create mode 100644 public/images/emoji/apple/alembic.png create mode 100644 public/images/emoji/apple/amphora.png create mode 100644 public/images/emoji/apple/anger_right.png create mode 100644 public/images/emoji/apple/atom.png create mode 100644 public/images/emoji/apple/badminton.png create mode 100644 public/images/emoji/apple/ballot_box.png create mode 100644 public/images/emoji/apple/basketball_player.png create mode 100644 public/images/emoji/apple/beach.png create mode 100644 public/images/emoji/apple/beach_umbrella.png create mode 100644 public/images/emoji/apple/bed.png create mode 100644 public/images/emoji/apple/bellhop.png create mode 100644 public/images/emoji/apple/biohazard.png create mode 100644 public/images/emoji/apple/bow_and_arrow.png create mode 100644 public/images/emoji/apple/burrito.png create mode 100644 public/images/emoji/apple/calendar_spiral.png create mode 100644 public/images/emoji/apple/camera_with_flash.png create mode 100644 public/images/emoji/apple/camping.png create mode 100644 public/images/emoji/apple/candle.png create mode 100644 public/images/emoji/apple/card_box.png create mode 100644 public/images/emoji/apple/chains.png create mode 100644 public/images/emoji/apple/champagne.png create mode 100644 public/images/emoji/apple/cheese.png create mode 100644 public/images/emoji/apple/chipmunk.png create mode 100644 public/images/emoji/apple/city_dusk.png create mode 100644 public/images/emoji/apple/cityscape.png create mode 100644 public/images/emoji/apple/classical_building.png create mode 100644 public/images/emoji/apple/clock.png create mode 100644 public/images/emoji/apple/cloud_lightning.png create mode 100644 public/images/emoji/apple/cloud_rain.png create mode 100644 public/images/emoji/apple/cloud_snow.png create mode 100644 public/images/emoji/apple/cloud_tornado.png create mode 100644 public/images/emoji/apple/coffin.png create mode 100644 public/images/emoji/apple/comet.png create mode 100644 public/images/emoji/apple/compression.png create mode 100644 public/images/emoji/apple/construction_site.png create mode 100644 public/images/emoji/apple/control_knobs.png create mode 100644 public/images/emoji/apple/couch.png create mode 100644 public/images/emoji/apple/crab.png create mode 100644 public/images/emoji/apple/crayon.png create mode 100644 public/images/emoji/apple/cricket.png create mode 100644 public/images/emoji/apple/cross.png create mode 100644 public/images/emoji/apple/crossed_swords.png create mode 100644 public/images/emoji/apple/cruise_ship.png create mode 100644 public/images/emoji/apple/dagger.png create mode 100644 public/images/emoji/apple/dark_sunglasses.png create mode 100644 public/images/emoji/apple/desert.png create mode 100644 public/images/emoji/apple/desktop.png create mode 100644 public/images/emoji/apple/dividers.png create mode 100644 public/images/emoji/apple/dove.png create mode 100644 public/images/emoji/apple/eye.png create mode 100644 public/images/emoji/apple/ferry.png create mode 100644 public/images/emoji/apple/field_hockey.png create mode 100644 public/images/emoji/apple/file_cabinet.png create mode 100644 public/images/emoji/apple/film_frames.png create mode 100644 public/images/emoji/apple/flag_black.png create mode 100644 public/images/emoji/apple/flag_cn.png create mode 100644 public/images/emoji/apple/flag_de.png create mode 100644 public/images/emoji/apple/flag_es.png create mode 100644 public/images/emoji/apple/flag_fr.png create mode 100644 public/images/emoji/apple/flag_gb.png create mode 100644 public/images/emoji/apple/flag_it.png create mode 100644 public/images/emoji/apple/flag_jp.png create mode 100644 public/images/emoji/apple/flag_kr.png create mode 100644 public/images/emoji/apple/flag_ru.png create mode 100644 public/images/emoji/apple/flag_us.png create mode 100644 public/images/emoji/apple/flag_white.png create mode 100644 public/images/emoji/apple/fleur-de-lis.png create mode 100644 public/images/emoji/apple/fog.png create mode 100644 public/images/emoji/apple/fork_knife_plate.png create mode 100644 public/images/emoji/apple/frame_photo.png create mode 100644 public/images/emoji/apple/frowning2.png create mode 100644 public/images/emoji/apple/gear.png create mode 100644 public/images/emoji/apple/golfer.png create mode 100644 public/images/emoji/apple/hammer_pick.png create mode 100644 public/images/emoji/apple/hand_splayed.png create mode 100644 public/images/emoji/apple/head_bandage.png create mode 100644 public/images/emoji/apple/heart_exclamation.png create mode 100644 public/images/emoji/apple/helmet_with_cross.png create mode 100644 public/images/emoji/apple/hockey.png create mode 100644 public/images/emoji/apple/hole.png create mode 100644 public/images/emoji/apple/homes.png create mode 100644 public/images/emoji/apple/hot_pepper.png create mode 100644 public/images/emoji/apple/hotdog.png create mode 100644 public/images/emoji/apple/house_abandoned.png create mode 100644 public/images/emoji/apple/hugging.png create mode 100644 public/images/emoji/apple/ice_skate.png create mode 100644 public/images/emoji/apple/island.png create mode 100644 public/images/emoji/apple/joystick.png create mode 100644 public/images/emoji/apple/kaaba.png create mode 100644 public/images/emoji/apple/key2.png create mode 100644 public/images/emoji/apple/keyboard.png create mode 100644 public/images/emoji/apple/label.png create mode 100644 public/images/emoji/apple/level_slider.png create mode 100644 public/images/emoji/apple/levitate.png create mode 100644 public/images/emoji/apple/lifter.png create mode 100644 public/images/emoji/apple/lion_face.png create mode 100644 public/images/emoji/apple/map.png create mode 100644 public/images/emoji/apple/medal.png create mode 100644 public/images/emoji/apple/menorah.png create mode 100644 public/images/emoji/apple/metal.png create mode 100644 public/images/emoji/apple/microphone2.png create mode 100644 public/images/emoji/apple/middle_finger.png create mode 100644 public/images/emoji/apple/military_medal.png create mode 100644 public/images/emoji/apple/money_mouth.png create mode 100644 public/images/emoji/apple/mosque.png create mode 100644 public/images/emoji/apple/motorboat.png create mode 100644 public/images/emoji/apple/motorcycle.png create mode 100644 public/images/emoji/apple/motorway.png create mode 100644 public/images/emoji/apple/mountain.png create mode 100644 public/images/emoji/apple/mountain_snow.png create mode 100644 public/images/emoji/apple/mouse_three_button.png create mode 100644 public/images/emoji/apple/nerd.png create mode 100644 public/images/emoji/apple/newspaper2.png create mode 100644 public/images/emoji/apple/notepad_spiral.png create mode 100644 public/images/emoji/apple/oil.png create mode 100644 public/images/emoji/apple/om_symbol.png create mode 100644 public/images/emoji/apple/orthodox_cross.png create mode 100644 public/images/emoji/apple/paintbrush.png create mode 100644 public/images/emoji/apple/paperclips.png create mode 100644 public/images/emoji/apple/park.png create mode 100644 public/images/emoji/apple/pause_button.png create mode 100644 public/images/emoji/apple/peace.png create mode 100644 public/images/emoji/apple/pen_ballpoint.png create mode 100644 public/images/emoji/apple/pen_fountain.png create mode 100644 public/images/emoji/apple/pick.png create mode 100644 public/images/emoji/apple/ping_pong.png create mode 100644 public/images/emoji/apple/place_of_worship.png create mode 100644 public/images/emoji/apple/play_pause.png create mode 100644 public/images/emoji/apple/popcorn.png create mode 100644 public/images/emoji/apple/prayer_beads.png create mode 100644 public/images/emoji/apple/printer.png create mode 100644 public/images/emoji/apple/projector.png create mode 100644 public/images/emoji/apple/race_car.png create mode 100644 public/images/emoji/apple/radioactive.png create mode 100644 public/images/emoji/apple/railway_track.png create mode 100644 public/images/emoji/apple/record_button.png create mode 100644 public/images/emoji/apple/reminder_ribbon.png create mode 100644 public/images/emoji/apple/robot.png create mode 100644 public/images/emoji/apple/rolling_eyes.png create mode 100644 public/images/emoji/apple/rosette.png create mode 100644 public/images/emoji/apple/satellite_orbital.png create mode 100644 public/images/emoji/apple/scales.png create mode 100644 public/images/emoji/apple/scorpion.png create mode 100644 public/images/emoji/apple/shamrock.png create mode 100644 public/images/emoji/apple/shield.png create mode 100644 public/images/emoji/apple/shinto_shrine.png create mode 100644 public/images/emoji/apple/shopping_bags.png create mode 100644 public/images/emoji/apple/skier.png create mode 100644 public/images/emoji/apple/skull_crossbones.png create mode 100644 public/images/emoji/apple/sleeping_accommodation.png create mode 100644 public/images/emoji/apple/slight_frown.png create mode 100644 public/images/emoji/apple/slight_smile.png create mode 100644 public/images/emoji/apple/snowman2.png create mode 100644 public/images/emoji/apple/speaking_head.png create mode 100644 public/images/emoji/apple/spider.png create mode 100644 public/images/emoji/apple/spider_web.png create mode 100644 public/images/emoji/apple/spy.png create mode 100644 public/images/emoji/apple/stadium.png create mode 100644 public/images/emoji/apple/star_and_crescent.png create mode 100644 public/images/emoji/apple/star_of_david.png create mode 100644 public/images/emoji/apple/stop_button.png create mode 100644 public/images/emoji/apple/stopwatch.png create mode 100644 public/images/emoji/apple/synagogue.png create mode 100644 public/images/emoji/apple/taco.png create mode 100644 public/images/emoji/apple/ten.png create mode 100644 public/images/emoji/apple/thermometer.png create mode 100644 public/images/emoji/apple/thermometer_face.png create mode 100644 public/images/emoji/apple/thinking.png create mode 100644 public/images/emoji/apple/thunder_cloud_rain.png create mode 100644 public/images/emoji/apple/tickets.png create mode 100644 public/images/emoji/apple/timer.png create mode 100644 public/images/emoji/apple/tools.png create mode 100644 public/images/emoji/apple/track_next.png create mode 100644 public/images/emoji/apple/track_previous.png create mode 100644 public/images/emoji/apple/trackball.png create mode 100644 public/images/emoji/apple/turkey.png create mode 100644 public/images/emoji/apple/umbrella2.png create mode 100644 public/images/emoji/apple/unicorn.png create mode 100644 public/images/emoji/apple/upside_down.png create mode 100644 public/images/emoji/apple/urn.png create mode 100644 public/images/emoji/apple/volleyball.png create mode 100644 public/images/emoji/apple/vulcan.png create mode 100644 public/images/emoji/apple/wastebasket.png create mode 100644 public/images/emoji/apple/wheel_of_dharma.png create mode 100644 public/images/emoji/apple/white_sun_cloud.png create mode 100644 public/images/emoji/apple/white_sun_rain_cloud.png create mode 100644 public/images/emoji/apple/white_sun_small_cloud.png create mode 100644 public/images/emoji/apple/wind_blowing_face.png create mode 100644 public/images/emoji/apple/writing_hand.png create mode 100644 public/images/emoji/apple/yin_yang.png create mode 100644 public/images/emoji/apple/zipper_mouth.png create mode 100644 public/images/emoji/emoji_one/airplane_arriving.png create mode 100644 public/images/emoji/emoji_one/airplane_departure.png create mode 100644 public/images/emoji/emoji_one/airplane_small.png create mode 100644 public/images/emoji/emoji_one/alembic.png create mode 100644 public/images/emoji/emoji_one/amphora.png create mode 100644 public/images/emoji/emoji_one/anger_right.png create mode 100644 public/images/emoji/emoji_one/atom.png create mode 100644 public/images/emoji/emoji_one/badminton.png create mode 100644 public/images/emoji/emoji_one/ballot_box.png create mode 100644 public/images/emoji/emoji_one/basketball_player.png create mode 100644 public/images/emoji/emoji_one/beach.png create mode 100644 public/images/emoji/emoji_one/beach_umbrella.png create mode 100644 public/images/emoji/emoji_one/bed.png create mode 100644 public/images/emoji/emoji_one/bellhop.png create mode 100644 public/images/emoji/emoji_one/biohazard.png create mode 100644 public/images/emoji/emoji_one/bow_and_arrow.png create mode 100644 public/images/emoji/emoji_one/burrito.png create mode 100644 public/images/emoji/emoji_one/calendar_spiral.png create mode 100644 public/images/emoji/emoji_one/camera_with_flash.png create mode 100644 public/images/emoji/emoji_one/camping.png create mode 100644 public/images/emoji/emoji_one/candle.png create mode 100644 public/images/emoji/emoji_one/card_box.png create mode 100644 public/images/emoji/emoji_one/chains.png create mode 100644 public/images/emoji/emoji_one/champagne.png create mode 100644 public/images/emoji/emoji_one/cheese.png create mode 100644 public/images/emoji/emoji_one/chipmunk.png create mode 100644 public/images/emoji/emoji_one/city_dusk.png create mode 100644 public/images/emoji/emoji_one/cityscape.png create mode 100644 public/images/emoji/emoji_one/classical_building.png create mode 100644 public/images/emoji/emoji_one/clock.png create mode 100644 public/images/emoji/emoji_one/cloud_lightning.png create mode 100644 public/images/emoji/emoji_one/cloud_rain.png create mode 100644 public/images/emoji/emoji_one/cloud_snow.png create mode 100644 public/images/emoji/emoji_one/cloud_tornado.png create mode 100644 public/images/emoji/emoji_one/coffin.png create mode 100644 public/images/emoji/emoji_one/comet.png create mode 100644 public/images/emoji/emoji_one/compression.png create mode 100644 public/images/emoji/emoji_one/construction_site.png create mode 100644 public/images/emoji/emoji_one/control_knobs.png create mode 100644 public/images/emoji/emoji_one/couch.png create mode 100644 public/images/emoji/emoji_one/crab.png create mode 100644 public/images/emoji/emoji_one/crayon.png create mode 100644 public/images/emoji/emoji_one/cricket.png create mode 100644 public/images/emoji/emoji_one/cross.png create mode 100644 public/images/emoji/emoji_one/crossed_swords.png create mode 100644 public/images/emoji/emoji_one/cruise_ship.png create mode 100644 public/images/emoji/emoji_one/dagger.png create mode 100644 public/images/emoji/emoji_one/dark_sunglasses.png create mode 100644 public/images/emoji/emoji_one/desert.png create mode 100644 public/images/emoji/emoji_one/desktop.png create mode 100644 public/images/emoji/emoji_one/dividers.png create mode 100644 public/images/emoji/emoji_one/dove.png create mode 100644 public/images/emoji/emoji_one/eye.png create mode 100644 public/images/emoji/emoji_one/ferry.png create mode 100644 public/images/emoji/emoji_one/field_hockey.png create mode 100644 public/images/emoji/emoji_one/file_cabinet.png create mode 100644 public/images/emoji/emoji_one/film_frames.png create mode 100644 public/images/emoji/emoji_one/flag_black.png create mode 100644 public/images/emoji/emoji_one/flag_cn.png create mode 100644 public/images/emoji/emoji_one/flag_de.png create mode 100644 public/images/emoji/emoji_one/flag_es.png create mode 100644 public/images/emoji/emoji_one/flag_fr.png create mode 100644 public/images/emoji/emoji_one/flag_gb.png create mode 100644 public/images/emoji/emoji_one/flag_it.png create mode 100644 public/images/emoji/emoji_one/flag_jp.png create mode 100644 public/images/emoji/emoji_one/flag_kr.png create mode 100644 public/images/emoji/emoji_one/flag_ru.png create mode 100644 public/images/emoji/emoji_one/flag_us.png create mode 100644 public/images/emoji/emoji_one/flag_white.png create mode 100644 public/images/emoji/emoji_one/fleur-de-lis.png create mode 100644 public/images/emoji/emoji_one/fog.png create mode 100644 public/images/emoji/emoji_one/fork_knife_plate.png create mode 100644 public/images/emoji/emoji_one/frame_photo.png create mode 100644 public/images/emoji/emoji_one/frowning2.png create mode 100644 public/images/emoji/emoji_one/gear.png create mode 100644 public/images/emoji/emoji_one/golfer.png create mode 100644 public/images/emoji/emoji_one/hammer_pick.png create mode 100644 public/images/emoji/emoji_one/hand_splayed.png create mode 100644 public/images/emoji/emoji_one/head_bandage.png create mode 100644 public/images/emoji/emoji_one/heart_exclamation.png create mode 100644 public/images/emoji/emoji_one/helmet_with_cross.png create mode 100644 public/images/emoji/emoji_one/hockey.png create mode 100644 public/images/emoji/emoji_one/hole.png create mode 100644 public/images/emoji/emoji_one/homes.png create mode 100644 public/images/emoji/emoji_one/hot_pepper.png create mode 100644 public/images/emoji/emoji_one/hotdog.png create mode 100644 public/images/emoji/emoji_one/house_abandoned.png create mode 100644 public/images/emoji/emoji_one/hugging.png create mode 100644 public/images/emoji/emoji_one/ice_skate.png create mode 100644 public/images/emoji/emoji_one/island.png create mode 100644 public/images/emoji/emoji_one/joystick.png create mode 100644 public/images/emoji/emoji_one/kaaba.png create mode 100644 public/images/emoji/emoji_one/key2.png create mode 100644 public/images/emoji/emoji_one/keyboard.png create mode 100644 public/images/emoji/emoji_one/label.png create mode 100644 public/images/emoji/emoji_one/level_slider.png create mode 100644 public/images/emoji/emoji_one/levitate.png create mode 100644 public/images/emoji/emoji_one/lifter.png create mode 100644 public/images/emoji/emoji_one/lion_face.png create mode 100644 public/images/emoji/emoji_one/map.png create mode 100644 public/images/emoji/emoji_one/medal.png create mode 100644 public/images/emoji/emoji_one/menorah.png create mode 100644 public/images/emoji/emoji_one/metal.png create mode 100644 public/images/emoji/emoji_one/microphone2.png create mode 100644 public/images/emoji/emoji_one/middle_finger.png create mode 100644 public/images/emoji/emoji_one/military_medal.png create mode 100644 public/images/emoji/emoji_one/money_mouth.png create mode 100644 public/images/emoji/emoji_one/mosque.png create mode 100644 public/images/emoji/emoji_one/motorboat.png create mode 100644 public/images/emoji/emoji_one/motorcycle.png create mode 100644 public/images/emoji/emoji_one/motorway.png create mode 100644 public/images/emoji/emoji_one/mountain.png create mode 100644 public/images/emoji/emoji_one/mountain_snow.png create mode 100644 public/images/emoji/emoji_one/mouse_three_button.png create mode 100644 public/images/emoji/emoji_one/nerd.png create mode 100644 public/images/emoji/emoji_one/newspaper2.png create mode 100644 public/images/emoji/emoji_one/notepad_spiral.png create mode 100644 public/images/emoji/emoji_one/oil.png create mode 100644 public/images/emoji/emoji_one/om_symbol.png create mode 100644 public/images/emoji/emoji_one/orthodox_cross.png create mode 100644 public/images/emoji/emoji_one/paintbrush.png create mode 100644 public/images/emoji/emoji_one/paperclips.png create mode 100644 public/images/emoji/emoji_one/park.png create mode 100644 public/images/emoji/emoji_one/pause_button.png create mode 100644 public/images/emoji/emoji_one/peace.png create mode 100644 public/images/emoji/emoji_one/pen_ballpoint.png create mode 100644 public/images/emoji/emoji_one/pen_fountain.png create mode 100644 public/images/emoji/emoji_one/pick.png create mode 100644 public/images/emoji/emoji_one/ping_pong.png create mode 100644 public/images/emoji/emoji_one/place_of_worship.png create mode 100644 public/images/emoji/emoji_one/play_pause.png create mode 100644 public/images/emoji/emoji_one/popcorn.png create mode 100644 public/images/emoji/emoji_one/prayer_beads.png create mode 100644 public/images/emoji/emoji_one/printer.png create mode 100644 public/images/emoji/emoji_one/projector.png create mode 100644 public/images/emoji/emoji_one/race_car.png create mode 100644 public/images/emoji/emoji_one/radioactive.png create mode 100644 public/images/emoji/emoji_one/railway_track.png create mode 100644 public/images/emoji/emoji_one/record_button.png create mode 100644 public/images/emoji/emoji_one/reminder_ribbon.png create mode 100644 public/images/emoji/emoji_one/robot.png create mode 100644 public/images/emoji/emoji_one/rolling_eyes.png create mode 100644 public/images/emoji/emoji_one/rosette.png create mode 100644 public/images/emoji/emoji_one/satellite_orbital.png create mode 100644 public/images/emoji/emoji_one/scales.png create mode 100644 public/images/emoji/emoji_one/scorpion.png create mode 100644 public/images/emoji/emoji_one/shamrock.png create mode 100644 public/images/emoji/emoji_one/shield.png create mode 100644 public/images/emoji/emoji_one/shinto_shrine.png create mode 100644 public/images/emoji/emoji_one/shopping_bags.png create mode 100644 public/images/emoji/emoji_one/skier.png create mode 100644 public/images/emoji/emoji_one/skull_crossbones.png create mode 100644 public/images/emoji/emoji_one/sleeping_accommodation.png create mode 100644 public/images/emoji/emoji_one/slight_frown.png create mode 100644 public/images/emoji/emoji_one/slight_smile.png create mode 100644 public/images/emoji/emoji_one/snowman2.png create mode 100644 public/images/emoji/emoji_one/speaking_head.png create mode 100644 public/images/emoji/emoji_one/spider.png create mode 100644 public/images/emoji/emoji_one/spider_web.png create mode 100644 public/images/emoji/emoji_one/spy.png create mode 100644 public/images/emoji/emoji_one/stadium.png create mode 100644 public/images/emoji/emoji_one/star_and_crescent.png create mode 100644 public/images/emoji/emoji_one/star_of_david.png create mode 100644 public/images/emoji/emoji_one/stop_button.png create mode 100644 public/images/emoji/emoji_one/stopwatch.png create mode 100644 public/images/emoji/emoji_one/synagogue.png create mode 100644 public/images/emoji/emoji_one/taco.png create mode 100644 public/images/emoji/emoji_one/ten.png create mode 100644 public/images/emoji/emoji_one/thermometer.png create mode 100644 public/images/emoji/emoji_one/thermometer_face.png create mode 100644 public/images/emoji/emoji_one/thinking.png create mode 100644 public/images/emoji/emoji_one/thunder_cloud_rain.png create mode 100644 public/images/emoji/emoji_one/tickets.png create mode 100644 public/images/emoji/emoji_one/timer.png create mode 100644 public/images/emoji/emoji_one/tools.png create mode 100644 public/images/emoji/emoji_one/track_next.png create mode 100644 public/images/emoji/emoji_one/track_previous.png create mode 100644 public/images/emoji/emoji_one/trackball.png create mode 100644 public/images/emoji/emoji_one/turkey.png create mode 100644 public/images/emoji/emoji_one/umbrella2.png create mode 100644 public/images/emoji/emoji_one/unicorn.png create mode 100644 public/images/emoji/emoji_one/upside_down.png create mode 100644 public/images/emoji/emoji_one/urn.png create mode 100644 public/images/emoji/emoji_one/volleyball.png create mode 100644 public/images/emoji/emoji_one/vulcan.png create mode 100644 public/images/emoji/emoji_one/wastebasket.png create mode 100644 public/images/emoji/emoji_one/wheel_of_dharma.png create mode 100644 public/images/emoji/emoji_one/white_sun_cloud.png create mode 100644 public/images/emoji/emoji_one/white_sun_rain_cloud.png create mode 100644 public/images/emoji/emoji_one/white_sun_small_cloud.png create mode 100644 public/images/emoji/emoji_one/wind_blowing_face.png create mode 100644 public/images/emoji/emoji_one/writing_hand.png create mode 100644 public/images/emoji/emoji_one/yin_yang.png create mode 100644 public/images/emoji/emoji_one/zipper_mouth.png create mode 100644 public/images/emoji/google/airplane_arriving.png create mode 100644 public/images/emoji/google/airplane_departure.png create mode 100644 public/images/emoji/google/airplane_small.png create mode 100644 public/images/emoji/google/alembic.png create mode 100644 public/images/emoji/google/amphora.png create mode 100644 public/images/emoji/google/anger_right.png create mode 100644 public/images/emoji/google/atom.png create mode 100644 public/images/emoji/google/badminton.png create mode 100644 public/images/emoji/google/ballot_box.png create mode 100644 public/images/emoji/google/basketball_player.png create mode 100644 public/images/emoji/google/beach.png create mode 100644 public/images/emoji/google/beach_umbrella.png create mode 100644 public/images/emoji/google/bed.png create mode 100644 public/images/emoji/google/bellhop.png create mode 100644 public/images/emoji/google/biohazard.png create mode 100644 public/images/emoji/google/bow_and_arrow.png create mode 100644 public/images/emoji/google/burrito.png create mode 100644 public/images/emoji/google/calendar_spiral.png create mode 100644 public/images/emoji/google/camera_with_flash.png create mode 100644 public/images/emoji/google/camping.png create mode 100644 public/images/emoji/google/candle.png create mode 100644 public/images/emoji/google/card_box.png create mode 100644 public/images/emoji/google/chains.png create mode 100644 public/images/emoji/google/champagne.png create mode 100644 public/images/emoji/google/cheese.png create mode 100644 public/images/emoji/google/chipmunk.png create mode 100644 public/images/emoji/google/city_dusk.png create mode 100644 public/images/emoji/google/cityscape.png create mode 100644 public/images/emoji/google/classical_building.png create mode 100644 public/images/emoji/google/clock.png create mode 100644 public/images/emoji/google/cloud_lightning.png create mode 100644 public/images/emoji/google/cloud_rain.png create mode 100644 public/images/emoji/google/cloud_snow.png create mode 100644 public/images/emoji/google/cloud_tornado.png create mode 100644 public/images/emoji/google/coffin.png create mode 100644 public/images/emoji/google/comet.png create mode 100644 public/images/emoji/google/compression.png create mode 100644 public/images/emoji/google/construction_site.png create mode 100644 public/images/emoji/google/control_knobs.png create mode 100644 public/images/emoji/google/couch.png create mode 100644 public/images/emoji/google/crab.png create mode 100644 public/images/emoji/google/crayon.png create mode 100644 public/images/emoji/google/cricket.png create mode 100644 public/images/emoji/google/cross.png create mode 100644 public/images/emoji/google/crossed_swords.png create mode 100644 public/images/emoji/google/cruise_ship.png create mode 100644 public/images/emoji/google/dagger.png create mode 100644 public/images/emoji/google/dark_sunglasses.png create mode 100644 public/images/emoji/google/desert.png create mode 100644 public/images/emoji/google/desktop.png create mode 100644 public/images/emoji/google/dividers.png create mode 100644 public/images/emoji/google/dove.png create mode 100644 public/images/emoji/google/eye.png create mode 100644 public/images/emoji/google/ferry.png create mode 100644 public/images/emoji/google/field_hockey.png create mode 100644 public/images/emoji/google/file_cabinet.png create mode 100644 public/images/emoji/google/film_frames.png create mode 100644 public/images/emoji/google/flag_black.png create mode 100644 public/images/emoji/google/flag_cn.png create mode 100644 public/images/emoji/google/flag_de.png create mode 100644 public/images/emoji/google/flag_es.png create mode 100644 public/images/emoji/google/flag_fr.png create mode 100644 public/images/emoji/google/flag_gb.png create mode 100644 public/images/emoji/google/flag_it.png create mode 100644 public/images/emoji/google/flag_jp.png create mode 100644 public/images/emoji/google/flag_kr.png create mode 100644 public/images/emoji/google/flag_ru.png create mode 100644 public/images/emoji/google/flag_us.png create mode 100644 public/images/emoji/google/flag_white.png create mode 100644 public/images/emoji/google/fleur-de-lis.png create mode 100644 public/images/emoji/google/fog.png create mode 100644 public/images/emoji/google/fork_knife_plate.png create mode 100644 public/images/emoji/google/frame_photo.png create mode 100644 public/images/emoji/google/frowning2.png create mode 100644 public/images/emoji/google/gear.png create mode 100644 public/images/emoji/google/golfer.png create mode 100644 public/images/emoji/google/hammer_pick.png create mode 100644 public/images/emoji/google/hand_splayed.png create mode 100644 public/images/emoji/google/head_bandage.png create mode 100644 public/images/emoji/google/heart_exclamation.png create mode 100644 public/images/emoji/google/helmet_with_cross.png create mode 100644 public/images/emoji/google/hockey.png create mode 100644 public/images/emoji/google/hole.png create mode 100644 public/images/emoji/google/homes.png create mode 100644 public/images/emoji/google/hot_pepper.png create mode 100644 public/images/emoji/google/hotdog.png create mode 100644 public/images/emoji/google/house_abandoned.png create mode 100644 public/images/emoji/google/hugging.png create mode 100644 public/images/emoji/google/ice_skate.png create mode 100644 public/images/emoji/google/island.png create mode 100644 public/images/emoji/google/joystick.png create mode 100644 public/images/emoji/google/kaaba.png create mode 100644 public/images/emoji/google/key2.png create mode 100644 public/images/emoji/google/keyboard.png create mode 100644 public/images/emoji/google/label.png create mode 100644 public/images/emoji/google/level_slider.png create mode 100644 public/images/emoji/google/levitate.png create mode 100644 public/images/emoji/google/lifter.png create mode 100644 public/images/emoji/google/lion_face.png create mode 100644 public/images/emoji/google/map.png create mode 100644 public/images/emoji/google/medal.png create mode 100644 public/images/emoji/google/menorah.png create mode 100644 public/images/emoji/google/metal.png create mode 100644 public/images/emoji/google/microphone2.png create mode 100644 public/images/emoji/google/middle_finger.png create mode 100644 public/images/emoji/google/military_medal.png create mode 100644 public/images/emoji/google/money_mouth.png create mode 100644 public/images/emoji/google/mosque.png create mode 100644 public/images/emoji/google/motorboat.png create mode 100644 public/images/emoji/google/motorcycle.png create mode 100644 public/images/emoji/google/motorway.png create mode 100644 public/images/emoji/google/mountain.png create mode 100644 public/images/emoji/google/mountain_snow.png create mode 100644 public/images/emoji/google/mouse_three_button.png create mode 100644 public/images/emoji/google/nerd.png create mode 100644 public/images/emoji/google/newspaper2.png create mode 100644 public/images/emoji/google/notepad_spiral.png create mode 100644 public/images/emoji/google/oil.png create mode 100644 public/images/emoji/google/om_symbol.png create mode 100644 public/images/emoji/google/orthodox_cross.png create mode 100644 public/images/emoji/google/paintbrush.png create mode 100644 public/images/emoji/google/paperclips.png create mode 100644 public/images/emoji/google/park.png create mode 100644 public/images/emoji/google/pause_button.png create mode 100644 public/images/emoji/google/peace.png create mode 100644 public/images/emoji/google/pen_ballpoint.png create mode 100644 public/images/emoji/google/pen_fountain.png create mode 100644 public/images/emoji/google/pick.png create mode 100644 public/images/emoji/google/ping_pong.png create mode 100644 public/images/emoji/google/place_of_worship.png create mode 100644 public/images/emoji/google/play_pause.png create mode 100644 public/images/emoji/google/popcorn.png create mode 100644 public/images/emoji/google/prayer_beads.png create mode 100644 public/images/emoji/google/printer.png create mode 100644 public/images/emoji/google/projector.png create mode 100644 public/images/emoji/google/race_car.png create mode 100644 public/images/emoji/google/radioactive.png create mode 100644 public/images/emoji/google/railway_track.png create mode 100644 public/images/emoji/google/record_button.png create mode 100644 public/images/emoji/google/reminder_ribbon.png create mode 100644 public/images/emoji/google/robot.png create mode 100644 public/images/emoji/google/rolling_eyes.png create mode 100644 public/images/emoji/google/rosette.png create mode 100644 public/images/emoji/google/satellite_orbital.png create mode 100644 public/images/emoji/google/scales.png create mode 100644 public/images/emoji/google/scorpion.png create mode 100644 public/images/emoji/google/shamrock.png create mode 100644 public/images/emoji/google/shield.png create mode 100644 public/images/emoji/google/shinto_shrine.png create mode 100644 public/images/emoji/google/shopping_bags.png create mode 100644 public/images/emoji/google/skier.png create mode 100644 public/images/emoji/google/skull_crossbones.png create mode 100644 public/images/emoji/google/sleeping_accommodation.png create mode 100644 public/images/emoji/google/slight_frown.png create mode 100644 public/images/emoji/google/slight_smile.png create mode 100644 public/images/emoji/google/snowman2.png create mode 100644 public/images/emoji/google/speaking_head.png create mode 100644 public/images/emoji/google/spider.png create mode 100644 public/images/emoji/google/spider_web.png create mode 100644 public/images/emoji/google/spy.png create mode 100644 public/images/emoji/google/stadium.png create mode 100644 public/images/emoji/google/star_and_crescent.png create mode 100644 public/images/emoji/google/star_of_david.png create mode 100644 public/images/emoji/google/stop_button.png create mode 100644 public/images/emoji/google/stopwatch.png create mode 100644 public/images/emoji/google/synagogue.png create mode 100644 public/images/emoji/google/taco.png create mode 100644 public/images/emoji/google/ten.png create mode 100644 public/images/emoji/google/thermometer.png create mode 100644 public/images/emoji/google/thermometer_face.png create mode 100644 public/images/emoji/google/thinking.png create mode 100644 public/images/emoji/google/thunder_cloud_rain.png create mode 100644 public/images/emoji/google/tickets.png create mode 100644 public/images/emoji/google/timer.png create mode 100644 public/images/emoji/google/tools.png create mode 100644 public/images/emoji/google/track_next.png create mode 100644 public/images/emoji/google/track_previous.png create mode 100644 public/images/emoji/google/trackball.png create mode 100644 public/images/emoji/google/turkey.png create mode 100644 public/images/emoji/google/umbrella2.png create mode 100644 public/images/emoji/google/unicorn.png create mode 100644 public/images/emoji/google/upside_down.png create mode 100644 public/images/emoji/google/urn.png create mode 100644 public/images/emoji/google/volleyball.png create mode 100644 public/images/emoji/google/vulcan.png create mode 100644 public/images/emoji/google/wastebasket.png create mode 100644 public/images/emoji/google/wheel_of_dharma.png create mode 100644 public/images/emoji/google/white_sun_cloud.png create mode 100644 public/images/emoji/google/white_sun_rain_cloud.png create mode 100644 public/images/emoji/google/white_sun_small_cloud.png create mode 100644 public/images/emoji/google/wind_blowing_face.png create mode 100644 public/images/emoji/google/writing_hand.png create mode 100644 public/images/emoji/google/yin_yang.png create mode 100644 public/images/emoji/google/zipper_mouth.png create mode 100644 public/images/emoji/twitter/airplane_arriving.png create mode 100644 public/images/emoji/twitter/airplane_departure.png create mode 100644 public/images/emoji/twitter/airplane_small.png create mode 100644 public/images/emoji/twitter/alembic.png create mode 100644 public/images/emoji/twitter/amphora.png create mode 100644 public/images/emoji/twitter/anger_right.png create mode 100644 public/images/emoji/twitter/atom.png create mode 100644 public/images/emoji/twitter/badminton.png create mode 100644 public/images/emoji/twitter/ballot_box.png create mode 100644 public/images/emoji/twitter/basketball_player.png create mode 100644 public/images/emoji/twitter/beach.png create mode 100644 public/images/emoji/twitter/beach_umbrella.png create mode 100644 public/images/emoji/twitter/bed.png create mode 100644 public/images/emoji/twitter/bellhop.png create mode 100644 public/images/emoji/twitter/biohazard.png create mode 100644 public/images/emoji/twitter/bow_and_arrow.png create mode 100644 public/images/emoji/twitter/burrito.png create mode 100644 public/images/emoji/twitter/calendar_spiral.png create mode 100644 public/images/emoji/twitter/camera_with_flash.png create mode 100644 public/images/emoji/twitter/camping.png create mode 100644 public/images/emoji/twitter/candle.png create mode 100644 public/images/emoji/twitter/card_box.png create mode 100644 public/images/emoji/twitter/chains.png create mode 100644 public/images/emoji/twitter/champagne.png create mode 100644 public/images/emoji/twitter/cheese.png create mode 100644 public/images/emoji/twitter/chipmunk.png create mode 100644 public/images/emoji/twitter/city_dusk.png create mode 100644 public/images/emoji/twitter/cityscape.png create mode 100644 public/images/emoji/twitter/classical_building.png create mode 100644 public/images/emoji/twitter/clock.png create mode 100644 public/images/emoji/twitter/cloud_lightning.png create mode 100644 public/images/emoji/twitter/cloud_rain.png create mode 100644 public/images/emoji/twitter/cloud_snow.png create mode 100644 public/images/emoji/twitter/cloud_tornado.png create mode 100644 public/images/emoji/twitter/coffin.png create mode 100644 public/images/emoji/twitter/comet.png create mode 100644 public/images/emoji/twitter/compression.png create mode 100644 public/images/emoji/twitter/construction_site.png create mode 100644 public/images/emoji/twitter/control_knobs.png create mode 100644 public/images/emoji/twitter/couch.png create mode 100644 public/images/emoji/twitter/crab.png create mode 100644 public/images/emoji/twitter/crayon.png create mode 100644 public/images/emoji/twitter/cricket.png create mode 100644 public/images/emoji/twitter/cross.png create mode 100644 public/images/emoji/twitter/crossed_swords.png create mode 100644 public/images/emoji/twitter/cruise_ship.png create mode 100644 public/images/emoji/twitter/dagger.png create mode 100644 public/images/emoji/twitter/dark_sunglasses.png create mode 100644 public/images/emoji/twitter/desert.png create mode 100644 public/images/emoji/twitter/desktop.png create mode 100644 public/images/emoji/twitter/dividers.png create mode 100644 public/images/emoji/twitter/dove.png create mode 100644 public/images/emoji/twitter/eye.png create mode 100644 public/images/emoji/twitter/ferry.png create mode 100644 public/images/emoji/twitter/field_hockey.png create mode 100644 public/images/emoji/twitter/file_cabinet.png create mode 100644 public/images/emoji/twitter/film_frames.png create mode 100644 public/images/emoji/twitter/flag_black.png create mode 100644 public/images/emoji/twitter/flag_cn.png create mode 100644 public/images/emoji/twitter/flag_de.png create mode 100644 public/images/emoji/twitter/flag_es.png create mode 100644 public/images/emoji/twitter/flag_fr.png create mode 100644 public/images/emoji/twitter/flag_gb.png create mode 100644 public/images/emoji/twitter/flag_it.png create mode 100644 public/images/emoji/twitter/flag_jp.png create mode 100644 public/images/emoji/twitter/flag_kr.png create mode 100644 public/images/emoji/twitter/flag_ru.png create mode 100644 public/images/emoji/twitter/flag_us.png create mode 100644 public/images/emoji/twitter/flag_white.png create mode 100644 public/images/emoji/twitter/fleur-de-lis.png create mode 100644 public/images/emoji/twitter/fog.png create mode 100644 public/images/emoji/twitter/fork_knife_plate.png create mode 100644 public/images/emoji/twitter/frame_photo.png create mode 100644 public/images/emoji/twitter/frowning2.png create mode 100644 public/images/emoji/twitter/gear.png create mode 100644 public/images/emoji/twitter/golfer.png create mode 100644 public/images/emoji/twitter/hammer_pick.png create mode 100644 public/images/emoji/twitter/hand_splayed.png create mode 100644 public/images/emoji/twitter/head_bandage.png create mode 100644 public/images/emoji/twitter/heart_exclamation.png create mode 100644 public/images/emoji/twitter/helmet_with_cross.png create mode 100644 public/images/emoji/twitter/hockey.png create mode 100644 public/images/emoji/twitter/hole.png create mode 100644 public/images/emoji/twitter/homes.png create mode 100644 public/images/emoji/twitter/hot_pepper.png create mode 100644 public/images/emoji/twitter/hotdog.png create mode 100644 public/images/emoji/twitter/house_abandoned.png create mode 100644 public/images/emoji/twitter/hugging.png create mode 100644 public/images/emoji/twitter/ice_skate.png create mode 100644 public/images/emoji/twitter/island.png create mode 100644 public/images/emoji/twitter/joystick.png create mode 100644 public/images/emoji/twitter/kaaba.png create mode 100644 public/images/emoji/twitter/key2.png create mode 100644 public/images/emoji/twitter/keyboard.png create mode 100644 public/images/emoji/twitter/label.png create mode 100644 public/images/emoji/twitter/level_slider.png create mode 100644 public/images/emoji/twitter/levitate.png create mode 100644 public/images/emoji/twitter/lifter.png create mode 100644 public/images/emoji/twitter/lion_face.png create mode 100644 public/images/emoji/twitter/map.png create mode 100644 public/images/emoji/twitter/medal.png create mode 100644 public/images/emoji/twitter/menorah.png create mode 100644 public/images/emoji/twitter/metal.png create mode 100644 public/images/emoji/twitter/microphone2.png create mode 100644 public/images/emoji/twitter/middle_finger.png create mode 100644 public/images/emoji/twitter/military_medal.png create mode 100644 public/images/emoji/twitter/money_mouth.png create mode 100644 public/images/emoji/twitter/mosque.png create mode 100644 public/images/emoji/twitter/motorboat.png create mode 100644 public/images/emoji/twitter/motorcycle.png create mode 100644 public/images/emoji/twitter/motorway.png create mode 100644 public/images/emoji/twitter/mountain.png create mode 100644 public/images/emoji/twitter/mountain_snow.png create mode 100644 public/images/emoji/twitter/mouse_three_button.png create mode 100644 public/images/emoji/twitter/nerd.png create mode 100644 public/images/emoji/twitter/newspaper2.png create mode 100644 public/images/emoji/twitter/notepad_spiral.png create mode 100644 public/images/emoji/twitter/oil.png create mode 100644 public/images/emoji/twitter/om_symbol.png create mode 100644 public/images/emoji/twitter/orthodox_cross.png create mode 100644 public/images/emoji/twitter/paintbrush.png create mode 100644 public/images/emoji/twitter/paperclips.png create mode 100644 public/images/emoji/twitter/park.png create mode 100644 public/images/emoji/twitter/pause_button.png create mode 100644 public/images/emoji/twitter/peace.png create mode 100644 public/images/emoji/twitter/pen_ballpoint.png create mode 100644 public/images/emoji/twitter/pen_fountain.png create mode 100644 public/images/emoji/twitter/pick.png create mode 100644 public/images/emoji/twitter/ping_pong.png create mode 100644 public/images/emoji/twitter/place_of_worship.png create mode 100644 public/images/emoji/twitter/play_pause.png create mode 100644 public/images/emoji/twitter/popcorn.png create mode 100644 public/images/emoji/twitter/prayer_beads.png create mode 100644 public/images/emoji/twitter/printer.png create mode 100644 public/images/emoji/twitter/projector.png create mode 100644 public/images/emoji/twitter/race_car.png create mode 100644 public/images/emoji/twitter/radioactive.png create mode 100644 public/images/emoji/twitter/railway_track.png create mode 100644 public/images/emoji/twitter/record_button.png create mode 100644 public/images/emoji/twitter/reminder_ribbon.png create mode 100644 public/images/emoji/twitter/robot.png create mode 100644 public/images/emoji/twitter/rolling_eyes.png create mode 100644 public/images/emoji/twitter/rosette.png create mode 100644 public/images/emoji/twitter/satellite_orbital.png create mode 100644 public/images/emoji/twitter/scales.png create mode 100644 public/images/emoji/twitter/scorpion.png create mode 100644 public/images/emoji/twitter/shamrock.png create mode 100644 public/images/emoji/twitter/shield.png create mode 100644 public/images/emoji/twitter/shinto_shrine.png create mode 100644 public/images/emoji/twitter/shopping_bags.png create mode 100644 public/images/emoji/twitter/skier.png create mode 100644 public/images/emoji/twitter/skull_crossbones.png create mode 100644 public/images/emoji/twitter/sleeping_accommodation.png create mode 100644 public/images/emoji/twitter/slight_frown.png create mode 100644 public/images/emoji/twitter/slight_smile.png create mode 100644 public/images/emoji/twitter/snowman2.png create mode 100644 public/images/emoji/twitter/speaking_head.png create mode 100644 public/images/emoji/twitter/spider.png create mode 100644 public/images/emoji/twitter/spider_web.png create mode 100644 public/images/emoji/twitter/spy.png create mode 100644 public/images/emoji/twitter/stadium.png create mode 100644 public/images/emoji/twitter/star_and_crescent.png create mode 100644 public/images/emoji/twitter/star_of_david.png create mode 100644 public/images/emoji/twitter/stop_button.png create mode 100644 public/images/emoji/twitter/stopwatch.png create mode 100644 public/images/emoji/twitter/synagogue.png create mode 100644 public/images/emoji/twitter/taco.png create mode 100644 public/images/emoji/twitter/ten.png create mode 100644 public/images/emoji/twitter/thermometer.png create mode 100644 public/images/emoji/twitter/thermometer_face.png create mode 100644 public/images/emoji/twitter/thinking.png create mode 100644 public/images/emoji/twitter/thunder_cloud_rain.png create mode 100644 public/images/emoji/twitter/tickets.png create mode 100644 public/images/emoji/twitter/timer.png create mode 100644 public/images/emoji/twitter/tools.png create mode 100644 public/images/emoji/twitter/track_next.png create mode 100644 public/images/emoji/twitter/track_previous.png create mode 100644 public/images/emoji/twitter/trackball.png create mode 100644 public/images/emoji/twitter/turkey.png create mode 100644 public/images/emoji/twitter/umbrella2.png create mode 100644 public/images/emoji/twitter/unicorn.png create mode 100644 public/images/emoji/twitter/upside_down.png create mode 100644 public/images/emoji/twitter/urn.png create mode 100644 public/images/emoji/twitter/volleyball.png create mode 100644 public/images/emoji/twitter/vulcan.png create mode 100644 public/images/emoji/twitter/wastebasket.png create mode 100644 public/images/emoji/twitter/wheel_of_dharma.png create mode 100644 public/images/emoji/twitter/white_sun_cloud.png create mode 100644 public/images/emoji/twitter/white_sun_rain_cloud.png create mode 100644 public/images/emoji/twitter/white_sun_small_cloud.png create mode 100644 public/images/emoji/twitter/wind_blowing_face.png create mode 100644 public/images/emoji/twitter/writing_hand.png create mode 100644 public/images/emoji/twitter/yin_yang.png create mode 100644 public/images/emoji/twitter/zipper_mouth.png diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index c4cc4f88a3..a0737079aa 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -333,7 +333,7 @@ export default Ember.Component.extend({ term = term.toLowerCase(); if (term === "") { - return resolve(["slightly_smiling", "smile", "wink", "sunny", "blush"]); + return resolve(["slight_smile", "smile", "wink", "sunny", "blush"]); } if (Discourse.Emoji.translations[full]) { diff --git a/app/assets/javascripts/discourse/lib/emoji/emoji-groups.js.es6 b/app/assets/javascripts/discourse/lib/emoji/emoji-groups.js.es6 index e678e4e24a..35838fad91 100644 --- a/app/assets/javascripts/discourse/lib/emoji/emoji-groups.js.es6 +++ b/app/assets/javascripts/discourse/lib/emoji/emoji-groups.js.es6 @@ -3,46 +3,1104 @@ // a few Emoji are actually missing from the Slack categories as well (?), and were added const groups = [ { - name: "people", - fullname: "People", - tabicon: "grinning", - icons: ["slightly_smiling", "grinning", "grin", "joy", "smiley", "smile", "sweat_smile", "laughing", "innocent", "smiling_imp", "imp", "wink", "blush", "relaxed", "yum", "relieved", "heart_eyes", "sunglasses", "smirk", "neutral_face", "expressionless", "unamused", "sweat", "pensive", "confused", "confounded", "kissing", "kissing_heart", "kissing_smiling_eyes", "kissing_closed_eyes", "stuck_out_tongue", "stuck_out_tongue_winking_eye", "stuck_out_tongue_closed_eyes", "disappointed", "worried", "angry", "rage", "cry", "persevere", "triumph", "disappointed_relieved", "frowning", "anguished", "fearful", "weary", "sleepy", "tired_face", "grimacing", "sob", "open_mouth", "hushed", "cold_sweat", "scream", "astonished", "flushed", "sleeping", "dizzy_face", "no_mouth", "mask", "smile_cat", "joy_cat", "smiley_cat", "heart_eyes_cat", "smirk_cat", "kissing_cat", "pouting_cat", "crying_cat_face", "scream_cat", "footprints", "bust_in_silhouette", "busts_in_silhouette", "baby", "boy", "girl", "man", "woman", "family", "couple", "two_men_holding_hands", "two_women_holding_hands", "dancers", "bride_with_veil", "person_with_blond_hair", "man_with_gua_pi_mao", "man_with_turban", "older_man", "older_woman", "cop", "construction_worker", "princess", "guardsman", "angel", "santa", "ghost", "japanese_ogre", "japanese_goblin", "hankey", "skull", "alien", "space_invader", "bow", "information_desk_person", "no_good", "ok_woman", "raising_hand", "person_with_pouting_face", "person_frowning", "massage", "haircut", "couple_with_heart", "couplekiss", "raised_hands", "clap", "hand", "ear", "eyes", "nose", "lips", "kiss", "tongue", "nail_care", "wave", "+1", "-1", "point_up", "point_up_2", "point_down", "point_left", "point_right", "ok_hand", "v", "facepunch", "fist", "raised_hand", "muscle", "open_hands", "pray"] + name:"people", + fullname:"People", + tabicon:"grinning", + icons:[ + "slight_smile", + "grinning", + "grin", + "joy", + "smiley", + "smile", + "sweat_smile", + "laughing", + "innocent", + "smiling_imp", + "imp", + "wink", + "blush", + "relaxed", + "yum", + "relieved", + "heart_eyes", + "sunglasses", + "smirk", + "neutral_face", + "expressionless", + "unamused", + "sweat", + "pensive", + "confused", + "confounded", + "kissing", + "kissing_heart", + "kissing_smiling_eyes", + "kissing_closed_eyes", + "stuck_out_tongue", + "stuck_out_tongue_winking_eye", + "stuck_out_tongue_closed_eyes", + "disappointed", + "worried", + "angry", + "rage", + "cry", + "persevere", + "triumph", + "disappointed_relieved", + "frowning", + "anguished", + "fearful", + "weary", + "sleepy", + "tired_face", + "grimacing", + "sob", + "open_mouth", + "hushed", + "cold_sweat", + "scream", + "astonished", + "flushed", + "sleeping", + "dizzy_face", + "no_mouth", + "mask", + "smile_cat", + "joy_cat", + "smiley_cat", + "heart_eyes_cat", + "smirk_cat", + "kissing_cat", + "pouting_cat", + "crying_cat_face", + "scream_cat", + "footprints", + "bust_in_silhouette", + "busts_in_silhouette", + "baby", + "boy", + "girl", + "man", + "woman", + "family", + "couple", + "two_men_holding_hands", + "two_women_holding_hands", + "dancers", + "bride_with_veil", + "person_with_blond_hair", + "man_with_gua_pi_mao", + "man_with_turban", + "older_man", + "older_woman", + "cop", + "construction_worker", + "princess", + "guardsman", + "angel", + "santa", + "ghost", + "japanese_ogre", + "japanese_goblin", + "hankey", + "skull", + "alien", + "space_invader", + "bow", + "information_desk_person", + "no_good", + "ok_woman", + "raising_hand", + "person_with_pouting_face", + "person_frowning", + "massage", + "haircut", + "couple_with_heart", + "couplekiss", + "raised_hands", + "clap", + "hand", + "ear", + "eyes", + "nose", + "lips", + "kiss", + "tongue", + "nail_care", + "wave", + "+1", + "-1", + "point_up", + "point_up_2", + "point_down", + "point_left", + "point_right", + "ok_hand", + "v", + "facepunch", + "fist", + "raised_hand", + "muscle", + "open_hands", + "pray", + "anger_right", + "eye", + "frowning2", + "hand_splayed", + "head_bandage", + "hugging", + "middle_finger", + "money_mouth", + "nerd", + "poop", + "punch", + "robot", + "rolling_eyes", + "skull_crossbones", + "slight_frown", + "speaking_head", + "spy", + "thinking", + "thumbsdown", + "thumbsup", + "upside_down", + "urn", + "vulcan", + "wind_blowing_face", + "writing_hand", + "zipper_mouth" + ] }, { - name: "nature", - fullname: "Nature", - tabicon: "evergreen_tree", - icons: ["seedling", "evergreen_tree", "deciduous_tree", "palm_tree", "cactus", "tulip", "cherry_blossom", "rose", "hibiscus", "sunflower", "blossom", "bouquet", "ear_of_rice", "herb", "four_leaf_clover", "maple_leaf", "fallen_leaf", "leaves", "mushroom", "chestnut", "rat", "mouse2", "mouse", "hamster", "ox", "water_buffalo", "cow2", "cow", "tiger2", "leopard", "tiger", "rabbit2", "rabbit", "cat2", "cat", "racehorse", "horse", "ram", "sheep", "goat", "rooster", "chicken", "baby_chick", "hatching_chick", "hatched_chick", "bird", "penguin", "elephant", "dromedary_camel", "camel", "boar", "pig2", "pig", "pig_nose", "dog2", "poodle", "dog", "wolf", "bear", "koala", "panda_face", "monkey_face", "see_no_evil", "hear_no_evil", "speak_no_evil", "monkey", "dragon", "dragon_face", "crocodile", "snake", "turtle", "frog", "whale2", "whale", "dolphin", "octopus", "fish", "tropical_fish", "blowfish", "shell", "snail", "bug", "ant", "bee", "beetle", "feet", "zap", "fire", "crescent_moon", "sunny", "partly_sunny", "cloud", "droplet", "sweat_drops", "umbrella", "dash", "snowflake", "star2", "star", "stars", "sunrise_over_mountains", "sunrise", "rainbow", "ocean", "volcano", "milky_way", "mount_fuji", "japan", "globe_with_meridians", "earth_africa", "earth_americas", "earth_asia", "new_moon", "waxing_crescent_moon", "first_quarter_moon", "moon", "full_moon", "waning_gibbous_moon", "last_quarter_moon", "waning_crescent_moon", "new_moon_with_face", "full_moon_with_face", "first_quarter_moon_with_face", "last_quarter_moon_with_face", "sun_with_face"] + name:"nature", + fullname:"Nature", + tabicon:"evergreen_tree", + icons:[ + "seedling", + "evergreen_tree", + "deciduous_tree", + "palm_tree", + "cactus", + "tulip", + "cherry_blossom", + "rose", + "hibiscus", + "sunflower", + "blossom", + "bouquet", + "ear_of_rice", + "herb", + "four_leaf_clover", + "maple_leaf", + "fallen_leaf", + "leaves", + "mushroom", + "chestnut", + "rat", + "mouse2", + "mouse", + "hamster", + "ox", + "water_buffalo", + "cow2", + "cow", + "tiger2", + "leopard", + "tiger", + "rabbit2", + "rabbit", + "cat2", + "cat", + "racehorse", + "horse", + "ram", + "sheep", + "goat", + "rooster", + "chicken", + "baby_chick", + "hatching_chick", + "hatched_chick", + "bird", + "penguin", + "elephant", + "dromedary_camel", + "camel", + "boar", + "pig2", + "pig", + "pig_nose", + "dog2", + "poodle", + "dog", + "wolf", + "bear", + "koala", + "panda_face", + "monkey_face", + "see_no_evil", + "hear_no_evil", + "speak_no_evil", + "monkey", + "dragon", + "dragon_face", + "crocodile", + "snake", + "turtle", + "frog", + "whale2", + "whale", + "dolphin", + "octopus", + "fish", + "tropical_fish", + "blowfish", + "shell", + "snail", + "bug", + "ant", + "bee", + "beetle", + "feet", + "zap", + "fire", + "crescent_moon", + "sunny", + "partly_sunny", + "cloud", + "droplet", + "sweat_drops", + "umbrella", + "dash", + "snowflake", + "star2", + "star", + "stars", + "sunrise_over_mountains", + "sunrise", + "rainbow", + "ocean", + "volcano", + "milky_way", + "mount_fuji", + "japan", + "globe_with_meridians", + "earth_africa", + "earth_americas", + "earth_asia", + "new_moon", + "waxing_crescent_moon", + "first_quarter_moon", + "moon", + "full_moon", + "waning_gibbous_moon", + "last_quarter_moon", + "waning_crescent_moon", + "new_moon_with_face", + "full_moon_with_face", + "first_quarter_moon_with_face", + "last_quarter_moon_with_face", + "sun_with_face", + "chipmunk", + "cloud_lightning", + "cloud_rain", + "cloud_snow", + "cloud_tornado", + "comet", + "crab", + "dove", + "fog", + "lion_face", + "scorpion", + "spider", + "spider_web", + "thunder_cloud_rain", + "turkey", + "unicorn", + "waxing_gibbous_moon", + "white_sun_cloud", + "white_sun_rain_cloud", + "white_sun_small_cloud" + ] }, { - name: "food", - fullname: "Food & Drink", - tabicon: "hamburger", - icons: ["tomato", "eggplant", "corn", "sweet_potato", "grapes", "melon", "watermelon", "tangerine", "lemon", "banana", "pineapple", "apple", "green_apple", "pear", "peach", "cherries", "strawberry", "hamburger", "pizza", "meat_on_bone", "poultry_leg", "rice_cracker", "rice_ball", "rice", "curry", "ramen", "spaghetti", "bread", "fries", "dango", "oden", "sushi", "fried_shrimp", "fish_cake", "icecream", "shaved_ice", "ice_cream", "doughnut", "cookie", "chocolate_bar", "candy", "lollipop", "custard", "honey_pot", "cake", "bento", "stew", "egg", "fork_and_knife", "tea", "coffee", "sake", "wine_glass", "cocktail", "tropical_drink", "beer", "beers", "baby_bottle"] + name:"food", + fullname:"Food & Drink", + tabicon:"hamburger", + icons:[ + "tomato", + "eggplant", + "corn", + "sweet_potato", + "grapes", + "melon", + "watermelon", + "tangerine", + "lemon", + "banana", + "pineapple", + "apple", + "green_apple", + "pear", + "peach", + "cherries", + "strawberry", + "hamburger", + "pizza", + "meat_on_bone", + "poultry_leg", + "rice_cracker", + "rice_ball", + "rice", + "curry", + "ramen", + "spaghetti", + "bread", + "fries", + "dango", + "oden", + "sushi", + "fried_shrimp", + "fish_cake", + "icecream", + "shaved_ice", + "ice_cream", + "doughnut", + "cookie", + "chocolate_bar", + "candy", + "lollipop", + "custard", + "honey_pot", + "cake", + "bento", + "stew", + "egg", + "fork_and_knife", + "tea", + "coffee", + "sake", + "wine_glass", + "cocktail", + "tropical_drink", + "beer", + "beers", + "baby_bottle", + "burrito", + "champagne", + "cheese", + "hot_pepper", + "hotdog", + "taco" + ] }, { - name: "celebration", - fullname: "Celebration", - tabicon: "gift", - icons: ["ribbon", "gift", "birthday", "jack_o_lantern", "christmas_tree", "tanabata_tree", "bamboo", "rice_scene", "fireworks", "sparkler", "tada", "confetti_ball", "balloon", "dizzy", "sparkles", "boom", "mortar_board", "crown", "dolls", "flags", "wind_chime", "crossed_flags", "izakaya_lantern", "ring", "heart", "broken_heart", "love_letter", "two_hearts", "revolving_hearts", "heartbeat", "heartpulse", "sparkling_heart", "cupid", "gift_heart", "heart_decoration", "purple_heart", "yellow_heart", "green_heart", "blue_heart"] + name:"celebration", + fullname:"Celebration", + tabicon:"gift", + icons:[ + "ribbon", + "gift", + "birthday", + "jack_o_lantern", + "christmas_tree", + "tanabata_tree", + "bamboo", + "rice_scene", + "fireworks", + "sparkler", + "tada", + "confetti_ball", + "balloon", + "dizzy", + "sparkles", + "boom", + "mortar_board", + "crown", + "dolls", + "flags", + "wind_chime", + "crossed_flags", + "izakaya_lantern", + "ring", + "heart", + "broken_heart", + "love_letter", + "two_hearts", + "revolving_hearts", + "heartbeat", + "heartpulse", + "sparkling_heart", + "cupid", + "gift_heart", + "heart_decoration", + "purple_heart", + "yellow_heart", + "green_heart", + "blue_heart", + "heart_exclamation" + ] }, { - name: "activity", - fullname: "Activities", - tabicon: "soccer", - icons: ["runner", "walking", "dancer", "rowboat", "swimmer", "surfer", "bath", "snowboarder", "ski", "snowman", "bicyclist", "mountain_bicyclist", "horse_racing", "tent", "fishing_pole_and_fish", "soccer", "basketball", "football", "baseball", "tennis", "rugby_football", "golf", "trophy", "running_shirt_with_sash", "checkered_flag", "musical_keyboard", "guitar", "violin", "saxophone", "trumpet", "musical_note", "notes", "musical_score", "headphones", "microphone", "performing_arts", "ticket", "tophat", "circus_tent", "clapper", "art", "dart", "8ball", "bowling", "slot_machine", "game_die", "video_game", "flower_playing_cards", "black_joker", "mahjong", "carousel_horse", "ferris_wheel", "roller_coaster"] + name:"activity", + fullname:"Activities", + tabicon:"soccer", + icons:[ + "runner", + "walking", + "dancer", + "rowboat", + "swimmer", + "surfer", + "bath", + "snowboarder", + "ski", + "snowman", + "bicyclist", + "mountain_bicyclist", + "horse_racing", + "tent", + "fishing_pole_and_fish", + "soccer", + "basketball", + "football", + "baseball", + "tennis", + "rugby_football", + "golf", + "trophy", + "running_shirt_with_sash", + "checkered_flag", + "musical_keyboard", + "guitar", + "violin", + "saxophone", + "trumpet", + "musical_note", + "notes", + "musical_score", + "headphones", + "microphone", + "performing_arts", + "ticket", + "tophat", + "circus_tent", + "clapper", + "art", + "dart", + "8ball", + "bowling", + "slot_machine", + "game_die", + "video_game", + "flower_playing_cards", + "black_joker", + "mahjong", + "carousel_horse", + "ferris_wheel", + "roller_coaster", + "badminton", + "ballot_box", + "basketball_player", + "bow_and_arrow", + "cricket", + "crossed_swords", + "field_hockey", + "golfer", + "hockey", + "ice_skate", + "paintbrush", + "skier", + "snowman2", + "stadium", + "volleyball" + ] }, { - name: "travel", - fullname: "Travel & Places", - tabicon: "airplane", - icons: ["train", "mountain_railway", "railway_car", "steam_locomotive", "monorail", "bullettrain_side", "bullettrain_front", "train2", "metro", "light_rail", "station", "tram", "bus", "oncoming_bus", "trolleybus", "minibus", "ambulance", "fire_engine", "police_car", "oncoming_police_car", "rotating_light", "taxi", "oncoming_taxi", "car", "oncoming_automobile", "blue_car", "truck", "articulated_lorry", "tractor", "bike", "busstop", "fuelpump", "construction", "vertical_traffic_light", "traffic_light", "rocket", "helicopter", "airplane", "seat", "anchor", "ship", "speedboat", "boat", "aerial_tramway", "mountain_cableway", "suspension_railway", "passport_control", "customs", "baggage_claim", "left_luggage", "yen", "euro", "pound", "dollar", "statue_of_liberty", "moyai", "foggy", "tokyo_tower", "fountain", "european_castle", "japanese_castle", "city_sunrise", "city_sunset", "night_with_stars", "bridge_at_night", "house", "house_with_garden", "office", "department_store", "factory", "post_office", "european_post_office", "hospital", "bank", "hotel", "love_hotel", "wedding", "church", "convenience_store", "school", "cn", "de", "es", "fr", "gb", "it", "jp", "kr", "ru", "us"] + name:"travel", + fullname:"Travel & Places", + tabicon:"airplane", + icons:[ + "train", + "mountain_railway", + "railway_car", + "steam_locomotive", + "monorail", + "bullettrain_side", + "bullettrain_front", + "train2", + "metro", + "light_rail", + "station", + "tram", + "bus", + "oncoming_bus", + "trolleybus", + "minibus", + "ambulance", + "fire_engine", + "police_car", + "oncoming_police_car", + "rotating_light", + "taxi", + "oncoming_taxi", + "car", + "oncoming_automobile", + "blue_car", + "truck", + "articulated_lorry", + "tractor", + "bike", + "busstop", + "fuelpump", + "construction", + "vertical_traffic_light", + "traffic_light", + "rocket", + "helicopter", + "airplane", + "seat", + "anchor", + "ship", + "speedboat", + "boat", + "aerial_tramway", + "mountain_cableway", + "suspension_railway", + "passport_control", + "customs", + "baggage_claim", + "left_luggage", + "yen", + "euro", + "pound", + "dollar", + "statue_of_liberty", + "moyai", + "foggy", + "tokyo_tower", + "fountain", + "european_castle", + "japanese_castle", + "city_sunrise", + "city_sunset", + "night_with_stars", + "bridge_at_night", + "house", + "house_with_garden", + "office", + "department_store", + "factory", + "post_office", + "european_post_office", + "hospital", + "bank", + "hotel", + "love_hotel", + "wedding", + "church", + "convenience_store", + "school", + "cn", + "de", + "es", + "fr", + "gb", + "it", + "jp", + "kr", + "ru", + "us", + "airplane_arriving", + "airplane_departure", + "airplane_small", + "beach", + "beach_umbrella", + "camping", + "city_dusk", + "cityscape", + "classical_building", + "construction_site", + "cruise_ship", + "desert", + "ferry", + "flag_black", + "flag_cn", + "flag_de", + "flag_es", + "flag_fr", + "flag_gb", + "flag_it", + "flag_jp", + "flag_kr", + "flag_ru", + "flag_us", + "flag_white", + "hole", + "homes", + "house_abandoned", + "island", + "kaaba", + "map", + "mosque", + "motorboat", + "motorcycle", + "motorway", + "mountain", + "mountain_snow", + "park", + "place_of_worship", + "race_car", + "railway_track", + "red_car", + "sailboat", + "shinto_shrine", + "sleeping_accommodation", + "synagogue" + ] }, { - name: "objects", - fullname: "Objects & Symbols", - tabicon: "eyeglasses", - icons: ["watch", "iphone", "calling", "computer", "alarm_clock", "hourglass_flowing_sand", "hourglass", "camera", "video_camera", "movie_camera", "tv", "radio", "pager", "telephone_receiver", "phone", "fax", "minidisc", "floppy_disk", "cd", "dvd", "vhs", "battery", "electric_plug", "bulb", "flashlight", "satellite", "credit_card", "money_with_wings", "moneybag", "gem", "closed_umbrella", "pouch", "purse", "handbag", "briefcase", "school_satchel", "lipstick", "eyeglasses", "womans_hat", "sandal", "high_heel", "boot", "mans_shoe", "athletic_shoe", "bikini", "dress", "kimono", "womans_clothes", "shirt", "necktie", "jeans", "door", "shower", "bathtub", "toilet", "barber", "syringe", "pill", "microscope", "telescope", "crystal_ball", "wrench", "hocho", "nut_and_bolt", "hammer", "bomb", "smoking", "gun", "bookmark", "newspaper", "key", "email", "envelope_with_arrow", "incoming_envelope", "e-mail", "inbox_tray", "outbox_tray", "package", "postal_horn", "postbox", "mailbox_closed", "mailbox", "mailbox_with_mail", "mailbox_with_no_mail", "page_facing_up", "page_with_curl", "bookmark_tabs", "chart_with_upwards_trend", "chart_with_downwards_trend", "bar_chart", "date", "calendar", "low_brightness", "high_brightness", "scroll", "clipboard", "book", "notebook", "notebook_with_decorative_cover", "ledger", "closed_book", "green_book", "blue_book", "orange_book", "books", "card_index", "link", "paperclip", "pushpin", "scissors", "triangular_ruler", "round_pushpin", "straight_ruler", "triangular_flag_on_post", "file_folder", "open_file_folder", "black_nib", "pencil2", "memo", "lock_with_ink_pen", "closed_lock_with_key", "lock", "unlock", "mega", "loudspeaker", "sound", "loud_sound", "speaker", "mute", "zzz", "bell", "no_bell", "thought_balloon", "speech_balloon", "children_crossing", "mag", "mag_right", "no_entry_sign", "no_entry", "name_badge", "no_pedestrians", "do_not_litter", "no_bicycles", "non-potable_water", "no_mobile_phones", "underage", "accept", "ideograph_advantage", "white_flower", "secret", "congratulations", "u5408", "u6e80", "u7981", "u6709", "u7121", "u7533", "u55b6", "u6708", "u5272", "u7a7a", "sa", "koko", "u6307", "chart", "sparkle", "eight_spoked_asterisk", "negative_squared_cross_mark", "white_check_mark", "eight_pointed_black_star", "vibration_mode", "mobile_phone_off", "vs", "a", "b", "ab", "cl", "o2", "sos", "id", "parking", "wc", "cool", "free", "new", "ng", "ok", "up", "atm", "aries", "taurus", "gemini", "cancer", "leo", "virgo", "libra", "scorpius", "sagittarius", "capricorn", "aquarius", "pisces", "restroom", "mens", "womens", "baby_symbol", "wheelchair", "potable_water", "no_smoking", "put_litter_in_its_place", "arrow_forward", "arrow_backward", "arrow_up_small", "arrow_down_small", "fast_forward", "rewind", "arrow_double_up", "arrow_double_down", "arrow_right", "arrow_left", "arrow_up", "arrow_down", "arrow_upper_right", "arrow_lower_right", "arrow_lower_left", "arrow_upper_left", "arrow_up_down", "left_right_arrow", "arrows_counterclockwise", "arrow_right_hook", "leftwards_arrow_with_hook", "arrow_heading_up", "arrow_heading_down", "twisted_rightwards_arrows", "repeat", "repeat_one", "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "keycap_ten", "1234", "hash", "abc", "abcd", "capital_abcd", "information_source", "signal_strength", "cinema", "symbols", "heavy_plus_sign", "heavy_minus_sign", "wavy_dash", "heavy_division_sign", "heavy_multiplication_x", "heavy_check_mark", "arrows_clockwise", "tm", "copyright", "registered", "currency_exchange", "heavy_dollar_sign", "curly_loop", "loop", "part_alternation_mark", "exclamation", "bangbang", "question", "grey_exclamation", "grey_question", "interrobang", "x", "o", "100", "end", "back", "on", "top", "soon", "cyclone", "m", "ophiuchus", "six_pointed_star", "beginner", "trident", "warning", "hotsprings", "recycle", "anger", "diamond_shape_with_a_dot_inside", "spades", "clubs", "hearts", "diamonds", "ballot_box_with_check", "white_circle", "black_circle", "radio_button", "red_circle", "large_blue_circle", "small_red_triangle", "small_red_triangle_down", "small_orange_diamond", "small_blue_diamond", "large_orange_diamond", "large_blue_diamond", "black_small_square", "white_small_square", "black_large_square", "white_large_square", "black_medium_square", "white_medium_square", "black_medium_small_square", "white_medium_small_square", "black_square_button", "white_square_button", "clock1", "clock2", "clock3", "clock4", "clock5", "clock6", "clock7", "clock8", "clock9", "clock10", "clock11", "clock12", "clock130", "clock230", "clock330", "clock430", "clock530", "clock630", "clock730", "clock830", "clock930", "clock1030", "clock1130", "clock1230"] + name:"objects", + fullname:"Objects & Symbols", + tabicon:"eyeglasses", + icons:[ + "watch", + "iphone", + "calling", + "computer", + "alarm_clock", + "hourglass_flowing_sand", + "hourglass", + "camera", + "video_camera", + "movie_camera", + "tv", + "radio", + "pager", + "telephone_receiver", + "phone", + "fax", + "minidisc", + "floppy_disk", + "cd", + "dvd", + "vhs", + "battery", + "electric_plug", + "bulb", + "flashlight", + "satellite", + "credit_card", + "money_with_wings", + "moneybag", + "gem", + "closed_umbrella", + "pouch", + "purse", + "handbag", + "briefcase", + "school_satchel", + "lipstick", + "eyeglasses", + "womans_hat", + "sandal", + "high_heel", + "boot", + "mans_shoe", + "athletic_shoe", + "bikini", + "dress", + "kimono", + "womans_clothes", + "shirt", + "necktie", + "jeans", + "door", + "shower", + "bathtub", + "toilet", + "barber", + "syringe", + "pill", + "microscope", + "telescope", + "crystal_ball", + "wrench", + "hocho", + "nut_and_bolt", + "hammer", + "bomb", + "smoking", + "gun", + "bookmark", + "newspaper", + "key", + "email", + "envelope_with_arrow", + "incoming_envelope", + "e-mail", + "inbox_tray", + "outbox_tray", + "package", + "postal_horn", + "postbox", + "mailbox_closed", + "mailbox", + "mailbox_with_mail", + "mailbox_with_no_mail", + "page_facing_up", + "page_with_curl", + "bookmark_tabs", + "chart_with_upwards_trend", + "chart_with_downwards_trend", + "bar_chart", + "date", + "calendar", + "low_brightness", + "high_brightness", + "scroll", + "clipboard", + "book", + "notebook", + "notebook_with_decorative_cover", + "ledger", + "closed_book", + "green_book", + "blue_book", + "orange_book", + "books", + "card_index", + "link", + "paperclip", + "pushpin", + "scissors", + "triangular_ruler", + "round_pushpin", + "straight_ruler", + "triangular_flag_on_post", + "file_folder", + "open_file_folder", + "black_nib", + "pencil2", + "memo", + "lock_with_ink_pen", + "closed_lock_with_key", + "lock", + "unlock", + "mega", + "loudspeaker", + "sound", + "loud_sound", + "speaker", + "mute", + "zzz", + "bell", + "no_bell", + "thought_balloon", + "speech_balloon", + "children_crossing", + "mag", + "mag_right", + "no_entry_sign", + "no_entry", + "name_badge", + "no_pedestrians", + "do_not_litter", + "no_bicycles", + "non-potable_water", + "no_mobile_phones", + "underage", + "accept", + "ideograph_advantage", + "white_flower", + "secret", + "congratulations", + "u5408", + "u6e80", + "u7981", + "u6709", + "u7121", + "u7533", + "u55b6", + "u6708", + "u5272", + "u7a7a", + "sa", + "koko", + "u6307", + "chart", + "sparkle", + "eight_spoked_asterisk", + "negative_squared_cross_mark", + "white_check_mark", + "eight_pointed_black_star", + "vibration_mode", + "mobile_phone_off", + "vs", + "a", + "b", + "ab", + "cl", + "o2", + "sos", + "id", + "parking", + "wc", + "cool", + "free", + "new", + "ng", + "ok", + "up", + "atm", + "aries", + "taurus", + "gemini", + "cancer", + "leo", + "virgo", + "libra", + "scorpius", + "sagittarius", + "capricorn", + "aquarius", + "pisces", + "restroom", + "mens", + "womens", + "baby_symbol", + "wheelchair", + "potable_water", + "no_smoking", + "put_litter_in_its_place", + "arrow_forward", + "arrow_backward", + "arrow_up_small", + "arrow_down_small", + "fast_forward", + "rewind", + "arrow_double_up", + "arrow_double_down", + "arrow_right", + "arrow_left", + "arrow_up", + "arrow_down", + "arrow_upper_right", + "arrow_lower_right", + "arrow_lower_left", + "arrow_upper_left", + "arrow_up_down", + "left_right_arrow", + "arrows_counterclockwise", + "arrow_right_hook", + "leftwards_arrow_with_hook", + "arrow_heading_up", + "arrow_heading_down", + "twisted_rightwards_arrows", + "repeat", + "repeat_one", + "zero", + "one", + "two", + "three", + "four", + "five", + "six", + "seven", + "eight", + "nine", + "keycap_ten", + "1234", + "hash", + "abc", + "abcd", + "capital_abcd", + "information_source", + "signal_strength", + "cinema", + "symbols", + "heavy_plus_sign", + "heavy_minus_sign", + "wavy_dash", + "heavy_division_sign", + "heavy_multiplication_x", + "heavy_check_mark", + "arrows_clockwise", + "tm", + "copyright", + "registered", + "currency_exchange", + "heavy_dollar_sign", + "curly_loop", + "loop", + "part_alternation_mark", + "exclamation", + "bangbang", + "question", + "grey_exclamation", + "grey_question", + "interrobang", + "x", + "o", + "100", + "end", + "back", + "on", + "top", + "soon", + "cyclone", + "m", + "ophiuchus", + "six_pointed_star", + "beginner", + "trident", + "warning", + "hotsprings", + "recycle", + "anger", + "diamond_shape_with_a_dot_inside", + "spades", + "clubs", + "hearts", + "diamonds", + "ballot_box_with_check", + "white_circle", + "black_circle", + "radio_button", + "red_circle", + "large_blue_circle", + "small_red_triangle", + "small_red_triangle_down", + "small_orange_diamond", + "small_blue_diamond", + "large_orange_diamond", + "large_blue_diamond", + "black_small_square", + "white_small_square", + "black_large_square", + "white_large_square", + "black_medium_square", + "white_medium_square", + "black_medium_small_square", + "white_medium_small_square", + "black_square_button", + "white_square_button", + "clock1", + "clock2", + "clock3", + "clock4", + "clock5", + "clock6", + "clock7", + "clock8", + "clock9", + "clock10", + "clock11", + "clock12", + "clock130", + "clock230", + "clock330", + "clock430", + "clock530", + "clock630", + "clock730", + "clock830", + "clock930", + "clock1030", + "clock1130", + "clock1230", + "alembic", + "amphora", + "atom", + "biohazard", + "bed", + "bellhop", + "calendar_spiral", + "camera_with_flash", + "candle", + "card_box", + "chains", + "clock", + "coffin", + "compression", + "control_knobs", + "couch", + "crayon", + "cross", + "dagger", + "dark_sunglasses", + "desktop", + "dividers", + "envelope", + "file_cabinet", + "film_frames", + "fleur-de-lis", + "fork_knife_plate", + "frame_photo", + "gear", + "hammer_pick", + "helmet_with_cross", + "joystick", + "key2", + "keyboard", + "knife", + "label", + "level_slider", + "levitate", + "lifter", + "medal", + "menorah", + "metal", + "microphone2", + "military_medal", + "mouse_three_button", + "newspaper2", + "notepad_spiral", + "oil", + "om_symbol", + "orthodox_cross", + "paperclips", + "pause_button", + "peace", + "pen_ballpoint", + "pen_fountain", + "pencil", + "pick", + "ping_pong", + "play_pause", + "popcorn", + "prayer_beads", + "printer", + "projector", + "radioactive", + "record_button", + "reminder_ribbon", + "rosette", + "satellite_orbital", + "scales", + "shamrock", + "shield", + "shopping_bags", + "star_and_crescent", + "star_of_david", + "stop_button", + "stopwatch", + "telephone", + "ten", + "thermometer", + "thermometer_face", + "tickets", + "timer", + "tools", + "track_next", + "track_previous", + "trackball", + "umbrella2", + "wastebasket", + "wheel_of_dharma", + "yin_yang", + ] } ]; diff --git a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb index 057404585e..355464030c 100644 --- a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb +++ b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb @@ -1,7 +1,8 @@ // TODO @robin to move this whole thing to es6 Discourse.Emoji = {}; + // bump up this number to expire all emojis -Discourse.Emoji.ImageVersion = "1" +Discourse.Emoji.ImageVersion = "2" var emoji = <%= Emoji.standard.map(&:name).flatten.inspect %>; var aliases = <%= Emoji.aliases.inspect.gsub("=>", ":") %>; @@ -108,8 +109,8 @@ function imageFor(code) { // Also support default emotions var translations = { - ':)' : 'slightly_smiling', - ':-)' : 'slightly_smiling', + ':)' : 'slight_smile', + ':-)' : 'slight_smile', ':(' : 'frowning', ':-(' : 'frowning', ';)' : 'wink', diff --git a/app/models/emoji.rb b/app/models/emoji.rb index 986a7288a5..e636ae1686 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -20,19 +20,19 @@ class Emoji end def self.all - Discourse.cache.fetch("all_emojis") { standard | custom } + Discourse.cache.fetch("all_emojis:v2") { standard | custom } end def self.standard - Discourse.cache.fetch("standard_emojis") { load_standard } + Discourse.cache.fetch("standard_emojis:v2") { load_standard } end def self.aliases - Discourse.cache.fetch("aliases_emojis") { load_aliases } + Discourse.cache.fetch("aliases_emojis:v2") { load_aliases } end def self.custom - Discourse.cache.fetch("custom_emojis") { load_custom } + Discourse.cache.fetch("custom_emojis:v2") { load_custom } end def self.exists?(name) @@ -52,7 +52,7 @@ class Emoji end def self.create_from_db_item(emoji) - name = emoji["aliases"].first + name = emoji["name"] filename = "#{name}.png" Emoji.new.tap do |e| e.name = name @@ -91,16 +91,19 @@ class Emoji end def self.load_standard - db.map { |emoji| Emoji.create_from_db_item(emoji) } + db['emojis'].map {|e| Emoji.create_from_db_item(e) } end def self.load_aliases - aliases = {} + return @aliases if @aliases - db.select { |emoji| emoji["aliases"].count > 1 } - .each { |emoji| aliases[emoji["aliases"][0]] = emoji["aliases"][1..-1] } + @aliases ||= db['aliases'] - aliases + # Fix how `slightly_smiling` was mislabeled + @aliases['slight_smile'] ||= [] + @aliases['slight_smile'] << 'slightly_smiling' + + @aliases end def self.load_custom @@ -121,10 +124,19 @@ class Emoji def self.unicode_replacements return @unicode_replacements if @unicode_replacements - @unicode_replacements = Hash[db.map {|e| [e['emoji'], e['aliases'][0]] }] + + @unicode_replacements = {} + db['emojis'].each do |e| + hex = e['code'].hex + # Don't replace digits or letters + if hex > 128 + @unicode_replacements[[hex].pack('U')] = e['name'] + end + end + @unicode_replacements["\u{2639}"] = 'frowning' - @unicode_replacements["\u{263A}"] = 'slightly_smiling' - @unicode_replacements["\u{263B}"] = 'slightly_smiling' + @unicode_replacements["\u{263A}"] = 'slight_smile' + @unicode_replacements["\u{263B}"] = 'slight_smile' @unicode_replacements["\u{2661}"] = 'heart' @unicode_replacements["\u{2665}"] = 'heart' diff --git a/lib/emoji/db.json b/lib/emoji/db.json index 92c985e7d1..a0b396bcf3 100644 --- a/lib/emoji/db.json +++ b/lib/emoji/db.json @@ -1,8134 +1,4467 @@ -[ - { - "emoji": "🙂" - , "description": "slightly smiling face with closed mouth and smiling eyes" - , "aliases": [ - "slightly_smiling" - ] - , "tags": [ - "happy" - , "joy" - , "pleased" - ] - } -, { - "emoji": "😄" - , "description": "smiling face with open mouth and smiling eyes" - , "aliases": [ - "smile" - ] - , "tags": [ - "happy" - , "joy" - , "pleased" - ] - } -, { - "emoji": "😃" - , "description": "smiling face with open mouth" - , "aliases": [ - "smiley" - ] - , "tags": [ - "happy" - , "joy" - , "haha" - ] - } -, { - "emoji": "😀" - , "description": "grinning face" - , "aliases": [ - "grinning" - ] - , "tags": [ - "smile" - , "happy" - ] - } -, { - "emoji": "😊" - , "description": "smiling face with smiling eyes" - , "aliases": [ - "blush" - ] - , "tags": [ - "proud" - ] - } -, { - "emoji": "☺️" - , "description": "white smiling face" - , "aliases": [ - "relaxed" - ] - , "tags": [ - "blush" - , "pleased" - ] - } -, { - "emoji": "😉" - , "description": "winking face" - , "aliases": [ - "wink" - ] - , "tags": [ - "flirt" - ] - } -, { - "emoji": "😍" - , "description": "smiling face with heart-shaped eyes" - , "aliases": [ - "heart_eyes" - ] - , "tags": [ - "love" - , "crush" - ] - } -, { - "emoji": "😘" - , "description": "face throwing a kiss" - , "aliases": [ - "kissing_heart" - ] - , "tags": [ - "flirt" - ] - } -, { - "emoji": "😚" - , "description": "kissing face with closed eyes" - , "aliases": [ - "kissing_closed_eyes" - ] - , "tags": [ - ] - } -, { - "emoji": "😗" - , "description": "kissing face" - , "aliases": [ - "kissing" - ] - , "tags": [ - ] - } -, { - "emoji": "😙" - , "description": "kissing face with smiling eyes" - , "aliases": [ - "kissing_smiling_eyes" - ] - , "tags": [ - ] - } -, { - "emoji": "😜" - , "description": "face with stuck-out tongue and winking eye" - , "aliases": [ - "stuck_out_tongue_winking_eye" - ] - , "tags": [ - "prank" - , "silly" - ] - } -, { - "emoji": "😝" - , "description": "face with stuck-out tongue and tightly-closed eyes" - , "aliases": [ - "stuck_out_tongue_closed_eyes" - ] - , "tags": [ - "prank" - ] - } -, { - "emoji": "😛" - , "description": "face with stuck-out tongue" - , "aliases": [ - "stuck_out_tongue" - ] - , "tags": [ - ] - } -, { - "emoji": "😳" - , "description": "flushed face" - , "aliases": [ - "flushed" - ] - , "tags": [ - ] - } -, { - "emoji": "😁" - , "description": "grinning face with smiling eyes" - , "aliases": [ - "grin" - ] - , "tags": [ - ] - } -, { - "emoji": "😔" - , "description": "pensive face" - , "aliases": [ - "pensive" - ] - , "tags": [ - ] - } -, { - "emoji": "😌" - , "description": "relieved face" - , "aliases": [ - "relieved" - ] - , "tags": [ - "whew" - ] - } -, { - "emoji": "😒" - , "description": "unamused face" - , "aliases": [ - "unamused" - ] - , "tags": [ - "meh" - ] - } -, { - "emoji": "😞" - , "description": "disappointed face" - , "aliases": [ - "disappointed" - ] - , "tags": [ - "sad" - ] - } -, { - "emoji": "😣" - , "description": "persevering face" - , "aliases": [ - "persevere" - ] - , "tags": [ - "struggling" - ] - } -, { - "emoji": "😢" - , "description": "crying face" - , "aliases": [ - "cry" - ] - , "tags": [ - "sad" - , "tear" - ] - } -, { - "emoji": "😂" - , "description": "face with tears of joy" - , "aliases": [ - "joy" - ] - , "tags": [ - "tears" - ] - } -, { - "emoji": "😭" - , "description": "loudly crying face" - , "aliases": [ - "sob" - ] - , "tags": [ - "sad" - , "cry" - , "bawling" - ] - } -, { - "emoji": "😪" - , "description": "sleepy face" - , "aliases": [ - "sleepy" - ] - , "tags": [ - "tired" - ] - } -, { - "emoji": "😥" - , "description": "disappointed but relieved face" - , "aliases": [ - "disappointed_relieved" - ] - , "tags": [ - "phew" - , "sweat" - , "nervous" - ] - } -, { - "emoji": "😰" - , "description": "face with open mouth and cold sweat" - , "aliases": [ - "cold_sweat" - ] - , "tags": [ - "nervous" - ] - } -, { - "emoji": "😅" - , "description": "smiling face with open mouth and cold sweat" - , "aliases": [ - "sweat_smile" - ] - , "tags": [ - "hot" - ] - } -, { - "emoji": "😓" - , "description": "face with cold sweat" - , "aliases": [ - "sweat" - ] - , "tags": [ - ] - } -, { - "emoji": "😩" - , "description": "weary face" - , "aliases": [ - "weary" - ] - , "tags": [ - "tired" - ] - } -, { - "emoji": "😫" - , "description": "tired face" - , "aliases": [ - "tired_face" - ] - , "tags": [ - "upset" - , "whine" - ] - } -, { - "emoji": "😨" - , "description": "fearful face" - , "aliases": [ - "fearful" - ] - , "tags": [ - "scared" - , "shocked" - , "oops" - ] - } -, { - "emoji": "😱" - , "description": "face screaming in fear" - , "aliases": [ - "scream" - ] - , "tags": [ - "horror" - , "shocked" - ] - } -, { - "emoji": "😠" - , "description": "angry face" - , "aliases": [ - "angry" - ] - , "tags": [ - "mad" - , "annoyed" - ] - } -, { - "emoji": "😡" - , "description": "pouting face" - , "aliases": [ - "rage" - ] - , "tags": [ - "angry" - ] - } -, { - "emoji": "😤" - , "description": "face with look of triumph" - , "aliases": [ - "triumph" - ] - , "tags": [ - "smug" - ] - } -, { - "emoji": "😖" - , "description": "confounded face" - , "aliases": [ - "confounded" - ] - , "tags": [ - ] - } -, { - "emoji": "😆" - , "description": "smiling face with open mouth and tightly-closed eyes" - , "aliases": [ - "laughing" - , "satisfied" - ] - , "tags": [ - "happy" - , "haha" - ] - } -, { - "emoji": "😋" - , "description": "face savouring delicious food" - , "aliases": [ - "yum" - ] - , "tags": [ - "tongue" - , "lick" - ] - } -, { - "emoji": "😷" - , "description": "face with medical mask" - , "aliases": [ - "mask" - ] - , "tags": [ - "sick" - , "ill" - ] - } -, { - "emoji": "😎" - , "description": "smiling face with sunglasses" - , "aliases": [ - "sunglasses" - ] - , "tags": [ - "cool" - ] - } -, { - "emoji": "😴" - , "description": "sleeping face" - , "aliases": [ - "sleeping" - ] - , "tags": [ - "zzz" - ] - } -, { - "emoji": "😵" - , "description": "dizzy face" - , "aliases": [ - "dizzy_face" - ] - , "tags": [ - ] - } -, { - "emoji": "😲" - , "description": "astonished face" - , "aliases": [ - "astonished" - ] - , "tags": [ - "amazed" - , "gasp" - ] - } -, { - "emoji": "😟" - , "description": "worried face" - , "aliases": [ - "worried" - ] - , "tags": [ - "nervous" - ] - } -, { - "emoji": "😦" - , "description": "frowning face with open mouth" - , "aliases": [ - "frowning" - ] - , "tags": [ - ] - } -, { - "emoji": "😧" - , "description": "anguished face" - , "aliases": [ - "anguished" - ] - , "tags": [ - "stunned" - ] - } -, { - "emoji": "😈" - , "description": "smiling face with horns" - , "aliases": [ - "smiling_imp" - ] - , "tags": [ - "devil" - , "evil" - , "horns" - ] - } -, { - "emoji": "👿" - , "description": "imp" - , "aliases": [ - "imp" - ] - , "tags": [ - "angry" - , "devil" - , "evil" - , "horns" - ] - } -, { - "emoji": "😮" - , "description": "face with open mouth" - , "aliases": [ - "open_mouth" - ] - , "tags": [ - "surprise" - , "impressed" - , "wow" - ] - } -, { - "emoji": "😬" - , "description": "grimacing face" - , "aliases": [ - "grimacing" - ] - , "tags": [ - ] - } -, { - "emoji": "😐" - , "description": "neutral face" - , "aliases": [ - "neutral_face" - ] - , "tags": [ - "meh" - ] - } -, { - "emoji": "😕" - , "description": "confused face" - , "aliases": [ - "confused" - ] - , "tags": [ - ] - } -, { - "emoji": "😯" - , "description": "hushed face" - , "aliases": [ - "hushed" - ] - , "tags": [ - "silence" - , "speechless" - ] - } -, { - "emoji": "😶" - , "description": "face without mouth" - , "aliases": [ - "no_mouth" - ] - , "tags": [ - "mute" - , "silence" - ] - } -, { - "emoji": "😇" - , "description": "smiling face with halo" - , "aliases": [ - "innocent" - ] - , "tags": [ - "angel" - ] - } -, { - "emoji": "😏" - , "description": "smirking face" - , "aliases": [ - "smirk" - ] - , "tags": [ - "smug" - ] - } -, { - "emoji": "😑" - , "description": "expressionless face" - , "aliases": [ - "expressionless" - ] - , "tags": [ - ] - } -, { - "emoji": "👲" - , "description": "man with gua pi mao" - , "aliases": [ - "man_with_gua_pi_mao" - ] - , "tags": [ - ] - } -, { - "emoji": "👳" - , "description": "man with turban" - , "aliases": [ - "man_with_turban" - ] - , "tags": [ - ] - } -, { - "emoji": "👮" - , "description": "police officer" - , "aliases": [ - "cop" - ] - , "tags": [ - "police" - , "law" - ] - } -, { - "emoji": "👷" - , "description": "construction worker" - , "aliases": [ - "construction_worker" - ] - , "tags": [ - "helmet" - ] - } -, { - "emoji": "💂" - , "description": "guardsman" - , "aliases": [ - "guardsman" - ] - , "tags": [ - ] - } -, { - "emoji": "👶" - , "description": "baby" - , "aliases": [ - "baby" - ] - , "tags": [ - "child" - , "newborn" - ] - } -, { - "emoji": "👦" - , "description": "boy" - , "aliases": [ - "boy" - ] - , "tags": [ - "child" - ] - } -, { - "emoji": "👧" - , "description": "girl" - , "aliases": [ - "girl" - ] - , "tags": [ - "child" - ] - } -, { - "emoji": "👨" - , "description": "man" - , "aliases": [ - "man" - ] - , "tags": [ - "mustache" - , "father" - , "dad" - ] - } -, { - "emoji": "👩" - , "description": "woman" - , "aliases": [ - "woman" - ] - , "tags": [ - "girls" - ] - } -, { - "emoji": "👴" - , "description": "older man" - , "aliases": [ - "older_man" - ] - , "tags": [ - ] - } -, { - "emoji": "👵" - , "description": "older woman" - , "aliases": [ - "older_woman" - ] - , "tags": [ - ] - } -, { - "emoji": "👱" - , "description": "person with blond hair" - , "aliases": [ - "person_with_blond_hair" - ] - , "tags": [ - "boy" - ] - } -, { - "emoji": "👼" - , "description": "baby angel" - , "aliases": [ - "angel" - ] - , "tags": [ - ] - } -, { - "emoji": "👸" - , "description": "princess" - , "aliases": [ - "princess" - ] - , "tags": [ - "blonde" - , "crown" - , "royal" - ] - } -, { - "emoji": "😺" - , "description": "smiling cat face with open mouth" - , "aliases": [ - "smiley_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "😸" - , "description": "grinning cat face with smiling eyes" - , "aliases": [ - "smile_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "😻" - , "description": "smiling cat face with heart-shaped eyes" - , "aliases": [ - "heart_eyes_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "😽" - , "description": "kissing cat face with closed eyes" - , "aliases": [ - "kissing_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "😼" - , "description": "cat face with wry smile" - , "aliases": [ - "smirk_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "🙀" - , "description": "weary cat face" - , "aliases": [ - "scream_cat" - ] - , "tags": [ - "horror" - ] - } -, { - "emoji": "😿" - , "description": "crying cat face" - , "aliases": [ - "crying_cat_face" - ] - , "tags": [ - "sad" - , "tear" - ] - } -, { - "emoji": "😹" - , "description": "cat face with tears of joy" - , "aliases": [ - "joy_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "😾" - , "description": "pouting cat face" - , "aliases": [ - "pouting_cat" - ] - , "tags": [ - ] - } -, { - "emoji": "👹" - , "description": "japanese ogre" - , "aliases": [ - "japanese_ogre" - ] - , "tags": [ - "monster" - ] - } -, { - "emoji": "👺" - , "description": "japanese goblin" - , "aliases": [ - "japanese_goblin" - ] - , "tags": [ - ] - } -, { - "emoji": "🙈" - , "description": "see-no-evil monkey" - , "aliases": [ - "see_no_evil" - ] - , "tags": [ - "monkey" - , "blind" - , "ignore" - ] - } -, { - "emoji": "🙉" - , "description": "hear-no-evil monkey" - , "aliases": [ - "hear_no_evil" - ] - , "tags": [ - "monkey" - , "deaf" - ] - } -, { - "emoji": "🙊" - , "description": "speak-no-evil monkey" - , "aliases": [ - "speak_no_evil" - ] - , "tags": [ - "monkey" - , "mute" - , "hush" - ] - } -, { - "emoji": "💀" - , "description": "skull" - , "aliases": [ - "skull" - ] - , "tags": [ - "dead" - , "danger" - , "poison" - ] - } -, { - "emoji": "👽" - , "description": "extraterrestrial alien" - , "aliases": [ - "alien" - ] - , "tags": [ - "ufo" - ] - } -, { - "emoji": "💩" - , "description": "pile of poo" - , "aliases": [ - "hankey" - , "poop" - , "shit" - ] - , "tags": [ - "crap" - ] - } -, { - "emoji": "🔥" - , "description": "fire" - , "aliases": [ - "fire" - ] - , "tags": [ - "burn" - ] - } -, { - "emoji": "✨" - , "description": "sparkles" - , "aliases": [ - "sparkles" - ] - , "tags": [ - "shiny" - ] - } -, { - "emoji": "🌟" - , "description": "glowing star" - , "aliases": [ - "star2" - ] - , "tags": [ - ] - } -, { - "emoji": "💫" - , "description": "dizzy symbol" - , "aliases": [ - "dizzy" - ] - , "tags": [ - "star" - ] - } -, { - "emoji": "💥" - , "description": "collision symbol" - , "aliases": [ - "boom" - , "collision" - ] - , "tags": [ - "explode" - ] - } -, { - "emoji": "💢" - , "description": "anger symbol" - , "aliases": [ - "anger" - ] - , "tags": [ - "angry" - ] - } -, { - "emoji": "💦" - , "description": "splashing sweat symbol" - , "aliases": [ - "sweat_drops" - ] - , "tags": [ - "water" - , "workout" - ] - } -, { - "emoji": "💧" - , "description": "droplet" - , "aliases": [ - "droplet" - ] - , "tags": [ - "water" - ] - } -, { - "emoji": "💤" - , "description": "sleeping symbol" - , "aliases": [ - "zzz" - ] - , "tags": [ - "sleeping" - ] - } -, { - "emoji": "💨" - , "description": "dash symbol" - , "aliases": [ - "dash" - ] - , "tags": [ - "wind" - , "blow" - , "fast" - ] - } -, { - "emoji": "👂" - , "description": "ear" - , "aliases": [ - "ear" - ] - , "tags": [ - "hear" - , "sound" - , "listen" - ] - } -, { - "emoji": "👀" - , "description": "eyes" - , "aliases": [ - "eyes" - ] - , "tags": [ - "look" - , "see" - , "watch" - ] - } -, { - "emoji": "👃" - , "description": "nose" - , "aliases": [ - "nose" - ] - , "tags": [ - "smell" - ] - } -, { - "emoji": "👅" - , "description": "tongue" - , "aliases": [ - "tongue" - ] - , "tags": [ - "taste" - ] - } -, { - "emoji": "👄" - , "description": "mouth" - , "aliases": [ - "lips" - ] - , "tags": [ - "kiss" - ] - } -, { - "emoji": "👍" - , "description": "thumbs up sign" - , "aliases": [ - "+1" - , "thumbsup" - ] - , "tags": [ - "approve" - , "ok" - ] - } -, { - "emoji": "👎" - , "description": "thumbs down sign" - , "aliases": [ - "-1" - , "thumbsdown" - ] - , "tags": [ - "disapprove" - , "bury" - ] - } -, { - "emoji": "👌" - , "description": "ok hand sign" - , "aliases": [ - "ok_hand" - ] - , "tags": [ - ] - } -, { - "emoji": "👊" - , "description": "fisted hand sign" - , "aliases": [ - "facepunch" - , "punch" - ] - , "tags": [ - "attack" - ] - } -, { - "emoji": "✊" - , "description": "raised fist" - , "aliases": [ - "fist" - ] - , "tags": [ - "power" - ] - } -, { - "emoji": "✌️" - , "description": "victory hand" - , "aliases": [ - "v" - ] - , "tags": [ - "victory" - , "peace" - ] - } -, { - "emoji": "👋" - , "description": "waving hand sign" - , "aliases": [ - "wave" - ] - , "tags": [ - "goodbye" - ] - } -, { - "emoji": "✋" - , "description": "raised hand" - , "aliases": [ - "hand" - , "raised_hand" - ] - , "tags": [ - "highfive" - , "stop" - ] - } -, { - "emoji": "👐" - , "description": "open hands sign" - , "aliases": [ - "open_hands" - ] - , "tags": [ - ] - } -, { - "emoji": "👆" - , "description": "white up pointing backhand index" - , "aliases": [ - "point_up_2" - ] - , "tags": [ - ] - } -, { - "emoji": "👇" - , "description": "white down pointing backhand index" - , "aliases": [ - "point_down" - ] - , "tags": [ - ] - } -, { - "emoji": "👉" - , "description": "white right pointing backhand index" - , "aliases": [ - "point_right" - ] - , "tags": [ - ] - } -, { - "emoji": "👈" - , "description": "white left pointing backhand index" - , "aliases": [ - "point_left" - ] - , "tags": [ - ] - } -, { - "emoji": "🙌" - , "description": "person raising both hands in celebration" - , "aliases": [ - "raised_hands" - ] - , "tags": [ - "hooray" - ] - } -, { - "emoji": "🙏" - , "description": "person with folded hands" - , "aliases": [ - "pray" - ] - , "tags": [ - "please" - , "hope" - , "wish" - ] - } -, { - "emoji": "☝️" - , "description": "white up pointing index" - , "aliases": [ - "point_up" - ] - , "tags": [ - ] - } -, { - "emoji": "👏" - , "description": "clapping hands sign" - , "aliases": [ - "clap" - ] - , "tags": [ - "praise" - , "applause" - ] - } -, { - "emoji": "💪" - , "description": "flexed biceps" - , "aliases": [ - "muscle" - ] - , "tags": [ - "flex" - , "bicep" - , "strong" - , "workout" - ] - } -, { - "emoji": "🚶" - , "description": "pedestrian" - , "aliases": [ - "walking" - ] - , "tags": [ - ] - } -, { - "emoji": "🏃" - , "description": "runner" - , "aliases": [ - "runner" - , "running" - ] - , "tags": [ - "exercise" - , "workout" - , "marathon" - ] - } -, { - "emoji": "💃" - , "description": "dancer" - , "aliases": [ - "dancer" - ] - , "tags": [ - "dress" - ] - } -, { - "emoji": "👫" - , "description": "man and woman holding hands" - , "aliases": [ - "couple" - ] - , "tags": [ - "date" - ] - } -, { - "emoji": "👪" - , "description": "family" - , "aliases": [ - "family" - ] - , "tags": [ - "home" - , "parents" - , "child" - ] - } -, { - "emoji": "👬" - , "description": "two men holding hands" - , "aliases": [ - "two_men_holding_hands" - ] - , "tags": [ - "couple" - , "date" - ] - } -, { - "emoji": "👭" - , "description": "two women holding hands" - , "aliases": [ - "two_women_holding_hands" - ] - , "tags": [ - "couple" - , "date" - ] - } -, { - "emoji": "💏" - , "description": "kiss" - , "aliases": [ - "couplekiss" - ] - , "tags": [ - ] - } -, { - "emoji": "💑" - , "description": "couple with heart" - , "aliases": [ - "couple_with_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "👯" - , "description": "woman with bunny ears" - , "aliases": [ - "dancers" - ] - , "tags": [ - "bunny" - ] - } -, { - "emoji": "🙆" - , "description": "face with ok gesture" - , "aliases": [ - "ok_woman" - ] - , "tags": [ - ] - } -, { - "emoji": "🙅" - , "description": "face with no good gesture" - , "aliases": [ - "no_good" - ] - , "tags": [ - "stop" - , "halt" - ] - } -, { - "emoji": "💁" - , "description": "information desk person" - , "aliases": [ - "information_desk_person" - ] - , "tags": [ - ] - } -, { - "emoji": "🙋" - , "description": "happy person raising one hand" - , "aliases": [ - "raising_hand" - ] - , "tags": [ - ] - } -, { - "emoji": "💆" - , "description": "face massage" - , "aliases": [ - "massage" - ] - , "tags": [ - "spa" - ] - } -, { - "emoji": "💇" - , "description": "haircut" - , "aliases": [ - "haircut" - ] - , "tags": [ - "beauty" - ] - } -, { - "emoji": "💅" - , "description": "nail polish" - , "aliases": [ - "nail_care" - ] - , "tags": [ - "beauty" - , "manicure" - ] - } -, { - "emoji": "👰" - , "description": "bride with veil" - , "aliases": [ - "bride_with_veil" - ] - , "tags": [ - "marriage" - , "wedding" - ] - } -, { - "emoji": "🙎" - , "description": "person with pouting face" - , "aliases": [ - "person_with_pouting_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🙍" - , "description": "person frowning" - , "aliases": [ - "person_frowning" - ] - , "tags": [ - "sad" - ] - } -, { - "emoji": "🙇" - , "description": "person bowing deeply" - , "aliases": [ - "bow" - ] - , "tags": [ - "respect" - , "thanks" - ] - } -, { - "emoji": "🎩" - , "description": "top hat" - , "aliases": [ - "tophat" - ] - , "tags": [ - "hat" - , "classy" - ] - } -, { - "emoji": "👑" - , "description": "crown" - , "aliases": [ - "crown" - ] - , "tags": [ - "king" - , "queen" - , "royal" - ] - } -, { - "emoji": "👒" - , "description": "womans hat" - , "aliases": [ - "womans_hat" - ] - , "tags": [ - ] - } -, { - "emoji": "👟" - , "description": "athletic shoe" - , "aliases": [ - "athletic_shoe" - ] - , "tags": [ - "sneaker" - , "sport" - , "running" - ] - } -, { - "emoji": "👞" - , "description": "mans shoe" - , "aliases": [ - "mans_shoe" - , "shoe" - ] - , "tags": [ - ] - } -, { - "emoji": "👡" - , "description": "womans sandal" - , "aliases": [ - "sandal" - ] - , "tags": [ - "shoe" - ] - } -, { - "emoji": "👠" - , "description": "high-heeled shoe" - , "aliases": [ - "high_heel" - ] - , "tags": [ - "shoe" - ] - } -, { - "emoji": "👢" - , "description": "womans boots" - , "aliases": [ - "boot" - ] - , "tags": [ - ] - } -, { - "emoji": "👕" - , "description": "t-shirt" - , "aliases": [ - "shirt" - , "tshirt" - ] - , "tags": [ - ] - } -, { - "emoji": "👔" - , "description": "necktie" - , "aliases": [ - "necktie" - ] - , "tags": [ - "shirt" - , "formal" - ] - } -, { - "emoji": "👚" - , "description": "womans clothes" - , "aliases": [ - "womans_clothes" - ] - , "tags": [ - ] - } -, { - "emoji": "👗" - , "description": "dress" - , "aliases": [ - "dress" - ] - , "tags": [ - ] - } -, { - "emoji": "🎽" - , "description": "running shirt with sash" - , "aliases": [ - "running_shirt_with_sash" - ] - , "tags": [ - "marathon" - ] - } -, { - "emoji": "👖" - , "description": "jeans" - , "aliases": [ - "jeans" - ] - , "tags": [ - "pants" - ] - } -, { - "emoji": "👘" - , "description": "kimono" - , "aliases": [ - "kimono" - ] - , "tags": [ - ] - } -, { - "emoji": "👙" - , "description": "bikini" - , "aliases": [ - "bikini" - ] - , "tags": [ - "beach" - ] - } -, { - "emoji": "💼" - , "description": "briefcase" - , "aliases": [ - "briefcase" - ] - , "tags": [ - "business" - ] - } -, { - "emoji": "👜" - , "description": "handbag" - , "aliases": [ - "handbag" - ] - , "tags": [ - "bag" - ] - } -, { - "emoji": "👝" - , "description": "pouch" - , "aliases": [ - "pouch" - ] - , "tags": [ - "bag" - ] - } -, { - "emoji": "👛" - , "description": "purse" - , "aliases": [ - "purse" - ] - , "tags": [ - ] - } -, { - "emoji": "👓" - , "description": "eyeglasses" - , "aliases": [ - "eyeglasses" - ] - , "tags": [ - "glasses" - ] - } -, { - "emoji": "🎀" - , "description": "ribbon" - , "aliases": [ - "ribbon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌂" - , "description": "closed umbrella" - , "aliases": [ - "closed_umbrella" - ] - , "tags": [ - "weather" - , "rain" - ] - } -, { - "emoji": "💄" - , "description": "lipstick" - , "aliases": [ - "lipstick" - ] - , "tags": [ - "makeup" - ] - } -, { - "emoji": "💛" - , "description": "yellow heart" - , "aliases": [ - "yellow_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "💙" - , "description": "blue heart" - , "aliases": [ - "blue_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "💜" - , "description": "purple heart" - , "aliases": [ - "purple_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "💚" - , "description": "green heart" - , "aliases": [ - "green_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "❤️" - , "description": "heavy black heart" - , "aliases": [ - "heart" - ] - , "tags": [ - "love" - ] - } -, { - "emoji": "💔" - , "description": "broken heart" - , "aliases": [ - "broken_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "💗" - , "description": "growing heart" - , "aliases": [ - "heartpulse" - ] - , "tags": [ - ] - } -, { - "emoji": "💓" - , "description": "beating heart" - , "aliases": [ - "heartbeat" - ] - , "tags": [ - ] - } -, { - "emoji": "💕" - , "description": "two hearts" - , "aliases": [ - "two_hearts" - ] - , "tags": [ - ] - } -, { - "emoji": "💖" - , "description": "sparkling heart" - , "aliases": [ - "sparkling_heart" - ] - , "tags": [ - ] - } -, { - "emoji": "💞" - , "description": "revolving hearts" - , "aliases": [ - "revolving_hearts" - ] - , "tags": [ - ] - } -, { - "emoji": "💘" - , "description": "heart with arrow" - , "aliases": [ - "cupid" - ] - , "tags": [ - "love" - , "heart" - ] - } -, { - "emoji": "💌" - , "description": "love letter" - , "aliases": [ - "love_letter" - ] - , "tags": [ - "email" - , "envelope" - ] - } -, { - "emoji": "💋" - , "description": "kiss mark" - , "aliases": [ - "kiss" - ] - , "tags": [ - "lipstick" - ] - } -, { - "emoji": "💍" - , "description": "ring" - , "aliases": [ - "ring" - ] - , "tags": [ - "wedding" - , "marriage" - , "engaged" - ] - } -, { - "emoji": "💎" - , "description": "gem stone" - , "aliases": [ - "gem" - ] - , "tags": [ - "diamond" - ] - } -, { - "emoji": "👤" - , "description": "bust in silhouette" - , "aliases": [ - "bust_in_silhouette" - ] - , "tags": [ - "user" - ] - } -, { - "emoji": "👥" - , "description": "busts in silhouette" - , "aliases": [ - "busts_in_silhouette" - ] - , "tags": [ - "users" - , "group" - , "team" - ] - } -, { - "emoji": "💬" - , "description": "speech balloon" - , "aliases": [ - "speech_balloon" - ] - , "tags": [ - "comment" - ] - } -, { - "emoji": "👣" - , "description": "footprints" - , "aliases": [ - "footprints" - ] - , "tags": [ - "feet" - , "tracks" - ] - } -, { - "emoji": "💭" - , "description": "thought balloon" - , "aliases": [ - "thought_balloon" - ] - , "tags": [ - "thinking" - ] - } -, { - "emoji": "🐶" - , "description": "dog face" - , "aliases": [ - "dog" - ] - , "tags": [ - "pet" - ] - } -, { - "emoji": "🐺" - , "description": "wolf face" - , "aliases": [ - "wolf" - ] - , "tags": [ - ] - } -, { - "emoji": "🐱" - , "description": "cat face" - , "aliases": [ - "cat" - ] - , "tags": [ - "pet" - ] - } -, { - "emoji": "🐭" - , "description": "mouse face" - , "aliases": [ - "mouse" - ] - , "tags": [ - ] - } -, { - "emoji": "🐹" - , "description": "hamster face" - , "aliases": [ - "hamster" - ] - , "tags": [ - "pet" - ] - } -, { - "emoji": "🐰" - , "description": "rabbit face" - , "aliases": [ - "rabbit" - ] - , "tags": [ - "bunny" - ] - } -, { - "emoji": "🐸" - , "description": "frog face" - , "aliases": [ - "frog" - ] - , "tags": [ - ] - } -, { - "emoji": "🐯" - , "description": "tiger face" - , "aliases": [ - "tiger" - ] - , "tags": [ - ] - } -, { - "emoji": "🐨" - , "description": "koala" - , "aliases": [ - "koala" - ] - , "tags": [ - ] - } -, { - "emoji": "🐻" - , "description": "bear face" - , "aliases": [ - "bear" - ] - , "tags": [ - ] - } -, { - "emoji": "🐷" - , "description": "pig face" - , "aliases": [ - "pig" - ] - , "tags": [ - ] - } -, { - "emoji": "🐽" - , "description": "pig nose" - , "aliases": [ - "pig_nose" - ] - , "tags": [ - ] - } -, { - "emoji": "🐮" - , "description": "cow face" - , "aliases": [ - "cow" - ] - , "tags": [ - ] - } -, { - "emoji": "🐗" - , "description": "boar" - , "aliases": [ - "boar" - ] - , "tags": [ - ] - } -, { - "emoji": "🐵" - , "description": "monkey face" - , "aliases": [ - "monkey_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🐒" - , "description": "monkey" - , "aliases": [ - "monkey" - ] - , "tags": [ - ] - } -, { - "emoji": "🐴" - , "description": "horse face" - , "aliases": [ - "horse" - ] - , "tags": [ - ] - } -, { - "emoji": "🐑" - , "description": "sheep" - , "aliases": [ - "sheep" - ] - , "tags": [ - ] - } -, { - "emoji": "🐘" - , "description": "elephant" - , "aliases": [ - "elephant" - ] - , "tags": [ - ] - } -, { - "emoji": "🐼" - , "description": "panda face" - , "aliases": [ - "panda_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🐧" - , "description": "penguin" - , "aliases": [ - "penguin" - ] - , "tags": [ - ] - } -, { - "emoji": "🐦" - , "description": "bird" - , "aliases": [ - "bird" - ] - , "tags": [ - ] - } -, { - "emoji": "🐤" - , "description": "baby chick" - , "aliases": [ - "baby_chick" - ] - , "tags": [ - ] - } -, { - "emoji": "🐥" - , "description": "front-facing baby chick" - , "aliases": [ - "hatched_chick" - ] - , "tags": [ - ] - } -, { - "emoji": "🐣" - , "description": "hatching chick" - , "aliases": [ - "hatching_chick" - ] - , "tags": [ - ] - } -, { - "emoji": "🐔" - , "description": "chicken" - , "aliases": [ - "chicken" - ] - , "tags": [ - ] - } -, { - "emoji": "🐍" - , "description": "snake" - , "aliases": [ - "snake" - ] - , "tags": [ - ] - } -, { - "emoji": "🐢" - , "description": "turtle" - , "aliases": [ - "turtle" - ] - , "tags": [ - "slow" - ] - } -, { - "emoji": "🐛" - , "description": "bug" - , "aliases": [ - "bug" - ] - , "tags": [ - ] - } -, { - "emoji": "🐝" - , "description": "honeybee" - , "aliases": [ - "bee" - , "honeybee" - ] - , "tags": [ - ] - } -, { - "emoji": "🐜" - , "description": "ant" - , "aliases": [ - "ant" - ] - , "tags": [ - ] - } -, { - "emoji": "🐞" - , "description": "lady beetle" - , "aliases": [ - "beetle" - ] - , "tags": [ - "bug" - ] - } -, { - "emoji": "🐌" - , "description": "snail" - , "aliases": [ - "snail" - ] - , "tags": [ - "slow" - ] - } -, { - "emoji": "🐙" - , "description": "octopus" - , "aliases": [ - "octopus" - ] - , "tags": [ - ] - } -, { - "emoji": "🐚" - , "description": "spiral shell" - , "aliases": [ - "shell" - ] - , "tags": [ - "sea" - , "beach" - ] - } -, { - "emoji": "🐠" - , "description": "tropical fish" - , "aliases": [ - "tropical_fish" - ] - , "tags": [ - ] - } -, { - "emoji": "🐟" - , "description": "fish" - , "aliases": [ - "fish" - ] - , "tags": [ - ] - } -, { - "emoji": "🐬" - , "description": "dolphin" - , "aliases": [ - "dolphin" - , "flipper" - ] - , "tags": [ - ] - } -, { - "emoji": "🐳" - , "description": "spouting whale" - , "aliases": [ - "whale" - ] - , "tags": [ - "sea" - ] - } -, { - "emoji": "🐋" - , "description": "whale" - , "aliases": [ - "whale2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐄" - , "description": "cow" - , "aliases": [ - "cow2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐏" - , "description": "ram" - , "aliases": [ - "ram" - ] - , "tags": [ - ] - } -, { - "emoji": "🐀" - , "description": "rat" - , "aliases": [ - "rat" - ] - , "tags": [ - ] - } -, { - "emoji": "🐃" - , "description": "water buffalo" - , "aliases": [ - "water_buffalo" - ] - , "tags": [ - ] - } -, { - "emoji": "🐅" - , "description": "tiger" - , "aliases": [ - "tiger2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐇" - , "description": "rabbit" - , "aliases": [ - "rabbit2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐉" - , "description": "dragon" - , "aliases": [ - "dragon" - ] - , "tags": [ - ] - } -, { - "emoji": "🐎" - , "description": "horse" - , "aliases": [ - "racehorse" - ] - , "tags": [ - "speed" - ] - } -, { - "emoji": "🐐" - , "description": "goat" - , "aliases": [ - "goat" - ] - , "tags": [ - ] - } -, { - "emoji": "🐓" - , "description": "rooster" - , "aliases": [ - "rooster" - ] - , "tags": [ - ] - } -, { - "emoji": "🐕" - , "description": "dog" - , "aliases": [ - "dog2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐖" - , "description": "pig" - , "aliases": [ - "pig2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐁" - , "description": "mouse" - , "aliases": [ - "mouse2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐂" - , "description": "ox" - , "aliases": [ - "ox" - ] - , "tags": [ - ] - } -, { - "emoji": "🐲" - , "description": "dragon face" - , "aliases": [ - "dragon_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🐡" - , "description": "blowfish" - , "aliases": [ - "blowfish" - ] - , "tags": [ - ] - } -, { - "emoji": "🐊" - , "description": "crocodile" - , "aliases": [ - "crocodile" - ] - , "tags": [ - ] - } -, { - "emoji": "🐫" - , "description": "bactrian camel" - , "aliases": [ - "camel" - ] - , "tags": [ - ] - } -, { - "emoji": "🐪" - , "description": "dromedary camel" - , "aliases": [ - "dromedary_camel" - ] - , "tags": [ - "desert" - ] - } -, { - "emoji": "🐆" - , "description": "leopard" - , "aliases": [ - "leopard" - ] - , "tags": [ - ] - } -, { - "emoji": "🐈" - , "description": "cat" - , "aliases": [ - "cat2" - ] - , "tags": [ - ] - } -, { - "emoji": "🐩" - , "description": "poodle" - , "aliases": [ - "poodle" - ] - , "tags": [ - "dog" - ] - } -, { - "emoji": "🐾" - , "description": "paw prints" - , "aliases": [ - "feet" - , "paw_prints" - ] - , "tags": [ - ] - } -, { - "emoji": "💐" - , "description": "bouquet" - , "aliases": [ - "bouquet" - ] - , "tags": [ - "flowers" - ] - } -, { - "emoji": "🌸" - , "description": "cherry blossom" - , "aliases": [ - "cherry_blossom" - ] - , "tags": [ - "flower" - , "spring" - ] - } -, { - "emoji": "🌷" - , "description": "tulip" - , "aliases": [ - "tulip" - ] - , "tags": [ - "flower" - ] - } -, { - "emoji": "🍀" - , "description": "four leaf clover" - , "aliases": [ - "four_leaf_clover" - ] - , "tags": [ - "luck" - ] - } -, { - "emoji": "🌹" - , "description": "rose" - , "aliases": [ - "rose" - ] - , "tags": [ - "flower" - ] - } -, { - "emoji": "🌻" - , "description": "sunflower" - , "aliases": [ - "sunflower" - ] - , "tags": [ - ] - } -, { - "emoji": "🌺" - , "description": "hibiscus" - , "aliases": [ - "hibiscus" - ] - , "tags": [ - ] - } -, { - "emoji": "🍁" - , "description": "maple leaf" - , "aliases": [ - "maple_leaf" - ] - , "tags": [ - "canada" - ] - } -, { - "emoji": "🍃" - , "description": "leaf fluttering in wind" - , "aliases": [ - "leaves" - ] - , "tags": [ - "leaf" - ] - } -, { - "emoji": "🍂" - , "description": "fallen leaf" - , "aliases": [ - "fallen_leaf" - ] - , "tags": [ - "autumn" - ] - } -, { - "emoji": "🌿" - , "description": "herb" - , "aliases": [ - "herb" - ] - , "tags": [ - ] - } -, { - "emoji": "🌾" - , "description": "ear of rice" - , "aliases": [ - "ear_of_rice" - ] - , "tags": [ - ] - } -, { - "emoji": "🍄" - , "description": "mushroom" - , "aliases": [ - "mushroom" - ] - , "tags": [ - ] - } -, { - "emoji": "🌵" - , "description": "cactus" - , "aliases": [ - "cactus" - ] - , "tags": [ - ] - } -, { - "emoji": "🌴" - , "description": "palm tree" - , "aliases": [ - "palm_tree" - ] - , "tags": [ - ] - } -, { - "emoji": "🌲" - , "description": "evergreen tree" - , "aliases": [ - "evergreen_tree" - ] - , "tags": [ - "wood" - ] - } -, { - "emoji": "🌳" - , "description": "deciduous tree" - , "aliases": [ - "deciduous_tree" - ] - , "tags": [ - "wood" - ] - } -, { - "emoji": "🌰" - , "description": "chestnut" - , "aliases": [ - "chestnut" - ] - , "tags": [ - ] - } -, { - "emoji": "🌱" - , "description": "seedling" - , "aliases": [ - "seedling" - ] - , "tags": [ - "plant" - ] - } -, { - "emoji": "🌼" - , "description": "blossom" - , "aliases": [ - "blossom" - ] - , "tags": [ - ] - } -, { - "emoji": "🌐" - , "description": "globe with meridians" - , "aliases": [ - "globe_with_meridians" - ] - , "tags": [ - "world" - , "global" - , "international" - ] - } -, { - "emoji": "🌞" - , "description": "sun with face" - , "aliases": [ - "sun_with_face" - ] - , "tags": [ - "summer" - ] - } -, { - "emoji": "🌝" - , "description": "full moon with face" - , "aliases": [ - "full_moon_with_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🌚" - , "description": "new moon with face" - , "aliases": [ - "new_moon_with_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🌑" - , "description": "new moon symbol" - , "aliases": [ - "new_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌒" - , "description": "waxing crescent moon symbol" - , "aliases": [ - "waxing_crescent_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌓" - , "description": "first quarter moon symbol" - , "aliases": [ - "first_quarter_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌔" - , "description": "waxing gibbous moon symbol" - , "aliases": [ - "moon" - , "waxing_gibbous_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌕" - , "description": "full moon symbol" - , "aliases": [ - "full_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌖" - , "description": "waning gibbous moon symbol" - , "aliases": [ - "waning_gibbous_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌗" - , "description": "last quarter moon symbol" - , "aliases": [ - "last_quarter_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌘" - , "description": "waning crescent moon symbol" - , "aliases": [ - "waning_crescent_moon" - ] - , "tags": [ - ] - } -, { - "emoji": "🌜" - , "description": "last quarter moon with face" - , "aliases": [ - "last_quarter_moon_with_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🌛" - , "description": "first quarter moon with face" - , "aliases": [ - "first_quarter_moon_with_face" - ] - , "tags": [ - ] - } -, { - "emoji": "🌙" - , "description": "crescent moon" - , "aliases": [ - "crescent_moon" - ] - , "tags": [ - "night" - ] - } -, { - "emoji": "🌍" - , "description": "earth globe europe-africa" - , "aliases": [ - "earth_africa" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - } -, { - "emoji": "🌎" - , "description": "earth globe americas" - , "aliases": [ - "earth_americas" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - } -, { - "emoji": "🌏" - , "description": "earth globe asia-australia" - , "aliases": [ - "earth_asia" - ] - , "tags": [ - "globe" - , "world" - , "international" - ] - } -, { - "emoji": "🌋" - , "description": "volcano" - , "aliases": [ - "volcano" - ] - , "tags": [ - ] - } -, { - "emoji": "🌌" - , "description": "milky way" - , "aliases": [ - "milky_way" - ] - , "tags": [ - ] - } -, { - "emoji": "🌠" - , "description": "shooting star" - , "aliases": [ - "stars" - ] - , "tags": [ - ] - } -, { - "emoji": "⭐" - , "description": "white medium star" - , "aliases": [ - "star" - ] - , "tags": [ - ] - } -, { - "emoji": "☀️" - , "description": "black sun with rays" - , "aliases": [ - "sunny" - ] - , "tags": [ - "weather" - ] - } -, { - "emoji": "⛅" - , "description": "sun behind cloud" - , "aliases": [ - "partly_sunny" - ] - , "tags": [ - "weather" - , "cloud" - ] - } -, { - "emoji": "☁️" - , "description": "cloud" - , "aliases": [ - "cloud" - ] - , "tags": [ - ] - } -, { - "emoji": "⚡" - , "description": "high voltage sign" - , "aliases": [ - "zap" - ] - , "tags": [ - "lightning" - , "thunder" - ] - } -, { - "emoji": "☔" - , "description": "umbrella with rain drops" - , "aliases": [ - "umbrella" - ] - , "tags": [ - "rain" - , "weather" - ] - } -, { - "emoji": "❄️" - , "description": "snowflake" - , "aliases": [ - "snowflake" - ] - , "tags": [ - "winter" - , "cold" - , "weather" - ] - } -, { - "emoji": "⛄" - , "description": "snowman without snow" - , "aliases": [ - "snowman" - ] - , "tags": [ - "winter" - , "christmas" - ] - } -, { - "emoji": "🌀" - , "description": "cyclone" - , "aliases": [ - "cyclone" - ] - , "tags": [ - "swirl" - ] - } -, { - "emoji": "🌁" - , "description": "foggy" - , "aliases": [ - "foggy" - ] - , "tags": [ - "karl" - ] - } -, { - "emoji": "🌈" - , "description": "rainbow" - , "aliases": [ - "rainbow" - ] - , "tags": [ - "pride" - ] - } -, { - "emoji": "🌊" - , "description": "water wave" - , "aliases": [ - "ocean" - ] - , "tags": [ - "sea" - ] - } -, { - "emoji": "🎍" - , "description": "pine decoration" - , "aliases": [ - "bamboo" - ] - , "tags": [ - ] - } -, { - "emoji": "💝" - , "description": "heart with ribbon" - , "aliases": [ - "gift_heart" - ] - , "tags": [ - "chocolates" - ] - } -, { - "emoji": "🎎" - , "description": "japanese dolls" - , "aliases": [ - "dolls" - ] - , "tags": [ - ] - } -, { - "emoji": "🎒" - , "description": "school satchel" - , "aliases": [ - "school_satchel" - ] - , "tags": [ - ] - } -, { - "emoji": "🎓" - , "description": "graduation cap" - , "aliases": [ - "mortar_board" - ] - , "tags": [ - "education" - , "college" - , "university" - , "graduation" - ] - } -, { - "emoji": "🎏" - , "description": "carp streamer" - , "aliases": [ - "flags" - ] - , "tags": [ - ] - } -, { - "emoji": "🎆" - , "description": "fireworks" - , "aliases": [ - "fireworks" - ] - , "tags": [ - "festival" - , "celebration" - ] - } -, { - "emoji": "🎇" - , "description": "firework sparkler" - , "aliases": [ - "sparkler" - ] - , "tags": [ - ] - } -, { - "emoji": "🎐" - , "description": "wind chime" - , "aliases": [ - "wind_chime" - ] - , "tags": [ - ] - } -, { - "emoji": "🎑" - , "description": "moon viewing ceremony" - , "aliases": [ - "rice_scene" - ] - , "tags": [ - ] - } -, { - "emoji": "🎃" - , "description": "jack-o-lantern" - , "aliases": [ - "jack_o_lantern" - ] - , "tags": [ - "halloween" - ] - } -, { - "emoji": "👻" - , "description": "ghost" - , "aliases": [ - "ghost" - ] - , "tags": [ - "halloween" - ] - } -, { - "emoji": "🎅" - , "description": "father christmas" - , "aliases": [ - "santa" - ] - , "tags": [ - "christmas" - ] - } -, { - "emoji": "🎄" - , "description": "christmas tree" - , "aliases": [ - "christmas_tree" - ] - , "tags": [ - ] - } -, { - "emoji": "🎁" - , "description": "wrapped present" - , "aliases": [ - "gift" - ] - , "tags": [ - "present" - , "birthday" - , "christmas" - ] - } -, { - "emoji": "🎋" - , "description": "tanabata tree" - , "aliases": [ - "tanabata_tree" - ] - , "tags": [ - ] - } -, { - "emoji": "🎉" - , "description": "party popper" - , "aliases": [ - "tada" - ] - , "tags": [ - "party" - ] - } -, { - "emoji": "🎊" - , "description": "confetti ball" - , "aliases": [ - "confetti_ball" - ] - , "tags": [ - ] - } -, { - "emoji": "🎈" - , "description": "balloon" - , "aliases": [ - "balloon" - ] - , "tags": [ - "party" - , "birthday" - ] - } -, { - "emoji": "🎌" - , "description": "crossed flags" - , "aliases": [ - "crossed_flags" - ] - , "tags": [ - ] - } -, { - "emoji": "🔮" - , "description": "crystal ball" - , "aliases": [ - "crystal_ball" - ] - , "tags": [ - "fortune" - ] - } -, { - "emoji": "🎥" - , "description": "movie camera" - , "aliases": [ - "movie_camera" - ] - , "tags": [ - "film" - , "video" - ] - } -, { - "emoji": "📷" - , "description": "camera" - , "aliases": [ - "camera" - ] - , "tags": [ - "photo" - ] - } -, { - "emoji": "📹" - , "description": "video camera" - , "aliases": [ - "video_camera" - ] - , "tags": [ - ] - } -, { - "emoji": "📼" - , "description": "videocassette" - , "aliases": [ - "vhs" - ] - , "tags": [ - ] - } -, { - "emoji": "💿" - , "description": "optical disc" - , "aliases": [ - "cd" - ] - , "tags": [ - ] - } -, { - "emoji": "📀" - , "description": "dvd" - , "aliases": [ - "dvd" - ] - , "tags": [ - ] - } -, { - "emoji": "💽" - , "description": "minidisc" - , "aliases": [ - "minidisc" - ] - , "tags": [ - ] - } -, { - "emoji": "💾" - , "description": "floppy disk" - , "aliases": [ - "floppy_disk" - ] - , "tags": [ - "save" - ] - } -, { - "emoji": "💻" - , "description": "personal computer" - , "aliases": [ - "computer" - ] - , "tags": [ - "desktop" - , "screen" - ] - } -, { - "emoji": "📱" - , "description": "mobile phone" - , "aliases": [ - "iphone" - ] - , "tags": [ - "smartphone" - , "mobile" - ] - } -, { - "emoji": "☎️" - , "description": "black telephone" - , "aliases": [ - "phone" - , "telephone" - ] - , "tags": [ - ] - } -, { - "emoji": "📞" - , "description": "telephone receiver" - , "aliases": [ - "telephone_receiver" - ] - , "tags": [ - "phone" - , "call" - ] - } -, { - "emoji": "📟" - , "description": "pager" - , "aliases": [ - "pager" - ] - , "tags": [ - ] - } -, { - "emoji": "📠" - , "description": "fax machine" - , "aliases": [ - "fax" - ] - , "tags": [ - ] - } -, { - "emoji": "📡" - , "description": "satellite antenna" - , "aliases": [ - "satellite" - ] - , "tags": [ - "signal" - ] - } -, { - "emoji": "📺" - , "description": "television" - , "aliases": [ - "tv" - ] - , "tags": [ - ] - } -, { - "emoji": "📻" - , "description": "radio" - , "aliases": [ - "radio" - ] - , "tags": [ - "podcast" - ] - } -, { - "emoji": "🔊" - , "description": "speaker with three sound waves" - , "aliases": [ - "loud_sound" - ] - , "tags": [ - "volume" - ] - } -, { - "emoji": "🔉" - , "description": "speaker with one sound wave" - , "aliases": [ - "sound" - ] - , "tags": [ - "volume" - ] - } -, { - "emoji": "🔈" - , "description": "speaker" - , "aliases": [ - "speaker" - ] - , "tags": [ - ] - } -, { - "emoji": "🔇" - , "description": "speaker with cancellation stroke" - , "aliases": [ - "mute" - ] - , "tags": [ - "sound" - , "volume" - ] - } -, { - "emoji": "🔔" - , "description": "bell" - , "aliases": [ - "bell" - ] - , "tags": [ - "sound" - , "notification" - ] - } -, { - "emoji": "🔕" - , "description": "bell with cancellation stroke" - , "aliases": [ - "no_bell" - ] - , "tags": [ - "volume" - , "off" - ] - } -, { - "emoji": "📢" - , "description": "public address loudspeaker" - , "aliases": [ - "loudspeaker" - ] - , "tags": [ - "announcement" - ] - } -, { - "emoji": "📣" - , "description": "cheering megaphone" - , "aliases": [ - "mega" - ] - , "tags": [ - ] - } -, { - "emoji": "⏳" - , "description": "hourglass with flowing sand" - , "aliases": [ - "hourglass_flowing_sand" - ] - , "tags": [ - "time" - ] - } -, { - "emoji": "⌛" - , "description": "hourglass" - , "aliases": [ - "hourglass" - ] - , "tags": [ - "time" - ] - } -, { - "emoji": "⏰" - , "description": "alarm clock" - , "aliases": [ - "alarm_clock" - ] - , "tags": [ - "morning" - ] - } -, { - "emoji": "⌚" - , "description": "watch" - , "aliases": [ - "watch" - ] - , "tags": [ - "time" - ] - } -, { - "emoji": "🔓" - , "description": "open lock" - , "aliases": [ - "unlock" - ] - , "tags": [ - "security" - ] - } -, { - "emoji": "🔒" - , "description": "lock" - , "aliases": [ - "lock" - ] - , "tags": [ - "security" - , "private" - ] - } -, { - "emoji": "🔏" - , "description": "lock with ink pen" - , "aliases": [ - "lock_with_ink_pen" - ] - , "tags": [ - ] - } -, { - "emoji": "🔐" - , "description": "closed lock with key" - , "aliases": [ - "closed_lock_with_key" - ] - , "tags": [ - "security" - ] - } -, { - "emoji": "🔑" - , "description": "key" - , "aliases": [ - "key" - ] - , "tags": [ - "lock" - , "password" - ] - } -, { - "emoji": "🔎" - , "description": "right-pointing magnifying glass" - , "aliases": [ - "mag_right" - ] - , "tags": [ - ] - } -, { - "emoji": "💡" - , "description": "electric light bulb" - , "aliases": [ - "bulb" - ] - , "tags": [ - "idea" - , "light" - ] - } -, { - "emoji": "🔦" - , "description": "electric torch" - , "aliases": [ - "flashlight" - ] - , "tags": [ - ] - } -, { - "emoji": "🔆" - , "description": "high brightness symbol" - , "aliases": [ - "high_brightness" - ] - , "tags": [ - ] - } -, { - "emoji": "🔅" - , "description": "low brightness symbol" - , "aliases": [ - "low_brightness" - ] - , "tags": [ - ] - } -, { - "emoji": "🔌" - , "description": "electric plug" - , "aliases": [ - "electric_plug" - ] - , "tags": [ - ] - } -, { - "emoji": "🔋" - , "description": "battery" - , "aliases": [ - "battery" - ] - , "tags": [ - "power" - ] - } -, { - "emoji": "🔍" - , "description": "left-pointing magnifying glass" - , "aliases": [ - "mag" - ] - , "tags": [ - "search" - , "zoom" - ] - } -, { - "emoji": "🛁" - , "description": "bathtub" - , "aliases": [ - "bathtub" - ] - , "tags": [ - ] - } -, { - "emoji": "🛀" - , "description": "bath" - , "aliases": [ - "bath" - ] - , "tags": [ - "shower" - ] - } -, { - "emoji": "🚿" - , "description": "shower" - , "aliases": [ - "shower" - ] - , "tags": [ - "bath" - ] - } -, { - "emoji": "🚽" - , "description": "toilet" - , "aliases": [ - "toilet" - ] - , "tags": [ - "wc" - ] - } -, { - "emoji": "🔧" - , "description": "wrench" - , "aliases": [ - "wrench" - ] - , "tags": [ - "tool" - ] - } -, { - "emoji": "🔩" - , "description": "nut and bolt" - , "aliases": [ - "nut_and_bolt" - ] - , "tags": [ - ] - } -, { - "emoji": "🔨" - , "description": "hammer" - , "aliases": [ - "hammer" - ] - , "tags": [ - "tool" - ] - } -, { - "emoji": "🚪" - , "description": "door" - , "aliases": [ - "door" - ] - , "tags": [ - ] - } -, { - "emoji": "🚬" - , "description": "smoking symbol" - , "aliases": [ - "smoking" - ] - , "tags": [ - "cigarette" - ] - } -, { - "emoji": "💣" - , "description": "bomb" - , "aliases": [ - "bomb" - ] - , "tags": [ - "boom" - ] - } -, { - "emoji": "🔫" - , "description": "pistol" - , "aliases": [ - "gun" - ] - , "tags": [ - "shoot" - , "weapon" - ] - } -, { - "emoji": "🔪" - , "description": "hocho" - , "aliases": [ - "hocho" - , "knife" - ] - , "tags": [ - "cut" - , "chop" - ] - } -, { - "emoji": "💊" - , "description": "pill" - , "aliases": [ - "pill" - ] - , "tags": [ - "health" - , "medicine" - ] - } -, { - "emoji": "💉" - , "description": "syringe" - , "aliases": [ - "syringe" - ] - , "tags": [ - "health" - , "hospital" - , "needle" - ] - } -, { - "emoji": "💰" - , "description": "money bag" - , "aliases": [ - "moneybag" - ] - , "tags": [ - "dollar" - , "cream" - ] - } -, { - "emoji": "💴" - , "description": "banknote with yen sign" - , "aliases": [ - "yen" - ] - , "tags": [ - ] - } -, { - "emoji": "💵" - , "description": "banknote with dollar sign" - , "aliases": [ - "dollar" - ] - , "tags": [ - "money" - ] - } -, { - "emoji": "💷" - , "description": "banknote with pound sign" - , "aliases": [ - "pound" - ] - , "tags": [ - ] - } -, { - "emoji": "💶" - , "description": "banknote with euro sign" - , "aliases": [ - "euro" - ] - , "tags": [ - ] - } -, { - "emoji": "💳" - , "description": "credit card" - , "aliases": [ - "credit_card" - ] - , "tags": [ - "subscription" - ] - } -, { - "emoji": "💸" - , "description": "money with wings" - , "aliases": [ - "money_with_wings" - ] - , "tags": [ - "dollar" - ] - } -, { - "emoji": "📲" - , "description": "mobile phone with rightwards arrow at left" - , "aliases": [ - "calling" - ] - , "tags": [ - "call" - , "incoming" - ] - } -, { - "emoji": "📧" - , "description": "e-mail symbol" - , "aliases": [ - "e-mail" - ] - , "tags": [ - ] - } -, { - "emoji": "📥" - , "description": "inbox tray" - , "aliases": [ - "inbox_tray" - ] - , "tags": [ - ] - } -, { - "emoji": "📤" - , "description": "outbox tray" - , "aliases": [ - "outbox_tray" - ] - , "tags": [ - ] - } -, { - "emoji": "✉️" - , "description": "envelope" - , "aliases": [ - "email" - , "envelope" - ] - , "tags": [ - "letter" - ] - } -, { - "emoji": "📩" - , "description": "envelope with downwards arrow above" - , "aliases": [ - "envelope_with_arrow" - ] - , "tags": [ - ] - } -, { - "emoji": "📨" - , "description": "incoming envelope" - , "aliases": [ - "incoming_envelope" - ] - , "tags": [ - ] - } -, { - "emoji": "📯" - , "description": "postal horn" - , "aliases": [ - "postal_horn" - ] - , "tags": [ - ] - } -, { - "emoji": "📫" - , "description": "closed mailbox with raised flag" - , "aliases": [ - "mailbox" - ] - , "tags": [ - ] - } -, { - "emoji": "📪" - , "description": "closed mailbox with lowered flag" - , "aliases": [ - "mailbox_closed" - ] - , "tags": [ - ] - } -, { - "emoji": "📬" - , "description": "open mailbox with raised flag" - , "aliases": [ - "mailbox_with_mail" - ] - , "tags": [ - ] - } -, { - "emoji": "📭" - , "description": "open mailbox with lowered flag" - , "aliases": [ - "mailbox_with_no_mail" - ] - , "tags": [ - ] - } -, { - "emoji": "📮" - , "description": "postbox" - , "aliases": [ - "postbox" - ] - , "tags": [ - ] - } -, { - "emoji": "📦" - , "description": "package" - , "aliases": [ - "package" - ] - , "tags": [ - "shipping" - ] - } -, { - "emoji": "📝" - , "description": "memo" - , "aliases": [ - "memo" - , "pencil" - ] - , "tags": [ - "document" - , "note" - ] - } -, { - "emoji": "📄" - , "description": "page facing up" - , "aliases": [ - "page_facing_up" - ] - , "tags": [ - "document" - ] - } -, { - "emoji": "📃" - , "description": "page with curl" - , "aliases": [ - "page_with_curl" - ] - , "tags": [ - ] - } -, { - "emoji": "📑" - , "description": "bookmark tabs" - , "aliases": [ - "bookmark_tabs" - ] - , "tags": [ - ] - } -, { - "emoji": "📊" - , "description": "bar chart" - , "aliases": [ - "bar_chart" - ] - , "tags": [ - "stats" - , "metrics" - ] - } -, { - "emoji": "📈" - , "description": "chart with upwards trend" - , "aliases": [ - "chart_with_upwards_trend" - ] - , "tags": [ - "graph" - , "metrics" - ] - } -, { - "emoji": "📉" - , "description": "chart with downwards trend" - , "aliases": [ - "chart_with_downwards_trend" - ] - , "tags": [ - "graph" - , "metrics" - ] - } -, { - "emoji": "📜" - , "description": "scroll" - , "aliases": [ - "scroll" - ] - , "tags": [ - "document" - ] - } -, { - "emoji": "📋" - , "description": "clipboard" - , "aliases": [ - "clipboard" - ] - , "tags": [ - ] - } -, { - "emoji": "📅" - , "description": "calendar" - , "aliases": [ - "date" - ] - , "tags": [ - "calendar" - , "schedule" - ] - } -, { - "emoji": "📆" - , "description": "tear-off calendar" - , "aliases": [ - "calendar" - ] - , "tags": [ - "schedule" - ] - } -, { - "emoji": "📇" - , "description": "card index" - , "aliases": [ - "card_index" - ] - , "tags": [ - ] - } -, { - "emoji": "📁" - , "description": "file folder" - , "aliases": [ - "file_folder" - ] - , "tags": [ - "directory" - ] - } -, { - "emoji": "📂" - , "description": "open file folder" - , "aliases": [ - "open_file_folder" - ] - , "tags": [ - ] - } -, { - "emoji": "✂️" - , "description": "black scissors" - , "aliases": [ - "scissors" - ] - , "tags": [ - "cut" - ] - } -, { - "emoji": "📌" - , "description": "pushpin" - , "aliases": [ - "pushpin" - ] - , "tags": [ - "location" - ] - } -, { - "emoji": "📎" - , "description": "paperclip" - , "aliases": [ - "paperclip" - ] - , "tags": [ - ] - } -, { - "emoji": "✒️" - , "description": "black nib" - , "aliases": [ - "black_nib" - ] - , "tags": [ - ] - } -, { - "emoji": "✏️" - , "description": "pencil" - , "aliases": [ - "pencil2" - ] - , "tags": [ - ] - } -, { - "emoji": "📏" - , "description": "straight ruler" - , "aliases": [ - "straight_ruler" - ] - , "tags": [ - ] - } -, { - "emoji": "📐" - , "description": "triangular ruler" - , "aliases": [ - "triangular_ruler" - ] - , "tags": [ - ] - } -, { - "emoji": "📕" - , "description": "closed book" - , "aliases": [ - "closed_book" - ] - , "tags": [ - ] - } -, { - "emoji": "📗" - , "description": "green book" - , "aliases": [ - "green_book" - ] - , "tags": [ - ] - } -, { - "emoji": "📘" - , "description": "blue book" - , "aliases": [ - "blue_book" - ] - , "tags": [ - ] - } -, { - "emoji": "📙" - , "description": "orange book" - , "aliases": [ - "orange_book" - ] - , "tags": [ - ] - } -, { - "emoji": "📓" - , "description": "notebook" - , "aliases": [ - "notebook" - ] - , "tags": [ - ] - } -, { - "emoji": "📔" - , "description": "notebook with decorative cover" - , "aliases": [ - "notebook_with_decorative_cover" - ] - , "tags": [ - ] - } -, { - "emoji": "📒" - , "description": "ledger" - , "aliases": [ - "ledger" - ] - , "tags": [ - ] - } -, { - "emoji": "📚" - , "description": "books" - , "aliases": [ - "books" - ] - , "tags": [ - "library" - ] - } -, { - "emoji": "📖" - , "description": "open book" - , "aliases": [ - "book" - , "open_book" - ] - , "tags": [ - ] - } -, { - "emoji": "🔖" - , "description": "bookmark" - , "aliases": [ - "bookmark" - ] - , "tags": [ - ] - } -, { - "emoji": "📛" - , "description": "name badge" - , "aliases": [ - "name_badge" - ] - , "tags": [ - ] - } -, { - "emoji": "🔬" - , "description": "microscope" - , "aliases": [ - "microscope" - ] - , "tags": [ - "science" - , "laboratory" - , "investigate" - ] - } -, { - "emoji": "🔭" - , "description": "telescope" - , "aliases": [ - "telescope" - ] - , "tags": [ - ] - } -, { - "emoji": "📰" - , "description": "newspaper" - , "aliases": [ - "newspaper" - ] - , "tags": [ - "press" - ] - } -, { - "emoji": "🎨" - , "description": "artist palette" - , "aliases": [ - "art" - ] - , "tags": [ - "design" - , "paint" - ] - } -, { - "emoji": "🎬" - , "description": "clapper board" - , "aliases": [ - "clapper" - ] - , "tags": [ - "film" - ] - } -, { - "emoji": "🎤" - , "description": "microphone" - , "aliases": [ - "microphone" - ] - , "tags": [ - "sing" - ] - } -, { - "emoji": "🎧" - , "description": "headphone" - , "aliases": [ - "headphones" - ] - , "tags": [ - "music" - , "earphones" - ] - } -, { - "emoji": "🎼" - , "description": "musical score" - , "aliases": [ - "musical_score" - ] - , "tags": [ - ] - } -, { - "emoji": "🎵" - , "description": "musical note" - , "aliases": [ - "musical_note" - ] - , "tags": [ - ] - } -, { - "emoji": "🎶" - , "description": "multiple musical notes" - , "aliases": [ - "notes" - ] - , "tags": [ - "music" - ] - } -, { - "emoji": "🎹" - , "description": "musical keyboard" - , "aliases": [ - "musical_keyboard" - ] - , "tags": [ - "piano" - ] - } -, { - "emoji": "🎻" - , "description": "violin" - , "aliases": [ - "violin" - ] - , "tags": [ - ] - } -, { - "emoji": "🎺" - , "description": "trumpet" - , "aliases": [ - "trumpet" - ] - , "tags": [ - ] - } -, { - "emoji": "🎷" - , "description": "saxophone" - , "aliases": [ - "saxophone" - ] - , "tags": [ - ] - } -, { - "emoji": "🎸" - , "description": "guitar" - , "aliases": [ - "guitar" - ] - , "tags": [ - "rock" - ] - } -, { - "emoji": "👾" - , "description": "alien monster" - , "aliases": [ - "space_invader" - ] - , "tags": [ - "game" - , "retro" - ] - } -, { - "emoji": "🎮" - , "description": "video game" - , "aliases": [ - "video_game" - ] - , "tags": [ - "play" - , "controller" - , "console" - ] - } -, { - "emoji": "🃏" - , "description": "playing card black joker" - , "aliases": [ - "black_joker" - ] - , "tags": [ - ] - } -, { - "emoji": "🎴" - , "description": "flower playing cards" - , "aliases": [ - "flower_playing_cards" - ] - , "tags": [ - ] - } -, { - "emoji": "🀄" - , "description": "mahjong tile red dragon" - , "aliases": [ - "mahjong" - ] - , "tags": [ - ] - } -, { - "emoji": "🎲" - , "description": "game die" - , "aliases": [ - "game_die" - ] - , "tags": [ - "dice" - , "gambling" - ] - } -, { - "emoji": "🎯" - , "description": "direct hit" - , "aliases": [ - "dart" - ] - , "tags": [ - "target" - ] - } -, { - "emoji": "🏈" - , "description": "american football" - , "aliases": [ - "football" - ] - , "tags": [ - "sports" - ] - } -, { - "emoji": "🏀" - , "description": "basketball and hoop" - , "aliases": [ - "basketball" - ] - , "tags": [ - "sports" - ] - } -, { - "emoji": "⚽" - , "description": "soccer ball" - , "aliases": [ - "soccer" - ] - , "tags": [ - "sports" - ] - } -, { - "emoji": "⚾️" - , "description": "baseball" - , "aliases": [ - "baseball" - ] - , "tags": [ - "sports" - ] - } -, { - "emoji": "🎾" - , "description": "tennis racquet and ball" - , "aliases": [ - "tennis" - ] - , "tags": [ - "sports" - ] - } -, { - "emoji": "🎱" - , "description": "billiards" - , "aliases": [ - "8ball" - ] - , "tags": [ - "pool" - , "billiards" - ] - } -, { - "emoji": "🏉" - , "description": "rugby football" - , "aliases": [ - "rugby_football" - ] - , "tags": [ - ] - } -, { - "emoji": "🎳" - , "description": "bowling" - , "aliases": [ - "bowling" - ] - , "tags": [ - ] - } -, { - "emoji": "⛳" - , "description": "flag in hole" - , "aliases": [ - "golf" - ] - , "tags": [ - ] - } -, { - "emoji": "🚵" - , "description": "mountain bicyclist" - , "aliases": [ - "mountain_bicyclist" - ] - , "tags": [ - ] - } -, { - "emoji": "🚴" - , "description": "bicyclist" - , "aliases": [ - "bicyclist" - ] - , "tags": [ - ] - } -, { - "emoji": "🏁" - , "description": "chequered flag" - , "aliases": [ - "checkered_flag" - ] - , "tags": [ - "milestone" - , "finish" - ] - } -, { - "emoji": "🏇" - , "description": "horse racing" - , "aliases": [ - "horse_racing" - ] - , "tags": [ - ] - } -, { - "emoji": "🏆" - , "description": "trophy" - , "aliases": [ - "trophy" - ] - , "tags": [ - "award" - , "contest" - , "winner" - ] - } -, { - "emoji": "🎿" - , "description": "ski and ski boot" - , "aliases": [ - "ski" - ] - , "tags": [ - ] - } -, { - "emoji": "🏂" - , "description": "snowboarder" - , "aliases": [ - "snowboarder" - ] - , "tags": [ - ] - } -, { - "emoji": "🏊" - , "description": "swimmer" - , "aliases": [ - "swimmer" - ] - , "tags": [ - ] - } -, { - "emoji": "🏄" - , "description": "surfer" - , "aliases": [ - "surfer" - ] - , "tags": [ - ] - } -, { - "emoji": "🎣" - , "description": "fishing pole and fish" - , "aliases": [ - "fishing_pole_and_fish" - ] - , "tags": [ - ] - } -, { - "emoji": "☕" - , "description": "hot beverage" - , "aliases": [ - "coffee" - ] - , "tags": [ - "cafe" - , "espresso" - ] - } -, { - "emoji": "🍵" - , "description": "teacup without handle" - , "aliases": [ - "tea" - ] - , "tags": [ - "green" - , "breakfast" - ] - } -, { - "emoji": "🍶" - , "description": "sake bottle and cup" - , "aliases": [ - "sake" - ] - , "tags": [ - ] - } -, { - "emoji": "🍼" - , "description": "baby bottle" - , "aliases": [ - "baby_bottle" - ] - , "tags": [ - "milk" - ] - } -, { - "emoji": "🍺" - , "description": "beer mug" - , "aliases": [ - "beer" - ] - , "tags": [ - "drink" - ] - } -, { - "emoji": "🍻" - , "description": "clinking beer mugs" - , "aliases": [ - "beers" - ] - , "tags": [ - "drinks" - ] - } -, { - "emoji": "🍸" - , "description": "cocktail glass" - , "aliases": [ - "cocktail" - ] - , "tags": [ - "drink" - ] - } -, { - "emoji": "🍹" - , "description": "tropical drink" - , "aliases": [ - "tropical_drink" - ] - , "tags": [ - "summer" - , "vacation" - ] - } -, { - "emoji": "🍷" - , "description": "wine glass" - , "aliases": [ - "wine_glass" - ] - , "tags": [ - ] - } -, { - "emoji": "🍴" - , "description": "fork and knife" - , "aliases": [ - "fork_and_knife" - ] - , "tags": [ - "cutlery" - ] - } -, { - "emoji": "🍕" - , "description": "slice of pizza" - , "aliases": [ - "pizza" - ] - , "tags": [ - ] - } -, { - "emoji": "🍔" - , "description": "hamburger" - , "aliases": [ - "hamburger" - ] - , "tags": [ - "burger" - ] - } -, { - "emoji": "🍟" - , "description": "french fries" - , "aliases": [ - "fries" - ] - , "tags": [ - ] - } -, { - "emoji": "🍗" - , "description": "poultry leg" - , "aliases": [ - "poultry_leg" - ] - , "tags": [ - "meat" - , "chicken" - ] - } -, { - "emoji": "🍖" - , "description": "meat on bone" - , "aliases": [ - "meat_on_bone" - ] - , "tags": [ - ] - } -, { - "emoji": "🍝" - , "description": "spaghetti" - , "aliases": [ - "spaghetti" - ] - , "tags": [ - "pasta" - ] - } -, { - "emoji": "🍛" - , "description": "curry and rice" - , "aliases": [ - "curry" - ] - , "tags": [ - ] - } -, { - "emoji": "🍤" - , "description": "fried shrimp" - , "aliases": [ - "fried_shrimp" - ] - , "tags": [ - "tempura" - ] - } -, { - "emoji": "🍱" - , "description": "bento box" - , "aliases": [ - "bento" - ] - , "tags": [ - ] - } -, { - "emoji": "🍣" - , "description": "sushi" - , "aliases": [ - "sushi" - ] - , "tags": [ - ] - } -, { - "emoji": "🍥" - , "description": "fish cake with swirl design" - , "aliases": [ - "fish_cake" - ] - , "tags": [ - ] - } -, { - "emoji": "🍙" - , "description": "rice ball" - , "aliases": [ - "rice_ball" - ] - , "tags": [ - ] - } -, { - "emoji": "🍘" - , "description": "rice cracker" - , "aliases": [ - "rice_cracker" - ] - , "tags": [ - ] - } -, { - "emoji": "🍚" - , "description": "cooked rice" - , "aliases": [ - "rice" - ] - , "tags": [ - ] - } -, { - "emoji": "🍜" - , "description": "steaming bowl" - , "aliases": [ - "ramen" - ] - , "tags": [ - "noodle" - ] - } -, { - "emoji": "🍲" - , "description": "pot of food" - , "aliases": [ - "stew" - ] - , "tags": [ - ] - } -, { - "emoji": "🍢" - , "description": "oden" - , "aliases": [ - "oden" - ] - , "tags": [ - ] - } -, { - "emoji": "🍡" - , "description": "dango" - , "aliases": [ - "dango" - ] - , "tags": [ - ] - } -, { - "emoji": "🍳" - , "description": "cooking" - , "aliases": [ - "egg" - ] - , "tags": [ - "breakfast" - ] - } -, { - "emoji": "🍞" - , "description": "bread" - , "aliases": [ - "bread" - ] - , "tags": [ - "toast" - ] - } -, { - "emoji": "🍩" - , "description": "doughnut" - , "aliases": [ - "doughnut" - ] - , "tags": [ - ] - } -, { - "emoji": "🍮" - , "description": "custard" - , "aliases": [ - "custard" - ] - , "tags": [ - ] - } -, { - "emoji": "🍦" - , "description": "soft ice cream" - , "aliases": [ - "icecream" - ] - , "tags": [ - ] - } -, { - "emoji": "🍨" - , "description": "ice cream" - , "aliases": [ - "ice_cream" - ] - , "tags": [ - ] - } -, { - "emoji": "🍧" - , "description": "shaved ice" - , "aliases": [ - "shaved_ice" - ] - , "tags": [ - ] - } -, { - "emoji": "🎂" - , "description": "birthday cake" - , "aliases": [ - "birthday" - ] - , "tags": [ - "party" - ] - } -, { - "emoji": "🍰" - , "description": "shortcake" - , "aliases": [ - "cake" - ] - , "tags": [ - "dessert" - ] - } -, { - "emoji": "🍪" - , "description": "cookie" - , "aliases": [ - "cookie" - ] - , "tags": [ - ] - } -, { - "emoji": "🍫" - , "description": "chocolate bar" - , "aliases": [ - "chocolate_bar" - ] - , "tags": [ - ] - } -, { - "emoji": "🍬" - , "description": "candy" - , "aliases": [ - "candy" - ] - , "tags": [ - "sweet" - ] - } -, { - "emoji": "🍭" - , "description": "lollipop" - , "aliases": [ - "lollipop" - ] - , "tags": [ - ] - } -, { - "emoji": "🍯" - , "description": "honey pot" - , "aliases": [ - "honey_pot" - ] - , "tags": [ - ] - } -, { - "emoji": "🍎" - , "description": "red apple" - , "aliases": [ - "apple" - ] - , "tags": [ - ] - } -, { - "emoji": "🍏" - , "description": "green apple" - , "aliases": [ - "green_apple" - ] - , "tags": [ - "fruit" - ] - } -, { - "emoji": "🍊" - , "description": "tangerine" - , "aliases": [ - "tangerine" - ] - , "tags": [ - ] - } -, { - "emoji": "🍋" - , "description": "lemon" - , "aliases": [ - "lemon" - ] - , "tags": [ - ] - } -, { - "emoji": "🍒" - , "description": "cherries" - , "aliases": [ - "cherries" - ] - , "tags": [ - "fruit" - ] - } -, { - "emoji": "🍇" - , "description": "grapes" - , "aliases": [ - "grapes" - ] - , "tags": [ - ] - } -, { - "emoji": "🍉" - , "description": "watermelon" - , "aliases": [ - "watermelon" - ] - , "tags": [ - ] - } -, { - "emoji": "🍓" - , "description": "strawberry" - , "aliases": [ - "strawberry" - ] - , "tags": [ - "fruit" - ] - } -, { - "emoji": "🍑" - , "description": "peach" - , "aliases": [ - "peach" - ] - , "tags": [ - ] - } -, { - "emoji": "🍈" - , "description": "melon" - , "aliases": [ - "melon" - ] - , "tags": [ - ] - } -, { - "emoji": "🍌" - , "description": "banana" - , "aliases": [ - "banana" - ] - , "tags": [ - "fruit" - ] - } -, { - "emoji": "🍐" - , "description": "pear" - , "aliases": [ - "pear" - ] - , "tags": [ - ] - } -, { - "emoji": "🍍" - , "description": "pineapple" - , "aliases": [ - "pineapple" - ] - , "tags": [ - ] - } -, { - "emoji": "🍠" - , "description": "roasted sweet potato" - , "aliases": [ - "sweet_potato" - ] - , "tags": [ - ] - } -, { - "emoji": "🍆" - , "description": "aubergine" - , "aliases": [ - "eggplant" - ] - , "tags": [ - "aubergine" - ] - } -, { - "emoji": "🍅" - , "description": "tomato" - , "aliases": [ - "tomato" - ] - , "tags": [ - ] - } -, { - "emoji": "🌽" - , "description": "ear of maize" - , "aliases": [ - "corn" - ] - , "tags": [ - ] - } -, { - "emoji": "🏠" - , "description": "house building" - , "aliases": [ - "house" - ] - , "tags": [ - ] - } -, { - "emoji": "🏡" - , "description": "house with garden" - , "aliases": [ - "house_with_garden" - ] - , "tags": [ - ] - } -, { - "emoji": "🏫" - , "description": "school" - , "aliases": [ - "school" - ] - , "tags": [ - ] - } -, { - "emoji": "🏢" - , "description": "office building" - , "aliases": [ - "office" - ] - , "tags": [ - ] - } -, { - "emoji": "🏣" - , "description": "japanese post office" - , "aliases": [ - "post_office" - ] - , "tags": [ - ] - } -, { - "emoji": "🏥" - , "description": "hospital" - , "aliases": [ - "hospital" - ] - , "tags": [ - ] - } -, { - "emoji": "🏦" - , "description": "bank" - , "aliases": [ - "bank" - ] - , "tags": [ - ] - } -, { - "emoji": "🏪" - , "description": "convenience store" - , "aliases": [ - "convenience_store" - ] - , "tags": [ - ] - } -, { - "emoji": "🏩" - , "description": "love hotel" - , "aliases": [ - "love_hotel" - ] - , "tags": [ - ] - } -, { - "emoji": "🏨" - , "description": "hotel" - , "aliases": [ - "hotel" - ] - , "tags": [ - ] - } -, { - "emoji": "💒" - , "description": "wedding" - , "aliases": [ - "wedding" - ] - , "tags": [ - "marriage" - ] - } -, { - "emoji": "⛪" - , "description": "church" - , "aliases": [ - "church" - ] - , "tags": [ - ] - } -, { - "emoji": "🏬" - , "description": "department store" - , "aliases": [ - "department_store" - ] - , "tags": [ - ] - } -, { - "emoji": "🏤" - , "description": "european post office" - , "aliases": [ - "european_post_office" - ] - , "tags": [ - ] - } -, { - "emoji": "🌇" - , "description": "sunset over buildings" - , "aliases": [ +{ + "emojis": [ + { + "code": "1f4af", + "name": "100" + }, + { + "code": "1f522", + "name": "1234" + }, + { + "code": "1f3b1", + "name": "8ball" + }, + { + "code": "1f170", + "name": "a" + }, + { + "code": "1f18e", + "name": "ab" + }, + { + "code": "1f524", + "name": "abc" + }, + { + "code": "1f521", + "name": "abcd" + }, + { + "code": "1f251", + "name": "accept" + }, + { + "code": "1f6a1", + "name": "aerial_tramway" + }, + { + "code": "2708", + "name": "airplane" + }, + { + "code": "1f6ec", + "name": "airplane_arriving" + }, + { + "code": "1f6eb", + "name": "airplane_departure" + }, + { + "code": "1f6e9", + "name": "airplane_small" + }, + { + "code": "23f0", + "name": "alarm_clock" + }, + { + "code": "2697", + "name": "alembic" + }, + { + "code": "1f47d", + "name": "alien" + }, + { + "code": "1f691", + "name": "ambulance" + }, + { + "code": "1f3fa", + "name": "amphora" + }, + { + "code": "2693", + "name": "anchor" + }, + { + "code": "1f47c", + "name": "angel" + }, + { + "code": "1f4a2", + "name": "anger" + }, + { + "code": "1f5ef", + "name": "anger_right" + }, + { + "code": "1f620", + "name": "angry" + }, + { + "code": "1f627", + "name": "anguished" + }, + { + "code": "1f41c", + "name": "ant" + }, + { + "code": "1f34e", + "name": "apple" + }, + { + "code": "2652", + "name": "aquarius" + }, + { + "code": "2648", + "name": "aries" + }, + { + "code": "25c0", + "name": "arrow_backward" + }, + { + "code": "23ec", + "name": "arrow_double_down" + }, + { + "code": "23eb", + "name": "arrow_double_up" + }, + { + "code": "2b07", + "name": "arrow_down" + }, + { + "code": "1f53d", + "name": "arrow_down_small" + }, + { + "code": "25b6", + "name": "arrow_forward" + }, + { + "code": "2935", + "name": "arrow_heading_down" + }, + { + "code": "2934", + "name": "arrow_heading_up" + }, + { + "code": "2b05", + "name": "arrow_left" + }, + { + "code": "2199", + "name": "arrow_lower_left" + }, + { + "code": "2198", + "name": "arrow_lower_right" + }, + { + "code": "27a1", + "name": "arrow_right" + }, + { + "code": "21aa", + "name": "arrow_right_hook" + }, + { + "code": "2b06", + "name": "arrow_up" + }, + { + "code": "2195", + "name": "arrow_up_down" + }, + { + "code": "1f53c", + "name": "arrow_up_small" + }, + { + "code": "2196", + "name": "arrow_upper_left" + }, + { + "code": "2197", + "name": "arrow_upper_right" + }, + { + "code": "1f503", + "name": "arrows_clockwise" + }, + { + "code": "1f504", + "name": "arrows_counterclockwise" + }, + { + "code": "1f3a8", + "name": "art" + }, + { + "code": "1f69b", + "name": "articulated_lorry" + }, + { + "code": "1f632", + "name": "astonished" + }, + { + "code": "1f45f", + "name": "athletic_shoe" + }, + { + "code": "1f3e7", + "name": "atm" + }, + { + "code": "269b", + "name": "atom" + }, + { + "code": "1f171", + "name": "b" + }, + { + "code": "1f476", + "name": "baby" + }, + { + "code": "1f37c", + "name": "baby_bottle" + }, + { + "code": "1f424", + "name": "baby_chick" + }, + { + "code": "1f6bc", + "name": "baby_symbol" + }, + { + "code": "1f519", + "name": "back" + }, + { + "code": "1f3f8", + "name": "badminton" + }, + { + "code": "1f6c4", + "name": "baggage_claim" + }, + { + "code": "1f388", + "name": "balloon" + }, + { + "code": "1f5f3", + "name": "ballot_box" + }, + { + "code": "2611", + "name": "ballot_box_with_check" + }, + { + "code": "1f38d", + "name": "bamboo" + }, + { + "code": "1f34c", + "name": "banana" + }, + { + "code": "203c", + "name": "bangbang" + }, + { + "code": "1f3e6", + "name": "bank" + }, + { + "code": "1f4ca", + "name": "bar_chart" + }, + { + "code": "1f488", + "name": "barber" + }, + { + "code": "26be", + "name": "baseball" + }, + { + "code": "1f3c0", + "name": "basketball" + }, + { + "code": "26f9", + "name": "basketball_player" + }, + { + "code": "1f6c0", + "name": "bath" + }, + { + "code": "1f6c1", + "name": "bathtub" + }, + { + "code": "1f50b", + "name": "battery" + }, + { + "code": "1f3d6", + "name": "beach" + }, + { + "code": "26f1", + "name": "beach_umbrella" + }, + { + "code": "1f43b", + "name": "bear" + }, + { + "code": "1f6cf", + "name": "bed" + }, + { + "code": "1f41d", + "name": "bee" + }, + { + "code": "1f37a", + "name": "beer" + }, + { + "code": "1f37b", + "name": "beers" + }, + { + "code": "1f41e", + "name": "beetle" + }, + { + "code": "1f530", + "name": "beginner" + }, + { + "code": "1f514", + "name": "bell" + }, + { + "code": "1f6ce", + "name": "bellhop" + }, + { + "code": "1f371", + "name": "bento" + }, + { + "code": "1f6b4", + "name": "bicyclist" + }, + { + "code": "1f6b2", + "name": "bike" + }, + { + "code": "1f459", + "name": "bikini" + }, + { + "code": "2623", + "name": "biohazard" + }, + { + "code": "1f426", + "name": "bird" + }, + { + "code": "1f382", + "name": "birthday" + }, + { + "code": "26ab", + "name": "black_circle" + }, + { + "code": "1f0cf", + "name": "black_joker" + }, + { + "code": "2b1b", + "name": "black_large_square" + }, + { + "code": "25fe", + "name": "black_medium_small_square" + }, + { + "code": "25fc", + "name": "black_medium_square" + }, + { + "code": "2712", + "name": "black_nib" + }, + { + "code": "25aa", + "name": "black_small_square" + }, + { + "code": "1f532", + "name": "black_square_button" + }, + { + "code": "1f33c", + "name": "blossom" + }, + { + "code": "1f421", + "name": "blowfish" + }, + { + "code": "1f4d8", + "name": "blue_book" + }, + { + "code": "1f699", + "name": "blue_car" + }, + { + "code": "1f499", + "name": "blue_heart" + }, + { + "code": "1f60a", + "name": "blush" + }, + { + "code": "1f417", + "name": "boar" + }, + { + "code": "1f4a3", + "name": "bomb" + }, + { + "code": "1f4d6", + "name": "book" + }, + { + "code": "1f516", + "name": "bookmark" + }, + { + "code": "1f4d1", + "name": "bookmark_tabs" + }, + { + "code": "1f4da", + "name": "books" + }, + { + "code": "1f4a5", + "name": "boom" + }, + { + "code": "1f462", + "name": "boot" + }, + { + "code": "1f490", + "name": "bouquet" + }, + { + "code": "1f647", + "name": "bow" + }, + { + "code": "1f3f9", + "name": "bow_and_arrow" + }, + { + "code": "1f3b3", + "name": "bowling" + }, + { + "code": "1f466", + "name": "boy" + }, + { + "code": "1f35e", + "name": "bread" + }, + { + "code": "1f470", + "name": "bride_with_veil" + }, + { + "code": "1f309", + "name": "bridge_at_night" + }, + { + "code": "1f4bc", + "name": "briefcase" + }, + { + "code": "1f494", + "name": "broken_heart" + }, + { + "code": "1f41b", + "name": "bug" + }, + { + "code": "1f4a1", + "name": "bulb" + }, + { + "code": "1f685", + "name": "bullettrain_front" + }, + { + "code": "1f684", + "name": "bullettrain_side" + }, + { + "code": "1f32f", + "name": "burrito" + }, + { + "code": "1f68c", + "name": "bus" + }, + { + "code": "1f68f", + "name": "busstop" + }, + { + "code": "1f464", + "name": "bust_in_silhouette" + }, + { + "code": "1f465", + "name": "busts_in_silhouette" + }, + { + "code": "1f335", + "name": "cactus" + }, + { + "code": "1f370", + "name": "cake" + }, + { + "code": "1f4c6", + "name": "calendar" + }, + { + "code": "1f5d3", + "name": "calendar_spiral" + }, + { + "code": "1f4f2", + "name": "calling" + }, + { + "code": "1f42b", + "name": "camel" + }, + { + "code": "1f4f7", + "name": "camera" + }, + { + "code": "1f4f8", + "name": "camera_with_flash" + }, + { + "code": "1f3d5", + "name": "camping" + }, + { + "code": "264b", + "name": "cancer" + }, + { + "code": "1f56f", + "name": "candle" + }, + { + "code": "1f36c", + "name": "candy" + }, + { + "code": "1f520", + "name": "capital_abcd" + }, + { + "code": "2651", + "name": "capricorn" + }, + { + "code": "1f5c3", + "name": "card_box" + }, + { + "code": "1f4c7", + "name": "card_index" + }, + { + "code": "1f3a0", + "name": "carousel_horse" + }, + { + "code": "1f431", + "name": "cat" + }, + { + "code": "1f408", + "name": "cat2" + }, + { + "code": "1f4bf", + "name": "cd" + }, + { + "code": "26d3", + "name": "chains" + }, + { + "code": "1f37e", + "name": "champagne" + }, + { + "code": "1f4b9", + "name": "chart" + }, + { + "code": "1f4c9", + "name": "chart_with_downwards_trend" + }, + { + "code": "1f4c8", + "name": "chart_with_upwards_trend" + }, + { + "code": "1f3c1", + "name": "checkered_flag" + }, + { + "code": "1f9c0", + "name": "cheese" + }, + { + "code": "1f352", + "name": "cherries" + }, + { + "code": "1f338", + "name": "cherry_blossom" + }, + { + "code": "1f330", + "name": "chestnut" + }, + { + "code": "1f414", + "name": "chicken" + }, + { + "code": "1f6b8", + "name": "children_crossing" + }, + { + "code": "1f43f", + "name": "chipmunk" + }, + { + "code": "1f36b", + "name": "chocolate_bar" + }, + { + "code": "1f384", + "name": "christmas_tree" + }, + { + "code": "26ea", + "name": "church" + }, + { + "code": "1f3a6", + "name": "cinema" + }, + { + "code": "1f3aa", + "name": "circus_tent" + }, + { + "code": "1f306", + "name": "city_dusk" + }, + { + "code": "1f307", + "name": "city_sunset" + }, + { + "code": "1f3d9", + "name": "cityscape" + }, + { + "code": "1f191", + "name": "cl" + }, + { + "code": "1f44f", + "name": "clap" + }, + { + "code": "1f3ac", + "name": "clapper" + }, + { + "code": "1f3db", + "name": "classical_building" + }, + { + "code": "1f4cb", + "name": "clipboard" + }, + { + "code": "1f570", + "name": "clock" + }, + { + "code": "1f550", + "name": "clock1" + }, + { + "code": "1f559", + "name": "clock10" + }, + { + "code": "1f565", + "name": "clock1030" + }, + { + "code": "1f55a", + "name": "clock11" + }, + { + "code": "1f566", + "name": "clock1130" + }, + { + "code": "1f55b", + "name": "clock12" + }, + { + "code": "1f567", + "name": "clock1230" + }, + { + "code": "1f55c", + "name": "clock130" + }, + { + "code": "1f551", + "name": "clock2" + }, + { + "code": "1f55d", + "name": "clock230" + }, + { + "code": "1f552", + "name": "clock3" + }, + { + "code": "1f55e", + "name": "clock330" + }, + { + "code": "1f553", + "name": "clock4" + }, + { + "code": "1f55f", + "name": "clock430" + }, + { + "code": "1f554", + "name": "clock5" + }, + { + "code": "1f560", + "name": "clock530" + }, + { + "code": "1f555", + "name": "clock6" + }, + { + "code": "1f561", + "name": "clock630" + }, + { + "code": "1f556", + "name": "clock7" + }, + { + "code": "1f562", + "name": "clock730" + }, + { + "code": "1f557", + "name": "clock8" + }, + { + "code": "1f563", + "name": "clock830" + }, + { + "code": "1f558", + "name": "clock9" + }, + { + "code": "1f564", + "name": "clock930" + }, + { + "code": "1f4d5", + "name": "closed_book" + }, + { + "code": "1f510", + "name": "closed_lock_with_key" + }, + { + "code": "1f302", + "name": "closed_umbrella" + }, + { + "code": "2601", + "name": "cloud" + }, + { + "code": "1f329", + "name": "cloud_lightning" + }, + { + "code": "1f327", + "name": "cloud_rain" + }, + { + "code": "1f328", + "name": "cloud_snow" + }, + { + "code": "1f32a", + "name": "cloud_tornado" + }, + { + "code": "2663", + "name": "clubs" + }, + { + "code": "1f378", + "name": "cocktail" + }, + { + "code": "2615", + "name": "coffee" + }, + { + "code": "26b0", + "name": "coffin" + }, + { + "code": "1f630", + "name": "cold_sweat" + }, + { + "code": "2604", + "name": "comet" + }, + { + "code": "1f5dc", + "name": "compression" + }, + { + "code": "1f4bb", + "name": "computer" + }, + { + "code": "1f38a", + "name": "confetti_ball" + }, + { + "code": "1f616", + "name": "confounded" + }, + { + "code": "1f615", + "name": "confused" + }, + { + "code": "3297", + "name": "congratulations" + }, + { + "code": "1f6a7", + "name": "construction" + }, + { + "code": "1f3d7", + "name": "construction_site" + }, + { + "code": "1f477", + "name": "construction_worker" + }, + { + "code": "1f39b", + "name": "control_knobs" + }, + { + "code": "1f3ea", + "name": "convenience_store" + }, + { + "code": "1f36a", + "name": "cookie" + }, + { + "code": "1f192", + "name": "cool" + }, + { + "code": "1f46e", + "name": "cop" + }, + { + "code": "00a9", + "name": "copyright" + }, + { + "code": "1f33d", + "name": "corn" + }, + { + "code": "1f6cb", + "name": "couch" + }, + { + "code": "1f46b", + "name": "couple" + }, + { + "code": "1f491", + "name": "couple_with_heart" + }, + { + "code": "1f48f", + "name": "couplekiss" + }, + { + "code": "1f42e", + "name": "cow" + }, + { + "code": "1f404", + "name": "cow2" + }, + { + "code": "1f980", + "name": "crab" + }, + { + "code": "1f58d", + "name": "crayon" + }, + { + "code": "1f4b3", + "name": "credit_card" + }, + { + "code": "1f319", + "name": "crescent_moon" + }, + { + "code": "1f3cf", + "name": "cricket" + }, + { + "code": "1f40a", + "name": "crocodile" + }, + { + "code": "271d", + "name": "cross" + }, + { + "code": "1f38c", + "name": "crossed_flags" + }, + { + "code": "2694", + "name": "crossed_swords" + }, + { + "code": "1f451", + "name": "crown" + }, + { + "code": "1f6f3", + "name": "cruise_ship" + }, + { + "code": "1f622", + "name": "cry" + }, + { + "code": "1f63f", + "name": "crying_cat_face" + }, + { + "code": "1f52e", + "name": "crystal_ball" + }, + { + "code": "1f498", + "name": "cupid" + }, + { + "code": "27b0", + "name": "curly_loop" + }, + { + "code": "1f4b1", + "name": "currency_exchange" + }, + { + "code": "1f35b", + "name": "curry" + }, + { + "code": "1f36e", + "name": "custard" + }, + { + "code": "1f6c3", + "name": "customs" + }, + { + "code": "1f300", + "name": "cyclone" + }, + { + "code": "1f5e1", + "name": "dagger" + }, + { + "code": "1f483", + "name": "dancer" + }, + { + "code": "1f46f", + "name": "dancers" + }, + { + "code": "1f361", + "name": "dango" + }, + { + "code": "1f576", + "name": "dark_sunglasses" + }, + { + "code": "1f3af", + "name": "dart" + }, + { + "code": "1f4a8", + "name": "dash" + }, + { + "code": "1f4c5", + "name": "date" + }, + { + "code": "1f333", + "name": "deciduous_tree" + }, + { + "code": "1f3ec", + "name": "department_store" + }, + { + "code": "1f3dc", + "name": "desert" + }, + { + "code": "1f5a5", + "name": "desktop" + }, + { + "code": "1f4a0", + "name": "diamond_shape_with_a_dot_inside" + }, + { + "code": "2666", + "name": "diamonds" + }, + { + "code": "1f61e", + "name": "disappointed" + }, + { + "code": "1f625", + "name": "disappointed_relieved" + }, + { + "code": "1f5c2", + "name": "dividers" + }, + { + "code": "1f4ab", + "name": "dizzy" + }, + { + "code": "1f635", + "name": "dizzy_face" + }, + { + "code": "1f6af", + "name": "do_not_litter" + }, + { + "code": "1f436", + "name": "dog" + }, + { + "code": "1f415", + "name": "dog2" + }, + { + "code": "1f4b5", + "name": "dollar" + }, + { + "code": "1f38e", + "name": "dolls" + }, + { + "code": "1f42c", + "name": "dolphin" + }, + { + "code": "1f6aa", + "name": "door" + }, + { + "code": "1f369", + "name": "doughnut" + }, + { + "code": "1f54a", + "name": "dove" + }, + { + "code": "1f409", + "name": "dragon" + }, + { + "code": "1f432", + "name": "dragon_face" + }, + { + "code": "1f457", + "name": "dress" + }, + { + "code": "1f42a", + "name": "dromedary_camel" + }, + { + "code": "1f4a7", + "name": "droplet" + }, + { + "code": "1f4c0", + "name": "dvd" + }, + { + "code": "1f4e7", + "name": "e-mail" + }, + { + "code": "1f442", + "name": "ear" + }, + { + "code": "1f33e", + "name": "ear_of_rice" + }, + { + "code": "1f30d", + "name": "earth_africa" + }, + { + "code": "1f30e", + "name": "earth_americas" + }, + { + "code": "1f30f", + "name": "earth_asia" + }, + { + "code": "1f373", + "name": "egg" + }, + { + "code": "1f346", + "name": "eggplant" + }, + { + "code": "0038-20e3", + "name": "eight" + }, + { + "code": "2734", + "name": "eight_pointed_black_star" + }, + { + "code": "2733", + "name": "eight_spoked_asterisk" + }, + { + "code": "1f50c", + "name": "electric_plug" + }, + { + "code": "1f418", + "name": "elephant" + }, + { + "code": "1f51a", + "name": "end" + }, + { + "code": "2709", + "name": "envelope" + }, + { + "code": "1f4e9", + "name": "envelope_with_arrow" + }, + { + "code": "1f4b6", + "name": "euro" + }, + { + "code": "1f3f0", + "name": "european_castle" + }, + { + "code": "1f3e4", + "name": "european_post_office" + }, + { + "code": "1f332", + "name": "evergreen_tree" + }, + { + "code": "2757", + "name": "exclamation" + }, + { + "code": "1f611", + "name": "expressionless" + }, + { + "code": "1f441", + "name": "eye" + }, + { + "code": "1f453", + "name": "eyeglasses" + }, + { + "code": "1f440", + "name": "eyes" + }, + { + "code": "1f3ed", + "name": "factory" + }, + { + "code": "1f342", + "name": "fallen_leaf" + }, + { + "code": "1f46a", + "name": "family" + }, + { + "code": "23e9", + "name": "fast_forward" + }, + { + "code": "1f4e0", + "name": "fax" + }, + { + "code": "1f628", + "name": "fearful" + }, + { + "code": "1f43e", + "name": "feet" + }, + { + "code": "1f3a1", + "name": "ferris_wheel" + }, + { + "code": "26f4", + "name": "ferry" + }, + { + "code": "1f3d1", + "name": "field_hockey" + }, + { + "code": "1f5c4", + "name": "file_cabinet" + }, + { + "code": "1f4c1", + "name": "file_folder" + }, + { + "code": "1f39e", + "name": "film_frames" + }, + { + "code": "1f525", + "name": "fire" + }, + { + "code": "1f692", + "name": "fire_engine" + }, + { + "code": "1f386", + "name": "fireworks" + }, + { + "code": "1f313", + "name": "first_quarter_moon" + }, + { + "code": "1f31b", + "name": "first_quarter_moon_with_face" + }, + { + "code": "1f41f", + "name": "fish" + }, + { + "code": "1f365", + "name": "fish_cake" + }, + { + "code": "1f3a3", + "name": "fishing_pole_and_fish" + }, + { + "code": "270a", + "name": "fist" + }, + { + "code": "0035-20e3", + "name": "five" + }, + { + "code": "1f3f4", + "name": "flag_black" + }, + { + "code": "1f1e8-1f1f3", + "name": "flag_cn" + }, + { + "code": "1f1e9-1f1ea", + "name": "flag_de" + }, + { + "code": "1f1ea-1f1f8", + "name": "flag_es" + }, + { + "code": "1f1eb-1f1f7", + "name": "flag_fr" + }, + { + "code": "1f1ec-1f1e7", + "name": "flag_gb" + }, + { + "code": "1f1ee-1f1f9", + "name": "flag_it" + }, + { + "code": "1f1ef-1f1f5", + "name": "flag_jp" + }, + { + "code": "1f1f0-1f1f7", + "name": "flag_kr" + }, + { + "code": "1f1f7-1f1fa", + "name": "flag_ru" + }, + { + "code": "1f1fa-1f1f8", + "name": "flag_us" + }, + { + "code": "1f3f3", + "name": "flag_white" + }, + { + "code": "1f38f", + "name": "flags" + }, + { + "code": "1f526", + "name": "flashlight" + }, + { + "code": "269c", + "name": "fleur-de-lis" + }, + { + "code": "1f4be", + "name": "floppy_disk" + }, + { + "code": "1f3b4", + "name": "flower_playing_cards" + }, + { + "code": "1f633", + "name": "flushed" + }, + { + "code": "1f32b", + "name": "fog" + }, + { + "code": "1f301", + "name": "foggy" + }, + { + "code": "1f3c8", + "name": "football" + }, + { + "code": "1f463", + "name": "footprints" + }, + { + "code": "1f374", + "name": "fork_and_knife" + }, + { + "code": "1f37d", + "name": "fork_knife_plate" + }, + { + "code": "26f2", + "name": "fountain" + }, + { + "code": "0034-20e3", + "name": "four" + }, + { + "code": "1f340", + "name": "four_leaf_clover" + }, + { + "code": "1f5bc", + "name": "frame_photo" + }, + { + "code": "1f193", + "name": "free" + }, + { + "code": "1f364", + "name": "fried_shrimp" + }, + { + "code": "1f35f", + "name": "fries" + }, + { + "code": "1f438", + "name": "frog" + }, + { + "code": "1f626", + "name": "frowning" + }, + { + "code": "2639", + "name": "frowning2" + }, + { + "code": "26fd", + "name": "fuelpump" + }, + { + "code": "1f315", + "name": "full_moon" + }, + { + "code": "1f31d", + "name": "full_moon_with_face" + }, + { + "code": "1f3b2", + "name": "game_die" + }, + { + "code": "2699", + "name": "gear" + }, + { + "code": "1f48e", + "name": "gem" + }, + { + "code": "264a", + "name": "gemini" + }, + { + "code": "1f47b", + "name": "ghost" + }, + { + "code": "1f381", + "name": "gift" + }, + { + "code": "1f49d", + "name": "gift_heart" + }, + { + "code": "1f467", + "name": "girl" + }, + { + "code": "1f310", + "name": "globe_with_meridians" + }, + { + "code": "1f410", + "name": "goat" + }, + { + "code": "26f3", + "name": "golf" + }, + { + "code": "1f3cc", + "name": "golfer" + }, + { + "code": "1f347", + "name": "grapes" + }, + { + "code": "1f34f", + "name": "green_apple" + }, + { + "code": "1f4d7", + "name": "green_book" + }, + { + "code": "1f49a", + "name": "green_heart" + }, + { + "code": "2755", + "name": "grey_exclamation" + }, + { + "code": "2754", + "name": "grey_question" + }, + { + "code": "1f62c", + "name": "grimacing" + }, + { + "code": "1f601", + "name": "grin" + }, + { + "code": "1f600", + "name": "grinning" + }, + { + "code": "1f482", + "name": "guardsman" + }, + { + "code": "1f3b8", + "name": "guitar" + }, + { + "code": "1f52b", + "name": "gun" + }, + { + "code": "1f487", + "name": "haircut" + }, + { + "code": "1f354", + "name": "hamburger" + }, + { + "code": "1f528", + "name": "hammer" + }, + { + "code": "2692", + "name": "hammer_pick" + }, + { + "code": "1f439", + "name": "hamster" + }, + { + "code": "1f590", + "name": "hand_splayed" + }, + { + "code": "1f45c", + "name": "handbag" + }, + { + "code": "0023-20e3", + "name": "hash" + }, + { + "code": "1f425", + "name": "hatched_chick" + }, + { + "code": "1f423", + "name": "hatching_chick" + }, + { + "code": "1f915", + "name": "head_bandage" + }, + { + "code": "1f3a7", + "name": "headphones" + }, + { + "code": "1f649", + "name": "hear_no_evil" + }, + { + "code": "2764", + "name": "heart" + }, + { + "code": "1f49f", + "name": "heart_decoration" + }, + { + "code": "2763", + "name": "heart_exclamation" + }, + { + "code": "1f60d", + "name": "heart_eyes" + }, + { + "code": "1f63b", + "name": "heart_eyes_cat" + }, + { + "code": "1f493", + "name": "heartbeat" + }, + { + "code": "1f497", + "name": "heartpulse" + }, + { + "code": "2665", + "name": "hearts" + }, + { + "code": "2714", + "name": "heavy_check_mark" + }, + { + "code": "2797", + "name": "heavy_division_sign" + }, + { + "code": "1f4b2", + "name": "heavy_dollar_sign" + }, + { + "code": "2796", + "name": "heavy_minus_sign" + }, + { + "code": "2716", + "name": "heavy_multiplication_x" + }, + { + "code": "2795", + "name": "heavy_plus_sign" + }, + { + "code": "1f681", + "name": "helicopter" + }, + { + "code": "26d1", + "name": "helmet_with_cross" + }, + { + "code": "1f33f", + "name": "herb" + }, + { + "code": "1f33a", + "name": "hibiscus" + }, + { + "code": "1f506", + "name": "high_brightness" + }, + { + "code": "1f460", + "name": "high_heel" + }, + { + "code": "1f3d2", + "name": "hockey" + }, + { + "code": "1f573", + "name": "hole" + }, + { + "code": "1f3d8", + "name": "homes" + }, + { + "code": "1f36f", + "name": "honey_pot" + }, + { + "code": "1f434", + "name": "horse" + }, + { + "code": "1f3c7", + "name": "horse_racing" + }, + { + "code": "1f3e5", + "name": "hospital" + }, + { + "code": "1f336", + "name": "hot_pepper" + }, + { + "code": "1f32d", + "name": "hotdog" + }, + { + "code": "1f3e8", + "name": "hotel" + }, + { + "code": "2668", + "name": "hotsprings" + }, + { + "code": "231b", + "name": "hourglass" + }, + { + "code": "23f3", + "name": "hourglass_flowing_sand" + }, + { + "code": "1f3e0", + "name": "house" + }, + { + "code": "1f3da", + "name": "house_abandoned" + }, + { + "code": "1f3e1", + "name": "house_with_garden" + }, + { + "code": "1f917", + "name": "hugging" + }, + { + "code": "1f62f", + "name": "hushed" + }, + { + "code": "1f368", + "name": "ice_cream" + }, + { + "code": "26f8", + "name": "ice_skate" + }, + { + "code": "1f366", + "name": "icecream" + }, + { + "code": "1f194", + "name": "id" + }, + { + "code": "1f250", + "name": "ideograph_advantage" + }, + { + "code": "1f47f", + "name": "imp" + }, + { + "code": "1f4e5", + "name": "inbox_tray" + }, + { + "code": "1f4e8", + "name": "incoming_envelope" + }, + { + "code": "1f481", + "name": "information_desk_person" + }, + { + "code": "2139", + "name": "information_source" + }, + { + "code": "1f607", + "name": "innocent" + }, + { + "code": "2049", + "name": "interrobang" + }, + { + "code": "1f4f1", + "name": "iphone" + }, + { + "code": "1f3dd", + "name": "island" + }, + { + "code": "1f3ee", + "name": "izakaya_lantern" + }, + { + "code": "1f383", + "name": "jack_o_lantern" + }, + { + "code": "1f5fe", + "name": "japan" + }, + { + "code": "1f3ef", + "name": "japanese_castle" + }, + { + "code": "1f47a", + "name": "japanese_goblin" + }, + { + "code": "1f479", + "name": "japanese_ogre" + }, + { + "code": "1f456", + "name": "jeans" + }, + { + "code": "1f602", + "name": "joy" + }, + { + "code": "1f639", + "name": "joy_cat" + }, + { + "code": "1f579", + "name": "joystick" + }, + { + "code": "1f54b", + "name": "kaaba" + }, + { + "code": "1f511", + "name": "key" + }, + { + "code": "1f5dd", + "name": "key2" + }, + { + "code": "2328", + "name": "keyboard" + }, + { + "code": "1f458", + "name": "kimono" + }, + { + "code": "1f48b", + "name": "kiss" + }, + { + "code": "1f617", + "name": "kissing" + }, + { + "code": "1f63d", + "name": "kissing_cat" + }, + { + "code": "1f61a", + "name": "kissing_closed_eyes" + }, + { + "code": "1f618", + "name": "kissing_heart" + }, + { + "code": "1f619", + "name": "kissing_smiling_eyes" + }, + { + "code": "1f52a", + "name": "knife" + }, + { + "code": "1f428", + "name": "koala" + }, + { + "code": "1f201", + "name": "koko" + }, + { + "code": "1f3f7", + "name": "label" + }, + { + "code": "1f535", + "name": "large_blue_circle" + }, + { + "code": "1f537", + "name": "large_blue_diamond" + }, + { + "code": "1f536", + "name": "large_orange_diamond" + }, + { + "code": "1f317", + "name": "last_quarter_moon" + }, + { + "code": "1f31c", + "name": "last_quarter_moon_with_face" + }, + { + "code": "1f606", + "name": "laughing" + }, + { + "code": "1f343", + "name": "leaves" + }, + { + "code": "1f4d2", + "name": "ledger" + }, + { + "code": "1f6c5", + "name": "left_luggage" + }, + { + "code": "2194", + "name": "left_right_arrow" + }, + { + "code": "21a9", + "name": "leftwards_arrow_with_hook" + }, + { + "code": "1f34b", + "name": "lemon" + }, + { + "code": "264c", + "name": "leo" + }, + { + "code": "1f406", + "name": "leopard" + }, + { + "code": "1f39a", + "name": "level_slider" + }, + { + "code": "1f574", + "name": "levitate" + }, + { + "code": "264e", + "name": "libra" + }, + { + "code": "1f3cb", + "name": "lifter" + }, + { + "code": "1f688", + "name": "light_rail" + }, + { + "code": "1f517", + "name": "link" + }, + { + "code": "1f981", + "name": "lion_face" + }, + { + "code": "1f444", + "name": "lips" + }, + { + "code": "1f484", + "name": "lipstick" + }, + { + "code": "1f512", + "name": "lock" + }, + { + "code": "1f50f", + "name": "lock_with_ink_pen" + }, + { + "code": "1f36d", + "name": "lollipop" + }, + { + "code": "27bf", + "name": "loop" + }, + { + "code": "1f50a", + "name": "loud_sound" + }, + { + "code": "1f4e2", + "name": "loudspeaker" + }, + { + "code": "1f3e9", + "name": "love_hotel" + }, + { + "code": "1f48c", + "name": "love_letter" + }, + { + "code": "1f505", + "name": "low_brightness" + }, + { + "code": "24c2", + "name": "m" + }, + { + "code": "1f50d", + "name": "mag" + }, + { + "code": "1f50e", + "name": "mag_right" + }, + { + "code": "1f004", + "name": "mahjong" + }, + { + "code": "1f4eb", + "name": "mailbox" + }, + { + "code": "1f4ea", + "name": "mailbox_closed" + }, + { + "code": "1f4ec", + "name": "mailbox_with_mail" + }, + { + "code": "1f4ed", + "name": "mailbox_with_no_mail" + }, + { + "code": "1f468", + "name": "man" + }, + { + "code": "1f472", + "name": "man_with_gua_pi_mao" + }, + { + "code": "1f473", + "name": "man_with_turban" + }, + { + "code": "1f45e", + "name": "mans_shoe" + }, + { + "code": "1f5fa", + "name": "map" + }, + { + "code": "1f341", + "name": "maple_leaf" + }, + { + "code": "1f637", + "name": "mask" + }, + { + "code": "1f486", + "name": "massage" + }, + { + "code": "1f356", + "name": "meat_on_bone" + }, + { + "code": "1f3c5", + "name": "medal" + }, + { + "code": "1f4e3", + "name": "mega" + }, + { + "code": "1f348", + "name": "melon" + }, + { + "code": "1f54e", + "name": "menorah" + }, + { + "code": "1f6b9", + "name": "mens" + }, + { + "code": "1f918", + "name": "metal" + }, + { + "code": "1f687", + "name": "metro" + }, + { + "code": "1f3a4", + "name": "microphone" + }, + { + "code": "1f399", + "name": "microphone2" + }, + { + "code": "1f52c", + "name": "microscope" + }, + { + "code": "1f595", + "name": "middle_finger" + }, + { + "code": "1f396", + "name": "military_medal" + }, + { + "code": "1f30c", + "name": "milky_way" + }, + { + "code": "1f690", + "name": "minibus" + }, + { + "code": "1f4bd", + "name": "minidisc" + }, + { + "code": "1f4f4", + "name": "mobile_phone_off" + }, + { + "code": "1f911", + "name": "money_mouth" + }, + { + "code": "1f4b8", + "name": "money_with_wings" + }, + { + "code": "1f4b0", + "name": "moneybag" + }, + { + "code": "1f412", + "name": "monkey" + }, + { + "code": "1f435", + "name": "monkey_face" + }, + { + "code": "1f69d", + "name": "monorail" + }, + { + "code": "1f393", + "name": "mortar_board" + }, + { + "code": "1f54c", + "name": "mosque" + }, + { + "code": "1f6e5", + "name": "motorboat" + }, + { + "code": "1f3cd", + "name": "motorcycle" + }, + { + "code": "1f6e3", + "name": "motorway" + }, + { + "code": "1f5fb", + "name": "mount_fuji" + }, + { + "code": "26f0", + "name": "mountain" + }, + { + "code": "1f6b5", + "name": "mountain_bicyclist" + }, + { + "code": "1f6a0", + "name": "mountain_cableway" + }, + { + "code": "1f69e", + "name": "mountain_railway" + }, + { + "code": "1f3d4", + "name": "mountain_snow" + }, + { + "code": "1f42d", + "name": "mouse" + }, + { + "code": "1f401", + "name": "mouse2" + }, + { + "code": "1f5b1", + "name": "mouse_three_button" + }, + { + "code": "1f3a5", + "name": "movie_camera" + }, + { + "code": "1f5ff", + "name": "moyai" + }, + { + "code": "1f4aa", + "name": "muscle" + }, + { + "code": "1f344", + "name": "mushroom" + }, + { + "code": "1f3b9", + "name": "musical_keyboard" + }, + { + "code": "1f3b5", + "name": "musical_note" + }, + { + "code": "1f3bc", + "name": "musical_score" + }, + { + "code": "1f507", + "name": "mute" + }, + { + "code": "1f485", + "name": "nail_care" + }, + { + "code": "1f4db", + "name": "name_badge" + }, + { + "code": "1f454", + "name": "necktie" + }, + { + "code": "274e", + "name": "negative_squared_cross_mark" + }, + { + "code": "1f913", + "name": "nerd" + }, + { + "code": "1f610", + "name": "neutral_face" + }, + { + "code": "1f195", + "name": "new" + }, + { + "code": "1f311", + "name": "new_moon" + }, + { + "code": "1f31a", + "name": "new_moon_with_face" + }, + { + "code": "1f4f0", + "name": "newspaper" + }, + { + "code": "1f5de", + "name": "newspaper2" + }, + { + "code": "1f196", + "name": "ng" + }, + { + "code": "1f303", + "name": "night_with_stars" + }, + { + "code": "0039-20e3", + "name": "nine" + }, + { + "code": "1f515", + "name": "no_bell" + }, + { + "code": "1f6b3", + "name": "no_bicycles" + }, + { + "code": "26d4", + "name": "no_entry" + }, + { + "code": "1f6ab", + "name": "no_entry_sign" + }, + { + "code": "1f645", + "name": "no_good" + }, + { + "code": "1f4f5", + "name": "no_mobile_phones" + }, + { + "code": "1f636", + "name": "no_mouth" + }, + { + "code": "1f6b7", + "name": "no_pedestrians" + }, + { + "code": "1f6ad", + "name": "no_smoking" + }, + { + "code": "1f6b1", + "name": "non-potable_water" + }, + { + "code": "1f443", + "name": "nose" + }, + { + "code": "1f4d3", + "name": "notebook" + }, + { + "code": "1f4d4", + "name": "notebook_with_decorative_cover" + }, + { + "code": "1f5d2", + "name": "notepad_spiral" + }, + { + "code": "1f3b6", + "name": "notes" + }, + { + "code": "1f529", + "name": "nut_and_bolt" + }, + { + "code": "2b55", + "name": "o" + }, + { + "code": "1f17e", + "name": "o2" + }, + { + "code": "1f30a", + "name": "ocean" + }, + { + "code": "1f419", + "name": "octopus" + }, + { + "code": "1f362", + "name": "oden" + }, + { + "code": "1f3e2", + "name": "office" + }, + { + "code": "1f6e2", + "name": "oil" + }, + { + "code": "1f197", + "name": "ok" + }, + { + "code": "1f44c", + "name": "ok_hand" + }, + { + "code": "1f646", + "name": "ok_woman" + }, + { + "code": "1f474", + "name": "older_man" + }, + { + "code": "1f475", + "name": "older_woman" + }, + { + "code": "1f549", + "name": "om_symbol" + }, + { + "code": "1f51b", + "name": "on" + }, + { + "code": "1f698", + "name": "oncoming_automobile" + }, + { + "code": "1f68d", + "name": "oncoming_bus" + }, + { + "code": "1f694", + "name": "oncoming_police_car" + }, + { + "code": "1f696", + "name": "oncoming_taxi" + }, + { + "code": "0031-20e3", + "name": "one" + }, + { + "code": "1f4c2", + "name": "open_file_folder" + }, + { + "code": "1f450", + "name": "open_hands" + }, + { + "code": "1f62e", + "name": "open_mouth" + }, + { + "code": "26ce", + "name": "ophiuchus" + }, + { + "code": "1f4d9", + "name": "orange_book" + }, + { + "code": "2626", + "name": "orthodox_cross" + }, + { + "code": "1f4e4", + "name": "outbox_tray" + }, + { + "code": "1f402", + "name": "ox" + }, + { + "code": "1f4e6", + "name": "package" + }, + { + "code": "1f4c4", + "name": "page_facing_up" + }, + { + "code": "1f4c3", + "name": "page_with_curl" + }, + { + "code": "1f4df", + "name": "pager" + }, + { + "code": "1f58c", + "name": "paintbrush" + }, + { + "code": "1f334", + "name": "palm_tree" + }, + { + "code": "1f43c", + "name": "panda_face" + }, + { + "code": "1f4ce", + "name": "paperclip" + }, + { + "code": "1f587", + "name": "paperclips" + }, + { + "code": "1f3de", + "name": "park" + }, + { + "code": "1f17f", + "name": "parking" + }, + { + "code": "303d", + "name": "part_alternation_mark" + }, + { + "code": "26c5", + "name": "partly_sunny" + }, + { + "code": "1f6c2", + "name": "passport_control" + }, + { + "code": "23f8", + "name": "pause_button" + }, + { + "code": "262e", + "name": "peace" + }, + { + "code": "1f351", + "name": "peach" + }, + { + "code": "1f350", + "name": "pear" + }, + { + "code": "1f58a", + "name": "pen_ballpoint" + }, + { + "code": "1f58b", + "name": "pen_fountain" + }, + { + "code": "1f4dd", + "name": "pencil" + }, + { + "code": "270f", + "name": "pencil2" + }, + { + "code": "1f427", + "name": "penguin" + }, + { + "code": "1f614", + "name": "pensive" + }, + { + "code": "1f3ad", + "name": "performing_arts" + }, + { + "code": "1f623", + "name": "persevere" + }, + { + "code": "1f64d", + "name": "person_frowning" + }, + { + "code": "1f471", + "name": "person_with_blond_hair" + }, + { + "code": "1f64e", + "name": "person_with_pouting_face" + }, + { + "code": "26cf", + "name": "pick" + }, + { + "code": "1f437", + "name": "pig" + }, + { + "code": "1f416", + "name": "pig2" + }, + { + "code": "1f43d", + "name": "pig_nose" + }, + { + "code": "1f48a", + "name": "pill" + }, + { + "code": "1f34d", + "name": "pineapple" + }, + { + "code": "1f3d3", + "name": "ping_pong" + }, + { + "code": "2653", + "name": "pisces" + }, + { + "code": "1f355", + "name": "pizza" + }, + { + "code": "1f6d0", + "name": "place_of_worship" + }, + { + "code": "23ef", + "name": "play_pause" + }, + { + "code": "1f447", + "name": "point_down" + }, + { + "code": "1f448", + "name": "point_left" + }, + { + "code": "1f449", + "name": "point_right" + }, + { + "code": "261d", + "name": "point_up" + }, + { + "code": "1f446", + "name": "point_up_2" + }, + { + "code": "1f693", + "name": "police_car" + }, + { + "code": "1f429", + "name": "poodle" + }, + { + "code": "1f4a9", + "name": "poop" + }, + { + "code": "1f37f", + "name": "popcorn" + }, + { + "code": "1f3e3", + "name": "post_office" + }, + { + "code": "1f4ef", + "name": "postal_horn" + }, + { + "code": "1f4ee", + "name": "postbox" + }, + { + "code": "1f6b0", + "name": "potable_water" + }, + { + "code": "1f45d", + "name": "pouch" + }, + { + "code": "1f357", + "name": "poultry_leg" + }, + { + "code": "1f4b7", + "name": "pound" + }, + { + "code": "1f63e", + "name": "pouting_cat" + }, + { + "code": "1f64f", + "name": "pray" + }, + { + "code": "1f4ff", + "name": "prayer_beads" + }, + { + "code": "1f478", + "name": "princess" + }, + { + "code": "1f5a8", + "name": "printer" + }, + { + "code": "1f4fd", + "name": "projector" + }, + { + "code": "1f44a", + "name": "punch" + }, + { + "code": "1f49c", + "name": "purple_heart" + }, + { + "code": "1f45b", + "name": "purse" + }, + { + "code": "1f4cc", + "name": "pushpin" + }, + { + "code": "1f6ae", + "name": "put_litter_in_its_place" + }, + { + "code": "2753", + "name": "question" + }, + { + "code": "1f430", + "name": "rabbit" + }, + { + "code": "1f407", + "name": "rabbit2" + }, + { + "code": "1f3ce", + "name": "race_car" + }, + { + "code": "1f40e", + "name": "racehorse" + }, + { + "code": "1f4fb", + "name": "radio" + }, + { + "code": "1f518", + "name": "radio_button" + }, + { + "code": "2622", + "name": "radioactive" + }, + { + "code": "1f621", + "name": "rage" + }, + { + "code": "1f683", + "name": "railway_car" + }, + { + "code": "1f6e4", + "name": "railway_track" + }, + { + "code": "1f308", + "name": "rainbow" + }, + { + "code": "270b", + "name": "raised_hand" + }, + { + "code": "1f64c", + "name": "raised_hands" + }, + { + "code": "1f64b", + "name": "raising_hand" + }, + { + "code": "1f40f", + "name": "ram" + }, + { + "code": "1f35c", + "name": "ramen" + }, + { + "code": "1f400", + "name": "rat" + }, + { + "code": "23fa", + "name": "record_button" + }, + { + "code": "267b", + "name": "recycle" + }, + { + "code": "1f697", + "name": "red_car" + }, + { + "code": "1f534", + "name": "red_circle" + }, + { + "code": "00ae", + "name": "registered" + }, + { + "code": "263a", + "name": "relaxed" + }, + { + "code": "1f60c", + "name": "relieved" + }, + { + "code": "1f397", + "name": "reminder_ribbon" + }, + { + "code": "1f501", + "name": "repeat" + }, + { + "code": "1f502", + "name": "repeat_one" + }, + { + "code": "1f6bb", + "name": "restroom" + }, + { + "code": "1f49e", + "name": "revolving_hearts" + }, + { + "code": "23ea", + "name": "rewind" + }, + { + "code": "1f380", + "name": "ribbon" + }, + { + "code": "1f35a", + "name": "rice" + }, + { + "code": "1f359", + "name": "rice_ball" + }, + { + "code": "1f358", + "name": "rice_cracker" + }, + { + "code": "1f391", + "name": "rice_scene" + }, + { + "code": "1f48d", + "name": "ring" + }, + { + "code": "1f916", + "name": "robot" + }, + { + "code": "1f680", + "name": "rocket" + }, + { + "code": "1f3a2", + "name": "roller_coaster" + }, + { + "code": "1f644", + "name": "rolling_eyes" + }, + { + "code": "1f413", + "name": "rooster" + }, + { + "code": "1f339", + "name": "rose" + }, + { + "code": "1f3f5", + "name": "rosette" + }, + { + "code": "1f6a8", + "name": "rotating_light" + }, + { + "code": "1f4cd", + "name": "round_pushpin" + }, + { + "code": "1f6a3", + "name": "rowboat" + }, + { + "code": "1f3c9", + "name": "rugby_football" + }, + { + "code": "1f3c3", + "name": "runner" + }, + { + "code": "1f3bd", + "name": "running_shirt_with_sash" + }, + { + "code": "1f202", + "name": "sa" + }, + { + "code": "2650", + "name": "sagittarius" + }, + { + "code": "26f5", + "name": "sailboat" + }, + { + "code": "1f376", + "name": "sake" + }, + { + "code": "1f461", + "name": "sandal" + }, + { + "code": "1f385", + "name": "santa" + }, + { + "code": "1f4e1", + "name": "satellite" + }, + { + "code": "1f6f0", + "name": "satellite_orbital" + }, + { + "code": "1f3b7", + "name": "saxophone" + }, + { + "code": "2696", + "name": "scales" + }, + { + "code": "1f3eb", + "name": "school" + }, + { + "code": "1f392", + "name": "school_satchel" + }, + { + "code": "2702", + "name": "scissors" + }, + { + "code": "1f982", + "name": "scorpion" + }, + { + "code": "264f", + "name": "scorpius" + }, + { + "code": "1f631", + "name": "scream" + }, + { + "code": "1f640", + "name": "scream_cat" + }, + { + "code": "1f4dc", + "name": "scroll" + }, + { + "code": "1f4ba", + "name": "seat" + }, + { + "code": "3299", + "name": "secret" + }, + { + "code": "1f648", + "name": "see_no_evil" + }, + { + "code": "1f331", + "name": "seedling" + }, + { + "code": "0037-20e3", + "name": "seven" + }, + { + "code": "2618", + "name": "shamrock" + }, + { + "code": "1f367", + "name": "shaved_ice" + }, + { + "code": "1f411", + "name": "sheep" + }, + { + "code": "1f41a", + "name": "shell" + }, + { + "code": "1f6e1", + "name": "shield" + }, + { + "code": "26e9", + "name": "shinto_shrine" + }, + { + "code": "1f6a2", + "name": "ship" + }, + { + "code": "1f455", + "name": "shirt" + }, + { + "code": "1f6cd", + "name": "shopping_bags" + }, + { + "code": "1f6bf", + "name": "shower" + }, + { + "code": "1f4f6", + "name": "signal_strength" + }, + { + "code": "0036-20e3", + "name": "six" + }, + { + "code": "1f52f", + "name": "six_pointed_star" + }, + { + "code": "1f3bf", + "name": "ski" + }, + { + "code": "26f7", + "name": "skier" + }, + { + "code": "1f480", + "name": "skull" + }, + { + "code": "2620", + "name": "skull_crossbones" + }, + { + "code": "1f634", + "name": "sleeping" + }, + { + "code": "1f6cc", + "name": "sleeping_accommodation" + }, + { + "code": "1f62a", + "name": "sleepy" + }, + { + "code": "1f641", + "name": "slight_frown" + }, + { + "code": "1f642", + "name": "slight_smile" + }, + { + "code": "1f3b0", + "name": "slot_machine" + }, + { + "code": "1f539", + "name": "small_blue_diamond" + }, + { + "code": "1f538", + "name": "small_orange_diamond" + }, + { + "code": "1f53a", + "name": "small_red_triangle" + }, + { + "code": "1f53b", + "name": "small_red_triangle_down" + }, + { + "code": "1f604", + "name": "smile" + }, + { + "code": "1f638", + "name": "smile_cat" + }, + { + "code": "1f603", + "name": "smiley" + }, + { + "code": "1f63a", + "name": "smiley_cat" + }, + { + "code": "1f608", + "name": "smiling_imp" + }, + { + "code": "1f60f", + "name": "smirk" + }, + { + "code": "1f63c", + "name": "smirk_cat" + }, + { + "code": "1f6ac", + "name": "smoking" + }, + { + "code": "1f40c", + "name": "snail" + }, + { + "code": "1f40d", + "name": "snake" + }, + { + "code": "1f3c2", + "name": "snowboarder" + }, + { + "code": "2744", + "name": "snowflake" + }, + { + "code": "26c4", + "name": "snowman" + }, + { + "code": "2603", + "name": "snowman2" + }, + { + "code": "1f62d", + "name": "sob" + }, + { + "code": "26bd", + "name": "soccer" + }, + { + "code": "1f51c", + "name": "soon" + }, + { + "code": "1f198", + "name": "sos" + }, + { + "code": "1f509", + "name": "sound" + }, + { + "code": "1f47e", + "name": "space_invader" + }, + { + "code": "2660", + "name": "spades" + }, + { + "code": "1f35d", + "name": "spaghetti" + }, + { + "code": "2747", + "name": "sparkle" + }, + { + "code": "1f387", + "name": "sparkler" + }, + { + "code": "2728", + "name": "sparkles" + }, + { + "code": "1f496", + "name": "sparkling_heart" + }, + { + "code": "1f64a", + "name": "speak_no_evil" + }, + { + "code": "1f508", + "name": "speaker" + }, + { + "code": "1f5e3", + "name": "speaking_head" + }, + { + "code": "1f4ac", + "name": "speech_balloon" + }, + { + "code": "1f6a4", + "name": "speedboat" + }, + { + "code": "1f577", + "name": "spider" + }, + { + "code": "1f578", + "name": "spider_web" + }, + { + "code": "1f575", + "name": "spy" + }, + { + "code": "1f3df", + "name": "stadium" + }, + { + "code": "2b50", + "name": "star" + }, + { + "code": "1f31f", + "name": "star2" + }, + { + "code": "262a", + "name": "star_and_crescent" + }, + { + "code": "2721", + "name": "star_of_david" + }, + { + "code": "1f320", + "name": "stars" + }, + { + "code": "1f689", + "name": "station" + }, + { + "code": "1f5fd", + "name": "statue_of_liberty" + }, + { + "code": "1f682", + "name": "steam_locomotive" + }, + { + "code": "1f372", + "name": "stew" + }, + { + "code": "23f9", + "name": "stop_button" + }, + { + "code": "23f1", + "name": "stopwatch" + }, + { + "code": "1f4cf", + "name": "straight_ruler" + }, + { + "code": "1f353", + "name": "strawberry" + }, + { + "code": "1f61b", + "name": "stuck_out_tongue" + }, + { + "code": "1f61d", + "name": "stuck_out_tongue_closed_eyes" + }, + { + "code": "1f61c", + "name": "stuck_out_tongue_winking_eye" + }, + { + "code": "1f31e", + "name": "sun_with_face" + }, + { + "code": "1f33b", + "name": "sunflower" + }, + { + "code": "1f60e", + "name": "sunglasses" + }, + { + "code": "2600", + "name": "sunny" + }, + { + "code": "1f305", + "name": "sunrise" + }, + { + "code": "1f304", + "name": "sunrise_over_mountains" + }, + { + "code": "1f3c4", + "name": "surfer" + }, + { + "code": "1f363", + "name": "sushi" + }, + { + "code": "1f69f", + "name": "suspension_railway" + }, + { + "code": "1f613", + "name": "sweat" + }, + { + "code": "1f4a6", + "name": "sweat_drops" + }, + { + "code": "1f605", + "name": "sweat_smile" + }, + { + "code": "1f360", + "name": "sweet_potato" + }, + { + "code": "1f3ca", + "name": "swimmer" + }, + { + "code": "1f523", + "name": "symbols" + }, + { + "code": "1f54d", + "name": "synagogue" + }, + { + "code": "1f489", + "name": "syringe" + }, + { + "code": "1f32e", + "name": "taco" + }, + { + "code": "1f389", + "name": "tada" + }, + { + "code": "1f38b", + "name": "tanabata_tree" + }, + { + "code": "1f34a", + "name": "tangerine" + }, + { + "code": "2649", + "name": "taurus" + }, + { + "code": "1f695", + "name": "taxi" + }, + { + "code": "1f375", + "name": "tea" + }, + { + "code": "260e", + "name": "telephone" + }, + { + "code": "1f4de", + "name": "telephone_receiver" + }, + { + "code": "1f52d", + "name": "telescope" + }, + { + "code": "1f51f", + "name": "ten" + }, + { + "code": "1f3be", + "name": "tennis" + }, + { + "code": "26fa", + "name": "tent" + }, + { + "code": "1f321", + "name": "thermometer" + }, + { + "code": "1f912", + "name": "thermometer_face" + }, + { + "code": "1f914", + "name": "thinking" + }, + { + "code": "1f4ad", + "name": "thought_balloon" + }, + { + "code": "0033-20e3", + "name": "three" + }, + { + "code": "1f44e", + "name": "thumbsdown" + }, + { + "code": "1f44d", + "name": "thumbsup" + }, + { + "code": "26c8", + "name": "thunder_cloud_rain" + }, + { + "code": "1f3ab", + "name": "ticket" + }, + { + "code": "1f39f", + "name": "tickets" + }, + { + "code": "1f42f", + "name": "tiger" + }, + { + "code": "1f405", + "name": "tiger2" + }, + { + "code": "23f2", + "name": "timer" + }, + { + "code": "1f62b", + "name": "tired_face" + }, + { + "code": "2122", + "name": "tm" + }, + { + "code": "1f6bd", + "name": "toilet" + }, + { + "code": "1f5fc", + "name": "tokyo_tower" + }, + { + "code": "1f345", + "name": "tomato" + }, + { + "code": "1f445", + "name": "tongue" + }, + { + "code": "1f6e0", + "name": "tools" + }, + { + "code": "1f51d", + "name": "top" + }, + { + "code": "1f3a9", + "name": "tophat" + }, + { + "code": "23ed", + "name": "track_next" + }, + { + "code": "23ee", + "name": "track_previous" + }, + { + "code": "1f5b2", + "name": "trackball" + }, + { + "code": "1f69c", + "name": "tractor" + }, + { + "code": "1f6a5", + "name": "traffic_light" + }, + { + "code": "1f68b", + "name": "train" + }, + { + "code": "1f686", + "name": "train2" + }, + { + "code": "1f68a", + "name": "tram" + }, + { + "code": "1f6a9", + "name": "triangular_flag_on_post" + }, + { + "code": "1f4d0", + "name": "triangular_ruler" + }, + { + "code": "1f531", + "name": "trident" + }, + { + "code": "1f624", + "name": "triumph" + }, + { + "code": "1f68e", + "name": "trolleybus" + }, + { + "code": "1f3c6", + "name": "trophy" + }, + { + "code": "1f379", + "name": "tropical_drink" + }, + { + "code": "1f420", + "name": "tropical_fish" + }, + { + "code": "1f69a", + "name": "truck" + }, + { + "code": "1f3ba", + "name": "trumpet" + }, + { + "code": "1f337", + "name": "tulip" + }, + { + "code": "1f983", + "name": "turkey" + }, + { + "code": "1f422", + "name": "turtle" + }, + { + "code": "1f4fa", + "name": "tv" + }, + { + "code": "1f500", + "name": "twisted_rightwards_arrows" + }, + { + "code": "0032-20e3", + "name": "two" + }, + { + "code": "1f495", + "name": "two_hearts" + }, + { + "code": "1f46c", + "name": "two_men_holding_hands" + }, + { + "code": "1f46d", + "name": "two_women_holding_hands" + }, + { + "code": "1f239", + "name": "u5272" + }, + { + "code": "1f234", + "name": "u5408" + }, + { + "code": "1f23a", + "name": "u55b6" + }, + { + "code": "1f22f", + "name": "u6307" + }, + { + "code": "1f237", + "name": "u6708" + }, + { + "code": "1f236", + "name": "u6709" + }, + { + "code": "1f235", + "name": "u6e80" + }, + { + "code": "1f21a", + "name": "u7121" + }, + { + "code": "1f238", + "name": "u7533" + }, + { + "code": "1f232", + "name": "u7981" + }, + { + "code": "1f233", + "name": "u7a7a" + }, + { + "code": "2614", + "name": "umbrella" + }, + { + "code": "2602", + "name": "umbrella2" + }, + { + "code": "1f612", + "name": "unamused" + }, + { + "code": "1f51e", + "name": "underage" + }, + { + "code": "1f984", + "name": "unicorn" + }, + { + "code": "1f513", + "name": "unlock" + }, + { + "code": "1f199", + "name": "up" + }, + { + "code": "1f643", + "name": "upside_down" + }, + { + "code": "26b1", + "name": "urn" + }, + { + "code": "270c", + "name": "v" + }, + { + "code": "1f6a6", + "name": "vertical_traffic_light" + }, + { + "code": "1f4fc", + "name": "vhs" + }, + { + "code": "1f4f3", + "name": "vibration_mode" + }, + { + "code": "1f4f9", + "name": "video_camera" + }, + { + "code": "1f3ae", + "name": "video_game" + }, + { + "code": "1f3bb", + "name": "violin" + }, + { + "code": "264d", + "name": "virgo" + }, + { + "code": "1f30b", + "name": "volcano" + }, + { + "code": "1f3d0", + "name": "volleyball" + }, + { + "code": "1f19a", + "name": "vs" + }, + { + "code": "1f596", + "name": "vulcan" + }, + { + "code": "1f6b6", + "name": "walking" + }, + { + "code": "1f318", + "name": "waning_crescent_moon" + }, + { + "code": "1f316", + "name": "waning_gibbous_moon" + }, + { + "code": "26a0", + "name": "warning" + }, + { + "code": "1f5d1", + "name": "wastebasket" + }, + { + "code": "231a", + "name": "watch" + }, + { + "code": "1f403", + "name": "water_buffalo" + }, + { + "code": "1f349", + "name": "watermelon" + }, + { + "code": "1f44b", + "name": "wave" + }, + { + "code": "3030", + "name": "wavy_dash" + }, + { + "code": "1f312", + "name": "waxing_crescent_moon" + }, + { + "code": "1f314", + "name": "waxing_gibbous_moon" + }, + { + "code": "1f6be", + "name": "wc" + }, + { + "code": "1f629", + "name": "weary" + }, + { + "code": "1f492", + "name": "wedding" + }, + { + "code": "1f433", + "name": "whale" + }, + { + "code": "1f40b", + "name": "whale2" + }, + { + "code": "2638", + "name": "wheel_of_dharma" + }, + { + "code": "267f", + "name": "wheelchair" + }, + { + "code": "2705", + "name": "white_check_mark" + }, + { + "code": "26aa", + "name": "white_circle" + }, + { + "code": "1f4ae", + "name": "white_flower" + }, + { + "code": "2b1c", + "name": "white_large_square" + }, + { + "code": "25fd", + "name": "white_medium_small_square" + }, + { + "code": "25fb", + "name": "white_medium_square" + }, + { + "code": "25ab", + "name": "white_small_square" + }, + { + "code": "1f533", + "name": "white_square_button" + }, + { + "code": "1f325", + "name": "white_sun_cloud" + }, + { + "code": "1f326", + "name": "white_sun_rain_cloud" + }, + { + "code": "1f324", + "name": "white_sun_small_cloud" + }, + { + "code": "1f32c", + "name": "wind_blowing_face" + }, + { + "code": "1f390", + "name": "wind_chime" + }, + { + "code": "1f377", + "name": "wine_glass" + }, + { + "code": "1f609", + "name": "wink" + }, + { + "code": "1f43a", + "name": "wolf" + }, + { + "code": "1f469", + "name": "woman" + }, + { + "code": "1f45a", + "name": "womans_clothes" + }, + { + "code": "1f452", + "name": "womans_hat" + }, + { + "code": "1f6ba", + "name": "womens" + }, + { + "code": "1f61f", + "name": "worried" + }, + { + "code": "1f527", + "name": "wrench" + }, + { + "code": "270d", + "name": "writing_hand" + }, + { + "code": "274c", + "name": "x" + }, + { + "code": "1f49b", + "name": "yellow_heart" + }, + { + "code": "1f4b4", + "name": "yen" + }, + { + "code": "262f", + "name": "yin_yang" + }, + { + "code": "1f60b", + "name": "yum" + }, + { + "code": "26a1", + "name": "zap" + }, + { + "code": "0030-20e3", + "name": "zero" + }, + { + "code": "1f910", + "name": "zipper_mouth" + }, + { + "code": "1f4a4", + "name": "zzz" + } + ], + "aliases": { + "airplane_small": [ + "small_airplane" + ], + "anger_right": [ + "right_anger_bubble" + ], + "atom": [ + "atom_symbol" + ], + "ballot_box": [ + "ballot_box_with_ballot" + ], + "basketball_player": [ + "person_with_ball" + ], + "beach": [ + "beach_with_umbrella" + ], + "beach_umbrella": [ + "umbrella_on_ground" + ], + "bellhop": [ + "bellhop_bell" + ], + "biohazard": [ + "biohazard_sign" + ], + "bow_and_arrow": [ + "archery" + ], + "calendar_spiral": [ + "spiral_calendar_pad" + ], + "card_box": [ + "card_file_box" + ], + "champagne": [ + "bottle_with_popping_cork" + ], + "cheese": [ + "cheese_wedge" + ], + "city_sunset": [ "city_sunrise" - ] - , "tags": [ - ] - } -, { - "emoji": "🌆" - , "description": "cityscape at dusk" - , "aliases": [ - "city_sunset" - ] - , "tags": [ - ] - } -, { - "emoji": "🏯" - , "description": "japanese castle" - , "aliases": [ - "japanese_castle" - ] - , "tags": [ - ] - } -, { - "emoji": "🏰" - , "description": "european castle" - , "aliases": [ - "european_castle" - ] - , "tags": [ - ] - } -, { - "emoji": "⛺" - , "description": "tent" - , "aliases": [ - "tent" - ] - , "tags": [ - "camping" - ] - } -, { - "emoji": "🏭" - , "description": "factory" - , "aliases": [ - "factory" - ] - , "tags": [ - ] - } -, { - "emoji": "🗼" - , "description": "tokyo tower" - , "aliases": [ - "tokyo_tower" - ] - , "tags": [ - ] - } -, { - "emoji": "🗾" - , "description": "silhouette of japan" - , "aliases": [ - "japan" - ] - , "tags": [ - ] - } -, { - "emoji": "🗻" - , "description": "mount fuji" - , "aliases": [ - "mount_fuji" - ] - , "tags": [ - ] - } -, { - "emoji": "🌄" - , "description": "sunrise over mountains" - , "aliases": [ - "sunrise_over_mountains" - ] - , "tags": [ - ] - } -, { - "emoji": "🌅" - , "description": "sunrise" - , "aliases": [ - "sunrise" - ] - , "tags": [ - ] - } -, { - "emoji": "🌃" - , "description": "night with stars" - , "aliases": [ - "night_with_stars" - ] - , "tags": [ - ] - } -, { - "emoji": "🗽" - , "description": "statue of liberty" - , "aliases": [ - "statue_of_liberty" - ] - , "tags": [ - ] - } -, { - "emoji": "🌉" - , "description": "bridge at night" - , "aliases": [ - "bridge_at_night" - ] - , "tags": [ - ] - } -, { - "emoji": "🎠" - , "description": "carousel horse" - , "aliases": [ - "carousel_horse" - ] - , "tags": [ - ] - } -, { - "emoji": "🎡" - , "description": "ferris wheel" - , "aliases": [ - "ferris_wheel" - ] - , "tags": [ - ] - } -, { - "emoji": "⛲" - , "description": "fountain" - , "aliases": [ - "fountain" - ] - , "tags": [ - ] - } -, { - "emoji": "🎢" - , "description": "roller coaster" - , "aliases": [ - "roller_coaster" - ] - , "tags": [ - ] - } -, { - "emoji": "🚢" - , "description": "ship" - , "aliases": [ - "ship" - ] - , "tags": [ - ] - } -, { - "emoji": "⛵" - , "description": "sailboat" - , "aliases": [ - "boat" - , "sailboat" - ] - , "tags": [ - ] - } -, { - "emoji": "🚤" - , "description": "speedboat" - , "aliases": [ - "speedboat" - ] - , "tags": [ - "ship" - ] - } -, { - "emoji": "🚣" - , "description": "rowboat" - , "aliases": [ - "rowboat" - ] - , "tags": [ - ] - } -, { - "emoji": "⚓" - , "description": "anchor" - , "aliases": [ - "anchor" - ] - , "tags": [ - "ship" - ] - } -, { - "emoji": "🚀" - , "description": "rocket" - , "aliases": [ - "rocket" - ] - , "tags": [ - "ship" - , "launch" - ] - } -, { - "emoji": "✈️" - , "description": "airplane" - , "aliases": [ - "airplane" - ] - , "tags": [ - "flight" - ] - } -, { - "emoji": "💺" - , "description": "seat" - , "aliases": [ - "seat" - ] - , "tags": [ - ] - } -, { - "emoji": "🚁" - , "description": "helicopter" - , "aliases": [ - "helicopter" - ] - , "tags": [ - ] - } -, { - "emoji": "🚂" - , "description": "steam locomotive" - , "aliases": [ - "steam_locomotive" - ] - , "tags": [ - "train" - ] - } -, { - "emoji": "🚊" - , "description": "tram" - , "aliases": [ - "tram" - ] - , "tags": [ - ] - } -, { - "emoji": "🚉" - , "description": "station" - , "aliases": [ - "station" - ] - , "tags": [ - ] - } -, { - "emoji": "🚞" - , "description": "mountain railway" - , "aliases": [ - "mountain_railway" - ] - , "tags": [ - ] - } -, { - "emoji": "🚆" - , "description": "train" - , "aliases": [ - "train2" - ] - , "tags": [ - ] - } -, { - "emoji": "🚄" - , "description": "high-speed train" - , "aliases": [ - "bullettrain_side" - ] - , "tags": [ - "train" - ] - } -, { - "emoji": "🚅" - , "description": "high-speed train with bullet nose" - , "aliases": [ - "bullettrain_front" - ] - , "tags": [ - "train" - ] - } -, { - "emoji": "🚈" - , "description": "light rail" - , "aliases": [ - "light_rail" - ] - , "tags": [ - ] - } -, { - "emoji": "🚇" - , "description": "metro" - , "aliases": [ - "metro" - ] - , "tags": [ - ] - } -, { - "emoji": "🚝" - , "description": "monorail" - , "aliases": [ - "monorail" - ] - , "tags": [ - ] - } -, { - "emoji": "🚋" - , "description": "tram car" - , "aliases": [ - "train" - ] - , "tags": [ - ] - } -, { - "emoji": "🚃" - , "description": "railway car" - , "aliases": [ - "railway_car" - ] - , "tags": [ - ] - } -, { - "emoji": "🚎" - , "description": "trolleybus" - , "aliases": [ - "trolleybus" - ] - , "tags": [ - ] - } -, { - "emoji": "🚌" - , "description": "bus" - , "aliases": [ - "bus" - ] - , "tags": [ - ] - } -, { - "emoji": "🚍" - , "description": "oncoming bus" - , "aliases": [ - "oncoming_bus" - ] - , "tags": [ - ] - } -, { - "emoji": "🚙" - , "description": "recreational vehicle" - , "aliases": [ - "blue_car" - ] - , "tags": [ - ] - } -, { - "emoji": "🚘" - , "description": "oncoming automobile" - , "aliases": [ - "oncoming_automobile" - ] - , "tags": [ - ] - } -, { - "emoji": "🚗" - , "description": "automobile" - , "aliases": [ - "car" - , "red_car" - ] - , "tags": [ - ] - } -, { - "emoji": "🚕" - , "description": "taxi" - , "aliases": [ - "taxi" - ] - , "tags": [ - ] - } -, { - "emoji": "🚖" - , "description": "oncoming taxi" - , "aliases": [ - "oncoming_taxi" - ] - , "tags": [ - ] - } -, { - "emoji": "🚛" - , "description": "articulated lorry" - , "aliases": [ - "articulated_lorry" - ] - , "tags": [ - ] - } -, { - "emoji": "🚚" - , "description": "delivery truck" - , "aliases": [ - "truck" - ] - , "tags": [ - ] - } -, { - "emoji": "🚨" - , "description": "police cars revolving light" - , "aliases": [ - "rotating_light" - ] - , "tags": [ - "911" - , "emergency" - ] - } -, { - "emoji": "🚓" - , "description": "police car" - , "aliases": [ - "police_car" - ] - , "tags": [ - ] - } -, { - "emoji": "🚔" - , "description": "oncoming police car" - , "aliases": [ - "oncoming_police_car" - ] - , "tags": [ - ] - } -, { - "emoji": "🚒" - , "description": "fire engine" - , "aliases": [ - "fire_engine" - ] - , "tags": [ - ] - } -, { - "emoji": "🚑" - , "description": "ambulance" - , "aliases": [ - "ambulance" - ] - , "tags": [ - ] - } -, { - "emoji": "🚐" - , "description": "minibus" - , "aliases": [ - "minibus" - ] - , "tags": [ - ] - } -, { - "emoji": "🚲" - , "description": "bicycle" - , "aliases": [ - "bike" - ] - , "tags": [ - "bicycle" - ] - } -, { - "emoji": "🚡" - , "description": "aerial tramway" - , "aliases": [ - "aerial_tramway" - ] - , "tags": [ - ] - } -, { - "emoji": "🚟" - , "description": "suspension railway" - , "aliases": [ - "suspension_railway" - ] - , "tags": [ - ] - } -, { - "emoji": "🚠" - , "description": "mountain cableway" - , "aliases": [ - "mountain_cableway" - ] - , "tags": [ - ] - } -, { - "emoji": "🚜" - , "description": "tractor" - , "aliases": [ - "tractor" - ] - , "tags": [ - ] - } -, { - "emoji": "💈" - , "description": "barber pole" - , "aliases": [ - "barber" - ] - , "tags": [ - ] - } -, { - "emoji": "🚏" - , "description": "bus stop" - , "aliases": [ - "busstop" - ] - , "tags": [ - ] - } -, { - "emoji": "🎫" - , "description": "ticket" - , "aliases": [ - "ticket" - ] - , "tags": [ - ] - } -, { - "emoji": "🚦" - , "description": "vertical traffic light" - , "aliases": [ - "vertical_traffic_light" - ] - , "tags": [ - "semaphore" - ] - } -, { - "emoji": "🚥" - , "description": "horizontal traffic light" - , "aliases": [ - "traffic_light" - ] - , "tags": [ - ] - } -, { - "emoji": "⚠️" - , "description": "warning sign" - , "aliases": [ - "warning" - ] - , "tags": [ - "wip" - ] - } -, { - "emoji": "🚧" - , "description": "construction sign" - , "aliases": [ - "construction" - ] - , "tags": [ - "wip" - ] - } -, { - "emoji": "🔰" - , "description": "japanese symbol for beginner" - , "aliases": [ - "beginner" - ] - , "tags": [ - ] - } -, { - "emoji": "⛽" - , "description": "fuel pump" - , "aliases": [ - "fuelpump" - ] - , "tags": [ - ] - } -, { - "emoji": "🏮" - , "description": "izakaya lantern" - , "aliases": [ - "izakaya_lantern" - , "lantern" - ] - , "tags": [ - ] - } -, { - "emoji": "🎰" - , "description": "slot machine" - , "aliases": [ - "slot_machine" - ] - , "tags": [ - ] - } -, { - "emoji": "♨️" - , "description": "hot springs" - , "aliases": [ - "hotsprings" - ] - , "tags": [ - ] - } -, { - "emoji": "🗿" - , "description": "moyai" - , "aliases": [ - "moyai" - ] - , "tags": [ - "stone" - ] - } -, { - "emoji": "🎪" - , "description": "circus tent" - , "aliases": [ - "circus_tent" - ] - , "tags": [ - ] - } -, { - "emoji": "🎭" - , "description": "performing arts" - , "aliases": [ - "performing_arts" - ] - , "tags": [ - "theater" - , "drama" - ] - } -, { - "emoji": "📍" - , "description": "round pushpin" - , "aliases": [ - "round_pushpin" - ] - , "tags": [ - "location" - ] - } -, { - "emoji": "🚩" - , "description": "triangular flag on post" - , "aliases": [ - "triangular_flag_on_post" - ] - , "tags": [ - ] - } -, { - "emoji": "🇯🇵" - , "description": "regional indicator symbol letter j + regional indicator symbol letter p" - , "aliases": [ - "jp" - ] - , "tags": [ - "japan" - ] - } -, { - "emoji": "🇰🇷" - , "description": "regional indicator symbol letter k + regional indicator symbol letter r" - , "aliases": [ - "kr" - ] - , "tags": [ - "korea" - ] - } -, { - "emoji": "🇩🇪" - , "description": "regional indicator symbol letter d + regional indicator symbol letter e" - , "aliases": [ - "de" - ] - , "tags": [ - "flag" - , "germany" - ] - } -, { - "emoji": "🇨🇳" - , "description": "regional indicator symbol letter c + regional indicator symbol letter n" - , "aliases": [ + ], + "clock": [ + "mantlepiece_clock" + ], + "cloud_lightning": [ + "cloud_with_lightning" + ], + "cloud_rain": [ + "cloud_with_rain" + ], + "cloud_snow": [ + "cloud_with_snow" + ], + "cloud_tornado": [ + "cloud_with_tornado" + ], + "construction_site": [ + "building_construction" + ], + "couch": [ + "couch_and_lamp" + ], + "crayon": [ + "lower_left_crayon" + ], + "cricket": [ + "cricket_bat_ball" + ], + "cross": [ + "latin_cross" + ], + "cruise_ship": [ + "passenger_ship" + ], + "dagger": [ + "dagger_knife" + ], + "desktop": [ + "desktop_computer" + ], + "dividers": [ + "card_index_dividers" + ], + "dove": [ + "dove_of_peace" + ], + "e-mail": [ + "email" + ], + "feet": [ + "paw_prints" + ], + "fire": [ + "flame" + ], + "flag_black": [ + "waving_black_flag" + ], + "flag_cn": [ "cn" - ] - , "tags": [ - "china" - ] - } -, { - "emoji": "🇺🇸" - , "description": "regional indicator symbol letter u + regional indicator symbol letter s" - , "aliases": [ - "us" - ] - , "tags": [ - "flag" - , "united" - , "america" - ] - } -, { - "emoji": "🇫🇷" - , "description": "regional indicator symbol letter f + regional indicator symbol letter r" - , "aliases": [ - "fr" - ] - , "tags": [ - "france" - , "french" - ] - } -, { - "emoji": "🇪🇸" - , "description": "regional indicator symbol letter e + regional indicator symbol letter s" - , "aliases": [ + ], + "flag_de": [ + "de" + ], + "flag_es": [ "es" - ] - , "tags": [ - "spain" - ] - } -, { - "emoji": "🇮🇹" - , "description": "regional indicator symbol letter i + regional indicator symbol letter t" - , "aliases": [ - "it" - ] - , "tags": [ - "italy" - ] - } -, { - "emoji": "🇷🇺" - , "description": "regional indicator symbol letter r + regional indicator symbol letter u" - , "aliases": [ - "ru" - ] - , "tags": [ - "russia" - ] - } -, { - "emoji": "🇬🇧" - , "description": "regional indicator symbol letter g + regional indicator symbol letter b" - , "aliases": [ + ], + "flag_fr": [ + "fr" + ], + "flag_gb": [ "gb" - , "uk" - ] - , "tags": [ - "flag" - , "british" - ] - } -, { - "emoji": "1️⃣" - , "description": "digit one + combining enclosing keycap" - , "aliases": [ - "one" - ] - , "tags": [ - ] - } -, { - "emoji": "2️⃣" - , "description": "digit two + combining enclosing keycap" - , "aliases": [ - "two" - ] - , "tags": [ - ] - } -, { - "emoji": "3️⃣" - , "description": "digit three + combining enclosing keycap" - , "aliases": [ - "three" - ] - , "tags": [ - ] - } -, { - "emoji": "4️⃣" - , "description": "digit four + combining enclosing keycap" - , "aliases": [ - "four" - ] - , "tags": [ - ] - } -, { - "emoji": "5️⃣" - , "description": "digit five + combining enclosing keycap" - , "aliases": [ - "five" - ] - , "tags": [ - ] - } -, { - "emoji": "6️⃣" - , "description": "digit six + combining enclosing keycap" - , "aliases": [ - "six" - ] - , "tags": [ - ] - } -, { - "emoji": "7️⃣" - , "description": "digit seven + combining enclosing keycap" - , "aliases": [ - "seven" - ] - , "tags": [ - ] - } -, { - "emoji": "8️⃣" - , "description": "digit eight + combining enclosing keycap" - , "aliases": [ - "eight" - ] - , "tags": [ - ] - } -, { - "emoji": "9️⃣" - , "description": "digit nine + combining enclosing keycap" - , "aliases": [ - "nine" - ] - , "tags": [ - ] - } -, { - "emoji": "0️⃣" - , "description": "digit zero + combining enclosing keycap" - , "aliases": [ - "zero" - ] - , "tags": [ - ] - } -, { - "emoji": "🔟" - , "description": "keycap ten" - , "aliases": [ - "keycap_ten" - ] - , "tags": [ - ] - } -, { - "emoji": "🔢" - , "description": "input symbol for numbers" - , "aliases": [ - "1234" - ] - , "tags": [ - "numbers" - ] - } -, { - "emoji": "#️⃣" - , "description": "number sign + combining enclosing keycap" - , "aliases": [ - "hash" - ] - , "tags": [ - "number" - ] - } -, { - "emoji": "🔣" - , "description": "input symbol for symbols" - , "aliases": [ - "symbols" - ] - , "tags": [ - ] - } -, { - "emoji": "⬆️" - , "description": "upwards black arrow" - , "aliases": [ - "arrow_up" - ] - , "tags": [ - ] - } -, { - "emoji": "⬇️" - , "description": "downwards black arrow" - , "aliases": [ - "arrow_down" - ] - , "tags": [ - ] - } -, { - "emoji": "⬅️" - , "description": "leftwards black arrow" - , "aliases": [ - "arrow_left" - ] - , "tags": [ - ] - } -, { - "emoji": "➡️" - , "description": "black rightwards arrow" - , "aliases": [ - "arrow_right" - ] - , "tags": [ - ] - } -, { - "emoji": "🔠" - , "description": "input symbol for latin capital letters" - , "aliases": [ - "capital_abcd" - ] - , "tags": [ - "letters" - ] - } -, { - "emoji": "🔡" - , "description": "input symbol for latin small letters" - , "aliases": [ - "abcd" - ] - , "tags": [ - ] - } -, { - "emoji": "🔤" - , "description": "input symbol for latin letters" - , "aliases": [ - "abc" - ] - , "tags": [ - "alphabet" - ] - } -, { - "emoji": "↗️" - , "description": "north east arrow" - , "aliases": [ - "arrow_upper_right" - ] - , "tags": [ - ] - } -, { - "emoji": "↖️" - , "description": "north west arrow" - , "aliases": [ - "arrow_upper_left" - ] - , "tags": [ - ] - } -, { - "emoji": "↘️" - , "description": "south east arrow" - , "aliases": [ - "arrow_lower_right" - ] - , "tags": [ - ] - } -, { - "emoji": "↙️" - , "description": "south west arrow" - , "aliases": [ - "arrow_lower_left" - ] - , "tags": [ - ] - } -, { - "emoji": "↔️" - , "description": "left right arrow" - , "aliases": [ - "left_right_arrow" - ] - , "tags": [ - ] - } -, { - "emoji": "↕️" - , "description": "up down arrow" - , "aliases": [ - "arrow_up_down" - ] - , "tags": [ - ] - } -, { - "emoji": "🔄" - , "description": "anticlockwise downwards and upwards open circle arrows" - , "aliases": [ - "arrows_counterclockwise" - ] - , "tags": [ - "sync" - ] - } -, { - "emoji": "◀️" - , "description": "black left-pointing triangle" - , "aliases": [ - "arrow_backward" - ] - , "tags": [ - ] - } -, { - "emoji": "▶️" - , "description": "black right-pointing triangle" - , "aliases": [ - "arrow_forward" - ] - , "tags": [ - ] - } -, { - "emoji": "🔼" - , "description": "up-pointing small red triangle" - , "aliases": [ - "arrow_up_small" - ] - , "tags": [ - ] - } -, { - "emoji": "🔽" - , "description": "down-pointing small red triangle" - , "aliases": [ - "arrow_down_small" - ] - , "tags": [ - ] - } -, { - "emoji": "↩️" - , "description": "leftwards arrow with hook" - , "aliases": [ - "leftwards_arrow_with_hook" - ] - , "tags": [ - "return" - ] - } -, { - "emoji": "↪️" - , "description": "rightwards arrow with hook" - , "aliases": [ - "arrow_right_hook" - ] - , "tags": [ - ] - } -, { - "emoji": "ℹ️" - , "description": "information source" - , "aliases": [ - "information_source" - ] - , "tags": [ - ] - } -, { - "emoji": "⏪" - , "description": "black left-pointing double triangle" - , "aliases": [ - "rewind" - ] - , "tags": [ - ] - } -, { - "emoji": "⏩" - , "description": "black right-pointing double triangle" - , "aliases": [ - "fast_forward" - ] - , "tags": [ - ] - } -, { - "emoji": "⏫" - , "description": "black up-pointing double triangle" - , "aliases": [ - "arrow_double_up" - ] - , "tags": [ - ] - } -, { - "emoji": "⏬" - , "description": "black down-pointing double triangle" - , "aliases": [ - "arrow_double_down" - ] - , "tags": [ - ] - } -, { - "emoji": "⤵️" - , "description": "arrow pointing rightwards then curving downwards" - , "aliases": [ - "arrow_heading_down" - ] - , "tags": [ - ] - } -, { - "emoji": "⤴️" - , "description": "arrow pointing rightwards then curving upwards" - , "aliases": [ - "arrow_heading_up" - ] - , "tags": [ - ] - } -, { - "emoji": "🆗" - , "description": "squared ok" - , "aliases": [ - "ok" - ] - , "tags": [ - "yes" - ] - } -, { - "emoji": "🔀" - , "description": "twisted rightwards arrows" - , "aliases": [ - "twisted_rightwards_arrows" - ] - , "tags": [ - "shuffle" - ] - } -, { - "emoji": "🔁" - , "description": "clockwise rightwards and leftwards open circle arrows" - , "aliases": [ - "repeat" - ] - , "tags": [ - "loop" - ] - } -, { - "emoji": "🔂" - , "description": "clockwise rightwards and leftwards open circle arrows with circled one overlay" - , "aliases": [ - "repeat_one" - ] - , "tags": [ - ] - } -, { - "emoji": "🆕" - , "description": "squared new" - , "aliases": [ - "new" - ] - , "tags": [ - "fresh" - ] - } -, { - "emoji": "🆙" - , "description": "squared up with exclamation mark" - , "aliases": [ - "up" - ] - , "tags": [ - ] - } -, { - "emoji": "🆒" - , "description": "squared cool" - , "aliases": [ - "cool" - ] - , "tags": [ - ] - } -, { - "emoji": "🆓" - , "description": "squared free" - , "aliases": [ - "free" - ] - , "tags": [ - ] - } -, { - "emoji": "🆖" - , "description": "squared ng" - , "aliases": [ - "ng" - ] - , "tags": [ - ] - } -, { - "emoji": "📶" - , "description": "antenna with bars" - , "aliases": [ - "signal_strength" - ] - , "tags": [ - "wifi" - ] - } -, { - "emoji": "🎦" - , "description": "cinema" - , "aliases": [ - "cinema" - ] - , "tags": [ - "film" - , "movie" - ] - } -, { - "emoji": "🈁" - , "description": "squared katakana koko" - , "aliases": [ - "koko" - ] - , "tags": [ - ] - } -, { - "emoji": "🈯" - , "description": "squared cjk unified ideograph-6307" - , "aliases": [ - "u6307" - ] - , "tags": [ - ] - } -, { - "emoji": "🈳" - , "description": "squared cjk unified ideograph-7a7a" - , "aliases": [ - "u7a7a" - ] - , "tags": [ - ] - } -, { - "emoji": "🈵" - , "description": "squared cjk unified ideograph-6e80" - , "aliases": [ - "u6e80" - ] - , "tags": [ - ] - } -, { - "emoji": "🈴" - , "description": "squared cjk unified ideograph-5408" - , "aliases": [ - "u5408" - ] - , "tags": [ - ] - } -, { - "emoji": "🈲" - , "description": "squared cjk unified ideograph-7981" - , "aliases": [ - "u7981" - ] - , "tags": [ - ] - } -, { - "emoji": "🉐" - , "description": "circled ideograph advantage" - , "aliases": [ - "ideograph_advantage" - ] - , "tags": [ - ] - } -, { - "emoji": "🈹" - , "description": "squared cjk unified ideograph-5272" - , "aliases": [ - "u5272" - ] - , "tags": [ - ] - } -, { - "emoji": "🈺" - , "description": "squared cjk unified ideograph-55b6" - , "aliases": [ - "u55b6" - ] - , "tags": [ - ] - } -, { - "emoji": "🈶" - , "description": "squared cjk unified ideograph-6709" - , "aliases": [ - "u6709" - ] - , "tags": [ - ] - } -, { - "emoji": "🈚" - , "description": "squared cjk unified ideograph-7121" - , "aliases": [ - "u7121" - ] - , "tags": [ - ] - } -, { - "emoji": "🚻" - , "description": "restroom" - , "aliases": [ - "restroom" - ] - , "tags": [ - "toilet" - ] - } -, { - "emoji": "🚹" - , "description": "mens symbol" - , "aliases": [ - "mens" - ] - , "tags": [ - ] - } -, { - "emoji": "🚺" - , "description": "womens symbol" - , "aliases": [ - "womens" - ] - , "tags": [ - ] - } -, { - "emoji": "🚼" - , "description": "baby symbol" - , "aliases": [ - "baby_symbol" - ] - , "tags": [ - ] - } -, { - "emoji": "🚾" - , "description": "water closet" - , "aliases": [ - "wc" - ] - , "tags": [ - "toilet" - , "restroom" - ] - } -, { - "emoji": "🚰" - , "description": "potable water symbol" - , "aliases": [ - "potable_water" - ] - , "tags": [ - ] - } -, { - "emoji": "🚮" - , "description": "put litter in its place symbol" - , "aliases": [ - "put_litter_in_its_place" - ] - , "tags": [ - ] - } -, { - "emoji": "🅿️" - , "description": "negative squared latin capital letter p" - , "aliases": [ - "parking" - ] - , "tags": [ - ] - } -, { - "emoji": "♿" - , "description": "wheelchair symbol" - , "aliases": [ - "wheelchair" - ] - , "tags": [ - "accessibility" - ] - } -, { - "emoji": "🚭" - , "description": "no smoking symbol" - , "aliases": [ - "no_smoking" - ] - , "tags": [ - ] - } -, { - "emoji": "🈷️" - , "description": "squared cjk unified ideograph-6708" - , "aliases": [ - "u6708" - ] - , "tags": [ - ] - } -, { - "emoji": "🈸" - , "description": "squared cjk unified ideograph-7533" - , "aliases": [ - "u7533" - ] - , "tags": [ - ] - } -, { - "emoji": "🈂️" - , "description": "squared katakana sa" - , "aliases": [ - "sa" - ] - , "tags": [ - ] - } -, { - "emoji": "Ⓜ️" - , "description": "circled latin capital letter m" - , "aliases": [ - "m" - ] - , "tags": [ - ] - } -, { - "emoji": "🛂" - , "description": "passport control" - , "aliases": [ - "passport_control" - ] - , "tags": [ - ] - } -, { - "emoji": "🛄" - , "description": "baggage claim" - , "aliases": [ - "baggage_claim" - ] - , "tags": [ - "airport" - ] - } -, { - "emoji": "🛅" - , "description": "left luggage" - , "aliases": [ - "left_luggage" - ] - , "tags": [ - ] - } -, { - "emoji": "🛃" - , "description": "customs" - , "aliases": [ - "customs" - ] - , "tags": [ - ] - } -, { - "emoji": "🉑" - , "description": "circled ideograph accept" - , "aliases": [ - "accept" - ] - , "tags": [ - ] - } -, { - "emoji": "㊙️" - , "description": "circled ideograph secret" - , "aliases": [ - "secret" - ] - , "tags": [ - ] - } -, { - "emoji": "㊗️" - , "description": "circled ideograph congratulation" - , "aliases": [ - "congratulations" - ] - , "tags": [ - ] - } -, { - "emoji": "🆑" - , "description": "squared cl" - , "aliases": [ - "cl" - ] - , "tags": [ - ] - } -, { - "emoji": "🆘" - , "description": "squared sos" - , "aliases": [ - "sos" - ] - , "tags": [ - "help" - , "emergency" - ] - } -, { - "emoji": "🆔" - , "description": "squared id" - , "aliases": [ - "id" - ] - , "tags": [ - ] - } -, { - "emoji": "🚫" - , "description": "no entry sign" - , "aliases": [ - "no_entry_sign" - ] - , "tags": [ - "block" - , "forbidden" - ] - } -, { - "emoji": "🔞" - , "description": "no one under eighteen symbol" - , "aliases": [ - "underage" - ] - , "tags": [ - ] - } -, { - "emoji": "📵" - , "description": "no mobile phones" - , "aliases": [ - "no_mobile_phones" - ] - , "tags": [ - ] - } -, { - "emoji": "🚯" - , "description": "do not litter symbol" - , "aliases": [ - "do_not_litter" - ] - , "tags": [ - ] - } -, { - "emoji": "🚱" - , "description": "non-potable water symbol" - , "aliases": [ - "non-potable_water" - ] - , "tags": [ - ] - } -, { - "emoji": "🚳" - , "description": "no bicycles" - , "aliases": [ - "no_bicycles" - ] - , "tags": [ - ] - } -, { - "emoji": "🚷" - , "description": "no pedestrians" - , "aliases": [ - "no_pedestrians" - ] - , "tags": [ - ] - } -, { - "emoji": "🚸" - , "description": "children crossing" - , "aliases": [ - "children_crossing" - ] - , "tags": [ - ] - } -, { - "emoji": "⛔" - , "description": "no entry" - , "aliases": [ - "no_entry" - ] - , "tags": [ - "limit" - ] - } -, { - "emoji": "✳️" - , "description": "eight spoked asterisk" - , "aliases": [ - "eight_spoked_asterisk" - ] - , "tags": [ - ] - } -, { - "emoji": "❇️" - , "description": "sparkle" - , "aliases": [ - "sparkle" - ] - , "tags": [ - ] - } -, { - "emoji": "❎" - , "description": "negative squared cross mark" - , "aliases": [ - "negative_squared_cross_mark" - ] - , "tags": [ - ] - } -, { - "emoji": "✅" - , "description": "white heavy check mark" - , "aliases": [ - "white_check_mark" - ] - , "tags": [ - ] - } -, { - "emoji": "✴️" - , "description": "eight pointed black star" - , "aliases": [ - "eight_pointed_black_star" - ] - , "tags": [ - ] - } -, { - "emoji": "💟" - , "description": "heart decoration" - , "aliases": [ - "heart_decoration" - ] - , "tags": [ - ] - } -, { - "emoji": "🆚" - , "description": "squared vs" - , "aliases": [ - "vs" - ] - , "tags": [ - ] - } -, { - "emoji": "📳" - , "description": "vibration mode" - , "aliases": [ - "vibration_mode" - ] - , "tags": [ - ] - } -, { - "emoji": "📴" - , "description": "mobile phone off" - , "aliases": [ - "mobile_phone_off" - ] - , "tags": [ - "mute" - , "off" - ] - } -, { - "emoji": "🅰️" - , "description": "negative squared latin capital letter a" - , "aliases": [ - "a" - ] - , "tags": [ - ] - } -, { - "emoji": "🅱️" - , "description": "negative squared latin capital letter b" - , "aliases": [ - "b" - ] - , "tags": [ - ] - } -, { - "emoji": "🆎" - , "description": "negative squared ab" - , "aliases": [ - "ab" - ] - , "tags": [ - ] - } -, { - "emoji": "🅾️" - , "description": "negative squared latin capital letter o" - , "aliases": [ - "o2" - ] - , "tags": [ - ] - } -, { - "emoji": "💠" - , "description": "diamond shape with a dot inside" - , "aliases": [ - "diamond_shape_with_a_dot_inside" - ] - , "tags": [ - ] - } -, { - "emoji": "➿" - , "description": "double curly loop" - , "aliases": [ - "loop" - ] - , "tags": [ - ] - } -, { - "emoji": "♻️" - , "description": "black universal recycling symbol" - , "aliases": [ - "recycle" - ] - , "tags": [ - "environment" - , "green" - ] - } -, { - "emoji": "♈" - , "description": "aries" - , "aliases": [ - "aries" - ] - , "tags": [ - ] - } -, { - "emoji": "♉" - , "description": "taurus" - , "aliases": [ - "taurus" - ] - , "tags": [ - ] - } -, { - "emoji": "♊" - , "description": "gemini" - , "aliases": [ - "gemini" - ] - , "tags": [ - ] - } -, { - "emoji": "♋" - , "description": "cancer" - , "aliases": [ - "cancer" - ] - , "tags": [ - ] - } -, { - "emoji": "♌" - , "description": "leo" - , "aliases": [ - "leo" - ] - , "tags": [ - ] - } -, { - "emoji": "♍" - , "description": "virgo" - , "aliases": [ - "virgo" - ] - , "tags": [ - ] - } -, { - "emoji": "♎" - , "description": "libra" - , "aliases": [ - "libra" - ] - , "tags": [ - ] - } -, { - "emoji": "♏" - , "description": "scorpius" - , "aliases": [ - "scorpius" - ] - , "tags": [ - ] - } -, { - "emoji": "♐" - , "description": "sagittarius" - , "aliases": [ - "sagittarius" - ] - , "tags": [ - ] - } -, { - "emoji": "♑" - , "description": "capricorn" - , "aliases": [ - "capricorn" - ] - , "tags": [ - ] - } -, { - "emoji": "♒" - , "description": "aquarius" - , "aliases": [ - "aquarius" - ] - , "tags": [ - ] - } -, { - "emoji": "♓" - , "description": "pisces" - , "aliases": [ - "pisces" - ] - , "tags": [ - ] - } -, { - "emoji": "⛎" - , "description": "ophiuchus" - , "aliases": [ - "ophiuchus" - ] - , "tags": [ - ] - } -, { - "emoji": "🔯" - , "description": "six pointed star with middle dot" - , "aliases": [ - "six_pointed_star" - ] - , "tags": [ - ] - } -, { - "emoji": "🏧" - , "description": "automated teller machine" - , "aliases": [ - "atm" - ] - , "tags": [ - ] - } -, { - "emoji": "💹" - , "description": "chart with upwards trend and yen sign" - , "aliases": [ - "chart" - ] - , "tags": [ - ] - } -, { - "emoji": "💲" - , "description": "heavy dollar sign" - , "aliases": [ - "heavy_dollar_sign" - ] - , "tags": [ - ] - } -, { - "emoji": "💱" - , "description": "currency exchange" - , "aliases": [ - "currency_exchange" - ] - , "tags": [ - ] - } -, { - "emoji": "©️" - , "description": "copyright sign" - , "aliases": [ - "copyright" - ] - , "tags": [ - ] - } -, { - "emoji": "®️" - , "description": "registered sign" - , "aliases": [ - "registered" - ] - , "tags": [ - ] - } -, { - "emoji": "™️" - , "description": "trade mark sign" - , "aliases": [ - "tm" - ] - , "tags": [ - "trademark" - ] - } -, { - "emoji": "❌" - , "description": "cross mark" - , "aliases": [ - "x" - ] - , "tags": [ - ] - } -, { - "emoji": "‼️" - , "description": "double exclamation mark" - , "aliases": [ - "bangbang" - ] - , "tags": [ - ] - } -, { - "emoji": "⁉️" - , "description": "exclamation question mark" - , "aliases": [ - "interrobang" - ] - , "tags": [ - ] - } -, { - "emoji": "❗" - , "description": "heavy exclamation mark symbol" - , "aliases": [ - "exclamation" - , "heavy_exclamation_mark" - ] - , "tags": [ - "bang" - ] - } -, { - "emoji": "❓" - , "description": "black question mark ornament" - , "aliases": [ - "question" - ] - , "tags": [ - "confused" - ] - } -, { - "emoji": "❕" - , "description": "white exclamation mark ornament" - , "aliases": [ - "grey_exclamation" - ] - , "tags": [ - ] - } -, { - "emoji": "❔" - , "description": "white question mark ornament" - , "aliases": [ - "grey_question" - ] - , "tags": [ - ] - } -, { - "emoji": "⭕" - , "description": "heavy large circle" - , "aliases": [ - "o" - ] - , "tags": [ - ] - } -, { - "emoji": "🔝" - , "description": "top with upwards arrow above" - , "aliases": [ - "top" - ] - , "tags": [ - ] - } -, { - "emoji": "🔚" - , "description": "end with leftwards arrow above" - , "aliases": [ - "end" - ] - , "tags": [ - ] - } -, { - "emoji": "🔙" - , "description": "back with leftwards arrow above" - , "aliases": [ - "back" - ] - , "tags": [ - ] - } -, { - "emoji": "🔛" - , "description": "on with exclamation mark with left right arrow above" - , "aliases": [ - "on" - ] - , "tags": [ - ] - } -, { - "emoji": "🔜" - , "description": "soon with rightwards arrow above" - , "aliases": [ - "soon" - ] - , "tags": [ - ] - } -, { - "emoji": "🔃" - , "description": "clockwise downwards and upwards open circle arrows" - , "aliases": [ - "arrows_clockwise" - ] - , "tags": [ - ] - } -, { - "emoji": "🕛" - , "description": "clock face twelve oclock" - , "aliases": [ - "clock12" - ] - , "tags": [ - ] - } -, { - "emoji": "🕧" - , "description": "clock face twelve-thirty" - , "aliases": [ - "clock1230" - ] - , "tags": [ - ] - } -, { - "emoji": "🕐" - , "description": "clock face one oclock" - , "aliases": [ - "clock1" - ] - , "tags": [ - ] - } -, { - "emoji": "🕜" - , "description": "clock face one-thirty" - , "aliases": [ - "clock130" - ] - , "tags": [ - ] - } -, { - "emoji": "🕑" - , "description": "clock face two oclock" - , "aliases": [ - "clock2" - ] - , "tags": [ - ] - } -, { - "emoji": "🕝" - , "description": "clock face two-thirty" - , "aliases": [ - "clock230" - ] - , "tags": [ - ] - } -, { - "emoji": "🕒" - , "description": "clock face three oclock" - , "aliases": [ - "clock3" - ] - , "tags": [ - ] - } -, { - "emoji": "🕞" - , "description": "clock face three-thirty" - , "aliases": [ - "clock330" - ] - , "tags": [ - ] - } -, { - "emoji": "🕓" - , "description": "clock face four oclock" - , "aliases": [ - "clock4" - ] - , "tags": [ - ] - } -, { - "emoji": "🕟" - , "description": "clock face four-thirty" - , "aliases": [ - "clock430" - ] - , "tags": [ - ] - } -, { - "emoji": "🕔" - , "description": "clock face five oclock" - , "aliases": [ - "clock5" - ] - , "tags": [ - ] - } -, { - "emoji": "🕠" - , "description": "clock face five-thirty" - , "aliases": [ - "clock530" - ] - , "tags": [ - ] - } -, { - "emoji": "🕕" - , "description": "clock face six oclock" - , "aliases": [ - "clock6" - ] - , "tags": [ - ] - } -, { - "emoji": "🕖" - , "description": "clock face seven oclock" - , "aliases": [ - "clock7" - ] - , "tags": [ - ] - } -, { - "emoji": "🕗" - , "description": "clock face eight oclock" - , "aliases": [ - "clock8" - ] - , "tags": [ - ] - } -, { - "emoji": "🕘" - , "description": "clock face nine oclock" - , "aliases": [ - "clock9" - ] - , "tags": [ - ] - } -, { - "emoji": "🕙" - , "description": "clock face ten oclock" - , "aliases": [ - "clock10" - ] - , "tags": [ - ] - } -, { - "emoji": "🕚" - , "description": "clock face eleven oclock" - , "aliases": [ - "clock11" - ] - , "tags": [ - ] - } -, { - "emoji": "🕡" - , "description": "clock face six-thirty" - , "aliases": [ - "clock630" - ] - , "tags": [ - ] - } -, { - "emoji": "🕢" - , "description": "clock face seven-thirty" - , "aliases": [ - "clock730" - ] - , "tags": [ - ] - } -, { - "emoji": "🕣" - , "description": "clock face eight-thirty" - , "aliases": [ - "clock830" - ] - , "tags": [ - ] - } -, { - "emoji": "🕤" - , "description": "clock face nine-thirty" - , "aliases": [ - "clock930" - ] - , "tags": [ - ] - } -, { - "emoji": "🕥" - , "description": "clock face ten-thirty" - , "aliases": [ - "clock1030" - ] - , "tags": [ - ] - } -, { - "emoji": "🕦" - , "description": "clock face eleven-thirty" - , "aliases": [ - "clock1130" - ] - , "tags": [ - ] - } -, { - "emoji": "✖️" - , "description": "heavy multiplication x" - , "aliases": [ - "heavy_multiplication_x" - ] - , "tags": [ - ] - } -, { - "emoji": "➕" - , "description": "heavy plus sign" - , "aliases": [ - "heavy_plus_sign" - ] - , "tags": [ - ] - } -, { - "emoji": "➖" - , "description": "heavy minus sign" - , "aliases": [ - "heavy_minus_sign" - ] - , "tags": [ - ] - } -, { - "emoji": "➗" - , "description": "heavy division sign" - , "aliases": [ - "heavy_division_sign" - ] - , "tags": [ - ] - } -, { - "emoji": "♠️" - , "description": "black spade suit" - , "aliases": [ - "spades" - ] - , "tags": [ - ] - } -, { - "emoji": "♥️" - , "description": "black heart suit" - , "aliases": [ - "hearts" - ] - , "tags": [ - ] - } -, { - "emoji": "♣️" - , "description": "black club suit" - , "aliases": [ - "clubs" - ] - , "tags": [ - ] - } -, { - "emoji": "♦️" - , "description": "black diamond suit" - , "aliases": [ - "diamonds" - ] - , "tags": [ - ] - } -, { - "emoji": "💮" - , "description": "white flower" - , "aliases": [ - "white_flower" - ] - , "tags": [ - ] - } -, { - "emoji": "💯" - , "description": "hundred points symbol" - , "aliases": [ - "100" - ] - , "tags": [ - "score" - , "perfect" - ] - } -, { - "emoji": "✔️" - , "description": "heavy check mark" - , "aliases": [ - "heavy_check_mark" - ] - , "tags": [ - ] - } -, { - "emoji": "☑️" - , "description": "ballot box with check" - , "aliases": [ - "ballot_box_with_check" - ] - , "tags": [ - ] - } -, { - "emoji": "🔘" - , "description": "radio button" - , "aliases": [ - "radio_button" - ] - , "tags": [ - ] - } -, { - "emoji": "🔗" - , "description": "link symbol" - , "aliases": [ - "link" - ] - , "tags": [ - ] - } -, { - "emoji": "➰" - , "description": "curly loop" - , "aliases": [ - "curly_loop" - ] - , "tags": [ - ] - } -, { - "emoji": "〰️" - , "description": "wavy dash" - , "aliases": [ - "wavy_dash" - ] - , "tags": [ - ] - } -, { - "emoji": "〽️" - , "description": "part alternation mark" - , "aliases": [ - "part_alternation_mark" - ] - , "tags": [ - ] - } -, { - "emoji": "🔱" - , "description": "trident emblem" - , "aliases": [ - "trident" - ] - , "tags": [ - ] - } -, { - "emoji": "◼️" - , "description": "black medium square" - , "aliases": [ - "black_medium_square" - ] - , "tags": [ - ] - } -, { - "emoji": "◻️" - , "description": "white medium square" - , "aliases": [ - "white_medium_square" - ] - , "tags": [ - ] - } -, { - "emoji": "◾" - , "description": "black medium small square" - , "aliases": [ - "black_medium_small_square" - ] - , "tags": [ - ] - } -, { - "emoji": "◽" - , "description": "white medium small square" - , "aliases": [ - "white_medium_small_square" - ] - , "tags": [ - ] - } -, { - "emoji": "▪️" - , "description": "black small square" - , "aliases": [ - "black_small_square" - ] - , "tags": [ - ] - } -, { - "emoji": "▫️" - , "description": "white small square" - , "aliases": [ - "white_small_square" - ] - , "tags": [ - ] - } -, { - "emoji": "🔺" - , "description": "up-pointing red triangle" - , "aliases": [ - "small_red_triangle" - ] - , "tags": [ - ] - } -, { - "emoji": "🔲" - , "description": "black square button" - , "aliases": [ - "black_square_button" - ] - , "tags": [ - ] - } -, { - "emoji": "🔳" - , "description": "white square button" - , "aliases": [ - "white_square_button" - ] - , "tags": [ - ] - } -, { - "emoji": "⚫" - , "description": "medium black circle" - , "aliases": [ - "black_circle" - ] - , "tags": [ - ] - } -, { - "emoji": "⚪" - , "description": "medium white circle" - , "aliases": [ - "white_circle" - ] - , "tags": [ - ] - } -, { - "emoji": "🔴" - , "description": "large red circle" - , "aliases": [ - "red_circle" - ] - , "tags": [ - ] - } -, { - "emoji": "🔵" - , "description": "large blue circle" - , "aliases": [ - "large_blue_circle" - ] - , "tags": [ - ] - } -, { - "emoji": "🔻" - , "description": "down-pointing red triangle" - , "aliases": [ - "small_red_triangle_down" - ] - , "tags": [ - ] - } -, { - "emoji": "⬜" - , "description": "white large square" - , "aliases": [ - "white_large_square" - ] - , "tags": [ - ] - } -, { - "emoji": "⬛" - , "description": "black large square" - , "aliases": [ - "black_large_square" - ] - , "tags": [ - ] - } -, { - "emoji": "🔶" - , "description": "large orange diamond" - , "aliases": [ - "large_orange_diamond" - ] - , "tags": [ - ] - } -, { - "emoji": "🔷" - , "description": "large blue diamond" - , "aliases": [ - "large_blue_diamond" - ] - , "tags": [ - ] - } -, { - "emoji": "🔸" - , "description": "small orange diamond" - , "aliases": [ - "small_orange_diamond" - ] - , "tags": [ - ] - } -, { - "emoji": "🔹" - , "description": "small blue diamond" - , "aliases": [ - "small_blue_diamond" - ] - , "tags": [ - ] - } -] + ], + "flag_it": [ + "it" + ], + "flag_jp": [ + "jp" + ], + "flag_kr": [ + "kr" + ], + "flag_ru": [ + "ru" + ], + "flag_us": [ + "us" + ], + "flag_white": [ + "waving_white_flag" + ], + "fork_knife_plate": [ + "fork_and_knife_with_plate" + ], + "frame_photo": [ + "frame_with_picture" + ], + "frowning2": [ + "white_frowning_face" + ], + "hammer_pick": [ + "hammer_and_pick" + ], + "hand_splayed": [ + "raised_hand_with_fingers_splayed" + ], + "head_bandage": [ + "face_with_head_bandage" + ], + "heart_exclamation": [ + "heavy_heart_exclamation_mark_ornament" + ], + "helmet_with_cross": [ + "helmet_with_white_cross" + ], + "homes": [ + "house_buildings" + ], + "hotdog": [ + "hot_dog" + ], + "house_abandoned": [ + "derelict_house_building" + ], + "hugging": [ + "hugging_face" + ], + "island": [ + "desert_island" + ], + "key2": [ + "old_key" + ], + "laughing": [ + "satisfied" + ], + "levitate": [ + "man_in_business_suit_levitating" + ], + "lifter": [ + "weight_lifter" + ], + "lion_face": [ + "lion" + ], + "map": [ + "world_map" + ], + "medal": [ + "sports_medal" + ], + "metal": [ + "sign_of_the_horns" + ], + "microphone2": [ + "studio_microphone" + ], + "middle_finger": [ + "reversed_hand_with_middle_finger_extended" + ], + "money_mouth": [ + "money_mouth_face" + ], + "motorcycle": [ + "racing_motorcycle" + ], + "mountain_snow": [ + "snow_capped_mountain" + ], + "mouse_three_button": [ + "three_button_mouse" + ], + "nerd": [ + "nerd_face" + ], + "newspaper2": [ + "rolled_up_newspaper" + ], + "notepad_spiral": [ + "spiral_note_pad" + ], + "oil": [ + "oil_drum" + ], + "older_woman": [ + "grandma" + ], + "paintbrush": [ + "lower_left_paintbrush" + ], + "paperclips": [ + "linked_paperclips" + ], + "park": [ + "national_park" + ], + "pause_button": [ + "double_vertical_bar" + ], + "peace": [ + "peace_symbol" + ], + "pen_ballpoint": [ + "lower_left_ballpoint_pen" + ], + "pen_fountain": [ + "lower_left_fountain_pen" + ], + "ping_pong": [ + "table_tennis" + ], + "place_of_worship": [ + "worship_symbol" + ], + "poop": [ + "shit", + "hankey", + "poo" + ], + "projector": [ + "film_projector" + ], + "race_car": [ + "racing_car" + ], + "radioactive": [ + "radioactive_sign" + ], + "railway_track": [ + "railroad_track" + ], + "robot": [ + "robot_face" + ], + "rolling_eyes": [ + "face_with_rolling_eyes" + ], + "skull": [ + "skeleton" + ], + "skull_crossbones": [ + "skull_and_crossbones" + ], + "slight_frown": [ + "slightly_frowning_face" + ], + "slight_smile": [ + "slightly_smiling_face" + ], + "speaking_head": [ + "speaking_head_in_silhouette" + ], + "spy": [ + "sleuth_or_spy" + ], + "thermometer_face": [ + "face_with_thermometer" + ], + "thinking": [ + "thinking_face" + ], + "thumbsdown": [ + "-1" + ], + "thumbsup": [ + "+1" + ], + "thunder_cloud_rain": [ + "thunder_cloud_and_rain" + ], + "tickets": [ + "admission_tickets" + ], + "timer": [ + "timer_clock" + ], + "tools": [ + "hammer_and_wrench" + ], + "track_next": [ + "next_track" + ], + "track_previous": [ + "previous_track" + ], + "unicorn": [ + "unicorn_face" + ], + "upside_down": [ + "upside_down_face" + ], + "urn": [ + "funeral_urn" + ], + "vulcan": [ + "raised_hand_with_part_between_middle_and_ring_fingers" + ], + "white_sun_cloud": [ + "white_sun_behind_cloud" + ], + "white_sun_rain_cloud": [ + "white_sun_behind_cloud_with_rain" + ], + "white_sun_small_cloud": [ + "white_sun_with_small_cloud" + ], + "zipper_mouth": [ + "zipper_mouth_face" + ] + } +} diff --git a/public/images/emoji/apple/airplane_arriving.png b/public/images/emoji/apple/airplane_arriving.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7bfeb8010b98243dae11fc2b30409a84345363 GIT binary patch literal 6379 zcmVD;P)4$|xkR5ka^whsK;WSPy!6I0k7Vhx{Pub6 z)=M6f2C{38H(<;_)U=1TBel8DCv<{hyN`PJc!eAVK(m&Yy<#ZT>Znx!Ob znLNl`7d$331pon6=N|yT%WtYKNP0d?(CBk8go`vxJOP~mQ7y2$>5g{xX;}^ z&Q*1OkSs7AaLfo|A}}#ML$Q!28jJi$`eM&LIRnq{HgH|; z`s`lkqUMlTD1V8z#t`@|aQ;C7h_FYCup&%NJAk1aR4k_1#DM7ChBo-Y4O{)pFZ9H z=wLYfB{SCg+MM)}E;=lW!;8C2-g1|-W<1Y{h!3Q&uuFN`JUJQ~8!1;^;2#9QEANs} zGXY2tx%4yr)w!Sd-QV;3mgbgH{mM<3%vMb-T!ynQuiaoG1czRGyS=F;B=o~8Gb1dL zQ#7sHOr>c5;{bTt5BgY00Q_!=Qg-%J1HDJyx^crA7Oy{ti41r>CMDOPtl9_8F}Pts ze)g)K;#*euvZRKN6Kq~W%bHH?IU58)+l98UDA;lyK_I9Z-( zJJsu(!k#@L(|vcLD(@@UP#5?+190chzx&{WfG-eUvGY*RzH9D09+P#Q_#4`gv3A^W z6aHvDSrKBLa{9TO>)10?c=^r8r@qyG_?xUWl1yxUHRig_0c<{BOr~C57mu+##@l;m zoKHo4CUZrH;@=B^&wc)j4?5@y6Q7-3?w7^;*LJjdWAP}NieRSVAz3m>+J4f~&(Uc? z2@kEY0QXIax3{0T`crG>c2N#CQNR8IrW&>>MVxoz*mz+_OWe=OxN*Z=iI*HrR!6-~ zk@Vk168zP~f?~!nAQ7|>$v##D@^`G?xbdRax*)AV2P^@UuxD~q9fz_FeX~_g&lWj3 zE2*=m?pkC|?Cw21eBWsAfg@vCyRUBJ4$7^Y?npIlxu~PT$GL4xPGouUuKw)r?d&XL zr;hQo_}>t~^L~|HP|TQyq}gvTstC{5#>)Q3CG%CkX_u)p3T#MJdHgCLtLwewindOQ z(SR2-=m)%jsG($ZY{H!!A3HI4&o6#D9$04dSgYTDJZ*W3o;XihTaO6GzqtF<>>Ez^ z?Bm%@Lw`E}FZyM2fdZs-pWRXKy~^?jsYnlgsu1!rXTY&xIN3YM$IdEo*~U6XQ`PyK z5DJEc-|xpC2rO`1n^Pn^HRcW{)5h-p480RMy4qt*$;9sO-FfnrPl=p9xV0mWFW#g9 z2qFG@0ABcusRak}HkYifH$QptVyj~;T}qA>tz)^V!9_>zxnZqGR=D`AEj;o3EhNG| zO67`n!gbx+Tf??(?V!)+(?HaN_3?#PVs>m2yIkO8vLuyKek9AeovsjjO~dQ~sc|2O%;8=l%2U%7SnFMs`;&c2f;^aER4TUoMX30+-X z95`@*@v(8%b**D&dWQAu*Q;PMw70jD$z(KyVzHphZ zug@3qgn}V0>lzF#^#_}Vr(o2;Jn$zFg+k$=x_6flVxNLiP{+CLw%btKe_jBgz2D?> z&p(e9XYF8UXegkZzeYLw^ufVFcJJQJ)YOy;E&8+^8&-O7*w2wD9a_KU=_>BKrpQkdG_ceg%Nz$B(0cXosYfG&MHh z3&&X87{^zbAy%J22!mWUheVK4y%mU(%oM3_ZXu)O+qrZJB?Y3hvr`ABVCrWn2wF92 z+Gx3}#zI4%SE^ukcGf+3@Zj}(_U!rm)1LOUy^%VX7OY(Cwk4nwVc>7QHF)=zwV8@Gb z&VLSblkH!q_~;n%Sd5-yJ*dxdPWPW?*|KGv z>N~}TjT>}uD#_}6(AL(b{qcA`Sf)j7*{s>VefyrJ^3}C5HJ+66p$efK28yJdLEs=v zYXN{#crl@!U*zjAyNLE}Phfm_fNG@-`57u!7;hv&Z^p;z6Zdm$*X>LTlSst-ys&G2 zamh1Z7B59&jPyCoR$M&=yaq&kh8kOt2%vf>JJ2^eN6X+Xtn$uL*SU^pI7DM(BPuuO zH#{>lqm`iMIksc#98*Vs!-F4S(RMS;or&PKSz@^uI zoS=6H9%CZ{fi%(zKt=%=od*zVBXZ~meB#;Xux#t285tTRSE|x8D>zvQGi3+KIwp3h z7>EV^tXLb`;SclT;R$xkrSUmgmqZBKBZ8)YAQpg-2mB^TpilwZb{Hs`{PwP6tna^? zuoqm*uit)0XNL|X645n>mV8}Z9V2R*#1nD$@87SN+MW0AJ3iPD@bte#Ops~)vGD--;1nJ_q zFj@8E5iVYAJSG5-bq(_>ziBl$st7!mN!U`s2L(RU(DEzUE~#Rb*^LpRmY>zsNQaaJi|L})D=v=Y@z%#CXJ(w)*UsefGM&vkB}dq{Cun1MXRAYp z6ZY7V3&zvs$&U4B-QC*0#5Yy;6fbNki+65cx~yo1x_v&sPX(`&t;+0L`fASW3Uh31 zOs^8^ybf5sT^(3+bF+q|GQQ3YfQF(HHDCC`7oPH&&wS>0DyhOk0Ivg6U>F_@92_U5 z263^xe##XWq=QKl7Td7cia`sK9Fih6n+M?F6mt4MJ#(e10hSxEK$cRtj*a07P(HPb z?CAq|XCGL5L3ii78#iwM)Gw3GM?#S>Q#p9WCJ#?s9pdz?v!t_QiGtwUD1=y}g509| zwYF^wl?!z6DhE(2j3y^1snrhZ8Vx`x0=2D|)W<*m@x1C)uX@`zzxmBit7Q0a04xkZ zx~?vV(H}No2r$heuFPSGRy=IQbhjeJJP0UK17Irvm2!!q?IMJQ*Km-ANja|^z3aQU z1A8du(jS{C@uF?#T=4EKXLNn{=3^6>8=pbiNbu~=43~7r7)&{|Eo#w9a~wy%MZ+*w zsDQgw>rw%psoJ0V0TL1tI{DB}IOOU(qGgSNcAVZB;OwP<**WI-aRj81NMLQB^c`&s0 zV#c~&$dxO~T)N6)DC4rIwM7S`0?|Eys_;;)_EBU3D^$Ni&G{|rn`E7WaX~VfY*ipo z(CJh2)0gOC`0%4#)2nE7!q?%7D z07{~cgXsxkN}Gvae-LM2Csv{zDdko*hxc}Occa#3IyyQ!5n{kejWQfq&#PbgDy~=` zVPLkT6wpdl+SsmJ`zMJGKmpK-P|DB^VEOXp`rOW)JA=oL9lPetGtcxkH8s6kfjFq< zye@@b`?}XLolFAY3kT?W`Z=t9%C`S20EsYaAc_bUVLIKown;VDMxkor35F4c3HH3_ zQVOXoftE&1yuGdM8R|RW=_)b(sA}7{I#ru$GDTXLy!PWC=ZW3z49#R|SDCy$+=L;8 zc0vP~OEEe&ZL-S4ir;QR1q}fI)s}mXSa7U=EiE`2D2a!do2ae8@D- zuLXqfEv31fI##6pS({k(^sVG3Gn8lZfD4Gf5CADbq6c@SfwUbgQ{Zom=!BNuH;gls z#j`X9H`Q9z?)G798Ac1t}!B z5^aX@hyZ}v*f8&__S1^{073EaB-N2D(r*yxYQ(!JMkQk-$`yp60Y4bPW!Jv3RtPZ< zz`?XEJ#eY=ADx*6j3Y@BMPFopW1#9ID!WG6QBq z0LcVuAObCcDq<~b5>UmQC_Jj4MkveSftc|7)OGri&5Pdfd4orQ`kL- z%$9-acAHJDMQSA3Cc75G0XgO4k5KX0BF6Ckk>S}Jl^341hd*3j@r`S@GTn+~0ha;@ zr0iXnOGzwNLZ?;prt{}G(BI4ZFWLsQn8;%SUnzv7o`fPgiFPb&pHZ*D!B)vXFaU2QgmTHO#GNMb?!9&6jQchPLZ1alK zujOO+Uw~_G;vxSzli&7^Wotf*O0XediDODK)wuvb*|j*qacg>9@W|az-o{7&(c#tC z-J27N0|~r=G#|;A`pCfm4r0dbm2%O8ui@0Kb6oMyeeAgO{;bi+WLBG9Or-T>{k!kh z1=fR0O4wVrdEEBvc=`0T{AS-~-q$^iqO48EB8eyyLM}KHs@A)f(7t}bDeL$1p`-uH z?A#=;>Yht)wqPnNeWElV2Hu)NbP&p7Y>^kr2T%AXC)9o3wDU~9Up%}cLZp?m{T!XWUB0q zZHjy_Vzb5SSQA1GAw#Q(k|sfs1RNw0lE7JzgJnUL)zAvGhtQTX%>fFKWDB_LlL}%2 zk)aGVXI2A6QK7?}RnjMh%wk3ZoZ>raA*5WiPMr|q2t(bXJ+dE+j%%buMUzqutfDnN z`Ojbf*;RBs2(F`)kFZdu9bJ*>lEnNqd=_G?NdO`&RGGa$X=68$8+Yfoswga0naMuS4ZJl6B1ljE@#nvFMP$9IvRu=~g+*B=0cXf@ zDe3l7R?^I~L9Dy*Ckb!zqKuQ~xh&hnCd)?J%~a{hAOHBr?g;$)anRaib({^Hw8J%# z<;dblntubde@7gn*$x-KCqMYX4~&47fC6kBb~+ue!i*)6WtmlFW@l%8KfluE`B?pL zubzR?)I6b-g>Z`jzg8*}UctR}Ls6KDCx)BLuiH-K+R>_^2nOUCHBUI1m z!-ki~8@@(_*!8HcK%VDzzG4DKH8v+;CCz%|s;jQDPi3PX^5CAh)$K-gefxl6J=Y|7 zCGxk@_o$F!b^k+}DGy-BjvZD9v^Xmz;2Yogh7oWm06!m3y7|n%`;P*Tz2o2V`~Cj1 z;FcrA@A=pt4K*JE{=DI1M0PWN^ZDTk`0jVVd-yqEJjo*sGNy{A@8barT?{B%m7YcJrO4s!*B)h;RRe1VsHo6UefvN%zI_cP}2_6=~Ax$+JK6`Y!1D zL*<$W*wGu*+OIGYOaPxd*p=_~r3Of0aN-cHE1IGY9$Qqs1$^v^9BD?z;n~rL+afG3A0+kd$ z3q6_s&|Q5JOeG>!<_5~lwD6Qudi>>f;V-vru>E~Vnc0SjAignisi6r7wFDyY%u{Ds zs22G8m76ItAq$B(Zw^?Ul+^P^!F&x5+&bj6^*ug!`8wwNlS~xR5_h>vCW#EZ^8mN6 zl+)HJ4?n)gk8fym$)2@Lw@O!xE2AeTec&NB2e@@r1+HIEe)@o$dC-m_v;Vw_Q~rKW zbl75gvPR1YfaFWTkpM;nfN=G}f|s0r6Q6vP!u8kk;NPCeANL;1mWg>Z$Wk%Gl^wlg z76>Ri7Ynve_qgCm3lMJNL%%L~-F5fiq~f53Qg9VP5b$Lu$bu@&z31wt4K$=Wz4EDb}{i#JnesfUC!cRDjt* zMyFHrt+W2cNyCG@^tQA4-kxo24vQ|~1X%DAS7RlrYGH3Ic<)&k^SsWDeEQa7dHc>& znT}SUY%E!F!uua|CBi0Z25C-Fli`87#n#RoyUR9NB^0?5Yi%x%Uc@v*pCg1!l>NgN z>x(%Ct&GL~BvUe^28blk4n!b`B=VD*%zm-T2wBD2b~#eS6sz4n+4-E|hjd=Yq@oP! tT1Gx#rnA7UWrxWs+7QIaMkYkq{eM-2iE08<(TD&5002ovPDHLkV1k%Ubb|l@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/airplane_departure.png b/public/images/emoji/apple/airplane_departure.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2f9379efa185541b7802232f73ac42f32ddac4 GIT binary patch literal 6298 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 U=^)OCJ^%m!07*qoM6N<$g6}0L{{R30 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/alembic.png b/public/images/emoji/apple/alembic.png new file mode 100644 index 0000000000000000000000000000000000000000..1e47e111a4405c5fffebbce280f68bcc3c5967f0 GIT binary patch literal 4687 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/amphora.png b/public/images/emoji/apple/amphora.png new file mode 100644 index 0000000000000000000000000000000000000000..35f87691441dc599e4f81f5e0b99dfe492e2bec0 GIT binary patch literal 5081 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/anger_right.png b/public/images/emoji/apple/anger_right.png new file mode 100644 index 0000000000000000000000000000000000000000..bb53b70b07173536336f93d721483f7efc6d92e7 GIT binary patch literal 3300 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/basketball_player.png b/public/images/emoji/apple/basketball_player.png new file mode 100644 index 0000000000000000000000000000000000000000..244f3dd463adc4c08a20fe5acfb9412d71b5f071 GIT binary patch literal 5129 zcmV+k6!ze|v3~l!)*~#^4Rkn*!bx@CL_XFW9$b75@sKKY(RfO{VEP z-7w7km0?6g>p`vER@b$E1F8Um)*7Wu48tge0+gYYlK%~1?^yrvZ7;t7r4;`R5kV9r#N=*634N>>ALQ9B48SZDoH|XPdv}nN`dw~Q0ldt0a^?H z7(qndCiriPMFKR%3-qMIgaZac;~LMisH=)j4+NZRZQG55d{Zey48y>29P;@zxm?cY zxvpcpmIc^$k$;3~2#K8fUjOz2-@3r&6CV%r@vqw4y58o?YaycY-1I<$wC`h~DWq~|% zDm{X#K-aKhcKu|{dY*^t(Y}40nT-*`K?9@+x`-M{ zb8t<8_743(dr|FZieqW*J-uqpN!Lsyv#z|2MalE}ktcic@?#B92|V$G#3Z&^+Cv<2uugmhwp?zYDn z>e)s(RzXE|Bhjh`K*%RYdE4wZf=#g_D7r`36U8rmLf!D;d!m;<@rpNr!{2rsdxL3N z6!Te<6XVRD-L!7Wv7cJCVA+9af3!Ta)0m`2`x))uPI7b*yO<*!ug2#O67T&bSHAB# z@R@)DG~RG7J28-3^yw#8_wyg{^Pk*2H5stx*j4NeT5E!q&^cUK*paJVg<&G%p*$B8 z6W8;I*EAA|RWdO)z;IU^JA1b>G1x_F$Mer-_D}VcI?Xjk+z*zCSsRK(a_-%~`Rlza z{xbngjewLBU~f=LNMvlRiuxZfTYM0?^aPpY7!|bv{HDSaqZESa4^mavOehjB3+W9; z$fd?t%)6xR#uq*{`u$Mc_r*v<=s02lLXDy2!XaaVB7ZEnTr=5Hosvu$xMcA?a#AlS%6qY4Sv&4!37bpEFZyeoa%--7>0#X zU>7o%FTGMX`23;cpZ(~-`4vsx^=4g=SY7DLTh8pi<&dAw?D}WlYx?|CC!l8A)0l=L zplwD2adyU=DEK3Uog98UizwrtZjKy0bLaBT!A?R|)6gD_bie3%j+0rqbiazqx+b(0 zpy&!(43skP`Fw<;6;wCQrgp}{%JkUaM;zO}V(B$aH#~ku&uG1?fA6af5RO?ldzxeU zI|S48kxxxbT_^ah1q%rJ48p2NXVE28Q%SGChK~AWq$*|*%Z(!1gMT1m-6z(y_2;6C zf4jMfTifO{J)Hk}Rb}j=0lW64LykC(c3D84aMcU?~`nMj1>d5l>I;T0kM746?omy=%@mmlKp_K9RPK1;Qb|65;D>A*SjbyTyKi|-}P(`fI6Y!sj&j8PXkvx4b zBnsQMX5Z^+sELQlH5~|rnO&9pRBy+#@2G8P#3e{Bm84Ty^rrIc*ZM2o_2^Ft6bt+| zt`_ge%AumvMuSOCyCU)UEg!9z6$qMtREE0$`t#xsdRk6=|2@^irt6|aUV)jQNZIsN zH#S#=!seHisXhw==_18phwPZ$v9mvSXJ238ny-$Z_)>M<5I)Pqbu|TBXs(Oy=-Jlu zK>PF09Ia>WLr z_YskkfPe@nkymaieECI9pE8vEAe(kbC2X96zSk-0^@W`KK+)EZt@!qY2Vez$!@PZ3 zSh{i_yl|Lc#6{sT-uC=2JKA16>X7~py*iZOD-87QhS^c zC;;4IhOJMn?C&kr7C9bv>3hDtGD3*#Qt1*~mV226Ou zbG8PcD8hS=Sj8tVx|sLA;~n66ugq$2BH^~=^7<2=Cy$t>@ti{A3jYX8L=2@=ahH#V zuqu}`puzU2Yl*8HXI7d9Cg2H0O}WMgoKo1(X$uL@KwF&K;mU;>Efi$8+Kl5-NT)$- zlv1yZfd20KujR98w3DN+;Nl8I4KS79ppxlPFkj=T+ws%BL&^v!-TwO3;kfmdJK?^Jn zC}3BV(UTGsRiMxA0Yecs zm8w)Uf`AAM7A)lJU;jFZL;}zAUOoXzfo;1KY+1T!cEw}IA33A-l=m#VzIs8;bu$`` z=MS4^+%alP-Eaw?S4}(XrAzAGv1svP9((Lj!r?Fj0|SUiSwbnMUV!!lQ!{h! zqS`IT9o@A5iW3fIWa+!8d&}W`@#q@fv!8GE%v!Z^!j{-R0hs1v7b1WOghUu{%58t1 zD|}?9Gg;WqQuNsWd#%}4iuF0+Ia__Pvf3DPL`Zs?K}U1kne}{VZ6h`FD~@iSAHB8p zyws-QE9Rg1^yjOCBErbX2+?RH9F0Vp9M@eXBC#nGkjl9%m{;|a!w##CG*tFx` z6psxH&n1O%)Jad~@Q*r_5hl^VfK~vQkUMcrmG7$S7I4I;X0d&4m^;#%)~xWf%}pL$ z8&{xVs59>!K69S$id75Lt;vq$&U{Y>XE=+bY;c8O)JOE7^J?nnEU)|0H!fMZ_QVrs z)YjHkmjYnXVLYuC!!F zt*IE*unVsoleh)1J)q?+YmTmB&Czilx^4K*Q@=a>XQlXYz<{&}VhAXn+OXAr>O)^1 z;YVMo3L-RHKGh<^9Lq8eal;M!m@NzE`yCsf&rd^rz1~@0Z;XtN0u-lAz_y8eMs_Ax zF<;XZcBu2Rtfx z=9!8gD<;VSJ^>Rj009<$ZKQDM{~XithoAqfqpiIi1W;08xBmWfTVsu@{`N%seosI3 zRPgY_4>z`TbO3~=tO>j@n%+=Rn2;rrB7+kJT6YwQ1uTx7=_|?cxTo8tV_egl=BaTQ z9??*gzyAda@H{Byz4elF0SyS2Wi0y3Co87`6eeegC=nEsIIc?&IRCu!sH?AM`t<3{ znKze)hK6K#X3JOaYJGgwC6`|MJ=gQBSUis3=L4vmG64tGIH~8ijeLFGlRKFm(mX%z z(v$H}N;sgwAOvjb)AZ!!OCbXcCL^F^kEQc~2cv*(>t~8-XBaJ@!SX4kHOq%IRD^@X zL;muRsYOs~cd9C-$mjEj2(IH0kH;At8shGI?#43B@0Ok$NhT8bCIzS|6HwG1-DBBH zf45=eXPqx)2#IiSr_E^EqifV-ETKu~VyX* zpR!wVJP^SjFwj~rz2Mw)`S`cK!-YToIV}gYFrYzuva9Kor@Xr`41-`W#7#HfLi^UO zM558$(9qED`UeIm6bbEYwz#x2Y7hOGC=Jv6G4k|jd=#exCN zVWZlyqmyExP4$N_!@`lFP*cguMkj>|t9mhSmvZ7+0@gMB*X%T=|Pk;p^lw!cq z6cY)G$UhZTDAjH)^bG(Ry-^Hmg}V9=YK zDk}u< r{|)j6=S=}`3V4I_rhqpEyutbZu0tsaygxa000000NkvXXu0mjfUCS3E literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/beach.png b/public/images/emoji/apple/beach.png new file mode 100644 index 0000000000000000000000000000000000000000..680140501627da8b31945d65fcd854853832dc21 GIT binary patch literal 6293 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 LNkvXXu0mjf7CVBK literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/beach_umbrella.png b/public/images/emoji/apple/beach_umbrella.png new file mode 100644 index 0000000000000000000000000000000000000000..8e380d70dab2ff2b37e40780dbcdb1c98180e632 GIT binary patch literal 7094 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/bed.png b/public/images/emoji/apple/bed.png new file mode 100644 index 0000000000000000000000000000000000000000..94261fa5a7f0a26a2f918a9f39bcd4ce74ef0707 GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/bow_and_arrow.png b/public/images/emoji/apple/bow_and_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0c8684ddd262640fe117463f50cc6cc0aa7c43d GIT binary patch literal 6596 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 xgkkup1Mq*fN&Me!&j9cY0M7vM3;@pn@E_@ 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/camping.png b/public/images/emoji/apple/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..463e13d77c20b5de2e9e1169c738fc95e3fc4eab GIT binary patch literal 5693 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 FV1k%FC6WLD literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/chains.png b/public/images/emoji/apple/chains.png new file mode 100644 index 0000000000000000000000000000000000000000..dadbfd85e56330f069e0573a95064b6b590bf2ad GIT binary patch literal 4581 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/cheese.png b/public/images/emoji/apple/cheese.png new file mode 100644 index 0000000000000000000000000000000000000000..f397292e14ce1277a4937575ebb64e438024352a GIT binary patch literal 4706 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/chipmunk.png b/public/images/emoji/apple/chipmunk.png new file mode 100644 index 0000000000000000000000000000000000000000..e3d61a3810d59ef79353847bb66e7e2eb8491f12 GIT binary patch literal 8137 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 Ef+mjkh5!Hn literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/classical_building.png b/public/images/emoji/apple/classical_building.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1bc910e8c874a9ec07460798df2a95c03680f8 GIT binary patch literal 5950 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૲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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/cloud_tornado.png b/public/images/emoji/apple/cloud_tornado.png new file mode 100644 index 0000000000000000000000000000000000000000..df48b70f5db082242cd44642101642e947e13f74 GIT binary patch literal 7365 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 KMNUMnLSTaF(gExM literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_gb.png b/public/images/emoji/apple/flag_gb.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ad5e4a9c966a77030003d01dcd3f1112fde0b3 GIT binary patch literal 5805 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 V%mTl!uK54}002ovPDHLkV1oU&7M1`2 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_kr.png b/public/images/emoji/apple/flag_kr.png new file mode 100644 index 0000000000000000000000000000000000000000..57757ef4a9a68ee7694de8b234dc1d0f9be6f0d9 GIT binary patch literal 3853 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 P00000NkvXXu0mjfg-Vt^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_ru.png b/public/images/emoji/apple/flag_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..77666f357dbb4c607e16638c56f28d0595033121 GIT binary patch literal 2834 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_us.png b/public/images/emoji/apple/flag_us.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f937808687366ff210ec199e20e3cffe06546d GIT binary patch literal 5817 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 DBAGd@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_white.png b/public/images/emoji/apple/flag_white.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6becc25313dfb3a39a6db73bb4e0c692ac98a8 GIT binary patch literal 1842 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/fleur-de-lis.png b/public/images/emoji/apple/fleur-de-lis.png new file mode 100644 index 0000000000000000000000000000000000000000..5f98df5b2dd67fffee9542177821c11138d43969 GIT binary patch literal 5364 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 VmdY0yA+rDg002ovPDHLkV1ic=0%8CF literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/frame_photo.png b/public/images/emoji/apple/frame_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..75b50f2600dac0e9424995f0c64278f2fd05a8ba GIT binary patch literal 5020 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

)Gf&YQx2%5%IAOL$pQDB_I_v;C5^z%RRt6%=| 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 LNkvXXu0mjf)g5tX literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/hand_splayed.png b/public/images/emoji/apple/hand_splayed.png new file mode 100644 index 0000000000000000000000000000000000000000..f26ba2724d71b0a4b867601dcb7987acf9d22db1 GIT binary patch literal 4605 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/head_bandage.png b/public/images/emoji/apple/head_bandage.png new file mode 100644 index 0000000000000000000000000000000000000000..f3fb32796fa43ec490027d9ae35e7a40f746efbd GIT binary patch literal 5719 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 RAx;1Q002ovPDHLkV1lUdP167X literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/helmet_with_cross.png b/public/images/emoji/apple/helmet_with_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..e93c2897c7fad65563375e12274da7a7cc17391b GIT binary patch literal 6377 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/hockey.png b/public/images/emoji/apple/hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..b6fb640c5cee2466715c9f7d2c619802fb2cbf16 GIT binary patch literal 3498 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/hole.png b/public/images/emoji/apple/hole.png new file mode 100644 index 0000000000000000000000000000000000000000..dba53ead68f4eb4e84494965699f0cf936281a00 GIT binary patch literal 1988 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 pSI+YNAz4wyv9Q_9`a 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 RE|>rS002ovPDHLkV1kdu!ioR@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/hugging.png b/public/images/emoji/apple/hugging.png new file mode 100644 index 0000000000000000000000000000000000000000..efe205463bd1ad40b909bfd1d0e1be12b6cd3284 GIT binary patch literal 7156 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 Qt^fc407*qoM6N<$g0tam8UO$Q literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/joystick.png b/public/images/emoji/apple/joystick.png new file mode 100644 index 0000000000000000000000000000000000000000..198d724907dea259953302c3f1142a7de288be3a GIT binary patch literal 4867 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/kaaba.png b/public/images/emoji/apple/kaaba.png new file mode 100644 index 0000000000000000000000000000000000000000..7319c5b0657f77f6e48a464c4596b1640283c8fd GIT binary patch literal 3686 zcmV-s4w>tFX%!!*siYPH& zNq`-NASxgdiHt>~(QlLcZxe+SMHP<-l;c1ikn&lU-}ul0TyZjBkvA9c5t_h2yt88= zT|X-7_!3dZmk5luoSzZDN1!|)4RwE~^9!8!1t0?4aMG^>cJl$6EN;8Mt9cS^2L{qa zP3arg$n$HYY5t19c|{cQkX%13&>oZLZubV-9l!u^?MZpx1|<22OcvT%Bnr7k>pbrS z+ZnT68Qb9@eS=ggb-t9z`2y(&#b>2V?iCmh%Cl$WoPRR_Uk7|Wa5>=Tqq0*Juss;1 zDNuB*+n8RMisbu>Uq0NG;W0_AJp48R&6p#}XuzT~EzoVnZN)j5Y;MWbyW zhoG=L5VXK!oB*OwfYz;4wqJMdyY4owfDjdkx62>-e}=r4$=FbWp;U==r3+EgDF4gt%+bz6uesn(jzt)_YMl{_Pn9s-)fNMC?G@fPOp05%qR zH_B4hWnr~Ww&r6sugH`gG8Gr)DgmMJTL>6UR0EpU2^KU!z3Hy=0Ru?Jg6y5_Bb5j+ zk_t(7L->659gBL1&|6vXX=4OpAO?quvrI3Va@g*VM$p(Ac)4bW|V? z?-hVXZ{m1n6AUCJ(1f3z<0%G2(%H=|$-GXfQX`Yku((pA(X>VS9tHX?Ohs}JGLo03iQb|VQig2{bDLfQjF$$znvJr3%$XnSBR0m|xl;5)7dW_F%wb=V&j9NSJ6WOe~dPeZ9odnKfQG zyujLKiTyJhY;2VPKNsEbrHm$FEE!-drPCL(8BA!54oC_4EG(x^z3C-aYKTJW)LMoF z*TQb+7#XNA5z{z#&V)I}iz!4n9|*=GNI9t|Dyxcogz`bv=VCVRPhv_#9+DYv|2>z1g)V0we@ z0KWFty@^=JlmKkWPM-C2m13pI3$M?Jj5I<)Ke4c1x_J`WO9g^UAR41ww|U`>CDt=5 z%q-=ZU(I%{wQ$fU^K=TO8eh2i46Z(Jl!#g8#`D(rit|GJ?!!7y9&xyM(jr%J*eu!{ zTy`imPHb}nah;K*0O|2D99M{1=r;rOcq@$dJ9tf9vfGwSw^&}wvA9}5mw6tKAy8a; z10LCO16(?4bO-S2!3EoEDnuq|xYE=j3{J#_dJmb+3Pq{QT)DxKr7h$Ih82>@9AXbh%-dNZqlJj!&WC;}0HeNL}m1Lmp<* zZC;yiN#+$^OH|Thh*CUE4a0CE&QQQd)E8veq%CKcO5N$MfR_$us|uaXTvf7LW-C`_ zyMfMND$4G$9?sg?$73(evAS90hri`ge&P?G#b+YTOK0CqnyrjRvt<*L1!^eLxte64 zLNXqdQmJy&WxLUgDF5(ZPqKB%IA@Ga2%H+v&w1F>ALp4lFXe_tUKCd-G%ze1l#5@^ zd;6l2ML&0*>vF|Zn;-gDjqmwVKbB#zPt-BH1@q~aB(6dtq!aXehy+ZA5?%o#WfQWQ z=my~aXJ>PCv0W1ISKfRkrhx>h5ej%DFpHNCEOOligT#C`w_P^Ok%c0Q>p3DKbJ^}> zoS#U@kHa$eJhQ}~{MR95hoDkza?evo_~!@rfhWSj(j;+z9YeP%)lJqP@Nsyx&6y)E zd#Cyd_!PRM$P_9RiWT0NZ*u;q#g$`u`u$CAIW0**Q`~l@&1GXIHOEV>?PEUU=dYiT zWM*A9@`_T`6{YB`Y&H1iAL|0(mdkfV+HIRhUYsKoG`ak&As%>cfw13XwAbX=f@HR7 z(`vg!Lnh@)lbJ?~^sW?#=Ch3SCz;qW%$)4Y2j(lRq}N#8DsyZx(|HR+f(M{lZvoJo z@X;5M=k+#*1QC=Bujg#~BO1A~&G-Gi$hp_U&R$)bpjUcCl)Wj9dk)r_-n7sSlfxT2 z$zYWi4-}E$F+DI4GdR01NUq|Q-9&NY=`Mfzq~e@0oo~1*+`R<8aKlvefavGRR~Pv5 z>!!GHZx0)piZr|mbJF-M%VZ#xz!WJA_r-YSSe1ugn3D$6AT47u1?d?J(%e>afa0B- z68VEPUx5T7AT;g7_4Hbu{R=LRtKqXmz6q1@lpzX1G8{p2!?AUT@4Pk6?x6^^a+{Wo zlue$)vo&He;Hxeua`kSP+07UmC5NxQM0E$S@7St6vs@6V>!e~nk*k*-(#bVl0v_rW z5H)7k8?0?rSl^nJtZxD!!2`&@m*3Y{A=h;~udWCTXt45c8{k_ zpU=<#JiW*t|K}lYxM*Bzcad1w%WwU|8zSu-tyY^4(mH{Q18o21*8zfZ0TjAi`>hiW zV0m0ojt264cD2qv$+)95LOxxZoyBmE&Ksg0R}XR4h~iHkuW;pFoeOsNbXUNWuca$1 z=`sL?a+803YyjOF!vC%a|1sVWChlmftK80y$6siute{YuW z_~|YHI@ceybv|l}^Fdj+pK99*kFGP6FyJEy`aOLb|A_w9CkKEm=Ccjpa|L{^fd6CH zEN~DCf*5)c?te_aH#9Fy`s2lA6}Gb-S@~@S$P4_o3P=DJ1={}ha5jkYp^oMHpH3BE z`V51g4#Hw&Bw!XOGq zio*qPcju^_gD4L1;O_2jF+9pQ%}m{0*yQ^a+RmHx-KV~xieLhaz#B9}2Na}g9}vma zUnFxDFrO>qQp;v0=l|0G;ic&-`t!jA7*=GdgKp@8A!t!iiW4aSKg@T}?3>A;L0YYN zUhIfd?3eZ)-lKEsW!`K#M2r>Y9wWUYbft{>Y$6>nsKT^EPh6rzaQ^O_S!-KnsXqw# zgnFC)KEbZgKf^O{jlIVCKW3|86Hu{YI||$?Ghj;<^r{$r&<&mOyl(HCT@yk5fL{c; zO=i!S+a%CE##RXI)s7~f;2rSnC*?4Br%d>W(xLQ27xX}Buz=0YA&^14ME)eeUD}%j zc|?DUxg%b(zQYnDSv5yj6ne}m@bU~|bLfy~;1@gmXnnU1dY;#FI4nHWf|K{m`0Wxd(1AqrY1{F`b_y7O^07*qoM6N<$ Ef-#r(Pyhe` literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/key2.png b/public/images/emoji/apple/key2.png new file mode 100644 index 0000000000000000000000000000000000000000..0fe04f3d27ce3211ff93dc964263af6a7b36f468 GIT binary patch literal 3543 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 RCf)!5002ovPDHLkV1fq#u+9Jg literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/keyboard.png b/public/images/emoji/apple/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e6fa7ee62870b552543dce69af05f46207e762 GIT binary patch literal 3863 zcmV+y59siTP))W^1s&%^hR9Dxn z)4i*@FZwob*-jZcTcVaNUxoHo)giBhtqmKusLr(wYe5De4-87$8)Rt#4+@V{R_cDOC~^Q)JcZwGtW{fj&`MxoVAEyy#)s*tKgf*^)0@xGak? z?{h!yKX|NuJb4-`DXF4_k03t2e%6>RTX)F*1BZkZ7oRK%n3ohC^FSs|nkp45Rb7}f zXKwS=*Wa2izjClCT%@>ip~A(@&w28jYSn99IY1*enl*c_*lERzRWD4uZ{Gn~vv$2D zM?^--+<6PcPKyx`i!`W9G=?Yx8$D*63>-K_-@8CwxpIwk=-5S0p453UKj!Vw zS=O!JXpQODe~^qBJ3;;AxS6x&NT<$SwSD5mDLH=Pr22gdW2a1=!QXKsQ>JXc$&@*p z$(k*fvia%fe9B*Z`3+Y>i5WBJNQ;(jByavgQn*M7DOREsBG*Jpm#H9S%U70s1qw5g zQoceJDO0wh>R{DKt=jdZM5(e;sxNRS&VE~RE zJ1GGHSLM=WFS+dDE#5wUa`>0!6%cq8eZJ!1=_6~`Za}o%#na12yuE#8$IjidbJrg6 z2VSs`UyWbP*DpXWUh>p2n>KG1_p=wYO}hX{*|T@Q_@K>gb>!#?0q~;jk1<}*@z?F; z;(C@gVas2(V5{uebAV&C?>N3T09U-=!-b2UYIij-$<6(|_y=5(z$-zrea9XdH+~X= zQM7axfM3pBpD3G;GGtbM?X@>dg^E?C0=?xW1miyHn4K7q*w}bW-ise{>a>d`-@J84 zfWl&@^&2(;$eukH;rJH*0874dHCPrcTKX%z2oI06$Xx-kh>?y7-A>R8+`4C zCEvOo!flFGQ@?B8d<9LZ(&dy*nX(m>^W`sOu=MvJ-N?&mC%*3H&D$(FH6=x+O`j!p zV(`wMyI{#&2}Eu?@y8`5CcOY;2M->x1?~2)z;Eib84?_P&5{otI-)_b5x(w3vD1>J z%aIYRAnBaMftIb>&ieZ6Z>_Db>F>4I-&96~0s&wEmhrk=#*Uk)ATwd&6zSNpD?n$U zwkIN`^dB%-I(F*HHgqSe9sy{`&=Js?tZAoD-vJ7K<0nj39yw~Pbn4QLPs%z+kDh&` zZ@&Swt9`?Ujg&53y3?Me)46MR=?}o02p!HfVBlcd(RU7>s6ahv@KE}r<9hY(E1jW3 znL1;}j2F}b^yf&X%vr43N0&j-;-$!$=FFL&$gkSCNegM*v;{z@8QRSWSa5QXj2JnF zKm=|ot=hDg(Jv%@Wk7KP_9gW8J`2d%aTSYNmGWdZrc_QTWtk%bvpkp^Ge7v=n>TRUSQl zBB9|?5)v9Ip<$5{79Jy!kk?_bEypK_T_w7G~ z?KCs>v(LZEo*_dlSA4iawQC>mJ zXxtuHZ7s`Gt6tk6Wg63}bvpxOG=2LIn!IAAg`}^nrczVWEcwLAQ?hx>wshdL0)Uff z$rmqO*3vmWLMJ6zK*-|irFPJ8^HE4eM@L(-hnKe&Xs@D>&~S`d!mZu$ z(@#Hll)^v!m>1jNa|2-7xf8WG_BHnUXo3dYTA_^vAOU!Q0}6tasRN+tr+aba$T5iQ zB;9w^;TVD#Y$_%ULO-#9IwSA|m_i-}kfoh5I&P3wlOq+dMvoq+AWPfS83j8W-?#5T z?DY|zcOeDsGp^tX4PehS2+$6EfAF>a)S^M0%%V8v_(AWz-`##E_V!xSxA z!pxjCH{ig*BXDl8bO5@uRP78j24g^1Me~J7X#^I&Blt00&7QMB+5>#Lb?>eHIFS+9 z2y{T^&X{y6YWVrEL7iUc?Go!_=yN6gbpI>XLF;1Nn}W*X`s z5R-7eSO}d?(v^1L7j=f$l|35z(B-PCK#s<1y4u+qdr~dfQHSx6+RzvZI9dv*f4GVr3l)u@pV; zDgo6mp$tEk4*WL3-c3s;=&J2MPb}0}oF%tv-99@~rZLE&279mtE*Rv&!$~Sa1P83jrLyNh8e~4iKAGU-8-Tqyg?pSJLXg6q8H4t4$^_kuC7*Z|Mx;d)ne&=Nz=hN)Pf7>QI-}D0OI)eSBvDF8T?g zR<(zB7O2v1htCSgWco^s!Ya5(OzT>%d?jO0H4y-}qj&*0Ev7Sc9s?%Q7$zBq=U5mT z4}&8Bdh=!1?)|L1Xk1YqS5$&4EVkj~Xw_#%LD4}cXj1`f8@7cbBaC6y$S;BFYz4Cv zxL~UjS2)+~0tE^gJqF_tw}9X<{u4HrA@+Oto; zuAR1`qKl1F7hpAhy zelu^M0J(%5O{5MD4Fken=Xo0wTt;9*^)kZ8#~1r?g`)3W_C-X>sWUFz$B;vCa0$Wq zm$3H#Ilh}-kM>?+(>m(yVzaR$_WI<+*^@W4J*0rSj{@2^Dl$jj{3~2oY3R zi8-pS9?G3;ZE~0A&#q*)E!nPXvAu#Lr?A8x*aOF?}U*Np*sLPF28Ux`*^;F4*SAzCTCx$ zqAX>WwA5pkxEmTFAr`C5eztkP0FJ_Z8+4l&g_ak}yBo_RPcNuJ>)K8HC0|wVIUw`w>XJKJs zEV5a%BQ+&S0+@BPvdVm_tWW#0L}n71K6G@OnM}g6HFz?c>EnYZ_<*0MPDk^kd&i z`+G=@?_U?rdJh01*q!d=%Z5!4$CXjT8-JNkoX(;T-JNc{a5ieV@xpLiN9)<)#-x$P zmaA8@qGylZ5GLD29+qdF$d-K2`*Qr`tsUv*u~*AaMsN(OG;YKG0fdl+kLL0JhRO=9 zzwK4mG-LR%z4k1qmEP|N9_r3ncRrLiNyc{q+IVsyGSocaz_)9n)TK|v%?Uk+C52aj8nD5bj&d9$IhAVmD z9FVt#f*?3oam3+?r)i7&ByRc_$R_pErAO}$B#Nnl&9ejJDO<zX{X1ZgSk13%UB}sxx@mHLbkCbm-`qUyvBy&O?&r#Yx^A zZcwm+4?M`AKf=efoaFd4slY-pL1dnyGe#nZPs(S6Xx34!9fwN0qOjT_fTh}serO*FBiXi@p zWorC>`FPTW%gfWE*gslE`Nq+g4o;S+(V-kvOuKrH(KLddA@c-S7?`@Itu^_v#HT$};&2FHh?*w3lb=uSq^$nI3v{1&V4O**tfDp#hIwmEf zcb9BEKGyrkP276*?ZRkliB(E;`m3XaAIBhWa)N2rE<77Hv(mi%^%KL#A-bqhc`DF={eMF^4^xZGQmM5$F zJCSe<;F7dA7m#p79p3aw3}=AX19p(2x*r)Sgk=Q$m_p5(HKXE-RV!(K&i131hXNKd z`wZSHQko1>Rv5d#2P|OGz3|vsfY}N#4p1a3@KXs(W7+Yrm zam-@E&O`|=ISOLiFB4LFVZ|1qeHDz?7kyA#3ZqWcb|eXcj$E^^!F%z>^4x=w^Mgn% z>_n`RTAuEYJq@d-+M&>>|3y9g$;z-;M;8Aa{VSQSU~?e1MY}@6F$SAYR$#%X#%V0} zp~>R2-6n7ug*4||c+CBW?@FkjFLV>04bUq6jVkjjKyeB{@(6H(=uW+2ou4CO(`swX z+>=Wug6r#^PWe~AiV87hP^#;)erU?Tvd8GL)njgHYDk?TE)6U`Rv&{gGUw_%)JFK) zKR?F>clR#Cji$$<&2vLqV|07NgIIZNYwPYEF)Q2L)*^K0n=kQ*2|160X6LJC+vby2 zBWFh2T$vsg#9t{38DaR+6HUV>WYU5RXA&8zuFXc438cqW+lZMGjS+Z*UfFnDk6xes zhXqHKd1C4^|I{{>+}84PmvMf|=e5bW=Ba^wre>N-*F36=={b%45Qhd|V(*BrI*{kL zN#amAA|^ez-`cL?^H!=!)3S@oOG}5S(Gta+aW(YGgGbhG2yKQOTSDjm>${H4CcU!f& zGm7ljEtSr>eDxgneP9325?7dHCjlWKV9c1Y%FoX~qFc9uH?nhb`ud*N;10i~wN(-Q z^Ad?f627lQGFkKDh7B8@X=-ZHMHgL^xdg;w(WCP7^G21HmI|p&))x7Zh+0#vl02zX z8tgM)L5W7ADk>~`x~8V4w`7VM+AX75{sy~r1<9Qs_IHfk7XLwl*c=2>@f}a&DsRoLuGPWXtp1+IIY2`eH|5OmX-9Hs9MP!-Jro zLfZgGbH&BQ>fXJ(d}ty@`hz}tjiL6F$c(4g}2a_-}Z z+ipn_HA%|k7!dQ#Z~OM`tFONLN)skbP$H4gamO7ej>^gkK}ej*RLOLWY^e{*=Z1MnV{j*PCH#_5x>R-s;jF6 z2u!|Pw{AM`yz_+So12@(ck1iwbbI633fHt5cC7$3o(~6 z$>c&v76SlFl*gPAOuD+dI!HuNAdBm<2rL1Da3cufp5_LbZUGV5xlf-y`t;LJMWhGN zNhh78lTSWb>(;H)j$(dZSXiXjUVBY*=FHKqyY8whue{RS#w;rw1R&&fqImD#eVi5K z2y4LPI}k`f+w>A-0I~-fHwy>{0hqCwcX@fGPCfNhoqO)NLYkVJ(k`I(1)vQs3tWBG zRf@&q;`d5dPWx@1a&of;0sNQYl^~i*2fr+5_5iAHsF(amdM%4I)_x2CAi!&qNz8$- zaW^RzwcyHH7+k;?n)2i;FE@_{2?Ct?H>m`j6g@JNJs`Ez7P8J^L8&R)W;ux ztRH{;QKZ7lF1t+UoO4d6Wi%G^^eazm%9JTO?6AZ1zyl9hV-*ep%tCo!T4K`PF~=N3 zHgGAf&{;#BIui0en!oz$t98W{S5PW*AIfB|58q6X2Ol_apm=zIFwWxWEDb`!kRd~a z)>~RyAS_%n!Jw&H(_><}yen~|uV7rT`-X=AJ1BZ6esXeh%p!0L1J+?7#5Gn*S5{WC z7QAofyMTdXxG`qT7%|*H`}^;|zYaR+Agx}#TJ4F=3BLUDOD$i%T!RM>)(Iz^V5P80 zI0)dt_t&mn3jqLQ!qaI)wRBI(Y4oJYc9b2ufsUN zOaK>o@WBUZp122-We9_e@Wg;%M@U+u4Yqaj?al-e0{62sN4U~pa4-@~b6tsDg9Y&Y z(7qc40CB+Pc+>!7hAu3Ktby<2GJM}GDjZoLsIlI?d+Uui-q0_<`~oPQfByNj##*&% zRfnZ8)#8&+KB;Nbrs==~57ZrZ+yQ|Gp8JQ#0;u9fjvUEL5Q3P74 z!-lDU|NdwnE5IT`;{pJ&UH~vw2oVse3_Eoh2q5>Pb%2uvkWdj|BoN3TfdlDmtQ{Pb z0=kn5Gd!g*8r^Z6&01H@kQGw)d!V)mM=2Z(h*W^VZZKHa2Q?qe_skA<$O0VUu>gBm z#^P_i^_G79^;hBmufZ6IP#(8i4FZ}*=$U7p(e&xld1jK2Q(;|~KXWX6mc%oEkCS1)RZ@bm(~ zG>19U+m9MG3N1qhXNXZpVwSOf{d#@z#TUB%`s*Pnm|DZ*0?hOQ@!^Lb0vZ5Vfq@|K zwcGaE`uOqVaRc1KNaNaYSO7paZrsRtTZbHS2%~W=UAnZr%@pkcBWo~Bp(Y@X*h|uI zSpYh1Nu@|`?Tz)#PMicY^UcQ3dcmq7eWeTEKZ|CMaNkD^wUol6(Yg# zj5E#Gs$2)$IJe zrMX4?{SZYCK8`gI4_J#j^N%OuVmK0GhY0b(xdQRS_k7D1(M%^G0gzN{ia(EWKpV_7 zzyU~=IoC*~T7nIc10GW%o(`7mF5ez0)8OSR5{>X(w$9~bGy&_@uAR5rZo3`QyH{^* z+~l+?+ZN-4MZ~fE{5-doCojEZnoSo&UYjDZgv{wV6Br4aix)4}$`vbSW;6k-*Q|N; z>#x5aMaf%KR4i(Mm|~J~pos8m8Tg=i@IPevd@H>ciA7ix6QWV0M!(V4ntDEy2_RUF zo;7RMkqZ|te8V+0eSF_<^qu@0bH#+K6XI?{^im>`^-O7LNoEJZyYIf6(^yHnD&uA6 d-wy92;BVZIIFR5st2qDw002ovPDHLkV1l-B<;4I1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/levitate.png b/public/images/emoji/apple/levitate.png new file mode 100644 index 0000000000000000000000000000000000000000..2021cb1ce7d91fc60de720bcb849376f5ff9ab96 GIT binary patch literal 2533 zcmVZQHhO+xG5g?H+rkd)iD#6LnIr?s=(ma`Nm~+5MmM zm7==;@BZ(1@2x1Brtw>b%5NIK6Yx6$R{n$N+qW+UEUF5MV#&|Xzq+cbYDRH!@gRo| zfN(hM@9gZXX=-YE*XQ#+rpkNMXlQ8QKZ*Zn5L6Te15T%#f`Woe%F9b{tf;6!ez&Km z2Z6<6kz;fM=;-LE)L&~OjbJdC8w6Ob_ET&&+dYu9iLr@951Fvr?FbQ(NaO|Ja6lkL z$?xW#xZE~ZW$r#@jBu zT8~P7dmMjw3!RY^72ZBTJCFqE1#C342Uvh+n`$q2=9e&Q_I`MZ@>sCoQ`%b^nKZJ1 zO)V+5>oc02$L-95&lj+4`A=wZUzP`$HwGj@x#Xt@i`jE0g}BARNk{F;amOAa` zQ5o?>jFb0>a`R)edFJMCIr@?<6nVD?)y^F!hdFka80Vj}W$eo4%jG5hsrbn(HP(7!4a(%ax z8=v*l6;7s%m>GmBQt6A^7fxABl!T^!TlX=!PZfgTs63BsmLo8)y`TU(_cAj9YZ z$m?M<6Cf@eNJ{}R%5Hby>+&H4h%}_zvuxQiqR}WF9i5bxl_FjtuX#Kkc|Bly35YQQ zAwXtY?+UST<0c9V3vs*isIRZ5v9S>$$?0%n!0mR+^;R=?g~jMrT?UBZ1{@AM-QC@Y z%g>rMQ%FKcC@n3;Vo?#oX$`l1`5b5mz0!HTU$q4TN@so2#eK{_7n}-_wV1I z2OoT}&eQ||^?D=^84}1`5kv+JjSV>Lb`(vFR^>(XL-7`g6(WmzGY3I&{g565nt*{A z1fY--D*?OBjzG>;*{6vT4-wB;xNxDlgP?A_#DO+RY%n0REP+lARW6UJ{eBACu2k&aQ|)$}O-;uDAzuQbaqMtuTFScf{q^s! zTG3du?iKC(pD;H8lweb#c8%8cz?bc3E0raCJ8Wt%F*-9RFdmT?x>D9_URZU_iqdr* zy&Vuvf~kYxHJ=1Q0W=T{v1@I5zTb;KgNPm=%L?7GA)_ZG^QsP{tU@I(VR8Zri}Nv% zOvFi{G^SG8PJiw(dLS62yu7^W*~cI7<;-7X>{bf~VkwJ6d#MfnsChD=X-Hud3WXZ) zzULl1d3hK({`lj~OMo;&GqOT)^9DorSuTLX;gI(?pL@8%*n z0tf-w5|E6MgAP2fMUo;Rz!;{MfVg!UVvHExn&|043?|FCva&L2YHFHqyY*INnKW?T zdFPqBCzwfq7~Yyp=l|JrTj}-k<&q^W?|<+CKyDBai^nmLPI_82$#tw&)$jlf(9elQ zqqyAeCdmwSqH<#uFcKcaP+i|0dWD#@=mbbdSV)lqNseW8@CO2Isu-UW1Z36w3Wy|n z^x3^uuLQ62R#l1Hx5Q$xQhnBK`YQ3N{`wk`N6rv%$RUT2iD)c_*Xvz1b;=YeexxF_ z6%-T*F?{{?*K0Oz+!zr##x7=?smJcDk>@> zS296a+p}9_qV=f0+)3A$*Is)~8Y4m!Km71RRC)w?d3m`*Ky7Vpb}}RGzUqPtE|7I! zT3@VNw@w0~JP27U?w_3?nVNv+=4PYh&CKpT)cbw+$V}^r(lXunk@B=yH~y{62O~yC zX!gI#8Vyj{lMZka3oZnv>6$-8Uj=T}izJthql`wWF$@ySOhERz6g?6L#6YPJWG~l+ z9Fd2-MkaEFfb8pH*q=SmhWY<4|92RbeQv&0;O~b8aHNMVJpmff1H^$SkjOOxRG<{- z4QvNg0)>D(O^B8@J_vLGjlgE035ewa0cF5EU{7E$Pz<=Temj*WAp|r43xHREHMu~5 zH9g~%Km||)*vUeg1b12jC4eJWB+vC_(;7^m)Erggq4=@Q-e&hH9r(?MGP*brQ00000NkvXXu0mjfM+w0t literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/lifter.png b/public/images/emoji/apple/lifter.png new file mode 100644 index 0000000000000000000000000000000000000000..f86ca733358d2f5a62359fb4b555a04b78e0be70 GIT binary patch literal 6129 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 Ef}6ZJ6951J literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/map.png b/public/images/emoji/apple/map.png new file mode 100644 index 0000000000000000000000000000000000000000..0faacb80f8929a9a325f5a17de0ab4a93bb11f94 GIT binary patch literal 5432 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/medal.png b/public/images/emoji/apple/medal.png new file mode 100644 index 0000000000000000000000000000000000000000..c75dc457c442601cfcdd1a85916ff594596eeca5 GIT binary patch literal 4438 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 M07*qoM6N<$f>2?FDgXcg literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/microphone2.png b/public/images/emoji/apple/microphone2.png new file mode 100644 index 0000000000000000000000000000000000000000..1adc026c0c384a772e4c64959f8a9d4e1d080e76 GIT binary patch literal 3975 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/middle_finger.png b/public/images/emoji/apple/middle_finger.png new file mode 100644 index 0000000000000000000000000000000000000000..3159f7b765560dcaa30c9686b9a8edddd6d30d28 GIT binary patch literal 2764 zcmV;-3N!VIP)1pX@nfG-W-j|=3nVI1-Gcyl*JmWF7y9=b;x$bZ% zqNC3qFPGz-KO&fLMp90X84DcAIRgCdf#l-?We+lFgZm`A5&VXA ziu;pU#{j5uIw=`Kkz7PD0R-nH%QC@xxgYcMKsp3~)5{Cw0AQ&MoDj|AV810VjYSC% zBQ$knF!aX}qjd*>&lXeq7)=-7vcy1i&SP4ug zEsHY1dqGtQ!2pO&Bu^s;0+?~K4yfyh%M!7+F{)WWRCw$Yhm?KC&US^Fbql};-@Ut} zPL1`AoQFKJkIHg;mJsZ=Y z8Hm7a8riv3F<92BOdekA!R8zuk7#ESfrZ( zoRg&hd?uLLaoRdB_)HNM5CvfFNI(@;DXS{s`=T|fS>$lPAukL7@7~BC?Kj7xuX;vSf)+`dH$1%9vmgD$ z!S9`a^5}^!bF@{UzB&D@iF$DZumUWAc(5L8m-}&jpg*g*JhJG!u@n2q>?pieoW2(6 zH~^oKU;u3$M~{8l=wB|q`qDb(LxC~g_VL3{KN`0Navq|A1TX~|QLYV#lk@#`I1vajGV04KEGUU@w3P40_WX= zY5R{Gpcw#2030Adn1@7=28hf72m-M)8Q@C~HUd2dE~mGa<6HzwrV*A%7T`!K1u~HN zb;QA9FHq=C6RaADHAoJU!5~L6g=hrM%@lki&G-2yp)d<}{bSO9AmjVBYx z@{o)KBugcLCXm56IttsJ0bnM-RNXp&um@T|z5(JE02mOHcWg-}C;&(*32-1T!4o4? zE!8Z3p)<2UJ}CZmwljT8aqH?!%uE659rhWEz{tlBprx){|Hm{RnNt{+*ht3UBI86P&f=rTg5` zZuq*Rk6edv73>O7r}Vef1Ck7k1&HxY*0P=qJmp49n z_?5fwx_O=E2Jm^1Dw#9`14I{Vf8i3qF%Ov=k4F$1s#`OTCgImcW8b}9Vdn+O{NH`* zJ$IjW?X}n6!rg0Np96M5+T_%!c@l+7yt_5+Bif-12(7V9Hviq;hAKdezzp;dq(~#YbdMmW(<2EGXAmkdgC;VahV2+*cL40~ zxAzI4o`uiuZC5s~8liAd?|^T?l|Yux0Zah{NB}HAJc9NRLIW0vdo_m#&1Z}bWx(Vx zuw2IgZhY?3lQ&*|!Ex0{C}-+`>_V SzoXIP^RH~@lBOo|=I#_uz8 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/mosque.png b/public/images/emoji/apple/mosque.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3126dfd2bf75fc256e77807ddd6f2f608a29a7 GIT binary patch literal 5900 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 RWcmOA002ovPDHLkV1jth0Gj{+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/nerd.png b/public/images/emoji/apple/nerd.png new file mode 100644 index 0000000000000000000000000000000000000000..f7fdc390953bf0e9ab89489585840cfaa36500bd GIT binary patch literal 6303 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 X1^AK>k}6Y#00000NkvXXu0mjfXD(|Y literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/oil.png b/public/images/emoji/apple/oil.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d4f87c179bd66ac9da4ff9d5da8789ff95c202 GIT binary patch literal 2655 zcmV-l3ZV6gP)&1%~R|a4y zGb7J)Mx*jw>!$gVYu9gl()Nw*582z_E9bKrb=?qSzyLu}9fB|Ha8B`=$2m{tUl`r+ zyUMbpCuc-Zy>;Tm zUln=&V}0NM<;nq=8RPNj8?Iix{&WBQPya~Y)to(lapAYeIU)8l+O`MvxM9Twb&CG4 z(4w-Os|@4K&j$~HM}pVL?%^H>hm%h{d*<{fZf4SzB9s5cv6(0dUTJ%E7?_S(bC*!mUhngQ|Fz>1@vWsAOy14Yj|h zVUj8O>d?S)m4TZOUZV`0gFJIQ^i1Mk@9EfDYdHTNC4FEhj|G6wc}oGjg&U#n>vo>s z`GtS~kGp`xE$6nV*0zSQB1S#kXMfUA79$Xlo8fMTg(VOH>}GV~|ESC}oKu>nAw;9^ z16MBH!Y#L){zCv>F$@{pEEw zHaGasyZ8C7ANgbc^Uf#t7XVlpfD7lgik;nwe%*Kc8lU&sAH`RE*8A`w?|p%HdKZDN zW_xGOtZu36o~G{!eE6JxURh_?3J{qT(6_}P2;<=?%H z`E-X%w{8@`>Hvrcr%zTyt@y*gevE&(t>c5={~h^+kGQya#opwW6BX4)EF1W6wqY{y(1OUvGPo>o=~kG4gDU*NCZG{YEGy z!)40F^A*J?=aHuyp8CTHTN}pKxS{ZoQ=7`T9Ja{AdwP)>PC>>9(X%mxqWHN1; zw{vz55_Ky~x)F6R^z%8@$aCe^G4-?|wg#|r085#Hs<6K9IC0W38VU2-n9LGSUh6rW z8%?J}J&S;0U`C9I7y=;7@|VnaFYl!HA-JrzQ?`ex`2$^a24GQo+E zd!;Ol5Osi*5~LwNq$H%MfFng?=qoZEoOwY7%wA^gu*hrr_;|oEfR`YE6sCXy^2!8I zo_L?Bh)-sLRY--&N&zId@gXtxm56YZ5)sS-F@%p=DS&SN{KxcN<5dh1IZ^hF z5t3zNWI!UuNY^F$B(xzzvn@1t6saRb!>oIBr2t5AEK+Nj+((}~*3P~M8=EIt8)tYg zOs6?b+tGIYVvL9=-uq?yYYV4j%PnvWHUvxN$n%1tC~>}ItID`=rsUb@wrS_ru`mS- zK&n;?KorCeV_#omy5muHbirz&>%!Gp~xXwhNYneUOoc` z4MV~#A@pR@BVkT6Q(_!3nG1)9H7X$D0C}-?gMz5TImM}90)3wd;RPE`9GZIo(f}cm z(!w!fDUe>U^`xjIbvVfp5xgqiJ9>n-w)|1NXAc%Iz|0ngG>ot`G8h!(rscR9dJzLS z25=1E7{Dxbk{Yn8~+~=!HbivbiEm)7r+bTE%)Ck2uxEm=lt4Flp)fG^{ch0D=Gl;t=N<&LroKQ6UuCBP8|@;l}nh z?d%YzFVf=yB8s{URYyvRx{1RJV;=%Bq=jKrIAoNOk_|Rnc=-&7q!_S;QxN(_us$PW zjEE!iN^p+;rO*qA2&#f}f_KA+2!mAwuZnYnQ3VwM0}>225Jgm%7f`;fpy7IJKGKHk4uE14w?y20{wYF{U>f1D#&KlY-4sAA3cx&qT?r~n>`ftXCB9zNvgJ%E$ N002ovPDHLkV1gY!Bl-XU literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/om_symbol.png b/public/images/emoji/apple/om_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..abe320afa737a0c76a5fb49bd15b308c988174c6 GIT binary patch literal 6341 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 Hu0mjfY;Hnv literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/orthodox_cross.png b/public/images/emoji/apple/orthodox_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..510d19c1d05c1f805e4e5b1f4c290329f1a911d8 GIT binary patch literal 4714 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/paperclips.png b/public/images/emoji/apple/paperclips.png new file mode 100644 index 0000000000000000000000000000000000000000..04c736a409bb93db79abd5e43cedc223ea546b0b GIT binary patch literal 4946 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 QNB{r;07*qoM6N<$f-Rw+dH?_b literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/park.png b/public/images/emoji/apple/park.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd8a9e9583b965e6121cb69a96230980f88f217 GIT binary patch literal 6440 zcmV+@8Q12CP)8NklwEA21KT&TWfrd2@ApOq z8+dtnK~Gy9(#aTX{G|cghZzh{Euyxi1)*RVAOl1S6srMJXptt9RtguHA}1?(a++r9 zvn^pMjJ(M+OQ~`f9ivDH4O9NkmRw|pO;f)3XPg`#VQG34YH#QN8W0Et(a_d{#*R(| zLs8^7s}EgecOZtM%aadIdH+|v9pc*}9aR59okWdo?J=2JA&?xvS{WGsH2hmX(Cf4)DZ zHNnJ$2@x|SIR>zXI(JBz5J&(-C`D3))`mD>wF{*v&$2g7b=NLE(7V-RfQ(%%C(&9f*i z&r}*MduZc6ToZ|(GvGG)?|r`_Dq+G5lfelGldpA{Ad!+GA|NCZv=V|Xs5ZbvL66pP z)K;-~?5Xuqcx%sD8G7E&HE!3>8X&GKZa1#QhzXgo5|ffxi6AfCAd$o%Aqmbb1SJWg zEhvB-?P;TG_uTK=$AF^7-epcdJlUvtTyafAer^SBD{gDt*GRU(3=_t%ScyRr32TB# z$m<#iA)!bk0V*8OmY`ziWo{`u|INCb;^P3D%}#Am@%Zoe|NIKLPuv&xixCY=tjWti zLQEoY)*ym}Kw=Of2ugy6lp^S$>ZmNViZ)-xS9W7h?OoP6@1B*RcwF38(4Pxnt+-wO zdrxD6#F`h-13jDo5F(NYXGTZ?2>=bCB)X%hs^|+;Px-YxOV$bJS<}U*5W+x!Kv2BQ6#yGbH}L$s zeY1dWE9sK|ue%?LCCidI@i{Ct5VO0hkM_SP2NpaV*g8iPTig~3QMlz<#ykh``) zrSNPE$C98mL;Ks-yxi9RPC0C+z~QT5hyCqj|Gymw!w|Fp%uwr6fM$?JwT3_b=^y6o zd+&1bl{fOSU;3p~s#RKz2KDI)k|btxy+NGBAQg!mxB%?N1uV;^P%e-!<;eIsy3H+& zF(?UAFl2#XV1GL(t%eqe0EyY|8`#bUJ4^v~ba^|aU;s0GljxNCM4gu&eUy_gyvEqn zGz*6hb5B3uGrslPnA|({!S6kW>u0$1#v4erq1|i^m|LxlV%heE*MKg8bXA5cwbH!?3d!7^IX)rHGS+G)X9x ziUiFqj=lIiH{Nn9mtS)Qjt9>^`V5C2{3leV!f$==Pm;-JxcItjxck#Tk=aWR((N>P z5&d2lfkDX~paCIw z^Z@4Hw$BC-|Jeu#NE40gIFzeZf^Hk7Y#h&}-|O+q-}^(Pn_JxZ5qDs8NRmjdyX{66 z&MdNU`k%Sx>RVZ9oafNfPxJ2K*Qo88VQqDtciwu9Z~UB(zHkY+zDK@Pr#>}HeYDK# z8~@A$r%y7rZ$D$xlZ=j!lg;MAm|=kw41fa?iI8T84}jPy#U0HOL(Lm)a5Em2kqW={ z3qQr1FCO8NE3f9p55E)3vS=-@al=hlk;z%Kn+g4Ph~+41O4lG~3=U8PZz_qyYmU@=V1%Es>9hknotUj= zpD5JCVS;4|Duo=mg3nU7g*NFB^o0f?A+T+QpLK98hdAu9w$dP1w5X0%a4p69xfSO2 z%`o3-qNF{{2|KF(&H}ij>Z={nmqIc*RprFH$N8Bb`Wcp17Wk--xt?QZUqt%X;@Nfb zHIKL7d7d{604~IEL4)m1FikZx zQ&k>);0eCrt3HQL*yZy-_Y3&UkNYG}oIXWsGiGFuh1%*N2#MS!-d$S4Ud=IHsd8ZQ zN{X30)3YN4odhL4R@ToAzH-8uH<|ehVI%tg)Vz_7mmi*VgK_UcL2-J>-sZ=hqv9ZOk{MgU4Z|Vv@=kq^~ zJ8r(3OxEY3i>BFsU}gX!Shl%&`lGmG|0gk*zm#wJk}u`!zvRogc;6Ip+$BxHwgt-W zk@0dko`vgLC`)2lYIj>>%94ZPfzdR#+JyZ+g`$s0@}wf0AFKfcJq@*16>$DWB9uD$*`MC`J@x~wom&_KK#Q!iF+UXOJ0BeMLznI zKAP2YYuiiYJ959!Ddl{DIPG)n?W0_B@K(A>%+Z&RFf}uY$!?I#O=D7pv|y}Oq1Ebe z_~=P$wK0q>s7;o@lC--W(3&JonVOnnbhO4V{l(vL_~arV)q0Y#{Kv5sY+#JWvaQ{% z2w?UZR>w~ z(GT18sb(F1_V>S`7uTszlxUl?C~FTvr$;8|V$d`@ZF*5inx+_1 zdYu+Y98oG2hD>v*S8Dv;KYk5Qz5XCq92C5I@{jn$t8S)JoM36`^?_Z2xNr&RG$lW!s<2vpD1LA*K19n=35E9pQ2+}6~w9gG! z-NAE5|B5GHJwk0np_D=?c>M6MGcz|r-mSAZe|jJn!FHFZ1QhdG`f-;(_^WRvieYY6 z@R$GeBmC37ze29)(H3Vp*E-Hp^L_H!JW3gA^%8;<9fjnwK8^KF);C(zMzVOGBAYF- zxOSKy{k<<>aj8qvw^?0-pdonVm3vuiyu{?#K8*SAZBX*xJoV!c$McX5{L?ePz-z}| zpjMJ#1lkBnIh$iA&T{Xo-$OrMWaC^5#~L<77<|tq<9k#*i-q+?mIvPlf#US3l>46g zRi^fq$@^uxQH%NW#}PsfoCXX*w?{9G$>n@{VMH&A7_C;3t|1jEYn#VublxZDgP$?@ zSxqjduq`;Y{6|!(F16|mM(h6_19m2+l!Sg7;7S)a@3P#PXJ!2)mSxbXq*4(mOA!Xp z4?9$<&{$g|3yf9EOpcU^!Vrw4(}AD(xi96^{0hZ_LlOzHo?@|afzm`4dmR zK)c;xZF!ASzQl>;CwcwN=PBgC7>3Jgif%9E?K6+^;g^3a(z}GPAJAwu=$+VNv@pWz z+6LWDn`XO%qYM#k&a@kxZyx9AmwtmoM-P!EFgEJa3k(Jb0x@8bBQ-A{dlXuS@w_j& z@F;8yScxKIMrf|T$;pMoluCkX%>e{qs4>Pcwa4Q8`aFOA)KBtx&ad&Czp}(zM_;EG z_81+hP|TM((>O#f3uywF80p%GG$o&fH0|*AiN|r$%TTh%d~1`Q*<}CJeonl#!1{8F z#S=4}I`s~1GtcPgG!r9ZjARZlHhPAB)F6oyJYQfba6LiLF{DP5mmdAlL7Vo4N8yBs zt{1S-IYwu5p0KM}+)62zQ}RVg(AK0H8tWp_d4)yCRV2utF) z>nK&iRwL**MGkMia-j=yeToq^Z>vzJRq=GjI~6B6O^=?dpZ+0IdY7+GTn3K~|SG7#X#R zLPe{o>Gm{f3XU`A0x1?G)k=)87f_=vEoJD@Bx4kbm6GPN$hgkL zropv+#>X#%$sVeG4gy0EYlM>!g%a&WbdLq>U(YhX*d-`SYI_}g$0BMdQkh~hYxwpu z>&u_tsp8hIR3jd7rvU+#i!5`Jm1A}z!=HO zIgRUrL9(@;GBRSLY=Ld3jroz;|8gai#abKMq>UGZCf0*;HFHpa8 zj=eX|uyk%2>AQ?pN+@lJyD`S3D9bQWus|6+U?i)kYKbgJ9N(tXi)pp`pfuG=g6($j z?1*mP;e}`KF+pWwa^)|;@?$oaUm#mZfq&hTlxWRh*0XtuV+$-B(ioyH zNQ(=1fmj$KGzCjihyxlPsCe)!G*^EQRJRj18P$$@FAJ^(InupLboH}P%e!IrmbCaB&zl_b+RWMqHoW`}fIOUJV zt9OYv{+@QzkeHN>b(o!%3^!yz7?PeL;}7J3ZNtVYkg}U1INbCQnx0O{rvlxLc<;z@ z^4$)XUpC1Tn*oQPdY7rXMN24J*@(Ptp(JE&NjFTKL1yNuUb(EX;b~<-siydIhZ2?`HYf@6zjTpn>x%hRTRT7(ruQGcheN z8rD`dt|w_U3{rvRK$MtWEQ=#4Sqj^MVn$+H5+Z0O0gFXLYipDCghy5yNT8Rd%=s?e zNT7kN3`z41Y-6w@m$in+drPA%Z;r9CS?64{MypkWP6@0mR9x7jz;i+6!1lnhA+qU5 z9p3jphVo>Uk;R|j(tTNcH|5NkWqP3`Tht_}jdE;?HRyH|@)?a$P%MFM?}7nF7%W$l z_n}^J2t-O#M$}7+(rx3MYj??{2_-4Xmu+fUmz)U6R-2S;o8v2Rba{gLg=x+$OmJp% zoH(iid9Yo`DyTUyZ4W>r9MCS=N?R1(KGk5S^?!M)9j-Oa1H+2zF zGa%|{LLxTTniL$1LOp|(^=YlF(dtT+wVM?o0k&nZZJVO!W1EOGaX__Xb5*s-QtZ+U zdRSUBQ8jq(DvKNN-l-YhJ~PJ~=f-Hara_dU?7^%JSqp>%#)ZTIV}rCnD^LGOSTOsIH&eX4%G#lK z>6s<86uZa)7?iY7*!W7(OQGOeWE@38%9x)apHIj+D=e;fJoVybJpc9;tgp_2Q-Z1o z`y8+wkUn@0cs4i|2nC6RbO=-d0JZ^3K&&B^kWNCBav=Lxe8RzBVXpQ*opcODk%}b= z+aXSQoaUy+TeG<3;wyP=u|>E9lp~5>owD6T>Rld^64->qoR0%Cj^rZgQZ$OqH0A@j zgo@na?_Su?U%qe~o9zQoD!>&s6tW;auwBSlkXYM?3pL;XHV_(!fGhxzXh<qY{8>QHZ zKuUHIgb?H;6f6sENt!aGj3h}6+3Xg9cKPXhK9c8--Ut&Ta4-YKJh(pKK&&7Z;O^KB z^@o6!0R(sk0Qv%~6v8rC9>wYrZs+&7v-XeF{Fq42k=R9S)keA@d8@!`qKIOHh$6bZ zkhmGpc>g>}(4+50G}gPM8an-$gk97C1XMhW(X5A?u~|u*OgSYoR>(@L&-dN)ahzGb z3ogk(p#&-qIN*tGYC8Z1d>{cr006cZ2C~DMkLu9rackix`1tWZU^=@--yN670QYgypRcu6B_`WGqR+ zIJ7nu?1}*f1Rzv`FBQJbBJ33&di4_C+57~!xdK)NJRhb_zOAA$W_g%6|e^RXXU*O@v8A*|q5yXz4z#W6|$xl%>eoIoh-bA7?Ea$8wkz z4xL^fFO$ViZJMscbroLAkUec-*hMcOFj#4yFzg^whgd9eX36Id-v20=sz5ml1q);X zi2(f!Y+9@{vvN2 zyMtueg|Snxo&^O+4XJ@4)6jt2@s~3@u6v9K=n3c!ZLpt({!5tLgB-0C5$-%0%OMod zN+ZhBp(E14=cUv_7(*l@Bm!T16v)$+Jyvv!EH2UrVl+l+Y@=wbw^(?;K^&$RCV^(N z#opP2{Ok`uf$IsBP#|MI`Pwo@6_Bi$(6Z?L)R_)c_Vie;YXBf4&T~{r&9$!hjjFhZ!(77=}k+K?wlR z2Bcv77|jqE?D%}gxB`eB|5HdnK&#az4EyZF_@7>z`;i~{k^k$j%?&X!eEqi!c<_Ty zNs`3>H(#85^wCEj`~L6$egFXe|K(}^-+uc41Mn|x(W54bbD)U;0000iPym;)w%B{`lkj$-(}ELFtc-gkSGEAbOvmu3^#uN_Qu^r$3HHD|&{{;i%Gf0OcXxn1*I!Te= zAMfq$k`+43F#ZPtMGKjR##a~thGrO;S$44NmTkEF=JoCG3*22N}Pb}l(U&fHN92i6eQDx|=!a)GR zi7aKJaub&c`K)J!dYX1!V1C8I#M~r)9-PD8TQ=gl6L-R$&q(;OcNFPx81?NPyRI%S zp2p<;L|Fn{>L{tY`di}ZG_p2OTb0D64E*mS3wZ0h5kx}-iLegpX_jf3k3k@XzYGZ# zzVHNE-?~tQN47x}m_$X+vhn<9eK>4~7F>4BcDVN5CFBZO#H*^1s;#?yVxX@)0U9w5 zNMte@g=kn^adFn3-I!g@;f-&Hk%}3-+dI@1xcrF;223IJD{P%!-1Up4*ZHbJh|13o zg{~=F7B77{fYbNs#&LUeLI_qZigtErY9Y%yeF5<>;mxijK@{bEVidSttOFY` zN3a4aGAc%c$e3jD&o1TBS(n5|vx^}5-;~*PaxLp}ZSh~$lJ)^J+ph=4UYOkyL&pp~ zx&IoUnHdiWDu>Tq#;w>|3Xg~sXF+Pt{ODsJfBlZHTHxI$pM3u@hx@yW|*w2PH5JfASx5BR}<{KX4tdpUwpU_m|`Ayhp$Bjla1rxQ@#J2At>mu5Wqgr+(xI zt{wjAdGSh96@YUO&(9&nbZafJw6QriTMC7M1~G#W##fK0$LIAczwi?-Gv*io(3ywl z({KO5-?%&GrCF|u`|5H1($D>b>+fe60NSqC|E=HuYxl%&QM}nU&mPH*IzTgJO3vZV`4@bJz_8 zP)1;dA@otOClr`#Ya~@!<0>9~?M?8x~NKkr`jFq`vh1$GE#3o}X94EM_Q- zAUaPwZ!2K;)Y2RnifB(6xlOwonjxAo1n6Kl> zF~`+sch?x#VeoL1%I>PsCcsQ~W7gZF!0Dm!@N_yi&*wMe`nADvj5$W7!A7gIw?~1* zQXyFym4tDb5tN6gZx#c?)6?nx{!Zlv*Jk>B446US`V!6I7Q0V7!pVrCFVEij{27(kZR3bz#?AtVtb2oorX2xPoPR|!8ok3lft+H9L~n+yo4fQc|D z!VsVWF!pv6th8)7UY>bD^TECQHcj$6g&D_Sn9wj8KyERTPyqo#A39y8Qc?C+6V%Br zXPhfzj3#!>KtwV|5VdN&NhclJkeOkzt7F_IcG+=_p_qUK$OI#?%ckx2Vu+9gNTC=C zVWZSSo}RkfnoiiWoROTAtMXxia zgaJ%xS9z79bJ;b=r~pH2&qHqIkIprhVH14lRI(T*3~iLz)J+9sOJ!S^Mgt6jVTAV^ z;@Nt4cjwzadFM60|GU1`-DPa6Il!RSw(jnZ>n_x*`QQ1ey9?XmK;9=c4A7v|%35x( z1uT`I{CoS>0Q<`kglG2detKqYn_+DuM&rf}+o%oeHnwWTwQbvW|F+ND|7Eh7=F9H8 zG%oge4|CtV(an74_y7>zfDomTydN9-{HI}x*tl_+mZ~JJsfNpw%Nv{cq}mV-Ix&6v z!%#Dw21Ay$k`=V38#i+W0TN;pitFl*rt=mBu-sIN1|>UqXM-Ak1bh-xo|San?azP^ zwI5>)ZCKl*ZsZD~W>>;tGfT+xf^N9;S@CbZ&cW2{W4%6*c|^GmQ>~T|nhT&Kz`R$% z& zI3F@3u$})2cv&pzPSxn)6C0JK{Z0+U7UARbAV?R~r3!2df@G|_z!NaSMu&nejM=d9 z2CGE|GHbZyI$SQJ33lQgq`|V3lhD*)fgr}cw$*aJpDY)a9i|xRK-aqZp{nwr0`irW zF|zd$R&u(Uu9x$pA}rK!K$h|IivR+*D+lkb^1T7t5z$;LOeWrWx;zn7K(?~@Sy|?1 z#+{D%s%4~lX=KK<2>&+3jc@?WNQe;w532x4R}ejP&-w^8?9#ae^|HvR!MFnpSbB10 zapB7DnsrjuaU_9ysCD5wC#k)4|ux@PmvyWh2L(^j%oNwsm!M^c#q>g+FF%}g`=9_25hop* z9sm7;(ZRa!cHRH54Q#kc9b`-d9w$K5&>7;hgX>;>IS}1-AL~pP$(X&>A4nFt#O`%l zMr~D5(&*3M49`stUz&8fo=Ol_)Bug*@v+~&J;f5exbr>-ZAm(v#)m{8vvhW`gGdNa zecN)ld{V%ECMvVsMW(>+D0VJ21Um8%8$)@P(a4Wq4^95@!)b96FR_UNEHO-BaY9rT zpN{|f?NQnC(jD9P-1nSy8@CWgMoMM%`!LHNH-jW^=)A+SjQv*Z_~-@;J&&rgqPeMY zn)v;vN9QMpE;o^xGEvh0(UeLMC76hY<|l{GO&4Y_TfcSJtJZJXc1(ZmdWw>S3@Mk- zy?zoy9`=G)chH>f@9rXE>#2vWHgKpa3R+&6qxtFa_vR)?Zmsh4p}5l{ven=FY)(6^ zhLUct@uvr-hJJovZesYPq&GOR+Z`O!>95(14YOndhEUz|zYjRUjDqLjaYxg$byerf z%fDyY;>UTKzE&6cJ0^)JZl2v%ioHz%pS|`twXE0W*ZB00000 LNkvXXu0mjf%LV`5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/peace.png b/public/images/emoji/apple/peace.png new file mode 100644 index 0000000000000000000000000000000000000000..7001b6a4e7c1ef1a63e9b1180e388642f34928d3 GIT binary patch literal 5994 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 Y0_|-(w$bs?eEz>% literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/pen_ballpoint.png b/public/images/emoji/apple/pen_ballpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..14b06985ebcb3e6dd55ed42561172710fbf07ecd GIT binary patch literal 5729 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 T)cIXj00000NkvXXu0mjf(keTe literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/pen_fountain.png b/public/images/emoji/apple/pen_fountain.png new file mode 100644 index 0000000000000000000000000000000000000000..5e9a10292e3d73c5d212e6ac6b77d355b0adf028 GIT binary patch literal 2240 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 Hu0mjf9?<+| literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/play_pause.png b/public/images/emoji/apple/play_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..b12ac1f13158b4ba8b1998b70787f58a67c3fe3a GIT binary patch literal 4559 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%0DRIuw>rI~WN?VZB7h7AK)Qd}lS~+B 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/prayer_beads.png b/public/images/emoji/apple/prayer_beads.png new file mode 100644 index 0000000000000000000000000000000000000000..dee68150bd57d3fa4abab54762342b25ad50220a GIT binary patch literal 7387 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/printer.png b/public/images/emoji/apple/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..39a692c648b88071cd4ad0f09433f73a3146a9cb GIT binary patch literal 4456 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/race_car.png b/public/images/emoji/apple/race_car.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9dc36daff8b3a18701eacf88f43dbec435e3fb GIT binary patch literal 3003 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/radioactive.png b/public/images/emoji/apple/radioactive.png new file mode 100644 index 0000000000000000000000000000000000000000..f9c1d5e8a6480d2fe03d26f486361728bce9504e GIT binary patch literal 4851 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 Z{{gDG6KVZAMj!wH002ovPDHLkV1fYkUr7J} literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/railway_track.png b/public/images/emoji/apple/railway_track.png new file mode 100644 index 0000000000000000000000000000000000000000..d6646159016bcf3c76b8e9ec91917df4fc1aebc2 GIT binary patch literal 7488 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 KMNUMnLSTZlQf8(6?k6aP8QEbm*= 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/reminder_ribbon.png b/public/images/emoji/apple/reminder_ribbon.png new file mode 100644 index 0000000000000000000000000000000000000000..bc905d64548be3017f0325935093b687b9f8a687 GIT binary patch literal 3867 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/robot.png b/public/images/emoji/apple/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..751776d185d54a05b50d877958f1a9f7188957af GIT binary patch literal 7397 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 XzhTh#TKd5^00000NkvXXu0mjfKuW<1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/rolling_eyes.png b/public/images/emoji/apple/rolling_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..f29bda511ffda88ed12e48ceaf0bfe80c7d05603 GIT binary patch literal 4765 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̝^miv2~JH;Mw1b~K*00LE3Y`_fBu;# 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 Hu0mjfL?@(> literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/scorpion.png b/public/images/emoji/apple/scorpion.png new file mode 100644 index 0000000000000000000000000000000000000000..74779cb829bb1c97fa94ab2a7ad2296248c5c330 GIT binary patch literal 7934 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/shamrock.png b/public/images/emoji/apple/shamrock.png new file mode 100644 index 0000000000000000000000000000000000000000..7a68121349ecc32a37c7c1844999370240bd0445 GIT binary patch literal 6001 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/shield.png b/public/images/emoji/apple/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..c2146a8e4c1e8a3fb63125ca6b3e0860f724b1e8 GIT binary patch literal 4456 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/skull_crossbones.png b/public/images/emoji/apple/skull_crossbones.png new file mode 100644 index 0000000000000000000000000000000000000000..27db39049d9bf874d54951622bdd2c49c2a9cf1f GIT binary patch literal 5394 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/sleeping_accommodation.png b/public/images/emoji/apple/sleeping_accommodation.png new file mode 100644 index 0000000000000000000000000000000000000000..15d17edc2d79c70283b2fdeb2c2b98323a3d9173 GIT binary patch literal 2818 zcmaKu_dDAQt+saCqgL&PMu}ClHmy^8)@bdmRiUbm z6?@bsnp)A?J8!?gf3Nqtujje{gy)I5jnlipa)|{1fC~otSo1$d|6icYf4a=Ydkz3t z{x!g2ECWEB8NR7*)7z14cilF#>d39nD?FwTry4v?wsJhC8$704_PukSCez%@TdW`K zcJB}ZgXMkw;>ujfo?G`yRVcJin!N!UBW$Gq37TT{6R-8VrK9%{<57t}DoxM1)cBcK z5`Gt!oY{PhZ=QJ-_#9nENS);{AKbYO9@Qt)s2VWub+jTV|7{ zsY9RdS{(>slvq1DF<4k@e?0Nj_f^N6pP8El;R)+y`#~UyZz&g39^xLk(Cc)1h-aP2TYlw2lp> z&k9#5yEct}yks0yW(bef0fy_;XI1S}YOSnkpXhv5Cy0=*ZReX?H5!81 z_zj7+`&PC$TkFXVlY>$+PMBzdJI4fVRU;1G-+KK;3nOzqK6g>@$Fg0l z0;gm$i9J_?1V>&$ig}MJmq>>?gNs9NEIbM|3$ zh0~78(`>(Gp1-RV^l?e7}~+`Q3|LxzB{Cd0oMb=ms% z*mcOHxYnl`2>KRcC8B)iQOK{c#h-Lx$2t^xC|c2Lu{>?KPgnRTp;#dMS^UtU&5Qo5 zx^Rz{)I=EAky9I%2Y(4?a5%b2S}1zx@XiL}$P8L>*XHt(o(IL_W9mDaBe+;!05ipa z2;haS3i|-P_ansg92DYvn$twvaGMg0MV>Smi4fseBvr>%r!-qwW!Z3=efLgW*wR^{ zV%_5z1c^D8>$oh$B*jNdh8WjhgWJ&w4jFJJ-lKkQqI+ zu6)VkZ1(tAN4)6A?9Ye3>jawx>i3a#Jydn`i()MFRvnZ9t}#vcp!GZC!|szGzakMm z+W}D(v{v|_CC&;pm-Jc?f-k4_?Hsix%w6 z#r$40b@un?`F=zFO?#fnK$C%GoJC_yY9_@YTIr>oO5gTjoJO&0mQ>&zb{2FyY&f7wn&sF(Jg9ms~;^7{rJuTmr<-eTmd z{^GBxS9|A~s~QSGx(z5m((8VlAt2`5Ss1i*CRxK2Lkf1C@{GJ8JLf+FO6&~1B9=1k z2wfya?io6mGpO%(U9i*8y;1@qf!X;{_=hEsJBp2{6iEn7g8X(SLu$~3WNe#n_OMfF zo88n{i($b5^b^BfnZ;E1!T)(SKPs(G%rEBjHgk<2uL!dvCQy_G&gK-XnXF_OC5ST= z+}&&k<$#hi8+exUCS!VUPG^~pAu%HWRDk$3tYX&LW0`Xj0XKfU%@xCl(w4KqY0Qxj zbITWdPy2AD`OF zEpnu7B#%gs^Pf`5waOvPUq=Z<%vNme)bq8Fqe{;+nEaQ|nl9grGd{?L6ux)X; z!pYN7__dMWM+>1aii}}P7HG3pIuBZ6pMS*lOp=KaWUSPE&nEtG`0XfrD<#!7-_5sB zE<+r|)uWIU(H;Mqu-!C?m4z<|0zT-hf-;Q1L*j;pQ~66Q4wO&YbT}ZFof#J^#d3+&6zS-)r~==QbztdSY^b- zE!PJrWmVtfo8rdds$k+{k@k|X&9nIelN=KT5fBj%7ZYB1WU2;ui6r@K_6UF&TsrK- zD2X-g1}4YS)H~$^X0wZNDK;gGPs?cYE6f!WLPVzs%3*GYo_~TI#vac2k6oaC?w$Pz z?Tf8;N4FTe-wG2M)Lzb0x}QlkRhj);4c3rAf!T1gi#KRoCf6X+ zT;XA33VsGHP(Sc=;<*MMXANM@O-s-$w1@`%x?ZVW8}fE>(@Yuo{~$9qIH(j1s5hJa P`L=+8E)H9v?GW}~(DX-} literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/slight_frown.png b/public/images/emoji/apple/slight_frown.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0cb44bb9282d1af515604b77d8ba6ae739b80c GIT binary patch literal 4043 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

>#kji1(SO#>9gl{FnUlLh5 zP$~v;3V>~rFdQfm2161|8z>ZgIW@p&lhAX`PiMMVOgr6WueY2y^VB1uZE%vOo+e%O z72z~mxBj;?ularQB+2fek~e3z7uEc>E)Ki`&fsQrWdPM{PD6r9Aq90tEoSnN6;YDV zRv}eVEK`TB(Um6lGuPt}`tf{NM?S+r1;8SgrI;U1@eJ*3NG{gjH030oAYslyqifL4 zIesQD=A7INNSDh%2266>@(it8uB3x$9(EnYu_ZSXC^<`Che{q3#W8IKOclq3JXGYJ zkpW-i!2|d=7_{KCOCC)i6Bo32FsLZOcx`C*WoW4n=oCNM!kQ=hpU}xpm4Q|K@(Uv+ zcKNe)*c87Z*-44rkf|z9cjOUazlsumM6%)%`2@x>hn9_ahP;Q?=0oeqrJ-w)*9iL+ zIfI$^LMpqTGr-p3F1GcE=O^-FV^zMfBd=P8d9GSb4PM$MKp)fNm%q$8o|>?s+t1OF z+;3zl?Aez9L!*Zt$oI$>Ti?*jPd4`uwnb4*#K7A`6f&tujXVI=q8Hj4mMx_L*c*-f zjniBpE_7deEPZf$e6MVy s@CLtnt(-|cA=9YJAMyV}Boc|le;kF}2AWEfZ2$lO07*qoM6N<$f+&Fp#sB~S literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/ferry.png b/public/images/emoji/twitter/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..26633aad4d2c0a94fc6c2ee8133e20633c41c822 GIT binary patch literal 650 zcmV;50(Jd~P)R4{3(}<++Mo?H&@Apc}2 zmvbpZ{<%r=3{k2tvz$I-RK%h=rHOw57Lf(?T$&?qEDThhXn=qO30dq%|p$g_YRf@h`s=<_X zEL3PC?88F7MGIG0X^w{G+E}w^5jw=0e8W7nk9EE?)6QKU8+@nMw`if+FuLW}5U(!r kLSD$87xF@0$O~C}15y{;I;#wCM*si-07*qoM6N<$g3ZoVq5uE@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/field_hockey.png b/public/images/emoji/twitter/field_hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..10212007776ea04051c0f1e71bb77da1352f249e GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zngBgBz^jz-hIs*}i zt?Tk~itWKn|C0gE2QvMEA}8|w4rclR89)-E=B}>Gu{39OAjue8` zfR!D{@CPZ@2O0}9`AUuJmj&j(mYbX^@V%?&0yOIVEK8t8Kn763i%GVxrrLa4WCr9O z$n<;MZ}(=p)yKIO587>?_Srw`w!7c$ct_v$L61GqsHYR`|F1CyS`9Sk-)a+w+AU^4 zzu1%n`2{n4`uBP7k6i~ESpEg`#NT{9IosG>N8`F+k^B?us?~o~%S(m7{!=-8>B-GG z(>9&>wfpphYwt8mO@pjcZsoY&G%aFaU=s9naSW+oTzmEDByB~3wnVqb@7`@%cU*Dj z|J6~C-?XgfaLvu%zkl-bjI;!nU`svsBFjmqC&u(WDN>oPyi?}nQx6oO;=@mDj4XdM z^?wdYE1G6=F6+SKJ9fsF_ACAVWmvryyBVmq<)3T0PsZQ&cQY=0WUrh*l~Y#!L?27X znGRfNSHkDd)RtNpe5HSpr2M9B`(-CH zUg5j&vqGSC^@jwJYupTPr`SgAE<5&euP%FcwVFxD{H>e6XRTQ9?|9XLi@9e_Re${6 ze(S}GjTP^?cw_(Sm|WRBm8s-Y)%?T70XJ+MkCnZNI-UC3Z*Fw|frFba374#wX}oM{ z@hauQQs)D;vv)6WWt%FJW?%k2#UOg&v(kINUN`OfCb@BzRCvgfCZ&m?D{isPE4Oc9 z7g>F9Z`DId-*By4=lJ$pugu?EDw^#({U+x(ySf#zM>no{UGS_ajY&JiFJ!{;r$72R zf)@XYHRV_}x$Eo?{zV)= zn)*gSq^)hDsb{32Z>$Lv0WpAr#__r3SMNMZE3JR{;;p{9wSl>H@63f(&K{wOS=a79 zzH;Z0wX>&{vuAu>dC$y+y|WgDBxZ&tW*V4T3o)$R2(*!}B*-tAVdZ)m^;K&=$$otI z;muq1=NsFAGJ8B-978G?-(E{)YDy4jN!%qV^=8L^)xVx~8*l7-&nOoplN|Ek=Y=!d zWt<}>GzExoDDp3fQGC)IqS3;TP_AKeDvDu(Q{=+XWi4E1?=jC^FA-9@dLh^1S62lB z_?Yf77=GDz{C=qNbEozrhF>mT$PCt-VxE%mf=AV8ioSES(G?x9pA+Tn8LMu_m#tP! zt+sS|6R#MTv*(6H)%~Q$M~?~Un}K*W6S`U_um&v?C{hye%5jc(&~`z`#JY5_^Dj1U`4kd_i2(cW|4hlNd-o8O;Roi4k2@bAZ z63Ps#ZfpoQS(OoTafQ;Z>H8KheSd*UyRsMn)PCaXq8XX-h#0jE&o8fEXP!m)hIgYw8&S*;AKqTexvI&`6L` z`ox4`bBX)OA&2oADD3It7*fIb_8e>3VFLk%i>AiOGlJcsxzxY!5B)o3(J3Em_8<8V zj!%2q^5iJHMM{vXQH5ihe&nS5L(NZxuUXoJ=9o@>*XXmo($>|up+85FsXs*c)v0wp zKV=Lbp3_P;)HeS-(TZ)K^IHA3FB@}uo5fNi&t+Z>xGCP(kQ(8+d+Md-pDi-N9L-N} zyLTaX<~|KREy*vR1ga`I6k7zGAVllDdlzhZ~J=es^<3n){|DeVn)N zF@6La{nswTD%FqSeeU`c*AMsZH1O{H@UCpptLL`oSodtQYTuuCD+L(544$rjF6*2U FngBRVTL_`c?#e$5BRqQ{LBRJhzaFR4e^c$ z`M(9?Jr47k2i_|X=2r~#q6Yoe1N_ee<3bMRQVi>C3;DnW;XDrFLJsF#4D5Ic;W!WI zVhr`B2K>qd(5Ek`FWG z>eXsJhn0mWfZ1xyHLNa1n4{8cRV1oWE$GHPQh!-U12F%O=00008X1ZI?gZv}n^?&(A{UDF%0VYhvFV6PC#1Px6v?*s+(J z<1RCYLIVR6nCP%l(--dCCFsx#cL9SS#3dl-bjGoMRfefuvA*$MV?nj>UYS~^L)l*( z-yBmD@SC3K`^84*##|$X+^Ju!OuyI8IQs4l)1_-+Z@2W@d3os{Hq_X9L5P8#R(k72_65$ z0LBU(|H1?7UTOcVGiG&v?{HS`ZCUo0FX~xt?P^{Aw;P$Nwfv_r_>xBao<0AnHU6eI z{iQels5bO}Q~stATm zdF?U)000tnQchCTpQG}P;N;{SU3!!fPLKf* z`xKDxfXhj;!J~mZFlitQI8k2-X^0W^nULuAC)1*sPWoMeg674oISN|L2E*}aG#(CS z3ly|$-&!g|Wy#oPeRbBGI3jqcNKm+P?-V|e4}9j6alJ# z3(^acg|Od(4FswIF+j3F^QST>O#|wEt7#1~P1Ew-yLUk;Pp1N1rCk!_7tAp6&u1;& z-anWBvR`FoW1INp%4h8_6E62nzM?bX)4tuGrhJ?-t#A6|Jvw`}@4uf}3Dh>n)5S5Q zg7NJ&Q>McP0xlOf_9UjIMLhj?oO>nL<*;*qnD_i@-uOkVYU-w#t<@9uuDX|5^6=C- zqes6aie?r*e8c0iuRUh=L*r!&(VP(4@7U)g}Pgg&ebxsLQ0OFIWkN^Mx literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_gb.png b/public/images/emoji/twitter/flag_gb.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1e1d6580142bf4ee10f1c917f4462d55edd03b GIT binary patch literal 878 zcmV-!1CjiRP)<&ePu3O<2-2 zLuY)g<+Ql&?(Q&6lTvA<5i*51Qu+Z$l29JQsbwr%@``r94wio#)+4{o~p;} z?Cj1PE6y4!+;)HM?d|RD?Rbl|?(Xi-8!G@LeM|6?`v3p{Jake{Qvm74_w)Ji{`%YS z+S1JZ=Ev9P$H0)=%kS9!_Rhe=%E#rw;ljb&q<=XGv7tV8WZaqZj;5VYZ z4rY@@W9glr0l=LZ7Ho=7{6*s!`#Z)l>f#c>?Yc4PAu@wiKhf#{aUnI1-4Zc-g1gT* zM6}`~TIplFWgO`OI+mczr^lx3DEUd09A(%&Hjd3c&ZuA`JDlCH^{ow7Rcq~{%e&*RU_I0qBZP>57Ma(Fl#Aafy+- zt5@~{K-GX5G>Pg(C;GEG19in!!w;H7`heVdFeUUUH;PWV=xQy1SUI{8l!%M2S0{+I zyrIgfL|=;jm`oYK7L=%kc@~*JB8XZEq96*-BM(vS;ZGpVfNw-%LeRrsk0atU&nXeJ zvCmUUk0UoA2{9+Ni0O`aPSSvsBb$+vTZ@=-mnS!mYz`6p10L<)g$Q-Pm_r1`8bXZr zmRLhzf73XQyBuq5&>}>hYYAGqDEs*=Xl>`JtUpIT{>L@Nv%*Ec7zvT*Ji@4IgcvGx zh!F1?kL!)F(}ksa(R~AZ^raE*;60N?_uoR)8)5wxU`d4d_``csQ*VSjw_Q7zMfVrU zMmVPp+w;0y%bp_92-(sZ5VtR{(f@8m<7(*%=9WOT4raAjjw2Ffw=XdKq-bP?m$7H%ClPLK<)(%le5}p43pfz zTHF{WxPmphp3^o5A`p9$+j&h>pc)VtX#ONOAOp$;%L2LY-o5*-SF;f4D(#XWzhDNf z-anrw>i)U>mwh5D+f}wJ+7tS|OxF4Q<;rE9Y18*k**8Ud_s0o)`aVtm#FUq32-G&) z)5S5Qg7NLOt&E2Q1XwPLE}l8l^ZVWU%3~*d#7|nY?x~n?U*hxLqUd$E>`uglz7Lsg zA^u%i@TZW~vmP$>be&J!B{>yS*gjdOm^H{}I-C=km*J4sx`Q-V+-eI@zW$Xz13rr)l;DDgWRtnk4dEYwNn-x>vYz exp($%w0#^{!S&<&`Y@m~89ZJ6T-G@yGywqgyrEM7 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_jp.png b/public/images/emoji/twitter/flag_jp.png new file mode 100644 index 0000000000000000000000000000000000000000..53fabdb484ab6a12858a40579c82d2777abfcde7 GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#(g2?jSD(zn|NsBL1B173-@+Mi zHc$k}1_GcmAOJETYCz)B`XDw?$j0ZLmG@f}^S7Rn?}8HF1;oGGec;`y4eu^peb?Ok z?%1if3MOye!`~i0{`Sa;cdh;JR<3`$WAD4m*WN8(_g35Xt(xV#ipMHDc^4rxL-)`UYuwo?-(7_@lL4LsuY% z{z~V6CIbVbv8Rh;NCo5D>#Suh4m=GH*X&krzP;;u_5a0R*Y0KsdTxDyzlTxa_wJ;n zH5(liMZ11-t+_JGvP&i0U&q?BOJ}FXRu2cs1yht6cbYu$bYYWHQR3DVn#d&dsor_j z>)W#uGq&CD779w1-M*!fOL|u6hlZD}+?M?nDWBxjOll4Y=eEm#n)jjSq_+7ItBPqW zXDl>~d+^E0>o~Vb+=^~-)-@CQ#lJ=>O6zZmP?Xib6rsqhZxpdmGtT7iJa=K~oQ*Hv zKXlb!GvQLpHV)noP3CDHGb^se7&@C+)o(ca!+q`LX%<=H^Zfb$C+@gDG5t~FPmM3! zm#!9g7c1}m-MnvWMQU`NK>alrweN;n-zs&!9gLg!tF^(3^8~Yl(px3(Pcs7sFN3G6pUXO@geCyRKP999 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_kr.png b/public/images/emoji/twitter/flag_kr.png new file mode 100644 index 0000000000000000000000000000000000000000..2132a435e36f026da9d3a06f0ee718ca7075dee2 GIT binary patch literal 915 zcmV;E18n?>P)lo7G3>b(r13sPG?1Go6IariB5Im zr?Z8KikqFEWoc}?y}pc(k*_ULHatLDUSZ;_wi~!X^Z)<=4s=pZQvkfwjRw`rw&Ib$+km)Wc;AJ?pOwmGVFT@FrJlK?@hM<7?b^!|&dD(+3pRC??fkfC)&G0OE^&%nk#7kAEmiQCsdO?%ZDb)3RG!4*5 z6RKr+8@w{F;8~lvll8k$nR=~qnVKnNzw_6n+k7%8iFWwhYXPsk)WAaK*EY})Lo#E+ zZH^`k`Bs1E`@?=K56Fa^GE87e3mX%+KV^E>ir%MG13)LYg&CX5i?C$uTL^y)OH^fb zPy|{UI%WcISj$S#B9AT>f^6>V!T)C&jOok7$g7z5EdxKFxZZ@2z{LUij2y=WN036e zTzPL+8hNS&G9YNC3$=iN6dHUH@<&lLnwr+%StyK%}1_y+g&J>GM?Gw$MTbSxVza?Q{pI!1BnQCH@hj*2+8fI4`jL!eIUvF?8p>4 zWG2&>)(fOTpy^9X=Vw3{^Vi)KI)Uz?ai+C&q9CQN`#KuyH4+Zwac z5_>gT=$JWMw|*kA{=J&fY|d;(kJlbw0s`eH1@?!s|=*8JJ`{R!v%YWBW|CXe&ODq5Y002ovPDHLkV1koK$9@0+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_ru.png b/public/images/emoji/twitter/flag_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..79880997513f101866f7bc0bbb74b29de1faaecd GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKdw@@ft50U(yLa#2f&q{L1m_gg z&nak}l~)I%b8=c|jE&FAYyAKJAE@MtmKKl!Q~*(bURLuQNSVe3B@KumP&?eHbMhKM zF3=F52t*u60>N1YkQN{Vs0BzWIrIRn3spAr13F2oB*-tAL3iTcD_?s5T>h-ZI+6Vk z8(ZH59qq}VboT7~w0Fw%k5_k3{;WN%@9KohQx+M#Vgl;w_jGX#sbGA2rj_v!0}soA z_0@&t?Fat7UMOwS|D4T2;`45q>->r)YnOqu8^W@~RXG2+Yp!0DfTHa>MRESsa@qMu|F$R#5Y z$hY9yb^Fge+gA#|oTYL8!-c#fo>x^n4~rc8vxfVgOlI4z=nz4m(-=Hm{an^LB{Ts5 Dj-kad literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_us.png b/public/images/emoji/twitter/flag_us.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d67ab78413760b4334f3d3ac9d6db78e3945a4 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#q5z)|SD(znjcR5am5nzk8NYk? zZWEZXiXn89vI&q|&%m%z$@uNtw;mq3*4BA;7TGq|xj>Z=#UDO=07|`o|K8dv52y@i z$QD(TjbM#Hy+GMbN+uhDNZG{NDi^2*sMiL_um&+ldp`UcG!@T{Sm#`F3HTYc)!O{DK)28{4|SU1k1znQ7A>_KCWGTQ`1I z{;lx2yFuy9$4^QNc)B=-R4~51)Y`{vD8L-B{q)o1w4!A` z|Nmzm=P|yU?XudYv6b=kiggMv%JTG93LHIp@uyc!Ko$NB*ImGPj;Q}Wfk3MJE{3$frIMYTyB-Ab#W)S z4!B3zKjjPhrCC1VlK;x)H?lWB?CgIUadRSLeDzEX>r0JwWls+E9qO}rdqPcn#V5ye zleOek=7oG+uwn5AW&eUldo0`@?$Hpi)=zr#&VoN`xkIdt1;Yf>)ZE#;Hm4TFT$_}i oQW0qFE&Ox2%H8z~H#I$A3}_9xocy?n1?X=EPgg&ebxsLQ03#gkZ2$lO literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/flag_white.png b/public/images/emoji/twitter/flag_white.png new file mode 100644 index 0000000000000000000000000000000000000000..68543be8f2e699cd36cd8ec0103a6fe34c1a46d3 GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zng&TH1eE#<1|Njr4 zzX38HJb(M>#hZsO-rj!u_TlT-k6yli^6J$?pa@Xv!D}E1ME764fB5V*P)*0orJd83 z0vS`6Zv$!snsDd&a}eXj+XpY+ffX$K|NsAk7jN5V0F}J~s{zS^6})Ymx%k0LkX<0D z7jK?EeF|i^&sf$0R17lY&8%fxI%X~d3a;3GaM8v+U9(rL*nVKujzib(J(;?6?pu+Antb8S>x(QfBuIa zocBDZ)ONvx<60bxCl>r;JYTZSQ1<}0#4^#yXNoo+GoG?kbcuw0-Mn~4?2C6VXEE-% z=xWmHZt`|koRrbLH7s&>Hd=}ai#+SQ#XN6isK|8NW$OwrG6_D!Y(P{De-T*zbaM>>K*ESaa5zqvP)x8hZ2N{iI?fv_a|gaihuUpvNC7pqDgC4 zO5QGz>p0f$zb@#a&x5Za$8Xjv9P(UnqQ_ikrRi=?|3}I!1}3qV3F42|tO#@Fw9xO; zt4P(}bV@F!!u`n4RzX*hK$nXZJ<;kP;y9lPRjl9AEB#jFUheZ97d`HMUc>0l;t`$I SQ^x@eUItHBKbLh*2~7a@txI$O literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/fleur-de-lis.png b/public/images/emoji/twitter/fleur-de-lis.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa91aeb3a205e5ad6560ed3c1c989eccdd79d41 GIT binary patch literal 1007 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-Tw-H)~xEe0Wo1!@AXx^H-UmcT_B_URs(ebr6#4F0drTjCGBcS*#U7F zP_Qv(JJ5PvWt%fVC;rpTdD2F)0c13ud@IpNUoWDEB{MuO**1 zNPG%>b?W+KL(TA)_i87ex9Ci@D6$Kic>Zsp?aVKi9KN?S`EOgi_~xw(O$-c7Ydu{Y zLn;{e-e{fl*oKGwL%oHjvGL=B$jwLJHmRPN1q(5sTg z@Wx#wOX|ghGs40)6VFIAA6JojWbV0B=cuZtw3O%G4O7G?ty=6FwEoh|Zm&+4Z#9XP zbDtKd^!Q5L%GmKH;#x(Xx=`%>Z0?xSuGuSYPl}s+O^or;AvXmU)z^M@OK}XS_*Jp5 zV4nTFX#y5kwg?!rCod^oJ)P&O-X$wxcJq??`ZMS4KCv`tuSbaOlaG&;z6w{a(GSXg z61dkR^#6aCQ%hHx|Ni*+{gdbkvL|lLo8dX{_-4goJ?Rd~r{~wq{bno~*yPiBO3o>6 z=BEA$A!YlNo^+Zl`nBM##aqX@Oz$6E4K!NBIrGum;J4f#yCy^m`P;}APMcu3)uz)# zIB2WQ(yIlBU8+PCW1M{ox(}xQI&AU3u#)Fa*kz4nS1%-R^8VYNKl60b=8!D0>1qa# z=erc_f4Vs-J}e-yPV{=gf+d&I7uK-`oLw@ZJ^15l>#z?Dee0}$T#FB~KJxd{mS4@l PgwNpV>gTe~DWM4f=Dy%6 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/fog.png b/public/images/emoji/twitter/fog.png new file mode 100644 index 0000000000000000000000000000000000000000..f8aee2c7b5ed40b6929aaf07b6054bdf556dda19 GIT binary patch literal 1194 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 V$kE8N8kjU0JYD@<);T3K0RWa}z>@#~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/gear.png b/public/images/emoji/twitter/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..b85014eca3854047724c6a1ea1f76f08a0dc5e62 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn%%bYF;@Z@b`qa|; zw352i(wfwgy0r58w9>k?5}-&mSgJ0qv_7V)Dy0ml45+5Az8otP&^)Qd3+E z*9`7`7|Jq>YIZHB`dG++i;yX_lFG=G4arlCh zlr5L=l8K80oTYevo^F11viX%kbxy_O*7+(gUhR5enj^6zvQ99?j6Id9Zer=E7csHkeo#R$omF&eTp{u#JHY4QPlwAgz0R=S~ zp~pm)8B{EMu=h}c$>I-8dqrD=C2RvN+U6-Y(OGBQhIr^+-g$FkICfq3h;5A^8f&##KG58l}oRo(3~t(NGTiDbBXEVoQJ3 zP3O1I^K<|Iylrv6&e2c8a0SCu&)%*()1sGLJN*s*rF4?RE?c}g>uinh>e~V7*3G>vQO)mXlou|cZ{`y_9h_AhjciCa-`|48H z|GHkx*7^Q{`Ccd%HWdDCrT zm1cE*W_5jBk3T3bGJCO7WNm(nw^gaZSawjY*v(zEm)`W$UMDUxC@wOVY|f;A)SQ`f z#kps)l-*m9I``II|J+=XX3VOM*mts3|J+@rgVu~;#C21saj8vab$?uuJDG9No_f;C zw(2P_Gr_6lPeN*ml9aWY-Z3*kXP-rWg?hECZGoh96mim50000fbW%=J0KTJsRz0#8 zF8!SL{eJ1&#&u}i?5uI%M*RBL`r@%XsghLt{;JnYiU%u8MF0Q;E=fc|RCoccl!t=a zIuJz%Fv#@Y*^=7hKY_i zgDs@$R6l%w;w6;LMe}#Nicsy>l&N7Z0+uR4b(+8=+!{KH=_)$|)k~!^G(Ja`7cON0RlR-^V>la3apA}5bXdV9et{}8 zAS3$Tg{eN&Fk!3=s}vbvdug<3qz3w|n+}&|H1f)d^jSACmD8H!;#Z++w+yCh{LWFZ&~t=sa-IguuA-SA!d{o`mubam(DKLrBZQ%N>i`X%acOD3;LilpAb z%s}+Z{|*M9Ogjx3=5;r`gr=BqQ%QuIs?Yzb)LrAtB8L|L?PH=`M>TJFq5_86Z&t3hEkp5WHHf%nHwXfEf$_wmxSeJE8#MAn2m=9!VT%(+ z;`6v<5yk^iBo{R|E<`+8A!LzLRMPFcZoK?WK6Hvj#L5d3EwOl(-4QGx6pEg(G@fkv zOf^`LN+>FD*Ss?YQ5Y4SVoNUKofY_uI}n8h5^;y6@pMl_EzE_rA)AB^uIvUoYZ58M zaX>+qNQ+j_L^S55IjCFO(E{V;^<&8`Ib-qqQTB6e4Y9aTHeB;8Y7#T%*<`1?8MrP# zMo+}#i(HdvxM#i|DE#j7Uh;6FQ;BzagFAZ`@jZ#QhxI{`DK*>=Y_3Kc9H#9W^vw4U z5f`o_a7}BOsEIfbC5tKvMJ;`6!vUS?Nkk8i_4PK2w$beHc{Q190000pkP`_eM(9F=0ufQ)d8s`b*aU*Uw{f~fl~FUrM1smxzbAO zLCVVNfaYAQ;P}$d{e2=2Q1EL%&zmkTpqkXuy0p@|YZaW=E7^gDKWX85*2FWX+Ivb} z^yhx=)#aw2`gnG=S}&`xo?hkw)Cjct%LJaR(wYa2Tsfsx*Qz*Qb#R~T(A!p_wWmV$ zN|)M+4t=15MNiLE0s6wAB*-tA;qB6&e}bb}ey{faY{1C3#&osyGiCKX_SV-wJXMJI zJ*_pnq1oeWrbv5u`;m}?@g;9}tI7#akO+yjj}z z`pwdPuL3slsh(Y!BJ1e2YqPu6lr_RjzQ3N$V&?Pg_59sWFL@kG+%3O4ko%hC<&Bd{ zHKuCr@5smh_cB6Ad2k5AV7ne}Y%H@>A0c3hfp zy17*2XrJ=Zmv6CB+czdJQEYNKKD{YS3^u?6vi-`{Sp)Q1F;(aI>y;{lt)#mBumeRxhnDJ{7N|nXfu!ozdykb2b56 z`ZR?uWo`Y;?>^b*n4ro@7`mA_b&Z0i-%1saE@qBNPjDfPNslrny?8O{T|k!GB_5u; z6W>L=+{PVNC=+<;J!xU&`dL;Oez?|AC2-!PC{x JWt~$(69CcroYMdR literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/hand_splayed.png b/public/images/emoji/twitter/hand_splayed.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2dcda2dc22de4c658f18f369e9d34cc258ad9f GIT binary patch literal 1230 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TFa5kwqB!ni>3`w0kLH{zjsf#N^|K_nc3xn}~Q3J^vCEd|?q zI~pW)EBgQaxG(Gc{#=NFnDAki+o$;+-?sSwJ{k6Yn(Nm!zMq$S{kszN>rlv#y+Pi} zs||o2F)j)63uZ{D^7!?Bh=FPWz5$zFfjLex;TbZFwVW!UbK6k5bFbBX`Xj`%V&R?*L->M_xd&7 z7yd;2-N^E+F8GmF{$;-eu`Ns;Sugj5uUfR@=+48hdH+e8NzUXAyz;lBK96DP`5UTT zQAW>v7WznJFIo|;RjMJEtSn->;8R0{fRR~qkaSPJ_hF`$AGtOvPSs74)#uA^tVs{4 z>d^i7`^%h-jGszZ_z0{HT)ARqkwo!C_ae@#Jl9r!`I?^dm?c-s^iO2q{Ke8*&o^Yv z&3(oAFK6YNkLmtPRaAq{pZVk6{^Y2M)P)_ z5-+Bl;boYzvghl@M_&BvXGcHiGqar6f5OjynbP5`i&tL>RfI&{Di7s%zr^0Xv`#QB z%CH0%=tmv6Jtx}+i5R-G%Nwqat)si+ET+dU4eugjD@_mq6vuD@mPGex6m zyvd4(je{>M?LIU0v}x%In?r8g-?p^4?6%;q2XW&QFN_d7RMf z*>cC#+c&*zjj6h~=+KteMwhp~n|NyG(p;YF#R=!p3A$wT+&dhYa_V`Nbu}QBD-GBW1 zR%-FX!Bnz8Q1tjN%jGq4cK>W1XP&9Q_U&xi$Irh6D{FsO)@Qa|a*}6Lj;gJ9TP|}i z?o!~jgh!X2Jr$7sEN!%wU%6fE{YA_8`!2gS1t91O%#)nx|!ued+EE^j~_qXDJo>`d^(4* zGW14i&&-+HTb!p!UcP6?r^tIqJ*CoM%85BQS&dkgm+h(hb18+j@RG*fS>7h!CZ4@7 zC;KHfMdIk>>8ma_vN3lEPySu|c;jm^zk-uCiIU4dJU?^sK<1w}GY$#)eS2{6)Xl{W zM|E|NnTkAGf6Qct36n_J`}kn@{0)2`>N%}?>$czgHs`fx`996?i4W_W)xY*Gu*!c3 P%-0N_u6{1-oD!My zZU4+n|I1A6)R*txu;|pI?A){1%c=0(rsmO`|IAGI({^S>0QSU4f?W;FpEGq*2dsl5 zlx`QJdmiStK;g1Jz?3a(NdnfWIOgQt=H}$)=jhVY)Zyae*Vx(I-QL5+#=XD5+1Js^ z%+2!Kq3++g(Z;F!&0Y1D zdP#XxofNr$*qJjoG_9u0#`AuA+8Ydd({_J8p0$2Sx6|)ED_NY6U&6HY`BFk$7LQ0b zOw%;C6K{9OjA0fxE*LT=Z%{f5L0$c|Xj%(Ycstzj7v8V&!Ai@d)*QQE8 z(wuE!6D0#rFG(hKkgcb6MRs!t^LV1&lDKMn%O9fTyKn=`j!gazo zm0K4UV`LjrL%1h*|CPI-u{urHGSCJe$dO-Q6bDa|3^z(kE@p$Au0Tw(vB~ZBh^Rf7 zN)EdCm(CG*FB10|DVH{fO4?mAuE-#7*d{rFd$rV|5SV5;q#aXGUyb-wZl6~D{33!D z10gq)n|+Q^%WaxA`=&WAK)v5MNPEOm4z$+nH$t_!;a@BEm0KwcKmqg`EXx8R@EHrdq_IJ;vwPy%#k6X6juCuAiO>Y4Bje_U5nAo`ysZs5BpEB4^J+A_cLZ zPmI4G5(%{YVlZC}Cm~S_$u(~h{x~F(sJP~g38SAaX=gtMW885_R3#Y=&U3}P;W#9! zAen_k%Pd+5W+9-Mg~EebJkT(U1~1Iw1(3`@0#M9A0VtS30ia|C<>>)wmm$2rhhed2 zEdv_v^TGTTJok0@MYr5Dnw61zT8-Zd?&yuVlv9B}v}EFBQ%pz=9978%lL&UFLXqHx z#e{MBn5-qOoj#T^n1vgJMpSb{KQl4++)!iXjkmpGO$*)<8y1z4x5yHSy5bF0jc+>M z&|yP!XM^3;ReVa-VMi_b1X*KODR`MEaX`QEqF0S$wcrJ!#<@cBge-80E?ORt4~?sI or?^9P`u{)cq$*16%kzEs3EDJL+X3l-5C8xG07*qoM6N<$f>gN;n*aa+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/heart_exclamation.png b/public/images/emoji/twitter/heart_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..adcc6238e047fb84222a813009e7809c98c9f32e GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znePV|DBn*IPuOx^8 zBzH*bwKDL7xrTcrjP^+y?gc9VD+8(lat-&28Un>3BKxKFfr22tKyev^z2f?NrH#Q- zKoNs|l0d@^4@ek63;~kIWGwbd8SIfX2AK?!HTciK05J-v7$gEDB@FjV>q7K`NU#V{ z&3-W>5Ge(;9VloxE9X8N&@c8SL4LsuiXnIZ-MG)n^d(I0>bH5De=fTv-W~Wv)wXX5 ze~Hk;i!IyIL^{tc=hQXYe|awBiE62ePw!+F?ebr9q{!lF#GgqeN8d0oFy8ibaSW+o ze0wD{N!d_<<$_e#u`_1`(w<%U>%UcEQ|iLad*1u|+&#qg^6!o*^0K1Kjdf=DcDpaG z$*h@w$nDpR50N{C9)t#HevX`E+j24IP&rq5#Wnp8b5Am`iA%?nC@?sP?9{Mo4AVcK z>dK%|6uFOmF7v5(4R)#Q7c!1dnHs&;D78>JOLbjPP>8eUcNcbl%N0H^Q@EyjTWLC_ zx~R_%s9Z2vErhEisKKkv@7#h(7d)A!+FIRgJ~hMdSU~1wPid`3bNJ4&PO&Pv&={q? zZ0iozUe2|?3pRgt@&2f{Wm`rjca>vf7#AatU*=O0wWP@=x5W)^>0Vy3hkM4?%q#7^ zU%J@BHP`ScW$|Wj*i!7)dxmd~>AV#p=?@>w@H$>l7_sosS;aXy_luU^&b4@zThw}y z;apm!*CZ*MIW93qXAXK_c+!-{;D7Mgp}MFK)4G3TNhI*9SK4{&ZJ2h;ZvV~oiN1Sn zC)r3Pf-GMdM`66_@l66Kk$q)S43W@78niOPgJp;-q4V{$@`O w`{njb^N;DOny|gcqFiqL{dKj>nQ`xVq34IH0t{umfhmT;)78&qol`;+0L#czO#lD@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/helmet_with_cross.png b/public/images/emoji/twitter/helmet_with_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8a20a6b1170af168f417ec4058b2d6925c7426 GIT binary patch literal 1146 zcmV-=1cm#FP)R4{zYi`?~f$CUo=~!*SXinLlg5f(--7Q1eo`Tt) zf$CUo*`9*foq^b%f!Upc-7Q1vSZ(QFZ{00J-7Z7jEkx>BZrv_J-7Q1GX;0lPL+V*= zz-Ug$AUEADMA@E#!D&z5hkM9(U8e~mz#1~@S#F>N9?T*-vJfcfQfJmEKj&(CqXr-U|NqM`M%^w%;Ws5SFc>n+aCv;LyQveQ5D8HN-`0fQ9 zQ`-0GF?BrC!b&Q7UFw?r_sp$=+M~ORq`BUh|(%W%`WckLp?X}-A$b91bGvgos#(z?hpQ^ej%c8DM zIZ6M{ayVBvM0GyAYI)B;0R$EafY1E>B~5Vy&H;JM--`VzQmc>iu!yT?)?}CF?X=cV zC7Q5kQX;wBiVyl=@L?|Rfkw(_A!UY)ofhxS3xj$!#9HFhqL!QJ2gtP8` z4IN6`QYHb>(OPiU!?FyqX&wU`9qnLIpxt&Hf)B!(IuV{i{7GqO%1#vDi!?Mc+<+6| zrsIRFut@58El=p#Ni3>Do#ELGi^t&RAMK4`5vO4hMIwB==irfd18ObwvvBrAU(SMq zFk#1!=gSk-_@efUYHzIt0Bt={8y2%brAxT_4=z7J+-fwP8=93tJhd z`8Clzjk?gamSjxRTsIfQM6g-ZV>H>**glx08O0=F1`!hpm_bfrY?$Rk37jcoj;8PL zw%JZUW#@Sw;mu>*Kphy5{Su!mE z5fn)Pk`~bA0|2K}J=y^nf+CK{uV`DvS#(HsVkBJykSF6qpC;{gmT31+FSXf&m9wB~MAy!#ip=TQOkPIm=Ggw($EGa5X zOim*oAX8LUMMOqAI5}!gCeMBoscag%br<4?5KK>@q5uE@F?3Q+QvfaaBh~&i^aIQx zVcqXWySwh06NC%L>l?=Fx&72ak>ORar`bg*iE=ZDpRHVNUw-%f+S3340pCePK~#7F z?bL;m+b|G-;Wa~;nVGw0m)`%e>R4rWr;(+>yDv=t!~(;+H>?73m=;LUSt7__Pf$*% zi*iCMLrzGuP)exRM>(N3$_cGdPDrsZ*A^Wh9dmjQgxG7$S&HyVWJI@Y-Hv^kJ7&?^g>E{L$Z1~Ppc1PuF#jHN+&_R&HVA0T_B<4(RBXKUsd4xi!xD;(2Uk*+2iP)=kEQDy7q4rptCuHCcdSPyKp3qlB#xUV; z1D?<)MDi?cl?e?x078fM1#^83G9rWh84-<19sb2MctS@1I0VA_<N;>NGcp`_2Vk_E0g+x~c5k9=tXC$N4(i)@r_A zt8GWu^TUM_=9ijZP`k{5k2~@SBNupVebNYcggz+*9syYj1K<%wK@$4~aS}ukXDAb- zX%fb97R>I#Bu#@T!yBT#hnQJJngI{D5fK_L@R=`KQ9)}lhZ6R;MWZomWx-Z!)@Uql cd*Jo%8z+AN!kh3fJ^%m!07*qoM6N<$f)96700000 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/hole.png b/public/images/emoji/twitter/hole.png new file mode 100644 index 0000000000000000000000000000000000000000..0f353402876c970a2b35701fa050405115b4c401 GIT binary patch literal 736 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-T2@| zARB@7je%?}kchFSzLAE$5rdW%NER%vre_Fbs{_S>dcnHDY78~?je(|VX=wo&wcV3- zO)N~T?9W`g>lqj}VaB}lqROS~wgyDT6;;(AI&=BdmD_Wdt#R=1$t|nVGB7c;u*obe zD{t+czF=8JbLa63H>@07H|#uE-QK_N#5qTIpV*Yl$b{5A$IiC*Pu+Fo^onfJ=|GRj zl?3?(Gq@)IV3~dM?Wbe);`1)&GM(8TE)tZK?_f-~GMO=(UFUspVpJ}t6>qJ3_Xw&J-3s$~e_u<;9 zt;uBBGK))a>8kJi(ITz)4lg%b^KQep6`hkrTY^08-Y)S|Yv;dcRTV$s z{Kcl8_?z(=sr4(Sc!-^D_jlp)xajX<6!-`f2ln^M?UIiCdU9|29$-u}c)I$ztaD0e F0su>}Gw%QZ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/homes.png b/public/images/emoji/twitter/homes.png new file mode 100644 index 0000000000000000000000000000000000000000..42fdacd954dff984ec7ae838a90a45e4cf194c39 GIT binary patch literal 779 zcmV+m1N8ifP)$;H;83)$i2(J{QWd*mXvwYzq9T;z60+Hx^;1aR!alu4yB-W?}!6vnAGv)Sg* zed!9$Lpnm*g2RxGkPacFlTMRVbss@Er?<$jrJ(`Y4x*4CtRp2*Hex$M0%aq%BP7r^ zVmd+sbt9G|B(OI^m0PW{aD)W*M#w3aO2wRXJPE9gutVjt={#~$%7DEQc1ZFZPfCHc z5q3JA)mfo}ibRmH5q72{lG^oerNJ^a2WunjG#UX?t>zpU8_AW}(If$B8_5;e`H+e; z#4(3BS;dg=2+4EarMeC&4pw~Ua^LBQulkvcBE8b$^Wr!N09{7r$0HJw;d^Y zU+v}w?#UVGjxI@voSN?Fl7Ra6_x)PUa1_adZdMUAS@*WuZh;*`LQaFEqe}H4$Z*8Q zgCOack^()E(;gWNN$t|Amm3Zw^hi#nu|XA*9wfxAp+W^Wfv^$?Jv}}?;bsuNJUqM# z$lnn`w_Ky4T}Nc&KlIBW?l*?)l7wWxA0&V5JI?sAW&ff7&_@#bC^6_c9_Shl;(-oe z?^nIw@g{T?YtyZe)xdSJej5y#_A3dFT3+1OPJ%`H(x)kIN|mAr&Bk!E}Z&XG11na zfr0Udr;B4q1>@Drth1h2@vuDLGJb4e+|P8l_D%|bU9#5C{uh4$)9D}Kx%cMB z#oOj2ZJV5yAbbA(i(Qg2$39Qin|+Wm?e>PY1w5Z+c^$7QK0DpEr1(s^4NGpqKId#+ z$3hwAaO384?>8+JfBmZJTA!K!taw@3BvbaV&$}-tuX(gEvgCd9+XaFrlMIfADVH4j zFRI-4V{+%*CUrZ>wCdOMX4}g)d%pcWZAEQ;c3nC9GTUFTUY>7fzN}Y!b)QM|y6kQ8+pqgiKu1;gM@8IH<*8z|W!gHwn^=A=KYp3_!wwaZ z#*+#gMSQAN!kRTzH*(ojdMEw_EJvH-|M?x@~PZpUAuJQTjN=q zlAZg~FR8Ew{qb7tskx*=(3hLX!{F64mL0RdarI8ydDQ4>oXhE%d@f#xHDv3p!>1ln zk!);tElU*&-q7mm=MpoEtFdWEQ!U30M#GoU0)`zY&nTv3A1QjB;Nr{E*c902cgcxa zcw5Tk7}3k0I#gV``cvPyEYHkc;nX#Ghp^_$IL^wr(q$K!ba&mn&o=$7=I+v0yR3KR k?MhFa_@>(I-}-$Fr|&2IJoLcx2rvmTcmi!)=akR{04P3l{r~^~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/hotdog.png b/public/images/emoji/twitter/hotdog.png new file mode 100644 index 0000000000000000000000000000000000000000..9d5050a3c962f64157dc891bb5a066f54d59c98e GIT binary patch literal 1066 zcmV+_1l9YAP)g0P)6ZEMf8?R>uX2#xuf~6OWdJ_{J%`@ zdr07=i|1KJ-#bmQo8s%DIi^l(`TUTr4=Dfu0{clsK~#8N-Pq?=<1i2fU?s+OdS_|7 za_>DA*!KQ!wH{fCOz?6%<{$F_-?^g=S>ck+z;Od3Na>5|na7==5^&4AWvr! zWP;g;FP-Wq)D&_!;y)_5c)(fmSfQ)H%TC0Sgeah_Eh?o(VQxq@~&mtdlR zWpYuO`aHH-m;4N*5OoDhjgKcJ-kElSxdLTyEs4&|C_;kW_*ix61d)8qjjMxZ2_F1} zy77h9D21#IP?FRro)Nw?Up4^Xw)5U~rjfaH0*R2BOfJz= zy)$P7pXpd|iMkQ*%)tLX#!KS6FHFKtA)!yCi?s9JcIMutccks~=31RHt+PasJrgs}cFiO(HD%wqbMdUXZ#NHC+m{Q+kBaLXAuB-|*gja(`7%|a#P5qHLa{vGU literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/house_abandoned.png b/public/images/emoji/twitter/house_abandoned.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca92ee5ca4002f8d8a22c854d3773405f18cdd9 GIT binary patch literal 689 zcmV;i0#5yjP)DK9Z7FEYHnz$h*ajB9~V}aV;I7d1#$@XTfPt z&5(81oPd2gDZzwmh($BDcwwh!P^oHDX(SdoHa3h)IFVOID=;&*cVNAKW}A0r(Up2@ zCK$4GT-2F;lv6*0KrXz#z@K1Cn{r}FDI_s2F^*qPHEOkY0000QbW%=J09Q#+T;t>W zRsCD1%bJEs;>W?aF{U8o{nZdw@&*6^0ftFLK~#7F?bL-*12GhZ;nZDlxT(84ZtwqA zq+!nt^@dXz+aI@Y?&j{I{QUl>P$UvMg%ghz3W@M(97w#wOM#_RESh(*06kA}UR_Fw zB<+YmVjW7t`P9T#v*#2i=Ml`5VjT2V0>n8o)1|^WJ*%x{?&;>IO zsu<`>nJ&-5jI+?Dj8fO>1fF152TL<$Rra=oC)m+JeLK;Od1oZdGax`O|ip$#Z< zgd-0)ZGjZo22HFZ+DmM8ua BUYLe3i%Bv7a5M_5Y)nHi)}p2=hSBP`XQ(}@P1Ur z&lGZl+PJbN3H7wC^(Z7X`aYnBP!Jy6`?hcpZpWz{10B8{d%{CyES`m0SUd?e2Ut7_ zwXt{>>S6ILG{WLp2+q+^-M0NJ?d3y0Kw00000NkvXXu0mjfzh5a1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/hugging.png b/public/images/emoji/twitter/hugging.png new file mode 100644 index 0000000000000000000000000000000000000000..aa07844841fce56ba4db0b26ae03d2412dcee4ce GIT binary patch literal 1374 zcmV-k1)=(hP)3iqKQ^pFemkPGyW3jfSZ|GPl{%uN5u zN%W8l|I1AO%uMr;3-pi+|IAJGkPP&Y3-yo<|IAGP%uWByO#jSH|IACdQw76b2I`0n z;(ZCwYY6p~5ZQDH%x4Gx%uRV#3Gcl`wu~tBkPK!;0H%H*h+`4>#z~lQ8E#Ajf`Kc%UzCQMs6v4p`NB{r;A#_qsQvmPfb?*1r{tFge zBFcs@(*vl0qf?DSwaGYM;cC8f%r<0K8lAw?EqB+Lr2(^DB@R#-lX z?Se#srIO9B_^z->m66!s_cK;K{}!uKg$-0HmPHvh%9e9tY!*lUIjc!D$0sQR;qjeP z?3RidzZG^`)+(>wlY*1%wXeb+tU&J^~aMPx;aI)4uos% zX;e@0W3EI<8`JH#tNOlj->q)WtXn9N6l@a3HU=SKIuAgli&Zbel5(wBHa7mFFh>7>@0T5ELWbL)e`IR+HkX8K4P7Z7q{kFW4YQH zKh<`?@U17(wQV=-kQsUG9A{i3!|_0OG=B2$F|g_Brv+O1{Kd_QGVgM;dRe2VeuII2 z`{X~Fn4PW#cRL|0ZT08k{p0!j`}yO2@oATq@It-a((RZ@K^-95f9mfcKG`|I%mRXy z4g>f7(|!g_lyCq*PoGvBTQrm2t!N+X^mg+~tXav;>S?M094MjD&WqS)Oc8GW4?bDR%4 z39@Fl=J;+f198Nt4@_RUlVro)HOP7#v~Y8E>&sB(=3pDQi@GY^ z_iPYX4*=;I5C{)x$ETkd<*@GbvHd9AUcs|;Le>B+v2E0|P*Dy98yo)-@s1>0WBpm64BOiPX_^UvraB8?0p?eTs zB>UR2NShMyW3N$W9{@j7a9SN*U{9Xtcg5OM>N)AcYkikTohG zKY=HBuxZ=B(Saetm_v5YLBf=3WvSyi2ARcdNIx{K;xH1$cMb#_n~6=8~l gOzY&NZlb0C06~s_jA>);CIA2c07*qoM6N<$f{g2{I{*Lx literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/ice_skate.png b/public/images/emoji/twitter/ice_skate.png new file mode 100644 index 0000000000000000000000000000000000000000..373137fb1dc8082a7344a758d5d5ddacea5aee9f GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TMf5}Y`ClI0unm_hnB|9Vy9Umy0e8K&e_TzK&){Da7(XSGezeKtS1=LNW*^IE<9%Dar9*X_r; zmS#&%)OBZIVB+<3aSW+oe0#OE?6H*q+XKT>J&DimExpk4@~?dM-7~u3y|OPKeADi) zsXMsC{lnYa`xk_m^ISLe>T_@jx^|przCoyd^*dQZ<+k}NuG|Xnk+;mzIN~VB*1Bcl z@}LhL6Wm*!UY)qy?!+^t^2>F}WHC5>Gts+TVYq znW^f;^+u+eC#yYP*kyK=&+j?1+kb}Qz1l_H<@4vLeRSCHd&=gx^~nd{1@p0Xmep^M zOt0H9p}jZeclJ5Pnf4uz8y&v;Pid~W^W=uY?-@cg~byLV2w^%B<9&dlY% z)&FtY`0i;H+hTd?yk>z)#qBcR=sh-aGjDz5d6!*ctr0E2`qm)$Vy*bSl@D{5zx~!S z^Z4Rh%9Bo=&@Q}x{I>S(N7`rnWGajf-N{JJ5B;-TLz;D^9_!aYk=J&A+dGncPlN=_ zc@;2W2Ma@xh+8@DsRgIFyi#*@pWfTNCQMq~Mp^l3Y`0s&<~iJ}oR``C5}106EyglW zs3d13{Ni1% zrmrp(s5x>lOwoE_&+x-k`1%62uB_0PXOs@kSjc&V=l!`2haNUNY1T8oc=uJ|ee8vY Qz%<3+>FVdQ&MBb@08s3`2LJ#7 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/island.png b/public/images/emoji/twitter/island.png new file mode 100644 index 0000000000000000000000000000000000000000..8be357d21f948a46c5ea6868e277f38e1334cd35 GIT binary patch literal 1083 zcmV-B1jPG^P)}DYoPJlXeva@-&#ZQJ$WSd@my3PO0Ok9?BZKsQKVr>7cGu@Xm>5mxyvN*5G!T-8G zYA+;dKQm~cZeW*A@62RAavefKiXBR+8*l zAVHZg13Cd9zxqHYi>{(p>;w5ZV_XlAjXXJ(S4^@t1pF^{9wCRsKy zb?|TJ*4{L#9%M=_Khg7{$DRqGUGQm<-jH#g8~e`H_UQDgxd2EV5rj3DcV2YMN4PLj zhTVr&1)c_CJqBAErkzo=;~LRn9sswTjTq(?FWPmnxv0_uFFJ^S(0I{~tJVZt81HP` zK1XCyUbKUv_c(a2SW;wiDUk~{oyRX5OCmB$i%`=uX9Q^Lc|?Gjr$rwNPsE08lQJnX zK|#cFOAc@ghHqa5F6$AP?4^=BR-0FB= zU3YteDxZXM7(~#zgb$T71fe4kG@}q@V$l((VVIyq!XHIUxcWZw7qk+GKoztagt$1w z2cfW!K>%4rybp(<2Uc?)$59jktgbx<-2=FMh~t>ob#LMjgyd5PnQ9!9XlfvhxN0Dm zSZW}P5LeBFF6r`)PHwsK^Lb>sn)zSE)Le^PIs?~}+wX@triB0i002ovPDHLkV1l2% B_Q3!E literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/joystick.png b/public/images/emoji/twitter/joystick.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb7d212e2e8164d05afbe491144ad1520a99066 GIT binary patch literal 655 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-T1fA|Ul=jE!&U zx@zbf%UD=w>KonAa|0QuXQXLhprL0BR0-0h4>nET4JZPXf{^OECSZoKhAv1MP>q(M zA=m*XKofufNCK@$E3KcoYHNIMxs|iW1?PzCroM-x^Vc^{++Fu83g{8jk|4iehA;nQ zo^{{&#MZI)HXGAZ|Bm-zo%Z*Zu?D+w-Ux5cSN*jlDD(H7+mFg;sjpg@^6{L?@}x^# zULPAX7#J9RJY5_^Dj45hJ(|aCDB||e{>+&(F?s6`SN`9wb-hvX?AG$H+qd7Si zTj$2yn6Xu&eNvU{pIJNyr+0R6PvqI5^vJ8zR=-gBc+B(89f1$mRzydL9Q>%G!}h>~ zvs=T0>5$R_?Jo>{E7q+HE!8axjJR?z&^yy=f<)FXrD@)?uYc*8V)Wqj$x^SU3zn2w zz2k5H`!S?>(OLZ&6F6sH*v~aJ`pfFjwx)|SmVD&MiQOggrs<`f$MvP+&whP*>9(J- zEv`|A%m2gLpB`p$_a9tu%F%tG8pqY0|FA~JLD^$l)4bDD_WznS+qlReyQ<}o6Bl!F zk;!+_S(6rP#rI|F-c)1Gq-&5JW#5!( zSElPsxU%<4c1OijprRR`E{-7;jBhWqGC3&F(DB6N0c)joT)R$#T&=gd3YrN70lh<$g;$#87` zy>J%m*LUrlq3ODH(ZXa9I8H;9>qqn=kl!J&bHu}V;7>m$EcJIvdk^s!rcBzt@g qP*3(~UAWfph%zG+3&#cSh1|@>UxgQ(`DX!iBZH@_pUXO@geCxdUW0f5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/key2.png b/public/images/emoji/twitter/key2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb0baeeb6d6739b5da5efff7ba4c2189099fa22b GIT binary patch literal 1032 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(y64Lzf@l6p;jV;}>F z@{5XqTs>nmRb3-ZeM3zhV~CWd9#nw_RHd<#zrTjQ5sVAci-LesdPbT+q;CjhsDowG zOX?tMfTpFF)&WsUQEgf&NHDXgCat(Wt)vzxm{tm808t$XmDYzPX2+x#0-cc#WG7{( z6jsM(6`R>Q=@^>+IkmP7=oib9AirRSzq$cSv z46PsUI=|qJDlgyt?)Qt|`>*=yYA?O)%69I@pMQDw9gHVDuAN#akhoKAVtcrdji4<5 zOjcW|YoaM3FF!e5-xo5!_t)pT+aDKHWNRfoVQ;h-3b`h?rlN4Fd!RLgS4fl)yJNQ( zr`fUKERn+wZ>&peH~*eA!Q(mitUGKcSGAOJT+c}lGs!ybxZ8WFLlMj2jugq2&q973 z%=|4<@!;@-$vhL&JeGDEKaZGX;4w+?(iV?z3l`2aeB#>K=rJ)j!+4VRj9=lum!%lr zJa@I<%13Aanp-;m8&c$#&Dhg3-LvaJ+QljZ)5?Hp786o;D;udvRvPSi9Jtlw;~vkI zUQg$?hbW%(OX{4oN_0u~B$4DfCpFjm9QRn*|0JvEYsQr$Cz_|u@G@B?Blja#O+<<@ z$FxG=+cLfL_qJLu-M8QoU*hU}2~HM==jDif5!)2J`qGuj;^&*p-c-(=P<{Tq%Ibqp z4ZBs|?A=*kQ&my5=YD&V!{=QpvJutQ^{*su%=iD*S#eIs`d0d!qfJrklWt$!cA@FnE0cYyYpid{`aDiOJF{}bI|(}_?#;#D zU(S}g(f((yQdhU@UsJ1F_xFFUf8PGtYHqvu^~$+?E4?kPcTL&8*!!pTlHF%+UR1JA zch7$Me#XK-ve(bw)HKPOTPNY$zM)Wlh#_RYEgTe~DWM4fU%Aqw literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/keyboard.png b/public/images/emoji/twitter/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..35faa872efedbe95f6aeb9b4ceba665ed87f8ca7 GIT binary patch literal 429 zcmV;e0aE^nP)3nX0sxth1S_wVA24DK9gbsd4`aBhmd%Nk2O3&lA^3JI6Q)pn<_CiKuAq$cYlPFoosl3JVZ%IQdm1fNrjZ1 zNl{mGX+aMF000nlQchC2)hXg9cmaT^n&^|Op-L!82&S(W(E8Du&{#**r$MUWNqa=SVG*k-=2J2Z<2&2| Xy->s`4(g8000000NkvXXu0mjfOCZ90 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/label.png b/public/images/emoji/twitter/label.png new file mode 100644 index 0000000000000000000000000000000000000000..b455f5684d51b626c0a3b312d68cb1889b74f3c2 GIT binary patch literal 754 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn|2LcdU+MjSv-x0_ z&%f)O|8vcWH|JzMUe|Oe8)W{? zc})j1{ekv=JKg+tZ_~q7O|N%0-&xXhdqLB)jm@8r)ZUwuezrN|NPf_n#PKk+GzIebK0tZgTIBWR4J6~em#~F#u zC+)5)yXuH0GB7Z1^mK6ysbGA2v9(Y(P{8Hl&ogIulHR#)oKhdQ%Ix;(^U2?MA6#ir zDcQ42u(zwUI`&Fo&Tpra8^gW)o|l*Yv;Lj?nPGl)&BD(t7Hcy9o=BLuDtqp#IH9g(`F^C%ioxKfbrMXk_(IsHc^i1t63QG<}mYAX(}F9FaCe8 zvQ$uGy4x>{3ok?Gp4s6V0zo@x30a9~ zmW8R$;We0KXZPR7#jSl>>Q9dRYhEp0->0lQ@Ao1??u<&q?%H?jT2|~@ta9R`y|Z3| zTH{nXyK|3~*1gnVWV+LC{rcW_uZEQ^{+1qr#nX8VXLz5`(JfK%@)EdJtf~>yG>t{~ zC4(F9@%v7>8lJ2gp3)NDzt=D2oRW4bKQU_ax2+)!neK~Jrn-7s35aSk1im`FWF^Zg zNl)R66Zy&(DbMxJ*ebIrRPf@27a1NUCMs53LUUWHEM?m#bvb7)c(@@e^7z6fj{|}V zgjB4ggk(imD$ZPeu0+O5iZ8pgRL0ASPZg|GlfA83`R6^ezuyj)Y?`p+9>ckpmm2>h SY0U&iJcFmJpUXO@geCyFnsfdD literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/level_slider.png b/public/images/emoji/twitter/level_slider.png new file mode 100644 index 0000000000000000000000000000000000000000..560cb59a09b60867ea736db0fcc225bf159dbd8f GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znGgt4Px_0Nx)jL__JYj;4hV3lB9KrMGb3@}nk zo2jX9Jb(SpIcs)UIl5})%+br6xAWB1nX9&H=gi%A>e9S*J9ivAXYJ%RckPZ%M=wQo zuitg@T6Fh@dCS($S-N`fsY^SLp4)r!;*O(dHy^tk)3YJGbDg!LYh>5@dCS*Ebgk3N zou`vKm-~sw6QEyYOM?7@89wRsv30f z3=E8Vo-U3d6^w6hG?y_43N$=S&AGDKt>;$l|K+Q0zuaUkEOYn&k4LAKrfqQBYR=%) z92Y!sQtA0u4(n{L2%R(BVAbW_eqfDQsZ^<6NS^BgtqsA-0iFDzN)yhtKjC1poO|Co z`@~9vCo`T+VU3MESpHaWPx`*;GWra?&G&U$7Crvm>bBo{4L6YWq`NmjiSZ}*b&r#K zXJ1yhZ){Zc&GW*c6FII;cXBjT9Nqkwetl2cKViZ0oEOtr&hFJY9z97RV%;GVwVE9_ zZ*_+`JSxszFCOi{v};@Q_cxqQ7H&;%9&DC$y14PL^W>Y)=XtjjL>YhQ@C ft}po)Gv8b@_VWwL4TVpELCoOk>gTe~DWM4fAfr9` literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/levitate.png b/public/images/emoji/twitter/levitate.png new file mode 100644 index 0000000000000000000000000000000000000000..3a3c4b98947369ff9e5d2e2234a22c169e5dfd0a GIT binary patch literal 838 zcmV-M1G)T(P)hPW{(fh;d9PE;3PDV*jf$P+Vl0s$r@HYqMLW^{i4t1>7qGW7TP`0l@Eb$?W0Z!|nX zTCD5;u{ZzRT|-V(VQ+dVFEd(bblvCf_`piplvDNh_W!IiW0=3;qgI)!wUWl}#FRjR zLLg>?m|}X2ZFzyL(e9a{sELu8{NjSrh*SSX=TiUx03mczPE!DRTz9MOE&U1bAe%GX zJCN+Ti{eP*z$&9j#KPQIcw_Rr?Ma9L00J6GL_t(|0qxcWcH?RcKw&exb(ulG8A4@x z``^~c3MYpm4Zpc* z<~Roa&C4C`WpMW zgNZA2FlYMoJDRk+`vSYa;|qc1*L9t?!{OK0aM-4J#H7I;9NYH8gKfw0>A9|-F&G{1zn!iBWJs{uH{MdMq1{Er QdH?_b07*qoM6N<$f^3wORsaA1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/lifter.png b/public/images/emoji/twitter/lifter.png new file mode 100644 index 0000000000000000000000000000000000000000..5f43a3577614a4bae5ff7fb9b68a2dc394282235 GIT binary patch literal 906 zcmV;519kj~P)v++6?LTmQ;XDJ?Yr++F|N zT>so$L5act+*~RyF`25hL5aXKHZ?_xze0$?C@(W9E;IkEGXJbHL5aYtmP;rvGHaZx zW0$Z0++6>xGXJYH|Ex0q++8UzGu4h$|Ex3rwK_tH!T-TU|ISb_H8k+nWlD{`)Tc-9 zy;-eyHK?|WfObSiMmVjwiOPFXtadb+s(#dys{wXv`FJGD_kvRmdnj6XPs)}?FEF3A>@ z^NA&a(jvL*6eO4I-;XWlrocZ9vW9!KLvkBP#@cLb+ymGqxf5CE7+YC(p#PxllMEzi zzMd2V0m*&)9AODbrghMSTuVxTlw=4uaZWNp|C7qmi>6Q!Vv>0bM?I1q;9@e%S<2_L znd-F%phL0;S9jIX;hZ1L&#P!4qaRcA5}lAKCD8dd)%X2LpaRW;e=nqAr4fLuB*$We(b zVku}7(ilmqn&|Uq)ktXqX}U(Fd!m4)ATpiVgc&dqOOY8~&dkJ}Dl3*&df9!#S`&Aw zEvYQa#YPiWbR_7V%DV)0&{Vur2d!R~%a>Ihv=hUpNK=b0kcUoT2NfOov4h}l6SN81 z1U2x@f=!UEJ+-vq=hO~5g`Yh;Xb*la?VwBeIhkrlP>#yQ6aTiB`s|t3_HOI8gnGC3 zjj5T`?FK$>P0gfkxA1T4wltW3Ysa~~4#^s0c(7j3%xoq z6p|072%dVTkwSTY^lqeGly<$FNIsGZ^Ods=Kke&mv3PsEf^zlxwpe7>ZTL7ImX59E g=7u$U`5y;;2hD8oJ(0g3vH$=807*qoM6N<$f^hP^ZvX%Q literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/lion_face.png b/public/images/emoji/twitter/lion_face.png new file mode 100644 index 0000000000000000000000000000000000000000..7e818c2c11a15e51c367fcbde5dabde1825bb258 GIT binary patch literal 1375 zcmV-l1)%zgP)(iwtD=X%zs{Q4({M?l0T3?Y^K$m(z>aU*O zFGT<2qL_|!|Js1HhiA^Hf#R@^R#ZvCnRMgAm-eDcxP0#40000IbW%=J01|F|zU|xz zqxsG-vR+V)9zErm7{>qr1UyMZK~#7FrPzg*<2nomV1?_pAt`Cf+zvDI`@hu<*uIX3 zd}hC8*XLhZQ6Yt|1!-u<9k=Uyp2rYb`G?LTZActF2)h#Q>@hbJSF^py>&m?b7#$cQ^RE1i&}uVmN~iB=0U;)Z9XAxZkm3|k!i9b`h> zS&bxpWuga#*tRqaT3}lUJ#5R(f>zkpgMjJXHtJD^Z2^FAm)qffPn2b2R$m zWVRM4tYQZ4w?gbqDAUwVV3r>GNoUMaqOlHYcW(( zeoTvrk(3sz)eW~=El6656GdW*YJSuAP>y8rczItrJZm|u7cU11qI0_==|K&8IFfeQ@BnOa%_@Cl79_~6kEDy& zGwJo>NLnjTF%SD7^w3p4-W(}Thw@;jM~cb+gV@IuB-a6O)S#D_qsHNo=NukY#3Ldo z2C!ZDUurAQIk86f3qbzJT~$$m$L-tWC4Lyc5l)*hu<_$U-pE^ATNe z@e5rjgZv&C3S#C#h+nY5XK?`Ldi@l-h&n&$^+h?REa-WtVJQUg2R&D7P!ImfisF9P hXUy~6II`d;{{eJ+ZiTrxj%)w`002ovPDHLkV1n$MgmwS` literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/map.png b/public/images/emoji/twitter/map.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a727c28f8bb70813bbc8f7751f743f93a5f5d3 GIT binary patch literal 1304 zcmV+z1?T#SP)vQ>!5`GUc{SEayMp`=)!lz6mYRjS`xlucEv>ROw5 zTb5c^qqA11(^;K~R;SB;yOmm)X?nMHe7S~*#N~&`@3zn3%+}ppukC=pu%gG~YP9Qr zy`_c4*nYd|gTu{sxa#5P?VZr~$l&p_*z|?H=as_ci68qaB-tGH; ztEU@nIW0$DJjs3IKQWjv`7tw)V!inX`N&7^?*0d4-2eLJb@lk8Z^p)x-tg&m^p-OE z{^{WrXGJo6?vFL6x1t$5O+H^kKHoBgLA<`#dhy$ph_UNCGLOu|{k8hx>N3M`vgW`4{~i0izQYi6^c@X zV*d&>5A7M9OF|Zkv$Qfm4JpVHfFdZXHdNcSbC4a$q(vJ__{$*r(BzlU>2#=V4dSIO zC{B@DP^!?vof1NaP=p^eeKaYq?|4*6<9ifntjAkKVhhxnJN3Ccs&nxFO>zWkGI+K< zH}%|s2+x#J$oD-n1YRsZ0NCKW76~Z?ja3y0J81%7hU9cv!l4CqB(=a$5qr4#recm6 zN@8-__;Cds+NccOKVYeV!twz+An=ft0R(V{*n(=_*GwM%xo3n_2}8vN6rP+DgH8e} zB6tIW9OV(H(DZOVAwx$%z83{aHw0dcash3oF7ftkG6_{#o;67~1XZe?*?d(J0?&`i z%I}6C_lqVD_w`0V8wwpLB$7bfB%KiW$g6ei7K5g9<@;#L zOj%)}%!_=#11c;6(TH<0v`+$(hZicKO5Ov_3K9q&-v_%8!Gvo zP!!8$o1ro&AT>a`M4`C}l0^jax*;gpncV@gMWyf#D4f3mftSNuP>P|GV}$fbXszuC zS%yt_Ljw#Q^~sRI>4th3TDDqBP*yotvc3jQ2)AuPegY=s=kH&ytL65%HbLV@A}wE_ z6$2u!S@+BNPWxl@W;9qCo&*CTAc}4OoUs=M-Sh|YN!hicT-wDUzTdY8vhexk}8a_=lhp*syxZ?Bt`+r^N`N)6vB*KY#%$%|S O0000yDwo8kYgGg7DNRjlq&sObNz zGf<`F|Ex1qtL;I_|5U5(P^9Klsq0Ur=Txlj|E)6rt1|zqGE}VY|En_pt1?!v>{6`d zRIBd)tTI!h;{U5N|En@Xl+s0()c@Io|Ex3r*MI-mg8#8Q|G!oL(s%#OZ2!n)|GG^7 zxk~@CJg}^a?yN;stnNma)k~k=PNU>Ih{F%5lHvdW04sD-PE!C`_3Db51AzVt`u!{+ z$7rHV7@G9n0g64j5$Po3(5Wt18w$zhe1lcDk{$O3lmGw%e@R3^RCr#D)yt}bFcgL1 zm_ZweqEft`!GTr^?Heq$@Bdoo(jrNh*7c9W$Bu5%gkAE%V)BpO{N!wx)Mlf$0x&=p)To%0s8F5Hu=Vv^0cJiZJJui!Fs~Sz<}KT;!k(pagNFzg^2V z`|Y_WeU_zdTPFGa=7R^s?=3}~%gtu@331VOcZll_1Z*8GXpf>!Th0k_!^K1;AW3q* zGCCni4dPr$M-Cm{YS=mAt=w>ZMbfTwG;5`n&h0owZB}bZYRJ)cq;xE?!!Mr8LDII< z6F}p$#7=cKA8SZDDh^klcqVrEKg87q&qR)8hdX>@FWU-^AlZ@tQQ{9(m5NVJLVzF% zjw0!fF7aPMmo!J0bVvVMu0Oq%%W8u_6ov&ei*Ydvk#?gYE>Z(?)zKvH|77)-(q?d= zJ%{4=03YXm3LbCokEi+O`GAMV$t0ZEqH8L;vPESoDw!II%o0wL<7v-khpOqGOKHG8 zOry2q6ubf5g&fc3@zLooT)b~4VoY+&Yqt6YyTEjo^a%=1C%6F9KuWAaJn$qq#MDrd z6R3~XJ1j~r2o-8pQPdeCLi&4^di34pL=GYKq|AcO5=gnJRW#*A6Xu(=tYcm@l9m_E zw|S9WMb$wfero(;AK!iqq<2{n2J&{miqMvpdPbK08JW@i_8$%#{Y^>*(~_Rr86HJ^ zNp%O4k3Zo=56`tGzoX6o&v{2Fwc6gf1hrW$0yqZTi!MzjSV*$Y)xRjI`7muNl# Xl#kN(PcjM900000NkvXXu0mjfByH6O literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/menorah.png b/public/images/emoji/twitter/menorah.png new file mode 100644 index 0000000000000000000000000000000000000000..f63c13ac9b18c49ab171230e0cfbb4c810ab7761 GIT binary patch literal 1141 zcmV-*1d98KP)DfS|NsA?deipv z`>>GO`uF{*hS$NT;=@af?7 z{{H`)a?t$x{g-Xd@$C82!Rybw>8FF%n{&{^s^i_z@9X3Cpn1~m<@U|F=-9~Z+sy9E zw&%H>-<4|3<=gYJliRF{*y7gm$g<_Uq2R5I*~zo!L!s{o0000DbW%=J0KJZs1(E#J zEA#yam)GV#0{{R6S4l)cRCodH*o9IfX&6S~#$lMZ`^4SdJviL|U2T2URex_%jSR{9 zJ~Ke{w5w;XFRpI%O*dB;*IwxM=MNp^^6cER&WR3oVx^xtf-}#%w&^<9<+XRAqd4`h zbQD+KjgI2Rv)=&HVUPZPq5nhwhYs~$2nE2Mb|0mI!tRVM0BM;!Ac!8hP!i~9_fZ+h z?}qX~S!N6*WjglAh5EqUeSIX;1hTuK3DA_uxMTw8yHE>wbYI`fWPyeM`;cD-YBF13 zD)S1oT&NDb$ZUXtOeFxaQ7B9Y6`29Bk*NVI7kUPUGAW?%yAKDcD3l7^K>R+Ck{JRG z7s>%GnO+yj$W+o+%KBl*&sry4k$D8VJ((7ebD=R16lB&wT}HV!z+wV0DFd`0wD+Mx z0PT(oX=YtFZ9!f#*)}`cS;^!BH)SPYrYJOYOTljePYUJI5J^8M^aRX&x0IKPLKz_F z$mDPfSsD)mH#)0|LN(m@j{{(&D5M3@h=$kANTEu$3DB%rMkdpB>!qIEifJJ;0g^qL zMA{zbuXm1t))idCKpH@=ut78cN3eccZtxgr+hd1)?ummkY5KVj^y-Gn`s%#PdBNaoJ)6)Ktw$uzT+$Z#TNd8NbP|zCIUK0R`*V?cZ5GrnceI7Cen}B#W z(S=_)8!1c{#9B;xzj|6TTF%(jo-Ie;J3s2=8ueBmpx;_Ga-9QDv;gG%ANpH|D(f_R z($oB}hbl>8R4cz6S`%yi%b_%}((i_DwC|zFCyEc+cN23XrdmwSEP==Wu zPw!+Cf2oNc{`2)#&jm)wscl<|l~yQUvSZG^8hY}vr}3hox_!ZWZytTMy@Y{*@tUWL zV@L(#+bgWs9ytiKUOXgQS6;qW-2cPh^;s;dneQGs{#@^Y^?GZk`VP09VQaS(zqrD< zAZpQ?Q!^^97x!e%$Q0GnkkwyFNg1y}g zoXLLLJ4(mIMrVtLi*UA&yVtU8p7yrnq?e6OGMfH(lfbYhtD$Do zdaZDit3>3T_H*2=D;!K8aGF%Pa((0qo!_n&a`#Dm$3ola$%kUDZ%vnW2-FT*p}Zny z-m%)WMRza9PFl*O-_lYqj-qw%3Z{D?!H9?Nbgte9f$I=AG}v sAgczopr0OzWdTmS$7 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/microphone2.png b/public/images/emoji/twitter/microphone2.png new file mode 100644 index 0000000000000000000000000000000000000000..a256e3d491eef3befdbf1403cec4978c5605e8da GIT binary patch literal 1015 zcmV*>XI&Gc#j00Os3L_t(| z0p-$#a^yS^1mHF^En_&xOx|?h{U7V5^1F2B`ej+i^d(vK(nK>gFnjQ5y1hIFJ8Bwd3}-MtDJ4F4_8-*>sI`iHfQ*9$+T?`x8fjmRGKFELeW;feswGE+RxKA z`ocOJ_4TWM+I&%^WZSBSZu+U+Ca@>-`848Q5>r?^YmLreDc!V2n-q2~G)?u=1?)W3 zY)~(~hLs2U4N^%wfQ?7`4N^(GfQ_kkgH*ELfNg6Yw%EePWjpE;HqP5o=dfXDOC{Ja z?2t;ZVb~#+V8gIOD#3L0IW$m&{=i=qTr~aYhVSPhNPcJ@N7nu_#^{p zg(Mepo^r%#H=+u9PS;yHr_ns^I&+|xk<2p*$22;Id^RVUVZe;!5@Jt-J;aja3`1ge zs}y-0yn;!$>h+>k!C@4whawn0VdcCerQ>got0Y+p##WKRZ;$-K&7vAoqz`dlV z@C%HJeTpiER$Ni|F)S1%DVCY$x=T`&1*`-UQsnNUH_&9^<`kR+u#`AC@A>X}(L`w) zHH)?D^Iq;Gu$Rp^V3y&_#4~M~7+)@PLiSWngRc}k|8RKwF3;b+J$!f`;2S)>Ri5Ho zyu4Lj;p;@j%BkIFZ{NLpN6N$7XKwARis;LVtm=>h!g^&}tf_q(`E>&eYoDY1HAWrL l$`Qttv{GUWE&W4ZHFKHv`x4 z&fINxU;e}qMJ3Zy*j1OlC^Q! zg!u3mOV(YuC@+3%^3>;t0$5tt#%i>jsz?>ha?U(-s#|=@3x`Z^X<-f7@0knPP3Mcr zIpoR&yknBG?J8YxnMdQP<7)4PZ=|BS`BK#kB-Ut5ym#n{qUtq+F2Brcd53iJF01G& zPF$byz&E;{?+|0;tW{)IrPEx~15ue@D<=}jn5@6BeAjo0h{-)Q>3 z(fa@X(En$1{$DEpeea`i??_6TqLbt zsRBKsT@vIM%+T>fV#e_=uYR%fsD#UY*3*6bBT-<^n$wpSyj$PXSoZJz*Ll{WcMo3J zePr9)pN5kd7#MeXx;TbZFuuKdwP~?|NW;VC-Nx_cer0*3_x^u`_bx9_b<4<|k9N=A z_F0&@L3vk?`Rv-q1x>ZvZXPMu^ythppKb2cdz&LACeLNzS=AFAM;A(@=10vb8ws0?NrGX#1*)L!PE6mn1;SX)U3JushSE?%AY&MdmZ?> z<#B7-e8#sQS4vk^v9PY!U%qg9ctB8HPWip*3$ixY{@EhiVB}xD%-%LzZpEdHZnjk= zw;nZUJ%8Wwr@G21cWP7itwhO&X%M$84R=0gH8?SE%WJ?J$!I5H7x1kyW%PEqRmS$d395}zH%-qbA4yQcbZ)`GmaZ9hdHu9~&} z&VTu&;MpC^zsZZ=K9Xnu&q3&4}{fs_k#vJgxec96; g>yl?Kd|*@0x;kp@NYi{Pwv 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/mountain_snow.png b/public/images/emoji/twitter/mountain_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..05f51304e9182779759cfc9c2f349fca78094f8c GIT binary patch literal 854 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 M07*qoM6N<$f@zy;B>(^b literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/newspaper2.png b/public/images/emoji/twitter/newspaper2.png new file mode 100644 index 0000000000000000000000000000000000000000..bc184c041ed8ea62d84702a10f581a79302d1668 GIT binary patch literal 1137 zcmV-%1djWOP)8!iM*WcpYasI|P)-Q#9; zf8XcpzRJfz|^W_5p=s?PoJXR_>myzQ{k?U~5!&EM_0*6p`ZzjXir02_2tPE!EP?~*Yk;PDvcY)}tP zh;Frd?X}0ssQ2T@{+`Zx2LJ#AOG!jQRCr#+)yHz&FboD@t-Zx@S(i9YA{NzNwinm; zf2{zZ%pEz0h}0oCtY$CY06!?o`OkH8i@^DKu=CTq2Zx>6OXIuQZ1$`6Jn#OTF>C4i zQ9!NH@hZlwrHfhD(b8~-q=AmE>GdF|TKk{c_d)$+LTo;z+aYr;#7R247?O{Nu&bnV zOQ+0h0BVqO1-Tb?{rEy;0PH}jm2_`6S1wSZ=SB_p+b$p12k8LM4T4ziwcR-kP+Bl{ z5TZ~mjm@3+06SQ#so=3A=*H9uUbZjjRRye!^7a*E?rgU&0i&rz$tw7DX*6>OC8o|m zPO~j2Y-5M&wS7k_mecy!cROeM9H^FdETgpDv4unR#@e7OA8(UeTW7lm8GgYb)rK^v0$}4m<8U5H9XO_t7`g_v=GT`YZusqq$T1+1HkKn3D1N$zc{(Gj!Xp5j1t^%kBp!$c6vL4pk;-<+?TyQctHK zrvyYxyG}@b?lCIAyRjT>&9b`aagRmmGL6EoQm{S++$-la;aICU4Yi~XPu<&@C`MV! zu9QJbeH~|nKq6Zz>1@s|AmN_QB`~QFVLKm}8R_t zDGw-phE&se?gd4(FEA32&`Wenc|CN<9O}pdYA9 zYAHr3Qs5H*MgSS~LoMMm(HM?%txp^%qIj4#O#ni&Lc1F&Z&QW00000NkvXXu0mjf DjG9NZ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/notepad_spiral.png b/public/images/emoji/twitter/notepad_spiral.png new file mode 100644 index 0000000000000000000000000000000000000000..b57a95c28a04cfe57ca198fcb1ea52e4ed55c821 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn)Y7`t5)kTKeIlj2 zHnp@qt+Y0+1W4A0ta+DK0%E6>m8AjIl-8%00Tt8%r9xM|4qg5B%(c5fbo$yI2qR?m zJ0K%u&08R2(YkHzQ|5-Pc?(j!1|+UyWLDMIKY#tseWxy&**YD+c>Tz^t4%$VyQa=L ze&ybd^A9pNzn*#IskO7`#$5*&uG+Bu(5ZFX_a*0-hbCt3I(%x``fYJJrOP+(p1Epk zabx%TU5D15d6XfLF9!6BVo8u+FvG!*KiM?$EPC$r`$h51Zg73M=9AXd&pH#PUfw%p z&z9f+9;sE;FfcF{c)B=-R4~4s(VBPIK)~VjnKNg92DPP}x&8nD)tc1y5~=3-FSg#D z=fh;ZWRi|p&`pW^wH@t^9@A&MyRCV6T1MZ~x+j-6sLx8NxT8OX!BcBy$AuG;a^JWw z$}i0@Y)sg3e!?RLfs>O%86xI=;7i@U`0lxhPc`2M@G-RQc4Bsyc zewwqP#o$V5*20vHKeda`eSJH@$ZJL4BuieIGsW|Svn5|?EMybfoZTQ@e5@?yWI!nA z!)dEu&fNLHN>OE>6lQ)U1F literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/oil.png b/public/images/emoji/twitter/oil.png new file mode 100644 index 0000000000000000000000000000000000000000..6aab4045d7aefcd2d0f96f8d7e0cd13d98f13246 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xZ3?!EyURMI7bOU@sTzxVNmC|M^rOi-Go2igG zQ!#bs%vD=}Xx7TDKyt>)tut0_0V=TWI6QOJ*7}w2(t#RzN`m}?8NPlgE-C!@AvHZC zE&G|GB~aYo)5S5Qf-(63-?Y8e(@#2ZJlR|QeU4Svw*A%NjfyWS*t7-Q0#%x0FDhOV zl}rp@()DV^?g&Qay`sHZQlTcZqS^K?3UpnZSrc+`#iEOMm>8xib44uv9XJ_iG=rzB KpUXO@geCxIS5x2s literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/om_symbol.png b/public/images/emoji/twitter/om_symbol.png new file mode 100644 index 0000000000000000000000000000000000000000..6b59c980321b2f7026f704b349a19f1d3a3f946d GIT binary patch literal 1187 zcmV;U1YG-xP)yu~9pnB7_m)ydsfp-V&i}oRXCz3aYRz(hEw|VRSotk{)T z;CLp5`E`+vIsXu*-#vQIsv#Pz^R^o*ygaYP42n^sYZh?S`QP6&Pv^k1^pdZOYyj)| zzp4S(j6G!ZUlr*_=r*J5arXeA?w8HcxToTY(tbr`P6GuQyOqxT79>ooMRu242rr^3 zD&jROQ|nj{2&4vcQwUtgT4mSF9X`_XSvv*@wHs>HlWofC!N)JM&R%O4@0SL*REs(@ zlxa!-wj#9<5*F+~v}kqcTVu0&vTw-Q_1(?J%^T>lC&NAs(#fn64OO0uWm1IPG+{Ze z3J|JMHAhRNheU{whHr%;YP&+D^@ktUEXIs8QXnwXL{SAdDt59aL#umQgZ!_GA_bT^ z6j}z~RJ17{@XpJk!Bz$GEz(SB|7RH&0NYB@X0=@`jL-_QP7j2!c!uGpK(|sf$9IAx zQ{xHsif>bDr%Gglz}e4Q8PFgyf)7JfS)(g*(uqSA;S~Qg0o>UZs#gJ5#c|=T%D3yxhSR5tSope(a zQ0Ar1YSPqDKHT{|5Z6;-xRC;g<&)ioEV(HFa7QoJ3jwLLrAS0g0BQ75bi}hr zQ@((ya%XVna*?j`v~AI&dGr?}V7<-zYUUormx*YNuNQ*I1!u|EgaRO#j-qBS1wczp zCNdT9?22`=RT4?oUsEQca&yj9C}+++RE!ZsXnrLk^FjO0#IW0;<>85uX=4;o?N6SL z`jC=#%7-3x^XaiBfQ&s=%mWd$nN&oyQ;3L1SbZ|fqB%94s?$iQpn&91o!GWNc;#OR zw-nQ<#)*w%v>uT&KffoSM&tK)T#fzR;HIDd?`7Q|-1DyM!*6j@DY-9T^Sl56002ovPDHLkV1f(S BWtsp0 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/orthodox_cross.png b/public/images/emoji/twitter/orthodox_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..796b51f9d14b475f36a4f3261f1791403ea3132e GIT binary patch literal 597 zcmV-b0;>IqP)M`I2VLv69>W|NqOj=dqF6lW5J8XUzEZ{QUa;rh?VRujH?e+0(-7 z>EQLOi`eDb^T@L0(!c7IXwB{B_xAJq!l~k)dD5hR)bsE9vXk4DYR$Z%;P>?Vy`$ju z@%q=t?2>29%(&;<%7!O)s58sEd?rwa`W()HLcUmZa8o z2V!=ofkG_PjyfkO>?kaCPy!R6*+2;_2Mm-#2N(05pV0yHFrNY%=3^9Lm`?>PKnX1H z4@2Rvm4bQPAx5bfcZf1nA^9&GJ(k)D{^}5^Lg9$#z`V>5BQ7j6M4bL(NZQNx7*{8# z#@bhfs!;cOG3&_)-4oHxBv^@tx*Ll09|S{VdLa~A$_g=hZ@%4?2=xY(VmjLMhR~;U zYk$ZW!lA#WbUs%ov>#0=#o(^Q5ZP_#^d1u%YcH0vLSwr4%KBailtk!#jt_?!94=`VE`V6R=ouGJspVljA1CCFS+ERIG100G}gL_t(| z0qxUezS}Sm1n@CR4l^@6F0GZ6d;eoK$qUKwVYdwb1I%x{W8uG_p;UDpr;2Yia24%1 z_$EO!qMdIJYD9G6Le6vPLVlxKSJ8zkL8$D|wU%^omuv&!Rw3CU*>zk>T8cJzC@BiS zri+SF8iFfFl;#RX4=GJ~UC07sYd6y<#^kp@GLEaK(MigKtj7`%}3^uSPiAdC2Ew7%1!o0P{X zeV+q`12E`_IT-(CEWzO^%25S_eieO}A80X+-+z~vdK<^_mrs}d!NmboiyPV3dZl=T1n3r?`tqsjCr@QtooDN z8Mx{NV|+X45fT-XY&5Jx!cPT_ATc*P1*_0KB<{?fzuj)f$DkLG&;@h$_Ia{E{$)pp zN;euJZDTiD33JxQYBYQiK&0-QYwa~;>TPqSP|=Wiy6)pw>W~R4g-gooH6YGu`+M!X d%KRRGldm1t12$N>WIX@?002ovPDHLkV1j|Cc}xHR literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/paperclips.png b/public/images/emoji/twitter/paperclips.png new file mode 100644 index 0000000000000000000000000000000000000000..126b439269576bb9eb9b95b6866c7bb7e9a8c9ee GIT binary patch literal 1578 zcmYL}c~sI_7>1!xBchto(Za$uv_&M%78gtjQW7o2v@D7uC)d;zBUi*SlT(0V{J^Eu zEKpG_Tq-pxQ_GaJ(sG&+tqhk;OCu)Ip=D0zeE0p{d++nT=iGnp*v={!B3d|nux%FYy(9F1dU6-h%FY1(%}o&GHjvA*79kW;3iCzv~} zh0Wgh+sFiZo9{7N_YFZ6T_s-9`!=CzAFFd2>b9A`^ix4m@PiJG*8|bJvTHA|-*XNN z)PO(`6%p^|#{icAMkyn!7d8c4II>$aR;Llwk6e|1neH3j6Os&+M-R_zG=t20Wc|AH zOI=3|4?juHqX28}QgB2OI(_qyT{ z6Ulj2hSYSUT#@VYlj4;fO>&07*Wb~qotICz*ni35r6d65xNXgz5BxDTEwP)d6o`6? zFO(Xk!70?9S~V@SyrsRxzp{DyLOangY3dGdv^5U<_nV{&`KpLbmpDU;P4|t-2v3}oRH7X8lI%*`83^Z#!e@wK8nZ1 zkda1>F1kOCbniD>5 zOkQcR9=y-)vp_r_?UhI|tpYC!WhLfOS!mvE3~9+BOjtPhqPVaYuL{`XOp@IMRAxOR zE^_JA z6z{0dOD+XvvalWKd5ZZF<(AyQ!9_uHl;%y27VF)pBE{2dM?I-$cn6J*#t1xq4mBb; zITKW8z4Z?;%ph#+bE_Svp;4cy_f7C_sGyPt~7iI1>a z3l8(S{CHMwp3KmFgM~-mb}xg;s=vgkzHP4?P1rCqzQ!lg&8aJAnUR5cbC=?yLK=Ed zTe6I1szZ@3Y3Qq~TVaCP{SF<`wrcr)JCXt)y0xY!P<8Tg)9S41HMA$kD=?gayL6_* zXbV^tV(VOayR5I#rXk_vskbo4?(@5#ObWX$YU;5B)B?C3K=z-+PU;5f#1%H2@x%^O z0+`wO6~CPT8a&Ou4mHZHE8dK(3FF1bIioc3xG(%wJ%X0S;jpkac3CqVcaYYRhv{Z4L zdOyYv8abKPuz2Muo0g)(y=W{%=;l&>)qHRSy1A2E{ z&1t*LkUWRLnesdoJtX4C_cVw&$}oBk(K~~wOJ1vEr2Yv30L=-`jo#Nz2{X9pOA;{kGVOw{`?vtRc=1@q+SUCy0 znhp$<4R%x~$yRkL#raW2I5Kt|f=I%7Q=@_Kva%8A!XHV<=s=RGU1R9RyKDeTUkr2~ zhW4C;gjQCRRI7+d41oi=;XCA011eua8xBeO>UT<{3T4(1s`^CdK?LpI5&{P#vuXrU z9l}+^;!;#KgbhGdqdH9$)aVJagt(Tyw)>*AhM*!S3B4b7(4HH)sF1XVDvt7nE|C?~ zn9jEXMRdW@&gcPIezb_%LmLd83uwp!!VZ?CB?JzZpy@H_w-o!?Z5V_BIE>UtXqD`l zf1$0^XW)o9@cys0wV~NuoDglldp_9-xu9U_zEK1*T@ca3uU?R=5>s7IQEb3xp)`d-+~L(1k{(kqMTT4hWQi=UN+J+b%n@<`5LPF_R*E~aWPTvpg(?GX zH!cAbTr)Q5Z74pZTAhpW`uS{*(YadN324%a`Ah=Dn;X;}K=WqlA+!Wt*&@r+K}evu z6lf2+EY4MMs36aG5R<-VnlHVQEWT$tXq0Zs|Dap~%Gu)(wSQGEAB2c~@WDW!2;{Uk zxbLthNokSE0S9?tX*KayrK01*M|0;&Wn1{>0G z`2YX^ELL}IfELM?1o;IsuujpM`1#YH%WOJ-CttbR+o#R`WrFVBY5P7--?RHn;KO{N z!s(tajv*C{Z*M$hJZ!+za*^9u{pss}(c3hQSFibge%lw`gfk{(K_C4>gW4lBb_>cs znt5=~<;RDuHeYIBN?OpVaX>pE*rjiZQjLYk!zL$_FaIu7y#3(jEOlu@o5>PI-b@b= zGseUDdUd^rv!3ghr~6E@x=sjGi9CpG@MJV=NI22n%X7wS)Oli`}zIDs^jV4^`U&z z^6dGXbkXJ7^W4twu8rC3@%Hlj(ZA}dhu7A{?Ee1$A@%<80000FbW%=J0MqilEA)_+ z2K_D6)s4G-wJSyd00S~fL_t(|0j-#Ya>G0ffIH?XtWvnl48!+-svoTLlAL4L-SQo+ z_T86Ai)5(%&*SaW4g8Xur`ziqaewy!f8ycpo_Vg|&s_a)x`PV1`!7EaPyr9uwOgo! zm)bK_!bR-{D&evQ3hIqG=ou~3Y#F^EZqz}6Tx2_a4-0sG$39!swBE6VcdL1p$X!M# zA+lV3k<&p19Y<4SFYp9`ts@#G_(QUE8k8G4kOa7qL_WLV{*CcSYVPK%&Vb=NEv zS(NCej;KoywaP>`eTp&Yh+sy;^%9XoQ?8!KrN=sgh=*-~mWU@J6h(E4+Se8Nl+n5% zqIS^(T@g?1FA>*qqOd0G6f`}FLP*@3uh{Rf0&e)WxC!&>rNSaV&RVt#;j!>ZSjyYC76nHNW zt;79dPnE1eW_hwHsa?o8n8FrftMTs-cr|l2CJIF3+;b!!B$ddd*lbi< z$^wu3e9?|0BFet!K+&`7 zYa|vrTfdoHG}GDoL6@g#?U##uo+G2Hxjl}SZBf*oXl###Ha%Z#i=yp9bHh$_bDzp^ zarh)rdYBCLj}SzCQo*5ya12ynjL$guSsqI8rn(0|qCG7?icZ^SACBuz*uny>(5ZtA zjpO>npm_P~Lr+yDRo07*qoM6N<$f@%OhBLDyZ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/pen_ballpoint.png b/public/images/emoji/twitter/pen_ballpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..6219ae26cc10900f5197930eeed829534e6a7330 GIT binary patch literal 887 zcmV--1Bm>IP)b)Gbk=HEG#hpt1|zqGo*+@{K-uGsxtqqGOc(= zzi&sSgFQq-HUGp!yKY4(E;9ejO_hB>|IAGPt24)>MaZK?QAaW-X-8A)z*wC~Uuwfxj!0iB!dRJJ`w^9-|BSRtOf!?<@HOseOP&u?zC)xf z&1*2F8uUT5r^`%ucugrk5FTDrx(pyXn8s#5fw7E3IztX9Kd{=Thh@r9#-<4Jw#8C)YREn-8mMn#@OKu_qSPsO7WzN_SR4OPi z>w$&~#8-(1+O8EW1ktN1u(CWoWs;=aZG)(pxpHg!ti>}{Z2`&x5l|NdL1bsF+ydkp zSl9x|)Y7`t()zTLx>+lMdO_kqHO5xXHlV zb&Sn*jV;nj>x$~z(@Ja8O6wiHgMiKeY6r4Yifgs>jjf$Mt(-k_E1PUwywbnD*b4NB zSxJyzFvFkq*Th-n1y0uN{vulu^NrW3a_PRsQ^HQ@nf2Y`S~ zAx!A%k84%VU!FwDX#DT zZ_<&Sk#FFfD|G+A&E$D028TACK4_GEW$N#T`|2WJ>eyXRyt6uQ#htrZ?4D28lnBYp zWpP(Oc+s-}$lS})?&YuZ{L_mCZyjH4oRiMrQk8B|dCK9{YZ(vQR_0E|r+OL%O1wc< zN57f{{_-gI>^^SbGi4w9%V(W)QeJA^wH80TdH5jE2rHn2#l=Q>%SRKWq#@S(BYERgfz9#t1K;r?PNyMD>6~*VU))Q!%KLMn z@%>KOEw!3&GF*pqHk>umpIoM^9+HnnSQ+V(J9eSRC` z&GadmOh;9Xq>uJl_g#xWtjfievn(aXy`u9(bF=r9D~%wc1xP%Ro0IUw7(Vy&e4fDlrJpAuAtAM-F154{C=Nz7ANzSf_3;2jQcLR7KqOGS_WMMhwCd_K zpa@VgNPT^JSrwRD3uJ>d0?(uYS45?szdzE#Pw4p%j!{ujY%$zwhvgpUZ?Oo!#Z6<8JqQ&ut z{fC!M%k`CO!j&%hE)9D7X~BIh)x>~JlXBCq)cU2&XpY;N6UZvQGOK5`rjgd3JkI{B z!mqw_)=Zf#|8%mmJL~f$O50WMhuFt0yXAN4wb_M^l*_g@QMpP_pXb-5YF#R2h&tE5 zvA@$sbJscl^^*jBGoHO;n&ZKG>uLVyPXgDWt$1?tD@J5R**=!bW$wJ>>EBh{uQ9EHcBX-)Hk1<}! znvp6ircQVk)H;VPrp?7zyX?TkTkiuz6FlagnH|g~A*36)jAh!EWmDO_qxL$g7O3o! z7i>^>jaz6kBk22A`8Ca&OEXqV3OQyLs5H&7+7UGSTaWtGtHF^QmNM!J`oCJeyeh$a zt@?4s8$mBQy&CmZWpA0x6Ip29tInH$fkAA^9o|>Xsu%B=ZBPt-Y4d4GO8CE^U8CvH#rwn0UA(Y7TvI-aICCQj3P<00Olx_9oG$2@!PT>kXZ lMlCHt-1dmO@t?1MnewHCc9<08%m=0f22WQ%mvv4FO#tSvT`2$n literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/ping_pong.png b/public/images/emoji/twitter/ping_pong.png new file mode 100644 index 0000000000000000000000000000000000000000..44de4d9510c256645a5613c7168b5ff633b86fb0 GIT binary patch literal 889 zcmV-<1BU#GP)05Eh?PE!DYqZRz?vjq$E_}k=E zbQRrbE%VQcRYSeZI69MxZX<&stnl(%NMrDX&4R+zpjvga^b!C70zOGZK~#7F)z*c& z;xG_~;lEzo-Q8huSh@epT0ufM)ugNM1$<9uCP(l;u=3?xT1n^14Gr=trJ7ERVW#tt zpeb2$$SOUEv6TY3(#?j@P+9V3=HZl?6=ShtH-k4N@}-w-e2^L*Z-yznSSkg{Ha>KY z%&TOX6iiQplNlbFA)8L6P*e-d?8sT*E=M7mHVYN`P!Tu10);NIZ;J7uA#SP^UK0;P zXQ)CV(%z%hNQBJ3ko#331x^K$(EL?9QsGo12_-nG^ow4k z@~f^^CJA{sX(Y}7e#y2!CE!L8?(EiZlNavnHAI<>b+!q(%L#V2ZMd@yvCiIxhqO>< zn*^eK66^QA!@(#Ctfv};3JYs;6STyOPWYD1PCe=D^ht-j|< zaT`(A#7et5qFDVbU4MiwBSd1yZ{HND!(P*m(m7g(ttno|FVK%CI(YaFu-*7#LyuI) P00000NkvXXu0mjfEH}0^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/place_of_worship.png b/public/images/emoji/twitter/place_of_worship.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e0996955968b1a4adf8326f8002463048ab315 GIT binary patch literal 1009 zcmVUe}Rk%#vlyl4Z=1X3UXi&XQ%zl4i`2X3Uai%>VxXlxWTW|Nrpn z_?T|bs)yH-XUz5R`j%_X)WYkVa?qZ4($T)^OiAwE|E;bHXryti+VXuv z#ec@DqC9Eu@Z=PZPEU^ayp5y%GgNZ6f3)sgqOuEF+J{}E89Yz$hr^$J?9cVt9Fg>E zAFw*x^A2Gl#tUxTKBurb_D+!RdPpkocQNvvc&EtoHlyh)LatK}IqJ>mHIR)=P?>;HqDP)+5xv!NSqbnaoOsr4hR{=$vdZ0MfSun!Xw?#!U+ z&M94ILwJ7VQ%}Hzkji5SO*~HMH)AcNG@=w4bt>$_AR_bB?8GgV8)Ov@p+%)%DKw_i zs1!;AZhfIr2+?*W|GI2Q^zZ6MDdCUND@uk$i%hZWQzm5S(=c!ji6`nh&LO-|_wF9*QRk=5p*9WQ z&LQzgUF00XJ9S;>P#XL{j}~^Q>%@+s`kcC?0k=?NNZmsOx6s7g=P80)C|XdLyumGW z{Xku-0k_cIh#G$&;1=rn)O6Z_Td2nz54EsNDDs&r2up-ow5SyiefYF^fEhYPu874$ zr?xANHx_@i6Ym(g;uZ^!eQdq}rJs+V<#vLo#s fSGqntmyQ1b2p~bg0PlAV00000NkvXXu0mjfVs8=u literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/play_pause.png b/public/images/emoji/twitter/play_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..0839a426ee22beb2392222e13f555df64344d405 GIT binary patch literal 560 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/printer.png b/public/images/emoji/twitter/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..58961b6b0966a547a18a12bebaed7f83e1d541a1 GIT binary patch literal 691 zcmV;k0!;mhP)}Pa-s_tvU9Ie0tL$8@ z>j3}%W^{gJc7I&0?cwO{XLWsCt?XQ_>t}U-T&(L{t?ON_>s_tuT&?S8bbno}>s_tu z;OOjTa(`W|>}Pd<;ppw=@%gUR^FxcoTB+yF*WD>EGorD(VXy3>u(~chM_8fUOO?>f z*4;~$&pTRkK4E=VpVykIwDtJmS3m=!yHJeEWYsV!~Ku^)acXIsVJyHRDs5gX&m8fs8lS4EVlH_(vQ8XUHFlYiLGoeZVRADp|!ZN5DDC_F$bWv6Z zRRm=VeW4l3LZCuLud8c?dZ;)GVQ8TQ(!Ono zv1xy|+}V6@6`HOl1E$GpN{80mjGS7Nq2)lAB^mnF7y3C0W|6J z{3#!gUHXoi3n*@VJKGHue?d>EkOET5?cyFam)rkD(;EID%4XGQtO*=JtA=&p%orFS Z{sXX0g2{}SiH!gN002ovPDHLkV1f>-P8jnjT7fJPg!7Y=aO00kX6xCAN+7D(7C21L4LsuO{@}sZ!vzH_4fEL-Y>5%_fC5F zoum4+lA7RrSGzEseat(q7nt~ECPuH_D!+Pq=L*@6Z$Er`qdA+Efq~i1)5S5Qg7NK@ z)@iGK1Xvz;bxeG4vlNv zx|>+u^|$RlH@52KUH&3vbLq#OJugdR=B<=Ik^3@0^L^G|vz085@4R1JbjFE&qSRy+ z<@EZH*uQc~u9KgvSikD@b@l#xc*Aa;?*cQu1zp_Drk{n{mdw=$`g! z#)#8K27XCyscO#_bCm?SE>3+Ia8u#uU*VFuX8l*Je^v2mp0UtcsdH)dq%EQQj7%yI zNh)nzsuVc&po^9;tD9StU-P1e=f352E-Lg`<;m8%GOm{OVyci<>B`xsq-VbC>Y5yK zT}?7VH&}l!li-p0lkHZwi*$AP#{NwcRDaX3c*WQ7Bi~eH9V88(IY*ule|6OS%J2Cu zp|7_dO>j4A3DOMylIkdN^~d5@k7T?w>^qsx-wc>`Qd#WUvta9g2@5n|dULct(TTj0 z&NRn%iQ`6w4Hu`?|1Bs_b$fViwMf)vbro;z>75stE_6Gq3tZZ`(X8NI^?~aL7peV! z>e$&`U>GYSx6$#4@2n+aN76fZPZn)DVwauGRd_(I;o`DIW&SbFqKh)+%$|$a9zLD2 zYMR;Pn->d1tNAy54NeJXG%%ek>9HzIvgx~&nfubSTPr2Zlyyy$W(C)tY>i)Ny89w? z%9F^Ni^VE&Kj+9qJ!adSaU#uViQcy5?Q8X=w{ePmKa*iDTb*^HQDj-Zpnue?(5YRQ zThmti0fVygD({PBrN^F~IXNxvrIp%e<67o)HpSwsHC;PW5`rps)YsHhCvv^j3MzT^ z>fG|(CoVJVUs|u^>zYzP-?Uxo zT03ESbKE+!=>1x|OZ=9xe0=!z=TE!bKfgj3gewO(efn*$arD1q(W^VLQ|f{om(RD# zoF`Yra(DUj6}+=cyO&&9Dyt}Imiy+NR@awgmHL2R2dCM4tZBNh$zi+S<;AMXrd1y1 z=Y^jr&7H4)!g*JrW_3VjkM^H8j&|!b{Wh`rcI}w=WcntSsee{mCcWAD?W@A=ug6Y2 zd%ks!{E2suw=U>E@$T^VFLU0@Pf&mPc>8I?`*vRE?2qW5aR~ZsWh~YJ%!&-2u6{1- HoD!MjU literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/race_car.png b/public/images/emoji/twitter/race_car.png new file mode 100644 index 0000000000000000000000000000000000000000..894f1b62c247a0485c2813cce649626c04ad098b GIT binary patch literal 923 zcmV;M17!S(P)D|NsBXOI21^_W1hUE<`RgH#0LbNl4Qa4ymsAvEH01|XkPE!CGV@u=E^8SbiuQn>w zl8*C#zSz(;0007hNklb5Dh}kIg)7)N%sE#Z|#iKa_VkZQEA`4 z)geQ3YVI9%`Q*P$MMXtLMMXtL7y!YIf9^SrfWfzZ>~R77ujK&%zP&$Y2a$8kV|xIr z?p4p+SwM3wt>6K{Zz7!5;k@ z&kznwJC-z^i$Q*^T5~EJ;e!zy~(k>5CAp zZ*u9gJa-;j9i@esZVJGbZGpg4|I??=rPQqc*wMz%LbL`--ZgOGdW^MbR!lxLm zOC}9F75Ui>lKJ=$6=lylY2Aph>>-&%k&B+*&4!*|u7|n)y1sj*OTz14k;y_7;-Y0Y zJ7l;X#RK`IHLb5CdCS*>Orj{per_~Pm8Pm`zMEh&T#=b+T6;8oGKr#Kd!S}|t4Yn@ zGfYO7cCaFoD2gDbt$(L(bCmwJ-LLV?$z&{Jk~0fe$0V6Xqk>!NV|9sqeDB`CIG8vD( x`>KC&gIt6sl%GtVU7lZEonM}b20Hm4<~Iv~JNv*fW^Mog002ovPDHLkV1o5cs(%0g literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/radioactive.png b/public/images/emoji/twitter/radioactive.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4d0ab579547f1dc9092a1d24a38ee1ab906a3a GIT binary patch literal 1061 zcmV+=1ls$FP)^pg|xk`MKl8~VwJ{prs5wOjhjjrqWI{`Kef zpfCL3yY{3w`NDblx@P_F+x_d)_o+kq#eVzOro&HyDgXcgA9PYqQve3F`O6~y?}Fb{ zGMJ!HH!*ZkRvguw1)_=ekxtG}%z~(k63)1o=jqY{Cu_b;6uU5EPM0F`=lkMM}18_GljZe9mM@Ds{Y9q6@nzPJjnJOnG@rD)6JZ=_HEH-QLeS2g)IWc}FQ=&I0-iS66F`jZp z3K7vC5z%~tUrc&LH0mQFG(w{Tu%|A4n&B5S`ZRa~SVw-ilW02w`qqc1PsA;;yjV8? z_S&T%&kG347y8ld1FWeRbT=aQ2H}y|=uR!E0=AqI^YR|{h}d)qRxwT$?1rLdGU=!r zuqv-*7S5_iLf=oCjaG218%t%dH8IYcla|(CZlcsgLDHK{S}&<)zFot4B42Oy^Djo^ zdxBFkUyi`04}-XVJ2Rio;fzTcj+0rhH@;JbB#q$|&8HHajZ*q#L?1>IeAtq(@w&~zxg}xc zs&Lf}Nw|e$&8GsKE=A4psYhRW$}e=`boMsXT}B!j;lpx&Ll*mt`J?S&W!S1a4ttLh zcfXFie>TBhML8g|lLIouUlz(qo1L7r4a8f&@-DSTyuc)M+ba#m+aWOAjtA67oDwg! zDqg3%U0%O+HL>_B9<}vb(TZ$Gn&F59<$NNyBU6RyojfzBs$$F5lJ@C&A5;uG(UbP+ zdFRz*jdlu1$h&DG@_Uj_$UCnb{nVrr^6msi2=%0s^S;uL$9mFw-tu_N0`I`yBUSHl zi3l4cULl4%rK!+EK;(qzv;Rjm;|}B4+zPEJQC!CzvYqTr1_6N`>z0ios`E{|VUX(>-oL^v;OAA|GwRViRI1(#`3u$BTvQgUyDE9%voN<6a^{~#YLXY{_7h>yIi_Htu9IXZjt*d zMVmY#rY5|kp%_QGJzq3uS=aSV{69_Kb(x%>E~;gTih?(x3Z<;uCyOSTqwD+1EUKvQ zkjv@0qEX5NDoVpQNvXm?%JG?^mciEEyjs7zU;S{x2Ueh>IJino6$&4m@PI8mD0mm5 z6^jQ>xWSGFUG%dCB%XlI4cBvIfWPvR_ zhh5D-z~D@ybvOj*l4Dj$E<87qX?cF6Bi43;UYfBoi; Yzp#JoRe#ww`Tzg`07*qoM6N<$f+r3JF#rGn literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/record_button.png b/public/images/emoji/twitter/record_button.png new file mode 100644 index 0000000000000000000000000000000000000000..3725e1c215e723467b7cd7be96d02c5b48a0ce07 GIT binary patch literal 697 zcmV;q0!ICbP)IF!$^^~I*7wLg~d9D!#st;IEcVIh{HOF z!#jt6-)XU)S`1}3({QXs!%cRHS zzS!%#*6PUK@Adio!rJUtnar-v=iBM@@%Q_BuGahg{(!RBM2^OHt=8Y{_1Wn2#oX=k z_xpaa*mSGZ^Z5JR>hzt&;qdnQ_xk;LuGW^o-$jnbD7V=M0000KbW%=J0MzpHl+}*? z1(BBry)5)9Ei1de!5Mz{0004$Nkl`v!bZK4K{z=o2;b$>@BFX}zNyxdSuk0Vz4pkw2Q&`mtIXCnj z+v6G`R(3%F%&{C$eV-_LPz42{f0{# zcT!^we`0$gg%tTAJpBIXcU5l~O^WYa_oViCe7a9xIX`VQum^cWpNMi(J+Lcyrd^&L z#PPvd>6+gEzgd4@sEs1paw`q7CCf}^?Xv*rqJR+q45zrW^$=c{y1OpxMniaO)o*pM fp-!v6fLC4u*{Yw@)R^dm00000NkvXXu0mjf;MQ#5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/reminder_ribbon.png b/public/images/emoji/twitter/reminder_ribbon.png new file mode 100644 index 0000000000000000000000000000000000000000..09d8d0e3081ac0484a4469d5905e5b108d28ea12 GIT binary patch literal 1003 zcmVXi5DtoyqdbullxGsLaK$O!cb+9*v!5(Ly9%r6U zrR6h(!zy~YM48wdVwpme(ngusD|@+6rRE%CnK=h3cmMzZJake{QvmT6{w3}H1q|9F z_LNTA z&#RaEdR>26J&y%Es<5n|BI?V+V`WySD=YOt9fS9^DCk1yg~j>Z`54GbUUkshXBQ&6pFwAmy_MT>Ci>d1g?)4LxmGj2be6P{E4a*8nIDz5#{fwLLn{Q+&c#3 zQWF}5N&-R?jL3rQB?Zdxqu^s`C?J(-P{ceWVS0%=W((png0=^)L?Q^X8;WAZAIVLI5X zF(qZX`1UbssDl!5NlqK`#uW8}u`KQ}CIgcASiWJ5>wq#*x(>`9!vjo>K73?v>>-1^ zg)v(J4{=Y(vTE+Ptw3ig^{XfiW{;${;~^k=YK28%PA! zM#lG`Lrk%v9vJQb^gJ<|sTvse`R)yr;Jy|H_+D)ilY{%R$Yj~a;$jLZSZ42V)-xzd zb0EbgY5i0cC&{rA){iJr$S~C&Y$NGQIEQqeowR0HO!JTnI*7yej|fz& z?(~lfA!eEX%}gO>nL3EW|IAGP%uN5xOgo6f_4xYC*4;~=-_6?Oo5}3E)#>i^`R(-i zK#$DykPQF-|5dE+)av`)E=2#VGyAhLyx#cu`~Kzf{Pg+$;YC?(xbfjeS^mRAB4(M^ z>-&Pj^Mk_k_@yI)!t#E=^7X^X^~B2m%uOBd=XC%802_2tPE!EA@l+qB2ubYY^CsBq z^~qk2B>=}FFlpNgZ$ng{~aVf_BK!?Hko*ZCX-m? z2~v)CNJ&r71VhK!Vm@EY4iZI7CMt7iy%*4EEg@=xpxO@fx1N%uWByP5;bH|IAGP%uN5$PyfwM|IAGP%uD~w zO#jSH|I1AO%uN5xO#jVH|IAGP%uN5wO#jSG|IAJG`1^NY`0B*$yF-s@6o_LHc2Wr6uRQ+IUzu|nYf1vdm@lfEc#3jAi*rHy z-H?iKH_W(+w23Cys5pID3-cy#mA|-Nmd;kCd9CT7nQvd@%V{-5Z{`%{% z;97?aB9a=?&$i0CGT2ZyYcwnD+5i9oy-7qtRCocc*kzieFc1ddqLHBOGE!-G8+WxL_wJZbP~j6% zfsEC}%y8Vl9{jlOkB6wRNz;OqgPHwEE(U)r;J^;fO$RiWioeZ`W^_*IkGx7_uX&-ih?^k%m5RXmMV zgv(Wj&WOqRR;}+Ciw~qA(BMjIWXT7t3_Lj>1XVU6#VnKm zR5bxHtK3kvIZ@D5i+s;o{LLb^xIR#dJ2NJjG&=_(iciljj1(_8_sRSOJIB zrr6E{32#TS9!YCa>;h63igig^iDGk*np3Pq(sC4Ag4B{?IkfqdF$1X?WfWg6&OC3n zoPYZl&F0A1oB-h4<2RR`;IP#wrSU$M;t2fk$Vq&Z_I*q#t>Ih5jt_wN?oq(?0Xf9X zp{)!e**ZTK>-FM?Y^7+JW$PDmdVJS(ccw~TLr(;&psfD_<=*pLF?XcnmhFTojNvy=d@P8{Hc*Dad}TsJNRUWRDEb8(8; zB)P!TR4rtx`!r?Aerx-`zu12HA9C^DAM*Vp;);%l%0sK}8c}qyiLcse!d$iAUthKF zU;d%+@_)Y^vFjYpwjnQ&H-7TfI^O<_3nWvrqkG9d$xC*GOSbwZLSb8DD{8bVlo7q( z`l)S3m9@vp8g_LfgtDPV*_dT08vOWC^c;a$OtHNB;aKsw&OaawKwuzwK){S%_x_~O zmpy4zj9R{bf70mo4Dv#;`1+9r|4RL{kNSrw^-p68AL}ryp3$_-*UyK40162ugrfx; Qod5s;07*qoM6N<$f`p3lTmS$7 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/satellite_orbital.png b/public/images/emoji/twitter/satellite_orbital.png new file mode 100644 index 0000000000000000000000000000000000000000..81715516af6425204daf89de1c98cfa57b7348a6 GIT binary patch literal 1104 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 IM6N<$g4&W(SpWb4 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/shamrock.png b/public/images/emoji/twitter/shamrock.png new file mode 100644 index 0000000000000000000000000000000000000000..275a5059817c980db331fd100c7e724b8e5febea GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znl5PIwn?iFp`ju@8 zDcckZWCI!D8^X&shLi(Ewgi`L3?%kZI)`fg&J{K(cg0L@C%nps^s6LE@p6>;1vpkn+tC8$m{uZ3Y=$yfX%*8(b;Fkzw*?=(g*W4Z+)L> z_PuK7ESb9vZa$Bt9NTXP95Uprd9JFyWMb4c?pTTVshXDAhQbjZD0E~qIrr{ye`k5v3$lb>Nr)#9?E=5jdyJIlOC@B9oY zp;@Q7-MDj4Z7(^_=`M0#CpFG2{_f@#Az!PT=6L)N*`TKL%WjW&YRQBbpOo|V?G(A8 z^wr`K`x|eOO1EXMs(CFv7Z-Ffte+OL;Xr5N$1FoGnd#TFteUi=g7&vHEk2k1HQ>X} zL#smziq?FnS}axMH(e{~3DduBYXxcLuE^Ask|3Y|fy(o*)ppI~6N>6|3ae@HfAwQw z@EPYtZVQhw9?;E{U3m2U`vyz>Y<9Q0w`&>K+!nbovFf3!d1Bq-=luUZo_p#VoDwDW zf7^GSCpw!NkK`^tQv6r4=rAX@&Suet2h_adCt6+6Js6X|$np4`+ux%%TgKHLi?%w+ zSj4~a?4pa^SHuI3cW%qRb*7a6$A*`c2cA!9{*f8rH_<5V{)uLUw?-V|9uMLprvz#--3YexDJYD@< J);T3K0RW}?!KMHJ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/shield.png b/public/images/emoji/twitter/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..51ce00cd207ec335d608cfc13b6b734d4bd23ebc GIT binary patch literal 1060 zcmV+<1l#+GP)}yH2OlX!g7F)nd5( zcZQ$$ZQ185%H~0<%_gmCr*hIbX?E+wKU2^$&U;{cPm!N-bx=9eIM-clduaZxf8~H) zTSsC-+I+a?fLA&BI94hV8WFm~8So(|Z@{<`sS&9Tyva!dsG5Z4K*D$Q90{8PZlEVKqvqPZ&m%@%)+l>7VNe))>u?fAX^k`pWbn;rkfw$6V2)aLe3 zUjZ-Tla9UHvG+PHe%aWY6nl%Z;+KkDTja`W`W6M(*1k2gI9r*1+(v^NLu=qcf|8k- z?T*=M??uiy5mSl@?Ey#5l~nYUqF+TSC4YGaMxEc@nNfDrErGx)fT~ zfJ{kZbfQAdC4ef*MMVWL+J%R@d)>M0Jr7W8 z4?;rq9zf<*u2M>KFsh!1x_>x$O39VnXAab4;}7+hH4dI#xt^8hnA+)3e>mkJ^C>q; zI&e^%R1cx~@|dCgBDcz=IU0@YdydjMF<@Iy1Qb4PF=H2fsi&eX=InRJ1Mtc@Tke$n eOe8*&a>;)iaOeEX3y-b<0000Kkbo7~cVk>l>@+nnBcP z0tG<|jPB_<0m(ahE99OT|H+#Jw2cx(7Ia&9#*<0PI@Ll(=_#gQZ63) zrvCcoDf*UudN!x^oL1=Bo9des>03GKn?~zf)a%>q({qf}GoPtvdri+}qn>@0zSa5w z&gnqE=#~We1v9*pz4>X4`lom6`ITgDH>~Ekv}E5IqwU{hl9vP*O;T%qQRxyk>x|gc z!=jV_EN8wX8_2-G*yQQr7*Y}U_R{sdLk1!Z51rLgCUTxlDC4&le(~=2{!nHv(T`KR zYcG2J%TsbazW)hheSc>4%#$-t*xYWB%(@xAkuCk=BW>xeX#xw*nS2S)EMcCKx2WW4 zd+-%b1((`j>ksMOI)2wDrp=m^D52MIyH4ful|`je>D@EsZvW2&)-?T?&TS5Abs8gT5-c6Zw$7%<&t;>s^{YolM(^e(8by?+G zJD)jtfl0J@VN=u2fE}$ra&ynU+)x>7e>8h(^`8IQDo#M95OgWRUAA@!V`E*I)B<5< zPL3;^ldl-FF@0UrS5=~L;oPK!i~=jt-B&yZ$wd8U&~I?CuP!WFn#{`~viZKD?dqBd TlMZhJMk9l#tDnm{r-UW|)+QH1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/shopping_bags.png b/public/images/emoji/twitter/shopping_bags.png new file mode 100644 index 0000000000000000000000000000000000000000..685a70cdcdf5cd7a7ea2c5d3abe9e551349ff3df GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-T_Ilnob9vEakt!T5Gk^R_Pz0xivvx3}d!{wx2wY;B%_wCvv*yH@xZ{hd24 zMP#+R@yigcxt-T$K8Y>bV)1{4#8lg)LwB#lEDte%qdE8Aoh3eZY||&qbIw|#W~_Ey z>D6b8g1P>`1jE-pU&5S_ z?Qzm{a$WtVnZfgpFMMg%cK(Ng+x%nveV6{-{q>D`>5C$+i}JB?6Py_r>p#2ByU1#n z=TGbYS6gbMf>;Wt6?7T@e$+H$YvJqS3hB#x99b+1j?AoS?>KyE%hwYt7ijjaV>{5u zUa@ak!&xzfy?R*dbn-?`S*|KE(@soeJZGom>hjHuW zzb{2t)(UgxaWgT>SUhsLVC7K|Ex=)XN1fl!Hsgcz9nKSR|AjmnSm5Y{TfHWb^MZZX Xh16s=HAY`xa$)dv^>bP0l+XkKgX@3U literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/skier.png b/public/images/emoji/twitter/skier.png new file mode 100644 index 0000000000000000000000000000000000000000..0a99f58df8c27a894dc7ad1c5f3c972330715952 GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/spider.png b/public/images/emoji/twitter/spider.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e128e5400bacaacef1c3644e57606c93b4f3a8 GIT binary patch literal 1351 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/stop_button.png b/public/images/emoji/twitter/stop_button.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8953809ac27a0e412d49c85c2d91bb8a36386f GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKY=BRQt50U3@ys(;9fxdM4_UV# zw(2-+-G0cb{jhb%A+7o=maRvD3@ebxA+Qus9E3b3ZUd?T>ayrK01*M|0;&Wn1{>0G z`2YX^ELL}IfELM?1o;IsuujpM`1#YH%WOJ-CttbR+o#R`WrFVBY5P7--?RHn;KO{N z!ik1_MY zwKmV)w^Z6)fZ6wmUzopr0Ls0SUH||9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/stopwatch.png b/public/images/emoji/twitter/stopwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..91ee4827adef979fce16e854fb6ceeee3f2d81b1 GIT binary patch literal 978 zcmV;@11bApSAnWk!eer9xjW_5pMbbe)Yer0rghnS_Er>=R2kA|A2@$~k;#>;4T zfn{`m)Y{%=b$(`aer9!kYk7rbbbgYar)G73W^{hU%g?mD!rR~D@bmSzzr~1|rH7cN zgOi}#;pB*#rfhnKW_5q{`1&a?Ge1R0;6zx6nWnqG!QC!I?z_WaZg@aON!~C(L_t(|0o|A7g5xj@gtuWXGjnK} z;r(ChAgb@u9Xr)A%)hkhS4(5b^4UM6dSITvlNr>%gHvDt_3fnKT&m!kL8csJ{yC5; zv_F?@zWq$42f-KrD`>Y`?Y;q0>-D|6>+3kazP|JNy_)#kD)vTTF)3Qtj*nz_HDayE z#5Ko5zwN{lIc@*bm+SKbX>bZ-we46TyKSAZ_owE@6>_x^uVO4OKA}CUhW%kF4kK)C z^+rRVH$$ToZEJHHH24~pv0Nl2EoMe6O>_{WwL!&EPk2@ zWodeo2u)k!g}|(62G&q4M^6Am(#4{NRU2FQHA+gl$Zjr@lERqeRqUUb6ecJMNmB;q zB1fvxVP~p>YajAcg!9QMl=%FRr?$c|o9xgj!C8V5pX=nE?N=?RiB6$|Q+jtS?LUqP z44py;DLAL5wycw|)KMGPrTR*kqPpu!BBN90(eMOmt zd{C$;xQWXjTI8^b7TO4MSZxFv8**5U4O%U7SgjVC|5d?xP@QYEAdC!;qntR3 za}ACo^#Pg7IaG;oK&p;xXk~D&MbZVq5HaEp5x;h-xW>kNcIU%LdHw^Z)<=07*qoM6N<$g8p^l AO#lD@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/synagogue.png b/public/images/emoji/twitter/synagogue.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc959850a32a57fad4812415c57b690f486e64d GIT binary patch literal 989 zcmV<310wv1P)wle0x8pqce7tGL+b1 z$=G4Z*kQ@oVaeEG$=G4Z*kS3L&cY9TPnK#q9_l7_C3ePZXYOK@+lY&`bX()TYpos1 z!5aWbF|giBt*Q_?-lPcK5E6hT#`?DfNmZeK>*-#pd4N;|;WUE;%X~|z`=`o}URC7d zGD?d8lGFys^v}@>9aU73A!x3T=~Fqn^`R9&W@q|KQ3#=JCjj*!%f%dQOdvzuBfulQ z;n#)KME`T7uNP%Q9s#V-s|{HJX0(FJruvLM&<@pvl!r@zaEj|5=v2=uLA#^T&Rb|z zK<);*0Z86KJEPIA?Ck0JVej?OYygPf9@-7Y8>lzLqCLqOBGv3|PWClGs?RT#LYV3U zU6fF-iPTVZSfU-$m!7V;ZV7PXhLEl=KRKer4oRB@nMSt$Qj|j&MHz(XYKR3S#x3d z@Sst4_9=njK2HZVGuWQm$tPEs$FnK|XT65#%E0)_@%6BZO~ah^N1TUe3;5Dnm3aLmqvp z1o5;0aTOu%H}o6&$3pEhquLCennC*vZ5i!Sd#mv(?SGqUpOnro^F+6cWLoRu00000 LNkvXXu0mjfw-wP1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/taco.png b/public/images/emoji/twitter/taco.png new file mode 100644 index 0000000000000000000000000000000000000000..fdb8752e1f1b68a19357eadffdda13f2049dccc9 GIT binary patch literal 1035 zcmV+m1oZofP) zGXLnd|LC^=tTX@7eE;RH|JH-rpMa&&g#YNa|KXO>@dCmYn`UF^3Cas0>5uN z#;#IJEooens~kCU z0)&R46AFjxwL$J%D6xV-2zCdoh2eUKoD8;>tV1A#;2jdTiMm81v)Cc977pEWhn&=6 zj=H}?Ahg-IHoI5cp>GQnS*uBiwVGLz+KtZ88UdY2;exkc5HxUKo_53GW;Pt+5+TP8 zNoa#m8G^F;xKo;%8EiFiB*ZQ9Pc>>0B8lS!x-(lLCs;#imZU^KM1X-Y^MM8-Ga!yb z7HZL21Du4lsWItXSZl!=F82-f^%;c#+9LN8v~eAs&UO@oHLJBgq{#gQ#mmqRqtUSt z1cmK%y2YVk>D-X;y>S&~L8BlTx#wXEr8$m`o<0lTYnf0XAR%}LMijz2L?NYu;0)G| z@N`1RePGQC=T@^GK`B$j89oAKKHnkUEvTpmQ3bGeo|4kY3B_OR5EpO2_;LAQT7&~F zHV>7ngz;A~y)TqHZNZFGWgQMJhTVGw;n28{AVG%~&Is-?DIMMLwa^u*^=-UA_%$7z zj+w~$*)DlEiEiW&&kOh4BOEgZ5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/ten.png b/public/images/emoji/twitter/ten.png new file mode 100644 index 0000000000000000000000000000000000000000..9151e978ce431ca20e16de24ade78e0b9d6177e7 GIT binary patch literal 922 zcmV;L17-Y)P)IE!a9e-EQiuMh{HRG!a9h;I)}qLhr>FE!#aq=NRhTXh{HRF!a9hFe)~d_okGtI6>h#g#@M@&dXQI%r&gN2<%3hw%hql^;wAs4V>6yXbVV}=_ zu-DGu@0P#cbE?$A+3SI_*mtbd+UWA0!{ADh$aSmK;{|)X0000GbW%=J0Fm<41@zOE z{VToI2adkG$DKfi0007cNkldC+X zrWvU}3wVKJz<&|?usyNFq8_PVICU1}i}gMp4ka!cY@bXkw}i+J$v`Nr(Ke!%xIkN3 zMZKXZ41q@t+c`R%OeRD38n#g>R1iS=J3z5ZUw;#>)Z%Gb1FbPACq*f+c-5DZz3}9r7V2J)`!n z4lTg$#4HD_(1tb;HxfRWZ7D;$=5UBO13M{01=yMzT(F}u^a9&c!yDLL7m7--Ej2vB za$P8a2&rKU;i*DTFq@h}h^;C#1A9?R3HDTlj$jV81Yi$UXbg6tmKw}gg{ELGwamdr zs?ge4FTw#k{@OcIjL}XNy8d|9&Z>|PHm4>F;-(7Sz%pt|Are(+1Cdh03apG&Au9u0 zQo{r6MXC@vt!Wlhu!Ax*?OTz}{!AG3m!fM0KT|n6M+#1LI3~&07*qoM6N<$g5K1t*Z=?k literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/thermometer.png b/public/images/emoji/twitter/thermometer.png new file mode 100644 index 0000000000000000000000000000000000000000..53746a78bf820f29189f76f9b0f4650a45a2e873 GIT binary patch literal 868 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 DJ)IrE literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/thunder_cloud_rain.png b/public/images/emoji/twitter/thunder_cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..71c2af1396b6210691dbd7e73c687537f75cd4d7 GIT binary patch literal 993 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn*tKtfsBg`|*tM@? z*1iEEAU9^sn`I|HJ$&&N$awJL?SixKfb1{*+z|5f1fGY_-+Y+>=1$=LI8g{F4n(o5 z-^Q+a^YFzxpdmonFa2CV!AH-5dfz;F_3GjCw;+?(z6P4}zncN11!xFF%}bE>&mi+b z8Xvy|8UmE!iCOa+CGhWhJV2v>TDJd_x(D=&ZAp+{FvD7D zMzvq}Kfht$xAQCC^G`Rke$6=DX~6sGxIw?sg6VRT93Du9HJ`oBHfNd3Y2}d6Ut877 zU-&jJ3S^FpNGnl&cb>=D29Ixc?wC1q z^V*3!nHuJ|{mf$E<@Pvm%E(b|Q;U>xH;2V$4*ugxVOw+@S2;P#rMh`@pVHaQXkZj? zz|fPt?pK|B{+)pRi`%4kvG251j@1ACY=v^&LGI1-Voy5<$^Q9qJ@e)^GY)14i+!q+ zN=ucvgue#IFOcuLP@3cO|Nr@0Qjhy8-WvU`5qxNIxX|**LAOlXTZ_t(?+)`0B+YTR%*EJ87@rmcH{3H4dECn^DG8PAZ=aowIaBp6;;`{}+$!dZ=VYgo_Vo_3m6~|!f zccK2{@#($dZdrm~mkB%E>~}pK;j`zKWm&@FXS*4FPkmIf63qH6bZf=TN8!TU)35aE z@l4@*WSRBs@3PD-UXN1`i@LXmZ9X59pSNS#iwjwcTDzp~o%v`rCzg5NwmTnuW^KQ4 zbxMiSEz_)uFz=fO+ASvb?|*nhN#Lg3lMf5q?C&Z0Y1>bpCVeiNrLX;E-<%5Boe%f8 zCS=#{u)b4pPbna_$N%JA$HSaCf;(mfYKN~?-o{a~-AdN#UElEz7u}jacN;tOyr&;N zep|Ldch<}Hg)40CCT?&wR{goadi9I;Iz#&x=d`+>_AInMW9~1qpsRMelM67NGkCiC KxvXR4{-SZ(Q8Z0cBT?OAT?S#IiC zZt7TV=~!**SZ(T9Zs}NU>R4^;RcilcX6jgN=~`^+T5sxEZt7WW>RD~*T5RcAZRuET z>RE2S88PWtZPGML&oM~WJ5kUyO5sak!XGx}P-faeSJXI8*gjOtD?-pSNysKX!5cH^ zS8LltS>8rm=2K|RE=A{6YRV}=<4$D18ZpKsJHsD1`16z10000abW%=J0NENN7vJI= z+8_AV)!Q$Y4o%SO=E?JqW+(!vJ3hI(enfz6Gscvw0008LNklOa7T8Ok65JEe0UhTWd)RPOo;0P3}>j@w06 zqgLIaRL!AO^?c$mj5DcSZ605J7I*-@SDGhMSrIUKwsY?8K}Q9^(9-FgIw}OlR?buA zELG7QxUzAY_s9q0M4i5c(*krU0x+<2yi;if;HRClJZMsS`AF_f4rr1OVDw}$k5Yx? zXV5wY(73a5bZNB#(D~K3aVSxpygUwmKlaA866Zrlmlj8`My<3XrDVDhlG%~cOl2kh z_HCcWQ;(AAyBj3xLK2Q>agju)n#Av3RtmBccg;>R+r7oR*@sbz0ib8xYv~~i@xma5 z0MIo#KG-%9k_HV8dwqCdNI#^+)$m|A=Q*^FQsUgLzQgY7`gc#Em&)ymC$ru@|L&-F z4|>?Cyw^+$%?=X~4nmSndy=06+Y9JTeUYToyhYZYlG;JEptM1raD)^=G*?2B4*aby ztv6?P<94H_a3b~oMG6IUR4hB64(FkxC@H=?TAOkXB~GuG>Q3X-aa+99Kc%TA1<>0T z&JqA_o6bo+0Ekr)XW~V|UQeBt<~ZH_H+n{T-GfcJm*xnF+wnJ^%su37*9M2HNvWV_ zu?Kj&gV;;UZ2&-UMk?&&U#`#*wd(-9C#}B|<8k zYo~O7_?S?#aGd^x*99e>Px)T5yIGea&?((tAXU1w;a(RsC?=vr=R#t&F$6f;HRF>%2OVu6TaJZpk go!jdUANr+%|Edvi>Y}40CjbBd07*qoM6N<$f)G3E7XSbN literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/timer.png b/public/images/emoji/twitter/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f6d21c6c26edee03e3a05ea70d53ed9b08bfb4 GIT binary patch literal 1171 zcmV;E1Z?|>P)PE!tGdLhxWaaY zk9&!e{QUf9c7JPngxlWW_4fCHj+kb3e`t1rq_e!j!^Pb$L_kGJhLfEC|NpeMx8daG zi<+eB?CiV3#*&?+z{bkrNnM(#vX!H)n5M9#t+Q)+gZbIrDK9gcsk6Mkzwn-@{qgeO zHcKrtH*bE3>wk>y@bTtia`nH)^tr(I&eLvvhoz03Jpcdz5p+^cQvjaK2UdmQ@ctyL zxNsRgGBo~lESdlS19VA5K~#8N<(OBKqc9MJ*BBeHHyk-R=j_dS@Bja-qd`pB6cT9t zc>PR$O!r8G#Fa>f+Uh86P1m)y(rKy2)o;{P8*Q_oc0+ASV*WHVvs7B+P6Bh=)lI$> zwI;^s<^X*+3#~UVj=eW4ob8C-HR@#3V$b(xRveuvwq`x{hE`=(hLT}6wi}fwwl~aQ zMNw*&@y?34vNDt=OzJu_73KhYzw+mS;{u@pMb+7O_*&Ty9FgRXboX4BE02TN=q~ct1@3pDq04-F9-55 z>Cia!#MulzU;w8s34NZOcx$t$7a8Dvuzq^31zNDU+iX>1ePYgMbL?l3=;i%b1M~rJ z*b@dtv_o#0f#V?4=T|ie9okVyEf&$98F+eOsA`9MghV^H!?p)av*)KZI5ixu*f!~; zAO%?$n*a4V$Q^!HEC8gfP}BbAS(A?MH5|?p&>OW4>l#}*822#@`y~#Gx#v#?m?c=- zDG2>T_Zh&HXHXwwpi#)zb7j1Y(h8%b)g5r{@DNn+F%K)v{a;eP_U z;B!;}{pJH1C3+}=dP_#lU_5F(JN+YuD{JZpX!kuN?7q>&pzylYlO*DN6j+Isaa zeqs>R3*E}As2D`rh%U$2U)3N&*>U-G9T*9a;0J;XNbpNT0wmD?3u<4^(dbTdiRhet lb7@KR8{wv*U4-d?^AD@B%W5q5d;b6c002ovPDHLkV1mMXJ+S}) literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/tools.png b/public/images/emoji/twitter/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..2448331da8ea82ab14ea5f970f39c945c23ce650 GIT binary patch literal 963 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#t^l79SD(zn?248z6L>miEK4n| zZ=boWW9HI}-Jb0;mZp`~b<6|_woPBwK6Cl!2|TGKAd#xBX+Xt522e2&eeLH-E2#sb zin^-QQV;_u)d@DIeFjj$QXm40*MIKk1|pyqpqkW@`Y#i>fe0v4T3%FBnVVKp3ls$E z-83~5sPRib4@4Fyl2!^-%yVk8`{xO~o2F%7=~B%tuZ+6u+zs@FSxJyzFau9=?3~cw zOn?7)nkwT^ske|!tNUt+uk^z{b8rpoVH4*>8AtEy)|EU;O|1~ce&H` z!g?7Pn3_CY978G??_O`6^vFS^^M0xewz1pefND?t_7kOnVmL zcU;nS9%qr&8XmSQeSX0Y@3fuioEJN9L9qw#`$H2dFB%_Q8?Q8Lss#Vs^=ub6pIiD) zDd_0j?Lp6uN+me72Yi_}HD{gFbxY}05@DT|$9xNKxaPR%eAqcX)LG+I%A0>jB+R~B z&RaX@(FSX6qtEBJZ&={;ykZkq*s9Op&rfB&W_Iz}-ItY@pEWu>JoqwxiIsg_z@aO1 zPJ9b~=JI^Aara}(i;Euwc**k5W^B%B5BgTI{OnT4N7iMK1zmq$>z(vzwzO8sdX(-=?ZqM)= z&t{*0CiegDrHfv!{{*X#g~wX$ToV4;Vv+m5+e;Qt&)eZ<%rIGNZp|fW^^mvIc9nec zXsM~Zulkbpw$&nKkLzOJE+zWpvA?P?iZ|b*diTL(&U5W2uAcr{W>c~)?6mtoGjsEl df9LHOY@6;kue_7?4w#-9JYD@<);T3K0RYdS)6)O| literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/track_next.png b/public/images/emoji/twitter/track_next.png new file mode 100644 index 0000000000000000000000000000000000000000..9aafe8deb86cd7e9d1c346bb1a778dfe5898ecae GIT binary patch literal 656 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(y6XLtrVOI0$)6+y+zw)Me3e03rg^1yl)E3^L^Z z|NlVo&p&=A%sc1afBgKT57q0huR8Pe*Pp-t{{NqL;C}YfOEw*c@4otK+j;oymtP&* zZ|}JB^6$TY_FYGg+k{(i4xJdX6T}Kkqg1_?4%hvX)%TUvc^E zm!ETwJpA_aPfo&%>p;KAmIV0)Gq6t4n)vzCpUZ4Ie>dS%`K9^dz^{(Jjl@64g z6KJMv)%B<~Sy7Gkx}a-C@o~1GWdaZXYD;^}bZU`*U!%YyqEu6p#H<LOQOFZ0c00RM)5YSS;0+f=ryg;k;EokiOfW*Pr?t_^<*L98 z2r=cFYr;OKmU%~(aZQ||Vk8t8>*EqKeXYRF`YkHA?wtSsR{D=3ueOo7R<4A{nTo{Q z2ZE%}`-uJj=#q3y`U%^%ocEWX2{?*A$SG!DyYu43{8+|gW~DaUtTyaF^MfHhrex3h zw;NXEJht3ky~J>fVCjOmjUPg|7%I5~1sSrY-?R<4R0uYHynMCDN#~cPt5w%74S6ea b;v@T+Nztp?w4#H7(Zb;A>gTe~DWM4fm!3h> literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/track_previous.png b/public/images/emoji/twitter/track_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..d6f3c89e27557cd91b2354633474c652cc179072 GIT binary patch literal 657 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TXLtrVOI0$)6+y+zw)Me3e03rg^1yl)E3^t_W z@c;k+Z8{DwIsVwa|9JM&OOM}ubLc+$>eJ8tH(r1K@q5#S=YRkGpRng{*_x{{bI$($ z`>$#9&08`B!KLrm>HF`Oo_HKP_w3CVpXVNV_~F~{v_%&# zJpQ=x!t>92x99>rB3lyV7tFvqMQh^cPk%16>HM91z@qLn;{G&S=eJ4&-5}O?)=xzW2JzeaKW2Hj8U~A%s5xaF3z)^llBM)lOF1ORTQ4BPvsqZnbDpr4hr&nGh5rNg zs7oA3_$K`I}-L&8ix9*{(^3R-hN*s;Z_wLh-(t~_#>g#vQSI+(_ zuT@|*d5^o4t=|gGsY;83&vd0oES%FZW%=duG$F^8VLsC}pIu;l8>VTWr5c}=c5w$| YP;=m-qD2pjflFVdQ&MBb@0Br*^5dZ)H literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/trackball.png b/public/images/emoji/twitter/trackball.png new file mode 100644 index 0000000000000000000000000000000000000000..8205a4e84310168ff3ee7bca9157786b56b956e1 GIT binary patch literal 1253 zcmViQe-I=Pj zW_5pbPO5fMtAu8=!Nu2-qprx(+PcQis=33Fd%Lu}%zIg`qO!cc%F>9Lqotb0g_NG1 zt+>L?)rWbpYk7o@pQ(S3nVpTol9sb~hmml8he$jKLI3~&9CT7nQvgkzD+tN({TttD zNPGH;w3&jnvs&W?moe-ky8C=eN6u*P}nvd3fs`@b=L8o94b(;{Fe+kLO+m z&mX_koFPs{sIy;r?s~P{o&DMKcN6NWtihs&f*QXbv*2+Ntn{r;NJ?{jO zU6T~=m3J|soW;OSG+0p1sOnliNimt*iRKehd{zXKl(Q9mJ5gV3DQ8uVbWMt>y=Y2` z%aZ7+s7%ene^wgz*!f zXrf1Uu#kD?LF?@E4qzc2e$K0}?~j<&*$MR|^IPQtld}j1E{V z>ov;-9grEKbKaB2v_`d@lE$9T4H4#_>^Fo|vz=+#%@#!XwFJ{QM2}pIP5Q1IWDa3F zr?bg!JQiX+-c4px>>xQ=;JUsnhQ^P^^%vbvT}2p4szpYjt4NAo8`po!%nn2f-^)f+ z!6@^5{7R~_G4rh^x@6{+s@=_jD~M95MM3R?`njBmr+jU1);0q zkBZ8SM{S35)Q>#31m(CTJR%x#PUpzDT4oh?FA^0p+NVQ6>o_3{aVQZXjDx zBQj&49~wC8@`1{s8k`k0itgD_Z6vTy;W8}go&f?iMgm!ytmJ5v3!TwOu96g4S^{Ca zf5Y+rO6RKzKp+MJ;HJLNIW)w-M*gX}Q80MH*@f{&hwLyYUd51QL*RpW7P;V)6iGxHaamo|Ew~=S4UQ3Y*SxnUTbx}88E9%LA@9-|Ex19E;9eDGXJYG!D&uSSYIPE!Cz&J5`-=l=cv23RWb z%&_E;RLGK!KRGF1toGura<9YtersRl9{T%s%=eYnL?_&B%>V!c5J^NqRCocUmxY#t zI21r18tU#o?lENa|9@*)x?~d4vQ6e5g}^<}fB?S)A3X-}Cz|8;l3nl@&*=S^ z)f-rIj7ONPV+!)Szdk-bOH;oIb$Ht_oSzNo1LF@7(_>v3wumuC2T*0v^$%51AI>s! zBUTXJss0}4{5|KhOsya|m(_%@l4uGNJzj_e^|{Sm;mM)bAaM9;(GE^A?BGObk_^#- z8W2Bdq7j^6f-#O0N}~v6BqcPr36rmi>Zidyhkif%-ar$eRfddanrZgbICe%7XgFgkWQ z%HkRii$Er5Ldx#3qW4$Pi#b5eh5Trx2@vyw)((^kVqCm6LRueKVWlGk|6{N z<1cIhL6k+HFfvU{j5h_DrcFSE>7u}>yV=3)^7;{y9r43t*C_Onu+KD&T!Yc zZ0kU?e?{RG&NAy<_?#wDDCWn)B&IOhYthvIbm+Lt<>1sk zQYC&{J+c<@u6ksh8uzP5rd;tO3;oE5HZSP4^&<;W*U^qFQuD=);;5E?00@jJ8Tp~S Q6#xJL07*qoM6N<$f}1k^ndX3TU>s)1O!kY&n_ zW5{|_v3F3ebx*8|Va0`9zGiiQepa<|Ria>~LSX;^05Nn@PE!Eq)%Xb;1pN@_h?Q89 z*fwPDctA0Mwcbx=ZLmqq`SYIS^)&FOiR*E{N!hA?yDGp^SK>VY00N&$L_t(|0qxg? zcHKA-2H-LKGBY!S#(bT=|7)!+-Q79Ps^C)EwBMmb@%cTV5d8J6%wl0tG~wG7<3tg@ zT_H{s;M>IX!8{EvB=^kjF4L!2bl|#0gR9*k2N}T_gG)<6aQS3*$T=aozcBRb>Sc z9hY$tW<-p0(|D!)>2kW5aF{>^QAykb6I}x&gqDJd2Yd4H6)%&dv;gGlny7~!&!Sf_ z2NPBuq&if;;NvSkMrGZ#HEK-0Gx?XbHe}d6 zOobkkj);atybx2p>@6=L=P=@;gv*G7+&0sgMZ=^aWYGw-%dpx&x-T?-n*1@ zv*@ue4WcKk8%>BNKpd2Cm}H72crq2*iER7w{Zns>2||lrC*Qt&|5S7fgr;l&ERYAu z#@Ga5L%aQ4P{0V?kPQeb3SQnI4+RwjMYc2+qD07KYg0hbP+%D-C4ENA1X=qABh_QS zhyT;-AFGTs_EsiH<)4&cPEQPV0JE-O#=4oF4(WY!=xa11ak14lz-sxdW@rOv*Hxry zn*W{-pH(ea0Bx17HW;cRe&MaIjb(Ly1Olzn2Mf{qP-+2zDGdMs002ov JPDHLkV1gFd(f0rV literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/unicorn.png b/public/images/emoji/twitter/unicorn.png new file mode 100644 index 0000000000000000000000000000000000000000..4afcbe217f577d6846013a3bb5497dc1cc62834d GIT binary patch literal 998 zcmVoCDZ#MX9uF^97hDe;Ig zZ7Guq9nlQ~u<+s>@iLDYoCaq)OlBNEBeupNo~IXx#jVUl3#I5BRik8hp-lWtBk-EK z<*A|kIG>E9OqWIVAuDsAm`s57zq*EL%B@7v8UEY zEGLdr{g=mk>Y-!{(~c9rcep{UxK{CqOr{d~jW;IsAI=b^rnWP06rr(Wnr49?Q^pE^ zCWQCcMhWxX@uC`vDDsa)`zYhm|3KuTkWw$Qalzfq9qP!nq7dh#S65f5wgXzxST4d` zC+gyYo0l6w-i#G}LyLT;H{|Hub(^j7&!3fB6foV6n?Wgp$ z=hzcvh}rs!hx2s(R{%s{jB1 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/upside_down.png b/public/images/emoji/twitter/upside_down.png new file mode 100644 index 0000000000000000000000000000000000000000..e8abd43812601b912f310e5b34ee0d10c78df3d9 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn|7U#vpYcILt{{=q zKL2-z{y*al76&Uh>xZNUsNVPgGf4td#N}hOcy72OP z1)we8k9rgbvXut0UtDbZ>$um2MW&lO)ecYBOL&t2@}x>hkY6xEUUKop5A1J$GTZ(= zJxM8gXXkTg?#=7&NQVX7-(bXPD#6!aJX_=A90mra1Wy;okP61NH?9`FHV|NYV0yc7 z#_2D!5AhuRUcWjx@9Ad0r9Jy@&y6&^#CUM(O^fZ-^WIn6{@#;#kF}&_-^IcSk4t*& zGb&7l)mhcZ+{K;Dv$mV7C~vU&b8xdt)#?;yr}eJwJEsZ+9XfSz-KuGdYh#u= z>9TXpIrMDquYgDM1y1uU)G)dEt0h3ps5I-RMbrI7b5=Dkwg?s4ky=pJ{WHtVbV%1(%y^gt(8p{-hW7C!1b=5UShiaC`mGU9Dr*^e@ZUE_#2-+Hmr~3A5%GSGiqGtAg7TX6{>7d2iu?CqGR?ceO0= zTmMUu#na@DPr-o{;~pW7Lw16a0&6F${xk5sCLrl@rI9Um(Sb%bKZo!OkNSKv5`&nd zOkT)Dm7Hu7Gn?z!ZTx9LtGnHn4>w&NR~U3059s_6b9qzkm#q0KU2K+Z-tPHD@8&7@ zf@3`YgTK7=v}2k*b3)-4&1wA$PU}pJ{F13A@7NrCV1L4$=b437np4~LFRRY!xBTXr(0gU3^6wR{(aHLPuVzhuv(;^`YRnc9 z194s5P@@~CS6Ep;Sa0>B2uJlcs;E`7P0StzUz4UElhR{@0J~Y?pa|XU8&S7V)&jzrWVr$ekh1DEgay Y{bZXxiP!p`0MjOer>mdKI;Vst0Kr7czyJUM literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/urn.png b/public/images/emoji/twitter/urn.png new file mode 100644 index 0000000000000000000000000000000000000000..cc65fe127e13a88cc2b8302b8fae79a4f04cf862 GIT binary patch literal 893 zcmV-@1A_dCP)eJy9)>z7wqQq^N;S?t9FPD204H=(PE!CE`YT4O!TmhzVh4R@ zo{kW9iPsvBtb9wMPE|-WT%=bXarFqG#^I5E=jd=F+G3_`Y-+;h z1|w_3)*b8(Fm);tO-e)orgpGR^CDBR5JJjC>qJT+M69wRPg~ptQ!ChM2~6!_r)4m; z7Gj5O3yfVjc=PC17EimMU*eP_u$g+2#4iPj z94KKS&0~tzr-KknmFUH!DiM(m+QoZm9ZOA1;<{|{Uf5A*p51S|SjgmEf{0c9cHi#; z#rtX}H|f3Ri=Dp1y&n0OWFJ{p`2~wxxEy2&fV7Paeh)|3F5G}~4GKy&y0K>kPswf+Lr%4MX^*(T{iI)PR zvO7w}BGLDR1uQ3;Z~{!5`b(R@c6Mm%5A4Hh_?E5p^UWjMPPAF(a<>a@Yi;ppt6v%TTy?9bWb;ppu2`v2kR?YYIy;ppw*=?akKQ-{$P$=Ii0- z?cnI_;OFb#=IpY+$;8mu+T-W8!_BX}#=FMO;OFeDyT!lC)8Xjt&)DD2*xs6}w&3UN z;ppw#{?Nub80000YbW%=J03JZJ`uJ}O z?*q?nV~JcB<1?wu66IkLO3?U0mFJlzwO{Vihf2T|%&X}-Of)X{Ieqw?^| z(x^&SjjasMzQ0hGrQ?JW82MK1ahs@agJ7`rx;R7hFC6sO0dep!HQ z@TLuqlX54Fv5pS>GY6zVp)+|HCoSMv=BA&%03xx;u@3|OmdbKqlCD}W7Qq+6xRijj zcw5D^Y!uIsA**`jsh&$#*qK9h;ADhAXvLawoL%U0i|gV}6p2}* z5l`HDs>Fma*Omzsqhg2p6!=@hPHFtM;iuanA*J#@p_tVX;>9_bENw-kbuN2R?GDbL z6#9e}NQrd^ObEQC29tU}EI`PVRK4p}y2K!IA0b2Y zuFRG#6&1{pnL@adGNqq>&~TiR%mg`Ddo!D;D-OAoq*4kJ2j!eHB(^*ul998dI34}h z?XefT{STO|w1izwY{0hh z6i3@ti?o0z@KWbg*m@^(WWESjX0#QXIzHer`twwHy7)24ZW(OCFv~Cn+vo1oQ<7pJ zOSmYbgx5&9LupE4Bha1rM6LGW6+-Q!L10#zGZ&8~xw(UvS(;nM#Vokk58_&8e=V-|n>cgeC1PWNHhQ@^mE>=jo zglDO_+B{H&&9Y`stJaAWu?-|lv&QR9bfW3`2>%4QM z_MOkizZ#n6-U#I44m7fgMjOO-|3SY^xFL(-IQn!Uh+kmfuQOLo(;2H{ko~jhxvk*< zxofldg+LM=EcYQjN(ecLd>G^8K^>K;%a(Y;*U0eQ340h#Uz~p5aU4HpftG_iTm3MK zT)sU0gw49P8RliBACHM|`h(sWJ>(-}JGS~J5M3O8{&8RuJ>(j2ggy}%VizE^a4TVVXVgE zpYlhql#Y=3(W|dCcJ5s1$;$7UHKUjl_ynfoPhjW(9+nL>8 nT|dn4tkW7_A6{SGzog86S5l+d53NWz00000NkvXXu0mjf3j%#f literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/vulcan.png b/public/images/emoji/twitter/vulcan.png new file mode 100644 index 0000000000000000000000000000000000000000..72cc1170de7b62bd2fec80bb74c9f19b70ebc86a GIT binary patch literal 1212 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/white_sun_cloud.png b/public/images/emoji/twitter/white_sun_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..cabbfd249723092a60b3b857e230e7e96b5ecfd3 GIT binary patch literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TpMC<8Fa>WOynF}Z zK7Rw$_>rw^~a zxP9dJw!lZvo_#w|@Nd1%`!myi?23PTaoOuD8`CykUJCSxaY>M0Fay8gthulMyf^GZv}*YrAu9aLtWc5n*s#()-`(`HS~3Ffcyz zba4!+V0?S!YSR(}5ta*wWN)S3xto7$`S1V#v!3<|&2T-m?`vgSS7_7Pwg1ob%Bq(w z^!a{7ejZ=w#00?*%O=YJ)qA_`*hE5?(3~yduq$lr~JPD zHJ{ETmMMSsWM33pp>%XN2cv|mWsz$e^TdxoRHpk*(_Nd_x#jxR5~KO=zgP3KUEjZC zq3Them(6$WoiZO5YNhR5_Wq6Bsa+n=eLRcAr^U=re|{oQK{G=?IyQH9Uy1wwgnq3j+G{ZMI=YO+e|55U3 zr^I^}3o+xqL}9Iz`SoVnV)K&@%sRVLYPa%!-alumg;%YqpC*~JxW*WN$VdQboMAASd5 Pf?@D<^>bP0l+XkKqCTup literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/white_sun_rain_cloud.png b/public/images/emoji/twitter/white_sun_rain_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..1270388a29bc1ceaaa26c9cdfcd34c3d1fff1cab GIT binary patch literal 989 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znhc905K7T20&D)qY zZ(`TJ`M<{K{~F`}tBql7qnNdCfaw2f!`L-%qSn2OS^N6oi?geE`{)%&G05cAhCnqySs?ep%Xbf-gVX@+1t|uJ8-t8m z^BQP1P{GTaJHfg@E_wR!+PD3=A5V1r+7|S0z0J#;``=wy`26mvCyaczfqpS93GxeO z_{l2wM)${i(@%3>U;oL!P2k~&e}^mNW~~u?(!XN&yw=bQQW@7(T~Dtu(%5|@VrzF~ zTFYF6KM(tEFfcGp_jGX#sbGA2rFGVA10ME*)|F?@+<9!hd(Yng!MszJ%?>SCf39Lb z|NG!C_LhOX;yZkgXYN{XX6sM!ZB;?di`iBbSrj>l-v2GXW%?)PpZGqj%=Nyw?ICWXB(77q;qhv2QtC=ZNpxmn;wpn3JnWW}`KjkW&ThqlTcog=HP_G>Ep=1jh? zTtX?;g7dmx9Tp8bIDt#P>)&#lXX1gjSN?Kgfk(KW|nM>?;0%)Pf& zo&EJOxu4%GiRo?K^;UE5zD3$OXUrvOFQ({r<9Y=D5$_ChfiL z{MF^cth);q$jj%R%rmsCx@lZCTj}o~#>c&zko7 z+Kt{g#+OHBf-mzPpJ^OwIVb(xl*|vVvyTd2xjbW+6oW`4&ohRAgjWSyvvt^l87|D& zrFX<6ko{4mJ8MJ4zFB6h9m)NlDh$4!Jtxk%^5377|NF@^;a2Sw{ho#c(w}PG zU-|vA{UIE&HloVttLq~tXW0o`-0RK6yLIMFtn^H3-gDebXP?3OGX?XHvIQyHp77G! z_sQ>E!W~ZDnN<-BZ8i3C)XqK_cXaifMRiZBb8g<5$+M zIVO^ILm)KcykmBw)*(mR#9JyWC(PUHBldqHqsGpB(Y|TRrmkqu3sbs%%0WZZCuPQu zc317hen#;nM;G=^d%2W1Xre%x!4px*#g8gQy`vV|F>gMgskY?s_1(ZU&fw|l=d#Wz Gp$Pz|Z2d_9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/white_sun_small_cloud.png b/public/images/emoji/twitter/white_sun_small_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..8757d5503c6acf7735f2375c629906b51138a9de GIT binary patch literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(zn|ErDuZ_WR|#_0cQ z(7(IOT7RUgKKYR&dfCSf?0u{Wyu;k(McMpJy!6rX^4z$$h z(MzDL(U(KzK%<^Kz6VtNccaV0=dVAW?EA4h{?)Z@@6XNox8C~aj)*6Jm&5}7Vp0<1 z7tB!3blr%>-~8Q=54%@LOreUgd#t#*0a zwT4sff%V5*bQlZB*no#2pfxxxEiNte>A(N+xfz=4vX8&Lb7Akp zCZA1iY>MiScS*AArS)AjHhUNp$&>OhNRKUMhltxh_DMJ2)Yt!+wsvpyC(g{h+1psv zpTr4XG)P_Fk*V+~n@{4J_ODBP9)*`)RHr^qQQkC>rO?LgNT!76Y=x9%hKn5USl1br z2wdQGdDpWhIQ~^%n8BToH%z%^EjGR_z^66uUGCPV{UNKizcKU3Nmy-tY)0Y6qjEg< zL1&rH$4dKW@E=INdcz`T($zmIn|GZE-16ti+SZe&m)=giRX%UR>y^TB>e1|quQ|`3 zh)`JFoi6HlNtTPp!E1Fd)7xo>4qXv1w{~0jQMV&B&`GrA3zyf57YdISh_JhuOj*Qu z_{^>sg`3rWaA_<(@aMW@a>|>A;|`i^4sZ5L{+Y(;FTHfj!Oze4JO6psl-?6`?7`2! z_g}N_x^`*Zwwu?j>wdP_ynB86Yti<|h3>)olvc~SUYpIlXmM5McJE(-@u4M0jW)$z z&i}e9DKT32<$5&_4W(p%!`E(`9@YQ2@y6WUW{u{$n={UT(qH`fBb&rej_{EC0^ylv zg8F&>Mq<~>;|ckat)U#|s~%jTaC zW_r!JUsg6y=<{UWPupU=?%D(i?G^s}C(-?+?WXgyoac(@+)%3a*9tn*)3;>F7i;nC zGrm*JTjQJR_W60GeSE&L*4gU@*K)BJk?lLugD$eW%@g_3a5X}E&R-S@tza$NIeMEf zFVQr4DEj8vtS3|5tO`s&EfwipD}MRUY}SSTJ9b*6`gnzeovygM-S)fP^~~1X%hlbo%G{x{yrQza zyWRD>-SxZO^~~1Yy2j72zQ>!bx0$Q9uDr&fvAv?Qyv)|znX0v(uDQI((6qtIrM17z z*4@k1+``S($I{um-Sw%s!oSMWxW&${y~fMd-MCxX7XSbNFmzH*QvfQS?-g511NskG z2sRr-H>uv^b<=ofvX8=Or<2c__VXdq?AnL6zTm?3{Pa?I>_fY$+W-Ip*-1n}RCodH z*429QKoADti5u=vcW>8bqj3Ls^=oLBgl;OQyhqjV83O_b2M6Ec8P0fNnu~ESfbX-N z`5A7>c@Ms)KbN>`-u+I@9X7r7zuc55ai236T15*7N}ltEA2>Ilh4&zFGB&)wBc9;L zh7sr;#s6y`4pDCmTEP{5(s=+nFVFZ{4(J?n{H(b?XpNsW)CURtEa`#9iX_+|lfBc{ z23?RfHc2M2VFFs0B*&%=XIS?DS{*`T+=FGcAG2f7dnJT#%8pQxWI}0B@+%KotR4yF zu|&iqK~*kjR{Z@%!q${J&?>m+JeT+fm$)ORq_mzuI}^9!HL5ll5pltJkxN`aD;Fy~ zQ)-F@*?t=*F0`6pMRLj${3~G@p~bc|!Ftff=CuhEDukefh(eYzOpsy>JGwU~)@a~@ z;zi)DgmGT5SiaAV63RD28x*0H{xgWwi)5%L|78x9=3GB54V2|8r>$o~DH^5kLiN=~ z87ejs_e+9pV`*in_C|<^v6OIz`^67XI!!D7tnXFtNq^9F!SaF&wK@e8^wNXUAl-4@ zd#~w|l*%h=kn86TfLf8tcVX+|h!UFde1ji3x0U6mHCCWZTu9WKR7v(It(jFfKyqwx zZa^?y-Y&1LwBfXRccZ8$*%ka@++3%1YS0nMP%9_o)hny-hqGC&s;L^Jmn@(=u&z&* z%afDqkzZTeMHM8lg){){+3AUr(JTmF2$lMnf{nL3Gx|MOjq|G<2%bocIvKg@0R+?A zlaV#LUJjHQS$$Bn3@N$ll#k!D!Kk@1MORWLPcZA?|IJvJRs8TAA3BiPkFetdi`*uCj` zpcB@TZlS5$>2#sh#m(UMq$;QnKM^g}w~(KRZvJ(6?ZS`Q;dI*b;Nak(-ET=ck>EWi RZHfQ@002ovPDHLkV1g+^CqV!J literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/writing_hand.png b/public/images/emoji/twitter/writing_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..eb2e8c89b928943b13527182039a14b8071548aa GIT binary patch literal 1156 zcmV-~1bh35P);hr>FE!~WS^^|DU+##BCuze9_?{?=Ol*IGM=!~WP?{nT0Smql}y zpgD-c|JqwRhr>FE!#jw>|J+>gm__ZEM*rMh@0LaJp-BDJTK?Eu|J+>fmPGEBMemkG z@0LaMvQ2iOqTs<|@0LaMs!Q>mNAjXc|J+?Wh{O8IRq&Wb_`g#9(OLJpQCW_#hLDd) zjk~&)Y^J(&J9Zq~75&l4H*O|-pF9XQ!oakGGjnW90D@GBN3>*b_!_uhk(Q>pv)Uq#S6Xei09_ZL%Bg5ilT!<7BTCBo$B6qpUMj1Zm0eKUoGenIu3a2nUdz5 zxmOb9%`6eni;LCY_>R*QA?MgrcjL`hZ9$GVZ&(K#g?z=H-|A_aBFV=-@*G98Q(4n^ z6e-?g&sq4)rWHjQkF||FZ(Ql$IE^ZvR=Ed&3(c@qq1aHwc#1}z?FoQ+B4lR%Bzlda z*n|P>zCAktm*7@b3S|sK&4z)`TbO2d0=|hf$fH?dg>0>XgODDANz10Dvn|m1d#o zReN|gOnuWN@N7gqCXIq-5||WqdCVUok8w}bCwIsnDYwK84726d^*zXIM%4AhZA^-9 zY4x!(53%f@ZxuNrMiK_V_{OU*N;Z=m0$c!~Ra9O{q7A@dw>?T}E5d;MTu~O^_6eM} z{=Jp6AQY#R%b!Fl$$b)P+0Jz0V?r}&pb3P+a4|5Q3QAk`sn6h#j0x&R>qTlzC2XMm} zkZ_@3)E@ytm5gK-CdEJzQL*!PAwVI6{@DL}W8D3gF-`+GApJ(+YyFXc!bZUK@+6Xv zy93BEG7DeFKP3wTDNIITp4{8TD&y*#MRU*oBFV}|QJ9RuBJ%>Zn8&Ws(kL37_aAD# zG@97V<>5-@A6v$F*`2Re^X1sc461FMF@Dwm<7f|OHm+2^?jRNospiCAV%Eoo8|YT| z;K1?=dbG-H7-2&?GV2Ap&&`D6AQI`;@EC2sR>800006a$+PD3?)kQu-T3wV|Nj5g#OvD1?(pmQo_EriZqJlx&8&*p*T(JN((v~3`@*T? z>EQLUliQJE~h+l zaeJA+?r$z`{$!ahs7Cjb^uetU5Tw>a^V5HzY=MNENmdLYzuL{WvrncQEMWhCd3`XATjZTsC>A zpGQ;N7V)|LgdtVNq`hyRCU{ONNvPJtY_yho*X6I?#vU5viBxV#eLMol4{V`@ON_CI zES~|~L40VFCr+s^BK0;vz7`kCeh}}uA%C0zdMYMVM%UhDv%5C<3i8)Gz$rRZK=&%1 zHNLiZwg7KYp{$FhE#hnADT*ii4CLz(p&7cJh;N7QMLdfUkTZui4!Ue``QclBS?XkH z4CVMqNacZu7z48Fq5z5Kv@e-v1>_46F6$2DmJ5633~ymT4;hr zdnw;2ps0l$qB+&+dLgHX586Fz4IyY zcECytl}&eRo&ALDnrf$+oPg^I|0S?xif9Ly6VP!gIt}=vV#uvTsm*7OgR32E1DKwlw;KLTm z0nX6=$aZ5k&GyKadY-_jE}p)5XZtS^Dk3C(!{MJ94}ZmfeM|D9RSD`V$656y7y|9l8qEk5sApat^kZgkeRC?7i zbAK_%TB47dQwe;%rhKs+cPt+@F`rqz^?oCwYP)$WkFWY>`OMPygvliK!%sKNbue(P zpQ1W-s7wecRtgOfdq~$<&daN6u}Jaxc$!;2*HarHq&CvHPHV_=d6m-GC$<=I%U= s(U?E1yGmhL=efK-`}gtTnLj@K4L@&5R0t=OBLDyZ07*qoM6N<$f@-2EnE(I) literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/zipper_mouth.png b/public/images/emoji/twitter/zipper_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..d59236821bfaa7447517834dd0377f93b0f5962e GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TxdkKwQ3jQQDx1A(6Hw*+)$9MC_MNe6>%kpe zGgkr4@lA7O0BV`FYRlratMmO>Pwi^{d?Knei2cdo%yk!ZyC9{(HHp#W!nz2aD+=01~TQ#}K%_H;83ohQZ8X~0^ zBgDC4+Kxpmoc)4FIwH8@d9t#d$CL!+mRaIUbUMp6EbP-bd2rKl`N(g7gj=lyHwINj ze5&Z#;q#|o6)DnRI{Rmk@g)CWeEP>?cmS z+Aq++I8AnO`I<5o_6IjSpBxa#HQ{X+NV>V+Y5KL^1PYOYc%$qkDGk@q0I8>(Tb7&l_%}o zLOb^zEu3>K|I#0o=*OD*NAQ5Va3pSH~4xO1!ca8{da2<%knxk!=mX27;kha8rN9Zb@<#i+p@gyPX28Bb@E4Ud{yWE_d9zs zFU!o#Ss!*uD}&Sdg>$CEu{Cj+W0zrFT{cvz7~9(U-o=fK3x;OXk;vd$@?2>=lB+a>@2 literal 0 HcmV?d00001 diff --git a/script/import_scripts/phpbb3/support/smiley_processor.rb b/script/import_scripts/phpbb3/support/smiley_processor.rb index 0b0785fd3f..342cadfaab 100644 --- a/script/import_scripts/phpbb3/support/smiley_processor.rb +++ b/script/import_scripts/phpbb3/support/smiley_processor.rb @@ -28,7 +28,7 @@ module ImportScripts::PhpBB3 def add_default_smilies { [':D', ':-D', ':grin:'] => ':smiley:', - [':)', ':-)', ':smile:'] => ':slightly_smiling:', + [':)', ':-)', ':smile:'] => ':slight_smile:', [';)', ';-)', ':wink:'] => ':wink:', [':(', ':-(', ':sad:'] => ':frowning:', [':o', ':-o', ':eek:'] => ':astonished:', diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 44a7c5dde1..94fe6437f0 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -404,7 +404,7 @@ HTML end it "replaces some glyphs that are not in the emoji range" do - expect(PrettyText.cook("☺")).to match(/\:slightly_smiling\:/) + expect(PrettyText.cook("☺")).to match(/\:slight_smile\:/) end it "doesn't replace unicode emoji if emoji is disabled" do diff --git a/test/javascripts/lib/emoji-test.js.es6 b/test/javascripts/lib/emoji-test.js.es6 index e1bb18777a..4f3ba3c8e7 100644 --- a/test/javascripts/lib/emoji-test.js.es6 +++ b/test/javascripts/lib/emoji-test.js.es6 @@ -8,22 +8,24 @@ var testUnescape = function(input, expected, description) { test("Emoji.unescape", function(){ + const v = Discourse.Emoji.ImageVersion; + testUnescape("Not emoji :O) :frog) :smile)", "Not emoji :O) :frog) :smile)", "title without emoji"); testUnescape("Not emoji :frog :smile", "Not emoji :frog :smile", "end colon is not optional"); - testUnescape("emoticons :)", "emoticons slightly_smiling", "emoticons are still supported"); + testUnescape("emoticons :)", "emoticons slight_smile", "emoticons are still supported"); testUnescape("With emoji :O: :frog: :smile:", - "With emoji O frog smile", + `With emoji O frog smile`, "title with emoji"); testUnescape("a:smile:a", "a:smile:a", "word characters not allowed next to emoji"); - testUnescape("(:frog:) :)", "(frog) slightly_smiling", "non-word characters allowed next to emoji"); - testUnescape(":smile: hi", "smile hi", "start of line"); - testUnescape("hi :smile:", "hi smile", "end of line"); + testUnescape("(:frog:) :)", `(frog) slight_smile`, "non-word characters allowed next to emoji"); + testUnescape(":smile: hi", `smile hi`, "start of line"); + testUnescape("hi :smile:", `hi smile`, "end of line"); }); test("Emoji.search", function(){ // able to find an alias - equal(Discourse.Emoji.search("coll").length, 1); + equal(Discourse.Emoji.search("+1").length, 1); }); diff --git a/test/javascripts/models/topic-test.js.es6 b/test/javascripts/models/topic-test.js.es6 index d377008b6b..f1d2469b43 100644 --- a/test/javascripts/models/topic-test.js.es6 +++ b/test/javascripts/models/topic-test.js.es6 @@ -75,7 +75,9 @@ test("recover", function() { test('fancyTitle', function() { var topic = Topic.create({ fancy_title: ":smile: with all :) the emojis :pear::peach:" }); + const v = Discourse.Emoji.ImageVersion; + equal(topic.get('fancyTitle'), - "smile with all slightly_smiling the emojis pearpeach", + `smile with all slight_smile the emojis pearpeach`, "supports emojis"); }); From 0a968295086bf8d875cca95e28f2bf51a984f509 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Fri, 4 Mar 2016 16:08:17 -0500 Subject: [PATCH 228/245] FIX: Search aliases but don't add them to the results --- .../discourse/lib/emoji/emoji.js.erb | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb index 355464030c..777983ea9b 100644 --- a/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb +++ b/app/assets/javascripts/discourse/lib/emoji/emoji.js.erb @@ -48,9 +48,11 @@ var emojiHash = {}; // add all default emojis emoji.forEach(function(code){ emojiHash[code] = true; }); // and their aliases + +var aliasHash = {}; for (var name in aliases) { aliases[name].forEach(function(alias) { - emojiHash[alias] = true; + aliasHash[alias] = name; }); } @@ -221,27 +223,29 @@ Discourse.Emoji.search = function(term, options) { var maxResults = (options && options["maxResults"]) || -1; if (maxResults === 0) { return []; } - toSearch = toSearch || _.union(_.keys(emojiHash), _.keys(extendedEmoji)).sort(); + toSearch = toSearch || _.union(_.keys(emojiHash), _.keys(extendedEmoji), _.keys(aliasHash)).sort(); var i, results = []; - - var done = function() { + function addResult(term) { + var val = aliasHash[term] || term; + if (results.indexOf(val) === -1) { + results.push(val); + } return maxResults > 0 && results.length >= maxResults; } - for (i=0; i < toSearch.length; i++) { - if (toSearch[i].indexOf(term) === 0) { - results.push(toSearch[i]); - if(done()) { break; } + var item; + for (i=0; i 0) { - results.push(toSearch[i]); - if(done()) { break; } - } + for (i=0; i Date: Fri, 4 Mar 2016 13:21:30 -0800 Subject: [PATCH 229/245] validate user locale --- app/mailers/user_notifications.rb | 2 +- spec/mailers/user_notifications_spec.rb | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/app/mailers/user_notifications.rb b/app/mailers/user_notifications.rb index 81ea701312..d63dd23b92 100644 --- a/app/mailers/user_notifications.rb +++ b/app/mailers/user_notifications.rb @@ -188,7 +188,7 @@ class UserNotifications < ActionMailer::Base protected def user_locale(user) - user.respond_to?(:locale) ? user.locale : nil + (user.locale.present? && I18n.available_locales.include?(user.locale.to_sym)) ? user.locale : nil end def email_post_markdown(post) diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb index 29466c08c0..076a601542 100644 --- a/spec/mailers/user_notifications_spec.rb +++ b/spec/mailers/user_notifications_spec.rb @@ -429,5 +429,19 @@ describe UserNotifications do end end end + + context "user locale is not a valid locale" do + %w(signup signup_after_approval authorize_email forgot_password admin_login account_created).each do |mail_type| + include_examples "notification derived from template" do + SiteSetting.default_locale = "en" + let(:locale) { "invalid" } + let(:mail_type) { mail_type } + it "sets the locale" do + expects_build_with(has_entry(:locale, nil)) + end + end + end + end + end end From 05f0db0a20525a75247a442aebe120d0bfb200b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Sat, 5 Mar 2016 00:41:22 +0100 Subject: [PATCH 230/245] FIX: don't use `destroy_all` when `delete_all` is enough --- app/jobs/scheduled/clean_up_email_logs.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/scheduled/clean_up_email_logs.rb b/app/jobs/scheduled/clean_up_email_logs.rb index 413aca9d20..30305c4d9a 100644 --- a/app/jobs/scheduled/clean_up_email_logs.rb +++ b/app/jobs/scheduled/clean_up_email_logs.rb @@ -10,7 +10,7 @@ module Jobs EmailLog.where(reply_key: nil) .where("created_at < ?", threshold) - .destroy_all + .delete_all end end From a656a672a14e1e7a1e41d239b14a297519a62057 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sat, 5 Mar 2016 10:57:32 +1100 Subject: [PATCH 231/245] FIX: Don't limit the count of badges to 96 --- app/controllers/user_badges_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/user_badges_controller.rb b/app/controllers/user_badges_controller.rb index 5f1499f916..c84e5ebe3d 100644 --- a/app/controllers/user_badges_controller.rb +++ b/app/controllers/user_badges_controller.rb @@ -11,7 +11,7 @@ class UserBadgesController < ApplicationController if params[:username] user_id = User.where(username_lower: params[:username].downcase).pluck(:id).first user_badges = user_badges.where(user_id: user_id) if user_id - grant_count = user_badges.count + grant_count = badge.user_badges.where(user_id: user_id).count end if offset = params[:offset] From 5b5076c61d71985cfe478e0daac62bf033e8652a Mon Sep 17 00:00:00 2001 From: scossar Date: Fri, 4 Mar 2016 20:20:58 -0800 Subject: [PATCH 232/245] test for empty string --- spec/mailers/user_notifications_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/mailers/user_notifications_spec.rb b/spec/mailers/user_notifications_spec.rb index 076a601542..a309290979 100644 --- a/spec/mailers/user_notifications_spec.rb +++ b/spec/mailers/user_notifications_spec.rb @@ -430,11 +430,11 @@ describe UserNotifications do end end - context "user locale is not a valid locale" do + context "user locale is an empty string" do %w(signup signup_after_approval authorize_email forgot_password admin_login account_created).each do |mail_type| include_examples "notification derived from template" do SiteSetting.default_locale = "en" - let(:locale) { "invalid" } + let(:locale) { "" } let(:mail_type) { mail_type } it "sets the locale" do expects_build_with(has_entry(:locale, nil)) From af577a5854f8269bcc989356999203cfceaef326 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 6 Mar 2016 09:12:59 +1100 Subject: [PATCH 233/245] FEATURE: like notification frequency of never --- .../discourse/controllers/preferences.js.es6 | 3 ++- .../like_notification_frequency_site_setting.rb | 1 + app/models/user_option.rb | 2 +- app/services/post_alerter.rb | 2 ++ config/locales/client.en.yml | 1 + spec/services/post_alerter_spec.rb | 14 ++++++++++++++ 6 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/controllers/preferences.js.es6 b/app/assets/javascripts/discourse/controllers/preferences.js.es6 index 4ca145f2d9..005ff085a8 100644 --- a/app/assets/javascripts/discourse/controllers/preferences.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences.js.es6 @@ -77,7 +77,8 @@ export default Ember.Controller.extend(CanCheckEmails, { likeNotificationFrequencies: [{ name: I18n.t('user.like_notification_frequency.always'), value: 0 }, { name: I18n.t('user.like_notification_frequency.first_time_and_daily'), value: 1 }, - { name: I18n.t('user.like_notification_frequency.first_time'), value: 2 }], + { name: I18n.t('user.like_notification_frequency.first_time'), value: 2 }, + { name: I18n.t('user.like_notification_frequency.never'), value: 3 }], autoTrackDurations: [{ name: I18n.t('user.auto_track_options.never'), value: -1 }, { name: I18n.t('user.auto_track_options.immediately'), value: 0 }, diff --git a/app/models/like_notification_frequency_site_setting.rb b/app/models/like_notification_frequency_site_setting.rb index 7ff681d674..33f009af57 100644 --- a/app/models/like_notification_frequency_site_setting.rb +++ b/app/models/like_notification_frequency_site_setting.rb @@ -12,6 +12,7 @@ class LikeNotificationFrequencySiteSetting < EnumSiteSetting { name: 'user.like_notification_frequency.always', value: 0 }, { name: 'user.like_notification_frequency.first_time_and_daily', value: 1 }, { name: 'user.like_notification_frequency.first_time', value: 2 }, + { name: 'user.like_notification_frequency.never', value: 3 }, ] end diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 25ecee9aa6..91995e1b1c 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -10,7 +10,7 @@ class UserOption < ActiveRecord::Base end def self.like_notification_frequency_type - @like_notification_frequency_type ||= Enum.new(always: 0, first_time_and_daily: 1, first_time: 2) + @like_notification_frequency_type ||= Enum.new(always: 0, first_time_and_daily: 1, first_time: 2, never: 3) end def set_defaults diff --git a/app/services/post_alerter.rb b/app/services/post_alerter.rb index 97cbcfc482..47d9a1b922 100644 --- a/app/services/post_alerter.rb +++ b/app/services/post_alerter.rb @@ -221,6 +221,8 @@ class PostAlerter return if user.blank? return if user.id == Discourse::SYSTEM_USER_ID + return if type == Notification.types[:liked] && user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:never] + opts ||= {} # Make sure the user can see the post diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 78ce98f7f6..3ca6e768ef 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -634,6 +634,7 @@ en: always: "Always" first_time_and_daily: "First time a post is liked and daily" first_time: "First time a post is liked" + never: "Never" email_previous_replies: title: "Include previous replies at the bottom of emails" unless_emailed: "unless previously sent" diff --git a/spec/services/post_alerter_spec.rb b/spec/services/post_alerter_spec.rb index 82f3a0a274..f029469692 100644 --- a/spec/services/post_alerter_spec.rb +++ b/spec/services/post_alerter_spec.rb @@ -63,6 +63,20 @@ describe PostAlerter do expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(1) end + it 'notifies on does not notify when never is selected' do + ActiveRecord::Base.observers.enable :all + + post = Fabricate(:post, raw: 'I love waffles') + + post.user.user_option.update_columns(like_notification_frequency: + UserOption.like_notification_frequency_type[:never]) + + PostAction.act(evil_trout, post, PostActionType.types[:like]) + + + expect(Notification.count(post_number: 1, topic_id: post.topic_id)).to eq(0) + end + it 'notifies on likes correctly' do ActiveRecord::Base.observers.enable :all From 332e05b73d13658d97358623ec559a5fdb58ae71 Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 6 Mar 2016 09:21:38 +1100 Subject: [PATCH 234/245] omit likes if notify likes is set to never --- app/models/notification.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/notification.rb b/app/models/notification.rb index fbc2bc1388..072f787166 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -122,12 +122,19 @@ class Notification < ActiveRecord::Base end def self.recent_report(user, count = nil) + return unless user && user.user_option + count ||= 10 notifications = user.notifications .visible .recent(count) .includes(:topic) - .to_a + + if user.user_option.like_notification_frequency == UserOption.like_notification_frequency_type[:never] + notifications = notifications.where('notification_type <> ?', Notification.types[:liked]) + end + + notifications = notifications.to_a if notifications.present? From 3e018c25889274dcb177abb75d94a7fe63716e5b Mon Sep 17 00:00:00 2001 From: Sam Date: Sun, 6 Mar 2016 09:51:30 +1100 Subject: [PATCH 235/245] FIX: rate limit do/undo on post actions --- app/models/post_action.rb | 10 ++++++++++ spec/models/post_action_spec.rb | 20 ++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/app/models/post_action.rb b/app/models/post_action.rb index d84c9a808f..31f221cc9f 100644 --- a/app/models/post_action.rb +++ b/app/models/post_action.rb @@ -241,7 +241,14 @@ SQL PostCreator.new(user, opts).create.try(:id) end + def self.limit_action!(user,post,post_action_type_id) + RateLimiter.new(user, "post_action-#{post.id}_#{post_action_type_id}", 4, 1.minute).performed! + end + def self.act(user, post, post_action_type_id, opts = {}) + + limit_action!(user,post,post_action_type_id) + related_post_id = create_message_for_post_action(user, post, post_action_type_id, opts) staff_took_action = opts[:take_action] || false @@ -296,6 +303,9 @@ SQL end def self.remove_act(user, post, post_action_type_id) + + limit_action!(user,post,post_action_type_id) + finder = PostAction.where(post_id: post.id, user_id: user.id, post_action_type_id: post_action_type_id) finder = finder.with_deleted.includes(:post) if user.try(:staff?) if action = finder.first diff --git a/spec/models/post_action_spec.rb b/spec/models/post_action_spec.rb index 9146ad19e7..e7a906bc60 100644 --- a/spec/models/post_action_spec.rb +++ b/spec/models/post_action_spec.rb @@ -12,6 +12,24 @@ describe PostAction do let(:second_post) { Fabricate(:post, topic_id: post.topic_id) } let(:bookmark) { PostAction.new(user_id: post.user_id, post_action_type_id: PostActionType.types[:bookmark] , post_id: post.id) } + describe "rate limits" do + + it "limits redo/undo" do + + RateLimiter.stubs(:disabled?).returns(false) + + PostAction.act(eviltrout, post, PostActionType.types[:like]) + PostAction.remove_act(eviltrout, post, PostActionType.types[:like]) + PostAction.act(eviltrout, post, PostActionType.types[:like]) + PostAction.remove_act(eviltrout, post, PostActionType.types[:like]) + + expect { + PostAction.act(eviltrout, post, PostActionType.types[:like]) + }.to raise_error + + end + end + describe "messaging" do it "doesn't generate title longer than 255 characters" do @@ -464,8 +482,6 @@ describe PostAction do end it "prevents user to act twice at the same time" do - post = Fabricate(:post) - # flags are already being tested all_types_except_flags = PostActionType.types.except(PostActionType.flag_types) all_types_except_flags.values.each do |action| From ce040bfa560e6629fe91c25aa7461da94bb5fd69 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sun, 6 Mar 2016 22:22:45 +1100 Subject: [PATCH 236/245] FEATURE: upgrade rack-mini-profiler new version is collapsed so screen does not fill with timings. expands on click --- Gemfile.lock | 4 ++-- app/assets/javascripts/discourse/routes/discourse.js.es6 | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6f3893d187..af0b76daa1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -232,8 +232,8 @@ GEM puma (2.15.3) r2 (0.2.6) rack (1.6.4) - rack-mini-profiler (0.9.8) - rack (>= 1.1.3) + rack-mini-profiler (0.9.9.1) + rack (>= 1.2.0) rack-openid (1.3.1) rack (>= 1.1.0) ruby-openid (>= 2.1.8) diff --git a/app/assets/javascripts/discourse/routes/discourse.js.es6 b/app/assets/javascripts/discourse/routes/discourse.js.es6 index 94633e1bc3..5576fb422c 100644 --- a/app/assets/javascripts/discourse/routes/discourse.js.es6 +++ b/app/assets/javascripts/discourse/routes/discourse.js.es6 @@ -75,8 +75,10 @@ const DiscourseRoute = Ember.Route.extend({ }); export function cleanDOM() { - // Close mini profiler - $('.profiler-results .profiler-result').remove(); + + if (window.MiniProfiler) { + window.MiniProfiler.pageTransition(); + } // Close some elements that may be open $('header ul.icons li').removeClass('active'); From 67995b3926ca3d4e507f5ecc4c9c8d06ef875e46 Mon Sep 17 00:00:00 2001 From: Sam Saffron Date: Sun, 6 Mar 2016 22:56:23 +1100 Subject: [PATCH 237/245] update rack-mini-profiler minor change previously expanded timings will collapse on transition. --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index af0b76daa1..6aa6219d4f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -232,7 +232,7 @@ GEM puma (2.15.3) r2 (0.2.6) rack (1.6.4) - rack-mini-profiler (0.9.9.1) + rack-mini-profiler (0.9.9.2) rack (>= 1.2.0) rack-openid (1.3.1) rack (>= 1.1.0) From 7d92c9c738bce381c9757a3c90902efdf9a3a68d Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 7 Mar 2016 10:27:27 +0800 Subject: [PATCH 238/245] FIX: Pin ESlint to 2.2. See https://github.com/eslint/eslint/issues/5476 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ad89a9befe..b06b741d92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,7 @@ cache: before_install: - gem install bundler - - npm i -g eslint babel-eslint + - npm i -g eslint@2.2 babel-eslint - eslint app/assets/javascripts - eslint --ext .es6 app/assets/javascripts - eslint --ext .es6 test/javascripts From 995f13d442eca4f43be1fece245a81d5c2e92853 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 7 Mar 2016 14:30:13 +1100 Subject: [PATCH 239/245] missing gem --- Gemfile.lock | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 6aa6219d4f..875f984536 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -199,6 +199,9 @@ GEM multi_json (~> 1.3) omniauth (>= 1.1.1) omniauth-oauth2 (>= 1.3.1) + omniauth-instagram (1.0.2) + omniauth (~> 1) + omniauth-oauth2 (~> 1) omniauth-oauth (1.1.0) oauth omniauth (~> 1.0) @@ -448,6 +451,7 @@ DEPENDENCIES omniauth-facebook omniauth-github-discourse omniauth-google-oauth2 + omniauth-instagram omniauth-oauth2 omniauth-openid omniauth-twitter From ccf835e342c3e6599ded24dc18e38a81f8c308b4 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 7 Mar 2016 15:50:10 +1100 Subject: [PATCH 240/245] FEATURE: on iPhone 6 or wider show mobile toolbar by default. FEATURE: if user enables or disables mobile toolbar, remember state in local storage. --- .../discourse/controllers/composer.js.es6 | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index e2adfe819d..b722faec9f 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -57,7 +57,25 @@ export default Ember.Controller.extend({ lastValidatedAt: null, isUploading: false, topic: null, - showToolbar: false, + showToolbar: Em.computed({ + get(key){ + const keyValueStore = this.container.lookup('key-value-store:main'); + const storedVal = keyValueStore.get("toolbar-enabled"); + if (this._toolbarEnabled === undefined && storedVal === undefined) { + // iPhone 6 is 375, anything narrower and toolbar should + // be default disabled. + // That said we should remember the state + this._toolbarEnabled = $(window).width() > 370; + } + return this._toolbarEnabled || storedVal === "true"; + }, + set(key, val){ + const keyValueStore = this.container.lookup('key-value-store:main'); + this._toolbarEnabled = val; + keyValueStore.set({key: "toolbar-enabled", value: val ? "true" : "false"}); + return val; + } + }), _initializeSimilar: function() { this.set('similarTopics', []); From eb5cee3150fbd0b2de08d2a93b3959a20e41a691 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 7 Mar 2016 17:33:06 +0800 Subject: [PATCH 241/245] Make ESlint happy. --- app/assets/javascripts/discourse/controllers/composer.js.es6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index b722faec9f..7333f6dd0a 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -58,7 +58,7 @@ export default Ember.Controller.extend({ isUploading: false, topic: null, showToolbar: Em.computed({ - get(key){ + get(){ const keyValueStore = this.container.lookup('key-value-store:main'); const storedVal = keyValueStore.get("toolbar-enabled"); if (this._toolbarEnabled === undefined && storedVal === undefined) { From bc4087b9bb32c9b45ec3b41f9f60e0f36191b033 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Mon, 7 Mar 2016 17:27:27 +0800 Subject: [PATCH 242/245] FIX: RSS description might be `nil`. --- app/jobs/scheduled/poll_feed.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/jobs/scheduled/poll_feed.rb b/app/jobs/scheduled/poll_feed.rb index 8c93910def..d5ab5b6bc1 100644 --- a/app/jobs/scheduled/poll_feed.rb +++ b/app/jobs/scheduled/poll_feed.rb @@ -86,11 +86,7 @@ module Jobs end def content - if @article_rss_item.content - @article_rss_item.content.scrub - else - @article_rss_item.description.scrub - end + @article_rss_item.content.try(:scrub) || @article_rss_item.description.try(:scrub) end def title From 05288144b5952a20f1602dc859ccfa4a3f3d7ec6 Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 7 Mar 2016 18:47:10 +0530 Subject: [PATCH 243/245] FIX: export user list based on trust level filter --- .../javascripts/admin/routes/admin-users-list.js.es6 | 2 +- app/controllers/export_csv_controller.rb | 2 +- app/jobs/regular/export_csv_file.rb | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/admin/routes/admin-users-list.js.es6 b/app/assets/javascripts/admin/routes/admin-users-list.js.es6 index cb7cfdd9bd..ab72eb893c 100644 --- a/app/assets/javascripts/admin/routes/admin-users-list.js.es6 +++ b/app/assets/javascripts/admin/routes/admin-users-list.js.es6 @@ -6,7 +6,7 @@ export default Discourse.Route.extend({ actions: { exportUsers() { - exportEntity('user_list').then(outputExportResult); + exportEntity('user_list', {trust_level: this.controllerFor('admin-users-list-show').get('query')}).then(outputExportResult); }, sendInvites() { diff --git a/app/controllers/export_csv_controller.rb b/app/controllers/export_csv_controller.rb index cbb6399acb..5545f872d4 100644 --- a/app/controllers/export_csv_controller.rb +++ b/app/controllers/export_csv_controller.rb @@ -30,7 +30,7 @@ class ExportCsvController < ApplicationController @_export_params ||= begin params.require(:entity) params.require(:entity_type) - params.permit(:entity, :entity_type, args: [:name, :start_date, :end_date, :category_id, :group_id]) + params.permit(:entity, :entity_type, args: [:name, :start_date, :end_date, :category_id, :group_id, :trust_level]) end end end diff --git a/app/jobs/regular/export_csv_file.rb b/app/jobs/regular/export_csv_file.rb index 1f955f574e..ddb6d6b929 100644 --- a/app/jobs/regular/export_csv_file.rb +++ b/app/jobs/regular/export_csv_file.rb @@ -53,10 +53,14 @@ module Jobs def user_list_export user_array = [] user_field_ids = UserField.pluck(:id) + condition = {} + if @extra && @extra[:trust_level] && trust_level = TrustLevel.levels[@extra[:trust_level].to_sym] + condition = {trust_level: trust_level} + end if SiteSetting.enable_sso # SSO enabled - User.includes(:user_stat, :single_sign_on_record, :groups).find_each do |user| + User.where(condition).includes(:user_stat, :single_sign_on_record, :groups).find_each do |user| user_info_string = get_base_user_string(user) user_info_string = add_single_sign_on(user, user_info_string) user_info_string = add_custom_fields(user, user_info_string, user_field_ids) @@ -66,7 +70,7 @@ module Jobs end else # SSO disabled - User.includes(:user_stat, :groups).find_each do |user| + User.where(condition).includes(:user_stat, :groups).find_each do |user| user_info_string = get_base_user_string(user) user_info_string = add_custom_fields(user, user_info_string, user_field_ids) user_info_string = add_group_names(user, user_info_string) From bdb290ccdb43a587ef7e466aa6d407183da50f2f Mon Sep 17 00:00:00 2001 From: Arpit Jalan Date: Mon, 7 Mar 2016 19:44:32 +0530 Subject: [PATCH 244/245] Update Translations --- config/locales/client.ar.yml | 40 +- config/locales/client.fa_IR.yml | 27 +- config/locales/client.fi.yml | 42 +- config/locales/client.fr.yml | 56 +- config/locales/client.ko.yml | 638 +++++++++++++--------- config/locales/client.nl.yml | 241 +++++++- config/locales/client.zh_CN.yml | 56 +- config/locales/server.de.yml | 89 +-- config/locales/server.es.yml | 151 ++--- config/locales/server.fi.yml | 233 ++++---- config/locales/server.fr.yml | 177 +++--- config/locales/server.ko.yml | 227 ++++---- config/locales/server.nl.yml | 64 ++- config/locales/server.pl_PL.yml | 54 +- config/locales/server.pt.yml | 101 +++- config/locales/server.pt_BR.yml | 115 +--- config/locales/server.ru.yml | 147 ++--- plugins/poll/config/locales/client.ko.yml | 6 + 18 files changed, 1289 insertions(+), 1175 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index e83aab1db7..44fa1c0977 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -356,7 +356,7 @@ ar: many: "هذا الموضوع له كثير من المشاركات بانتظار الموافقة" other: "هذا الموضوع له {{count}} مشاركات بانتظار الموافقة" confirm: "حفظ التعديلات" - delete_prompt: "هل أنت متأكد أنك تريد حذف %{username}؟ هذا سيحذف جميع مشاركاتك ويحظر بريدك الإلكتروني و عنوانك الـIP ." + delete_prompt: "هل أنت متأكد أنك تريد حذف %{username}؟ جميع مشاركته سوف تحذف كذلك و سوف يحظر كل من بريده الإلكتروني و عنوان الـ IP." approval: title: "المشاركات تحتاج موافقة" description: "لقد استلمنا مشاركتك لكنها تحتاج موافقة المشرف قبل ظهورها. الرجاء الانتظار" @@ -540,9 +540,7 @@ ar: perm_denied_btn: "الصلاحيات ممنوعة " perm_denied_expl: "لقد قمت بالغاء الاشعارات . قم بتفعيل الاشعارات عن طريق اعدادات االمتصفح" disable: "إيقاف الإشعارات " - currently_enabled: "( مفعل مسبقاً )" enable: "تفعيل الإشعارات" - currently_disabled: "( مفعل مسبقاً )" each_browser_note: "ملاحظة : يجب انت تقوم بتغيير هذا الإعداد عند كل مرة تستخدم فيها متصفح جديد ." dismiss_notifications: "جعل الجميع مقروء" dismiss_notifications_tooltip: "جعل جميع اشعارات غيرمقروء الى مقروء" @@ -682,6 +680,9 @@ ar: title: "وسام بطاقة المستخدم" website: "موقع الكتروني" email_settings: "بريد الكتروني" + email_previous_replies: + title: "تضمين مشاركات سابقة في أسفل البريد المرسل" + always: "دائماً" email_digests: title: "إرسال رسالة إلكترونية تحتوي على جديد الموقع عندما لا أزور الموقع" daily: "يومي" @@ -768,6 +769,7 @@ ar: likes_received: "اعجابات مستقبلة" days_visited: "ايام الزياره" posts_read_count: "قراء المواضيع" + top_replies: "أفضل المشاركات" top_topics: "افضل المواضيع" top_badges: "افضل الاوسمه" more_topics: "المزيد من المواضيع" @@ -849,8 +851,8 @@ ar: value_prop: "عندما تنشئ حساب، ننحن نتذكر ما كنت تقرأه بالضبط، و سترجع دائما في المكان الذي تركته، و ستصلك الاشعارات ايضا، هنا و عبر البريد الإلكتروني، في اي وقت ينشأ فيه منشور جديد، و تستطيع أن تُعجب بالمنشورارت لتشارك ما يعجبك :heartbeat:" summary: enabled_description: "أنت تنظر الى ملخص لهذا الموضوع , مشاركات مثيرة للإهتمام بحسب رأي المجتمع" - description: "هناك {{replyCount}} ردود" - description_time: "هناك {{replyCount}} ردود مع تقدير وقت القراءة {{readingTime}} دقائق." + description: "يوجد {{replyCount}} مشاركة." + description_time: "يوجد {{replyCount}} مشاركة, والوقت المقدر للقراءة {{readingTime}} minutes دقيقة." enable: 'لخّص هذا الموضوع' disable: 'عرض جميع المشاركات' deleted_filter: @@ -1134,9 +1136,6 @@ ar: category: "لا يوجد مواضيع في التصنيف {{category}}" top: "لا يوجد مواضيع تستحق أن تكون ضمن الأفضل مع الأسف." search: "لا يوجد نتائج للبحث." - educate: - new: '

مواضيعك الجديدة ستظهر هنا.

بشكل افتراضي ، كل المواضيع ستعتبر جديدة و تحمل الوسم جديد إذا تمت كتابتها قبل يومين على الأكثر.

تستطيع ان تغير المدة من إعداداتك .

' - unread: '

المواضيع الغير مقروءة ستظهر هنا

افتراضياً, سيتم اعتبارالمواضيع غير مقروءة وتحمل الوسم 1 إذا:

  • كتبت موضوع جديد
  • رددت على موضوع
  • قرأت موضوع لأكثر من 4 دقائق.

أو إذا قمت باختيار خيار تتبع موضوع أو إضافته للمواضيع المراقبة من خلال لوحة التحكم بالإشعارات.

تستطيع تغيير الإعدادات من خلال إعداداتك.

' bottom: latest: "لا يوجد المزيد من المواضيع الحديثة" hot: "هذه كل المواضيع التي عليها إقبال عالي حتى هذه اللحظة" @@ -1583,18 +1582,6 @@ ar: bookmark: "التراجع عن التفضيل" like: "التراجع عن الإعجاب" vote: "التراجع عن التصويت" - people: - off_topic: "{{icons}} بلغ أن هذا لاعلاقة له بالموضوع" - spam: "{{icons}} بلغ انه هذا هو سبام" - spam_with_url: "{{icons}} بُلغ انه غير مرغوب به" - inappropriate: "{{icons}} بلغ أنه غير لائق" - notify_moderators: "{{icons}} تنبيه المشرف" - notify_moderators_with_url: "{{icons}} نبه المشرف" - notify_user: "{{icons}} رسالة مُرسلة." - notify_user_with_url: "{{icons}} أرسلت message ." - bookmark: "{{icons}} اضف في المفضلة" - like: "{{icons}} استحسان" - vote: "{{icons}} صوت لهذا" by_you: off_topic: "لقد تم الإبلاغ عن الموضوع على أنه ليس في المكان الصحيح" spam: "تم الإبلاغ عن الموضوع على أنه سبام" @@ -2267,11 +2254,9 @@ ar: is_disabled: "Restore is disabled in the site settings." label: "استعادة" title: "اعادة تخزين النسخة الاحتياطية" - confirm: "هل أنت متأكد من رغبتك في اعادة تخزين النسخة الاحتياطية؟" rollback: label: "اعادة السنخة السابقة" title: "Rollback the database to previous working state" - confirm: "Are your sure you want to rollback the database to the previous working state?" export_csv: user_archive_confirm: "هل أنت متأكد من رغبتك في تحميل جميع مشاركاتك ؟" success: "بدأ التصدير, سيتم إعلامك برسالة عند اكتمال العملية." @@ -2374,9 +2359,6 @@ ar: love: name: 'إعجاب' description: "لون زر الإعجاب." - wiki: - name: 'ويكي' - description: "اللون الأساسي المستخدم كخلفية لمشاركات الويكي." email: title: "رسائل البريد الالكتروني" settings: "اعدادات" @@ -3078,20 +3060,20 @@ ar: name: الرابط الأول description: اضافة رابط لموضوع اخر first_quote: - name: التعليق الأول - description: إقتباسات + name: أول اقتباس + description: اقتبس من عضو read_guidelines: name: اقرأ التعليمات description: اطلع على توجيهات المجتمع reader: name: قارئ - description: قراءة أكثر من 100 تعليق في الموضوع + description: قراءة جميع المشاركات في موضوع فيه أكثر من 100 مشاركة popular_link: name: رابط مشهور description: شارك رابط خارجي بـ 50 نقرة على الأقل. hot_link: name: الرابط الساخن - description: شارك الرابط الخارجي بـ 300 نقرة على الأقل. + description: شارك رابط خارجي بـ 300 نقرة على الأقل. famous_link: name: رابط مشهور description: شارك الرابط الخارجي بـ 1000 نقرة على الأقل diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index 9db99547a1..3f4ea08d51 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -81,6 +81,8 @@ fa_IR: other: "%{count} ماه بعد" x_years: other: "%{count} سال بعد" + previous_month: 'ماه پیشین' + next_month: 'ماه بعد' share: topic: 'پیوندی به این موضوع را به اشتراک بگذارید' post: 'ارسال #%{postNumber}' @@ -226,7 +228,6 @@ fa_IR: has_pending_posts: other: "این عنوان دارای {{count}} نوشته‌ی در انتظار تایید است" confirm: "ذخیره سازی تغییرها" - delete_prompt: "آیا مطمئن هستی از پاک کردن این %{username}? این باعث پاک شدن تمام پست ها و منجر به بلاک شدن ایمیل و IP می شود." approval: title: "نوشته نیاز به تایید دارد" description: "ما نوشته شما را دریافت کرده ایم ولی نیاز به تایید آن توسط یکی از مدیران است قبل از اینکه نمایش داده شود. لطفا صبر داشته باشید." @@ -384,9 +385,7 @@ fa_IR: perm_default: "فعال کردن اعلانات" perm_denied_btn: "دسترسی رد شد" disable: "غیرفعال کردن اعلانات" - currently_enabled: "(در حال حاضر فعال است)" enable: "فعال کردن اعلانات" - currently_disabled: "(در حال حاضر غیرفعال است)" each_browser_note: "نکته: شما باید این تنظیمات را در هر مرورگری که استفاده میکنید تغییر دهید." dismiss_notifications: "علامت گذاری همه به عنوان خوانده شده" dismiss_notifications_tooltip: "علامت گذاری همه اطلاعیه های خوانده نشده به عنوان خوانده شده" @@ -662,8 +661,6 @@ fa_IR: value_prop: "وقتی که شما یک حساب کابری ایجاد میکنید, ما به خاطر میسپاریم که شما دقیقا در حال خواندن چه چیزی بودید, بنابراین شما همیشه برمی گردید از جایی که خواندن را رها کردید. همچنین شما اعلانات را دریافت میکنید, اینجا و از طریق ایمیل, هر زمان که ارسال جدیدی فرستاده شود. و شما میتوانید ارسال ها را پسند کنید تا در محبت آن سهیم باشید. :heartbeat:" summary: enabled_description: "شما خلاصه ای از این موضوع را می بینید: بالاترین‌ نوشته های انتخاب شده توسط انجمن." - description: "{{replyCount}} پاسخ" - description_time: "وجود دارد {{replyCount}} پاسخ ها برا اساس زمان خواندن{{readingTime}} دقیقه." enable: 'خلاصه این موضوع' disable: 'نمایش همه نوشته‌ها' deleted_filter: @@ -936,9 +933,6 @@ fa_IR: category: "هیچ موضوعاتی در {{category}} نیست." top: "موضوع برتر وجود ندارد." search: " هیچ نتیجه جستجویی وجود ندارد." - educate: - new: '

موضوعات جدید در اینجا قرار می گیرند.

به طور پیش فرض، موضوعات جدید در نظر گرفته خواهند شد و نشان داده می شوند جدید شاخص اگر آنها در 2 روز گذشته ایجاد شده باشند

شما می توانید این را برای خود تغییر دهید تنظیمات.

' - unread: '

موضوعات خوانده نشده شما در اینجا قرار می گیرند.

به طور پیش فرض، موضوعات خوانده نشده در نظر گرفته خواهند شد و شمارش خوانده نشده ها نشان داده می شود 1 اگر شما:

  • موضوع ایجاد کرده اید
  • به موضوع پاسخ داده اید
  • خواندن موضوع در بیش از 4 دقیقه

و یا اگر شما به صراحت مجموعه ای از موضوع مورد ردیابی و یا تماشا از طریق کنترل اطلاع رسانی در پایین هر موضوع انتخاب کرده اید.

شما می توانید این را تغییر دهید. تنظیمات.

' bottom: latest: "موضوع تازهٔ دیگری نیست." hot: "موضوع داغ دیگری نیست." @@ -1273,18 +1267,6 @@ fa_IR: bookmark: "برداشتن نشانک" like: "خنثی سازی لایک" vote: "خنثی سازی امتیاز" - people: - off_topic: "{{icons}} برای این مورد پرچم آف-‌تاپیک زد" - spam: "{{icons}} برای این مورد پرچم هرزنامه زد" - spam_with_url: "{{icons}} پرچم گذاری شداین یک هرزنامه است" - inappropriate: "{{icons}} با پرچم گزاری این مورد را نامناسب بدان" - notify_moderators: "{{icons}} مدیران را آگاه کرد" - notify_moderators_with_url: "{{icons}} مدیران را آگاه کرد" - notify_user: "{{icons}} ارسال یک پیام خصوصی" - notify_user_with_url: "{{icons}} ارسال پیام خصوصی" - bookmark: "{{icons}} این را نشانه‌گذاری کرد" - like: "{{icons}} این مورد را پسندید" - vote: "{{icons}} رأی داد به این " by_you: off_topic: "شما برای این مورد پرچم آف-تاپیک زدید" spam: "شما برای این مورد پرچم هرزنامه زدید" @@ -1796,11 +1778,9 @@ fa_IR: is_disabled: "بازگردانی در تنظیمات سایت از کار انداخته شده است." label: "بازیابی" title: "بازیابی پشتیبان" - confirm: "آیا مطمئنید که می‌خواهید پشتیبان را برگردانید؟" rollback: label: "عقبگرد" title: "عقب گرد پایگاه داده به حالت کار قبلی" - confirm: "آیا مطمئن هستید به بازگشت به حالت کار قبلی پایگاه داده ؟" export_csv: user_archive_confirm: "آیا مطمئنید که می‌خواهید نوشته‌هایتان را دانلود کنید؟" success: "فرایند برون ریزی، به شما از طریق پیام اطلاع رسانی خواهد شد وقتی این فرایند تکمیل شود." @@ -1903,9 +1883,6 @@ fa_IR: love: name: 'دوست داشتن' description: "رنگ دکمه های لایک" - wiki: - name: 'ویکی' - description: "رنگ پایه استفاده شده برای پس زمینه نوشته ها ی ویکی ." email: settings: "تنظیمات" preview_digest: "پیشنمایش خلاصه" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 42423b650e..9d22b193b9 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -269,7 +269,7 @@ fi: one: "1 viesti ketjussa odottaa hyväksyntää" other: "{{count}} viestiä ketjussa odottaa hyväksyntää" confirm: "Tallenna muutokset" - delete_prompt: "Haluatko varmasti poistaa käyttäjän %{username}? Kaikki käyttäjän kirjoittamat viestit poistetaan ja tämän sähköposti- sekä IP-osoitteille asetetaan esto." + delete_prompt: "Haluatko todella poistaa käyttäjän %{username}? Kaikki hänen kirjoittamansa viestit poistetaan. Lisäksi hänen sähköposti- ja IP-osoitteillensa laitetaan esto." approval: title: "Viesti odottaa hyväksyntää" description: "Olemme vastaanottaneet viestisi, mutta se täytyy vielä hyväksyä ennen, kuin se näytetään sivustolla. Ole kärsivällinen." @@ -433,9 +433,7 @@ fi: perm_denied_btn: "Ei oikeuksia" perm_denied_expl: "Olet kieltänyt ilmoitukset. Salli ilmoitukset selaimesi asetuksista." disable: "Poista ilmoitukset käytöstä" - currently_enabled: "(nyt käytössä)" enable: "Näytä ilmoituksia" - currently_disabled: "(pois käytöstä)" each_browser_note: "Huom: Sinun täytyy vaihtaa tämä asetus kaikissa selaimista, joita käytät." dismiss_notifications: "Merkitse kaikki luetuiksi" dismiss_notifications_tooltip: "Merkitse kaikki lukemattomat ilmoitukset luetuiksi" @@ -571,12 +569,18 @@ fi: title: "Käyttäjäkortin tunnus" website: "Nettisivu" email_settings: "Sähköposti" + email_previous_replies: + title: "Liitä aiemmat vastaukset mukaan sähköpostin alaosaan" + unless_emailed: "ellei aiemmin lähetetty" + always: "aina" + never: "ei koskaan" email_digests: title: "Lähetä tiivistelmä uusista viesteistä sähköpostilla, jos en käy sivustolla " daily: "päivittäin" every_three_days: "joka kolmas päivä" weekly: "viikottain" every_two_weeks: "joka toinen viikko" + email_in_reply_to: "Liitä sähköpostiin lyhennelmä viestistä, johon vastataan" email_direct: "Lähetä minulle sähköposti, jos joku lainaa viestiäni, vastaa viestiini, viittaa @nimeeni, tai kutsuu minut viestiketjuun" email_private_messages: "Lähetä minulle sähköposti, kun joku lähettää minulle viestin" email_always: "Lähetä sähköposti-ilmoitukset, vaikka olen aktiivinen palstalla." @@ -731,8 +735,8 @@ fi: value_prop: "Kun luot tilin, muistamme mitä olet lukenut, jotta voit aina palata keskusteluissa takaisin oikeaan kohtaan. Saat myös ilmoituksia, täällä tai sähköpostilla, kun uusia viestejä kirjoitetaan. Voit myös tykätä viesteistä. :heartbeat:" summary: enabled_description: "Tarkastelet tiivistelmää tästä ketjusta, sen mielenkiintoisimpia viestejä käyttäjien toiminnan perusteella." - description: "Tässä ketjussa on {{replyCount}} viestiä." - description_time: "Ketjussa on {{replyCount}} viestiä, joiden arvioitu lukemisaika on {{readingTime}} minuuttia." + description: "Vastauksia on {{replyCount}} kpl." + description_time: "Vastauksia on {{replyCount}}. Niiden lukemiseen menee arviolta {{readingTime}} minuuttia." enable: 'Näytä ketjun tiivistelmä' disable: 'Näytä kaikki viestit' deleted_filter: @@ -1012,9 +1016,6 @@ fi: category: "Alueella {{category}} ei ole ketjua." top: "Huippuketjuja ei ole." search: "Hakutuloksia ei löytynyt." - educate: - new: '

Uudet ketjut ilmestyvät tähän.

Oletuksena, ketjut tulkitaan uusiksi ja niiden yhteydessä näytetäänuusi-merkki, kun ne on luotu edellisen kahden päivän aikana.

Voit muuttaa tätä käyttäjäasetuksistasi.

' - unread: '

Lukemattomat viestit ilmestyvät tähän.

Oletuksena, ketjut tulkitaan lukemattomiksi ja niiden yhteydessä näytetään 1 jos olet:

  • luonut ketjun
  • vastannut ketjuun
  • lukenut ketjua enemmän, kuin 4 minuuttia

tai, jos olet erikseen merkannut ketjun seurantaan tai tarkkailuun ketjun lopusta löytyvästä painikkeesta.

Voit muuttaa tätä käyttäjäasetuksistasi.

' bottom: latest: "Tuoreimpia ketjuja ei ole enempää." hot: "Kuumia ketjuja ei ole enempää." @@ -1378,18 +1379,6 @@ fi: bookmark: "Peru kirjanmerkki" like: "Peru tykkäys" vote: "Peru ääni" - people: - off_topic: "{{icons}} liputtivat tämän asiaan kuulumattomaksi" - spam: "{{icons}} liputtivat tämän roskapostiksi" - spam_with_url: "{{icons}} liputtivat tämän roskapostiksi" - inappropriate: "{{icons}} liputtivat tämän asiattomaksi" - notify_moderators: "{{icons}} ilmoittivat valvojille" - notify_moderators_with_url: "{{icons}} ilmoittivat valvojille" - notify_user: "{{icons}} lähetti viestin" - notify_user_with_url: "{{icons}} lähetti viestin" - bookmark: "{{icons}} lisäsivät tämän kirjanmerkkeihinsä" - like: "{{icons}} tykkäsivät tästä" - vote: "{{icons}} äänestivät tätä" by_you: off_topic: "Liputit tämän asiaankuulumattomaksi" spam: "Liputit tämän roskapostiksi" @@ -1934,11 +1923,9 @@ fi: is_disabled: "Palautus on estetty sivuston asetuksissa." label: "Palauta" title: "Palauta varmuuskopio" - confirm: "Oletko varma, että haluat palauttaa tämän varmuuskopion?" rollback: label: "Palauta" title: "Palauta tietokanta edelliseen toimivaan tilaan" - confirm: "Oletko varma, että haluat palauttaa tietokannan edelliseen toimivaan tilaan?" export_csv: user_archive_confirm: "Oletko varma, että haluat ladata viestisi?" success: "Vienti on käynnissä. Saat ilmoituksen viestillä, kun prosessi on valmis." @@ -2041,9 +2028,6 @@ fi: love: name: 'tykkäys' description: "Tykkäyspainikkeen väri." - wiki: - name: 'wiki' - description: "Wiki-viestien taustaväri." email: title: "Sähköpostit" settings: "Asetukset" @@ -2080,6 +2064,13 @@ fi: subject: "Otsikko" error: "Virhe" none: "Uusia sähköpostiviestejä ei löydetty." + modal: + date: "Päivämäärä" + from: "Lähettäjä" + to: "Vastaanottaja" + cc: "Kopio" + subject: "Otsikko" + body: "Leipäteksti" filters: from_placeholder: "from@example.com" to_placeholder: "to@example.com" @@ -2155,6 +2146,7 @@ fi: revoke_admin: "peru ylläpitäjän oikeudet" grant_moderation: "myönnä valvojan oikeudet" revoke_moderation: "peru valvojan oikeudet" + backup_operation: "varmuuskopiointi" screened_emails: title: "Seulottavat sähköpostiosoitteet" description: "Uuden käyttäjätunnuksen luonnin yhteydessä annettua sähköpostiosoitetta verrataan alla olevaan listaan ja tarvittaessa tunnuksen luonti joko estetään tai suoritetaan muita toimenpiteitä." diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 468058cc8d..ca39f64ba3 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -380,7 +380,7 @@ fr: posts: "Messages" topics: "Sujets" latest: "Récents" - latest_by: "dernièr sujet de" + latest_by: "dernier sujet de" toggle_ordering: "modifier le mode du tri" subcategories: "Sous-catégories" topic_stats: "Le nombre de nouveaux sujets." @@ -433,9 +433,7 @@ fr: perm_denied_btn: "Permission Refusée" perm_denied_expl: "Vous n'avez pas autorisé les notifications. Autorisez-les depuis les paramètres de votre navigateur." disable: "Désactiver les notifications" - currently_enabled: "(activé actuellement)" enable: "Activer les notifications" - currently_disabled: "(désactivé actuellement)" each_browser_note: "Note : Vous devez changer ce paramètre sur chaque navigateur que vous utilisez." dismiss_notifications: "Marquer tout comme lu" dismiss_notifications_tooltip: "Marquer comme lues toutes les notifications non lues" @@ -571,12 +569,18 @@ fr: title: "Badge pour la carte de l'utilisateur" website: "Site internet" email_settings: "Courriel" + email_previous_replies: + title: "Inclure les réponses précédentes en bas des courriels" + unless_emailed: "sauf si déjà envoyé" + always: "toujours" + never: "jamais" email_digests: title: "Quand je ne visite pas ce site, m'envoyer un résumé des nouveautés par courriel:" daily: "quotidien" every_three_days: "tous les trois jours" weekly: "hebdomadaire" every_two_weeks: "toutes les deux semaines" + email_in_reply_to: "Inclure un extrait du message auquel il a été répondu dans les courriels" email_direct: "M'envoyer un courriel quand quelqu'un me cite, répond à mon message ou mentionne mon @pseudo ou m'invite à rejoindre un sujet" email_private_messages: "M'envoyer un courriel quand quelqu'un m'envoie un message privé" email_always: "Recevoir des notifications par email même lorsque je suis actif sur le site" @@ -1013,12 +1017,8 @@ fr: top: "Il n'y a pas de meilleurs sujets." search: "Votre recherche ne retourne aucun résultat." educate: - new: '

Vos nouveaux sujets apparaissent ici

Par défaut, les sujets sont considérés comme nouveau et affiche l''indicateur nouveau lorsqu''ils ont été crées dans les deux derniers jours.

- - Vous pouvez modifier cela dans vos préférences.

' - unread: '

Vos sujets non-lus apparaissent ici

Par défaut, les sujets sont considérés comme non-lus et affichent le nombre de messages non-lus 1 sont ceux:

- -
  • Que vous avez crées
  • Auxquels vous avez répondu
  • Que vous avez lu plus de 4 minutes

Ou que vous avez explicitement suivis ou surveillés

Vous pouvez modifier cela dans vos préférences.

' + new: '

Vos nouveaux sujets apparaissent ici

Par défaut, les sujets sont considérés comme nouveaux et affichent l''indicateur nouveau lorsqu''ils ont été créés depuis moins de 2 jours.

Vous pouvez modifier cela dans vos préférences.

' + unread: '

Vos sujets non-lus apparaissent ici

Par défaut, les sujets sont considérés comme non-lus et affichent le nombre de messages non-lus 1 sont ceux:

  • Que vous avez crées
  • Auxquels vous avez répondu
  • Que vous avez lu plus de 4 minutes

Ou que vous avez explicitement suivis ou surveillés

Vous pouvez modifier cela dans vos préférences.

' bottom: latest: "Il n'y a plus de sujet à lire." hot: "Il n'y a plus de sujet populaire à lire." @@ -1383,17 +1383,14 @@ fr: like: "Annuler j'aime" vote: "Retirer votre vote" people: - off_topic: "{{icons}} l'ont signalé comme étant hors-sujet" - spam: "{{icons}} l'ont signalé comme étant du spam" - spam_with_url: "{{icons}} signalé ceci comme spam" - inappropriate: "{{icons}} l'ont signalé comme inapproprié" - notify_moderators: "{{icons}} l'ont signalé pour modération" - notify_moderators_with_url: "{{icons}} l'ont signalé pour modération" - notify_user: "{{icons}} a envoyé un message" - notify_user_with_url: "{{icons}} a envoyé un message" - bookmark: "{{icons}} l'ont ajouté à leurs signets" - like: "{{icons}} l'ont aimé" - vote: "{{icons}} ont voté pour" + off_topic: "signalé comme hors-sujet." + spam: "signalé comme spam" + inappropriate: "signalé comme inapproprié" + notify_moderators: "signalé aux modérateurs" + notify_user: "a envoyé un message" + bookmark: "ajouté aux signets" + like: "a aimé ceci" + vote: "a voté pour ce message" by_you: off_topic: "Vous l'avez signalé comme étant hors-sujet" spam: "Vous l'avez signalé comme étant du spam" @@ -1942,7 +1939,7 @@ fr: rollback: label: "Revenir en arrière" title: "Restaurer (RollBack) la base de données à l'état de travail précédent" - confirm: "Êtes-vous sûr de vouloir restaurer (rollback) la base de données à l'état de fonctionnement précédent?" + confirm: "Êtes-vous sûr de vouloir restaurer la base de données à l'état de fonctionnement précédent?" export_csv: user_archive_confirm: "Êtes-vous sûr de vouloir télécharger vos messages?" success: "L'exportation a été initialisé. Vous serez averti par message lorsque le traitement sera terminé." @@ -2045,9 +2042,6 @@ fr: love: name: 'aimer' description: "La couleur du bouton \"J'aime\"." - wiki: - name: 'wiki' - description: "Couleur de base utilisée pour le fond des messages de type wiki." email: title: "Courriels" settings: "Paramètrage" @@ -2084,6 +2078,19 @@ fr: subject: "Objet" error: "Erreur" none: "Aucun courriel reçu." + modal: + title: "Détails du courriel entrant" + error: "Erreur" + return_path: "Return-Path" + message_id: "Message-Id" + in_reply_to: "In-Reply-To" + references: "References" + date: "Date" + from: "From" + to: "à" + cc: "Cc" + subject: "Objet" + body: "Corps" filters: from_placeholder: "from@example.com" to_placeholder: "to@example.com" @@ -2159,6 +2166,7 @@ fr: revoke_admin: "Révoquer les droits d'admin" grant_moderation: "Accorder les droits de modération" revoke_moderation: "Révoquer les droits de modération" + backup_operation: "sauvegarde" screened_emails: title: "Courriels affichés" description: "Lorsque quelqu'un essaye de créé un nouveau compte, les adresses de courriel suivantes seront vérifiées et l'inscription sera bloquée, ou une autre action sera réalisée." diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index 4146b79063..a57b3f0944 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -244,7 +244,7 @@ ko: has_pending_posts: other: "이 토픽은 {{count}}개의 승인 대기중인 게시글이 있습니다." confirm: "변경사항 저장" - delete_prompt: "정말로 %{username} 회원을 삭제하시겠습니까? 게시글이 모두 삭제되고 IP와 이메일이 블락됩니다." + delete_prompt: "정말로 %{username}; 회원을 삭제하시겠습니까? 게시글이 모두 삭제되고 IP와 이메일이 차단됩니다." approval: title: "게시글 승인 필요" description: "새로운 게시글이 있습니다. 그러나 이 게시글이 보여지려면 운영자의 승인이 필요합니다." @@ -307,7 +307,7 @@ ko: members_mods_and_admins: "그룹 멤버, 운영자, 관리자만" everyone: "모두" trust_levels: - title: "멤버들이 추가될때 멤버들의 Trust level이 자동으로 획득됩니다." + title: "멤버들이 추가되면 회원등급이 자동으로 부여됩니다:" none: "없음" notifications: watching: @@ -403,9 +403,7 @@ ko: perm_denied_btn: "권한 거부" perm_denied_expl: "통지를 위한 허용을 거절했었습니다. 브라우저 설정을 통해서 통지를 허용해주세요." disable: "알림 비활성화" - currently_enabled: "(현재 활성화됨)" enable: "알림 활성화" - currently_disabled: "(현재 비활성화됨)" each_browser_note: "노트: 사용하시는 모든 브라우저에서 이 설정을 변경해야합니다." dismiss_notifications: "모두 읽음으로 표시" dismiss_notifications_tooltip: "읽지 않은 알림을 모두 읽음으로 표시" @@ -417,10 +415,10 @@ ko: change: "변경" moderator: "{{user}}님은 운영자입니다" admin: "{{user}}님은 관리자 입니다" - moderator_tooltip: "이 사용자는 운영자 입니다" - admin_tooltip: "이 사용자는 관리자입니다." - blocked_tooltip: "이 사용자는 차단되었습니다" - suspended_notice: "이 사용자는 {{date}}까지 접근 금지 되었습니다." + moderator_tooltip: "이 회원은 운영자 입니다" + admin_tooltip: "이 회원은 관리자입니다." + blocked_tooltip: "이 회원은 차단되었습니다" + suspended_notice: "이 회원은 {{date}}까지 접근 금지 되었습니다." suspended_reason: "이유: " github_profile: "Github" mailing_list_mode: "(토픽이나 카테고리의 알림을 끄지 않는 한) 모든 새로운 글에 대해 메일을 보내주세요." @@ -436,9 +434,9 @@ ko: delete_yourself_not_allowed: "지금은 계정을 삭제할 수 없습니다. 관리자에게 연락해 주세요." unread_message_count: "메시지" admin_delete: "삭제" - users: "사용자" + users: "회원" muted_users: "알람 끄기" - muted_users_instructions: "이 사용자들이 보낸 알림 모두 숨김" + muted_users_instructions: "이 회원이 보낸 알림 모두 숨김" muted_topics_link: "알림을 끈 토픽 보기" automatically_unpin_topics: "토픽을 끝까지 보면 자동으로 핀이 해제됩니다." staff_counters: @@ -537,15 +535,21 @@ ko: log_out: "로그아웃" location: "위치" card_badge: - title: "사용자 카드 뱃지" + title: "사용자 카드 배지" website: "웹사이트" email_settings: "이메일" + email_previous_replies: + title: "이메일 밑부분에 이전 댓글을 포함합니다." + unless_emailed: "예전에 발송된 것이 아닌 한" + always: "항상" + never: "절대" email_digests: title: "사이트 방문이 없을 경우, 새로운 글을 요약하여 메일로 보냄" daily: "매일" every_three_days: "매 3일마다" weekly: "매주" every_two_weeks: "격주" + email_in_reply_to: "이메일에 글 응답내용을 발췌해서 포함하기 " email_direct: "누군가 나를 인용했을 때, 내 글에 답글을 달았을때, 내 이름을 멘션했을때 혹은 토픽에 나를 초대했을 떄 이메일 보내기" email_private_messages: "누군가 나에게 메시지를 보냈을때 이메일 보내기" email_always: "사이트를 이용중 일 때도 이메일 알림 보내기" @@ -615,18 +619,18 @@ ko: summary: title: "요약" stats: "통계" - topic_count: "생성된 토픽" - post_count: "생성된 포스트" - likes_given: "좋아요 누름" - likes_received: "좋아요 받음" - days_visited: "접속한 날짜" - posts_read_count: "읽은 포스트" - top_replies: "최고 인기 댓글" - top_topics: "최고 인기 토픽" - top_badges: "최고 뱃지" - more_topics: "다른이에게 준 좋아요" - more_replies: "더 많은 답글" - more_badges: "뱃지 더 보기" + topic_count: "새토픽 갯수" + post_count: "새글 갯수" + likes_given: "좋아요 눌러준 횟수" + likes_received: "좋아요 선물받은 횟수" + days_visited: "방문일수" + posts_read_count: "읽은글 갯수" + top_replies: "인기 댓글" + top_topics: "인기 토픽" + top_badges: "인기 배지" + more_topics: "토픽 더 보기" + more_replies: "답글 더 보기" + more_badges: "배지 더 보기" associated_accounts: "로그인" ip_address: title: "마지막 IP 주소" @@ -671,6 +675,9 @@ ko: read_only_mode: enabled: "이 사이트는 현재 읽기전용 모드입니다. 브라우징은 가능하지만, 댓글달기, 좋아요 등 다른 행위들은 현재 비활성화 되어있습니다." login_disabled: "사이트가 읽기 전용모드로 되면서 로그인은 비활성화되었습니다." + too_few_topics_and_posts_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 토픽과 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요." + too_few_topics_notice: "토론을 시작하시죠! 현재 %{currentTopics} / %{requiredTopics} 토픽이 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요." + too_few_posts_notice: "토론을 시작하시죠! 현재 %{currentPosts} / %{requiredPosts} 글이 있습니다. 새 방문자는 읽고 응답할 대화꺼리가 좀 필요해요." learn_more: "더 배우기" year: '년' year_desc: '지난 365일간 생성된 토픽' @@ -695,8 +702,8 @@ ko: value_prop: "회원가입 하시면 글을 어디까지 읽으셨는지 저희가 기억하기 때문에, 언제든지 마지막 읽은 위치로 바로 돌아갈 수 있답니다. 그리고 새글이 뜰때마다 이 화면과 이메일로 알림을 받을수도 있고, 좋아요를 클릭해서 글에 대한 애정을 표현하실 수도 있어요. :heartbeat:" summary: enabled_description: "현재 커뮤니티에서 가장 인기있는 토픽의 요약본을 보고 있습니다:" - description: "{{replyCount}}개의 답글이 있습니다." - description_time: "총 {{replyCount}}개의 댓글이 있습니다. 예상 소요 시간은 {{readingTime}}분입니다.." + description: "댓글이 {{replyCount}}개 있습니다." + description_time: "댓글이 {{replyCount}}개 있고 다 읽는데 {{readingTime}} 분이 걸립니다." enable: '이 토픽을 요약Show All Posts' disable: '모든 포스트 보기' deleted_filter: @@ -710,10 +717,10 @@ ko: remove_allowed_user: "{{name}}에게서 온 메시지를 삭제할까요?" email: '이메일' username: '아이디' - last_seen: '마지막 접근' + last_seen: '마지막 접속' created: '생성' created_lowercase: '최초 글' - trust_level: '신뢰도' + trust_level: '회원등급' search_hint: '아이디, 이메일 혹은 IP 주소' create_account: title: "회원 가입" @@ -792,6 +799,7 @@ ko: saved_local_draft_tip: "로컬로 저장됩니다." similar_topics: "작성하려는 내용과 비슷한 토픽들..." drafts_offline: "초안" + group_mentioned: "{{group}}을 이용해서 {{count}} 명의 회원에게 알림을 보내려고 합니다." error: title_missing: "제목은 필수 항목입니다" title_too_short: "제목은 최소 {{min}} 글자 이상이어야 합니다." @@ -812,6 +820,7 @@ ko: title_placeholder: "이야기 나누고자 하는 내용을 한문장으로 적는다면?" edit_reason_placeholder: "why are you editing?" show_edit_reason: "(add edit reason)" + reply_placeholder: "여기에 타이핑 하세요. 마크다운 또는 BBCode, HTML 포맷을 이용하세요. 이미지를 끌어오거나 붙여넣기 하세요." view_new_post: "새로운 글을 볼 수 있습니다." saving: "저장 중..." saved: "저장 완료!" @@ -862,6 +871,7 @@ ko: more: "이전 알림을 볼 수 있습니다." total_flagged: "관심 표시된 총 글" mentioned: "

{{username}} {{description}}

" + group_mentioned: "

{{username}} {{description}}

" quoted: "

{{username}} {{description}}

" replied: "

{{username}} {{description}}

" posted: "

{{username}} {{description}}

" @@ -873,7 +883,9 @@ ko: invitee_accepted: "

{{username}} accepted your invitation

" moved_post: "

{{username}} moved {{description}}

" linked: "

{{username}} {{description}}

" - granted_badge: "

'{{description}}' 뱃지를 받았습니다.

" + granted_badge: "

'{{description}}' 배지를 받았습니다.

" + group_message_summary: + other: "

{{group_name}} 메시지상자에 {{count}}개의 메시지가 있습니다

" alt: mentioned: "멘션 by" quoted: "인용 by" @@ -887,10 +899,11 @@ ko: invitee_accepted: "다음 사람에 의해 초대가 수락됨." moved_post: "다음 사람에 의해서 당신의 글이 이동됨" linked: "당신 글로 링크하기" - granted_badge: "뱃지가 수여됨." + granted_badge: "배지가 수여됨." group_message_summary: "그룹 메시지함의 메시지" popup: mentioned: '"{{topic}}" - {{site_title}}에서 {{username}} 님이 나를 멘션했습니다' + group_mentioned: '"{{topic}}" - {{site_title}}에서 {{username}} 님이 당신을 언급했습니다' quoted: '"{{topic}}" - {{site_title}}에서 {{username}} 님이 나를 인용했습니다' replied: '"{{topic}}" - {{site_title}}에서 {{username}} 님이 내게 답글을 달았습니다' posted: '"{{topic}}" - {{site_title}}에서 {{username}}님이 글을 게시하였습니다' @@ -904,17 +917,22 @@ ko: remote_tip: "이미지 링크" remote_tip_with_attachments: "이미니자 파일 링크 {{authorized_extensions}}" local_tip: "기기에서 이미지 선택" + local_tip_with_attachments: "디바이스에서 이미지나 파일을 선택하세요 {{authorized_extensions}}" hint: "(드래그&드랍으로 업로드 가능)" + hint_for_supported_browsers: "편집창에 이미지를 끌어다 놓거나 붙여넣기 할 수도 있습니다" uploading: "업로드 중입니다..." select_file: "파일 선택" image_link: "이 이미지를 누르면 이동할 링크" search: sort_by: "다음으로 정렬" + relevance: "관련성" latest_post: "가장 최근 글" most_viewed: "가장 많이 본" most_liked: "가장 많이 좋아요를 받은" select_all: "모두 선택" clear_all: "다 지우기" + result_count: + other: "\"{{term}}\" 검색결과 {{count}} 개" title: "토픽, 글, 사용자, 카테고리 검색" no_results: "검색 결과가 없습니다" no_more_results: "더 이상 결과가 없습니다." @@ -933,11 +951,14 @@ ko: current_user: '사용자 페이지로 이동' topics: bulk: + unlist_topics: "토픽 내리기" reset_read: "읽기 초기화" delete: "토픽 삭제" dismiss: "해지" dismiss_read: "읽지않음 전부 해지" dismiss_button: "해지..." + dismiss_tooltip: "새 글을 무시하거나 토픽 추적 멈추기" + also_dismiss_topics: "이 토픽 추적하는 걸 멈추고 내가 읽지 않은 걸 다시는 보여주지 않습니다" dismiss_new: "새글 제거" toggle: "토픽 복수 선택" actions: "일괄 적용" @@ -960,8 +981,8 @@ ko: top: "Top 토픽이 없습니다." search: "검색 결과가 없습니다." educate: - new: '

새로운 토픽은 여기에서 볼 수 있습니다.

기본 설정으로 2일 이내에 생성된 토픽은 새로운 것으로 간주되며 new 표시가 나타납니다.

환경설정에서 설정을 변경 할 수 있습니다.

' - unread: '

읽지 않은 토픽은 여기에서 볼 수 있습니다.

기본 설정으로 다음과 같은 경우 토픽은 읽지 않은 것으로 간주되며 읽지 않은 개수 1 가 표시됩니다.

  • 토픽을 만든 경우
  • 토픽에 리플을 단 경우
  • 토픽을 4분 이상 읽은 경우

또는 각 토픽 아래에 있는 알림 설정에서 해당 토픽을 추적하거나 지켜보도록 설정한 경우

환경설정에서 설정을 변경 할 수 있습니다.

' + new: '

회원님의 토픽은 여기에 나타납니다.

기본적으로 생긴 지 이틀 안된 토픽은 새것으로 간주하고 new 표시가 뜹니다.

바꾸고 싶으면 환경설정으로 가보세요.

' + unread: '

회원님이 읽지 않은 토픽은 여기에 나타납니다.

기본적으로 토픽은 읽지 않은 것으로 간주하고 다음과 같은 조건 중 하나를 만족하면 읽지 않은 글갯수 1 을 표시합니다:

  • 토픽 만들기
  • 토픽에 댓글달기
  • 토픽을 4분 이상 읽기

또는 토픽을 추적하거나 지켜보기 위해 각 토픽의 밑부분에 달린 알림제어판에서 설정하는 경우도 포합됩니다.

설정을 바꾸려면 환경설정 페이지로 가세요.

' bottom: latest: "더 이상 읽을 최신 토픽이 없습니다" hot: "더 이상 읽을 인기있는 토픽이 없습니다" @@ -975,15 +996,18 @@ ko: search: "더이상 검색 결과가 없습니다." topic: unsubscribe: + stop_notifications: "{{title}}에 대한 알림은 이제 덜 받게 됩니다." change_notification_state: "현재 당신의 알림 설정 : " filter_to: " {{post_count}} 게시글 in 토픽" create: '새 토픽 만들기' create_long: '새로운 토픽 만들기' private_message: '메시지 시작' archive_message: + help: '메시지를 아카이브로 옮기기' title: '저장됨' move_to_inbox: title: '수신함으로 이동' + help: '메시지를 편지함으로 되돌리기' list: '토픽 목록' new: '새로운 토픽' unread: '읽지 않은' @@ -1028,6 +1052,7 @@ ko: auto_close_title: '자동으로 닫기 설정' auto_close_save: "저장" auto_close_remove: "이 토픽을 자동으로 닫지 않기" + auto_close_immediate: "토픽에 마지막 글이 올라온 지 %{hours} 시간 지났기 때문에 이 토픽은 즉시 닫힐 예정입니다." progress: title: 진행 중인 토픽 go_top: "맨위" @@ -1077,6 +1102,7 @@ ko: description: "이 메시지에 대해 어떠한 알림도 받지 않지 않습니다." muted: title: "알림 없음" + description: "이 토픽에 대해 어떠한 알림도 받지 않고 최신글 목록에도 나타나지 않을 것입니다." actions: recover: "토픽 다시 복구" delete: "토픽 삭제" @@ -1107,9 +1133,9 @@ ko: title: '공유' help: '이 토픽의 링크를 공유' flag_topic: - title: '신고' - help: '운영자에게 이 글을 신고합니다.' - success_message: '성공적으로 토픽을 신고 하였습니다.' + title: '신고하기' + help: '이 토픽을 주의깊게 보거나 비밀리에 주의성 알림을 보내기 위해 신고합니다' + success_message: '신고했습니다' feature_topic: title: "Feature 토픽" pin: " {{categoryLink}} 카테고리 토픽 목록 상단에 고정 until" @@ -1117,14 +1143,23 @@ ko: unpin: "이 토픽을 {{categoryLink}} 카테고리 상단에서 제거 합니다." unpin_until: "{{categoryLink}} 카테고리 토픽 목록 상단에서 이 토픽을 제거하거나 %{until}까지 기다림." pin_note: "개별적으로 사용자가 토픽 고정을 취소할 수 있습니다." + pin_validation: "토픽을 고정하려면 날짜를 지정해야 합니다." + not_pinned: " {{categoryLink}} 카테고리에 고정된 토픽이 없습니다." + already_pinned: + other: "{{categoryLink}}에 고정된 토픽 갯수: {{count}}" pin_globally: "모든 토픽 목록 상단 고정 until" confirm_pin_globally: "이미 {{count}}개의 토픽이 전역적으로 고정되어 있습니다. 너무 많은 토픽이 고정되어 있으면 새로운 사용자나 익명사용자에게 부담이 될 수 있습니다. 정말로 이 토픽을 전역적으로 고정하시겠습니까?" unpin_globally: "모든 토픽 목록 상단에서 이 토픽을 제거" unpin_globally_until: "모든 토픽 목록 상단에서 이 토픽을 제거하거나 %{until}까지 기다림." global_pin_note: "개별적으로 사용자가 토픽 고정을 취소할 수 있습니다." + not_pinned_globally: "전역적으로 고정된 토픽이 없습니다." + already_pinned_globally: + other: "전역적으로 고정된 토픽 갯수: {{count}}" make_banner: "이 토픽을 모든 페이지의 상단에 나타나는 배너로 만들기" remove_banner: "모든 페이지에서 나타나는 배너에서 제거" banner_note: "사용자는 배너를 닫음으로써 배너를 나타나지 않게 할 수 있습니다. 단지 어떤 기간동안 딱 하나의 토픽만이 배너로 지정 가능합니다." + no_banner_exists: "배너 토픽이 없습니다." + banner_exists: "현재 배너 토픽이 있습니다." inviting: "초대 중..." automatically_add_to_groups_optional: "이 초대는 다음 그룹에 대한 접근 권한을 포함합니다: (선택, 관리자만 가능)" automatically_add_to_groups_required: "이 초대는 다음 그룹에 대한 접근 권한을 포함합니다: (필수, 관리자만 가능)" @@ -1181,6 +1216,8 @@ ko: change_timestamp: title: "타임스탬프 변경" action: "타임스탬프 변경" + invalid_timestamp: "타임스탬프는 미래값으로 할 수 없습니다." + error: "토픽 타임스탬프를 바꾸는 중 에러가 발생하였습니다." multi_select: select: '선택' selected: '({{count}})개가 선택됨' @@ -1205,7 +1242,7 @@ ko: show_full: "전체 글 보기" show_hidden: '숨겨진 내용을 표시' deleted_by_author: - other: "(작성자에 의해 취소된 글입니다. 신고당한 글이 아니면 %{count} 시간 뒤에 자동으로 삭제됩니다)" + other: "(작성자에 의해 취소된 글입니다. 글이 신고된 것이 아닌 한 %{count} 시간 뒤에 자동으로 삭제됩니다)" expand_collapse: "확장/축소" gap: other: "{{count}}개의 숨겨진 답글 보기" @@ -1217,6 +1254,9 @@ ko: other: "{{count}} 좋아요" has_likes_title: other: "{{count}}명이 이 글을 좋아합니다" + has_likes_title_only_you: "당신이 이 글을 좋아합니다." + has_likes_title_you: + other: "당신 외 {{count}}명이 이 글을 좋아합니다" errors: create: "죄송합니다. 글을 만드는 동안 오류가 발생했습니다. 다시 시도하십시오." edit: "죄송합니다. 글을 수정하는 중에 오류가 발생했습니다. 다시 시도하십시오." @@ -1235,6 +1275,8 @@ ko: yes_value: "예" via_email: "이 토픽은 이메일을 통해 등록되었습니다." whisper: "이 포스트는 운영자를 위한 비공개 귓말입니다." + wiki: + about: "이 글은 위키(wiki) 입니다." archetypes: save: '옵션 저장' controls: @@ -1244,7 +1286,7 @@ ko: undo_like: "'좋아요' 취소" edit: "이 글 편집" edit_anonymous: "이 토픽을 수정하려면 먼저 로그인을 해야합니다." - flag: "운영자에게 이 글을 신고합니다." + flag: "이 토픽에 관심을 가지기 위해 깃발을 표시해두고 개인적으로 알림을 받습니다" delete: "이 글을 삭제합니다." undelete: "이 글 삭제를 취소합니다." share: "이 글에 대한 링크를 공유합니다." @@ -1261,18 +1303,19 @@ ko: revert_to_regular: "스태프 색상 제거하기" rebake: "HTML 다시 빌드하기" unhide: "숨기지 않기" + change_owner: "소유자 변경" actions: - flag: '신고' + flag: '신고하기' defer_flags: - other: "신고 연기" + other: "신고 보류하기" it_too: - off_topic: "Flag it too" - spam: "저도 신고합니다" - inappropriate: "저도 신고합니다" - custom_flag: "신고 추가하기" - bookmark: "Bookmark it too" - like: "저도 '좋아요' 줄래요" - vote: "Vote for it too" + off_topic: "나도 신고하기" + spam: "나도 신고하기" + inappropriate: "나도 신고하기" + custom_flag: "나도 신고하기" + bookmark: "나도 북마크하기" + like: "나도 좋아해요" + vote: "나도 투표하기" undo: off_topic: "신고 취소" spam: "신고 취소" @@ -1281,60 +1324,57 @@ ko: like: "좋아요 취소" vote: "투표 취소" people: - off_topic: "{{icons}}님이 이 글을 토픽에서 제외했습니다." - spam: "{{icons}} 스팸으로 신고되었습니다" - spam_with_url: "{{icons}} 스팸으로 표시됨" - inappropriate: "{{icons}} 부적절하다고 신고했습니다" - notify_moderators: "{{icons}}님은 이 글을 운영자에게 보고했습니다." - notify_moderators_with_url: "{{icons}}님은 이 을 운영자에게 보고했습니다." - notify_user: "{{icons}} 메시지를 보냈습니다" - notify_user_with_url: "{{icons}} 메시지를 보냈습니다." - bookmark: "{{icons}}님이 북마크했습니다." - like: "{{icons}}님이 좋아합니다." - vote: "{{icons}}님이 투표했습니다." + off_topic: "주제에서 벗어났다고 신고했습니다" + spam: "스팸으로 신고했습니다" + inappropriate: "부적절한 글로 신고했습니다" + notify_moderators: "운영자에게 알렸습니다" + notify_user: "글쓴이에게 메시지를 보냈습니다" + bookmark: "북마크 했습니다" + like: "좋아해요" + vote: "이곳에 투표했습니다" by_you: - off_topic: "이 글을 토픽에서 벗어남으로 신고함" - spam: "이 글을 스팸으로 신고함" - inappropriate: "이 글을 부적절로 신고함" - notify_moderators: "이 글을 운영자에게 보고함" - notify_user: "이 사용자에게 메시지를 보냈습니다." - bookmark: "이 글을 북마크함" - like: "'좋아요' 했습니다" - vote: "이 글에 투표함" + off_topic: "이글을 주제에서 벗어났다고 신고했습니다" + spam: "이글을 스팸으로 신고했습니다" + inappropriate: "이 글을 부적절한 컨텐츠로 신고했습니다" + notify_moderators: "운영자에게 알렸습니다" + notify_user: "글쓴이에게 메시지를 보냈습니다" + bookmark: "이 글을 북마크했습니다" + like: "좋아해요" + vote: "이 글에 투표했습니다" by_you_and_others: off_topic: - other: "나와 {{count}}명의 다른 사용자가 이 글을 토픽에서 제외했습니다." + other: "당신 외 {{count}}명이 주제에서 벗어났다고 신고했습니다" spam: - other: "나와 {{count}}명의 다른 사람들이 스팸이라고 신고했습니다" + other: "당신 외 {{count}}명이 스팸이라고 신고했습니다" inappropriate: - other: "나와 {{count}}명의 다른 사람들이 부적절하다고 신고했습니다" + other: "당신 외 {{count}}명이 부적절한 컨텐츠라고 신고했습니다" notify_moderators: - other: "나와 {{count}}명의 다른 사람들이 적당하다고 표시했습니다." + other: "당신 외 {{count}}명이 운영자에게 알렸습니다" notify_user: - other: "나와 {{count}}명의 사용자가 이 사용자에게 메시지를 보냈습니다." + other: "당신 외 {{count}}명이 글쓴이에게 메시지를 보냈습니다" bookmark: - other: "나와 {{count}}명의 다른 사람들이 북마크 했습니다." + other: "당신 외 {{count}}명이 북마크 했습니다" like: - other: "나와 {{count}}명의 다른 사람들이 좋아합니다." + other: "당신 외 {{count}}명이 좋아합니다" vote: - other: "나와 {{count}}명의 다른 사람들이 이 포스트에 투표했습니다." + other: "당신 외 {{count}}명이 이 글에 투표했습니다" by_others: off_topic: - other: "{{count}}명의 사용자가 이 글을 토픽에서 제외했습니다." + other: "{{count}}명이 주제에서 벗어났다고 신고했습니다" spam: - other: "{{count}}명의 사람들이 스팸이라고 신고했습니다" + other: "{{count}}명의 스팸이라고 신고했습니다" inappropriate: - other: "{{count}}명의 사람들이 부적절하다고 신고했습니다" + other: "{{count}}명이 부적절한 컨텐츠라고 신고했습니다" notify_moderators: - other: "{{count}}명의 사람들이 이 글을 운영자에게 신고했습니다" + other: "{{count}}명이 운영자에게 알렸습니다" notify_user: - other: "{{count}}명이 이 사용자에게 메시지를 보냈습니다." + other: "{{count}}명이 글쓴이에게 메시지를 보냈습니다" bookmark: - other: "{{count}}명의 사용자가 이 글을 북마크했습니다." + other: "{{count}}명이 북마크했습니다" like: - other: "{{count}}명이 이 글을 좋아합니다" + other: "{{count}}명이 좋아합니다" vote: - other: "{{count}}명의 사용자가 이 글을 추천했습니다." + other: "{{count}}명이 이 글에 투표했습니다" delete: confirm: other: "모든 글들을 삭제하시겠습니까?" @@ -1370,6 +1410,7 @@ ko: topic_template: "토픽 템플릿" delete: '카테고리 삭제' create: '새 카테고리' + create_long: '새 카테고리 만들기' save: '카테고리 저장' slug: '카테고리 Slug' slug_placeholder: '(Optional) dashed-words for url' @@ -1380,7 +1421,7 @@ ko: topic: "카테고리 토픽" logo: "카테고리 로고 이미지" background_image: "카테고리 백그라운드 이미지" - badge_colors: "뱃지 색상" + badge_colors: "배지 색상" background_color: "배경 색상" foreground_color: "글씨 색상" name_placeholder: "짧고 간결해야합니다" @@ -1399,7 +1440,8 @@ ko: email_in_allow_strangers: "계정이 없는 익명 유저들에게 이메일을 받습니다." email_in_disabled: "이메일로 새 토픽 작성하기 기능이 비활성화되어 있습니다. 사이트 설정에서 '이메일로 새 토픽작성하기'를 활성화 해주세요." email_in_disabled_click: '"email in" 활성화' - allow_badges_label: "뱃지가 이 카테고리에서 주어질 수 있도록 허용" + suppress_from_homepage: "홈페이지에서 이 카테고리를 감춥니다." + allow_badges_label: "배지가 이 카테고리에서 주어질 수 있도록 허용" edit_permissions: "권한 수정" add_permission: "권한 추가" this_year: "올해" @@ -1419,33 +1461,34 @@ ko: muted: title: "알림 꺼짐" flagging: - title: '우리 커뮤니티에 기여해 주셔서 감사합니다.' - private_reminder: '신고는 오직 관리자만 볼 수 있습니다.' - action: '글 신고하기' - take_action: "조치를 취하기" - notify_action: '메시지' - delete_spammer: "스팸 사용자 삭제" - delete_confirm: "이 사용자의 %{posts}개의 게시글과 %{topics}개의 토픽을 삭제하고 IP주소 %{ip_address}와 이메일 %{email}을 영구 블락하려고 합니다. 이 사용자가 악성 사용자임이 확실합니까? " - yes_delete_spammer: "예, 스팸 사용자 삭제." + title: '우리 커뮤니티 질서를 지키는데 도와주셔서 감사합니다!' + private_reminder: '신고는 비밀이기 때문에 오직 운영진들만 볼 수 있습니다' + action: '글 신고했습니다' + take_action: "조치하기" + notify_action: '메시지 보내기' + delete_spammer: "네, 스패머 회원을 삭제합니다" + delete_confirm: "이 회원의 글 %{posts}개 및 토픽 %{topics}개를 삭제하고 IP주소 %{ip_address}와 이메일 %{email}을 영구 차단하려고 합니다. 이 회원이 정말 스패머 확실합니까?" + yes_delete_spammer: "예, 스팸 회원을 삭제합니다" ip_address_missing: "(알 수 없음)" - hidden_email_address: "(감춰짐)" - submit_tooltip: "신고 접수하기" + hidden_email_address: "(숨김)" + submit_tooltip: "비밀 신고하기" take_action_tooltip: "커뮤니티의 신고 수가 채워지기 기다리지 않고, 바로 신고 수를 제재 수준까지 채웁니다." - cant: "죄송합니다, 지금 이 글을 신고 할 수 없습니다." + cant: "죄송합니다, 지금은 이 글을 신고할 수 없습니다" + notify_staff: '운영진에게 알리기' formatted_name: - off_topic: "오프 토픽입니다." - inappropriate: "부적절함" + off_topic: "주제에 벗어났습니다" + inappropriate: "부적절 컨텐츠입니다" spam: "스팸입니다" custom_placeholder_notify_user: "구체적이고, 건설적이며, 항상 친절하세요." - custom_placeholder_notify_moderators: "구체적으로 사용자님께서 걱정하는 것과 가능한 모든 관련된 링크를 제공해주세요." + custom_placeholder_notify_moderators: "구체적으로 회원님이 걱정하는 내용과 가능한 모든 관련된 링크를 제공해주세요." custom_message: at_least: "최소한 {{n}}자를 입력하세요" more: "{{n}} 이동합니다" left: "{{n}} 나머지" flagging_topic: - title: "우리 커뮤니티에 기여해 주셔서 감사합니다." - action: "신고된 토픽" - notify_action: "메시지" + title: "우리 커뮤니티 질서를 지키는데 도와주셔서 감사합니다!" + action: "토픽 신고하기" + notify_action: "메시지 보내기" topic_map: title: "토픽 요약" participants_title: "빈번한 게시자" @@ -1506,6 +1549,9 @@ ko: with_topics: "%{filter} 토픽" with_category: "%{filter} %{category} 토픽" latest: + title: "최근글" + title_with_count: + other: "최근글 ({{count}})" help: "가장 최근 토픽" hot: title: "인기 있는 글" @@ -1521,9 +1567,19 @@ ko: title_in: "카테고리 - {{categoryName}}" help: "카테고리별로 그룹화 된 모든 토픽" unread: + title: "읽지 않은 글" + title_with_count: + other: "읽지 않은 글 ({{count}})" help: "지켜보거나 추적 중인 읽지 않은 토픽 " + lower_title_with_count: + other: "{{count}} unread" new: + lower_title_with_count: + other: "{{count}} new" lower_title: "new" + title: "새글" + title_with_count: + other: "새글 ({{count}})" help: "며칠 내에 만들어진 토픽" posted: title: "내 글" @@ -1532,9 +1588,12 @@ ko: title: "북마크" help: "북마크된 토픽" category: + title: "{{categoryName}}" + title_with_count: + other: "{{categoryName}} ({{count}})" help: "{{categoryName}}카테고리의 최신 토픽" top: - title: "인기" + title: "인기글" help: "작년 또는 지난 달, 지난 주, 어제에 활발했던 토픽" all: title: "전체 시간" @@ -1611,6 +1670,7 @@ ko: refresh_report: "보고서 새로고침" start_date: "시작일" end_date: "종료일" + groups: "모든 그룹" commits: latest_changes: "최근 변경 사항: 자주 업데이트하십시오!" by: "에 의해" @@ -1619,31 +1679,31 @@ ko: old: "지난" active: "활성화된" agree: "동의" - agree_title: "이 신고가 올바르고 타당한지 확인하세요." + agree_title: "이 신고가 올바르고 타당함을 확인합니다" agree_flag_modal_title: "동의 및 ..." - agree_flag_hide_post: "동의 (포스트 숨기기 + 개인 메시지 보내기)" - agree_flag_hide_post_title: "Hide this post and automatically send the user a message urging them to edit it" - agree_flag_restore_post: "동의하기(글 복원)" + agree_flag_hide_post: "동의 (글 숨기기 + 개인 메시지 보내기)" + agree_flag_hide_post_title: "이 글을 숨기고 글쓴이에게 글을 수정하라고 개인메시지 자동발송하기" + agree_flag_restore_post: "동의 (글 복원)" agree_flag_restore_post_title: "글을 복원하기" agree_flag: "신고에 동의함" agree_flag_title: "신고에 동의하며 글이 수정되지 않도록 유지하기" defer_flag: "연기" - defer_flag_title: "신고 제거하기. 현재 어떠한 행위를 할 필요 없음" + defer_flag_title: "신고 제거하기. 별도추가조치는 더이상 필요없습니다" delete: "삭제" delete_title: "신고에서 멘션된 글 삭제하기" - delete_post_defer_flag: "글을 삭제하고 신고에 결정을 따름" + delete_post_defer_flag: "글을 삭제하고 신고를 보류함" delete_post_defer_flag_title: "글을 삭제하고 첫번째 글이면 토픽 삭제하기" delete_post_agree_flag: "글을 삭제하고 신고에 동의함" delete_post_agree_flag_title: "글을 삭제하고 첫번째 글이면 토픽 삭제하기" delete_flag_modal_title: "삭제하고.." delete_spammer: "스패머 삭제" - delete_spammer_title: "사용자와 사용자가 작성한 모든 토픽과 글을 삭제함 " - disagree_flag_unhide_post: "Disagree (글 감추기 취소)" + delete_spammer_title: "글쓴이의 모든 글과 토픽을 삭제하고 회원계정도 제거하기" + disagree_flag_unhide_post: "동의안함 (글 숨김 취소)" disagree_flag_unhide_post_title: "글의 모든 신고를 삭제하고 글을 볼 수 있도록 변경" - disagree_flag: "Disagree" + disagree_flag: "동의안함" disagree_flag_title: "신고를 유효하지 않거나 올바르지 않은 것으로 거부함" clear_topic_flags: "완료" - clear_topic_flags_title: "이 토픽을 조사하였고 이슈는 해결되었습니다. 플래그를 지우기 위해 완료를 클리하세요" + clear_topic_flags_title: "토픽 조사를 끝냈고 이슈를 해결했습니다. 신고를 지우기 위해 완료를 클릭하세요" more: "(더 많은 답글...)" dispositions: agreed: "agreed" @@ -1686,15 +1746,23 @@ ko: delete_confirm: "이 그룹을 삭제 하시겠습니까?" delete_failed: "이것은 자동으로 생성된 그룹입니다. 삭제할 수 없습니다." delete_member_confirm: "'%{group}' 그룹에서 '%{username}'을 제외시키겠습니까?" + delete_owner_confirm: "'%{username}' 님에게서 소유자권한을 제거할까요?" name: "이름" add: "추가" add_members: "사용자 추가하기" custom: "Custom" + bulk_complete: "회원들이 그룹에 추가되었습니다." + bulk: "그룹에 한꺼번에 추가하기" + bulk_paste: "한 줄당 하나씩 아이디 또는 이메일 리스트를 붙여넣기 하세요." + bulk_select: "(그룹을 선택하세요)" automatic: "자동화" automatic_membership_email_domains: "이 목록의 있는 항목과 사용자들이 등록한 이메일 도메인이 일치할때 이 그룹에 포함" automatic_membership_retroactive: "이미 등록된 사용자에게 같은 이메일 도메인 규칙 적용하기" default_title: "Default title for all users in this group" primary_group: "Automatically set as primary group" + group_owners: 소유자 + add_owners: 소유자 추가하기 + incoming_email_placeholder: "이메일 주소를 입력하세요" api: generate_master: "마스터 API 키 생성" none: "지금 활성화된 API 키가 없습니다." @@ -1768,11 +1836,11 @@ ko: is_disabled: "사이트 설정에서 '복구 기능'이 비활성화 되어있습니다." label: "복구" title: "백업을 이용하여 복구" - confirm: "정말 이 백업을 이용하여 복구할까요?" + confirm: "정말 이 백업으로 복원할까요?" rollback: label: "롤백" title: "데이터베이스를 이전 workiong state로 되돌리기" - confirm: "정말로 이전 작업 상태로 데이터베이스를 롤백하시겠습니까?" + confirm: "데이타베이스를 이전 상태로 롤백 또는 되돌리기 할까요?" export_csv: user_archive_confirm: "정말로 내 글을 다운로드 받습니까?" success: "Export initiated, you will be notified via message when the process is complete." @@ -1824,6 +1892,10 @@ ko: opacity: "투명도" copy: "복사" email_templates: + title: "이메일 템플릿" + subject: "제목" + multiple_subjects: "이 이메일 양식은 제목이 여러가지 있습니다." + body: "본문" none_selected: "편집하려는 이메일 템플릿을 선택하세요." revert: "변경사항 취소" revert_confirm: "정말로 변경사항을 되돌리시겠습니까?" @@ -1871,9 +1943,6 @@ ko: love: name: '사랑' description: "좋아요 버튼 색" - wiki: - name: '위키' - description: "위키 글의 배경색으로 사용될 기본 색상" email: title: "이메일" settings: "설정" @@ -1904,8 +1973,29 @@ ko: reply_key: "답글 단축키" skipped_reason: "생략 이유" incoming_emails: + from_address: "보내는사람" + to_addresses: "받는사람" + cc_addresses: "참조" + subject: "제목" error: "에러" + none: "수신된 이메일이 없습니다." + modal: + error: "에러" + return_path: "Return-Path" + message_id: "Message-Id" + in_reply_to: "In-Reply-To" + references: "레퍼런스" + date: "날짜" + from: "보내는사람" + to: "받는사람" + cc: "참조" + subject: "제목" + body: "본문" filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "제목..." error_placeholder: "에러" logs: none: "로그가 없습니다." @@ -1950,8 +2040,8 @@ ko: no_previous: "이전 값이 없습니다." deleted: "새로운 값이 없습니다. 기록이 삭제되었습니다." actions: - delete_user: "사용자 삭제" - change_trust_level: "신뢰도 변경" + delete_user: "회원 삭제" + change_trust_level: "회원등급 변경" change_username: "아이디 변경" change_site_setting: "사이트 설정 변경" change_site_customization: "사이트 커스텀화 변경" @@ -1959,8 +2049,8 @@ ko: change_site_text: "site text 변경" suspend_user: "suspend user" unsuspend_user: "unsuspend user" - grant_badge: "뱃지 부여" - revoke_badge: "뱃지 회수" + grant_badge: "배지 부여" + revoke_badge: "배지 회수" check_email: "이메일 확인" delete_topic: "토픽 삭제" delete_post: "글 삭제" @@ -1972,6 +2062,11 @@ ko: create_category: "카테고리 만들기" block_user: "사용자 차단" unblock_user: "사용자 차단 해제" + grant_admin: "관리자권한 부여" + revoke_admin: "관리자권한 회수" + grant_moderation: "운영자권한 부여" + revoke_moderation: "운영자권한 회수" + backup_operation: "백업 작업" screened_emails: title: "블락된 이메일들" description: "누군가가 새로운 계정을 만들면 아래 이메일 주소는 체크되고 등록은 블락됩니다, 또는 다른 조치가 취해집니다." @@ -2031,16 +2126,16 @@ ko: reject_selected: other: "거부한 사용자 ({{count}}명)" titles: - active: '활성화된 사용자' - new: '새로운 사용자' - pending: '검토가 필요한 사용자' - newuser: '사용자 신뢰도 0 (새로운 사용자)' - basic: '사용자 신뢰도 1 (초보 사용자)' - member: '사용자 신뢰도 2 (회원)' - regular: '사용자 신뢰도 3 (정규)' - leader: '사용자 신뢰도 4 (지도자)' + active: '활동적인 회원' + new: '신규회원' + pending: '검토 대기중인 회원' + newuser: '0등급 회원 (신규가입 회원)' + basic: '1등급 회원 (초보 회원)' + member: '2등급 회원 (부회원)' + regular: '3등급 회원 (정회원)' + leader: '4등급 회원 (리더)' staff: "스태프" - admins: '관리자 사용자 목록' + admins: '관리자' moderators: '운영자' blocked: '블락된 사용자들' suspended: '접근 금지된 사용자들' @@ -2069,6 +2164,7 @@ ko: moderator: "운영자?" admin: "관리자?" blocked: "블락" + staged: "격리조치?" show_admin_profile: "관리자" edit_title: "제목 수정" save_title: "제목 저장" @@ -2135,39 +2231,40 @@ ko: deactivate_explanation: "비활성화 사용자는 이메일 인증을 다시 받아야합니다." suspended_explanation: "접근 금지된 유저는 로그인 할 수 없습니다." block_explanation: "블락 사용자는 글을 작성하거나 토픽을 작성할 수 없습니다." - trust_level_change_failed: "신뢰도 변경에 문제가 있습니다." + stage_explanation: "격리조치된 회원은 특정 토픽에만 이메일로만 글을 쓸 수 있습니다." + trust_level_change_failed: "회원등급 변경에 실패했습니다." suspend_modal_title: "거부된 사용자" - trust_level_2_users: "신뢰도 2 사용자들" - trust_level_3_requirements: "사용자 신뢰도 3 이상이 필요" - trust_level_locked_tip: "신뢰도 시스템이 잠겼습니다. 시스템이 사용자를 승급이나 강등시키지 않을 것 입니다." - trust_level_unlocked_tip: "신뢰도 시스템이 잠금이 해제되었습니다. 시스템은 사용자를 승급이나 강등 시킬 것입니다." - lock_trust_level: "신뢰도 시스템 잠금" - unlock_trust_level: "신뢰도 시스템 잠금 해제" + trust_level_2_users: "2등급 회원들" + trust_level_3_requirements: "회원등급 3 이상이어야 합니다." + trust_level_locked_tip: "회원등급이 고정되었습니다. 시스템이 회원등급을 올리거나 내리지 않을 것입니다." + trust_level_unlocked_tip: "회원등급 고정이 풀렸습니다. 시스템이 회원등급을 자동적으로 올리거나 내릴 것입니다." + lock_trust_level: "회원등급 고정" + unlock_trust_level: "회원등급 고정 해제" tl3_requirements: - title: "레벨 3 권한이 필요합니다." + title: "3등급 회원이 되기 위한 자격" table_title: "지난 %{time_period} 일간" value_heading: "값" - requirement_heading: "필수" - visits: "방문수" + requirement_heading: "자격요건" + visits: "방문횟수" days: "일" - topics_replied_to: "답글 달린 토픽" - topics_viewed: "읽은 토픽 수" - topics_viewed_all_time: "읽은 토픽 수 (전체 기간)" - posts_read: "읽은 글 수" - posts_read_all_time: "읽은 글 수 (전체 기간)" - flagged_posts: "신고된 글" - flagged_by_users: "신고한 사용자들" - likes_given: "선사한 '좋아요'" - likes_received: "받은 '좋아요'" - likes_received_days: "받은 '좋아요' : 특정일" - likes_received_users: "받은 좋아요: 순사용자(unique users)" - qualifies: "신뢰 등급 3의 조건에 부합합니다." - does_not_qualify: "신뢰 등급 3의 조건에 부합하지 않습니다." + topics_replied_to: "댓글 달은 토픽 갯수" + topics_viewed: "열어본 토픽 갯수" + topics_viewed_all_time: "열어본 토픽 갯수 (전체 기간)" + posts_read: "읽은 글 갯수" + posts_read_all_time: "읽은 글 갯수 (전체 기간)" + flagged_posts: "신고당한 글 갯수" + flagged_by_users: "신고한 회원수" + likes_given: "'좋아요' 선물한 횟수" + likes_received: "'좋아요' 받은 횟수" + likes_received_days: "한번이라도 '좋아요' 받아본 날짜횟수" + likes_received_users: "한번이라도 '좋아요' 선물해준 회원수" + qualifies: "3등급회원 자격을 만족합니다" + does_not_qualify: "3등급회원 자격을 만족하지 않습니다" will_be_promoted: "곧 승급 됩니다." will_be_demoted: "곧 강등됩니다." on_grace_period: "현재 승급 유예 기간이므로 강등되지 않습니다." - locked_will_not_be_promoted: "신뢰도 시스템이 잠겼습니다. 승급되지 않습니다." - locked_will_not_be_demoted: "신뢰도 시스템이 잠겼습니다. 강등되지 않습니다." + locked_will_not_be_promoted: "회원등급이 고정되었습니다. 승급되지 않을 것입니다." + locked_will_not_be_demoted: "회원등급이 고정되었습니다. 강등되지 않을 것입니다." sso: title: "Single Sign On" external_id: "External ID" @@ -2225,86 +2322,86 @@ ko: add_url: "URL 추가" add_host: "Host 추가" categories: - all_results: 'All' + all_results: '전체' required: '필수' basic: '기본 설정' - users: '사용자' + users: '회원' posting: '글' email: '이메일' files: '파일' - trust: '신뢰도' + trust: '회원등급' security: '보안' onebox: "Onebox" - seo: 'SEO' + seo: '검색엔진최적화(SEO)' spam: '스팸' rate_limits: '제한' developer: '개발자' embedding: "Embedding" - legal: "합법적인" + legal: "법률조항" uncategorized: '카테고리 없음' backups: "백업" login: "로그인" plugins: "플러그인" - user_preferences: "사용자 환경 설정" + user_preferences: "회원 환경설정" badges: - title: 뱃지 - new_badge: 새로운 뱃지 + title: 배지 + new_badge: 새 배지 new: New name: 이름 - badge: 뱃지 + badge: 배지 display_name: 표시 이름 description: 설명 - badge_type: 뱃지 종류 + badge_type: 배지 종류 badge_grouping: 그룹 badge_groupings: - modal_title: 뱃지 그룹으로 나누기 + modal_title: 배지 그룹으로 나누기 granted_by: 배지 부여자 granted_at: 배지 수여일 - reason_help: ( 토픽이나 게시글 링크) + reason_help: (토픽 또는 댓글로 가는 링크) save: 저장 delete: 삭제 - delete_confirm: 정말로 이 뱃지를 삭제하시겠습니까? + delete_confirm: 정말로 이 배지를 삭제할까요? revoke: 회수 - reason: 원인 + reason: 이유 expand: 확장 … - revoke_confirm: 정말로 이 뱃지를 회수하시겠습니까? - edit_badges: 뱃지 수정 - grant_badge: 뱃지 부여 - granted_badges: 부여된 뱃지 + revoke_confirm: 정말로 이 배지를 회수할까요? + edit_badges: 배지 수정 + grant_badge: 배지 부여 + granted_badges: 부여된 배지 grant: 부여 - no_user_badges: "%{name}님은 수여받은 뱃지가 없습니다." - no_badges: 받을 수 있는 뱃지가 없습니다. - none_selected: "시작하려면 뱃지를 선택하세요" - allow_title: 뱃지를 칭호로 사용 가능하도록 허용 + no_user_badges: "%{name}님은 배지가 없습니다." + no_badges: 받을 수 있는 배지가 없습니다. + none_selected: "시작하려면 배지를 선택하세요" + allow_title: 배지를 칭호로 사용 가능하도록 허용 multiple_grant: 중복 부여할 수 있도록 허용 - listable: 공개 뱃지 페이지에 표시되는 뱃지입니다. - enabled: 뱃지 기능 사용 + listable: 공개 배지 페이지에 표시되는 배지입니다. + enabled: 배지 기능 사용 icon: 아이콘 image: 이미지 - icon_help: "Font Awesome class나 이미지 주소를 사용합니다" - query: 뱃지 Query(SQL) - target_posts: 포스트들을 타겟으로 하는 query - auto_revoke: 매일 회수 query를 실행한다. - show_posts: 뱃지 페이지에서 뱃지를 받게한 글을 보여줍니다. + icon_help: "이미지 주소로 Font Awesome 클래스 또는 URL을 사용합니다" + query: 배지 쿼리(SQL) + target_posts: 글들을 대상으로 하는 쿼리 + auto_revoke: 회수 쿼리를 매일 실행 + show_posts: 배지 페이지에서 배지를 받게한 글을 보여줍니다. trigger: Trigger trigger_type: none: "매일 업데이트" - post_action: "사용자가 포스트에 액션을 했을 때" - post_revision: "사용자가 포스트를 수정거나 작성했을 때" - trust_level_change: "사용자의 신뢰도가 변했을 떄" - user_change: "사용자가 수정되거나 생성되었을 때" + post_action: "회원이 글에 액션을 할 때" + post_revision: "회원이 새글을 쓰거나 글을 수정할 때" + trust_level_change: "회원등급이 바뀔 때" + user_change: "회원이 생성되거나 수정될 때" preview: - link_text: "수여된 뱃지 미리보기" - plan_text: "Query plan 미리보기" - modal_title: "뱃지 Query 미리보기" - sql_error_header: "Query에 오류가 있습니다." - error_help: "뱃지 query의 도움말을 보려면 다음의 링크를 확인하세요." + link_text: "수여된 배지 미리보기" + plan_text: "쿼리 플랜 미리보기" + modal_title: "배지 쿼리 미리보기" + sql_error_header: "질의 중 오류가 발생했습니다" + error_help: "배지 쿼리 도움말을 보려면 다음 링크를 확인하세요." bad_count_warning: header: "주의!" - text: "사라진 뱃지 샘플이 있습니다. 뱃지 query가 존재하지 않는 user ID나 post ID를 반환할 경우 발생합니다. 예상하지 못한 결과를 일으킬 수 있으니 query를 다시 한번 확인하세요." - no_grant_count: "할당된 뱃지가 없습니다." + text: "사라진 배지 샘플이 있습니다. 배지 query가 존재하지 않는 user ID나 post ID를 반환할 경우 발생합니다. 예상하지 못한 결과를 일으킬 수 있으니 query를 다시 한번 확인하세요." + no_grant_count: "할당된 배지가 없습니다." grant_count: - other: "%{count}개의 뱃지가 할당됨." + other: "%{count}개의 배지가 할당됨." sample: "샘플:" grant: with: %{username} @@ -2312,28 +2409,35 @@ ko: with_post_time: %{username} for post in %{link} at %{time} with_time: %{username} at %{time} emoji: - title: "Emoji" - help: "모든 사용자가 사용가능한 새로운 이미지를 추가. (프로 팁: 여러개의 파일을 드래그 & 드롭으로 한번에)" - add: "새로운 Emoji 추가" + title: "이모지" + help: "모든 사람이 쓸 수 있는 이모지를 추가합니다. (팁: 여러개 파일을 한 번에 드래그 & 드롭할 수 있어요)" + add: "새 이모지 추가" name: "이름" image: "이미지" - delete_confirm: "정말 :%{name}: emoji를 삭제하시겠습니까?" + delete_confirm: "정말로 :%{name}: 이모지를 삭제할까요?" embedding: get_started: "다른 웹사이트에 Discourse를 임베드하려면 호스트 추가부터 하세요" confirm_delete: "정말로 host를 삭제할까요?" - title: "Embedding" + sample: "Discourse 토픽을 웨사이트에 삽입(embed)하기 위해 다음 HTML코드를 이용하세요. REPLACE_ME 부분을 당신이 삽입하려는 웨사이트의 정식URL로 바꿔치기 하시면 됩니다." + title: "삽입(Embedding)" host: "허용 Host" edit: "편집" category: "카테고리에 게시" add_host: "Host 추가" - settings: "Embedding 설정" - feed_settings: "Feed 설정" - crawling_settings: "클롤러 설정" - embed_post_limit: "글 개수가 최대치입니다" - embed_truncate: "임베드된 글 비우기" + settings: "삽입(Embedding) 설정" + feed_settings: "피드 설정" + feed_description: "당신 사이트의 RSS/ATOM 피드를 알려주시면 Discourse가 그 사이트 컨텐트를 더 잘 가져올 수 있습니다." + crawling_settings: "크롤러 설정" + crawling_description: "When Discourse creates topics for your posts, if no RSS/ATOM feed is present it will attempt to parse your content out of your HTML. Sometimes it can be challenging to extract your content, so we provide the ability to specify CSS rules to make extraction easier." + embed_by_username: "토픽 생성 시 사용할 회원이름(Username)" + embed_post_limit: "삽입(embed)할 글 최대갯수" + embed_username_key_from_feed: "피드에서 discourse usename을 꺼내오기 위한 키(key)" + embed_truncate: "임베드된 글 뒷부분 잘라내기" + embed_whitelist_selector: "CSS selector for elements that are allowed in embeds" + embed_blacklist_selector: "CSS selector for elements that are removed from embeds" feed_polling_enabled: "RSS/ATOM으로 글 가져오기" - feed_polling_url: "RSS/ATOM 피드로 긁을 URL" - save: "Embedding 설정 저장하기" + feed_polling_url: "긁어올 RSS/ATOM 피드 URL" + save: "삽입(Embedding) 설정 저장하기" permalink: title: "고유링크" url: "URL" @@ -2362,8 +2466,10 @@ ko: new: 'g, n 새로운' unread: 'g, u 읽지 않은' categories: 'g, c 카테고리' - top: 'g, t 인기' + top: 'g, t 인기글' bookmarks: 'g, b 북마크' + profile: 'g, p 프로필' + messages: 'g, m 메시지' navigation: title: 'Navigation' jump: '# 글 번호로' @@ -2382,6 +2488,7 @@ ko: help: '? 키보드 도움말 열기' dismiss_new_posts: 'x, r 새글을 읽은 상태로 표시하기' dismiss_topics: 'x, t 토픽 무시하기' + log_out: 'shift+z shift+z 로그아웃' actions: title: 'Actions' bookmark_topic: 'f 토글 북마크 토픽' @@ -2402,16 +2509,19 @@ ko: mark_tracking: 'm, t 토픽 알람 : 추적하기' mark_watching: 'm, w 토픽 알람 : 주시하기' badges: - title: 뱃지 + earned_n_times: + other: "이 배지를 %{count}번 받았습니다" + more_with_badge: "이 배지를 받은 다른사람들" + title: 배지 allow_title: "can be used as a title" multiple_grant: "can be awarded multiple times" badge_count: - other: "뱃지 %{count}개" + other: "배지 %{count}개" more_badges: other: "+%{count} More" granted: other: "%{count} 개 부여" - select_badge_for_title: 칭호로 사용할 뱃지를 선택하세요 + select_badge_for_title: 칭호로 사용할 배지를 선택하세요 none: "<없음>" badge_grouping: getting_started: @@ -2419,102 +2529,102 @@ ko: community: name: 커뮤니티 trust_level: - name: 신뢰 등급 + name: 회원등급 other: name: 기타 posting: name: 글 관련 배지 badge: editor: - name: 편집자 - description: 첫 포스트 편집 + name: 에디터 + description: 첫 글 작성 basic_user: - name: 기본 - description: 부여되면 커뮤니티의 기본 기능 수행 가능 + name: 초보회원 + description: 초보회원은 커뮤니티의 기본기능을 사용할 수 있습니다 member: - name: 멤버 - description: Granted invitations + name: 부회원 + description: 부회원은 다른 사람을 커뮤티니에 초대할 수 있습니다 regular: - name: Regular - description: Granted recategorize, rename, followed links and lounge + name: 정회원 + description: 정회원은 토픽 제목과 카테고리를 바꾸거나 HTML Link Follow 기능을 사용, 정회원 전용카테고리에 접근할 수 있습니다. leader: - name: 중견 - description: Granted global edit, pin, close, archive, split and merge + name: 리더 + description: 리더는 모든 글을 수정하거나 토픽 핀고정, 토픽닫기, 토픽아카이빙, 토픽쪼개기, 토픽합치기 등을 할 수 있습니다. welcome: - name: 환영합니다 - description: 좋아요 받음 + name: 웰컴 + description: 좋아요 선물받음 autobiographer: name: 자서전 작가 - description: 사용자의 프로필 정보를 작성함 + description: 회원 프로필 정보를 작성했습니다 anniversary: - name: 기념일 - description: Active member for a year, posted at least once + name: 1주년 + description: 1년동안 열심히 활동하고 글도 1개이상 썼습니다 nice_post: - name: 괜찮은 글 - description: 작성한 글이 좋아요를 10개 받았습니다. 이 뱃지는 중복 수여 가능합니다. + name: Nice Post + description: 작성한 글이 좋아요를 10개 받았습니다. 이 배지는 여러번 받을 수 있습니다. good_post: - name: 좋은 글 - description: 작성한 글이 좋아요를 25개 받았습니다. 이 뱃지는 중복 수여 가능합니다. + name: Good Post + description: 작성한 글이 좋아요를 25개 받았습니다. 이 배지는 여러번 받을 수 있습니다. great_post: - name: 굉장히 좋은 글 - description: 작성한 글이 좋아요를 50개 받았습니다. 이 뱃지는 중복 수여 가능합니다. + name: Great Post + description: 작성한 글이 좋아요를 50개 받았습니다. 이 배지는 여러번 받을 수 있습니다. nice_topic: - name: Nice 토픽 - description: 10개의 '좋아요'를 받았습니다. 이 뱃지는 여러번 받을 수 있습니다. + name: Nice Topic + description: 10개의 '좋아요'를 받았습니다. 이 배지는 여러번 받을 수 있습니다. good_topic: - name: Good 토픽 - description: 25개의 '좋아요'를 받았습니다. 이 뱃지는 여러번 받을 수 있습니다. + name: Good Topic + description: 25개의 '좋아요'를 받았습니다. 이 배지는 여러번 받을 수 있습니다. great_topic: - name: Great 토픽 - description: 50개의 '좋아요'를 받았습니다. 이 뱃지는 여러번 받을 수 있습니다. + name: Great Topic + description: 50개의 '좋아요'를 받았습니다. 이 배지는 여러번 받을 수 있습니다. nice_share: - name: Nice 공유 - description: 25명의 사용자로부터 공유되었습니다 + name: Nice Share + description: 방문자 25명이 글을 공유했습니다 good_share: - name: Good 공유 - description: 300명의 사용자로부터 공유되었습니다 + name: Good Share + description: 방문자 300명의 글을 공유했습니다 great_share: - name: Great 공유 - description: 1000명의 사용자로부터 공유되었습니다 + name: Great Share + description: 방문자 1000명이 글을 공유했습니다 first_like: - name: 첫 좋아요 + name: 처음 좋아요 description: 처음으로 글에 '좋아요'를 했습니다. first_flag: - name: 첫 신고 + name: 처음 신고해요 description: 글을 처음으로 신고하였습니다. promoter: - name: Promoter - description: 사용자 초대 + name: 후원자 + description: 회원을 1명 초대했습니다 campaigner: - name: Campaigner - description: 기본 사용자 3명 초대하기 (신뢰도 1) + name: 운동가 + description: 초보회원(1등급회원) 3명을 초대했습니다 champion: - name: Champion - description: 기본 사용자 5명 초대하기 (신뢰도 2) + name: 챔피언 + description: 초보회원(2등급회원) 5명을 초대했습니다 first_share: - name: 첫 공유 - description: 처음으로 글을 공유했습니다. + name: 처음 공유해요 + description: 처음으로 글을 공유했습니다 first_link: - name: 첫 링크 - description: 글 작성시, 다른 토픽으로 가는 링크를 처음으로 추가하였습니다. + name: 처음 링크걸어요 + description: 다른 토픽으로 가는 링크를 처음으로 추가했습니다 first_quote: - name: 첫 인용 - description: 글 작성시 다른 사용자의 글을 인용하였습니다. + name: 처음 인용해요 + description: 회원을 인용했습니다 read_guidelines: name: 가이드라인 읽음 description: 커뮤니티 가이드라인 을 읽었습니다. reader: name: 독서가 - description: 100개가 넘는 댓글이 달린 토픽의 댓글을 모두 읽었습니다. + description: 100개가 넘는 댓글이 달린 토픽의 댓글을 모두 읽었습니다 popular_link: name: 인기 링크 - description: 50회 이상 클릭이 발생한 외부 링크 게시 + description: 게시한 외부링크가 50회 이상 클릭되었습니다 hot_link: - name: HOT 링크 - description: 300회 이상 클릭이 발생한 외부 링크 게시 + name: 핫 링크 + description: 게시한 외부링크가 300회 이상 클릭되었습니다 famous_link: - name: Famous 링크 - description: 1000회 이상 클릭이 발생한 외부 링크 게시 + name: 완전유명 링크 + description: 게시한 외부링크가 1000회 이상 클릭되었습니 google_search: |

Google 검색

diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 0c4ea992f0..76d75644f3 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -100,6 +100,8 @@ nl: x_years: one: "1 jaar later" other: "%{count} jaren later" + previous_month: 'Vorige Maand' + next_month: 'Volgende Maand' share: topic: 'deel een link naar deze topic' post: 'bericht #%{postNumber}' @@ -132,6 +134,19 @@ nl: disabled: 'niet zichtbaar %{when}' topic_admin_menu: "Adminacties voor topic" emails_are_disabled: "Alle uitgaande e-mails zijn uitgeschakeld door een beheerder. Geen enkele vorm van e-mail notificatie wordt verstuurd." + s3: + regions: + us_east_1: "US Oost (N. Virginia)" + us_west_1: "US West (N. California)" + us_west_2: "US West (Oregon)" + us_gov_west_1: "AWS GovCloud (US)" + eu_west_1: "EU (Ierland)" + eu_central_1: "EU (Frankfurt)" + ap_southeast_1: "Azië Pacific (Singapore)" + ap_southeast_2: "Azië Pacific (Sydney)" + ap_northeast_1: "Azië Pacific (Tokyo)" + ap_northeast_2: "Azië Pacific (Seoul)" + sa_east_1: "Zuid Amerika (Sao Paulo)" edit: 'bewerk de titel en categorie van deze topic' not_implemented: "Die functie is helaas nog niet beschikbaar. Sorry!" no_value: "Nee" @@ -175,6 +190,7 @@ nl: other: "{{count}} tekens" suggested_topics: title: "Aanbevolen topics" + pm_title: "Voorgestelde Berichten" about: simple_title: "Over" title: "Over %{title}" @@ -253,7 +269,7 @@ nl: one: "Voor deze topic staat 1 bericht klaar om goedgekeurd te worden" other: "Voor dit topic staan {{count}} berichten klaar om goedgekeurd te worden" confirm: "Sla wijzigingen op" - delete_prompt: "Weet je zeker dat je %{username} wilt verwijderen? Dit zal alle zijn berichten verwijderen en zal zijn email en ip-adres blokkeren." + delete_prompt: "Weet je zeker dat je %{username} wilt verwijderen? Dit verwijdert al hun post en blokkeert hun IP adres en E-mail adres." approval: title: "Bericht vereist goedkeuring" description: "We hebben je nieuwe bericht ontvangen, maar deze moet eerst goedgekeurd worden door een moderator voordat deze zichtbaar wordt. Wees a.u.b. geduldig." @@ -296,6 +312,12 @@ nl: one: "1 lid" other: "%{count} leden" groups: + empty: + posts: "Er zijn geen posts van leden van deze groep." + members: "Er zijn geen leden in deze groep." + mentions: "Deze groep wordt niet benoemd." + messages: "Er zijn geen berichten voor deze groep." + topics: "Er is geen onderwerp door de leden van deze groep." add: "Voeg toe" selector_placeholder: "Voeg leden toe" owner: "eigenaar" @@ -306,6 +328,7 @@ nl: members: "Leden" posts: "Berichten" alias_levels: + title: "Wie kan deze groep een bericht sturen en taggen?" nobody: "Niemand" only_admins: "Alleen admins" mods_and_admins: "Alleen moderatoren and admins" @@ -314,6 +337,19 @@ nl: trust_levels: title: "Trustlevel dat automatisch wordt toegekend aan nieuwe gebruikers:" none: "Geen" + notifications: + watching: + title: "Kijken naar" + description: "Je krijgt een notificatie bij elke nieuwe post of bericht, en het aantal nieuwe reacties wordt weergeven." + tracking: + title: "Volgen" + description: "Je krijgt een notificatie wanneer iemand jouw @name noemt of reageert, en het aantal nieuwe reacties wordt weergeven." + regular: + title: "Normaal" + description: "Je krijgt een notificatie wanneer iemand jouw @name noemt of reageert." + muted: + title: "Gedempt" + description: "Je krijgt geen notificatie over nieuwe onderwerpen in deze groep." user_action_groups: '1': "Likes gegeven" '2': "Likes ontvangen" @@ -332,6 +368,7 @@ nl: all_subcategories: "alle" no_subcategory: "geen" category: "Categorie" + category_list: "Geef categorieën lijst weer." reorder: title: "Categorieën herschikken " title_long: "Reorganiseer de categorielijst" @@ -388,15 +425,15 @@ nl: invited_by: "Uitgenodigd door" trust_level: "Trustlevel" notifications: "Notificaties" + statistics: "Statistieken " desktop_notifications: label: "Desktopnotificaties" not_supported: "Notificaties worden niet ondersteund door deze browser. Sorry." perm_default: "Notificaties aanzetten" perm_denied_btn: "Toestemming geweigerd" + perm_denied_expl: "Je blokkeert notificaties. Sta deze toe in je browser instellingen." disable: "Notificaties uitschakelen" - currently_enabled: "(momenteel ingeschakeld)" enable: "Notificaties inschakelen" - currently_disabled: "(momenteel uitgeschakeld)" each_browser_note: "Let op: Je moet deze optie instellen voor elke browser die je gebruikt." dismiss_notifications: "Markeer alles als gelezen" dismiss_notifications_tooltip: "Markeer alle ongelezen berichten als gelezen" @@ -431,6 +468,7 @@ nl: muted_users: "Negeren" muted_users_instructions: "Negeer alle meldingen van deze leden." muted_topics_link: "Toon gedempte topics." + automatically_unpin_topics: "ontspelt onderwerp automatische wanneer de bodem is bereikt." staff_counters: flags_given: "behulpzame markeringen" flagged_posts: "gemarkeerde berichten" @@ -439,6 +477,15 @@ nl: warnings_received: "waarschuwingen" messages: all: "Alle" + inbox: "Postvak In" + sent: "Verzend" + archive: "Archiveren" + groups: "Mijn Groepen" + bulk_select: "Selecteer berichten" + move_to_inbox: "Verplaats naar Postvak In" + move_to_archive: "Archiveren" + failed_to_move: "Het is niet gelukt om het geselecteerde bericht te verplaatsen (Waarschijnlijk is de internetconnectie verbroken)" + select_all: "Selecteer Alles" change_password: success: "(e-mail verzonden)" in_progress: "(e-mail wordt verzonden)" @@ -483,6 +530,10 @@ nl: ok: "We sturen een e-mail ter bevestiging" invalid: "Vul een geldig e-mailadres in " authenticated: "Je e-mail is geauthenticeerd door {{provider}}" + frequency_immediately: "We zullen je onmiddellijk e-mailen als je hetgeen waarover we je e-mailen niet gelezen hebt." + frequency: + one: "We zullen je alleen maar e-mailen als we je de laatste {{count}} minuten niet gezien hebben." + other: "We zullen je alleen maar e-mailen als we je de laatste {{count}} minuten niet gezien hebben." name: title: "Naam" instructions: "Je volledige naam (optioneel)" @@ -518,12 +569,18 @@ nl: title: "Badge van gebruikersprofiel" website: "Website" email_settings: "E-mail" + email_previous_replies: + title: "Voeg de vorige reacties bij onderaan de emails" + unless_emailed: "tenzij eerder verzonden" + always: "altijd" + never: "nooit" email_digests: title: "Stuur me een mail met de laatste updates wanneer ik de site niet bezoek:" daily: "dagelijks" every_three_days: "elke drie dagen" weekly: "wekelijks" every_two_weeks: "elke twee weken" + email_in_reply_to: "Voeg een deel van de reactie toe in de emails" email_direct: "Stuur me een e-mail wanneer iemand me citeert, reageert op mijn bericht, mijn @gebruikersnaam noemt of uitnodigt voor een topic." email_private_messages: "Ontvang een mail wanneer iemand je een bericht heeft gestuurd." email_always: "Stuur me e-mail notificaties, zelfs als ik ben actief op de site" @@ -591,6 +648,21 @@ nl: same_as_email: "Je wachtwoord is hetzelfde als je e-mail." ok: "Je wachtwoord ziet er goed uit." instructions: "Minimaal %{count} tekens." + summary: + title: "Overzicht " + stats: "Statistieken " + topic_count: "Topics gemaakt" + post_count: "Bericht aangemaakt" + likes_given: "'Vind ik leuks' gegeven" + likes_received: "'Vind ik leuks' ontvangen" + days_visited: "Dagen bezocht" + posts_read_count: "Berichten gelezen" + top_replies: "Beste Reacties" + top_topics: "Top Topics" + top_badges: "Top Badges" + more_topics: "Meer Topics" + more_replies: "Meer Antwoorden" + more_badges: "Meer Badges" associated_accounts: "Logins" ip_address: title: "Laatste IP-adres" @@ -633,6 +705,7 @@ nl: logout: "Je bent uitgelogd." refresh: "Ververs" read_only_mode: + enabled: "De site is in alleen lezen modus. Interactie is niet mogelijk." login_disabled: "Zolang de site in read-only modus is, kan er niet ingelogd worden." too_few_topics_and_posts_notice: "Laten we de discussie starten! Er zijn al %{currentTopics} / %{requiredTopics} topics en %{currentPosts} / %{requiredPosts} berichten. Nieuwe bezoekers hebben conversaties nodig om te lezen en reageren." too_few_topics_notice: "Laten we de discussie starten! Er zijn al %{currentTopics} / %{requiredTopics} topics en %{currentPosts} / %{requiredPosts} berichten. Nieuwe bezoekers hebben conversaties nodig om te lezen en reageren." @@ -663,7 +736,7 @@ nl: summary: enabled_description: "Je leest een samenvatting van dit topic: alleen de meeste interessante berichten zoals bepaald door de community. " description: "Er zijn {{replyCount}} reacties." - description_time: "Er zijn {{replyCount}} reacties met een gemiddelde leestijd van {{readingTime}} minuten." + description_time: "Er zijn {{replyCount}} reacties met een geschatte leestijd van{{readingTime}} minuten." enable: 'Samenvatting Topic' disable: 'Alle berichten' deleted_filter: @@ -747,6 +820,7 @@ nl: ctrl: 'Ctrl' alt: 'Alt' composer: + emoji: "Emoji :)" more_emoji: "meer..." options: "Opties" whisper: "Fluister" @@ -758,6 +832,7 @@ nl: saved_local_draft_tip: "lokaal opgeslagen" similar_topics: "Jouw topic lijkt op..." drafts_offline: "concepten offline" + group_mentioned: "Door het gebruik van {{group}}, sta je op het punt {{count}} op de hoogte te brengen." error: title_missing: "Titel is verplicht" title_too_short: "Titel moet uit minstens {{min}} tekens bestaan" @@ -812,6 +887,7 @@ nl: toggler: "verberg of toon de editor" modal_ok: "OK" modal_cancel: "Annuleer" + cant_send_pm: "Sorry, je kan geen berichten sturen naar %{username}." admin_options_title: "Optionele stafinstellingen voor deze topic" auto_close: label: "Tijd waarna topic automatisch wordt gesloten:" @@ -828,6 +904,7 @@ nl: more: "bekijk oudere notificaties" total_flagged: "aantal gemarkeerde berichten" mentioned: "

{{username}} {{description}}

" + group_mentioned: "

{{username}} {{description}}

" quoted: "

{{username}} {{description}}

" replied: "

{{username}} {{description}}

" posted: "

{{username}} {{description}}

" @@ -840,6 +917,9 @@ nl: moved_post: "

{{username}} verplaatste {{description}}

" linked: "

{{username}} {{description}}

" granted_badge: "

'{{description}}' ontvangen

" + group_message_summary: + one: "

{{count}} berichten in jouw {{group_name}} inbox

" + other: "

{{count}} berichten in jouw {{group_name}} inbox

" alt: mentioned: "Genoemd door" quoted: "Gequoot door" @@ -854,8 +934,10 @@ nl: moved_post: "Je bericht is verplaatst door" linked: "Link naar je bericht" granted_badge: "Badge toegekend" + group_message_summary: "Berichten in groep Postvak In" popup: mentioned: '{{username}} heeft je genoemd in "{{topic}}" - {{site_title}}' + group_mentioned: '{{username}} noemde jouw naam in "{{topic}}" - {{site_title}}' quoted: '{{username}} heeft je geciteerd in "{{topic}}" - {{site_title}}' replied: '{{username}} heeft je beantwoord in "{{topic}}" - {{site_title}}' posted: '{{username}} heeft een bericht geplaats in "{{topic}}" - {{site_title}}' @@ -911,6 +993,7 @@ nl: dismiss_read: "Alle ongelezen afwijzen" dismiss_button: "Afwijzen..." dismiss_tooltip: "Alleen nieuwe posts afwijzen of stop het volgen van topics" + also_dismiss_topics: "Stop het volgen van deze topics, zodat deze nooit meer als ongelezen worden weergegeven. " dismiss_new: "markeer nieuwe berichten als gelezen" toggle: "toggle bulkselectie van topics" actions: "Bulk Acties" @@ -934,8 +1017,8 @@ nl: top: "Er zijn geen top-topics." search: "Er zijn geen zoekresultaten gevonden." educate: - new: '

Je nieuwe topics verschijnen hier.

Standaard worden topics als nieuw beschouwd en tonen een nieuw indicator als ze gemaakt zijn in de afgelopen 2 dagen.

Je kan dit aanpassen in je voorkeuren.

' - unread: '

Je ongelezen topics verschijnen hier.

Standaard worden topics als ongelezen beschouwd en tonen een ongelezen aantal 1 als je:

  • Het topic gemaakt hebt
  • Geantwoord hebt in het topic
  • Het topic meer dan 4 minuten hebt gelezen

Of als je het topic expliciet hebt gemarkeerd als Te Volgen via de notificatieknop onder aan de pagina van elk topic.

Je kan dit aanpassen in je instellingen.

' + new: '

Je nieuwe topics verschijnen hier.

Standaard worden topics als nieuw weergegeven en als nieuw weergegeven als deze binnen de laatste 2 dagen zijn aangemaakt.

Visit your voorkeuren om dit te veranderen.

' + unread: '

Je ongelezen berichten verschijnen hier.

Standaard worden topics als nieuw beschouwd en zullen als ongelezen worden weergegeven1 als je:

  • de topic hebt aangemaakt
  • reageert op dit bericht
  • leest voor meer dan 4 minuten

Of als je het topic als volgen hebt gemarkeerd of hebt bekeken via het notificatie onderaan elk bericht.

Bezoek jouwvoorkeuren om dit te veranderen

' bottom: latest: "Er zijn geen recente topics." hot: "Er zijn geen polulaire topics meer." @@ -955,6 +1038,12 @@ nl: create: 'Nieuw topic' create_long: 'Maak een nieuw topic' private_message: 'Stuur een bericht' + archive_message: + help: 'Verplaats berichten naar jouw archief ' + title: 'Archiveren ' + move_to_inbox: + title: 'Verplaats naar Postvak In' + help: 'Verplaats het bericht terug naar Postvak in' list: 'Topics' new: 'nieuw topic' unread: 'ongelezen' @@ -1005,6 +1094,7 @@ nl: auto_close_title: 'Instellingen voor automatisch sluiten' auto_close_save: "Opslaan" auto_close_remove: "Sluit deze topic niet automatisch" + auto_close_immediate: "De laatste post in dit topic is al %{hours} uur oud, dus dit topic wordt meteen gesloten." progress: title: voortgang van topic go_top: "bovenaan" @@ -1096,14 +1186,24 @@ nl: unpin_until: "Zet deze topic niet langer bovenaan in de {{categoryLink}} categorie of wacht tot %{until}." pin_note: "Gebruikers kunnen het vastpinnen voor dit topic voor zichzelf ongedaan maken." pin_validation: "Een datum is vereist om deze topic vast te pinnen." + not_pinned: "Er zijn geen topics vastgepind in {{categoryLink}}." + already_pinned: + one: "Topics welke vastgepind zijn in {{categoryLink}}: {{count}}" + other: "Topics welke vastgepind zijn in {{categoryLink}}: {{count}}." pin_globally: "Zet deze topic bovenaan in alle topic lijsten tot" confirm_pin_globally: "Je hebt al {{count}} globaal vastgepinde topics. Teveel vastgepinde topics kunnen storend zijn voor nieuwe en anonieme gebruikers. Weet je zeker dat je nog een topic globaal wilt vastpinnen?" unpin_globally: "Zorg ervoor dat dit topic niet langer bovenaan alle topic lijsten komt." unpin_globally_until: "Zet deze topic niet langer bovenaan in alle topic lijsten of wacht tot %{until}." global_pin_note: "Gebruikers kunnen dit topic voor zichzelf ontpinnen." + not_pinned_globally: "Er zijn geen globaal vastgepinde topics." + already_pinned_globally: + one: "Topics welke globaal vastgepind zijn: {{count}}" + other: "Topics welke globaal vastgepind zijn: {{count}}." make_banner: "Zorg ervoor dat dit topic een banner wordt welke bovenaan alle pagina's komt." remove_banner: "Verwijder de banner die bovenaan alle pagina's staat." banner_note: "Gebruikers kunnen de banner negeren door deze te sluiten. Er kan maar een topic gebannered zijn." + no_banner_exists: "Er is geen banner topic." + banner_exists: "Er is op het ogenblik een banner topic." inviting: "Uitnodigen..." automatically_add_to_groups_optional: "Deze uitnodiging geeft ook toegang tot de volgende groepen: (optioneel, alleen voor beheerders)" automatically_add_to_groups_required: "Deze uitnodiging geeft ook toegang tot de volgende groepen: (Verplicht, alleen voor beheerders)" @@ -1115,6 +1215,7 @@ nl: success: "Deze gebruiker is uitgenodigd om in de conversatie deel te nemen." error: "Sorry, er is iets misgegaan bij het uitnodigen van deze persoon" group_name: "groepsnaam" + controls: "Topic Controls" invite_reply: title: 'Uitnodigen' username_placeholder: "gebruikersnaam" @@ -1209,6 +1310,10 @@ nl: has_likes_title: one: "iemand vind dit bericht leuk" other: "{{count}} mensen vinden dit bericht leuk" + has_likes_title_only_you: "Je vind dit bericht leuk" + has_likes_title_you: + one: "jij en 1 anderen vinden dit leuk" + other: "jij en {{count}} anderen vinden dit leuk" errors: create: "Sorry, er is iets misgegaan bij het plaatsen van je bericht. Probeer het nog eens." edit: "Sorry, er is iets misgegaan bij het bewerken van je bericht. Probeer het nog eens." @@ -1227,6 +1332,8 @@ nl: yes_value: "Ja, verwijderen" via_email: "dit bericht kwam binnen via e-mail" whisper: "deze posts zijn alleen toegankelijk voor moderators" + wiki: + about: "dit bericht is een wiki" archetypes: save: 'Bewaar instellingen' controls: @@ -1276,17 +1383,14 @@ nl: like: "Vind het niet meer leuk" vote: "Stem niet meer" people: - off_topic: "{{icons}} markeerden dit als off-topic" - spam: "{{icons}} markeerden dit als spam" - spam_with_url: "{{icons}} markeerde dit als spam" - inappropriate: "{{icons}} markeerden dit als ongepast" - notify_moderators: "{{icons}} lichtte moderators in" - notify_moderators_with_url: "{{icons}} lichtte moderators in" - notify_user: "{{icons}} verstuurde een bericht" - notify_user_with_url: "{{icons}} verstuurde een bericht" - bookmark: "{{icons}} voegden dit toe aan hun bladwijzers" - like: "{{icons}} vinden dit leuk" - vote: "{{icons}} hebben hier op gestemd" + off_topic: "heeft dit als off-topic gemeld" + spam: "markeerde dit als spam" + inappropriate: "markeerde dit als ongepast" + notify_moderators: "lichtte moderators in" + notify_user: "Stuur een bericht" + bookmark: "bladwijzer deze" + like: "Vind dit leuk" + vote: "stemde voor dit" by_you: off_topic: "Jij markeerde dit als off-topic" spam: "Jij markeerde dit als spam" @@ -1450,6 +1554,7 @@ nl: submit_tooltip: "Verstuur de privé markering" take_action_tooltip: "Bereik de vlag drempel direct, in plaats van het wachten op meer gemeenschapsvlaggen" cant: "Sorry, je kan dit bericht momenteel niet melden." + notify_staff: 'Licht de staf in' formatted_name: off_topic: "Het is off topic" inappropriate: "Het is ongepast" @@ -1531,6 +1636,10 @@ nl: with_topics: "%{filter} topics" with_category: "%{filter} %{category} topics" latest: + title: "Laatste" + title_with_count: + one: "Laatste (1)" + other: "Laatste ({{count}})" help: "topics met recente reacties" hot: title: "Populair" @@ -1546,9 +1655,23 @@ nl: title_in: "Categorie - {{categoryName}}" help: "alle topics gesorteerd op categorie" unread: + title: "Ongelezen" + title_with_count: + one: "Ongelezen (1)" + other: "Ongelezen ({{count}})" help: "topics die je volgt of bijhoudt met ongelezen berichten" + lower_title_with_count: + one: "1 ongelezen" + other: "{{count}} ongelezen" new: + lower_title_with_count: + one: "1 nieuw" + other: "{{count}} nieuw" lower_title: "nieuw" + title: "Nieuw" + title_with_count: + one: "Nieuw (1)" + other: "({{count}}) Nieuwe" help: "topics gemaakt in de afgelopen dagen" posted: title: "Mijn berichten" @@ -1557,6 +1680,10 @@ nl: title: "Bladwijzers" help: "topics waar je een bladwijzer aan toe hebt gevoegd" category: + title: "{{categoryName}}" + title_with_count: + one: "{{categoryName}} (1)" + other: "{{categoryName}} ({{count}})" help: "recente topics in de categorie {{categoryName}}" top: title: "Top" @@ -1636,6 +1763,7 @@ nl: refresh_report: "Ververs Rapport" start_date: "Start datum" end_date: "Eind datum" + groups: "Alle groepen" commits: latest_changes: "Laatste wijzigingen: update regelmatig!" by: "door" @@ -1732,6 +1860,8 @@ nl: primary_group: "Automatisch ingesteld als primaire groep" group_owners: Eigenaren add_owners: Eigenaren toevoegen + incoming_email: "Aangepaste inkomende email adressen " + incoming_email_placeholder: "Voer je email adres in" api: generate_master: "Genereer Master API Key" none: "Er zijn geen actieve API keys" @@ -1805,11 +1935,11 @@ nl: is_disabled: "Herstellen is uitgeschakeld in de instellingen." label: "Herstel" title: "Herstel van deze backup" - confirm: "Weet je zeker dat je van deze backup wil herstellen?" + confirm: "Weet je zeker dat je deze backup wilt terugzetten? " rollback: label: "Herstel" title: "Herstel de database naar de laatst werkende versie" - confirm: "Weet je zeker dat je de database wil herstellen naar de laatste versie?" + confirm: "Weet je zeker dat je de database wilt terugzetten naar de vorige staat?" export_csv: user_archive_confirm: "Weet je zeker dat je al je berichten wil downloaden?" success: "Exporteren is gestart, je zult gewaarschuwd worden als het proces is beeindigd." @@ -1860,6 +1990,14 @@ nl: color: "Kleur" opacity: "Doorzichtigheid" copy: "Kopieër" + email_templates: + title: "Email Sjabloon " + subject: "Onderwerp" + multiple_subjects: "Dit email sjabloon heeft meerdere onderwerpen." + body: "Body" + none_selected: "Kies een email sjabloon om te beginnen met bewerken." + revert: "Maak wijzigingen ongedaan" + revert_confirm: "Weet je zeker dat je de veranderingen ongedaan wilt maken?" css_html: title: "CSS/HTML" long_title: "CSS en HTML aanpassingen" @@ -1904,17 +2042,18 @@ nl: love: name: 'liefde' description: "De like knop kleur." - wiki: - name: 'wiki' - description: "Basiskleur die gebruikt wordt voor de achtergrond van wiki berichten." email: + title: "E-mails" settings: "Instellingen" + templates: "Sjablonen " preview_digest: "Voorbeeld digestmail" sending_test: "Testmail wordt verstuurd..." error: "FOUT - %{server_error}" test_error: "Er ging iets mis bij het versturen van de testmail. Kijk nog eens naar je mailinstellinen, controleer of je host mailconnecties niet blokkeert. Probeer daarna opnieuw." sent: "Verzonden" skipped: "Overgeslagen" + received: "Ontvangen" + rejected: "Geweigerd " sent_at: "Verzonden op" time: "Tijd" user: "Gebruiker" @@ -1932,6 +2071,32 @@ nl: last_seen_user: "Laatste online:" reply_key: "Reply key" skipped_reason: "Reden van overslaan" + incoming_emails: + from_address: "Van" + to_addresses: "Naar" + cc_addresses: "Cc" + subject: "Onderwerp" + error: "Error" + none: "Geen inkomende emails gevonden." + modal: + title: "Inkomende Email Details" + error: "Error" + return_path: "Teruggaan-Pad" + message_id: "Bericht-Id" + in_reply_to: "In-Reactie-Op" + references: "Referenties " + date: "Datum" + from: "Van" + to: "Naar" + cc: "Cc" + subject: "Onderwerp" + body: "Body" + filters: + from_placeholder: "from@example.com" + to_placeholder: "to@example.com" + cc_placeholder: "cc@example.com" + subject_placeholder: "Onderwerp.." + error_placeholder: "Error" logs: none: "Geen logs gevonden." filters: @@ -1981,6 +2146,7 @@ nl: change_site_setting: "verander instellingen" change_site_customization: "verander site aanpassingen" delete_site_customization: "verwijder site aanpassingen" + change_site_text: "Verander site tekst" suspend_user: "schors gebruiker" unsuspend_user: "hef schorsing op" grant_badge: "ken badge toe" @@ -1994,6 +2160,13 @@ nl: change_category_settings: "verander categorie instellingen" delete_category: "categorie verwijderen" create_category: "categorie creeren" + block_user: "blokkeer gebruiker" + unblock_user: "deblokkeer gebruiker" + grant_admin: "Ken Beheerdersrechten toe" + revoke_admin: "Ontneem beheerdersrechten" + grant_moderation: "Geef modereerrechten" + revoke_moderation: "Ontneem modereerrechten" + backup_operation: "backup handeling" screened_emails: title: "Gescreende e-mails" description: "Nieuwe accounts met een van deze mailadressen worden geblokkeerd of een andere actie wordt ondernomen." @@ -2060,6 +2233,9 @@ nl: pending: 'Nog niet geaccepteerde leden' newuser: 'Leden met Trust Level 0 (Nieuw lid)' basic: 'Leden met Trust Level 1 (Lid)' + member: 'Leden op Trust Level 2 (Lid)' + regular: 'Leden op Trust Level 3 (Vaste bezoeker)' + leader: 'Leden op Trust Level 4 (Leider)' staff: "Stafleden" admins: 'Administrators' moderators: 'Moderators' @@ -2092,6 +2268,7 @@ nl: moderator: "Moderator?" admin: "Beheerder?" blocked: "Geblokkeerd?" + staged: "Opvoeren?" show_admin_profile: "Beheerder" edit_title: "Wijzig titel" save_title: "Bewaar titel" @@ -2156,9 +2333,12 @@ nl: deactivate_failed: "Er ging iets mis bij het deactiveren van deze gebruiker." unblock_failed: 'Er ging iets mis bij het deblokkeren van deze gebruiker.' block_failed: 'Er ging iets mis bij het blokkeren van deze gebruiker.' + block_confirm: 'Weet je zeker dat je deze gebruikt wilt blokkeren? Deze gebruikers is dan niet meer in staat om nieuwe topics of berichten te plaatsen.' + block_accept: 'Ja, blokkeer deze gebruiker' deactivate_explanation: "Een gedeactiveerde gebruiker moet zijn e-mailadres opnieuw bevestigen." suspended_explanation: "Een geschorste gebruiker kan niet meer inloggen." block_explanation: "Een geblokkeerde gebruiker kan geen topics maken of reageren op topics." + stage_explanation: "Een opgevoerde gebruiker kan alleen via email in bepaalde topics berichten." trust_level_change_failed: "Er ging iets mis bij het wijzigen van het trust level van deze gebruiker." suspend_modal_title: "Schors gebruiker" trust_level_2_users: "Trust Level 2 leden" @@ -2169,6 +2349,7 @@ nl: unlock_trust_level: "Deblokkeer Trust Level" tl3_requirements: title: "Vereisten voor Trust Level 3" + table_title: "In de laatste %{time_period} dagen:" value_heading: "Waarde" requirement_heading: "Vereiste" visits: "Bezoeken" @@ -2229,7 +2410,15 @@ nl: confirm: 'Bevestiging' dropdown: "Uitklapbaar" site_text: + description: "Je kunt alle tekst of jouw forum aanpassen. Begin met zoeken hieronder:" + search: "Zoek voor tekst die je graag wilt bewerken." title: 'Tekst Inhoud' + edit: 'bewerk' + revert: "Maak wijzigingen ongedaan" + revert_confirm: "Weet je zeker dat je de veranderingen ongedaan wilt maken?" + go_back: "Terug naar zoeken" + recommended: "We bevelen je aan die tekst aan te passen naar je eigen ingeving. " + show_overriden: 'Bekijk alleen bewerkte instellingen' site_settings: show_overriden: 'Bekijk alleen bewerkte instellingen' title: 'Instellingen' @@ -2317,6 +2506,10 @@ nl: bad_count_warning: header: "LET OP!" text: "Er zijn vermiste toekennings-voorbeelden. Dit gebeurt als de badge query gebruikers- of bericht-ID's retourneert die niet bestaan. Dit kan onverwachte resultaten veroorzaken op een later tijdstip - kijk a.u.b. uw query goed na." + no_grant_count: "Geen badges om toe te wijzen." + grant_count: + one: "1 badge toe te wijzen." + other: "%{count} badges toe te wijzen." sample: "Voorbeeld:" grant: with: %{username} @@ -2424,6 +2617,10 @@ nl: mark_tracking: 'm, t Markeer topic als volgen' mark_watching: 'm, w Markeer topic als in de gaten houden' badges: + earned_n_times: + one: "Verdiende deze badge 1 keer" + other: "Verdiende deze badge %{count} keer" + more_with_badge: "Andere met deze badge" title: Badges allow_title: "kan als titel gebruikt worden" multiple_grant: "kan meerdere keren toegekend worden" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index 0995c1f992..2ac5a03f3b 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -244,7 +244,7 @@ zh_CN: has_pending_posts: other: "这个主题有 {{count}} 个帖子等待审核" confirm: "保存修改" - delete_prompt: "你确定要删除%{username}?这将删除他们的所有帖子并封禁这个邮箱和 IP 地址。" + delete_prompt: "你确定要删除%{username}吗?这将删除他们的所有帖子并封禁这个邮箱和 IP 地址。" approval: title: "帖子需要审核" description: "我们已经保存了你的帖子,不过帖子需要由管理员先审核才能显示。请耐心。" @@ -403,9 +403,7 @@ zh_CN: perm_denied_btn: "拒绝授权" perm_denied_expl: "你拒绝了通知提醒的权限。设置浏览器允许通知提醒。" disable: "禁用通知" - currently_enabled: "(目前已启用)" enable: "启用通知" - currently_disabled: "(目前已禁用)" each_browser_note: "注意:你必须在任何你使用的浏览器中更改这项设置。" dismiss_notifications: "标记所有为已读" dismiss_notifications_tooltip: "标记所有未读通知为已读" @@ -540,12 +538,18 @@ zh_CN: title: "用户资料徽章" website: "网站" email_settings: "电子邮箱" + email_previous_replies: + title: "包括邮件底下的以前的回复" + unless_emailed: "除非曾经发送过" + always: "总是" + never: "从不" email_digests: title: "当我不访问时,向我的邮箱发送最新信息:" daily: "每天" every_three_days: "每三天" weekly: "每周" every_two_weeks: "每两周" + email_in_reply_to: "在邮件中包含回复的摘要文本" email_direct: "当有人引用我、回复我的帖子,@提及你或邀请你至主题时发送一封邮件给我" email_private_messages: "当有人给发消息给我时发送一封邮件给我" email_always: "即使我在论坛中活跃时也发送电子邮件提醒给我" @@ -699,7 +703,7 @@ zh_CN: summary: enabled_description: "你正在查看这个主题的概括版本:由社群认定的最有意思的帖子。" description: "有 {{replyCount}} 个回复。" - description_time: "主题有 {{replyCount}} 个回复,大约要花 {{readingTime}} 分钟阅读。" + description_time: "有 {{replyCount}} 个回复,大约要花 {{readingTime}} 分钟阅读。" enable: '概括本主题' disable: '显示所有帖子' deleted_filter: @@ -977,8 +981,8 @@ zh_CN: top: "没有最佳主题。" search: "没有搜索结果。" educate: - new: '

近期的主题将在这里显示。

默认情况下,近两天创建的主题是近期主题,并会显示一个的标识。

你可以在你的设置中改变这一行为。

' - unread: '

这里是你的未读主题。

默认情况下,下述主题将被认为是未读的,并会显示未读数目:1 如果你:

  • 创建了该主题
  • 回复了该主题
  • 阅读该主题超过 4 分钟

或者你在主题底部的通知控制中选择了追踪或监视。

你可以改变你的用户设置

' + new: '

这里显示了对于你的近期主题。

默认情况下,下述主题将被认为是近期发表的,如果他们在这 2 天内才创建,还会显示一个近期标志。

访问你的用户设置修改。

' + unread: '

这里显示了你的未读主题。

默认情况下,下述主题将被认为是未读的,并且会在旁边显示未读的数量1。如果你:

  • 创建了该主题
  • 回复了该主题
  • 阅读该主题超过 4 分钟

或者你在主题底部的通知控制中选择了追踪或监视。

访问你的用户设置修改

' bottom: latest: "没有更多主题可看了。" hot: "没有更多热门主题可看了。" @@ -996,7 +1000,7 @@ zh_CN: change_notification_state: "您现在的提醒状态是" filter_to: "本主题中的 {{post_count}} 帖" create: '新主题' - create_long: '创建新主题' + create_long: '创作新主题' private_message: '发送消息' archive_message: help: '移动消息到存档' @@ -1322,17 +1326,14 @@ zh_CN: like: "撤销赞" vote: "撤销投票" people: - off_topic: "{{icons}} 标记为偏离主题" - spam: "{{icons}} 标记为垃圾" - spam_with_url: "{{icons}} 标记为垃圾信息" - inappropriate: "{{icons}} 标记此为不当内容" - notify_moderators: "{{icons}} 向版主报告它" - notify_moderators_with_url: "{{icons}} 通知了版主" - notify_user: "{{icons}} 发送了一个消息" - notify_user_with_url: "{{icons}} 发送了一个消息" - bookmark: "{{icons}} 对它做了书签" - like: "{{icons}} 赞了它" - vote: "{{icons}} 对它投票" + off_topic: "标记为偏离主题" + spam: "标记为垃圾信息" + inappropriate: "标记为不当内容" + notify_moderators: "通知版主" + notify_user: "发送消息" + bookmark: "书签收藏" + like: "赞了它" + vote: "已给本帖投票" by_you: off_topic: "你报告它偏离主题" spam: "你报告它为垃圾信息" @@ -1845,7 +1846,7 @@ zh_CN: is_disabled: "站点设置中禁用了恢复功能。" label: "恢复" title: "恢复该备份" - confirm: "你确定要重置该备份吗?" + confirm: "你确定要从该备份中恢复吗?" rollback: label: "回滚" title: "将数据库回滚到之前的工作状态" @@ -1952,9 +1953,6 @@ zh_CN: love: name: '赞' description: "赞按钮的颜色。" - wiki: - name: '维基编辑' - description: "维基帖子的背景颜色" email: title: "邮件" settings: "设置" @@ -1991,6 +1989,19 @@ zh_CN: subject: "主题" error: "错误" none: "没有找到进站邮件。" + modal: + title: "进站邮件详情" + error: "错误" + return_path: "Return-Path" + message_id: "Message-Id" + in_reply_to: "In-Reply-To" + references: "References" + date: "日期" + from: "来自" + to: "发至" + cc: "抄送" + subject: "主题" + body: "内容" filters: from_placeholder: "from@example.com" to_placeholder: "to@example.com" @@ -2066,6 +2077,7 @@ zh_CN: revoke_admin: "撤销管理员权限" grant_moderation: "授予版主权限" revoke_moderation: "撤销版主权限" + backup_operation: "备份操作" screened_emails: title: "被屏蔽的邮件地址" description: "当有人试图用以下邮件地址注册时,将受到阻止或其它系统操作。" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 443387ca58..a65ccd1097 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -187,7 +187,7 @@ de: - Verwende gebräuchliche, gut definierte Wörter, damit dein Thema *gefunden* werden kann. Wähle eine Kategorie, um es mit ähnlichen Themen zu gruppieren. - Für mehr Tips, [siehe unsere Community-Richtlinien](/guidelines). Dieses Panel wird nur bei deinen ersten %{education_posts_text} angezeigt. + Mehr Tipps findest du in [unseren Community-Richtlinien](/guidelines). Dieses Panel wird nur bei deinen ersten %{education_posts_text} angezeigt. new-reply: | Willkommen bei %{site_name} — **Danke für deinen Beitrag zum Thema!** @@ -761,7 +761,6 @@ de: suppress_reply_directly_above: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der beantwortete Beitrag direkt darüber angezeigt wird." suppress_reply_when_quoting: "Verstecke das erweiterbare „Antwort auf“-Feld in einem Beitrag, wenn der Beitrag den beantworteten Beitrag zitiert." max_reply_history: "Maximale Anzahl an Antworten beim Ausklappen von in-reply-to" - experimental_reply_expansion: "Verstecke dazwischenliegende Beiträge, wenn der beantwortete Beitrag erweitert wird (experimentell)." topics_per_period_in_top_summary: "Anzahl der Themen, die in der Top-Themübersicht angezeigt werden." topics_per_period_in_top_page: "Anzahl der Themen, die in der mit \"Mehr zeigen\" erweiterten Top-Themenübersicht angezeigt werden." redirect_users_to_top_page: "Verweise neue und länger abwesende Nutzer automatisch zur Top Übersichtsseite" @@ -1077,7 +1076,6 @@ de: moved_post: "%{display_username} hat deinen Beitrag nach %{link} verschoben." private_message: "%{display_username} hat Dir eine Nachricht geschickt: %{link}" invited_to_private_message: "%{display_username} hat dich zu einer Unterhaltung eingeladen: %{link}" - invited_to_topic: "%{display_username} hat dich in ein Thema eingeladen: %{link}" invitee_accepted: "%{display_username} hat deine Einladung angenommen." linked: "%{display_username} hat dich auf %{link} verlinkt" granted_badge: "Sie haben %{link} verdient" @@ -1174,8 +1172,6 @@ de: characters: "darf nur aus Zahlen und Buchstaben bestehen" unique: "muss eindeutig sein" blank: "muss angegeben werden" - must_begin_with_alphanumeric: "muss mit einem Buchstaben, einer Zahl oder einem Unterstrich beginnen" - must_end_with_alphanumeric: "muss mit einem Buchstaben, einer Zahl oder einem Unterstrich enden" must_not_contain_two_special_chars_in_seq: "muss keine Reihenfolge von 2 oder mehr Sonderzeichen (.-_) haben" must_not_end_with_confusing_suffix: "Darf nicht mit einem Suffix wie json, png, etc. enden." email: @@ -1184,6 +1180,10 @@ de: ip_address: blocked: "Von Deiner IP Adresse aus ist es nicht erlaub sich zu registrieren." max_new_accounts_per_registration_ip: "Weitere Registrierungen sind von deiner IP-Adresse aus nicht gestattet (limit erreicht). Kontaktiere einen Administrator mit dem Problem damit er dir helfen kann." + flags_reminder: + subject_template: + one: "Eine Markierung wartet auf Bearbeitung" + other: "%{count} Markierungen warten auf Bearbeitung" unsubscribe_mailer: subject_template: "Bestätige, dass du nicht länger E-Mail Updates von %{site_title} erhalten möchtest" text_body_template: | @@ -1235,87 +1235,10 @@ de: (Wenn der Link abgelaufen ist, wähle "Passwort vergessen" aus, wenn du dich mit deiner E-Mail Adresse einloggen möchtest.) test_mailer: subject_template: "[%{site_name}] Test der Mailzustellbarkeit" - text_body_template: | - Das ist eine zu Testzwecken versendete E-Mail von - - [**%{base_url}**][0] - - E-Mail-Zustellbarkeit ist komplex. Hier sind einige wichtige Dinge, die du überprüfen solltest: - - - Sei dir *sicher*, dass in den Einstellungen die `notification email` auf die korrekte Absender-Adresse gesetzt ist. **Der in der „From“ Adresse angegebene Domainname wird für die Überprüfung der versendeten E-Mails herangezogen.** - - - Du solltest wissen, wie du den Quelltext einer E-Mail in deinem E-Mail-Client betrachten kannst, um die E-Mail-Header auf Hinweise zu untersuchen. Bei Gmail findest du den Menüpunkt „Original anzeigen“ im Dropdown-Menü in der rechten, oberen Ecke jeder E-Mail. - - - **WICHTIG:** Hat dein Internetprovider Reverse-DNS-Einträge eingetragen, um den zum Versenden von E-Mails verwendeten IP-Adressen die passenden Domainnamen zuzuordnen? Du kannst [den PTR-Eintrag hier testen][2]. Wenn Dein Internetprovider nicht die passenden Reverse-DNS-Einträge eingetragen hat, ist es sehr unwahrscheinlich, dass deine E-Mails zugestellt werden. - - - Ist der [SPF-Eintrag][8] deiner Domain korrekt? Du kannst [den SPF-Eintrag hier testen][1]. Beachte, dass TXT der korrekte, offizielle Typ für SPF-Einträge ist. - - - Ist der [DKIM-Eintrag][3] deiner Domain korrekt? Das verbessert die Zustellbarkeit der E-Mails erheblich. Du kannst den [DKIM-Eintrag hier testen][7]. - - - Wenn du deinen eigenen Mailserver betreibst, überprüfe, dass die IP-Adressen deines Mailservers [nicht auf einer schwarzen Liste stehen][4]. Prüfe auch dass dieser definitiv einen vollständig qualifizierten Hostnamen in seinen HELO-Nachrichten verwendet, der per DNS aufgelöst werden kann. Falls das nicht der Fall ist, werden deine E-Mails von vielen E-Mail-Anbietern abgelehnt. - - (Der *einfache* Weg ist sich bei [Mandrill][md] oder [Mailgun][mg] oder [Mailjet][mj] anzumelden. Deren großzügiges, kostenloses Abo zum E-Mail-Versand ist für kleine Foren ausreichend. Du musst allerdings trotzdem die SPF und DKIM Einträge in deinem DNS einrichten!) - - Wir hoffen, dass der Mail-Zustelltest erfolgreich war! - - Viel Erfolg, - - deine Freunde von [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Neue Discourse Version, Update verfügbar" - text_body_template: | - Eine neue Version von [Discourse](http://www.discourse.org) ist verfügbar. - - Deine Version: %{installed_version} - Neue Version: **%{new_version}** - - Das kannst du jetzt tun: - - - Schaue dir an was neu ist [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Update direkt von deinem Browser aus über [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Besuche [meta.discourse.org](http://meta.discourse.org) für Neuigkeiten, Diskussionen, und Support für Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] Update verfügbar" - text_body_template: | - Eine neue Version von [Discourse](http://www.discourse.org) ist verfügbar. - - Deine Version: %{installed_version} - Neue Version: **%{new_version}** - - Das kannst du jetzt tun: - - - Schaue dir an was neu ist [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Update direkt von deinem Browser aus über [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Besuche [meta.discourse.org](http://meta.discourse.org) für Neuigkeiten, Diskussionen, und Support für Discourse. - - ### Release notes - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Folgende Markierungen wurden währen der letzten Stunden vorgenommen." - other: "Folgende Markierungen wurden währen der letzten %{count} Stunden vorgenommen." - please_review: "Bitte überprüfe sie." - post_number: "Beitrag" - how_to_disable: 'Die Benachrichtungen für markierte Beiträge kann deaktiviert oder in ihrer Häufigkeit geändert werden mittels des Wertes unter "notify about flags after".' - subject_template: - one: "Eine Markierung wartet auf Bearbeitung" - other: "%{count} Markierungen warten auf Bearbeitung" queued_posts_reminder: subject_template: one: "[%{site_name}] %{count} auf Freischaltung wartender Beitrag." @@ -1581,7 +1504,6 @@ de: eingeladen. Bitte besuche diesen Link um die Unterhaltung zu lesen: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} hat dich zum Thema '%{topic_title}' eingeladen" text_body_template: |2 %{username} hat dich zum Thema @@ -1686,7 +1608,6 @@ de: Wenn dieser Link nicht klickbar ist, kopiere ihn in die Adresszeile deines Web-Browsers. page_not_found: - title: "Die angeforderte Seite existiert nicht oder ist privat." popular_topics: "Beliebt" recent_topics: "Aktuell" see_more: "Mehr" diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index e22fb38320..4a666bfea9 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -30,6 +30,19 @@ es: emails: incoming: default_subject: "Email entrante desde %{email}" + errors: + empty_email_error: "Sucede cuando el texto en bruto del email que recibimos está en blanco." + no_message_id_error: "Sucede cuando el email no tiene Id del mensaje en el encabezado." + auto_generated_email_error: "Sucede cuando la 'prioridad' en el encabezado está establecida en: lista, basura, en masa o auto_respuesta, o cuando algún otro encabezado contiene: auto-enviado, auto-respondido o auto-generado." + no_body_detected_error: "Sucede cuando no podemos extraer el cuerpo del mensaje y no hay archivos adjuntos." + inactive_user_error: "Sucede cuando el emisor no está activo." + blocked_user_error: "Sucede cuando el emisor ha sido bloqueado." + bad_destination_address: "Sucede cuando ninguna de las direcciones de email en los campos Para/Cc/Bcc coincide con un email configurado como dirección de correo entrante." + strangers_not_allowed_error: "Sucede cuando un usuario intentó crear un nuevo tema en una categoría de la que no forma parte." + insufficient_trust_level_error: "Sucede cuando un usuario intentó crear un nuevo tema en una categoría para la que no tiene el nivel de confianza requerido." + reply_user_not_matching_error: "Sucede cuando una respuesta vino de una dirección de email diferente a la que fue enviada la notificación." + topic_not_found_error: "Sucede cuando entró una respuesta pero el tema relacionado ha sido eliminado." + topic_closed_error: "Sucede cuando entró una respuesta pero el tema relacionado ha sido cerrado. " errors: &errors format: '%{attribute} %{message}' messages: @@ -153,6 +166,7 @@ es: rss_description: latest: "Temas recientes" hot: "Temas candentes" + top: "Top temas" posts: "Últimos posts" too_late_to_edit: "Ese post fue publicado hace demasiado tiempo. No puede ser editado ni eliminado." excerpt_image: "imagen" @@ -295,6 +309,7 @@ es: self_parent: "La categoría primaria de una subcategoría no puede ser ella misma." depth: "No se puede anidar una subcategoría debajo de otra" email_in_already_exist: "La dirección de email entrante '%{email_in}' ya está en uso para la categoría '%{category_name}'." + invalid_email_in: "'%{email_in}' no es una dirección de email válida." cannot_delete: uncategorized: "Sin categoría no se puede eliminar" has_subcategories: "No se puede eliminar esta categoría porque tiene sub-categorías." @@ -687,7 +702,6 @@ es: min_search_term_length: "Extensión mínima de una búsqueda válida, en número de caracteres" search_tokenize_chinese_japanese_korean: "Forzar la búsqueda a tokenizar Chino/Japonés/Coreano incluso en sitios que no basados en esos idiomas" allow_uncategorized_topics: "Permitir la creación de temas sin categoría. AVISO: Si ya hay algún tema sin categoría, debes recategorizarlo antes de activar esta opción." - uncategorized_description: "La descripción de la categoría Sin categoría. Déjalo en blanco para no añadir descripción." allow_duplicate_topic_titles: "Permitir temas con títulos idénticos, duplicados." unique_posts_mins: "¿Cuántos minutos deben pasar antes de que un usuario pueda publicar el mismo contenido de nuevo?" educate_until_posts: "Cuando el usuario comienza a escribir su primer o primeros (n) posts, mostrar un pop-up con el panel de consejos para nuevos usuarios en el editor." @@ -865,6 +879,7 @@ es: external_system_avatars_enabled: "Usar un servicio externo para los avatares." external_system_avatars_url: "Dirección URL del servicio externo para los avatares. Sustituciones permitidas: {username} {first_letter} {color} {size}" default_opengraph_image_url: "URL de la imagen opengraph por defecto." + allow_all_attachments_for_group_messages: "Permitir todos los archivos adjuntos de email para los mensajes a grupos." enable_flash_video_onebox: "Habilitar el embebido de enlaces swf y flv (Adobe Flash) en formato Onebox. AVISO: podría introducir riesgos de seguridad." default_invitee_trust_level: "Nivel de confianza por defecto (0-4) para usuarios invitados." default_trust_level: "Nivel de confianza por defecto (0-4) para los nuevos usuarios. ¡AVISO! Cambiar esto puede resultar en riesgo por spam." @@ -1047,6 +1062,8 @@ es: default_email_direct: "Enviar un email cuando alguien cite/responda/mencione o invite al usuario por defecto." default_email_mailing_list_mode: "Enviar un email por cada nuevo post por defecto." default_email_always: "Enviar una notificación por email aunque el usuario esté activo por defecto." + default_email_previous_replies: "Incluir por defecto respuestas previas en los emails." + default_email_in_reply_to: "Incluir por defecto un extracto del post al que se ha respondido en los emails." default_other_new_topic_duration_minutes: "Condición por defecto para que un tema sea considerado nuevo" default_other_auto_track_topics_after_msecs: "Tiempo por defecto hasta que un tema sea seguido automáticamente." default_other_external_links_in_new_tab: "Abrir enlaces externos en una nueva pestaña por defecto." @@ -1076,6 +1093,8 @@ es: pop3_polling_username_is_empty: "Debes establecer un usuario de 'pop3 polling' antes de activar el polling POP3." pop3_polling_password_is_empty: "Debes establecer una contraseña de 'pop3 polling' antes de activar el polling POP3." pop3_polling_authentication_failed: "La autenticación POP3 falló. Por favor, verifica tus credenciales pop3." + reply_by_email_address_is_empty: "Debes establecer el campo 'reply by email address' antes de activar respuesta por email." + pop3_polling_disabled: "Debes habilitar primero el polling POP3 antes de activar respuesta por email." notification_types: group_mentioned: "%{group_name} ha sido mencionado en %{link}" mentioned: "%{display_username} te ha mencionado en %{link}" @@ -1087,7 +1106,7 @@ es: moved_post: "%{display_username} ha movido tu post a %{link}" private_message: "%{display_username} te ha enviado un mensaje: %{link}" invited_to_private_message: "%{display_username} te ha invitado a un hilo de mensajes: %{link}" - invited_to_topic: "%{display_username} te ha invitado a un tema: %{link}" + invited_to_topic: "%{display_username} te invitó a %{link}" invitee_accepted: "%{display_username} ha aceptado tu invitación" linked: "%{display_username} te enlazó en %{link}" granted_badge: "Obtuviste %{link}" @@ -1176,6 +1195,7 @@ es: reserved_username: "Ese nombre de usuario no está permitido." missing_user_field: "No has completado todos los campos de usuario" close_window: "Autenticación completa. Cierra esta ventana para continuar." + already_logged_in: "Ups, parece que estás intentando aceptar una invitación dirigida a otro usuariol. Si no eres %{current_user}, por favor cierra sesión e inténtalo de nuevo." user: no_accounts_associated: "No hay cuentas relacionadas." username: @@ -1184,8 +1204,8 @@ es: characters: "solo debe incluir números y letras" unique: "debe ser único" blank: "debe estar presente" - must_begin_with_alphanumeric: "debe empezar con una letra, número o guión bajo" - must_end_with_alphanumeric: "debe terminar con una letra, número o guión bajo" + must_begin_with_alphanumeric_or_underscore: "debe comenzar con una letra, un número o un guión bajo" + must_end_with_alphanumeric: "debe terminar con una letra o un número" must_not_contain_two_special_chars_in_seq: "no debe contener una secuencia de 2 o más caracteres especiales (.-_)" must_not_end_with_confusing_suffix: "no debe terminar con un sufijo que lleve a confusión como .json o .png etc." email: @@ -1194,6 +1214,13 @@ es: ip_address: blocked: "No se permiten nuevos registros desde tu dirección IP." max_new_accounts_per_registration_ip: "No se permiten nuevos registros desde tu dirección IP (alcanzado el límite máximo). Contacta un miembro del staff." + flags_reminder: + flags_were_submitted: + one: "Hay reportes enviados hace 1 hora. Por favor, revísalos." + other: "Hay reportes enviados hace %{count} horas. Por favor, revísalos." + subject_template: + one: "1 reporte esperando ser atendidos." + other: "%{count} reportes esperando ser atendidos." unsubscribe_mailer: subject_template: "Confirma que no quieres recibir más emails de %{site_title}" text_body_template: | @@ -1236,87 +1263,10 @@ es: (Si el enlace anterior ha caducado, utiliza "Olvidé mi contraseña" cuando vayas a iniciar sesión con tu dirección de email.) test_mailer: subject_template: "[%{site_name}] Prueba de envío de email" - text_body_template: | - Este es un correo electrónico de prueba de - - [**%{base_url}**][0] - - La entrega de correo electrónico es complicada. Aquí hay unas cuantas cosas importantes que deberías comprobar primero: - - - *Asegúrate* de ajustar la dirección `notification email` desde: correctamente en los ajustes de tu sitio. **El dominio especificado en la dirección "from" de los emails que envíes es el dominio contra el que se validará tu email**. - - - Entérate de como ver el código fuente del email desde tu cliente de correo, para que así puedas examinar las cabeceras para ver pistas importantes. En Gmail está la opción "mostrar original" en el menú de lista desplegable en la parte superior derecha de cada email. - - - **IMPORTANTE:** ¿Tu ISP tiene registros de DNS inversa para asociar los nombres de dominio y las direcciones IP desde donde envías los correos? [Comprueba tu registro PTR Inverso][2] aquí. Si tu ISP no introduce el puntero de registro DNS inverso adecuado, es muy improbable que cualquiera de tus correos pueda ser entregado. - - - ¿Es el [registro SPF][8] de tu dominio correcto? [Comprueba tu registro SPF][1] aquí. Ten en cuenta que TXT es el tipo de registro oficial correcto para SPF. - - - ¿Es el [registro DKIM][3] de tu dominio correcto? Esto puede mejorar significativamente la entregabilidad de correos. [Comprueba tu registro DKIM][7] aquí. - - - Si estás corriendo tu propio servidor de correo, asegúrate de que las IPs de tu servidor de correo [no están en ninguna lista negra de correos][4]. También verifica que definitivamente se está enviando un nombre de huésped "hostname" completamente cualificado que resuelva en DNS en su mensaje HELO. Si no es así, esto causará que tu correo sea denegado por muchos servicios de correo. - - (La forma *fácil* es crear una cuenta gratuíta en [Mandrill][md] o [Mailgun][mg] o [Mailjet][mj], que proveen generosamente planes de mailing gratuítos y serán adecuados para pequeñas comunidades. ¡De todas formas todavía tendrás que configurar los registros SPF y DKIM en tus DNS!) - - ¡Esperamos que recibas esta prueba de entregabilidad de correo electrónico correctamente! - - Buena suerte, - - Tus amigos de [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Nueva versión de Discourse, actualización disponible" - text_body_template: | - Está disponible una nueva versión de [Discourse](http://www.discourse.org). - - Tu versión: %{installed_version} - Nueva versión: **%{new_version}** - - Tal vez quieras: - - - Ver qué hay de nuevo en el [historial de cambios de GitHub](https://github.com/discourse/discourse/commits/master). - - - Actualizar desde tu navegador en [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Visitar [meta.discourse.org](http://meta.discourse.org) para ver noticias, debatir u obtener soporte de Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] actualización disponible" - text_body_template: | - Está disponible una nueva versión de [Discourse](http://www.discourse.org). - - Tu versión: %{installed_version} - Nueva versión: **%{new_version}** - - Tal vez quieras: - - - Ver qué hay de nuevo en el [historial de cambios de GitHub](https://github.com/discourse/discourse/commits/master). - - - Actualizar desde tu navegador en [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Visitar [meta.discourse.org](http://meta.discourse.org) para ver noticias, debatir u obtener soporte de Discourse. - - ### Notas de lanzamiento - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Estos reportes fueron enviados desde hace 1 hora." - other: "Estos reportes fueron enviados desde hace %{count} horas." - please_review: "Por favor, revísalos." - post_number: "post" - how_to_disable: 'Puedes desactivar o cambiar la frecuencia de este email de recordatorio mediante la opción "notify about flags after".' - subject_template: - one: "1 reporte esperando ser atendidos." - other: "%{count} reportes esperando ser atendidos." queued_posts_reminder: subject_template: one: "[%{site_name}] 1 post esperando ser revisado" @@ -1456,10 +1406,6 @@ es: subject_template: "[%{site_name}] Problema relacionado con el email -- No coincide el usuario de la respuesta" email_reject_no_account: subject_template: "[%{site_name}] Problema con el correo electrónico -- Cuenta Desconocida" - text_body_template: | - Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) se ha rechazado. - - No hay una cuenta de usuario asociada con esta dirección de email. Intenta enviarlo con otra dirección de email o contacta con algún miembro del Staff. email_reject_empty: subject_template: "[%{site_name}] Problema con el correo electrónico -- Sin Contenido" text_body_template: | @@ -1482,16 +1428,8 @@ es: Tu cuenta no tiene los privilegios para publicar nuevos temas en esa categoría. Si crees que esto es un error, contacta a un moderador o administrador. email_reject_reply_key: subject_template: "[%{site_name}] Problema con el correo electrónico -- Clave de Respuesta Desconocida" - text_body_template: | - Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) se ha rechazado. - - La clave de respuesta proporcionada no es válida o es desconocida, por lo que no sabemos a qué responde este email. Contacta con algún miembro del staff. email_reject_topic_not_found: subject_template: "[%{site_name}] Problema con el correo electrónico -- Tema no encontrado" - text_body_template: | - Lo sentimos, pero tu email para %{destination} (titulado %{former_title}) no funcionó. - - El tema al que estás respondiendo ya no existe, quizá debe haber sido eliminado. Si crees que esto es un error, contacta a un administrador. email_reject_topic_closed: subject_template: "[%{site_name}] Problema con el correo electrónico -- Tema cerrado" text_body_template: | @@ -1500,16 +1438,8 @@ es: El tema actualmente está cerrado y no acepta más respuestas. Si crees que esto es un error, contacta a un administrador. email_reject_auto_generated: subject_template: "[%{site_name}] Problema con el correo electrónico -- Respuesta Auto Generada" - text_body_template: | - Lo sentimos, pero tu mensaje de correo electrónico para %{destination} (titulado %{former_title}) no funcionó. - - Tu respuesta de correo fue marcada como "generada automáticamente" y no aceptamos esto. Si crees que se trata de un error contacta con un administrador. email_error_notification: subject_template: "[%{site_name}] Problema con el correo electrónico -- Error de autenticación POP" - text_body_template: | - Ha habido un error de autenticación mientras se ejecutaba el polling de los emails desde el servidor POP. - - Por favor, asegúrate de que se han configurado las credenciales POP correctamente en los [ajustes del sitio](%{base_url}/admin/site_settings/category/email). too_many_spam_flags: subject_template: "Cuenta nueva bloqueada" text_body_template: | @@ -1575,12 +1505,14 @@ es: subject_pm: "[MP]" user_notifications: previous_discussion: "Respuestas anteriores" + in_reply_to: "En respuesta a" unsubscribe: title: "Darse de baja" description: "¿No estás interesado en recibir estos emails? ¡No hay problema! Haz clic abajo para darte de baja de forma instantánea:" reply_by_email: "[Visita el tema](%{base_url}%{url}) o responde a este email para comentar" - visit_link_to_respond: "[Visita el tema](%{base_url}%{url}) para comentar" reply_by_email_pm: "[Visita el mensaje](%{base_url}%{url}) o responde a este email para comentar" + only_reply_by_email: "Responde a este email para comentar" + visit_link_to_respond: "[Visita el tema](%{base_url}%{url}) para comentar" visit_link_to_respond_pm: "[Visita el mensaje](%{base_url}%{url}) para comentar" posted_by: "Publicado por %{username} el %{post_date}" user_invited_to_private_message_pm: @@ -1614,7 +1546,7 @@ es: Por favor, visita este enlace para ver el mensaje: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} te ha invitado a un tema '%{topic_title}'" + subject_template: "[%{site_name}] %{username} te invitó a '%{topic_title}'" text_body_template: |2 %{username} te invitó al hilo @@ -1661,6 +1593,17 @@ es: --- %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + --- + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" text_body_template: | @@ -1794,7 +1737,7 @@ es: Si el enlace anterior no es clicable, prueba copiándolo y pegándolo en la barra de direcciones de tu navegador. page_not_found: - title: "La página que deseas ver no existe o es privada." + title: "¡Ups! Esa página no existe o es privada." popular_topics: "Populares" recent_topics: "Recientes" see_more: "Más" diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index cf9595c164..efcf5c357d 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -695,7 +695,6 @@ fi: min_private_message_title_length: "Viestin otsikon merkkien minimimäärä viestille" min_search_term_length: "Haun merkkien minimimäärä" allow_uncategorized_topics: "Salli ketjujen luominen valitsematta aluetta. VAROITUS: Sinun täytyy siirtää alueettomat ketjut jollekin alueelle, ennen tämän asetuksen poistamista käytöstä." - uncategorized_description: "Alueettomien ketjujen alueen kuvaus. Jätä tyhjäksi, jos et halua käyttää kuvausta." allow_duplicate_topic_titles: "Salli ketjun luominen identtisellä otsikolla." unique_posts_mins: "Kuinka monta minuuttia, kunnes käyttäjä voi luoda uudestaan saman sisältöisen viestin" educate_until_posts: "Näytä uuden käyttäjän ohje, kun käyttäjä alkaa kirjoittamaan ensimmäistä (n) viestiään viestikenttään." @@ -971,6 +970,7 @@ fi: display_name_on_email_from: "Näytä sähköpostien lähettäjinä käyttäjien koko nimet" unsubscribe_via_email: "Salli käyttäjän lakkauttaa sähköposti-ilmoitukset lähettämällä sähköpostiviesti, jonka otsikossa tai leipätekstissä esiintyy sana \"unsubscribe\"" unsubscribe_via_email_footer: "Liitä sähköpostiviestien alaosaan linkki, jonka avulla saaja voi lakkauttaa sähköposti-ilmoitukset" + delete_email_logs_after_days: "Poista sähköpostilokit (N) päivän jälkeen. Aseta 0 säilyttääksesi ikuisesti." pop3_polling_enabled: "Pollaa sähköpostivastaukset POP3:lla." pop3_polling_ssl: "Käytä SSL-salausta yhdistettäessä POP3-palvelimeen. (Suositellaan)" pop3_polling_period_mins: "Tiheys minuuteissa kuinka usein POP3 tililtä tarkastetaan uudet sähköpostit. HUOM: vaatii uudelleenkäynnistyksen." @@ -1025,7 +1025,7 @@ fi: show_time_gap_days: "Jos kahden viestin välissä on kulunut näin monta päivää, näytä aikaväli ketjussa." invites_per_page: "Oletuksena montako kutsua näytetään käyttäjäsivulla." short_progress_text_threshold: "Kuinka monen viestin jälkeen ketjun edistyspalkissa näytetään vain nykyisen viestin numero. Jos muutat palkin leveyttä, voit joutua muuttamaan tätä arvoa." - default_code_lang: "Oletusarvoinen ohjelmointikieli syntaksin korostukseen Github koodiblokeissa (lang-auto, ruby, python etc.)" + default_code_lang: "Oletusarvoinen ohjelmointikieli syntaksin korostukseen Github koodiblokeissa (lang-auto, ruby, python jne.)" warn_reviving_old_topic_age: "Kun käyttäjä alkaa kirjoittamaan vastausta ketjuun, jonka uusin viesti on tätä vanhempi päivissä, näytetään varoitus. Poista käytöstä asettamalla arvoksi 0." autohighlight_all_code: "Pakota koodin korostus kaikkiin esimuotoiltuihin tekstiblokkeihin, vaikka käyttäjä ei määrittelisi kieltä." highlighted_languages: "Syntaksin korostamisen säännöt. (Varoitus: liian monen kielen sisällyttäminen voi vaikuttaa suorituskykyyn) katso demo: https://highlightjs.org/static/demo/" @@ -1096,7 +1096,6 @@ fi: moved_post: "%{display_username} siirsi viestisi tänne %{link}" private_message: "%{display_username} lähetti sinulle viestin: %{link}" invited_to_private_message: "%{display_username} kutsui sinut viestiin: %{link}" - invited_to_topic: "%{display_username} kutsui sinut ketjuun: %{link}" invitee_accepted: "%{display_username} hyväksyi kutsusi" linked: "%{display_username} linkitti sinuun täällä %{link}" granted_badge: "Ansaitsit %{link}" @@ -1193,8 +1192,6 @@ fi: characters: "täytyy koostua vain numeroista, kirjaimista ja alaviivoista" unique: "täytyy olla uniikki" blank: "pakollinen kenttä" - must_begin_with_alphanumeric: "täytyy alkaa kirjaimella, numerolla tai alaviivalla" - must_end_with_alphanumeric: "täytyy loppua kirjaimeen, numeroon tai alaviivaan" must_not_contain_two_special_chars_in_seq: "ei saa sisältää peräkkäin kahta tai useampaa erikoismerkkiä (.-_)" must_not_end_with_confusing_suffix: "ei voi päättyä harhaanjohtavaan päätteeseen kuten .json tai .png jne." email: @@ -1203,8 +1200,19 @@ fi: ip_address: blocked: "Uusien tilien luonti tästä IP-osoitteesta ei ole sallittu." max_new_accounts_per_registration_ip: "Rekisteröitymisiä ei oteta vastaan IP-osoitteestasi (maksimimäärä saavutettu). Ota yhteyttä henkilökuntaan." + flags_reminder: + subject_template: + one: "Yksi liputus odottaa käsittelyä" + other: "%{count} liputusta odottaa käsittelyä" unsubscribe_mailer: subject_template: "Vahvista, ettet enää halua, että %{site_title} lähettää sinulle sähköpostimuistutuksia." + text_body_template: | + Joku (mahdollisesti sinä) pyysi, ettei sähköposti-ilmoituksia sivustolta %{site_domain_name} enää lähetettäisi tähän osoitteeseen. + Vahvista pyyntö klikkaamalla linkkiä: + + %{confirm_unsubscribe_link} + + Jos haluat jatkossakin saada sähköposti-ilmoituksia, voit jättää tämän viestin huomiotta. invite_mailer: subject_template: "%{invitee_name} kutsui sinut ketjuun '%{topic_title}' sivustolla %{site_domain_name}" text_body_template: | @@ -1248,90 +1256,10 @@ fi: (jos yllä oleva linkki on vanhentunut, valitse "unohdin salasanani" kirjautuessasi sisään sähköpostiosoitteellasi) test_mailer: subject_template: "[%{site_name}] Sähköpostin toimitettavuustesti" - text_body_template: | - Tämä on testisähköposti sivustolta - - [**%{base_url}**][0] - - Sähköpostin toimitus on monimutkaista. Tässä on muutama tärkeä asia, jotka kannattaa tarkistaa ensin: - - - *Varmista,* että `ilmoitusten sähköpostiosoitteen` from: kenttä on asetettu oikein sivuston asetuksissa. **Sähköpostin varmennus tapahtuu "from"-kentän sähköpostiosoitteen verkkotunnusta vastaan**. - - - Selvitä, miten sähköpostiohjelmassasi saa näkyville *sähköpostin raakadatan,* jotta voit tutkia viestin tunnistetiedot. Gmailissa tämä tapahtuu "näytä kokonaan" valinnalla viestin oikeassa yläkulmassa olevasta valikosta. - - - **TÄRKEÄÄ:** Onko palveluntarjoajasi syöttänyt reverse DNS kentän verkkotunnuksille ja IP osoitteille, joists lähetät sähköpostia? [Kokeile Reverse PTR tietuetta][2] täällä. Jos palveluntarjoajasi ei tarjoa kunnollista reverse DNS pointer tietuetta, on hyvin epätodennäköistä, että mikään sähköposti menee perille. - - - Onko verkkotunnuksesi [SPF record][8] oikein? [Kokeile SPF tietuetta][1] täällä. Huomaa, että TXT oikea tietuetyyppi SPF tietueelle. - - - Onko verkkotunnuksesi [DKIM tietue][3] oikein? Tämä vaikuttaa merkittävästi sähköpostin toimitettavuuteen. [Kokeile DKIM tietuetta][7] täällä. - - - Jos käytät omaa sähköpostipalvelinta, tarkista että palvelimen IP osoite [ei ole millään sähköpostin mustalla listalla][4]. - - - Tarkista myös, että se varmasti lähettää oikean muotoisen isäntänimen HELO viestissään, joka palauttaa oikean DNS tietueen. Jos näin ei ole, sähköposti hylätään monissa sähköpostipalveluissa. - - (Helpoin tapa on luoda ilmainen tili [Mandrilliin][md], [Mailguniin][mg] tai [Mailjetiin][mj], joide ilmaiset palvelut riittävät hyvin piemen palstan käyttöön. Muista silti asettaa SPF ja DKIM tietueet DNS:ään!) - - Toivottavasti tämä testisähköposti meni perille OK! - - Onnea matkaan, - - Ystäväsi [Discourselta](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Uusi Discourse versio, päivitys saatavilla" - text_body_template: |+ - Uusi versio [Discoursesta](http://www.discourse.org) on saatavilla - - Sinun versiosi: %{installed_version} - Uusin versio: **%{new_version}** - - Voit haluta: - - - Tarkastella mitä uutta on [GitHubin muutoslokissa](https://github.com/discourse/discourse/commits/master). - - - Asentaa päivityksen vierailemalla osoitteessa [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Vierailla osoitteessa [meta.discourse.org](http://meta.discourse.org) englanninkielisten uutisten, keskustelun ja tuen Discourselle vuoksi. - new_version_mailer_with_notes: subject_template: "[%{site_name}] päivitys saatavilla" - text_body_template: | - Uusi versio [Discoursesta](http://www.discourse.org) on saatavilla - - Sinun versiosi: %{installed_version} - Uusin versio: **%{new_version}** - - Voit haluta: - - - Tarkastella mitä uutta on [GitHubin muutoslokissa](https://github.com/discourse/discourse/commits/master). - - - Asentaa päivityksen vierailemalla osoitteessa [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Vierailla osoitteessa [meta.discourse.org](http://meta.discourse.org) englanninkielisten uutisten, keskustelun ja tuen Discourselle vuoksi. - - ### Julkaisutiedot - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Nämä liput annettiin yli tunti sitten." - other: "Nämä liput annettiin yli %{count} tuntia sitten." - please_review: "Ole hyvä ja tarkasta ne." - post_number: "viesti" - how_to_disable: 'Voit muuttaa tämän sähköpostimuistutuksen tiheyttä tai ottaa sen pois käytöstä muuttamalla "notify about flags after"-asetusta.' - subject_template: - one: "Yksi liputus odottaa käsittelyä" - other: "%{count} liputusta odottaa käsittelyä" queued_posts_reminder: subject_template: one: "[%{site_name}] 1 viesti odottaa hyväksyntää" @@ -1369,6 +1297,95 @@ fi: Kuitenkin, jos viesti piilotetaan toisen kerran, se pysyy piilotettuna, kunnes henkilökunta selvittää tilanteen – jonka jälkeen voi seurata muita seuraamuksia, mukaan lukien tilisi hyllyttäminen. Saadaksesi lisätietoja, lue [yhteisön säännöt](%{base_url}/guidelines). + usage_tips: + text_body_template: | + Tässä muutama nopea ohje, joiden avulla pääset alkuun: + + ## Lukeminen + + Lukeaksesi lisää, **jatka vain sivun vierittämistä alaspäin!** + + Kun uusia vastauksia tai ketjuja luodaan, ne ilmestyvät näkyviin automaattisesti - sivua ei tarvitse ladata uudelleen. + + ## Navigointi + + - Haku, käyttäjäprofiilisi ja palstan valikko avautuvat klikkaamalla **oikeassa yläkulmassa olevia painikkeita**. + + - Ketjun otsikkoa klikkaamalla pääset aina ketjun **uusimpaan lukemattomaan viestiin**. Hypätäksesi ketjun alkuun tai loppuun, klikkaa sen sijaan uusinta toimintaa tai viestien lukumäärää. + + + + - Kun olet lukemassa viestiketjua, klikkaa edistymispalkkia oikealla alhaalla tuodaksesi esiin navigaatiopainikkeet. Pääset hyppäämään viestin alkuun klikkaamalla ketjun otsikkoa. Näppäile ? tuodaksesi esiin listan näppäimistöoikoteistä. + + + + ## Vastaaminen + + - Vastataksesi **ketjuun yleisesti**, käytä ketjun lopussa. + + - Vastataksesi **tietylle henkilölle**, käytä heidän viestissään. + + - Vastataksesi **uudessa ketjussa**, käytä viestin oikealla puolella. Sekä vanha, että uusi ketju yhdistetään toisiinsa automaattisesti. + + Vastauksesi muotoilussa voit käyttää yksinkertaisia HTML-, BBCode- tai [Markdown](http://commonmark.org/help/)-komentoja: + + Tämä on **lihavoitu**. + Tämä on lihavoitu. + Tämä on [b]lihavoitu[/b]. + + Haluatko oppia enemmän Markdownista? [Käy kymmenen minuutin mittainen englanninkielinen tutoriaali!](http://commonmark.org/help/tutorial/) + + Lainataksesi toista käyttäjää, valitse teksti, jota haluat lainata ja klikkaa mitä hyvänsä Vastaa-painiketta. Toista lisätäksesi useampia lainauksia. + + + + Toinen käyttäjä saa ilmoituksen viestistäsi, jos mainitset hänet viestissäsi. Aloita kirjoittamaan `@` ja voit valita käyttäjänimen listasta. + + + + [Tavallisia Emojia](http://www.emoji.codes/) voit lisätä nimeltä kirjoittamalla `:` tai voit käyttä perinteisiä hymiöitä, kuten `:)` + + + + Luodaksesi esikatselun linkistä, liitä se omalle rivilleen: + + + + ## Toiminnot + + Jokaisen viestin alalaidassa on joukko painikkeita: + + + + Anna kirjoittajan tietää, että arvostit lukemaasi viestiä käyttämällä **tykkää** painiketta. Laitetaan hyvä kiertämään! + + Jos huomaat jossain viestissä ongelman, saata asia yksityisesti kirjoittajan tai [palstan henkilökunnan](%{base_url}/about) tietoon **liputa** painikkeella. Voit myös **jakaa** linkin viestiin tai **lisätä sen kirjanmerkkeihin** käyttäjäsivullesi myöhempää tarkastelua varten. + + ## Ilmoitukset + + Kun joku vastaa viestiisi, lainaa viestiäsi tai mainitsee `@käyttäjänimesi`, ilmestyy sivun oikeaan yläkulmaan numero. Sieltä pääset tarkastelemaan **ilmoituksiasi**. + + + + Eikä tarvitse murehtia siitä, että et huomaisi uusia vastauksia. Saat sähköpostin uusista ilmoituksista jos et ole paikalla, kun ne saapuvat. + + ## Omat asetukset + + - Oletuksena kaikki alle kaksi päivää vanhat keskustelut ovat uusia. + + - Kaikkia keskusteluita **joissa olet ollut mukana** (luomalla, vastaamalla tai lukemalla pitkään) seurataan automaattisesti. Näet siniset uusien ja lukemattomien lukumäärän ilmaisimet näiden ketjujen yhteydessä. + + + + Voit vaihtaa minkä tahansa viestiketjun ilmoitusasetuksia ketjun alalaidassa olevalla painikkeella. + + + + Voit myös asettaa ilmoitusasetuksen aluekohtaisesti, jos haluat seurata jokaista ketjua tietyllä keskustelualueella. Voit muuttaa näitä asetuksia [käyttäjäasetuksissasi](%{base_url}/my/preferences). + + ## Yhteisön luottamus + + Sitä mukaa kun osallistut palstan keskusteluihin, keräät yhteisön luottamusta ja uudelle käyttäjälle asetetut rajoitukset poistuvat automaattisesti. Korkeammilla [luottamustasoilla](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924) saat vielä enemmän valtuuksia, joiden avulla voit auttaa yhteisön ylläpitämisessä. welcome_user: subject_template: "Tervetuloa sivustolle %{site_name}!" text_body_template: | @@ -1453,12 +1470,26 @@ fi: csv_export_failed: subject_template: "Datan vienti epäonnistui" text_body_template: "Pahoittelemme, mutta datan vientisi epäonnistui. Tarkasta lokit tai ota yhteyttä henkilökuntaan." + email_reject_insufficient_trust_level: + subject_template: "[%{site_name}] Sähköpostiongelma -- Riittämätön luottamustaso" + text_body_template: | + Pahoittelut, sähköpostiviestiäsi tänne: %{destination} (otsikolla %{former_title}) ei voitu toimittaa. + + Tilisi luottamustaso ei ole riittävä, jotta saisit lähettää uusia ketjuja tähän sähköpostiosoitteeseen. Jos uskot, että tämä johtuu virheestä, ota yhteyttä henkilökuntaan. + email_reject_inactive_user: + subject_template: "[%{site_name}] Sähköpostiongelma -- Aktivoimaton käyttäjä" + text_body_template: | + Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. + + Käyttäjätiliä tällä sähköpostiosoitteella ei ole aktivoitu. Aktivoi käyttäjätili ennen sähköpostien lähettämistä. email_reject_reply_user_not_matching: + subject_template: "[%{site_name}] Sähköpostiongelma -- Käyttäjä ei täsmää" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. Viestisi ei saapunut siitä sähköpostiosoitteesta josta odotimme, joten emme voineet olla varmoja lähettäjästä. Kokeile lähettää viestisi toisesta sähköpostiosoitteesta tai ota yhteyttä henkilökuntaan. email_reject_no_message_id: + subject_template: "[%{site_name}] Sähköpostiongelma -- Ei viestin Id:tä" text_body_template: | Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. @@ -1498,6 +1529,20 @@ fi: Mahdollisia syitä ovat muuan muassa: ei-tuettu muotoilu, liian suuri viesti, liian pieni viesti. Ole hyvä ja yritä uudelleen; voit myös lähettää viestisi sivuston kautta, jos tämä ongelma ei vaikuta poistuvan. email_reject_invalid_post_specified: subject_template: "[%{site_name}] Sähköpostiongelma -- Lähetysvirhe" + text_body_template: | + Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. + + Syy: + + %{post_error} + + Jos voit korjata ongelman, yritä uudelleen. + email_reject_invalid_post_action: + subject_template: "[%{site_name}] Sähköpostiongelma -- Kielletty viestitoiminto" + text_body_template: | + Pahoittelemme, mutta sähköpostin lähettäminen tänne %{destination} (otsikolla %{former_title}) ei onnistunut. + + Toimintoa ei tunnistettu. Yritä uudelleen tai lähetä viesti nettisivun kautta, jos ongelma jatkuu. email_reject_reply_key: subject_template: "[%{site_name}] Sähköpostiongelma -- Tuntematon vastausavain" text_body_template: | @@ -1525,15 +1570,17 @@ fi: email_reject_auto_generated: subject_template: "[%{site_name}] Sähköpostiongelma -- Automaattivastaus" text_body_template: | - Pahoittelut, sähköpostiviestiäsi tänne: %{destination} (otsikolla %{former_title}) ei voitu toimittaa. + Pahoittelut, sähköpostiviestisi lähetys kohteeseen %{destination} (titled %{former_title}) ei onnistunut. - Sähköpostiasi epäillään automaattisesti generoiduksi, jota emme hyväksy. Jos uskot, että on tapahtunut virhe, ota yhteys palstan henkilökuntaan. + Järjestelmä havaitsi viestisi olevan tietokoneen automaattisesti luoma, eikä sitä voitu siksi hyväksyä. Jos uskot tämän olevan virhe, ota yhteyttä henkilökuntaan. email_error_notification: subject_template: "[%{site_name}] Sähköpostiongelma -- POP-autentikoinnin virhe" text_body_template: | - Sähköpostin pollauksessa POP-palvelimelta tapahtui autentikointivirhe. + Sähköpostin pollauksessa POP-serveriltä tapahtui autentikointivirhe. - Varmista, että POP tunnukset on asetettu oikein [sivuston asetuksissa](%{base_url}/admin/site_settings/category/email). + Varmista, että olet konfiguroinut POP-tunnukset oikein [sivuston asetuksissa](%{base_url}/admin/site_settings/category/email). + + Jos POP-sähköpostitilille on nettikäyttöliittymä, voit joutua kirjautumaan sinne ja tarkistamaan asetukset. too_many_spam_flags: subject_template: "Uusi tili on estetty" text_body_template: | @@ -1591,6 +1638,8 @@ fi: download_remote_images_disabled: subject_template: "Linkattujen kuvien lataaminen on otettu pois käytöstä" text_body_template: "Asetus `download_remote_images_to_local` on otettu pois käytöstä, koska vapaan tilan rajoitus `download_remote_images_threshold` saavutettiin." + unsubscribe_link: | + Jos et enää halua ilmoituksia tästä ketjusta, [klikkaa tätä](%{unsubscribe_url}). Jos et halua sähköposti-ilmoituksia, muuta [tilisi asetuksia](%{user_preferences_url}). unsubscribe_via_email_link: | tai, [klikkaa tästä](mailto:reply@%{hostname}?subject=unsubscribe), jos et halua näitä viestejä sähköpostiisi. subject_re: "VS:" @@ -1601,7 +1650,9 @@ fi: title: "Peru tilaus" description: "Etkö halua vastaanottaa näitä sähköposteja? Ei hätää! Klikkaa alta peruaksesi tilauksen välittömästi:" reply_by_email: "Vastaa [vierailemalla ketjussa](%{base_url}%{url}) tai vastaamalla tähän sähköpostiin." - visit_link_to_respond: "Vastaa [vierailemalla ketjussa](%{base_url}%{url})." + reply_by_email_pm: "Vastaa [vierailemalla ketjussa](%{base_url}%{url}) tai vastaamalla tähän sähköpostiin." + visit_link_to_respond: "Vastaa [vierailemalla ketjussa](%{base_url}%{url})" + visit_link_to_respond_pm: "Vastaa [vierailemalla ketjussa](%{base_url}%{url})." posted_by: "Käyttäjältä %{username} %{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} kutsui sinut viestiin '%{topic_title}'" @@ -1634,7 +1685,6 @@ fi: Klikkaa tätä linkkiä nähdäksesi viestin: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} kutsui sinut viestiin '%{topic_title}'" text_body_template: |2 %{username} kutsui sinut keskusteluun @@ -1814,7 +1864,6 @@ fi: Jos linkkiä ei voi klikata, yritä kopioida ja liittää se selaimen osoiteriville. page_not_found: - title: "Pyytämääsi sivua ei ole tai se on yksityinen." popular_topics: "Suosittuja" recent_topics: "Tuoreimpia" see_more: "Lisää" diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index 4c6867a490..8adea1b983 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -16,7 +16,7 @@ fr: short_no_year: "%B %-d" date_only: "%B %-d, %Y" date: - month_names: [null, Janvier, Février, Mars, Avril, Mai, Juin, Juillet, Aout, Septembre, Octobre, Novembre, Decembre] + month_names: [null, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] <<: *datetime_formats title: "Discourse" topics: "Sujets" @@ -30,6 +30,18 @@ fr: emails: incoming: default_subject: "Courriel arrivant de %{email}" + errors: + empty_email_error: "Arrive quand le courriel reçu était vide." + no_message_id_error: "Arrive quand le courrier n'a pas d'en-tête \"Message-Id\"." + no_body_detected_error: "Arrive quand il est impossible d'extraire le corps du message et qu'il n'y a pas de pièces-jointes." + inactive_user_error: "Arrive quand l'expéditeur n'est pas actif." + blocked_user_error: "Arrive quand l'expéditeur a été bloqué." + bad_destination_address: "Arrive quand aucune des adresses de courriel dans les champs To/Cc/Bcc ne correspondent à une adresse de courriel entrante configurée." + strangers_not_allowed_error: "Arrive quand un utilisateur a essayé de créer un nouveau sujet dans une catégorie dans laquelle il n'est pas membre." + insufficient_trust_level_error: "Arrive quand un utilisateur a essayé de créer un nouveau sujet dans une catégorie dans laquelle il n'a pas un niveau de confiance suffisant." + reply_user_not_matching_error: "Arrive quand une réponse est venue d'une adresse de courriel différente de celle où a été envoyée la notification." + topic_not_found_error: "Arrive quand quelqu'un répond à un sujet qui a été supprimé." + topic_closed_error: "Arrive quand quelqu'un répond mais le sujet lié a été fermé." errors: &errors format: '%{attribute} %{message}' messages: @@ -80,7 +92,7 @@ fr: min_username_length_exists: "Il n'est pas possible de définir une longeur minimale de pseudo qui soit plus court qu'un pseudo qui existe déjà." min_username_length_range: "Il n'est pas possible de définir un minimum plus grand qu'un maximum." max_username_length_exists: "Il n'est pas possible de définir une longeur maximale de pseudo qui soit plus court qu'un pseudo qui existe déjà." - max_username_length_range: "Vous ne pouvez pas mettre le maximum sous le minimum" + max_username_length_range: "Il n'est pas possible de définir un maximum plus petit que le minimum." default_categories_already_selected: "Vous ne pouvez pas séléctionner une catégorie qui est utilisée dans une autre liste." s3_upload_bucket_is_required: "Vous ne pouvez pas activer l'upload sur S3 avant d'avoir renseigné le 's3_upload_bucket'." bulk_invite: @@ -111,26 +123,26 @@ fr: replies: one: "1 réponse" other: "%{count} réponses" - no_mentions_allowed: "Désolé, vous ne pouvez pas mentionner d'utilisateur." + no_mentions_allowed: "Désolé, vous ne pouvez pas mentionner d'autres utilisateurs." too_many_mentions: - one: "Désolé, vous ne pouvez mentionner que 1 utilisateur." - other: "Désolé, vous ne pouvez mentionner que %{count} utilisateurs dans un sujet." - no_mentions_allowed_newuser: "Désolé, les nouveaux utilisateurs ne peuvent pas mentionner d'utilisateur." + one: "Désolé, vous ne pouvez mentionner qu'un utilisateur dans un message." + other: "Désolé, vous ne pouvez mentionner que %{count} utilisateurs dans un message." + no_mentions_allowed_newuser: "Désolé, les nouveaux utilisateurs ne peuvent pas mentionner d'autres utilisateurs." too_many_mentions_newuser: - one: "Désolé, les nouveaux utilisateurs ne peuvent mentionner que 1 utilisateur dans un message." + one: "Désolé, les nouveaux utilisateurs ne peuvent mentionner qu'un utilisateur dans un message." other: "Désolé, les nouveaux utilisateurs ne peuvent mentionner que %{count} utilisateurs dans un message." no_images_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas ajouter d'image dans les messages." too_many_images: - one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que 1 image." - other: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} images." + one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'une image dans un message." + other: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} images dans un message." no_attachments_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas ajouter de fichiers dans leurs messages." too_many_attachments: - one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que 1 fichier dans leurs messages." + one: "Désolé, les nouveaux utilisateurs ne peuvent ajouter qu'un fichier dans leurs messages." other: "Désolé, les nouveaux utilisateurs ne peuvent ajouter que %{count} fichiers dans leurs messages." - no_links_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas insérer de liens." + no_links_allowed: "Désolé, les nouveaux utilisateurs ne peuvent pas insérer de liens dans leurs messages." too_many_links: - one: "Désolé, les nouveaux utilisateurs ne peuvent insérer qu'un seul lien." - other: "Désolé, les nouveaux utilisateurs ne peuvent insérer que %{count} liens." + one: "Désolé, les nouveaux utilisateurs ne peuvent insérer qu'un seul lien par message." + other: "Désolé, les nouveaux utilisateurs ne peuvent insérer que %{count} liens par message." spamming_host: "Désolé, vous ne pouvez pas insérer de lien vers ce domaine." user_is_suspended: "Les utilisateurs suspendus ne sont pas autorisés à poster de messages." topic_not_found: "Une erreur est survenue. Peut-être que ce sujet a été fermé ou supprimé pendant que vous le regardiez?" @@ -153,6 +165,7 @@ fr: rss_description: latest: "Sujets récents" hot: "Sujets populaires" + top: "Meilleurs sujets" posts: "Messages récents" too_late_to_edit: "Ce message a été créé il y a trop longtemps. Il ne peut plus être modifié ou supprimé." excerpt_image: "image" @@ -163,7 +176,7 @@ fr: can_not_modify_automatic: "Vous ne pouvez pas modifier un groupe automatique" member_already_exist: "'%{username}' est déjà membre de ce groupe." invalid_domain: "'%{domain}' n'est pas un domaine valide." - invalid_incoming_email: "'%{incoming_email}' n'est pas une adresse e-mail valide." + invalid_incoming_email: "'%{incoming_email}' n'est pas une adresse de courriel valide." default_names: everyone: "tous" admins: "administrateurs" @@ -299,6 +312,7 @@ fr: self_parent: "Le parent d'une sous-catégorie ne peut pas être elle-même" depth: "Vous ne pouvez pas imbriquer une sous-catégorie sous une autre" email_in_already_exist: "L'adresse courriel entrante '%{email_in}' est déjà utilisée pour la catégorie '%{category_name}'." + invalid_email_in: "'%{email_in}' n'est pas une adresse de courriel valide." cannot_delete: uncategorized: "Vous ne pouvez pas supprimer Sans Catégorie" has_subcategories: "Vous ne pouvez pas supprimer cette catégorie car elle a des sous-catégories." @@ -450,8 +464,8 @@ fr: description: 'Ce message contient du contenu qu''une personne raisonnable jugerait offensant, abusif ou en violation de la charte de notre communauté.' long_form: 'signalé comme inapproprié' notify_user: - title: 'Envoyer à @{{username}} un message' - description: 'Je veux parler directement et de manière privée à cette personne à propos de son message.' + title: 'Envoyer un message à @{{username}} ' + description: 'Je veux parler à cette personne directement et de manière privée à propos de son message.' long_form: 'utilisateur contacté' email_title: 'Votre message sur "%{title}"' email_body: "%{link}\n\n%{message}" @@ -484,7 +498,7 @@ fr: long_form: 'signalé comme inapproprié' notify_moderators: title: "Autre chose" - description: 'Ce message requiert l''attention d''un responsable d''après la charte de la communauté, conditions générales de service, ou pour une autre raison indéterminée.' + description: 'Ce message requiert l''attention d''un responsable d''après la charte de la communauté, les conditions générales de service, ou pour une autre raison indéterminée.' long_form: 'signalé pour modération' email_title: 'Ce sujet "%{title}" requière l''attention d''un modérateur' email_body: "%{link}\n\n%{message}" @@ -733,6 +747,7 @@ fr: summary_likes_required: "Nombre de J'aime minimum dans un sujet avant que le 'Résumé du sujet' soit activé" summary_percent_filter: "Quand un utilisateur clique sur 'Résumé du sujet', montrer le top % des messages" summary_max_results: "Nombre maximum de messages retournés par 'Résumé de ce sujet'" + enable_private_messages: "Autorise les utilisateurs de niveau de confiance 1 à créer des messages et à répondre (configurable via le niveau de confiance minimum pour envoyer des messages)." enable_long_polling: "Utiliser les requêtes longues pour le flux de notifications." long_polling_base_url: "Racine de l'url utilisée pour les requêtes longues (dans le cas de l'utilisation d'un CDN pour fournir du contenu dynamique, pensez à le configurer en mode \"origin pull\") par exemple: http://origin.site.com" long_polling_interval: "Délai d'attente du serveur avant de répondre aux clients lorsqu'il n'y a pas de données à envoyer\n(réservé aux utilisateurs connectés)" @@ -869,6 +884,7 @@ fr: external_system_avatars_enabled: "Utilisez un service d'avatars externe." external_system_avatars_url: "URL du système de service d'avatars externe. Substitutions permises: {username} {first_letter} {color} {size}" default_opengraph_image_url: "URL de l'image par défaut pour les balises Open Graph." + allow_all_attachments_for_group_messages: "Autorise toutes les pièces-jointes pour les messages de groupes." enable_flash_video_onebox: "Activer l'utilisation de swf et flv (Adobe Flash) dans les boites imbriquées. ATTENTION : cela pourrait introduire un risque de sécurité." default_invitee_trust_level: "Niveau de confiance par défaut (0-4) pour les invités." default_trust_level: "Niveau de confiance par défaut (entre 0 et 4) pour tous les nouveaux utilisateurs. ATTENTION ! Changer ce paramètre peut vous exposer à des spams." @@ -904,8 +920,10 @@ fr: newuser_max_mentions_per_post: "Nombre maximum de @pseudo qu'un nouvel utilisateur peut mentionner dans un message." newuser_max_replies_per_topic: "Nombre maximum de réponses qu'un nouvel utilisateur peut faire dans une même discussion avant que quelqu'un lui réponde." max_mentions_per_post: "Nombre maximal de @pseudo que tout le monde peut mentionner dans un message." + max_users_notified_per_group_mention: "Nombre maximum d'utilisateurs qui peuvent recevoir une notification si un groupe est mentionné (si le seuil est atteint aucune notification n'est envoyée)" create_thumbnails: "Créer un aperçu pour les images imbriquées qui sont trop large pour le message." email_time_window_mins: "Attendre (n) minutes avant l'envoi des courriels de notification, afin de laisser une chance aux utilisateurs de modifier ou finaliser leurs messages." + private_email_time_window_seconds: "Attendre (n) secondes avant d'envoyer les notifications par courriel, afin de laisser aux utilisateurs l'opportunité de modifier leurs messages." email_posts_context: "Combien de réponses précédentes doit-on inclure dans les courriels de notifications pour situer le contexte." flush_timings_secs: "A quelle fréquence les données de timing doivent être vider, en secondes." title_max_word_length: "Le nombre maximum de caractères dans le titre d'un sujet." @@ -940,6 +958,8 @@ fr: newuser_spam_host_threshold: "Limite du nombre de liens vers un même host compris dans `newuser_spam_host_posts` qu'un nouvel utilisateur peut insérer dans un message avant d'être considérer comme un spam." white_listed_spam_host_domains: "Une liste des domaines exclus des hôtes testés comme spam. Les nouveaux utilisateurs ne seront jamais restreint dans la création de message contenant des liens vers ses domaines. " staff_like_weight: "Quel poids supplémentaire donner aux J'aime de l'équipe." + topic_view_duration_hours: "Compte la vue d'un sujet une seule fois par IP ou par utilisateur toutes les N heures" + user_profile_view_duration_hours: "Compte la vue d'un profil d'utilisateur une seule fois par IP ou par utilisateur qui visite toutes les N heures" levenshtein_distance_spammer_emails: "Lorsque des courriels correspondent à des spammer, la différence du nombre de caractère permettra toujours une correspondance floue." max_new_accounts_per_registration_ip: "S'il y a déjà (n) Niveau de confiance 0 comptes à partir de cette adresse IP ( et aucun n'est un membre du personnel ou au NC2 ou ultérieure), ne plus accepter de nouvelles inscriptions de cette IP." min_ban_entries_for_roll_up: "En cliquant sur le bouton Consolider, une liste d'au moins (N) adresses interdites sera remplacée par une plage de sous réseau." @@ -957,6 +977,10 @@ fr: disable_emails: "Désactiver l'envoi de les courriels depuis Discourse." strip_images_from_short_emails: "Retirer les images des courriels dont la taille est inférieur à 2800 Octets" short_email_length: "Taille des courriels courts en Octets" + display_name_on_email_from: "Affiche les noms complets dans le champ From du courriel." + unsubscribe_via_email: "Autorise les utilisateurs à se désinscrire des courriels en envoyant un courriel avec \"se désinscrire\" dans le sujet ou le corps du message." + unsubscribe_via_email_footer: "Ajoute un lien pour se désinscrire dans le pied des courriels envoyés" + delete_email_logs_after_days: "Efface les journaux de messagerie après (N) jours. 0 pour conserver indéfiniment." pop3_polling_enabled: "Utiliser POP3 pour les réponses via courriel." pop3_polling_ssl: "Utiliser SSL pour les connections au serveur POP3. (Recommandé)" pop3_polling_period_mins: "La période en minute entre chaque vérification du compte POP3 des courriels.\nNote: nécessite un redémarrage de la machine." @@ -983,7 +1007,7 @@ fr: automatically_download_gravatars: "Télécharger les gravatars pour les utilisateurs lors de la création de compte ou de la modification de courriel." digest_topics: "Nombre maximum de sujets à afficher dans le courriel de résumé." digest_min_excerpt_length: "Taille minimum du résumé des messages dans les courriels, en caractères." - delete_digest_email_after_days: "Ne pas envoyer de résumés courriel aux utilisateurs qui n'ont pas visité le site depuis (n) jours." + delete_digest_email_after_days: "Ne pas envoyer de résumés courriel aux utilisateurs qui n'ont pas visité le site depuis plus de (n) jours." disable_digest_emails: "Désactiver les résumés par courriels pour tous les utilisateurs." detect_custom_avatars: "Vérifier ou non si les utilisateurs ont envoyé une photo de profil personnalisée." max_daily_gravatar_crawls: "Nombre maximum de fois que Discourse vérifiera Gravatar pour des avatars personnalisés en une journée." @@ -993,14 +1017,19 @@ fr: allow_anonymous_posting: "Permettre aux utilisateurs de passer en mode anonyme" anonymous_posting_min_trust_level: "Le niveau de confiance minimum pour passer en mode anonyme." anonymous_account_duration_minutes: "Pour protéger l'anonymat, créer un nouveau compte anonyme tous les N minutes pour chaque utilisateur. Exemple: si 600 est choisi, dès 600 minutes après le dernier message ET que l'utilisateur passe en mode anonyme, un nouveau compte anonyme lui sera crée." + hide_user_profiles_from_public: "Désactive les cartes utilisateurs, les profils utilisateurs et les répertoires utilisateurs pour les utilisateurs anonymes." allow_profile_backgrounds: "Autoriser les utilisateurs à envoyer des arrières-plans de profil." + sequential_replies_threshold: "Nombre de messages successifs qu'un utilisateur peut poster dans un sujet avant d'être averti d'avoir posté un nombre excessif de réponses qui se suivent." enable_mobile_theme: "Les appareils mobiles utilisent un thème adapté aux mobiles, avec la possibilité de passer à la totalité du site. Désactivez cette option si vous voulez utiliser une feuille de style personnalisée qui répond à tous les types de client." dominating_topic_minimum_percent: "Quel est le pourcentage de messages un utilisateur doit poster dans un sujet avant d'être rappelé à l'ordre pour laissé la communauté répondre." + disable_avatar_education_message: "Désactiver le message incitant à changer l'avatar." daily_performance_report: "Analyser les logs de NGINX quotidiennement et poster un sujet Responsables Uniquement avec les détails" suppress_uncategorized_badge: "Ne pas afficher le badge pour les sujets non catégorisés dans les listes des sujets." permalink_normalizations: "Appliquer l'expression régulière suivante avant de faire correspondre les permaliens, par exemple /(\\/topic.*)\\?.*/\\1 supprimera les query strings des routes des sujets. Le format est regex+string, utilisez \\1 etc. pour accéder aux captures" global_notice: "Affiche un bandeau global URGENT pour tout les utilisateurs du site, laissez vide pour le cacher (HTML autorisé)." disable_edit_notifications: "Désactiver les notifications de modifications par l'utilisateur système lorsque l'option 'download_remote_images_to_local' est activée." + automatically_unpin_topics: "Désépingler automatiquement le sujet lorsque l'utilisateur atteint la fin." + read_time_word_count: "Nombre de mots par minute servant de base de calcul à l'estimation du temps de lecture." full_name_required: "Le nom complet est requis dans le profil utilisateur." enable_names: "Autoriser l'affichage des noms complets des utilisateurs dans leur profil, sur leur carte d'utilisateur et dans les courriels. Décocher pour cacher les noms complets partout." display_name_on_posts: "Afficher le nom complet de l'utilisateur dans ses messages en plus de son @pseudo." @@ -1024,6 +1053,7 @@ fr: enable_cdn_js_debugging: "Autoriser /logs à afficher correctement les erreurs en ajoutant des permissions de crossorigin sur toutes les inclusions de js." show_create_topics_notice: "Si le site contient moins de 5 sujets publics, afficher un message pour demander aux administrateurs de créer d'autres sujets." delete_drafts_older_than_n_days: Supprimer les brouillons plus vieux que (n) jours. + vacuum_db_days: "Exécuter VACUUM ANALYZE pour récupérer de l'espace dans la base de données après une migration (mettre à 0 pour désactiver)" prevent_anons_from_downloading_files: "Refuser le téléchargement de pièces jointes aux utilisateurs anonymes. ATTENTION: cela empêchera de fonctionner les ressources envoyées en pièce jointe qui ne sont pas des images." slug_generation_method: "Choisissez une méthode de génération d'identifiant. \"encodé\" générera des chaines de caractères encodées avec des pourcentages. \"aucune\" désactivera complètement les identifiants." enable_emoji: "Activer les emojis" @@ -1037,11 +1067,15 @@ fr: default_email_direct: "Envoyer un courriel quand quelqu'un cite/répond à/mentionne ou invite un utilisateur." default_email_mailing_list_mode: "Envoyer un courriel pour chaque nouveau message." default_email_always: "Envoyer une notification courriel même quand l'utilisateur est actif." + default_email_previous_replies: "Inclure par défaut les réponses précédentes dans les courriels." + default_other_new_topic_duration_minutes: "Paramètre global de temps pendant lequel un sujet est considéré comme nouveau." + default_other_auto_track_topics_after_msecs: "Paramètre global fixant le temps par défaut au bout duquel un sujet est suivi automatiquement." default_other_external_links_in_new_tab: "Par défaut, ouvrir tous les liens externes dans un nouvel onglet" default_other_enable_quoting: "Par défaut, proposer la citation du texte surligné." default_other_dynamic_favicon: "Par défaut, faire apparaître le nombre de sujets récemment créés ou mis à jour sur l'icône navigateur." default_other_disable_jump_reply: "Par défaut, ne pas se déplacer au nouveau message après avoir répondu." default_other_edit_history_public: "Par défaut, rendre publiques les révisions de message." + default_topics_automatic_unpin: "Par défaut, désépingler automatiquement le sujet lorsque l'utilisateur atteint la fin." default_categories_watching: "Liste de catégories surveillées par défaut." default_categories_tracking: "Liste de catégories suivies par défaut." default_categories_muted: "Liste de catégories silencées par défaut." @@ -1059,6 +1093,9 @@ fr: invalid_string_min: "Doit être d'au moins %{count} caractères." invalid_string_max: "Ne doit pas être supérieur à %{max} caractères." invalid_reply_by_email_address: "La valeur doit contenir '%{reply_key}' et être différente de la notification email." + pop3_polling_host_is_empty: "Vous devez indiquer le \"nom d'un serveur pop3\" avant d'activer le relevé via POP3." + pop3_polling_username_is_empty: "Vous devez indiquer le \"login utilisateur pop3\" avant d'activer le relevé via POP3." + pop3_polling_password_is_empty: "Vous devez indiquer le \"mot de passe pop3\" avant d'activer le relevé via POP3." pop3_polling_authentication_failed: "Echec d'authentication POP3. Veuillez contrôler vos détails POP3." notification_types: group_mentioned: "%{group_name} a été mentionné dans %{link}" @@ -1071,7 +1108,7 @@ fr: moved_post: "%{display_username} a déplacé votre message vers %{link}" private_message: "%{display_username} vous a envoyé un message : %{link}" invited_to_private_message: "%{display_username} vous a invité dans une discussion: %{link}" - invited_to_topic: "%{display_username} vous a invité dans un sujet: %{link}" + invited_to_topic: "%{display_username} vous a invité à %{link}" invitee_accepted: "%{display_username} a accepté votre invitation" linked: "%{display_username} a mentionné l'un de vos messages : %{link}" granted_badge: "Vous avez gagné %{link}" @@ -1160,6 +1197,7 @@ fr: reserved_username: "Ce pseudo n'est pas autorisé." missing_user_field: "Vous n'avez pas renseigné l'ensemble des champs utilisateur" close_window: "Identification terminée. Fermez cette fenêtre pour continuer." + already_logged_in: "Oups, on dirait que vous essayez d'accepter une invitation d'un autre utilisateur. Si vous n'êtes pas %{current_user}, veuillez vous déconnecter et réessayer." user: no_accounts_associated: "Aucun compte associé" username: @@ -1168,8 +1206,8 @@ fr: characters: "doit inclure uniquement des chiffres, lettres et caractères de soulignement" unique: "doit être unique" blank: "doit être présent" - must_begin_with_alphanumeric: "doit débuter par une lettre ou un nombre ou un underscore" - must_end_with_alphanumeric: "doit terminer par une lettre, un chiffre ou un caractère souligné (underscore)" + must_begin_with_alphanumeric_or_underscore: "doit commencer par une lettre, un chiffre ou un tiret du bas." + must_end_with_alphanumeric: "doit finir par une lettre ou un chiffre" must_not_contain_two_special_chars_in_seq: "ne doit pas contenir une séquence de 2 caractères spéciaux ou plus (.-_)" must_not_end_with_confusing_suffix: "ne doit pas se terminer avec un suffixe déroutant comme .json ou .png etc." email: @@ -1178,6 +1216,13 @@ fr: ip_address: blocked: "Les nouvelles inscriptions ne sont pas acceptées depuis votre adresse IP." max_new_accounts_per_registration_ip: "Les nouvelles inscriptions ne sont pas autorisées depuis votre adresse IP (limite atteinte). Contactez un responsable." + flags_reminder: + flags_were_submitted: + one: "Un signalement a été soumis il y a plus d'une heure. Veuillez la passer en revue." + other: "Des signalements ont été soumis il y a plus de %{count} heures. Veuillez les passer en revue." + subject_template: + one: "un signalement en attente de traitement" + other: "%{count} signalements en attente de traitement." unsubscribe_mailer: subject_template: "Confirmez que vous ne souhaitez plus recevoir d'email de mise à jour de %{site_title}" text_body_template: | @@ -1187,7 +1232,7 @@ fr: %{confirm_unsubscribe_link} - Si vous souhaitez continuer à recevoir les emails, vous pouvez ignorer cette email. + Si vous souhaitez continuer à recevoir les emails, vous pouvez ignorer cet email. invite_mailer: subject_template: "%{invitee_name} vous a invité(e) à participer à '%{topic_title}' sur %{site_domain_name}" text_body_template: | @@ -1231,87 +1276,10 @@ fr: (Si le lien est expiré, choisissez "J'ai oublié mon mot de passe" lorsque vous essayez de vous connecter avec votre adresse mail.) test_mailer: subject_template: "[%{site_name}] Test de délivrabilité d'un courriel" - text_body_template: | - Ceci est un courriel de test de - - [**%{base_url}**][0] - - Assurer la distribution de courriel est compliqué. Voici un certain nombre de points importants que vous devez vérifier au préalable: - - - Soyez *certain* de renseigner le champs from: de la `notification par email` correctement dans votre configuration. **Le nom de domaine renseigné dans l'addresse "from" des courriels que vous envoyez sera le nom de domaine utilisé pour la validation**. - - - Sachez comment consulter le format brut d'un courriel dans votre client de courriel, pour vous permettre de consulter les entêtes pour obtenirs des indices importants. Dans Gmail, c'est l'option "show original" dans le menu contextuel situé en haut à droite de chaque courriel. - - - **IMPORTANT:** Does your ISP have a reverse DNS record entered to associate the domain names and IP addresses you send mail from? [Test your Reverse PTR record][2] here. If your ISP does not enter the proper reverse DNS pointer record, it's very unlikely any of your email will be delivered. - - - l'enregistrement [SPF record][8] de votre nom de domaine est-il correcte ? [Testez votre enregistrement SPF][1] ici Veuillez noter que le type officiel d'enregistrment est TXT pour l'enregistrement SPF. - - - l'enregistrement [DKIM record][3] de votre nom de domaine est-il correcte ? Ce point particulier augmentera de manière significative la bonne distribution de vos courriels. [Testez votre enregistrement DKIM][7] ici. - - - If you run your own mail server, check to make sure the IPs of your mail server are [not on any email blacklists][4]. Also verify that it is definitely sending a fully-qualified hostname that resolves in DNS in its HELO message. If not, this will cause your email to be rejected by many mail services. - - (La mannière la plus *facile* est de créer un compte gratuit sur [Mandrill][md] ou [Mailgun][mg] ou [Mailjet][mj], qui ont des options gratuites généreuses et qui seront parfaite pour de petites communautés. Vous devrez quand même configurer les entrées SPF et DKIM dans votre DNS!) - - Nous espérons que vous avez bien reçu ce courriel de test de distribution ! - - Bonne chance, - - Vos amis de [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Nouvelle version de Discourse, mise à jour disponible" - text_body_template: | - Une nouvelle version de [Discourse](http://www.discourse.org) est disponible. - - Votre version: %{installed_version} - Nouvelle version: **%{new_version}** - - Vous voulez peut-être: - - - Voir les nouveautés sur le [changelog de GitHub](https://github.com/discourse/discourse/commits/master). - - - Mettre à jour depuis votre navigateur en allant sur [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade) - - - Visiter [meta.discourse.org](http://meta.discourse.org) pour vous tenir au courant, discuter et avoir de l'aide à propos de Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] mise à jour disponible" - text_body_template: | - Une nouvelle version de [Discourse](http://www.discourse.org) est disponible. - - Votre version: %{installed_version} - Nouvelle version: **%{new_version}** - - Vous voulez peut-être: - - - Voir les nouveautés sur le [changelog de GitHub](https://github.com/discourse/discourse/commits/master). - - - Mettre à jour depuis votre navigateur en allant sur [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade) - - - Visiter [meta.discourse.org](http://meta.discourse.org) pour vous tenir au courant, discuter et avoir de l'aide à propos de Discourse. - - ### Notes de mise à jour - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Il y a un signalement qui a été soumis il y a plus de %{count} heures." - other: "Ces signalements ont été soumis il y a plus de %{count} heures." - please_review: "Veuillez examiner cela." - post_number: "message" - how_to_disable: 'Vous pouvez désactiver ou modifier la fréquence de ce courriel de rappel via le réglage "m''informer sur les signalements".' - subject_template: - one: "un signalement en attente de traitement" - other: "%{count} signalements en attente de traitement." queued_posts_reminder: subject_template: one: "[%{site_name}] 1 message en attente de modération" @@ -1452,7 +1420,7 @@ fr: text_body_template: "Merci d'avoir rejoint %{site_name} et bienvenue ! \n\n%{new_user_tips}\n\nNous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps. \n\nAmusez-vous bien ! \n\n(Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message.)\n" welcome_invite: subject_template: "Bienvenue sur %{site_name} !" - text_body_template: "Merci d'avoir accepté votre invitation sur %{site_name} et bienvenue !\n\nNous avons créé un nouveau compte : **%{username}**, et vous y êtes connecté. Vous pouvez changer votre pseudo en allant sur [votre profil][prefs].\n\nPour vous reconnecter :\n\n1. Toujours **utiliser la même adresse de courriel que celle de l'invitation** que vous avez reçue. Autrement, nous ne pourrons pas vous reconnaître.\n\n2. Créer un mot de passe unique sur votre [sur votre profil][prefs] et connectez-vous avec. \n\n%{new_user_tips}\n\nNous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps.\n\nAmusez-vous bien !\n\n(Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message).\n\n[prefs] : %{user_preferences_url}\n" + text_body_template: "Merci d'avoir accepté votre invitation sur %{site_name} et bienvenue !\n\nNous avons créé un nouveau compte : **%{username}**, et vous y êtes connecté. Vous pouvez changer votre pseudo en allant sur [votre profil][prefs].\n\nPour vous reconnecter :\n\n1. Toujours **utiliser la même adresse de courriel que celle de l'invitation** que vous avez reçue. Autrement, nous ne pourrons pas vous reconnaître.\n\n2. Créer un mot de passe unique sur votre [sur votre profil][prefs] et connectez-vous avec. \n\n%{new_user_tips}\n\nNous croyons au [comportement communautaire civilisé](%{base_url}/guidelines) en tous temps.\n\nAmusez-vous bien !\n\n(Si, en tant que nouvel utilisateur, vous avez besoin de communiquer avec un [responsable](%{base_url}/about), répondez simplement à ce message).\n\n[prefs]: %{user_preferences_url}\n" backup_succeeded: subject_template: "Sauvegarde terminée avec succès" text_body_template: "La sauvegarde a bien réussie.\nVisitez [la section admin > sauvegarde](%{base_url}/admin/backups) pour télécharger votre nouvelle sauvegarde." @@ -1668,12 +1636,14 @@ fr: subject_pm: "[MP]" user_notifications: previous_discussion: "Réponses précédentes" + in_reply_to: "En réponse à" unsubscribe: title: "Désabonnement" description: "Ces courriels ne vous intéressent pas ? Aucun problème ! Cliquez ci-dessous pour vous désabonner immédiatement :" reply_by_email: "[Visiter sujet](%{base_url}%{url}) ou répondre à ce courriel pour répondre." - visit_link_to_respond: "[Visiter sujet](%{base_url}%{url}) pour répondre." reply_by_email_pm: "[Visiter message](%{base_url}%{url}) ou répondre à ce courriel pour répondre." + only_reply_by_email: "Répondre à ce courriel pour répondre" + visit_link_to_respond: "[Visiter sujet](%{base_url}%{url}) pour répondre." visit_link_to_respond_pm: "[Visiter message](%{base_url}%{url}) pour répondre." posted_by: "Ecrit par %{username} le %{post_date}" user_invited_to_private_message_pm: @@ -1695,7 +1665,6 @@ fr: Veuillez suivre ce lien pour consulter le message: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} vous a invité dans le sujet '%{topic_title}'" text_body_template: "\n%{username} vous a invité à une conversation\n\n> **%{topic_title}**\n>\n> %{topic_excerpt}\n\nsur \n\n> %{site_title} -- %{site_description}\n\nVeuillez suivre ce lien pour voir le message: %{base_url}%{url}\n" user_replied: subject_template: "[%{site_name}] %{topic_title}" @@ -1730,6 +1699,8 @@ fr: --- %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" user_mentioned: subject_template: "[%{site_name}] %{topic_title}" text_body_template: | @@ -1856,7 +1827,7 @@ fr: Si le lien ci-dessus n'est pas cliquable, essayez de le copier et coller dans la barre d'adresse de votre navigateur web. page_not_found: - title: "La page que vous avez demandé n'existe pas ou est privée." + title: "Oops! Cette page n'existe pas ou est privée." popular_topics: "Populaires" recent_topics: "Récents" see_more: "Plus" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 8c7773eddd..dc8cfc2971 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -10,6 +10,14 @@ ko: short_date_no_year: "M월 D일" short_date: "YYYY-M-D" long_date: "YYYY-M-D a h:mm" + datetime_formats: &datetime_formats + formats: + short: "%Y-%m-%d" + short_no_year: "%B %-d" + date_only: "%B %-d, %Y" + date: + month_names: [] + <<: *datetime_formats title: "Discourse" topics: "글타래" posts: "글" @@ -19,6 +27,9 @@ ko: purge_reason: "비활성화된 계정은 자동적으로 삭제됩니다." disable_remote_images_download_reason: "디스크저장공간이 부족하여 원격 이미지 다운로드 기능이 비활성화 되었습니다." anonymous: "익명" + emails: + incoming: + default_subject: "%{email} 으로부터 받은 이메일" errors: &errors format: '%{attribute} %{message}' messages: @@ -71,6 +82,7 @@ ko: not_found: "요청한 URL이나 리소스를 찾지 못했습니다." invalid_access: "요청한 리소스를 볼 권한이 없습니다." read_only_mode_enabled: "현재 읽기 전용 모드입니다." + reading_time: "읽은 시간" likes: "좋아요" too_many_replies: other: "죄송합니다. 신규 가입자는 글 하나에 %{count}개까지만 댓글을 달 수 있습니다." @@ -111,6 +123,7 @@ ko: rss_description: latest: "최신 글타래" hot: "인기 글타래" + top: "인기 토픽" posts: "최근 글" too_late_to_edit: "이 글은 작성된 지 너무 오랜 기간이 지났습니다. 수정 또는 삭제할 수 없습니다." excerpt_image: "이미지" @@ -232,6 +245,7 @@ ko: self_parent: "하위 카테고리의 부모는 자신이 될 수 없습니다." depth: "하위 카테고리는 계층 구조로 사용할 수 없습니다." email_in_already_exist: "'%{email_in}' 수신용 이메일 주소는 '%{category_name}' 카테고리 에서 사용 중입니다." + invalid_email_in: "'%{email_in}' 은 유효한 이메일 주소가 아닙니다." cannot_delete: uncategorized: "Uncategorized는 삭제할 수 없습니다." has_subcategories: "하위 카테고리가 있어, 삭제할 수 없습니다." @@ -327,6 +341,7 @@ ko: please_continue: "%{site_name}으로 가기" error: "이메일 주소를 변경하는데 문제가 있습니다. 주소가 이미 사용되고 있나요?" activation: + action: "여기를 눌러 계정을 활성화하세요." already_done: "죄송합니다. 이 계정 확인 링크는 더 이상 유효하지 않습니다." please_continue: "계정이 활성화 되었습니다; 홈페이지로 이동합니다." continue_button: "%{site_name}으로 가기" @@ -349,11 +364,13 @@ ko: description: '이 글은 다른 사용자들에게 공격적이나 모욕적 또는 침해적인 글을 담고 있습니다.' long_form: '부적절함으로 신고하기' notify_user: + title: '@{{username}} 님에게 메시지를 보냅니다' long_form: '메세지한 유저' email_title: '"%{title}" 내의 당신의 글' email_body: "%{link}\n\n%{message}" notify_moderators: title: "뭔가 다른것" + long_form: '주의를 위해 운영진에게 신고했습니다' email_body: "%{link}\n\n%{message}" bookmark: title: '북마크' @@ -415,6 +432,10 @@ ko: title: "새 사용자" xaxis: "일" yaxis: "새로운 사용자 수" + profile_views: + title: "회원 프로필 조회수" + xaxis: "일" + yaxis: "회원 프로필 조회된 횟수" topics: title: "글타래들" xaxis: "일" @@ -498,6 +519,10 @@ ko: title: "총" xaxis: "일" yaxis: "총 API 요청" + page_view_logged_in_mobile_reqs: + xaxis: "일" + page_view_anon_mobile_reqs: + xaxis: "일" http_background_reqs: title: "백그라운드" xaxis: "일" @@ -530,6 +555,10 @@ ko: title: "답글 없는 주제" xaxis: "일" yaxis: "총" + mobile_visits: + title: "사용자 방문횟수" + xaxis: "일" + yaxis: "방문 횟수" dashboard: rails_env_warning: "당신의 서버는 %{env} 모드에서 실행되고 있습니다." ruby_version_warning: "당신은 문제가 자주 발생하는 루비 버전 2.0.0을 사용하시고 있습니다. 247 또는 이후 패치 레벨로 업그레이드를 해주세요." @@ -566,7 +595,6 @@ ko: min_private_message_title_length: "메세지 제목의 최소 길이" min_search_term_length: "검색을 하기 위한 최소 글자 수" allow_uncategorized_topics: "카테고리 없이 게시 허용. 주의: 카테고리 없는 글은 이 항목을 비활성화에 하기전에 카테고리 설정을 해야 합니다." - uncategorized_description: "'카테고리 없음' 카테고리의 설명, 설명을 쓰지 않으려면 빈칸으로 놔둔다." allow_duplicate_topic_titles: "같은 제목의 동일한 글타래 허용" unique_posts_mins: "같은 컨텐츠를 다시 글 할 수 있는 기간(분)" educate_until_posts: "새로운 사용자가 글를 작성할 시 글 작성 방법에 대한 교육패널을 보여주는데, 해당 패널이 보여지는 초기 글 개수" @@ -663,6 +691,9 @@ ko: invite_passthrough_hours: "사용되어진 방문키를 로그인하는데 재사용할 수 있는 기간, 시간" invite_only: "공개 가입은 불가하도록 설정됨. 초대를 받아야만 신규 가입 가능함." login_required: "글을 읽으려면 인증(로그인)이 필요함" + min_username_length: "아이디 최소길이 (문자 갯수)" + max_username_length: "아이디 최대길이 (문자 갯수)" + reserved_usernames: "회원가입 금지된 아이디 목록" min_password_length: "비밀번호 최소 글자수." block_common_passwords: "가장 흔히 사용되는 10,000개 비밀번호 목록에 있는 비밀번호를 사용하는 것을 허용하지 않음." enable_sso: "외부사이트 Single Sign On, SSO를 통해 로그인 활성화(경고: 유저의 이메일 주소는 반드시 외부에서 확인해야합니다!)" @@ -824,7 +855,6 @@ ko: automatically_download_gravatars: "사용자가 계정을 만들거나 이메일을 변경하자마자 Gravatar를 다운로드합니다." digest_topics: "요약 이메일에서 보여질 최대 글타래 개수" digest_min_excerpt_length: "요약 이메일에서 최소 글 발췌 수" - delete_digest_email_after_days: "(n)일동안 사이트에서 보지 못한 사용자에게는 이메일 요약을 보내지 않습니다." disable_digest_emails: "모든 유저들 이메일 다이제스트 못하게 하기" max_daily_gravatar_crawls: "하루에 Discourse가 커스텀 아파타를 위해 Gravatar를 체크하는 최대 횟수" public_user_custom_fields: "유저가 쓸 수 있는 공개 커스텀 필드 목록" @@ -894,7 +924,6 @@ ko: moved_post: "%{display_username} 사용자가 %{link} 에 당신의 글을 이동하였습니다." private_message: "%{display_username} 회원님이 메세지를 보냈습니다: %{link}" invited_to_private_message: "%{display_username} 회원님이 메세지에 초대했습니다: %{link}" - invited_to_topic: "%{display_username} 회원님이 글타래에 초대했습니다: %{link}" invitee_accepted: "%{display_username} 사용자가 당신의 초대를 수락하였습니다." linked: "%{display_username} 사용자가 %{link} 에서 당신을 링크했습니다." granted_badge: "당신은 %{link}를 획득했습니다." @@ -981,6 +1010,9 @@ ko: ip_address: blocked: "이 IP주소에서는 가입이 안됩니다." max_new_accounts_per_registration_ip: "이 IP에서는 가입이 더이상 되지 않습니다(최대 가입 제한 도달). 스태프에게 연락주세요." + flags_reminder: + subject_template: + other: "%{count}개의 신고가 접수 대기 중" invite_mailer: subject_template: "%{invitee_name} 회원님이 %{site_domain_name} 에 '%{topic_title}'에 초대하였습니다." text_body_template: | @@ -1017,86 +1049,10 @@ ko: subject_template: "%{site_name} 계정을 위해 비밀번호 설정" test_mailer: subject_template: "[%{site_name}] 이메일 발송 테스트" - text_body_template: | - 이것은 테스트 이메일 양식입니다. - - [**%{base_url}**][0] - - 이메일 발송은 어렵습니다. 먼저 체크해야 할 몇가지 사항을 알려드립니다: - - - `알림 이메일` 발신지 주소가 사이트 설정에 적었는지 *확실히* 보세요. **발신지 이메일 주소에 적힌 도메인은 받는 곳에서 검사하게 될 도메인입니다**. - - - 이메일 raw source를 이메일 클라이언트에서 보는 방법을 알아두고 이메일 헤더에서 중요한 단서를 찾도록 합니다. Gmail에서는, 각 메일의 오른쪽 위에 있는 드롭다운 메뉴의 "원본보기" 옵션입니다. - - - **중요:** 당신의 ISP회사가 도메인네임과 IP주소를 연결시켜주러 들어오는 a reverse DNS record 갖고 있나요? [Reverse PTR record 테스트][2]해보세요. ISP회사가 적절한 reverse DNS pointer record를 안 넣었다면, 어떤 이메일도 발송이 안될 수 있습니다. - - - 이메일 도메인의 [SPF record][8]가 제대로 설정됐나요? [SPF record 테스트][1]해보세요. 참고로 TXT가 제대로된 공식 SPF 타입입니다. - - - 이메일 도메인의 [DKIM record][3]가 제대로 설정됐나요? 이게 이메일 전송에 큰 영향을 줍니다. [your DKIM record 테스트][7]해보세요. - - - 스스로 이메일서버를 운영중이라면, 메일서버 IP가 [블랙리스트][4]에 안들어 가있는지 확실히 봐야합니다. 또 DNS의 HELO 메세지로 resolve가 되는 완벽히 인증된 호스트네임으로 제대로 보내고 있는지 확인해야 합니다. 아니라면 대부분의 받는 쪽 메일 서비스에서 거절 받을 겁니다. - - (한 가지 *쉬운* 방법은 [Mandrill][md]이나 [Mailgun][mg]이나 [Mailjet][mj]에 가입해 메일링 서비스를 받는 것이고 작은 커뮤니티에서는 괜찮을 겁니다. 그래도 SPF레코드 DKIM레코드는 DNS에 등록해줘야합니다!) - - 우리도 이 이메일 전송 테스트를 제대로 받았기를 바랍니다. - - 행운을 빕니다. - - 당신의 친구 [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] 새 Discourse 버전으로 업데이트 가능." - text_body_template: | - [Discourse](http://www.discourse.org) 새 버전이 나왔습니다. - - 현재 이 Discourse 버전: %{installed_version} - 새 버전: **%{new_version}** - - 제안: - - - [GitHub changelog](https://github.com/discourse/discourse/commits/master)에 뭐가 바뀌었는지 확인해보세요. - - - 브라우저 상에서 [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade)로 들어가 업그레이드가 가능합니다. - - - [meta.discourse.org](http://meta.discourse.org) 포럼에서 Discourse 관련 지원, 토의, 뉴스를 보실 수 있습니다. new_version_mailer_with_notes: subject_template: "[%{site_name}] 업데이트 가능." - text_body_template: |+ - [Discourse](http://www.discourse.org) 새 버전이 나왔습니다. - - 현재 이 Discourse 버전: %{installed_version} - 새 버전: **%{new_version}** - - 제안: - - - [GitHub changelog](https://github.com/discourse/discourse/commits/master)에 뭐가 바뀌었는지 확인해보세요. - - - 브라우저 상에서 [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade)로 들어가 업그레이드가 가능합니다. - - - [meta.discourse.org](http://meta.discourse.org) 포럼에서 Discourse 관련 지원, 토의, 뉴스를 보실 수 있습니다. - - ### 릴리즈 노트 - - %{notes} - - flags_reminder: - flags_were_submitted: - other: "이 신고들은 %{count}시간 전에 접수 됐습니다." - please_review: "후기를 써주세요." - post_number: "글" - how_to_disable: '"notify about flags after" 설정을 통해 이메일 알림의 빈도를 변경하거나 비활성화할 수 있습니다.' - subject_template: - other: "%{count}개의 신고가 접수 대기 중" queued_posts_reminder: subject_template: other: "[%{site_name}]의 %{count}개의 글이 검토를 기다리고 있습니다." @@ -1133,6 +1089,99 @@ ko: 하지만 글이 한번 더 커뮤니티에서 숨김이 된 경우 스태프가 풀어주기 전까지 숨김해제가 안되며 계정 정지 등의 조치가 취해질 수 있습니다. 조언을 얻기 위해, [커뮤니티 가이드라인](%{base_url}/guidelines)을 참고해 주세요. + usage_tips: + text_body_template: | + 시작하기 위한 몇 가지 간단한 팁을 알려드릴께요: + + ## 읽기 + + 더 읽으시려면, **그냥 계속해서 스크롤다운 하세요!** + + 새 댓글이나 새 포픽이 올라오면 자동으로 나타나기 때문에 페이지 새로고침할 필요가 없습니다. + + ## 탐색 + + - 검색 또는 메뉴, 사용자페이지는 **화면 우상단에 있는 아이콘 버튼**을 사용하세요. + + - 토픽을 선택하면 항상 당신이 그 토픽에서 **읽지 않은 다음 댓글**로 바로 갑니다. 제일 위나 아래로 가려면, 댓글 카운트 또는 마지막 댓글 날짜를 선택하세요. + + + + - 토픽을 읽는 도중에는, 우하단에 있는 프로그레스 바를 이용해서 전체 탐색하세요. 토픽 제목을 선택하면 제일 위로 바로 갈 수 있답니다. 초스피드 키보드 단축키 목록이 궁금하면 ?키를 누르세요. + + + + ## 댓글달기 + + - 토픽에 **평범하게 댓글 달때**는, 토픽 맨 밑에 있는 버튼을 이용하세요. + + - **특정 사람**에게 댓글 달때는, 그 글에 딸린 버튼을 이용하세요. + + - **새로운 토픽으로** 댓글 달때는, 글 오른쪽에 있는 버튼을 이용하세요. 오래된 토픽과 새 토픽 모두 자동적으로 함께 링크됩니다. + + 댓글은 간단한 HTML 또는 BBCode, [마크다운 (Markdown)](http://commonmark.org/help/) 형식으로 쓸 수 있습니다. + + 이건 **볼드체**입니다. + 이건 볼드체입니다. + 이건 [b]볼드체[/b]입니다. + + 마크다운을 배우고 싶으시다면? [저희의 10분짜리 재밌는 인터랙티브 튜토리얼을 해보세요!](http://commonmark.org/help/tutorial/) + + 인용문을 삽입하려면, 인용하고 싶은 텍스트를 선택한 다음에 댓글달기(응답하기) 버튼 아무거나 누르세요. 인용문이 여러개면 앞 동작을 반복하세요. + + + + 댓을을 누군가에게 알리고 싶을 때는 그 사람 이름을 언급하세요. `@` 키를 쳐서 사용자이름 선택하기를 시작할 수 있답니다. + + + + [표준 이모지(Emoji)](http://www.emoji.codes/)를 사용하려면, 그냥 `:`키를 눌러서 매칭되는 이름을 찾거나 예전부터 써온 `;)` 웃음표시를 이용하세요. + + + + 링크 요약을 생성하려면, 편집기 화면에 그 링크를 그냥 아래처럼 붙여넣기 하세요: + + + + ## 액션 + + 각각의 글 밑에는 액션 버튼들이 있습니다: + + + + 누군가의 글이 마음에 쏙 들어서 감사표시를 하고 싶으면 **좋아요** 버튼을 이용하세요. 애정을 공유하는 거에요! + + 누군가의 글에 문제가 있으면, **신고** 버튼으로 글쓴이에게 또는 [우리 운영진](%{base_url}/about)에게 개인적으로 조용히 알려주세요. 그 글로 가는 링크를 **공유**하거나 **북마크**해서 당신의 사용자 페이지에서 나중에 참고할 수도 있습니다. + + ## 알림 + + 누군가 당신에게 댓글달거나 당신의 글을 인용, 또는 당신의 `@아이디`를 언급하면, 페이지 우상단에 숫자가 즉시 나타납니다. **알림**으로 접근할 때 그걸 이용하세요. + + + + 댓글 놓칠까봐 걱정하지 마세요 - 당신이 없는 사이에 온 알림은 이메일로 보내드릴 꺼에요. + + ## 환경설정 + + - **쓴지 이틀이 안 된** 모든 토픽은 새글로 간주합니다. + + - **당신이 활동적으로 참여한** (글쓰기, 댓글달기, 일정시간 이상 읽기 등) 토픽은 자동적으로 추적됩니다. + + 이 토픽들 바로 옆에는 파란색 new 또는 읽지 않는 댓글수가 표시됩니다: + + + + 토픽 맨 밑에 있는 알림제어판을 통해 어떤 토픽이든지 알림설정을 바꿀 수 있습니다. + + + + 그리고 만일 특정 카테고리의 모든 새토픽을 지켜보고 싶으면, 카테고리 별로 알림설정 할 수 있습니다. + + 설정을 바꾸려면 [당신의 사용자 환경설정](%{base_url}/my/preferences)을 참고하세요. + + ## 커뮤니티 신뢰 + + 이곳에 참여하시면, 시간이 지남에 따라 커뮤니티의 신뢰를 받게 되고 정회원이 되어 신규회원 제한은 사라질 꺼에요. 충분이 높은 [회원등급이 되면](https://meta.discourse.org/t/what-do-user-trust-levels-do/4924), 우리 커뮤니티를 함께 꾸려나가는 걸 도와줄 새능력을 얻을 껍니다. welcome_user: subject_template: "%{site_name} 사이트에 오신것을 환영합니다!" text_body_template: | @@ -1219,10 +1268,6 @@ ko: text_body_template: "죄송합니다. 데이터 추출에 실패하였습니다. 로그를 확인하시거나 관리자에게 문의해주세요." email_reject_no_account: subject_template: "[%{site_name}] 이메일 문제 -- 모르는 계정" - text_body_template: | - 죄송합니다 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. - - 이 이메일 주소로 되어있는 사용자 계정이 없습니다. 다른 이메일 주소로 보내거나 스태프에게 연락 주세요. email_reject_empty: subject_template: "[%{site_name}] 이메일 문제 -- 내용 없음" email_reject_parsing: @@ -1239,25 +1284,15 @@ ko: 이 카테고리에서 새 글타래를 작성하는 데 필요한 회원등급이 없습니다. 오류라고 생각되면 스태프에게 연락주세요. email_reject_reply_key: subject_template: "[%{site_name}] 이메일 문제 -- 잘못된 답글 Key" - text_body_template: | - 죄송합니다 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. - - 받은 답글 key가 올바르지 않거나 모르는 key여서 어디에 답글을 달아야 하는지 모르겠스빈다. 스태프에게 연락주세요. email_reject_topic_not_found: subject_template: "[%{site_name}] 이메일 문제 -- 글타래 못 찾음" - text_body_template: "죄송합니다, 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. \n\n답글하려는 글타래가 더이상 존재하지 않습니다, 아마 지워졌을 수도 있습니다. 오류라고 생각되면 스태프에게 연락주세요.\n" email_reject_topic_closed: subject_template: "[%{site_name}] 이메일 문제 -- 글타래 닫힘" - text_body_template: "죄송합니다, 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. \n\n답글하려는 글타래가 닫혔거나 더이상 답글을 받지 않스빈다. 오류라고 생각되면 스태프에게 연락 주세요.\n" + text_body_template: "죄송합니다, 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. \n\n답글하려는 글타래가 닫혔거나 더이상 답글을 받지 않습니다. 오류라고 생각되면 스태프에게 연락 주세요.\n" email_reject_auto_generated: subject_template: "[%{site_name}] 이메일 문제 -- 자동 생성된 답글" - text_body_template: "죄송합니다, 이메일 메세지 %{destination} (titled %{former_title})가 안 됐습니다. \n\n이메일이 \"자동 생성\"으로 확인 되어 받을 수 없습니다. 오류라고 생각되면 스태프에게 연락주세요.\n" email_error_notification: subject_template: "[%{site_name}] 이메일 문제 -- POP 인증 오류" - text_body_template: | - POP서버에서 메일을 가져오는데 인증 오류가 발생했습니다. - - POP 인증정보를 제대로 입력했는지 확인해주세요. [사이트 설정](%{base_url}/admin/site_settings/category/email). too_many_spam_flags: subject_template: "새로운 계정은 블락되었습니다." text_body_template: | @@ -1322,7 +1357,6 @@ ko: %{base_url}%{url} 로 들어가서 메세지를 확인하기 user_invited_to_topic: - subject_template: "[%{site_name}] %{username} 회원님이 '%{topic_title}' 글타래에 초대했습니다." text_body_template: |2 %{username} 회원님이 토의에 초대하였습니다. @@ -1424,7 +1458,6 @@ ko: 만약 위의 링크를 클릭 할 수 없으면 주소를 복사하여 당신의 웹브라우저에 붙여넣으세요. page_not_found: - title: "당신이 요청한 페이지를 찾을 수 없습니다. 혹시 아래와 같은 글타래를 찾으신 것은 아닌가요?" popular_topics: "인기" recent_topics: "최근" see_more: "더" @@ -1494,6 +1527,8 @@ ko: performance_report: initial_post_raw: 이 글타래는 웹사이트의 일일 성능 보고를 포함하고 있습니다. initial_topic_title: 웹사이트 성능 보고 + time: + <<: *datetime_formats activemodel: errors: <<: *errors diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 75d7199454..99daac0732 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -10,8 +10,14 @@ nl: short_date_no_year: "D MMM" short_date: "D MMM YYYY" long_date: "D MMMM YYYY H:mm" + datetime_formats: &datetime_formats + formats: + short: "%m-%d-%Y" + short_no_year: "%-d %B" + date_only: "%B %-d, %Y" date: month_names: [null, januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december] + <<: *datetime_formats title: "Discourse" topics: "Topics" posts: "berichten" @@ -21,6 +27,22 @@ nl: purge_reason: "Automatisch verwijderd, account is nooit geactiveerd" disable_remote_images_download_reason: "Het downloaden van plaatjes is uitgeschakeld omdat er niet genoeg schijfruimte beschikbaar is." anonymous: "Anoniem" + emails: + incoming: + default_subject: "Inkomende email van %{email}" + errors: + empty_email_error: "Gebeurt wanneer de mail die wij ontvangen hebben leeg is." + no_message_id_error: "Gebeurt wanneer de mail geen 'Message-Id' header heeft." + auto_generated_email_error: "Gebeurt wanneer de 'voorrang' header is ingesteld op: lijst, ongewenst, bulk of automatisch auto_reply, of wanneer een andere header bevat: auto-submitted, auto-replied of auto-generated." + no_body_detected_error: "Gebeurt wanneer wij de body niet konden uitpakken en er geen bijlages zijn." + inactive_user_error: "Gebeurt wanneer de zender niet actief is." + blocked_user_error: "Gebeurt wanneer de zender is geblokkeerd." + bad_destination_address: "Gebeurt wanneer geen van de E-mail adressen in de To/Cc/Bcc velden gelijk zijn aan de geconfigureerde inkomende E-mail adressen." + strangers_not_allowed_error: "Gebeurt wanneer een gebruiker heeft geprobeerd een nieuw topic aan te maken in een categorie waar zijn geen lid van zijn." + insufficient_trust_level_error: "Gebeurt wanneer een gebruiker heeft geprobeerd een nieuw topic aan te maken in een categorie waar zijn niet het vereiste trust level voor hebben." + reply_user_not_matching_error: "Gebeurt wanneer een reactie kwam van een ander E-mail adres dan waar de notificatie was heen gestuurd. " + topic_not_found_error: "Gebeurt wanneer een reactie binnen kwam, maar het topic al is verwijdert." + topic_closed_error: "Gebeurt wanneer een reactie binnen kwam, maar het verwante topic is gesloten." errors: &errors format: '%{attribute} %{message}' messages: @@ -84,6 +106,8 @@ nl: not_found: "De opgevraagde URL of resource kan niet gevonden worden." invalid_access: "Je hebt geen permissie om de opgevraagde resource te bekijken." read_only_mode_enabled: "De site is in read only modus. Interactie is niet mogelijk." + reading_time: "leestijd" + likes: "'Vind ik leuks' " too_many_replies: one: "Sorry, nieuwe gebruikers mogen één reactie plaatsen in hetzelfde topic." other: "Sorry, nieuwe gebruikers mogen %{count} reacties plaatsen in hetzelfde topic." @@ -142,6 +166,7 @@ nl: rss_description: latest: "Nieuwste topics" hot: "Hot topics" + top: "Top topics" posts: "Nieuwste berichten" too_late_to_edit: "Dat bericht is lang geleden geschreven. Het kan niet meer gewijzigd of verwijderd worden." excerpt_image: "afbeelding" @@ -151,6 +176,8 @@ nl: errors: can_not_modify_automatic: "Je kunt automatische groepen niet wijzigen" member_already_exist: "'%{username}' is al lid van deze groep." + invalid_domain: "%{domain}' is geen geldig domein." + invalid_incoming_email: "%{incoming_email}' is geen geldig E-mail adres." default_names: everyone: "iedereen" admins: "admins" @@ -284,6 +311,7 @@ nl: self_parent: "Een categorie kan niet zijn eigen bovenliggende categorie zijn" depth: "Je kan een subcategorie niet onder een andere subcategorie plaatsen" email_in_already_exist: "Inkomend e-mailadres '%{email_in}' is al in gebruik voor '%{category_name}' categorie." + invalid_email_in: "%{email_in}' is geen geldig E-mail adres." cannot_delete: uncategorized: "De categorie Ongecategoriseerd kan niet verwijderd worden" has_subcategories: "Deze categorie kan niet verwijderd worden, omdat deze subcategorieën bevat" @@ -291,11 +319,18 @@ nl: one: "Categorie kan niet verwijderd worden omdat het 1 topic heeft. Het oudste topic is %{topic_link}." other: "Categorie kan niet verwijderd worden omdat het %{count} topics heeft. Het oudste topic is %{topic_link}." topic_exists_no_oldest: "Categorie kan niet verwijderd worden omdat het aantal topics %{count} is." + uncategorized_description: "Topics die geen categorie nodig hebben of niet in een andere bestaande categorie passen." trust_levels: newuser: title: "nieuw lid" basic: title: "lid" + member: + title: "lid" + regular: + title: "Normaal" + leader: + title: "leider" change_failed_explanation: "Je probeerde %{user_name} te degraderen naar '%{new_trust_level}'. Echter, het trustlevel is al '%{current_trust_level}'. %{user_name} blijft op trust level '%{current_trust_level}'. Als je de gebruiker wil degraderen, zet het trustlevel dan eerst vast." rate_limiter: slow_down: "je hebt deze actie te vaak uitgevoerd, probeer het later nog eens." @@ -428,11 +463,16 @@ nl: description: 'Dit bericht bevat inhoud dat iemand als beledigend, discriminerend of kwetsend kan ervaren. Ook kan het een overtreding van de regels zijn.' long_form: 'heeft dit als ongepast gemeld' notify_user: + title: 'Stuur @{{username}} een bericht' + description: 'I wil praten met deze persoon direct en privé over hun bericht.' long_form: 'bericht verstuurd aan gebruiker' email_title: 'Je bericht in ''%{title}''' email_body: "%{link}\n\n%{message}" notify_moderators: title: "Iets anders" + description: 'Dit bericht vereist actie van de moderator voor een reden die hier boven niet genoemd wordt.' + long_form: 'heeft dit gemarkeerd voor moderatie' + email_title: 'De topic "%{title}" moet door een moderator worden bekeken' email_body: "%{link}\n\n%{message}" bookmark: title: 'Favoriet' @@ -662,7 +702,6 @@ nl: min_private_message_title_length: "Minimale toegestane titel lengte in tekens voor berichten" min_search_term_length: "Minimum lengte van een zoekterm in tekens" allow_uncategorized_topics: "Topics zonder categorie toestaan. WAARSCHUWING: Alle topics moet weer aan een categorie zijn toegekend voor dit wordt uitgezet." - uncategorized_description: "De omschrijving voor de ongecategoriseerde categorie. Laat blanco voor geen omschrijving." allow_duplicate_topic_titles: "Sta topics met dezelfde titels toe" unique_posts_mins: "Hoeveel minuten iemand moet wachten voordat deze een bericht met dezelfde inhoud mag plaatsen" educate_until_posts: "Laat de popup voor nieuwe gebruikers zien als een gebruiker start met het typen van hun eerste (n) nieuwe berichten in de berichtopsteller." @@ -951,7 +990,6 @@ nl: automatically_download_gravatars: "Download Gravatars voor gebruikers bij account creatie of aanpassing van email." digest_topics: "Het maximum aantal topics dat in de e-maildigest opgenomen wordt." digest_min_excerpt_length: "Hoeveel karakters er per bericht getoond worden in de mail digest" - delete_digest_email_after_days: "Onderdruk e-mails met korte verslagen voor gebruikers die niet zijn gezien op de site voor meer dan (n) dagen." disable_digest_emails: "Uitschakelen e-mails met korte verslagen voor alle gebruikers." detect_custom_avatars: "Wel of niet te verifiëren of gebruikers eigen profielfoto's hebben geüpload. " max_daily_gravatar_crawls: "Maximaal aantal keren op een dag dat Discourse Gravatar zal controleren voor aangepaste avatars" @@ -1042,7 +1080,6 @@ nl: moved_post: "%{display_username} verplaatste je bericht naar %{link}" private_message: "%{display_username} heeft je een bericht gestuurd: %{link}" invited_to_private_message: "%{display_username} heeft je uitgenodigd voor een bericht: %{link}" - invited_to_topic: "%{display_username} heeft je uitgenodigd voor een topic: %{link}" invitee_accepted: "%{display_username} heeft je uitnodiging geaccepteerd" linked: "%{display_username} heeft je gelinkt in %{link}" granted_badge: "%{link} is aan jou toegekend" @@ -1139,8 +1176,6 @@ nl: characters: "mag alleen nummers, letters en underscores bevatten" unique: "moet uniek zijn" blank: "mag niet leeg zijn" - must_begin_with_alphanumeric: "moet beginnen met een letter, cijfer of underscore" - must_end_with_alphanumeric: "moet eindigen met een letter, cijfer of underscore" must_not_contain_two_special_chars_in_seq: "mag niet 2 of meer opvolgende speciale karakters bevatten (.-_)" email: not_allowed: "is niet toegestaan vanaf die e-mailprovider. Gebruik een ander e-mailadres." @@ -1148,6 +1183,10 @@ nl: ip_address: blocked: "Nieuwe registraties vanaf jouw IP-adres zijn niet toegestaan." max_new_accounts_per_registration_ip: "Nieuwe registraties vanaf jouw IP-adres zijn niet toegestaan (maximum limiet bereikt). Neem contact op met een staflid." + flags_reminder: + subject_template: + one: "Eén vlag af te handelen" + other: "%{count} vlaggen af te handelen" invite_mailer: subject_template: "%{invitee_name} nodigt je uit voor '%{topic_title}' op %{site_domain_name}" text_body_template: | @@ -1195,16 +1234,6 @@ nl: subject_template: "[%{site_name}] Nieuwe Discourse-versie, update beschikbaar" new_version_mailer_with_notes: subject_template: "[%{site_name}] Update beschikbaar" - flags_reminder: - flags_were_submitted: - one: "Deze vlag is meer dan één uur gelden gemaakt." - other: "Deze vlaggen zijn meer dan %{count} uur gelden gemaakt." - please_review: "Kijk hier even naar." - post_number: "bericht" - how_to_disable: 'Je kunt de frequentie van deze herinnering e-mails uitschakelen of wijzigen met de "Notificeer over vlaggen na" instelling.' - subject_template: - one: "Eén vlag af te handelen" - other: "%{count} vlaggen af te handelen" queued_posts_reminder: subject_template: one: "[%{site_name}] 1 bericht wacht op beoordeling" @@ -1305,8 +1334,6 @@ nl: posted_by: "Geplaatst door %{username} op %{post_date}" user_invited_to_private_message_pm: subject_template: "[%{site_name}] %{username} nodigt je uit voor een bericht '%{topic_title}'" - user_invited_to_topic: - subject_template: "[%{site_name}] %{username} nodigt je uit voor een topic '%{topic_title}'" user_replied: subject_template: "[%{site_name}] %{topic_title}" user_quoted: @@ -1389,7 +1416,6 @@ nl: Mocht je de bovenstaande link niet kunnen aanklikken, probeer deze dan te kopiëren en te plakken in de adresbalk van je web browser. page_not_found: - title: "De opgevraagde pagina bestaat niet op dit forum of is privé." popular_topics: "Populair" recent_topics: "Recent" see_more: "Meer" @@ -1478,6 +1504,8 @@ nl: performance_report: initial_post_raw: Deze topic bevat dagelijkse performance rapporten van je site initial_topic_title: Website performance rapporten + time: + <<: *datetime_formats activemodel: errors: <<: *errors diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 7df85a0dc3..fe7f69a181 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -27,6 +27,9 @@ pl_PL: purge_reason: "Automatycznie usunięto jako porzucone, nieaktywne konto" disable_remote_images_download_reason: "Pobieranie zewnętrznych grafik zostało wyłączone z uwagi na niską ilość wolnego miejsca na dysku." anonymous: "Anonim" + emails: + incoming: + default_subject: "Przychodzący email od %{email}" errors: &errors format: '%{attribute} %{message}' messages: @@ -665,7 +668,6 @@ pl_PL: min_private_message_title_length: "Minimalna liczba znaków w temacie wiadomości " min_search_term_length: "Minimalna długość wyszukiwanego tekstu, w znakach" allow_uncategorized_topics: "Zezwól na tworzenie tematów bez kategorii. UWAGA: jeśli jest jakiś nieskategoryzowany temat, musisz go przypisać do kategorii, zanim wyłączysz tę opcję." - uncategorized_description: "Znajdują się tu wątki którym jeszcze nie przypisano odpowiedniej kategorii." allow_duplicate_topic_titles: "Pozwól na tworzenie tematów o identycznych tytułach." unique_posts_mins: "Ile minut musi upłynąć zanim użytkownik będzie mógł ponownie zrobić wpis z tą samą treścią" educate_until_posts: "Wyświetlaj okno edukacyjne po rozpoczęciu pisania dopóki nowy użytkownik nie napisze tylu wpisów." @@ -811,7 +813,6 @@ pl_PL: email_editable: "Allow users to change their e-mail address after registration." digest_topics: "Maksymalna liczba tematów w podsumowaniu e-mail." digest_min_excerpt_length: "Minimalny wycinek wpisu (liczba znaków) w podsumowaniu e-mail." - delete_digest_email_after_days: "Nie wysyłaj podsumowań e-mail użytkownikom, którzy nie odwiedzili serwisu dłużej niż (n) dni." disable_digest_emails: "Wyłącz wysyłanie podsumowania e-mail wszystkim uzytkownikom. " allow_anonymous_posting: "Zezwól użytkownikom na przechodzenie w tryb anonimowości." allow_profile_backgrounds: "Zezwól użytkownikom na przesyłanie obrazu tła dla profilu." @@ -849,7 +850,6 @@ pl_PL: moved_post: "%{display_username} przenosi twój wpis do %{link}" private_message: "%{display_username} wysłał ci wiadomość: %{link}" invited_to_private_message: "%{display_username} zaprosił cię do wiadomości: %{link}" - invited_to_topic: "%{display_username} zaprosił cię do tematu: %{link}" invitee_accepted: "%{display_username} przyjął(-ęła) Twoje zaproszenie" linked: "%{display_username} powiązał cię z %{link}" granted_badge: "Zdobywasz %{link}" @@ -940,8 +940,6 @@ pl_PL: characters: "może zawierać tylko litery, cyfry i podkreślenia" unique: "musi być unikalna" blank: "musi zostać podana" - must_begin_with_alphanumeric: "musi zaczynać się literą, liczbą lub podkreślnikiem" - must_end_with_alphanumeric: "musi kończyć się literą, liczbą bądź podkreślnikiem" must_not_contain_two_special_chars_in_seq: "nie może zawierać sekwencji 2 lub więcej znaków specjalnych (.-_)" email: not_allowed: "nie jest dopuszczany od tego dostawcy poczty. Użyj innego adresu email." @@ -949,6 +947,11 @@ pl_PL: ip_address: blocked: "Z twojego adresu IP nowe rejestracje nie są możliwe." max_new_accounts_per_registration_ip: "Z twojego adresu IP nowe rejestracje nie są możliwe (wyczerpany limit). Skonaktuj się z personelem." + flags_reminder: + subject_template: + one: "1 flaga oczekuje na reakcję" + few: "%{count} flagi oczekują na reakcję" + other: "%{count} flagi oczekują na reakcję" invite_mailer: subject_template: "%{invitee_name} zaprosił cię do '%{topic_title}' na %{site_domain_name}" invite_forum_mailer: @@ -984,48 +987,8 @@ pl_PL: subject_template: "[%{site_name}] Test dostarczania poczty" new_version_mailer: subject_template: "[%{site_name}] Aktualizacja do nowej wersji Discourse jest dostępna." - text_body_template: | - Nowa wersja [Discourse](http://www.discourse.org) jest dostępna. - - Obecnie zainstalowana: %{installed_version} - Nowa wersja: **%{new_version}** - - Prawdopodobnie chcesz: - - - Zobaczyć [listę zmian na GitHub](https://github.com/discourse/discourse/commits/master). - - - Zaktualizować z poziomu przeglądarki pod adresem [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Odwiedzić [meta.discourse.org](http://meta.discourse.org) i zapoznać się z wiadomościami i dyskusjami na temat Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] dostępna aktualizacja" - text_body_template: | - Nowa wersja [Discourse](http://www.discourse.org) jest dostępna. - - Obecnie zainstalowana: %{installed_version} - Nowa wersja: **%{new_version}** - - Prawdopodobnie chcesz: - - - Zobaczyć [listę zmian na GitHub](https://github.com/discourse/discourse/commits/master). - - - Zaktualizować z poziomu przeglądarki pod adresem [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Odwiedzić [meta.discourse.org](http://meta.discourse.org) i zapoznać się z wiadomościami i dyskusjami na temat Discourse. - - ### Zmiany zmian - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Flagi dodane godzinę temu." - few: "Flagi dodane ponad %{count} godziny temu." - other: "Flagi dodane ponad %{count} godzin temu." - post_number: "wpis" - subject_template: - one: "1 flaga oczekuje na reakcję" - few: "%{count} flagi oczekują na reakcję" - other: "%{count} flagi oczekują na reakcję" flag_reasons: inappropriate: "Twój wpis został oznaczony jako **nieodpowiedni**: społeczność uznała, że zbyt agresywny lub niezgodny z [jej wytycznymi](/guidelines)." spam: "Twój post został oznaczony jako **spam**: społeczność czuje, że jest to reklama, czyli coś nadmiernie promującego, a nie użytecznego czy odnoszącego się do tematu." @@ -1216,7 +1179,6 @@ pl_PL: Jeśli powyższy link nie jest klikalny, spróbuj skopiować i wkleić go do pasku adresu Twojej przeglądarki. page_not_found: - title: "Strona, którą chciałeś odwiedzić, nie istnieje lub jest prywatna." popular_topics: "Popularne" recent_topics: "Ostatnie" see_more: "Więcej" diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index aa0bd45b17..bcd2b1a06d 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -30,6 +30,19 @@ pt: emails: incoming: default_subject: "Email de entrada de %{email}" + errors: + empty_email_error: "Acontece quando, a informação não processada, do correio recebido veio em branco." + no_message_id_error: "Acontece quando o correio recebido não tem identificador de mensagem no cabeçalho." + auto_generated_email_error: "Acontece quando a antecedência do cabeçalho é definida como: 'list', 'junk' ou 'auto_reply', ou quando algum cabeçalho contém: 'auto-submitted', 'auto-replied' ou 'auto-generated'." + no_body_detected_error: "Acontece quando não conseguimos extrair o corpo da mensagem e não existem anexos." + inactive_user_error: "Acontece quando o remetente não está activo." + blocked_user_error: "Acontece quando o remetente está bloqueado." + bad_destination_address: "Acontece quando nenhum dos endereços de email nos campos para/cc/bcc coincide com um endereço de email configurado." + strangers_not_allowed_error: "Acontece quando um utilizador tenta criar um tópico numa categoria em que não é membro." + insufficient_trust_level_error: "Acontece quando um utilizador tentar criar um tópico numa categoria para qual este não o nível de confiança necessário." + reply_user_not_matching_error: "Acontece quando uma resposta veio de um endereço de email diferente do destinatário da notificação." + topic_not_found_error: "Acontece quando a resposta veio de um tópico relacionado mas o tópico relacionado foi apagado." + topic_closed_error: "Acontece quando uma resposta chegou mas o tópico relacionado foi fechado." errors: &errors format: '%{attribute} %{message}' messages: @@ -153,6 +166,7 @@ pt: rss_description: latest: "Tópicos recentes" hot: "Tópicos quentes" + top: "Melhores tópicos" posts: "Últimas mensagens" too_late_to_edit: "Essa mensagem foi criada há muito tempo. Já não pode ser editada ou apagada." excerpt_image: "imagem" @@ -307,6 +321,7 @@ pt: self_parent: "Uma subcategoria não pode ser superior a ela própria" depth: "Não pode juntar uma subcategoria dentro de outra" email_in_already_exist: "Endereço de email de recepção %{email_in}' já está a ser utilizado pela categoria %{category_name}'." + invalid_email_in: "'%{email_in}' não é um endereço de email válido." cannot_delete: uncategorized: "Não é possível eliminar Sem Categoria" has_subcategories: "Não é possível eliminar esta categoria porque contém sub-categorias." @@ -784,7 +799,6 @@ pt: suppress_reply_directly_above: "Não mostrar em-resposta-a expansível quando há apenas uma única resposta diretamente acima desta publicação." suppress_reply_when_quoting: "Não mostraR em-resposta-a expansível numa mensagem quando esta cita uma resposta." max_reply_history: "Número máximo de respostas a serem expandidas quando se expande em-resposta-a" - experimental_reply_expansion: "Esconder respostas intermédias ao expandir uma resposta-a (experimental)" topics_per_period_in_top_summary: "Número de tópicos principais mostrados no resumo padrão de tópicos principais." topics_per_period_in_top_page: "Número de tópicos principais mostrados em 'Mostrar Mais' tópicos principais expandido." redirect_users_to_top_page: "Redirecionar automaticamente os utilizadores novos e ausentes por períodos longos para o topo da página." @@ -880,6 +894,7 @@ pt: external_system_avatars_enabled: "Utilize o serviço do sistema externo de avatars." external_system_avatars_url: "URL do serviço do sistema externo de avatars. Substituições permitidas são {nome_de_utilizador} {primeira_letra} {cor} {tamanho}" default_opengraph_image_url: "URL da imagem opengraph por defeito." + allow_all_attachments_for_group_messages: "Permitir qualquer anexo de email nas mensagens de grupo." enable_flash_video_onebox: "Ativar a incorporação de hiperligações swf e flv (Adobe Flash) em caixas únicas. AVISO: pode introduzir riscos de segurança." default_invitee_trust_level: "Nível de Confiança padrão (0-4) para utilizadores convidados." default_trust_level: "Nível de Confiança padrão (0-4) para todos os novos utilizadores. AVISO! Alterar isto irá colocá-lo em sério risco de spam." @@ -1062,6 +1077,8 @@ pt: default_email_direct: "Por defeito, enviar um email quando alguém cita/responde a/menciona ou convida o utilizador." default_email_mailing_list_mode: "Por defeito, enviar um email por cada nova mensagem." default_email_always: "Por defeito, enviar notificações por email mesmo quando o utilizador está ativo." + default_email_previous_replies: "Incluir respostas previas nos emails por defeito." + default_email_in_reply_to: "Por defeito Incluir excerto de mensagem de resposta nos email." default_other_new_topic_duration_minutes: "Condição global por defeito para o qual um tópico é considerado novo." default_other_auto_track_topics_after_msecs: "Tempo global por defeito antes de um tópico ser automaticamente acompanhado." default_other_external_links_in_new_tab: "Por defeito, abrir hiperligações externas num novo separador." @@ -1091,6 +1108,8 @@ pt: pop3_polling_username_is_empty: "Deve configurar um 'nome de utilizador de polling pop3' antes de ativar o polling POP3." pop3_polling_password_is_empty: "Deve configurar uma 'palavra-passe de polling pop3' antes de ativar o polling POP3." pop3_polling_authentication_failed: "Autenticação POP3 falhada. Por favor verifique as suas credenciais pop3." + reply_by_email_address_is_empty: "Tem que definir um 'respostas por endereço de email' antes de habilitar a reposta por email." + pop3_polling_disabled: "Tem de habilitar o polling POP3 antes de habilitar a reposta por email." notification_types: group_mentioned: "%{group_name} foi mencionado em %{link}" mentioned: "%{display_username} mencionou-o em %{link}" @@ -1102,7 +1121,7 @@ pt: moved_post: "%{display_username} moveu a sua mensagem para %{link}" private_message: "%{display_username} enviou-lhe uma mensagem: %{link}" invited_to_private_message: "%{display_username} convidou-o para uma mensagem: %{link}" - invited_to_topic: "%{display_username} convidou-o para um tópico: %{link}" + invited_to_topic: "%{display_username} convidou-o para %{link}" invitee_accepted: "%{display_username} aceitou o seu convite" linked: "%{display_username} hiperligou-o em %{link}" granted_badge: "Ganhou %{link}" @@ -1191,6 +1210,7 @@ pt: reserved_username: "Esse nome de utilizador não é permitido." missing_user_field: "Não completou todos os campos de utilizador." close_window: "A autenticação está completa. Feche esta janela para continuar." + already_logged_in: "Oops, parece que tentou aceitar um convite para outro utilizador. Se não é o %{current_user}, por favor saia e tente novamente." user: no_accounts_associated: "Sem contas associadas" username: @@ -1199,8 +1219,8 @@ pt: characters: "pode incluir apenas números, letras e sublinhados" unique: "tem que ser único" blank: "tem que estar preenchido" - must_begin_with_alphanumeric: "tem que começar com uma letra ou número ou um sublinhado" - must_end_with_alphanumeric: "tem que terminar com uma letra ou número ou um sublinhado" + must_begin_with_alphanumeric_or_underscore: "tem de começar por uma letra, um número ou o carácter sublinhado" + must_end_with_alphanumeric: "tem de terminar com uma letra ou um número" must_not_contain_two_special_chars_in_seq: "não deve conter uma sequência de 2 ou mais caracteres especiais (.-_)" must_not_end_with_confusing_suffix: "não deve terminar com um sufixo confuso tal como .json ou .png etc." email: @@ -1209,6 +1229,13 @@ pt: ip_address: blocked: "Novos registos não são permitidos a partir do seu endereço IP." max_new_accounts_per_registration_ip: "Novos registos não são permitidos a partir do seu endereço IP (limite máximo atingido).Contacte um membro do pessoal." + flags_reminder: + flags_were_submitted: + one: "Sinalizações foram submetidas há 1 hora atrás. Por favor analise-as. " + other: "Sinalizações foram submetidas há %{count} horas atrás. Por favor analise-as. " + subject_template: + one: "1 sinalização à espera de ser tratada" + other: "%{count} sinalizações à espera de serem tratadas" unsubscribe_mailer: subject_template: "Confirme que não quer receber emails com actualizações de %{site_title}" text_body_template: | @@ -1262,23 +1289,37 @@ pt: (Se a hiperligação acima tiver expirado, escolha "Esqueci a minha palavra-passe" ao iniciar sessão com o seu endereço de email.) test_mailer: subject_template: "[%{site_name}] Teste de entrega de email" - text_body_template: "Este é um email de teste de\n\n[**%{base_url}**][0]\n\nA entrega do email é complicada. Aqui estão alguns pontos importantes a verificar primeiro:\n\n - *Certifique-se* que configurou o `email de notificação` de: endereço correto nas configurações do seu sítio. **O domínio especificado no endereço “de” nos emails que envia é o domínio que será validado**. \n\n- Conhecer como observar o código fonte dos emails no seu email cliente, de modo a que possa examinar cabeçalhos de email à procura de pistas importantes. No Gmail, é a opção “mostrar original” no menu drop down no canto superior direito de cada email.\n\n- **IMPORTANTE:** O seu ISP tem um registo de DNS inverso inserido para associar os nomes de domínio aos endereços IP de onde envia o seu email? [Teste o seu registo de PTR Inverso][2] aqui. Se o seu ISP não inserir o DNS inverso apropriado, é muito improvável que qualquer um dos seus emails seja entregue.\n\n- Estará o seu domínio [registo SPF][8] correto? [Teste o seu registo SPF][1] aqui. Note que TXT é o tipo de registo oficial para SPF. \n\n- Estará o seu domínio [registo DKIM][3] correto? Isto irá melhorar significativamente a entrega de emails. [Teste o seu registo DKIM][7] aqui.\n\n- Se correr o seu próprio servidor de email, certifique-se que os IPs do seu servidor de email não [estão em nenhuma lista negra de email] [4]. Verifique também que é enviado um nome de servidor qualificado que resolve o DNS na sua mensagem HELO. Se não for, isto irá fazer com que o seu email seja rejeitado por muitos serviços de email.\n\n(A maneira *fácil* é criar uma conta gratuita em [Mandrill][md] ou [Mailgun][mg] ou [Mailjet][mj], que tem vários planos de email gratuitos e será bom para pequenas comunidades. Irá precisar na mesma de configurar os registos SPF e o DKIM no seu DNS!) \n\nEsperamos que tenha recebido este teste de entrega de email sem problemas! \n\nBoa sorte, \n\nOs seus amigos em [Discourse](http://www.discourse.org)\n\n[0]: %{base_url}\n[1]: http://www.kitterman.com/spf/validate.html\n[2]: http://mxtoolbox.com/ReverseLookup.aspx\n[3]: http://www.dkim.org/\n[4]: http://whatismyipaddress.com/blacklist-check\n[7]: http://dkimcore.org/tools/dkimrecordcheck.html\n[8]: http://www.openspf.org/SPF_Record_Syntax\n[md]: http://mandrill.com\n[mg]: http://www.mailgun.com/\n[mj]: https://www.mailjet.com/pricing\n" + text_body_template: "Este é um email de teste de\n\n[**%{base_url}**][0]\n\nA entrega do email é complicada. Aqui estão alguns pontos importantes a verificar primeiro:\n\n- *Certifique-se* que configurou o `email de notificação` de: endereço correto nas configurações do seu sítio. **O domínio especificado no endereço “de” nos emails que envia é o domínio que será validado**.\n\n- Conhecer como observar o código fonte dos emails no seu email cliente, de modo a que possa examinar cabeçalhos de email à procura de pistas importantes. No Gmail, é a opção “mostrar original” no menu drop down no canto superior direito de cada email.\n\n- **IMPORTANTE:** O seu ISP tem um registo de DNS inverso inserido para associar os nomes de domínio aos endereços IP de onde envia o seu email? [Teste o seu registo de PTR Inverso][2] aqui. Se o seu ISP não inserir o DNS inverso apropriado, é muito improvável que qualquer um dos seus emails seja entregue.\n\n- Estará o seu domínio [registo SPF][8] correto? [Teste o seu registo SPF][1] aqui. Note que TXT é o tipo de registo oficial para SPF.\n\n- Estará o seu domínio [registo DKIM][3] correto? Isto irá melhorar significativamente a entrega de emails. [Teste o seu registo DKIM][7] aqui.\n\n- Se correr o seu próprio servidor de email, certifique-se que os IPs do seu servidor de email não [estão em nenhuma lista negra de email] [4]. Verifique também que é enviado um nome de servidor qualificado que resolve o DNS na sua mensagem HELO. Se não for, isto irá fazer com que o seu email seja rejeitado por muitos serviços de email.\n\n- Recomendamos vivamente que **envie um email de teste para [mail-tester.com][mt]** para verificar que tudo mencionado em cima está a funcionar correctamente.\n\n(A maneira *fácil* é criar uma conta grátis em [SendGrid][sg], [SparkPost][sp], [Mailgun][mg] ou [Mailjet][mj], que fornecem grátis, generosamente grátis, pacotes de envio de emails e será suficiente para pequenas comunidades. Irá precisar na mesma de configurar os registos SPF e o DKIM no seu DNS!)\n\nEsperamos que tenha recebido este teste de entrega de email sem problemas!\n\nBoa sorte, \n\nDos seus amigos em [Discourse](http://www.discourse.org)\n\n[0]: %{base_url}\n[1]: http://www.kitterman.com/spf/validate.html\n[2]: http://mxtoolbox.com/ReverseLookup.aspx\n[3]: http://www.dkim.org/\n[4]: http://whatismyipaddress.com/blacklist-check\n[7]: http://dkimcore.org/tools/dkimrecordcheck.html\n[8]: http://www.openspf.org/SPF_Record_Syntax\n[sg]: https://sendgrid.com/\n[sp]: https://www.sparkpost.com/\n[mg]: http://www.mailgun.com/\n[mj]: https://www.mailjet.com/pricing\n[mt]: http://www.mail-tester.com/\n" new_version_mailer: subject_template: "[%{site_name}] Nova versão Discourse, atualização disponível" - text_body_template: "Uma nova versão de [Discourse](http://www.discourse.org) está disponível. \n\nA sua versão: %{installed_version}\nNova versão: **%{new_version}**\n\nPode desejar: \n\n- Ver o que há de novo em [GitHub changelog](https://github.com/discourse/discourse/commits/master).\n\n- Atualizar a partir do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).\n\n- Visitar [meta.discourse.org](http://meta.discourse.org) para notícias, debates, e suporte para o Discourse.\n" + text_body_template: | + Hurra, uma nova versão do [Discourse](http://www.discourse.org) está disponível :) + + A sua versão: %{installed_version} + A nova versão: **%{new_version}** + + - Ver o que há de novo em [GitHub changelog](https://github.com/discourse/discourse/commits/master). + + - Atualizar a partir do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). + + - Visitar [meta.discourse.org](http://meta.discourse.org) para notícias, debates, e suporte para o Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] atualização disponível" - text_body_template: "Uma nova versão de [Discourse](http://www.discourse.org) está disponível. \n\nA sua versão: %{installed_version}\nNova versão: **%{new_version}**\n\nPode desejar: \n\n- Ver o que há de novo em [GitHub changelog](https://github.com/discourse/discourse/commits/master).\n\n- Atualizar a partir do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade).\n\n- Visitar [meta.discourse.org](http://meta.discourse.org) para notícias, debates, e suporte para o Discourse.\n\n### Release notes\n\n%{notes}\n" - flags_reminder: - flags_were_submitted: - one: "Estas sinalizações foram submetidas há 1 hora atrás." - other: "Estas sinalizações foram submetidas há %{count} horas atrás." - please_review: "Por favor examine-os." - post_number: "mensagem" - how_to_disable: 'Pode desativar ou mudar a frequência deste email notificativo através de "notify about flags after" nas configurações.' - subject_template: - one: "1 sinalização à espera de ser tratada" - other: "%{count} sinalizações à espera de serem tratadas" + text_body_template: | + Hurra, uma nova versão do [Discourse](http://www.discourse.org) está disponível :) + + A sua versão: %{installed_version} + A nova versão: **%{new_version}** + + - Ver o que há de novo em [GitHub changelog](https://github.com/discourse/discourse/commits/master). + + - Atualizar a partir do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). + + - Visitar [meta.discourse.org](http://meta.discourse.org) para notícias, debates, e suporte para o Discourse. + + ### Notas da versão + + %{notes} queued_posts_reminder: subject_template: one: "[%{site_name}] 1 mensagem à espera de revisão" @@ -1401,6 +1442,13 @@ pt: Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. A sua conta associada com este email não está activa. Por favor active a sua conta antes de enviar emails. + email_reject_blocked_user: + subject_template: "[%{site_name}] Problema de email -- Utilizador bloqueado" + text_body_template: |+ + Pedimos desculpa mas a sua mensagem de email %{destination} (titled %{former_title}) não funcionou. + + A sua conta associada com este endereço de email foi bloqueada. + email_reject_reply_user_not_matching: subject_template: "[%{site_name}] Problema de email -- Utilizador de resposta não encontrado" text_body_template: |+ @@ -1566,12 +1614,14 @@ pt: subject_pm: "[MP]" user_notifications: previous_discussion: "Respostas Anteriores" + in_reply_to: "Em Resposta A" unsubscribe: title: "Cancelar a Subscrição" description: "Não está interessado em receber estes emails? Não há problema! Clique em baixo para cancelar a subscrição instantaneamente:" reply_by_email: "[Consultar Tópico](%{base_url}%{url}) ou responda a este email para responder" - visit_link_to_respond: "[Consultar Tópico](%{base_url}%{url}) para responder" reply_by_email_pm: "[Consultar Mensagem](%{base_url}%{url}) ou responda a este email para responder" + only_reply_by_email: "Responda a este email para responder" + visit_link_to_respond: "[Consultar Tópico](%{base_url}%{url}) para responder" visit_link_to_respond_pm: "[Consultar Mensagem](%{base_url}%{url}) para responder" posted_by: "Publicado por %{username} em %{post_date}" user_invited_to_private_message_pm: @@ -1606,7 +1656,7 @@ pt: Por favor visite esta hiperligação para ver a mensagem: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} convidou-o para um tópico '%{topic_title}'" + subject_template: "[%{site_name}] %{username} convidou-o para '%{topic_title}'" text_body_template: |2 %{username} convidou-o para uma discussão @@ -1653,6 +1703,17 @@ pt: --- %{respond_instructions} + user_linked: + subject_template: "[%{site_name}] %{topic_title}" + text_body_template: | + %{header_instructions} + + %{message} + + %{context} + + --- + %{respond_instructions} user_mentioned: subject_template: "[%{site_name}] %{topic_title}" text_body_template: | @@ -1786,7 +1847,7 @@ pt: Se a hiperligação não for clicável, tente copiá-la e colá-la na barra de endereço do seu navegador de internet. page_not_found: - title: "A página que solicitou não existe ou é privada." + title: "Oops! Essa página não existe or é privada." popular_topics: "Popular" recent_topics: "Recente" see_more: "Mais" diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 5d7a53ac75..e335373c0c 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -27,6 +27,22 @@ pt_BR: purge_reason: "A conta não verificada, foi excluída." disable_remote_images_download_reason: "Download de imagens remotas foi desativado porque não havia espaço suficiente em disco disponível." anonymous: "Anônimo" + emails: + incoming: + default_subject: "Email recebido de %{email}" + errors: + empty_email_error: "Ocorre quando o email bruto recebido estiver em branco." + no_message_id_error: "Ocorre quando o email não possui cabeçalho 'id-mensagem'." + auto_generated_email_error: "Ocorre quando o cabeçalho 'precedência' estiver definido como: lista, lixo eletrônico, lote ou resposta_automática, ou quando outro cabeçalho contiver: enviado_automaticamente, respondido_automaticamente ou gerado_automaticamente." + no_body_detected_error: "Ocorre quando não foi possível extrair o corpo de texto e não havia anexos." + inactive_user_error: "Ocorre quando o remetente não está ativo." + blocked_user_error: "Ocorre quando o remetente foi bloqueado." + bad_destination_address: "Ocorre quando nenhum dos endereços de email nos campos Para/Cc/Cco era correspondente ao endereço de email recebido." + strangers_not_allowed_error: "Ocorre quando um usuário tentou criar um novo tópico em uma categoria da qual não é membro." + insufficient_trust_level_error: "Ocorre quando um usuário tenta criar um novo tópico em uma categoria de que não possui o nível de confiança necessário." + reply_user_not_matching_error: "Ocorre quando uma resposta chega em um endereço de email diferente ao da notificação enviada." + topic_not_found_error: "Ocorre quando uma resposta foi enviada mas o tópico relacionado foi excluído." + topic_closed_error: "Ocorre quando uma resposta foi enviada mas o tópico relacionado foi fechado." errors: &errors format: '%{attribute} %{message}' messages: @@ -150,6 +166,7 @@ pt_BR: rss_description: latest: "Últimos tópicos" hot: "Tópicos quentes" + top: "Principais tópicos" posts: "Últimos tópicos" too_late_to_edit: "Essa mensagem foi criada há muito tempo. Ela não pode mais ser editada ou apagada." excerpt_image: "imagem" @@ -678,7 +695,6 @@ pt_BR: min_private_message_title_length: "Comprimento mínimo de caracteres permitido para o título de uma mensagem" min_search_term_length: "Comprimento mínimo válido para o termo de pesquisa em caracteres" allow_uncategorized_topics: "Permitir criação de tópicos sem uma categoria. NOTA: Se existe algum tópico sem nenhuma categoria, você deve movê-los para uma categoria antes de desabilitar esta opção." - uncategorized_description: "A descrição da categoria Sem categoria. Deixe em branco para nenhuma descrição." allow_duplicate_topic_titles: "Permitir tópicos com títulos duplicados, idênticos." unique_posts_mins: "Quantos minutos antes para um utilizador poder criar uma postagem com o mesmo conteúdo outra vez?" educate_until_posts: "Quando o usuário começa a digitar suas primeiras (n) novos posts, mostrar o novo painel pop-up de educação do usuário no compositor." @@ -939,7 +955,6 @@ pt_BR: automatically_download_gravatars: "Fazer download de Gravatars dos usuários ao criar conta ou mudança de email." digest_topics: "O número máximo de tópicos a serem mostrados no resumo via email." digest_min_excerpt_length: "O excerto mínimo de post no resumo via email, em caracteres." - delete_digest_email_after_days: "Suprimir emails de resumo para usuários não vistos no site há mais do que (n) dias." disable_digest_emails: "Desabilitar emails de resumo para todos os usuários." max_daily_gravatar_crawls: "Número máximo de vezes que o Discourse irá checar o Gravatar por avatares personalizados em um dia" public_user_custom_fields: "Um conjunto de campos personalizados para um usuário que podem ser apresentados publicamente." @@ -1011,7 +1026,6 @@ pt_BR: moved_post: "%{display_username} moveu a sua postagem para %{link}" private_message: "%{display_username} enviou-te uma mensagem particular: %{link}" invited_to_private_message: "%{display_username} convidou-te para uma conversa privada: %{link}" - invited_to_topic: "%{display_username} convidou você para um tópico: %{link}" invitee_accepted: "%{display_username} aceitou o seu convite" linked: "%{display_username} linkou você em %{link}" granted_badge: "Você ganhou %{link}" @@ -1101,8 +1115,6 @@ pt_BR: characters: "deve incluir apenas números, letras e sublinhados" unique: "tem que ser único" blank: "tem que ser preenchido" - must_begin_with_alphanumeric: "deve começar com uma letra, número ou um underline" - must_end_with_alphanumeric: "deve terminar com uma letra, número ou um underline" must_not_contain_two_special_chars_in_seq: "não deve conter uma seqüência de 2 ou mais caracteres especiais (.-_)" email: not_allowed: "este provedor de emails não é permitido. Por favor utilize outro endereço de email." @@ -1110,6 +1122,10 @@ pt_BR: ip_address: blocked: "Novos registros não são permitidos a partir do seu endereço de IP." max_new_accounts_per_registration_ip: "Novos registros não são permitidos a partir do seu endereço de IP (quantidade máxima alcançada). Contate um membro da equipe." + flags_reminder: + subject_template: + one: "1 sinalização aguardando a ser controlada" + other: "%{count} sinalizações aguardando a ser controladas" invite_mailer: subject_template: "%{invitee_name} convidou você para '%{topic_title}' em %{site_domain_name}" text_body_template: | @@ -1153,87 +1169,10 @@ pt_BR: (Se o link acima expirou, escolha a opção "Esqueci minha senha" quando efetuar o login com o seu endereço de e-mail.) test_mailer: subject_template: "[%{site_name}] Teste de entrega de email" - text_body_template: | - Este é um email de teste de - - [**%{base_url}**][0] - - Entregabilidade de Email é complicada. Seguem algumas coisas importantes que você deve verificar primeiro: - - - Tenha *certeza* de definir o endereço de remetente `email de notificação` corretamente nas configurações do site. **O domínio especificado no endereço de remetente "from" dos emails enviados é o domínio que seus emails serão validados**. - - - Aprenda a verificar o conteúdo completo do email no seu cliente de email, para que possa examinar os cabeçalhos do email para pistas importantes. No Gmail, é a opção "mostrar original" no menu de seleção no canto superior direito de cada email. - - - **IMPORTANTE:** Seu provedor de internet (ISP) tem um registro de DNS reverso configurado para associar os nomes de domínio e os endereços de IP que você enviou os emails? [Testar seu registro reverso PTR][2] aqui. Se seu provedor (ISP) não entrou o registro de apontamento de DNS reverso apropriadamente, é muito improvável que qualquer email seja entregue. - - - O [registro SPF][8] de seu domínio está correto? [Teste seu registro SPF][1] aqui. Observe que TXT é o typo de registro correto para SPF. - - - O [registro DKIM][3] de seu domínio está correto? Isto irá melhorar significativamente a entregabilidade de email. [Teste seu registro DKIM][7] aqui. - - - Se você utiliza seu próprio servidor de email, verifique que os IPs de seu servidor de email [não estão em nenhuma lista negra][4]. Também verifique que está definitivamente enviando um nome de domínio totalmente qualificado resolvido por DNS em sua mensagem HELO. Se não estiver, irá fazer com que email seja rejeitado por muitos serviços de mail. - - (A maneira *fácil* é criar uma conta no [Mandrill][md] ou [Mailgun][mg] ou [Mailjet][mj], que tem generosos planos gratuitos e serão suficientes para comunidades pequenas. Entretanto você ainda terá que configurar os registros SPF e DKIM no seu DNS!) - - Esperamos que tenha recebido este email de verificação de entrega com sucesso! - - Boa sorte, - - Seus amigos do [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Nova versão do Discourse, atualização disponível" - text_body_template: | - Uma nova versão do [Discourse](http://www.discourse.org) está disponível. - - Sua versão: %{installed_version} - Nova versão: **%{new_version}** - - Você pode querer: - - - Veja o que há de novo na [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Atualização do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Visita [meta.discourse.org](http://meta.discourse.org) para notícias, discussão e apoio para Discourse. new_version_mailer_with_notes: subject_template: "[%{site_name}] atualização disponível" - text_body_template: | - Uma nova versão do [Discourse](http://www.discourse.org) está disponível. - - Sua versão: %{installed_version} - Nova versão: **%{new_version}** - - Você pode querer: - - - Veja o que há de novo na [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Atualização do seu navegador em [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Visita [meta.discourse.org](http://meta.discourse.org) para notícias, discussão e apoio para Discourse. - - ### Notas de lançamento - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Essas sinalizações foram submetidos mais de 1 hora." - other: "Essas sinalizações foram submetidos mais de %{count} horas." - please_review: "Por favor, revise eles." - post_number: "mensagem" - how_to_disable: 'Você pode desabilitar ou modificar a frequência deste lembrete de email através da configuração "notificar sobre sinalizações após".' - subject_template: - one: "1 sinalização aguardando a ser controlada" - other: "%{count} sinalizações aguardando a ser controladas" queued_posts_reminder: subject_template: one: "[%{site_name}] 1 mensagem aguardando revisão" @@ -1343,8 +1282,6 @@ pt_BR: text_body_template: "Nos desculpamos, mas sua exportação de dados falhou. Por favor verifique os logs ou entre em contato com um membro da staff." email_reject_no_account: subject_template: "[%{site_name}] Problema com Email -- Conta Desconhecida" - text_body_template: | - Lamentamos, mas o seu e-mail para%{destination} (intutulado %{former_title}) não funcionou. Não há nenhum relato conhecido com este endereço de e-mail. Tente enviar a partir de um endereço de e-mail diferente, ou entre em contato com um membro da equipe. email_reject_empty: subject_template: "[%{site_name}] Problema com email -- Sem conteúdo" email_reject_parsing: @@ -1357,10 +1294,6 @@ pt_BR: Sua conta não possui privilégios para postar novos topicos nessa categoria. Se acredita que isso esteja errado, entre em contato com um dos membros responsáveis.. email_reject_reply_key: subject_template: "[%{site_name}] Problema com email -- Chave de Resposta Desconhecida" - text_body_template: | - Pedimos desculpas, mas seu email para %{destination} (titled %{former_title}) não foi enviado. - - O endereço de email do destinatário é desconhecido ou inválido, Contate um dos moderadores para relatar esse problema email_reject_topic_not_found: subject_template: "[%{site_name}] Problema com email -- Tópico Não Encontrado" email_reject_topic_closed: @@ -1369,10 +1302,6 @@ pt_BR: subject_template: "[%{site_name}] Problema com email -- Resposta Gerada Automaticamente" email_error_notification: subject_template: "[%{site_name}] Problema com email -- Erro de autenticação POP" - text_body_template: | - Erro de autenticação ao baixar e-mails através do servidor POP. - - Por favor verifique se você configurou corretamente suas credenciais de POP nos [ajustes](%{base_url}/admin_site_settings/category/email). too_many_spam_flags: subject_template: "Nova conta bloqueada" text_body_template: | @@ -1430,7 +1359,6 @@ pt_BR: Por favor visitar este link para visualizar a mensagem: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} convidou você para um tópico '%{topic_title}'" text_body_template: |2 %{username} convidou você para uma discussão @@ -1524,7 +1452,6 @@ pt_BR: Se não conseguires clicar no link em cima, tenta copia-lo e cola-lo na barra de endereções do seu browser de internet. page_not_found: - title: "A página solicitada não existe ou é privativa." popular_topics: "Popular" recent_topics: "Recente" see_more: "Mais" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 9ace863499..3e7c894916 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -25,6 +25,9 @@ ru: purge_reason: "Автоматически удален, как неактивная, неактивированная учетная запись" disable_remote_images_download_reason: "Загрузка картинок была отключена из-за недостаточности места на диске." anonymous: "Гость" + emails: + incoming: + default_subject: "Входящее письмо от %{email}" errors: &errors format: '%{attribute} %{message}' messages: @@ -41,8 +44,10 @@ ru: exclusion: зарезервировано greater_than: должно быть больше чем %{count} greater_than_or_equal_to: должно быть больше или равно %{count} + has_already_been_used: "уже было использовано" inclusion: не включен в список invalid: неверный + is_invalid: "- неверно; попробуйте описать подробнее." less_than: должен быть меньше %{count} less_than_or_equal_to: должен быть меньше или равен %{count} not_a_number: не число @@ -90,6 +95,7 @@ ru: not_found: "Запрашиваемая страница или ресурс не найден." invalid_access: "У вас нет прав для просмотра запрашиваемого ресурса." read_only_mode_enabled: "Сайт в режиме только для чтения. Взаимодействия отключены." + reading_time: "Время на прочтение" likes: "Лайков" too_many_replies: one: "Извините, новые пользователи могут оставлять только один ответ к теме." @@ -119,6 +125,30 @@ ru: few: "Извините, но вы можете упоминать только %{count} пользователей в сообщении." many: "Извините, но вы можете упоминать только %{count} пользователей в сообщении." other: "Извините, но вы можете упоминать только %{count} пользователей в сообщении." + no_mentions_allowed_newuser: "Извините, новые пользователи не могут упоминать других пользователей." + too_many_mentions_newuser: + one: "Извините, новые пользователи могут упоминать только одного пользователя в каждом сообщении." + few: "Извините, новые пользователи могут упоминать только %{count} пользователей в сообщении." + many: "Извините, новые пользователи могут упоминать только %{count} пользователей в сообщении." + other: "Извините, новые пользователи могут упоминать только %{count} пользователей в сообщении." + no_images_allowed: "Извините, новые пользователи не могут прикреплять изображения." + too_many_images: + one: "Извините, новые пользователи могут прикреплять только одно изображение к сообщению." + few: "Извините, новые пользователи могут прикреплять только %{count} изображений к сообщению." + many: "Извините, новые пользователи могут прикреплять только %{count} изображений к сообщению." + other: "Извините, новые пользователи могут прикреплять только %{count} изображений к сообщению." + no_attachments_allowed: "К сожалению, загрузка файлов недоступна новым пользователям." + too_many_attachments: + one: "К сожалению, новые пользователи могут добавить только одно вложение в сообщение." + few: "К сожалению, новые пользователи могут добавить только %{count} вложений в сообщение." + many: "К сожалению, новые пользователи могут добавить только %{count} вложений в сообщение." + other: "К сожалению, новые пользователи могут добавить только %{count} вложений в сообщение." + no_links_allowed: "Извините, новые пользователи не могут размещать ссылки." + too_many_links: + one: "Извините, новые пользователи могут размещать только одну ссылку в сообщении." + few: "Извините, новые пользователи могут размещать только %{count} ссылок в сообщении." + many: "Извините, новые пользователи могут размещать только %{count} ссылок в сообщении." + other: "Извините, новые пользователи могут размещать только %{count} ссылок в сообщении." spamming_host: "Извините, вы не можете разместить ссылку в этом сообщении." user_is_suspended: "Заблокированным пользователям запрещено писать." topic_not_found: "Что-то пошло не так. Возможно, эта тема была закрыта или заархивирована, пока вы ее читали?" @@ -150,6 +180,8 @@ ru: errors: can_not_modify_automatic: "Нельзя изменять автоматическую группу." member_already_exist: "'%{username}' уже является членом этой группы." + invalid_domain: "'%{domain}' является некорректным доменом." + invalid_incoming_email: "'%{incoming_email}' является некорректным адресом электронной почты." default_names: everyone: "все" admins: "администраторы" @@ -267,6 +299,8 @@ ru: body: "\nПоздравляем! :confetti_ball:\n\nЕсли вы видите данное сообщение, вы достигли уровня **regular** (уровень доверия 3).\n\nУвас появились новые возможности …\n\n* Вы можете редактировать заголовок любого обсуждения\n* Вы можете менять категорию обсуждения\n* С ваших ссылок снимается ограничения nofollow ([automatic nofollow](http://en.wikipedia.org/wiki/Nofollow) is removed)\n* Вы получили доступ к закрытым категориям, которые доступны только для уровня доверия 3 и выше \n* Вы можете скрывать нежелательные сообщения в один клик\n\nС полным списком привелегий вы можете ознакомиться тут [current list of fellow regulars](/badges/3/regular). Пожалуйста прочитайте это.\n\nСпасибо Вам за то что являетесь важным членом нашего сообщества!\n\n(Для получения более детальной информации об уронях доверия посмотрите тут [see this topic][trust]. Напоминаем что данный уровень доверия сохраняется до тех пор пока вы придерживаетесь этих правил.)\n\n[trust]: https://meta.discourse.org/t/what-do-user-trust-levels-do/4924\n" category: topic_prefix: "Описание раздела %{category}" + replace_paragraph: "(Замените первый параграф лаконичным описанием новой категории. Данное описание будет отражено в области выбора категории, поэтому желательно ограничиться 200 символами. ** Пока вы не измените данное описание или создадите темы, данная категория не появится на странице категорий.**)" + post_template: "%{replace_paragraph}\n\nИспользуйте следующий текст для подробного описания или для определения правил раздела:\n\n- Почему нужно использовать этот раздел? Зачем он?\n\n- Насколько раздел отличается от ранее созданных?\n\n- Что должны содержать темы в этом разделе?\n\n- Действительно ли нужен этот раздел? Можем ли мы объединить его с другой категорией или подкатегорией?\n\n" errors: uncategorized_parent: "Разделу для тем вне разделов нельзя назначать родительский раздел." self_parent: "Подраздел не может быть родительским для самого себя." @@ -701,7 +735,6 @@ ru: max_topic_title_length: "Максимально допустимое количество символов в названии темы." min_private_message_title_length: "Минимально допустимое количество символов в заголовке сообщения в беседе." min_search_term_length: "Минимальное количество символов в поисковом запросе." - uncategorized_description: "Описание раздела для тем \"без раздела\". Будет скрыто есть оставить пустым." allow_duplicate_topic_titles: "Разрешить создание тем с одинаковыми названиями." unique_posts_mins: "Количество минут до того, как пользователь сможет разместить сообщение с тем же содержанием." educate_until_posts: "Количество первых сообщений новых пользователей, для которых необходимо показывать всплывающую подсказку с советами для новичков." @@ -955,7 +988,6 @@ ru: automatically_download_gravatars: "Скачивать аватарку Gravatar пользователя во время создания учетной записи или изменения e-mail." digest_topics: "Максимальное количество тем в письме - сводке новостей." digest_min_excerpt_length: "Минимальная длина (в символах) вытяжки из сообщения в письме - сводке новостей." - delete_digest_email_after_days: "Не рассылать новости для пользователей, которые не заходили на сайт в течении (n) дней." disable_digest_emails: "Отключить рассылку новостей для всех пользователей." detect_custom_avatars: "Проверять ли, что пользователи загрузили свои собственные картинки профиля (аватарки)." max_daily_gravatar_crawls: "Максимальное количество загрузок аватаорок с Gravatar за один день" @@ -1025,7 +1057,6 @@ ru: moved_post: "%{display_username} перенес ваш пост в тему %{link}" private_message: "%{display_username} написал вам сообщение: %{link}" invited_to_private_message: "%{display_username} пригласил вас обсудить сообщение: %{link}" - invited_to_topic: "%{display_username} пригласил вас поучаствовать в беседе: %{link}" invitee_accepted: "%{display_username} принял ваше приглашение" linked: "пользователь %{display_username} упомянул вас в %{link}" granted_badge: "Вы награждены: %{link}" @@ -1143,6 +1174,12 @@ ru: ip_address: blocked: "Новые регистрации запрещены с вашего IP-адреса." max_new_accounts_per_registration_ip: "Новые регистрации запрещены с вашего IP-адреса (достигнут лимит регистраций). Свяжитесь с администрацией." + flags_reminder: + subject_template: + one: "1 жалоба ожидает рассмотрения" + few: "%{count} жалобы ожидают рассмотрения" + many: "%{count} жалоб ожидают рассмотрения" + other: "%{count} жалоб ожидают рассмотрения" invite_mailer: subject_template: "%{invitee_name} приглашает вас присоединиться к '%{topic_title}' на сайте %{site_domain_name}" text_body_template: | @@ -1186,88 +1223,10 @@ ru: Если срок действия этой ссылки истек, нажмите на кнопку "Войти", а затем "Я забыл свой пароль" и введите ваш e-mail. test_mailer: subject_template: "[%{site_name}] Проверка доставки писем" - text_body_template: | - Это тестовое письмо - - [**%{base_url}**][0] - - Доставка почты это комплексная задача. Вот некоторые вещи которые необходимо проверить: - - - *Убедитесь* в том что в поле От: указан домен, который указан в настройках сайта `email для уведомлений`. ** Проверьте так же что домен указанный в поле "От" вашего письма это тот же домен на котором расположен сайт**. - - - Для этого вам необходимо знать, как посмотреть заголовки письма в почтовом клиенте. в Gmail, это вариант "показать оригинал" в выпадающем меню в правом верхнем углу каждого сообщения. - - - **ВАЖНО:** Проверьте настроена ли reverse DNS запись для связи IP c деменным именем у вашего провайдера. [проверьте Reverse PTR record][2] тут. - Если ваш провайдер не правильно указывает reverse DNS запись то скорее всего доставка почты не будет работать. - - - Указана ли для вашего домена [SPF запись][8] правильно? [Протестировать вашу SPF запись][1] вы можете тут. Помните что TXT это правильный официальный тип для записи SPF. - - - Указанна ли для вашего домена [DKIM запись][3] правильно? Это невероятно увеличивает шансы на доставку вашей почты. [Протестировать DKIM запись][7] пожно тут. - - - Если вы используете для рассылки собственный почтовый сервер, проверьте и убедитесь в том что IP вашего почтового сервера не попал в [черные списки][4]. Также проверьте что корректно отправляется полное имя хоста, который разрешен в DNS в поле HELO сообщения. В противном случае многие почтовые сервисы откажутся принимать ваши письма. - - (Самый *простой* путь это создать бесплатный аккаунт на [Mandrill][md] или [Mailgun][mg] или [Mailjet][mj], и выбрать бесплатный план, который отлично подойдет для малиньких сообществ. Вам также придется указать SPF и DKIM запись в настройках вашего DNS!) - - Мы надеимся что Вы получили данное тестовое сообщение! - - Удачи вам во всем, хорошего настроения, - - Ваши друзья на [Discourse](http://www.discourse.org) - - [0]: %{base_url} - [1]: http://www.kitterman.com/spf/validate.html - [2]: http://mxtoolbox.com/ReverseLookup.aspx - [3]: http://www.dkim.org/ - [4]: http://whatismyipaddress.com/blacklist-check - [7]: http://dkimcore.org/tools/dkimrecordcheck.html - [8]: http://www.openspf.org/SPF_Record_Syntax - [md]: http://mandrill.com - [mg]: http://www.mailgun.com/ - [mj]: https://www.mailjet.com/pricing new_version_mailer: subject_template: "[%{site_name}] Ихууу, доступна новая версия Discourse!" - text_body_template: | - Доступна новая версия [движка вашего форума](http://www.discourse.org). - - Ваша версия: %{installed_version} - Новая версия: **%{new_version}** - - - Узнать, что нового (на английском) - на сайте [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Обновить движок прямо из браузера - по ссылке [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Посетить сайт [англоязычного сообщества Discourse](http://meta.discourse.org), где можно почитать новости и задать вопросы. new_version_mailer_with_notes: subject_template: "[%{site_name}] новые обновления" - text_body_template: | - Доступна новая версия [движка вашего форума](http://www.discourse.org). - - Ваша версия: %{installed_version} - Новая версия: **%{new_version}** - - - Узнать, что нового (на английском) - на сайте [GitHub changelog](https://github.com/discourse/discourse/commits/master). - - - Обновить движок прямо из браузера - по ссылке [%{base_url}/admin/upgrade](%{base_url}/admin/upgrade). - - - Посетить сайт [англоязычного сообщества Discourse](http://meta.discourse.org), где можно почитать новости и задать вопросы. - - ### Что новенького - - %{notes} - flags_reminder: - flags_were_submitted: - one: "Эти жалобы были отправлены более 1 час назад." - few: "Эти жалобы были отправлены более %{count} часов назад." - many: "Эти жалобы были отправлены более %{count} часов назад." - other: "Эти жалобы были отправлены более %{count} часов назад." - please_review: "Пожалуйста, рассмотрите их" - post_number: "сообщение" - how_to_disable: 'Вы можете отключить или изменить частоту получения данных писем в настройках "уведомлений"' - subject_template: - one: "1 жалоба ожидает рассмотрения" - few: "%{count} жалобы ожидают рассмотрения" - many: "%{count} жалоб ожидают рассмотрения" - other: "%{count} жалоб ожидают рассмотрения" queued_posts_reminder: subject_template: one: "[%{site_name}] 1 сообщение ожидает проверки" @@ -1397,12 +1356,6 @@ ru: text_body_template: "Мы сожалеем, но возникли неполадки с экспортом ваших данных. Свяжитесь с администратором сайта." email_reject_no_account: subject_template: "[%{site_name}] Неполадки с письмом - не найдена учетная запись" - text_body_template: | - К сожалению, ваше письмо к %{destination} (под названием %{former_title}) не может быть обработано. - - Мы не смогли найти учетную запись с электронным адресом, с которого пришло ваше письмо. - - Попробуйте отправить с другого почтового ящика, или, если вы считаете, что произошла ошибка, свяжитесь с персоналом - модератором или администратором. email_reject_empty: subject_template: "[%{site_name}] Неполадки с письмом - отсутствует текст" email_reject_parsing: @@ -1423,16 +1376,8 @@ ru: Если вы считаете, что произошла ошибка, свяжитесь администратором сайта. email_reject_reply_key: subject_template: "[%{site_name}] Системное сообщение -- Неизвестный ключ для ответа" - text_body_template: | - К сожалению, ваше письмо к %{destination} (под названием %{former_title}) не может быть обработано. - - Ключ ответа неверный, поэтому мы не можем определить, кому адресован ваш ответ. Пожалуйста, свяжитесь с персоналом (модератором или администратором). email_reject_topic_not_found: subject_template: "[%{site_name}] Системное сообщение -- Тема не найдена" - text_body_template: | - К сожалению, ваше письмо к %{destination} с заголовком %{former_title} не может быть обработано. - - Тема, в которую вы пишите, не существует. Возможно, она была удалена. Если вы считаете, что произошла ошибка при обработке письма, обратитесь к модератору или администратору. email_reject_topic_closed: subject_template: "[%{site_name}] Неполадки с письмом - Топик закрыт" text_body_template: | @@ -1441,18 +1386,8 @@ ru: Тема, в которую вы пишите, была закрыта, и поэтому новые сообщения не разрешены. Если вы считаете, что произошла ошибка при обработке письма, обратитесь к модератору или администратору. email_reject_auto_generated: subject_template: "[%{site_name}] системное сообщение - Автоматически сгенерирован ответ" - text_body_template: | - К сожалению, ваше письмо к %{destination} с заголовком %{former_title} не может быть обработано. - - Система обнаружила, что оно было сгенерировано автоматически, а такие письма не допустимы для автоматической отправки сообщений в форуме через электронную почту. - - Если вы считаете, что произошла ошибка при обработке письма, обратитесь к модератору или администратору. email_error_notification: subject_template: "[%{site_name}] Системное сообщение -- ошибка POP аутентификации" - text_body_template: | - При получении почты с почтового POP сервера, была обнаружена ошибка. - - Убедитесь в том что аутентификация для POP сервера настроена правильно в [the site settings](%{base_url}/admin/site_settings/category/email). too_many_spam_flags: subject_template: "Новый аккаунт заблокирован" text_body_template: | @@ -1518,7 +1453,6 @@ ru: Просмотреть сообщение вы можете по ссылке: %{base_url}%{url} user_invited_to_topic: - subject_template: "[%{site_name}] %{username} Приглашает вас к обсуждению темы: '%{topic_title}'" text_body_template: |2 %{username} приглашает вас к обсуждению @@ -1624,7 +1558,6 @@ ru: Если данная ссылка не работает, попробуйте скопировать её и вставить в строку адреса вашего браузера. page_not_found: - title: "Запрашиваемая страница не существует или необщедоступна." popular_topics: "Популярные" recent_topics: "Недавние" see_more: "Еще" diff --git a/plugins/poll/config/locales/client.ko.yml b/plugins/poll/config/locales/client.ko.yml index e2b5da05e1..52454181ce 100644 --- a/plugins/poll/config/locales/client.ko.yml +++ b/plugins/poll/config/locales/client.ko.yml @@ -15,6 +15,12 @@ ko: average_rating: "평균: %{average}." multiple: help: + at_least_min_options: + other: "적어도 %{count}개의 옵션은 선택해야 합니다." + up_to_max_options: + other: "옵션은 %{count} 개까지 선택할 수 있습니다." + x_options: + other: "옵션은 %{count} 개 선택해야 합니다." between_min_and_max_options: "%{min}개에서 %{max}개까지 선택할 수 있습니다." cast-votes: title: "표 던지기" From 090a064c4151dcc7aaa7c6ad38558eb9ec6aa51e Mon Sep 17 00:00:00 2001 From: Neil Lalonde Date: Mon, 7 Mar 2016 10:37:00 -0500 Subject: [PATCH 245/245] Version bump to v1.5.0.beta12 --- lib/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/version.rb b/lib/version.rb index 881f27a2c1..ab7cf56dfa 100644 --- a/lib/version.rb +++ b/lib/version.rb @@ -5,7 +5,7 @@ module Discourse MAJOR = 1 MINOR = 5 TINY = 0 - PRE = 'beta11' + PRE = 'beta12' STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.') end

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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/speaking_head.png b/public/images/emoji/apple/speaking_head.png new file mode 100644 index 0000000000000000000000000000000000000000..b25c49724be3195011f789bec1c7abe79d8a3c81 GIT binary patch literal 3640 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/spy.png b/public/images/emoji/apple/spy.png new file mode 100644 index 0000000000000000000000000000000000000000..9cd898d6c120cf4cbd16ecf601ef2d539d45c761 GIT binary patch literal 7834 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/stadium.png b/public/images/emoji/apple/stadium.png new file mode 100644 index 0000000000000000000000000000000000000000..342032abbd4dbdd96a66eae3a86b8b9d3510a117 GIT binary patch literal 6065 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/star_and_crescent.png b/public/images/emoji/apple/star_and_crescent.png new file mode 100644 index 0000000000000000000000000000000000000000..77fd9928d9f4ba7b519deabb026f481c788b5ed1 GIT binary patch literal 5723 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�#BW_jrZPnBCU%u0H`F`(YmQ%d~dyO zb-}nCH|Jbn+Ewgf>Ra0qDO=lz){QY2(gd_0mFBsJcJsphRx%NloxmuR5$9!MP;R%A zidW;%1DBAv9{%$A>nQClTV9aqPSUm{!{~-duKU=-yydDF)>n?KtVoQ>8W3>(xO2fY z4*{1poS%Y_?np53&s*!R_oX@s|&^ajp;{WbjN(kuANOJ2_w z*$$D1hyo>X$xsSJfuK;XHqH>ko*QEYFO63z=c@!c-&OzzP&3AE74GtynUe^Ci7k$( z*fzKkMP^=tyMFW(%TMehkqu~s)6e}b``rB+&byj7BdiLWKbUadi-;j=Xk_0=G8A54rL8Y5)76O3)0;?{3I#$4!0F6E{>e#7bB z4>|jewJh^j5F|8434n{#`0}4)tbq38LIET0 z9E315bgay=?##`sJ8Khj;fQ@-!~;*B$%XAd;oG>u*0@BNJ{9=w$OIe^1^k7r?f2dPx6rNSaYp;BV1G|r|y8+bH-FMHU; z@>d?lYkOZy`l*O=SOcw?6;}Azxf8od6>w4MyaA_8;=3-P*fNBIYd-xTqnjpq$=45N zE_~{pU*{w5{0x6T{~z3V#ab@7^Ec>iFka4(0wQb-)7Dxfy`+_6U%P@6PW>4B?K+ap z=Z&$wyqh5Hqv~r23K40@|6NA3&u!uXLgZX!I_7Oxu`P7vo?SB}+XDOA+}*!;njH@e zbNuHHVEK#Z(+CN&eEhASwnx6Qo9#op*tB^AV`F0|t?6I6go6%TLkII=M05YowsO-s zkD}X!Oh?*Q0j33y?JT>|#pVMdD0hFO$xt*XA}gkacRZWM`*$czWEmVi2edJ;Zj_7P zwU&KfxtKL??01T2fYxL$2QK}e<4_!6?z|BLk)nNRhOlCI>e4MdbLBP`9MVPqaXlH9IBFbSACEwbqCc`y2(X|5;QZv$Wl}{n*!li>7dYV+Dl8 zYo}_HpKI}3tXKw(cGiw*THJho`c#SAoiSKsyOZ|7E~g2@&*!bs7(tZ!_p33QMAo;t z#95g7vbu^}8&|5e!Wzq&U0irF%@qs^n5<4v3`^HER6sSV-acI3JJ_4*n{O>|=i45{ zOQF*>#wZjZ%JpqA73*ULBLH%%CcKnan!>4$Qi)e&!tvrK&O^@b>WfV&@i#Lks+0xIPc zTK}Ev166l>7x$5gSU<60V0U@wHAydkxtGMiQyzgfdp1pNd=X0By1I2`SJF$^2PqUv zDfdQ)Qm8rh-9%z(Qz=}4iX$^L&?a%EIhTpQ_v4grz*aCtDJ=8c#QI%Z3!7h((0;+g zM-UqRzrd*r-cu(xAqHbu*q2`T&tK0Cunv3X z*c~qUp+H%kDnbbvF70K@)V3>!%7gFs6eEH1>cZbJa7H5!aB0m~9%#L5s5Erycy0Xc z^HaT_pO>0}}SPV;dm7?NZH51++Xpf{$Vh9nTA^z{b$N3M({{uDWOs>6Dk@f%p N002ovPDHLkV1l#d0v-SW literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/star_of_david.png b/public/images/emoji/apple/star_of_david.png new file mode 100644 index 0000000000000000000000000000000000000000..82bc00d3ffe0325c387c014899c33ef4e3c69bd8 GIT binary patch literal 5695 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/stop_button.png b/public/images/emoji/apple/stop_button.png new file mode 100644 index 0000000000000000000000000000000000000000..99258e0249aad63a5321be709a955699b2b3d2ca GIT binary patch literal 3737 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 Rlv)4)002ovPDHLkV1ntb3xfav literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/synagogue.png b/public/images/emoji/apple/synagogue.png new file mode 100644 index 0000000000000000000000000000000000000000..9aec9500ca68b809f1dd7ddfde8877bf9af8f3c4 GIT binary patch literal 5436 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�tO5l6+Ue@r6MdWidbH)hKaIDB+tYOU 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 RW_tht002ovPDHLkV1gXaD!%{# literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/ten.png b/public/images/emoji/apple/ten.png new file mode 100644 index 0000000000000000000000000000000000000000..68ae72c0f7a8bfdebc22e3b0f81d12ca3600051c GIT binary patch literal 3496 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 W7x+gUs8}2T0000!K|bG~o?ZLX(X{*~PBwPHVO z>wVXWs48#eFubMXF@VPaeEx^xTfXI69!=acblUBAsaG4HHC7ofIaO`d>+QK=Z~L}k0`TZCMrbw~UmbHJHQ#QRl; z9Kho7>YT$`_gOo3Zlh2vapdR;q9_EQm!?!ECV6h#4*v5$|LwD_wfjZPXaUHxobp&@ z-U}kG-MGQT_&8(b5&#W^>(_6f#xPc?%y-*O{2&;10FF0?wHZ+q;rSuO(iqdz)0Bz{ z06`Sf&mGlz>%nuh)mXsuz0v9cs*3SES16Y$l}jW^Occimf>kJwm8n!JgXcJ>F#J7$ zMH!$7!rb%(%a+VgN+JMq>oCUP`#wP!V8jeyDI?Ydt+T{&f@D2T9XW~)+8-pOkame*sx7oLEAMJLB5Bcy982~^8WKq_S9sp>yTC82Ynk`Q~O>v?^ zA@BwzfGPm0Zg7%O1)y)(2t5=41Qc-2k!Shf(ug3VD24>VT1&s*r`PM_tV0k`9sKZq zzlXCHjDYZ_(+FgMqN*fGf$_;HqS(i&Vx2=(aW*H*GOSZX3?Rc@0wNC!A>Z@3apMN( zUV4$r)FhiXZzS;j0e}Gvn*$C52#gj0&olVJ1Lb##LkADCeB~-O+y@W>sG<)}PC-Xx z3M^K%{mhbOIq$GzJMZ)!?@lsNAprm+2vF-r-w{#;&-XE76`Ftk`&|FH_on*uKLT-x z6cRv3dk+v4J3fWkzYG1b@1kG3M{n=HQ=VLc|G^)RoH{+i02CAPNoEo&2+&Z?*KgH7eZMb%pMyEj!@QeT;0xF;kPNTO70n{5U zDvc(7mSeGa#$d#N0Hdx30Wbo_N1O!|u3^0MJogg>9a*;kli>ZLdc8+A$Ji z=s5*r;I(p)QI*55EJCF*mQ7SB`Oq{5ryyAd4n$;Rw7{c71l#Y^PJ2j}W1Yh@9)7cd z_WEGF0R&V>)Dm+_Tq-eDE>UzTf`aFxoi_A)7|%mS%@9#lUbDshAiMVbSxy}~PALu8 zsmi!0?FT;|B@82+;vViLLkHl^9bJThBiu{7g-aJ-oB8M6jgY zj;eEr00_pIAuj<{+O5`1acttBS8dv~J^8xroB2drr`$_X@i4cqLE2$z>paVr zEq$k6mVH&8=ZFjd3{FD}pwnqjjZe?)djAjo@OOK!5B@+l)UFfn-vyN^uog;Xq6;rD z`%Rz6(zMCDf68aEe&d$!Pt)`}^%Z%ns>26BL>{Cw#j(ntz3&Ho$ojY0{w(9QD#0KA z7C414LahZ9;sViu|77aRK9R|Gop=3&PvMDGtG}V$>3;UmP61~vihTBSJKy#lo_hL8 zf_feK{a=DKLoH~%3ck-E&9j{DDMLAd+J7JNs!m!!Tw*nx-t7 zoBPtIckUzs_=`V)G({UtggSvUCqNWTh*R7~hS`7HMMA-tC^vf=6H zD3nSc)bD2-h7Ld!$8WpziIpS(XO5#z;p%m0r{EW$>mXHd0xC#u2t%J})p~LQ+9!`t zo}FQGYWg{K?(K$d4=9w&^X1tkaPKbm)=k7IEL6e9;C#px1W-T}%>_+8g2_4h*PFC% z-l7Vuyl#fq&mikU-UAd65CQ9Oen77{L0TFk1F!=d z4OMkR2cXexo~3$^Xv2E$;t?<0Aq*@cHKcbJ`b|W0R1GQtw(n>yn;`c*>bGuTHf*8W zZd0q*)#mo((Di_B+WpVl7tcc&&|9~e#?{O8aAbuDTL{o3!bSH_Nl0dLn&l$dyS*pf zTAkLtdrZ9T+p}=>3iaB;ao?DOLkA%7f`2`B_UxJaAej2lk7U75Sh#kRRx&}aJVSr% z{;4uUTBwjt&XK>v`(bC7bK}qcgu=VO7yYSeP9Hvm&9Xla!tl({0Vos;T)ler$NuUs z{+f7ZhS@LqYHqxAfm`PT~6%e;hae6qS$u1djd7KXd;4 z3wM$@`3cXMAyk7#D8%ac%JvZ)E*YEhC4`F8h zX&S%wi}X&PB&$_%UVy)D1MvrZFn04+PVC#u@x8n0bvxfxEEIo!Sp9(4AVhI;uh;Fq z!_mFFfA8+~tM9gE+jgcu<+JhAE?%>NI!DX*xx7&2(jWXDH?LhmocoGGlKij&GVGq< z074Sqv3dUPmoJ|Gfa}+;enX*Le!I9_!3%@IobS}@_fOT1weGhHaq^vk?_IXeAu=MS zs494#PaK)QvexczRjVJ_T&QkSbXp-3xa@oW-zCN5?>*1MS}4~o>1cV6?PWebGyKcDhBY(EGLsBq9>GY% z&`?#G@k>|l|LeV(XU~CsobSbp!mf-jA|o@avqV+-pIi+8lgs}C_+J433m{-b>HNwB zMi(#&22cerAgTz0%g+G{2u>7K5T9MAo*72i6~nF)$WBINHkN53v;m;>s?+t}vvP}G zs9qPKEWps=tw97-!2%-S6+DWHU;qFWFbV)(0O5Vhq;GfS0QiuLDyUbCXIEo5%|vpv zEt8$q zSN(JpnTvuZd!%W!*v1f36fkw5ikK7;0kI$g0IH}u@QM-;Py$zI)EbAn;p9*^;(MkszRxynwf(Z?T!~RIu7ay4pxZh8!?wd}yn?U|!0eA&T zb;l@_AB5wAlY;R@q%0VEkTAlu?Tn1y2Wi_C$~!=D5(H&1A>aW81c6NZ1kwsp+XzF; z(Y^&p*UMYE3B~?XI{dc_2yjk9;7Djr<1y@D8l^mxay2UqzD(1=Ci* zm_AG($dsdzX(uCXdqZgoXbR~txM4{80ssD;lCe;n0FASeDaT@K8`0iZ(T)eu&S#J& zk2JPno9ib9owcLm0e7u4a)Si&?*l*q5+yL)RG1uH987J%Gs{%- zNvfBq738A?pa3bQAdm-&Q^F&Hsbx%9L2QiO?lNdUAA%;Rtp^`x-bBgl6VTjP$knLh zSA+)xD=c|DMygR}>dUYKw&vRfLEtZkFe-7nsVfbB;001EOw&eK^Mtd6(0Py6;M&}7ew+@BD z_n>iGWamG}yz^)HT9sf*8T{a(+7aKDIxfI|7!jagybavT*M zn$@9o4`lkun2!6<#&LvG9a{4@Rr}qeK9mmmmjE#2m#b64NbU?Lhhmyb7*j) zqymM>F#aG+lZBS@NG)9U6wl&1|rC&(v{vNS{ zGWIwCqq;*-HU~*_goGht6~bn)LFRq$AP|^6kqvLJ<)=44&4O3o!_}0cfX3i~VF%B= zFu-mH?!l}*r$J8z#JqnWsX!s1o15lfpmi9CVC~`!Jp0(I{Q9TkIsVN3 zIpMthAO<=IAh6km#zNSHB;A-O#5ae8<@lhq=666?Dq{nHz{+{HIlvSGj19m#utiV@ zt_G2X8RK~Jm-D#g#}6a*l*vs{XoI$yQ1}ZMAy7MvH7mPVFz;pFd+Z4sS9i1ExfOin@>{w7Z_cA-VgWh_A@m>t7>j9)F~JZ) zt%lz$CnQy_H{n}^T`Ca{P#V1#T=UxgVZ-h6lgKe_ICwrPXij@*d@&pnAf z_Sqg}5IWv~_1#dgPza%--~f{V9#qM+2NXmA0TmDfl4<&DQ0a$~Ks5m(W=@{T%uA2t zpwkZE>EAw0^xOM+@%euK>bkr6lkc7dp@Xyz#L(Qw`gP-YddY5-D;*qb-rajrRGNhG zn?4wTu!kv{h{z&FfJ{iMP)-S={{qIar-=+=EFuB|sLk4brHiDu!f~HJgdaWp`7Oq84{tmSFFgvC9*_!*8|JwO z-{iuJALg>lp5)uty^JG)CJP=iFI$ih2tgt+VRj4yDKH_Vx3|I1#_ zy}AS@$DkEh^DaF5OWIpH`SRbK%NPG@YaW;cy=x(Phlk!hfq4U8X3vl9$i7pC`OH2u z+2!mXbA9DgpSX6_!SF!<#K;^eWZqX1Py-lHf!=P~qCx)XPv)|H<9c}XKIq>Jp=N+u zEX&^*;0J%bjESXy13p&b(T97up%KJnLKf?%05- zd4Bklr3`I|p(KC}O@{sE zHen1D0^yZcHgU>(Gng>707EJH!x%jw99LlB%RQ`G(#wg5v`{WurjL(!;oSkAdU7MD zoY@ZEfm4XeFp$6_zsA{#eDn2BQ*1wgFMe_&LzR?~ca>Rlq{kYy3yplcJfm_9zq1oJ%-p;JO zF5t$We3oC`a}VW)fHZYP4Mk?QxAX4WE*^e+ZDlZ={C8u`1zH3^6};w?9H-ztIP&qg z2pBR6glZkqx}&ARVvHaHQDi9?rKi6Rfq?g5WyFlo=P)b`4kwf>1cAXAu&OjQSh^|+ zwJp+U4a8N@wXF9?^Pqm2ownJ9!*&UY`o6-_MT-G&4(hd-&bXO3Ix8HLJh1qbiSpK% zBSA&cYytw}L4m}B2T}))d_p2*hFOTBfMSD1V@Dq0nIYwJn0I{&2$_)YXWL3+IV1=& zfG8k>cxY%035|t%Kct;Ju<9V@7eCKcpV^ZJtuipAoOjMy01Q=Pe5$;=A>h^bR`Th> z-?Q)Jc}m5O@j^tkUsD~2Q!pMh1rH<&sn5g#02VL;3Xl>_j2Jhe$mT^Arccg}*J}w; zV}V`w90%1ZSO+2_sps0q%-E)Z7gK|(2Qi4iz);F|yH6u(?uDgmc)ayn)K0pV&Rf6D z{3rT2`}EVP)nn?3!>Le@J#VcmvU1^kPObj|vl?Duc=PyLS{GVAs25PL>+lNBp=kmx zfvq}8ApU<6XHt(LiSzSXXV3jx=^9Y#RYy<|mc2K`%w5~q@qh;C9t4|$iARf#A&jAC zfL#wR(>$%r+NBl3qR`hJGpq%UId}lln0ed$inaBVIci)#*IoBz4B%V}2yyHf9*UX2 zJY?;HyEwi6S!NaArk2dWdD)EBF(M#kC5b;+odW?d;53&sg9Ct(Tn84`4zSn0t*rX& zG+w@C9f9*Se5}mrpPvR@{U9kA2MF(5Dvr{WfV00mn>)U`h`y(LsYel?`GRA@wsX1S zsXt`f=icQ@uYZ*nE?>nC-}@nFUT_J+)jHn8z%a~P7QnKbILCaIhEhrz&p?w3s%&tE zF#tFgX{@OCpa#@~&l6zQ1$i)lms}L^z|ua>I&VBp<3rXhtZ>F9Q)mrRSXqH$0ODbE zKbWhMz={EOnp@_IzuJLE@9gF9BUUqcpA-1q;#-(~_qVv^uD{~Y1NLCspw2rNU&`Kx zAA_0IPS=KnXBNk_ExVpm?6)w5Ry3Ukt_F#RR9C|o0Py;{#vYuafg(ztu~85O11Mk= zg#6upBrxpZ^*)Y0vKdZogSA7@l|b2o=Jz5n`ab~8bc4XVL$uF`xb(UK2CJ8G=e$2< zzrX(rPF?u`AKPaamTc-^QYEI`5|I`|HuS?Y3kKO?*&lLLcsn#q25m)2P_Jm>!SR+c zGDZZz8(PX;}6Q8(SuE+~7Jkt?yxT6}GwWXDn};#`6y^W54xRvS0WZ zlx6@$lo%9n%2u14(butK0T4Ph@vmy^5A-F)h=9qA%qK>GWJY6!On`h$00je~fR)_k z0+7Gc%R!JAZ=o~@tmD4g_Ze7r7#siMME*V;;P+=vquRZO-qlrnbBURc-pAsDkK(PL zy~uH!E?~!o#Za0B)`Im2f>%Xj#V7izigb!F1^^?tn1_5_4>SrYf*8#!jDRK62CzU# zW^8D3AQ?C?n(ZTyDIkYJUL)`Zn!6zqe!c28);=qO9ShAH{w@Tv2(Yl zeBWctZ=1!&8-Bq#>9tI0-VEV(nWL#PI<4a&*2KWFP6r2Gi6EEOB9>rH3=}@|8t1Th`W9NX(NB}FO ziT|UZFMUAD0b0y*K_1p4yr03zL~>BHM^G@Vd2N_`f3cnguMDtySxkR7G&Dl7Y-yd; zi7cDX(?cl^(2Z4kfbygk!fQUoyp{v$x%a1h{+y?oJEse}rjb3*gE!!TR6&6hyn;_0 zt}i92`#&NS6#eG`&^+1Wln3L1^l3AY94Yg6%y{C_k zWid@nmhI*?bIz5GjB6{<+#1l(1W9!m@7n1}LpE=YS^P{NOYiB2Ifu~MF_8&te#Y0Y zUBr~>4mu}7m}UCRc!3l!nn6f>miY%#w$|Mlc`zURz}Ns3$h$<6L_cf0lQq&5h(s0> zjm-86Hq!`XB2Y5)52n2FcAb3=Y2&NcwJ>e_;)qof9ufsp1Z&t10KAX z$Je2|0PAh$c?6WvL+Dh|*l#r+w>hT1rOt_!4kMudS^x@QA@y=gtvfxmRIHy*2v$NQ zYx|)26A;OVvsMsQSY06lMGh>#A=ium(U(BCf(^j~LB84yPd+SnKnLSc7I0c#=z z1tk{?Xzp=5FbZl8D`zoM=i#1-WZEg2*U62qINYW>@rL@FNy>2&2r6D7A_u^_!x)yO=2jY;y?CA})uJj~7PB=!7%6Xf8OwXNG6p zTsFM*Rfiu+a2xB?yV9Fe&m|Io0Q!+HmJYyqE{Qj%FZ-JQRXE8POk0R)43IQ~AfXvC zO_tFRWOVpvqU44vq-2I~mAb=M9IhuO-5l4`L3gbqTP&S>{-Xu}7%O-DSEj!F44hz1ebk0$FSj z{C~jr0+|hgEKZ%COjmM-8BD)sThqORmH=rE(4x)qg9U=ET2L#U`$$ zG<%gr)!_ybe1A&X?_PCv|4padt$|Oq2N8iR3Q$!b*!4xb6l8I!7D2iqY4j+4{dwk6g`?|j76aTn( z+^dEKCX1eYp*j4A0T>$uEO3qm8tZkw?q)FHcEz%*7}?1fW@BWU7}`Kk)&Kw5oTR$Y xDGLlNQ0VYRAk2Hy54-&D$J6}JF8>SQ{{oS~KO)K-zT^M^002ovPDHLkV1oDCCt&~p literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/thinking.png b/public/images/emoji/apple/thinking.png new file mode 100644 index 0000000000000000000000000000000000000000..471c4a3a4b7e31b77b4e2d16da9c58875bc2b9ba GIT binary patch literal 5886 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 O0000mBofUUgJyw7E zf6Q9B^1AZu*yrqhB0_oZ`QLnK{#PIW2f+UUknmT>kG}Fr{@$S!fJdRII15T+G`QNE znMGL-S^=Q6#yf{iGn}^zoONrIQitS6RBY^Yk8=B5& zY413?rL8kxDAv)|Ig9WBXWbOIC@_l2@i9h52C0-M86NB(85M$|GwSp_wCvKfzkfHAC#*TpUxHXztvj**8;#=OQkgN{PS1nnx;)n%{ zS4iMGmm{lI$@kV7$v zp|z!%u358~-4m!Et__V10)q7pmszZHjE@Zy=+DwMhtk^FJ@>xbZ}@3{@9sAi^Nnv& ziTRHPK!w07jfqmfUVGHZC#*X3Xp&rlb52Im)YVZnikvnK4G(kQ{rB_GLl3ii&u+%X z#wCzKzQFvsbGh#N>$&5OJD4|rKC4!*VYt7K&0DwPofFn{b#}05@gfddyOt$OmQYPo zbObrgQqqxO+B#-&+!>GMo?EYb^NuZ#%*(67)jHAtaR8*%a=l00aM&@Y91`*!uRM4! zG)3O8h$i21+pXMs%k6C6u>-FZ?d@$WU%rC2))wmO>sc7o;pSUz5dfAgTgC||9?wAk zAQO}0A%!Lx7#gIve;|B+7Z2S304tU+=ZrJYpgsVM2Za(Dod|`sSXUp?;WUzb{;F*c zKakfs{WNV7@c!Qs01sJK1*86W=+UPgvTW^PIA_typg@jtX_C#GH}i$he}ON2=}Vk( z#u+^AsZSHyc67E=A8s^gIY}YUqJ@jYxrnBwrU1qQR<2ydKu5pSf=anUsZwSnFevy2 z{`99m@`NWnnKRa%!7EKk+Fl)iPVRZDHZUh0N;g z66zQ0i{t_TMjNzJyz-T=@dUa$=>#(0a!5_&4qFkH7W_rX3P& z$om&9T6xF^k2r1}CQ*Q{0YzUZY`^{e@44Zon>hUNBS=ibi(m3$hC|`|#3w(=v!C@W zvdp55mcRk28Pm*6q^kl2B8AnATp`D=e)UVvJ@-5S-ucdVa`<6~@tfcNj-FYaJnnIi zWy#W|WH!TQBAvn*?;LmE@+XG+dr!|7>;J@G9cMiDDgPXRpM3qZ)0t0NE-erC_2FYr zKbOYl7QCNg$w1#ee({T6ar3RWv-Y619Cyqy9CGMky!EYbMQgjpTQ)z+op*1d5CFR1iBAY1ER&*G^AGh6 zjUjyox#zYU`fZvm2tA#0 z?RSK{Jf0(uJd%!%4xGz)^PArU(}RpxCDGQ#OTE>$3FMjqDKK+@`@ylQQoQ)edaP!T#pnzco8oIZ?p4fjj|IFSV{uC1{S+G< z4k!7dNi)lF#~sH9KJbAckFVwrf4GKo*01N<&|eG%2~ad}5p(+jr91+$x^@iYu-F5SrS|k>m`Eyk+QV&*aX)ipsaX z#)4H#sOIwQ|KSf9yYC(rzwJGAp1T26tRpLz!76+V-aCy|9vuO9DCEzAHx9f(14?_D zRjNA2i(mX=0BNtATABjLrC`UmaMaNqXa_#BprNsee7PU zhWdK8Zrv)gPzn#)2nz~@BE@3EiQtkM0WkU8p$!2|=VW3NB@%@IP*+#aoH^YhL(WB)LU~fYCS!(=?`vkG_=ZS9Vd;I$YZd{^Sols z%rcnE9TAG3IKSrBPKxz)Ooox~>+NG!Fe1&t>{uLfGb)_k;xi|?YJEnjJV{4gfzyIV z=zindxxT%V-Z1)!2iMe$3qF3^kABImk3EaM-}@$c6uHJm@J=RLa1L*yY&tK+(0K`5 znBi)#DUTHe@hA|3)ZNoVIe@Zn|GucJF_9E9Bjv1GHe(Gae>L30yluREO|y!s8?_^KCkQkW6S1s0^nVCKwX zAoTjTJpD43-*pE|U-uT0077+a9AC4-792<}TkTL%A2beymlOfCJV1F(q7|)SaEwW0 zZUH>ErJj>eJSij+Xe%QO8>)-x%PBcS=DoWLROm{cs(DUE@j`uSVCQuIg*k@^2u`;|i zC=w=}gY#Ggc!i8SZmM|_`Set+rK`OIfR+II&M*lxIy#Kh0hM6AlN2*1N0Lhx&TNE~ zt+&p`e<;n5`0z&`d4!+*?5F(rCqL$vTW_UMSHz>RHH}vC9jOf-N2OAxl4h*w?Bw)| zFC%-_)!a2)LXVeFN{PEn!ibr!Mz;UR5}`!W=Ur0N!D2n&E9GU&J9z$Pa^*U3JBk zY&d@duY28Vsjsh(@@2`q6S~Qb$D*i!iPEGL$)o1aX5CfKVqoLrxvzhe`Yc6m$T^ab zyT#dU?Eb^e?El?wF}WO>^(dbq`ftHHi&aq-oRh0{!aEv5Vg7QMf!eTP0~cIy0dEgX z(-=&yjx4&(EVHDMl`{h1yz|y&;_ZEAMQ$d`6EuVz1qDF&tZr(i$z>Tyi|Z_PMRS9p^Lf6(kM;%OaB|&K*!YoDabWdN?lt1PSEHPks{b`_PB!?C7LW zEQCVShqWH7J;sCFsM6rG=;)y4@kYl2fb|WWvUU}vm%f7A%Wq@kmfKjGhsI)_`$wzv zFPzKc&pC^%QkGG(BEM6;gZH4l0UVi}ZrMm2xS(KS@@tAhk-V17Lu7O^2``tq7It8|oRE z7?%!AYea*QC0#rVV|6B8vSCMVg~x1Z)>LB3Z_C$VW7 zL6ffXfB=ZaM~sNL!KRj0ayiX#a9GaGkB$xL-fC3W4#~+>IkZpEAmDk3`~_bdh!CKmuMVoPJBsU;4+1ZbSXl7d%qYUL3yJ!qwcVX_*OOXSDXG^JW9(LAdI z8ZrO1pAi5tKTbS=zT2bX{GP=l zcZqhMEHVS1q0mU*uaF?CX$ENpFfu~K_O~Y1E*4?%5ZQ)RIHOTGVM|M}>tejBRk_dp zK!2^EtD{5KCP2O?DeIAEGZ#T|VPYdQ9AZXDD-{+kTf*ez1Ut8FWA>bRvhB9pWb-F2zhSC@)xNlK-nEFO_fU!m%yUPSrycrV?Jq+S~J+gXp3x&m4J9iMqJ zYiX))2;h&SjbU~ud}(IcwPSk#rI|1ZBCF6Mr5VWY0Qvv{kP)&`&+#e*UI`57rm3}= zzP?_zZ`l^6qo2b1GtZ{Kx0mKnBg$DUG&pbwHMJ9tQq7Qxtwf(aHuIP)!zw4iSeudB zl-f*DDxf%d4eLPMpdmvBL|W`zT_G%%yqy=m@P*uU*Il5L*z<++7a;l{Q@}Ab`U=AV z)BvF*nbZIu3t}pxb?T|7@wv}_o-3}rl1jA#z!$#wS>E^F4+dW_j3Y&Qe6Mk0S5rte z#%Y|%@Lo~_YqX5GJU3dvl5Q}`i(ZS#F&SdDt72ngmDMQi#EV>a-Symb>&;AzP4LyP zd?m~eK7}Wq|9F-zTPEGBxJJA%2_Hd7^vnQ&Mlw%WAWlkp>ae^W&|S#NRx{qM(CErD_!BwS`t7=c;t>k5fLDm4$D$Wb_R;>C-}7jjI5RP~Zp#8?0n9FPwHYO*7_l zaRvd%IV+&WK1SlViF^-(M#~IOBGTO0P{*0;*72n;e}&I{>Qfwf=)rUagElfeiliYcIaqp&0LQ}00DN;&%l((cVj+XM$ zt81sQDnrLrAFDjdX$0p)p)68#l~F{;BmF% z8%ZlwP#$L$-j``^?}AFk=;%1wIF!-I2>T3&5&P_w{3hOlSXYG@AEhix*eYrya@)|< z5ZG6ayT=UGaw_(FqBP1^zx>6pYJ8|H(1cwn@*O3yySOYD!9d#81L+0Giv&rLiZ<7# zxGWVg#zRoWVu6iMd{S7Yy^}xw;Wx7OuRtWOzM+M|-abkd&+K_~r7_7w)-tdj@dT1# zpt6`^I5fyrdLON%h;}qL1;(`pAjhaL<|WOlStg28E?4=+*S|_@P^J@3J|(!+5p0&? zqN+IYF$jZet`>g)43OZRhs+@<5SN|3sx4I!Dt&sdY^ z0nAweL?lZpJ2m+VexRQfp#yvJQ!XHkgv`Ue^yM!P3nm}o!3Q4z;I`26o*$;f`U7BA z8PI@DWbv}Avz_*?RwhF(?+T15B#>8$czdl4&B1|$7(yd3XgVq#p6v!G`#?|t{X_*__Ieaw01@woFI%i!>^ zFarfv++!xq&H8iCAAdfFA9*Bq-+31|Uw>C~8x*Klf(fjY?j8jfxPAI6W)~unu zt%HGqer#=@k+sqqBVGfvQ7AxLK$IjW)?QT19zY7n=H`4J$r*8iR#>5M5-^ee;P6hs zkeeSHsbGu_xjl{5UaB3b9+6Ld$c| z+Tk@Q4;o0bbVdNAjm)J*j7HYpGABh5FVRY{)K+b4&xx;9yqCRxNs@5bA&0Pb^=g?< zeB{xGx&Q7vxb4PkDdY>%RFx)1IR2O;XbNfax>vuFYNa9zuqbG4X=UMpc`Q41Spch3 zYSB;#JWkUK?X?#a&^l6H3fa#bGb&nE*AMjP4t+daESTI$gtVM9ZMVHAg0ykG&%&CLSXz`&sF3vO#|3%cGa zQ|=})*v!i3ow&?c*Z^YCAi+h8EYIS0Jozj-(TEB-MA0f~b>@A7U;fO;Zfb4sJT9!Y z5q4rD#v-e+z)l70h^zodEqH+>0yO2r5jrYaW!7=)e9WdeqSCX=?>XnD7zb08T}CuM zhDdW=`|bES0Y;u1lZcuW>goWn)pCfZ^r;IjefqQiDFY@a$Ea^?L?=06gG`LtI2Rx9 z+BpCp*&rdy$V++%0L0*K_h^~k&;-_ za#`BsnQK7!;KbO7T%`b}X_TcZUc4nWC5T`|Ul7d)kpZBlf}h4RAIU4AO$S23G#5kd zu_9h$ppo`95ae}nfDsr;e`91%fYyp~r3~TBDiunT2LeE8vUS{OWIaG>gr+edS1Wo% z`n$*ih%8WYo!S)XA-)!QjEcd!=>Wvhou9wDu! z;sJ6=9-w(GYGdl&mdl$3);r~#bpnKy z2~EI(a>4+abaXXUupTIQR1!-8a>N>epS~BEzj2q-j~dnGeZgQ_Zp)Kc5T)W9jMXSp z1Hgqdku*q*64^MP)&E!YG3iA%jB%hX`cj39`O%cikk{yzX#d`Pap`A(Rv z7I*`GSgcm$ayi)LXS>-7o5co;yjRpLa+(IW%MDFlVKO6?P9d2}!vY;Hmj}9Tf}YDF zok_uDvLcmCBCBL!wpc8hmYb<+>KDR&!OJ6&aH3{p&0M?P5!U5i6x}f34+PNG+>C7- z-h$0;m%}E91F2LBJkQ#{wt@mL3JVM6XB&9^NH~O~+{^1NfWzT{uIm_3)MiC25<_2K zA5=Aa8~~?GOeVl=HbY)!TWz)_imEP)M8ietWRjq~S`_gA#pm7tgA4Zhd`LuN z*t>IA{<~&V|Fulu5sSs3Dj6}9y~^cu*8nJlh{Q52lg;)iiqZ@quIB~)pMfCqdIJ&f zR06<-TI6QBZhTQyGq=f|&rQcu2nKtFJ$SOfUAWw0LC`K%;<-jnhoKvyd?6B|;MzA< zh_xbOT^|Szua(JU(9_j{;*uekFI#%!wR7goo?Bd8Tp;&ACYupp;z%SCSi5FTHwfJyn&L-T_#k03NY8j6EQ@iQ7Z7P!*2gitJBd9 z6T#6*XIdw3c~LeYO00SHb;N}M-Xb3eig*orgF&&nHtObEZu|Me4?TE(ZS7D{63LV( zodgxPi5s-Fx8lVYU-+)wZf`FrD4?6Lt zym8GnSCj7YyB>)LX#qt6V~@>d!;#j*c;d+?ZrZzd@2|&>9n0^_eHfq8IM&dFj3_S# zfRfFe^ejMBY0YU_HMd)6@TEctLVaSjcrx{-udr~U+vQlT_gfk`UU{d}2{PxcRcjFm zg;4184Jmrh4c- zRvV+PRjB7cLQw$*JOgs@)c~o!Z`TLdTmL?Ml6q-182MNd3ie^n+_{h5amVdL8NjGK zeOV&CfTV!eX>V)A6Hold9sBq1f3~Vhl-EUh-cvqg(1Z>!b?5psjH;-N3n#|~XnD!! z7e*qn74+e%$|?b%3}q!Ha+FT1sHz&`D)gYh?L}ExDGFSS_9^k}oP1Xo>p9VK>==&h zKOm94lywDxV*X~}6KdNF@3{Sr`vB0LM0o|mGALqwP1Qg!e)s#||M{JFwm(}b%F`9> zHanqBu-WS^L@JpEDM5vq6&&L4WD}LoX0mc*FmK+xO*-J* zf8apn=K_G1PbbqC#S-Ziet!{$R#$_TXC#is;$p2ZnSp@cUy<$U+N@-<=QwO=B`|;q zq(2pKNqQhsq_nBOP7lmQED3(mGwA*bsee4(v z8#WXkw;Qxftlv*rD$^}0%F3%m@pn~SA4ZGht!#h?0V%I2193^Gv;6+RK}9R8Dn~&i zok|bRUT57^=#LfKfk@PO(^#8>T=?t7;Bup`9l0{eEA$qUl?Nre{ho z03j-PkOdYi%TxYr9G4ntO{c@@$}6A!kn(xoXQp5=b@8H$Pru-zi#HR5wA`C(q%Z)+ z<1y>x$x}97dDY?>rDeiUt5pCJ{_=*O)&+RsoS|Qwh$UaA^+t--M~@mQxz&YWIE;?= zE<|E6XtaKRb;m{Kv>bFjCnaoGrIOJvDl4hjNB5wZgb_}cRhV)Ny?tF0{9OGAkR3Tu zAf8L6QvC{3c@?Svs%ZpR1Eac2n73@%vRYZ+j#VpHoYT{z9^?HByxvkto&TOaXa0=x z@(Kaj0;(;y%qdD%|9AkHt^m@Mul#XgCY63&)v_2dY#2t390896zfdTG=H?c3c6F1M z{03+}jf%@c2v%cbBYL{KU#_Vd_6w`k0U+-R(lruTDvFRqZMRDq0GmOptGl~Rl$}n? zGqO|hJit1rJb~q_udoP9mMk4oT2i{Dq2cJ;!pLEx$Br32-Kyw3}|c88NRqqWe{7e-&hZn%2)4R7wteIo|^ zp{^PzuLUx+7=Z4i4K|mL?f|1d_%WKFdFHsUUw6X|m!wjeyy64a&nwS^K=U9=nT?19 z+hRk&VLp_wD(U&E^;kfB_I(hOTSTa9E9oLYEvpoc;2#rX!d< zWg5u5g9i^InUB!@EvJ(=BX!Xw>}WakK0NVO45=zBD)1(M-`*N?#(`g`_CjF*pjh~i zM5J^A2{T}o1uNM!zh8d)?YIBh?=O+S*f*d&`vO{@OcR`_uPAS!Vz5wAbDj?T!{H2VV)J!sQIMmlOpY+u0B>~Mv-qa!xU+QyU2}VuNM=BmcTST`txWT#pYAxajyFn7{u%$;5Lti$EFodGki zhyW-QHZx$U8Ju&@dH-?M)r-%LN;)O82I#M;1L>7CC#CZhAC;uFS@P1_^mQIqpq~NZ za36m0^JjmyYSo)}`+NbibWi{|@O;$k@i5P$y1If*3<~{z=mvcZY*)n^DuTT|h)U|x z`zJQ7EiDKJgD=2roEgjEJ4!GGS28OU*AR)N(H=^nsJH}E>&7nkIPAA4(+XTR6KV={ z=&3krhtlyi}IMXSMs+>;hgZ%{Sd`^F;2pPyhD?u3OG^sdKaQ%+$ z@n@I+^p@4D*WB(Y@G@2~b1>GN&;ewI=l2vURrvyaO<^GIO~(O+{sS zC5|3FjE=7E4W*&bOc_vGr91maMP>C@3PMhZJo0`*aoJjW?;3*=-Y_4v4WPQB2vh1# zTVB8WAmo?NS~Cd%_L4jAy!(~WV@^ke8O6|<^QnA)A*IvORDc~L>CSinhy0utCh~U{ zdC%%E7LSQBn!`JGy!V%#JLU6PuM_;gScVpwR4Sf23 zF1(+5w4tGa^>}qv1)ClYBjEEFJIn@ZoG`dJQtyN}A`{+8s6XD{(kn3{iLPK8EuAsR zCQTJco|MmCZ|M8E194~Xh z)kCDg3HSr70;w?k6010yAON3tYmC;U!rfl4Z)Q(dXETSB@nk~$z6Wh>Z5~)iHFejn-CJeTVpJlY zWXt$tye%n-SDp(rNqpcJB}v81-aUKYka=Ch&|xFK!PFx|kAdkcmFFCQRQ2@xA;-`xUpc>H5DO=h4>Vh>W6{uk z$(i!|d_io8-}_NnQiD-FThP(yf_>^zARR_uupMhxt^C3E?b{#VRF@Q|47l5=2Vh`4 z#Z=QJfp9YWf62Y9$_6?<=3T4Jj@G6|q!MwIiItoV2TDsz#h1yLBp63#PndYgRbTw# zlvjTLJG`@HGiI1syl@g65v7VyIbT5O>bc)t%+i}c2o`@Dg)K1j%-Kck(DdPBs%_9ae4_< ziv|nQXiYd^GwJfPilkMC$57CvnGw@0@R((NCmn!6#Q0Dj(A01cp`I=lO2<)@%;@dy zMQv@(1vlMz;~N}n_4W3lyrKd(KJ*CwU~^!@y49F#q9FwYL;?6vB@8;>X}W2TDRLy8 z3jesc#EYz|;c#CFWdbl=PqkX0wRGXI)s4emFFNA_k;MsbzMVhS0I>Yc4;`8t4xyv9 ziMzOD$Z^VZnmb~|i1}ap%2!u0pmLXne$3o$5-{$0@+tgAQtRedU&0J9-uUw^t(;q3 zQEoo{G{=v2>_2Skh-p7EnXNE`vqGV~&Vo%xB&%V(KZ5f-8rJQ}A)Rs~TTp_mMPAKv zE?uO5{-^^WNB9TE=LCQOj{}dkV@J@{-VDYCk>hq;x_i2D<{9G_+;GDUYv>Y8qs-Z? z;R&1}0n=py9{kRC@Kh#)`qe8jm6fC}Kmu%G^A+Pn>kmKJci0?^rGB6pCTOe>4W1|O zWgSVw0=HqtXmbM5=nrU;mI^?;wo}~23+^Mlw_^tb;mV^8N585Fqjso@-PzLj&{z`)s@y9- zkR4j(!|dtfA9HvPRP{86u60<&x%QshmykKaJAG4>_ePfrl zzvf_b+hUv99yVc+fXA4^F&Xz-O#&uez<|8cRR;m!Uw``x(I=gSre3%`Zs`pkTyeLZL*REZIqYX!1mHqt7 zYHMpj@d|q=S>O@r9n3~^?}MkC04hmQG8$^Di!g2C84Fx?%kBeBoy+10WwXE3c5(|L zK72&sEWj;`Hu@i9$#G;2fEA#wX#J^-?K*h?upMRKA_J%_m89SEy#XB8fbhNa}i-1Sae8Dee=Eis#lLE$)^ZLg`k5Ve&R zxMs2Y7aO+k9TjSh-mm94?D(Jbpd^(iNF5#Rm_B{_eUE+fn?GZ55(?4h18_OrqIezv zx{XHw*s^7_D1Ycpq5UNvq5Ma7a|vMS2hsGd_Ra`GkqkoN40xv`bDZ;|p zlkTgk2)q!_a*WUGoMHgDQ09ADULI5X)?<%8`h!F=2}b*3vAoMg<=tSwV+I%?q2j=m^5BPp?b3UrBh zJd18|g|4g$1iZL}AdD_wpG^a4g&>@yUV!vWrmrkiej^UABP zJg=dl5gc+9=Le5+IAOOtgat0Kz6UMM&3O6cmzu@$=UsH+g^`bC*N0xMgU~byEa_Bo zCB@;yys*g(MbnW=bK_J;uBH%{axW@;MY!aG$@5J5jtwh!^vs4`htp*GYyeRCNF>51 zD=O~4@7~oHEnGD2@R7sJh2XP6e4v3=XBq73r+%N%`K6a$3SE5h#dAdYAU>rSgMh@N z8#o^+W$QS^rkhNK=!0pX5z7e>dX+9slpj}oY4$8r>GlmPH@3_-6hn8rO`kRfm{`gZ zgmI5P`psRJUV7QM#$(3>3_Dv|Zi!K8Ha7A;U*(0vQ5HI>?eD%fLmqHyIz|7nLGK1; z?Mf-zf_+h8XBNR|hVCGlDTdaD5SkA6Agft%#UUQfXB^=tt-DbXSb0V0sxgS0t=uQUU<&fym|9{+1opiN+xj% zMF|NA2h!@>b>Z0Ac8d=oHVpkEI{q=+Ez&;(aPc{Hv-Gs~)~fB@^F+6t(`Fu=0i->Q z98=i1|Ms6xzg<^1-t){eKYjcA-~ax%o>{*9F9#1E0wX>f97g;CZy{o_C|0a^9d&hQ zUHGkUee0cDZ@C$KdixZMMkdrJm95>qQAA@|^oBEN=}w|Mm_}P`6b%QvkX0>`BB#t+ zG_!JJCJj?Mql=D%FrcJ3K)<(q?dxCv>-6d8n7;r0@2z>^h379oUWEREjl*k){%Yi? zkznBCnCsvFehGnqZ|Ti9-@FDQ6&2+mBR;9fV{6Cx`tdU8@6`}6dw)uKyUr9pn>*A> zPKVV5q*E%?v}>6awMCNiR0_WpDBB6*syWq z(-2{LTfTfbxAI|Fxj-OPHH8l+cKy?rR z^g)>Lelol9EW}6y58Nm`Q4@k05Ts5Kv90j zrJQ+R%c9y!XQB_n@vd*S&%J$v-%(I*1_67WfF z3WfDPH!43V{n6CLKisN z*vQA!_V3)avwr&YvnPMy3zsZ7eE8s|Rjb#$P*zsv7N37CnMzvz{NjuMSigSV9YsZc z@G+JbUwjb)1}H3nIU^i1W-LBVxM{+3*<+jx5MsdWV_9`mK`?$EpB-XMP}wTO3_Elj z+}#%0b|Cn`|2X3xI5>V5;mB+Jb=O^=TD5A8@m~E-WAm1+#_MmaG=A}mUmF)KT=l@ z?a{NwpEa|<OlFtcl38yD uaMw^PqHX{Q4adp<|IgF-e_Q@P0RJ7xTr)T*EM)%x0000I__}??9@+HVzOfL1lCi8;t4HE6yuV(l{4EY^xA{RH z!VBPe9uz5iFz);3w_N~ILMdb57d?6q_qhb228U-L`uen&H&$DQP z9DxWL{CXH;x>`rQ5g}K~qp!OMJ&P8f*u8M{dxQJ;KWlPi=ox+xjCg*K3PO;Au{It= z=Pg>b=Ff}QuIVY3S};|UAo6kYx%;CUAs079o&B{ zh_+}DvH%dmgHkFvX!(-0Yj0S(ZhbMx5F! z7)5Vu8&;ll;zHqjHx2CFyVmn*Ob8Fz07N1B7BBfr0zffWEMjy<;{20W;BbFNgg%FP2vz&1Kp2yo)JOTKgfbV-~D+E~H-;UGQ^y}jj zzq}jw?>>UQ_7akb>~2(Rf1Df~xFBCFHU}V%BnquB&p*mM5Qs zkN-ko%ig026I!uo)#~#rQ&Z1K-1{f6#I6K!>gCV#6Tcr=b>fMA4Fu?H@4zQscq#TA zo5a619zlCc9>tswVxNWU_pW4saNG%x>EX0HJ=wKtVT?*W!XwUFj``g!c=I=JMA)dp zrwIGDY}q$>VBhLZH-0~z0l9qfs;<7iK0lvBrL6FRi`QXnriOoPIE%Kz|CZ_!CWcieC-y0y5|6%dD%KV;i7f;=3nklTp^FHzW!CC zM~|Hg;I32vN^R}ew{~?Rlt_X~FBWyT;oqAMqrH@az--PZqcemc)}56w*KEaEVU;q` ziowYMOOGSlzg%&2Ab1|oQV8&$O-GW9)rS=ex-m5~jn=LX6kA&#!2q}}fNP%f{(rAI z?c^&eGKVWqUyc7;+KYRWsM^_@$AexoIg<#1xygeW185K?%OTEQJ0F|(4dK@R9zY%; z_H5Yn+kgM~15Ze0K)zJ!_k@RB;KTC-h9|4q=cOXRWj&ws)h5?m&lP0O3|qLr#c(&6 zHp9SqhASkYbstG=2(&#Od=eVVcd`IEX2_P`!ZqkG<&=MQ8E%}@e5qt3cAZQ8z5fm>F!&st_3$&6B|DA;l zE8;$$3mI13&F$pQq8lR8YXNfGY~jL*?GZX|MX`h+!6{p1mcqJ36@)O7kOgH{Qb039 zwAg&mG0>zf-IoN9W0Mt#3k9eqzAh{y*kZSh+gWdi4`hBxDbR>xK#*w%p(y~I-w7~P zUUEofg>NgWXXbcHi`wJ_khF0w8cqh`wsiDUc_EdDIHp4r!LUU>C4y z9r(t7V`Ufv2q%qkz3&>Muj{xXxrBDgd;l;k(pKBHXx(zYht^^M;Y7zuBSsi2i$rED zk<#lMQh=G=ECvV#f-*rzNhoCoLn~w`9e6^ozPeiSi6S}7)ME%YmkVd6EZE~%qSlD9 zsH+9FSRs-Mg7sAnv26M)=ptuyrjEaD96_W=XDXi6Q&;q0d0(5pw;rR+Sg8a^DX{Sb zmE{8VdfTvoT>z%Q(Ecjboy1elU5;`?q83U9!70(qm6)Iz z^Zuuvjql&Q8z1}YRy^gbWjJM7H-={#`k5Zv4~OG|Fg8`k%0*px?v*FPmA~G*A2)0~ zgk}Bh;NWRufHVwHQnP{-HQyBF4g@km&;X%trj$OkPfb@FxaP!#_~Y9jfyfW=u|NJ7 zz2q%-i|r=N@8++r>Y?8FVpa=E{w08hXGNCr@)!8GTBfU$BN0PxHUR^!j_dL$a~@R8qdNhsXVAWEHm z%ouZS#!90P(uDgGGnXe#l8!SF#{UV(0zffLsMJFP0xO{p0vl$_`<`+pzVWInaNmIm zeEu(6^-Q!C1Kl^a+=&l6ldtS+$6pf=o_OIpeBrO#al_W5dgUenJyu%JXJFDqk!g#0 z_6>t|5mc>*fPi6lRu*8Mco3-6LcOjo74wK91>S>}%AoAZRVOdT?H_#-Uht|1H~?R%tWQWr-}m1rpj_|Y4##(SQ2 zE`EIDF8u8F-I&*wMDW|O%GA$|NMCoROCpL{abF6_pKeswQ)4^C*8B9Ix!0WC#z z+%eD4eF9IQ5r!C_scDxKT&!oh02d0RbVC@$7#J_3oFFJXLtJSdfGl~*^(W(BAASgc@?KQJ2;D7tNU0g%=;4Bx!%yG(2)z5L=O>$+d+^g+cB7}QfV?LVN!c_Al1bSx z#sbr|hSoifC44bk3y{iU0E}`31BUPEV5SS7(d4K#B5P|iTmFAp4{rU;)9{$H*5Ff# zOWd++0P{NXAjJ&GmX|;3RQ&tHPe!#I-m^l#roatIw1&5bLlh7pceKJ&^e@RK(^0=I2Aif{d6D+15F%{d-f zzoHknec_pS^7-rW*vBz2GBF68-ctr@|<^>?#K8{6)P5W0RUvV(Ug5$=5x?vbM4p$ z?aIhn4N5>MQ!+_qsL$J4N&p^Ado~KVZOZ|C^H29+vRuc?M0pS(Wo+W(g{Q}uDK&Hro$zTv^VG&um1i{Y(F%NC4CPl@9AhSEW15HO~?P?maX{Fzcy$$S-GIw zETCcu`?CYX9))HIknvr^0C(4!Cr)KNPUbe3bLmSTj<^Zx>K*CBU z>_H5$j>3{8JYN8SUTJ;d*SF%9P5aQ--Igd{GCMHNKE3r5F-df^761VE>^Ow4{`L+G zO_Z@Li4`88$8%qD-WU-GvIzsEwa`-by9NP3D3EDGb`}6YoJtrmezb{;2z(!ldfIVl zXaXPj?muvBY+CQpc>;)H1;NVli&AElFtgv=UV`rl&6;og=}w&;mL=o$N)f`)R{-vY zGC}A7+0l|mn)Gy(z?&$<&@+%Wvoo@QrjRfljUwg%7)eD~+|!2JH}A*qZ{Dn<{E9?* zvtz@Q6V9su;_rO)y*f*IeC}sAV&A|R=5@57m&ZBka66j|HiJk*SEAH#||*X(gD!l^5W4>pz09q`O`cPW!?ZaM_QwTWzfvtEqo z!&(j6{s}gcEcNVm9HhD}J}(Af2CyG3M!lX`FdogSb8VMsq)3M+}QUL9!)K%-XP z9LM2RK|T*%myx9|Tfm4qVH3`84+6^eO-F6_1!^-0C@uI}_i;7gcDoMXS|g4^Z6hr4 z-}k=vf#plz_+H%FIq$i}whj}ag>UMTCW#I%?rwXwe>(F|c(5Wem}81M2_j%-d<5fz z2jBF{7d~qsl>t!{-Y_#hJkZ&{6Vw;l&uOI>&`ZR z7%}Ui5FY0vd&*q!WWSg3x~qOQdXE&9fgI}W(!}3 z8|v5^2y2`Ty6a-PO_II!dhBtzd?B+E)Z*)RO2P2Zp`Di!@b3jH z*Z1b~dF?~`fkNmTdyXh4@xe2~gK+w=6y5A5B3 zbo9uc%Y$4{5uTs%m6)Bvf*c^DO~VIwp4zBZzTLlU)wS(iy%6R-IR~1|;6!N`9Z_(; zG>0R0V58KmV#f>(mhjB1PmK*@luI6MM?`2qqZs)@ z%QHLXEqY@|Z{O*qwhs8Y96SiX-u}_QQe)8oT; zPmK-C#e6yE9Od;|~ZZfbz0^6)=T ek9SU`1tm{=j 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/trackball.png b/public/images/emoji/apple/trackball.png new file mode 100644 index 0000000000000000000000000000000000000000..26567260c7e6774a8ccc66caf9deee747c889345 GIT binary patch literal 5625 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 T$CfU800000NkvXXu0mjfywVxq literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/turkey.png b/public/images/emoji/apple/turkey.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5f149351238091aa201b380c06638a6466ffec GIT binary patch literal 10190 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 IM6N<$f@`PgqyPW_ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/umbrella2.png b/public/images/emoji/apple/umbrella2.png new file mode 100644 index 0000000000000000000000000000000000000000..541849c8bb9d6e7ea5495c97fd320453fb46c41d GIT binary patch literal 5020 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 IM6N<$f)hg-Gynhq literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/upside_down.png b/public/images/emoji/apple/upside_down.png new file mode 100644 index 0000000000000000000000000000000000000000..34b6fec25829d29c9c827866066ef55adfbd32c7 GIT binary patch literal 4105 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 Hu0mjfH#Vhv literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/urn.png b/public/images/emoji/apple/urn.png new file mode 100644 index 0000000000000000000000000000000000000000..1a71bd1f84bdb7b87889aae43a4aa96b6b6f3b75 GIT binary patch literal 4502 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/volleyball.png b/public/images/emoji/apple/volleyball.png new file mode 100644 index 0000000000000000000000000000000000000000..50db05cd43fa9a20c473955b5010e27e1925810d GIT binary patch literal 6904 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/wastebasket.png b/public/images/emoji/apple/wastebasket.png new file mode 100644 index 0000000000000000000000000000000000000000..2288fcaf86078c7b7f9a1b53bf8f601e4bd48510 GIT binary patch literal 7408 zcmV^ z1$b1)+Q%o^Y&K3@(U3sUq=GcKQ#4S;sp3|_rPM+Vr|w?t7Ow?L&;)C&aSw5K-Ti)V zzH{Z#YuU%{f&X)6M_-?J=ETBeGO7RN$5Q=|KUV*0$79EiDJv^0Woc=ttgWq;gM)+8 z>-EaQ!a~W@-bUHlVDL5?jlm5K4dYu{TDmniHxHrNg|Z{>_VLnJr_;%JDa#yE-wtKs zKmQt=8f)rm>uTCsTchh68nWphVX(1@)mvF*%NXWsAJ^L2s_JTMRYhf`YHVz5pF^H! zo_VGN1n^HDaUX-hAj0s0pc!SQrD5f{xuLbSwNCYQb*jy1RK~V8Wu%|2t*x@5uLw^M zTwGj~gQEk#4N62a46BJv}|s9-K18(PT0@m6nuxpjB^QA79nf z+^kAUij}vww=y9m)-oXEF~!BjV+slib~FDmcX#)FtaS+s5QUgu0J4ayo2!$po$apQ zFPvW%7aON4D=L)@+Vk{uS3bU7#3aQWule}+Tx)4-jX!nrWZli^8=eTRuy4P97yNtr zmz_Cv+9@qH%~j-yko23kZb@%!Y*MFBo!rpe+!8!^$l$D*Gs7~*j2jb@n2;Ex*ISJX z?A1%TySXV_J3D14EL52p84u-TXFufP;`*giC#Nk4KM&!FYjnH-Ft>K*(cqAR{DQ;3 z{Pc6z?3^s+gQj3qxwyJiTk3RQMn^?eU%hijjFV?wEHpZ!xlX0X=(R1 zx3mP}HdSu!Zi$MAI1#jZ&6>%0uf2`6;T#;iaXmU}_IKZW8#^;B?Bg5J(NDvi#l*>z zYUj_NU(%&(*T)+g8tr=r1*y2$SatjMt%Y{>_A?Rg92+aEb4^W6|FQu7V0{6c~M7?9MS14bjm-#zdab4jHcxTpZAiJlU@F}bLU>-LWJH*A4njap|{qXV0Ir< zv}tSg0b{_gAXS^*4Xgu|;O)N#OUAD+EGeGi?CA6b!SK79hWeqMeSHmk_U*gi-@`vF zGc)r`ou$r@o}Q+zT)8SrP{W3YPPMeuon5?mamNZ^^QKKUJn1KXJmD*Ws%Ouhc^MfQ zH_}p4lkwe5B6SjTxj8vHMOau`R8tn~ng{eC8C=qscLFy+FsK7HS~(H~f??oYa4&cS z1b}TINrX~bRyyCtU=!!%?bW%yu6}xONU&FE=&At7E%mo6>s zPywu4w{CT6O3J?cyLVOh?mc!P{Y1)H5EV&q8^!xO@GX;PJ;q4RKsnJ(Z4?9 zKsWF?Flu%EHHQBL`#}ZR1HO{+tT7eKIE~wU$XZKkYN}m=`t)7;;FJd)3k!=j6%iZm zz3;xa!gqzQ?@$4(fAPg%e*5Lu3HbTJmZqjv1%-tRv4|gt#7)d0n#u%SG%YKQseGU` zCP#uo5DSVxKdr4nYrmlVehf?iQQ)J$(g|MD<}U-k17Fttp1@jDR#rBpbJs362lOA% z7a?2-4jGv9?tAZb>(ETFtd7!lMAz(1r49?P1_X9s^btgcwrtQbHAUO+c2Ra1*t5^+EeAP;)dzwi(RlvGV9lMsFn)}F%du(72qg_!e4*gB~G=I*#9m&Z_hkrAHHYtlTU`fzAJn~ zU|_(Ee!YWAzWesugSf}e^sLOGd3m{yu}$f;lV2c$xgP=TC7a8jPPBO+Z~}242~=xa z;-mEMRbE~mR$5vbg_&=XIbgbx!%~l|ob1nOJN&|i_3NHky!f4olP10xI(+zxefsqI z@Y`>`=@B0vtK8h(i&%JjhYNu1&j=BxIFc&19kqAQ9*2GV_U)QJbH<4;zx`(J<8$Ur zm^N)%@B>31c=ho)a~E-Xy9X^jT#%n15EvMEX4T4-azM(gtE($5EG(SBDXswK+O)hq zrlh!dSans^=*o(U_lFH1u7(U9@)N-}t*EGIEqnX69{&F4XH1{rIdbGkoA6z`#_l_C zU^7Y3&SlR&`{tf^c6-ag%gxQbptQ7XRc(D;!@qO5`Ij(w@L<)uckkCjLP91lU9#i_ z7%~xbOk1{WF@5s!$0l6EbUq@YsiLCdDE*(jb?es9`E%zTva_+Bw140J_BlM=+!c@O zv`$*c{W`Ide=Sh7V67JMG0;r4K3lzslFYo(K&cI#hAUcoTC@?&4Gy)x3%ZBkNF zWII;nW#w{rzy*w@s;#ZrnU;|rcsD=)1KcjsXfjU0s?OfcyW6p+LGAM6EQ@SSNllHy zC1TLdEY9V#IR76H3JPkYk510zobgpW$5Kqbvz!!hogf4;DQp(oI3|Dn`gP^x+)1r_ z;dwboDNctfCMJe)IyHLCXho1ymohSx9Zbf@#kIQ}TdoLHXi%IYiyG=1e*QD*&#qWp zF^ajwX*065rFF1eCRq@%csgDH_*pRveJCc5Z$F1W%WY3+TT3gNsGS-X7S_Q1n zEE$7_x}t4`f<*xBmnfn^0%7|JGCx26Zd zxw(Dq?d*1XdwG9RTvS|HR9xJhpqZ)XsBLU&im=pK7Dz&c1(-(w5bMK&KckHpc7&H$ zW;oYerFsX4P=eLuQ>RbwcF2t1>5@Z~&V*@q#`_{1ZEJm2!4c6AbIM~@m6&4lc-TC8>iD=naQd06VuJj99R+-sZ zVi7YWOJt78%ozb~KenpYD6oM`>}(c{NA`*?dB zxwbM9?cu}vAXc!yfB*i9vQtDvL@>fSz*q|ev$J2neg(|c92*$Zk~ei0xaqz)^(EYvE6!Da{)r^2lJ9a9tPpWg#C>7Gm8LZn_=<-uDVY0u0U&3 zsR)269gl2hZy}5W+}RB(Eh!lR@z0Vl$&K(67cX8M!>!N->Z-Xkxdijw<+vLc7k6AN ztGcFIrKY4R=AOr0LMSoekA#GTcB?>Gfn1*2UQ+8sDFVQ0|4%Xf$_-C>|akA8!Dz zY*T5@&d&3|XS9DG85yZK#fe7WrY;i~8RuYcf4#h-qK^bW#!JjO#+s3=Jsw5_&~z^I zzsm1QaUaUFaf^ZUdy^X?d)hl*04yvEWk9qg#P*OnOmH8sE-V~GyBpT<8yY-Ezn@@) zxK$@YiKlHTzIzmlI7)ek9A{zZBgQwQ-F3Zt^`6h|ZhwAn$I;F+-#V;iHzt1q2H$3$ zlgy{MW^3Sm7RF;(V?XeeodKF=wHe#?NUF{H^{inY0YF$S1eBtcwN&Y0PWIv@vWX zdmwc`iU|Tm`ArD_%FWF!l(LbrKVUT@C=Wv8Zxgs)V2qLoPTh6N*Qi@VpMA_PuC{_e z*ht+l;))z>)=<7B{b>^+NS{57bK$*BXEZ)(t=E5swd7+#Xv+)&&<-WFFzx}7d*%Gj zdn-hwpoy;FNeFlft$zaJqTvM~69O%;lxg&fqyJ^B=SKuG6=rJ~vz;*yFmE;U$}zcs z{wef*jGbdPZDMUx`27Wz7TDU>8h|BK3oSB^tx+diEA#AU&c)nXZR58xiwkIOVAK+s zy)ZKY!Ws+)>qmH3H8nSV3K7%s^B|Z}5VuXVPrqmc5eFlRvV!q2h*#sa~ z(31rR!}MrARB|0<^`f=jT5(lfC9we$UqHXlX_tr{1Y=*p$YB{PfQg47JQrV&M$3Vu zvVZ-)=*ir9Fno*O3&o0gqFkdKGcV@1%ALh8^B&Nz*rfJFdks`BIuG>qCm$B zK(ryy_WdSn1hfJH*wYuLgopA+FPP=Hasqe$ld%d1Ywki@s@)~8tpc0Z?fkn!q`=alyo(U z_A+!m3iH1>V88&ya~o!RBBTJylMskP7-GV`sJ}-2p9H`6YHDkiF^4-z*4Em(+T~b7 zDnj@fA!N``w#!4zeGluEivY})32N|U!CfqP8&h0{x&6k%H>qEbh5}(uQQs�`-r` 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 UtE;7V+yDRo07*qoM6N<$g5S~(D*ylh literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/white_sun_cloud.png b/public/images/emoji/apple/white_sun_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdd80a3650a87cbd0c96952d74a72a4509749bd GIT binary patch literal 4547 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/white_sun_rain_cloud.png b/public/images/emoji/apple/white_sun_rain_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..6235af0b93a2024f47b318ea774a80bb04cdda4c GIT binary patch literal 5434 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/yin_yang.png b/public/images/emoji/apple/yin_yang.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb121fcdae7780f5a5352015798f3dd53e9374d GIT binary patch literal 5844 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/amphora.png b/public/images/emoji/emoji_one/amphora.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0b5a18f20db29d907cffa3d530d0aa19cb2db2 GIT binary patch literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!9tQY?xB_WAXLn?@GfED^g)`7( zf#Ptf+gl1D+@)cvKsFG~4ORE__5v~v6&k~3fofU;3?M3xR9Hb&0!g6BK*7}bAP+CE zee*LnMk;QZk-jKQE!5rK&BdiVP#37Cxg>IOuy&4*#l^LGCBCLWV|#02^3y_s0)3hT z4300$SjgMtWQw5-`|kXACRz2FFKQffoZ#^i(^Oy zm+eE!5n?NvLR1m*0+Pi$p0Q~I&IK=#V{ zMePZ)^J-jfH5h(l<*RG>HFK7);170@>bI!{jengPYTL8s*fq3QA5i6GxNatO^E!ja zaVDGC2KI<0#tb=Clb(0f)U#i8-E@1UUcHloR++U(fV{@A@4@(F^Lft9c}hg5wQXjU;7#;*h&ZZKe{Utp>`mRS;bpn@9KFT2h{co zF5vrY=4UK+va50`$GJ;C!saR@q|~hRYdrWgcwJ?cCBw35&T3)>Pd4{8xTcBO6*Tkf zGMoI9XXLlbuu(9+rnHzfTld71z;$0ceB|=C$8W!M{_A$-``d0GPboTCILmPQ`NlP! z6YhFl^_BXpI+JHMvyr5MigKFb_0uU&r>O8u*I(|vjC-0$vL$+l-3a_;OXk;vd$@?2>>+G&ME)^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/anger_right.png b/public/images/emoji/emoji_one/anger_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d711e6d31fc8d28d55a79d511d7a8452b93bf0ab GIT binary patch literal 579 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!HjkpBR#m^TQSYfZ7B~ zg8YIR-V5w+xPLyu!9XEkeSg9H_KOFeGB7Z%_jGX#sbE}tg}v;KfdF&B26NFn|2Mtl z6!%{ip8RzGv)l~^IvXq^KOAv%v$-%wHDL*Jz|3h4K71W>Rm$(UUaH));*aKoWqy;S z)#guQEUkzMnG}@t*ht~RQEwNOr7jPx9w@9ARR0;Z$eK5x^LodD`)&KKFuYwY*!M(7 za3{|U=1Cm>Mbk3=s5_r+lQOgr&MKT^WhZ1gSN6k9?VFFchk4&|?kJvqrensAXW!=U ze{6rj-OPJePFd-@zxth4?wc1ZKdV#e(^}^1uez46!)Y<^s$1*}_-5^3OO0(~x@zR> z$5DSt?KQ)q$CDX(GV|pe_)Ur{9%hLD%WlxG{&C4vWtQR6q)8&_?-%@W`|TNavu^r| zgVjc2tNz-BO*|E&RH!;#dB1+(jw_5;-uiOBzo%P!|E^BrEQcA@_PX9%X3t)q*Dcie zNXJl@FTnmTd-|gtanW^YPCu0=&R%wkrTFqj0r6z{*G#kje>YWUOo}`pJELl!=!H2p z`>xo&XG!_{eU$}UP2PO&dxck5AMcv?$RuG&xJIvp|>8qhW0|S$^r;B4q1>>11?M06b zcvv~VDV@yy`+t9xa_6xLFHdf{y<>KT;DM!Q>w8Z#Dx{?UbNN}yA}I5jDx~1N1ooTum5guX-m`_KV^^P^wWmVdgrP+ZMI(8w!O@% zaoMru$xL}`8~s+Swq7>j%M=p<^C1kXW=*lVvGc+4nOlv|a$P9OYq+s_ z8Sm*y>4Dk5c5G>m+b2_6W~p4of9h9J_RO^>TRuM$FICh_S8lY~c~$@5=2?xsOZ}co z1&W&)Z+LW;&!_qo|Zj2rlp-_zj18Ij(@K;6TSxQvv^XMBmQf$tPI1? zPw8m|2c5nv^Siz3k~}NVbEf6yo+}^3XIjtDJaP2$q**JUm29msGRk}P_E$wr{^Mhw z@o87IMU{R!=h^!_`De3(KlbMl3jT%yQy!j`i;b;0&!p2?!LMmymO_> zjBqChx5}!&8Ardaj5$8{J?G>Q$(k#wbB_mC?&16qUK1|V5=CledpvfuBZrZF-~z+}YW>FVdQ I&MBb@0NSZfk^lez literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/badminton.png b/public/images/emoji/emoji_one/badminton.png new file mode 100644 index 0000000000000000000000000000000000000000..19737e99bec97f30dbbc60b21a3c5712ae8f6906 GIT binary patch literal 1234 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz$hEw6XFWwzCZ$-4jw?_ftWxM zWMt>;4iQ9_0z}eH+*~14S z?%@{*vT7V)z?Y_Zb@oAai@kxbMH6hV)2Tq?#%E~RNYjAS+_Vf=reD>^~6DQL0 z3UkXUZ{NEY5FV9PRC?k1b)ZE+m$-WS*LQVaxq0)|x-HSkX>Y?)U!Fc^9=qTuDAY=V z{DK+Y&lfm9KViQ?LqWrRfrR%74hri79QqZ`&%d8w@P2>)`t#=l3KZtQPnchD{=GoL z{PXYc?=M*YKH+`A`uz?269N?Kx>Fb!m{mMo978G?-%epIe(fR9k{+&OZ2e<~WZz16 zKI7s~|Lc#XdaXWXykgHc!cM<3gR-wbJ8 zXU=+liPL0D;%aQrU^ry7*}ZJb%%3-UAMWZ9Van)b&`Q#anx!xNeQDis)|yKVYVr~3 z+di*9^rx$aQ(#pigX(F<8V80KNEdZ18WrbkugY?Iea+&IN~b8X{M;pJ6@Cz`o9DNr>|2_%N$?M&Vx5 z80XD&zGCq2^g=CBUG4>9pZhG2X?Bxe}Db| zuYPO4MSq#g#vtmuK3pJgo?mpm^40kH`(|wV?^9p3GE*mipS}ErVBVQ>7tTriU7R0Y z{e01T{)8`0e46vs?Q_0VX~$n=IQ4?J(cdy;|GhW4dVA}fnO(}O#1G{>>A9kwz4!0i zCxW~mue{*3oVzFXo)_QtN%J#U^n?Dcu{k<7BSrn{)2nBqp1t;P@71X)Cogj^?2(h4_3PF9lRx;vKYev#C@HzM|JD2dKQCRob?;(XUR^W4 zi_ikcD=#nCZ@<4=_Wre7=S|p>8R{15|NNLdY0g@i*xr-+E))I)9h$D9nO^(vsrAd? z#rx~4rgJ?0EUljXq@zybQ2HiClW)B4KRn7<3Nlk#&Zo5N|NX!BhiK&Ai)Ax!_EZ7$ O9)qW=pUXO@geCx!hHnV~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/ballot_box.png b/public/images/emoji/emoji_one/ballot_box.png new file mode 100644 index 0000000000000000000000000000000000000000..7effe6710e075e7727eaa5cf224101bb96e14499 GIT binary patch literal 1292 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/beach_umbrella.png b/public/images/emoji/emoji_one/beach_umbrella.png new file mode 100644 index 0000000000000000000000000000000000000000..f1f55d8ca9e1d4e3f3d30905be3c9173d50c1af0 GIT binary patch literal 1523 zcmV&>_%iAp@+uQB!rtfdpkmTzw*%dL6RY(c}2{xZ+Anzdw*)!hh(I<%j zV#TFabryz~goR`wNuK~x9DuD-Jb{>qgFu8>h%U(M2r#+|@g$OpO1S@)BQT@Uf<+5A zfJj#TP72zfT4(u`il%NxA^qE~6HvKq3+$Ux3)hA$_T}uT<*>A50sJ}e0}7yPCgtBl zoG8Spc2SHa<=iV92X{B=aPY+Mt2ST!N6UnKRur{fP`y2nIN=y3z?!epJX!lSY(Mw6 zgCV>ZWs|p}=;PaFHIPtX9xfh8@-8>Geg_x;VZ0LZG`MlC2jcU)|Ue(e-98s_<;H% zPG?8?u=3YO%!6kw-@Pz^3%h?L@r;I$L@b#+&+DPMZ;tYp_YQ_4eKWBzvZHDC-f2&U zATE-Oyd^{>Pdr}!Pp1RGH9Z9JflwqX^0z{9btg(hG406% zP}3Ex;p-0uTI5L9`x4>60Yv-eh|61Jb9Un@EPP+2tALJ}h!bks3m*W{wTr3^#Wcj| zOb`#|4I`nz>}~%;7QiZ1{$dbG#PXBBF`<-&g2R$B5^)GYLoE5U7exT#jG(?HIHLTW z+!=CF`ASfRt=e4-!4L*MVcHAM<>gbNlCI#$r#(6C2Y(3?fDxNku-}+(JBBGv zdr{2*BB@x&=NFgtt)DR)Zp|4<5+-6GI$|)ERGz;ZM5!P+aga|SPHAB|;BVjg83hv@ z4)}3>`}cC`xJ`#7jR4{x(!!u<60s%U2?n97O8Kq`FyeqD3qeCHpV#1^^i?IVAvVif zL9gd7;e>4dgrO<`0|ADcVc-z@hHU4C~g}rD^PtzQ-DlP$JA;4txMTCOz zX%V{mIX`nDXo#g`Aw+XM%iF@hry_)e*b)#e6Y_l#VBS;YE{5I2Y;SPXm$2gF3CUUqDivbTnRpdq@_mmS3c^hE&4Qv9+L{dQ;n0uAXZa%=PErVMVzanuDch(osITo^t@6|O(0d(Qvz`*V` zbAaVxbJJ`G_hlVvEz##q9hV4En|;M+Nn!EZIlr*17d+PCb+W?r<;0*PuJ4`?rRC*m z`Q?i$)BAR;%7?|XCIAKibtThmA#EM$DxmZJEEaVT_`h7DKANM<48}YFx0PGeo4uEUKx3=#e ztA)D<7Q3HMZ=L7Lm*r%q#fir9=~NgxM+xm~%i-eW?_KeWBR_jS2CT`32PYcf>4j~s z3ybrB;wOK!3gF6Kcye}wyKmvVinM%TVKK~|HbJa)WsuzC(`(^+(LZV7BNKjxW2;Ny z+`lDhc{+!VKf7$f-9yXV0H8BGI<*Gw9bS?Cdt1x%fvFom8zxW2?!1o#<2|#_nR}jFP Z%zt9Uq_yR6WG?^!002ovPDHLkV1hK<-53A> literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/bed.png b/public/images/emoji/emoji_one/bed.png new file mode 100644 index 0000000000000000000000000000000000000000..3a859bbf93e7a998719e3e6dc07a6a885bdcf273 GIT binary patch literal 1527 zcmVu_S9EbY|egr>42aoTZf5r_9XE%*@QpTu&WlW@ajebA12X-;Cu^P?qXMPO6>x z!gBZfb_Jy|>QIL|)FEg5I^HnJ(?9rOVECk#Ni*ltl-cunS{M%*x=|}`_6ewpoHh%x zVpthtM~k?|P0v|_A|^vjDw9UK{MdYWGaw_EMI%vM%fv7G28Tny8CV%QR~FVy z+~GI&4-hVimy7mogMTKjpT1J7VrZ2JfC;z? zo74bm05yObKn z83pABT_V7Wja%s0rOWgrCYtgpY9$9KsA?b_`z9$_>ai^hjiLdta+o}iB{fafE{Ms@ zCLEtuSSt0{hl&O`ed7i%&m(y&gW{SddL9=iH=ws-0cI{-Lia6iow5s3@{4giP6^SU zt!e&3>G|{- zkm@6sGL8dOX7B^_-W*CyMhXvY@2!X+D**2C5a|BnFA|PVY&X_6H&I(>mtDB3=`($3 z>7crtJSutoM7Vl(Ii5Q|{0K=(a5GZocz0QXGO)@DAQWur=%#=F{f~qLU;FEye;`bc ze0(6-ho?XP23ac7`%pa>JQQ*)UF&H$m0to57E7A`h z?01zRjFok^B&3Q=UX*Ker%WS9OiC(QjDrks1d$v-xGQj8_a|R%4EQS9MsqM$l1fb8 z5S1b)D@caXbWm~t@OstS-T`o4%M!*`%{O^cn!)H)LA)L!0{*n95z<8tkpdl<c*g5DiF>B#oSQyqQ=ACK$+JpRGqw2^K9<42Cu`B`)5 z+ONM3_K<^zA(sr$dBp;hht7f|CC*<( zF-z9bo$Y%8glX5lL$r;}eeLFLw0!LbTDW{QAwU-7q_8J!>Od2~L(z~2;8ziX&)02* zAYD9obU?}J^A-*G$9@Q4wTU4_iz5L}7<~tvT$#b|s{_;qPV2FXk2dY(S5b~6a45he zhK6xaEIy#&{01o}*soodLOGdvw0U*Cz?@4ney5nak zWYRQ+Zh9_jjGVFC;Jt|7_K=O5XvTY23t(kjWNc#S7+S%#jci!Q$Q=lXfapV; zsQ0M)j}`c@Gzb9jZ;%xbRdztu;Nioc4hO}L7~KIDeTxBff&jX2F~C?`fGUQ@Rp+S= db*Muf{{u9ZnTkJiWf}kg002ovPDHLkV1jct!+QV# literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/bellhop.png b/public/images/emoji/emoji_one/bellhop.png new file mode 100644 index 0000000000000000000000000000000000000000..fc7301104cbb549ec3f1cda5b056523ecaa6e810 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!&II^`xB}@ZGiE!jeFQ|C4jzCr z;B2@EgaKD(=j?v#@hhM*AOlE3)I%5$1Ca%RYLF2`3Mc|J4QPmitLL6mr%zwIb>rdl ztM{K?zWeCNg-a)|+&FmdLO@v5h1(DIpE~87if{Y zZ{V`k>-|C^GV=-*s+LFt{i9J5V7;2B&A`AU>FMGaQo;E4a%+{ep#aMRQ{&_rmn|g^&$;w_f3W#K zvy%toRHnYn|FI=FGv#vr(lFf#%}!gVeNxEYWVz|oN29OySyIC4=^={s@#+&o&s>C~smmXBVy6abg@6Fj&m$u3*jZ>-iJHMxX zV&%Q1iA9~O!e)zaxy&5aA3eou*BvkJ8$q`&?>h7BOG8XprvK}psyk;=j2Iv1&%U%^ zOZw*7YbSF^bXJv354!Rw)@*A-nz!WS%}e+7+i$*7UTP*@RT=iB?4I%7*Ij$wJT2SW zQM2#<{}aFd*2GDs=l(p~;kAW3L8;-zO>MU;Ps`#&qQ5nSRoL1ZCb~v9^l)E#!T9gm zVaC@_mK)yCP?l-kAEQ9M`mf2Hlg`g_wZNHB&AuhveuqTtKEBhF`y*mZ|? zk;)hB7x)@&R6jDlQ}=uKQ((%6bGsN%i|t_4QS%cEh{`xn#JaKD;g1pk1w7+ie|P`Wm?8> l_nH54MZ^C0(jT;I8TGy=1;n&ZdJarj44$rjF6*2UngICZqjUfO literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/biohazard.png b/public/images/emoji/emoji_one/biohazard.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3e4e989e4a11abd90444c19475115707c98f5d GIT binary patch literal 775 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!Hl4B_SjsUiTXTKy3mg zL4Lsu4h;$W1r*-T?>~RvpdesghkE!|C_8C z=Y*6!tUq_#T|8^j1fTzvZJ(X2z0-d6JTQtqp?85jbmU!Q($eU}FVc|da_Dnps=`GE{)A=hX$*B0tZ6gTstopd3*X})uYqk84ZPrmj#JH@(`^EEu)94f9-_FAC4S+8|DL*YHP>!BytKVK7l zYidPQ(A_1)ET=SUU%T*Lzgjh`X?M^0{>)YGQQ;x}ZVpu()9zO&E5rxx<}S3_e=KjB z^30o_@h^Xx`U&d#8O*NnvRyaDL8NPT-|l^VQ@6d!(lUQ^jjJ)Lac!jAj9Kxw>lTzK z$sLcsm}#6*F0V1`!0kD2+O=MI*qh9*-^V%U<-^|=ZtdlpU;fd(60%dd-NrA}<1Mp= z)6stm-<)T$Ujrb@5sybA6Mz~PTn88U+Cpqy*;A8 z)@(T(t@!`%vgnEFw=TXpxky#N@xcF@AFgQGou~Wddaf31Cu6$r>mdKI;Vst00eMr1poj5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/bow_and_arrow.png b/public/images/emoji/emoji_one/bow_and_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..6a8fa6984e4e9ba13db0f42272f2337c84340204 GIT binary patch literal 1357 zcmZ`&dr;C@7{w@ZTrgVQjm2tYd)r!QGC6G-K1wJv6dws@m}N_Ail#0Qu814jnu3{u ziD0an_7GH5QVKPKEbXV+Sep6BwzVvOWu;@AvUkUs{cmT!d+vA7J>PfFojdmoEzloh zhqpr@5Ev@OFBr_^e}^p+U`b=f8wA3pn-&nV3oLtN@gQnjTmCPZ=l{dGu50u8+ki+A zTv6s!dxbhR9CY|}r*xidY}OU}2Wij5Rf=NuO|=is$IbJ-#Yt1S{-8w8p%<#v)#(RY zb7DbZuILwlfWORVfCSW<_WaxMMy(EzAg&x{0)6M%g3D16V0T^&_*>L4fHGRdRZ2+N z>G*j+Sz=+6wpK=CJQV$|rqHL)?Xo^_`;<)qwt)cDmUAN>_4NT)vV`C{v&YS=*A3Y* zDt=TcB^WdZVgoe{Sbfc8!I9zZH!qZ?gy*pX>qLiu;i^+iaN=}(1usL`Kn(@g$yX|; z?vy^##dTjiX;NGo8yl;khTOg;)8D8W3t%>zOpVP3ZGFReh2l~MyO`rwo)ajR=GPmI z#(btEEv5s4R8>_5UQA|Qo+X>DO!RL*f3z;=WLZtk^Sw+}_U?1(k!=M@ujq##b48u1 zw2{%#mrS;~v!nj@?UwuZdeXCt0_f&02vTqjcklk1d%q4m>i*>5Ksthm)xazkc?c`i z7$J$XipZf!uwfk*0EnhcvLW5Nni>H5{XmrGkfsgdCN| z$bldZgoPx<{Q?AH!2s3IJA`Y~SrD53B@FFni6Xkvv#^w9aW7>qi_1=Au5qldg#hg=Od5D=29u@T+y@y2;P+ z^`D<^I6h!yr%cNDy3(z znab7Ys$4haK9r;lWAL(Lp4t|Ct#3xv(Zjj3<++h-iSk+7mhbqCh6?J^eQaClgW2&X zn=GyPcpNiSTzP%eQ|#+iR9(BMmv(id@1Dhyc-(G$zAcVF@e^Ln%RUf^Ji;`)V0@cV zMV^nzPW_A%IDVZp+G&h>F-%-6bnu{jO~P~+cuK1?sGKV{#znT` ztY*0BY09&VQ=!NyM`xT@kzAg%V|NI0YE8vbGg8G9CvLW$oFNc#86@{)>xfhD!RhJA zj+A%N8n-Os$|6tqH!JcwF#D6lW&C^5+ucYLPJ_Hg!HJj#;b_@Ki>YU%DQjFglDTB7 zir?gbW_(calqox=ysV;I0(*k|ITn@H`gln2_lh-Gk!$LDd;O4AOCJvW-ha|Y*qN7jpWr83*#7m z-3+?Op*(sT+I%I`v8T=6W$zqG;e0)6a#{H f+Spx*8@?bvz>dp*Tt>lzFNC1(3iPY?VTt|$cu%U# literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/burrito.png b/public/images/emoji/emoji_one/burrito.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7bd0cd2a41bb7d0edd967c879ec1bf645b921c GIT binary patch literal 3251 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/calendar_spiral.png b/public/images/emoji/emoji_one/calendar_spiral.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c5f699d26613a9b73fbaacd32621528325adb7 GIT binary patch literal 1256 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz_>iXC&U%Voiby#owGZTy!rUW zTb~#p3E@J-f$YhPRz<`n!Ucii5Cjx~pq-v!5LqBOXZ|9fEKm!Oy{W!!Vecd$8)z($ z1R|gmkiE637a|Bz2^5*Va7k=@!qQEnh<+i;SZa-MIa^sP+7u&k~ z(z9~z?L9hS+Ds2mub`07nuex1t2Uj#aTjP2(1id0|Np*p4QSxI@HC*|-pD+D0|9$zoc-e~8YuBGSd-g+K^=i+M_eli@4;{X6;X+GC_d&1lud^0U^9cI; z^7XFWd-^9&`?2Scr;Eql{ri`%S~I_Ya%bW>)@w zVSCfamAO~1WLfa1B#{f-CS;w_`yKbG=8a3KsKqqByn>$T(X}jl9#*?mSg&w8?x}Xy zyyfGQ4UbnI=SI9rsd^lUU z@B8A59pbJ2oZ&Ba#NCN?S;78EalVV}N+o&M47*pGJs#$09e%i2mWf$-<@D)G_|NCs zNlov&b*WK%%U#VcN(_A4w!gKulljE>A@llO*MKR-vD&{|uj(nt^`C$7N%g@4kw=a|=toOl?1eqTa) zU+VGGUG`sMIT^|e4Hn$_^?mQF-BK5x|7XwXHq~ZRYI~}E??YJr)bi8?PKvT>WU0BD%zopr E0A;OcMgRZ+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/camera_with_flash.png b/public/images/emoji/emoji_one/camera_with_flash.png new file mode 100644 index 0000000000000000000000000000000000000000..6ea04f771957e08606ddababd007acc810d7b403 GIT binary patch literal 2007 zcmX|>2~<*P8^=jZ9sQ>IYEm;DwZdHxTu>xI#RX7Q#3h6QDR)iLFxQkKjZ|E7Crg`b z(h;>ZmlVx18~e1f2A33D%yKFk_blbRb3A9xdGG)Jp6CA0`@Hvm?zwz#lG~4}TB;xr z=tsOejttzf|6D3yK!ta>A3-36L~jp@3sCAqjDVGNHXB$z0YLx*Dj$JwceWKM|Lp(( z7+6uU008EHb-Taqx3WWTZwoY$XzcbQK(|K#a59SWt_KOggX@^>aexAx#3onr2>^Fq zb^;XeKX3kLD}XQ z{xlMe0gmeI?om=&!OP||LZcGWxL8*L`52v@z@Y>&+&z8VNMs{(i{sJpr&H2`PlS61 z1X-hwI=OoUFpdKU2s$2S425HG?qwBKXh#=EP^!#yGK4G7L zM_2>70hyJLO+#3Rnk&eDDfTz*3J z^bN>98=jpjkbhs4KXnia{CjT%2`l;X)p21CzPIll5Zv<@e|nJp<@4q8Pp!AE(B*G( zZq-F*r;%p5U5g4by#1-dlGw25I2tQt`42}jlr#o>c@C$@Bwvs?Q;e-)VzGNhGo_h( zWO}1|Vwp%Uj%gwF7S-hINyQ?jcYeN@DXq!R%$JGt#TGTk@z@knA+NQsJehLs-#?HH-mWGIT~wMUOt6C%fcw zZ++|HgzZMbiPhKEPYAHBU$PofCL7;jB_|X5eUFTD!NZu=)4N=cth6Ki**Nx#kr`u| zATMuP@_eFK6T>W+d+8Uks{aU5*l1F;Z`2in`Yld)7wfJ%(R3JKqgyJQ$vPP#b9WE~hr>4q8lFG$S{* zm@Dpkn_U~uI+wIms13F_HKtkphtYeTWNPdeUp8<4-fcFxh<3>FIA>{z#qKMM#q5Xd zT}B~U29kx181{GyT|ykRoqt=fnA@+LF~m@^99k-<@8FKnlAD!52V&%+>ZbM}WUYmu z;ql|g0q3g_b_~t`7(Q-E)YJ)8Dyu3O1x~7QlR&Q$rQI)+knLhCSwUi@KL#BQ1 z8fYcZjG_DR#*{${HfGxSF8Mzt53 zR_Us9iyXFwOfRs{N2nmvxPMQh@$d+|bxMci*+UDV;Zq^FfYF8=QxOyj?NFma4q6pvQQ)hW})Y~ge`am%o7zIv^&3X;96x$b%v z{o%Y-*}3K(-L}y`*YqI#((zYnA8qVMP{W^N-6kwMcL%qhTinlmx8swyI+?h-nGU^U zfN4C8ILE!dW0b>wM$%b)%31vyd1Lh&yHyv<8#z4y?#6NYzt!_^dk-VD>)O9yFSGi; z9-K=L4v#-Le#9he=Y7yEEJ@ZB+$)ynz&`b5b8Y%-zjk4YiwnXay!et3jEJTfu@&zcp{B>8nbwjY$zp2qrmo1zU&$HMUT| zZm%kh(rQSfT-D8OGQLMbU~gbtdegO##L9%g!@PJ6~6$>aS^C_1{eDFzAx*36b<}nCF!$udjtl zIBbiXuJ7jue_z(sZdS7EOE%eKWaxSUH2#JVH5>`9qp6SY-Y5?DS2uul=WCj8w!uDt zOv<0P7;A_JLsmaoPV#EOUV28zFpcJUh=Jse@EhL9>wRB#$89F2Y$`Bc_1n_$f=E4G zS66FNSf+mC*PnMh+9lf(W{nbIGvrtBLx|zMk2IfdipJ|baX*8;-qtYGmLdcGlOVhc3D@MrJo|t8 C&9A!v literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/camping.png b/public/images/emoji/emoji_one/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..943c8fc7d08158abc35d429412853ff0a0957eeb GIT binary patch literal 1521 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/card_box.png b/public/images/emoji/emoji_one/card_box.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd527452d4948bdbe775421804ab8976defd2d7 GIT binary patch literal 1553 zcmV+s2JZQZP)oB75Qgs&{0Mr3Fw=&anVFe6S)Uy{F z0yY1;^qg9%W=R;n<5mJLrO*#?GA}N3kV3Hhau6f(l!?b5+FOj zkhaLA3h>}zh$hC^RSL`Rsy>ugo`&Y;7PBM)1O>%C0M=F78xZfRS9^z!BYL_nVO^&Y zKPdu|(lTU(C8;Qv!gjUsvU2=XDA=+a>`_VZ=gRH&f2S?8>nXtQN&wp}(vz}N;VyTC z8I#9Nf-U2xLDHl-P(FDcv`kq97}h0N<0`!b_#x3w0_b++^TjJV9?q!2VBK>JI@axi zpBAiRg|n~}RGlyrawg3M>y(A?)6}I-A-U+ieNG~JH@CECOaR`7JnrhnV*yaN{SbV) zavS_Udlk2E)>Tnho!^=(GzcEJ3W-L<&x-nnhF$o@cbo;J#V1o(>?*Wu-Ur_;*(4m| z{?fVdXv0+c-JAD6-8~K-C(Z>7?2JCQN(^tRtFJd7J^3-M)tyu42nD?}cOe!3c*|sX zwtoz~QinMfP5z3NCZxB|0@yk$36JhFEEZ0uB`ajR!%O}*bSYt~H z5Z`7O!ZZJg&cW$a)-yo31(!qhB(T;i@KxhbNV83L`$i-(w1@QT_xeo4TZSYC}EBb2P z80csiPGLPPnm)rm_eb*}&U@tuV9-67CxCV6Zp#3EVUqY>E4stRY{CK<-`y&MTO}@U zOGXGy{C=}PROb(d$k0QuZRZ})QvgxdW`S7SMneeD$_K&av>_0uj({B-#=w+m6P$kp z*Ixi5r}m^Y0S{{XQrPU!;Sh9i6s%c3mNU|mBY-&Hlmj7_g}Ms(_QC)_QYhGKpLy&D|(~ox-fEy(PpFxJZf#(2(rT zunOWQKZ*FVIL#H{bYVhPNjQb2i%^P6O6~j$ll<5J100000NkvXXu0mjf DRt?Dp literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/chains.png b/public/images/emoji/emoji_one/chains.png new file mode 100644 index 0000000000000000000000000000000000000000..d743480f9828a775441423714e4008dd1b431f05 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!5(0ceT!HijqQR6Ivyl-{A2Jut zo;i0ukPVUDlV~Obv_q~W$S;^-|9gS?1_k%eJM;%AG^~HWU!cGsAz^-l!+nMR{QxI|4EvBz8h5r1%UngV6lzW-&x2ihk9Xh?ycY=+9cTC5#uPi!L z`^a^1vV;ExCJRQ78ZQg01eW$qUtHE_FoqV&30ThEF8rWi$Gi3HJ6v0zn9lm1+57W*{O{HO!!IpSKCoWo>bwTE-D`Hs9}v6g zP{5ra{fTkGcjE`Y51ls65xK!KiTC<$Mg#eSUxb#jzo}pR)tQT@<6-bN^~uXV2TVH` z6JTe=)wOiV%lfQoZuYcBe wU*`78Cx-m7-!`7NtGMMJ|NBGk{(JiwUf9g@G`JJ04vbI+Pgg&ebxsLQ0D2xNGXMYp literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/champagne.png b/public/images/emoji/emoji_one/champagne.png new file mode 100644 index 0000000000000000000000000000000000000000..56e394220c4d55c195beb60e7df7300803ffded9 GIT binary patch literal 1913 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 RXMyRI!PC{xWt~$(69AXI5F7vi literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/clock.png b/public/images/emoji/emoji_one/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a65722fd4133b663022d0af1f02c25ae2c693d57 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!asqrpT!D0?n*;Ia--R_-*G=3u zr531VVN-rZLP)Z|dtSJov9a-&<4e<`0_*bej$I54j76RPrcMSKOuGg$8Em-e*_OSt4%)c^*DodMX1Q~l9jG3{#zD!=P1i` zZY$YV(JT0R#yJtjReCX}&!4}uYY|(B%X5$PfThV_zZ^L=HDL3XJFmknKi4}vy*l%L zB6Hy04dMa%Q3u-mPW<`!=hvw^Mdj#6{ns1fJx+)?Ke3T}AfsgWlhsS^MYWuUe{Cyk z%j3p%j~Uq$eP1m-C(p+ok$z>;p%OmPumu-xx+MOSU9s%p;%W=QjI|Eg>_HrIRk^dm z#pK_AioeKWL-7kehMsX6231*bO}DZCGFJW#my%**Lu8`HI_ zD95WgD;9>CWcBBt+sC|hxnO2fzAF3FAJdi`JR9>=X2Roekr~XV?q8a+U$bs@{~MON zgL3cRb7hLDH^gr^zFOs+N8%JYoqc-_X*fB&tT-?=Af5dmfB47x9kUp3FJ=x-;Oa0} keUbC8<2Li;lV|raDB1Kmmdy;>2aFj8Pgg&ebxsLQ0DEKpvj6}9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cloud_lightning.png b/public/images/emoji/emoji_one/cloud_lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..a199f6e88367d807b68fc8704f89b31d15e1031a GIT binary patch literal 724 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB}__=M1+Uya+)MHdYb1 z6p#Tya9uzKF4?yqzWnmw&$(IEA1v5A#yuY8Y|GmI`hx_Xl1RCZWobL}f-)~T$ z5U{>sf5F|wAAT_~FkbX@aSW+oyn6NNrX>zMtPd0(uX|m+p{?!W_xfG3yxX%U?2G*W zulSOv=8OC0GCy{FIJWN1XT2Hf9WxGIczgLbPeGu{aRm-OOFgr{->>^S*NTfWn58^F zoO9=GAEQWP+C#YmJvuw==JoyR-N3M?uKFu)#2Vhlv%)d_;;wV#9x-`rQDpnG?bnVI zi{0-R&EOPlurqyGZE#90P27*6EqAhcx7yCS)w&NZXFqylMji7yGlvTz23HlVME>y*@pPQ+~dC^Dy>gGy=`#I zTs4K^&MMA|r*B)H2V6hhSm?`Kk&+nfz||1NOq&NKeR|{8gl) zcWdvKH2xTdm3iWfA67cu-|poRSk3Jm^CU8$`@eqls%MAJO?$;tyXEusD+k^#n)o;V z-{K_YNk10d=wey6>d6EL_ls3re?@hjW{^^t>`({Y% zSZB9CvHQ%%efB8tlg)9L&PRM;<6he$eP){MFU`s8zu5m^oRE9`_A7JNb-;AM;OXk; Jvd$@?2>{zFcQF6} literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cloud_rain.png b/public/images/emoji/emoji_one/cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..d285e3f759dcf72bb8af8efeba1d979ddbbdc9a1 GIT binary patch literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB}^I2QNCUeT0c1;y@CP z;A$WuKrTcLoB>w}SMcliA0T`G$?MndJiU11(Tg`9|NsAg`@xHkpTB+k{`2jJFHc^) zyZ_|%*(>*toV~UC=#>)}?-oiF90WQ`z9h&mn89Ix!+U`Q0|$Zr{`>D63eL|@Fj#+H zAwc2&{DA%I3s%@I4`5(m3h;Ds45?szGPQNmZ36*^*9V!ck0xIdUUT!*|Nk+8?5|uV z+$*>rkW@X>?hpT*x}AF)-u?UYdVlA8E2bEe+YI9$leW$LQ@U%6Nxh!;AJ}1l1hEE4dZ~n5>&*+@d@OjZ6R))I$*Bd5w z*p`HTDw{CBXK#P90K16PE4dqNoEqKTn;7nhYVX&qJbEni!&0j)4?<8$6GyA|Vp zpK-HG&uSJm?g{!wEEVb#oqrrVGuhZ~^}?47+itXf@NYd))v)`{n--%z3slmWc3pn* z=0)X{mDih>L^d3EVSUkjHPlmzSG<#=l}7M8@?~;xFjs*XVMrs`Piv4cD5 z1-s+Vuc{}?j@;tyT42(@Uo}%x;tj|mv6!1rRALwIZTChO0z-wMZ+a5lZspoG! z;M@`AFsb}9o4*6=jW_QP-x4S_>w3*%{#0;IDU)A$Zmz}LEmNn2Hl2N!B(rbsq;;H8(|F_-#KjXpwcfbCxeER?NhyVTe{@?xj|M1)Y8(;jt^6CGA$N!&x|G)j=uV|n( z0wqCy!3_Hw1RNCJpD!>7xZgiNVSRUs+*Aezrg%>m$B+ufCsRY44l9VbE*D(!{lUgl z|I96;7CU9sKmX(M{we3DkNzvJA2omd%lBtgk;}UK6V9uIpSZdDmlwl@%KMB8tHh79 zZ)gs?|Kb|snNLSUO@$p6UlqK|u;`57^x%^d-C{2?tmdgzv}g(!lw0B6KEI&N&z+4i zqVJ`ugZUS)@6qkN6A#Nh={U$zu-D4yf-9TuglqntkL@BBuX}OaDw1o1)g+gG+W?hx zyA8pDXMaZW-(&JQmBKowi}Uv5-jCIvpDUcca;NmS*}J)xVak7|US#?d$;8BvGsQJP za94FyJJ$iTV>!8t=PkZFSv64aT(yj*SdvI&n6SxotjH|b~YBX+xqQTA(SYl96G6Io6DN$4@oVn?ZfIL+#WSc z>UnQjY$vqj?a^zV8;vFOKiw|oUsOIfQcmT(@wv~AUW&;ih#4$R&0yYZ|=f4Sbw6Vnc; zMB4~!nnj2@xR$?rQp? zQvIc;*)f5xLaFfZnsvwSK74lahQvwpi1y3}@7Tj0`|qEqvtQ-#|68)fN5js1`Pa?@ POoj}eu6{1-oD!M<81akd literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cloud_tornado.png b/public/images/emoji/emoji_one/cloud_tornado.png new file mode 100644 index 0000000000000000000000000000000000000000..00bb97ae09af55046f2bb1444be55b514c083fa6 GIT binary patch literal 1453 zcmV;e1ycHnP))}E=T*xlT- zz`yeK^sBV9-R0%Dz`wl9%D2J5Cx-rdpI*Y)@J=k4vVy}ZrV*52dez|70&>+8VF z%Ffi(@A2{O^75pwuCcqi%hA#D^z)~(vBlNY%hJ)++S=FP-?qfV&Dhwjy1C8Q*TBup z+T`QL)YH%1-1+(W-R9=Q&(2;L<$VAE01$LiPE!ECK=02GpD#HE{p{ z1TslPK~#8N%~!>O<2n$G<2X1VGBSj5W)>eaGxPud#&b)u?2R*<__lQkxvIIPblxO% z$9+vtOZ2qJ-kUzLD$CJi;Pdw*Fd`(oikq%9K?|wY4om)*Vz|bJ7?~?2A_GP zrqq8t77gfxlbdh@awy#xp5`0C&lO{u+o%Ri2=hJcaEZzAu?U>Xq=%7{9s@-fiG+3^ z5nwsuo@NLU$c4)o%SlwvW+rrRjAjTN%avJRLFqQ$q#4eA=@IiHkglL#9V_%wiP@H# zdke5PX>#{=K2@2-^}=eShCsasW+7eNbD8_a%g+N<)yS!wxUTcBBpu8Nuz;YuaAod5 z<@x*Hlo|o5y25BWkg;_g(?Vqvt{|ij9=1=;k@wV zvv=HMiLvC5fbYL+-N)$>4%nLl#l!E-E$gdKWsIyWie^+Eto;uyYq3dF;swO6l`X@8 z3nCwV{M-s7=>-v)OnZhBU~Bgi%i1L{Q(nRFJzS~Sq7pBDJd}y{c|mS9P0bRXVkd$6 z^EeP;P<)sGfvh%ayunp9Q6YrdnBIv$uF05?M3_ zKSV6R12FIxvI5Golzl{opix2DAI#* zWsBqMr(zhxWm=0KOC!JprK}RTR(UUn_sO^4fy8b;QwoBZ$uuIar%8bUkYoNdQuF`T z(|`DCNj9P_n9F?+)*k>Oyo9P#pQOHil$RIeM}iW zB^<*7;uQ#&LING?M6JMh*f_5Tdg(GD>3A!;>c)vnBiH8j^lSz<)+X0vAw7 zSnleE(eIqWK+M|o*}r>Bz@%|4_nott@Di}~+WRjtEeSK()K7qOF#wR~!aBZ7R^puA z^PU&{ORs7NbbLj*zVNOodTAL;D8AOY5F-r;rd44-g9NGoF3jYNE=;jl7cj^A<$UO8 zn47ie%lc8 zHLPx0jOLEE=>xUk9S@e^d``FJB(^|5tq{jCPeZp=7WMjN!`c-Jx1ClP^h*1b(s&7L zuq}pKRe>siL8;}112F)D%JeaEY00000NkvXX Hu0mjfpq>+v literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/coffin.png b/public/images/emoji/emoji_one/coffin.png new file mode 100644 index 0000000000000000000000000000000000000000..f38c07847e73bf5b4b4d2b831d7088a07507c196 GIT binary patch literal 2194 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 SYxjbR0|rl5KbLh*2~7Zl#|L`= literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/couch.png b/public/images/emoji/emoji_one/couch.png new file mode 100644 index 0000000000000000000000000000000000000000..95676c09e83da18cbc563638f5f563c398d80ec1 GIT binary patch literal 1371 zcmV-h1*H0kP)FaQT8;#gYj+E zSN4j(*WEk4u8v+Cwru}caYP{m_b!Vsir=p&rnCc5wgb$qyMa z(;O_^$twYUpV z{n>N*(CaW>>jOA-_Pmsol}kfoll=Dk?}AHyy)3`gJ|Z^?`hF`-_eNP4K;o{wkfyNj z`s1p|SD%WKCgAz74`AB#8O0Fa9+xO3C0V-kUyUNa925C+0AvaIR^bl&047hJmb^W7 zgM4{=s>qLZNOIi=vb$oE9KJRR_kKyP|4=?Umr)HzxH<(;tPqX(iqHJ%EL2>nV&1Qx;X1 zg!2!|q1CmRbFwJ!k3nga-a z5V0k*G{N&%Uvrcv3ooo}X8X_Iwlk9Xt&T0kBb`#mvBA=e2KL znk?rYZMvn9qE>;CgCBietTHN$2ZVLPd_PILs_i(w01~UJF|SsLqPj65EX$fYG7^;m$#LHUn0#C(#!nb>sHzxs}XSF~CrqAPg-W z!`{$QP>^I*7`IQJM`71-lHl=4LS?+ZMF^FaieelnYRU3L z;KE%%4*8`WdKOSx(cIfdAhXmaCc!2!gPMQ8&I?}d%+PGo`i~TLqf`V zPoNwHyNhoX{~d)4Azo441p%(2PEdkSCKyyJ;wkU$yERV002ovPDHLkV1jH3Z*Kqq literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/crab.png b/public/images/emoji/emoji_one/crab.png new file mode 100644 index 0000000000000000000000000000000000000000..04374656af5932282e95ff8c89e7bda4f404b80f GIT binary patch literal 1348 zcmah}X;hMF6#hbUr4p4UmvK3f<8howYqFv-asfU?Bqb#%BNH_vYsxJ*a4B5IL2+p@ zMN7x5QJhKAR3fpCl__Q?w^G#HNE5Iqw`{(d>)*bMN!qd(VBId(Qjg%_NiX>kP~d z003AA5rEda1WtR?RMDLG{NjEbMahVSBnodjgwPz?pZTwb zB&u`l_l2d9)gbQR*DJ2>_)m|XtgI}lRLaO-quzj2=+;8_i*fMKq}L(H+{@Rm&y!M8 zR^Hjw390%A`sIWG$ZD2IUz(h}kdZY8Qbi37c?E?Zn)%e7C@ZY^1&=a^s`H}nq zBP9pRkW01+Wi|qvGiP{ErzCHaNytVVi9je&O0aUCP#{xEcyftQu9OL|JPA*jQ%mRv z04*`-v7ZvRrnC3L)p2`EZ53>6czS-8tk7a|? zk?R@PLNDi+L>%`|KkRZApVk&~L{c6}9O-#pWOc0d<_QHWkfHZyX7@mZ{+6Nw`cJm8 zmT%QNbrF5hH3H#o{K>x2m@kx>;`D_-F?x~ z->;YvEn!$8R-xB(w=3)0FkR^gbG!U0+Zxnj5T@k^W})=`v#eJ@#RrDozHU+qnh|$4 zhIYZ3^e%iKtlq?E@h;B1qpq6iP?_xJw|c$A8FW_r=f9rB1puK5j_*8Zpmy0~Rf)cF zoq9hek+C_PE7c|E!4oSfNZ047yH{d zjEzt+mK}{5SLp(`v~hp~;z|{wu7x8bTAOk`HZ$N4st|`?o;n%>CV)^*^%FTXK;wcv=mZ3ei z+f|gCmw3K5a2FeNPD@%vaON5Ma-yR@uokRNo}StA*}4FA2q08uju}!jfMdmb2QR%X z4eGgr9{n)8LkcfepYq08Xp1M*F%b?J9`F1?I<0kDGd1taxVbZ2v=WTCqOI=;Z*Th9 zO6n$kHrytiXx&8g^2LN-EsQ>@~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/crayon.png b/public/images/emoji/emoji_one/crayon.png new file mode 100644 index 0000000000000000000000000000000000000000..67043e2a21be3eeb0c3b99bfe4c54dc0c4f1ab37 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!8UuVnT!FNmvwP6NKCk|w=KcPK zYwdst!hmyuA^}_4Yc~4o<6fG0yee=?(A~Oigiwobe%7959kPqk|4iehWYd7C*0pJATYl{ zAz=P|hxz>t@8>Hd7@X3OVrO7r4E1zz45?r|dLeWgvmuX5plPrLvk`0i_x%SrCo`=p zS@7?^?Y0-3)oZ7J?|FIL^w*&?;@4lcGJMnm+t?2Mea)bVY zzcM$(55#HT6Q7l^-hGdHOUC;4J=zcUKDz7bp)Y@c@m~FvH&-A3_B;EX{m<{c=kAKU zSDu%1-J1urYq8#47KIg zxEWt;uGC|FKkwGF7K7J~;vR}h_xH+(I(>@!rOCP^KSG;z!Fgfr)`mafQQ9m^)~^v| zx)hw%dO@j4uR=q_z5^qH!PC{xWt~$(696w+|4;w` literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cricket.png b/public/images/emoji/emoji_one/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..2e20bfcd034694a431cbd5031f2b44c160b0fbf8 GIT binary patch literal 994 zcmV<810DQ{P)rGBb0SnK_pgW=1c;^%>*(wxet&@O+`Z2zpjmqOxZE6# zg(T+Z)9Qu>+SAixlt840XRumQK|WyuC?>zMlDfTK9iBy#8lHu8c6I5{MhPGVc7oJx zpHp5=np#`+mWM$5!x+Fgz}HJZ^H}Z5U|>W7EJ9d_Qn!6$OAARYDhz4)jFJ)xUk+a{ z{i(xhL*-F`W7-}nU*FV3Q3C7$*aZmhm{V8eaZ}j-a0OW8KXt9`?X1#e{HY6n_<}e8 zYb?<$E~`@q@YwR6>S}3D9l{e9x_#qfH~U@NMEtt6;-dY-kN^ze##1L3JmmJdbt8X( zIeX!fzUa792P1%|PA+)Nf(3I&B$Skv=}WH6=i^VEobY@XtlP8|TOPYXZg|Xw)eDUh zpc7EU2I=7;(Ra6^fRLTw2>6osyJ>ym5n7sjpYGbZIYfeE;QRbv=wMxno-eO%(53$^ zLkSZd1&=`yhY##>vroGm2hSzi$?$|lQ}7C2!7F$LuizEDf>-bgUcoDP1+U;0yffhk z=dOulnTU}c9{-Wl)&KbQc?R6fLQN9QvO!9C0PAULCQJhDzjliU=aUT`B2(pG^nFjD z13QmWCV}>rR{^9bghi8~^7{c8Dz8h}uonUnuoFZQT;W{#$iBDi=lX9e5yZUOm;Z z`}HsH^}het@F?Is4*{?!fR_MYZxAsi0nG?+m8SHwHo%*A00zOWJHd1uh?#&5A^{!6 z_iTXYcK{#pIP?aq;bYhjmOB6?xCH`ifj3@((Ih~X0n%(7`p;Z9cEWxu0U8Uj6407+ z%`SKp5QV@d!3!W92mbc~yo8BX0vc0K+69jST-XJ|ad`X1d>pE4qJ%%uX#1c)7;OW* zU>R}&czxy%oeP!lHO?*gvjEo#Cgadu^;!&XzXX5}U5o`KZuWUGJiin8#n@hW(@uE) zDm0H}9QyA(jTTp4JQB^rd%zZWK{sTZ2mm=R{^b851`%S5Ha~8|i=KKv03IN(=lWC+ Q7XSbN07*qoM6N<$f}V8Cg#Z8m literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cross.png b/public/images/emoji/emoji_one/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..02a0842181a7ff0128bd2a05be893c61956a56f1 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!FNmvpY#h`&w}}P@6zW zkY6xEgTs4)f`s`B`|qzm-ydLbqE6rxQ0|wfi(^OyU#Ok|1Ecy z@UZQ?^Go)D`Z9}VUd@NGOp+h?B0bMq=xvlN40%&|)mEg!rDRzK`$Z#XQuVM$0NUq{g7#EF`-x5#+pyee9_L2`r4fdk7D z9FKFqlv9aY`mXWAqQlWTA@4$(A5L9Ra^b_Tm*r9)?kp*}$f-ZWLP)Fadd?HS#k%`g zr6PCpx5QKjvzS@wv!|sBZ^%dqp3YqQ*>$q3QykwDg-Pe*mlzkYojV};qo47AeC+@E zx&QC~T`w#1@8o0o*nc;ln{SfbU;OLW@$L2h?lW-m>nH8Z=Q99?0)wZkpUXO@geCyW COQD_s literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/crossed_swords.png b/public/images/emoji/emoji_one/crossed_swords.png new file mode 100644 index 0000000000000000000000000000000000000000..7e992fa3c39d9382a658096924323ec93b06c02b GIT binary patch literal 1601 zcmV-H2EO@;P)mA*W z4psFGXKVYtH{Crwv-kY}tUjyH>eCbtIx9u%;mcPXD&CP0_H6T_7vr<*Qi<&NwHvwtF=xOYJqyOf4=`ZK89{{uZSf#P z>)68?;OhnqOwB0q)QC{RUxdPaiBJjGalNyf8sM{Y0MiF3s2Nc;GrTICl2+KOB9Mrv zXbMvQfRi^2MSK|;A+abvfgl5L=^y0=pk>fEF$F#I&$07#ov0y-GD!xPVKYI0=EN^0(JZJmW|A{seL4D416%r#xXrJZ+40cjy|M zFfl<$I5|yE)GPjcb1M}e(}rjDp%*9}BV#7#2EiC0>YeYyTM>W3QPM-t4XJ*WX3!Tx z!-Ed$onCFFbiOa`A$=h!*cTuiC{pi<-Fi3g3lZrHb(O^M^z7YIo~!qW*85^H;ze?Z zLP-=h0V&TMYF=FI-!Zy$eD0r|Ha6jEN2kS zFPZNpO=kOBJ$)wGAQr6&Uv9e3l}IG^FsHhN8*0>5^$EGZU+?LyHyZ>!MIvT3w!2W` z9SI?kNu>BYJ<`&hC8b~MyGc4l((CxXzHY?g;FM{A$C23o#`>(i zS2nnwKAP@8AmP+GMFw1x9G#lZ4!ylG&j7DX171W>4tw6+&ZoQ4!;zX`>CYSareCPT#^?L zT)+w3tco8zzP9qiwe8toZ7*d%T-%Wyc=4fHE8^I0x&SzU3pjxrI9d@ub$-*HKU!WC z5(oxlzec;W8kykPZn}sK4vG)Bfg`v!dgWi#g#+sEKi${~GAUN#yX_CyHUKeH=B0=Y z4jeadZiI06$Lre@d>|JDDF?SPh=AD5FP^n+0AeVk_aHVnaNGcJhlZl!or$v>V|*Zo zpKk0Bs5hP9;K_|vy0Y4JNDNQ)C2+~(2@TL<6mazPhBd!NyV&&l<<`z@?($aMSrGJ5 zkK<>zC~~QVtv8iG4ApmhJyXF6+_*A@7HF!s+Xg*{)^ctF5Faq_g-A`!fY5>gp)vrm zxESD;#~YfU4I1+TR3wDjTIdIeE89|;P7%_Hc`wCQq@|~8YxqJ8#6nEOX391KSHfT4 zvITjM951W5z5h-YAcfHE+`J<(Rs{d=%EwRR-N@nu8X*Q^A!goD7+h5e1JI&$(c?Q! zG2H|y=qU(C6Y+CaM4W#6F$B?9#j$(}MYbWP>IH(!IB*7cXkf&LwE{%sg`|4;@v88v zW?>cRK;)Hi64eGEed`UuP2&m9bbOAWu^yLW^%5O$5FA0(D&Y5HuRj7;OS`{EEX33~ zfD^be1Cv5*l%3U%nc{;`cfCi}qXXXonh}1!XUBsJaxaINhz$sq#u5l{ueIu{&+4=KtUmt%*~w@AxC_Go00000NkvXXu0mjfb`|l8 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/cruise_ship.png b/public/images/emoji/emoji_one/cruise_ship.png new file mode 100644 index 0000000000000000000000000000000000000000..742713677963a2430098b85e91d80946350e3d00 GIT binary patch literal 2544 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 JPDHLkV1l|_pmzWO literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/dark_sunglasses.png b/public/images/emoji/emoji_one/dark_sunglasses.png new file mode 100644 index 0000000000000000000000000000000000000000..cd95402d6e2d43abe0b20e08ab7b94d3c5213fd5 GIT binary patch literal 784 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!<^=eJxB_W2Yg;s=q^brKfsmLC zpg0`CW#J+~hL)~AkTftggBS~BTiQ8z2LyTe`o|hJ2*MGxf_{V21P{b8=KVShqnOTr%)2)7tGM`e!hUi{r3g}3g;C9_RsHc z*dK6z{rUulg7f_i1_cF1o8S8|FfcKDx;TbZFuuKfecC509@d1V=2h==)W6snzyF`7 zetJ%V%Ne8k-KWcUi}t1%e&G+%n!0Spgg}3j`}O)R(|LAP27azpS(aiT`u?AfNJmUN zkCl?R%P-cZ^HMCgRI{8qzNz!3%v_Pl-l3M{z{YIY`GjK^;|g836oW~rH7$=?1Zy?4 z=1=lXy{03Zbf*2%WA6U=y7_;8p7GbL`jVo@Qg8P;n9K0F^~Sa|+kdP1Z+NABy2$h` zKV{FtXOm*L9(-N|M&-P(`*(>?4tsO8Tk8C5+qWBj{AAkUc3SyZwkgBA*XfRv z_;q)Gl~BpMdErwkk7jJGyjl6}!+E8S=O!j!k$s}~`>vztnjnu&e`}lG^KL&Eq;a$G zusIIcaq~v``oByQ#sd@X^G{p+^ zroOqTzOsMyyJKRS^PUM_J1}91VnKy(_@_pZ{V|gj?H4_{we;KTkax$+cC7hooMmn! zntAZ+LF=4g6)oQhcJW1f*=wfHxWINPCpP3w&<#cZ(29LdOV_aNc(YmO_I-vQir%$P z9%}N3S4PyF-^nL(yC^>BblamHON8~MH=TONZ_4^^L%qNB=^0v6PsM+iUnbbge7x^$ R0x;Sx##kXm#h+M&( zWxSVTkZn(&d{v`BDyI$#?Y7dFs@q z{p6bP&Ug6Ld;Z~$`tQhgt3uYVZ?%(N`|P~y#&*o5YW(T3eYHuhi(Bc(bp6_V`SR2M z-h=z@!r-}c{OGI4p=k5x#`f8Hm~~QenmYXFrT*iTrM6R#zEa}6bLPQy)39si%$VA^ zZtT=_{@{szw@T>HpZ(>akElnznqlAAee%wE``CPInK%3Ex1q66o4;7q+^}q$IJ%f& z+O=s0=&N0{JUz{Ltp~!r$@Q>-Xc) zc*W!Iz1G(G^V!AT>4U#d)a~%&>fq?}`oh)Az1{D_;qUDA`_k+1(CYBZ=kJNaWAO0Y z%HZeq@!GxI@b>!s-tPF)%e;qtiI?ceF)sL{r&)6m=J;_U9-q0DlR z#dpW#@7(6M*6#4J*5uCU@ZRFO=jX+e$AO&6bDYbc!QAT3;^qjIo#+4n1A9qCK~#7F z)Y5~J#V{C#;qP{<)b_E>wQ-fl_CGt?XHdUM+T!17@R$+ZK9F=lBm=I=Fw^guEy#%g z62A=5YG8@CMED9Qj6~>JJOWQrRmlr@%Qg}N1iHeT4ziNEAZ48vlr9K-y(c1&)D2e+&pkxcf_>D#=ZL?2%rZR4D5-bNYk{m)431B z=SAS_t_Ff|$1?CR+e?3OHZLs%nJ={}G+tIWax=4>32*NP@ zbd?4~!_3TNX2v+o%)Is9K0!_qK4wZ%dQ3eS_%?(8E46w9k0j}_ajC=O#bH*#L%{M9|01n0^%E`_&vo=3F-502|3)gx9yz**e zS_sg1hJJSq0!(Cn_8ic-yw8j{uwl3N0(gb?lP*wTR?a;RbR=mIK<%$KEPz>Ekye(5 z1$Z-sThm>@SeyaK8>X@V*svSzvEdQ`4#xZ6z-{|_wR&kNKoJ6F_xb}$B#l)1BJfbM zy4e@l4IpCO9VuP}p4q7ZM^Ne*aHlb-2%dr2fQP6Au^ue4$nv(EnmhxPvRiWi;NgIH zAJ}!{WF&}Y=@THAi2*eTNaJJ?1Beq>14ZH#4mA0?3*5<+1p94_un7#f6&4IAQwcK@ z05}iC0XDBsod<%;td0}PjTbNRmCfc~(1D62vqFH1ox6=9M((5UftJGGsbFOSJNf+1 zIe?mLa-)>XK1CaP{V7a&b*Ra*Zr%Y07LTaKbAVZFE89$N0%b!vs$sMhlIg<&+JI*O zM`o{206`%{8MPXC(QC8WLYmExIB<~9zs(;2)f-R|Q4OouP1ZPYx_7jH|ABwfLf Y1-k{_>7X&|Q~&?~07*qoM6N<$g2$L7%K!iX literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/desktop.png b/public/images/emoji/emoji_one/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb0db8794446c290f81cb94c84723b9d09e108c GIT binary patch literal 491 zcmVqlUtRb}Yy&g}pI00VSVPE!DY@9{vRd;kCe z4M{{nRCodH*9C6GFc3h|u9?EiSmxgUdbPOVSd$rP`3Hn~VY)fWMl2*_BjEC(H<-Xe zZwv&4OhBM>$vQAlPG^axB^+=ekvkml@%c5G&nI}`{rQCkgon3wvuTF_KG|Lm;uWCZ z3k#QMvCmz&0`!}yEt9oC;4Tvg*k#(+i-it6y5HRo1!n$t?(~4C@^{^S&%$jc5YS}W z+lAEZ5;a4BvH#cjFo0Pu4FNE+l5sR>z)ByJ77K8pcu{aAUXg$nLR3|pX(XV85M0KY z!tR2$+!$^(M*{WQ>!Q$pT_XW6?TYi2mG}#3E0hvj%9SXz7M=tsMFZ+MlJCa-1FZjv h#K=FMd-(O;f8WJZTWK+~f)xM&002ovPDHLkV1m*u&0+um literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/dividers.png b/public/images/emoji/emoji_one/dividers.png new file mode 100644 index 0000000000000000000000000000000000000000..8f162232c1fdb384960036dc76ead458356edae7 GIT binary patch literal 811 zcmV+`1JwM9P)bT=PBvS% zY}qop=vej|UQS(4TGX}LcF`r&0=Pc6s}I1w;SCvp>=tSPT%OUv2Vl#9x<3No zs0DC-N^2j0RlREZhM(P`(({4!iu6eC8tMSx@F&JL4X8i1d1>+nPi<8IWCoD?zo1K1 z8eG390(hT3gl8DLGHTB*a&=~y|azD59Y|E2e%`sx5+ z29W#D-jC|51b`U;_aD6<)mH}qGXU=Y=%%Hl`Z@t%23Xp?y7YcjUm*a<0Eb64PE~(O z>vB?kr2rrU>>N^GdOxbK6aZv^^?hrj_oMo{0pR|l_oMn+0dNMu{YURd_0kh1^m{iwbP05}8i{-gIhMgiaqzy~1g{iuF;08Zv5db)~;>*HObt1bWR z1s}~N`tmC2n%jf_{+b)z{saJL06qXo@qQK}Sk}Ed zs2?_f*GDK&_a|iRH2~ns>@F$Z??eOO#dZ?)`!(Q|k;Mv!d<_FQHla0*Xj}r+4;#Sw z3Q2pJQmoYPuHhBIYu;VpZ%OFaFn~=1>x24X1Hcak1kj{nc>wrtt5^&RQC@||EdA`Ack002ovPDHLkV1iz0fc5|Y literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/dove.png b/public/images/emoji/emoji_one/dove.png new file mode 100644 index 0000000000000000000000000000000000000000..88ddff7a6c5a275b927429cfcf5a4ff0e9cdef10 GIT binary patch literal 965 zcmV;$13LVPP)!0@9&61@NebKkVXt9tv>lduOV7nf7g5fQOea zb3+ci&>3tR6+8s)DSKT7GvorqN8Af2VIdDKU1}dcc-0-9IUw-RD2CMqL1+3`gl}(q z|E%zJ1W_T%q1^J~;aAZ95{}0gqWRFJhR_8rTG^8DHEi^K8V(){sE2e1Fx>(8=-w;z z;|H#?;U=g9H4jH&jhX>y@B8|~^;+J{#hrlmUqD#-IV=LO-3Bk6jTIVvII^|uQ<3EysT8`LnVhn$Cu>!`ImDS+9a044m) zg+~asv+2J<5e%xC3jg_6-|Vyi^(F-Y+Dim%wUw|ZJQRde6WrDW%*-!hZ7#1=C4hqFA ne~|eO7+Cmi1U9&18m;~xOWoYG(6lc^00000NkvXXu0mjfJub$% literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/eye.png b/public/images/emoji/emoji_one/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..9a71b4670024a9e39396ea3d76e7238eeb7ce384 GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Rs{HjxB_Wqc?Dw7|NsBXic6k6 zer%|#xA5A>iTx9H?cBL`^=hDAr?rnhe*Adk>9^E9&yCX>uU);`dFJi&ufMgO1N}BV z`TXl|b7ND~_GhXZIwy`F_wn?y>e^&)ZIh9jw&wOHyV<9vUVLvDTWVG@)1q;y&7^(m zh8A}|{Mzy0OYQO37heA;JoHjOB(r_X@sq$t)>*w!`{=7i1eAE~vh+n`2F{ z6Z_Ivn_5(#rnXKJ&g1xQ^hR{ckMqg8wsn`xxZb4RyS3XtaMymur*A6NwygfeG-Y=6 zl%Q(gJ;{3U+?U^6xYLrnzW=?$P75J!zr+iHZBsvnW*=LB?n2mRf9P+pWf39;>*;mx_7# zvK!dG%vRC$TDLCVs^Ob%mA=I%tt!(Ve#4OM{gVRg_Ae^$Q$F6!dFr2lops}Jd#3+F zKj%;Uul%t-HO(+r@A>}eXP=(Q*Z4E-SpKRx+s;Yo%yy5ql+QiC{PV@IJh|LI4^PRz p|HIDqzw>ZSis8J<$tR!4EA8mun|#@1GcfWPJYD@<);T3K0RZh3Fh>9Y literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/ferry.png b/public/images/emoji/emoji_one/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a8793c9bb9778623e50a9677413859f7dc2893 GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!HU{{FxB_XX?t}d^<^jo_2af?s zAS!R}1hOGqxFAG9YyVV;RN<{>!B-w--F)hE`BB5&=lu^}CS895RI~Qko25@)JI*;7 zeeJQ!#fRRL-g$1n?TX$08+M0pZF&B-wxbVdl%2CX&^n+4)^Fbv z6cKyp;Zrwn|CO7zS2ncFTC{A{<{cY%?yG5P_X&=0_V9^K$<*b#eG=$s;gTS~UcVy=Ebc+)HJ#>? zC?EFhql?vT{Qq#X%xnFAU;fQpkHe3SPYUXv8fL-5#2>ZyXS2;!1NKcEXWADC%;3pB zP@AI=T+Z$H$}e_j+#yqoxI?@aaZX%~Q@9!Gc2>P9V#u3bz*?-`{_qkTCyz|NGDW+axtM6%_M6Jsc&q(3>Y*H{sfA!XrGbMbA!{b=UOpGo5;uf!=qmY ziFMPj95AgZtlh_A9L3n=)G$5KrTSoN!|KxE>!z>-t##r|vzYI^W_s~;wZ6ooD#Zo6bLO}=-dxX7BT~>? zntXY~)5`NcBG+&0WN>b1cdt6nBKEZ~;*!vU##^k5*EVSDyLmG|FFN?7^MF&s`<*Yg zncSGdo%V{mZO6TntP9p2EM=Ft>*S!r!m}k-TxY6y56}V!&H(wmZuv)6@@@0A2Q~zj$psaY8=@R67#-V@)Se+AIrmCt(pHf-dHJO zFk%1s)iEJe250kM^iR+~vA%ro7M_6n&qH-$JwM+1J~w+KGi#h!b>pQo#&O4;_O)jB zKm9S`h|_^B`urOzbdxKcq>PT`Ofir?RsUkb_03wr9-EhQ*R0^Z^P%dT_eX~_Nh{85 z73$vKux8$k2`&K>m{|U(Ub)V{L_;#uT315be^L9Sd1u!DWlBAIr{%z$(;vU_Xz6U7 zRK|V$R^OTmTlHIgFLWihZO*9S<~6Zn%U<*L9OHVUEC1RQOXG?XZTIdk-Pg1);Ini# l%dyp;bL;(%{Mdg;K4|l;=a1hetN8Q$@NiR+M{cy+eSS+9n#T+X66zPzDD_XqLzkfDg@#O@K{+O@K{+O#pWW z7&e)pqpJr728UpLVnTiZEp7Lptg6-)u0;VFoq;gq2tXg3o1dpyAx8izPP>In0re^~oA1gl?$NYx^oQ;t#a`ze`~&1+B& z`2^5eVl|3FsorP+Dh;cXG7t+9-OX^VuZ7AwN}u%t95%epV>!%T?R$iTfwpqyCd;xx#d)zLxQ`Fv&%#CKXe7Jz00 z0#G>hQCo50^+Hflt>*(Q6&V9bPWW0f6$?#ACu6CV2t;s(69F zWu~|T04-(VijGSFbY~0r(hdRqgCig#D_=SQ{PX-eu9+4)@VP!%tfT7!_{b;DF2Jsv z)esU919y`%X<%g)wUPti5omc!sn*iWU<9DV)K1%q@7BBv33dIDo>$HfO3DDV!b=~+ z89-SNK-Db{4yfLM)0GCnfJ6m&A9I%#fJdO2upWR{!j3`njZ}URA_GwALX7SI7&!%S z`od))0)+)&D)ubY-Ok_#A|}B1!qT*{0Pt&jhkXMfA~umgaKRILdi(DCy(TPBk&?qa z@Z9_oW&lBH4s%r4ml;5q?w%f~uB|5&XBIkiI-}DA&&e&OSH7sEl2)D=02oROHe9iB z{RI#k0R2Pg^2$1BXjHI16=p9j-0;HVE@m+}JQ^QFUPt{hAQW)`Ooc@icd?`i^F78H z0QS-h7+W!CF@+ctD+&XE0khT4+M^fdC}s^xRW;}O(hMjMVWOB&>;v#6yhJS^CW^gP zV6{g7Pw~5$EpA_&1?8xJ5S=kRoIyVU-ms#00000NkvXXu0mjfp>Jnn literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/film_frames.png b/public/images/emoji/emoji_one/film_frames.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4307f187e72457090cd36f3b8fc7b0b39b501a GIT binary patch literal 645 zcmV;00($+4P)5W(TV8s8fs&P&&(P6^ij3Rb z-JhYO!^Fnt=;&^8bxB2=y8r+H2XsQaz{8A$^^6600000NkvXXu0mjfDlI&0 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/flag_black.png b/public/images/emoji/emoji_one/flag_black.png new file mode 100644 index 0000000000000000000000000000000000000000..22df4375bef95628d798a940b8c09f34256a5e28 GIT binary patch literal 640 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 AqW}N^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/flag_it.png b/public/images/emoji/emoji_one/flag_it.png new file mode 100644 index 0000000000000000000000000000000000000000..4f55dfdc7678c215320efc508aaf31bed6c64987 GIT binary patch literal 463 zcmV;=0WkiFP) zc85@?VvC46OvqSfpMEdLSSDfu#xySQ%39w$eA*3&Xh8YY{pK@!MG2=E) zRw>VVJvt*6K#XOAx&|kqKmo!%)2T!FdB!nRvH-y{rmCxMC2&Oo1jhtrhWF*F*F=C2 zmk~aYkTnw^>@!}u;ma3Lz61$h0|Dhrknjx>APn*dKg_rW3J{_!;XP)bp@s?&I%x$& z3@H%c7%$DOPYMJGQBna`kpRK`H++X7g#zN_S6`0+!6aY%x&*|335b;oaDNGKiUkOM z^36||fcPf?VM_$KGL0_&HwV?QN?x3WS}X0B|(0{4DSsZ1m@o_=-+?dAwc0V--#Ct42;U2E{-7; zjAt&UmN6J|xF#-o+`sW%{mRm_iq0$Q_b1=E@c-#-86W%*LaoWqd4Aw2>tg>$&Ec(O{dV%ZB?Ni^c<%VmWnINORKZ@TYt!k2j#m{Ep zCKvxDEz;sYF(Etxt@nUr<6y#);c6KA%1x8X22YP<;8yl|6g+-@AW*>GG8uHf`~pbmYs` z8($tgdKaFyD5K-@!`HdhEAp3}yZ_>Sc=MK5?>@aRYicT<{h_g^ynJDETgR+9^QzWd z^ljgLHX{G{$x|N}uAFn=_M?ELudiOOO=((w{9aQ1x*0kBpH^>bU2%H-j7{g8rrrq2 z?9HEg@AB<6j%jZ4!__%k`?Ell9cHeRGTzyCHPjt!RGX{*> z<{^uL+G$i#LKLT%^f>MX8&Bj{!!>EORKEXkOgt4*T^`lMm*&H=)z|8 z@3mwW&&KqxAGK;%x1R{I3u&o0GiS4Uwuql6k6V56R)Me9pZoHnna?C9+^lM!?`kUi zx4FaioV-il!g)V`FYKs$u&2G_W1m(PlS`lC`vf*wJCTd?I+E7>U&@f!boBSke}&!= z3vRdlSRzt5p_OS@%wZpsd!kBg(*zD`ZDeO*T63XE{QJkI-$JtzSe26eH6}6LY1Xvd zv51~k8?x}X3jKBo4lmMI4M#sL8&9oe+ZKmK^OrC@zqh1d zX~$%Fecz14N%?9g87FVaW0{eZc`1R*s&R8?>t4D0=BIydzOZ1%1Kzq>jOV?7oW6T> zy8lrY{|)?)?=v>>^q=B$Bx>pN#bW*O2}ygF9iJJe!R@hefwmdKI;Vst0AYa7vH$=8 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/flag_ru.png b/public/images/emoji/emoji_one/flag_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..472ba846d844e73ad2755c771725dc64a32816ed GIT binary patch literal 518 zcmV+h0{Q)kP)HHNgnWNz#GF~+K@n~=R-TFKp>EoJz z+;+`rt5&V9>l%0sKj0d8#5DwX4enB#egXj!@Ja~+G`Tlz!2GlNb~fkuL3cBU8|r&Lco1g+z9tR-~IqD z++ipHR)CH*-vBFd)fa#VR-)|-;2KzoLtg*{ti-jp15hH}0f6QkpaxI_fEqwO1a${M z^&wQB!u4aQeh$|kBK4P;sK2j1ws+4yaLLf4Geh<7!LtNhD7pN51Mt9wYNrHXA*q|b zf>qGY3BUpY7a|&26GC_bTnKscPYxjz(7ZRI=5B?kYU%fc;4bu5Ag~6dF@z-cy`m6A z^V&k7lQb_w$n;>0a?hVK1e@6vc`)ZJ@mQjrmwaRPD6twmq%$9MuZ^rsf}j&m{PpSg z`Zil5Y_uv8gy~B?zc3o`@B^+VG<*#KUV}3wmbg-{Os)OuKN3u}d_#wF-~a#s07*qo IM6N<$f|V8IEdT%j literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/flag_us.png b/public/images/emoji/emoji_one/flag_us.png new file mode 100644 index 0000000000000000000000000000000000000000..4c41fbbaa6a513aa18c8fed9b5c5ac2db89a68cb GIT binary patch literal 770 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wg>oxxB}_7J~0sF)O`?$AngAz z0OUf%fdX(@AOj}?<^o0jJbeKqKNi(DZo2ku z*}Ah2-T}EcUwqD3boTqEoj^l?Dk0V#x&7u-WozyFD?nw1D=q?!dj9cy>cX>+jbd7X zPB$tE@(X5oKi}ZJK|z3k!Fz%G1q}lC_s^eS(BII1zTy7<^XKp1-|wIh;PBp|p#T1R zhxZEe-`{tbI?r|w0|Vm;PZ!6K3dXb7TQ@y6;9(75J>|3h%od(a!Tl$n04Wrs@51?)f+ohgUa+_AGdR zYIV1OIG4gTX_cE(QXjmibbo1W^XsESuURQ6@ji>B{YwwJj%tE;9J0JW=@K z3!-lb{92dMpk}1QkrKjt!KIIRU)K|ki8q`t+bm$+H*;O%lLo~fOZp?ZWwuCV%?Ch(ZhT2y3nzx2e;?-u9uOlp%t%3?)n zCrgtl%_p9uq%dvVW^k!3VxI<&$Y+ODha5!T@wj9$@7R9mO4x@5-I}EjJ^6!Q9^5>s zRWm}hg6-U|51Y0!bG0sd@NxdG8m9fWC;M5Of8SA;ow$N|&CinKv(71=l)kL~w`8N& yO)IU7`SF|PtER;ZW6lCo1cRrmpUXO@geCxY1dHAP literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/flag_white.png b/public/images/emoji/emoji_one/flag_white.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b355cf747ea7e0ed7e5514891f5b8579e1c6f6 GIT binary patch literal 638 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!RtNZmxB}@5NWjk79f%+Ta0ZYI zVMAnHJbjV5$jTrpAl&MV14ErXd?rkqvS#hNef##8R#b&V!~}#!M8+oOEakt!T9!4 zY7w)efODem`k9tj(zqV~)fY>xa*OmL0Mb-^PC0;Q8;m01?)6mh*W0k2DnP^*&=?bllRt`{l$JqK;aJ zV+|k7F}{3sr$Ozx-k&dgI#i#(DkxGsGNHKm!hP|i6FUv0=W}g*5+iq>@9uZjx3@bk z@y&PMYag*|+3BW;qHm5mmg1ikrp;mIKQgIU?97DXNlC1==N7*HE^8@%cmH|I+s_`) z;av`*i=WK-?7(B$uGyjZJVx4QVzJu%uj`k}g;+f2%CUIPk$=%bZfe3|%i|T@XC3$V zZP)NQmMV~Zj&+ag6?v17Vju5q;7U5PvvK>2*ylawH-CJZQ(otP?!V>teRk=gT;ab} W79PE;KGzW#GYp=telF{r5}E*%m@Vx9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/fleur-de-lis.png b/public/images/emoji/emoji_one/fleur-de-lis.png new file mode 100644 index 0000000000000000000000000000000000000000..d802f1d5823580ce4ca93be6a7d30e2314d6f35d GIT binary patch literal 1178 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wgmWuxB}@z{qKoK=a>IHJn_Tn z1>cTM|8#8Hr_=Ml9iQ>}=+uuuaUeRo}@6S(IzrW%9`+$Ok`w8p&&l?o% ze?Ncz{rB(RKjJ=ehk=1P%hSa%q=ND6^wzS^76PrRr{5IRr!BLdbcS!w|LV8)UAF_S zSI^O@O+6^Xd)HF*e|4I1p>(EJ-l5O6{&$=LL>hNAvZQvp#Pqw|cDna~!DY|Rm$S($Ms+>|U4v(w#U&+f?50|+*;dKDB_YC+R)>4CR=qJ~zPUnT zN{L(N&-ilx37(Rg{jDsba|0S%j|NYi68WJbzg6hMu{EZbTwI>}YY29#w8lv@EeN5P> zw_sklv!Sn_*Zh_93ncg$D~k5rpSz;;%JjO~*}1F!cBUJ?*(-D8{I~Dgi%ajx+rC_v z`P@eL!G&{2o|&3hn#ASbDdly4zUZ>=QN|~Jrd3tC)mjgALMQlFr|w=}C{!5YXyCW~ zoX(xQt3TbnS-ZT9&HXFOVKM$U#vgpG&RhM=o!_ZkWTwFP!}1~@!y|{YO%er?6$=A4 zvcGCQ&GP=-l-o!9G`=5gJkx7%C)>^9uJA>^L!o1s-^l$k+ z)llZ;QE9o{e6cx-$#Jrp`_!seT@DIvcFx=r`;t2>pFg#|ZHvfpm3=D<3SRwXuRhrR zy?w$$qq-tH&)GI*M5o4=%f}t29q%oY~vY+r2p?ewf&Coi~UdoEtC z8ugZU&5rL?CR?42{i3usE`N}ALwbj`){{wVWXuvCCOH0nbh2ji$)(?0U32?o%_c%U&yBr9dm^?Q4k?_sA8hxL8m{obkhSANf(8Pld;&&pV%Z_b{| zckq6swSb&R<>oJJ?U&ErbBfhse5Ki<_4?nx^PLhYLeHbK-&RR>H8XMu>RrEfD_4&H zetO!o!wuo_S5S5hu<|@I=5`OCSjJ~lX^O& zCvDnElXT`vt<5uc^c_;YC>$UQ(S_BajH|CdR*dEmv8IMohQ${)Aw)xeaSi2WzH;Ty1e`o zn3$NDn3$Nr0`n_m4FXo|cEeMJ zy{X*DUzXp5Ttz`*R@9?AS&Ca0KVzlkrhGkbH=L~f?E-i5U-0`VAFuUH%C}?ciCL)9 zKAaC1jTf%VyIx%(Pv+zrbC|Q8rGPNjjvd@7S}61~5=C{0)MzCy_Mi^-TZwNZOL-gw z3_LQL@VMp9ZiyIenHCvWoBWXs~)%FpyQv zr;Vk^NuG)?J&ya}qB}e*+bzX^83`Un)_0MO zLQj3Y{5Zpc!iG|;rQ1ulD(?%|E|?!H&n&62pwCZVFulbr-ws=cz6I$&&uP!_+SyK$ zaDyl6gLEM;y!A$nqHew6T39q>SkaNFq#@pK2VAEC-0Y#iy5nxpDhKOZUJ4Tgc^*h4pmyS%L!EvY$_VAkcSyZud zJ2K2ob5?i}B`Dv+YE%JzsU)x{Q{DSJV^!^2uCAWFyrl8Ql7^Qb0HqHqcle+F-zPpw ye=Owpp!_KPNq|Q|6Tjc)UW|!}iHV7ciHUc-y;r;+*6^AD00000qz` literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/fork_knife_plate.png b/public/images/emoji/emoji_one/fork_knife_plate.png new file mode 100644 index 0000000000000000000000000000000000000000..4174200d939860703821dbb513bdb879aead7508 GIT binary patch literal 923 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wgmWuxB}@lJNDmt{0fNB7;r8` z3dn_sKp4m*TrWhy#oLb_zIb>2!Slzj-k-m5|Kr#1oAw_0|NsBq6X$>Z`Sa@i=l7q# zz5V$0!0AiJE?j^1=HrWZpZ@;+clg}Z^}7$=(HI{(Zywf`$Nt^$89I=lj>+pKqYh zFEBsrdRrF*15=Hsi(^Oy(@(rTU%XwcIUnGvY)fo za{d2#`Q;@xY26=AuToE3T@W*!>C65r52hb1T<}JlG3`NjMk41NwkI2wvP3jRbKP8| z?zAUq8-ty8h}O{a2e>OVV$$C>?= zKK%6Cht=G(9@dHcw>bK;#+vWOx#qjaPcSg#hP+^MumAVY_}p)$MfS&^@B1dl!<5BY z8ESLSzEi^g`-({?X0vR0f9lul`R`nsc3+OUwk%t8$;-aCEA@H4_($LJbY@ePj9nlk zG5gU;gK3&3Qx`}I2QVFe84)4j-~P}nI;bhg$Kmhu9fDzI?yn*PJ{ulb->9c?!8fF9 z=EEu5SPND>D{Y*=bb74_kNc{5YdkOL1c~xl9-OdhQ-;8g+iW;vJ6WyfQ$D)F)D;?HQ-N5M^|`Vq!VtB!H%FE~9fFkp%Gxu%CcO^X5@ zd@GOJ9jVS6H1eRM*cEz6&oBUKG!IHD=`>!XfSTY1MF8@yWYR6p}&->-&T=AN! z#)F(4e7lb%vczvV@rd=0QNQqut~YO;j8`A3WZZw{DXWcrfCGEoQ*KsOd$B96|Nq>q aVYy>_yLrvdD0N_JW$<+Mb6Mw<&;$Uv>E1E` literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/frame_photo.png b/public/images/emoji/emoji_one/frame_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..508116dfcb72ceb0bf90dcaa9a905b3126005989 GIT binary patch literal 593 zcmV-X0xb=#h~-dJpRzEbx)wi(BI>QYE_B3p#SsgMyc6bVrP7FX#fBJMoUiHqIyS5P1&!G zpufkTdS2(sN8HF#Ra#zVsKwZxcHX6a@57+WqJpl6YVp3AakaL%n}qktrt7znU}L${y+xb{o) z2`=E+Z$&&F;6?2BTpqA#qXiz|*zLY)5BTRm{VJ&62Pom3-xj=Ix|sMt`b-UYAaSJv zToVbgwa*1g_e3Nh$OEMcy#XR~zyY!q0w6L=@<29E0A4zg1=8>H0L0xyAlK^Zf{;L$ zt*&xI04v%lPF(Tb~5Ohl6gJ6ymnKE)nRZmpOg+e$k!N2pNkB{epyY&W6ALmdO}Kg0-f-N|F`qbj9- zf5n`9f+aGoQYiC2=ol{fH%8q56S@Jkh=}M{0?w21wwljrR z9-n!q{`&L_hx0%F@_AA&V7ND6j`#ftu8Nj7-Qqta_FkG3eLpC{?aNMcD^@>edj}0TfO{_^);uaxFkf48-;skGT;^V`P8w)Q=%&9X(MFQ(7f4%EWn M>FVdQ&MBb@00a#fX#fBK literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/gear.png b/public/images/emoji/emoji_one/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..fede124a4ae540f7c1cb1fd729477fa2e82a90f8 GIT binary patch literal 997 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB_WAXLpj2r(aM=L`+FV zO=ezUeREr9@5KJe)27Ur9haP5S=;#k|NoSX9KYc3mX2;`51+`m#Ju9N`3n~xK60$B ztH;YfIIpPm{Dq6pU%dGI`OBoKGghx%fBVkes=CIcw5+h`xa~W4rEEL;2E~+j6ei(TR=eb&k=74ShZ`Yc`!Y(7n;i zWs8>343Vo#_i3*F%sKf@@9Z1-yJtTBcjVb&k@{7)@>ZS+WlR3E^QFnHSD|fJzP11B zbpN@j`r(YtnVa^mED%sD`_N%u#_t;`YW};sYPqdL*Bu?X=T@zU9-U^MvL`E&&FscZ zvwi2pE46dm8cvAMsLqM&S7*O@^Vt>)DZOXk_VnZxMxSXF+5CQsPTc&5J(h=JR>tn1 z#Q#%zp2CcJ$8GZZbLVphw4A)~@*B(3zuW!i->d!0uvG3@r~KM0hcaFiw_fZ&Z~d|> z@Z#N-x_nRmn%tYo{_o}cxu0TnlU_Wo(|JGn$??l_c~?J`8^6C{cYTNOy-!Ma&TX#$ zv1#`2#+zEVm%lcgXBFbG>)nj^6))bU%nuH_k$!2p>~}{~$Iy*iIX`TO{=u>G-+iH) zpVFLBrfjq1RwQ0l+YnJ?#+D=S!{~2n(C+xOubDRcsf^9L%k$<=>9_8j-*(z$ zt&-wN{+pTSuIl*L{yBC&nqTvqSbe*Do$Q|~^~3h{M^=O%R#wiR zpJ8%3`l8au64h%JD_>o4>-G5D%B3%Ix0vx(!n(-aq5PlTzig0noVd*G`uZcEzqYzG zK65X5%GtB0+eFrD{=8ME@-BQy=-MSMDl`WtC&?e4yVm0HV3tvwJ zNxJ#Q-py(Mne_3H|Kc-E1sUh~6~5*!FE_MVSH%>x@2!cHse|4`MP{yfPNktorHvKt zU*G)VG~==g&EA{$=B}Q-&*JaF&Fl6bT&1Ae%(FVlXyb-+>dX>1ww!Bgbbc+QacGpv5(!KH;?7lbbZ PW()>TS3j3^P64bd$F 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 Hl+XkK8}ak6 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/head_bandage.png b/public/images/emoji/emoji_one/head_bandage.png new file mode 100644 index 0000000000000000000000000000000000000000..b249b12768145c9a7f4b4a017f6749329f1b4519 GIT binary patch literal 1147 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz{nKf6XFWwo;iQz|J`&50s8zOS^_Wf%&?mT+({Lx*XZ$eyKkFB)cKTLB3>Lt7J#Zn&+(x*E4OH^Y36w)-Rij*48 z{r%a1qZ3xV&019-HKFt6>jMcd=1u(BD3x-JbAHnkm#GFkDl=wv2POU6Y}4RlI_o2! zL+F(s0^0lTFZ|yaP_)}>Tf_SIWgA$-FRGOlG|29DY7Nf6U-$D%-Rvb9Ni3RwS8`4N zGvR!`U8l%ZfAPwuVznzj1LyDG6R$kyAYUeH))Q9uJ(ayBZL^XmGM!KOD0PAH#jU)f zKLqMuO;i8M^Y~~+e3R9cLp(<-UpZ&{bGpgz?R}~3m%RT!W0t*C@{4^Lr?+va+vL4; zT^2jf;QOBV{dZM54BMply6jI-l-vGkTbfPco639UiA@pb7}(MlD99#MM0?MBP^ol~ zOUX}S;mS>n_sS1AsB}a-JmZ`w&zSyQzA;#E!pe?A?{DPt1*<2P*A03spU=O(A){eVe1oR~L&}6rmHgL5Qd=aJSnH*K6z%%KeLFC(z%#$G???+=MEqK@G-i!CFcF9he zQLuvl^ZaFTPoCy%O_vb(>Y(xLyUhO=M|F1FykwrRdXsXv!JZ|V`d3e>-PXLMb>`6Q z{@(DB9={A3q%PEWk^_{s~{BKNzSmOL_@UUYm# z(-nt!@tg5pCoX@U#QBqH@e-kR@;4bS8uhan+nT6g?#^&+xR#CFQa0~>AjC%H?RTo4}+(xpUXO@geCxW C|6`y4 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/heart_exclamation.png b/public/images/emoji/emoji_one/heart_exclamation.png new file mode 100644 index 0000000000000000000000000000000000000000..be54295cc8536bdba14af3c1dd5a1c35800d3a5a GIT binary patch literal 444 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!HkL^mLLCug*q(pf-V$ zAirRS^8)?*6$~8S7tFt(u)ZPSqv)Si3=E7Ko-U3d6^u`>uwPqZz{8wyv+%{47yqW; zjjQlmChZgM zLEwYPl-S2lxyuN9}>I0GzPwJ1ITX46RO8rW{R(H^$7Ahs(IAZVM5pY4L`oFv=*^qRh-&8tGe-pHivW* zN7mdKI;Vst0L)*= AG5`Po literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/helmet_with_cross.png b/public/images/emoji/emoji_one/helmet_with_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..22efa363c90a543a46e269b4677a68f246de487d GIT binary patch literal 958 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!&IkB}xB}@ZGiGB&Z+&8b;y@A; zLBx@D!PVF~yF+9n-5gH3yU%xbdEgat+bd|BSI|UvmjpM5i5}jk-92767Q?xYymi)XnLpXTTLtzyJUL|KYfk0`!t}NswPKgM!2P{R#8m3n(#EFfcGRd%8G=RK(4he0<$)2NCD{*Cyngyl{-qA?WVj zJ@=~r{huxLgQ;;%kNUZS^UOsS-w&;}U|RI!xa*1_nJH~TNizi4nUrP-wC-R($x(0O z#rFT@JfDk~ON#80ZCZj4e~kQg=1rbU*|W>}U8imPw(Qq2d(JayDTCS58! zdG&em9R?5fd*1{bil&*1{$dF6wbN#FnK#{o!Nz7)TI+ts6%nsLGCDl^EPhG*{sX25 zz3YPtXBn`4P`!HR5buF$TfeX#xT)0LpslGseK~`-(e!l<8pZSDH1C?{oUPJ1yd~$| zQX!AIzr`orJ9#zpKv&K55DPvN=4Zw)r{xq%HB8$xHLZ9-d=kf+rLWs+J~7Ta@hmEe z`S3laum#I}AH*GOOUP9{_Lt$jSi(bg9i2nP`iBlMJy8j-JJ6MqC%DVqknx(?LGC{c zdu|A1CtPCmF`QoFeER@*hUYzxS;>|G#`%n8~%r zj-BP9=g+x3XWPM9^D&T7{Mn!B3~MKxS6};QV*__gj6P#fyKu~$(23PurAY+`Lp#5V zY?)+Rcg<^u`nCoN3C8_8;dqPL?Z@0j_8%$*b6ra2>TY{qUv){d y=>v<^v0siKM0Be2-?JWMZPQpgS;f%jt^dK_m#$w(2#o@!S_V&7KbLh*2~7auqry7? literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/hockey.png b/public/images/emoji/emoji_one/hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..464a11003aeb23f52e88251a368010cdcb440910 GIT binary patch literal 1014 zcmV4CM<}6Y>@HjofHESJm91$65xk0@LEdr-!TSQ65tgBuOz@*T;T&n zBp7f{a^agIweV5Tj~BieIxPV{%D~%F3ZG^SSRw&_iS)u}GX_LOJnTp=d_$xczIT!f zAJ_AXr9A8yMnfd``~@SPexMSmPWUuNMOJbZKl z$jlfq&O9AEQ`Q?^f^V&zqb8Z^@pBRWoj7>X*b!sQr7_cn3{>z4=pMl`x;IeaqoCpr z;BAoQ_du3_h6D`1#f38+NChzvLvkZ>`uq3q3N!@NYi$Rwb^g*7G+TE99OZxEixq`M z%T^i~tfQt6AI!tlly_Oh#rIrOrhvNi?hVe5metfGz3*j5WnH4#QNd28#Xr^ zP*_=k2AGQ4+U9NbO-;_W+_KVlu&zM}r(m0Um6N>${zoa?o?4Lq4v$46@!ajZ_wv9& z7d}k&SU-+YBG{DtJO}o}r%zr3&>U~3nDoLzXPxvUJsm~sXl`c>uzWXwtH4(ilWD*X z)QhZ4T4%GOq`DfnIe%$ebwh)*EvuxMwsjUhm^(gh0B>~)MVbI&8i4z08y>@LLnCm# z5%zVa@PQ(IYCw7U|J2SaEAvL0H2|{&x3!o4Xly48m=YAc#SMZ6{5mJcf%@|GYilr^ z=dBIE{kV?xqTTere)D!m@H*%_F~hY$fW6O0C@PHNtuNixfiwy$J4T&}Hk#oz&#tSh*Y1s%a-Tnjv^VGX96de+q(BKE z4YEOoQ86Cl9=`-+^@(8s+WC8T9y)=C<;9q?1r+{wh!`<9g2o5gXhf*tDdIlsbXW~I z?KeCrlm=|tvrmgQVB+*yddDHu(0|8a8^o z14qKC!yg|~1Nirn{wvI1hwK0hI34y+Wbb^0SK*`PKhf!4g0|i1W%buD#!FlP-O230 kiXhHvj+t07*qoM6N<$f~y|j9{>OV literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/hole.png b/public/images/emoji/emoji_one/hole.png new file mode 100644 index 0000000000000000000000000000000000000000..19e228f6622638d85ea39731af30031c6fbffd0d GIT binary patch literal 1392 zcmV-$1&{iPP)qr#8htU=#oVfRkeu$c-yO7=A~{5qyM&3oJ7;Gcz+N%*<#AGc%Z%cSDs8 zM|sT8N9Z@LcwCk;ab!zzN|jW7p>b>G|GTB>(Y77C*16HG2*GRDuH^_oA;Ky3E7E|? zTenjK%qzu!d)@|Y+_Xhg2B3g*1T%q`l(1fA{5qBaM~LF&?y0jvxrD{O{9O9tqv0O!CM6%bG})NJ`kR#TM@O5IOiktvN9<8%mqUyE>c+ZvD6wknoirV3LdMzAItnj(u8`-rY1EzkP z+dXo-KH<13;2Ll(r*oS8F~rO=0Hi#r=w)W`iK#=@;?Aa20&6F!b`Hyl54cL?m?6u6 zo2E{YfbT#4?so}eob*)LGdPW7OUj}6GNCfg7q!baz~y~kW3W^JX3*afuIh5k+eyAn z|Au2h1GPvh!o@OxBjCdY-SY&OwA-WtWS8*mf@bLX`W=nKUBvrT8B_ykMR@Hf9JBc$ z_fEewFt?#kWPq;{K1J@om^!Oq(D$F`TIUh|SK&}p+1ex8Nv@<+!1fne9(KIShTUAg zh`r%@*cWMl{n5p$8G#xXY>LPSLI@%g605qTTOpRPD9d>2}Hu6jZX7ONCd*~>9ON6`&t|dXS`unDj4U~yVoEi)4?%i6=5HNBP0{dNJWQ@55NGP y#=Eb@xv#DCt@8iv!GQn(0001x|7#WcbhtC}EO!GOocJkc|+m?3bPjASs z-Re2HJaO5~u1}BmKe@So;hCcI`<6gVC|qp2Yf0D9W5J`>oY)q&1*=TbtwB@TG9Oe$#?Rq<}Y4avDT$vflcq)xCxsQ z^X6I2*q=FRYx05l1$U>-U9_$6_LjoeA<2`DCCr*Uy?0;qlqK=GwlAcB;j2*+CQ(WbPg9DYw|g+%FjiWG0%=Iw&!L)(eM85p7!R)6Mw(gx>IrJYweke zSLL4{bH0?Zmpi%S#>bYF#=i8LdmqnKsPH-mW!BF>nB2k5(|JRT^W5=^|J)iUc79+K zmi);QmFxR@U1rqn2h40gw(9+u7Vj`UHE?q3U44c);e-Eo9N4w)`>kF3-ib5Zf7ke( zSE9q8;peyDAF<5$>v-9GTljNcG7A5=eE(R;w7*GHFHD~_=lrr8e|;Fge`dXNUVP8* znN07VbA3oX|FCYI!#V|Tn=}7?8;!5Woa0<9W^{<*BhyD_p&fs2E!Ce98z|B{PovD2 zM?jxrnOc|a;i$_hjsKQ*n}z2eVv3yhHhezIFZ~#P#@F2m2c(1;d=4+u{J^-d)y~Gj zzmfMsa02s({7Y}(_-NO7Rc(_N&+?Gc%tp2q_n$CNd3gAy`>SN0ikgZCC+}Rj zbh$O3!)A7P=-0}K1sj?6>`ExEdMbR+&uZ?u-=YtgUrU!IeB%AX)_A|6-??yyV*KID Ri-Adt!PC{xWt~$(69ACL3K#$Y literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/hot_pepper.png b/public/images/emoji/emoji_one/hot_pepper.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c0fa862183a5b7b4979e30bdd12fefadc4ac66 GIT binary patch literal 671 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 U^gE~i5d85FBpeOnm^)Gb2XS>2RR910 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/hugging.png b/public/images/emoji/emoji_one/hugging.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a7725abf3589ff92b864ed7960ca5d9869987f GIT binary patch literal 1285 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 RI|cv%002ovPDHLkV1lECivs`v literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/joystick.png b/public/images/emoji/emoji_one/joystick.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2e5b8f430e024ad20c1fcda1233056bc962409 GIT binary patch literal 1013 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz~~#`6XFWwzV(Sw(K3dRa0W6L z&IZaFnma($*t+-v#epa|A{xSguz|7=1Q7?4HjeHAn#P^h9vXUP?!JLQWvSWuNtyX3 zs(K68Y);QB$}XxfvvIL@^0ssFicUyz_6|oF0>u8WI)1M?!V-l&QHwvfjbb_O8A<>V~PJ3OYvCiRsx{#nsWt*$HWx z&R&7hiD?mWi9pB4rDT{`IYWGRXWo)$xs|(i?tEO^9uOL-Yiu2)XJM;naq0Ydps&rJ zxc>zPsCr3|UoeA%!21LPgZ&Nf9nSA>xF4`yVf}msfrR@B1^3tY&o}7rcX;2hfB*dZ zssElaFfbW-x;TbZFuuKfHR-m2NW(+nG{2cZaG2-u)FnmL_x=}cIy`M}Wb&_flPvaM z_;7o3U%9|BQ-QYi7sXUcALlBZ$x`yQT66zP{V|mtJ!ay81&spM4@;UjgddhPFfa!u zibgZ8=l&wCuJvZY{NK^c%=e`>2+zA<8P&S=(ogMe9zW`4I9(= zr_77)Q9$Y5D*|gP_FwtHmhGTxpsuZMGUa)SRO68+*Pg7=dvmZq z=D@b#W2^pJ`u>gxy|>X(yI!hw$=?g7nwxCy_=-Gv9Ovf97~o*Y7x2nav6kWfHa6~p tGa3hYv~+fbUrc7?6YMS#hT!PC{xWt~$(69Ciwqu~Gm literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/kaaba.png b/public/images/emoji/emoji_one/kaaba.png new file mode 100644 index 0000000000000000000000000000000000000000..47ee22a82bb148dd78a39fd792c99d27e1cd5aa3 GIT binary patch literal 1161 zcmV;41a|w0P)xRJP~eB`@f#i)0fk%IEXN%Y1=)4Y@2 zxq7ylXX3d$*uRwf%Q@$>IjoXoqKjhNsvz9CVZfnk;<;tVqE)+{Xu6wWsjIAHZExGO zal)W#K0`;MM|mTPTtZ;FC# z=gpvbZCAItyGTk(TUbw)gJ0{qY~#d^o{40-m|{^_TWx1r-M4q&uxVCZVDh?Xw3ue# zy@TcE=HkMOR9jx%-rlRZxKCAC%%y6)$jITriQc+>USef$W>l!Etg^wt+_rSbrfh(G zZc+JGk162ZXHQSaLbu}IJD1?x2*k#9qN^~zA+9!tN!;j3`qY`5G%mYu2vK#fL*=Xz6VgTfMr1nupk9k zkOC|SfddwVK$!(004zv>0t-Um=#>Q-U|Em?*7Q4wfy!5hoy=-uK$XfQY~pH5fxIi*w=sae8w03A4`_HybhxedZfDi!L%;%m%ih?)~y`_%b_lU`WfTUvKt5wft@s%z@#fKzY6|5avp1 zc#?5kP-nKlPF>7=0|cBD^)!Zj&XL{534K+_eFFr{D{TXYP;m8B3~YWt5Uqp&Lnu(5 z?+au_)`Yq7>jER&H34}D1iNiRsok^24+xH#T2+dgIs0i6m3kJ(ufHb%L*0G_#BeBR z*aDn~?t22@xLHNAUA37Eb5K^V)%OL!vDLg%gIWZF2baH}M9+ywvMsIQG^KP%E%(ah z@}--$yLFDz9_-9!)Xj#}&nQYcW^5iJvBnr{Y`M-Hoe{?GVTTaxW*Yk$MuDMP71szM zoLI)GU_eM0cA8D%W}NsLL4l!KmA8|tJQVmhyy@R@-=V+|$;zE1SR3Qrq60p`MXiaC zT>B0M95?bl*IKuDtM#x{DovC27`C{!J#TS6@rwy`8igD)YmL){VZCoU{L?Qd(HnkO b@IUwf6i`@9B2Dnn00000NkvXXu0mjfU70jd literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/key2.png b/public/images/emoji/emoji_one/key2.png new file mode 100644 index 0000000000000000000000000000000000000000..7dc9ba58e45837759279a9e45068ac1f633a015f GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!D0Fnh!~c@r8^AP@6zW zkY6yv{`UT#(b zT9+z5mtQq|Y1sV7^00wUwb#n$WfRj6yZvF6LO`q@8jccp<#r|J>wqfD5pVEEb-!*-V=RI7&t-V00 V_8a@eV4yDz-T!HkI8M7hi0vN!#co;Wt z-n@9}($l9;Z{NB5=+UFww{QRd|NqpPvp@r0ym;~C>9fzDKVQ3k{nMw<*REar@$=`m zZ{N=aF(Gly=??9&rl?3?(GdP@Y*e`H@ z{`&X(3j_=T6#5gi!tQ@zU|=-$ba4!+U|e!#dm@9PfXl^$#TA!UC;ndVzf$Pt|Dpul zUu~9#KbY!|UQtjBG1TL(+BQR|f-hiS(jDU?SJcveH06H?KCvR~n!v-Zo0p@sYhUfZ z!=-p7r;c;x(N_zaAGS}JxOc`+7Q?&SX4D+{;(q4Y{aS(ISu^GxwYaRVxzE9;OJC@# zlKk7Lp;fGkJZ{<2I~Ln>N`Bw{|7-7(cdaY8KYwWR(UC_X%G|?6<>Qn*1%@NRyBxFD z`r0m)W;r8c;mujX%y!^h(2v6#CH1!pRE$&^OBXgpDC-G7p8x@xCp+2zAZ z?`F9i&F0&8kZrqb$?PLCC*tQEIetekQgWlysmsM5c$VDKXuMS3?BudYEF;o|tDjfG zp;f!Ir0C-p6}u;8o|k7=o#;8a?3T>z?!WezPuc(1(XUy%J#+F^Ct&b0c)I$ztaD0e F0sz0d7bXAz literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/label.png b/public/images/emoji/emoji_one/label.png new file mode 100644 index 0000000000000000000000000000000000000000..16efa7a6f5839af20c5ae809159eb125087c3b13 GIT binary patch literal 653 zcmV;80&@L{P)J4W*ql@m3n{utFm%;~+!+~U@p**%+_ zXPxiu?A+btTSxEygU3)D2cwH_cVY{`9x zj*g+Mru3nt3Lq=`g^&T{_Q{Bk)AX2pd;)|E$D?;~Rc=DM(J{ z0>EGGtuDa-c{vN7TuFZ$fl?7WK%Z|FxPEf2%n3L7wEj&5%LsV{DEm80$MIil{{W$s zI{?2mHgSF%Ky8!x0Z>=-KUe}9p--LwIM&Dg#hB;-0whBR;G9GU;M}BCAOq-G0TMtE z(omytQzQsYp%Bu@5KJfp7fV7Rn8*-zq9brlhCnzO8A2_k0v*9JLhvU=P}`&+pd*xI zMu6QWSsWfg?inJ?Nq`w4p2zQukjXEG-6mN)R)qh#9B!gt4=Pw3vb;usEU#w-$nqKi zuDn7pu;n!ZTzQ4C6Slk_l;FxMgj(40dPaaNuMnCb%j+2dvb;jTE3Xg?YP)w>6f-fn5Fq#k$PX{T3-AKuZGtgS3@m~k zegX22L0YyuR|wGp$h}fnqJU@42oP``R{R3wHbfE-NfSUt^e{ma_l1xb;04Is1CH{q zefLfQ+6H&B4xs11dzGMM0Yk0}xM2Sl=w3gd;A%(cuudD?7eZdZ@c2~E+ScwNP_>v} zT1`F;4r|K9%v@UUv&-vS=CvR$dGn`$w#CBAx)PK8%;HLqmBa~4YnzJ!iLc+ThTs{9 zf$9K zQNf+2uTlv8KU9@hJ;!C!{Ffcn9(_T>v;I0X_A$rr#|2PpXhm@C0<5-{Yt z0FK*WCSCw@KcFC50AojJ5%l;%$P4fSynwFU1R2`k&K-l#|NsC0)pZlsbe91IzZ_qBYH8QPrua}!e*OG;dR6A>qld3uJl|WGlL zb7f0{{DK)89QF&$KfgcW{d$Ffg8usk1?$fX^eY%R^f$~uU*vCC!@$7g>gnPbQo(rj zTI;OE1|qBvq=jORe{~3czvKPB|J|V(5f2x?Os)N2XkE;@_`W;qy7pPm*}8sp#nv3} zT{+#v#d}5&zn;~OBWf2sH~c=%_px96!g`iYS(T412aX4XKX#Ysf9%C?-!P$q;mns~ zIffOrvN~tP8E!DnFKw^vZ`k`p^q}I$ zxv#hGUT-|(qqV^w`PhdqpB^j|cHi|hV|Qco>C3feXSZCtSdjGZUeBShUxC4A4ldMu z{NlrcpWEG+iAFoPW_xjjpL#95x2#xqsdmevty%F0j>>3soH%^!_UE?+6~F(q@%DFc zCDb{ZX*Mj_Y3y_Q6Jv$O>CEDA4u&Nuj~Py!aD2N@C%$3&rakUw7p|$xXLVR5vvv6< zoyM=b)vpw(GESJwuD~piXE!s4S&d=Og+B+9@7)lN4E0-Q&GxcsFnIve^wUzr8<`BC{#@Z2nANrnGk7ZHsI_RZUboU@$eEq3GJ?y#nBCla1&-csj~ ztj`y9zo8m@BxuKrM`A~oF|CiSkqXvdYp3+e`mdKI;Vst E0I64=hyVZp literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/lifter.png b/public/images/emoji/emoji_one/lifter.png new file mode 100644 index 0000000000000000000000000000000000000000..3e52cf7e3ee16f76e7204bbc899a691850679ab5 GIT binary patch literal 1336 zcmV-81;_e{P)+g$vUk17 z*K52NOONy^wg+C@lWaC^=GL^P?K^R5$i&Py%ncsKe*?`1(b&ZD3L>k z+*~Hgtdoa?%a*+?Wm2w>c~zP{yLJ zD<+LV=79j2LmuClCdLdo5Yku21x&)EOpN)LUU^NxjAJ6EPm>l<3^}62+&)dDeFX3c z-%P4w2@soO4zWpq?HwogegDSd#SolFLWH2&>bvg( z_!7P&hg&#Et2{=^T_6Q$7XtL<3EX@6EP8TX2MsRZv%TB4)0IP|_xD;)XUh9s*Pp=)NWF63}q-2r@P8kP~D9OITlV{}pvJWUGkmn!1TfY6pqp{LL zv@^!7_TUW%DNzRyT%Z{9i1nHiOyJa7)p$}thM`D~j|L|=|IMFfRpmW&1rEgh^ z@7lzc1c6Neu>Qkis7#->8OS3i-d+B;Z?CkX<7^KlzkYf$J@U@7cCk`c{=B`5{=Umz zB<0S6ZTPS~d?B{~=)?K7c{hRJ z<}p;@1}#7+6FT+4$vEpK&}R}L)IJj7qh4>P3<2gxAr-emn*ivO$*0yY(G{&zNyJ*xsfskG=w# zupvaOzX*K{nRxHR1#BZ0R;f_sz=_mru_?iBrCm%mNa?*0000=7RLXIQfirUs!g35%F*`rlpZ=5+L|Rq1Ti$?AX;Mtp|n++5>pK!rcxTj zOw5FuNzIX%XAW9p)Lf@d%XQa%xsP|RZ-0CLUcQ&T){aEL4TJ>10ssIAK_R+kr&IGk z&Ch-68T2s>USmtl~|LaTRpQmbyME-aAUmwmzo#N^QbD%i!<6F1dVEa=% zO@63jaB^Bx;W$^T=C?Lvf_cLSYZnLOxhiyPjKxBY&)#6jbaMdngLOx|X8O}w zf;pRJQ{ao3uC}Gue`M9l=;=dN8TgI1mlerY(a!MBT-0`t7l+}}os4sN0h{X&xqFuk3L6XE=8|3MGAau57ro>0|~} zAK}a_B4g|y;9cPmBgoP2LT{S&-jKvlRYsOKqMCqij>m7zj#yf1MfzHGqy{dJ_P`7w zQGO`XO@{yJb)|gG;O2lx3rmwSzeON)kOj3V~V=P2Gv8bLvnd z^N8z4N<+sy%JXTVW!R~R*!KHLp&Vg{MnY`N`&Lh7fzfKB8|ZGx{JeOkUB39wW%B~soG{`SadFXjHa9{Ez^$;EJlT%G%iOu_uxU{dy| z^o5MvD_U7hr76Tk@4E#N*3|2N<)$swd~>)gr4{Lr`Q*tIj#>-J2{zDuh^;iCAY`S6 z`5|J99kr$y$!ThkGr8c5f& z8Rm0Rd&)bW@Gqbgl=Mnpqif>(A;%`!|8Q{jQ={tsv4-P{$Rl%T?+Jj^#rv;cgzCO1eQK5KokqgEkL2G=BMyUfd>l&Cp0mF9< zeC`g8F=5gL!E+jJ(;LHhjJ@I7nlh8l4MDO@_+9eGyu#y`7#Nn2c|WRP!G@g?iF3?T;@2t{D`key@8Vl^;{K*ReEv$-9cV&lrlCJ=7U|v z$gfzo122eeqF2lMQvGo68-u77JDmqmoI4BsTiLt10Tr@j^QX{h8jW7>wV?!6G1DX5 z7#H?=c)!~=+B@aW-J1#pW`r5WHP0<3=Sa=oDvzE)>J>`l#^420)hgF**Hjc05Vra_ zncvPV%6X@G84vWs@Zm0+5m7*f#+B_h8C*a&Ot{{|CGL^5a1%&m=j{Hjz{;f?!~Myn zzQ-p5a~nbt1f89;BNm8X?^)Q|mkL_UAPs(bHV5#c)xMucZB`kO-me%lNm94nWzO~( zgy){oXRfh6ur9a%*mGWHuj0A1$me%@C759bdr^iDb;+5E(r_|tw2vCb8ceacMAmKM zN~1@Ocgp^m02|K%LfbVfc^yRs<+wMrLE7gK(A_a>h7GwOj$bP^ZQs_Ys?*9TFvZj? zw6c6J>^#|vy{)=BNr=NpoV&gvBq6QZW~XSaJS&?jmRPGnIxN^Nc=Z?3j|C#-ZW>TCF$zTK(&5+LKiEqml^aRYuH|A? zYHM)cb`5>0ICPqE!DOU{x??5s&oJV literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/map.png b/public/images/emoji/emoji_one/map.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9c43d924f8f7610dfa1b6ba4eca034c1ee8491 GIT binary patch literal 1698 zcmV;T23`4yP)iF1|F_(YUyY)pi-PpiPho4$&P zYfh`8l(WgHhB zp2LB_*V@e8+@!>muEWQOcTI|UR)}#-pR9nl)3ctdbLap703UQxPE!CtfWJ`h5TCDL zk09S*&+j0=5HO!`fXDBTmspSAfOf>S*Z=?oa7jc#RCocz%r#;{0RRKg$amYAbN^G~ zP~4$!jUc7F87n-cB3sEG5@gG@3gVW2y=v?n!jvPnM6zG^mkLRp?J`%udCP!0Z!z@G z2Mw6F=>3EK-2>z;#iH|a;CCL0;&869w)dZjQTy7q`P%Q=w(ak`b9#~{?RB3Y%6T$J z!N~$o7&x02gctU+{&vek(;JuYQure0GoDe~vgstxXDA zxMqf-mtADbKwg-7He7#o5($;~=I<2oU3Fox=;@9;h8qej!N~8*&}96`-lp}*NnltV zE0y+s`9s~IUEI1ZB1{B=vWStDAxHzopWFl;|DzJ|#>DiH{O&IiVWC?Jo&X$Chh_R& zC0IWqcmLnmwLNK=pO~gS97Y>((W*!&ZH6vFeAjh^ejxuki5pl=467rnwt90<8q^&M zLNJbDp(^Nv>l+$!p+H046dzFjfQ5u~B>HW+jfweE>0@1CBxGgOT4)xjVJ zGUS1tm;fRMM}XzKYQ#^a(pWWycdIdk!>IItaT^4?0LIk-dta8bRJx{S0F11r*Vk3a#7#966#QHv z+(9=O&kUC98c486Ip`mjq?fUZARCuC2fAjtU_o?7D$>rJvIa@D3fQluU_5*~#8vRX zkl;Ze3PJ}nCl550P#aiCyvBWCx-kK26is2~P-Rm7@pZKk`wEFa6oniDo}f;Sk;|Go z%V`#N)Ht*sYQ*H5)WgvZT2O~($rL-~>NMV)jtkcN?did4b#g_mc%lG$P)Rx&57im& zzV$YpT1Nr+Iy5a1w4xqEFs~$O5Ai4l22+v>09PhK^Nq50oWK!`Q%MnP11j?#O+j#$ z$@?@4x|tL$L%2tY*HTL9FUU?IjcbD zehsb12@D>0VwV<#BzH%#$%bHVvLxs@R^TC^vdE6)Vr3K(HoSjW9q9rIaGbzFjM1s7 zsZlU&Aig$*D5LiTfrb-_3{;7>;{+CO;6!#)%p78Z*(KC)g?No_p_NNBD;tQR;Z){g21VKaVryf2B@!^_HYmypa|g{Co>rb=!8V#SC{M01-!^Gb z9$I03KvRZimB$}p!Ov*Q@SLJNzry^63$jZC+N#vHusw^5@;e{}$_p#ZpUpjVNy0pC zG$$a#Bh4B}Ks*|B!<{9ZKu23QJrmPYdP_@dSM-#k5TtnVC2ogCMaS_^<()09Z7~5m s9(wt)$5vKmHnx`dF}#;oo(xI;2MQ}QuOaZ}a{vGU07*qoM6N<$g1nh*uK)l5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/medal.png b/public/images/emoji/emoji_one/medal.png new file mode 100644 index 0000000000000000000000000000000000000000..280bc07a915659fa94a4afb4d3c44c3c4979acd2 GIT binary patch literal 1663 zcmV-_27vjAP)@YLq^M@5PyML#w(WxBCtBaLe>&vR@ zvJZUP?(N>0TWj)9`KSDI;p?9&3OEE%9A~5Aar*S>%MiZpI6fSm>aDLT3Ztqwa0n4_;;SFjTVF*K>h)R-5@5;awbWZ* zRTMfl9Yi94qM+XT3Zn4Y@K}tl{ws-qV||9Hx4yC{d|d|%=PgigeN|EDFnm5HPM(TH zJxRUwl|*4oB1TS{MIzwv;Uns;uObR{$3>9=LLe?iRDIX$Xu->BlI6y^kmM##;=0u!kKQ~%VA~TBCgi^)febwYE3OLM? zXQYPG-;_!K2aQ4bqDMA1OFl1w1>iDh0_$%9c7LFBQ6%!!xy%u9vqZ9@4FSkKre}ZW z>%i7W__(?X0Zs|fDo-S6@iRprEsO;q0r|X17o6z9$ETFceoi#H&zv>CPl%zYA*X@=L-Z^404km0k+D)gbCyTw~Fw-6#@)! zv%gXHXkdq13bX(Y{0!`?4eYJy5!p!(ll@%+Pz+K+KA_nw5f_r1;g1y`AU(Q@A;7Wr zz>#KrJixO2)9Qc5Ud)mkDhTrRfn!~ZaHI{euNJWT!^=>(<9QZ9MB!!NNaM?py}Kp; z4y%QOQ=i59t{V1@(2&i7GY-@OP7Shd9pL7NX5VWYyX!4OgrgmS{ofH$Q}}!7-Pqjw zIuLQfAKt!e-KP>8LHSoDKu)-iQ~HI9L=_CG(Th%}R9i}O7!65lJ0!J(gv+uvrT0Qd8LfNZayX4tWe2yypFggtMO zXGR$!oSDQClg$45TloC_R&R>T^~wHW8cy2;#>uz9d8?dWms7;O=cY<(zcKrBd0bYz zz)_<8lLU$B0+W4Q)!iczA>6W%9Oh-^H#R~X7R|o*lIRVYL9*3cUOloSJ=A@&KK(8) zeb#M{c>-s>G$>3q$P;lcdy>~*%l|pDO8{35OrBtDg6>lAPZ0$o5Md&IY7hw_A+KHp z-EYLHyz#3p)qJDe>FUW#_6$o+eBYNe>s0PI@7C@4`SE>0H=XkXwTLwRq-Mwcy6*oz z-?}aIAfINPW}0noAjpEPZp+q(1_E;>i{&ooJq@hMdHJXO^B=;)I-xsaLnQzJ002ov JPDHLkV1h8SEyn-= literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/menorah.png b/public/images/emoji/emoji_one/menorah.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a5b0b59e104932bdcf071ce781a421970dec4b GIT binary patch literal 1308 zcmaKrc~FvR9LFC}J3z`TZMRJ&OLVd}w*%8mUkujp3Wan-^XPIi4>~N%Bb0Sab`zDg zHbkLy%m@w43eAIZH;R}fx7sN)LCs?p>eV5P^4iyN>(8Efp6~ZNzu)J1=9y>aDWZi3 z;V>&O0010yCpi*vXm%~ILbOtmXGCn27RsO?KBM^REF{hXh|Y!2@W|)!e`^jXB;L4p z_ed6Q-~_x@WM>C^(O5b!NT$`YbTpnwB-1L{N+p}8 zw1brpoWQP+LB|4MRY4__7@4RyJkuvPk}cWLeLHpfT{r*T7TruL(R?t~G+Dao>a+KH zp1V%tzs1!Up$FxB01?=anaN1reQQNt%Y(;%IEUsF?q4R>`I&l{)2&`92) z+&j5D3;e^N3nqn0mEf@v{iEv+u)p+t^7>=hds)l&NQtfk3R4u`b+`B$nwC|A!Ny6h z*#BGKI#zCDQDV4xk&{*VuTH_e(L-)1H%KMV z(Qlh;ZFmf(c;EE9*FjMwqrEO{&RUc(+JPyAKexCYlY_;Rf3W$?9w90v+fKIAPT3Gi1Ew%1^kQ*`Da-Xg$W1Yqv2s+c# zwp{vWt^fu!xeAToM80{LS^YI?h~& za`H{FNm86!lElAK{7dk`L))^xv6y-em)@iJJ|;*B(y{|QEujca8Hn)-EbmMXtf1R( z@H|6A5sn4jYZYcN_?^4?k>{TnBE%=p1$$O{z9w*Mu1S4yu{~I_cY239c4%N>w>*_<3H_34e@`Z^e|uiHB{OMH;lmK7^jw z0N2F%ow9`7a`{80dAnjmL-#H;VY(DLs^?B^E<&kui&-Sr!tsG;D${Zqh-=FXmyTCw zW}3(TtWc!uvMm-&>y(FWRlsD7Ssx&GsX3}o4hRi(BJE0=IQ!8WqcyfRExuZae0e~n Lgp;oaCglGIX8@a9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/metal.png b/public/images/emoji/emoji_one/metal.png new file mode 100644 index 0000000000000000000000000000000000000000..a653d6190486cc78a21f5dd1720871d47031542c GIT binary patch literal 893 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wgmWuxB}_di-REO|J`&r0*V0H zXe3-EoB>e}lM90gHUx67gkU%(p|a5Ys+wiv%k8uqoor^5A!?Lf@_k zfmrcjQ}~bL@m~+b{=1n5l=^i(>G!4N_v^ww?~MAgC;IQT6rkddTO)s-PWW~tZdr^G z8_?a_B|(0{3=aDn92)iu%s>BrzCuF(eFK4n^#%780?xnh-(Rr)zQO$W?*q;oynp|` zVgJdES8p>gF!_4AIEGX(o}J!W^wx^U_4FB@@3GHxi{Ci>|Gz)3cuwE5E9NVg?P+t0 z+PGLYsv`8-{E)qyJinyA=lpu*vW$Jy22WeT?tak=Jk3wtuhpMw`m!LQ{C8D;`WK-I zRSp~OoxhSJYa3PIx;5qtmcLUWIH@(!GbMeCJPbRx{CVa_Sd1JGev4YSY8@~gE zpKnyHNyrsQh$*npys^(ZCq2i1r5N9o<7Ow@bylP>IX;rt?s(i(`!Kft%ng#5B%XK?nYds%E+@SkmJCovF!$CrszR zhBR+YYHV9w`O4(MzV6#A5-OH1_Gz$TfAGxE++xf>TsX8+^- zGnQ#wQ951nnT#O^-j|=02?@-X<$K~E>g8Ii`s4nOkCXGCEt+R+aB$JW`rzkPjSs_p zLoV%%(SPvZkO=P=uAlC1$3DHc5La5;z*{$i%fjYn`P!F%bZ==Sbe}#d^XKR8eo61@ f=iKjS{Ac`N%Pq1sICLj4Ju-N@`njxgN@xNA8_vnl literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/microphone2.png b/public/images/emoji/emoji_one/microphone2.png new file mode 100644 index 0000000000000000000000000000000000000000..99489964419a2b291f5d6afc31c6bd7bd75937e2 GIT binary patch literal 635 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT!FNmv-^}8vw`Tsg$qCu z$b~Q z1_s7TPZ!6K3dXk=pHI83Akg;Ef5E-oTlT(Bn0@E}TUO~H*OV#u=G~t)-BP(G@=L{S z?xp){dp?ND^<8%R->`O3P|c#AeVKLD4})}KlA5Ix3qR*_=R`mBi@0-e?uMq#;fY_l z!h5#db<}8=&CDro_~vwT^1-@$Z2LBR+Hd>ef5-p+AMUafJ?8ECd8Y3UbJ!CB1>dNN z-+r@S%l}Z!^kK==_WzCbS{FQ5^J&O1@ic5Rh`0Q5Agj20oYzlf!g$2(t6z!bAJfkz?(5x99Od1RS_;9EyERtBw^qI}+^q(c4 zwZF`)WL5QlTAj(a^wBf*wOl@qACE<8eSP70-dZQY?lBK{&+IRjlCr9-c7ZA-QyAB= z+8t@IVSLoM`~2+GslQ#=CskkaWpj6Rp2auenn;1T`Jc-S`AIn@{EXKb<#>$u_3=HB zp7AqYaL1>4^MW&%ocF&cYW5;d@5!N~-t6WJQ*W6ZdMcOCIIZ)E_2OGeUxD$);OXk; Jvd$@?2>^DMCbj?o literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/middle_finger.png b/public/images/emoji/emoji_one/middle_finger.png new file mode 100644 index 0000000000000000000000000000000000000000..014e172555b303051f3015771f721b1beead16e6 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!9tQY?xB}_di-Z2(O$U<53^*Gi z1y=x323HIeM@A4`-;c!u1wU?$0Fpn?Bm&95*Hb_5jC#8=1ft->rtq%^V*lMt`*A$} z*ZHJ(t3ux_4}QNc?DwVQZ%5+(UQ7A7H4>=)%bw_8*LVGYap&jhgdgWteArU@@7~P+ zj~9L3+xGwAtJ#t~) zu`v5O>6?uk1do5+7}~pkVuihDx1x=3^{E5Lw)h5qEj`%J#&k{K*t25q&<-K4bu1#^ zZZvH$*^*ei*{_pT^1X@(N5O-eXPR%^KkenGyC(CEZ{dQuY1tl~xAr{r`@^tt%WQ+H z!ZS{l9T%1zR`v>){;ra!W#v*YT@tt%J!P2SFSJ;ZPCCb@4O>tfb9?!U`#o$*agt{`S6FyS$Hy85}S Ib4q9e0G2Sv|TKfn{Vj`e; zXPOUO_C+65@!1BE|A!cW2q<-7uH4-fVnD{{@4tWuq6H`gG!3NY@f08fsPXeMhWGOs z{vY9dvq1Ileukf082(@O`hQIL|Ly$G+r3^);QW6==KuYsZ--+4+-Ul~k>TAOhBq@9 z{-09)emw2lT82Nn8D36g`2Vo`?_uFDs~BF-mid3T;{Wy7|K}{;ueSJmkn`OV)n7Xp z{@(3=J(U6I=6B2Ve(q8If58#xq`%kmzihMkbJFqh^t{*8Ilpa|0Xp*AKChoAV}I@t zelt(z|IM^FvpD}>4gR>8;pf@>OZpqxfZ-xv666=m(BL4jKH+_Ufx~@=_4gIt?-zI< zkkBw6$SQa*@P7W(4!KshRl?s>2p4~OA$3y*6 zbd-4PH{O!ct!qs@JT=6szWh7n(!W&2!O1If(Rnpz*ZV=9jT_$1Rc(`R;5o{}ZGBrI ztGt78_K5^h=EJc9Q(iut&F`Qb=EL*FNI~r$r~Q}MMNX4{I!e~g-SL1$qt7&CwryJT ziqwxC9a^lv(@qB-S*CckATNCV=H(HNd*YSjf1lekkx5Wc^sC|8Ro%;$@d=#%w&X(o zd9Q5Ys~s5!v;}+(uOy~@|7z5@;lsbz8;e6N1VqA^OL)_kKKLp$|G;8rIyX2&eyi< zmUq7Uq&vd0HOKd?Q!%?emHE@|q6)nV-krsc|5AQ^jbn_T8XWStleGnyZWugW{an^L HB{Ts5Gjh1K literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/money_mouth.png b/public/images/emoji/emoji_one/money_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b81259a682d96041d37d2fabab62e66f601fd9 GIT binary patch literal 933 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wgmWuxB}__chiYMB@dE;%KWA| zCGHN+J{KLa(ko_@U+$&YuUC?bZYLImYd2>a2h4VvR&CvPKP7m+Tk?U>G(Yvq1pP;c zqBl=-PdgGGzb)Y1-Sp5U9vLSiYab*(y_fdpbo|O*=Z*JMZ|)2~zaiMM&U}80{juf# zd**ou&T-v!KXv~7l+*XpzTHjFzaHOHWFEEFXZrn=?T5?H1KrJ6666=m@ZO+dzQBD2 zhy4Nl1?NN3UcX>qV4CFV;uuoF_~uG$-!caQmIrbN6-&JytchIoTI}}s`i;>)PR352 zxinFEdHfWw6%LADes9{U-!S>m^=W*Xdl|3w=w~iJvb4i1*2&tUSzOY6md(*+CinOK z;#!sU*lrV>wTa~315$62-hBN0mF;iMT18`v11#1mynLBLQL76AT(vD*`m8-ZTBvKb z9yl}MQK47UVgKvQ#^vSLCnRkY=9c8mgJtw2kQ(f**dfm65`&btoo9D;V@@d|CD>qkv$5j!P+M4Bgs>u?>3+B?ImGqrKg zo%0+W5xN)t>I)na&kSkRpVWR})rZh^@$mtdkL=rbpv`{Dy!8CM{QDl44bT7j(7s9P zVUYHYDZ(ywtJ0$y|16)n@&2y^lehQx=P!L}v7`A*^~cnOQGq-xfpd~BdzyuJgs$7q z6_o$~|L#{(hYlUK`Y|=}qUCalY4?R$l0T>)d+_&Ys-@1+Eqm2!#7j=5Cm4LUXMMO~ z#lrbHv(O&c3@WIyK};JfSdYnh^~ z)uUwxY-CN=8}c)(dCQP(#bdngyVF(P#fR7L5WHQtVUO9Hx_|F)thx1H^p1V|jQLE; z7S{{*E6E7!NY^Y|cytMuyKCh+!(Zpyj`dqypSoNrwp{QWKZ8LAPG?ekwq2(NXqlK zv!6bDcI?9WFFP_^z5VY!e7Jh&j&Hj%4xB!<_3+_Smo6n`sxlE~Er#}jR*t%ek6}@3b|#anmM71p-?v)Ua+<7Av6OQ%GCLg-=qLE#?5e)AAFoKR zPS2iJlGB%d=7vP}p^R-k%f(st=JwPgEh8Z|3|C-?xX`S$JRoj>k;KmXRZLp{;L z@Uhk8D{Fl_oIP#qzRo;kztu!>AJ^g48FzLjNb6ax^zB%G_=D6Vzs92)C69bv9vmnN zun=SHRcOweoV)O*>8wnqikc$f%qH87iRV8?YV8xweYS|rgZqq=;w7J-4!h5IiT~EO z@ZG)Or9zW&TR|JgoyJ&$0zt;-$+HvASZeLyzQlS^R&RpM`R&}#&c}R`7S?e6kjHhe ze$~?#d@=ug-xmthcs={1E@AWSn&mekeal0tN++tz8mDjPo|fBn!Hs3rmH0qmkBQ1B zjuogJ$;jYPaAiHrulUn|XTqYU)_oRYhKx&gB-9qVuue!5Y7uf~(A0}~)t$VOb@4QY1TTbEMcI$`^bKMHz?zt@cTP`pu&MOnLX>9oC g-(;qiA>Cx(5^CHM^mH~GFkLcuy85}Sb4q9e0QJ_&bpQYW literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/motorboat.png b/public/images/emoji/emoji_one/motorboat.png new file mode 100644 index 0000000000000000000000000000000000000000..12a63b3f6817f214188892243ad1663a5ecaeee8 GIT binary patch literal 995 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/motorway.png b/public/images/emoji/emoji_one/motorway.png new file mode 100644 index 0000000000000000000000000000000000000000..4b54f99ee2d6a69a2bbea1db5a26c810c7f16f11 GIT binary patch literal 1074 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz{nTi6XFWwW==DOpyvJlKn9S6 zGay{JEJVC+yBD%Z{SI#+w{Wp7P!=MUmX=moS=oIs=*^oq1-a?RHk9mHS$uPU`Tx7M z|NsB*X)Ag3=+W1&Un|QCZ{ECFP*AXEZS(w@?UN6OHa9o-bhWHpzHt8h`NxhO`+mD> z&#o=Ajz+AURd8(Q)XkeWPXmJP-1EEY=1(o(bSh!ml)jy3lFy$%|Mgl;?N-m8o}TJW z?vIXF?%A_v<;s;8FXgo-U3d6^w7rGYdHf@~~d`oqOe7-=_&x|G8JbEen`eDD&s<-@U?@#g&eI=Gho< znAz!a34^*h55vZYlMin`We;1&;JPtTRY|%bQ{r52e|f-$BT@ZgQfFN_61Nt(sTLUT z-g4r7!>=UQOH$sp^93G7Oi43QKYEd2>#PgmTMpYse&?Ijd}XQV(xXjsyq(8|8I??L ze0^V%es)rO*&PJ|*XPb@*2x<-?A^O_vBs;HZ~y;SNwUmdl5t3L<@vk!s$1VLw2^SJ zkrTWqb86xL)7vk9w%a8ickpH7eY>wewO0xjZgq0eT_43(-J-9*p8b5u&uYu#pE(Qk z-bc4xm)~bPzqx64QCiU!Z=o%x&#u|?FzzIG+3b>RfxnyrXU*=usbD;Q{Pe`KglRk1 zS8eHuWZv*+s}*a3;N54hW|=Y^?q*MA{vo`B=ar)YTf&bhDI5K+4>ro##~5nscFAS> zEpUIGd7r_yZqj8LOU84W^S|(XP@ZoW*tdtFxXNp9qo9r1AE%uRZ+fCk+T6nuDit4b zYkob?8g;5WqGKDQ)t(hf)yzNY58iECAtcLO^22JeXqj8f+_f63t=Td@{}x?qsB^${ z?YCU!Ek91qS;EJi!#2x5itWRnoCPrqaSx1F96Tfapw(Z0DgOb^8n()rQO)8u=Jv-P zm+CVlIZaXcX0+ybVYAJA*4C%17xN2<-QYQXN{UOnV9$=-s`3gt8zf(R^Rr;K*f&pG zyg}4J^2(kvHj9tJwu?-Sq-FYo$kgmYNZs4Lehw+fPf>PI^?TpucXfwq$|1)i5`(w)Z?>m$0k~&X^ dvj#if*S%x7-SjF%ADGk`JYD@<);T3K0RW5i?&|;m literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/mountain.png b/public/images/emoji/emoji_one/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..fc1ca084b7dc56f8188a1773c36a3a3b966b7499 GIT binary patch literal 1395 zcmV-(1&sQMP)mJmA`?$+;FznF`LL=xaC5v;z_XMD3G>Rs?I#8*+rqqqtECypw1zOqkF>W zXR_3Iy4je`>m-b<9fFxxwdAYQ>xsweX1eA)oyBdv=Qp9zUarxt)a^d0+dHP$iNfD3 zm%)(A>NJ_cg2m}Utl%%2#x$PHbie0NvgDe}<+s@_AFt~sRDX|2Rxr@khK zo>Ha6FpZ=qkFzL|xOKPE9)p{-*X|>VswtDYC5^6*!r3{JsZgoUJCv?rvDKE#>3_V~ zi_S`SnNNSMO^VA(hQUjCoKJkFPKU%xfUr%1w@iDZPJOCPdZ12(x=ewzO^L@#smNJ{ zy-bj?RLAXIv*TC7;9jrJT7;!i$mL(#_hY=;U6!_0(ehxQ*ig9TSdh_7tlDv%yjQ*G zTBO@jeV3&wYq!0x`PCUPE=UEjC zTJlV=Yi&NO;~sEyWrP{^ln5h~0Q_XD2g}83fBihX zF^bRvsv8FpZ61`td=ag6JP9uhBNRD+f;QCd{P9ED@Mtjz7ZBVRM##V?!hP3@I)?iO zsD%RJ2#QY%|6MiI5x%+}E#V0x_)}ly&jm~%7}Gf{wp8&Rq|f5dTd7$P50G*eSREe= z|1F%^Q~-OMuz>aHrS?A>7RD@P6clQML{HZD;E>uUY|;rNB219W zmzGlMq##E~ANQz#ytF8if(kK;dkCkJ9HK%@9=;^z3W2}{#5SCTqrFs67g{C_)bL`` z0t?$BZ7`C@8VkZDqz#(?S)~L9X+z(Hu_X)64&NVtqH`cc&MkPP*$SRJ{+>NKJboHH zE-@TjH>^;G1v{R-IDC1WA#Er+1$GJ+1iU(V^X>Ip?4_+mMO4+jA`k?ed^r91dB4Pv zkk}FnV!oW5e!Un+6@_HMyX)}%$IoBC|AgbP@cb)%E)ZG=f&dKn4y$qZ)ZHaG1Rj3> zn=q-%VvnzFJpWEh;WupCz7K+bs;Uy9W#D4*6oyylXN$0K2k!(yaILC0WW!*nyWBB` z1cC77)_jaTM&Bl{YSS8!jV{HshLGl&IjAR*ARy9j zT71)ZeOtYoj^$|7=}Dr1SR<=i+|p%Pk)-|C4g=##$4R9$fi*f6Mg9>8D*F?pJ>MU} zm8jxG@|WPr#Bq|k@6TqV@hb3Jk>jieg()ELM<02ESh|Iid#wNf002ovPDHLkV1nnN BrxgGI literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/mountain_snow.png b/public/images/emoji/emoji_one/mountain_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..0684e4ce6d096cb4d45ac0c28974d470de3d28e2 GIT binary patch literal 1177 zcmV;K1ZMk*P)*u#Un}(jPX?ujAzR|?W&1`>(m$StzS$;KuK4Sq6-G2`T9rMbN`9+GBg+KH!7@7dR;_X<=_C4E7GD9s0 z$#u%faLqug7&gYv-f>F?sD#W5%mfYLMFI^HaKclGEKo2U3*bEW84m1G*%h7}25dgkk9l5M$y_nh*^X=KIaVcsC`sAX$RT z(Q1a^UKcOxXYgYT?efPmh;`5?^0s)umQN{Hz)AAZnfXylT`jl?L}47q*WF#~Zm06q zjcueB7g)>tKSO6GrvprK5&2yO$ob<$z#n53y&d=lej_RY*LiCM{H-iN_%UkWJy9Kk zzK+_!CqNYl;yRAv%S#esNS)u+U&GE{{w1kUgmBRc!&=`&`PW(B@%%Z8B=J>fghEfE z{o9hO&B$51x_BEvlN1NiL@3R+liBjNSRn$+;;rBL?r3>dEH)rjNaD*d6Na4NSwROl zB1V0u*%-3K7^sYrw!N7+-{-$V)c{3|v5~kmSd_csx*G z6$zKp_W?5l1+I}O5^H*pmInwNAg#%Px(DTYq95 zNORSEVGh!6CNO!SUq268Kt;fOH!HjjE9t;4SX6MJHLt+<@W^+PO>I`ABQxv`F3)g$y;=D;cXD}f>Q(9iUw3am_HR5L0t rh0!gEzzN1MWm`)a%M0rQW7+rz;VB5%PBCev00000NkvXXu0mjf%`akp literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/mouse_three_button.png b/public/images/emoji/emoji_one/mouse_three_button.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb22b18a8c2e6bf57ab5bbb7d7d966b3bf1aa22 GIT binary patch literal 918 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!wg>oxxB}@L_g_QMlo_*u2+oBI z0vQl-xB@sAt_E2O!UmFi4xIs_8FLm~yZdtb?D^-fK0I~t&f!y6fP$BAJv(>hKE&k9 zx1ItO96x(w-;r|{Z#+JH^2*iQ&kr8IboBH!pqc~6E}Xe^_r&>IK)vU$J)Ay!-qu}* zH|x5v0iCW@666=mus`Ab{`Ud~=M@?R`VH>iPjF}`P?#U!&_93u`tt<=^Y_ocf4+bJ z`}g}BT=uC5FfcHsc)B=-R4~51&YJ(&L4fr^dYi$tYM=bW6<_|>UtgQko3}modRdA3 z8+DCym(MuOd2sdr6_bky}E5D>%R!ekW z_3x+JCy$1y-zeIXv1;|!`2E+pFU@^$bj7vql2Vbn303J%_LUp!3|Q`Y?6p>Oom##0 zoz(?K=}kt7#Xp{?7E}eilDn`gCG=3*?pvYno;$46+#>kW@4|iAGMybl>!$2t++uf^ z^R&GB%(F8K)?QII`L8^ev-@v(@-&4;frUX&8IDiYez@nK=R?1a5RSLg&b554^NgNw za9LNwj1m^?yi4mZ|e~o#Tj%zrDOIZJ>Lw~HFX<~o!N8N zSz&SJ?xeLYOjS>F-^`Z1@%;MPW{DLmY&?_7Z*6RxSUA7^XsUoIw?^7Ao`pO4pEJ)s z*&}{cQ-Iy*z@)Q2DhUxfi{CtXb)qfkb!w>J<2>(+HEoHN@|zl-WF0=Hmc|{<@GMtq zLhS^xcMG5X*_T+nvUKsW3%l;$U`v?On!%NO$;_dr`|^^zaS|6KHNGZVfyTRm)MRtD6yd z%F2#sQ{OJui@7DjImwv|PfBn;$YHEMde@BkL~<6#;S<^6`u>vN+xvg@3w)Zg@$CHa zhp7U6l2!srvzLVZ*qh@@BPIrVG-|NZur9zm`WKuUHx3vIVCg! E07@9#?EnA( literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/nerd.png b/public/images/emoji/emoji_one/nerd.png new file mode 100644 index 0000000000000000000000000000000000000000..0861d21f60c40d59033d30c89d822879b6a33640 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!mInBQxB}__chiYM-oBnsPb33X z+Bv(=pAepx<^TC|YFL=}o_XF?#es*{#wI2BK0lT0{ri+{>=Zy!j^D=OW-A}=E+zcNAp|Ns91p%Ldd1V1_y-BV=# z=5+k#Y3~2uZGQgZ#kLJo^z1)b039k&666=m@ZO+dzQBEleuaR7{pa7m=f3s7kb!}z z*VDx@q=ND8_4ZA#bVOJmH1GYN&HVCcp3UAnpZ@iiojk#DQ0VO6-{zrbuN5|Ie)4y$FuD*_!|I4tIE&N@w z#Zlg6hr5lB7YJX=iin@Q;I*_mkL0@pZR&sLKhg^>*JImp`9P%o4RQA!D=cm;-nA$# zM3G7E*oGsD{4Akov|i6YC;0Pn`BP2t62IH89>^~#;9Rb}Wi#nfColi$ ziPKfoTW8vBb97-`mGW#N-v^`4RSg{pZ5Onexpt%!ad@c2BuZYWzTno7&VJ@^{y&+n zihm1jxLZ&5rcImX;2}7r!|C%%W zJK(s7t0nvz*Fk3sCq0*$k2(`Xnf)A+|4(n=)XCJ9s8TGIVt=vJ#!mXfD+_6ZYyF#3 zW5qYLx$akz?1_y%z{eJRG*5V2DP#0@)>9nE_NXP;wi_DNzdmNPH;Z#|`re41pH_Pp z88vLH+-fNC{-x-9gDb1g$~wLE)d`esxVYNC;C1ymw!_bsr~lmWb$xE3o!HCHqwG1& zvwW|8GhX}S&aT;OZsp#azQ5X1WdEB#>u2T0UG7c$y!KuE=9_u@?&jA$$f$dgS@+`C l>;Bra{PWKC@B6ez4Gy1+!s;OXk;vd$@?2>`=ny?Ouu literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/newspaper2.png b/public/images/emoji/emoji_one/newspaper2.png new file mode 100644 index 0000000000000000000000000000000000000000..ef62361f06b3e4c49864fc0f2318372c37bfe487 GIT binary patch literal 973 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/oil.png b/public/images/emoji/emoji_one/oil.png new file mode 100644 index 0000000000000000000000000000000000000000..8c00bde7330cf03691fc2e5a5f22748a3797a31b GIT binary patch literal 654 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!ssnsNT!FNmv-^b$7l0%(1HuN1 zqXA4c5RJ)cnQPXr%gHaAFlkDAS5Ik0)uJU!-F*Up+K(SU4pg&s+qRjr=kD9LKOi(B zGB&ZUvH8II-a|m^B}#()f*JNVG|YE!xW9h?{q^$$&MO2YBq+Rpf8M}3A*POjfpL|m zi(^Oyp%u((1Iv4om%_eQ#NIJk7d&DkyG=a7C*A z^<2f^w&@jbS>8) zbP=;O+vHO5moLlrMMaDArLU8`r>qU?n!i-V{kEOQ=0@EOtWFx@{vtEgRa^G*rrg@# zGllIyA45jUybTv4^SL{xTzzidE}QJ(D}9F@5R5bqrCqbGteHVRroVzGzmdpZ_YS z))?+>JCSfuH~iJZ>i-WDT$ggl_7{1q+VtpyK#8sFez{m9PJ{G`i+x(xyWjn&xg$wl zp1Fe-rd-H^k|NsB@vAFri%>3Qp?Mz(urmiuFQl9_-01b3fPE!C7pU*(A z?|{EhU@#z&$-H*}00SIJL_t(|0kv0GV(TCfjC&Ow)X@E}`7Bszw2?@E^W!*XhV8&x z3CGLn5DACV<@oj;?Cz(y!s)*IBK^3J1?(SRpt_#sB7AhNFMQ7N>(St;DW-;i?k|BfKPCQ6AiKO8cN+b951A(IOCZf3c$QF8+`5KCztBubOQ;A09Gmhb zs5pHUqE)_;LeV%0v|8jmT;dCUnO!4iEhnpKz(xXE%a4Cv#tQoe5~wJ) zVP0U!<4jE}c^6ev8s|b%DCsuLr?ch)$gr3SDV4IB_Ts_d0-l{TlDg$IHr)J$k+MSn1)y=A|gh=JBoJ7b{et>GN<|MD70+QmS@NOQ~tWK_{l9zD`6MjD1{ zhiNjQrr+Ahgn^nFLltA4_6eYqgtm9zmBUw!74W*WL#N-#<8h z@#Oh`k1qb~vv~Fy_U!vl4^QAxe)=B&+vEEe&;Ng|3O6dmNw)j|0000+2yG~TBl;=SMfAq$pQ}5}%(;WX*0^X);?e>ZsEz3~6Vax1o# W6P=T;Tr37Tg2B_(&t;ucLK6V*r*$&` literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/paintbrush.png b/public/images/emoji/emoji_one/paintbrush.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8ae7efd77f03c0b045035abba13d67182439f2 GIT binary patch literal 943 zcmV;g15o^lP)KwH5C-6T1V6$(f?pua%uHow=7yP>%goHo%*-sRT;_JVBXy(=>?v|eW8X@DN}=zU zz23Rh;a(PACBwos5$|8o>;y;f0TJky3nBxoj;|uHi);|ltcYJg$jXtCuxfT194Z?I zSDMDb`T8-iw|Fo#jgJK?!D{#cgkLx{3Bd@LLq*6XL|YEOY(@%UmDy1+kP0|pJ3Iz& z3;G!A<1JbM;&l;2jaLUZLn?qf9yc__hNlb`MgK4hZakNTcskymt{G)J`~t$`2G$R}A)>qSoW@$SczplbG108?bi_4-$I=M@fHNMa zw*KHRh-lpK(YD3Y5!VDBr#l&cz)pC4f3|0P!aJq0)@FD*;`Se3WoJCk*ZEE2@%=4< zUm#6(X7Gkcw4L!fSA4de@dISMiHYulh?6s(UeGX$*SO+!d91Y~-Y}1+)15u=G|^cC zPp3TmF_am6HhVlxb|&xx9GsVgH!;ie$1iY=R}M9Xh&OvY4L2t6I$QXOD>t=`YnE*= ziGRQzFLFTyj_%sfCp`YoE%|_B3H;rsF94Tu^Hd*(8Y|*yQ3fF<0ydk?+J66jpd_JvDNzo6)Z)C_~* zaw6lBAT%mYS;Dt(-(k;|HEa(!h}T5`6Q7(8Gw0@XDIg>=7XPhl2@?MDod#Lk`D zvN_^4kp~E*q+|{xyc{e?E4r?y=`Uy% RtVaL<002ovPDHLkV1jSdsr~=} literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/paperclips.png b/public/images/emoji/emoji_one/paperclips.png new file mode 100644 index 0000000000000000000000000000000000000000..3c086978d343c2031e4e7105caa6683120554bb1 GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!S^|7RT!HjkpBSgLk01!hhI1hd zIEltURu7bdAc)|M+W8R1ov_TdwlyiUj;}191Qc9SHWeriRQV_<1;`Cwcrj`A$=s<2 zvl2Fx0NtTl666=m;Lxz&VSmGX0fGDT&)+})zF$Eh!63k3eZu>Ieueb~^WV>Z?{NQF z$-Ykv42%QoR z`gDc6C5>lW9BzGh!^C*{W8(y#n1&}ZGnk7L_|7z18nD+nD6mg@**GO-!UP*%o(E^# zRhO|{YEb!nHoejH%5%w|CEN**e`i0qe86w-y$L~ETR#^nSo3l2nHI9+cqVFo~x$65Wgw=T{`HJ^(4=(>gtu}3>*>} zm(*##teuzh!DCYT@jXAHxjflzPN^)sIxk|CKWp)XRho@i?7^N#-5YbyI~zoAkGS#r z;hUvehZDBxU-+0Z|3c!lcCT-nYC~jBe!I-=y1RVOUbfX;s&+-}H@dstivLpF4U97e MPgg&ebxsLQ0CdnZM*si- literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/park.png b/public/images/emoji/emoji_one/park.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c8362c3978fd0980939f902f91c5abd7145ab6 GIT binary patch literal 890 zcmV-=1BLvFP)mq+&*|j1+_b&Su&d3M!p*pk!)lwvceBc%YneBQz*nHfe~ras zlgMq*(9nawPygmFb*Mwp>*k2US@P*?;OxMy*P!j{gX{PBK0`;7cVUgXZqnP_y053q z=-iTXU82#8ved7DuvmeyS@P=8iDpdy|Nrpmch>Cg)aB;7v8lY@zP`l0(%IU$%c#-T z*4ypave~Mg&ViWAcc;{q(9+V=-{8jO($Un^%*n{g<=TzGUzWpfs>qPk^=@HynJJ&R>>+UY+`~Ht|p({xRW;1%__u(}BoKDFkU z0*3YR2d>iwtZ?Z!A^uJ@Gakm1Z;U-WMl1~dC(<8A*5ek`iO7VDW6L1qVq(%272;!Q z3oLDcX-+2x5lqhc-#XoH#~0W*h=>;khy!0>D{5e3Z6de15ctkV`}+qW=oi*Da@#2a zNIJ;{p%lVg+o4#yQ|BDFRjCoNT;JSmJlN30coj zFa><$8q9dL!~x6$$+^Y=F$Xa30cliA$pTn$Kq$EJ10(~I;|2$q50a7tQXz{H^Dzau zB1oQ_B%l`{pD2JiP-?~iEI>^O6i*&dSYQkg2b5f*Kt>z5ivh+_fN>E5g(QI@XhJqY zhEUf4jT=AUf-WC_C+0wxi5;kdF~GRcK*fVO`Iv!h1LnE$HlgAG2|J8`0soS7V5_@# Q{r~^~07*qoM6N<$f)TOI-~a#s literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/pause_button.png b/public/images/emoji/emoji_one/pause_button.png new file mode 100644 index 0000000000000000000000000000000000000000..b66c56af7b55601c114ef88cffa428dc9df3901b GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-u0YzU`yd3Zc^#n*i@&EsS2F3RN m11ms~L1}feHjhCUH^Xz;$|Y~O_nrqD!QkoY=d#Wzp$PzZhcWR0 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/peace.png b/public/images/emoji/emoji_one/peace.png new file mode 100644 index 0000000000000000000000000000000000000000..556d48acaaca4c29ce852b166944c2ad06b62f03 GIT binary patch literal 921 zcmV;K17`e*P)-;7U0NM|<)VmKheBgDP-QWsckz$-VpXkJo?J6KNuS zXzXYIU+kATJ3Xgo+vm-vubtq8bHNJ<;PY4~bbAf`Fo%dZFeK($505>x$!~2I(nidA z4RdVa2k^GpL}56F;I`t8vrdF<6@C=bkucu(T@QuFbrRfg=g#8G> zFSPsLV5bb8b}V30)^a8H-|bj{!+iiZ4ZC9j7B}_nH?@zoKm**ffLJ5IZ?GXFBn7j< zdY&MF8a}KD2!d%M;M>j9^dD#fq?QqakN`n2#C5&0&I5t~dU%=yAmHE=5F3Q2N?0<~ z2uRfM4J6=P_^x!6@C_s^d&gJ%*Whzyu%m=;AYs|NQt!NE@I(pUK*F+j{8I68iRAD- z{0&H`ZGb{oI-zHUM~#UkL8+s>P}~PRD?AcFkbs){xjyO9$A>~vu*w`G1Z`gCj}xSg z`)f=OY6ih5d$KF@9;yQJEk_0TGuNAP=0Kq|cz62u#Ar)+D5}aU>fMrY` zJ87~Nf&lJ3SHvi!BVptxO9Ks*?`8>~ax@~uNdQQ)Gar)L~M1X9D00000NkvXXu0mjf{|cgV literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/pen_ballpoint.png b/public/images/emoji/emoji_one/pen_ballpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d87b9fb2768cd279b9f97452ab2c442b51142e GIT binary patch literal 681 zcmV;a0#^NrP)&KY+d+%h1s`1M?tSiVNZsAtf7w8mklw%q!mVUVT6j0f zh4U2q&ba(Z0261ySetnPIo>^-LbgH5>U)}?dGO|A2ANnh(<}hqfXFHW(g9&q@dZTw zBBg<65CM_nPe02g6D!V6@Hs-`bX2Q)$F3{ir7FNuLI)*0g9rmV0pXBR|LsuE zxLh&vxuJnIN)VI^=rHgv(El>Pi&Y~Z5zt-&rJbHM!tvf6@&e=SCD1A0uz|mU@F~Lo zO$iN(+den&8AM=g-4fIxlGQkByg|(O9DPAM& zC3uW?DB%T!k;XfeKp*c=g0Fac3F>6YU%b5p0m=Nw;}Sx|qg&U9gT>D$PsB%j#7BI@ zM|{Lbe8d-X&BMXr(Oq2ieoZ)dRKN|0#3h7+&ov&G;4K~%(9m#PLJ0U0!*L0I;?V~W z>?L@DM+J0Xti1$(@TnD!qRtb%z~jSSjog56pYXgUyaCC*K%)X)Sl|LuCce(tm0QK# zm+yXucYo8G!h5`Yb#fDlFs?C8Xp^WjFJeCAAapL>{h8h7%FV{#> P00000NkvXXu0mjfQ=&eH literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/pen_fountain.png b/public/images/emoji/emoji_one/pen_fountain.png new file mode 100644 index 0000000000000000000000000000000000000000..0b11b69de7a861a2fc8d24bcf84a2937d97107ef GIT binary patch literal 627 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Dgt~$T!FNmv-^}8vw-z&7<~z(^f4(4~Ai?%r=^O?I#!gQc$B+uf zrBg%8R15`JHqUIk`DV(?f9f$(^P+x+Mtzi5%v#Af_vkLg$dvLQlFD)?y&TjZ&s^y9 z`J~Q8^{cfvYA0w0&uHB~+ljH!_p_Lfqs8B8e>SjIRBCzze_%hw{%)tPNx?<)C7K+| z4fIZUBrdG|v&`U#%4q~;p*ox+CV7#YoW8nAf!|_hLSzGi4HkU`W-2Yh1 z@m{m;+fPyLEqe2NM2&vbLPqUO50vX(P-zl@PNv_pI%#rgsIm@g@&@vtgpMOtNugt=c~{Oy!#o~b*;Z$bMUzv QFa{YsUHx3vIVCg!0N>^o9smFU literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/pick.png b/public/images/emoji/emoji_one/pick.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f116e236f636eb4e152c81d5eefc03de0fb94e GIT binary patch literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz$g;n6XFWwcBc6N(Ucjpm#y0b zA%P5JHe4zuIRl8`T%az9%6Usy00rlR$;o-aKtZ@lpql*BN}%l0H5=N}{N^oL4wRZS zYaUP}E-@LR9Vil&m#7xQ! zo;G{l)R}WuG^VAdB(JPbUbJ#eRz}+D#*}4siHldQtISIST7AqkO$Qh*<|RRX!3+lP z-#aMWZ%Ej`Ut#`v2Z4t51qK2J>kAV0pMM_^aK6EzUts_H_XY0@*7v_pI6uGPe8PEw z_xtZ(-RLIGz`(@r>Eakt!Fct`<)&muk=BQzw>@uf+s$owTk7%O`^me~+QU8HO8xu( z+S=|%zL#G5v$)m#QLoS5e953Q`{WOor56MLUi&Nd+To7+s@|Y_nK@j#Kh)VL2`Zjy zPFCM!cw>t6Om^qT*XB*NX^ZOS4t#ljabnNxc)RO+<-Xkh*g3ub@6R8r?dJZE(Ye+$ z;g*-al7OJo^eT1vV>fI*AKl(FA!^sOqS7B978dusf8#u{rT1{!?ynm8r0k2L z_Ppz>yT8+R=eAhSdY^6>sQvZbzsWcGTU;0?PyK$a?YnIvzwmQIr+WWGWfB{NepL&l zNQG6Jo%t*6C3j%em4`3>{X0>#-(*+*yF=^NzP|W(?RDnWmo}O1`R{hW)wTQ6M$3RoT?$6&VAozuO$@}|p9$j5Vstof41Z6kh*Kbf~afzI{iNU|)GN%jU zvImQWI~q05T;ObBSTIGeI>jhzdX=#6JXCaaPJ?`o;^hUx3Eai9yO?tx zPL*SfUvbI$fVkWX)f8?^-}#2|7rsb-V)YF_Aa3?j@g9R zB98GMP=7k15Y&ynp~G=4?{~ z90X#Z!bE&8AVzH6cl{8E5l`m;D}k7iI&Xam#894&0cHX*wNl3b0T5HZj*A{*OzQYl zhdASZ;S=!yer|x=0J#Bj17!1cfCt3b!EC<{aI^hNP(=M+fd8jL1B<%MyxV0E#{qh2 z8K84vsZ(B5M$ASCEu9A=NM<9rx(D!qn2g|CI7S9wGJ<1l00twhv~Y|LpqySalfI7} z$KbB7XMhk$IkjmHeXiL?pU-cO%LoAoQ}IHDmv`x^;*~gzAi*(t>$@uc=7E(eyu}DV zCQfD=pLl?v-FWy=xrsK+9!pn-jOuXlz54d<)o%Q|&Z5QUJn8e8Ywb zR9aR}h&u>Q64wweA}Uf0uW0;!9x*e4QdD6izDt)bKBDY2e`k;fE8!scjd*SSKL8;D zBv2aiw8r=D(QT!b$&>!AuT&(8cOXm@|9IzgdUk&K%5JtA)f63T;kOL9#EQs)&@A(TKK1`E%fTp!Z^jN0c@Z&xd~tPRQ&UO zb5(o*!cvFty&!Dw6~G3`A->VYP>@2r1SjD&z{jdBL8JJvaePcir~pbJRPhN9f(0~y p1jk}<5SQ1+5COOh5+XUd^9wbmYLq5b`{4ip002ovPDHLkV1jhFV+a5M literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/place_of_worship.png b/public/images/emoji/emoji_one/place_of_worship.png new file mode 100644 index 0000000000000000000000000000000000000000..6ae5d822a6b61e1f792436bf90afa7858c34070c GIT binary patch literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HlebA~|VwDu7)iOB_u zAS1Y9I0K>u&eiE;;sBa1QxfDC%pmao{rUL@0zjOQ&|k1$A;4jOgF?Z2hx`5a4Z0W~ zFfcF{c)B=-R4~4s%ATjADBx0k>ClroGk?cl=FnArm_OU!x_$Wr-}NkOv-oRE7n$_N zJ&(VhEtK~5b<4~dcOIP!PhBAIIX_+V%&Rix%m?te$C&me#rlQ(vHQS z`otS<7-y**(f3a%sZme-;-lzw_t2z_(5KVxTyE7U{o|*#w95S8<)s;lOsa7ptwZ7QmjLDH->Vi1xGdtC`C>y@ zV)Bc^cW#nRzpp&HH);EfMKjrqL{0?>_jle_Z}48jQn59ov$N(Yr%}$4`TytEPEFbS z!0z6GTP1hgO(uL5__1G<;h(4lZ%Na{3DznHBw|OO^79k2$4kyi3IQ8<@B6;zx(@szwi6*ckj99rlH&~=xYB{ z8vp=Z7iUK=a7BKaT2Rmy)#H``K&=Sn>g@!&LKaEr>i^Y#2HWzFd_Mmx$s&O+sD7~^ z0HseVnDrTd<-tT(|1Z)f<}?0QVSTatOPFM$2?WxaR?u#(4R6YZgt@682FEIwy2kGW z!2*{pX4fl(bg&v20H%D~^h6R@o@f-7{7*(KTKrg}>}wD|&6r4yQ7S|$+)iO^ta5#B;O0%i7>RMscO)r^m5{)E z^k8$gn>#$LT$@!X_#0Bz;z+f4rdzbc6=NcpnVFKQ=2Zb(K07B}nr1(FGI$3gooQQ= zMizq))G5l#{W5?Yh`=Kakdz241v?;yqp|SpDjT@iU@8JhsS;!HHraR-#Q=|GHWe;*0D$^mE{^BDV>zQo_#l+v^(?@oElW%e1L?iR}}E7uL*cF)4+f%NXQo`!w)L9L+{l>tYu z1vnhfQCJsjSDD%W&RZX~)|f+Cc*V8APGp$X-?y+?Za#BZZ+g|d`Zp+ghm9Kne*dtU zVt_@nq}<)kKTt?gy6B+U^J7W15ZFOGZN77`+t#b3nw`Gq_(neht1p7CF&_aVy|qEj zYL*rW@xO&`XKda|?Ap6H-x-qafOiq7T(!yr%6jaKF^0Y>4JGZZqa(mJ^FPIV%<(>P zirt*?D@V_0!h))v7EXR_-l~2RzT@YDQ({6c!=xy=!w?nB^f)e8XCcD5w<@x6S4y5h zu+^0TmcQa6TOj-Xac(}y&ctn>McQROtn>MDAnZF%-pL)rywT-n3fv@{6K;uvN>ERB zSEF^*Jzu7->#--4L~5$5T#~l=wHBf@n*~aFwNW!WCF}pN6#v~LVZ3;HkEu!vM_CMN*IA&0n zuJW~&t?qZxae}Dcge&91%`$sgHX(-c3f*PrM5gm}RVdG@es)9} zAOGIc;wLv8>Yi9q9c*vE(cF6O;NO1wj9ig@Y{O3<9Q0?FKb8qBXQ24PS9d(_#a)k1 z*UxC&5N*QVb}lXm40pM`#A{!Pf-Erves zsu5;}C1`58p9UOCp%-_N&pK*X4nd2t8ubOCS|r2V+t3uCU+Zz!%YFa@m1;rED?6>j z60|h6Zvdgoc&sllXne>YkS#_p>R}{Kk^`@D2DK82L_;;z^+CQdVQ?7I=B5--gt9t@ET3kX3H$2uH< zV&fvH1_BM3kgu3)r0SOEK&XMq2Tctw{c;hTHIBTsf*ss?xFg-#;_lH7Ey9q>7~0UO zV~TnON!C$sH@20>@ydKPx)KkoY#Z^~>_Cr;&FKk1=+Qm^Wqd@_sHQUvil%u{4gJEn zrL?1cfwU_$UF4AzIN07ytvSbH9Qi%o7Bel3~^?Gc)Q4z5i*|Rj$CW z%ChXPdS#hZdB5MscJ9i^m0P)$TVpHBAs}1H8wBpcI3I~TK#;S^037HT9p!azz0HX{ zfY+qJtAdDz#%E`E+u$I7d*?2$H#OPx+VILtFMgMz3NuK%ja}6UZ26U!8Fu>AgAaap zD48@9&CRCRagY`U=$@R!qZ}xIhun9*_Z~l2Pyo5>t3TI0H91U1;oBM;`Mcy6XI0gr z&#_FGyF4*7ZNUJL{Oen{ZMd^g!U4mu2=+*0qY0&4jVk<~{3?TB5*R_sB=QD0;#$s#9FKqoBix1oSW~2sABt?^0xR*& zFhHK)IOC7ig+#x7@)f?=Kj=jLrk)<-Hts2r0?esc3Ga^ z*hW;pL-!9|YB;D*&CNks0-B!;U~Ler?pR6N+}q2LMUYBSB>74O-zgQ=XsnoDikI;Z z*@Zf@>Z@Ms49j@=L*^e;V7w zFUL3A7vg31S4xH9RmBDappQWFAtedP+1)fSzvhkfVL9v(xd(sqNcz zuct?7l8{=35z=h{M&Lt>3mk!|rLS+;Yqd2VKaTl<$O7M`+W-%Uoqz$1fdS7YIgm^~ z(DB5RyrZeff+Er#_{=k=F*EKPrqJ%{+kAViJ zI_MTL;pvJNIoF>k<)|Y4xn^5iG#q2W2p|GNH;^jf(-ML8yzz#U$6-L+<4oN?3nMPH z&u!5{z7#99#oWMm%OzpEfsb9!Cy#b^>Y`R(sITK2__YecZU)eNd(Z)2MEkk?f8e{J z{0o@_APUt$0fZ3Jrw4xREqM|6u%jTbUco{$e-kP3bagcX7&o4I7BNEXw4KR^nfkQ? zANm25r=mn%+P>Y9J5GLK5Fn$^_~#ECV3T8`ASWcP5@Zl3qUx#IS_3IDWjOI&pnkkS z;BMg4Kpe+g!ne;B6xevbv#!qWM|Kc1`b=MLWH$cHudu#~7xGJynCTWV3~nHHd+yL7 z3?v=GLKQ(EFRynDjTDIT*A0Y0+3g!YhW;>`&(Q$6Da>?(qZBv;h+}Bf=^h+I`!?7) zEhs^vZftntW9VR#R|(vOeK8W{AID4W)MMyxm5K*~y!+pQ{3?hVT_#9DCNHffKOTyfbI5}|A$ZxA4Nvnw27%V<}F z_zP_mE4|ax7JzHi00000NkvXXu0mjf2_?`E literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/printer.png b/public/images/emoji/emoji_one/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..a314326739ebbe63e8f9bf8d7356c5163f0ea892 GIT binary patch literal 961 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/radioactive.png b/public/images/emoji/emoji_one/radioactive.png new file mode 100644 index 0000000000000000000000000000000000000000..cac4064d436b6b68377389752de35d2d221d55cc GIT binary patch literal 842 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Vgr0aT!FNmvpbRK^BsfvQ?2uI z9KC#9x34r03wJrZ*=+TE%eDr)+sBRnKhrzE*QBb<{`n=tNnJKcNlu2w?b$#J_)3EO zf*IZ$%x@65?{L0AA)tT%JmFJ&85o%QJY5_^Dj3gBXBB&Fz~i$0%;O`DtX2P`^-j!e zn&)-;f8cDFWTBs@|DUeeZjtzC%Z;=4o9%Sc49&QsOgFQVTj*RFWN89GDc+qJr_zTa{?zny%caeK*zt?7j< z279%eZ4{8&CLGnpbD11&e&#pD3cF ztdn^}B-na^q4tAJO`G`LZEQCRxnIo=E;@IqKD=1i?^UJ2iqmO=9gzXz<}1?Yg)lgL zU}3v8H}wMx69dyaZM(ZV#V(?OsSk4x-vK+H=8H7ay0E0-xr`@ovYWhQE&^%Hxv+0{aqeNCUL!d6~?ZP^Bk<1Sg{ z+|!qBv79fUeg0Bf*Xm$z&*wV%nWuMO=Mi}R^j5aPx*H}IH&_!MZ?o{zu@*clc07Ai zj@ic|uGu=<&nh21Z1i+%rQhP2hbP$Qo8+#(eW>YMyQc7wl9 z$LCeU-@kxh@85tBk05}6Ab`J*&wwCM-++LxfG~j1pN~MCMl{wCn9dvTkG%D)sfH7sov@zI1^Z(!{!@aJ-gI=i=c^ zGsJs-DklpiHY&miXHtL9@oH2>!z9-CD*1QS%w=!ubfryEd2-=&Nv zbXEx@;C$!cIbIxG@&eBfI1C1NRSY8#7eSpNH>MzaW2v~2tTh2l=pz4DQ991fqPOH=^KRq z0nlyNbzcIB6L$_L3E-tSZGklfTL-v2UMLURMivOysH|7E>Q6UK({5A(&_^EA-PB`s7pmWsUE=lLh9-X z$vE#y(2<&506$wY0Ii<@c6slRaCl1tX#A?n0Mvgq_!tz9h#Hy{fWa#x5U&ORQoKh+ zfysOPyHW_m%C&zy3XHHA^{Z=ZRv^~2z+wb3T0jBO0%HCHJw5lmR~Vf|00000NkvXX Hu0mjfjE?8z literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/record_button.png b/public/images/emoji/emoji_one/record_button.png new file mode 100644 index 0000000000000000000000000000000000000000..b62b87170e838fb0b0dbd94fc1f245c34f4f94f9 GIT binary patch literal 374 zcmV-+0g3*JP)6tAmJLh}=uF9y~oVKoYt-I&< zhy@uN^n(o<3u3FGXJi=UWXPCn4;_$Dpc5%b2(^VzFz8GSsfOSWDA0uzJX~tIuTUjc zgmZPx#07*qoM6N<$f@hGI_y7O^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/reminder_ribbon.png b/public/images/emoji/emoji_one/reminder_ribbon.png new file mode 100644 index 0000000000000000000000000000000000000000..c9267457ff40db673fc5c8d08c39d836ef77eaa9 GIT binary patch literal 932 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 azkUJRucRmWKsoUM0000hLV`H z!O47xj-|1>%huhaueYJBwa(e#ke#D^iH^R?(1ehdq_DNIy~coxkM_v%8(Dv8c7XMY^S?0000KbW%=J01&@0@88dWK%cL0k09^gVDC`RSWlyO z000BrNkl}0O;j- zCg&ei=#~p%2csuZa3BO6sMIsU4ux{J;4Mojgdjk=uERb^o}HBu>@(UzfCy1io-Hrg z2nZYn|5R_c>jV4v;z&{Q8cb2aPk!8l1CZUlJb%+LZq8rsj?@QiZ9mZ!ueqcNENtpE zU{Kwb4Rz|0;c#h6HDp_-z^Lh)3qaBy6%5#^15FbRL)0|uQK$N?Z#eY7RXdNY{ha~J zX5g;jl)~z}F}LbaZ8aK=L&4}rtGc^0cLM`}a>_je)<5}frLhku*r#$=X47@gq2OdT z)9@2CW}I3Jt`_uI@3ag4f(sh!W{+<|lC{9L7X1Z_md%>L|2qD3^D)zj=gg*ibS^cvNwK?GHe)^vz-f&oUDsI4G^mP#PgMyab(% z8ef2$WEnhMnH92Kp0;?i$3Yr-sARDRDPG%D)0W zhELC5u=p3xKXLIv4fN%!S;Lrp^^$V&fep1@`}5~^ug1p*Hz4K12L*BQ!3f1MFl-wb z-24I=(h^I75SD(23F| zL4Lsu4f`D&1Oock-@l)*{(ZxFf%OXe9qym+pKnm$V5-u=z`!Wy>Eakt!T9zPYu{l5 zfwqgB#`@AssWE&0Up-~e^=4DXQ}t=}^|_OoJY&w*wM$EEd#1*sv`O&gx@9-p3J>nR z>U#F-_wNqsx#xd%E#7MJ>y&Zk<%5dlg$~N)7ZvKIC(rJ^U&Qdi;`ODv$cfq^sq@Pu zzbEKEwstjhbI_8@u4(0aBpMSCx_k+=0~DNw;5Udk80PL#7<`a@aiL@{f0jGum|1DO`=k5 z&C6bv%sTJbvF<@bL2G-5NrR2qf&4H1Oh5FE<~Po%`TC=QYXt-y;7bT!bAnL;NSwcB tZZ~PYoV)@@M`xJDUUl9R;aUrrylo1<&6Lp-HwFeMgQu&X%Q~loCIGJh<*on# literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/shopping_bags.png b/public/images/emoji/emoji_one/shopping_bags.png new file mode 100644 index 0000000000000000000000000000000000000000..08c37ca9071220e8519860050f5a6eec0f1c8e4c GIT binary patch literal 1247 zcmV<51R(o~P)7-iW%3emScCT|K!|9dTyn7v9f%@@2L% z_}F#(0`^MR+74XA_sS?nqlJ-}aeZeM-`^MLa;jgZ0_{>M|i&OwNziPI>Y#jS7 zud~r6w1DhaZb??aoN5aAy1XD+bDyld{p~!RP61=8DPWB)#N>t>!n8lxyGjCbKfhB7 zn%y9IKi(!;uiRIufZUI+4j~}i=C`bGm$2=xJJ8JB(+CEz#xcpQtbmDp9 zO+DBu0QckG%%>idocHd*?_>qEDKE&*8Lx(I|F6}5WClMbF^o6sFl%w*%|1fB8HWgD zcoPp4f5~wo8&B8QEjSJ~&lXu?SY`g^ z@wMjf^#K-HC4@KF1*7m^yQ$W(t^lgbss%^Ue{OZCGw3@c81h zaST9)x(}U#ntOlPPZ+$$3-A{mBeE%&-IWFeMh9@V@i#**IUDEM6$;iwU}pr#nlnV^ zVpbJ6j<8w)pok3)2`KJ%WFNedA$Ys%FFp>zu;vL`9o+!LpMSF9DAOq?;NNyxxMza{ z0)qGOk_dKhJe?KyxRMeWRJ;j?B9wUJ55_S_z|2D$_X&XG?g}8@=nK{CmW|z?0@SRR z4!=~2dR_(aVv2R#6j1QTO)9)U<1~a<0!UG-Yg8R41!O+{koc3&*8-*-7YHzn*;k!M z$2c!w_x+DZ+2BhMNa2k;kOF}9nw&T8aaVv2Z*PC%Pd`OnSK9k>rv$Vy2*K=O?E?hi zCJ4NVhid^-j++w8lA)L!Tyo;{Qd3=Ko=lT-WRuP z0o(}n+IM3KJp1maQV~~PcT+{+8mEZ`!~$Xgv4B`W)B>J<>m#}8uKQU7f8!X=MP4s0 z0ytR0LE~K1_0l4M_fDBI1@PbUN8UN5Zz=FXi9bgc;MrF98#z`A84sh9pukOS76 zR&@2!A%Jke>Ufm(+!qiFhy}y~Vga#$SU@b`m5;x2SHRm}{*bhQFMqA;o`CTaCt<)C zeC-s_rB`1JSlV{!p0t4aE!v`%j2J!E9Ra^JYK}q6wCOXjhLi0k%5+BnLL)o|-mG1x zWJPj0xg!7|I0ygH_rF&Ae%wQegNBW8^HX80TP_6z3K1T^@oeIx02KrqS|v+|oukA# zC_qa9*whdbYnpstrxBhxc%2UKvH;F3pBk$|?*W7Kvxmz92-Y&5&bT)ab_OJ&BjT^d zVgacYu*UGT2?^HJ8UYNRk?^31|FZyV@XACuFQAg(m5Oj(z+W#9=SNr+gA@P&002ov JPDHLkV1h|8S3&>) literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/skier.png b/public/images/emoji/emoji_one/skier.png new file mode 100644 index 0000000000000000000000000000000000000000..9000b55db4ba89e913cd91dd8b36cfae17bc4e96 GIT binary patch literal 1559 zcmV+y2I%>TP)dR0I$Q(T2kSixs2Hy$$Frpo4Jk@uPGovYmi_ zjef8Hu&kYT8<{A^6fYsbU<^y@ljw=YZdm%z8CGl@jF{pb1hOCxS@fyBQ6yP0IUocG z77+!}5etD3)S>A4LYQzi)xC5dd)E%HG=hv%nEF1%MmhpxSZ97J0TS4{;vT4+e)E4i z0O`-skTm1KA^JBc!UAF<5Ca=ghH~oD{KDx!Poi_}21>`uLt!b-;J8Mq!!h>iu5c#O zxuI7~VMUq@Ix_qdD$ zYhOcTm$WZiq`@}9_6w(|?!Bo2n)9xJEh{TS#s6_;3^<)B5}cK{u2md2-AR<-b_E5o z;+Qko28f7`C@5Y;Vb;_8TgU(+Q2fug^^nL=b~I{at`sm6Xfax&G-PFg;snGd6Nqf$ zf9zAU3Vts&0Ulf03p;mhhW0rbhpHYj7)7?qAwMTjq{)i*%=qR0e@Fh)h91~_Xs3Uc zpplwATiD?yBpZg`0E;!?_QhrJ*VE&&M*e|StJz_SCPWg=68I#^9h_7|XIkda-wvq+ z5b%un_)*pBolp>z`jqw|2JrnPiOi6U6_pxg!1r2LRs&v|Iw!6H9wwslV1kU8-%ac^ zP_Pr*fM_hYTk!Eg(GsHPY5;?SWL$)+W-46SG3xc1tZY_hZW!Z_&GY=EnkF5FbN5ytEhq^ z%pS5Zrl`^@gETMcPpBwdDCp?5WE2r3x~#Ai^x_(Lro4r1tu~?|0{%J0%Mf1PB0KH@ zCLm5wwD*-Yzy}rWtZ*Y+n&aO&grrBBcqJhEY2SZ3GTKz<_mOQFT89a*D5n%C~ zaPpR$tQ93SjvMVTRNlm!tZ?=fI!%3U+k*%!uEbMcp3%P4sZrNN-rj-?Xq-M3Cf{>2 z^gVtWcoME4hY%o0Xb2j6b*)Tw!uXrllW6XC3rW1lv@kOw`hw2@dCA4Y8L!kAo;$(c zZlN3fG$Oj^fQIOZf!MC_Lx_}RMzGj7%!~=i-ZN$vt!S~5-7V6RZh%d%*=b=aV9&_9 z6c()w|FQ*boVr^h9%7;ms9$(Tnq9M{bsP4&oVX7=JcX2koy((m9t;qtY~O2;*bw9x zZCOWb1Y9H@&H?p*EmJa2g%R-KAjXI`zTzeiLVqjo0^>lFzsbIW1t$orH0}dDIRGFXu=kIm6 zdt+I|?5|;a!V@QDC@#C2dS`P^=#*W$6}(H8#J!aEB$++cGTeW2Usr`z?e4ls`ZHg+ ze|;|+wlme0XOqnYLE|TlA9po=*Y){yqJ?1+!y)5XCaZa#LKFURH<~U#yEAdilxUp= z&UY9awkxUo?sv9vxv-Nn_qgk`;JE_QD-9N$`NnnegWIPkueWZkul+r3>Pi`|s6=~F zrz1gI+8itARC+83y|3FLZQ!$7f@|-dvp$cjzt5b$WkUHQHl2H&Tb8uuKE9p)^NsO^ zI@5Zyn;hz2lPxyHWb#Z9P1q8ASANc8k7RqkE7>tR&UuojO^dYtJV}>bQ5U#s+KL$6 zUCIahRDO#{r)#L>=G-q`z3l#u8}IGfZx=3Ew4TyNv{OtmRpZt@0S8|A|j z+AD5-%+^)@xbckVkN1|nLB=v=FRv{8a&n4$%=swm3$IJf*2@cKe_h zJHIcz8Dpr;ck9w`8$In69m_WsPh0*WRwksa`E{(qk56)EzFUSY?~DE=!hNP9MXY(g zqnpDw;|Hq)1%mGGZ}_{daRF=Td|MZHkL~OmbVZyvM6WYUcr47)J^iGl#*Ph_nVy<| X+Ma)O+TlH*M9bjm>gTe~DWM4f+E`2a literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/sleeping_accommodation.png b/public/images/emoji/emoji_one/sleeping_accommodation.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5399bf1e5e610df42227bcf1ffd0f6b731da8d GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!FM(=|qx{(lOopKy3mg zL4Lsu`x_kk1>P&%H<+KW{(M2eal?zHK)LgtE{-7;jBl^GinSPsxLjOSabf@ev)dl) zEwUDLEuF8wL}H)|K9GQW*sxHVxayTHz+66{AFDd-<|hFVdQ I&MBb@00{n&=l}o! literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/slight_frown.png b/public/images/emoji/emoji_one/slight_frown.png new file mode 100644 index 0000000000000000000000000000000000000000..0325955e3c62cb19357ef0b957f9d61f185d935c GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tf^h9LKlS-7 z_HRzdf4!32Q)E7^+WOI<=*`pIZ|)3l&NSXL&-?s_;A6}ESN1wP?@yQyG@Y*`$S;`T zy+Ol#f&1tC3mo<<1hnwlWjfMw79ki75zj_Wk9=FI-d ztG@A(q1Tu1U8j~D3!Xbg@a!cut{$(bSsJ~@C8r)uQR@(`S~=rbh$LI;)q?ljJz7Dp zu0ENekiWuxi9u(V%G*emYjHvg17|pz9$8|UcJgP8$c&W(AV(6TWO*w3|aQTTVyKrtifv zmlJyu4n3a4fA9!Hj=-y@j9I%5PM=yC;ahb_FyXVzyR$9F=Q3{C`8Q|l!3)V^4aL^% zZMJEQEdQo6n2N3b88lD(;q1(Hlk%VMT-3+hdNb#O|3>BB!uF|V;Z>ytFQ)LwuDUm? z;p>YFd@`@CbN9Wtd*P{Av-Paif2*pu-3_&cuuo0+@i^`2Y1c7I5I zePGAhx9=RDYgF`{e!|&ib9AD5$>MDf^9oBZP{PI=$A bf6nyg_&kvhtHZQ_vBTi$>gTe~DWM4fAqEdK literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/slight_smile.png b/public/images/emoji/emoji_one/slight_smile.png new file mode 100644 index 0000000000000000000000000000000000000000..0417e8db9959bc6efcc25bd86e370a8b76164a39 GIT binary patch literal 582 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tG(YwEE%ucO z`aMPF1>xF{4n^PG8UE&U{ITW!D|?;KZwUT+C3*8S_dWBxn=_4r;?1rAP3J2K@(X5o zZ_qGb;C}ykhX95B1+4SK^cff!dp%toLn;{WUT?i7qsYUWAaVV`j-22B`Xi(F{(gLA z|6|9t$s1e#?ww@!`o*%-zgj9Yjr{T}t{J#jMokEs`0R}1DbMcZXO`)mSh3>la{ZI5 z&ddypp4hx9Rf=bcTw!EpBRckZ((+=tmR zVhtL98RR{9|NrKK#R;-@r~Vn$%>489ht+Ry5qS|SPD!?%pC+q4^^#gW<&=L^^JX%D-w+}mgI4mKlAkD|!YknB%@4L{WU;4QF x?TRA%eGfbGD<92X_hXy>zK=cmwg305ulAqU^yh{4V_=jqc)I$ztaD0e0svKZ9clmo literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/snowman2.png b/public/images/emoji/emoji_one/snowman2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4a0c9e0d99fcd7c2567eca5bfc706de15555a87 GIT binary patch literal 2549 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 LNkvXXu0mjfMRvgl literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/speaking_head.png b/public/images/emoji/emoji_one/speaking_head.png new file mode 100644 index 0000000000000000000000000000000000000000..6fe847e3a2c641a364af8270bb7c5d48dd869e92 GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!FM(=|qx{(lOopKy3mg zL4Lsu0{a~j-p_Bie_p|0eL;Uf+eeo(3=E8Qo-U3d6^w7Mx!-!Gz{8v{bKb9)|EAA< z_R`_P=lo^+spYl#WXPqo>6rgh7mhF0Nzqv<{ojoZ&Zd=hnFPGI9saZ|CSxPusP_Dh?bf3 zy#IS|yVyR=P~m3q+ST$x{vP8i&c6>&>gz7B=Gi_yoY^6^Y4fMGG7Hw#-LLC97&v`j z^uOAhy;eJaoje=n@2jX3xNaYQo$r7ia~)sPtO?~0 zGOik=Ia;0C_Ozul`gX@;-9(+Vl^ezVlvjPr_MGFYqI;lSO37-v!~@%t%3n0M99*p9 zVyhruaE{CNQN+HhhuoLiH+_G=d-I6e>?~^RNI+ICGCO7(B(gES_)6Z@# naDL2CV(rd%LdZQXqLP3A-QwOKYi7>|#u9_4tDnm{r-UW|utxAA literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/spider.png b/public/images/emoji/emoji_one/spider.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc4af311dcded4e1dbab1586c9219faaf6557c2 GIT binary patch literal 1824 zcmZ8hdsI^S7RIcpXe`T0(^ca*R+^eP5u_=CgAYIu1XMH;T4$Z_ zs1$!QxHTLGgP9Qm@WJ4X{qxym3UZC={2UCn4o(eZ_<}MbFc^>WH0IQpQve$ylEV1g zAt-^ss4)VgAezoHQpOTwV*pJQHRLbK2#mv%_$L$C{Mc~L$p|io7AoS#NO*CAkQ0Cf zz_=Q;gBErWGnx?}Id@#5%Mpa-&qNM2%;0I+;!1Tc`qi;F)I4O;x&y#WBDfSAV! z2cv)hbb(zWjxdoUJb5A-;22g^Tm%=`5QIj804o3sY;c3azLH(Ah36QN7~p~B zF;S{|Ou}(2(bMM#|A5LI-zgG_;Y%WUqi~Gn9cC`osLeG7bG3nLi?zjKsbWZq&`QM!wM-`EXf;$Bq*N;*8A7TxXv7*0$6%|` zLSh3)E2AQmS{XuZFes%|sYatz8*J4|wc4PBs4}e-(kda1#(;lqMS{WB^9gtyBi%$l zWO|NI*tuc;qjl>kXz+5(={Z)!Y~A44K)zQ;=cmGt&COl~I_SN>NdeB)*pzA)Nk+=+(UR?vcji2a zalVH|8BD0vV_zqg*pTaD+pUp=y0rA7p0^cS z^}WSG#d$3|HD(n~4?0v_VhJ) z`g67WgjwyHqLkxa<)oPEkm(Li+nAz-U00>@+bmw` z!LSQ!sC=j8B&WVZhQ0Sh?x*k6PG2$m^8E9dEnBvv83JJzY45CGwLORVBwQlGx9)op zz1E^C$Y!Ih`%&@S_hn4G`v#|e^8Th5({L`=}Yisi90 zx}x6;gI08oR>+ma?6^Vud+%WaKOFwX%bMRE>agabmG&YkVjE|~@2oj@bs@+zmCg>& z%gD~m-k`TZn^d^wCJg1GirS~XC!e3M?i-u=0mB+i-jt_LzgSi!<+xvDsbE4>X-DJ` zOj4klnHigCl_b8~ZL>#DjBwoZbI)!k-_lsDn`CyESZR8`2fl4dY4s{z{OHV7o=Ho# z9h`Xk`Mvzng6chS6*ir3@~iaW1e4A3!9|Sy(e%~XsLa*X54Ob%gXr=dBgZf7{H(ka zcLOov1V@H6G;JEmK*`q4OkU9GHm>wI{8(b$%NYD=(gFTR4_hv0jBQi!9y1cWD=*nE z*Nn3z!oA5oY}(x~q}|ouchAj7H~a1H8rG~_d$68~&vjFFml;}ij52<{K0(S_%7Rbp z>nu_kAL|YbcLcfeqW0m%vW15b4)Lf^AJTjrcXk1`lvUP?YL>G8IX)%afLqZ)|31_n zETHqqr;JzE1nf0`6CRW9?-}1N3hh)9t~f{MyFkt~#WO}#5MV55-5VUNq7RBaSQxM&QGa{RSjDdw~Xmbi+1$IVTqzZKWKFcBQt-`cdnETf@D zTN_DC`qzTq9fhnFSnU6$@)zv*M(wv+qGb7LJCgO??4pOG{8o9`h1XXca-P~3JrV!! skeoigee(hBH*Nx3!XEajw}Q2J@FJ%|VRaxj9Q@p11YZjNwht%k4;?v4O#lD@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/spider_web.png b/public/images/emoji/emoji_one/spider_web.png new file mode 100644 index 0000000000000000000000000000000000000000..9eaa5dcddb97850f05bf25543739cb4fc0299a29 GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!Hj-62YD$FFk?U1WJPZ zf*Bg#@4v6$aDKi(fBR$B+ufyVKh@8LRWSv3lPxyZ1k{*z`Wn zPvPHse){QLvDa2LzO6s;;+uo~wglxH%#CN~aURLJKS}wZn98hLZ{@YQ47+O&^Bta+ zb0sJL$bE6+ldGiKDu^DJomCeorVH~VZX6aV@01# zV?wsn^gVOC|L@8!OmRKoy4kezahte%$`1ZXx+m)_3U9g0QCYiILd9I=t$1|tVcr=M zuPq)KZRWbNJ7d)y(G_WBYn3&%Coyi!Z3xg=zwhCp`jyNdS1G&_ZG1PY@TRh@kxfqL zJFnZP#dk-3`1nvv>07Af1i5sFXw_*2ueOV`D!S(#J@lf}EV=tid(wkCEsLUULYrz7SK+g(WeQn+Xe~sGY_kv5eS2rk1dmlRebKz%` z$|(>2eXrmMHsA6*^w7KuQ4LnSi#T{bZ(i#(f#p)3l7;w&%5-ME_bL|qr5e^hYxz_@zFm7dB{}Njo2aLCoriWlpQkuG zqu0dw&%8_bT^`SyA=GtCq~oTr$wGm83;pBjKfQ9<$`|ey+N9a$`}X#fYw6yXp1w8X zUGdZVdCG+CB55a{UC%jVd_AQ*S319yOmdYuO|XqaL^DeFwLMKDGawl>YgnBI_pGOE*;5k8ORp zA(mO;e9`YC>w5Pj-kWniBrlZjQRVcUX{T%5LeleA>0X#8`|3hO57+J`>u)T){p}au zhn4Swrnz`kKF*o1?GjxqRI)ij|0&-?y`|Z9tY`HDe!a`HRIGmI^`8I!Db0r~-h|4W zt^F6aEY5x2$I6(g_rHYsJ^Z>*@=`mKRN;+iwDon9QzNh@7>0bQ_pq7(8A5T-G@yGywp2@V7t! literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/spy.png b/public/images/emoji/emoji_one/spy.png new file mode 100644 index 0000000000000000000000000000000000000000..057a54743e4a98d3b4af0f26f15cae784b368ce0 GIT binary patch literal 1120 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz-STR6XFWwCKXi?gLDjx;pqR} zbO;-$aay~txve9F8xWHOVMM0q0T~cuA&O6Jii*xEv~qM^JTV|K+Tp{da5p!r(4-7q zLz8bu;`B|--2=moEo}6S&3waS96bHZY#csaO1Zu_HX+Jwub~LiY`GLi{4*ZCyS8-AwZc2-&!zu&lnqD>VA)@kB!t^K*N0b1Ey} zEDsKfP41}iGPklZv9Jn^O|i5#n>@M1#N6`p&L~q0>myt9LIP|boy^{~F8{`%9H6Hn zQnK$IO`AKb`0KTd*B3IEFD$BQDk{zMdA&Hu!rC_6?3pew>=a6Z{DK)81RUPq?>A6L zm>+O{|9XLf`3?>S1qtuZ@86%$knnzeP0RYp3=B-$JzX3_Dj45h``Wa`LW1Q3Kil%s zzk4Q?eUB?IpFi`nZT)|9i;RQ97T53BD~3FD`fsQun&cFGrDw~cgG-b|6xMVcV_cfh z=x==Hgr8*Ho{Yv`*}Db0N~cXr-rNW|!q~$1Z%xyG?i`MrtobU6tz8<U~*^hboFyt I=akR{0A^ADCjbBd literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/stadium.png b/public/images/emoji/emoji_one/stadium.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c2547420fe8af0950a170558daac541dad6ea1 GIT binary patch literal 1517 zcmVR*Gdhu68=;-L^=;-L^ z=;-L^Vsd)u=;*!4$p7Xpaes!FrKoIsg38j;*4x{Ai;&OQ*mj1DyvfMj;;V+~&86nw|gu|AW6zkDj5v*_7Gf;Oy}4#nI57 zt*>WyeyF#%d#qY>nPq#3kF3G6lEz@B!K8$cmVL2Tae;@s#l~=yXMeR+d8b^V%yNOc zQk}q$soRp)c@$>U)g>Pnjb?5BsXn=B^rmC>NzG8BE zz|G8conp7e#C@V|yvn}n?Z}3|RY ztgfTLowdic;^*hZ%+A2f%XWo}naOF-*VnJXxzyX+Y>I8u+S$(5)w|Q5(cQVZ#>K$P z%GBA}wZp^5%gxQz)Uv_A(AU?z$jIpE=-%Ps+uq*B(9gro&E@9i@mEC3($Ye$;{WC@ z;p5}i+}yFORH|iPo~W##t*@i9v!boA;NjuE!^WkpvAn~@Qjo4SQns@I0013yQchC< zfWJWBAiqGrKyZK%K)=6_ug_4g?@+&w-_MVa9>^Hv000BDNklP=?|$?>=g$K8T`IxZ~891CfHVGNSz6W!&*qF>8X!jfCK;Q%sP7q>@`4)kMs2fO+ z9F*Xq6l(OF@b;wS6^L`9b>4bGdviDmMGoa;pzmiU%Z0;3;lUTL6M%msB}HVaS+i2p zAqu#}Q8_l@g3`+?i}O>6lv4M>LWCs`BEwM8W(tDtd|#iPsBX$a&21P6!g>*h`64@K zJZ5IzH06|;8Me%L^t`pK(0*3R{0GLgv(kK<4D>)7dIqL84mNi4@a|jxo85o(79Rvx zws+RUr7I9(V11{yJ$&-~A;V`6Mg8{t0!WsxcJJxx8Z;;qU0q|{-OFnrS(q0N5ANPY zhKNreZ|}|q?M4od8b)7dTP_;L=-5c$GCTG5>0Lx*DDX;}3rA~Ri^Z0b;{Mi?Vr@Bl zHSVBhA}?ZXEf=QHIlx$@oF_c*?$?EurgA5&+MDb=kv#^k{dV0_aXnv ziT?gx43S_t8^51QLT5|5_1zYc89li5sYff*P25-=3v)(w%7iEZcV-iV-1-^(rw;r|d zP&AH4JsKjN#ENZ_5U;fwTqhx}nznipNr+Feg{LIMpF4@d=sPD-hKPdioJ5~2bC85c zCJ|~lSP6$H$uPHos0@)9&`E5N)qnv+7g0&8fs!nD0T}qWnMLoL4GI|-ATW@mH12p` zY2X!j6lyRa3`Ns?(Q!Prf#*1!YqC~lK%oZdA)tJ#K@`5(Ak5!tz}o;6m$!jQSwyPd zCQxA0dU z(+4jrGoEB){V6X#)lPb{{nt^ITCNFSHXm#iEt6rB|GB7ra_DdSb4R8nUErDVKxIR6 zj7-H`08nmx;IZU1_`_~^5h`h1t!yX|g$dAO>-y!POQaGBbZm#*8? zUYrshn|M>~TJ7Hl7yRY^zPNPW?(c^y{_%f*OgsO-ysh8o?@{j3OkgZ9c)I$ztaD0e F0syi!>S6!@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/star_of_david.png b/public/images/emoji/emoji_one/star_of_david.png new file mode 100644 index 0000000000000000000000000000000000000000..73d3f921cb99c9c6a6332c01c3778029fe116ced GIT binary patch literal 456 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!j01c^T!FOH+D9azgavitKy3mg zL4Lsu`vu-N+*fc2Sl@p>!C-#D+%x4)B*;3hUvfpDZVk%>H#r%%339bFlF=L*2;Y1G4eqh)# Nc)I$ztaD0e0sv+H%+3G+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/stop_button.png b/public/images/emoji/emoji_one/stop_button.png new file mode 100644 index 0000000000000000000000000000000000000000..66a89743235734c8213c8110b219f56929d412bd GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-u0Yz(*&Tw;$F?;9`OGCj ze!&dy3yP;k9RzYsJY5_^Dj1U$cxJr%uiUtwm*>v^zyr)|Wg(5+JbzX&$+JZygn%G} j^6aFPlrwAm1Q-~$nb(={?fed8F)(<#`njxgN@xNAKTjy^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/stopwatch.png b/public/images/emoji/emoji_one/stopwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..4d755287446705e9ae28fd91b6cd7a1de41ebc2d GIT binary patch literal 1255 zcmVM*Sfytc7mUwqr=3;wnAt)2P*Z}4?*a7j@31SQCf34xGo(&KnaWHO(SQ<@ejBZ&eDr|U|}i70?f z(70{`#3=DQjv>+$KEx~ySaZM<1kR7J28dDm64!wAB@*&}4(u68`Xj9Y%s>d$ZQr*w zft>PmDrKf1;F;Po;DX^qmaP|TD{^j+SlaYn`19H7e4Z2P2SVrUtGVgD^v{LB)GsiD zv;V4aRtf-jEWIqW90h_X8rI!?t7(Y4yN$cMtlR(p!gc{UOn9VOx#O9xcdDAQc)vHz zLZ+n16wIb4aW@uwF_8-hcrQOUjQg&2!KN$N1y|#~VLb1-1O%@4n9J=~j)%Phv_{S#K;%R+_c zuKk`(>4EfU%nOgrMY8u?h39M!7%zpX z6G-L6CMDF-n;`JebzrGw)n*IitZc<~;UVOJQZ10m-+revTOglbRas31b=U}rz#d9O zAX|1w4EH&L(Vq#da14*IoJ~6XGl31-!E(OAS5W;kfjPc}8`zODB!P=o_FMpzQO8lB zL}+g*P=QLb1j-G@PoIt0xnvJ(}}CBkC_$}KJc{bST6 zlH~fz9Ze^aiHY>cPi5e=X3b+N>xu~!I#wQvNmtIuXX_`Fv#y~aUs_+Gq3Bu~vh=M2 zElt-{k<;%-&{VZ;9r=N6{SOAq)rihi61Bqz3yikLWVAKhpPh!IfTJy9xcUMXyE6WT z!&N)peSv3q59)mQmIJhB#LSV`Ap2BgO zmn^ggjKG@5R1Zf(Z_UH_fv80@7Ky*=?o3wQ9e>r0M!#%F6TR+7qkY2x{02@XRC^Eb R!T|sP002ovPDHLkV1mMcbL0R3 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/synagogue.png b/public/images/emoji/emoji_one/synagogue.png new file mode 100644 index 0000000000000000000000000000000000000000..5b092e017438207910d5c8827f6c00c55313c13e GIT binary patch literal 1032 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 N002ovPDHLkV1iK#gh>DZ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/ten.png b/public/images/emoji/emoji_one/ten.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9109e26a91ac783fd76986b6e3b69853968436 GIT binary patch literal 557 zcmV+|0@D47P)=1^7Hh-#K*0&w#LfL_V)I=zQN7V()s!M29r;200005bW%=J0MCyg5RM;^ng9R+ zgGod|RCr$1*GX=}FboCI$PP7m%sk!yo^7R|--Hptq+2xoyDa!X1-49X-X?Wrc7m9y z=0LR*r;StcjA zWZ;4`6oK;-K*^Ya5nKVVLjVvn5HjF05Q{)O5&*KW(4s8>F%SVr%B~oH7vj%On5}vey|v`9cu@)Jd*10Odw=3wOn@u<`t|FxXU{%<{P-3Kd}6-7di~+U2cX6mFJ654^5xB&H?Lp6 z{`~p#fkTHsZQCdiCo4`}dE1W6G-Q-se<4JaGK;fulk?k)F)%Qzd%8G=R4~q+`gGB4 z3jsIvGiRpn+i zO)~n)B<49$%Z}rmRsYq?d8|zOD<`%**kZHzZmWW`mq^9lgUk)eL5hpt@6Wl!JVDL+ z$K57_iQEp$ZI-hhI9JrKc0!0di@PZ~x+x$;_zkNJx6&-XIWpX7tQBX}>~uJ^Hmk7} zy<2m9a_R52EQzxiA5=Ip9B>!;l+lyES?Qqk4YdbaGhd`R+f3pRm>ehkA-5y*%)NK3 zH)uULEzptWlec|Akl9W%R*`EG=8=<`0?bx2c?bz_6#G&9j%E4DRR>(RM7Yc_n{e7~ zrpuQ{`Oed9xAfwj2_flv*=8)&Qo_%-{|t3Z{LVIm!SFQGyp-~eZI7-=@auBe ztup3yE)ej2BQj&ZM$OMZ$FGNnZ{Ow6->m#E(9B`B=b7^jAHUjPoaxaxoi!?_TX9R( z$r^{Zo6gN(vRiicNcg&)<*pBs8jtF7xZ6w=;B- z45|(Enpq8RW_a`cShSwKz+CL8kIK66bHaiO6P*2@cfA9a-?;oz65T4G= z=su~~vB)z(B{inv-}C#cI~5h&nJyk#C=gR3%V{)6V~%=ekor~)he;tf*`sXFeRbQq z=-yEufwkWrq^Rwf9Ty%DpufO;h4dUB`KjF;i>eEiSe3%g2PlblIecAammcLDP{?sX zPM^cg*C8|@PAKFm>t25DrrGWer988nSr59pmr7i=$orsKupxXxkbm<^OLpF`E+^On zch0-_@w0UQoY$*z*O;81zWCzVEiueZmFk@>VQZsu%g!|lY%FOSPo7J c{r`{s{DLDNGyeE*2j(sYPgg&ebxsLQ04SYz2><{9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/thermometer_face.png b/public/images/emoji/emoji_one/thermometer_face.png new file mode 100644 index 0000000000000000000000000000000000000000..0047a14560187f49c84c83ee16ca02b3baad9aa3 GIT binary patch literal 1284 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/thunder_cloud_rain.png b/public/images/emoji/emoji_one/thunder_cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..ba43488b8ee8abbc2e2faece4e0f3bca48aa3e6d GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!4hQ&zxB}__=M0_JK0-#@4qgNz zh&Y@9Q~(r#NWm2#tAVrOMgc|8v_MRQkPumjE{GPO_}dR({{R2K|K#;2FW&w7{pa?B z7Z-1U?EU!p+wP-R?mu~b;^N(Fcb*rK&>MOsL4Lsu4*MG% z1QHV7pD(zdU@-r^0FXQX{`>U`0s-^yE1Wmz4=Ct2IKN&YprK%Y|9bUPQ$iUSm?nC< zIEGX(p1InZm#Zki8n9@>mA)&|E6w+PeEsQv{MQ|3oM#Vip#HV3!nWdNN_j9g^gT) zIM}^ioer@G`0o70eZt2z<*djK2ZNbAf95b%h|XkmU;2w<%gy(*>!v3#nCL7Q>^SwS zLOhJ&SJ3mvi{i9}rZC;hczhyf<%t^%0{l8}1sg&pUQKkmmigw+#wB7Gl0|2~UtMh+ zRtUTpi*4Vdk)kC4@4a^0r&M17;F?A2+ zYhtibtDP^J*5X2$+Ki;t6<^NL8ezV z|8lQsTW28oC}MJq#0M!eiTjBWJx^m8vV(Md5Y{ff-jw^MU zdLDf!fB8c~#?2cQ4J(=I1hQh~_-Y>>>qz!BD);5Sx9nB|-)8}l%SpaDVqvMLd7l-` lJ6pJWQ|EFY`w#Men3T8bbbpe%lK@QC44$rjF6*2UngF@y@azBp literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/tickets.png b/public/images/emoji/emoji_one/tickets.png new file mode 100644 index 0000000000000000000000000000000000000000..61866239d80e4f9a61a10d7bd1f0be2780e744f1 GIT binary patch literal 1694 zcmV;P24VS$P)-?Wm|W_z zWBb2n|5a6qW=#9IX8v|to_A4@Y);9TTeOE($CzBuo?ZTZT>Y0|*P~yTaZmWYX03u$ z+oxduX;}QSW&ML)k8Dr$xn-t&Q~i-&yNy`FlUn?qVaa1t->G2#Vpsg7WB*)M{%~5# znq8rKQ|7K>@wjE}v}DnrUb2W+`|*vt;M5W5{<_+mBqbhgadOV(VH|$B|pfW>nLlUhc1B z(4Jo2reO5CW~zZz;*nj)m0QS%S*LzfmU2xJtP|2BG$#7MR zXidn3S(ufKqgIGW2z?P$ccZzzF4;-!eKj!!ZBDy;YdUW(QI6lMuqj(y!O z2r|slSTMZ8J}!9B2LKc2z(a$Z8jRj+U(dF0hOq)(EHrRzS)M|i+ehrT?Q1HUhIQ~# za=t)f)$m_B_RVw?E1=^Rc#wLIwb9k~QL{<7{r~GY>nlZn`AqE!`|PgI)+afv>sYJl z6Yz40E|)0?Z87_L%;+q}b&NFy^Kg!3AMnz@4S(CQucl+AiET^`1gyWx0B0}0u++W= zu}=c6*1|OXoT8dADYz2Ec9TPzq-R;ASYz8icJ8>siuncJLCDziBa?% z5N4;duQgSrEzq54YC+9qv7$72e^K(qlg@jm0NZX2=&;Kyo{CVF2`NKM#YB&ZvB~?3 z#?OrpJ5P*#2&VXY1L*U0!$g=_sH>z1n4mYitiLGJkzu^jdG*~QxH-h_17r}?auWaz zE2^sDx}M|XNjVxBgfBWz!6wc-F1FK!=YJ_QRk+y%|%V93)H%vxF2UzEqs49Zy^ zpv_$0r4o22%HV^KC*{$%*9Qin2sQ&pa?qV6YIOyCw1s`I?HyP5Nc=t@%L=%=DFKxJ zol<1zcv9ZD9vkFu^oXa1di=H)>&#yYVc%PCpWjpuF2<)*;PmKyy|s8BSX3}W8oC)h ze*c5&@%ckzp7&l7mUqLm8$srhz2gZVeSC9#aX{@8l-V7z&6gT4#n64)l*-J$Pd^VMf|MaCqF(0CYb6AW{AAc1SAWJDRrPW;F718TLf*?tk-bv?ogCe?D2p2@sp@5$# zU3-6Y{$%+dfnPW$w!8ez8v~fn|3U*ed`|59+b5h8Or}=+O3CM;WH;jUY)XX7ON565 z|4!UHCv9tRzi>YhXHHO~U$Ijk-YeWsm_PLhz4e4IZRfT;TwnO|cJ>Qjn`k(dO2>S{ oH)qEud~t<807*qoM6N<$f}f&R*#H0l literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/timer.png b/public/images/emoji/emoji_one/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..584922da25d349bcf46f3ad46ee04ae29697d9db GIT binary patch literal 1743 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 IM6N<$f@8)$4gdfE literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/track_next.png b/public/images/emoji/emoji_one/track_next.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf5647f7f05a3939b034b621373f80c2d79343a GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKS0HWY?2Ze~(wha+%2^WR z7tAnU;Qaml0R`(le+6j(1-+whKPG?mPFtONBIiz;-1Uj=&#F%f&aQbQGxPF$Rrf7(3wl(ljjFbL7)dnx zgq^UwzDKAmX1CV~&yr@*6A3IpQ64viWl${+9edS_2YJ+n%(R@)7sW){sr fpBcZce`Lj`zO_9VzAtMt&}$5yu6{1-oD!M<;E8)( literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/track_previous.png b/public/images/emoji/emoji_one/track_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd22e0f70e4ec4e09fee0e1b4b153c908688981 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKS0HWY?2Ze~(wha+%2^WR z7tAnU;Qaml0R`(le+6j(1y6grIEGX(zP-9Vu+31QCDCS!LyLZs&=poq)jy>P^Yc9S z&pjH;({)es?VRhG@88cm{b2IZ&xgPLd#CzCFwXot`}Zbsn|u~?7Uo0;0|7Rc<_}&Q zL}Z*dh|F;=;QHnW5(3G*6m6Os4nnuJ55ArH;G0)Lwd#(&LU-ag^VYw)+$76Twk3fv zA@g9PO|j#y8SFPR&v9Q}I?sIdZCkk+ayvg>_;#aT-p_XL&&O+@+s7+ZrwjZ!EF``D pVAK-(^^fGI|D1l`@zejG3}?gC#IGEZC;@tl!PC{xWt~$(69AvPe{lc+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/trackball.png b/public/images/emoji/emoji_one/trackball.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d82442417ad973e9150d43cf9df87ce8bca4b1 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!js^IHxB}@57cSU2yQ3k9Ae@A& z0Wu%}s2;`y(Qxf>L7+%Ob1RTLWyb7~h?qy-(Lj;6J~1IKUaLJrN-Aomc?9_dhxbpO zmgVYGS=*SIS6JWN78#e=;O5`b(H)nZ?(E@{l9AKx9?;o4vDD4a(=X_tSNJy1(0Etx z>)w%djm@4e9%sBFlG8G$it{`K`b41wXd;8d`~3z90u2HV@9!Jz4^X(Tu>O4i`G$o4 z`RnHw1Qe`aWEZ5xz`$hf>Eakt!Fcvs>m(&Zk+zFl9=|hoX#ZFEy|nWG^jmkl6j>Yh zJ}y2L{3Lr)*hjlhl^=6f23e^j>iwM|+@5gA5}Io$?i-#`eMF`w}|)i`9}NK zEQ@}0Bxtqgl6fZo8~N&<8GdYW@;tl$UU29Fjpn6dIdXa&)0}1)o z)o-P@t2t`#*5AOG#J=yR{+;`*+dCF7%HFZ=@P?}LeZ9up76$Nn-}(8>$#cG(@%>}0 z*4la@hXd|BY54LhaJ%%^Y6aKBOBM1m8+ERh2-Pxj{$SkOARp_rXkHwPbpZR%Yqr1m zf}XQ&Qg|_s(Q%sOibkJx%%y1u*j~o6=gb%Vu;A|-xxbCiHZt*M><&)gTzinqA=3Hf z<(NzDn;IS&GZiw(S~eKcyrT*b|JI0#qa)zF4gi@Pjex^Tn`9ybSZ@E!H}|@4Pql$7iO` z{z3=5zdvA2Pdvu|f;&@xDr=urkfbqlU!3vZe<^=jymvD0`np8sfd{{j=7GJ^yyn8c z^Ug3tcRU(X_$pIiNURwT)oczM~`!bH7=8{}7A=F{uZc)5W|mq9va z;lc*dg2KtCxh`zYnD%79^x3RG+c(cV%_+d{=6aAfCE>|OrX?Booaz+#nt99}q;@>w z2y6Jia3%8}*Ay1(1(nZ?5AX*Zw3#oekSBCuQsF@ki3&cEcE0ocHB;(k?;No8P2ZLW POmYmKu6{1-oD!M_vu7w=7RY#C;C^^c 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 B;=TX? literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/upside_down.png b/public/images/emoji/emoji_one/upside_down.png new file mode 100644 index 0000000000000000000000000000000000000000..d097e4f97d52e2bbc644d908a71999d0e8055b55 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!q5^zET!HleyXi!tG(YwEE%t9t z#}|Zaf4!3Y=umV|k@@)z!7F>6D--l@?hM~N&HdPN|2^}(n=_4nZ2Z0xXgXg>kY6yv zdxQB60{71c6zuO;aL5+3NMT@LoZ#u=7*fG_cRK5|&kh_7(&fh<-Q4@%@U>a%iI({9 z)qc#W6)zs%KYG4N=G_y=XS*|(H?qrDIPMCy=1NxRJe<*8_u`;V+>TXoM>lxH=vK!c z&^mg^`V@=Vgek?p_OZ|YP}8?Bm+_^s&J;O|2U9ivaav4tVV}*U(WdPXSo4HmA?jwg z_5E0G4(r7M|9tmuc%eRJa@fD-vlqBs>>GT4h&l4>xH*1e6^k=@-mvF?s`7E|*y3^z zCGis+KH^W;nSN-?+}%B~v(G83bE;SoLz5%dTAh=N-C4geFKLpTvPE9-4(|;`69?x% zFYd19C@WsQlBaC)LxDBT%@YpieLBpV@FAIZg(D-Q*k!g?ZX6e{Y|vZAdnGF7!q;6h z%r10DpH(xQ=<$d#N8q`|RMB5Toq<~Ezim%+6isV-Q@`bgx>VQB_S+0=x@bS) literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/urn.png b/public/images/emoji/emoji_one/urn.png new file mode 100644 index 0000000000000000000000000000000000000000..9d934bad0cd958226b2606de198f44b7d2d49389 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CI|S0xB}_(zP=Fj|3(a)jmCgW z0U5~b4{O8kR|i1^FNOKNUlk5v1Ibr&!rm+hyIl|nWdA%Kb*~}_Xy)_Dp`W)#09C%4 z9r|rwV6j)*x8Z%v5doF?E`K~tPCC933V##vP}O6p%aWYb zT&?WrK$j_OEHU+F3?F$HnZ3_AGJ8R*#?8RCw@hV6{zoPp=woD&aC_6y#;D%7U&W3$ z`-%QTDV9l_>hH`o`)X+MV6$_rg4y!B8{^e3EEKnuw>2@1HZ-lVTM&5u|MTB>R?cVn z9~bvxqsMOzBe9bUc)3|wwsqW|&lRDh&Cdh0@_*@po9q=XHQWkvft&cb>XyC~KD(al zWSHA87S-rV1+I#`<8$t3z7up^GHZ70{f~EYW~PW5WtdN6IX3S=jL?i`_baj;2h#7z zN;Lc5lRa^8^$RYM2j=g&&Mb6(#-H-3{Vp$u{Le$;8VjP|a34|FkioCxpwxMbDNyLk zM2#OIQ+N&;Gu%{AVJ^6vRrVr!f>+ntAo=}U3f5lP=J7I=Y<7qGI z-hbytcJa2}%@?clYNR=tf~^X=nSEUuSN)H@erkdS!{(|Z)&ElB&!6IPS+`&YgcZCB`5ngS!A!PC{xWt~$( F69AdbN>%^> literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/volleyball.png b/public/images/emoji/emoji_one/volleyball.png new file mode 100644 index 0000000000000000000000000000000000000000..f93768a37889282ec11880136013186e15db892c GIT binary patch literal 1149 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!CIt9|xB}@H#DPr*47-l0hJv% zeQM8%6Bn*u2P!*t>C%;(H;-L74^)5n?Ahyg?mU=y<}T1p@+Coj!3^&W<_k33FHi_L zzrWw%euKk%frj(__wP5{zu({Re*cH4EshKf%(b2_jv*C{XT#e!z19-g{nB#p-g{dT zthSy1|NrjngtUVycZ|MfMa>ck%lP=|>GPxCwp1_RSlIC*vHaFQiQjqK7jm1}q~?^B z-#=aV-y&@ii<*{&+_(FO>nnq&7$z+fHEYkmG{0`O2h&6;nfd#??%Q8m!pPxwsxz$O zkC*K8-`t&?a*|~wlO(=Be|IjoL&oI)B?sx`35hXb%g$~)zg$q6o1y4tkA#@y>t%gR zpHEJiJD)*o!a=43I@MgydH-j(ow;hDwx01tMW99e&;Q(8nfThGP8fRM*?m|WTG z&}6pxzs!n8u8L}X?ist7cpj&2=J?3YEt9H!;P#3oCHFF76po$0s`T&4=j9*Tyd0dS z$b08ccAK%{fgbmpO%B3KI;D-fkIX#0Ct*6P*^&qc5ynd$CE91w7O>8~5k8x znY@o&l{CB}s$NZDS(Y87qqapTY2)W9x+}cOH!RKAVwzIH*wf`(;h{Z!Pyeb_2fu92 zVPDj)vO!Pw#~L%Cy$00|JT5u{0ymC2@Gv{edN2w`Ht_S?g;sJ-w309ph;(35wPQAP zQ{fO^w21AL(}o5ulhdXqys2|{1tlM+lm;bK%iA@9n{*~>~r_cU2K1gGv@d8AFj zqWO;`H&8V4wCLJ9t1O#&_=0i|sT-s+-JW=QOCW=>z7l)p^{VB9)3_3^T3Iu%tUQ@; z_x$o}yEzsL#rwQws`(YRgeUCmmc5_+4y*s$aL+hewd3~BCf@4sX%D3BdY|sy6q$I~ zJ?fj^RMmo|lI!@k9!&b#$A2|#S#tH+~!mVf>5p#02y?$EgwJ$n>OZJIA_coiY1 zh7P{s}2~bS=_Yz^QGW)Z(2(2lGz>?!%gF#m-oM&P+DKycY?nm z+x*@4xrXciRtx6u+G+Wn?QGXO*5^A*H`}i=nsT|JAlrQHt54Fcnj8gRWBOixuDs*F zbk}PeFUFRCJI>$u|F+ko@{4IKYu@^It-zqRPbK+J_~UGTzWP1?Y{|Y~|EBzqpW~J-dg>a-LSUX{@O1TaS?83{ F1OT>(Pc#4k literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/vulcan.png b/public/images/emoji/emoji_one/vulcan.png new file mode 100644 index 0000000000000000000000000000000000000000..21beed5b608e7aa97d63a7c78c0f3efc04e69e60 GIT binary patch literal 1062 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 T4)Y%d00000NkvXXu0mjfsG@9! literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/wheel_of_dharma.png b/public/images/emoji/emoji_one/wheel_of_dharma.png new file mode 100644 index 0000000000000000000000000000000000000000..d6569d3a5e18b10a9b8379865da4028d313566e9 GIT binary patch literal 1258 zcmV7^W%tWc`PzB;*K+vPZ2IV+_{N^_##EM^&F)rW z+q`h;!(QLXSoz+D`r(av%aWPPfce~j*VDnPrm@YogZR*2`P-@c>ZkhSllQ}C_|T-( zxp}zCZ}gsX_q>_x->i?B*7c~4=gCy|vXk+Dc=^_xtg_Ph&YjQ6x8>Zn$;ij?b#nXd zt?pD?rL5HTt%iZij`q1t@q1RN%6F)Lwz8?H$7qesV};>eYq+JK)L(tqWM-YCfx3ir zeZHlZtA&N2(ZYjogrm%`!gP(G%z~=I+FEtuzh{HQmwUvV^|DSPfqPg0000$qQchC< zAfJGb&oJ+=5Z}L0KydHB&+lNrvxIV9000A3NklxY0&bG*aBw z(G(R7QZI^AE$la)1z`Qr2y0VOBn(tASOwcwnE-QZYd-f0P|u`-ZB^J6{mY`s>BNf7 zMXuG#c?%NhWQq}Gqrn15uQWjLep}jYKXe`t8tG=B1lk}+VFnP4M_R9Y58EeU@){#( zCYce6Qxg=;L$w-9y7$q&i^*8E3Or3ER5Utb0tD#9fTfqI3T5H~2Pg&*!+}EZWueMg zu80YJSpsJwu@hgcEYz52GHx{G{e8J<#FJ5`CX{1Nlql8YmI%^B0OQEzYb5|>9k+IN z@YlKmP^$5cErv))Fa7^$;I2yF3alZW9ZAyKnj{^aNsU{<(kedMNCY?-^ZrZ#5_S)C z6+qPwx>x{y@A+|nhYU$3v6t~<3y4@L3x>av3i#W8?Lk-Rh1U66u-f6L;#$7`Jr z8}~(m)6bo?9;;>oj7vgz4@L5^t$rW({1oKwA4sf{FEeVL5_u`YM&qNWrdxrq^c54m<3$Y^i zgz^l&NgzCLAzrK`hM|tb|0?V(rzGsxb6kkUN06;JdMEeQ*?`s3_pffbd9fb+v428m# zHY(LRE>*8}9~PfBA6K7u2Mk9Xhb+fD08Kz$fNj8i6An@ymM+yk70#lwJcHRzX!j+4K{a0_Syu9h%d2b5O3Ooz}Im^GtZRfl*ci-Rt^*MsYGg>C`%IrT^d%H=8vvY#FUCHhx^E8yU zmT0`4U{y8cn+NY(wWVjxK3>k6P#%2B_vCK3(=S&ChS!z&?A-XLJ?~16^|iZqwjN<$ zsSuR)cGkMT8G$DElQmk7e=F{aI&yLvSK#W)Vk^s|1Vy(UX+2}}%BIIzCA-l0*yr4( zngw{VC&)r>iYroWG_Z>Qi`x!|_Lo(0wHx^@8a}zHE0M z+3yxu_b~8KNxCU(sr2(3<*reNzOAki>|E_1qZu^L39tD+<(87jDc2SHm-r30W|po0 z!DV=P3WGt#C$)bp>sH7K>pfUoVBhJds(d zvB2VWtVhp+tE@XZFSQpiTvELL-`-f{nAaMHrQ3B*bDy~BEuO2|c0kta=IZH!U#4;} z+tjB_y2zfA_teYx!HOw=PYGrRSOpl^pK@V0V&uPmoZ*0>KfA8ODI3SLJVr}9KmGj@ zpmDvUxF*R?D1eRA{AYk6|4OS<(hv0Ju^w=`|J3{Gta`3rmu37Ktnb8FMT%{6Un}1r zZxgS6Xn}vp!xN7`b0=+{$vekyeVgLXg75rGkN+-OoB0`-N*NeDUHx3vIVCg!04b=` ANdN!< literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/white_sun_rain_cloud.png b/public/images/emoji/emoji_one/white_sun_rain_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..0d8475bbd0fdeb55565aee1065bf1f131cd2dfb3 GIT binary patch literal 1136 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!o&@-WxB_XXwU02-|8s^wK_Cf1 z5cal%7l8<_7$^nd!qp%vgD8fZ0OUf{BQucM4^EU_IyU+FskD8E_Fp~TbK`g$(6oy; z9vwM*3!?GF#k()weEj(N+y0Z+cOSj->-V4A4_@4V^7`$EFaQ7lzjo*8x9>mCUb+9| z#k*_AyZ0a7yZg}bk7xY9opJ3FvO5Fxr%6eWUoeBi{ssYq_X!E-6$IuNymwIOpRW+` z{(is1`hfch2J`n9>^JB?UvR!bpkX~wq~Lr)|NZy5D|P2EFfg-wx;TbZFy6U#b=GPF z5!MH_ouPWCc3eAFtH9kJ(zo~jZyAoQON%=y-ZUv+{Fip7)XH6pgGG)t>s^)R z^DL`u+WPvI;;){snU~l0`hF7(-7K*=CL6+thOr?|gFpetY%m_%ljSG!KR$CaIKo>#P$=S=dtB0F#9 zmg6nQgV(eePOo6-^DI5sVw`+l#pu1gV}Wayu--`qo_nYCwtFAi*gHq~L(Bu0f*nU# zkLAykyX^5o?CZNJ`aZTlqBSpwC5QT7&noa!Ir@Nk#}eJ=yQS6NpE_8XS<8`f;Sgs- zgZDB$aThg3uE*>JK?tZV2npQ6bu z;mXB);4$w~hAC|q-o-L1=4Y_o$^F{Q&JcX>gvf!;D+oJDY zwx&o5IOvzHc+R}*_{GmWo2ugW%1Zc8=ezicDW!EqTtz!e!ps-SD}M8d_by=2kUEvR z@2FC>#X>Jz#Wz96qFf~&^42SATR7#gxX+jputK+W!WXFrI(AREzTC7)KeeCfWy@<* zoi%yhEt$+8o=R!G=zQ5FR;4H?^&&Mw>xskrMR9@o?;rTM7X<#WkZVooR51N_aFJk# uTR?i&t;ucLK6TSG(z$K literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/white_sun_small_cloud.png b/public/images/emoji/emoji_one/white_sun_small_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..403550e95019b2bc295d9ea00ddbe2b12eeb20d8 GIT binary patch literal 971 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 JF6*2UngCL}h`#^; literal 0 HcmV?d00001 diff --git a/public/images/emoji/emoji_one/zipper_mouth.png b/public/images/emoji/emoji_one/zipper_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddaf45491dd1bc086bf0a94ce6815bb00be0569 GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz^E4B6XFWw{=b`!A9eLj1S(jy zelvswGFsZZfMj`PO>h=GBze)2`|NpGF zt9QcGnR8!Vs+u%y=G;Zgmabg;|HIz@?>1M}*8hJoef`S5Max#TcJ|C!xTK|{Ys!q- z@2`|@T3%b<)Y{bA(K}(vv{`fKEm}5zLdBCaCI8>7`v0)1roQRxmrwsc9c#`HIJS4) zsRPq{CQLrGsS@bs#Vgj#pILWwYt8k;)%VY|Y+gQj>(*5>=PoR(s9rg{t)jYa(ehOn z_Se0>P&l!_xuw1P>apJayBAc})PK5?w`EoR{tabyjV+BW?X%`B%073s9~e?{B|(0{ z4DSu*-)|7;57_Tekf4xo-r)TE_wVNeL4bfkK!PXFU0((UrZi6%$B>G+v(r;2zcLVM z;}q2hNLc^cGx|#ux4qQ51xvuV<);d z^tN`zU3>Q&OtE1;Bf?tMo4!cxoNHtH5`{JL^JaeN3fjzlWr4$Ep$vf+K5hp}cJeXg zX0rC3mpQ#@&gSGLN|#nRO>9;^{k%hc*MTE5SFVA|FYvS)#$*n*BkM`N7}mIY4E2TbCY8T1Owkm+%D zJ>tYACYZ^?$isA5BIZ7mDD z=YtEm>ipCuFL@DsWFsG+x!JbIkJFYb*WEEOvH$agE9p_x{9XR#aa{6Zb05BsUY8&j z?OnJ1x5?xC-2X4P=`Hx*AHBFTCjQfI|GjtDyL>BN&+O3p;N<)Gz{1|DZ~yqOe>l3D zL1XEv2gaK^)7svN=}9cqKKK0V+sQLLOy-{B-Mu=RwbT2W+RwIcCtvAyX2-SH96tBr z@cpV~-D)f*Zv{)gyP2o1TeW^)ZN2lCY2WT|eH*AcnbAgRQGc$I#HG0Ji5ogO+TQT@ z-Ck_{WK+?1H`h-mgU^TF{r0`+d*X>dFIHV*Hn;nu{Qu4Bxb@FpUDp!g_m^0eq5t*E f+IOKv;Z6T9m$$|4UN2z>Oq&dzu6{1-oD!MdRG}uUz4zOJs!lc?Ggy>e*#ovxb7fC zWnqH_F7&K9U;@zlAtgb6!3^{N?>9(rXi(_C|6bsH!TR_6{{uk-5C;IULBRX}|L5Na zveqXE^sg`YA8_8_e!qi407$H1zk$H{`336}fT|t--+y1Qe*gT0|NZw3E|jgi&A`CS z@9E+gQo;E4X6wI49y|v=3dDH5?`PG1m;K`8uHEl{?>}w2I%B3&`kFT5J&sO);Apx(1i=-a7BK!7SgHB(6v+rrkPgg+EE> zZ7|xPyR6(d_UWhAMbEPZoY%6d7Crs+^whz~GcWE2hyGd@R?ZbOG4Ftw^#05yG2N)} zeCxSk+qqsZx}Be~K*;tDf7X`N&5FJEmlz4`sE~?1TGVGF<@6&~f=O)ihxUgJd}b~I z=VvNTK2kbW=B=TW|F!L*B2AM$A1-5hdzkmSfT_%#q#Y}7ENi~?^ihAH2TPrZXX|?F z=BhrMLg%N)H}QEH%jF+4da%pUtH@k?S6R_?kG+cAQZa%n&F?fl@Ll%g@D>wc-Gt9a zeGXSE+}WTYlqa$Mg#Et+mNYZfNx3t0I$ETs72mq}a)oJ+dR3m2?8b-_&pi%mOlZ4# zE$WPNaLY0;g307o3>XZrE!r~wKmNE9j6wlXO8Q}#MB{Jz2 zjQ$fv=A}5ei+tRD|6sIQPu7|Zr~5WPdtblh1&4e+yUTXrphU6s`hQ3B?l;O_U03dW z|2)4(^gx1-?8vH~DvhL|Y;lef0nS z?5(xodwYgG|219-*NCXefB3n0#rY4eTONEC-^|K$_=of=&l6Y9^y~Zq6+ND=elF{r G5}E*d1wS1C literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/airplane_departure.png b/public/images/emoji/google/airplane_departure.png new file mode 100644 index 0000000000000000000000000000000000000000..30dd2054cac7dae1212e883085104a82752cb2c5 GIT binary patch literal 1275 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fsr-9C&U%VWjOd83+mX(kh_?n zYZpSQcP~h!csYpN^O&J|3y1;KyY@Om#Tteg$Dk?~onx4E5X!FGz_95yh`s$DNHJEl z{|UpE^9-9$15xDi%?V4_1CjW~qYws=WSDyjM9w${7XfjXU4)vp;u4erw6tM4(}YzZ z*#&19`u8*RtYTTG1H}X0zjxUG-=IODph2O3zQX^2{`>v^@6QKn zeLp{;VEz923IF@=8?==Cf6BnX?C0s?7*fIb_Quzy)fOTL9tKUT z-+%qye=@@D2G0|w)-=`oH|Fo(QXpitK%;AsM%O3%Ngm5Cy)4n1$)Gt&vSx~(*NOCt zip%#lrJfS+dJ&?e75?PuYSUf8{s)3oq<)m26}y|AylryJj?$kt-#T7yzAcz!>hYL6 z_1b&I%dJ0nBJbrgE;h82&`W){!#g1F@nps$O7{E z_im%O_Or+Htta}J|Jy0-`5eS_`ctf4_gnR>Z15b1f?sD0N@@@8Ob)8#$jK8*&MHk_ z7QOIUU#5xz%WRAFriU*)XMEOI`T3h{i&I|F*#$qp%ZG)9Df0BjY4{q>cysI2+)|Fi zkHP}pv7cSuzTr@ggT}6BC$_Ja@JVM7sAIe%6ty>NhjhL19n}ZZF1%Ve{bkrX*AQ*f ziz_2eFmK+wuP9s8!uayM#&~PrFPBzdTzpGHK2^Q4V$<&J`|BBOCU?~6Db94`zgjj^ z<`lp736)y^8MfTj_X;bQ#kd~%!tiH?aB{fL!$#$EpSNwe$U0x^%K?)$51z}O{(R=J z%Zl7{HdcH;7HmKINv4?3QD*j+Hy+}(`yS8Pl5xo?0-f?2g zmfCHKR#R7LOzYloUgAs6l_T<&og2>QcRbbovoWruw$AxY_(k^VhC3Qq&%OxD{blj| zO~CgJuKF?S)*Nbj)h|9j*SJYLPGd|7!VIF_N;V*lDZKV=s=_;AK9;f}pN`EkbYSKIdQum(knnCpEKJgv9*1nAkpv@1BnFxqpUt z4ILinoU^;lYx+_H9eJsS}(h ze@^9lzv_3#$#<@+em^+v&h?%9wnSerahTNQnQ~oQ%*88E#1)GE{dv9EWWF79%`c^^ v;XjmS{$Z_|eEUD!{r#SA>%(_9EYdL75}a{<#e&^|pi<1!)z4*}Q$iB}akX@? literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/airplane_small.png b/public/images/emoji/google/airplane_small.png new file mode 100644 index 0000000000000000000000000000000000000000..4f97922d5dd4e8e59ef6488b5af94583b71d6c52 GIT binary patch literal 1742 zcmZWqeKgZ+9RJOb)eZM5-6T`V?L}!xw7f^?F4njz%1e?MLSB~lk>;f=xs`5fDlZY4 zN`_5SGm0^xaAlK~9o05Fj4}D$pQF?1oco;5^Lf6X@ALUS=X;(%o+lgY=Dc#b-f{o{ zR=T=4;-EEcacaOJo*K!Y1pwGtEXLCbl0aDL4+Q3ggKPl8j|{2M`@4+3!=;&+WDvhS zUo`w|TQdC2Q2CMsl5?RTx*&*Iffm;TorA*=pv+S6e{Sv>#8+|vVhxa0`0JyGs~{#mctqoLK*5D4ukJElEav0Oen~0ZoAEagTLEM|hS)H_KCFrZHS_Kr zNAxCt;k6amsx{N$GulH9FQSY$8UloZhs92}?qFTA2!2;0hM%r)eS`uMujr>`Ld`E> zjtQ{K*SkYkO^Cs{c>q{4OUk1e8Ww>ds0~d}x{J4qryW^DBijl5(?BegGPFyJq)9>6 zE;4V?0on;5N&~h17X>tUQVW&407o23lPE*T0X$-3kz4w*qnw_@3E0$zol{i~gz$>Dxwh73 zjQ*_utTJq#jQ%K!kNcpI=S6Jv(Hc?6eP@Nz$yVN!&LFqMBIQiltGya|8-nM<**$GE zVxVL2N2INpI_8vTFj_Cvd;!&D+(!Gg&F`Dg!UlzMBmAmwYj&J7Q8B)@omrSrm$fC2 z^{`F)sj}Z>=uoEv`ue?I9f^WbFQYeAcqQCGM_-66Suw>?wOH6@z>@La$AosmggXKf z^xOQN&GAf`cMb5mRG-?a(in78E%QlZU0qjLSVXwle#W`%@?H(pT+`YdUE$>>oUuy&YsQcBbLUL*7Dx#)$LTP2)ShZPY%OUm4rrgqD{H1WcK=CJic~I$x{DY1su`$PX8X%MOEYzfDLlh2ggS7L# z;#76!CxT@SKDj1f){U_RYp%!%cFVrY+G4ucfp{ZGM0}%2VrpFV+Q{!>Bytd{fh@ST zlC&|cd1^Shwc#U0b2Qe2dOccLU@Qwz8I=m7n3KcD?qbed7%U@x9BW=}o`r-{@vDTh z2-W!7Da{k!e{6+Oa|4-*&;r}#1)74SKM#E#bskZs<5zEUZBrb;U1}u*l}EQ?oCV45 z?KvtUQvV*NewmpJ2~QQ_ zM8u>qqFt5GXl5I{*%!!JJ+)rX$P(V|`e%o>N$+lxM3gi|z}}};R{0>`v#c;>EGb8i zSiF0@nL_`ZuG75@)0S%(6;)yOXcO?%t0BgPGM-*niO;xr4|d{mf``>s8P1~+u5KF@ zoxpH)v3S7WW9pM6@Hvl6y&dx+9FF)>-HDfRCf(^TrvEg*4=7s?C_n+OpZ`Yrv z&>NKIq@guK@wRpj>n7?_b7a-?@1yTwYi{1`kpi3DG9`!O3Thg^H2Hj0O@A?+DK*fG zql4WlF!RiDs_hIyv%pg0+CRETeXBj4UF^bhO38s(ExF*GyBivGHmXJ?XJlkpmxbuf z&&=D1@$0TmZ`Y|KOMTz2JtCNv@4fo@3uf+_wC?2S%+~>%uhbUgU`;Zvk(8jAem!mw z+IMj}V5Y>t=Ipii*38730>;|kuNVFhK!pwx^!%%##mfyc0 z_BXUhR_YjyONhB%uZP)el9(-VZGwt_Yb0H^6xg^9AFxhRo{rU8c}jUYPAhhlR)u4b uF0-poDJ7+?o7j}om)5-kFMWSi=GB_)>c3o*5p5SgCRZmn$7%=v^#1^K?U}g% literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/alembic.png b/public/images/emoji/google/alembic.png new file mode 100644 index 0000000000000000000000000000000000000000..553d1ceefcbe10d9c2a59cc8d6def9bce7414e26 GIT binary patch literal 2101 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 J);T3K0RUS|CSU*n literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/anger_right.png b/public/images/emoji/google/anger_right.png new file mode 100644 index 0000000000000000000000000000000000000000..fed984143e302bbbdf5ad78a44c1aef116da27de GIT binary patch literal 1670 zcmV;126_33P)C0001EP)t-s0000h zD=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RB2D=RD6+1Y-6 zev6BX|NsB9v$HulIr8%I%*@QCrKRTP=2cZyadB~DV`G?@n7_ZjM@L8giNyN=000qm zQchC}Jz-_)>f;~ z%A+V?U*Lc=A(XJ|r0n4klILSsgs4f@v=X?8b8#sT*r`EEIVvm!fj>quBSggMuWO}1 z@JP@Kgs1$!X~w4|_6ipeQkoY1fpPO_%eGboAw$)gcW$w zY=DmNmQxc{1yHm+sLxAz?Pb;iffa~`nLb}Ou;YSN;pJxw>;yBzN>g$-wF<5_Nu8tY z&flpcIC)J2&46BTt+Zjq5b*m%4~PC+*Z|Zr;_n6Q3;0@S2$&kGQJ3dq6QFqy`;!6A zzEU2Y9S!|aYHE@c7R!Q-Lz-ag&)*DfXZ-7>m$I)U*q#^Tx;E0* zq>jh0*lTApLRxi1d-}4#$7AQLt(PQ9{*d9>zSeUZJJ?kWS#-oZZFHq#Ca@#k=uM_# ztB!c5)-nTC8igf%$U7;UiLfr=Ox~!sm>&g!0^??sATj)4Pxeq0BJcMfdJ+K+Bl zW2np%hG+m7M&stFmWP=z-PRG^{Q<;v%8W`t_m2my#l^XJ05!lCZ?7XVEBVer#cx;^ z49{g*x=E9Rh*1u14e%sj?gyHK*tQE!_e_4!zR8rFFv9xgs9%<49V9iZ8^CKMt$nh6 zOT}dME|S1>cQ(!XOfvK2nau6FXP@f8Pp-nG1s3*M@I#cavm4jTrG9MN| zPvdpyJmS=+v$Z4#_G8dn0XmHj;|xSQoJt@_LJk_S5XC<7?sh}iRrYR2=*5O z1kdOJ7vh>04$CsE?8l&9!J!n|y+bX?6CS3WH?r@7!wU{PKaW%BkuVDHUrpnk{TMVV z-Nz^@pixmGq`9$GpD&KjWggMR0@fsP%5+^ZYjg}EZ`dXuClck+CGS?AcEqcu%uo=P zMaJ$#$DnDZA7Sy~fn(59x%(KA#a3jXV~-bjLim0wI>!1D!ESB=<;))(gXkdVO$bE9 zyb^$Ll<_JBLBHD4`!=^e(1TtZxaY6TeURIY}O|pD0OF_ILW{zp-Og2SYW$ QyZ`_I07*qoM6N<$f{v5?@c;k- literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/atom.png b/public/images/emoji/google/atom.png new file mode 100644 index 0000000000000000000000000000000000000000..7b2e8e2de86e973e203a830902b7e3d6747886e5 GIT binary patch literal 1149 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 MM+WVNJ?r?t0ZohJAOHXW literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/beach.png b/public/images/emoji/google/beach.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb4009a4acf683fe30355343f538d7553615182 GIT binary patch literal 2496 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 SdTURE1Uy~+T-G@yGywpf9-1Ej literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/bellhop.png b/public/images/emoji/google/bellhop.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b876ebd90e4621fc2b494010d26cf1cf218ef3 GIT binary patch literal 1676 zcmai!dpOg39LIk&bIGz$$t9Acgq5ezb;v2V8SS7U(~7xetg=eXtr$f_?prw(B`c~a zvC(mFGItob!3!-}mSHdVjy)e?EVF)3KPn2sK?b000oq z`}TN2owl%47C}BKx;O&>3hr1poD+oLCC&fQ69D|7pErLdzvll6f8xu{;6MQ=YXPAe zeE_}>1t(vF)4kvuUr;^{zWNR9O$XZm@VPE1z5#wd*^)zr#LJKRvH9t8_6qQk;tzb9 z7d?H?SX{Lm!p>r1&mS1D0eD*$0AUsN@Wfq<+Jw-8Al%0*-UAhT`2}GN5IpBa6LMZbvhVIptq2h1p7WrJ<1IAYtA}RdF)Vr;Qq&HWGJtR z4~6_c)LSeWg$5dR%nP$0Adrz9kb#y8Q7j`gjgK|LGNho8mPKG?p~xIQa$y?37Lve` zGSD zyqS(qLTM|BGLY*WO;)f8#bckQ6WAEdJkR#wLAg+9cfg0)6?Pwg+xym3$N>Yr#yrP; zY-M4E$3gYRD7}ar@e+H-5LlN#pHH>ypGre!+F#shY?2a_o7P)qTf|LV-(8qg6b&9% ze%?pin5MBIGflv@Pu;mDD#DC@2M61(uyh;qkZr|hj-9s*ZPbh|aX~r|JLiN$Grmn$ z^~rHMDJhd}0ymv(1J`RbCtKysmglSz*SMMFo}jgDN4;qJIvcdf`_6KV>-ky7 z%sw%1VVR7CqyS^zR|p5OVo*GMs=cf*BDr$XT7QTkph+gr8Fe$QcBVo4l7p zhz*#?gWKs%Y9}BfMeZ{5I8n>N&cbO$(P=qb5Bxw8vO9vtFQ2YGM0I% zmDVg)|3!dVQBiyBTh*;O8-21v#Dg~`U~5gjXuG+bq34kL zA?b&F{tR=?dF%(%u67RrjjBZd2s_WDBfRL}OA+7a6a13rW=A_V5haH+ZuV*)b}}m| zyBj-H5wR#|ust%XPbnD&&@D?KtL)RaLvVk3Gjn5VdQucWq04M%e8l+1Y_Yj_sAo6ni%&uG;- z?q4o|weSp1vz>_kg<4#Rhe-WJ;qwxpEOdv$dFy@IL}|4^Uu_B%2)N_z4KygRBA7eg zv2=^tw4`OgqDcE`9KA=C7;8g%4Ihb+QS1%=`lKYwJ-NGqHa)bsic?S1Fg!_(yPj&P zu160tQfJ}D?D_>n?}8w3_05=Y6}g`%Ufgk<+c}YOW`0T)d2~7)7(qtxiogkUptH+4BT-(0^#x-Q2xWw^4u>eA-1ShCxFQ&*rEM~TvVfk?%Y%KcnfQ%GoExc!fkAI6!JdI^W%( zInp)tNFzPD{OXqW%<*b?31t<7>E@ww#RtQ1vqGc{>m~CEuoeDX&bWScx;nU~31Qh| z2wTD)=gHW*nq!nM^@O$0Z!@L%<$H2-vOsD z!h{(dC00021P)t-s|NsB{ z!W#R+8vDW;`@$Og!W#R+8vDW;`@$Og!W#R+8vDW;`@$Og!W#R+8t=Iqm3bsDFE6i) zBFUZ~NkJ@CODp2A9dBJI`@$N0W+!4)Dv59=yp$n4I4;$v9^tSZ$ekaqiz1bHCDo=L zVN)tdK`eV_Csj%-h;JsMf+OOv9O||l^t~IQfg||98g5-EyObgBxf}Yy8hB$UJ2)=o zvK-&89reB&+p8V)_wQ8z000?uQchCgg}afrr}sEnC44t!RH+$NE*C%|Bwi=JVqV)&7+(_y($fO%XoE{u2zJ!So-= z9jRvC-X;$O@h6uzw=|puBgeVi(EDz`|0jFvhScnf1{U}CXM)kNnq7$%dj;V-Za(Lc z2qA%YaWh`eAOBdQq#5!;2t|%8l_s_M5{%?C0qPT04T&n0RSai9>?neEB`6ECsoV+dNxsic?KX6 zBMEdSn5*(NPc1eBd=6*`crqR=MhYwt#7w|g&Mpq90SFE}rhLZWgm5-@|C4|}5sw&> zd3&UT30K358IOsqiA}2H(`){GFu%7^|gmTVH;E-ew0mKBnARbNMZgv*H z+xP013z_mDaxs%*%7wDHBmv;h11FlB_3hnnZr3-W5g1~2L;^qs=r#WS?g2d>?(S9P zCIV;(PN!y6SE8G{M+|tpyXozT46Zrt3Ai!|2;J}-5H_8J%p~B7)Br93N%wq|teXKM zfYySE{!gXv?{Y92eSJ02N7AbR$3us}1w8Zm;qEsNuk{lb0Boh}Kv|H}pyOq$xypdY zr?vcL{q%^xZ!M(?h{c9ymJN<7Ev`3u$NFLElmiS~s58S1C|8>ngj`#4lmpWYXx}IH zYnL*`soDr|8kiL%0Ji|y7Kqs9z>r+7R7GK$KmB+6`reVR*y9I)*oAOt?8UhN#nQ!w zS8=kv$sU<3kTyPpCR8g?6m14g=9|=Hg2lN1mN~2Y%ckfCZ#=swUyeI*F(y!Mo@7b%2Fz6&0|Ej2~>{ulD_c%EP_K$Ex=e?5$uZpa@Wex~_8!@qDqMgkn;F z+H%%DEu?M3bG8!<$!KZI91+leMt&;fs)-1Uo+v5vY5{8FQ8`hpLtUo& zH7RREq7JEgQTK0R>Vq2*;G=uK8vrPaor10eYMc+f-=-CSo9IiP9}$qn+Zxys-oD(W zB2g}?m+{}#*dhb!LH?*x-0V!Ec)*tT^2~>qCvK&q^-ldu-eb!{{6tA@*B5Frsz__? z30po6cEEMxL|ju3tp5>Po=DrfqN`ybZ!@3phtIwHUaFcS$ ze(My}!~*xH-&G}09{hoh zwU{{JO)8!VNVNd{SDpd9Np&E01ttMxeBLTOo2Q_d5MUqwOt)&S3Un4|0epNq17r>e z_m5q!=1jojy_h-R?Rv`RO&hO-$#aq0d=@ho`oO}V40hkv87Z4?P^8>(-?P;K%p#Yr(Sr(7GnJ^J;+R#GV1l`7Z2{izo9wVqpdht3g|@ow*9k^`WZ<<7)+| zoZW#M%f2AZr#q#2YTgIXPq_$1#g494IeJvZLrO>oddr8+zO1{kYu^e4hdb)E}I9knWEo7t+R=59vq(=p>+C x0_-N_etz)C$)_K^`q?js&wl#t$L|gKe+G&g1vg3d5Oe?l002ovPDHLkV1hFP!8-r| literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/bow_and_arrow.png b/public/images/emoji/google/bow_and_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..d49fc2cd5381c44c57b76c531c6f005bccac5549 GIT binary patch literal 2600 zcmV+@3fJ|CP)_I6^0jg2<{NvA-F?uhu{vu9a8r;xRbiKseAv_^A@8Otam$ns9++u_gc z-h9b^$vt~>&pY$f?eF_$b9T?3{DQ?|u~;k?i^XEGSS%v#_r5nfzy~3SK?3p_N+3a{ z`Ev<~K?r={2$r>GyCB@kz)w z$PLKHGCl=zqU6B0%yb8YAOo@oJ{xaN4m=CYkAXBG9kQ@XfLu{h;1C8NH!!~f?hxij zpc>#w%0RqM0Q`BHwK4BpUe#Q+9`;}K9y79AUI=u% z2Rubb^Gg8@5`fb#y-FT`R4R|%Z*O_Xwx14`xc?A?a>UxeANfePTIjY9=4U|8;7_18 z5rSf*AjBh>AGW>cM?3U^+3}#7tzOaNWKW$Erob6800DgfNQ%XL$l_35 zC^8r?*C{(x`fbHtBo-x@?N25E1Sg+|e)tXYpIL2s1M^}}?dxd+kgnL(HKX0aDbdU2 zf6kpXA6%{wS&w3`0-jj3V799XKrU8HeH&mG?eRP**ILb2cVbfYWcS}0GVJlE^O`^KC~Lbd>kj&CyUn1B*JWm`vKi9Y`*5jkChjH=hnvN|8Vao zG{)71Ez$>orEBAU_2UohZ~mH)mwx$K1~-i90#FM3MK+yt=2z}i!u+zU`RFIK%^J8i z1fb%6KL<*wZ;3dIl-TfCnRE!vJI) zfKg;Vonw5P$b1aVwJ89hn1BqYbK(JpQl$YYRRF?C_X7x~b2c%4=5Rx3U=d8`s4M2u zfXJ2rBw`|>n$9u&)?#T(0P+c$Ul2^^sM$klfX59X%3_ax6-YP$!xVd!`6t#$Yk|^+ z08~qCemr!sN3bLC79D_MHUtwb_FRHdv%nw#F*k&UE%q|XQEY?L!Gb&hz*(YVuWT_t zvE&0)^oK%I`)DN04aP6_$hL$5H-y^Fj|_@E$`BL-)d3uU4#l2l>6gi54|3`N#7kK0 z<>tknb+3U+n2Y|Skp#tFDlC`5ZouV^pt`V0QS8wl4g2l(d-(L~`HkX?Gyv94=MadfIh0cdKw3GSLmaR4kD6NB;c z*lT_u#TDh|%s=rO`HheaS!g0{PfyK4;eW z`j3gv9iXcbA`XBBSHtUKZ_m@^7{wk|gL+jEdz_{F`!ca&vh7Nk+TT||8uOYDYt2U; zP}c)kJ?5SgasVg~flm0bC%$}sCBAf?>`T2H_}-ellmAxz`~G7)G+!MYfLhkHf?re(m7YZu9X@*A{!;)9X_|vGbPZU%&6=^8yeH`$aJ>9@%UD zw~y04^^bh6FU5xvSsVNHi<^HBUKw)&;H_8yV!Dq+sNQ{YY5mSO;;o;VU+EuttunQ) z50v>_0QMdZsm3$k^j!awN7g5Jt;HTpSARXu1iBP}zOY{uQ^J{b=Hu*MZ~m7K(J%9B ze`zlO+n#>j0fb`&Ank4ZSI)pYeb2hE(-wQX9n@Urw>`Q3``+s$X zOZOCJAOfClK;(#XFVeMf>sJE)p4xO}GQu#g08}f3A`vSpn46Jp|JIF8mEm0{gx>JB zw=47IeP8f8Wqxhy++}{w$^cTak@zyGW6e(^r(Od)e(f9b3%l4?sfS{x!cIF7KP1+YA7TTLD?SJ|U(4_!OfdkWA5P}p`!2UpxRsZ%s{k}4N zZUK1aZ>oBgm|sJ9AOhLYftbMIkM&P~3S>(GSO8bFY5YLsAO^mL=7-Dt^t)Q~_c%+L zAB$FTAYgD#zwb8>K%xymd~Q)+DbtGs(Y^H>*dBmN(>;tti#QOSuYP61dNn@;k&#~D z&<7$1(#Al*VAsmR&)^DKWclR{b!;6E9Eb>bBR&0rU@c7`Dv)UcVfyrEV%p+BwA}hB zfg`3X4#WnPzbB?G4n+FZFOGlBn>G4pasrTmqHh3>+;bQD&%Dry199>>=gR{=@^1Zv zFKaadamvNHJa)gmB`5`Jr2`QP)=CD#2d-GOSS%Kc#bU8otp5QYpGNDzmgT?z0000< KMNUMnLSTXlU-3Ku literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/burrito.png b/public/images/emoji/google/burrito.png new file mode 100644 index 0000000000000000000000000000000000000000..844a16b1c323708ec5b49b5bf27bd556e69ce68f GIT binary patch literal 2777 zcma)7dpwkB8-B<6Oj63Kq%sZ-qJvs87@x#A4BEz`DQ#)Oj#KN9jImKUQ;g$CI$jnt{XBv1?0s~bpSPkj{nmf+T4NSqr_Zv( zdh&ze)X-!X`!#m*D13FCsol?1d+uQ7IpB?2jnwLWrVALsU?KN;!%0@G_xcUP&q;?tfG(KL zfd^en@=d{$z<%!aidWyKxZ8qcJP6VNMVFq&yJiJjfi#C2mJZyY38=!L5&|rLlj@ae(iB$-OI-PA`4!5=i&>;}<9SGbHy6%F(#HG3Wpj`os zrGr}rHLxLQqfoD7$JoC7#tzuAlIlL%6x$8E6la_975)`(1z=}BOLgGmO7itB$FNmm2ZfzbAVUH+BlELJIG>n>byI>_L(Tza(cWZ+l?F4%j~x8o}I#(s(DGCi5L&&Y0q2RkYMW=A@@$Q;9P~uM zqdyKM^`6nHth!yQ_QIgzkWrV!C*{lMl846pMv&Q)86lc2N=Xg(Z)Wdnk}fA7O&cZ$a!xUBE>+M+KpQFeo{g#*CHTKol7)Rx)LLRAz$X z$*)Vc9gu_iuJwl3)GjSf;spq5;$<30>!pj^1?2=3rE=1ZvGS1dd(+R(&SS#zx^riL z^RkT<77{g7bU9FnLmgqAyzIL6V3(GG=;e+TifaOT=2Va2J~>sDuSJiieMQ;VpFf>H zj1$-URqWEKS}yNWF8bt?3CRIx>+XZ$bFCu!!gQolUe4N@X2mII!Wp*%I5@d<{Alg| zr)9(oyU%*5M($sIElgH8|2k9Ysm=;fwoyW}LLwxGN`4z5C&WrZ?Pw4}6@3?>!dT{6 zokVkuC`>gm;*zE{ba0zXvL-i;YC~8$^alne+zKir91iEoX%zk|+$g>NTzJ^s$8Ii! zSs@c_dQOmx;{D&BDC~OeWa0e!ha;AR(^6l^ENfNyHc50j z%Q!!eS3BoeY`i)oJ>)Z*=cYCVZd_2c&ejVU@Nd4-j>+taPQGgmPpC>`;wKtrPx|dn zJF#z@BJUJKOsgRwad=JJrP5^J z$9sHlw%f>QZ-^T`Rlw6_6rN*-4UrisFD+!|jC02Z_N|DbbIwvK<&*_X)m1f(taRZO zbG>#NPl4_$ z3UqZFq{p_a9a1XZp27(qa_N)j=w7Qbx~-201*Xc@Ppz{3a@=z=nyHFj=xPQx?hcLL z(D%j@LF{vbO9?S^W9jQqT81B_vI32o+%`z%!tcFu-)(~{u~(V#6q5fb_t{-YsES%G zpF8OwYLLM-FmBE}aO~JIeH-{$SYy=Q7zp`6Bc{SIfSfFDlQqFSk4*8=hb~X#){5-0 zAw`BfjSI>ezA6b>I#c{?IBSNTL8$Hrv^r9v_@MTl?{82CZ%U({uSZL7@cASG5`+k}Y7cHvgKg&$)#Ew1-a$97k z6e7uNku@#!3qq+%5-j_IDh{=kOrvTQ&Ui}5Q_1wyv zVhmlZd(nTCWMf36SJFW2XgrO2eQtb1 zZREGG6A3Q&Z{QYP6S+lf*m?@S612jes#aqN!dwJwZX6)1L32^NG09gK?i(}8`$i@_T>R^=vHXsk5pUjPly$|z$`;eu%4W`VLK>0U;0h>X z_3lG8Gv;sDcXYXq>Zn%E}GPx9?lDW%sZ4)kQ#O z36=!;1v4njzyJSyfk1!4`u7e70s9+Hw|RszFfe`bba4!+U_5h$J%5dX087HD3)RQ3 z|Npq_m)q3;BnRRPsWtEcQT4yi9cF>EKWS} z+sUtNm-L@ONBd2~l-G}$&se9`Pjj8mx^C-#N8=R-o^%FrOidPGdUX*W*z zJ~*7U&3VejhOgHBSyGL6mS1!9Xx!1@@ckt7xtZu_@2U%XTBh=G7Bv*@ujxBj-5|E6;nx2L{~GfTIaLk_HiSI1Kr`Lb3-S;V)ka(c3b9v zpmafZZn??-S(@Ls-M%`Fb@}J@x9-U$WzVhO|8d1#=4@fBL{_`4*MXUX!PC{xWt~$( F699Sx)iD47 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/camera_with_flash.png b/public/images/emoji/google/camera_with_flash.png new file mode 100644 index 0000000000000000000000000000000000000000..6530f83f23e9604ed440bef570b4b05801a1c01a GIT binary patch literal 2657 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/candle.png b/public/images/emoji/google/candle.png new file mode 100644 index 0000000000000000000000000000000000000000..d39a7329717c1595b050d92f57819e131e634d02 GIT binary patch literal 1272 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 Js&?U~{{?a_!DRpd literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/chains.png b/public/images/emoji/google/chains.png new file mode 100644 index 0000000000000000000000000000000000000000..b351a69dd25e8d52e2aa32a49aa1c54c350684d7 GIT binary patch literal 1689 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 F{6A$hVhaEO literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/cheese.png b/public/images/emoji/google/cheese.png new file mode 100644 index 0000000000000000000000000000000000000000..b41475b401e53f5553a2c33314a817143b956bf6 GIT binary patch literal 1496 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/cityscape.png b/public/images/emoji/google/cityscape.png new file mode 100644 index 0000000000000000000000000000000000000000..e42dd1941e40b4266d7e67af727c2ba75452cebd GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&O$hJ_aRt%|OV<;RZoYi8;P~0S zH}3rZ|9{J+>t!2v_Ut|a)ZVytU+}W+3QJEgOxnXxy@DZUDG2qiQJb~~#AsT{P`AQ; z?mC9nRSX5oSSPPx=v>WEvW%f;b@u8l3EMAkx&4x%ej`KYwh1hg<^bI!UlQaO%-}G8 ze?kBM^8yMD0q@r*+y`0-0tR4m|N6{DruqyFOi7+Djv*C{Z*R8eF&XkSJiNfX`TITT zUBCb3hYJNru*H|C9sjic=(EWwKb=-DN%xv0lz;H(q*L{p3%t@rR_7R%2RJ?ab~&#~3~@wEDZ1_qS_}1LL`n4ncxq6`?ipC;VSs#JNYF1WoKnJ z^s+rz>cey`c=^4%j1@AT2aaD^Io15Y6+>2ond_I8$j`T9^j@Cm$PnYw@Onc9^A5gl zpybAChLWgV>!TS1?lII(-uW~45yPuxi)XVmRP{5k6u38hUHbIr#(h=~j+d|~_*>2A zxL_`OKSghmXzkGt`#G0~bVoBQXg&Cz@ba6l$%1{ncaJet?a*D&KVP(gA&%$6_vBBk z3fnf#y7ZCJg~y>@dY3GJ!;4$XlhhjO<#yCF$T=}`Jh;d3C)iL}U>1YO&idbKOb+oq zYx;JqJaKaM>>sNm7yNDPws5k7>oEKcUg~efgl3l~Ghl+dh8UCKuh+~+`kR*5L zH`^EAe`136j2hRqHRKQc@9$)I$9ds?nY2R-%Y*m)B7ayE7#KMm7?^&r+xdPsNHKW! R5123+JYD@<);T3K0RY6Yh#>#~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/classical_building.png b/public/images/emoji/google/classical_building.png new file mode 100644 index 0000000000000000000000000000000000000000..7c52f6c98876a1f880f37de81731ed4e2016f298 GIT binary patch literal 1003 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&oeA&>aRt(QE?p)btvq&e@u8y= zw(joQxP9k^i_4B2@7=s}+qnyK_a0iX|M2EB=Qf-=Gkxd2$=mnL+I?Wt>9ae|Uj(WI zqUA@91G%dXA6>Tp(Dt+E*Bm*v^~|}H_C6r0nl&FtPTRP(bn5I0Yd3bUSd%|tdREV* zg}e8*E?zNv+s=l0OCTyYo;9{9m^AxAm;Wle{&B|EI1TkO|ep5?UgXSa7>pg`9>we>R#bIjvh= zeDw0OPf3#nURhM_;b?5Vxt@>h`Q>LKQ&_&*JhL!hY}?LIv%S+1$d&w;|ESmP zfw3mzig)YW@2W_j6_{_x7GVC2QTeN}GjBtopo6}sgKe^0gTC29wl7PJg|!-X%?x6$ zy5xUnV_-voz40Xmfiec;B!+!AW=I)KI(KFz!i+5WTIrv z@Qux2F&oFrGdk=F*BArLxiuMln3mm`!LTB|s*GW;O@oT@g5}~2tPBgpFI?v6&}7V# zVod1k^*o@RX?%$-;QS2so-IK2J)4-Tjxz2wJ&^6&5Epkq`f-CIXM$R$3A5NGw+x0W zH}3DBvhS$7(8fs??vvO2UHU~fIdDVnex`3h_t-vU{;zz;@czAhOvIVvzx`MLp1<>J zP2|1*r#Lt9>?m(Y=l@aWDe$LF;98?f>U(_!rbR#M8P71v9AK1raFcmfkH*ybkM;EQ b>=~ZikS)KM5PA)m${9Re{an^LB{Ts59C-a} literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/clock.png b/public/images/emoji/google/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..a01e801f2c925272ba8400ba55810fdf57255785 GIT binary patch literal 1225 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 P00000NkvXXu0mjfBDKDW literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/cloud_snow.png b/public/images/emoji/google/cloud_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..06159ea0e7844081d80f29aa18ea2f98a5125730 GIT binary patch literal 1738 zcmV;*1~vJKP)C0001EP)t-s00000 z!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1$?O2p z?*PT?DAnx5_I%;=XWjE8z5f~j000qm zQchCH!Uy`000IBNklVKEJ?2oF?(ZZth+u8xcE@!_W}qQ}fWc>jArn;H%&X8Wve zHs03VFmz+}aDA!6%ya(=GmCx3#iFQbA*KR<6cgRo;!2$5pIiV~w1O@TT{qApjh^>I zj9E?ZYH=&|*?VlvMtWO=4Uxs(l0vHJ1NHs{J|y1ICu+VoK?dnepAlmT^yO6cP*V1~ z5K=>XH513edHWJ5NCQz};j@=mK?bQMEn3VH_LQG_P$trwAYxAh9#&4IhbSQZut$6k zYg~{f^(*Hfi*RKkZTR!gln~c?(x-y-PN`7|(r0=WAjKN5I-&ytIChXfJO0J_)R1oD zs*JZbAN^9<(GiA+WxO9@#!qyR0&8Br_4(H~bd(xbVs##Z)u--J+WX%J-slkGV6bU08;&}06wIaj1sC|jK6Xpo>Zw4LYl~= zR&`W=R2^iF;E*o+Q5BhUzI-7&n2p9CL$KF9(c1L-@pV~nCIiHTMRwDc?Ym>vtk31S zZe-J_z#?5&CQ?}o(rsx}@vGs|x-?MAcABQ@JT{u|`D->)Y;0)-X>fk9zG6oY#uB?U z&(?o9jqLTc2G-($UCR?}sA;brw<0HJ8v++M3T>SMCA~jFu|n;wvKCV2+m83juNHyh zx%eZ3#0T1=d$Uih_*(7+QG7ngbTDi6)L?JRqZbnlQ`=6%^D0!^< z6Cs{=ug3fLOIKi#?EY1RkF=$!aG|L0{7sOu5Bbr?))g^vD9eyp5Ot?>0VVSFOwfz< z`}x#zyd<*p&G7qn?EX4U6$g%3|9A6dmM|#@17RRQ1QfjgX{Q&9Su!2*ms!5o-sq%K z35u;!gdwt>^Nwrg?vWZKOeRrbB+8UHMmfpRaATwy&QOJo@pe-z)&tusdO78e|Z4DIq#PW;wh0ab%9Pbg~ zb3|J&V0vQB1X{@*9yLASMq=ECJG(zUGayjny1st6d2N~TCCk)>MGtCI5AFc{mV4`c zepB9M+<1SWd?^Ktj5;k&F-zbI0$%)sGAhDj)M%=tDY41rl&y7Sr~DQ zbf)bZ{DUsS01>JcoBYTu?*@unNWl+zmWxBPq#ubD-U)W2QjQ-cb((MROL;$9kz#nu zwVlrcj8w4Nu>@XKVv2QOMhfVH`|sKj$RAL9JoWf$wBRc)6)aXw>39Sfp=Vg@U98WN zv^1??cjRuFb==;XWwf?-kMYojwV7F1SzCV-C;_eDZ-XIYB}n`)gW_(c2x(8o+AcgR z%z%Cv48+@PwdOtnyBeE*j&wrqeSXlj9TO^T#k%fG-J_V(&&RKd#Y{*BR7ir+rtZNg zvsIX_a1r?jxr07+Mqq`^ZcQ}ZU${U!k=b2BwxMS zMS6Q2M&3#Z{6v2b2+}l);)y gJ#3_eX#RV?0oPn+F--B?eEC0001EP)t-s00000 z!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1!RY|O=>Wm$0Kw@1(eEhL z@qFR*vF!Q6@A?46>j2H}P1*5|C)#;{@l000qm zQchCQY1 zJ$ye%DeaxYq=+DAH3SphZ?U#=gRB8NNY9Dg~=U=LaJwhkTuL|FVehTR0G zcfBwT>9E{Qay@)Xp57pgFA6D3H6f)Gq9RTr{Xq7~4~QqPb)(vD1=Z*pmiYO5$KX*u zSNE!8Y0G|CoWuUG%*i@f^`_g(&q9amUnxYg?RHTLTtYt*U;lKwQDVOaxd$Zm^6^di z@cCL4vRplyvD$eG$K}}%MPrYDA-@~|F|0XfD|Yn}*BB=1=4N#Tzl;mZ0>!Z6BmE;S zZjt}&@zw&1zpa6$lJqgaANY)Pnx1BSNR)6#baMo(F_50BH<}=f(UYtx(7-xlM__X! z=LNwd%bN}>P(MG?P)Mni8f7mkP6O*S(KZLr)YBT2=hWg0rYR;3)T#+ChnHklJ`x4L z^c{og!7_B1haI!m833%Y5jN!cJZQxFA(Ze7+Xhhvl-4oVHNf63R-Isj3)UT`t*i#B zW3islVXP;`8+vg`{j#NJtD#y`pxBTI)?HXk>4_`AD+;u>HQJy+N!62@&G(i9g#q%T z6BmUj+>i#AVqDX~SQjX0H^MG}xmfKf+5$C(L<3Oj)m&Jh6QGG`C$KaXu6&}Gqq4|e z%nA}&4f#?K(!Y-F%cJPfum<33QO`Aa4EO*_Yr8n-hhqE}Fh*CvFeuXgI0R?{qya_w zQilphX{&)f0MwB1rB6vgD^WaYt_H9qjBL~r)`qKmrPQLHg@l&swcj2#;qRY<%$lyP ztbkVlbDkcm*{T97o>u_nLrbN9x;HUB62D!66wN#D=r9(G$oND7Jah51C{BlxZ3Pfi zbQjGwB~&Ax@`7R003rbz(WAW#l0EhUFxsG2V0#=?8c1rPrEJuUQObf$Ox0a{XXre{ zSLL5}tl=F{>m+tBNWy76G0nR==yGb*`AUe$=Chc=ZpBmSvBjmxn|6-*)-$MQJGbqI z5K<9)lq8?70b+J#m&ewOX#FUF0Ie@q`j>~yWSc*FfHkm~-&q{*V}&TBR5)Xf;(19J zKGfmJ*rLqvvnT~uw1COC-`G@Rw;MC+0cOM}RP51o!0d{I+VkL22tZsyoMbOsTO*6u zYy}0+T=8SsFR`TYJh01d3piNuW-ee{AWav3kfHc4*#-#+Qe@Tj6UZ}wY_44H1ETIn zv(*B1gB8eQ^c6((T(pk?k!SB!*}V3F;hu{P78fwfN{{;PDTWnlaib`46lnQq8ZT6HhkR05OQlN-G}`Fu;v!)|L)b^T%d2T177+zpHn$bGcVK1jk{0N~Zdmg}bi!5rVp5NnE__7jQQPtro?IFDpNX?N%Eq5gnY6dz1=PCeED5r<0?mZoSWL z-#MO?5E@Of;)6`Qzk&;PGWfCrt>#OSO9kv`;Lru}LaD&}ay*GRBegDAsyn6BHJ(e{ zg3>a=cP#zrC-9QgrSy=Kj@Lo1(;&uW4hWf7jH|+J7RGg`P*ObNeh_{0( z-OMBcJ-)gjrM4RbcXjZLT0c{wJ5$H<)A?@DjKu)!WTArtNbLEy?2T$1xof?kGD2xDmJ8s^gfA0;+eViqkNG0+mMgx|`Z{6cT@U|d{0lug+n3U-)w=)y002ov JPDHLkV1kC5uJix^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/coffin.png b/public/images/emoji/google/coffin.png new file mode 100644 index 0000000000000000000000000000000000000000..07777d3fd1e045f8b81195babae22227d6cd0201 GIT binary patch literal 1569 zcmbVLc~sH~5dM*p3IhOO zqYDvFQh4SUg(xZPhpB>(008pwa`z=D!gB%G|BkYQyBlKNTTbk&I)dv+q4pOY@6C^E zqmwU261y|Q1vIa6s;#1%I47z#*+0wMJR^-5$Fw?o#%rSU@=zHg$q8MX9VnN}m)^`t zs?Rj#9^z*B^c2P?I2v{pL{Im$t}MPQEelI!J2vD5_YCl72RmiU?~^kK6GCH=QcjMlu++AzXMb16Lq*WAeN5LKq;`xJ5yRoBoSKI!3c$Sv(f zB~?+m>25>A*KgNl<`)J|Oi9H2?A%gHJLlNk%dujA3zoZaA|9RQX{H!MfgBP>VNbgl z=lOmi{|dUBQIVg;w^YHtU8kIPW_bNmzT`V!t2k>MjpX42ASlhxy>cdQ5Rl0{OaVmhFd9b#oq`ngBFFY3D5X?ne0a zGOZFW_m!McHv}u;L4}i8?jcMy5_R(8`p&8M>o++pV`V{M-ey0HvkCx|x)1~i8B>>r zmE**w(R_HUF9N^8JIR`f^3Gx9t>h+~4i>K?r%rjrNfaKCUmp2*)_Dky^dB!Kz+qcROj|gbXGv^Q*ql|nAP!1 zgz#Ds$0r`KqvqaW2rYRW=rPqbx{7Xufjx+-pvlZt?+?G?-Mj2t5HE_tgQ-jc3vw$Y z002}Pks$~tWKEp%Nmf+$YnW0FtTf0(OB3Vz(H&L@ZNs4oLI15 zQ+r?el6(_Id6_aq6oDJjqV!|evLd7Tz}0)8(iNWd?|NqGT4`j^OHr%&ZVt+N}q1+!`=ozEQ6!KW0D8ESCe&djT$2L zJ0|m>hY={TGd5edD)EfkWF=kw;9<~((PmY)^hyObo5c2#lh;gK*$8f5KNldbtjs^Y zMqUTTW}ip^abh@`IgP&+d7OwI}j+TKabW2p=;e8?K%rpBY6xI z7Y4@IB4^m+M#9Gi({G*4rG~Rr{7CU@aEcxBs1pvl#^wq1S(4|6yK2F9*`ZN-3G4PE z_kb$%c}!2Dhsba?$vAMj#SHNYy2Zb^gc)lsm@t`ySNo;}k2#`?rn-k!m{8db46N-4 zT} z#^MTN)B@;i)r2gy_UpO&19+oqMf+ypLKs?b`FadpBsfymHzq`;y1aer8nF5Jvh$N=eTney+^sZLv zhy=nHDY4&KNCB!1bUO}c)?zWG`PNyJYMwlx!i(%*dW4OGFrJn?ly87-gp{ z*~5gQNN6!3et!3P?mhq9``q)K=iJZze9lR>u`=Ue6=DSdfWyMv*!IX0|34w7qxFq} z#{d9`?OPb*?ZOf3GjU;}XEBLeQ>Fp4O#!o47pj})a_RzPCU1ni8>~2NeU+vTy=$I` zA^#K3$TO(x*A{Z3j?qqE;C#lnOcAntD$6|KB_u69{A8y~K4=UteO0G2r#!n~O9ugT zBRcZsFNiUMk_bY0kt|mL>N6FmIxH{uFTgmtiATBx;ZKQG@@4@pXk(<0w1?fM^_Ljv1*ir~KDPr#A$40>Gc_r%>>d|6Zre zyyYW=T?)IzjZ#FAO?2R--^Q@~A-u_e4AWG7f+;+4Z2XuKGr6)D3M%rpQiqPM-6GD( z3b~cp3*~s{IxtZCH^{gE&pgm**B||+-KonSSKDn4hMS=R)Q}U2rXz>tCg<5eVIsjT z7*bmwUGzl_sv!}8Dj1nd{M>#GlZT-C!c%Wizv|{sK=tz)DYHbvm0&0Ghwd%Cy# zyzumWKbgYq@7_kGanHJ{<$^}-yR2GYPMPp~eewERPb3sDlk40}I%4E6RSM^xe>)_< z!HzobuR`Yk-DzMAvWP)hilblH*`|wpq}zi1y_o_3f%-d7l_X@Zk4RS%Z8oad`agz* z$r(srNgx(67W{CL<_~|Br3->9Kb%?+NDZwG@&FOsJQSnDD!`o8GFR3Deitr{k8kT;i52 zmbYwBKu7z&1TJPSj^|Av8ouLEi6@LApfAZu*{_qoNFLscKKaA}V zFKH-3l-#RNofg|*TZwFO#?`_Y&>{xq?cq)lyn8`Ow5gp5sJYFLFFXw{r+MT<2a^rT z2am4)IV}F_u>g>}aJ8}`;60;7wgQQ-Pr0)^_Jlp)mUBvEF-68019W>iA7brSl(!3m z*7T482RJ|^SO8%CINU3SS&$XV`Er@5a=OcClsy+JeyILh7@s|T-8~69z;UL2fIH%{ zRQB+jeV1JKmt6kL^SFdbqpBfZ{72wW2oC@?-dst+tV|V*@o}RsRZ)6sR$wd>(LEs! zxEHg-VAeL}E_sDW7!OCE7e>wZZ{+cP<}g3A&0Jx^3f4zK^HE&r{UUhPyQqDw%$pK8Z&Tbz z0B~Tw!P!lsr5b?Zg_>Q4!+lZT2r~7okmgayJZoyDo;bQ>&nY}bl5-8fGYcxpvq)xCsg(DS}e1=Fw_K4t8CCf2f0GbBQ!FjMWWv9{Ei2HnB+{H$I7FB zJv3HT0@lA1#2Co|xLOT6kpE_jw8h+Fcf-}|!I8}^7D{BSA#}TJPd>;bog&W;_O=&n z6~iK6?*{|a%-q$sQ0uk;8Pqz&OO3yJ)#SOu$KuDl&6Q!PuAO*FqxMdCba~?S@3L%Y zyx~eD`u$7oEd2a$cKon!@Ij%TJPR}89m~P{9HoPF&Dr-i8fX6i)D0W-`OzR@Zrymd zKDW+yn5Qj9yyOES^yP$r=#@>ab1)vCm*=5v6Gxd(?0{SI&f<>sy+Wx|pK9s6Ch5ta z#a{F)dW>GJk|%x-XsSVWXnMOpgp@Sb08`?u}wwH3gALukz{cQ!FY<5{eP|>hf1s~O8`Lu4V>N7Vjp#^1;dpIz)#z^&-GFZa{ z0-Mjd@k0X8<>(=qATZo}msy(p4u%3fwHgf=Pc}N0EPV9TKLW;atkwtWM$5-;@w7`k zR&SfwdZHjsh7Ky10&@B4?(hjqu%uY6%YDKB-&%t2+7VVhjP-<_9Qv>6DEY0(w03XI8evu!$H54WiCk(HDtvU`N5SL@Tx@4qlr zzKTSxbMfL+rz4)*u1p;l11oj*f|vWW3(o#1B7lcCZTVs?;{I|C2q_-Nq4fF4X}w!a zng^B)H@^EbZO7)gaZ$M8YvV@#USTJSBr= z(ab!FG=7}w-*giHhkJ(4AI`rN2Dmfn1V~fUrADM?Y1C?B>yddsGYPg&po}bQCCWvs zICFl$_KNY9m@H72Dt-`<=zS16wsI2(OeIMnsEq`uX<~LUV=~BD=JE?msecT3oHaY| z0OAjLB^TP>hkJ#%-H$~lRs84>M~;#;Il+bWf@-e|MSpYuhJL{S=9~$HD@96QojCG> zUnUH^7DMm@2=P6SQ<>_r?>2vn>Z#+Q15Pk|XV}l`>DQ_kjbB1wbB+XppHlYqhJpcI zmp7l8P6b|m3ArqYgZIL(rt>xMkKEXNX$UU2J7Tb8LnL)M8qj&t{cCQzu__$yg%Sui z8KhObt3tD14!cG90d<{6r_Mc?96N$zN)8AI892AaMbzQSB+$O>A#mRpgzuYe3 zwd^}!ZDI#b%ONof@mf6vEcdV0jHRA^5PYH!egE1b_tNa&h7Zce)ho|f_PlRs(Ud42 z1U;}*pScjvC0a8|VkFcYi&5$;YS!!#!*v8TaEWI+p^?kD+z|1lvw@&dD3W?PqyDZQF7mm z*;WABK$0JARj*aDF7;e^cA}VptOm>4WAjP=avqm&}1kx#j4d zUgn79#o!;aBU0`@rR%`Zvt6S=X%HN7+rK+Dw{AO1!Z4AAiL_X=|8loH;QZ` zH?=U=bm$9r)m6vivp8;L^1y#la;)dG(H#*XZamz=9Lenp9LLt==wbk>z7AKC#*mfBsK4W-ByXh$^Acn zgN&3=ALvH4kKa19yS-^Z;?zxuc?HVcDS#jkHCgDHV&yr1V``xdok<&sdF_%;b7^z> z^~bMlegp)P5UY+sGyr?8#f|Il+2bEMZF&6l9Xv}{1L87h@*K5$L_;I zHk`wWEiMiaE`9*k}7j*!r%Z3z6cS zOnBWrDql)B0Nj@FfmP|(-hD{XH$TaO3XwxoXiB}a(58ixks;a$j}yzG;{(59|1dDm zRdS%?7S!XS}!iLW)V zb26iIhtY^w=EWyql9@6jkz)0prPGvnerB>?=Vv4WHLKPvz6xm1Y<1bW#K)UP_vZr|qtaCj6b7z8fklMTV% zas8)*=uvW0{ZP|M5IjSo6`pINXXLCJ9$ZW|KtnnticvaEDeZ-qk@8qOT9At@nX4$b zYSZK()cG#jhD13jKu%4I($JT&NhGo*(JUqT+n&U0r*l@sRd5_JkZVXp)xMmbnDU4? z6Zx4LTAR$Dk|ug3_#OgD3jia&q3=Kb)K=eSqF-i|U=I)5f-R`aQY+y0mE|q076+i~ z;{U*$ZDzt@_7e*Akym59$Ea)985oWW89?i~`>(rXzhQs&-Zx=l$?qXlRv3@h`=$!- z+MuPHQoqYaG3qM@wU`1er;1s=y~xQ9KU4d3IxL~7^pSBb=ij*;m4mph-9iL~|LYye z@YX4cThS1Ejrfoa3_f^FFC81-&lI7iV;u@dm4$-Zq|aGpcvnCvd(vLNYv)7&ytoOm z(fwvi))T77*{;{D3(2L|jzOW?S|n$}ne6X+m+-Swp8BQS)F_zVe{>at(44iH?8Hd~ zzC?uT)s?VOsonIc(fM|a8(%rwEt|B&~wB}4P4|EX_z}w?MXOMavnEG(B&3Ja$4jaw_9V{H(6)iN^^J8*# zltciaT{*IuM#8-GwC2A8%kEkx0Ex8$V0CJ;JSQWsQiOgPFQE8>6;uPNqqG5HGy49s zCD%Y3yL$dalcghRr43R`T{NSO%74qd48N-hcwTIuOj|fR<^y!Fcta4=GUU7B6!Jt} zVCkD>cZ+8B$P+v+s5E_YW#_bJ*2@chkBu`KKxu}sGefm+QWkvnNHk%MB5vyqVMp1{WAY#gkvGG7d_Ztw|X{eOz0Li^S&6D z1q`}w-y`K8quLEC)X5qcp#h>h7@}>1O}c`PH04YMj&#o6m8tdI)l*odiweR@dG@dq z3wRhigE`#5&OP11eEo%^WJ`uiPgc0+b~`ydQ1>Nw!h`%gcvdst=__Bo2QCLYSq%}xPb#y z^;W&ey0YhQS;fQ~(Rx521Uxh&-iCYEvqEG8h4qh%s31?2EN5~`jgqU7R1bhY+aP~X z6yItMN8kujfGk<&CwoHfquT*KkB6%Gs9UV>$cx(r1{N@I>J;u|ym^&_nuzR@PP9yd z(qnW^eQpqVAkvm9n zR_9&Lp_JB8`Un?j_8~;1nU{Sb=H{nbjyhX#2eUf#)Ap%i%6lbdVjZgbz2~6Qlde%j zTQu0=1Vu`7zTm_cbKygHYRb*JFQbS3d_jcmtA{i9&&&)1a5Ou(azyjSp3|H8*keV3 zT~wh6)%6lzSOoVQ$&XG@*mAvWfmAN%%y+5NU;*j~30RH=dA7VDjwFzYNH|UAqTzs% zYoun3ZyJf9k2)$y@EzVIf3gOMOdbegDRja5WbgpDV6nF%c$3w+spb7u74Zh$)97|c z7N|%9Y+wptZmVlN&~&OQ?>zk1#0CT6kI$M5S^Ji;B{!8G39QP8U-bYQsuK-hsM*d; zVbdCgNsDY$R1$qd=8-_w{m*ewN{z8i85918E>!!~D~zu$u5jBFK`#@c7T8{Ctl>~9 z`Gd{!wKIe~i8Sl6R{F^mu6EKU2$&G(y{}#(|0lJT3IMW5eyep0`NZ{iN99^O7zR+7 zlDTt(oFlGpZP3-SjUPrekI1wLlBi<2wz!aExF2lXB3KG-42=Iw<@O)7l@cIpTw)hr zkeU)^=XBJ!)%L$3kIqSBpng(&S1XZdAkV@}d_F)hJhK{cVAOoGJsj*%M zn=*Gi0F)egb~|MM*wY&Gnb=sb!cu!dY4^3_K*K1D-iEv6I zMTG7}?Jyb1JuRzz|0Qd4OplNJ-xTJZO5=wS&WhuxkKDY1l7Jd2`4%=mbm+1>cj6)g z4hCm~oY3*X;vZu#%_pvOD zoW8PD$>{L?=S2hj&RKn1egMz8U1&bOz(L`@js~P|_E*AC#3dgI{^X&uCnL+7 zC*a>+62p&-Z~!gX+NGqj#l((8@F+Doqnl~Y<^q8H!*{AzUu9robr;KC$laLImVEck zC5ksb!*m()6kK_HrMmp#`;Dt=x_W8mfuI54B_SYULiyS}+gDfj1KD>}X1RT;{%)8! zBVJX-HlT~{xG_AJBpiR^98e?W^f9$Yb;HC_u$h~>>pc;Vjc`%qwB|_`+=`=Qghsx6 zJu;xB?O{yy+G3<@b^4tX%=iv%y$d?MKaR2_rSvS=)2~&0UQEJ419I?DZ(TXjebs&E>`eeX zj@x`=-uUl!>=(|@nTul|OR8kLb}~B^&?18?A31#6numOMnr1{Wq(rQZGP7pe>>1{m zog>=1su<7>4B ze8U^2hS$~%MwxJ%Ar<|k)I$s7)NqTdy@G!RlbX``4zWL#!7Yxm2XUd{7D#NZEGpl0 zj1c8#jRQUiJ~JcgGV}y>X#}Z)!Szpf%}yl5%#fCu@nXQftnFtS;DEhQu(C8XA1}L) z#au{-8|{CE1*PAy0k3A{NkPbEH)#C;O`&V`1uILQOp-d7=axkc4mJsxFCZ@INo>W@ zkfIoV%A>n+%N7b#1hDNEeHxu5qt?Dhg86#kYGG{JLpZTjJ zpT=2}M2-X>t~<4($U3EDFiF-RS=IX|LKXlF)u}&Un3mW4_3q^&n*wyNis#=DZ_}&y zrr*prE6Jt#)$S^5ZLE+C*d|TD9ndeff1&oL%RSx6oax`6DfXrui7Xq z%@Pfr27hkN&_6}RC2JNRp{Km<$aSm39gjKpkh`KBzg!c18xmuueza3CE52X8_4bwkFEm4>O_*!+FcX*;i-PZLDgQxeIR{2>IWJVc z6sB%P*?yKIHQ+WcRz&hJbnJEWu0h0A z`QrqSh@2y<~1AS38o7fUmT# z{>jW-Ffz4C-;3kDUY*Dni)Mt4j#_Y>yUXWEG;Z#D+Y4*19fEoO2t;P*7-=DnuSjuS z>Q{+^`IeW>{s24TX!lWLHNRDSa9Fo5IGCG}d=fhz5ew}9%)Q7q&0r}DY-_*Jh%cY) zos`IrTU@wT8GKZORRaThRj|1c;yu|c$DVWHMvi&2P`Y-Mx80-_(1S^hty}&11}F0* zTgXvrws&?SJ{DEETL2Z!Nz~LQP4qsI=re($WPa{JvA^@gye+E0yk~oOuKYi;u|Dg@1^#b=xHtKnQwLXS( zn34o+65c@ZT#Pr+k-VkMxXg6+;4TpxzV+6`uD+deyYF~$vigtwjCN0#^N}v*@7OkPcDzh4>?*7e>F->D@3ik)&?D&Y z{gwt@SS6f#Q_B*w(hgV+rw>zoMGlF>7zeBtV{g{y#Upk3)blYy2N&RPuQ0yTygmH|<8Sq;#N;yFtpD50h~ zBr`9vupDSw!Hk8-_QLGPLfhEbl$V#+*473D1ax(EO`ks9)6=t{pdhNeCb6l*H!)@6 z#ED^HVP4Vkxs&H)Wo0=B1e;k|J3Bj@nVH$Rx~F$f@;=C70}L;}k|4ie1_y~Gj#u)hJw-2dNU z|Nr~_0sRUE>kR_>=LeqAz2Ii@rE{-7;jBjtX)~)suX!zLa(=g%GmD6(k zOYa;iv=8s!z5Dj>{fB!e`YfBE>|MV8Lw&=C()t`@oyJr9-IfMPuWn}TRr|MO+G7je z3s21gyPv;WXP;G+!@eNfdcik)o)t{D>e^>A>wdQXXRfDnY0A>n3lAS`uP{h$wfM_a ze)VN^^!?n!FK?GT{d!tEfobb)JAo%(BO6yX{GF2jv0-LIv&%15DaLlIqkQs)0uSCi zv|sY~3h%^^of)Td7y?_)Y-?rcn%KGP8S@EuwLh#ab8Yz-s2uHFtYESsg4>I8fyx}y zcezOupKYAPv_kq5!^({>pG2)~UiLWll#9)Q8CMH}1fn?)lsQS>_hMKkdrDU zkU$jYf!s&44>~cp)fnI4aM&lghULTAfB8E24K!;l4&s+U~ zZqBvqQ89XO`~8nF$MbcDJx|!?9FvTB+kA>+=8a>HPtA-bwlY}GoXx+$?-cjB89Wx% zc@O?r6*IPUPfz=C^+4fYF45>HGXVy6v6Tm|8A)(x=viwf4|bw!ZqE<)Nh&O21bBVssWwuwL*_|G(^d{n9tFNLtC?0cXf5Dc0jA{QXLYFZ*6*Rh7L zXMS9zQCTCH$6}t(YM$pTx$gbxdH>&^v8(^2Abcm3xx86O=-tZBhTdgIkFVeUe)Y!R z*T1g+|KQ@+~O`on7b)1J99c*tJwE5U(JVI@*muK_ozOLb#%DD#NoTi zJKyyW_MWOy$a7<;4N<>J8RATmO7c*xtI^^zNN!)(akc9bA6aoSWZ1@0rT5Gc1%Nna^?F;eIIP#nBe+AvC;uhUPu2U)t5;XjUI&-1u z+a;gF^F;-pc{E6t14fF`dli2v^|UvOi7%%_1fR{v9WTkHHa ztM7~p3J3-qnh`mNB0>;V6^GG`APCGNBi%v>kvkv=gM(CwSSkuk7Ii~H79t{ZV5l1r ziWm+m3ac5fj!6RmOrf8*X9yQHlcSZDyF>r-afgD=LQKMvIH!Tjmz|`sU#%nZ=YKq! zeLI(t{)?ckaAA(`B;_OakpU$KAgjo z@RVudb-M18q+7=x(mvELZ@HS@v5mRrnChZ>#q6>i9ji!Ok*Ui!iq9!kv9?6PFh?!p zF26VIJQ%*VQkB#}6!4-FNpCj_czq)(uL=5t+@l+qCA#8fI*jBxe6;NyxlfkA7wLrz zE-_uPfG^73dpM=2D%5=S)t_Ile}habEgA0es7BoETaX-xDkqs51Z2V+Xl6V8YOE< z0Nw|%wjD};XG$z3;S@wA2;vm36u?ETjh6tcI1B__xCVwfgNoL|M$hqlv2~ z4VfOjJwX5ug+`+q{pCMWafv4(8}fh_c@s`>8a3Q1X=IdHJ1arjEcOteu^-e!JuD~L zV$y^e`BHDlXzDVVM?@LHs#R9bEJ+d=Tn{eBk=FlOi^8Mle171+IldD-oJ3lk1Wh8+ zfj3rgL>Oe@Iw2!!mMR0${+pgC1_*IHmvSx0z@y1$;1IAtp9nD=_oG(zWUL$n6;=+V z*5p0Z7$e%X>S#-NIYoBrTevIrEJk7o;&z9_FC<=+{`q)ZauSEjPdIwtn6Hx*C6+97 zOdXCfVHfP7+K2H4Ktf;m*127xZu&dohFHgE1~$*Ik`&KINo-~Ck+g|kJhpobWZM~F z?-~2-cOek5d-YJ}dZ-blVS{KSbJ~#0w#%{~P}yq}*m36$EKrWzRVFW&#+y9qx^k?U zEYqr(3QrTs{jqOsc6?J(14p-2V%2C0003gP)t-s00022 zzsIb<$E?4{tiQ*szsIb<$8L?7MQ(eOthAuDzIvCUV1ti`p{u33!c%#LOmu-~h?9(` zuz;MVnX$QZlAT$8iala(H&r$?5LzIbCQ> zV{0!FTe(#6w|gjG?KBoTF=sm3Nb!Pjh};e1~X=l4yN|+Th}5czpF2Xs@}&e{>_1?ow7j+z2f-+O!9{lHM&fv|>-3W8z4u<<|6xWTo+T12-{}STl7H_k z4+stYE@f1_^L)=$O8{-rJ zKoF?_kskr;8Gru8kxjUC`N~zK0Z3zjYu9hwv0Dmg!JuUT{7+6N&-l~yud zr>hX+2lip(xRfzaG9w^+h4hy&ePmM}H;yOk?-sr&e5Xw{ztmiaZV1n8%A={j zfwJhyM4$lrglb@Da|3ujYWEOMRBzt^?KT#z{rE+*=CbWz2xvv;9LS@XtruxL#ocLYj*Ng7!08-Qaz1u7zRJOV991x!PH=5HIv zO`CGIIj7tapc=I^TV)6EZe#-wGF9xk1O}Gx-HH#kgB2i14NZ45K#kAAFgJh~=YM$= z=AWQ}^ZefNL-^R8f`Sl3J8P(bQEmXAqKha=Lb-kW=ARqKEt@a`RPH%IfoX04Pq)fB z>3nt72PRvy{^C}B?RX$g0h$pgfyKcAgdWs{l#HI6vyzZ{(}BQCKZF~dJt#8*0+<{e zKu9tt5>Q*ClY|3jc8e#CPWz7MKdj!hi#J<#3U^UYwiE`&8yE%C5GY;^MIx@ z;4z!td+)uMo7}vnXVbs`ci3Xt{uwl&A#EGyB^B$$2$0S{v|I%$_kq6;Q1SNxM)W?w z+zE-8J0TFq!60^O4 zi0lO(JnaDybRe4%QOai2SswzHO4<#n5_Ut{MEq_@9UR>o{e-2o?RW|O$G2nN0GkhV zipvKQ3@`}^BPJn9F~DR*oS2L#!2pwzabi-k-_Hq?)ITSr`m;&t)&&-Wfx*CFU@$Nk za8gPqc=bFy-9Uv9hgZMDc>_w9b@=NlC`ys2vVh9f*>R~=4+GB37N3zZ#?INR7D>`` z@@r>@2Rcr2=oSJY8R_hpaEU!awvV*P)e51hSl;Y~kw%p@dIiJFw` zOh}GjSkv2dcFbl(+uhLU8(>N8y0z0ObYWfZ56#)JT(?iz zaZcDV(fJb>E_|3|#X*;1L8T70te7^ytGx^CIH&B`8DEmLoR(kLe>^*mG{C;aw7m4j z@w|YRM}6$a3nqs>{KWDCLQH6R)V&+Mh{^J_0aDp9SN`hfUA>sm`Dp_rvtzFO!9z1@ zrp>$!t^L;80u3PJB9{B#_=fM~|9yL#a%Q6?g3J&f656dU9W1<^}V(b{}ZEbcuuw!TPMR1uL z^}Fmi6uJ*P9@n191;DruJJv;rjbyS1JI(<{^?kkvJC*<@2CuX9nNZT1P^PovEC#PF z0HjaFqH6w+%1WfOV*s$U2`i|2uw$xZc8sN{0Vl=3V#h){YG7c;13Mnr@xYEZN`ryH wz=pr{y5X<=ZuE=K8~*C|#=rc&;jjO%0u;~Np$qyxkpKVy07*qoM6N<$g8!FZE&u=k literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/couch.png b/public/images/emoji/google/couch.png new file mode 100644 index 0000000000000000000000000000000000000000..b5628b0201de9f7b9045728bd8ebb97ee5d90a19 GIT binary patch literal 1271 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fl(pAC&U%Vtz5dEB=mcSIPvKF zG}UhtG`>$&`!QGf=Stb%+a!K2m-{wZ{rgOnUmK;q&rtojM&{=dg&&I)zt2+nF<bsj2!PR0E-q^Q{Qv#?75<+OxWB(&puymM!VcL_hZz`{)jVAsLn;{GTrqDt zqQJv?LI2WmqZvE@r<%9lEX`?=j`I#<5Nk`603pXY^}E-*} zN)+c+n{b@jd8EFmApcO1$2Nv!?r@uZ9==PC-Fv?IL3nPCFwfM<+zwrDd0*XQtxLTv ztr0%$sz~eHPHp3Vlic{N=lxgtV?KFfvJg`kSMh!oku{b3=Bx~n zDEf1WX&a}cbgYyn?IWJPV-BUYHa@rCDZaxdGJXMuvYF8axjX%4q%{b>t${$UJI0Ysby`;%cFDWSa1zC7azG1C! z`l0IiJxq&a?p>O;`-A6wHB%-XD_!lt>;@L$mtqPB-FC64B&fV$=GxGe!|cTxR+%X| zp<(6*?iB}or-m^yy=e(;VA_30O~Hv_qpL#`LyN0JFGE&0L(76Q%vvmoasrASFO&~h zI4E?Sv2al0NR$as?zm;akoaU7qbQRhZ-;j#Yf z9s-QAHVd0LR(vQa`m|f&;AG7g`Ocl{N^-w#`sGBLf{pTiy9&F@emp(B?Crw_Mhy<8 z7e~zeGd2H&{f|AeZR`6zGnkfLpD(fH{pI-*+osQ&dhX3fC!49gdMX?8kEj)>+wD}` zpgZqY_#wtghOO2wJsFDEy)iFMx%tSi&#*6=xo3&Y!?;uJo7X<>wBb-}5%`psJn^_} Vxu*ZoEx_E#;OXk;vd$@?2>=cwQpf-R literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/crab.png b/public/images/emoji/google/crab.png new file mode 100644 index 0000000000000000000000000000000000000000..37b3180429f1f05a46056bca040df9c2a00cc8f7 GIT binary patch literal 2174 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 W>SERD^4EZQmBG{1&t;ucLK6VnEK_6v literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/cricket.png b/public/images/emoji/google/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..300b76d5765715ef2f71d372181552e2c328c7f9 GIT binary patch literal 1944 zcma)6X;f3!7CyNq5RgDZQ4xaXF%^{pB2_@pgfRh21IE@;>kH$v1u8-)Xh1{YF*raZ zGBrp-1!Sg1(LAQ)J-`9P2#aSE5eW_j1d3A;2R!dyS*w3ue{`>X_WAby_IK{S=dN}0 z*&%@>LkmLy0Exx)3qyASwumdx_)>TJH2}DW>|GpxG=)8X?jYfOk~ns$8=wI5qbJ8M zTA|G-F0W*x(J?D)PJwALHo3C1-g6o6FE|)k(+bk-!J#^oLNV%|rOoR^%^<%CtEbhY z72mSvKUk1b2XYz-C!4;iYQePGjVQ&Ev@ACS{MZbRHJ}&>8=S>W!4)5R63*|DVgTz$ zsqDt(7eVnd2+Ti>VHKz-`T`_M;duay%^nuGuS_X~3UEpo3#*Xf6TTq147LF%wh29Q z3`>ogWNa!E@0kTlu-Lj0~GUTu!Av>;kYIOkXjAascZAJO^OB!(VbC3qI1qr%zx} z6kIk`_}gQ6LypN49AR1jJh~TV?uUFfOmc@;%HYCtcq{-4BOq@(%;#XDl%4R0ZE$oD z!>Fn{13OJs1CQ*2Ehpfx3O43o6l#)#FvE8lVzI9|U*|lAe&#A(SjcW5fb-l|GF?iC za2#co0!TxV5<(X)B+tV_DOyC0K29EY!2nmP=FZQfG=yqpqEt;|v)SraS|XHU?EhOK zS{g?eEm5j$6}YhBIF~;Ep_@yF5M%!^bOhL{h61dhq@mAdlLhnMnzT0n;Conp3{Dzu zcI2NC2!l+xt)?1hbzD?*1ba;@t!JyV&uZc(R=!{QXu{g{p6Fri_QEwjoqFEpJFY(! z59%9aa`PP5F^S2xLAB=i-q-dF6Q`-tN4cCI^IZ2&mB#FL`aA&lW|cNH$yb?F(|_3l zKT;faDz|c?9xo6dz_XG{nXg4k|P)+6WU(^3H91jN@OmL6e z+DF~ON3Co}iWBqkGDUh2{NLU{Zo+%M2J<9%|ph9AZ2?0z~fy2rgYx~2R%GP0uV_kx>ihK-F$CEk1I z;A(%XqP0zYf~2{>XL@}UA=Nv#as5x;om&-8JnmhZomsN2GSVdXU@jz`%hw zHZ!ixeCwug$v^8sj7?uq*Vw3TQSl~vF*iUW*~_AHx1V5wHf8aSwTdFh(p@!53dQSa zc#tv%TK3^o+lJO=XOV$ly#ta+Mg;QZElvxl`rni@?Dm{x#F`WUT0emT+z-SPQW$tu zu?=A2vGm&STKa#%Ix8IAJ`boEzMF`vDByFVOlIBSLd^!WhI~B%dUkK7Ba(PqjI*rE z2WUBuwg<11#SBoBwCI2ccSQ_3mtqISHV-KLK|9Halz98@zW!mH5k;_3=$^$r31mgb zt%3gE!1YflAQ&Be2O>a$9SM67Z z#`=>bm)021eZSp`pBZ$Ha(_{)S{f;>cO& z;xkP+GoyCgQd7>iKQog<5ih&CtFFxpKj9b0RIUTOYHldfY3tA=-(}nP_!HBg8!eIm zb)A*8qH^=cr`x-HHsUHx%@FD<mK_gy^7#|FIb8Q7zBTo+xOATAr5!R=e4H_Q9+ozV8RCQ(TH;txhS_|FYzV10ta_n@wD2lY9 z$K|)6ux&V|+ratDn%s1I#;engM-iSiYb^MM{1RDlN0b}L8k#Fytha5;c_)+aWp#eX zlr0+Qapg_K-i(^OybP0l+XkKoO41m literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/crossed_swords.png b/public/images/emoji/google/crossed_swords.png new file mode 100644 index 0000000000000000000000000000000000000000..636eb7e8e028fccc83385ecc407c87483e5dad34 GIT binary patch literal 1409 zcmcIkX;4#F6uvJDB!o23VXHDfnnl7W)k1(YXhcb|fE~d=#Rb`3qC%Ji z1C2|xjfpZ9WHFXhL1FS9QysNh6J;IICN5(oYC%l^3FP&mo&MV*=etPgS&RYI$^@b1i2x2~F4r00Tw5$}7F?mXW)32CBawgAzxL zvguJUwY=rg3F5=UuPFhz(32#iY!E(iaX^#4;b z@kJ=UC@KnpeXp_5eNzoR#hOgi%N~qE6XZNl4$Z2~1YS>qVc8q<*LF`OigXh~33Rjy zKRMD0N`04fII}`8wa(@RRPOFLR3*G8*uH($qDQ}%7)P*-FlMM0efi^$>fR`hJELeh#L5d?@sdB=GB#sj1e%KGNci6=OQ;GYu+CMlM4%1j4ZlE@bH*a@L`?gmj+ z=E%VYGaWw3V-V`4v<^MQ^(S;nY1VPDUgFA!CKmyks=U%Zt1JR0-?R8Xcj{&XS-nLL zmosEUAZunoF1P109Y*`A;K_#EKQ@D1g~P+~-05ga7kn1El<^R|y3O&uT;eRDcsx3r z^g<&;#wge^luRag_)4PqTUDyYUKD! z;&U?3*Rx5npiB?Dn<9F1A)_ z%Z6-won-{@TsbJ`msK$zZV&<40X}l08qvKx#R}ekkKHd+dc>(MYy6xK7Ms-cZHq7LxpkC! z;zUf>wP*Fs>cbRkg=SnpB^@mP36vf4_NUC5&VnYxdCXDg4f4~qgL1To6>LBP#WM6Z zE6BjwX^nZ;vMr=2yuhg>X*?7yo(b>Ht$<)VuVSm^DbdiXxM_1;9ZRjw>x)amyj^p@ V?SFQ$h>w3rATc3{e|D8b{ugz{lj;Bf literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/cruise_ship.png b/public/images/emoji/google/cruise_ship.png new file mode 100644 index 0000000000000000000000000000000000000000..b9360e8eda44ed14216a0566b4406a11da4f9a8a GIT binary patch literal 1852 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 C`-8s# literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/dark_sunglasses.png b/public/images/emoji/google/dark_sunglasses.png new file mode 100644 index 0000000000000000000000000000000000000000..ded25ea1d946ee457b789e10ca59f16d634d7141 GIT binary patch literal 1168 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 Ys>N(eo|<|Dn4}pzUHx3vIVCg!0BytqSO5S3 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/dividers.png b/public/images/emoji/google/dividers.png new file mode 100644 index 0000000000000000000000000000000000000000..b526d0e34be9ea339fedb7a97f260855f5c4486f GIT binary patch literal 605 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/eye.png b/public/images/emoji/google/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..61e901e6cda9a320b961744ad48463975ee9a6c9 GIT binary patch literal 1507 zcmai!Sv1=T6vqEVi>TUaXHeCdDuU@KwS|T>MF?s}Tar?(UDOh-hLon(%BX!E6tx^B z8HWy)YB^O)JC@pFiKSY5LSl)KOlEnX@0@#o-^)Gs-23pQxFF$@U==U`0FsC+FjoNy zf0r0Y(AjgD907V=9Np~%-26XLsZH!{I?eL4}2dV`F3gPA@Dh z2#mS8xtp7tz~FGW>gsBN>FevmkFTf4Wnx3RHtczDR;@fZvSlgZrL+G4ZWEEa2jfB)d%;OOXRXJ?1Q z;c&U!)z#IIkdU69p1382Fu^gJk*-KLz|e*8+Z(sOoY=`2Xa@Y_PFsi+z*D{14<%U9XWJ<;bL#^ zyoGF)R`rno1(m1v&xibLR_T;LhY@ibA+5Ht0|%b~T$?3!hmE|!d3ybUhH_VPa8LMh z+M~r24Vm+&N5*f=GCXJEJ!3DZxt#1V0R?mPR|*(UfaxK_3V3&mI8bg70g-*y@ZCsY zMYsYeGv^6XgJ4z}1#6Kgqi1fd#X=302We_@P-~f)SYZ(ln6q&{plLf}1M1`*(6l0* zt#SgT41ILFjgWLvNwHwvV72005fX3*rju+BMK_f2tT1i}HO2ff3$E65{#CgGf_D(U zGr7jmWU$^_%nM_ylLlhfDI}asuZ9c5tI44<5@xp~4eua>vLK=L{I zY5iBSt0~2vWYPAAM-{}*$DL+im2}F6vohl`cx&)51q1zKtSFo8DRF9{+*q?p6`MnW zxk`h2rxg4LW$W2bbu3GW)Sl)ttK-=W3rhkRTTYhuACk?ZfUtyJZ{c^Eb*i2AO*&ae zBIyA$K(2eYCe+oD;Nal(!Wb!ZBPm$8&-szR2F8w;IL_bZAAsvdtG{uJ!&DA5sz@O-wHWiVe-D!%l95$*FPbxdtJ@=71 zJ`B1NwoKJx9{~!_&W7!BW9Tb{^tzEWEufB}BTdlp2pw!hgV6gj_sX;Jhn z+Vv`7%V>6u2tygE-o85wFcHJwF_Sn`?Pbz$mAveRghnWi!87!}=|oOBO5q3CoZtfz zWES>(xK!?nDrtg(D>?~L?Ui*}`+~CQn@V(;Js`+@TU(2bclIkyHOudBAi&oL&T8jz zxGfPFMUQ(KKs(PJ{v>7{-Ce+SHg?5!+*;!cnK_|oZY7a&#B%Mu!@J-yiY}9-evgR% zX5Yklmrk!x#d75vlU;2uZ-$Pag7_5^!f+qdV?zet)^o!+sMpmyB@Fq_J;|2*wncwp zu-L_&eoV)_o>a&1TAi&}>kAk*&aI|H63niHtVeHBt10i>BctJk7<$ z-pkV%jbR!lIMcEhx>5I4lr}S^i^Waft<<(ED!u$^4y{)32)+jkZ8W?SJ6Ms|}~jCB4o<5LIuOiR^M*NEz+ep(t$(fVv&x~z(VJr^n*G>0pJaC}#Xj>(8yxHU4^)c0dGDZ+J)&O+HWX5UY<6S|(0SG%J?4>Ox F;V;<*4F&)J literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/ferry.png b/public/images/emoji/google/ferry.png new file mode 100644 index 0000000000000000000000000000000000000000..06b9353718f2dec49d841863c74a1c7ac329cb26 GIT binary patch literal 1241 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/file_cabinet.png b/public/images/emoji/google/file_cabinet.png new file mode 100644 index 0000000000000000000000000000000000000000..c197648675ff143e92493cb0ab253ab3b0aedc0a GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&wFLNtxB_X0ycOuEW+OxAZidpe z42#aXU;W51`!vIew+yYj7-pVkIQ)j8WheiEZ45^aFD*E6XxOK;uWp8bm|_z=uLS=4*nt+{P{AbGa5*EnRxL__^U`U ztuRQinw&9DZbN`-6cf;*1N97HtG^z*SGDz&_=dahzI`jZoqG=y5Hfw=_aT#Zfsc%DrUl$zd=sWc*O$ z`DNYH%^+b0h8ny3^Y^}ge)zzmLLhI;T-)5;sae;Sq%#6}dglKpPMjzH;M%wMfhGq| za3|RPDQ{5adY}c;$iQ%>r|MHfmu}hV^qum87v(df4>@|SyZap^<>~6@vd$@?2>@xm B$GZRk literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/film_frames.png b/public/images/emoji/google/film_frames.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a79feff7ac4941c071217a256b84fd9159df71 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^4Is<`Bp9BB+KB@xrjj7PUB!PABz zCpi=pZWebNdhCC*HhDh#krib(^1G9x)g0=D7rbH@aA06$!A>}E%Iky}F>(AjWUrDu x|9^$;F?*Hy{0a>XpNhhEy=V zz4d(Bq9_5@2TV7gc9K08<%6b!<*BY+IJm%|DNUBrJ`t4+mKG_ z)9Wl9*4|sNde+*q<(J=nU76Bs6?bKwi$t0AdAE>N8=HGPAAY_qTjs7>RQT-Y!4fm} z2N6^9FP_}7{8EdD>&B`{3>=!*H%;EUU=mN5$In+sr5ao-D;T_LIoF6b{B+wWabVh~ zl8DaY8wCt+lBNnWe!U}TB6z?pYkPQP_5wG{Ur*U3WG2j7>223gUdcV}%f=ja>pC5c zS%<=&ADUoy?pwzdn}GEqr59_}U-Q=Xc)oaW=Jx9AWewiDrZ4#Wi&diM_`28E^jh<> zjLvPidzdSKF4NTXFoV`F7v65T_H^;x4Q=1I&R$hx_aLCI>E7$|1cR09Km7B1-JA4F zGi5sCx%fvXtXwZz?R?;>8S_t0zq045Xf;E!lCSLi=QHN_RZj6~-m7)8bNPp<<}wKn zto~&AC5LM9TLkR0=KH`oucB^^*K`K=Q|6Bt<}+FRtWI@eNLaxAL2{3S&n<=w53`AnKCk#;^Yh*pk!z~6JI*V2GT5}vQu^UIQ{;mP zmxn&5Xsf%k2Y*l+8a8OaukytSfia&cFjuFLJ;T6*}F;Po|5 zyB*)Ju9j@DKeW>MUVM75dfu!h+n8nqdl%;&cd7cN##MISe?HF&p>lD?B>r^w>jy4x z_5JdA=l-9{Ic?AGze)G7G?QGIzsTNikL?MTACvd*)&4qxcSBadSBnGjF%ParrTq7w z$&$CIwWNXXq{QE1rW!w`cd5)Nvok!E+GG-3j4T}dEgEWsJJ~ZP_uR8z-uX)#-xsaYq@T3U;1X-l)?sfp^IzQbpB)G+TO_D UzbmQ{SimrNy85}Sb4q9e0BVAL!2kdN literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_cn.png b/public/images/emoji/google/flag_cn.png new file mode 100644 index 0000000000000000000000000000000000000000..2d9c3dad8d601bdf4bbdfd478c620a4ba02732b8 GIT binary patch literal 1021 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&B?tI~xc>kD|B1aIN$6!P-}_ds zXPyE-4l)0|&+sap_jxe?_w6iS7PGyr=Kght>FZk7Pczv+_H(=`5u>a*OnLG+bq1@|60g{)fJh`J#7O@w?wTCTYWzG)(nq{BH15;b6TIN|2WHWo;`?5 z|8(KxfCAUP^$Ow)q`BAaH;VA>@3F3=*gmAxy$J^rDhFXNQVp7f$$^L#W#|4vyo z|IOr^tFDR0oqTaWLNv2EooD*vy}Y{V!LbLocZq4eX1S-Ue^}|*@++t19-jAPIaWL^ zE=crG^u7r>J^kG;EvG6sEWJHDJL*SJ&GRqid!-+A*8TrvvHk8&d8vv(-C5_~-hIO0 zze)A;&U3yWZf`prbXq*9X?ok^g>UQm?6;{=BZcux>|tthR3dtpVbb^g5e*$P zI1-<-cCvXG&GHnSw9RBWi=X{smU(u3jUlWP6B=wbeQ{AO`OKQLs3utGB86Y6S`dXRf+CztnW4IA<6l6xokdMeDIhQrL>b_zopr0KgjMfdBvi literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_de.png b/public/images/emoji/google/flag_de.png new file mode 100644 index 0000000000000000000000000000000000000000..0baf83652e59b4eeb609ff4492b7bc34899ac2b9 GIT binary patch literal 1374 zcmb7^`#aMM9LG1eVno@rRSt4UqP8$*bD1_wn(JfLbB@cYvek&<2F<- zr)LgxLdmGjrN<>aF{NBiSri*F)@I+spK#vK^ZC5r&+~cz^!nkGba^`Yd&)i zmVdN2*$3pv?4@e~f4>eyiahn_Bl5KY1|R@3W~CGW7z4xr4rmbqdH_%f$oGf>y-&8x z`!)a|WB)3pw1{z)d4M2dzX8ndS0eU;E0afQT0c#kpA<2KN$ix126wz()pRRryOZpVXRn>@s(Gpj)k2at*4=c2$6Kp9a!(psd`^*gcAyBv( z8k39ii9<9zM#HHqBE+jw?x_V%{6Df8$d#M|qRLo7ZvMq}nc;A-S*a#J*`(O8<-J{I zgyF|Ep`K%z+m4j5K3&1_$k><+_%i9mbkJFujI2o%KB$o|BX%PX-IVP@=C;q)5)C`f zGh5F^7<_+LJ}zCJlDztxhSk-d%+&%_l)ViHo~h%+&ZCRLCP_AONBG zbR%;kjcaiV85x=^^ay%eH4A+-kg@D`J6vtXYjPCf^s3$c(HtVa{ zeQ`;B6dE?x8PvXA_x-}A(XH9;*sK=_L$m8@soMRQeb0`^^_yHJg0Vp->TzkexHkUb zYO4svWxrPXndEPI8Ym1&rKCLqQa2iY&_Wse=TJF?*3f?C9c`UwYCEOH{XZ5=@tg-v~BS2fMa)+>@xYH zwsyzigcI?597-AvE2~TLQ&mg4q!+qWTV1JvhQ6HKYxa8_or0%^cBpYQTr%=X!nm$j z{p;d)E#>r8D-UB@bkD84{GqZjBd#paE#tAeVVhnkL$mXqU#V;Js+ysK7p+w7+FXZ3 z-Mu6Q^34H@2tw<7{Slp#R0r~0dJxb0w2fw=)TKFtAmSs^e+V6gmq)4D&cs~&9m6`z zIfIbSm4*-On#aMzo^O+EuaB6O4lNr^;ZKY?z30_tR<~Wya}22e$WXF-)9dnL-PFLp z+^381c#)xNM$=SPf16W)T{ECl@~k?CaL;gGkyHJJ{xmo?2e0vq#%__cUyN*6E8!&+ zw<8>5dXXxRp01c^A+KVgC0VDI=CjuEBoFhuYPZ3Wh!yH*;|O(n^-d*PNQ~LjNYl5DAN)=wUWD`MF=*YT9-4U`xu- zr!Vqk$@9C5M*YqcwPa$I2E4NpQj%X<-5K_`)RIYIaq*mF6Gg3bvZ8|$Vf#F5jJ8Km zh|4WDiir*2TkN^Iz!Z%qY^OXI$7FVutQJ<+n9idddeY=RZR93L^bzvLad_n}pI9sl=QPtyJI7>T8%ou7sUuOzUO zami$}f=M6CE6bC3wnkXuAI(xh?>AA5yw-1u`vlH@R$u+oVT3weM&;iq#eVJ|bmriQ zTB~ZQ^>0YLWxn(+R=lFkmaTLNt3Pb}wp5>uKV6kjnfs_feKn&w|2q=vNp1qGPyABU zRlU}NI4t*LPXpg+U0>#@ER)@)$^N)Qzw&}ef={~bdo$lv2h8Pa5wGt8z?Zyg8k3#u zv@0#muYe?<^I)N`!&pSYHCk)RWN;xVE|aV=-*XXPF{HhWORKTOyhKD^^!LO9k8qW= z!YY)2k5iobQ#9ph?{c$BaO-&DX0Gm?y8G-S4DNPf#noy7@f6KnQ!O~jVN50XY@}~f zdNqe-__by^Bju&xyDEkhyTz06<{r5~qeg^#u4>b|v5W7U=vyx;M06a-rFc_r+Dljr zv$i*@$G9&iQ4rg-&y3D1!5E(IeU6^TZ8PfY}?sN*naX^-nL~l)Y{r z=%L-|jvLRs{e0R*@7XgfT|>pSvr1YVehV7TsrbZdIOtrK+_!_)-Jklc&BZc>Q7`_f zkp4`+9?X2Q>O(0X3Bqn{r{b=B>BJ8*`OdCyjUp%L9s1P3ZJ~i7C(q)wSBKq+n$mUd oV!VRCYF$DZ`akFLD>rCB11H5wSfabag#R_NvvIO6v-J7lZ&LjyIRF3v literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_fr.png b/public/images/emoji/google/flag_fr.png new file mode 100644 index 0000000000000000000000000000000000000000..674b50805a8a8218c261e21829642c6ca9645154 GIT binary patch literal 1375 zcma)6doOBeWaU?Ln)f+e1-$pc7WM5jJmPbHuI@yKFXjv{paz$m^iPHF>q7 zGUYud#*L)zs1ah!qhucA#5QdE-F5%Gf8Fo-e!rh{zUO;B-|y#-?>E)W#Zgyhj}8O^ z(M2H1Z5=8|L;|$&v`HFJ=qh~66ny%MD96>9x^ zZs&)P&~Fk2j^&)X$UH=C-9H>BDZPj_gXsWZ6!BJQXe|23;lht%^t*fG=JT$W zJCkq?rt8l>uV%fPsR`t_pM?{y*|JSrsteW_xie;AqEbY(d)S;l<(*^2$fq(^Ox$bi zCk)Y|q-7ldy2J&$+WhygNIYUVkHe}B`Ag*Z#2*G;JYP?|SF_~HMsi})+?#?eC+;*- zV;8M2aZ3!3L#6SOCUr->U(TBzP$V;{3q7eUAy6MnG-6(eMx`RK6sw5-kUso&j7dYh zRo)@*Gn&6u@~U*HgE`^o9%R7Y5Pr@)dSK-3j-~7f6Z1+*%>ym*a15RG(EcnK_DRoJSTb#&VT2um5G1gwF709RH@9h^KA4;M1TZ$Q%v95M*=`U9Xw!uC z`qRLG6*(o_;@Wz;LFV?;fygIXHgA4*B^6L*$ij;6kStrj`!>)=wbpMiu#=UMECQ+A z`LHqYkm-my1GT&AGb>($O>+pqb+z9>krm8jW*x!q%fBopSVi=7w^&tTN*K$$I2 z^iu6ZU1oXoah=6NhoQ56NI`^nx$){>q!gxFmg!TNQ~9jR(foT_=VL_hJ;^s6ilvzP zY-n7;y5Rr~mdq2TVcpB%7fIue9rhwZf)@3x57Je(d-+lt3_GMhn~2!AVwO>S2gmm@ zp+HO2C{9&y3vS149|jt(^T_cb-6*%ilB<`WhA6ub8xRZ(oSUh3Z^|cL)oK;%x8kybQ)CKpMx25F7G;}p%&$Ko;>Nyi z{5JIM@wX^)UyDN{_)=}bH`Iv)pC#AXsMl&Va5Bzu?W~;KYI-%pyKQ=IY-8caiQ0sNsh5o_Ks{oeF6!gC zo)%k01tkwzU1Mj?Y?aKfjZ{}osxL@3*EzM%m@M z63Oy)g=;#OkMrVDE0go^^z>sB39Ib!1jQtOYHCyy)uHV(@i1ZdRBQOnoOinY^IN+o z&8|-rEUdsqR5-zv7a(Yxi5yjaZwT4K`99Pa#1Kd=j*be}lp95=gS0mx;2=SC0005PP)t-s|NsBJ zag5r_g4DzS*R-^(iy=US-(;yE05Otaf4lwH*}%-?05OvA^ZESA%-xfsm#fo&n8^S!k}z1O_fT1orO;M( zw@`Al@$~tyzug~7pN*r=vB2Kh*5tXy;jwa(q?x_XYJjDHqxCgE$!&z@S!cp;iSqRM z^FT_Mm%ovZxnzR9-{tYh)9C;9_WAn#gq+IvQCTZgr2Ctn|NQ*WcKwF9C~m$@&avRu?F+KMWv33n9dQx7eG42p z#|40Qh|P2Noluf7WdPU`8)ti`0#zAPf;sOJ8>Xh}01Y|EgP3=3IQ_dyHK8SA8W8gy zu|e+D)Eplx(1w`GJ+U$N_SKvYKm%JKVOwm5`?YWAmzbEtnVEtBmij3m>wkf zJO6Jx9UdOmYPF-IqlfRk67!V7_Tlk^eYKr+s7OXBR zpw#Z!3bLb2bbxjtj#t;1fDsldrJ`ca5W~ZLWhQ_*E!Kq3JZS9GDR$3{iCg|%v7EDCvGu)hUH zx^=w^OHyM}tcBwtKo4D9hye1;`u4dC6`12mWD#FoQ38LNs1l^q7rs4fvR^8@JX{zAPxOyee1V=q{Z4^dFf^5!y$}S_h#0fhVsC%2l}(e%ib9oAC-$A}Yf;vJ_}*(m=Vf^|4(UcNMSx0~)Y#LjgFTA* zFQ@OlE_AL-#BxV-T-TaNP8Bp9CPkga!cyg58OPc@)ZTlwzyYVNr+H9zEl(m;QP^5m z#v}(bA`&=(_+NEOeS0Hc0&4`EL3?8Gpvt5uRMR-bmd!st!}9Cjx=OB)q*nz413lJB z3y>0%q7NkD4<_7xB~TIb`h&y)8-LiJMe#yZ0iBY~Jz!fAQuT`LcYI*8>wQQp`7p!` zPsb{w-if;C1`mrj0hX`TC@9zPBcc8#;th_3M*O)bU^~^c8&{PVmNh|}giq{$^ka}P za;SZJUG$ilM}oee57=c*fO_|F(w4|4FoGT*=}(F!PuG=^zMu1;%$vZ2m`_QBwRG9x z_TkfF$%$G;bC~>yi+tv@)T4#seJ<f=y_sWTVazd)9V#du7Oz{lUAi|;w!0PX81q+?Y;{nQ6Dya_mE8|Q*)SwFX( z9~QKKg+((;C;`Gw>4Z|1T1V_wx>v>QPzPx6L%oXao<-Z(u`Jtdu)ab{Bey|6PshU_ zvlG%iI(VUGyf=~S@F_Q?VNK53DZ)S@+I5kZ`^aB*P{WhwNTWp;c>TI)XJLK_$OvnA zUU$AUe5>uq^TkTjPbK%5I?&0IUpl|wsW?Z9vP+~eBLDyAiRZSG@W(38 z{iPHJ;ahBe*i@W7fgDeVY3<$fPX46Yf|zcgDD=AMYhWpj1e-5E+1(QrT@-UN(+%P5z#sFcE(tcZUkP;YN;Iq4wP?_ZWE2AX zll)2LnPoYq_Em;Y>O(F+_$k}W)=k3+y^js(m>v+$GJ#?@6|*O}XZZ791fnSQVQ$Ra zTx=@hS2d<5xnq+L{$Ft|<_?6p0$A*5)uEr@&(H|<{%M#qK5LG5wR@udA_V|PfArI( zP0G8FKhCEFodrpw9^B(sb+iDkuJWOx_*{&Q4^lbo5$;Jr0ZN`$fMK90UDAbQ5XWi_ zYJyNB<)sqjm5LtGHw(M4O0Gf7>}(6O1Ab2B+``}N&`%+a^=hztSLE2^9cXLMzWhKj zXrpGpIyHEpw_jd~f?+PSDx0j73h|R{C8z7BpF0o%?JkE+0CHN`1ojyNnrAixW_vGZ{pms86e<_AlJ_ovV?V7DKDVzdp0gPqmq_%e`2=@-R z|MuLSE&Q+sUd*Q7+Fq4;rbJzK=mUU29UQNW;n}~xasB%BYcVqBA9v;){d1c*yq*I? zK-{GR|JoLt0V_af``-_5i%o%Dt#8|}UlAJurLaOAxcZ{l7^p;`IdJWY*f5V&2Nrzi zHL-E-t0rXJ`j5B(Y7wM7{;jwe{)^|uXT?SF$D#PXhdP|MI$knOv-6>*2tklmV*jK zZn=$6DAUxTIgdNt9CO)>jh%J=?631Z-}k=H_s91>&-?xHUdMT2RUrEz005}CxjNxx zO#ME)!7^N*y1gkQA?}o~vs5ZwbOHWIjaS6 zmbvh@vFFKkk5;!M`&8ld6iRAj(UO=ZZBfh=#M5G!xjl3L*g*E#Iha=gO|Qskp$uqf!4! zEY!P?VySk-4wnU)dr|1ej7maklDknijbKGRy7#}qqur4hT9dMWS=v|HDkHGhj3qAt z0cd&E14;A`^AXs*mRTj$cR84)py{k|JJ;KQW__>vq^&*H{7RIatF9acH?)hVhDQJv zw0`A#mTLUULia`kmi?5ToHm!GpNZpW@zmax0r%O8BWZMK0Xp?W4Hh| z&$^Bo3|DuC)eGQCbNOpV{4!)i{}jV}m(SiM^^D+yj{P>bP3wJccQw19^t5L>>``}* zVdS;Z3(3>mnZ@@VF?7t+^|;>YYb(|*G%If?zAs4lFy?nulWCw0$isob?x!6blelo7b!Z%lzky;7 c&L^}OBw{@N_}K0sFUt+U&Dqnb#*viyFC?3%i~s-t literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_jp.png b/public/images/emoji/google/flag_jp.png new file mode 100644 index 0000000000000000000000000000000000000000..a04b719f8a0471dba6c18526f2d026bccfc099a3 GIT binary patch literal 1515 zcma)6X;hL46#W{P3^mboA|1zd%y8Uros^&t96v@w5@}{Ew{n|f4Q85Vl*CABQlgP- zB$lOSn%d+NYNTe7Ii_~f%G3&!!Ub2vjiI0OZ|*tw-E;0a_nr6t+)NVDR~Kds0{}pm z0O12wO8-hNHPu`g%TcIAK=KdrQ7V;={~NBZuD-s$LqkJeUS1Fc&CSiJ;&eJ)wSYpQ z@cI0>xHz#`+}75{#6{xnyOySF&GkIxWD( z#f3~JV=x$_p!I0gFWAIDA{oH)1Z=pn_GP$}jATw*DIQHtWAWJ<>lC&v3g@)cn|w5=`SiqT+vN+B z=c0JH)c7ywIPbKFYjI3OSM{Y?2-VRU1Tl|qa z1@m({1Ql6$gc=5-a+Pa@gbdL5MfOjGj#X_Te9C^{%;=E{bNRMh>kg(Uqr|uQ&xhK= z2RU0r<5^%J-$S5BXqW~Qa#pPs?KNO3c06Asb+Fc}OuJi1IjrUk$7O{@MMtBiCcA1| zm37Zu_wMRh)wWv@)eSZxuCtOhbYptRLzYd0Rr8olH4P->C!hU%8#e0Dl)UxmMsASzB$YW15wvjo5m5V0C2tGd_uYQ7D@!X03ie0 zDFy0JEt#&kq6#a|9|X+w%`z}t1~MoJrn$;~T1m1+nRl2HnP7wr1os&-OMPIU(_v%G z$5dT$@OFbTaHnC4MJdvi2GICg`y;ML(yRSKAa>>r_^Y9lecm&N;o1A3EEde}!xt@k zYZ^sja|BE}d#;kL)Uw=dv5%aEva=P?c@0?t;Gmn_3=1Pv!GjCbA``&&%_9Fxnkg0^ z)Dmix7=&bA`{W*7`=yoTlltgV5B>GEKCmCD4*g~Is&LeyAK3|g|HfSKHGUg)On;wW zYm0;RF-y+1yUI1&i!)_T^&Twp0u7c0@e4!H)JCk;&HrkNn zX*_2VYZ82>!@X0}smbj?PjAJ=-;BOY47d!iN9-xRjR94pr<^&pfFz(FmzVYy4@1H4PmRJu~9Cm~rZIUTl99b=@aOG~bDf8ftG%kgrakp~;Z)ZUw$?QXOUka+2=oh63 z#d#Z;=&2_d5o3L3rS$4R3xh1s} zR-88Dmu$t>qCl<3E#uv3F*g}TtG(FeankZGJ9(^h7<4qiQ^W;6udMfZ>dP E0Zlj6jQ{`u literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_kr.png b/public/images/emoji/google/flag_kr.png new file mode 100644 index 0000000000000000000000000000000000000000..12b9ab12574ef91d377cfb38af686f5c54c6c501 GIT binary patch literal 2575 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_ru.png b/public/images/emoji/google/flag_ru.png new file mode 100644 index 0000000000000000000000000000000000000000..5121b0cac4b6db70758376f2cea8ecb54cd6f534 GIT binary patch literal 1381 zcmb7^`9ISS9LFa-zQ|FzVl+ACNRE9ea*LU;%@O6C$yE=`6`|(*HswBYu1!RunUb&X z7ctG5N~ut8lPNVeb3DdAU;c#e>+yKMU$4jG{rc(o!#f*|bdV5J6a#@k5{?Kvw*yZ- z91+2Ty*XdF3jzr!qMbeLf&Z@w#xK_9P9(8gKbCBf(g1S5A6D@%JiQ4VToyy_c|W%* z_!nZnzkbRGpcYh`Wi##7VkmdLq3x3d7F0Mo&42{>CF$;GiGgV0J~! zdbaORtR}lUVLcaH)%7vh1^Fw+B7)dm;AF%hB}=+xbRiTGD9rC$@N{PjCR)-I9X^6M zzEK(x>jGDDO?u|2#;MOFUD9P&#<4OlgT3#XT)7z%7MB$nv34B>9-n@D0Lwql4e1WD zCifN`1E^ydgLSk@>O4*wC;?W0yVE=`0C*2<0p>sp3xEJXHNZav+S|@OOJf7T-NP%- zt7Xf)Iv-fU9X5dJ!wT*oCa0t6DQcC@qcNEBH69E{}{h^GdchRgib zXQZ=Ko&eO|MoUg!)W)-Y=Z(RNx$s&V>T3Ip8(MyFz<8puk+tx^FBJdwk6Si`KTZ+u z+nUQ|P=#XawpG@ty}~xg^k9`iRI9BJY*D@c(gVayf~#gGOSHsoxU%Jol8aBU=RK%E zN^b3mH*jS$DXSW8X-5n3?e=5R?9k{%Il~ks>Dzx&I=BEbE1>OyL?xsGk%{Udt=TlK;YFe!Y-^%lx z$tu`6zP56ejlWV%6h1%Zdmos}bf>|3KttE#?KLKFxT%Y}f3LdWL65&e^ZL@Y7vqXq%IW zeKLIOm8cG$cFHXXVxii>tfz2SVwMx$AUYZqZ3Ffvk1wm1w$IkGlP{DBwFzFhGgL&l z`AUVolqpr$#+AeE$w30iVsS8HzG3)J1#`>L4+HPL%l>}MaXc5%)p)jhj>$HC2hnwH zzP5ldV8UXzzgvtx_g5lGu(Cu0V9g%ZH*!u`o>ma|zFJR@ZeFHEPj{|9jg_74*Iv_7 zBmP_pD7Ou!8`tJK3hdSO1DP(=#7ojcFov+(k52=wwq-3VPjt2Xa(MCve>`ZvrY~$!HL|_FNq&dI^_}5FIVho5E4zh6kz;gM(Fw^ErtW gWkRnSwdqi@#ZHsW8kPGM2Ok0CXpgj`*kaQE1KzyV0ssI2 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_us.png b/public/images/emoji/google/flag_us.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad26a6680b1fe648d1e238d85502ff0b26a060f GIT binary patch literal 3160 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/flag_white.png b/public/images/emoji/google/flag_white.png new file mode 100644 index 0000000000000000000000000000000000000000..4afc58a157e98ae1eba8af0a506572a25322ac05 GIT binary patch literal 1395 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 N002ovPDHLkV1lJaST6to literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/fog.png b/public/images/emoji/google/fog.png new file mode 100644 index 0000000000000000000000000000000000000000..99c75ed752c02b0d9a26fe2d7ce9b8466784e55b GIT binary patch literal 1563 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 k&1taXMS9`Gd=Mr$Lk*bo7WWH z70uds*k)$MrKY>P;w6)gDuy0y4wDJ{sr7{ERF>0BDGyzv{qYB#Hy%EG{Xr66(Frc| z?l^oOAw`g;fi98iG#$ z|GancuidlKS54MsHoGp?bjoOf(0Pwnvlyk$Z>|Xr@BF5crsIDj-zL%5S2b$Fl+QLo zyK>r6j_ZBsD8J58@WrNM?IO;r#{!#belpBr54^npi$;^$%vO^I;oMEvKFh1~Zdemj zznUW;Y!iPMgGyr4kBvKoW74m(ztEZ%*1h=@bIOPRj!iWi83eyC4L*B6b7u$x?=7Pn z^IqO!s9;*8sQCGN=V_J;8J-`PT@=@J;k?`Ppw8;zoU4DfFFYvRu>8Q8@5k34+Aq4o zYr@jFb7NG|^Sf^OA(75(#OEt&k^jQ>ozzDe9&`_P$>D^|=p z73q2ZZta%*@OIt<4m=L2GjIOZpS>hrvn5;O2XDcW_uP4%3_5ci9?pG|_L)`QVE4*d z2h=y}S^lryk|(sfF!E&ZE#d1^w{7_=&1T-m&-DH1l{*4!kA&a%w94>&tf>@vz1LGp zzhhGw$6>8U(n?b+E&FnWE;^^Ix@Ld%)-{(eZd$21#pV&&A&U-V)GWUDu=BvS+}rC* aSeDhViQB_*;sY?ZGkCiCxvX53-}f)yA3mR7K6$WMz> zzfaPC79_WS*QW}<@8gB<*#P7|an%j~muSyAQ~zk?ym`C4{!J>C{#w^Ue%wB~xZENf zdGYbn;OzXy_ibiJPdK|4TUv=Nx);DG^`#bIi#eezZe(TM!+v2{S#|K8a^L*h=V?V@ z6%Rg(S8-L3x+bOr=*0nrto`TzQO0HOp6>^6OZLZ{2S58*QG z>4$@(bABeJQOW!bSJBu6?QYBgs>BUt0pcE=xzf))>UCYq?$Hf!)W;TWD3yT$z<$#n zmOoN~(6KWYu!d2lkXNxttf3v7G<_V`n4c;e4?Ap0v0*q(nbCDjgK4pS97Bk;tbLwf z(m_svobsq^i)t;GPK!Qf8V}#vo9fdZ&0+cEyw%xE;`xmVjg+PrGoV1tyLxnLbz7V=tofdbgtTwOqzS6HxYvtLhIWO@lQfrS6|YNX;R; zHw(jJGv;bR3hj4oN%3;5)arMHr6#RAaS@OfNjOXj!oNfLi#I+^BXa1NSP>AvE$l{D zoRT?lNfNpqiZ;hEeYS|{*D|UYX4fzW;4TkhcW|kS?gt|AQLP?dYMQdJnOj2UP-URi zWrhm#)|XxerLe{N-qSW3D!j*o zL%V)I2L<60@0VwXUlI#<{S@-zHJ^65nfNd6O|LF~pIZ%ls7k{dJk)*rZOW-uvaK|c zk@@^zhp%gUE#8(_W5o)7SY$9?LQ5{_9}d2l0%=PKk&WbcRGI#cx?gNU0-EN&nKK}q zoy}4lz!UJLh+YLt4|9T4wFc_RQ4F{qM5bHD{0**o91&(# zx_M3B`#4!^RPi35KZkQuH7#z9h#oG4eY8wy0!N8V07yIxPBixb`W=W4U~U zCPf}$I$$aR`Ly@47IQT9n+abBmCDCW0d+K{O*~1;BL5$nTL0hnbAt*k*uAsfoo~; zSjFOt+(q=*Gi1Cc%<-hnH(1d6-84fx)*2h4(E7%{AT?$ugx>WOR*_<=9wGwKUs%u!6A*hWoLJu+;02l z9~MTSuz0EkbOp^o4RNyU-E8jXvJG@QwJRN4~5uQS-i^ z27-bqlNmL1K?@E}5;F1=9b8}A>#}EbZk;oJDy#8wNtRrnueMb%zhDwQg`#2Px8MUl z%9)LC>j7p6l%iS~Y%13ZzK)AjDS>;DGB!%VgS literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/golfer.png b/public/images/emoji/google/golfer.png new file mode 100644 index 0000000000000000000000000000000000000000..2aff3e9dc42a290eb5aa13679f673f83098b376f GIT binary patch literal 2053 zcmV+g2>SPlP)EX6&=eQ}524yk(^+#Zm+x4|89JMM=sclHeF z&dqi=d+vVO&HtPELA#R6@c-p_ZVRe$3xz^08Tn6*$P*6X6QYP)e9a`X;qUx*el|no z2$Qe~r-VZBJ-sE-h46DFp+~ar=xzL8&gpAYs6HX8#7>?J2tQj%@N19STKs%=pCCjP zI1nK@0$AmOUpD$b;=5Bi%ivT~Kmz;%c;&+X@r<5P;i+s5G$g@P%;8HMB*7#XYdji zi7?divHvUla&ABF@Ff`}Qs)Zh;)I(J0rE(Mp<3VQnfv{k{_FxUtqY(w%c7#zg;{4>jCwyBi~u(R2aS_SEB%VLbONgn?03v3BQ~DMeF1q^4dXn z6V=j~X}OWaFuyE{L6?mD;3cYH#N z?gAS7>(7e|0&-uO_4zY%9Y@?!8_)c2gyL0}yG=X(YHxRgN^ zxip5KAw(QbcxkRhfjjLuy51DtA27MI;}rwqU1!6OCe5+VT@=>Mxj4_!l-uOB*fapavZIqI#C zJrX4s9tSYv6IxmYD8vZgD!GOpbMWZjfBOY?0t86){NIToKwgCalFwfq$Qiy@{oM}% z^pb02W2_$ph=AwrJC##_80-HKz%0E^jB98VzCqYTgEjpa1Gw#6$BsLWpc#a|Xx^xL zhab74iCI95ji8~^R~kcSt`@^)uM@-OeI*HhUcT1$8Tz~!GG(bn{|>qjCs;O~H~-Xn zjrbKT_+TBt503?gOj@iFJ|QY%@)9w02JICr_;#b~Uc2Bmv3B0U81U73BS_SMO&COm zf;Bf8{FJ3)*sQf;xbt1v>)y8DX(<8*e07k(C4>rOGfyFJOz_(LudBY^1ZTRKJpV%R z!`$6#4c|i2(E{WNkz{1|Kr+N@8PxatI1j+d3Cnhm*0b=Ab1r2rCnqA3dl{#w%Y zn^}UJCSF-8fdpMd=scfjRt}&1MG&+V+KZ5+rHg=2?12D*Tb!)r-EQOG)BM+o2(89aurnDAq536elWP{6svjzLS10EIFF zIL#)2oq+J|7XAtg;FTK?;@JcB9YfQefCgx&o*rvPaF`2{djBLGJK@dO~U z&9X}<5`dmC0rC|HpyPp)I&A(h36QBk01dl<`~yI)X`r3vUqQpW`^P^Hum}z7{~QAF zcLQciGgacZfB7YlyMqP(4Il`BQh$0F0`M2s03ZMaKtTXh`UDs>W3AZp(f1)hS_F`x z@BP%rqQ`Y_iOdDh25<;~qW|%Fw<}%~y>FZx+=Xo%^v2RQhR*$3S>VC-_I>XEV!+*V z1pPc2dKj*SAP7K+a&(^XVjzel2r&>P5_(^LHu!GjbxUxO2CD%4APt6s01zMp0U!Yc zNNqs?6a;_(4g`Pz5C8%|00_WK25F>Q03B&S02Bm3rBwg}Y48Y8P!yma^LxyPLLh*t zAbeLrYhodd1{GkBOCPq2*UH7e4o(F%atmOFuID$_Vh{w#DH_4c>)Gj>3E)(auBb&R zAd&hDkX0anrbs9ci7=Gvjhx0?5P|@{VgcM*rX4n&Os_bsu<`Mt`_%VK-L3qpppcEbF5;YD$O~Pqx0dPPxt7uu;B>cvk z1wa5@@&1I1bA@cHf$;@kmH@khjN8I`2klgPI8>S@0pkC68Ay>=0F7~m;%%7QT||>^tMty7;WuYtP-qrI jc8XZ?G;W#TQ7F`(NR#i`Qm>uV00000NkvXXu0mjfuK1(> literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/hammer_pick.png b/public/images/emoji/google/hammer_pick.png new file mode 100644 index 0000000000000000000000000000000000000000..58690f4623f7a98aa85628bce573856b8a594ff1 GIT binary patch literal 1478 zcmaJ>eKeG56o2P6uWun)TSwcR>9n@28QT})m{C4kF_9?7yd88RG=&h;yrv-(R_wBU z7+JL1mFa}?HN%mzq$zC;sTt&0YIr4MGGpf5x181lk|V z^v&e(wBmtmY;j55I4Hf?cE2QI|NkgIEu|nfDyFgy=d7G{^U+}C!-18Q+*1ko=E+Ot z{Pa|uiQ^R-FXPPd%T=-amy911+* zNkfADT((m8xjH59^9uKH{gQ%j7RL@N@qz=Bg93s9M|uM)7mzH9Fc>fDi;xg8+rm+R zViE+y^Y?MHKy79sJ`TWBq zZO`*2B}9Ira{2{(Rb^PpvC+l*5nt%$Ypt?wiJNS_A+^X&FM^~M_QYh<<*ZPq$)I_- z9k@qeRDHrC9#zcF&el{@!Ivj2qSMDXEoHofhf@1RKNj&%ImvlW*_R+|NM-k`$t10Q z*BFhrCSl~DvU^v%1adtVeru-f8#JlQ^5wy|>LXG9=#Wc2knl{!w0Y)wGLDe0U#qzh zV8-4`fsxEs?&Kpxzl-wn^kdDkt@D1v$>Uwn;ncbrR+fP8z$@q>P0eX&Xo-eiWxe1! zc@`WZE{a0nnGxuPhzU=JLm$YF3l6*#{N{2}SW+;U#G-~3-~H%eQDaVV9tn#q4ouj{ zFLu^^{0Zew3}sjkHp#H>|Fv+ zy)`Q&T&tX~4uqn%Cnh^dukhQ0=;{bI`1~HCYJtIXh$@9gQGl|4cz2f7=r*zC5Juc{VlvW7xxnK%1t=;>Zic9E3rJ|Uab$6%)oyla)rX^KAD{qL}9MYSnH5Hm% zcGVEnd^Xvm zPxBOtjh)hSJzya=pYXR3OQ8JF+VwIglTL#*qJ%a;!86Vrl~gc=dhSAzN2S5?IOk3! zxS`oZ=44zL)Wa!Pnt`V_j)F2fjh8wu>v~aR^rw+_Aj%eGQQ4m^FnNSOC3l;N&GG$y z0+YgzcbR7hXbDrHNa%KtSl-gNXm_f4_~?}xb9uI}Yf^ODPW*oY{Ja7@Z|#P8{{n7Q B<6!^* literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/hand_splayed.png b/public/images/emoji/google/hand_splayed.png new file mode 100644 index 0000000000000000000000000000000000000000..140e5edf6c37a695d042371d94b30320133c8a65 GIT binary patch literal 1308 zcmb7^`#;lr9LGQ3Z8n$In9D|bj9hYXYUw--OO1nwMvhBYw&UJ55rXiE$MgMq{_=i2-oL#r1rC>a-449yi zRj}&&z$9_VJOC&k9}l;nR7g59n>A&&0X2Dxh4Xgq;McD#t^x{}>#OERa!g`I(V{fP@V`Aa zM9GB9S!))jLs!Y0<6H%Q=kykqE5+Kh!XDzmA-EVakjEh3Yy+PWO_-5dL{Fxi3STfEPZqTx zn@ZX>v9vjvH}KCqW|+PYFHnBlC9;K5cl#+i!_a=zt!!>XDCBc2TkHj5*ZgZ=&@Dkd znrsRp2-@?mB34~fUMfP&$-IuJQ0^Y;&bX)1aTA@~#lBsh8*# zq}ok`$6=)#19G_H5-U)+>_VF^zleM%vvC1`#es($2J_5&nURr3ax7))N=DWvvLGwc zP?+z>s!IYlC9#yuNBW6y2k{G+hz#0j)|(CmjM$=m(rUA+urFMa&%is3!SdkCuETNG zOTWTc%RAHynEU$94k3t-jk#aB)XN0jIu=qs)xsw0O2RbQJ&zaJjRE8OOXU|K z0S8%AjzM^T1)VS3c%wOM8lm2X_m&o_rb`Zl#T>cLfh*)Xy`AfaKU4%U%M%HGmKcLv zl|}pdkfUOM4|C7HuHobIBwu&k9K;El)a+obLwmc58n0;KvsyA{<>3kR(=wlAXPH*c55S%8F?@AC|$O5i$wv`xRiD-$^bQBU%e$j>~I_rY=55dBn*zw zs$k?;5wonG9D}2^w8STk$b5Xgi5|6Vd(qRCSWmJ>P9tS(CEn8sU7w;n6b}97STR~w zF!Z;u&Gjs4iUG+MsRY|cZsbEY z{brSt#CPmiU9sQIsSF3wnVyglwuryO%bXSW02$TdvT>AtL>>GvKyJNwhGBYfR;Sq88)s_B9 zr`6Xw)uO7Cy=As=QJWA#Ay7sUmI*r0YrORS2B9WTYi1Y~*t~~E)9u6DCOt1saPz9R z8HG?Us*sut-+l;nn;3c+U(mbJ4DMcv8o~D!2U6|B=^1Bmc~(9{i~D6aYT__bZlG8h zTzL7};t)z(`+@saa O1AIK`9{1cCS^ok2YGCXD literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/head_bandage.png b/public/images/emoji/google/head_bandage.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6358bd84430d3c80e08a3addd7af75315d88ba GIT binary patch literal 1971 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 QFtIauy85}Sb4q9e01W87M*si- literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/helmet_with_cross.png b/public/images/emoji/google/helmet_with_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..7b60b84c7d4702178e7489ac26e1a269ad905f0e GIT binary patch literal 1880 zcmaKtc{JPU8po3$ToQuTR!f42y{LVe2BC>sV!Kp{w5eD+Dwd+9BV?>ssnQyqT1IvB z(%Y!Ik&Y#)t=8IFRkY~Dq0}VyrT9(m^ql^4&zW<+@8|nH&-1+RdEdX@T%zY0xTK0C z2n2!?@Hii#)Bm?5M1OtF&TDS`<3*OWhY8G86n?WPoTL<4+Lg?xhI-hZS>v1yx06Q=G z)=O*lC#DaUSB0(jXF{fNLBcJpfV3uh@F60bz=tLxq$roN{wh{mkLI(isU;GBn ztO=b?uOtEh9r;(0Ps4J^OayVZu##pn{KougCI}?PA>bVSlED|1I>^WJA+9<)R0RbE zs?M+AhWmFiZe7W7d(hP9Q!TM-Sr9?!eM-vA)i)_&*N2a+ zEH^4zjBZs;H-qMbLUph%1w|(c-VM7bul0e}U43TmKPF5NoUxS+wP#beTYcp0ur z)+4?6`m7%7_K?G@P5apR3E!dzQy38_rlfCQP+ zA;$bp8|`u>I`SUr2vWrZeOO>3vvPPKS)9}!Y^2xf<#5k{EqCDe35LHsw^YXQ=EaSc zs}-=FqE=ZdB2xjZD{gEjbr*rQ1WWcp*VQi-dC-qFV%58>EBxt_>?81PH^G23ggll?1c<~PQR^bO-^y(DNs zKn>=`L7SwYcuS*7lSySdowX^jh^~E9yZ=5v<63}s=pFTkx=XM>F0A6iUf1SPPgRvp zvv`;43|gu2$ET#g$en89#%o&Jr~U^Qnyz%_nag#zX}9V7?T24gpEx+OdCiV=P4df( z9&$&^tM?kNrso9@Y_o~ki zHdV9o>*%)jDqBfNAulC~Czrd~t1};RYE;|~?GOP1H-_;R7uPA zVD34OzT9;~_>NJ@_lnJSoKv5UWOt9k3<-?`ZInf9P4|*rmT1*T_~!KnuhNvr6DNRs6IX(3TMTu^p~BK3`6bTL52lBLt|!e^&M11f-2?)dZCo3-^3B@u!p30Rt$a%9Ip&W%Y^=mRt{urZU@e1KMwE?i+)QV@`uNIV$d)gle~&~70N z9Yz+uM94U+ikbaGXVl{dC#CE9rVXmDB#E>VVD;y{RWzxFF6OLl=1ezgGt>DY^2kYq zr6|GnWGZKex~XNuClTo(FBMtyNl!A<#fsy~cSHJ`a>HkmD%zu@y0xbUEVBowNHIP4 z;Q3{w5o_bzrbY3S5;)~QP2^92(mQi%PTy#PmsjepK$#ewrk`wk-A(vWfCw(0xF=5J Gj6VUX6?U@# literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/hockey.png b/public/images/emoji/google/hockey.png new file mode 100644 index 0000000000000000000000000000000000000000..a224a9d862c536ecc3c3532c636844158c927544 GIT binary patch literal 1455 zcma)*X;4#F6vrQHFpUTz2vKZ66i}cMWD#leB!Hk0f&@_+B*8QW#rDAjcO?l+iUMJm zMG`;=XfYuSl^Dc;3ldQSI#4!ET&f^QM$~qc(br4q^rO?6|2_A2&-veTKHRxERLa)H zSUeVjpv7UKK|8?ConK}~AimcXeuN+cAvK&9435obc>iB=q2R9kB9N-CvaRGSfIH3g zSF4JpxtV}li*gpK*J~?oHi-eZ2(x=-jR3%ij_OhX?dS3rJe}fl0Ih}pUb%g#PElR} zGTjZ;zT}%0Vl&R08tSyv!@5dABasfGQZoi;r&3&)!e+21=s@m82%A>Z$;P ze4`*8z@d}|Zt);Epr#|oL)&3W0a7bmoVY}XPP+H+jD*Yu$g{^ zG~>GoMUMqfCKICsLn&%qYK@ZGgUb(3#K85_{URA5Uhro$R4pZsF--}jX)X?*0}9N( zE3xEOg&eER@aYK8U;nkm=k#;l%rz5J=!y2ui70_U1fjy~bdP;lZD6=y=d+;p&o zFWG;%Ts|(ry+s?cemAhbS^v;3NpkSolGOvY`vuijMr_(vURU~W?Uo}mZu5xmfV7f-h z*@E5?a>|Or%K}_NXz0)YxpGCTu9)Lrt;SZA$=wEWpmSMT+yP z8wxP^iCNoWTHtMrgkThJ4rk~RK9StqfAHYBx3xQWcAT8JK4)QE!NKqBL*f(CUmg0a l6uEs9pB_%?zWe#(J6tiT47X2MZUMeI6c$Vgk_OWGe*^9c#$o^f literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/hole.png b/public/images/emoji/google/hole.png new file mode 100644 index 0000000000000000000000000000000000000000..a74093e97c523262de51b5931240370f91198096 GIT binary patch literal 1011 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&Eeh}naRt&|X@w*qkK|nE@B~}m zU>h%gxA;tlkQj3(S7U2i17j0yZEZs{3zwJ_OII)ZfCybZ12a2Epde7ads2>TY^qa8 z3{aV&xfM{5NMOV2TnBWeSxJyzFoS_Z!~Fg4|0mq19VPwjI_H zzEULH|G0S1#??8sZytNssPgu;=YNo8d|zO1v9I&C-kwui0y)$6nVtWTv4Q2f^U@iN z=LN*H(z!EqB@)?xNZb;XD{I+#q3PttND0@#Iam6oYnnY~G}#oOb!yTcjhE@J6OROT z7@3{mRJ+;txhqPe+a>5B_k@DlKQ~o0Uua%6`K{U{{Xx6=G5?`RyXD~`g|}iZ?68l% zAic^WM`OZ!|4){CvnP6TJ^8)4X^O_<4X%wJ_Me-+j64ug1T^}47_>XX8f1I<+i1%Y3_ln57_v+Tp`SU|4X3yzoSJq0r_t~-W zquRoAPrqM3u+P3>PF28N?lb!Q3Try5bU!@s`B1h0Ig_~GoT~lrn+)evRBTgtwf8{# zV%2%RE5o~g$A0Y9zpbYa6Q9k-0EYKmOnx%wna;T^`KA^#<40V>YmSSLx&p3T>yb7K^5!c~dGfPi z^Mwuj4k&l7{1@5r_Ox5B4wPWShcqrWFTSGZUjdmV^sb9v4CemC8_s>uY*7Yv@R KelF{r5}E)YzQmmX literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/homes.png b/public/images/emoji/google/homes.png new file mode 100644 index 0000000000000000000000000000000000000000..330612a230779f22c4cfcecdade9a4d162085f07 GIT binary patch literal 1865 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 G(SHYpZEy|% literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/house_abandoned.png b/public/images/emoji/google/house_abandoned.png new file mode 100644 index 0000000000000000000000000000000000000000..65339656f67c714b6fbcd82d1af3a4b9189bb2d1 GIT binary patch literal 1808 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/ice_skate.png b/public/images/emoji/google/ice_skate.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4c849ca90cc05f3e395aead55b5931160c03ab GIT binary patch literal 2010 zcmYjSdo+~m9{xVl;e!utqertVyycyJk9@-j) z8W03&Q#{Gu;LZ85)KGvw$+H(B2);z!Pjd&hf9})Y!OSmCeo!4(QUOGEjpY9&U;)^- z?*lG;-Uag2q`Z3oh>XhGy1@w`RySU&d$w9FZR_oRqmWJgm0xmCkee497Y87!ldOu; z$4`K08=Fc>P6nc(=RbgNiz>OPsjCf7+GI7Yoy`Mdz;f?Du4-z{DJYbVzHXPl0ZEqN zN_=Uh^wrz6%uBh2MPQ_ki5ZXs!K-d)9vlNB0o^z{1sDL7q6*6ZOZr~klt@7WhJ4&N z0vKr9En5JbT-@kM>8qOPb-G5nekSi<)0Zii{7dDjnxh5@^MkF(c_;A1g~U@x#f zXCp(>`K!A;0s>dX-+3q59avX4w?kB_)6SjFMB-i#4_`mO6Lk97hzKweKr`<;4g8N} zmiIv)h{O?!c_b=_BUT_7s&E`Z@E8R`N04!ZiIj_xACDMVJYt6+LWG3KWaEe!QGi&% zqk=BPu3X5oL&`~XWSogXm^?&ghsdZ@p%@(Sqw5EagM|kNV0Z{gCN9Twz!${h|0{9I zuNXQqAqahuLUy733eUYnpRe0(BsrJU!4P!Ep^nCT1wGn2{r>&1GQsRnU&$;kazJui zW5`6d2Jr11m_hF}<33*UbQ=U*z7KS-GYeXPy-A&l{iw54oF*M}l z(}bk{1FlJ;a6eh`DGk0>Y!3TFy=z(}M#o6;S5( zaJ0j4tx&y=@GWp&reV-;48269enKb1MVGm|iY}={9g{uv_-c%Ml7C4>?NLQapgC-k z0bjODuvF-p>m$>Oon>RjORd7UGuHTkuuwQ1W_B@-{QyE#2y^fGHztiKw( zyY$70g2N0RdAjAM$%v)&*H2m-W0fPPae}vA_n5dRlY2C6BX#8qN?+Za?x(13{?K@b zd^Y{gQgOfg?%SKlfuf*ukLzJHU(GFDeehP`Pj5w(KJ7amdc*p3L9vr($9cX}oiX9+ zXg2ZS&-pgE+&Im(imV$CmsCw=%`gGJA75V`XPxs!a}P!z2n)fDGiI;aG*Wt2Rr!K_JpSF6{Qgsr#m5gaHJ69zy7E`?o3lH%O`G$EJ z{B09?_ddq69hAwb?=DNrv7yg(Bq@Ki3SZ-Fv0XO8>J`EOR+q%Gzq-6Zr!dO68HI^m zex7%H8%doE8woS>xuc`;iSv&wvNY5%y|ThB%Dr)r3~nZe3k<;_(w`e%*SbFRCT80$DYUz~~lUPNpjjUkD5 z?X-o0Tx(2J73YlDGil$A*mH8!QkqRLirP67V$q_C&+fwUZM!a*&uui~>ouK9F!N;n zrUzS5bP_7G;>IAF+PuX9!5i&Tb4aAWbuA6cH<)}lw6V(9v;GB~L)}cBT>swGwB-ga zi?dj*rgoLdf;3L#^|Y@O+c#u>7)%nI`lwL<`7gW1Pta4XMQN&D4c_9jfWWmUl!pe7 zOgo&J{!qlv?HSLjLEnwmw(;(@*)Mo#UBzY`6)BavIAUDHQhG~X4_S@EIAL2TQ-9T= z__xJOn39z^Nz!r)`gYv>MTaX*wCVb!35*EzkHi{gNg-Ve!Zi*rQ@u|>owSCAO0+5vP(W|9ByNr U-dG)72`&YQ;(m}Ua-}Ez7YFR(z5oCK literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/island.png b/public/images/emoji/google/island.png new file mode 100644 index 0000000000000000000000000000000000000000..eb33977cf620ab1ae4b566df09042ae3d3e5b551 GIT binary patch literal 1788 zcmb7EX;hO37X89z1hD}DDWF79K?)=&wgIX6Ac-u7uvbKuK++fmF)R`w0$Ess(6GxQ zBtaHI97u&CT4q>82?~)QC>|XNK?^EKRAiB~ne@z@{+M4g@7#Caeec{~_s7fkCwS`X zn&|=npzrO44OCC&pAFSi^NOrw0{|dV{`g>=N~OAxh5o;gnubZq02ztL*d#(uc;H2v zr&?!62GG;p)$9KbAnvLfcvAAe#b2BeabgdZ_t*Mg0z*!>JDpD^Qq=djsAx62{+Q*E zam9^OU7kYf`kA{toHfzQX==NaT2p+cyzHw)q1qE39a|6+GCRmRo?p3}&JW{NRB+;- zchWC672YYK3Q{5_ZzM1DU%cC$Bfpa-X-X(Pb0SZ`tEPnw3*!5$Vq5=qsqy+HJ({qh zsZiR>=@fCT(&}#A%p2^^rB|06VOQr0c(MW3_5|TBI{zfEf?8f?pHb_>t@P$GoYjf@ zCI=FN0FX(9`K!ihaD`A*+>ey0lb`1#OAbHT)y%lt*BD9K-}7d?D)B|q_mmf2Mq#67l6Bv4 z&{bbJwNTYmANxf$iqmRO2VLLq%}L)|)MIJ_WzM9mt!%IAwqgqeXZB zb_+3#(X^AEb-weeSk?y*2!aP;hx_&|iA@;ED-9B-cCYZzm9bUo!!~*UGiWM>&~R{9 zs&A2hE^xmvFw~jYG>5ack5Cw#YaP$otbf@Q%ts%L#23)PJ*cGof>LVB z*I->;yk+xZam$ zo^hXdlcFaIv5^k`dVoPsC2w8akxZSP3II@)=>S9Di!R&XPcwwKD}z>zZMvSXzP#To zr}jZX#(9Jm^V(yOvD_?o$ei>H{V4O2#301a6@rHL%vv@@X}Ku`s57t6Z|PD9_>IO{Mnpx?D}+WQHTd(Zu_F& z7VGsq_+8s^tmZ_L@|XjA$5&9Z(7=AfEa}Kr9aIBz4e|{+bj1TANp(B<9hqbCd@l@~ zV?|(A#SIga%t)53SOpbN`|6_Pe>b*aR(%9+X>TZW{mhYZq-b#dgY-A-X6HKJ68wa& z5mZ)w)`@F{!_%QYN~Qx=JD$n1pZTC+)p#xqqQ^Z{%jD`>SmhJZ z)5}p|z_6)7m=uI>NHs*^xEry)Un>WCpw$vn!E#aAh&HUrhBfsQ+oAMJTl(YA?d-7? zyzQ70Ubp$f5EgWkQ&0gYu@&=h_ZwE*&sNCY(YcbA%W08#`v@g?xczz25I^ZUyoSnh zLwfFNerjFJaVNq|wRBkSvK#RbWwpiy7TR7??-)OV_WNbG2HFDiy&J6PR10UGBu~iH zJggwVoLj!J)OV~8|@dw1#EOkw6fAY7B&_Fx^$2KA2xym16< Iy9bf|FUOKjQ2+n{ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/joystick.png b/public/images/emoji/google/joystick.png new file mode 100644 index 0000000000000000000000000000000000000000..a2891008d057d39563d7f1e40440818f509eb962 GIT binary patch literal 1554 zcmaKscT|&S6vn@g1Y}AW%Ctm=Ml6R2C;^p0@9K-g}>W@9+KR{_&=}IAP_a)ujOd zkh8bLxQR0Hk1Gig#kFzrCIEo@TpT=XMI|o;`CnSAOxS2CTyMx&jI!jjei90W+ml1f zXl5ZbR#;Yd zp<*&D+9wg^eX5xcWv?^>Ar_>269nGpnRi8kdI>E`4Pz;I=+gm9Oo9ML-d<+#9zOG0EBj>&-w zh2cUGg>L*4d-Zobr%Wis!Iwm>98n)8$}Zs?CJ~8l%w6ZO003%ckFoZM0Y40h`#puj z&}{3JsOVO{K;HYt@aZZs_xHYVtqc-3UVYN0Vz2mx@nXdoTSQXNfZpqQKDt99+XRV) zl)?&6BNmj9v(#q08e;k2JXP+H zJR}YkRC$vW+r~3Mb(Vt9gW;|vYcFdGu}PMJCR-ivpsU}?BPJnNh&+Gq6Axn5Dq;;L zyunrhQvV6@lHApG6^f!XF;W`3dFsG=u-Rs+l;F0S;Q0XomjQ7Y-}87jk=@oclcA^H z(^U$R-iR-Q%7Z1m?xCRvrtYOfp9ruiXkhJhKC8kVHYK5Y8*#sN>H2t|QfL%u?T9i2^MrxZ;*N2zLxb*E4<2n7S5MNjYN3p1YV~+Rd!~qUlyXT&FVEfw?BVl4#|J!jHHOi57Mb@)dcKQNy6aG5q&-(>G%rEp?%4Jkk3+F2 z2QmWjp79sqZKGewbkH)6AtZ)M(+t-3GQd>mVjozQ5c3%)NqE{lO9NAq6S+CDlIc2a zt(_o&N9!LYv>TLk6X=XM(mr5Iaz-xO=$pXX8c)oQU{V1p|+`bX$ixF0$W zmo+$n-t$o^Y32Q_NX2QUIn|+(SlC{Wz1pfdA-@6~FVowDmbMrvQfaDizGWDpC9_hM z1yGnzd_PPr@_=7hPx>Az$b16?j7CL3THEnmlDGIWK7{x8tG4S}tTHuH&LL#|3uPzr zqOD5p9@LvI9m8C zg5JJ4SytGQ@aUsL@X1G1!D!qnT&4 lnZCHtwwi(ENgZbu9=IY<)Ad{HFc*DUfW55~hGv6H`W>%D3TyxX literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/kaaba.png b/public/images/emoji/google/kaaba.png new file mode 100644 index 0000000000000000000000000000000000000000..ea2a60b17b5ae12c017fcb8b564267c7803182cc GIT binary patch literal 1932 zcmcIkX*|^X8vo5O$T19A#y+xTDZ@Cj#Y{{Y>sYEIEtV_^Cz?dK=TC%`8I)t`&d6>Y z%dv-;ZX7wb`Os#GDN2s*a1_p|ewWX=y}7UMoBRDd>-Tv+&x`MiC!Owk3@ffA4gkQ? z9PB-IGP3JpLOXFokhKi}DuV9pMcru)zJfw?`rEz|2LHwUkJFtsYZHT57oFrtGgtRx z4Z-_I%0$?ZLvvE!qdZ}JIunIsn z$ciyO<88-_P~S|$!(sq)_rOQsLlfx9RfInSSOj1TfMuXJPwn(6DjWc?2f$v?Tc{fw zYP;2ec@>9WOq8}Z(S^4F%m!y{)#>gIi;XhBTm%^&xOiuI$O146RGkz0DTBzlPRfom z-%gc;cf`Y}$_3tgT+B7+VnAEquDm;f{2j}Cj@RxeevRSb>In#!Mn*0XhzNuTkvTKN zq;pnRIdq(_FRrc*{=d-OO(wfoda(h(c+%`CUNNYpoM&=qGOkB5SmA2wm+BtTA7?SC zro`1!E=Qn!wA?LP`mWkJjjP_GA zaxA+#`2Itpsz6jC@$rYbWxVYTm08F2NVEWdGMlMjZX@Dmb5^j0x89z_Y#HCN#u57H z>!-|?>A$GDV(Iz}ov*+CRL$3|AmDmv`Qpk@m&>zME>SE3ah4zS ze*V*EVSV3r8;2{@0x6I6ad-X0BXW$J{Kn9h)g>~D`)y&_UP9ErhQLyMVA9({x$Zwa z1?K!_BcDKH^IN6ATyk2xBs^ct5y^JFJgZsnX|)H*C)GTHNU_IUn9cgDU&T0(^WpTEbGwc^iYR zG9+hoZ zwPc_;S?+x7Ns7EMT}slcJ1H+WqhU*XHQ6Je6|1xNPhYiW5`y8@cu)8iuF(wVzrju` zBdmb&siknfBG35YNftsHgX0C!2yTg7zmb%Z~@$Qwp2~4=jw5!MIBD zk-W~KH@~L6P02>d^ z?OHK5lMaSz$d=P{q6AurWb9K%VKNOA*&`YUc@$wzPW-e4(A&&8s``Zj|6#+Ed#;CY z+-MFWPhwyeYO3q{%Cr-ja46LoFRr~d#>B*LE;R1v9R@L?fPMMIoNAxP@H~PQ zTP<`4LK8A5y%c==IfWd`dY|9%m*^LYP*-!;EhyE&@Li0>-O|Jms-MG5g6t97|{y!pg(8|t68 zLo3&&Y`z`mcG}l8i;KRjtR21^9U4IypfOY~teK1s#0|{GS)Ob$@5p2%jC7gqD?Y3j VDH8R`x7l&`E{*DHUwgzi>EGoKa&rIx literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/key2.png b/public/images/emoji/google/key2.png new file mode 100644 index 0000000000000000000000000000000000000000..37bbcbb7cb6d82903a55397eb5749ed4ae997b09 GIT binary patch literal 1089 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&%?a=caRt&^CZ;5zbPQl(V;dL} zVr*>#lrgij2a=J|(Jr1|$;rvcYQrO=fLuLu3r|0Ph`6<*Q(QuVy{lVFN=kHW98i6H zVxptFCs2D#TwF|x^cJA|j7x(2f*A}P8VVEy64t-}e}8_!`TqS51p@E?H{AdK|Nj5| z|L31KP?#TZKjHuX^ZoyU)cpPb|2IT^{_VoRz^v%$;uuoF_~!c4CKW{K&n*QVT@l6ySnk@0*jM}zZ|Kly%ZvV7!t zbPtDjnz6mp>U@EN`|2id?#=UhNw{e-?9_&FawivQyjV z9`TaCd8W@ILHxzK3Cb3Y(ZcdK*;oYjY%!kCy{h7);}-r03o4@2H$2R&7h-+!h2?0S zs7yusk+hBW+_Lw?Zn8uq2D9YfeskS1Y4V3{bFZfE6gT($;2(0Y-w684b@bcTFDY5Xo!X4HIYh!tfo{2x~IFmh|?G|a=yLp*l3j5wS;u1dnAhXN*9BfHuc{mr$ok-=E$SA~Y@X_r$fK%u_hX0o?llW!8lE>~uGSFw z!gR*t+`-STDjE^KCr|LuN?C9+!>6g2J$9R~ zP)YlRB|6U&7IAc?9AWvv=x^>YQM9aN@oJd|c8u?Om^fHhGpyObzn00Mlx1JOL_`1G zWsD_-j89r!_)c{ke>jQz0n-i!y#_7SO5OE7emO3D^Ku(l?{nT{eX#ez83TsP^Ca04 zZaME}@JSJG_}If-^1quQ^fAMyt^ZcYI_zngvxYgRhk1%&_G~r_<~0f5_%qH&9L(dm zBdVsx_(W@kyhFI6KC{gST|E`OF9~S{iW`@)=XNvLiaS_3oU&lplzN!K=b7iie}(_j z4>1IUdoXQYdZ$}k>&i#Q_1erUG(#G8JF(<$dTH{m!cKydM^Qr=`q0rMJz Mr>mdKI;Vst0I~bh1ONa4 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/keyboard.png b/public/images/emoji/google/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7ad21445701855928de877bb30aae56cc8e3e1 GIT binary patch literal 1483 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/levitate.png b/public/images/emoji/google/levitate.png new file mode 100644 index 0000000000000000000000000000000000000000..b257d1b65295a3a2c6aefcdf9a0668d12fc5b5a5 GIT binary patch literal 1357 zcmZ`(c~FuG6#qW)&Ky{$(i|;2Od34Oqw+vNNRb4>t4v)}(=A)|1offaTSF*{~)fGCD9vtYOoVX9EMg}`W z5ahGnO)i%sAtGZU?EL)=Uwk5w2*a@YvM+^9B9qBXCKCw}%stGLN~H_)y6L9GiMn8< zO*bL`_~ydZt5=s^CM%W7w*vlT*Q4RxLF#L@Bh8Xm$2gaQDKdKC8IFq}%LN%;UtizT z(^Fnvj*ON44o;7- zL5Y_rYUcKPdNXX|JzN)Xn%%`HKd#U&1*&SFDO;MvVsVn9q|KwV(OJhS7vAkN>~OaR zxr;XT!`l~aEQd!H+%pUl=92g3#%q%m3!$p)3x>9fdu?-vO%{z#@LLS8jA$Yu$DKe# zGZRWyLaXA^HKSreWh&aj(#iR2LRb5JgzlH&rqZHMv=Id9GlJ(4-g-^X}0j z?Bx7yRz4!TS_RI7d;zT_3A{yV?$0OZe_k482{(|d(8i>&HkOtuQifqqbzeuLAZzn2 zJz5`<;7BEHy~9aE)~a>U_Pi&13fRe9CsNH*pm%kzjNXT)6?e1tv@b1v@Rc93dd5t& zFgv()1@?uRbeTq54AnG#vXa^6P^~RZ53F>1bw_kA@UcXngI|3uayDo#>Fl%wSK(lf zalT}f4HJ)@cReatGw42#ZC$@1Kc)09YR7STnSX*F%R>KHV)LzXU?3bNVa*hm`C%m! z0rQXk7;=80y}YSW@R2k{vzcU!LuDrEezSyNE~hTmZk&-G#*2l{R@!w=gwtGGCr}wl z(o#WZC(HhvHnX79u$nJ@q*g1&*0*{Zn?9p4i=HwV{5O|k0Rpe98~Q2H$WpHFr$l4a z&~&1axLe;ZHPkqCX7iIb^%v|Amtku`BQvt{x*P=3V+k3#GhVzGc+5v-w_hyoj>NapQ{G=tvz7w$_fyy+2YQ_ zRHhi;%^j@(Eo<~iJjQoo?wx)|kEa$I(im52$FFM8fd(#SQfz z<@1^aYfB$wT3PZ{E6mS3-&i8#mhMhVsZ0;$q#dFzecFV`Xu3XO{)E??anY o9wctY?RDc@ZR-u`V?_@2qT1<`!1Ko+Dv{R!P$_isO;Q~6H;Nyl!vFvP literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/lifter.png b/public/images/emoji/google/lifter.png new file mode 100644 index 0000000000000000000000000000000000000000..52dd8c972a16e9496a24cda71b394889918f88d8 GIT binary patch literal 1726 zcma)6do-JA8vha+5w|FHP1UTSt@gN7)-V;~5{WXIAgECqCP6b%QL0f1(Fhf~64h2( zHZIj_helhJ7);l#u4$~gv{OMbx=dYar#h{E`|a7&zh|HGd+xvYdCqzNcnTY_!|`De6j36bjG0kh^wP20bbd zk(Wh`*L(EdBuXzOKr3*bo~M{hR#MV^Y1r(8BT&T!i*;~x^zrqDCWnQGQ-Xv4w*o4j zq|wfCIQ~Q;)TJ{RZtm`9Qd0wif}mGWkaYSq#QZKQs{Urcu-skQ=oTc*gt4mkrC-h{ zrO&rGTr4}`kXd-GA`HhDpi{2@^STjBF6ME`#%wkrQC=DVza|`zhv^DUvP(V;7SL3172?W(_J`_O82bCZw z2iZ#YXWnODEJIt%*?c@r*5$OO#P2k1=LSmLFH+q>G@<9cI9*{9eyo zR&`8%=z1nSgZiue8|0(46|0sk`)Q$iBpYmTQIAQQ&G8vWvl&tSGFw15fs8>7*i%`%9(&Fx4#G_*F+ddAk?w zIZ|_CJq8dyySm(N+w`y@x{o>73fAtKq3`iZx-@yOhM;vm(VL~=l_Z!vT}?2kEV$Cb z)TTwf&`ioqFl~NWfwL(LVald*{%F$pz9Bd)rPr5}VoXS>R~LlN?zZfXDmgW)c!SM( zRCK9%X@Q^$#;lwZ2iBPOUj+)SbKhu#TRnQ-$D1_WMi1Q*cW;qy2dH-QD_7GbF_CFi zMRzsWgcQSy3Y+%UVG$L9?57^lZ-6;CiYsJcGr19}#j`P=KH9A);Uizh?`Ufq*}&wB zL)*(s9>r{)dGr+x>^A8af8kM=pOG;}|7Kh;bT(~juVW7pyI^gjIOaS3I&2)#06>?t z>FAK=qhxLIzvtIntVNao6sI*+g#b|Qk4J1QcsKXIPxe1n6#B&D>H0?AO3l3Jf)AHN zZf5P~m}cnncGCw5sf>voYGxLmN~z5k`rjFcH;U~u;t=oke=vKOz3bJazV{6g!cuKa z?k!v2!dMjBnZGJKJUM31qaYQ0>o zH<%0M-fuHJCjLT3bFeA-o@CO8+&n(aki^@~TNs-#u6dLdJ0^VGF*h^6^XseNSk;G# z&PZEV{ay;y5-A;j6U&Bmqg-5m%Qoy@c(J@_Gm*L1Eqh1NfA42!eEz|1w~qd?4k6M& zJg7T6cz&dd^g6sGpU7Er$U%YC{$E`HH;)F<)&<^?wJ$OT6DbU#{SuL?>1chJa#GyY?8$!ItE2q?*?X4)aZzi?w!1`ad1>=_AjH+18 zwHgT`QO$L)mU|bsEO?&+x>QCIgv;>AJm+cVG@ z)ECq{P*g81yu3^L&{!+*L4vLR1YPNmVLkafArbb+q!PbvQ3=99uHHw}DUo2$^h5oQ zqV%fCjTp@8fK`gm5~gS13zpG#qM(*EW$z)fTuVhyZ(I33dH&8A|9eg#{%`cc6AY^} zy3-MJODgShGMv?cTD5Xrdj1`-S&%-bNmko`T8IYH*XEa_f$H#2CYzC2DGHBDB|Ts) zxj9wO;O(86<^3)2;a@OC?KlZ8#{QgFlm9TwalOJXL-9J$x&|XjhH+iy^{pnRb*Kl4 z{|czA_B0;$&>2Tw?9e{o?1+Wx3th{7EF3?!HxBu8a=)3{}1hU^fAKHcg0Iydz2><{9 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/lion_face.png b/public/images/emoji/google/lion_face.png new file mode 100644 index 0000000000000000000000000000000000000000..18ec861a2d2e45989d31cbc21832ffd265916a9d GIT binary patch literal 2094 zcmV+}2+{Y6P)C0003aP)t-s0001m zTvCNxQiWVnghn%>C0|{@#lI+kgJ!ps}WrJUcnq%CGlYot7TAX)j zeRpcgu9uWiNJCI000qmQchC3FT*LP@_OQ8-R-9_YU9aN{ws-QsLkd= zZu_@=iST2*kj7iOh@wgSDT<=^RBGuAKSl}1LGRz6z!4`holllvv(e&B{=l*16+HIe zziT!_w=r5`u8LQ^2Jq<^)+#f`!JTRBKs>KcyAy%jdh1~2OggON^@X%Ob>4`&J3+t#V*LeeC@lzI zfW;%3_5q}D>`h}2=6Rj32G`055W$u4aISehQl0^~;~1_oGgelD(d+)}nX(;&>?#_L z6t9ae4{kgm5GGa4OEnJAS`@y))mn<=fZi4KD4P9ALr~z?tBixm>4vksM&j8366Z zn~C?{OtkfuHemQ0`q`!rLmTV7Beu2yj1^!9M$meW@X?%qcMsS!7ewFw0Y%t2L?3O~ zt`BrXJ%AzKC0TR#fDs&p$H&L5@Wfo};Qw_G_5pHA|0A>k+ISA#XzkH9xe!ge0$9$> ziO*m=pa5@CN9=XOFl=uFWJe8}7(D>a4$dG4ppF<&lW&Y10b;oLN#e5re3KAhVVD3Z zTs*BkyqyE5Y!jEd9~=n*GPuwxBvcD}Y!h=nR)7mQ&>SO&n)K{V4wtM92mwe0;+|vs ziGFsqZ*5|B)Q|yI>=@T5(ew1HjULLxavh=ollE=m4T{{JZfM)a!7U19VjZGNxHx#P zpe8h&^LpY4usTGRDAtU$4y@~YcYStGNNa#N9~sZ``$e^q0C$J?ApYT9S%65rvARNa z$o05ro-c;Wf+5&Q4(<7Vf0%4&!#e|$*@HhzWq?^-nBW0aips8)9bj#=r%NADQH@Ri zRl5ub_e(A!R1#gV083H;+eHl()GizaV8x7fA;n!+8h;i*pd7LtjAbWNqX(E#F6U!J z*rEDUJpg%(bBrL59~BX5u<#hwlBEw3h7diZnJQBGZB$vDm$#g*J$`^CCAmmZD7~os z2G0p4%W^p7LhGppOJ`t;zqdtWqY(}x7g@gv4Xf#Tm)nI`dET4 z0^uRr4ifPg3U-W)BhxFv;9=g5pzyfZ^Se~I2C7o9EVhk+2o<3Yjw_B}Y>S1*cUKqD zvhq`{#EnYgNhxr-6CbY@?R}q=M}<{U)erYYa?5q-<0zO+nS0+SPI5sf zRP1KG7XuQvG7AE|kUlzP%{L0cZR1GD=*S&SX(HHL5rEJgzt5848o04`G#Q)#P3Ubk z2kXjsGmu1Sj}c^ybp8LwATg7%Cn900XpiWG$yEQ(*CxO?f$4bN7PQa!8swEsgnx}* Y0RKW})dAx4M*si-07*qoM6N<$g3P1)ssI20 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/map.png b/public/images/emoji/google/map.png new file mode 100644 index 0000000000000000000000000000000000000000..47a97c65b37262f9bed48c3d7ed082c2157d08ac GIT binary patch literal 1412 zcmV-~1$+95P)C0000~P)t-s00001 zY@z{dq5*880c@fHY@z{dq5*880c@fTa-1-Qi&K|+U!HU%e~}q@m!`u~z0XFDwq19s zX|c&ng0N$nyjN?aZb*@UJd1?^Y@z{dq5*88bm@Uo0000SbW%=J05EWmzd-+=fdBvh z|NsC0|NsC0|NsC0|6uPRE5uTj000ETNkl>nsdLr)mZe@Cni0|3z;JYmYOEa~=P^oNRA8t45ssFYpf#a6WMGKGIJT zXF#O5KTE(1zK~Ev1Ura-ihyE~tKta_M@^sp0D%-5`Ub3SIDo&=*c2&CyQ5)}cP*nL6A> zf#@BPuhP0#5t&=01BEtXphP>2LKK;c;1wla5g357OH~DszNgsZdL++)^)3IHvwa$~2_kw={#Ka+3;`APLp0xpQ~OhlCYtU~~3_2i=hfUYXY%ORkG z2PH8#e1P~}fQD}KUf0}p5$P0A99mG|QHF*GxgWFW3eXf#4vG({yFj$xW9F_v$xL&V zVf~Q$-g(l7YXCfMP-Y#Qz`!{~u>mTHNR~(dm>$Fxp9^mA)Px0RbRste*ydmoQHu1S zBQictz|!sXB=Dw6M6t%Pbz!3e4bE$YCc!n7Ii#ehJn30L@DrKU=&rF0ev+Z9G>Wm$ zh--*jO`~=XxUnYL)I#Sr|HBF};A>-6TtdBD+hkY)N+HpM06f!t$BBWv65Hmpyx)Wa zXV@x4#YfDa)`8v&oEoS%N4DZ4b2O!E0t{G$Z3lFq*Dbl; zH8c{Oq9dtX5*V=ju--vSL#sdtc!^{bqL9-i0e@0{lYtV59HRsjEDGZl!VZI6 zlWQf2CVr#?rdJZh#9Z-)O5l;vuL%&tcCTe(qj4nqg+O2#HC+^-YRA`*6bCdf)rQv) zc^my)z%>)!(D00|W~q2ZBa0QVE3QuQn$H{HNM`_0=~dLkcb5cgftL%tLhYJqTfh~)K0f6ki0?4;7P7C0ui3^PCy%jL{vSmAceNY>Ka#w%~+8W&y zgGoY$AxG(BALO|Yw7)ArUVzN>k^xH=iS)o_ERo*sW?&J0mdDby*Vq*nsG~*XC6H%x zlhR+M`JcIkUEMC`z}i))SQ z`aKWs>6U;$c9~rXjEzDT*JPBr+E##)ZU``rWTVhb0gkwm_iq8J?!LfT9639+4c=3k z9}1YG(Kdo!5pV?%s^eA@y0-}!*x;b?-9N#M?CuCqes{8meG!v@Pv$7wgZUGI*svpK zdYMiIDgbNnfdD1!*rg`BKt*`zk0bStfHMiO0-nhE_xg)F0v=yDvLwMTPJQ{^1lsAz ztd7nZKxM9azXW`2AWLA5WH1k;x_r9{8vrOf`fbD_<<=NFo4b1?X1XKbf4ApoblewU z`W?9;(C9A|2ms<=DZoIbzc>ToFBOPD`b!1qd%Jc~08k7AFtnF}f}ww%pFzPm&%nA~ zo8Y;gPd-4@&BQ)hGD*6T)Jsp8bt73GRySe$scM_-z;;qr|8lg|#4IlW0Dv8r-GDXZ><&~&mVb7K_MJTjf)-6iY+*ZxXl{2x2C$?4D&S%9^4}rp2^A`F2IV6pY z`sRea*{iHjKCy0kJhC{HeN6N3&BA|gcKrYU|KG#j|Gz)}y<7k9#j1ZFj{QCB_V3AT zh_b&IL;mcS`L$XJ$o;uO`TJze-+N?#E>-#e{qdhu7C#rM{@y14YlFg%`D)*%Y5bU@ z_G6~{ueFMQUL80C^s-Y)kY6yv{r?RK?*-2HJ1Fd*Uto~%|31)02mxXk0P*|z3Lxsg zK*9ci`{zL{DCloBgR2@fUZtGe z9-hc>^1fZ|sn;c+tKRzl&AXRyF=^kTZemVW}D~RZz*6< zlHl7_`FC2V|Ap7jN~7ipYcL2fGzjawX8iQ*?w&}X!Y#jjg;@%iz6UWqEn;FX0HP)* zhF{O0F?@J0%P@uEU#6JQfsYSZs_ZNqnJpY88Dy&X8nllxCM-SBqM`gjw~1w+Yfr+~ zG6tm^Ipur|(WRmr%NZ;#@(UKGFhpoB@363D5QqtCs{7o)u&qPbqCtQG$X9-JjGhN=HMLvQ>$xlI%Rsi+F92L0YM6z1oxzG@O)Q4JKgQfgGAL^8JG8S zzp-C!s#PHr!!RMx-C*~W@OcdN>n={1-W2N2WIm5&d&J~DwjB&HZ*m!x4tg@NM=MAi zJ@8QM1AD^ofz2i1rljr^2%idt$xVrBB#{Fgt_pBY=7kxB&v)=Y_ z|H}}8^60Og|5xVe9Fp4p%Ki~Yvfve#-g#^7-#nBM7M$dC_+0#d)@ZBqrgx@rtZ+!a zvYgq%G>xm@iAC7^JkuGUWHxij_S^#p%o19r?aVy$GkU>=4ZJ_P=dzik-3gws@MDs6 zfxFa(<*bnhZgc#*$?4E-CM}g0c;Yt4yOVMOvwDT{f>;VW&+7g8;US*zUn!RsYhPHj@K2b{T=a~g zD)n1b<~;@##4#Zj+2{TE!E%G55Gr(+b|e&9WXYB~N%Z$euKM6D85kdV68WipTcO z^G-)L$_6K2O`SJ=>&9g@;*%q+?3=8ve{0H84yg$@zSNWzT_?TpQD(!^6L~48^OYy; z^(%=9p O;yhjbT-G@yGywp&-)5Qs literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/menorah.png b/public/images/emoji/google/menorah.png new file mode 100644 index 0000000000000000000000000000000000000000..d618e60f658157219347e73013b09ccbbce9a3cc GIT binary patch literal 1818 zcmb7_`9B*51ICjyA*^5-wQTkGKb|&-w3HyA$&-4B9`SD?shz?TX%HjY3Knjn;l26U}f1qbh zdsmQkbgCO9Cs#Y6P`DX_`d1`T$p4Dj_!Cjdai4v)2Vy$jsT6HT8-Nn-u#hTG?bwc$|(7kTpZsut@w zk6^2>eoZUR&NGERMGJEa$32%q8=_Zcv}et%t%~7Znm4|dkV71!_YI^gLWZVS+6DrL z1M;5E&SqOsnZSyhj{C$~wrazRoTGyEH_y+_q=r38W$7D+XvMHkXDu(pPaXl5LVe(1CU7RQ}z7is^{H&CDQj<=870` zLKi-4IUo-rPdLuCD?%DixR}gTm@z!!U$K=q=xxb&Pa^hcXLmH>CQOZB)}I}ar0sg+ z(ySGkU0=DaFEGsHh}8G%XG~{A=uv!M;NnJ5|$B)=qCUVwX^o3ysyZFP+~%_(Ptsh%p24SA`(t z4n&I!>8N3Q%?<1laJ%u$8xF){f&AsW+xHSu*3|Z<%4rUgJ%^Bk#{DIsaIjhJe?;Z+ z*Hv>ZXA`w@294Y}$peow=u1U=X6bvDx_k=g@5i$6r57cm>k(r0tIZ#}4~Zb}bDOJh zu;;?)`hz}ACU-QbyO!NQCMxFi@sZ!t)l1>EA7D_Fn2-!wn<(fSPK}t@BH`k`OBK_q zG_Acf%WCT;5*-%XnDORG(A=~o92a$~IA@*bo@XL6Jz}zIXw~(#*hF55h#s&YwXuAP z@;phbU-qP!_k8&5tVjk#F5FV`1&`-ea6X<%OqBg-@0%>>vu5Wdo+_ zV?6OTjK;8R_7<6Ha{^`e*}`P06L8bDa+uP&7#9NrA3t6nj~!`SR{h#rHjRQC@k(Xd zD-k5q@S*TV29=&m+|yG*2AO?wRLG{9jFBHjo5a8kASWV@OOj=I)!t>F*>DX8S4Qg95Z<>l?wQDAe+8Y#L@KBPW!F=_hNG@#IxCj)$dWI@YM1ba!0j@0>~*ljC+HW3BBuSofq$acOGEN6NLU_AO? zBVd9k8V$7VD5-Rno>xVIhmE9n5bz37{aCOgsk#&S2)uVuURz90p^*chrh;x9U3t}{ ztpe(=ql&d`xDIjL(fQ;*$JY*=9YgPtz(f**!+2S3HK;Z=BKcwOu!G2@6jjB{*}4GWoevI(#z1>k6Fm?p zm;E9Cql@eGUr{6I=eOV@Pg+6U+SZfkIwrFuuA)J1x1;bsb%PFLS-H;V2bXt%caCkmcU49eC?S(cp$soPV zs;r@MpYQh2U^dT7u>&fjS)1!L^2s43`DQS;ZX5AhN4@&Cp>Dh|WksaW)J^tMW_4xVI}pje=CHmPM4DS)?K;&ZRb>1 z^htwA__o(1uAle0I5$NO@Z+;~01Z2r@m|e%&Uw|Ge_wBlGjacTRwlmOvQ%Ajx9*u! SLX^+x`vCBEMC?-=D(fFb(o6vW literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/metal.png b/public/images/emoji/google/metal.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5ca6ecb4fff23249b0db8a41e02d2531b40c24 GIT binary patch literal 1422 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/middle_finger.png b/public/images/emoji/google/middle_finger.png new file mode 100644 index 0000000000000000000000000000000000000000..7bab9e62d04546983c0b4c87c3175f4f08bd52af GIT binary patch literal 714 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&r3LtexB}^42h2!9Zx<@Pm@56G zNA%k^gRh(Q-Yr&szfA3EzxeAp@}Jgfy_zZeeV5Uj1&W_H==|Jk@?x6whm{(nQXue1?kQ6-*WK0Y54J&IqKDl9TRdTZPHS>_m-aX?fubm z{FuO-850)2P1XI|QQqkmmMC;jQ}Wrj?klH18QCeUD|x*CzKXZ^4~gp)=ErX6hCVV3 z|D?T!U%=1(NR4KPoQaI}f>ibfxr7^xyw(RcGv6`i$hgTkQPyAs^PPVFAFg~q_HOp( z;i$_`PoFPtz{qZG-M*!P^T5S(=gt{w9(Zu;Wa$A;O@)8_H!PR3MBHI}6U=1PwOOd( z1c!k}!Jgnb!uvX;M0QwQncM7U+hwWGIK748;Qyu~9tlR}e>-LZ+ODm95(HdaHdDq>6B-T8cxgObpvM!*{Pj8r1m%4Au~Z= z{@d*RY$d_jk#T=MGJ=Af!M#fI{;QSin+~0m@R`7MOyTv5w-WcC_3Sw>&lEGYc5BE* RZeUVj@O1TaS?83{1ORUmL?!?L literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/military_medal.png b/public/images/emoji/google/military_medal.png new file mode 100644 index 0000000000000000000000000000000000000000..905a8389249095a5e112bc32842a00436a51404e GIT binary patch literal 1094 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&oe%H{aRt&0Ig1=7?)?A%|F>;3 z-sTtpxe9gbfFxGrH*-HwB^>-YB>jD*A&>+ymMgt0)CV$tZjuL*@5^<6@09@>2uBcQ z=;SfYzjy2ZJ?#B+%HsDn`R|i8|DJXG|NZg*-yeUiR{Hm3_K*2$-=}H(`*P*?9@$@; z<^Ns``FpeQ-)5S5Qg7M9T zR>9@~29}G5pITq2U;VM?VcvGpJ&^`xChw=q@8Me9cId&>@BIu+910BxqTw_nnEzoC7WeEYs-%M%?>w?@XuQK zpGoOSdr%9{BB4qJqZ3D5miW$5n69Gc>!o>5MR%gqLF0P|iygeS@Z4+7{CWQSg@(_! z=jQPz{AzZ*AKZN4fRT(S*JH&QCld@B8w%e!zWiDJZ^wsIB4=_8W}H-;c0yNE=WXD@ zORUE7JkJC?Pih+KMBMn%9lb$j&!!d+A3e{6nMHP+H?f8Zc%D!c)Y*HwrYvCF1tCk5 z3kNpoMVK8}+8imywCu?bCWgh`>J73f+@bo6^^EPeW5s!_Pl#znZD?lz(q3=o`X&jz zN!ZqUF3psgvCQDMQ~Ks8ZlyN~eXSW2x%nm}vTxQs;uzj2DjxCD>%y6GgY$=$J(AcI z)Uh(9$g`im)-47>b;_nHqLi2Y#|GPD0L zVRn-B;q!Qxh3}5PIKt|;OMbDKQN=?h{Syn8{&p^U#*}_S;%&T<-h#j0+y1}Nzd284 z;*;o#rf&sePosYQD*nwAskdn`iKF-kwWVF>-h1qQ1=kUo$EHG-LgXfDDr_paQ|u)z4*}Q$iB}@ema% literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/money_mouth.png b/public/images/emoji/google/money_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..231c21c16112aadb36d2dd9eb3dc96075b694ca9 GIT binary patch literal 1801 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/motorboat.png b/public/images/emoji/google/motorboat.png new file mode 100644 index 0000000000000000000000000000000000000000..a735312ec644693231172ceb6118902af7109e93 GIT binary patch literal 1785 zcmV5 z&%A*!Lx-6e6-GgrlMZuY=4ZFr4tAK6J9nxyB}GSFR$E}HRsT8PMvht%%cvaB zO-@QVa{Pj*Qi{mSR}qMcu8Wx*C#dxvbUH;AVU$h=%2Q?Se-n}PISXIkWs-Xjnk zt>PF&Jvne{pd5VPKsn+efRD)BR{j_SgluU5F2{@mwCvD$^6OZM@u1xz;LB+Aau|e0 z7VkuI5QvyO1I}E(1)-VKd>M$lSTH$aKx~&$XWEZ^#IRES==w_#5-P)+WoOO5ZdGOc z1rW<&wv4`$uEjeL7XlG;;3VXqzYZaxx8c8;f8CNoARU&5FJ|Upb{|g}y&s(%qck=- z*w@4xH66=Wtd4wqbcY@JI1R*Kiv^n={=8h_*CL6KLrb^v+gTdg5EA%_PTk)9yE^a*p<(Sl>pz^edL1}@g)GC+ObFdk<>Wm;$J=!E_Rp& zhJEH^#l{8Ak1t4+cl@F#ttdVN$w44qytHf+mxYQlbv=9Kt>+R(r$zBA-&4klXFEo$ z$p|mNz<0*5vf30~botpi>`$lv^L3C+JUe$S73Bf%j=&{oT|r>7Xbq7()oa@qgwD_H z?}VP21}h@@(EEG{g|!iBNHC5XOlj2}mThp=Ze5onbFA>Q-xoO#EWjME=5Y} zNnn9v)m33HL0pu9Z>Odpf<+fav9jp4BN!V?V123}Toir@3SDe%aw$69{be0*b4Up+ zV8g{$B^Dwju-{^<6AO_N*l@8W!iXivKtM{6+KVm0L?gjBRs_f|Du&wn23cl;7h7ZH zbo$C|^O||Lzk1u}C5>QgE`g-5q|~gBZwSW55=d(5>dksE5C_57SOQ7e|0~Tpa1kC` zN+4-yYNlswa{d_vV`B*<_^iw9+;zfZTL~n^W#wVd8<#?rU~DXbq^_|^bly&av9Sb_ z^2#c+bM_G)DS>?MZ$AkndTpKQbAQ4kB}lvH{sqM)E`qVS1oFAR;7k>QNka+b@>f_? ztP>tvN+7{A5}o5a1e0tM7?Da)R9YsMK#qRV=I3RHfZe&-}m=?~s9pWIC!@d|Kwm@r*0J=Ol`_LKz za?<8gR>1|qWMo3+99eWWl@OC-|fKx0RR990-*n|yO9b2000000000000000 b005*p;G|A!`Rp6M00000NkvXXu0mjfLrf`} literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/motorcycle.png b/public/images/emoji/google/motorcycle.png new file mode 100644 index 0000000000000000000000000000000000000000..26da5995fe6a341293dbf096ded406e0eda64415 GIT binary patch literal 1610 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/mountain.png b/public/images/emoji/google/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..869d358f1fdebcb781901989e9466a312c9fc58f GIT binary patch literal 1213 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/nerd.png b/public/images/emoji/google/nerd.png new file mode 100644 index 0000000000000000000000000000000000000000..29712d83c923e9ea188596e1341795ef878a5d49 GIT binary patch literal 1808 zcmb7_`#%#37{<35$8GMp<+5pEF56tPa+Fo5v33@c%j`&$lnrM~I+__{lA;kMXQXpn zYa)~*<`$B22`8bEWW_AWC1%I@6VCH_-sk(<`+nY^o^&GN2t?UX82|u4a7W#|x5@l( z6y>&aS(v@Pjh95culqJP+jjmhkNjoYQwY7sg5QeY&Cl4i_|%9Rj0p9$!X30lp-|~m zbC?Mhj0yd>z7nzX(Nd@B5#Ef(CC0 z004PD&h4P@CE)zvNme^r5lj?x8|<0i;9dO2Lnha+8#A5yMKourw@po1WFY@$1=7sr zK^@s|ypHU6N%d8^kbTqsCpsTOjm+%{qO2Y5ZSIXrs6x#TlOc!kw~c(;(Ur6u9V73Q z>%x?Fts%51x}U9pxNDgyRKR44P6s8G)C{CuOtyX}_v0r*_0I9PCjG7vtUir4r^_mO zU<7{AU-QhL7&zE-+1sNGkE({{#LUR;ZE9sjdyxQYFh_j<9IRF6&FN%Ng~BL( zN(TyTl%2b-)mA>{-uT%7Jo?$eol?{+rPOC zEf%X)UsJ3d7K^%1K5c9hG^@CCDw}UQieHC&Hzy)7MJ-_ z{Hv^#F*IzqBZi(-+NQMx7wREfae&O=F^3kV%lT6=@szZBq7D~e)!qdcN~DLANQAXr zL+veQNaR2;iTl*W<0Qc zz?tEk*13-nlveGE!cLynekC5GsqWiTedPj3{0F1eV(+0_r%hlvAxdH zYTqHgo-X9cng5nB|L`@pcnHDkE2h7#TQ*T#84q690@}8|-$~3d%v14S5Y6xJuKAsn zw1)3d%J^m=!KM9$ao~YXjj283W=AUs4X8MFI+dL;Jcv8c1V*_N6-?7PsANDUv`)vZd6 z@8s6Dn&WI&#p8Hac{67RGvoV$FQ2cj4vV>KhzKkEi;W_>-EzHptd>Us53oMN(0egg zW1(Ig(;!-XXxlHyFoa8LH^Mc#0?6-4qB|3mJe`oD7a^^JTjTsxi~~e@zlwUt5t{v7 z9{V9hSD>sUur*ML`DlSul@|#jfGjP5ITto#hysK*4)$CMcP=i4y-zybKJgfRLT$pImb|Vz1ZgA1iFvMxTQ+yBssJNC@g8Asc2Ksf0DyBRxIH`+ G!ul6C@O*dx literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/newspaper2.png b/public/images/emoji/google/newspaper2.png new file mode 100644 index 0000000000000000000000000000000000000000..d8abf1de67c462c47d4ccd9e6fd7043dd16873e1 GIT binary patch literal 4185 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 AQUCw| literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/oil.png b/public/images/emoji/google/oil.png new file mode 100644 index 0000000000000000000000000000000000000000..c7214f901354767458e626aa93b0655fc6743ede GIT binary patch literal 1222 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&wFmfwxB}^l#cPR2X>EP}NolsO z?)v)rS-n$D%*?%_<2IkZxcbgyWzVyBAFe)n+PQxF_n*HO9XJlO`tFO@`%-lO1D&E%666=mAmC8YkYEtd zzyJUI^Y_=k2bzToC@3hh1~M=(AM$i@45?t;bE&nF!H|Q+;ZfrG*x&h|@7fmGvnFu6 z3VrIk)Zep5`9*xha$Dnl$KGt6Tq3%%OQ=5Zs?~4XC21|1dl$#VTvYJNWl`PSe>Yil z(xe$eE43zH*yptChoFw~^h-e&t#eFTwI+ynfBBc`HSya1x4#}b-rw4B=u0`De9zwx zZuW71*+uPUw3VwJ$#D6@*v2p5dbIw4%^u_UKde2~r@O*$+wHkw&SEu9_u%Ieps*2l( zFu%o`2f7*WUC8cPx{L9_42Js$Sl*>ZzW2A+IAHwu#fS4dHco#aEB!$7R^fA&wl&3b zf|>7CGc`>Lt$25k@new#-w8%b1@o}eUiGv`nY|FK8v z*PVBre5kIi_)67ct@ZCieL_JJdIi;XcTV`-XAo<4_U{pSLH%=;{BbGX3U&`;H7?u8kLb<-!+^-47uBsyE1wOk%OcYYUhpWABCesAo&dE@fUk`JvdMeWrq3#-oeb`-7sV7bsz_FlE>zuziy6c7OxDTzoW$1VI^22q~^;@UKd$c_Il%pH&SA6f{+Ihv#u58}=Cuo9%E4Q|B zluzQ!#wnloT9xX4FX5Md-sGaKzrodg>Yi!w_8ya-$?ZG3L+r<#f*Pp@-PN%ZTwF_A z1uk^C0000pP)t-s0002@ zk}3C+Dff~o_mV01k}3C+Dff~o_mV01k}3C+Dff~o_mV01k}3C+Dff~o_mU~x1WK>~ z000qmQchCpAgUAP`|H_k0=o@000EFNkl9*u52!$~UA{x#6 zzwDi=&#GLKP+BWikKezZvUlTz;DJB*0<_-5dZF+AyMD z;Z8gq9oYI9;Z~NH2_Wm!Y0eSc1Wxf)oetBIFbZ%)nAGXuCmzB@TksnpPMrXHl2Ho& zOMKlj9tbdngnM$WwV-C6zH(qdD@2yMbt`Gf}3 z9k_}H^BpwoCBh5>c9UTS3-%M{R~>B%%z&{U_lXdc6dpR_f=+r9yd(zRYORTbeQ`g62EQ(+o#+oD@yEHlyO~ z0)cJ7TuQmafp-EHi(UDUq%{*W*E@I6Vi}OE(iizkG00fG?`_!C*4MWqsdrUvqhTOf z=S9^8?RU90uvz*bMGwN=23A9VS6lJ340ysF8yu;(gkZ%7&1_+1n9SJE8K_}J(kl{aP}zgR)-hFcRGGq8x= z@j!Y@J+x~Lq0W@Oj!%N4^=CmwOy4(<>^pr0n>=Pit~6 zV(H&lV1|PPFVSOltAi~4tE$4A#14If)EO*;Wb50=`Em^`(2ciiA2xiFG6U+!h#f%f-H%ey+`E0}D(c-r}zu^}Chb6*;=({KIb_h$6;R;PS)P~4(Amx0= z^^p)CG`b3T0Ba4WRn{j9>??~%VV~yTwIaRY+ z6^71&_{QTJ5_^qqBZ;~**1E5Q^*T9o$KysJ9J+;W$Gr%$cQoHqy;Y-rl*>r=C ztg`RS_GsyA?fS7NPCW9n8lj`JOZF3|(WY4>+(Vmx_1)J02!N7*Bje56vwgItp?iqm z^8P#P``vr0HEp%x83GpK_+OkGuY-1yrvB7Y2OcKiGxowT1xeUPg;}hG9b|!NNSdI3 z^J}6FX5$)OQyhE%&jnAZ;gjz*Nvkg&K8v`8xz$=5^BUm~fB3cd8&cw7yViEj`2YX_ M07*qoM6N<$g49oy)c^nh literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/orthodox_cross.png b/public/images/emoji/google/orthodox_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..5355c810f25274482b9ed73f69c31aca3c768b5c GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI-2k5uS0Md;k|vSJ&%fmoPy>HS zkY6xE!~cN!?*$yz?>~P(LBT*`uF@d}21Zd&7srqa#<$m0BUl^++8!Rgd-vgSMcKUx zyzPD7hjkapwpWQRUnIG`?@Qc7&F7oUEk1vJo~!&S_%oB}OT!1eTEPsA|8x^N7M*f< z>Jn%u#qj3ae+EXDjE1>IrVZ}`SFwbA(=h#%`rCnl@sImiX@;rxS#jOL2@HCt%eh<* zr$+u~6mV#mXZpEkLD#i2v!_l~YhYmFP-v)QlK3@)q04^;L($`z3;}0ZHymOuxNwYd z#e8Ot32XT!5-+xy31q3h+4h2qaq@;0FQdXaR=2pa*6wPm=hD%#3fwjK;G#zrxrukY z0&dwJR_fnwBrm|QGe)6!4)=;`y#-OyGa9(=CNpUz%;Q|~p{4$J3a5et#|qj0#t#~= d0&COOhc6Rsy>RB)24L7Rc)I$ztaD0e0stsjt4II< literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/paintbrush.png b/public/images/emoji/google/paintbrush.png new file mode 100644 index 0000000000000000000000000000000000000000..e41a4f6b5da4159e525b982aa3fcb52f8f4ce329 GIT binary patch literal 1501 zcmb7^do+}J9LC=J@4mve&6?U&U?ZZyOY2iyT*vA@M`NoR6G>G=O7Z`HorrFn|X9JF%{N!K zteun8Ey-17-e-Ka%%F{nG4#~E8{C@FIN4+NWfKH)2$e~+$3y{JZV^fGc#*= zGqSg*r-vQ3Yo}F;hHm4kw~fRss|;RFOI^1>Ywm9IOCdbXpEI85K~#2-HswgGGuMq& z%G>ozbcmMr>^#PbAc53we;MOLujq|lxCD={Rn+R=L%sPl5W$qh#M&38a8X%*D4SfD zD+dM!T-#)VjhYIaI-9%SCqor>_080vImIR=os+tryl^A>MUuPaGm^z=*TGL zb2+ox#-*KM)p3s!27KIul?S35<|^&-%MIDZW0tT8&ZL<~*_OO_z^k!!hXgIo*~Qx$ z%q{9`YwI@WlzSDS2eG|T%S0PxX zRfe2q;xtx*Jze(giNffE+STkI`6!=xX58m=B$O%O;d)1 zgNViB-0`5lL@p7kw+A~vs0w3SFND<-NTwIj&Bw24ZWdDVO|8ni$Z?}sOem+w`ADH@ jw4aNR$A5=Kv_5>>k$**vSDyJ`<3D}O-r26|Fg@`fKb`}& literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/paperclips.png b/public/images/emoji/google/paperclips.png new file mode 100644 index 0000000000000000000000000000000000000000..d9d9c5c8a423737444d3a9df2deb478a4516ec78 GIT binary patch literal 2372 zcmai0dpOf?8~<*z%o?+-S~E;i>p)Y~Fl!h&tQv`0(WJNNSBzAPmB}JvM&+}5aJc*2*+jZesH~;{; z?rt=1P3HYxFoBR#O0lb-;rGO+m}d2mY@8 zLy@uzf!i&=#YGK&5J1)i$ld_?mH%sV%Yod-z}?rsH4pkVg$4&ode-OM0gCE1bAZC< zfasx9W`TyvdJ#g_9F-L5y>mA}r0O$71L_(!o;Qi7@>nuf>VR6-suro$j7hb+Rn4xE zsnz-#fSTH>CaTpU4b#e-9kd<-0GNS0&C!Pg`jnG+Cf^tN%G|FsZ#Ez=_&|G!)?Snhs~~98ap&DmM$pkTpI$maQ9Sp^i|Po4_aVi4lbu7 zO?Fusbw!pLO7~fw_iY+0aeUQmvuP?LDRt)Lvq*D8>p)ZEhcE(q3G&<^EA5*p^y8P< zK<B#v+<3L2**armvG&jRrR48hu_|l< z(p7#pqL&kJ?1A&4g1&Fs6Nb^idcd5u8_Y%cc_yY<`KqD!_d}cn7Ryl z%%!|qd?4sY1tFy~>VdyIn)mke2_gl?dFKjD8qP!_Bot3iUWS@IJ)t!}q>n@^FL|@kAKOy;N?o&J z6SS}G5>auaxb7WaEHku=H_vvj*=WLp*VaR4_QN|%R4FPG>O0IN?E zcKU(K>^|$K24xL2hJV08p`77>5jP`Zau4Pt-}2?c zE_{ng)?=SMfOJ}BrNBI3z!Rj!OBWK0de#x-SLPzN+etA3bJ5Mj5w0%uMRR2@%=57K z*Uj8xJ~$I7ocvCC;5eT@bgaen7n*=a!H*}8bT~9LSzEjJ=>$^eyugo?5&4W#RM)>Y_H70tCbUh7em+xSW>dc6MKh%l zmM@FMFCsAAaoX8zbXNSu+j+~kSUzo5t$V$Li^UjMCX%*nGTlc7_4J-f+Jopi$!)+G z!=O@^2Cu>WFPa_dVC$<9j}G%~Aai{1;vi8|t~}<3*?eTvzt0R3r$bupcqoWqpX6Kt zzqiTnG%HmtwH3kYjEpxATlc03)(LL-83rb@(|0-4Ll^+gbGsArjV!!?7swgZ10f*D zbkY-DnRVw=m(|SD-Mtwb;~;_GGUEPd+4nLmH2U$zouloC;-hG<#%=M$DZQqAKzHj7gIDeu zi{iy$H2=|KjvoD>3T`mpGuKMN`%vqH{kYy2i#~9bTBIo4#t6o~aL}G3!+RT-i0z!u z?Gd(pO$RZhxzYD_yvjLqX!=#1puyy|g9JP7CC+Z|)&jP*l;Z`r)+NQp?HvFiD&EW( zR2PTqo%zqjJ?)_Cr5HQkkm?P2o_M*TUH5mZIqR=i4aGk3|8iV^&=1UfB`E-Tyx+U* z;Y@K#uw|mGXSmlPv73#GpdCD(pUEGm5jkGVp3j1sA!y`jB#g6c3ABhWxI<+A?;J(9n)@MtVOOkWfsnYvbEG!=8c-AMp zkI7zit7j{`HPcIqNG|hXbRL`69%(LZrAqE4EjOyxyy*Uu-xoh|-e3^jXjkz2JLK-N KlXlOEb>Y9g7fp-+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/park.png b/public/images/emoji/google/park.png new file mode 100644 index 0000000000000000000000000000000000000000..468fd0fb8923e88682a8b909fb206128fe32344c GIT binary patch literal 2485 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/peace.png b/public/images/emoji/google/peace.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f1f7a3bfc70ea81f02661022b79c758f11067a GIT binary patch literal 1148 zcmb7^`&W{80LH&B7f}jtu!UMiS*by3(>Y4xVw#tuSjyH-H{7vRT3#wIOQILDGD8zD zWOe~PdC1GswA7po+}v_oX^z}mDT6I9(V@Iw(1fu+Vdp&0^ZDg@etjrO#c2Sb$09=5+#IM|YG}PfS(!)7vwdYdZfW*AHP*X6qt+wKxcEBt?1B8)whHY; zSkZO&vaxkN?UFp9Qu%F^Ca2mvbXUHq{IL^N^-bxE@<3irwmZFWRr$iLxlgjf7yRbP zRXQ`;*8RCVRh#^{UEKDt+dR?N!mQQqia6ptl(_IHWRt5|M$V^8`4t%C^;h=)Y<-{2 z!t2{Qskld8h(4)MmK+rtv;PHFw6D{fTUtS*hW8Ok5bi zy@S+@VB`F?$UN|%ZpJwzC~^*(AYVx^cg3v*re|!m7axEUb&smf^JGmR;I=qCL4xyf;C@f0zAMpWT2ewgbk-xNODJbK& zNX=Nv-mbTJdJ0e^%QyQ=0HsXE}8X3F5Ka=XvdYi0fb^8j@ZG~sJSzQ z{b>3CrlBYrI^8|=gQtcF$_8=hWT5~IVXAHwPP)J^ID*feQoumw7O)c~rWHOFP2A(52t|CNeNyQSp_8sXjg;YW6>sad6B>l|A#b zC^6&hRA=wGvk~`s@wX8IepH2`-E||S_KT;8JhryF_6D~%2F7NV7M$qF5TIz}Rzve% z!v|L$J7BXVbznUc`gqtUxB9?$q1Jjpeg8eA#I8x6iYQVt1%xJw$hW!cB&5E2G^tdx z!AA=03dn`;ir2!V9A&osR*4MYzfL#wZ5+(YMmbway-hHts>ix zdIFJ$kMA4%=utNy9Pg+7hSLk20!>R;7#vbnA!)ay@bO{i{5{6@&OQ1E*xmXta)E+#1G z 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/pick.png b/public/images/emoji/google/pick.png new file mode 100644 index 0000000000000000000000000000000000000000..8fd6623bb1a25796f19381b5079931548d55ddd8 GIT binary patch literal 1104 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&Z4B@UaRt%|OV<;RCdUNA5l|PL zT{vk*WoOUCgm54OD408a9$cy`FB8HJS+v$=!Rpe!$!YUfX0P6|>dd7D$Im`_|MCC- z|BYMsZMk&4XZMjeU%pN~c(QEc&SUo;e*5`r?~OY^y*FRJ0g@LVKLe6?OS^$?X0R>^ z@(X5gC}YdrN>rM~$?b$jVhyqK|MDJAd}xy2V$Ay-j7+rp?}SI$52+)y?03|N6tzGkz+yzfZ7? zPxx-g_~*|??#X=NXZsUxOnmgrzi5Wp<8%ApAF_yk#4g{ay73Q>{sJ{eKE{1VUZz`I zN%=3qRFt)8x3PU=rQ+WbFYeo3ntL7c7|%`nyp`#ua6wtrS#gaSL3^|IIW!(UBd+;j z=1(D3!>d-|UMmuuO7+U71UUMXI++JLu_|8WuyI&%Agk_w3fHnTzx4wj2*$?6PCmzY zgiB`Eo}GL5UVi4!xU-4#?)`iB>|U@l6tP-fOcq^`@36DU(DtsL&1>m^4GB*A-9OEL z@jqw+O1@Tl(DhG*X%cJSKBlX@8c_n5X76KC&Y01}BU{j!w?(vrVV%Qe*Ml8;TSYly z*91-|*~ls<_F4WVzvTu$$I2$&pI1$P9Q*&gT{GbQ4W9*f58G`hbBxN_!EP_cc!o13 z)?ofZ+tpk@9{4MS2mEx&E)*?TzxSXn*D2dAPeS}3UM^yc*`k-Rmq#$Ll)HfYfJn|h z9=nV3+a0!?n|~#G4x8G8ZZS2zx~unMu4?+_D`FrGon{s>8$%5 z+;x0Eh8SdAL zi#)a8nNX(`Vjyznx1Pn%bP*m_=f+pN6{NXtG;MmZm!Vet%r8BQhMLA2hVTiFCw8wY zWijNe7Ca$-;yk<1&!0Jse`*va&OC21VdnW0DbI|JX8!ECIWb7f*0JA@@B4?#2?i2> Y*vgte=Dps?Q4Pvwp00i_>zopr0L2a$Z2$lO literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/ping_pong.png b/public/images/emoji/google/ping_pong.png new file mode 100644 index 0000000000000000000000000000000000000000..c5547d94caaab395e760d9a8b6874740cc96376e GIT binary patch literal 1306 zcmb7@YgE!_9LN7aL{_L}n#no?x6-H_$C{}XVtI+vM2@J~ZL%!W@&X!aWa={O@X;2pn?CoaxB^kI>vzU^} zFthTwnXL(M%H1pix|z3*LAa|~lJ`R%%Pc=fK@T6=IH2?ag*UVuf!=da8vu_Ipz|~o zhC#4g`o@u5j?GexwXBN{Q6&*T}{}j`FCz5x`YM1HF%(FoZ7DD3)W$k%P z3g{JF;%LA1C0#8G$x(3oxvd5} z1i^^uKHkA8sF@eogl?jJ#&{R{U{0!DFwh&-y2)USdE12O$0&1p*?Urj|Nb5dDw4akW}C`fwqsN9)v9b*179qcFo`mi7FP;KO4#?ihSj?eDUuGi+AOP~7a#h>sPb zS>+E|Pbm{kmolZ|0z03e!`Ad@?+MF8d#GmyB!Sg<_3Bq=YP_JNI3>;H)93g~VeZgA zo4Oy0^8L~~FvQ=mq9j+huxO{UaCvD~Tw?jA2EB!K@nvcKwG?z%mklk;NuIpkEeo@m zuOVCB++uli5Ov#Ao`s1Vis;mx9EyNI+PuB*Q1;Z-sQ4hX{`qkWNk?el#4aKMokU(Lyj4OGrZRgsv+jY^uL3x|b12V9Suf#YsEruu)m%g*)r>%4g%QikB_OmXoy}m9M2}^16FLRul$*^O`r#*|Y z-6@QjT}-MRj#%mzu6`?>+?DDvQaWoP-(BI$Pi>AQ8HSZ~Dq+LO^65}FyhKnDcNCFc z7ER_o3e>^)Vna7Z;ZP_D7pXIC2$7NGG7oy`! zZ1Cot!a;P{@p{yQmqiaw9_?JSz5IF6UG<4I*v$mZLMz>~ws_v2bNLL z96sb`Gm{HH4QzO$ZLZl(#PHTi_o8#+UN;V2H_e*ld=niBv3 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/place_of_worship.png b/public/images/emoji/google/place_of_worship.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4b77ccc02caa9d0636d7979b5d784a2839d920 GIT binary patch literal 1064 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&B?tI~xB_W?Qox@>(!?O3k#J>N z#U-&oYZOa@{DK)291c2mk+nGF0EYc}mkg!R*-VqsPrTe_t<9oI0s#v+IRp zyZF~!%*ksh-~S=$-d27+!_po=2+J;N3?+Jbg zzIoz$<>kFWcHv29pBJ7#<&JZ8{j>TPHGhw7nX%`av_*`LduN=o z)jw70mzW&VvVl=CG<&huj_}VlwQpv5++FeNvE=tH_au3??W)T%s95*9m^pZUj)kS+ z*PDIc`M3^+J>%SP(QccEI7?IdyI<2AHIJ#!d7D>X@wCFq{EM)N-z3w$xo`h{XwLH% z*J@Bz-hI8K-TuuBGrn@iK=7of<*EHG|vwCc4 z`1C&BvCnLw#uE4Ij7HD@@bREltq)L+?5079m*G#)Nd6PC9F2`TX0|x z+n%3iW+fQ>n&Y;A`r7;xpX2Ua=UL1?U%J-!lC<0Al@_crj5B)cB-_5G-q?SHSAY6j z_U0vAF$I<)i@(ZjdG?8eI{&k!_aA-mv}b6yJW}dBVUv;BZ~NYzxCbf0ip3 zd?kC9IqAh*WOA|1GGsUsT;$lydM1N0y7~LkqsrpUv)H(ATx6PdtSUjP>5U}Ugaq!a zuP<5}?kxHr&AR_!_Z!Ozj82yq$l027$;`I#sPaGf&REZBrm*G3O?AGRPmZ~rKB>VS z_DR{5mBC`-+XvDYlrN@#Ip^xK?Xg9`58mk=I+yoNIP~q<0)7USsD@=3j8|28nU1LU zFw}fraojq?@(jxYX{H%}L{lt%SOcd2KJS%i_q#^f=ysm2x_IU3qi1%1|2Z|3W%h-} kS&7y~3v!=%-hZMhwNA<4ggjFKFfTHAy85}Sb4q9e0A^3!3;+NC literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/play_pause.png b/public/images/emoji/google/play_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2c3639ac99514071008dda2b514aa6063e035d GIT binary patch literal 383 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 LJseu?Fj@Zr&y-~Y literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/printer.png b/public/images/emoji/google/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf9570bbaa3d99cec7a6c9e93308d2b6202c050 GIT binary patch literal 1394 zcmaJ=eK3@H9REJME3DjFag|aOrDSeviC(xptznb3Eh}9wx5?I3ay#3)td~6NofzdB z)Nw*vr1G{};aKTLp|d&8OW`SJP+CfzQ_Vd0tlTwof81}r-|y%9{+s#y=9j|bdKyzL zr~qKh@nZ7{M0ILFChQyR{44+>a&??dD@T{7efgcL#K)%k|(7LY0+<+?7c9018&j|zkI z2DsS^vDJ{MpnCg1= zqKmhC15ZMerV~r-7)*P6dpMNgayn5rbs!leS)!;g2+af8rQC6UynGwrxi#OMKhsUPvt{}cju;HI{&gqq5au^#u*z^T&!mH(7iX0ZM;NkPTdXY8FGb+Of%Ywp`;7lj0 zi@Vr{f;}{k?qxPRc4WG$yI7l+yj7(8k}ZA=)S!Io-7uTA=tWDGQ&JNrKKR5jABm>l zy|P*!=klO?uqjv5|A;I3rNC;yN>3@>99Y|Fk^18PyP(rYjn=6(dCn|KlFyW>{GfZo zkySkAABOaTsB^1BObXH%!PE4nDE{Z_S^gXP(+C>}P_*rZ>za z4!x_K)U$rkw2hHWGB)04Z2f*?uQOVh&NeKGGs{yhET9xcv-Q2}qbZ6d&(FpwP8!%Q zEhYQ8q&`dYO*@>(IYGNh301#oZ*OrF=D0}e5QU`eX_mK$ViNtFDtLAQ`N0z3ULe* zu4KwJXfwI(Y2!L9*;`%l-oa&y!>TH+GFc#Xi+5BfRGB~CRI6Uj@Ff4LpkR6fqAf_v zc+!Y%tD*XbY4hJcETGaZZ{Ex`5iQ`&y{P%rO5?zvFCCRux0;G2%DWR|@z$6mA~7eGrUIta#f{kJ4s}snRQm+VdjP z4O5&WEZdyH2S(vYmTxEN`g-e;q8mWl|K4sbwz}7?&0va^IC^OeZkkp`&)yKEP{XeY z_PBHYqC7!*w7b`1CuGP_jeZoqJ3t*7iYT$s(#+_hVdetHZUmR3-^|q1SdWUlpQ}EY o3uB%J^q(!GX$OPCR;IpNB-_xss65^=g!sh3@!+y=xeH_e2BsC3$^ZZW literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/projector.png b/public/images/emoji/google/projector.png new file mode 100644 index 0000000000000000000000000000000000000000..cd06f11a21023bbdfcca721309d105d8b134b46b GIT binary patch literal 2031 zcma)7dpOgJ8{cN;HkU9~Rz|K9ro}{QZsjrz3!QVyEsN7=LM>EZl*@5xb4xAPR5p7WePet-Sm=ktC(pXYtv=Y8JyuQ!e4enMV$k1PlT zl6Q7;@DeNV-;|aR^E#ioC6;ayk?bheJ=DAZC-B#5uT^(7awk_dwhUrew0mvsBeNor z$eY>ZnA$M8u$K9RD;`zU!mD~a7F5_G_V1?_2^@hYy;{upM?9T`27`>}huI?s%X^HN z9P1~aY@SVNUVfw%UuRnM4i#BxoZoh+lB<{e6vN<%n?0z>cGS#4s?7ow%ctV?sYPMb z%i>Z0199`d=&D%3$gKDthiET%Zx8_}Z5bD#X`}$`t-dAklK+O1*wu*$b*bnw@{4loog4JEt}>Dd@xxG9)PHLXnAB`C%z2PLi& znL&)2i{QHQv%?jMo8_G_x2*yTGu|sff7<~6d@K9dR@QLaaliNuro~!-mu5=2@O#1_ z&$T|-I#Qa}_~Q1GXksy7I`79MJLKc|dwJrz_B#)4SMvAX@+0>P9zV>}JO1IMv)O}| zy)9-N*HNMm5h84lDFzU_ox6O4(YrWX=uf7p>5luguOTk%RzXa%OFp`a%sXLl|DQ&H zY#r4fT9T=jG>uND;D2iVst zxN*U+9fEY@(bIQD)Nd+N2ly)&``d^WWyek@U70drdH_CZEG^TFfo(6^A=8WA>wN+l z7OyJP`I&QWTf*9liU#j@DH>32_VnwjEh?1sy^0$bT);&x)PRmzA9zDiX| zF92?@qDGNyLBljx$8bXSX^OOTeZ~cpAm03Uo7z)*Y9qDz26#6(@n91->t!@8yt9ZG9pXQ0SDTRgJ3I@6_oW~m%Md~M^?Zd1`J#ceHH8d<&vlM7tie-m6Z#jq_kV7=e#6C zVhaTZW%<5)U6Dq%-yPrRnw>#P6fWdm z#qcMXzyPE~54^b@T=fSua>k^p#(;6@S~Do(U^dtT5~4vcVoDRH_GBu)iYD%K%>ClL9%Qxt;{m54uR2}-Z!MayH*9=cSUvPrG32lJ^{|t8D@{$x!=XE+2DvRDkjkAMQJ*2`pS^)L|BOKm zz!$H^pn-NvJMrx*5}Gx<(pKceS5ORFo2Xk@1uw(q}H3=g1StDA<8~MW6G=0g6XPXaJN3b0K6ouwMzV1PieRGKBj9anBm@a;YIruCQy?m}*JXshty7d3xil zetc#iI_6J(myPcTGut~T<|WP?{%us0&W)*w^;!7j+16}IG$htBrmYH+$)Cjx>m^sH<4KHmi54S9DxNL79b}{k~X(;yFu!hJjT=D zKXoq9(piB9sSf%!#!#DW&t0_wdOo-$$S;^7pdsP?|N9F24IJkG|3Cl#d4d1`3;yrF zpYZ?x|NH0rf#iRO|NjmC3p4~Yyzd7p`L6&H`~Uy_|Ns5xAGV~l#usMH zoH_GO-^_de6Z3+^lT2T|`ZF!|&%f_0Ytq*Ky%_ZH@1*|o3BG3R_s=?aH|0-rX1g@u zyW^!Ux9DogB@3EY2tO)Kz3}3lX7l>z!45ALi1+TBC&KC&a5dGY&<4k!ffk6m`&vm9(bKHVwKovuYTslvC@}Ubkquz(mL%ucI9al ztX|9|BH>tG?wjg(#3%dZRk^rqZ^Ju@CD&r6t%}`e-rXVWQnFq*?TvNG<&LM)n(vex7(*TBPFA8OKew0-L8DF#3On@1?$sL%rPrpSug2(!L4vDWq&< zoM+gTyUwvuyF@MRr@+!z|H?(SzMaD~`GwD!sGJK2yw9Ar^!SmhkXq{0Y;NG)$Shmx z*vMO=p32*l`z+FRPtbxB-qpeHmaJjS$oRO|q`W;km6g7KP`3z286I-13c? T%_+P8ptR}f>gTe~DWM4fyFviI literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/radioactive.png b/public/images/emoji/google/radioactive.png new file mode 100644 index 0000000000000000000000000000000000000000..01e580ddf4fa940ae219036d0339ec7d8970cfc9 GIT binary patch literal 1392 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/reminder_ribbon.png b/public/images/emoji/google/reminder_ribbon.png new file mode 100644 index 0000000000000000000000000000000000000000..95930a18586c25fc2f3a38da4a2c7c9cee960d44 GIT binary patch literal 1480 zcmV;(1vmPMP)~!)CxjOQLzobl!GypN;usQVXMCH zkD!V`H_(^~HAs>qNs=TcI-wEu4Iq7&sG$!1f)ie76RD^&_x57()I4`~|k}$_U;IQdaY~Km>Ldh;bRWfm?}S zD@a+)Z-L#Dy;tTmnsXFvQ`#Uonh#)#UjPn(ZH2&d&yT<;|2PKV&$R*&=cx%)?Q`=z z+CNqYaHh2GKmqt}E%VR5PYlb%iM2!UUD&r&@f*jr03?MVXMdf60x)so`2mpofe>d3 z_a&L%5yLmz0kBSh(}i^D>n}b4S_K?>{(=LLem0;03>5@G9YI3hZxsZ9@krp(@?UcR zv<>h8^qB%M-8|!WmG^F%9efWguF`?;z?3NfeUM1?KVJYw(1IpmsI&n~Fp>bM8<Km7aN9BFl^cSOQCg)F}!;11yoTfaRaj1S*9f z`fmen%YO{gOpif0s|*2H5o2c@2~z-;z!HfW0uX^EvSxjv$DlR?t^ef@M~_8)>wsy- z08HBd3$6nQ3;&~E_x)ef!Gyv8=1UHYAW@h^dNJ4lG2S@X<4a#MBtSM+l+!gp%~;5%-po`IEL z405)J`CGtL{8dm45+?A-UCe(3Ou#BB{xm8^SfyY0mOuKXNg>XHo%mHU`Jef%Iz;~qTum9`UDgaKuVD*3fS_L?}^?&{92pAVWGuu(+U;nuPzH^!=I~ zPUFn06-@l{cYd{>5E8~`YC7@LR*(>aF-T>~PKC}cd|_EbaPED5 z{Uyo{g%+4?0~nQ=Hb~`}f1T4WClKbGT=wdIOqogR@XmKd> zo3vuDfX;w3f+k1~`+Z@Z0j~>Weg|v=w5h*Al>W1I+V6)AnZF``SLek59?_ETPfvb( zKwE-?`72-rm`_6B&gwxq)f+cx{sftaS5f z2>cm9qp#k}d=i3^R|9?ZoCq4{*T-57$n~wa`R~p2?y!UqOqC35`kP-#2wGj|`kP-$ z2$uB^aQd6?5dsaGl43Bc`IUrV&_JiB`RO6hU@2(}qlfvGgdl>Z#(RM1f5?+A=fk2{ z^L;>@%lwK$&}#apQ1cx^(CK|&0p>e|K<^6o*%|be{;SET_kIe{wQme4VV3C~w0000-m|9w literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/robot.png b/public/images/emoji/google/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f67625235fb4feb540ca1c779f5ae143c760b2 GIT binary patch literal 2296 zcmb7Fc{r5q8h>A7tT7XE9EypLnl_`aL{zUWDZ3#$?AVV$4kq#YAL9000m( zI;U^R%kV$95Q4|6BaBS|0AH9J;|+L6YC+{MjF7DVivN6?iiVeJ%71AVikVxpGh8m0 zbBi+OPTCwD<|&t(>emPR$Nk*5zpeg~@h*7yK_B_h4;Q`Lk{t0l@lniM?#i8HQXs8(at~2D=ss#qTyzC zscQt|YDkQ43M;dr5BKEe_S(_8)bQx0%XS5R{uN=Nye8>& zEv-K8aA9?)r!$3-@y>zZ&nio%2D&F^GF^Nrq{t%s zZ+6jKZu)%w-99%GIWv!Whdvz_F%=WqPWBjeB77mcP6S?`O^bJnOPvg*@~n9naRORFO+RLRlGK$xBPEbfpV){oyTN!Vb8Ge?gRsaq*$B+_Qs$p|(HI6r;MKq6i z@vj6inZqqmH8%l6;x6KR7BM6!VYug);D0mBwwVp4!uwavxK1L z;WVT59hdtgUP?6yMQLXVgXfa*Do?XtPt*q6ohD$)j=|`iSG$!mWqj}BbIX>R_@@a= zxCZgW%i+4&_v*juruEzrQ3W_N_h7V<=ek^1gLF8~@CazcX}eYTZY=ibNpL5}q3L6{ z^?Q{nNn8tvT=CtL3Twwwau7QR&bAAob6rH(Og+J@N1RA}*&ZND4GLI!(`*GjX08b~ zrY){Voj|@7^X8zcQA+}iQ49>=_e=;Tf)$|BN0Te^tXh=JI=qv05hEl6{(+1FTP3&3 zk*&Ak<!_Nc_rYrEy`hO2QcsLsPDIm}~JybxMIh{2^^N>!Ds=ANURX zKulGD&YDlY+)VP8i{aB)aD3N%I2ayds|}?oZe^-5T5Y}6ySnINlN++iK^>(2mMf-7!<5RDQ3{ie9WT7J z%d-B4<3_0iWD8p8$0Y?wMThQ}ZqZ~{!WZ6a>K!(nz zNb!SM!rw=NKz7xc)NZF*%|_F}!EckZzh{1bWQ&kmdW?Y3&@q8Wmu`0-bh2byEpMS* z-k;4G#G_nf1uz;wb3XmZfpK_p-#L{N{e`iz#x<7MkyeiM2L$lQ=9A@JtdNBKQPr}u zpDYWoHH!-Kudn38%?f?hTI0wUGY>^LScaxCY?17JZx#xrtNj<`Mkv=S!N=8=a5{ZJ z7J7d{lvRBN*lpGCZw1Bo9O9c=tOEoDux(K_U`t^*|G6>Ifk^SZHzRC&Hd-zXw78}) zw(GoS1bNiJKmQ~@t}BwCm0$t-czYo~eeRQxV<_|nB^sVkl%JJ^85TRx9j5Pv&hAt! zfh|z&ViG%WCoTEu_iyb$$7x&-qc)co4YyZ*6@zgiQ?8DKFj;*s;<+y{9k#M98zb>s z+vb{gkcb0_X7kIn2pHF5cVJ92Zw|TrT)75x7@PETb;n?%0oCE5_LBO2sIXYD_}%z% zQm&X1K$fIV`-yL+HbB^%y=^lr+tWFwI%;tv@Ktr1nC)}$Yl6cygY+ruR}-|>b|WKp zzOam=1SDkw|DGD1Hr;uk$U`5$FH}huD@JnMT@w%Lmv3ha&k7GtwW}1_4}8Lm+g9$! z3ffM>UQ(Dl|bsg82lfaVd`s0HtZ z7_|p7cx&OZ^7-iwFnM>cE27bjOY&VYr(fOlftcWibMAetD(w8-WhGj+GLX+$O`RLN zOc>9&FRThH->hxYjeDpKs>o<@uFRYD*tQ6=KWd)3ROHe}1h(hq-n#mer@ZI<3rTZZRK*0c*dLwe1&tWnRC@l7b@{`uCVnKhaZru62&@j0bu v4OzDIg!)}$QCk7)9Td#`P-9nVQ`rpUMYtj0byp4Ew+9#*nCe&QlEVH3yYGWW literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/rolling_eyes.png b/public/images/emoji/google/rolling_eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..a6660d55aa857db9b85510432ab9bf2374e2c02e GIT binary patch literal 1268 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 O@IK;yxb_G9m45?79~}7r literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/satellite_orbital.png b/public/images/emoji/google/satellite_orbital.png new file mode 100644 index 0000000000000000000000000000000000000000..a788d48b52256231adbd2a9e770d9d7907ac5476 GIT binary patch literal 2619 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 OT;R+1_o-ZsrT-170HEXm literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/scorpion.png b/public/images/emoji/google/scorpion.png new file mode 100644 index 0000000000000000000000000000000000000000..d8ac29bdf9737fa3d2f446db8a16ef488315483e GIT binary patch literal 2377 zcma)7dpy(s8vhP6w}oP2(g+b{NKKg8W{i=0G0jRYiLAM;5+k`3xo*iNmvC6B#YDPn z3YA<+N=1=N>-SSG5v8%;e&?Lm`SYCfyq?SFd7k&{dB0xI>+^a&Ssw0APz5ao005vw zXS|mrGXFL?X^CGN&;JDgAY%`bkE0|l4D|ee^ltiz?n1`>EE+q=`(OAQjH8tiAs}Yk+(dk|L*;lAc07xiswGWzTO1@kZ2;_!G{6* zTAUGo4XK7dCzFj~e(C!m=F=UFp2CCQoe{lF+D}{|QJ!o~MvH&tKCxYQO;?r65KHd46kYkXdW(G za+0p|QWyik(;>ApdM%pTEU$B~2Ox-=JswA1v1YU%eQ*=!~9`To%I$>>sZ zLz9%6)3q(UGK*pWVc?+o}O01W9ih zGv!0{)iUye)kaR*?cU^+(BajaGD{ho0m@!u>q-Z(YY$0Xb5r0@icy=@Ca_Xl>d-go9Z5sVNzcMl_`V%^1v-8dHjwiD&mzlE^(^s9l-^OG_ z`r(%4rA;8}Tt|77cFAt2+BIX|sjhsRsqvpvOO0Bz+4AIvlm}dbJngeLY`RUoyL>rC zF~K>GPN(}rQS(>D98Uku>$;G%HFz+u;PK>QClIT&aq^_48tpWlJ`*{bb18j%w4w~n zQ)I+`1{n{{>soI!${Bd&A$UB!XvG32oD*(k2-|!Gk$seWxYILRnP_$7g+;=mD2KBe zf*2q61M#~8MpAXF+1N~@MgO&XHlK5QK8>_-WOt#~o2}%<^d}g#N@XtxmG_Kr5P9%y z5P%1o=fV(FU*j~%zpph?a)7(zI+?=`5uVtg;+UAu#uu14aBUO6d8jXC=}vzgK=<57+X)&g`?c2er6uW3-a{ z7hEx^hDM~4_Pd-z{@nw)mXp+Xt#dknW$eDCslePvWmjN~VNzSuOz)&MNCP3{6e*4O zy)QIKG$7Qe6U{EF{)Ut1ldz%>#gFu3YE%xaZozv!ZbD^>`5gNjG)SWzsE1d8+nC1v zwo)N8UBU)QF_b|;O?rkEGJ$zAaxXfhLbq=YZdu5DVI&A?1rVl?@qz-B`4h7ge7u~q zmQ>wg;@GhydYki2D|M1>?3*o8_$)9t8Q#$=HCkDi*op#MYB=Vo*K7$fqHO5k2bXEJ z>aEkYlx@*m)w~PawUwQxu2YA~=3h^T6VY=G#b5jDvs)(4M=rG=c?wqimf+v~;Sf~h zemLt+KK4(+jDXyB`tmRCx?F;TOA#pr%srMYv~&Ad)fK9wdR(`9T}384seNA`GRP|- z{89F`qfz>uFmq6lU}p#Z`Gl;vq`dT`(Hnvr<3g_Z@-5mNPMD@RPbiSF%l>ju`>gPE zMM8GJqmCiqDs*OQuQV6DGYb=Wk1w9fkf+KUBMwKA+(^7t^Apbr9q(0-%F$t|7`F;Y zQPr@+^hKZpoB8sK>WfSfVhDk0M!YC19~^7fPukRiK$uE_wSLlZ9DjoSfM4QRmU#pypO$k!E(k;xaqmIHR*w jp^+b_p!+rqjaUcKxaYIo8K*KNXC5Fry5nzRsi}Vf6k~0L literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/shamrock.png b/public/images/emoji/google/shamrock.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c458477edfa1b54e9cc1729581ec83b88afd3d GIT binary patch literal 1128 zcmV-u1eg1XP)C0000pP)t-s0001W ze?N79KXrdUb$>r~e?N79KXrdUb$>r~e?N79KXrdUb$>r~e?N79KXrdUb$>sgdlUcw z000qmQchC=94`Drp%}`rhnn4)^N}){Q2XNdeGS-P=SLE z*}n+%prFw_r4QviX;uf#Q%|jIhf~NvIJZ)74*`t;$@BttO9d#bq&*=Z&>P%(0g2wR zuMa{r<*aNL;PrMjVyAhk%1O$)ASkM27S>r|QoTMbOUI;J!2l;@Q#y`z0m)L3I6B48 zwZRH@-D}ITn!xM!FUl$f1;CL4Ze@*v3%iG9K^$P82J9P=@=Oep9eN^l0-i3DL529Nd8aVt-%8w;Ph9{P z&sE%p@9V*1{ai(S@l z+^cjFKRipiLtqq8BfTMq)IYaz=czUUdh0!Q*K5Gvlj=w_MCeGURPFn4X)zfFjA5=X zt9=<@us4V_U5a=6AJvB6IJyJ zBF*BUM_Dcp*lZy%4uT99NcoPQpc(F$NxPvd+QuHCq}d0Z#WnV^CTNz+^qamUG8KrNbOpADH41W48d-uR3Q&}}gkg-aIt%JX zx2^bx2PVCXc$h~5(|}kmzLTUoO`(4j#w807kNX0c?1y u4VytzBDB&cgI(a8a9hNCim}?v@L!~dVoeg4bP2k>YJutXc1sZU@S2I46|7vAa^ z0YCPFglZ61MXT$Z{`46%PJml4NaY=Gr{_Vo1k}kvrs$NQ8$2GV=pE-Y4gQ;DT+{+` zTQ~gowIKc14O86RH8unI{bWUi>-tsJmyh}%1Cb*z@nsYKK9)JN9tu-7P|dzVzR9PzgJN>jUyd2{nu-D;OTZVB%C zeS^z4EqrCfRIW(w6Uw&1-15}GLlbarPBo>(MJLOyGhk3si)&hmuqZhGTTEqDe4q0D zUcd7vD$V0A@jGLmQ{yuj9eq+|RpQXa3s!aIB<+24N(z59a*7jH$>l%poJlT#br&fE z`w0X3sWUQRn%La4efbkrcsqmWlJ?|`q$3)A2r2H_hW^PubUIUs1ruMN&hH3J>9^W~ zu&^}LFuufB#V&42vacMsaZg0ybg~;BpmBK}Cw4*--K^oqi&hjQ(?n0%eD7ci^eJl3 zxy0uM$K(<9krm9jL65NWuJn(P zePJ2#UGPe=9#2&#Efh7`a8{paPk=0pJb{Ka>(m;e(kKXg+@)3N>zD_c8%nL|D=o>P ztc(PRAU79)U4(M$99**q3Lp{PPlqCM$$&0#c_`Ms=x)r!4_qS%v39lxP}!$4aonT> z*9i*CI&4{+BkCzKNNK~@Ql*rY&BxFT10qMMkb+IfHdp*fg(!m$X^Wa!gfRv*B-n<; z^4hl^pm*b?iy6gKh;btd85+zm@|ATJa!TwltZ3x!u~G*NYkbcbn|TRk{T}tq*+cA# z)Q>|db~KtDO_w>Oi?!h1R|W&Z%yhG;koN1wH!xqUkfwOzSz96S2fh`Sa(@OZtgt1o z3)W=c0iwAP4&EGSz^;lfjqfny)v8`W0di!4D+9fkW)?sk(Y2{OC;QfRP74?E zT%P7L%VrJ9BU*mm#g+)=B5z(e=eU4#<1Sq& zJ*grp*%=kC&pxRVUa>{HMvvi$FAq08WTl8E`i~8=lNy=j2>dMdY6*sG#lz?ioG>V< zm0hV23;IF1YLzi0QtJU^^yYMRmq`pIL`Zjbmt{#z5_3C`*P>i1>zOGgil<>R-h2$D zNoQemH8iojI)Y%APSa7V_O>Re(@TczctCYi39cbeK1I|=jpj;;N*$Mr_T|f1;Ew;U-nM1yK*r&_>N@wcied2K6^8f!8AiQZ>2P=XYM)#o6gS z!aPqO=(Q?K(kNQ!4~V=?)&x?g?XiN09@>i{iI4Sz7=)yNq@eB-Vbx044sjlp;r$pK z)}xwGgx<6hF17;plJGQC>cwXwEQv_Y>tY@5+)Hf@pSGAfyZB_vcbbAQXp7xc3(U>(Qu2^ zjjk}hdVW?x#r6wCc)%%FQyMPqQ{s(zL Bl)eA} literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/shinto_shrine.png b/public/images/emoji/google/shinto_shrine.png new file mode 100644 index 0000000000000000000000000000000000000000..bd55e6fb8a29826cfed946a67ae3b7f14cbc383f GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&wFmfwxc>kDU!N4v?WD2HL#@qG zGs;58(ok=OhuYm>B_O&KsJzijb+)T|s+BfGWRH(ZfsGb~jh{3!(7&_l&>Ym}ynnBM;$dqMBTwKwZl!Bh zHocp}mK>;5Vs_VdO`AAr>$}8UZ>2M?QH2g3zgx~s^vGGuThM$UO1j(S4ErsHju$*O zf+weJWS5-TRnc@#fYIQK6I;V#@gfQCm#I!ZE?R#NIH~yx}%587fpV?{IFIsp(+y>>o4R zJ%%iPpxuvnIb@kcf)DJmZSZAumUsBZ=8+AwZ_QrDONtJgSXH7o{pI@mYx&QUrZ0b6 z?VMfj^X}0P=kO)|<~zF|_upjdV+1O$XJGiZJn4M*#Dh-+HofNyUO$;}w%Q0;NsDKsuE;$Sda z6qymZ&C!f9a!xd)+uo|t)|T8x8*N0t^Eq`od!2p$IOko@_kPd&yw7^y_m6L_?;_J< zx0yQ;g)_VBeCKzqB;`!HJ#Bhqe<^O`459x3e z#Vg3n-OnT}!3H8rIqP7&0Zh?Dh|9iBp>Z}aU1$Gc3#1hsO@(KP5$9+@;pAN&hQDXy zIk9F5-|BlYH!=fE1CCocF^mpHP^LKge#a~k1*YKPIfAPX3El%MxCI~|z?Oe znhx8zG+JVgRdR_56a&}@U={dOwVqRHlW>`wQbszHX$=e3z%l?^!Q5XoCyTX^lfE2( z4N3vS-$P)4aiDEoGya1gof^sgC$l{3POq`4k zWl+jxviTxz6qy4d8xc4}7Ey$YijtFYQaKqynN-T>v&bwqoyg?Mk-kWZ<418J5^VNL z{$og`GLh)BKorRlLjPm;f9F!Vlp`ZTCXURN^EnVF;^UZHj?Q7s7yy_8S0@MWGpLCU z1+=5XS|Dz2x+R3B1E-rphT4~xH@YhZr>gko?ZqF->R(fOcbKk%ab&84!~y_N41;2B3A7*ONPUixq)aygRzhHmwi|&9uU;rnH{fkHVTf z>7!ED^`i2T4#jvJa5cG&H)aMIkD5MvzOz`wKd|G`;@n)K7d?8Ekb|l<`UGZH(qAff>p~jQcXK~;+fvYDgWJ!OA@yNZ0}Wh0pq3( zyEyKGX3Q_bhl&foj``ZCdJ2A?77zB6NF9^*DpI?T^*JxtYn6FMc%WX8k4Azw<#ZfN zTWXZ*`k+@2g|FOu=csp6mt<9fUhlPC3@Q*e_6%gQvc-HkVp#;g0sqFtkQnxRffJ~v`8 zMm?x^`SFg4Jl;rU4H`eDT+3L^U*#D`-QmY7e_-SqMhVK#sfUN3 z4;%___xNbwc=_QSlj-*hB0b^$T*LH^Ew2g-Cts9PsFDP|VakB@FojB;X=t_eYJXf; ziMm-c%ZZs^zFf}Z@fzHoT5t)L1kEx+RUip4 zW==haYSW8LM?rwPjVLXGSTeu*Q87=?&6JDHC%=Qy+XH)rUXpQL1af8c8@~7 zsX{k;T?3eZ>5V0;`bKU5+VK{^^?I4-ba1R2$>ZoY>iLct?2&Dh?vRnikduLN=lg>zADHiRUd`7p;?BZ}#gU3v5j4#GQ)&Z2{rFvq U#i#uSk-rUab@p(ob7Up|13j-nqyPW_ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/skier.png b/public/images/emoji/google/skier.png new file mode 100644 index 0000000000000000000000000000000000000000..9407ff34972710f6cc170f75582a8c983f9324b5 GIT binary patch literal 2555 zcma)7XINAB7rucY5e34K5dsMiNFZTU86pq^RfdeF5|nK~3aHTng@zRf2o(@zJ3xj3 zMT-z(z<`V>3Y2YWm8C>MOtDH-lp*8xTKf3u|Kb08&OPUS-*bNNJsnWa6Iv+Mz|JyR7g|ek5yq zy+iRBXFp8`H}%jw!vn#Xpfd{e^c@V2GJ~VU;HWYJ3WnZ?=qi!z%0>vJpl2 zTmAY~54N7X1YvAuqjFpoG@zc{08uEkqOL>Kpr%KGSqV`h?~!&wExJe`ck1%y0F)tf zt*C40*e`BIH~OHglypt)LoXM1r6>`(MJ1L`rf&>Tm^jvqOg}au}=t*|}6u5=jL` z6c7|*&7rOc1nHYY|7A!3!QubNe?5 zyw<#2!qVxet<4>tY4AX0W%VjIrxCRIIfsUWG5tkh*q>Z!Y?hsJhG14EXy2X_4Yyuj zKlXkA@7lih<9f1fM918W=2nzdqKmAC<+Cj#ux<}QfDJ|F8Bloh6nh*!4O2_R1IWV4 zADq`aA0BJ;lhozPUmimk&feL3!pFWx(N;OOYk_6^{F8N;qEWA3ppX$K`n$MrbX;`m zzMe8u`p)12T6iEZ1SQxhif?jjG<`)vn3SE>b<^e{w9tmn@^f%qsd{cT@nKK31;9yJffZQnJNg+tDaqc zxAN`m@A<(cPIY0h&$GnGc?FkbvecU;+KshMCJrSN$1am6XkK^KZKwftgrW90Irow5 zPh&gk9bZXbk*2?N0PcxJ1&z_7z1}`-S%f1TnJ23oV&vBnw0bl{W;aE(0BAttJ?2B3 zbIG6K>(T}&2g4#M=biel6rSTl_qR{BkJx_O81SG%^!>9;m9rrPy;gt)ptQA#fe+%0 zEx)m`^x#*b^R=WL?bFs|fWNd_B@&AYO#=VspJ)~?gQQo`tS@u5NcXB=`W9q9X~{oD zp>M5od-24=(o0vuS=y3*bVv~4n*v2?WF8_?ZmFZCx2qM^UAiqN>|0h<6{~P>%6feq z_BlWT<~V15f4^5?i4aspVE&w>5RJ~QWVRSgf&-m))fv;Q-{$L^%-#~v+<=t)^uC~;__QSNbm9_Qg4a4!ubf*pRxwnI3 zKW{iRP7SAoFANz!j^n9O4RZ4LcA;Kdt7lgF!~PG-zLg-c78dhOuLA0dwjYD$gVIPKxpXp;A=+4 zDn2mUVvnIy(%Ejk#Nz34EG7trhq29NEe(UQk?rrNc4@+Z zL8Z2fZ;8dD4N;3XZ!5YfOi|HEi*u%q3N*C$PByBN6+6FFGFQWRq+~ZX8Xy{)g%Oth zPnN-6+ICq^l`>yo+BYie+TrtLUT&;7df6=5qW;9k7jWRZ-QwKgDTZe5XpW1?wo@UP zB>+9Y5)v@l#^73IvfkL9d2F^o;k%nn7Oy4YO?}4KjMb+Ek^^g)pn@c3N`Tsxu>fEk zqw#*B`KNVSY^egS;?LcBwY~CTRB8+M$ie z3#h0G@zX7uDPWpAH(skU%HoZVyC>{b&f;YgQ`C{_V1d zPs%ADm~+kRpK{Y#9k3|tp7Bthu-T(TxPcufntmIWw*R@aA{%rZ}5F9BGb4a^2YHFhGOzdyzJRGK1I5zCczV0F(=@Lls zSuRmeTjqur{)mskF-`S)j@0~4Hk`gc(ABk!tM?jSjow?ya%%YDwiI literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/skull_crossbones.png b/public/images/emoji/google/skull_crossbones.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f0d910d8b0a158a6b6f0c8c048098f33285b63 GIT binary patch literal 2135 zcmbVNdozx1YKX%`2Qt!7eOfT+cZQg~DrvW&gMD%Kx(64u8}CiM-{N@h|i5K25wD94_yq z5M*TopSU)_u^soZUNr@Zc;!TOlvBuZz;@W(C&vyL{{|7l{k zL>U~e=%f|D?#gRwT@!31l~j#?ogbN++1lP--`LEkZu!FH3pO{C$W`f;je~5?%y-`7 z+-7&FP_p?9@M>rIqzX-P_s8KH!wycnHKV$T5;WYt-8tS5Oh@=*S`DYnU#-Efc zWIv64B+S~S%YT&t*^AQm)Yz#Qg_r7~8ax5u z*nz7qgiP7p%r~(bhGtyXz|fz1ey()-<$^D$XEe8 zmnq%AwVRt>6$XV&gD)Yyd`;GDtYvy;bjajU*^%w@gmc23P zr59IH)^B5)Kn-A*N)|N0w0qJ$bXK_xHG59J!t!+p^f}TUg=k+|_QsmkgQ|b|v>_cJ zw3A?3`fEpD(-{P83r43@!DeNiOZenqdbBm(I@4d-p30@?pG4}DgZb{(NeS75M9HFG?acco;>+|C)Ncs&!t%iB4T)%)=) zg_^gM*%ub|ubbj*b-K1cEL*3YEoY&b4@xv3K`zJ?O1RC#%{0_kZ=CU&)AjB8`BrSQ z#|<^73pr#!hCFE0rk>8e8`g=ON89G!onJtM&;%uwh~ilbf6$v3H~FWWM373ePY^~A zT&*BuhcWc?H`EOloTH_5V`%zL;ZhL|w3?j3M2vp?-o-==9A!)(NbVt|I9G_~-o>4f zLwN+L+?sxubT@T=>$X+}LWks*wFEz|)kW}=k<^YmaWI=KMND3>MJwY|M6xq9rl5O5 zu*oVI#kcaMrc<#*O?w}N@Lu`K>0@aZ@yB2-SJlkRh&bm*tXaS&i!btI8m(3U&HS14 zv)Vxp2;K&MtVcZa0^9@C2u9WgvIXD;XaTgv{;o`|OdvZ_g(G_zX)L72gPvv&fL)&+ z5EZNS29ghmwtO<8j--G>2&0Zi9x6$ak`6=}Qx)`D4CHMm;8O74T=%>o8fG*(#7B44 z27+bXI=sF`(m)%}M>$b0GQ$*)qeEYTc#9|Jd)CEe*$dx^dG`{r)@dPUvs{1c>xFZ> z_MyBNiDRKRk7$!UZ%aSX3POD8pqm#isvoH95&Qjcj|6|;o%<1e2?8WzEZePXsvi_m zZ?``K3zrTtq&}4DDi3rDS^vh~TDz{GqG@pGe%S-!oeKDA8)<>Lx&B%hZDC6T^D50+ z-s6+4Z|Jkm;y;k;77$~Y$N1Sg>ni<1hgDyfL=I)?79CfE+b+REv`YbJzZaw26$0HIiX2-uUuaXyL{80T1}0q+2H+#345p)yGxbB zot@luR8jAOW-1L@ch(c!Sz3DBxvxR+{yox!5WLFBALh2BT89zSN9o zznCE&b29e9(DKD+J2NvEChOi4(8>uM^P?kQf|HeVmz)hmNF|#Vb&}dcI@5wCr#d55 zrO@pheRN%G^r<(c7yKuBMqiIKj8b8jYOlug+nh@;U{4ez>``op>Ndf^GogKfO$jD; z14SaHq-3z-KAS7pzVnz;RyZZclBCn%u64ar>FQX4Ba)9%cZ^I6pzh)mMSifsQ7_Pg~_o$`_8Z#m~% z$5@ulcw}rzh)o2Ad2iM+?cd=zcG4O?or}j33J-PoorDjwBH|u^oqzC~*gwkg{d{uM z#7f1^(zPb`DrKX0Gx|UguATC8Q#ib}!(s`AU{-Lk+lAU8-tM;qP>${nFHQyA{4W!? BPJRFY literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/sleeping_accommodation.png b/public/images/emoji/google/sleeping_accommodation.png new file mode 100644 index 0000000000000000000000000000000000000000..c6344e1f870091f73564a944f69d5ea387ad4ca7 GIT binary patch literal 1353 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/snowman2.png b/public/images/emoji/google/snowman2.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1b3c3287b5b616807a132643836c20e4b825f5 GIT binary patch literal 2012 zcmb7_`#%#3AICSlF~i(%J6R-j7`d$wn=@>hB_gtF&ZG;~DC!Iy!>Ao0LJEzPxrc-k zx#V`-FS!)Cgd!DYx(wU1=O1`p&-uK*pYQvZ&kx`4PoG=v6c;(T790Qo$dQNy4+*3H zYiW>V3uf>9lwjJOe9TEg?6dd(YTO$?obOyt9$kI#c0IgjSjsj0WO_sf?rCnhE;D=Rr14v9qS>FHrG z7<4*4Gc%LV=NA+dNMirL_7jhqVQs7*^;(yVS#gTZea~V`$E~tnT7=%(@9IhFa*mLE z=z7(I;t9Y-KWthR54fWlGs#F=g_-2u|0%TD!zKoD1~-sQt5}V8mtSU zsxxI{BJTCFugb&cyu~+}8eY<*Lw9fgR)c@dATPX&CfF4wQq!kHT)XsgQEX~Gv{6~i zThj`N+u9QwT7bNw#0+rNSJX=iEl3GXZSK5WWBcwJGwLZ)M$zS9q72jses#T{)}`q@ zZ@Sm6WaJm79+7j%`L4ft&VF;9T1(jOUGbqt6tapz{XyUk=~@@WxJqr`ZWJ^W8U`1R z?3PV55ZqEo(3HX#2ZlQQp5?Fb3804o;a#P+e@M}V1xX3%=u&srOt*VQmbA+zE@>WW ziCywqa|0{3YQiP%d83T9(s;M+A-t}vbWH^>Ex*&+m^k;BRO^@Had@UUKG+HN2?<7e zEI?>&;RrvZ6cUNRLC9}1fZjkj(P%JYHoNS6&uab~-hw|MQL{*_&5i!~R09VvCK|-; zgHKrJS!epQ`nuHABe;-P&vY`eDHz-YsI=S6GKE9M=IB*|h18_-vA=Ngr>NqRk^45> zSDG0mn}ILrwAy#2#}7BaE*wc&wELov2kqR>*?z%omW&BQ@6wPrhVnk_bGV}cGKdA4GGBUZ2N;ANZ=wS3ei{(Qq}6tmDeUX7AD2 z9IK2V1VX?fXpn03&7{4`Lv7|nU^#;k?(^>r6rXWx!wklWu9;X+;c&yc}XRoEY&ivdH_N|ShbhwlYn34 z{c}T+a^8_h86$_H^Gi7 z++#k9syyBv{S)=zkNZj%`*mCIJv{wFi?#kEs2QbsANPR~cV9(?YLKTA^&2I8DlD3V zmcn;cKK6OtWbPF39zD1j=AIcz3LH`|e+D`^TLm>ZwZiofCUh_yQ7Rsy(>^ikwIICO z1&o{n+aR+l-ryuguZvB!LGG+rfX3g`utvTwd*^hnA49mvN5#gjr)<&{rj}S{AxjTX z=A_7)YHJXGNU)23bkwI$WWPZO2VSZ?Uoq4ZmwhZ{3MW z9&*qrY!tJ)zffYQ&!y!>s;7{HT9#znOxfC7ud1BXk&6|qJjN*igNeSm08Jd~6J%_o zU5vj5+HxtWWVZV3#~9RpxvLzZVV+AyHW44mYBM>vtUQq~1zrxO*t;lN^y6lXJi;sL zD2gr4fuB0UIMRnc1TYfKom~+YRN$t57q7S%(~TRt_XqeRPwLE-ZkFM~2LJC^SDkZ0T^XTl7k%LR8g$d;-%5EXn?+ zGf>yJ25c4vi$lgC*svf4pN>rxosd(V?YjoY@GTe5B>Udz7nZ%yDIKwte=1iziH^|- zdyUZvczoxs?_g>=b7RlRqrOUBLyeQYR~|3~Zof>Yt!xeFKHlaoua^Ha$?uPTmws_N hVD8a!)#)FUZQDYT(%(!M-C#+H0Z2|1Lb)R?=0A8Uz?T33 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/speaking_head.png b/public/images/emoji/google/speaking_head.png new file mode 100644 index 0000000000000000000000000000000000000000..3df8c91a9b49e7b8757748020a6060fb4f00cfdc GIT binary patch literal 1529 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 Ve(Grcd!7IQ002ovPDHLkV1gJQYdZh{ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/spider_web.png b/public/images/emoji/google/spider_web.png new file mode 100644 index 0000000000000000000000000000000000000000..89dff1e576f579b86c41d7e689029923955bc541 GIT binary patch literal 2329 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/stadium.png b/public/images/emoji/google/stadium.png new file mode 100644 index 0000000000000000000000000000000000000000..55151d4b4167b24fabec94f77b8e38b9258e2e43 GIT binary patch literal 7475 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/star_of_david.png b/public/images/emoji/google/star_of_david.png new file mode 100644 index 0000000000000000000000000000000000000000..7109e573ed7de1bc9dc86e233c63f3216c9f1dd7 GIT binary patch literal 816 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/synagogue.png b/public/images/emoji/google/synagogue.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab7aac9735c44a13f9b4271f9fcb3c4103488e5 GIT binary patch literal 2145 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/ten.png b/public/images/emoji/google/ten.png new file mode 100644 index 0000000000000000000000000000000000000000..43c3ab79a36113bc34f91671a647a655781da3b5 GIT binary patch literal 1214 zcmaJ=e=wAJ82`SO<*;@U8P;$4ao4mYu9{8DDbdB!W)P$uQ&Cc@lyeqqDZAO-_uiZP?`H0v`8?0(na@1G{&_0s@i7Ez zS8D(OA$DJM62|b~ZiU0*s;XL#5ug4gV-Jd=hC#Rg!vI-#Ct&Sn(7&Lo_s0~h@gH5^ zw?l93B%?g`&S zKRKl8xV69j{tZWF*opeSp6T>UwS$vOjZNRU@KM=B%DJ!c*Ppv&W-W&?!H$=IlKbzQ z$8CGu!ObJMwNfe>$;`Cuwhs3U=Ahc9i=yZcUdIxCo{P9nK_n}1ua&#J8eZVGsGpZr zP0~mg^MA3Dx2ss*AGY`MO4f=cTMwx3&{inLuT>)wZ8jf~6=YX>YlNx6R#%fDu{2VcK+NSRk^pOm?8_ zcmylXxj1{v;d600WPvuQG8idOkVD|1z139narXcSb_(oB9ys=9VdB*15Y8oK19uXJ#EQ89jXAWc|523TMMBE=5w_ha*D{>rPCV1igWorUYuchAk@s8;~YPA_A_%ftbK0L=zQ zOT!8vT5_qNI3U_Ae7Bo8WFXuJ+}uIVGH{M4VwKu1$hSJ=)O84c=Js^vfEN`>bCkH5 zBVB=Mp%WeuC%4|*NzZOE#E$2E;ftpqeyr{Vupok8RNEc`6LQ8#zVe-TQumxh(HZ9g zD&?g^mV`j$F7dlkqN8Um9mrapC>Byp|6rr0zp}vg7XIfA!Qv#oJFblzA`suG8!t)U zM21~GDPB<3wParhTIDq-D{GGI3~;8EEIc*Gj}9l7so;#1j-6E4VZLw>w>i>>ia7WU z;%2t`B);FaM8MNdnv~uqO_aZDE*yA3t6kxiH6O_jymBm6I9t6t>|Ol$5yk1fQ$??0 z^N!(EyY%CA+?Pgg`PtqC8ahxUGMlM5TNDE?p5!kP;6C~yf3&7ZyKI+@9t((OXuD>j8s3>GwSBX0p_eZWrP^*;c)d=dA@S*cT!xpR)FX~FAQ_>!aMM*0O v_0iN8+?Q8SntPPOb_@HD-gj-!tKOOkZWkXel0q1eD}p`&)$7lb@a^BcOU9kY}$1C;;&n$ziplV zuGHpjj=}eROWxOc_RgI4EZ<^hOZvga___tlR&|%(eevpimH*6L2d7N!yI1URqBeX} zM?S>%j`iD*T)+MI?bAPxZ+x7Py!rISFNka6bjgAeUtK*q!^dp^%9 zfau~~bf*yL7l)D{zhH)d1rPo^OlUX&bmV^n5P=&AT!6|c{QqC@|9`^&{~JE!PPSHK zU|_oF>Eakt!T9!eXV7W`k%os1%ekuy!XNF^UJ$l$-SzMFtFtqni?F2GpR_ppo#`ic zXQy%F-_&Vu5AYw~HiJ)@eS&e)sosUDXGAtX6rZhW+Stb#oWWuna;{nPO3ZnFru)SU z%~DUb1av3Gc`L1G?Fv7@<}S?@&a{uw{GmqS)qTtp%qkD7d1Ntft2jKZjp5#=GDfun zEDLh)GH%%XjB$5$_I@s(22KOU-@l`n`GOQLG1oG-FDhH1`@rK$-xk&m)w#PLe(Ze4 zU~yHpV43-YKTdxlE_-G$fwibT`1I-1t5>JyuwVOWQ&3x5TU?xcju~kB3xqh@{3{K&M!)Jl@Bi&KULOnESfy;<3@!- zM=i7k^~T@qBK4(P*~0-%|OWK)a^%E#6lr zI=G8YpX5J_y+P*y)5>37ub=)8EtHx6WB-@>wM=_LZ_E9cUp(0|K%42Fph!Tmk(S;*GPqpMZgTe~DWM4frez`z literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/thermometer_face.png b/public/images/emoji/google/thermometer_face.png new file mode 100644 index 0000000000000000000000000000000000000000..c83df33be89ca6bd323293e78c5bc52d8daf08e2 GIT binary patch literal 3029 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/thinking.png b/public/images/emoji/google/thinking.png new file mode 100644 index 0000000000000000000000000000000000000000..ffdaf974ae8276f21666654c81c472f53130bdca GIT binary patch literal 1668 zcma)+dpOe#6vuyKW{Ad!MCKZ~ZmuzHKen~GZAp*KTP&%io94;m(#ptftCUO18x^6H z+`5odYkE%oaZ_J93Cxblcu_%IsgEg6fz-L zLGG`DD=Tz*C}%-|7Fs|EQNd;5nmREoB*mEwIvv@C z8LoCco8a75d-@U0NqVUU&m2S{4s{vZL0teq#gRe)LlPigyWLZj(Qp--E{T&r znJnHeF2AJ`P#(HDCt7^>00VAXaUnrXLRcWD%eelY^~o|iG=|LUuS?p+Nx4B?nIm(} zj;gYJOto-r_%_}^Q}Hj$P4A?)7We9e=tyou%3qO7Gfy+oRa*@zZ$}9`4qubL z2h%D)hYb!Ry*lC+LFD;7(%?>yq2%xvga=!VGK8buoVe#Sff?7-%XG=@%M$MGnS%GP z0<}kwE94sU29!+&Y?GhT1>b3v6Jg#j0nhw>wP98QdY?}8Jbsg3yGWt~P<_*9f4)Is zZzM&|Q?8X^ak54N01VrhR%4Zsc!R{Xe0vm(fbZkITOnF|<}L!^`!~V(h>)(mCmaup z@8-Rs^Qos!>JmG~@#=adn_bMSp>Q93!nWc73As_|u%G)qMGY0nh&UE%VGVm58VBW` z=V!CB_oBLK=q=5_%{@lL8?b)EL3?$55K1#v8#AMJV7suvD3lLxwYM!KE%b$jeRN4v z&SPqD-;-1}h-N=O=(;-qe{!xIg*1LO7!qG^19X`87fqMKKBONi89tOn@-Q$jg{$sF zbJS}oL)Sp|e9zQN3iAe7x6pEa#X{P*>#)%~e`%2_gn6tIC)FPeoqhNxlrdY#s=VXJ z1}2xI)Z+ry9UHgfgu-#Xv|Ou)!YI76yK#-fz+$?Nbcg2^Uf?;5fXD>UM0M_t$#`q! zy;>R31Ntvz>udlL>$>+xwq0uO==z8nb*x%)x|QZSn10l%k@mEUQ)9i0af1G;?_T0e zumcK~J>2PIgkcyz{IULWJFXw3l+v5=zC=UbWYNr zm4@X3c(XcTo6VAi?q$x06ID~})(3DX6RMPjp*O&<7pj1mHi!Nz+-3@wRS&qA^-h~H zwSYGy$VD`WXqzgoS_wf1361pbqWg~y=o)4vAppz!M)As7g}crX+174?3#&4kOfG;= z?d6dgr*t!W?#14m(eX2r=?k<)Gap*1LY{#y@D@0i{||B zow4tWwTO_FpDs_##kWVeF>E0X-W+pHmN!5!`WgKo*$=)fz;pJBc zLfcvgsao&c4n*`cy4{Lr=o#Ul^BtYr#Ytu*N125U%sy=WsqIUdpIj#ftMr_muY7U% znlocDX7VnZ0htxrGejozf|(evStb*WAVQ`cJR3DRPiC!g6nWsy0}p1RnafU@2{umf-gKP+|#pXP))AuABLF62I`$~_TCn#)~1Z?UFbR5{KX zqD%rw7x|Z(RMn^}&Wt2fB&{Z^O^;xGQtBWks4E^DeToJezIPH4%0QZ~R&l(_KKSS*<04+9ip K5TV+Knffp5Tl*{k literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/thunder_cloud_rain.png b/public/images/emoji/google/thunder_cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf859a12de39b5c640c74a33bda7127d8baf91a GIT binary patch literal 2234 zcmb_d`8(8W8=oOVmPlDbg&dXbpy;)Yp|MOD%UI@!&>UsoIXVf4qE|WzMcIa|kt`{q z@trY9vQBSVnqy}ylgVxt-}CKs-gCWw!24YHb3dPZ`P}z?UH1>qza6kvV#0F5Fc?e> zV~uu#-o$TLh#%4$llOOFFgV4**4Y9CK@_m?{}nS}!IHv2lm9MjMPUT=ue36@#@E?U zyLAq4V0AZ#zGg>VJpbPu3ksuhdShXm3vr=gLI;>#E87q#o?N$~GN5X>uBFsZtV{2f zF&zwu6*Ajs?CfEPh7XBT9% z*&H4R;HHgk@JQ%41o$E+0uSa3eN#4&@1iaEVo zb>KerD%uA+-FJXaH;wa6I=^MEI=V*!?%1wb=4PXH%Sz8YGI^Ks*tZpHQy!T+mi1}0 z_SciC0=N1++iqT#Q>Yk0?O`b`uf$-jJKH!d(R zF!a3}vE2(ucYmEy|Lc=c<>{DKS|{F~aDSLBurqRwxWA(Q_z6LLwxs_~-GPY5(SFB` zn>sWMU++K8xi`ocf4K129b3vx@oKx->jD_*gPJB{3dbVpGbgbWLP3d?dxcVdmF$tm z21h$>%#HLY`K?paHO(oJ{O&!S`AHFlJ=U@;1rs!`pBS7aj-`g<$hB(`w9dCkka+r_*AVP9bpE^D0J{b3{^ zPu74Lk(NS}jj>mV6pUG4+@DS-AYUkSVULH7YmUD>ni&x(->dfCZ3qw*0eY7Cg`Wre zJgTZEx@kWy#o_xGH^mR9sXqK%mQk2u;54KkfFF!Ll`mfRwyk?_!sn2P7RD|CNxeOU z)02LC>#ptRtER=nD22dLcpGe;$B?wNC%b#PFdB2sg~7O`UwWG)@Q^`dEDOT_%(*{o#9<8 zJoA%ReEiI-2@pv4_@Sr#g(-MJ+rP&OAEp`c_@f)6gL<4-I&(*KZF^Yt20x?cF|dZ4d&5{ilhhvMW`;|hL6`V(6C zSV=`HJX^&QS&xnSUjlgK?Fl3)_+=~a+%pW%RcBAtM<_JK+#FX@Rm+w|nU-JEIjgC6 zKVnmA>j0`FbudG3X~E-$jv~ze65P4!bS)`=iUre&fUDVk0CJ~UFyR(hlj;FLC@dCc z9|m`|vdace4Q31uh_=8Ul|RMB^cQ1Fej6MRXo2}Y9oMv9kTT^%ZYT@v$&iz)p~@0ZGlmH=3n!jdvg8BTB4Wkds|FmKE;-`nfp2Nbywbcc38csJUvOBJ*rE>8+%PP%B=F~+|b17HaHaRQ*_3o zWmd~J9TS72iUdv?PyGuJr6Y)7dQcW6JW=+jpwN(zr{HZ*L5Io2l6K=~>WpBTzQL1k laolgW_rw&0`NX@n`FjwGN?$K0XF}f>3}b;s*P44L{R!5gs=@#O literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/tickets.png b/public/images/emoji/google/tickets.png new file mode 100644 index 0000000000000000000000000000000000000000..c61d207c75cbf42d099e8a548f99bed28c01f725 GIT binary patch literal 528 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 WDX;ve#nJt}1$avbix=i3#(x3r+Vt`O literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/tools.png b/public/images/emoji/google/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..81401c5680ba99c129d70109b1a3acb2e5f2625c GIT binary patch literal 1675 zcma)+cT|&C7{b$}8IG8_c4C4yQ&5D|d{WSa3cwx0IizUR5W=RWUw&pqefKW-+2?qg)I z$^ZZWBVQUdQ0u}E3yIKjZYX~l0ANVQwq4%Z$gHgW|4O}nx1m?2oiA+Znw*=5AgKM% z;r=(1*^OA~!0W{H04y$o7Cu8^58Fk{CWt1PAt+s`TC4sGjaY zxyAX+pu?HjB7Rb6LX!5honCHQ9`K`RDctF+rJFPHyJR8%XnI;=oHmN%c)P^MwVQtx zT2w~kaJA9d!}H%}NztVg?OO!@5J=w%7?XK<&4ZA^{B!`71S6F6DjoiDz;>tF|WW!uLAoO8+i%r~3yzNkBQp-D`*C(3!N{Y`+a&!?x~( z5aISEbE{Gizz5lzHTcKYuTQ=g*Qcl4_{>8J!*$UzVku4MTU%A$8b6Ne80$(T^V+4S zG4_kH_Q3`rrn_=h*u8C_>r{l5hlY>9nQ#YweVA1BE&(WKnR51@RFSIYZC+-@Ckfmx zVqyB708>t++sxJi$YL_5DdySjdsGcvw||}CH?BXwo6z56@6&sPL$e4u=uFeXH7wi`s*G z*6RcKQ~XUY+0&Cme{DMP7^eA^Mkg_P6 zs8U%qh7>j=B95zV)IJ2W*^Oh1M;5Pven%X})q4*FFCz}!cw}^?jEHo~jqh7+7(jy2 zIy99Dr^|>LxE9*Uoh*cZ4-bn=j(!-P+Izfi;)@mug}JBt%~qM>{ry1WE$#L0VBjjd z?=C-)|LHw@SBwW&jFRn#!`7}VoKzQyuBTgG=v@q^R!Np(K>bl1V=dm%=2FArJJ4E# zE?wG7mn*;(Kk^bFoL4XhJD@olK(R(_g3a`%_ z-RyVy?C|+{(IbcH7w8l;YIH%?$Q~$$>^Gt6+m~uSuR&84BN`I%?f&V7k-V(e(z7}X z$~nO+GF;pi5IVp8XG`Cq#DadgtPHY2eOkhF=#-E)B-<(Rb)IwFMD`=m-o6J|)!76> ze%9XhCs-BFXB1CU$2Xfsd|ii;Jeb(sN*oWZH_aFq3nFj7vAI1=ppDQ;k7N8>G?H3P zRkNy^x#g>V?A$bWrd1)V#KoDYvcXK*1h;$DI=QRC>`ldBf-*Cns2jmhizi^}6)O&< znk1Q6OR&Z>7-UJZ=kMyPxO*ZW=ig%QxGz3AiX{Me@_~TuDa;Yh_Y)ihR3(ACm54fB ztm3EMnwl*k*7S*b-mb&6h2r=*uOf5djW1(Q_i>2a)Ufg9OVnNuSRyLca+2*j%_bl{ zoBFIQ7cDRz6EBWD@4LKa^#&d?&{CpLlL`o?s8+4f2B!QX8eiq;&xx=vx3 z6^WmT;C5zE6c(m!tWK{bBh)?K2ktkoG49e7)(^U$!tse*sshIh+6h literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/track_next.png b/public/images/emoji/google/track_next.png new file mode 100644 index 0000000000000000000000000000000000000000..904f3b32f4bc105ccd8965f85767f63d06df54c2 GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&83*`;xB_X0gD*)!4gO_+fVu=r zg8YIR3>5y)7kJ-rKfqysf5G|n3H5hddl?uQ!#!ObLn;{GOlfa(2oz!dem5@e_y75K zSLGG7yy$#4D_P=Q`*-v6pKV}>Ps}5!F-C|xM5y6!b)M}mj)ss2)yb2-ADhHglP~{d z@7yg+mO9)ABDXRXMl$HFb%+sbsLo`4w28sSQ(Is<>w@sL4te^8{0xl_5n_#dw=hMR zv3OnLO1R095vwzSeHw4WO3?$G3=1+?H{|eytYnzh+vu&-kjk0h$+AI*QDrT|pK~?` zxDz6UDnywgrZK!*DsW&E%LkQKpg79~fd{M`beMa>6&g|{6ZE4L^iDG_odk3TqXXBA zbVlx)t?BaY42+B-E>DI3ZePu|Jbh;70k_}H@(ugj{<%M?Kgw+9_Wa+EzsH(byf^80 zUh+Lrl<%|0l=<0}+r{z$KRS-JhuAIq?D({>afMj>Rl9ZHTU*!X)MU11TgSw_dKEVP g`nrAn9T2dCQS^<~oWQxC6hP7D>FVdQ&MBb@0PvvDY5)KL literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/track_previous.png b/public/images/emoji/google/track_previous.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2d3c48a0f4baf44c27320d12c891ff457022fc GIT binary patch literal 501 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&83*`;xB_X0gD*)!4gO_+fVu=r zg8YIR6b$|g%x`$_a6e#wf5G|n3Bf<+?`B|NOz?DZ45?szbIG!Z)sTnz;>9i3ZoaRN zYQN{Z&~EO>rz>7DcylPW2snX=rs+%gu02)W7pbyS;hUHZbJk_Hon|u3zXaHCGwg5J z(%oFjzQ3VnMKe<$W4bW=)`t=o^h*s6=qucPl>n58xq6VXkI`S4J^irZg7>c;Fzs&$ zage_AKq5fe-tgWdu?@TvnC3MmAK3L-`mwGa*xB-VcnRt*28e(_KI zFY^1~3;yHj-RXbY>{b3vKl6Xet^1$$H_e~%W97{GbAG+t$*)o4^4M8R{_@NPLM~g= zS>?li@3zopr E0590%Gynhq literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/trackball.png b/public/images/emoji/google/trackball.png new file mode 100644 index 0000000000000000000000000000000000000000..2de9f53c98bb5e18b4bbc866559826bd6c8fa16c GIT binary patch literal 1936 zcmb7Ec~sNa621wEkOT^>G&YN& zhd0Lq0Q8u<=>CWmXhcT~(X)zk3jm-B*t_@bL|mu;6GsBTKHvqf|VB`NB$r?>C zR|h6p!#G=bY`up6U=I^WP;8<(d~5h48Hy}mIncOB_9RK;A_UP@0G=^{8HTV3Xv$Bl z)9}+~uoS@iK+~-jXo3hq20gWeoea$&q~YrWa3~i}HA4jR18}k$zE6Pp0LI(G=U>3F z61b>>vt96A1Z?@MPk$QHWO{m9E|*tTRpsX9c6WEfY<-zb#^>`H3`SU3SaEUj@bIu^ zojZT8>EYplM68*6!J%jnp8?KSg8Ukgl4s-}Oxf(7o}P|m$=m6mq7&4QfuINuhXZc3 z?&($~_RU@yod++J$OUl!{gFRrrWRK~`Ze(E18AE#JNU6d`JcY|CD1$`6&0l!+6cDC z?zKl=NPNPd6#%FLE*r{75?;GYuhc+U4xtNADpSIC0o#CEu0+;um$*m~%caT$BpHMP z2xX9m_^{nTilloH`3p!)gLbGX`Y$9(615z;{0Y6E2!!mvDdf4_P*hk0fHh^(Y5U?( z6R)wy>s*XPq1u-(?og~;jI@YM*?a07qZh{yJXkZ5DDWrekuD8K@7KlW@6kLD$AyT*zV-=haD@~wOE0dXFjWX59}Bxo?bW7W|hFF zKEpLoR(XYxnD2_dJQy#$+4;h;hkP$de*kCQ^kOZsxhv*h-Im`I7=iu8C2h}rrz&I4 z>uvjW>&+QM%Ap~O*CXLXTS|x`GM2};3Y;`BOKf0HkrTt;Y_PCs5xOL*wM~xXjlJCD z)AQBVLx&IJf4pD@=Q#fVbUR*@^*EJZ>-;?1HjtHk^}i-!S3lZEVv$S z{(IRL^}s>8O1VNmeek#TD@9dKwA07Q{}z|fi2bqI*Q?8=v721n>Eh4NoeHgY4B9dG zY~tj$>cV8Y)6(=Zr%~_0kXHid<@EvLoNfPGb<^OMfdJZPS=VxFBkns#f7EsBAOA38 z-X_h}K%XIQg&+*MfrdE}e9J3-MB8O?loff4s} zX*8y%$G6xu@0jDo7NybM`pkFo!@I!cVFLuqTZJ7G~E7m*@W$P_)TrU&#vK3rsM=;OU6k5$l2eOAv9-5(JZeI z06)qdZsRR262Dn1FAcXO^F9``3HraFy09g73ZG$ytw>kg(UU5{Itui2UoFpLR0Z37 zR#AP+wQ|sY*H>9!*3i(MIY|^-Y!c@3{`zo#h3_(l*Lf101yEZ}keRe6OAQUxW|Hgoe6J}%z__~yFoWjl6f^#bj zC!9HnbrfqaReZbd9z$`=2u(aoq86fuM3`R+(H9&N1-5tHuHF@xnm1PG3Pmk!UsBDP zy8851PTfPXFv&O;M^KM8j2QE#Ldo`mfjD$aW&TLtz=2()CF=Cj86tTNx}=_L-G;s; zIryj_&Adhm!aVgU^}B>*!+bmr7(=*h^i@!kL_@} zRD$8wxoX#5%Q6L`WAT1lerpvAZN>WqHTti28%KCONOs%w_)-jd8qF=quUE?l2L~I} zc5b6n6n|9a)B|HH5&ay2di9Yswr^cx7rM?uWu`l;=b+O{cxyIobjIqoK&z6v!GO?& z{$%O`=aqyW_nBD2{UswU=G1!{Hv^+qtUN0<9O;qO#Dq066_s*bciy{b+%0!}kT-+n z9Rq1)t{bJjrKq}2l{PROZA~4p@0(bVG#&6r-j~`x=5rYOJy|jNbuUX@fqdM6xsydN I+rdrw6A81*sQ>@~ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/turkey.png b/public/images/emoji/google/turkey.png new file mode 100644 index 0000000000000000000000000000000000000000..ecc3d40b4c1036841f9606094900f6a351488adc GIT binary patch literal 2475 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/umbrella2.png b/public/images/emoji/google/umbrella2.png new file mode 100644 index 0000000000000000000000000000000000000000..869153d75b4885244ce76115604d41cd33d69e9e GIT binary patch literal 999 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/urn.png b/public/images/emoji/google/urn.png new file mode 100644 index 0000000000000000000000000000000000000000..edc661551bba4adcc2c180405f0bfab844d23eeb GIT binary patch literal 1371 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&{R!|1aRt)au71QI+w=m6GQW&-PY=(DJ zk8M(}TRFl6piw|8oC+$el5-q#%YbZ%jX+DyA`@+rb8J%coQkU*3oC)X06NboIObQq zJsZ&fAtgb6!3+io4g3F}?=Nr&5LmCE@P2+k|9v3W!C?OT|Ns9h05KRe{QobIaQ;4o zvmZi%6#U;`u>L-fAK=i?;84*2K4Ja+_3z~-?Rd(-z`V=T#WAFU@yLy*O|J|D*e)m> zyjz5*@#A4;ACc zP31Q;`tl}tJUwZ5@>R6zqTg2SPHQ~MgLIy9?kZXuwRrbx^I0r`tM9)2mZ9)BZ@I04 z2OERI5=Kde05ywQ3Nw46OWeiM%{=(hn7g!DlGhwp-L>Gn>aiKRJ^=yJ7aDFhu+QS- znB;unlB9sn)5VV`2Xj1n^XJh4V zKJ>o~$-A}x+|$x-%Y(BUnWNruP7=$ga*#TpnDJ^0N1OYFYaa`Q7QDZ3c*Xy@vK6@; zFAEy>*Z-K^5hA~z`R^}_>IV!$?*D}uPClsSclgdRkKwHFJNF4~*Z!$D*f&34_=1V= z<0qdc?I5r0I|*eSb}b3(Uzz7lWSRE&`}FkwjpB+vHyX8D&dxaa`-^_0P{^!xfsc!A zw;gy;EEcQm+f-$2;d=S~-t5)`qRz)ESDgAYb>%_Jg+Uoz;$OGB^uBZA?cBIfU}4b@ z#h3_J53}f#VnO9!jN-%6qy1q)Q{eO;s2b);o)2X_T zxMCOFKd{_Y@Ty&DkV4M4Q@>3_x}}RM?iLt|*av3>N*T1r{*jpFRF$ZGvMc`XZPp-X zM*)@#$L>DOFVXzFt-K?rvfy34*czVpmnJ@cE|2P#FHieFf>wJ!c3FegzY)A7}=c~@RdV~O3M7MR2pw(xB; z%fpyAH@gmKFU{=`*y7x9;j1juEWd_IpA_c<`BpO$^ddJ)Je18+W4hOv5q@Iw8djU; z8x0CE(^b!8Yj7#*|6Fs-<*WhoK2r;pnrs1uf)y(n^gFZ;oNnU!@kGHn`9!#b%16!i77m$B9FlXEXBE}4|3d1!Z4 zUEfK8!`U5gC6jk>Zrmz5S$f6WH8XUa-dz(qyj%B#=roCG7o3&MQi60hs$M(gB0MRp zbLosQwSVD?q8-*oYo}>6gn94Tf6ejx>|gQ^rkker%|DgeY#%V?vB-VT$3_R<8m VvwaSfhys=p44$rjF6*2Ung9$~cI5y7 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/volleyball.png b/public/images/emoji/google/volleyball.png new file mode 100644 index 0000000000000000000000000000000000000000..77d998d3e9cd154ded9e0b174c433f9c4c2ddddd GIT binary patch literal 2426 zcmZuzdpy(YAK%QzVPhhfnq!tCx$CGTQDex_usLqW=9W?o(@h#U|Bfj|gzGpr4; zQ@&4O2(WH2?`?xX;6r#zf(f9GG|_r0%clD}|F2B;w6~WQw!SDBZKeOO!62==ue#!2 zrnjnmva1y^`ys=Pbw5B?#orU1Ej@2ujkh-qHq^dru4fMR&5sR#d_Vc=!~FWE<%y2g zxsgE*i@7*8&U!Zp1Y`~Oe`HRtEPd>$DC>Ax%$;W~OpMO-cMsH6FU>NC=yfB_^$X*p zQ@vgNwXa888rjp6K>V43J|N>NmowSf3bX?_eqw(B7$AFhMQPWo7eDIhd{qKeGS=3- z_v!in<_h0ozTHkuMoX*wk@`M> zw#$!h&G7WJJFseRUAneCu)H(U!{uIfXb73_xOWJ57q!h>+$Cjya|*o3=+o2?1;tYn zrKL14EdHj<*IDJ<5iq-k^+4AgZ8%v+B|W_Jn2d3QN@?_oeVmOGk9LoOb} z-#T%cwke{&NPwCaMil26(RUJq@K;jHP<>57;J*^bVwESdo!VzF21*PpPt&?8S8kTw zimphi`f26E-|g;S6Aejzd@WGZ_TC0#mMVgQRsBrT#!?jo^HO|Dz~;W2gygd8WMfGQ zg&K>*E8anq0=GDkY|?%sJPwq5&;iA!kDt6HxeYi4(vH$l`?KG_N9Qkco@&l6>DK-cy+`swRfyOoQ8q=Ij(d<>P_ zlUtOu5%?XuadKg=;u7L;z*S|T+&p^+@p6`cO`IWvbq7qyIn(1bd3p=kYfmCLKU5~S z+-HFv>*&p?Tyvn3G(u{{NK7;0L!jlUl#;LVB1c}vHg3I!ciTP zApDN=8*u!X_+eiu&jfTM2L+}OC`Dj>Bs5KH&FqAY%7W~<7rn6BM<&rM{Z4gb;{aP# zGl)0gyf?ZfXya`&7v+4_DrOv(I%GBPA0ufpNGd$sI%|hEcL*1|UI2&d9_go|M2NTGPO-mmZQWrB3EUS4;jZ8hwS_`eP2Nv znpr%)g6?dJaS>!Y=ZtT~@3Age9bZvu#R@3npBL);|Tnx{?Wtc{yHh~UD zWxW+bi`5V58I`2I?c8K*Tk5Y(Sv#kds)3t$m5Ae)C06RC2pb6oF(-&>Q;-Flt0?57 zr^1(o36T@9-;-PiAb5?+O#yIs&iMiB4Rg}U*E?lac%-ZoiY231U;%AePsZ+kq1L0F zH!peR-#w=~>bOp!r@AQ#-m{O+_$t<>c>9qKRK@vr)aNQOzVrf@oDd)Hs2 za6aOU0pvaequ9j5Wohl-tS0Lf_B?R4bU&ihO*bkR^H{fjr?Bmke_ZjP3}K!2L?-PN zT3-@7&KI^UI)KZ8KNFd?{L*XI|J1guN{wg!XVfDzO0AIY+NJ#81ewphkfXnapUJ+f zWg#vACkmNNSGiNOzY>nnp-Ba2H7Hs%Q6iEk7HqdZ)Em z%qr-j+3*a%+46ySyg?eZTzAtbyTmfC_3D$tNYngydbIA`fJ)7fmo(bc1D>Jz;1=Y< zPF#<_s^DD8j*a0)s9x!y91pE+JIp%kuE)gkv$Pzrgq)>r=xL6TWkj=*OY-ZpOS$PH z@Dhg;MFxi*Kc4n6)6*#k9WYdj@|oO>@I7J(^En+M-@G{B7c3;AZXHts<_w_}?A-*M zxR>Qqy!M^pe1UCAT52FNG0dgGFP8}@n4Z}^D*>w zgeirMWO{Os0;_mGjwI^YH2~zQz`QU zLdH^bdw106lBv|^Ko?#}y* zM_y&sQ9@kRacQQPE)Vwk2ET16-&^IhIYz=_r+v%Q$%r={_2Yu-kvHSqa6&`{nVw^u z&x?d;Wg&t~WJEDZcQfzeWQ^;M3OT+Y>K>bir>e)B<&`z%?|u4=aF*7P-Q59`ur@F{hf(U1>uGwRA!oaBOu z4Dp+9bM~Se7d#hgbosmGS-X5_!s2c;H$VKJhgJEh2;%u($U!3TI{=xRSYb=gkz@Y@ D9(CLr literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/vulcan.png b/public/images/emoji/google/vulcan.png new file mode 100644 index 0000000000000000000000000000000000000000..20cb6f2786c96ed7f52ed768e742fdc7565664e2 GIT binary patch literal 1454 zcmV;f1yTBmP)C0001QP)t-s0002` zz&858Hu}Ie`oK2&z&858Hu}Ie`oK2&z&858Hu}Ie`oK2&z&858Hu}Ie_O>wUnH~AP zH0YKa>A@?mv;bLNE%625-dQt zF~)48I9P{xBR@&fb?(pP4`vM~W!JWxY9rwx(Nt)CRMaGW)p5?NaiF09jj2hv(Jdbr&KbeSG}U$e#zI| z_mdR`TG0bkxb-eT4{hP7NfA6j1gUou?BT3gt~sk(r9kZ(odsIu>DIaOi~UU7^e zhS9yM?k#D!ks&u$g^<`gh(T&8#Cuue$ANvquHemHyu*YI7g&AnFa|$2MpYt1)Uy>K5ZQ4I z4&Qg784RQ#f^3QXR0A>i&S8B0&un=t^UFarE-$xErn&lx014sXi%iqP{N%qHNXEtR zEYn&K~WD$86*lfeB6 z&NcA|7|{2p)2VISfAF6!NVKd0`^WRHzxmgtyqg6L*kAAZ%73_ppJ6~f+wrZA_z!=I zMmE;Bfjiw(e{*Y}r|(?RiG6pm^{mJ>!ynS{tyIsf(F8YJ}aBe9e0JA2B+4tWb zmR4Y7A_EXJ^Zs*ZnFw=x05}7hAD@4;R6@8P|6f8Bg6{VH{zedqi2GstV11C?J9&$w zu=*eG_tD|w<@=F5s#D|nW{BMbaAe;sgbtt64_CYXNE!4By8|am_ZPCA*7?~A$vI8x z=777*C94*DowXj%W{^Lj!v^@c(J# zsQGmzh2eiUSZ8ZouIT{y?S>!>eAx&E|HDPK%G#bU1@H=4!39JYBKCFs7=pwHz6NrH zd=nxm`TI#y{(h2(zn`Q``1?63!{1L*ALi~zAMgRZ+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/wastebasket.png b/public/images/emoji/google/wastebasket.png new file mode 100644 index 0000000000000000000000000000000000000000..7064341987b6a3c1b2ef8e292f686dc62d4db4d4 GIT binary patch literal 3115 zcmb6*dpr~B`|q&BCTG%?E;=|aLy0<0tH>qyOS45u?kb&fTvM*iEaVa@5h;^PNn;$9 z5Zg@dOi0RQW-YfgRy1MzuHX0fIiJt(&)@TT-sgRu=Y4MP`+45?^QPjkwhHhaZ~%aU zy`9x@$xQq?gMamT+)C`#Xd`B2tJyH_LN3gzJQLE^~lPqU(S3Dv6Z zmqh;8UcyM?gREEJ4&9)30Aw@*(ld!h!UuG5Kw%rmYXK=QLE>|X*TtSG|IW$S;pv}6 z-l2okmlCR8)dvVQ61`K?dr;B|u2cfaF5>?Ik(Gpz8SmEo3aFg~%+H`~Fk);$vvv?DD3`eCc(t| z|7HFwN+|IK$nOUATu|{2#MFR0Z64LhJ0*u79dR7%0@TcLL>krCFjUOSVk`2=e6cu7 zECI41U+l{lQ^iy&nWe}IWrzOM(!}O$T9z6SM`LI4`7|Oot2XR(N(Y^ovOToUg8fG=B2Rx@M~anSr9k|JQ!_Er|IQIOAXT%?#_6X^ew5;QK( zb6hhnpawi!U0Yi-{}l|RW%N5h#@c09_LRmu(bd&W)LuMQUz<)(RBQGLoob~Wy;E`N z(&8x>c|wy;t4B+T%Ff8#f?|pQYAb@+r@ga|{3~Q3+Uw7t(f9HjhC4>{FVq)~zNirB zSAJqlyx4rr?{wjZv=i?uBH~;hBb#*2@teL+7>mVjL)wd`MW;?|rNSCWD$MWPT}0*s zCHXa87P8MQyKt?Mg6l=yA=%_&-EbDndiij~kG z-80TE&(k;P$yv#d!eZx&Z5Q#t2X$6xlG*sy{%@t>Pm>r0_I6c5X3ybu4i0I45P~1a zUESd8PLD;MRXRC6jWIr>Zhh31pz;|0qe&%|^Q58efP9(8Fs~fb$d9dZX32PyR-K|{oWElp*yL&h9w)*G-6nu3V(g?8nxcn8hUA0-SzbPo0 zm^M<#9D@oK)eXBhS>7KjnN0UG@mG*bI8*F4s6el37?K{qW>39TV!_0or6MQ{5tgNd z8`yLQs>NA;`%?3j=)1~cXw9{!qUZ=4ZQrF1t^PR!JMFvmyo|Y8BgLSyqxs`;ymTfUdxfUS>mL74NUl-++wGGy13M- zSukXEK+xOBaD~jg4td{r9wh}2U>@*%q$0&`HALyqWHu=5B1TZ(=Nk@NHo8}xwlUh1 zvPhna0wdAIY-QCq%5V2yojiBJ{1S``2R1r+PL_qHIi~Ti@2S9-dJeY!@<3nNzTCa# zdWCtyH)&*Hlp9@ccDcR8>9Kc^%vW7{Rn-AX-T>^_yzI8#yVqX_+LtM^k-ocm^X^hs zLMPMla2rO(+nh(vfmnK;!iNG3rv#Y7!$+5T@dfz?{dY@>_V*4uPw45JKU>FGsK1k| za~>f2A&G}7BU(|d4}$Bu(M&U8vDV4G;YV&2w8rvsV)mWBRQBqMxaz#p&0o4t@XS&W-vpa+iuH)+-2#3IzG${+ z1ueA>;asSzoLQ-5Dn&CmKC>{fHpD1i$(IKYfKLUjUuod~YK!`85#y;ysF?K3bXJNg zwIGo$Em|{lIa{=j2*YW$yO{9=Oyr;V>TMxr4$7g1S6Tuqi_Ir|yvoz0c+|OILef%O zdZMPz*~`54nDgP0F2cWaf+kdrtQg6k4xf9L9lC4jI8x@dQ-I*a-*pGNY!m)GSWFCC z?ilQ(4KS){$rbCJc)RB_Ngh#QOe1&&v2_LYUVQ} z-bB&OK{F0Xx3w72hQ$^4?@}|BC&Q7QYxq#?s?N;vITh%`Ep<9RgVF4IgWDnJkR59U zyDR80+UbjFq~_mR&P_WsA4YSNpnEQC&W)pDI^ucMS!71J>`?kXXlI=9t!N}y6aU+4 zmU9EME{v1i1k;bk2cE^0JRb|=^h@q{8>fUA`>dIxx zO6bmEyS;Wc-s5s@X~jeZRp`SZ4P>h&=OG|_6~C-}!+Ik1SV0zUq^dPkr^5DdgId<{ zFYoQmvq8YMcV=#0CWh_Ux{F<^?*2$|&4zPt&+G9Q&1AMJ4k1uT*PHn(q1?mqi`xx1 zSh6P*V)m|jL={P}{B2Vlh0;sW{VPyZGAX@4`oaI!BB()?-;Pw0Svk)g?3(TqHVJoq zkq;R#NTGKGb?7ZDp&Y%X@{YV;v?eyvAw(`o1#}D>;>c;8hhy?vSr}eAiGVPLPwun6 zRhwKiTC2H;y~dX`h@haNh#J@COux$|q5S#&d*a}F%Hm|aCe&P5i$k!jmOr4S6-du)R#frpkOp?@XdV3UOys1-a@C#I@Iyp(JwrI35 za6Bavc{;{D;lez^@Th{>j@(cIK`kP2nnWe;kX4*MdWhH$M;rp7zV->j)%T5GQA7Vu zNucIbYK5!+PY=yd{BEi47SR8xBi=@-Oiz}W`#7&yOR8RckB!rJ5ga7C;)~FQTjAjf z@^O3RHq!UWB3In-{bg#m#B+D0Go2QX$cKsg4sw7$=Jyt~SQaUF;vmTxGv#xm_lv0d zisZGK{3H0}_coUs1u(|m=>*ldF*^h>L+{8HYH&sR(N)_5*F)-!7_8;?;&KhyTyL_p z{SV9W5y2UA^%YE-{_I|{DtJTAZ_ zjPNG6?nQUc#>!DjH2RIe)F9GZPg#;iN(33)?Dq!gmoK_@ zkg!3MXp2-fmfM$^BvXUO+uNERnU7w*6lkv|dLYAmUFP)hA^ujwaZj(o@x^)>Pc#G- zapvSiu+<;i(U0Y#uNn}!zE`fS+Ymj|+ptdSWo`fEvp2G2A|maHWSI}+a*56HyDdWWVXb^EyBqh8AAGiG$I{q* z##+fDXvozY%8lhQ3Ls?45U>hhV9iO4z%A>~V1yuLVwdA&hSa(yok|6A_l`%snqQA5 z%70yuMMx7~%sQMJNf@??vs1i~e{MrWGoeSBngn?rIcyeEzv);&u0~)NUrV9qHf4&R zelsy3?4NHQ3&(clk&n{ZvV_!%Uwc`a2E#f0MD5g)oK@6EKNV_r>&Ak&z(M7_`j^Ow d=xGBkl=AGQVT!-~)t|q9duyy!)lpy4e*lei5z+tv literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/wheel_of_dharma.png b/public/images/emoji/google/wheel_of_dharma.png new file mode 100644 index 0000000000000000000000000000000000000000..c102a50a517529484c8708a685f466a5a05091f5 GIT binary patch literal 1050 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&c?9@`xB}_#lQc;}zqaK3xwiiA zlT$wyxcvYB|KIED|9^Zs6#5rrnP5qfUoeA#!~Xy8?*}v}^a~WMpPz8vsM~G|0|Rq` zr;B4q1>>9P*Jpj!;&D|KXpvy|sQ<4%*Y4+z1b2z~b29($>UGpk5WQ@5Lt@$b=Cykg z_WLx>-ScqYsRO6k=k06hy>sJ2xWE&)AH_`nS+=S9TszI1zdS+dul#u7xn z%n6N9*cq)&H83s&=^t z_cOaLIKUHnU}xBspaU6y8yYvwyV`%q<1m|oo$FWO!uI@xg^t(U?#}(j#S)b~;p+N0 z|5JjJQHc|*+wQLYWUW{fUeoZ2-#L8uiN_yL-rN6pWpyw%Ge|Li@zGVd{C(8=E)4yAi1=sV9@_nd#7y5ynH(KYJH zG3U(tjM^UmdMCcgKKxB8kM|Ly6AxnwCpgaN;VH5Smq``){FN!bjy3+DkkIb0#TRg^ZtAU#@;;zNB@9Q&Jp{AXGnKZ~a~Lt7Y_ PF&R8v{an^LB{Ts5^d0jN literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/white_sun_cloud.png b/public/images/emoji/google/white_sun_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae2fd114a852fafc4e5be45de2dd55e45a4960c GIT binary patch literal 1582 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/wind_blowing_face.png b/public/images/emoji/google/wind_blowing_face.png new file mode 100644 index 0000000000000000000000000000000000000000..3db7093280889e5a1471d25d7c37df94fe5c8ecf GIT binary patch literal 1803 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/yin_yang.png b/public/images/emoji/google/yin_yang.png new file mode 100644 index 0000000000000000000000000000000000000000..1e682f0582adb43d6fbf8024f77dd0c8fbef77fe GIT binary patch literal 1739 zcmaKtYgEz+8pi)9cuhqUu~bCENl)e#$2)?63VFYcnIdYt8nuW;X(oz@g`uTpYV2r= zIW<#enR7yiyvv4+snfV>-Yc!CyyRqg|1X_6yC3&G@B94T56^SX`|T|Z4ffa3+OGuw zfDR>q6s{!q>u9Jd_0w$Wh7u*Afste-{rvs^PvZ#$FK=&8PfvFbkN??xi9~N4&c(&W z!O_v)-kwMzee3G#jKz}u{M_8!lr}FfujJ(9%abplxYyn8vKgC zYWcs*S6&4j+NH&O0D!eqNQB5th_vcUO`8Y2ud=!53A&ex;lI?I*y@;COWs#cAH!sJ zfXo{`<<}@VEe~xcT9c3cdk_?ybnie#uH=|0c5+sNAFF@2xzn}Mor;w@y!|pqZJO8+ z3qBs#LT-;+YfuUtj0dtM4%I~+tBa#=|Ln5F7-AO}s)|xQApY*a z3aXPaWNLO)HyWrJNm}3Vz)<<`TU()fX7mJVgbtV{6G=zGgLv-v(K}|ICNYha>jGx7 z%pm7rqV4o=g23e23<@BbAj|fC49xUhOW@-*f3_g&%yDm-B zPOQ5+T;q?HIOG>MIB2FWpC)?>Rz-#N_38uTYb0W-*RLwj1!#TYYh;4XeXko}+ zCdoGn5o7=H2s3a)+{yU9qZsbvv1;Vz$KwU{VB5Uw!1}#u1reBEeM6Q4A`*8qjAvrH zf>-i?oCJ4Lw)v0!RwHK>&tN9e>gTi1z%C)i%uVR3d4JzQY@)dXx4&JX*P12}y8vm3 z?(0_@xvv|~^zL+C3XXtKcVYb(E!j6=wcCe=QuN!-8cDMZ(bVu9M(ex4aZ0sWl z_60qDk*K}!`q_=#V&_(8^}A(U{4ct8p=DnlWCsRUMuEMKn28 zc5F6LuDya|bK&0<+MLgm$>tN+;)e>(_Nm19F`izo_?3P*D^G~xYFb+pVy}1B&{kS{ zG(~9g#CD+J<1!v3knf#Zcz|nC1QoS7Xeiz=u`+M#zQ56e8K+}!OH7K*5uIeV(7>u{ zN&DF8Wau?2Osfba!}>1h#9{Ny&Yf@$OFHHE=awm(rS?)N6=3rjYl3uL4_BnG39hcK z_Y?e~0mN-ajqp~qdLF5@2%)9xZ9si6F1*&MoUG(YvCUAewh64721uZK~O zueBEJFP%eQ>1@?l=X~%jWvG0rL{18GntlmbXJv}1jC1IM(MIU3W3+qN!tn(efP_eN zDpJDL8zP@;8^~fTpJ3JqasEf+ucSpii#Y3P%bYoL|A@if=m_m%2?o*p0_jtFD;>1j zNP*-F0h5bY*<~5euD26J%&@>sPZ)0BxR0)ub%Q#Mz_77m9&&dJ;~vnc{TYUTCuCI^ z0&*9asSg;!@1H_N^+RW`<8xj(A|Neul|#ZXKy1ye((W{XR~wWVQMoE?Q3+Xqvakl$7u9lvrx&SBA$aewMRojl+c> zlalatYq5pMy;9K$B6xS&_JO6E7`-lmE-g)hY&XLXpX~zQxrD0=Lds^GvLVI;#=$zS z^^Y8TY+kh{zG21G(7pU?;giLK7!AV!EKf1qWn8FMN=^6J1km9Y&)2R3%epso>zZ?+ zak+ddM^8*<#L(=}tGifToV^g<18k1%ySGnl!s z>(i}gRiX0(BIcZZnl3H3pJ~^#jQt_1d2y3IL4MV&Cu_*mf_g!QrAztes~5L$TvG{gYTB0fwkP{5|Af@ z|8cMMK()p1vAodt__=ZqJ)zroxw{J5T<(!O-X%3d>^qq4q6^Z z8t}&t_#0M3#cxR?NAM%>6Dp?eYz2wpMmbZ1NECQ>KBAm9YW-vve9>f&1HpG09otLq d!9(I*5O{Fh%-mB_ZKV7F0EHY(y6;Qp{RhN58NUDk literal 0 HcmV?d00001 diff --git a/public/images/emoji/google/zipper_mouth.png b/public/images/emoji/google/zipper_mouth.png new file mode 100644 index 0000000000000000000000000000000000000000..de15534fb78ca36c838448b9adeb42141c734313 GIT binary patch literal 1268 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 IM6N<$f~BS9%>V!Z literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/airplane_small.png b/public/images/emoji/twitter/airplane_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6a67b428f9dbe5d1806bd4e4dc119409c99b91a0 GIT binary patch literal 1117 zcmV-j1fu(iP)+rJw#nMhU8GE2wO*vctD%+}q$7%)S7roI?3-bY=&88OF{ zp}rh6%+}q_)!ryBGRwov%+}qz9W~cIQ!6tyC@(V8I8Mvc+bAwFDls+6yu~OkGSo|8 zWpsX&QvmaiWHJ8vZ3q@{ zOxE@MtJ>xEysIR!QZCStA4blRg6Ztnu-6!Co?G^#e&XL3$oc>P10qR8K~#7Ft=5H> z>M#(1;VDgNN^p19y@u<3|Hr!N?Ae?EQ$hYCYwSldr2=Hk77nD9V~~>5a9y`#r$T8j z;nImplX%a~CBG9g86;Lplx#$9m-+`cqxAar#%ivxYd|G@KUU(C_E7!M`PuLHW!5Xv z@5U`ZR^sjDaybC3TlDhfNb0#I0aVXEEuka(U6Psiygw=K*i|V>IZqrN$ta1{Xvr~X zX|jy^P>v>*Xi4~_^e&l);DswkNpCD>;C)gWJS?9EFTuBRl=KFyR$`PiA|*cLz=F>L z0=o1H;N-~7af6buua&N#^aJrRD^4nSXLTSU+ovTnTy3|jPc3b!Yc2`M?oxis};t0SoZsR=((3Mq%KuOLcV(N6N|OG(@84sZhXQudnCxra1H=XR-p%I#7I zjoYPe-n&^+2aJ-|hs&gVLvLB)(DiQ5&SIp#5w?|>Gs#!I{+zt3^{lZazJs!vPkMD>^&5HV&w zVVy}OM>+Bbn;6g-h@9$~B!G|Bv%jAz(lx2^q(48|AaP4cHPOlw;~}!GV~K&~>(cBo zIzKla*5nW$Gjyo}az&bichUNMf!iuTVqANQu5bXy(4=T7(^(z2)df1@$vy`%U79VV z<4);q5eWk&8$g#NB$u*7CvO53{W*}1F0G@DNoOaW#};I*ZwMVWB4-|Y8+4{K0h!~V z=ZvC_NoNxseAlfxaAmw9ja}r_XLvl}dMS+N6K=HA`MSna>D1@ybY@pN-MTxCmZR$N z>!A9qK8_w3*XnG^UFCG<^)B$9yVlM-aSim`QRg8_w;j2YGuVdvNEHruks9dSEUj;J jlr*~4L8)q0FL(X}2A^NCA0Vpk00000NkvXXu0mjf2g@1K literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/alembic.png b/public/images/emoji/twitter/alembic.png new file mode 100644 index 0000000000000000000000000000000000000000..f450e6da1f9b12b030d76d07a881aaace2c2ee0e GIT binary patch literal 945 zcmV;i15W&jP)}GU+XLWvNbA4uXe&OiuW^{jMc7A4be&p)vW_5mMbbn@ae&Oit z;py&Zc6#CG?cwO`;ppt(=q^^32li}#?XLWy!%J-V8w2;g9u-Eg~ zkFr{#-afZ6y_Rq>)rYKMk_u#{9U*IBXdxkWGOK?EY|%P;Fhm}d-fJ-;PR@)$_nOt)wf45wlk+s2L5faET4 zBiBGKaYMA(O^TaQ6jVTO2M-!2p5fCidfRfB=nd_ed_4OK z&VkvpqdNv9|P;1Z`(qM8AR^1NQL3HJ2 z`=ee8fE07%7QkFmbTo4jWFLOY$cKiq=hqkg0W2UgB$3en-Xy1+> zf}nV8D-HfQc0tnPxM9bSi@=@Q!WnQb2qb5=aOyG6gZMA=FZBqL=0cvk#X<7w$g3#_ z$@_)K`%4azcQ8Nr;1>ka6|mzDzHiXCD}Yata4S$H3o^6AYt?MF3LLNS+HdVEv}#X` T=>=2N00000NkvXXu0mjf1B&Tp literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/amphora.png b/public/images/emoji/twitter/amphora.png new file mode 100644 index 0000000000000000000000000000000000000000..550f047067af3ee8669ce9f5261df96a89c741fb GIT binary patch literal 979 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-T6hniyF1PQV5T1g*%%uf$n-yu;ismh+4B7Y=5s)gn3M$h1v5P0v7YjK z0gK4<^&kEwhg=ZfUwDP%lv`I&V%l8IcmEzuIig#2^n3N1PmZ1~^{Op9?`*gHF7tRN zP(RZ|PZ!6K3dW;1Sc_g8NU%IGweCE8CiU66rrh`SYs6<=;8Pwlh_rRg+DuU6EZ*F0Epd>xvOlZP`V%-WRfeDLWK1rW; zM(y%X^OsEijMtqqp6(QNGwiPjJh67qw)s5ef4Jp#e%v|v;@6M|`*iv(?u0i)oml#* zcmFJ%1wP02Yf4A2Dt^e?ARVMw!nmhkA>Y=g3Vtn1112^vJrUWL#_?(6BdaMVc1C>U zbv%7`>Rm%ssfd*mN*09OV-?j1E#2;zy5i^U#g&$)rar#g{!6}0)Zq<#$jK+l3$lJ> z9zXpz?yZ{p+^oaOl1B`tgp_AYG7MocnGwYt6}s$+gSJ%HlwDaJE`jdyGLwv~zd{zU8- z;(Q`^^is-}-#{kwiMgH5OA<}P{8PkD0?Jdwm%Ms$(Ch^t7xPB5e~(U`*s!bV&+nJrQr>_lus7-+lIUn7{C6?ns$08)sC>T?8g>22WQ%mvv4FO#nXfxkLZ} literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/anger_right.png b/public/images/emoji/twitter/anger_right.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e6ffd8197296870bd3c90023cad7203471e005 GIT binary patch literal 1422 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/badminton.png b/public/images/emoji/twitter/badminton.png new file mode 100644 index 0000000000000000000000000000000000000000..86cf6f14657541af2d15abdcd7f83065817b9357 GIT binary patch literal 1211 zcmV;s1VsCZP)X@pvps>2EyTq5N zwN$L`Q>yJ%tnMf;GL@>hRIKh+tL$Q|DjxF)(?rnX0wn z=-Qy`QGfAA=z8Nt_4F_}p001;}QchC<=vfE;QXBXS_(tH~mAJ_$ zL4?FS5w;ymT{hv%Kg{NLz$&7JH;LIP|600VzXL_t(|0qvHD zcG^G?MF&uWr3=w<@4cwd{{Oo&Zx^xhf*WzSUlNyry=Uf189|wNb}#US?+3k-N1LY< zxXChZP}&gF^%En)-h|U~(^eAQm*0IgXQ+DU*^ZM7!;Xz9LA5vGxF>lcYKCE0^T_M< zC8|f+9Nk^q9X&M{js%RzGpCp@GpU{nuVhz4(%G9Mdyji|)d40Am_rVea^b-1iie~l zV4foR=!Xa-aERCwbNIUtQY+ICa#-%H=aitCwJ1LT)fprU6^L@X8U#)*JlJil0|or% zD;#7$115n}gD0wlMNH@G(a=wLU`0`N73HxZ0WEwCvcnGiED8pImoVKfNWf3 z2nL5hQhrcqs4FTwk||thPGrSZly!RiPMdg)u{gN%8)}i=W4R2rYH^!JP>|ivlbyeKgX3m^85_aXebSgw~}W zXelxWp5P}f47F}fRdTo=CaI=&bVqI&R*2K!^A2%pVc1+0a!yI#-piJ_m5KVIo5E-z zw7^dhTHrZTaI%unl7&u|B%W`wpUUoZ_#ph$aU;S{GgIK5RCalw^UlySr28Iur!*Af_Tm-$!Y|05w2CH>#aURMr1QTg_vqt*R!K4BFu$D6X zq?=C8p3SZ#S-4Uk^YU_*v`kPP_Yluz*6jqs z;RmGbVsoy?K*-I8pO8eq-5ueB`Xk}Fa9(%=l6=10 zz5!{BOxyoYlAP%qkj}w*3sT`0m^UG9eOuBWsr}}pQ+lK6&ghLu0KLg{r}PG-)3dYF Z!apV8>SJ)2O*Q}k002ovPDHLkV1i{2PwfBz literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/ballot_box.png b/public/images/emoji/twitter/ballot_box.png new file mode 100644 index 0000000000000000000000000000000000000000..583ec9c01d2d85c4dce8cbcf1bac8fe3059fc4d2 GIT binary patch literal 783 zcmV+q1MvKbP)*4@q5-CeEh%huh?)!b)we` z`u?7+w`8&HWwGslzVPt({eHgitGL2;euH#;fjdD(H$B2Z0000UbW%=J0PzwZ?eL^F zfLk5N6UnctC#?0Z?W#oFUd~Og)s!lr`eFb80pLkQK~#7F<<#Yp+b|e~;V^SjZa8L# zv3&nmRXn?`j^(lDQ`;@PlfQXv=}eOQJ8JavaccP&J!6L%rW%G&KhEfpA(YR8@`g~H z+5Zd?bPfFYK0mmLq2RPV#AvrY1!BnGewE;CeF+5V_38Wy&KaZ#f&|9`f&|9`!sUGa z>}2!PJK=rIpy$s94vP7eaO2-|(BS1$cB;tO4p^9aD(AbO4psQV5j* zg|<)#XiX8coXzG0aYoR5{W(Zh&}{v=nLUIr|49%Z?LjXalJ)%42{jc$3x*a#Xhp9y zoe81!Z1Dp%U98qpi2IMBvaM4FG_-}ffO?j%R4(RFv1>tv++F|8Q1q}w|JqxRcy8Nrr!_8Z zpDkyX|E)ADXqGE%p8u^h`lvVir#1iFT%ZITDrS}`XP2G@AO5T}|En}ejJ=}`Apfm1 zp9deZw0EEb9iRjr|E@JDW|q~(YmTFaxjimHh``u^M9_Ih|J+^wtTQTSm%?dI%X3Mf z1Rg?(!T!ii@1Q@DpnE!cuTEBisv0D3NpgWORB)ZCG!nOo0000mbW%=J06Po~zFiZfGJ5}aH3<~j@XWA*p7UP7*R@uK;{T|1{EZ zi^-0q`XkggX4iIl{f_L3pq3`fTdAnyi3yT*tgRFX_kjiPaf z1It_MsK%u+?Qr8jXwx&fRQ=$@{!6LfM0IVN(paK1CaA-snZseV8#f7RYTGn*e0y9z z5Y$CH*S3|ZMvX{#oZ&VW?Rq09wW&EIFoV~%FxdXnAk?LSz2nNgvQlLmyzTSLfb0QN#7Z&G{DXB zBcTknZB8|sun1xgxsl3$aI$d{`m*{+N|tFOlV5II`iZ9Hzu^y+L#nH|W`jVIUv7rF z(`>77pu&K(^^TA>Jt z`|z0z*1?(MrxwmebndBQc@3m=rw2)&i9mcGai>;xp=`4r-uL_8FEnOPlkawS;13{q z5{FLi!;WF_i4=J``NACNZeHm%#d;MRLo!P4W3X831E~go`4fNLAq3NwQYW!8B&5$f z@tuS|K}w~Z+I23!>XxEiLL6jGaUZ_jk#SAPp#~(RVY=~X_dcgX_95{;9ht8#0SS(1#U53UE7*hiu$x=s2(U zr_()dq4(ws|Lhs{b+d}#)bIF`9_kwSk~zNe2diiN43&Et9smFU07*qoM6N<$f;@^c AVE_OC literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/beach.png b/public/images/emoji/twitter/beach.png new file mode 100644 index 0000000000000000000000000000000000000000..16509a7e8ddf358d6476a3a06ff5f0e3abe76b85 GIT binary patch literal 1034 zcmV+l1oiugP)-W7_uR4d=g+c`S#_+}-7ZA`|Nq`PP?5dpw|AI`$@$YhR={P0 zm9gHPrqKTO_RC3Q_|w>`jkD)>h4}C7`rqU3qpsWR`t-cR?2MSf|Q5X=D7y3m?3#l%0XTK&=ju_MEiNesrVa(5|FNkbU z%uwo?18v~jsY#+wMWO%l6pN>#E!Eijft)M?59SjOAj&n98tN^I5bMu9U1$jyra2NN z7DYh6=06b|LZWy@%wLqM^Pl5-M8)?i@_bciW85&CyTZre}X#g%khvlB&1 zNT}V5;8BDkxkFePl*W{Nl}MrhMh2CE2!dpS$j3M3$|%N%$zG&jDcS=&2L9bUTtqeYT6~_M!cBv*7jep8RWwnQo-QlRhxl z?pwkc!R+e>ebp|O2AhK{Gk;Go9_;T|C3j74ci4yd1g&#znnlkxr~m)}07*qoM6N<$ Ef;YGs6951J literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/beach_umbrella.png b/public/images/emoji/twitter/beach_umbrella.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb23697b7f569d99b772d096e492bc4af13f933 GIT binary patch literal 995 zcmV<9104K`P)U z-(+?Ft26(sGvVm$-g=7vtTTIkbk&?kmWF5Tr8~BgSluo};ppw#ZGGN7Qf763;nLaO zM_b{>&)~AW-;bT)-Q(cB#@=3V-cMtAYIeOrRQ5r(EcWu@u1izh{J5@`%^@$;lHn{dVd28Av*v70<1|yK~#7F?bYR)>o^Ps zV1<)1(=hW$;S~1V|7GpiZ8~o4X?z&p-;E-D($j!8zgB~9VR#zHy&-(PS%zEIFI z9mg@vRuIHY4?bVZ9reeEX*kHUWS->BFg*MGLgvWBH))X&m#>gn4(xX! zaU)H#Ye#p>)_DC)PNfjHRt7DuTpy}A9&$~Cq<)wIkx_VVi>PlN z-js)2n$gxg!X5k-Ns6Q3z^=w+q(stSr6z4Ed94rY*vLg0y~}Lel@gakICc;BV`n5- z;=Va?3mee_g@(7?iy%Wu`JMt1M<8qCT1cW0CFMemm9mnHYj#3{#74=s;{~ETT~H2I zkf=aevD>Z#J1ks_<|Inhg~R~I4G^gtTA)I)x6(EU9A!e(tSB_V{ozKqwxr6*#PgW* zU3h^!*`Rtd97yNtLaBipiL^6WF8#vuVWWj>SF~e^Dw*7~vs-BFUXaMJQAIqEIdW|= zBhLz8rV)`%A{!Yy*oNeoz)Z!4ny9iO(F!@~|8iDVGA8G~-$sQ{RY?9n@y{od$=&%3 zI16QkY9DQ=;Ev_(s|xj@N~@2164mW{+TY8PcReLhq*sUw&OX`5cx|@@;7_GH(kwKL zqC|LO#`68%cwoZ z%+o`)dIK&WstUb4Xt)J+L&9j!4?61baKOu3OOL#vYVdH-lN^v{A=$q|{{x|Lr{@Xp Re;@z=002ovPDHLkV1kS}@X-JO literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/bed.png b/public/images/emoji/twitter/bed.png new file mode 100644 index 0000000000000000000000000000000000000000..4680571709c25b636dadc60aea5b4c59b5e1544a GIT binary patch literal 520 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-Tus)Cx z5WM20L;oSq**6Yk_{B`LuCHf^nP|oEpCM*~^}$U4{aL(vE$r*<%iqN4rcfTt#}zR!5nCEq8$S;`TiT78}f98)L{bX9o*!#pIRhNY$W4B*ihey}0PieN* ztObkzJ^m;DP4!vs-kofj|3nv7sj$B}Yzx$X%+tj&q=ND7_0~zv1_BL?E326sm90N^!LE#TPE+mJ(UeU5fY*38*;M#{^$Ewub)rywDWkI;y=Mmso~WvK_O0!zZ@$K zRur~y7_@LW&2i#TWQ@3=C}(dP?fkLFK;)K0cE|LJZ$9_<^?*KN@O1TaS?83{1OTyf B;b{N> literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/bellhop.png b/public/images/emoji/twitter/bellhop.png new file mode 100644 index 0000000000000000000000000000000000000000..07c6badfdacd5ab07337e6899908d8e927eebf68 GIT binary patch literal 678 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/burrito.png b/public/images/emoji/twitter/burrito.png new file mode 100644 index 0000000000000000000000000000000000000000..74894241cc244df41a8a2201ad5e17ba1218d07e GIT binary patch literal 1256 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/camping.png b/public/images/emoji/twitter/camping.png new file mode 100644 index 0000000000000000000000000000000000000000..1bcf75dfd4e580ee795548a4e37c45a17fb7495d GIT binary patch literal 1118 zcmV-k1flzhP)JpSa-2mh{^eg$n=1{uZYR{^pFgAv04AjO(`!kW+4;%!$tU_ADV&ogl|iIY51zJCOGr1*dk=PReWuFJ zh_qP2z*4%WZ=t-zT#-A2!sA$rHf5b-aH^0?fGS0KBVd+KQHC&ix4ZxU|E${kYovU3 zvZ_9F9f-;K`u+dl@&13g&c)^Yn9lM3YzhSc000PdQchC=^N`HV{VS6>6^JbW00T}* zL_t(|0j-vWa_cY$n1ba?f-w*v*O!P$C5XA%Juln)!q$w8o$>SlMNBw zp6`L)WJ`LLr#o4X`6yFa6bBPScY{3hNP!Vl$mFj#ky!nqFcW_3}lob)Zx5C$-hA~0(qlYsc0D$WFgW+%x4dJjb)di}V=vVa95kXHVHR@j`)QJgx-el3aoL%A$x(q~cYN7U(Fru|}$cWvdRmP~o^l+2rNF zQ+>A8>L2N&q`7jCr243ZSxDUKUdT)>VFVEm%IAny6U~1s(|v*3e^wLq%?^e2Nn>!q zN}>Wy<30=?+qr=#Op?X@W)*V%kF`aH)LzbD^%?O5tGC7@cC<&?YW0hz$1JMLv5?D& z97W|xXex{yA|Y&1tdjcbq}a~t%G?%R5FP$=a(QHy*@!SAOC+eoa)8BAa@-zjA1G|m z1s&YdNrULfe$ZBdge|(K<6}B#5M7Q_=YzJGSfV$gy9Z3k!P)PFwi06UqlqoLCptQ! z#z-%<2W^s+o=DiDA0j%tCMJ^opv9XuuiibKpA$8X`_9Z5#rG!@TO@9X==pTn1{k73 zOe_%s(WyLOB7GJk{X|`UWpO{47`)o3=~l{PqUH?{lk5EjuM=R4-l*hQ$~$7leKEP> zMF>O>QXUZ#>6jIvd(DxQXT(MNg6O(Igi+JAl;=duxR3W45xUo$OZiO1Z2&}9ZV>|M z_T?$DksetQMokB@NtI*w}eJs+_4ZxiMq9+2+T7>@j4Y+cOZV8-9%>mKU4LEa% zOrTq>LI3Oqz*83?5Y`A!By6Ob2BLQY`bos}&qaE2iau}`)(B4|?6~h-B6N=@5z{}r z0hXu*ky)dX=e0#GucJ$YiO{}Tq=TlnI1e>Z$7}EHgtq7JM&x^2M?#>I&i0;;x1ha! k9^kh-txYAZPTSXx|1-s=5|FN)U;qFB07*qoM6N<$f>jzIOaK4? literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/candle.png b/public/images/emoji/twitter/candle.png new file mode 100644 index 0000000000000000000000000000000000000000..57a63deca69a6649f17b6dc9c19889d1e8345b14 GIT binary patch literal 802 zcmV+-1Ks?IP)Vsd|Eoa%sz1!t-Qwx(`>Q|ut3ToB?fk1h`>Q|utUvs#KmVvi{Hs9wt3ToC z?)$4h;ppw*=FoQfK;h`^ z-{tK4t3U6jMB(V|;^*w(=pFD|Av$Qvd-ez8w(cNB#8o zf{sjf24kQu>DQ1DIppxsxJ0a29!XKyswhDIXg10C=tNln0005$Nklf z3_#6cW=_hj%=r2KxB4JE3X|3y%nNw%&92bWb=2yzlm~hTD!GWN0L5A!2Py$TNf8%S z;EQoX)T5OEsfvnPkW&09=BdG&ZwwAh|OaYs~CxS8+3E;DAJ z$3Tc2siDFS+^UpYa7amKwiuE;0nxnKGpB@krn@nztX4%5(=ywFLEK!88MBlA1;xIG>MMD&YpDe^gWfGNpZN6w}#7=fK|MSs(d3}CHQNLaI z-J1+Y-+x>uGE#x%#6AiUXH>R`(VweC;V0I4y0V~%Xy+xG<|QiJB69rL5f^RJFD^QF z#k=S(x^|2Rixk%CVhfV!ch7subhC@5 g-kIBtCdV%J0cT@1#0rcBN&o-=07*qoM6N<$f{Cr9-T(jq literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/card_box.png b/public/images/emoji/twitter/card_box.png new file mode 100644 index 0000000000000000000000000000000000000000..9a032fff6108600c92b7a60cf967c7ec4259f9ce GIT binary patch literal 872 zcmV-u1DE`XP)@9~Mj?CrU8+{vob(aGkAm+gEPEdT%j9&}PpQvfAtl@vXY>-+u& z^7GUmO}=`q%fRlu(S)z6r>ya$yVx@T00KNoL_t(|0qxX2-QtzOPJ7bVl`BN4INuI zh)k$uL#=$sxwr#DoqjV$6Q|g!+3yg#HXtD#FzY~|q$G5wMyT)pvAXN6*sV{fra^T= zI3b&o(rezY+}$dKvR{s#+p~G?&ruwAaYD^FCqfkssw!v%Mx#b?Gh<#2$AYRFbfTc= znbmV1U_uAhXn@)_)Lsn*gdCICrk(AJm%oK=u8MoS8&&sOI`bu}6nQnOXL zQ1#nrVKjZXE6~F<3NafJ6x|gsh)Af>{5w|u*V*b3&k2G^&USIfEw})5e#h<{kk5yF zKmi{L05K8t6Cl46QchvV-wg7>}JB4=NZInyDXD@iHP+{_h|F0000y^TyQM#?;%^+~wrz?#9*I*Wl*m?C;j&O-{fB*mhFmzH*Qvgh?sT>&o{qi>D zY=ZGKVfWeC`OlgvK<-vz(XO>J>L!EuSHk3?NFNg9kOlh2{^|4*Z~y=Tq)9|URCodH zn1zz$FbqU9Ov}v7s2-jy{Qqa&*|S}Vf~R9r@s{e1V_VN%8|a#TE&vEJN<;+Ef6=`^ z0JKcdQ4y%qZMF|i3P8&%6M}HLoeSzbyPlnTF6d$?LJ$z128kMaP$THhdul=5gWAcy zJCQiZb?RCdkyq>mP1oZ9%hCt1np}_L%;F#<)^sc)1MEi!vLPb?hl%|eiuA`&pipml zRYcx^UG|)dya4EF(8|0k0*zCv?o7ljp~aq&^antzt`{_K3fUB*KS(WUP5+q47{F#~ zr(MrIo9-bmsr_E+tIzK{PP?H&Gry5%(MF#6joi^)3zPVP3;?t$fv%B1+D#tqPH^Rq z_AJp>OMVDiVe_WQ>uL@NXk{)0#zHYb8o*0 zG={zWn(hA?@+W}If!$_5dxlKg&zvFC_A`u#-F`YlzH(@d_M=5p8Zp?< zAhvXqLA6Hvr9Z#V&o|kx;6RK=o6eBDA_n^zGo-ekAwwDl(lFS+&42wq0n6pOg((m0 Q5C8xG07*qoM6N<$f`<+sRR910 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/champagne.png b/public/images/emoji/twitter/champagne.png new file mode 100644 index 0000000000000000000000000000000000000000..f27c9ea1e2677e93eea08e4cdcf448bcb1575fe6 GIT binary patch literal 960 zcmV;x13&zUP)MG?%_-9t_vB}Ne?MiM1O5hX-O~GkT z%+}qJkW9X~h5z1}CPos>*4^am@4;zLNnkD8j#m)7;|!=(gLsdjC5Ikv;O_u{bs;FQa0$}ZCuWN(6=3=#4^+4{duGw-YD)&XsqAhl! zUUn4_)Fo#(5p2m`kn^(Y!o#)6*@;eofzS~__T&#oG8*KXz25HTe6vATSMOOj$$_-? z#5~WeNE#?P(5=l&goP(j|7D z9+Gm^@Y*?cbe}c2yJ;A;{?j=e?v~0WqimMT(_ha0(%|MS-~V*(mcCbwvtOFtPnR<} zx_-yKb3dD9)IOY(qdTi$WCO-z#gBu~;Foc*SEbaf=x1B`n}g{$2ekwBrmi`jn+@Su zroB0qIgMfSgqU@&``hj7GfHX8Hlty-ljK}J4!Z3+ zSsGVSY5>(qa~KKo36PuY@RCKNQ9-i9Nmf0idlu(0PLhO|B)(@@g>w=l+>iwrR^S|x zvY}DBlOW+}Ra!J=JFJ6J@y}(KT4kWH4(FJT%H#td-Q2Zt61yl}0DSaF{X<$OrJI3? z9j`J}rfn(|ts6|-!tqcZ6A|2zQ-SQWWCu$3n&NEN#&LmzFxL$Cyyczj(ePBRx2(f2 z8|#q7I@uLb5;|a`By>oUIwVOQlB5nvLWiWIxfke2B(**n1|5l{(2+{$NF{Wn5;|hZ i8>#>uS(T*!aDD@|5jT?L?iYdp00005tTX(gCH%K^6c20=7v+K~#7F?UV(R>P!?w zad%kveQR-d;Q#-tmAlN#C3J-vQufIyXDWxjJyNU6|8%cctJkOTuv^vB+wPdZ+^wF5 z)jdLYbv>R|^$0E>R>PA#ZW08EyD#gl&ZRwTg;*DJU5zE@3KSyU9?%<0_2Vjpm`z&M zxp%g|gkBVRVg7Y!S(aGa-gS?Pcq_~jr4%qR#DN$e6{W!A28tjNsjdg*BGihdFe35m z)wG7`UR{5@K7=5U$3?+b@Y0ny&xFfGN&fr8K+dyu5*El}3wOYCOJ7)qVTHit1tQO1 zj}sdAj|1qj#I>-1%J8CfONIfSXMkxh&2;=9*8x92#!ywc+)`SRn@(=l5tDHT!0x9~Y5l z{`QzC5MA_u|ANqWqW4E01pjTU0Q`(FMMp{*F;2uH`8pQi{5syZ&37JJLLxP`_2OYs zl@hRsPOGnCv5aUV=9Ys*=(NVCh+6%_LuSf~h~c8TXh*v^nk}X2FKU8Cm9m!&auCD* z-u7#X4D}kLr3h48<#|-o-ID;%82 zJT5AK_yuYOkcE^(2L{)10-%l)Mg8XsT!$o7 b$G?y-`3+TLgi%8200000NkvXXu0mjf`JVo% literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/chipmunk.png b/public/images/emoji/twitter/chipmunk.png new file mode 100644 index 0000000000000000000000000000000000000000..e46b2790d62b2de58d5b7439a032ba1c325631fe GIT binary patch literal 1248 zcmV<61Rwi}P)FN<%`1YF&BSwU+<@048)&PE!DaF(L*Q*7^-U#=HJt zO#b3^>7nwEt}Ik;>(1_TVn}?*ub7JH{&yY(000B8NklX30rTXo5npp2E zdA_;1xtFIyO6FYM_?$#|oHZbJ36pbO$b@)jpytth7p9R64@?P!g&rr{9d z6~Breu#j5za{nYxB3u$Zi_Yw}=s1NAVJ1sWz=+N{$^y_d3l&AO)B@l{&pTEm0JJUs z5n(QC1U;^H8=#q79_xY4r?!wamexqq<->W$7-h%RD3eTSv!}~6O&c2^^z=HEfH>!O zS(nyewkl~g1p@E1HsKX+(d73ylgur^O;?vmBPdCyzmH|?p0v?dr`JWU z)rad*8S{(GW$Otzp41|u4ssnA2&r5gsde#sc*pev!$-~qbZi+@B}EgI*`~P%JuVjq zU56OU@DE8Dy91cVJZQNA;^U`OEGZTc7VZ5kjGuj&=?-vh@^KVg9tu972dj+P*~V;C zo2IHHyNd(i>9K$Nm8M@CQ{-H|I$tW~E#K*qLZT2y{yryhX++?zt@#BQAZ3o02YqtG0Rdy(v@z)8PTLUm0K7Kv5 zI}}a$QOS>8pkv|4p`5cXX^Wx-J1Yy_?wdGhd!+n$t)g3bkj;x9_Y^^bgRo_j@{RR~ zwMdIfg0=`oIB2;8+WY=hee_j1Jm?NV=M)5=H0S#_159%$H8wRC6uQv5E_*|b1Wwv5 zkH&>ovu1D6#|aCfL0?C8`$N^cKZW75peYMVh_TJ#FtJGUGX4U%pe_?2#FupT)Dk#UVT2llq5J&NiaHk65L7kCu&5TV*F-7NcEes=Ncj(V&#>mPThn;}0000< KMNUMnLSTX&b5275 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/city_dusk.png b/public/images/emoji/twitter/city_dusk.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd9ace38c99b7063e495c216b8b9346e4bed1ae GIT binary patch literal 596 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#>Hwb*SD(zn&%NCLCo&it8*Atr zYw8(kX=#1#=h4(R0;2!*44)_Pe3`%ll+rRV_&k9d#MUzbD*FOdqh|!tqHhEg2Qq*n zUnX#C>VXz-BPHGnFCvS2}=UQK;dpy1~|kU5|Gxi$5T?L2&SjLdY5%66UL*s@_G4}nat}p&s(o_H0<+g+dWtI&Tx(DUAH_TUHj6z zd8*n*7c?)-bY+venLnJHBnVaj)8JdH&x-ZPvZDS^tB8N~;=o2rbOt>Gx+E+mT8)g?IWLtHn;O z{N`X8YI|fW`=eE@MXL-yA- RSApTp;OXk;vd$@?2>`eX`{V!s literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/cityscape.png b/public/images/emoji/twitter/cityscape.png new file mode 100644 index 0000000000000000000000000000000000000000..74a0df8a9a0199fe6a22f99247b413ef77ef4bca GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TwG0e8PW)&Gqlvfvx1ac_p=YA0Zwk}}6mLECvjeOc$ko&X zY6Qv}cbxnQnWYHBdx5VaogS8_E`zG*t2KTV!8`Rd+}6Z)=d@0q^))07GOE;H`m{f~ix z(a6)qF{Fa=?Um9h7Db-6kNJ0(zI&%Ex>!cJ$){WX4FWNHd6qnAH^LT0FyyRs=MxDaa$4+;*Ul!_Ob`O|f|D^)jQ{} zzB&VBT)X@5#hWu%fs8vqG;7rspvdW~ch3I*f9~47)7NeTRX%wB7AOdm0;1Db@1DML z52W!rm;{*s)Oh#omD@n6Q&;ZKS+yM`d+pBsr>`G^G~PLV?as`Vn}Jr$T)AcDnoSU+ z=B(MaYRAFdC(bY2xCrq%1eE+%l zuSo{Y3F`~?P0n(%EC?CInS-y(ENAJ-uWvZJKRi|9C1G;>x@+KtJ0POj@ggXbj~Il6$O3&`9?AO z@XU`c(F^_C&v9@k=7g`_*2(L>Yum{)p0Q!ubDdAj{a&zZR^d+Np5@N7uRXgm_q)&S z%)GqYZBw^i{I==Ly3M@0JBlt|t$e@5=+JDboaJBES#R6Y{8Bk7@Wvz+RnF+?PY#GF zY6{+H3R>zRu&zsO4b%EfYHt|h`Zawo#4^aw$!@yCclkz>Y?bVMF{Nz@?Q!2#mpEy` zk%&QwZ$sXk^(9)f7I+<4Z@)OTVyQ`@riIf*3(pRB={uQ|my~g=U!8 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/clock.png b/public/images/emoji/twitter/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..028f514b37a41962fbb791e1a733a88f7dc24eb9 GIT binary patch literal 977 zcmV;?11|iDP)6I?^^z!_uGR%i_{)+g*Q6BW6Fv)u;#6u>JMjO$Sfu>p@`P;4L&d9rDOZ~c6)uEE! zx2=*%9NVy@tQjEPa4h(rF`xtyg59uMU-yVbo9s;|ez=(kk5; z7c)Id;h7i5@#&6TCaSj~?uthZx8$m!v z`rOQ@^-yc0ni^}@AQ}NPqh}lFVO&>;F2?oXzl^>W>0luKOMd z#52a#Wsxd|PBcYxsGh2^d+1Ik-Ti)waaEW{lVs@lbkKpQ`O}AqIM@$|Rg7ywhYtL! z12wJ;RPYm1TTiQ)n3`Y6n#Ve(s%K5)4axS8Fb%h#bZ62g9>_F2kYwvOgjYnRt_Yd> z4dJC#sY^?)enXTqqH2aPqewAzu=%j5_^?S{TCMriD)`i{NYYfhOl%B;Dk}K+vvT5G z%gmJLi1Bm8yn?=G{6G%s$kYc?-#6PQc6zdToYW^<@@*xKM~weO3`Vg~?GgWpi19u| zD%h@1idE9z8inuLr$Slzca3ELF~Ra(BX1c8331rV^0oEW>AbaGmoM*nc@FfI@|@b& z;M9y9eWe`l##buy`S?mjJ|ADnlL)YQ$T5sG zw|?PI6L>%-0L^&;LXTd&`wTYf>jcjKJq!^;X@s*}w09!E&r@ZiS#W>Ks@1knJu(>eoSkO21qw{0R!r)9U{-x1|I2nk*Q4ym>Fpf*`$}d{i=8k}ZRLg?2hGnOoaPyRphj-1pu6PNa=Yvq zVP+{z9Hy0iXPN_go*wZQ&}uy+5X5&n(of;Y>c07hmSwRUto-#!%q(y_|}D) zG4*dJYHP5@TP_b+wYTQk9p~&Hl`Ez$F#Q+dcfDNTk#(MB+pX9;YV5}oC3d&otF`gD lmY^Uhw>?2o?5RXG^W~WVd;jtTE(InC22WQ%mvv4FO#lmslVtz^ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/cloud_rain.png b/public/images/emoji/twitter/cloud_rain.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f1c989642dcde08e7d332dbce6cb0d932ef0e7 GIT binary patch literal 870 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znn6{3nECJ}$iRos-#&Tu>d_03EJ(qk=eOU!eE?wt zZC?Y_4zm5>iw`eeya1X8HvIL2=Wk-cR^Pu6{S4?AyOJQkV1~CEf7yP1|G@a=(e1yh zUfvYgctAEx>2cTb8Cz!?=}JtP+x5j^(q75LWkI{|sOp@4#m#44ck$S}MM~TazL#>3 z^DqC;z`!K#>Eakt!T9v*)m={%1XvzOeec;_Ty*E|%kTB8M8m2*>N$C;xBjnv(WJzA zDfZs{-YHUZ@5U#|v!{QFe$ThBt8ntaOFi8mif%8K-5b5$MtIYg8l$6A6xufLR#VN` zHNT=?Xm0A;>U&|UZ0!%Qs%F<63twFH^H-MLj@B28zE^*k614JXtH|@tJ5#nFJ!138 zYSGDwHGA^hrhhwj;`E7AChGR#>mS^D@=|V&lK(4>3r;4yTTFxgOj-6MmtnDm#m|3D zu@~o6TiY(L^<@azzGZ(lLp0X{o;g7?TDzW$95Q7SIl`hYazrGTD~Z8Xam959?z4hv z*-yn=EZ^t~Ecxdt_+jUSL&yJ5vG{-g;xvo*@=MOAyZlJ4uD@~R3v18MD^_kh=lQU& z|Ix2|++#xgVc+zas)nb})?R7oepR?+>)#XAv9GOUp2%vu#D|iLcw%xTko|J<(zr_H zOdy*l|42m6laqVG+sv6tuC=zA+_iYn@Vzui{D_br6}OETX3}wN&ca(^u)fTCdkge?9Bvr}f$Y)KB%l<@=Z(Iz?nF TXq~`(Q01#vk6yic^6J&Ymv0`ucn8!A zF$Y3EdiD;i7bplvAMU?@57G#-=q=D~K$VwR;x&LCu`LPm3uX|Q$@WL|u+X!;PYhQ5 zP<^jIWA`uZ*Iy2V&3t^b>*w)rlaKN=bcjs+C&{B4q_b?!=~sJf&0XKs+*1~ z{PP+E1LF-(7srqa#x>Vm*D)Ikuw0l_)0P;MI^$5p_x)GXw=~VIt1fOXjNU!ZEK+ZAnI zF@N#1%AO0bTzbjn%+x-&?T6wSkJi)})P0|qzzls;b{N-pwsOt$yHyYKi~3+T;RatVpy{FUEAqjx<&t!*S?mCRG}qzc{N{3@*|zVj}O`;^-RK33VrT=u1&?ms5pnJDJQo6oD=3&a-$ zXXu8_>SNJ9EPXI%Ba`dqqg*2A#k6C3*^4TaZ|5zFVH6T{4Q$>0;T15kFnGH9xvX7erOegcbc2q}*4>DirH7fOgq5Pq*4=}Yp>>9m%+}q^*4@n3-ptkA zYkGvo(b>$_-OSeAZGDJ=k)DN>qHlkSeT|uNf{l8LmVc0(c!-mAg^*@-e}j{thnS>j zcY$YifNFV!YkGxke20jcrp(sev%txeq_Cv2y^^=-FaQ7mDRfd!QvlHL;ZhM|2f;-A zHKHDrD9!T|btYEqNRH;)u!X6oyJwDcn)uGRd*{D1NJszx1I9^2K~#7Ft=5Hp>PirR z@j(N1cR#wWv8lZOW8DZPz}W!dcmH+!I)yM@SZ6dHpC3I5934V zU^G6O3`oT}+HlShGI$zBu#NqrUY(%Sd;Ev@)b$@m8)rH1)sZ^kDN$T%BUnKg&D|_^ zHHLMf^FAq570)%x61ysw9xF%C?s!mTu%u(#g3U?~&}LYTv=xIKrE16#v1s zEMX37G_@_Eacnn9jl&t9+P2W4mn^ZZVy21587dN6xPhQMM6a}9+0tl9nzQmT=5dai z#Foq$f{t*m+!!s7e$Quf#}bDSG{uda6tS%&f+FriSP$3mN{Xzx^9U9WA#5BjP$e}> z6FZk`iX|UGSagSrD3@9^g<7(3=iLEpF_O>is!T}bv2hQrdZAE~<-$ny?^1YxRzr#n zSFW^r?S>7Z-80AS9Yee5CnMO-{-tWQk=sM^0d^o20sbG$*v)jf!jY zy^d1SbmALW@7cCVwa0HfNseKI6C03ZM&TS4*8YW!PV&{O*>H*tFXO;g3wc7vrJ4PQ zR1TL=6Ib;^*etro7W8|Irq2Mol{{V8BeC}Tu$5@CG=^9@mt@-G1hzD~YdVQ-B)K8s z$61?woHMa4#ktUmVxg!K*{) z=EN3KCUkXTCm+sn+D;g+P~=`>|l%qVitGNIqc#H3z=PT0z2tpfw1|hR16~6 z#fV^q5~UPzzIlvwG#0pQ3cES68W)|zj(%Fp2+lphj;8aC@31h5U~6ZWZ*P}pF!R9d z4C~gp_`UaD*n7NyQgnsHl$TM(m(cCO!E|6Fez?6U4u z_O1b7f{jVhdAY5B%O6*?F=mh+NpzG83R(s*koguPQhqS*`9&fo`IrIJ;7;DxM4}2Ogh17PO@}dr&K`Moq@w`Q_+lZ zpiVr(YEaggeAt_R$8}o8a8}chbjyEa&WCKxglT~`B*AG<$$4J+r8fVpGu4!Nz#8WXEyluh01+&FD@J`qc1na(;R~#)rPfv#7iAeg^7l zxSxSK-BFsJDS%3YU7W+C=f*la?CuQe=W)Y0@;SGZbktcI>fU(&iJWJ$94$?|IpZtE zSdu`kC3f2hx>Qc+Xn{zR4$g!)+>hcgu1Qvh!87SB#Jx(wRTnLxKtZ2f1`o%HtHVpm z!>O-!*TK6%d7jci`TwCvLVxWJgNKvUoJHBQh5T%9gYKl``Pur{QBm14;jra4=(6hM zb%$|1G`89T-Aae$!eMIyL*t%+mUcTdtvbG^3DWA%c4%-Uod}M()v?_Q4b|X<69|X2 z8V9nsCN&X`yTN!l@)6pt(7AMCqZ0-qa!fu(3emyGWheNe&akAqj$E5SbnuqRaed+V zu1W_WQ&O=woDc@Kn-ekBt(9=@&4X`tyhv^&tuJj+zZ;T@1!UEO8VD!X-DfKajhYAV z(gnms?=vTXoJi-oVenWS^zmfD0*?17p@Dfto1KsgC-SQAX@vvP6^#W%9}l;{xOtXI z=(uU{bO9~&*8_*Y; zRMP@tiM&=^Yce21IwoWRk%$5YMA9+E0^+VQqF6;wMe(Ab`!N|jSsXN?Zd88%c$?4X zg@Ue)gSRp`G@?wN@9BMBfkwu}2YPWJqA|nMk;f_PU0v^!g3bx)O#ao9Zi$1BgmNhruutLz_GRV1OVYpU64t22D0XkdRO09Q8OnXoa+tAfL$j)+Pgj6pMV) zoa5=VLy#=hWaJ!8?f{|E%$W0=2LL-mI1cjJUMB=X&T*>_H98>>$>+{eYRYFH2@vwx zOG-&TdrB$EXHO|5`RpmBB%eK{lr*`glp>$|NhzAVpOhk>`$;oAogM2R^XC|<94R?U P00000NkvXXu0mjf1Q{&} literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/comet.png b/public/images/emoji/twitter/comet.png new file mode 100644 index 0000000000000000000000000000000000000000..4ddea9ad812c68c56285071fb05a9304e1c484a2 GIT binary patch literal 1187 zcmV;U1YG-xP)|L$vU!nh8t?XQ_>{_YpT&?S0rs`a+>|CtvT&?U}t?gW_ z>;V7&U9Ie0t?ON_>|L$wT&?U~t?XQ_>s+nuU9Ia}tn6H^>|CtuT&(O}t?ON_?7iLe zjLP?4uI-A+_qE#fq0;qjw(n)K?wil`r_}Y7&i8e@@oBX0yWREm`1*ju^iNx{q_xjG|_U!ceaJlh@#`eVE_Sot7D|hDQ0000YbW%=J0Qel!M|c$d z0`u7oCI@df>{nv}lTUx%wTG#|FXNv=%dE(F(rEwy18_-1K~#7FotX9V!bl8&54WE? z4%w|6?(+U`b#0b5b1id|<@=v+Vw(W}JWgj^n@)xeXtlq}k6WH}Q zSeoB|6bn*%X+BVxmtV+H8R%>3-4^8ede+zc6g7<({iJ^0pg^mtt9h=GhIo6`^;Fw% zhnB9VJc1n2GHLr*GpnCcPU9}zq|V=Zo^d`aBQz5a)bz6YgB}F{L~kNuf0c@w3(dBnm-ctYi!p`b*}u zOysR8pgyzl=vkpBMhR@;QH935hl+&`rSt`2Ni4ZV0Zn+mS&5ZYp?yJ6$sP6#efCv>Y>~syUfGZ})Zgl56g{3=GPXl7E9J%GE z6j8ltA^p~M|7fTHxPml$%RrC*UsdHc0IUvsRpyJ@+I@dh@?TQgFDo&vZq@(*002ovPDHLkV1k`j BU&{ah literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/compression.png b/public/images/emoji/twitter/compression.png new file mode 100644 index 0000000000000000000000000000000000000000..b22237fb7f21e5f31010eea0f505b070c931d3ee GIT binary patch literal 742 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(znn|f}y^xe}+>T+{) zZ|i^<>7{k)W%cPr)#;`6*VO~kOX@@G>u-USxd9aeQCe}`%vD<;x@NB0d_&s@B&+KV zR1aia*LA-MQt1v+43Yxs(s!S=Y70;oPz?}W(Q>=3?|#R?1*itdy{Yd3Hrykz zprr1$fd|kf8KpHqTYw6lh37r?Nq!zxaL3g5wuv{;s2R&Q&RDTYrueTi&@W~sL4Lsu zf8QNvm-&1lNBSh&C$@E;K3>iB`SNZb?c;cdl?uQ=X<(1hEy=Vy`EadWWdw#@WH!x@6K!&dH!$ttdgU*CQaPAcmL;_ z8ws3mL_T$z?9-ULLcBpp%kqOuUr@&jlL-q8_k=i2vyllbQ0Pu(D634_#ju;jDD}ox>2=B& z3s3sYdazjL&BrT`Diq{onFMEP{^0oW&-wqt{}=RmV#|&vo!?RY^;CdchS7SS)>gGY zr!H*0@Fh-i*X6iqwF7*bjkh=4;QG#VfHQMiw8M`l7wS8HOuu_cY*NG)9(6sz^xv}Y zgbeHBvY#}S+-qMe7InohZcE+^SM7hvWhZV_w+g)%U8OAkeud(Pb2?1_KP0y)Oez21 zT-IErbe6-=AWx9#v)ICm+d1TGyD!YJ-#TBQNWJ-JlEKSm&cCK;J`kRy@6h^1bMkF< zk@>fI1cP@ix$$YXVv?7*$g-!?40awkcbd2IzP3o(o-JR4A~`2_e@siC?lo&^d6O0?$xVj`L<-!+cLA#oL7uT-@W>K_{N&o-= literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/construction_site.png b/public/images/emoji/twitter/construction_site.png new file mode 100644 index 0000000000000000000000000000000000000000..082a7432656cad8fc72c4bb3995d90e5ba7dfccb GIT binary patch literal 1194 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/cricket.png b/public/images/emoji/twitter/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..128d9efa82f8e0b4cdd4b635a1eeae55a2ed4b00 GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#-TQ2`sAI=NDGPzt+-#ATCxIjVdVo~}b9h(bX`S}WBr^CW_rTJF-JNepLE!Q+$u4S~y zEq@EpBibcFe!&cE*Dl$9{_6aVN%(q2a>(z=v;NAaCwvcBdiT-o&-;5O9BH^!uF-j~ z`_asa_p&biWME)C;_2cTQo;E4%F|7^4FuW}HDw+ra>yQ=dMISi|I@3E&Gk*)wpH)< z-}&kLeBT&MEqym9x@TUo;?g|@zf#=UYO@4XUq9NtIYww{amk8F&3vI&?(JHU;x7VJ z*=1K<$=CZjYpQ3jeZa1@9>4y4oT0H$`KjZhyz4Gb?5cHU4f7gX_`Gzb8F*AnrljoE zJ{sVpeu8~XaMUhW^$fQOeM|1~ZIBC$3fY=zw>E1se`xNl#-D1Z`(@I1z2r@sn0_E9 zn46*OV*ELWM`kO;ivRvL+x3p8X_;~Eq?2lP451lUczjgEHymDJ*>JFQE#IGvhwPWG z_+&Nvoqbj$*SH{ENt0W)spW5SknU9=654P5b60%5i>22nUyLeVu2a9roX~ecmq}72E9*ANAUQ95>sO;;3;`FFp0q qy{oV5{#QNCl()96E>M2|+uYqXIC9Q^-VMNHz~JfX=d#Wzp$P!i(_j$* literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/cross.png b/public/images/emoji/twitter/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..53f8e5cd4b05e6079b51fc1fc889131ab3555386 GIT binary patch literal 409 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAjKPJmB{t50U(q_i^=GEU7*J2NTu z%*52w6Vrg`OnvATAUP@ZGzfu3z}z!Ha$@?qDJds`;*){w+*?4#M4(2n8lVY4(;(>c zyPyC6|KB+2_Qr{~Hch_$`Teiujo$@<_R5w7`2{n4(qX;)dBPvIiBtZ5xzg7=Sxft> zF8iM8dv|}Fw(p0^)XPAH`#oJ8Ln;{G-f)#VAbD6a)l<01dp5(sFGQ2~fi6d(L_xqfwtelxX5ssG@)wf?L+a~1ZetByfgP@CmBMXEO zdHBbnLZUuXW25D*AKuE(HFyQYCHxE-uSf*2GCWnivr~P8SF+%a*sHJBoUNVpQ!CQS cXZ1(M$4@<-XMNP(0`v-lr>mdKI;Vst07QAZQvd(} literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/crossed_swords.png b/public/images/emoji/twitter/crossed_swords.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1da04367bdf397a372da74fd9e2de432f68475 GIT binary patch literal 899 zcmV-}1AP36P)Q{{Xi>jtQq0xethmCexxxRdKVTggV;~h{AQiu8QNCzVV;~iRIv&1g zQvazx`>Q{{Xi>myP|MZbV;~j$szLm#KfY;EzGzWnAQir7QDY$$*N8S`AQt z4lhX^UXnVzBz1U6>hO}-;U&4lOS~hKctU|Byc1Wb>tH7$R+BCrGwm| z()%5h-tVCFZU?3JJN$S*oPCgkZHQ9s#LnOM{%4}|{{KvL1X80uD9l-h zNb|y=-pF>WVi<z_o9`HRwh&lG|~fg0I2k6oUoe- zO?xO&hf3)5rjVKMp+p=aq2u{LqtX*~lG0P!;icdFf99W8IAG6iP(p`F=-kX~-U)K* zHYuTlQqs9qxqx%5zETMZorIKhlxBE zHao6g08-(&hnd2bX=gmdg*n?d(f~*UjF{;fFOE<{_4uo@h&yZ`_IFmzH*QvmBPLjwE#fGgAt z8oti-htKIisJ|Od-+;6lD%FxrlS(5y@L}|E6x4h~sh($a<+hAnIRF3w5J^NqRCodH z&xM-8Fc1Xb0g5}EySr_G^Sk$dD_o+;CZFf8x9NO4h@vP`6le@C<-akklwT2avTjgu zMbO@wK?Pb7w7)VaPr4Q~S0qWn;f{1$(6mXm4Tonjm$i`P&Z1M&6sY(GQEfi1k)i@b-_~s!iC;$Ke literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/dagger.png b/public/images/emoji/twitter/dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..85607ff4c048f19245e670e13a2800666000aa9c GIT binary patch literal 878 zcmV-!1CjiRP)BW^{g9W^i6?byHtwPFY}3TV#}@u6*~2t^fc4FmzH*Qve1Hs04ty;^pMz zGy3Qc#T+jxpi{!v@$4LWBG%$UmZ4qxvqHO#SDQ5A9Vd5-(2l(`!?E?7?XNkbHlHZ4V9-z-+))`zLj_a_P6PVQbfCphx_62iBn3Vg0y`xNWo`FU5 zaQ9!PEftJfL>K=YvY7BC)-}=gc;Vx!n5s>E4+Desgm6>fYR>s~KY@*Vz|?yys2nCN;j@yzQ? z5QPu0q4Ee1w=D>QJX7#6o;1Sq(QE98^bm*1Tz!IL%w#qMNuSBIv7))`2?!RuZm_W* zzlG{HUgVCMphpaF`#cZQ!|9D-P=RL?W88MSP5uwQ0S?#-?NEW5wEzGB07*qoM6N<$ Eg0n565&!@I literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/dark_sunglasses.png b/public/images/emoji/twitter/dark_sunglasses.png new file mode 100644 index 0000000000000000000000000000000000000000..5e20bb49f5fcc78f8a785052266615d5b8d27f44 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#fdHQnSD(y64Lu`uT_Yf=p${hY zj5YL)HT8`_A|NSaO|XcTmX@}*Hdu|ZmW_=%Pz^|np(aolSR;_D4&;IrL-c}4h&jfZ zhK4{cNQ)lWKwTggY>}RkmX-xXJ?pJWuMRT?AfaQXvQkly%!I8sa{c=^gBc7_|aR+wcACqxoXX2 zv)`Bg@+)SS=Jzi-6}xxcjFKkN1oeHY)2<)$5)xef@Nuip8ZEP^BVGkZ6#CkFv+Gji z-9;YpoIAVbaYVm_IHTF44hf;YS_QZ7Z_Zq|FjI2lw-!!1apH&1(|d{P3yT7KdeXH@ z|4Uid&G(8tu_|C?`kstHP2Na(+h?ESO?)-&;-$s6mL^LbP0l+XkKOpoaO literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/desert.png b/public/images/emoji/twitter/desert.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec8a867b45e3ea067cf8dbc40520fb45908f4cb GIT binary patch literal 1001 zcmVVdl|#{nvoO#%$Wo zcCol%+Qn~slRoB^9*)H0e!G)DbRKuIRsYOP?#yOXh&2DKGjOU-g2K^xwQK*nKJ<_b z|E@Hz%E4))N!81Wd$_jmlNbN8IQq<0#Hn?izROB~D6_Mhc(h$*o7j(^X^>$ippOu{i*=EH1XU86~6w- zFUZiHd$PxikS_9kkzS}r@|HYsoiq=d@{}%tXP-;!McB5`ntD150$-=0QL23)Le4;W zXl9K>hAJG$9H|-v`M4o-Oa35eX`L+0_3{P~;b^y8cA<4>|NS?+kmH|-`)Ge1`_Xcd z>~@LZJrMOX0z&;Hpa&v-*x*gIm30q9`P7Q5vzL;)5V2TYi{vIA3<=dq42F^}lnjQH z)!)$iG-oRq4e?X<-GNh~SR{#v9q7z5jIA98K3`m@MzZcgu*%xzA2w7=8QD;KAz~Ba zhs%HOQOA%q)*KTx1hg9e(~(C#x&Lk%JdE$H3vpfQX! zXbR10KI>AMkz>#3L(>7IkPU(PRR%w1koU2oPR_y{_DD3ZPSd2iEU1pT%n9T#Ljboy&1!}THHK}3x(8B1 zG9lbMSU^%dnNX*5M|TDE5UCsEe?nXqL~Tn3q!8kz;NMX%u}bm|C*~oQxr!JipR4f= X9ND+EJ^Ir;00000NkvXXu0mjfMi}ao literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/desktop.png b/public/images/emoji/twitter/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..ba57371eba49ff033481428f2a5b8177d72c266d GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAk#`~|&s+zZa|>wN>8p26UAqG$&zv~}6bEVq8U++T0~7?3SAh($dNAYRi?^|B-+cY? zYu2hQSITBv0iCB)666=maG7l)dye$^KcCr-f6n`I@aPg4rzTL-`s-OI;FMj{1@!rMq z+q6p<7_MC`Q~bZ>#=38NZqAWE;=PYM-g^6^w?-`MTo1BbV-K8gzSHGsk8q%1KzEnw zr+4q>KbhOAlcLD|RUJq~o^TS2>gv+od;js&6*D%ScXhODo2${$@WE|QtPJBJPrbNL zFHX$$DieYc?#0xvc zzn`z!wrmdKI;Vst0CbrXq5uE@ literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/dividers.png b/public/images/emoji/twitter/dividers.png new file mode 100644 index 0000000000000000000000000000000000000000..fe01846bb5081b41be9072f52f30315d2727d6f0 GIT binary patch literal 638 zcmV-^0)hRBP)|J#Fju~>VrS9q~lcd%G^u~`4n zaR1}B{L5GU*oghthjp-9{pPrLuvq-qi2c}z{^z)vaLKlk#PZp??$o;N)VuxIi2ci0 zc(GaWk0zOJ$MTXW_R3iN)PwuPQuU%X@yn2;xmdJ}w9~^_l4#2Hr$+9`Sn0@E@{}xq zvswGkdxx}HjkQ?%!D+LLw)2`b?8lPxm@)alXtj;B$F+IP0000SbW%=J0P-CstMcxw z^6?$69jqPl@$M%a?yRpTsju#;9Vg&I0003|Nklr;I41nQtcNe5hIQP2u z{hz9`vlEVRg4DbJ2y1+ki0V&PDwZv(+-(PTs+OZ_DIip|SjB))nM0Mx(Q@ewy0ToM zER(M7aTpj~Dsgm%-}Xh4l-Q^XYwbcS0U zfu@onYKmjYEY8sfG#jvH$nyq`I5hGO6`Dz)2CiUF$ySXyJpgYIuUBwDP2f##?``J- z_SbhnNpLrLBxnQsOFAF`m@kKGYIyem@I(V$!GRbwCq`0pm`G+rju&XTW<7()7&PS2 z&_5JQL^W;gO7mDWAD2!_(*i+MDkh+W*y!BRHSZ+^6cuZOLx$$PtbjDpDH};QH6KYx zWExwPZk%XAA)bO1q#y+;NI?qvF_3~36b_Q(h^U^(hGDY#c;qMc Y3W$Kwjw#w=-2eap07*qoM6N<$f~wd(&;S4c literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/dove.png b/public/images/emoji/twitter/dove.png new file mode 100644 index 0000000000000000000000000000000000000000..c303dda42923206c0089a778d096c00b77a4d77d GIT binary patch literal 1149 zcmV-@1cLjCP)$^ zwVA55%+}q@*4>$@w3({3nX0r~kvdzCI$M!Bo3E~0kvh!R-I=PjTai0kkvdzDI+?1p znX0v!s^*4&Qve^UHx&JL3ianI zi&AL2^_$D;tk+#PmG+_@ZD~nCgD|yzRKwKY+snb*lGHA)KH~rY142neK~#7F)z<}c z!#WTI;5ABiI1OW&PYOfn|NpF)SdFW3ZOiTBuP}V0TdfNCpSW&L836a@njr^+$w83t4NsfjFADtaWPgA4&3 z1SpV_(q-MQixixWf(r6o$xnBOk!MKZkz$(EluFiqj6QJ}xw=x5QYVW}eB|m#O^>D4 zNNFHnPijU;^67*d?@e=-S|i0XJ~$=4mzG!fM3&6Ew-Uu#_(=h#iRN>PmGG00u9H7P zVmySwG&>~6qgWdzS5oKdi?!%WYXXB#X4*FCxP^SK)QyriRy=Jc)1RA92@T_*)NcD8 zB~*X3+I8AqO8G}&->Km?eP@}kKUt)(MJdYWLTY*dDxA{z<|m><*dQuCsBE`5Z}<$r zjnuu=J<3qQH>^rZ-~df+%KIB-Q*Y$5KOD2~o#o}PpSABE<>3rR_dvZP#|qh~X|eB34%;4dm4^MQ0uK=eA_ypd)ZO?snT zfeT$2w5s*evk+T-5%2xQln{52=KN92cT||FNh)_Y7n>y&Wn0L?muoS9rD6hPYtids zCAMT{c&(*{5Sy9Ucw}ZH+u&9Rv05&~!Wb0yk>f!ez0y|9)TG^JHeYNLU223CzwIK& zSVTUEKB6=2W)$RO=6LP;ihkhQ?{d-L8iyrZ1Esbf^Rr2~pHo zD3{5CwWFveDC{C-kYcq<6%@zrldJs}i_Ub8zre62YWPbG`WN_%Fqr%S_F8by+Wgpr P00000NkvXXu0mjfCXz$Q literal 0 HcmV?d00001 diff --git a/public/images/emoji/twitter/eye.png b/public/images/emoji/twitter/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..182e1052304c998c3fcb98154b3d299032254abd GIT binary patch literal 1022 zcmVsx2?Ox>hAH`;pL*SyR^Z{DK9hh_xV$&=4Q0; z>+|`P%JWyP?#tx&HBo2d=R{=)7;@IGC0iE+=IgMLrP9o zt?s|e(zo07U9s;vV12W@`HupF zV>528=1J04xW&d~+-?8>0^3PMK~#7F?bp?Q!e|f$a6G}OoQVf_w+gWP{*Sdwn6JdK z+x+j^!uieT(^Nnrkw_FPL-}3s)nJe zHrQu5dw(&qQ;V*CS!SD9+qAw^-Kk5?-4|1k&M8fcGu$+*dCrmwx1%!hIYwP^ing3@ zC*AI3J6~#C*-AY}m2M31y$-+_)5Wa+qx|{l&*)-o0LVAu$|(R)O}gmy_ln29-xE

lc3`B2T&hJ+Gj7>?l`$ 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 DN?9P+ literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/comet.png b/public/images/emoji/apple/comet.png new file mode 100644 index 0000000000000000000000000000000000000000..2e548168097d6ded99008ed221886a743757b505 GIT binary patch literal 3492 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 UgZZtQ4*&oF07*qoM6N<$g4bfkS^xk5 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/couch.png b/public/images/emoji/apple/couch.png new file mode 100644 index 0000000000000000000000000000000000000000..0fe1d1dc7237ac561ff8c913d099278d4eefd8b4 GIT binary patch literal 4822 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/cricket.png b/public/images/emoji/apple/cricket.png new file mode 100644 index 0000000000000000000000000000000000000000..fad7fbf328d9aa6f694d046333fce59b8227affc GIT binary patch literal 4574 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 JPDHLkV1jrw0*L?s literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/dagger.png b/public/images/emoji/apple/dagger.png new file mode 100644 index 0000000000000000000000000000000000000000..76ecf22803231eb5496aab7ef289f8cd28db4ce5 GIT binary patch literal 3095 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/desert.png b/public/images/emoji/apple/desert.png new file mode 100644 index 0000000000000000000000000000000000000000..eed6da83a9eb5d08b2ca806efa86061d2809dc4f GIT binary patch literal 6692 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/dove.png b/public/images/emoji/apple/dove.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc892768bfb2820d9d5406b4a4bf0f5136d4fab GIT binary patch literal 6214 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/eye.png b/public/images/emoji/apple/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..2e04514af4356bf56da119a99bb7a54ea0c206b4 GIT binary patch literal 4859 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_cn.png b/public/images/emoji/apple/flag_cn.png new file mode 100644 index 0000000000000000000000000000000000000000..0b265515a9fbc981c70a1ee8bcbb4d92458d7bca GIT binary patch literal 2688 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 literal 0 HcmV?d00001 diff --git a/public/images/emoji/apple/flag_es.png b/public/images/emoji/apple/flag_es.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cfcef840331083d9adec2e82debe797cb70019 GIT binary patch literal 3912 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