Merge branch 'features/mild-master' of https://github.com/YoheiZuho/mastodon into features/material-theme
@ -4,7 +4,25 @@ update_configs:
|
|||||||
- package_manager: "ruby:bundler"
|
- package_manager: "ruby:bundler"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
update_schedule: "weekly"
|
update_schedule: "weekly"
|
||||||
|
# Supported update schedule: live daily weekly monthly
|
||||||
|
version_requirement_updates: "auto"
|
||||||
|
# Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
|
||||||
|
allowed_updates:
|
||||||
|
- match:
|
||||||
|
dependency_type: "all"
|
||||||
|
# Supported dependency types: all indirect direct production development
|
||||||
|
update_type: "all"
|
||||||
|
# Supported update types: all security
|
||||||
|
|
||||||
- package_manager: "javascript"
|
- package_manager: "javascript"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
update_schedule: "weekly"
|
update_schedule: "weekly"
|
||||||
|
# Supported update schedule: live daily weekly monthly
|
||||||
|
version_requirement_updates: "auto"
|
||||||
|
# Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
|
||||||
|
allowed_updates:
|
||||||
|
- match:
|
||||||
|
dependency_type: "all"
|
||||||
|
# Supported dependency types: all indirect direct production development
|
||||||
|
update_type: "all"
|
||||||
|
# Supported update types: all security
|
||||||
|
2
.gitignore
vendored
@ -58,7 +58,7 @@ yarn-error.log
|
|||||||
yarn-debug.log
|
yarn-debug.log
|
||||||
|
|
||||||
# Ignore vagrant log files
|
# Ignore vagrant log files
|
||||||
ubuntu-xenial-16.04-cloudimg-console.log
|
*-cloudimg-console.log
|
||||||
|
|
||||||
# Ignore Docker option files
|
# Ignore Docker option files
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
6
Gemfile
@ -133,7 +133,7 @@ end
|
|||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'active_record_query_trace', '~> 1.7'
|
gem 'active_record_query_trace', '~> 1.7'
|
||||||
gem 'annotate', '~> 3.0'
|
gem 'annotate', '~> 3.1'
|
||||||
gem 'better_errors', '~> 2.6'
|
gem 'better_errors', '~> 2.6'
|
||||||
gem 'binding_of_caller', '~> 0.7'
|
gem 'binding_of_caller', '~> 0.7'
|
||||||
gem 'bullet', '~> 6.1'
|
gem 'bullet', '~> 6.1'
|
||||||
@ -141,11 +141,11 @@ group :development do
|
|||||||
gem 'letter_opener_web', '~> 1.4'
|
gem 'letter_opener_web', '~> 1.4'
|
||||||
gem 'memory_profiler'
|
gem 'memory_profiler'
|
||||||
gem 'rubocop', '~> 0.79', require: false
|
gem 'rubocop', '~> 0.79', require: false
|
||||||
gem 'rubocop-rails', '~> 2.4', require: false
|
gem 'rubocop-rails', '~> 2.5', require: false
|
||||||
gem 'brakeman', '~> 4.8', require: false
|
gem 'brakeman', '~> 4.8', require: false
|
||||||
gem 'bundler-audit', '~> 0.6', require: false
|
gem 'bundler-audit', '~> 0.6', require: false
|
||||||
|
|
||||||
gem 'capistrano', '~> 3.12'
|
gem 'capistrano', '~> 3.13'
|
||||||
gem 'capistrano-rails', '~> 1.4'
|
gem 'capistrano-rails', '~> 1.4'
|
||||||
gem 'capistrano-rbenv', '~> 2.1'
|
gem 'capistrano-rbenv', '~> 2.1'
|
||||||
gem 'capistrano-yarn', '~> 2.0'
|
gem 'capistrano-yarn', '~> 2.0'
|
||||||
|
76
Gemfile.lock
@ -82,7 +82,7 @@ GEM
|
|||||||
public_suffix (>= 2.0.2, < 5.0)
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
airbrussh (1.4.0)
|
airbrussh (1.4.0)
|
||||||
sshkit (>= 1.6.1, != 1.7.0)
|
sshkit (>= 1.6.1, != 1.7.0)
|
||||||
annotate (3.0.3)
|
annotate (3.1.1)
|
||||||
activerecord (>= 3.2, < 7.0)
|
activerecord (>= 3.2, < 7.0)
|
||||||
rake (>= 10.4, < 14.0)
|
rake (>= 10.4, < 14.0)
|
||||||
arel (9.0.0)
|
arel (9.0.0)
|
||||||
@ -91,23 +91,23 @@ GEM
|
|||||||
encryptor (~> 3.0.0)
|
encryptor (~> 3.0.0)
|
||||||
av (0.9.0)
|
av (0.9.0)
|
||||||
cocaine (~> 0.5.3)
|
cocaine (~> 0.5.3)
|
||||||
aws-eventstream (1.0.3)
|
aws-eventstream (1.1.0)
|
||||||
aws-partitions (1.286.0)
|
aws-partitions (1.296.0)
|
||||||
aws-sdk-core (3.92.0)
|
aws-sdk-core (3.94.0)
|
||||||
aws-eventstream (~> 1.0, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.239.0)
|
aws-partitions (~> 1, >= 1.239.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
jmespath (~> 1.0)
|
jmespath (~> 1.0)
|
||||||
aws-sdk-kms (1.30.0)
|
aws-sdk-kms (1.30.0)
|
||||||
aws-sdk-core (~> 3, >= 3.71.0)
|
aws-sdk-core (~> 3, >= 3.71.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.61.1)
|
aws-sdk-s3 (1.61.2)
|
||||||
aws-sdk-core (~> 3, >= 3.83.0)
|
aws-sdk-core (~> 3, >= 3.83.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sigv4 (1.1.1)
|
aws-sigv4 (1.1.2)
|
||||||
aws-eventstream (~> 1.0, >= 1.0.2)
|
aws-eventstream (~> 1.0, >= 1.0.2)
|
||||||
bcrypt (3.1.12)
|
bcrypt (3.1.13)
|
||||||
better_errors (2.6.0)
|
better_errors (2.6.0)
|
||||||
coderay (>= 1.0.0)
|
coderay (>= 1.0.0)
|
||||||
erubi (>= 1.0.0)
|
erubi (>= 1.0.0)
|
||||||
@ -128,14 +128,13 @@ GEM
|
|||||||
bundler (>= 1.2.0, < 3)
|
bundler (>= 1.2.0, < 3)
|
||||||
thor (~> 0.18)
|
thor (~> 0.18)
|
||||||
byebug (11.1.1)
|
byebug (11.1.1)
|
||||||
capistrano (3.12.1)
|
capistrano (3.13.0)
|
||||||
airbrussh (>= 1.0.0)
|
airbrussh (>= 1.0.0)
|
||||||
i18n
|
i18n
|
||||||
rake (>= 10.0.0)
|
rake (>= 10.0.0)
|
||||||
sshkit (>= 1.9.0)
|
sshkit (>= 1.9.0)
|
||||||
capistrano-bundler (1.3.0)
|
capistrano-bundler (1.6.0)
|
||||||
capistrano (~> 3.1)
|
capistrano (~> 3.1)
|
||||||
sshkit (~> 1.2)
|
|
||||||
capistrano-rails (1.4.0)
|
capistrano-rails (1.4.0)
|
||||||
capistrano (~> 3.1)
|
capistrano (~> 3.1)
|
||||||
capistrano-bundler (~> 1.1)
|
capistrano-bundler (~> 1.1)
|
||||||
@ -202,25 +201,25 @@ GEM
|
|||||||
dotenv (= 2.7.5)
|
dotenv (= 2.7.5)
|
||||||
railties (>= 3.2, < 6.1)
|
railties (>= 3.2, < 6.1)
|
||||||
e2mmap (0.1.0)
|
e2mmap (0.1.0)
|
||||||
elasticsearch (7.5.0)
|
elasticsearch (7.6.0)
|
||||||
elasticsearch-api (= 7.5.0)
|
elasticsearch-api (= 7.6.0)
|
||||||
elasticsearch-transport (= 7.5.0)
|
elasticsearch-transport (= 7.6.0)
|
||||||
elasticsearch-api (7.5.0)
|
elasticsearch-api (7.6.0)
|
||||||
multi_json
|
multi_json
|
||||||
elasticsearch-dsl (0.1.8)
|
elasticsearch-dsl (0.1.9)
|
||||||
elasticsearch-transport (7.5.0)
|
elasticsearch-transport (7.6.0)
|
||||||
faraday (>= 0.14, < 1)
|
faraday (~> 1)
|
||||||
multi_json
|
multi_json
|
||||||
encryptor (3.0.0)
|
encryptor (3.0.0)
|
||||||
equatable (0.6.1)
|
equatable (0.6.1)
|
||||||
erubi (1.9.0)
|
erubi (1.9.0)
|
||||||
et-orbi (1.2.3)
|
et-orbi (1.2.3)
|
||||||
tzinfo
|
tzinfo
|
||||||
excon (0.71.0)
|
excon (0.73.0)
|
||||||
fabrication (2.21.0)
|
fabrication (2.21.1)
|
||||||
faker (2.11.0)
|
faker (2.11.0)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
faraday (0.17.3)
|
faraday (1.0.1)
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
fast_blank (1.0.0)
|
fast_blank (1.0.0)
|
||||||
fastimage (2.1.7)
|
fastimage (2.1.7)
|
||||||
@ -342,7 +341,7 @@ GEM
|
|||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
railties (>= 4)
|
railties (>= 4)
|
||||||
request_store (~> 1.0)
|
request_store (~> 1.0)
|
||||||
loofah (2.4.0)
|
loofah (2.5.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.7.1)
|
mail (2.7.1)
|
||||||
@ -376,7 +375,7 @@ GEM
|
|||||||
nio4r (2.5.2)
|
nio4r (2.5.2)
|
||||||
nokogiri (1.10.9)
|
nokogiri (1.10.9)
|
||||||
mini_portile2 (~> 2.4.0)
|
mini_portile2 (~> 2.4.0)
|
||||||
nokogumbo (2.0.1)
|
nokogumbo (2.0.2)
|
||||||
nokogiri (~> 1.8, >= 1.8.4)
|
nokogiri (~> 1.8, >= 1.8.4)
|
||||||
nsa (0.2.7)
|
nsa (0.2.7)
|
||||||
activesupport (>= 4.2, < 6)
|
activesupport (>= 4.2, < 6)
|
||||||
@ -408,7 +407,7 @@ GEM
|
|||||||
parallel (1.19.1)
|
parallel (1.19.1)
|
||||||
parallel_tests (2.32.0)
|
parallel_tests (2.32.0)
|
||||||
parallel
|
parallel
|
||||||
parser (2.7.0.5)
|
parser (2.7.1.1)
|
||||||
ast (~> 2.4.0)
|
ast (~> 2.4.0)
|
||||||
parslet (1.8.2)
|
parslet (1.8.2)
|
||||||
pastel (0.7.3)
|
pastel (0.7.3)
|
||||||
@ -434,7 +433,7 @@ GEM
|
|||||||
pry (~> 0.10)
|
pry (~> 0.10)
|
||||||
pry-rails (0.3.9)
|
pry-rails (0.3.9)
|
||||||
pry (>= 0.10.4)
|
pry (>= 0.10.4)
|
||||||
public_suffix (4.0.3)
|
public_suffix (4.0.4)
|
||||||
puma (4.3.3)
|
puma (4.3.3)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.1.0)
|
pundit (2.1.0)
|
||||||
@ -493,25 +492,25 @@ GEM
|
|||||||
rdf (~> 3.1)
|
rdf (~> 3.1)
|
||||||
redcarpet (3.4.0)
|
redcarpet (3.4.0)
|
||||||
redis (4.1.3)
|
redis (4.1.3)
|
||||||
redis-actionpack (5.0.2)
|
redis-actionpack (5.2.0)
|
||||||
actionpack (>= 4.0, < 6)
|
actionpack (>= 5, < 7)
|
||||||
redis-rack (>= 1, < 3)
|
redis-rack (>= 2.1.0, < 3)
|
||||||
redis-store (>= 1.1.0, < 2)
|
redis-store (>= 1.1.0, < 2)
|
||||||
redis-activesupport (5.0.4)
|
redis-activesupport (5.0.4)
|
||||||
activesupport (>= 3, < 6)
|
activesupport (>= 3, < 6)
|
||||||
redis-store (>= 1.3, < 2)
|
redis-store (>= 1.3, < 2)
|
||||||
redis-namespace (1.7.0)
|
redis-namespace (1.7.0)
|
||||||
redis (>= 3.0.4)
|
redis (>= 3.0.4)
|
||||||
redis-rack (2.0.4)
|
redis-rack (2.1.2)
|
||||||
rack (>= 1.5, < 3)
|
rack (>= 2.0.8, < 3)
|
||||||
redis-store (>= 1.2, < 2)
|
redis-store (>= 1.2, < 2)
|
||||||
redis-rails (5.0.2)
|
redis-rails (5.0.2)
|
||||||
redis-actionpack (>= 5.0, < 6)
|
redis-actionpack (>= 5.0, < 6)
|
||||||
redis-activesupport (>= 5.0, < 6)
|
redis-activesupport (>= 5.0, < 6)
|
||||||
redis-store (>= 1.2, < 2)
|
redis-store (>= 1.2, < 2)
|
||||||
redis-store (1.5.0)
|
redis-store (1.8.2)
|
||||||
redis (>= 2.2, < 5)
|
redis (>= 4, < 5)
|
||||||
regexp_parser (1.6.0)
|
regexp_parser (1.7.0)
|
||||||
request_store (1.5.0)
|
request_store (1.5.0)
|
||||||
rack (>= 1.4)
|
rack (>= 1.4)
|
||||||
responders (3.0.0)
|
responders (3.0.0)
|
||||||
@ -522,7 +521,7 @@ GEM
|
|||||||
rqrcode (1.1.2)
|
rqrcode (1.1.2)
|
||||||
chunky_png (~> 1.0)
|
chunky_png (~> 1.0)
|
||||||
rqrcode_core (~> 0.1)
|
rqrcode_core (~> 0.1)
|
||||||
rqrcode_core (0.1.1)
|
rqrcode_core (0.1.2)
|
||||||
rspec-core (3.9.1)
|
rspec-core (3.9.1)
|
||||||
rspec-support (~> 3.9.1)
|
rspec-support (~> 3.9.1)
|
||||||
rspec-expectations (3.9.1)
|
rspec-expectations (3.9.1)
|
||||||
@ -550,7 +549,8 @@ GEM
|
|||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 1.4.0, < 1.7)
|
unicode-display_width (>= 1.4.0, < 1.7)
|
||||||
rubocop-rails (2.4.2)
|
rubocop-rails (2.5.2)
|
||||||
|
activesupport
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 0.72.0)
|
rubocop (>= 0.72.0)
|
||||||
ruby-progressbar (1.10.1)
|
ruby-progressbar (1.10.1)
|
||||||
@ -667,7 +667,7 @@ DEPENDENCIES
|
|||||||
active_model_serializers (~> 0.10)
|
active_model_serializers (~> 0.10)
|
||||||
active_record_query_trace (~> 1.7)
|
active_record_query_trace (~> 1.7)
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
annotate (~> 3.0)
|
annotate (~> 3.1)
|
||||||
aws-sdk-s3 (~> 1.61)
|
aws-sdk-s3 (~> 1.61)
|
||||||
better_errors (~> 2.6)
|
better_errors (~> 2.6)
|
||||||
binding_of_caller (~> 0.7)
|
binding_of_caller (~> 0.7)
|
||||||
@ -677,7 +677,7 @@ DEPENDENCIES
|
|||||||
browser
|
browser
|
||||||
bullet (~> 6.1)
|
bullet (~> 6.1)
|
||||||
bundler-audit (~> 0.6)
|
bundler-audit (~> 0.6)
|
||||||
capistrano (~> 3.12)
|
capistrano (~> 3.13)
|
||||||
capistrano-rails (~> 1.4)
|
capistrano-rails (~> 1.4)
|
||||||
capistrano-rbenv (~> 2.1)
|
capistrano-rbenv (~> 2.1)
|
||||||
capistrano-yarn (~> 2.0)
|
capistrano-yarn (~> 2.0)
|
||||||
@ -766,7 +766,7 @@ DEPENDENCIES
|
|||||||
rspec-rails (~> 4.0)
|
rspec-rails (~> 4.0)
|
||||||
rspec-sidekiq (~> 3.0)
|
rspec-sidekiq (~> 3.0)
|
||||||
rubocop (~> 0.79)
|
rubocop (~> 0.79)
|
||||||
rubocop-rails (~> 2.4)
|
rubocop-rails (~> 2.5)
|
||||||
ruby-progressbar (~> 1.10)
|
ruby-progressbar (~> 1.10)
|
||||||
sanitize (~> 5.1)
|
sanitize (~> 5.1)
|
||||||
sidekiq (~> 6.0)
|
sidekiq (~> 6.0)
|
||||||
|
@ -80,7 +80,7 @@ A **Vagrant** configuration is included for development purposes.
|
|||||||
|
|
||||||
Mastodon is **free, open-source software** licensed under **AGPLv3**.
|
Mastodon is **free, open-source software** licensed under **AGPLv3**.
|
||||||
|
|
||||||
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository, or submit translations using Weblate. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
You can open issues for bugs you've found or features you think are missing. You can also submit pull requests to this repository, or submit translations using Crowdin. To get started, take a look at [CONTRIBUTING.md](CONTRIBUTING.md). If your contributions are accepted into Mastodon, you can request to be paid through [our OpenCollective](https://opencollective.com/mastodon).
|
||||||
|
|
||||||
**IRC channel**: #mastodon on irc.freenode.net
|
**IRC channel**: #mastodon on irc.freenode.net
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
|||||||
ResolveAccountWorker.perform_async(signed_request_account.acct)
|
ResolveAccountWorker.perform_async(signed_request_account.acct)
|
||||||
end
|
end
|
||||||
|
|
||||||
DeliveryFailureTracker.track_inverse_success!(signed_request_account)
|
DeliveryFailureTracker.reset!(signed_request_account.inbox_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
def process_payload
|
def process_payload
|
||||||
|
@ -19,7 +19,7 @@ module Admin
|
|||||||
@followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
|
@followers_count = Follow.where(target_account: Account.where(domain: params[:id])).count
|
||||||
@reports_count = Report.where(target_account: Account.where(domain: params[:id])).count
|
@reports_count = Report.where(target_account: Account.where(domain: params[:id])).count
|
||||||
@blocks_count = Block.where(target_account: Account.where(domain: params[:id])).count
|
@blocks_count = Block.where(target_account: Account.where(domain: params[:id])).count
|
||||||
@available = DeliveryFailureTracker.available?(Account.select(:shared_inbox_url).where(domain: params[:id]).first&.shared_inbox_url)
|
@available = DeliveryFailureTracker.available?(params[:id])
|
||||||
@media_storage = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
|
@media_storage = MediaAttachment.where(account: Account.where(domain: params[:id])).sum(:file_file_size)
|
||||||
@private_comment = @domain_block&.private_comment
|
@private_comment = @domain_block&.private_comment
|
||||||
@public_comment = @domain_block&.public_comment
|
@public_comment = @domain_block&.public_comment
|
||||||
|
37
app/controllers/settings/pictures_controller.rb
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Settings
|
||||||
|
class PicturesController < BaseController
|
||||||
|
before_action :authenticate_user!
|
||||||
|
before_action :set_account
|
||||||
|
before_action :set_picture
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
if valid_picture
|
||||||
|
account_params = {
|
||||||
|
@picture => nil,
|
||||||
|
(@picture + '_remote_url') => nil,
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = UpdateAccountService.new.call(@account, account_params) ? I18n.t('generic.changes_saved_msg') : nil
|
||||||
|
redirect_to settings_profile_path, notice: msg, status: 303
|
||||||
|
else
|
||||||
|
bad_request
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def set_account
|
||||||
|
@account = current_account
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_picture
|
||||||
|
@picture = params[:id]
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_picture
|
||||||
|
@picture == 'avatar' || @picture == 'header'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -10,6 +10,7 @@ class TagsController < ApplicationController
|
|||||||
before_action :require_signature!, if: -> { request.format == :json && authorized_fetch_mode? }
|
before_action :require_signature!, if: -> { request.format == :json && authorized_fetch_mode? }
|
||||||
before_action :authenticate_user!, if: :whitelist_mode?
|
before_action :authenticate_user!, if: :whitelist_mode?
|
||||||
before_action :set_tag
|
before_action :set_tag
|
||||||
|
before_action :set_local
|
||||||
before_action :set_body_classes
|
before_action :set_body_classes
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
|
|
||||||
@ -24,7 +25,7 @@ class TagsController < ApplicationController
|
|||||||
format.rss do
|
format.rss do
|
||||||
expires_in 0, public: true
|
expires_in 0, public: true
|
||||||
|
|
||||||
@statuses = HashtagQueryService.new.call(@tag, filter_params).limit(PAGE_SIZE)
|
@statuses = HashtagQueryService.new.call(@tag, filter_params, nil, @local).limit(PAGE_SIZE)
|
||||||
@statuses = cache_collection(@statuses, Status)
|
@statuses = cache_collection(@statuses, Status)
|
||||||
|
|
||||||
render xml: RSS::TagSerializer.render(@tag, @statuses)
|
render xml: RSS::TagSerializer.render(@tag, @statuses)
|
||||||
@ -33,7 +34,7 @@ class TagsController < ApplicationController
|
|||||||
format.json do
|
format.json do
|
||||||
expires_in 3.minutes, public: public_fetch_mode?
|
expires_in 3.minutes, public: public_fetch_mode?
|
||||||
|
|
||||||
@statuses = HashtagQueryService.new.call(@tag, filter_params, current_account, params[:local]).paginate_by_max_id(PAGE_SIZE, params[:max_id])
|
@statuses = HashtagQueryService.new.call(@tag, filter_params, current_account, @local).paginate_by_max_id(PAGE_SIZE, params[:max_id])
|
||||||
@statuses = cache_collection(@statuses, Status)
|
@statuses = cache_collection(@statuses, Status)
|
||||||
|
|
||||||
render json: collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
|
render json: collection_presenter, serializer: ActivityPub::CollectionSerializer, adapter: ActivityPub::Adapter, content_type: 'application/activity+json'
|
||||||
@ -47,6 +48,10 @@ class TagsController < ApplicationController
|
|||||||
@tag = Tag.usable.find_normalized!(params[:id])
|
@tag = Tag.usable.find_normalized!(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_local
|
||||||
|
@local = truthy_param?(:local)
|
||||||
|
end
|
||||||
|
|
||||||
def set_body_classes
|
def set_body_classes
|
||||||
@body_classes = 'with-modals'
|
@body_classes = 'with-modals'
|
||||||
end
|
end
|
||||||
|
@ -47,7 +47,7 @@ module Admin::ActionLogsHelper
|
|||||||
I18n.t('admin.action_logs.deleted_status')
|
I18n.t('admin.action_logs.deleted_status')
|
||||||
end
|
end
|
||||||
when 'Announcement'
|
when 'Announcement'
|
||||||
truncate(attributes['text'])
|
truncate(attributes['text'].is_a?(Array) ? attributes['text'].last : attributes['text'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -105,4 +105,13 @@ module SettingsHelper
|
|||||||
safe_join([image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username')], ' ')
|
safe_join([image_tag(account.avatar.url, width: 15, height: 15, alt: display_name(account), class: 'avatar'), content_tag(:span, account.acct, class: 'username')], ' ')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def picture_hint(hint, picture)
|
||||||
|
if picture.original_filename.nil?
|
||||||
|
hint
|
||||||
|
else
|
||||||
|
link = link_to t('generic.delete'), settings_profile_picture_path(picture.name.to_s), data: { method: :delete }
|
||||||
|
safe_join([hint, link], '<br/>'.html_safe)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -113,12 +113,13 @@ export const expandAccountTimeline = (accountId, { maxId, withReplies }
|
|||||||
export const expandAccountFeaturedTimeline = accountId => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true });
|
export const expandAccountFeaturedTimeline = accountId => expandTimeline(`account:${accountId}:pinned`, `/api/v1/accounts/${accountId}/statuses`, { pinned: true });
|
||||||
export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 });
|
export const expandAccountMediaTimeline = (accountId, { maxId } = {}) => expandTimeline(`account:${accountId}:media`, `/api/v1/accounts/${accountId}/statuses`, { max_id: maxId, only_media: true, limit: 40 });
|
||||||
export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done);
|
export const expandListTimeline = (id, { maxId } = {}, done = noOp) => expandTimeline(`list:${id}`, `/api/v1/timelines/list/${id}`, { max_id: maxId }, done);
|
||||||
export const expandHashtagTimeline = (hashtag, { maxId, tags } = {}, done = noOp) => {
|
export const expandHashtagTimeline = (hashtag, { maxId, tags, local } = {}, done = noOp) => {
|
||||||
return expandTimeline(`hashtag:${hashtag}`, `/api/v1/timelines/tag/${hashtag}`, {
|
return expandTimeline(`hashtag:${hashtag}`, `/api/v1/timelines/tag/${hashtag}`, {
|
||||||
max_id: maxId,
|
max_id: maxId,
|
||||||
any: parseTags(tags, 'any'),
|
any: parseTags(tags, 'any'),
|
||||||
all: parseTags(tags, 'all'),
|
all: parseTags(tags, 'all'),
|
||||||
none: parseTags(tags, 'none'),
|
none: parseTags(tags, 'none'),
|
||||||
|
local: local,
|
||||||
}, done);
|
}, done);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -68,20 +68,14 @@ class DropdownMenu extends React.PureComponent {
|
|||||||
handleKeyDown = e => {
|
handleKeyDown = e => {
|
||||||
const items = Array.from(this.node.getElementsByTagName('a'));
|
const items = Array.from(this.node.getElementsByTagName('a'));
|
||||||
const index = items.indexOf(document.activeElement);
|
const index = items.indexOf(document.activeElement);
|
||||||
let element;
|
let element = null;
|
||||||
|
|
||||||
switch(e.key) {
|
switch(e.key) {
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
element = items[index+1];
|
element = items[index+1] || items[0];
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
element = items[index-1];
|
element = items[index-1] || items[items.length-1];
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'Tab':
|
case 'Tab':
|
||||||
if (e.shiftKey) {
|
if (e.shiftKey) {
|
||||||
@ -89,28 +83,23 @@ class DropdownMenu extends React.PureComponent {
|
|||||||
} else {
|
} else {
|
||||||
element = items[index+1] || items[0];
|
element = items[index+1] || items[0];
|
||||||
}
|
}
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'Home':
|
case 'Home':
|
||||||
element = items[0];
|
element = items[0];
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'End':
|
case 'End':
|
||||||
element = items[items.length-1];
|
element = items[items.length-1];
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'Escape':
|
case 'Escape':
|
||||||
this.props.onClose();
|
this.props.onClose();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element) {
|
||||||
|
element.focus();
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleItemKeyPress = e => {
|
handleItemKeyPress = e => {
|
||||||
|
@ -4,7 +4,6 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
|||||||
import ImmutablePureComponent from 'react-immutable-pure-component';
|
import ImmutablePureComponent from 'react-immutable-pure-component';
|
||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import { vote, fetchPoll } from 'mastodon/actions/polls';
|
|
||||||
import Motion from 'mastodon/features/ui/util/optional_motion';
|
import Motion from 'mastodon/features/ui/util/optional_motion';
|
||||||
import spring from 'react-motion/lib/spring';
|
import spring from 'react-motion/lib/spring';
|
||||||
import escapeTextContentForBrowser from 'escape-html';
|
import escapeTextContentForBrowser from 'escape-html';
|
||||||
@ -28,8 +27,9 @@ class Poll extends ImmutablePureComponent {
|
|||||||
static propTypes = {
|
static propTypes = {
|
||||||
poll: ImmutablePropTypes.map,
|
poll: ImmutablePropTypes.map,
|
||||||
intl: PropTypes.object.isRequired,
|
intl: PropTypes.object.isRequired,
|
||||||
dispatch: PropTypes.func,
|
|
||||||
disabled: PropTypes.bool,
|
disabled: PropTypes.bool,
|
||||||
|
refresh: PropTypes.func,
|
||||||
|
onVote: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
@ -100,7 +100,7 @@ class Poll extends ImmutablePureComponent {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.dispatch(vote(this.props.poll.get('id'), Object.keys(this.state.selected)));
|
this.props.onVote(Object.keys(this.state.selected));
|
||||||
};
|
};
|
||||||
|
|
||||||
handleRefresh = () => {
|
handleRefresh = () => {
|
||||||
@ -108,7 +108,7 @@ class Poll extends ImmutablePureComponent {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.dispatch(fetchPoll(this.props.poll.get('id')));
|
this.props.refresh();
|
||||||
};
|
};
|
||||||
|
|
||||||
renderOption (option, optionIndex, showResults) {
|
renderOption (option, optionIndex, showResults) {
|
||||||
|
@ -1,8 +1,25 @@
|
|||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
|
import { debounce } from 'lodash';
|
||||||
|
|
||||||
import Poll from 'mastodon/components/poll';
|
import Poll from 'mastodon/components/poll';
|
||||||
|
import { fetchPoll, vote } from 'mastodon/actions/polls';
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch, { pollId }) => ({
|
||||||
|
refresh: debounce(
|
||||||
|
() => {
|
||||||
|
dispatch(fetchPoll(pollId));
|
||||||
|
},
|
||||||
|
1000,
|
||||||
|
{ leading: true },
|
||||||
|
),
|
||||||
|
|
||||||
|
onVote (choices) {
|
||||||
|
dispatch(vote(pollId, choices));
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const mapStateToProps = (state, { pollId }) => ({
|
const mapStateToProps = (state, { pollId }) => ({
|
||||||
poll: state.getIn(['polls', pollId]),
|
poll: state.getIn(['polls', pollId]),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default connect(mapStateToProps)(Poll);
|
export default connect(mapStateToProps, mapDispatchToProps)(Poll);
|
||||||
|
@ -38,7 +38,7 @@ export default class TimelineContainer extends React.PureComponent {
|
|||||||
let timeline;
|
let timeline;
|
||||||
|
|
||||||
if (hashtag) {
|
if (hashtag) {
|
||||||
timeline = <HashtagTimeline hashtag={hashtag} />;
|
timeline = <HashtagTimeline hashtag={hashtag} local={local} />;
|
||||||
} else {
|
} else {
|
||||||
timeline = <PublicTimeline local={local} />;
|
timeline = <PublicTimeline local={local} />;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ const messages = defineMessages({
|
|||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
accountIds: state.getIn(['user_lists', 'blocks', 'items']),
|
accountIds: state.getIn(['user_lists', 'blocks', 'items']),
|
||||||
hasMore: !!state.getIn(['user_lists', 'blocks', 'next']),
|
hasMore: !!state.getIn(['user_lists', 'blocks', 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'blocks', 'isLoading'], true),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default @connect(mapStateToProps)
|
export default @connect(mapStateToProps)
|
||||||
@ -31,6 +32,7 @@ class Blocks extends ImmutablePureComponent {
|
|||||||
shouldUpdateScroll: PropTypes.func,
|
shouldUpdateScroll: PropTypes.func,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
intl: PropTypes.object.isRequired,
|
intl: PropTypes.object.isRequired,
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
};
|
};
|
||||||
@ -44,7 +46,7 @@ class Blocks extends ImmutablePureComponent {
|
|||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { intl, accountIds, shouldUpdateScroll, hasMore, multiColumn } = this.props;
|
const { intl, accountIds, shouldUpdateScroll, hasMore, multiColumn, isLoading } = this.props;
|
||||||
|
|
||||||
if (!accountIds) {
|
if (!accountIds) {
|
||||||
return (
|
return (
|
||||||
@ -63,6 +65,7 @@ class Blocks extends ImmutablePureComponent {
|
|||||||
scrollKey='blocks'
|
scrollKey='blocks'
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
bindToDocument={!multiColumn}
|
bindToDocument={!multiColumn}
|
||||||
|
@ -50,7 +50,7 @@ class PrivacyDropdownMenu extends React.PureComponent {
|
|||||||
const index = items.findIndex(item => {
|
const index = items.findIndex(item => {
|
||||||
return (item.value === value);
|
return (item.value === value);
|
||||||
});
|
});
|
||||||
let element;
|
let element = null;
|
||||||
|
|
||||||
switch(e.key) {
|
switch(e.key) {
|
||||||
case 'Escape':
|
case 'Escape':
|
||||||
@ -60,18 +60,10 @@ class PrivacyDropdownMenu extends React.PureComponent {
|
|||||||
this.handleClick(e);
|
this.handleClick(e);
|
||||||
break;
|
break;
|
||||||
case 'ArrowDown':
|
case 'ArrowDown':
|
||||||
element = this.node.childNodes[index + 1];
|
element = this.node.childNodes[index + 1] || this.node.firstChild;
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
this.props.onChange(element.getAttribute('data-index'));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'ArrowUp':
|
case 'ArrowUp':
|
||||||
element = this.node.childNodes[index - 1];
|
element = this.node.childNodes[index - 1] || this.node.lastChild;
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
this.props.onChange(element.getAttribute('data-index'));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 'Tab':
|
case 'Tab':
|
||||||
if (e.shiftKey) {
|
if (e.shiftKey) {
|
||||||
@ -79,28 +71,21 @@ class PrivacyDropdownMenu extends React.PureComponent {
|
|||||||
} else {
|
} else {
|
||||||
element = this.node.childNodes[index + 1] || this.node.firstChild;
|
element = this.node.childNodes[index + 1] || this.node.firstChild;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 'Home':
|
||||||
|
element = this.node.firstChild;
|
||||||
|
break;
|
||||||
|
case 'End':
|
||||||
|
element = this.node.lastChild;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (element) {
|
if (element) {
|
||||||
element.focus();
|
element.focus();
|
||||||
this.props.onChange(element.getAttribute('data-index'));
|
this.props.onChange(element.getAttribute('data-index'));
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case 'Home':
|
|
||||||
element = this.node.firstChild;
|
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
this.props.onChange(element.getAttribute('data-index'));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'End':
|
|
||||||
element = this.node.lastChild;
|
|
||||||
if (element) {
|
|
||||||
element.focus();
|
|
||||||
this.props.onChange(element.getAttribute('data-index'));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
handleClick = e => {
|
handleClick = e => {
|
||||||
|
@ -19,6 +19,7 @@ const messages = defineMessages({
|
|||||||
|
|
||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
accountIds: state.getIn(['user_lists', 'follow_requests', 'items']),
|
accountIds: state.getIn(['user_lists', 'follow_requests', 'items']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'follow_requests', 'isLoading'], true),
|
||||||
hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']),
|
hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']),
|
||||||
locked: !!state.getIn(['accounts', me, 'locked']),
|
locked: !!state.getIn(['accounts', me, 'locked']),
|
||||||
domain: state.getIn(['meta', 'domain']),
|
domain: state.getIn(['meta', 'domain']),
|
||||||
@ -33,6 +34,7 @@ class FollowRequests extends ImmutablePureComponent {
|
|||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
shouldUpdateScroll: PropTypes.func,
|
shouldUpdateScroll: PropTypes.func,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
locked: PropTypes.bool,
|
locked: PropTypes.bool,
|
||||||
domain: PropTypes.string,
|
domain: PropTypes.string,
|
||||||
@ -49,7 +51,7 @@ class FollowRequests extends ImmutablePureComponent {
|
|||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { intl, shouldUpdateScroll, accountIds, hasMore, multiColumn, locked, domain } = this.props;
|
const { intl, shouldUpdateScroll, accountIds, hasMore, multiColumn, locked, domain, isLoading } = this.props;
|
||||||
|
|
||||||
if (!accountIds) {
|
if (!accountIds) {
|
||||||
return (
|
return (
|
||||||
@ -77,6 +79,7 @@ class FollowRequests extends ImmutablePureComponent {
|
|||||||
scrollKey='follow_requests'
|
scrollKey='follow_requests'
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
bindToDocument={!multiColumn}
|
bindToDocument={!multiColumn}
|
||||||
|
@ -22,6 +22,7 @@ const mapStateToProps = (state, props) => ({
|
|||||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
||||||
accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
|
accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
|
||||||
hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
|
hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'followers', props.params.accountId, 'isLoading'], true),
|
||||||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -34,6 +35,7 @@ class Followers extends ImmutablePureComponent {
|
|||||||
shouldUpdateScroll: PropTypes.func,
|
shouldUpdateScroll: PropTypes.func,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
blockedBy: PropTypes.bool,
|
blockedBy: PropTypes.bool,
|
||||||
isAccount: PropTypes.bool,
|
isAccount: PropTypes.bool,
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
@ -58,7 +60,7 @@ class Followers extends ImmutablePureComponent {
|
|||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;
|
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
|
||||||
|
|
||||||
if (!isAccount) {
|
if (!isAccount) {
|
||||||
return (
|
return (
|
||||||
@ -85,6 +87,7 @@ class Followers extends ImmutablePureComponent {
|
|||||||
<ScrollableList
|
<ScrollableList
|
||||||
scrollKey='followers'
|
scrollKey='followers'
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
||||||
|
@ -22,6 +22,7 @@ const mapStateToProps = (state, props) => ({
|
|||||||
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
isAccount: !!state.getIn(['accounts', props.params.accountId]),
|
||||||
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
|
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
|
||||||
hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
|
hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'following', props.params.accountId, 'isLoading'], true),
|
||||||
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -34,6 +35,7 @@ class Following extends ImmutablePureComponent {
|
|||||||
shouldUpdateScroll: PropTypes.func,
|
shouldUpdateScroll: PropTypes.func,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
blockedBy: PropTypes.bool,
|
blockedBy: PropTypes.bool,
|
||||||
isAccount: PropTypes.bool,
|
isAccount: PropTypes.bool,
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
@ -58,7 +60,7 @@ class Following extends ImmutablePureComponent {
|
|||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;
|
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
|
||||||
|
|
||||||
if (!isAccount) {
|
if (!isAccount) {
|
||||||
return (
|
return (
|
||||||
@ -85,6 +87,7 @@ class Following extends ImmutablePureComponent {
|
|||||||
<ScrollableList
|
<ScrollableList
|
||||||
scrollKey='following'
|
scrollKey='following'
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
|
||||||
|
@ -4,6 +4,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
|
|||||||
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
|
||||||
import Toggle from 'react-toggle';
|
import Toggle from 'react-toggle';
|
||||||
import AsyncSelect from 'react-select/async';
|
import AsyncSelect from 'react-select/async';
|
||||||
|
import SettingToggle from '../../notifications/components/setting_toggle';
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
|
placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
|
||||||
@ -87,6 +88,8 @@ class ColumnSettings extends React.PureComponent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
const { settings, onChange } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div className='column-settings__row'>
|
<div className='column-settings__row'>
|
||||||
@ -106,6 +109,10 @@ class ColumnSettings extends React.PureComponent {
|
|||||||
{this.modeSelect('none')}
|
{this.modeSelect('none')}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<div className='column-settings__row'>
|
||||||
|
<SettingToggle settings={settings} settingPath={['local']} onChange={onChange} label={<FormattedMessage id='community.column_settings.local_only' defaultMessage='Local only' />} />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -98,21 +98,21 @@ class HashtagTimeline extends React.PureComponent {
|
|||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
const { id, tags } = this.props.params;
|
const { id, tags, local } = this.props.params;
|
||||||
|
|
||||||
this._subscribe(dispatch, id, tags);
|
this._subscribe(dispatch, id, tags);
|
||||||
dispatch(expandHashtagTimeline(id, { tags }));
|
dispatch(expandHashtagTimeline(id, { tags, local }));
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
const { dispatch, params } = this.props;
|
const { dispatch, params } = this.props;
|
||||||
const { id, tags } = nextProps.params;
|
const { id, tags, local } = nextProps.params;
|
||||||
|
|
||||||
if (id !== params.id || !isEqual(tags, params.tags)) {
|
if (id !== params.id || !isEqual(tags, params.tags) || !isEqual(local, params.local)) {
|
||||||
this._unsubscribe();
|
this._unsubscribe();
|
||||||
this._subscribe(dispatch, id, tags);
|
this._subscribe(dispatch, id, tags);
|
||||||
this.props.dispatch(clearTimeline(`hashtag:${id}`));
|
dispatch(clearTimeline(`hashtag:${id}`));
|
||||||
this.props.dispatch(expandHashtagTimeline(id, { tags }));
|
dispatch(expandHashtagTimeline(id, { tags, local }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,8 +125,8 @@ class HashtagTimeline extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = maxId => {
|
handleLoadMore = maxId => {
|
||||||
const { id, tags } = this.props.params;
|
const { id, tags, local } = this.props.params;
|
||||||
this.props.dispatch(expandHashtagTimeline(id, { maxId, tags }));
|
this.props.dispatch(expandHashtagTimeline(id, { maxId, tags, local }));
|
||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
|
@ -19,6 +19,7 @@ const messages = defineMessages({
|
|||||||
const mapStateToProps = state => ({
|
const mapStateToProps = state => ({
|
||||||
accountIds: state.getIn(['user_lists', 'mutes', 'items']),
|
accountIds: state.getIn(['user_lists', 'mutes', 'items']),
|
||||||
hasMore: !!state.getIn(['user_lists', 'mutes', 'next']),
|
hasMore: !!state.getIn(['user_lists', 'mutes', 'next']),
|
||||||
|
isLoading: state.getIn(['user_lists', 'mutes', 'isLoading'], true),
|
||||||
});
|
});
|
||||||
|
|
||||||
export default @connect(mapStateToProps)
|
export default @connect(mapStateToProps)
|
||||||
@ -30,6 +31,7 @@ class Mutes extends ImmutablePureComponent {
|
|||||||
dispatch: PropTypes.func.isRequired,
|
dispatch: PropTypes.func.isRequired,
|
||||||
shouldUpdateScroll: PropTypes.func,
|
shouldUpdateScroll: PropTypes.func,
|
||||||
hasMore: PropTypes.bool,
|
hasMore: PropTypes.bool,
|
||||||
|
isLoading: PropTypes.bool,
|
||||||
accountIds: ImmutablePropTypes.list,
|
accountIds: ImmutablePropTypes.list,
|
||||||
intl: PropTypes.object.isRequired,
|
intl: PropTypes.object.isRequired,
|
||||||
multiColumn: PropTypes.bool,
|
multiColumn: PropTypes.bool,
|
||||||
@ -44,7 +46,7 @@ class Mutes extends ImmutablePureComponent {
|
|||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { intl, shouldUpdateScroll, hasMore, accountIds, multiColumn } = this.props;
|
const { intl, shouldUpdateScroll, hasMore, accountIds, multiColumn, isLoading } = this.props;
|
||||||
|
|
||||||
if (!accountIds) {
|
if (!accountIds) {
|
||||||
return (
|
return (
|
||||||
@ -63,6 +65,7 @@ class Mutes extends ImmutablePureComponent {
|
|||||||
scrollKey='mutes'
|
scrollKey='mutes'
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
hasMore={hasMore}
|
hasMore={hasMore}
|
||||||
|
isLoading={isLoading}
|
||||||
shouldUpdateScroll={shouldUpdateScroll}
|
shouldUpdateScroll={shouldUpdateScroll}
|
||||||
emptyMessage={emptyMessage}
|
emptyMessage={emptyMessage}
|
||||||
bindToDocument={!multiColumn}
|
bindToDocument={!multiColumn}
|
||||||
|
@ -24,19 +24,25 @@ class HashtagTimeline extends React.PureComponent {
|
|||||||
isLoading: PropTypes.bool.isRequired,
|
isLoading: PropTypes.bool.isRequired,
|
||||||
hasMore: PropTypes.bool.isRequired,
|
hasMore: PropTypes.bool.isRequired,
|
||||||
hashtag: PropTypes.string.isRequired,
|
hashtag: PropTypes.string.isRequired,
|
||||||
|
local: PropTypes.bool.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
static defaultProps = {
|
||||||
|
local: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
const { dispatch, hashtag } = this.props;
|
const { dispatch, hashtag, local } = this.props;
|
||||||
|
|
||||||
dispatch(expandHashtagTimeline(hashtag));
|
dispatch(expandHashtagTimeline(hashtag, { local }));
|
||||||
}
|
}
|
||||||
|
|
||||||
handleLoadMore = () => {
|
handleLoadMore = () => {
|
||||||
const maxId = this.props.statusIds.last();
|
const { dispatch, hashtag, local, statusIds } = this.props;
|
||||||
|
const maxId = statusIds.last();
|
||||||
|
|
||||||
if (maxId) {
|
if (maxId) {
|
||||||
this.props.dispatch(expandHashtagTimeline(this.props.hashtag, { maxId }));
|
dispatch(expandHashtagTimeline(hashtag, { maxId, local }));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,12 +2,24 @@ import {
|
|||||||
NOTIFICATIONS_UPDATE,
|
NOTIFICATIONS_UPDATE,
|
||||||
} from '../actions/notifications';
|
} from '../actions/notifications';
|
||||||
import {
|
import {
|
||||||
|
FOLLOWERS_FETCH_REQUEST,
|
||||||
FOLLOWERS_FETCH_SUCCESS,
|
FOLLOWERS_FETCH_SUCCESS,
|
||||||
|
FOLLOWERS_FETCH_FAIL,
|
||||||
|
FOLLOWERS_EXPAND_REQUEST,
|
||||||
FOLLOWERS_EXPAND_SUCCESS,
|
FOLLOWERS_EXPAND_SUCCESS,
|
||||||
|
FOLLOWERS_EXPAND_FAIL,
|
||||||
|
FOLLOWING_FETCH_REQUEST,
|
||||||
FOLLOWING_FETCH_SUCCESS,
|
FOLLOWING_FETCH_SUCCESS,
|
||||||
|
FOLLOWING_FETCH_FAIL,
|
||||||
|
FOLLOWING_EXPAND_REQUEST,
|
||||||
FOLLOWING_EXPAND_SUCCESS,
|
FOLLOWING_EXPAND_SUCCESS,
|
||||||
|
FOLLOWING_EXPAND_FAIL,
|
||||||
|
FOLLOW_REQUESTS_FETCH_REQUEST,
|
||||||
FOLLOW_REQUESTS_FETCH_SUCCESS,
|
FOLLOW_REQUESTS_FETCH_SUCCESS,
|
||||||
|
FOLLOW_REQUESTS_FETCH_FAIL,
|
||||||
|
FOLLOW_REQUESTS_EXPAND_REQUEST,
|
||||||
FOLLOW_REQUESTS_EXPAND_SUCCESS,
|
FOLLOW_REQUESTS_EXPAND_SUCCESS,
|
||||||
|
FOLLOW_REQUESTS_EXPAND_FAIL,
|
||||||
FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
|
FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
|
||||||
FOLLOW_REQUEST_REJECT_SUCCESS,
|
FOLLOW_REQUEST_REJECT_SUCCESS,
|
||||||
} from '../actions/accounts';
|
} from '../actions/accounts';
|
||||||
@ -16,12 +28,20 @@ import {
|
|||||||
FAVOURITES_FETCH_SUCCESS,
|
FAVOURITES_FETCH_SUCCESS,
|
||||||
} from '../actions/interactions';
|
} from '../actions/interactions';
|
||||||
import {
|
import {
|
||||||
|
BLOCKS_FETCH_REQUEST,
|
||||||
BLOCKS_FETCH_SUCCESS,
|
BLOCKS_FETCH_SUCCESS,
|
||||||
|
BLOCKS_FETCH_FAIL,
|
||||||
|
BLOCKS_EXPAND_REQUEST,
|
||||||
BLOCKS_EXPAND_SUCCESS,
|
BLOCKS_EXPAND_SUCCESS,
|
||||||
|
BLOCKS_EXPAND_FAIL,
|
||||||
} from '../actions/blocks';
|
} from '../actions/blocks';
|
||||||
import {
|
import {
|
||||||
|
MUTES_FETCH_REQUEST,
|
||||||
MUTES_FETCH_SUCCESS,
|
MUTES_FETCH_SUCCESS,
|
||||||
|
MUTES_FETCH_FAIL,
|
||||||
|
MUTES_EXPAND_REQUEST,
|
||||||
MUTES_EXPAND_SUCCESS,
|
MUTES_EXPAND_SUCCESS,
|
||||||
|
MUTES_EXPAND_FAIL,
|
||||||
} from '../actions/mutes';
|
} from '../actions/mutes';
|
||||||
import {
|
import {
|
||||||
DIRECTORY_FETCH_REQUEST,
|
DIRECTORY_FETCH_REQUEST,
|
||||||
@ -47,12 +67,13 @@ const normalizeList = (state, type, id, accounts, next) => {
|
|||||||
return state.setIn([type, id], ImmutableMap({
|
return state.setIn([type, id], ImmutableMap({
|
||||||
next,
|
next,
|
||||||
items: ImmutableList(accounts.map(item => item.id)),
|
items: ImmutableList(accounts.map(item => item.id)),
|
||||||
|
isLoading: false,
|
||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
const appendToList = (state, type, id, accounts, next) => {
|
const appendToList = (state, type, id, accounts, next) => {
|
||||||
return state.updateIn([type, id], map => {
|
return state.updateIn([type, id], map => {
|
||||||
return map.set('next', next).update('items', list => list.concat(accounts.map(item => item.id)));
|
return map.set('next', next).set('isLoading', false).update('items', list => list.concat(accounts.map(item => item.id)));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -68,10 +89,22 @@ export default function userLists(state = initialState, action) {
|
|||||||
return normalizeList(state, 'followers', action.id, action.accounts, action.next);
|
return normalizeList(state, 'followers', action.id, action.accounts, action.next);
|
||||||
case FOLLOWERS_EXPAND_SUCCESS:
|
case FOLLOWERS_EXPAND_SUCCESS:
|
||||||
return appendToList(state, 'followers', action.id, action.accounts, action.next);
|
return appendToList(state, 'followers', action.id, action.accounts, action.next);
|
||||||
|
case FOLLOWERS_FETCH_REQUEST:
|
||||||
|
case FOLLOWERS_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['followers', action.id, 'isLoading'], true);
|
||||||
|
case FOLLOWERS_FETCH_FAIL:
|
||||||
|
case FOLLOWERS_EXPAND_FAIL:
|
||||||
|
return state.setIn(['followers', action.id, 'isLoading'], false);
|
||||||
case FOLLOWING_FETCH_SUCCESS:
|
case FOLLOWING_FETCH_SUCCESS:
|
||||||
return normalizeList(state, 'following', action.id, action.accounts, action.next);
|
return normalizeList(state, 'following', action.id, action.accounts, action.next);
|
||||||
case FOLLOWING_EXPAND_SUCCESS:
|
case FOLLOWING_EXPAND_SUCCESS:
|
||||||
return appendToList(state, 'following', action.id, action.accounts, action.next);
|
return appendToList(state, 'following', action.id, action.accounts, action.next);
|
||||||
|
case FOLLOWING_FETCH_REQUEST:
|
||||||
|
case FOLLOWING_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['following', action.id, 'isLoading'], true);
|
||||||
|
case FOLLOWING_FETCH_FAIL:
|
||||||
|
case FOLLOWING_EXPAND_FAIL:
|
||||||
|
return state.setIn(['following', action.id, 'isLoading'], false);
|
||||||
case REBLOGS_FETCH_SUCCESS:
|
case REBLOGS_FETCH_SUCCESS:
|
||||||
return state.setIn(['reblogged_by', action.id], ImmutableList(action.accounts.map(item => item.id)));
|
return state.setIn(['reblogged_by', action.id], ImmutableList(action.accounts.map(item => item.id)));
|
||||||
case FAVOURITES_FETCH_SUCCESS:
|
case FAVOURITES_FETCH_SUCCESS:
|
||||||
@ -79,9 +112,15 @@ export default function userLists(state = initialState, action) {
|
|||||||
case NOTIFICATIONS_UPDATE:
|
case NOTIFICATIONS_UPDATE:
|
||||||
return action.notification.type === 'follow_request' ? normalizeFollowRequest(state, action.notification) : state;
|
return action.notification.type === 'follow_request' ? normalizeFollowRequest(state, action.notification) : state;
|
||||||
case FOLLOW_REQUESTS_FETCH_SUCCESS:
|
case FOLLOW_REQUESTS_FETCH_SUCCESS:
|
||||||
return state.setIn(['follow_requests', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next);
|
return state.setIn(['follow_requests', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next).setIn(['follow_requests', 'isLoading'], false);
|
||||||
case FOLLOW_REQUESTS_EXPAND_SUCCESS:
|
case FOLLOW_REQUESTS_EXPAND_SUCCESS:
|
||||||
return state.updateIn(['follow_requests', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next);
|
return state.updateIn(['follow_requests', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['follow_requests', 'next'], action.next).setIn(['follow_requests', 'isLoading'], false);
|
||||||
|
case FOLLOW_REQUESTS_FETCH_REQUEST:
|
||||||
|
case FOLLOW_REQUESTS_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['follow_requests', 'isLoading'], true);
|
||||||
|
case FOLLOW_REQUESTS_FETCH_FAIL:
|
||||||
|
case FOLLOW_REQUESTS_EXPAND_FAIL:
|
||||||
|
return state.setIn(['follow_requests', 'isLoading'], false);
|
||||||
case FOLLOW_REQUEST_AUTHORIZE_SUCCESS:
|
case FOLLOW_REQUEST_AUTHORIZE_SUCCESS:
|
||||||
case FOLLOW_REQUEST_REJECT_SUCCESS:
|
case FOLLOW_REQUEST_REJECT_SUCCESS:
|
||||||
return state.updateIn(['follow_requests', 'items'], list => list.filterNot(item => item === action.id));
|
return state.updateIn(['follow_requests', 'items'], list => list.filterNot(item => item === action.id));
|
||||||
@ -89,10 +128,22 @@ export default function userLists(state = initialState, action) {
|
|||||||
return state.setIn(['blocks', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
|
return state.setIn(['blocks', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
|
||||||
case BLOCKS_EXPAND_SUCCESS:
|
case BLOCKS_EXPAND_SUCCESS:
|
||||||
return state.updateIn(['blocks', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
|
return state.updateIn(['blocks', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['blocks', 'next'], action.next);
|
||||||
|
case BLOCKS_FETCH_REQUEST:
|
||||||
|
case BLOCKS_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['blocks', 'isLoading'], true);
|
||||||
|
case BLOCKS_FETCH_FAIL:
|
||||||
|
case BLOCKS_EXPAND_FAIL:
|
||||||
|
return state.setIn(['blocks', 'isLoading'], false);
|
||||||
case MUTES_FETCH_SUCCESS:
|
case MUTES_FETCH_SUCCESS:
|
||||||
return state.setIn(['mutes', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
|
return state.setIn(['mutes', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
|
||||||
case MUTES_EXPAND_SUCCESS:
|
case MUTES_EXPAND_SUCCESS:
|
||||||
return state.updateIn(['mutes', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
|
return state.updateIn(['mutes', 'items'], list => list.concat(action.accounts.map(item => item.id))).setIn(['mutes', 'next'], action.next);
|
||||||
|
case MUTES_FETCH_REQUEST:
|
||||||
|
case MUTES_EXPAND_REQUEST:
|
||||||
|
return state.setIn(['mutes', 'isLoading'], true);
|
||||||
|
case MUTES_FETCH_FAIL:
|
||||||
|
case MUTES_EXPAND_FAIL:
|
||||||
|
return state.setIn(['mutes', 'isLoading'], false);
|
||||||
case DIRECTORY_FETCH_SUCCESS:
|
case DIRECTORY_FETCH_SUCCESS:
|
||||||
return state.setIn(['directory', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['directory', 'isLoading'], false);
|
return state.setIn(['directory', 'items'], ImmutableList(action.accounts.map(item => item.id))).setIn(['directory', 'isLoading'], false);
|
||||||
case DIRECTORY_EXPAND_SUCCESS:
|
case DIRECTORY_EXPAND_SUCCESS:
|
||||||
|
@ -2,6 +2,45 @@ import EXIF from 'exif-js';
|
|||||||
|
|
||||||
const MAX_IMAGE_PIXELS = 1638400; // 1280x1280px
|
const MAX_IMAGE_PIXELS = 1638400; // 1280x1280px
|
||||||
|
|
||||||
|
const _browser_quirks = {};
|
||||||
|
|
||||||
|
// Some browsers will automatically draw images respecting their EXIF orientation
|
||||||
|
// while others won't, and the safest way to detect that is to examine how it
|
||||||
|
// is done on a known image.
|
||||||
|
// See https://github.com/w3c/csswg-drafts/issues/4666
|
||||||
|
// and https://github.com/blueimp/JavaScript-Load-Image/commit/1e4df707821a0afcc11ea0720ee403b8759f3881
|
||||||
|
const dropOrientationIfNeeded = (orientation) => new Promise(resolve => {
|
||||||
|
switch (_browser_quirks['image-orientation-automatic']) {
|
||||||
|
case true:
|
||||||
|
resolve(1);
|
||||||
|
break;
|
||||||
|
case false:
|
||||||
|
resolve(orientation);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// black 2x1 JPEG, with the following meta information set:
|
||||||
|
// - EXIF Orientation: 6 (Rotated 90° CCW)
|
||||||
|
const testImageURL =
|
||||||
|
'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +
|
||||||
|
'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +
|
||||||
|
'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +
|
||||||
|
'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +
|
||||||
|
'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +
|
||||||
|
'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';
|
||||||
|
const img = new Image();
|
||||||
|
img.onload = () => {
|
||||||
|
const automatic = (img.width === 1 && img.height === 2);
|
||||||
|
_browser_quirks['image-orientation-automatic'] = automatic;
|
||||||
|
resolve(automatic ? 1 : orientation);
|
||||||
|
};
|
||||||
|
img.onerror = () => {
|
||||||
|
_browser_quirks['image-orientation-automatic'] = false;
|
||||||
|
resolve(orientation);
|
||||||
|
};
|
||||||
|
img.src = testImageURL;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const getImageUrl = inputFile => new Promise((resolve, reject) => {
|
const getImageUrl = inputFile => new Promise((resolve, reject) => {
|
||||||
if (window.URL && URL.createObjectURL) {
|
if (window.URL && URL.createObjectURL) {
|
||||||
try {
|
try {
|
||||||
@ -38,7 +77,11 @@ const getOrientation = (img, type = 'image/png') => new Promise(resolve => {
|
|||||||
|
|
||||||
EXIF.getData(img, () => {
|
EXIF.getData(img, () => {
|
||||||
const orientation = EXIF.getTag(img, 'Orientation');
|
const orientation = EXIF.getTag(img, 'Orientation');
|
||||||
|
if (orientation !== 1) {
|
||||||
|
dropOrientationIfNeeded(orientation).then(resolve).catch(() => resolve(orientation));
|
||||||
|
} else {
|
||||||
resolve(orientation);
|
resolve(orientation);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3,47 +3,53 @@
|
|||||||
class DeliveryFailureTracker
|
class DeliveryFailureTracker
|
||||||
FAILURE_DAYS_THRESHOLD = 7
|
FAILURE_DAYS_THRESHOLD = 7
|
||||||
|
|
||||||
def initialize(inbox_url)
|
def initialize(url_or_host)
|
||||||
@inbox_url = inbox_url
|
@host = url_or_host.start_with?('https://') || url_or_host.start_with?('http://') ? Addressable::URI.parse(url_or_host).normalized_host : url_or_host
|
||||||
end
|
end
|
||||||
|
|
||||||
def track_failure!
|
def track_failure!
|
||||||
Redis.current.sadd(exhausted_deliveries_key, today)
|
Redis.current.sadd(exhausted_deliveries_key, today)
|
||||||
Redis.current.sadd('unavailable_inboxes', @inbox_url) if reached_failure_threshold?
|
UnavailableDomain.create(domain: @host) if reached_failure_threshold?
|
||||||
end
|
end
|
||||||
|
|
||||||
def track_success!
|
def track_success!
|
||||||
Redis.current.del(exhausted_deliveries_key)
|
Redis.current.del(exhausted_deliveries_key)
|
||||||
Redis.current.srem('unavailable_inboxes', @inbox_url)
|
UnavailableDomain.find_by(domain: @host)&.destroy
|
||||||
end
|
end
|
||||||
|
|
||||||
def days
|
def days
|
||||||
Redis.current.scard(exhausted_deliveries_key) || 0
|
Redis.current.scard(exhausted_deliveries_key) || 0
|
||||||
end
|
end
|
||||||
|
|
||||||
class << self
|
def available?
|
||||||
def filter(arr)
|
!UnavailableDomain.where(domain: @host).exists?
|
||||||
arr.reject(&method(:unavailable?))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def unavailable?(url)
|
alias reset! track_success!
|
||||||
Redis.current.sismember('unavailable_inboxes', url)
|
|
||||||
|
class << self
|
||||||
|
def without_unavailable(urls)
|
||||||
|
unavailable_domains_map = Rails.cache.fetch('unavailable_domains') { UnavailableDomain.pluck(:domain).each_with_object({}) { |domain, hash| hash[domain] = true } }
|
||||||
|
|
||||||
|
urls.reject do |url|
|
||||||
|
host = Addressable::URI.parse(url).normalized_host
|
||||||
|
unavailable_domains_map[host]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def available?(url)
|
def available?(url)
|
||||||
!unavailable?(url)
|
new(url).available?
|
||||||
end
|
end
|
||||||
|
|
||||||
def track_inverse_success!(from_account)
|
def reset!(url)
|
||||||
new(from_account.inbox_url).track_success! if from_account.inbox_url.present?
|
new(url).reset!
|
||||||
new(from_account.shared_inbox_url).track_success! if from_account.shared_inbox_url.present?
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def exhausted_deliveries_key
|
def exhausted_deliveries_key
|
||||||
"exhausted_deliveries:#{@inbox_url}"
|
"exhausted_deliveries:#{@host}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def today
|
def today
|
||||||
|
@ -413,7 +413,7 @@ class Account < ApplicationRecord
|
|||||||
|
|
||||||
def inboxes
|
def inboxes
|
||||||
urls = reorder(nil).where(protocol: :activitypub).pluck(Arel.sql("distinct coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url)"))
|
urls = reorder(nil).where(protocol: :activitypub).pluck(Arel.sql("distinct coalesce(nullif(accounts.shared_inbox_url, ''), accounts.inbox_url)"))
|
||||||
DeliveryFailureTracker.filter(urls)
|
DeliveryFailureTracker.without_unavailable(urls)
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_for(terms, limit = 10, offset = 0)
|
def search_for(terms, limit = 10, offset = 0)
|
||||||
|
@ -16,8 +16,8 @@ class AccountAlias < ApplicationRecord
|
|||||||
belongs_to :account
|
belongs_to :account
|
||||||
|
|
||||||
validates :acct, presence: true, domain: { acct: true }
|
validates :acct, presence: true, domain: { acct: true }
|
||||||
validates :uri, presence: true
|
|
||||||
validates :uri, uniqueness: { scope: :account_id }
|
validates :uri, uniqueness: { scope: :account_id }
|
||||||
|
validate :validate_target_account
|
||||||
|
|
||||||
before_validation :set_uri
|
before_validation :set_uri
|
||||||
after_create :add_to_account
|
after_create :add_to_account
|
||||||
@ -44,4 +44,12 @@ class AccountAlias < ApplicationRecord
|
|||||||
def remove_from_account
|
def remove_from_account
|
||||||
account.update(also_known_as: account.also_known_as.reject { |x| x == uri })
|
account.update(also_known_as: account.also_known_as.reject { |x| x == uri })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def validate_target_account
|
||||||
|
if uri.blank?
|
||||||
|
errors.add(:acct, I18n.t('migrations.errors.not_found'))
|
||||||
|
elsif ActivityPub::TagManager.instance.uri_for(account) == uri
|
||||||
|
errors.add(:acct, I18n.t('migrations.errors.move_to_self'))
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
# created_at :datetime not null
|
# created_at :datetime not null
|
||||||
# updated_at :datetime not null
|
# updated_at :datetime not null
|
||||||
# published_at :datetime
|
# published_at :datetime
|
||||||
# status_ids :bigint is an Array
|
# status_ids :bigint(8) is an Array
|
||||||
#
|
#
|
||||||
|
|
||||||
class Announcement < ApplicationRecord
|
class Announcement < ApplicationRecord
|
||||||
|
@ -27,7 +27,7 @@ class Relay < ApplicationRecord
|
|||||||
payload = Oj.dump(follow_activity(activity_id))
|
payload = Oj.dump(follow_activity(activity_id))
|
||||||
|
|
||||||
update!(state: :pending, follow_activity_id: activity_id)
|
update!(state: :pending, follow_activity_id: activity_id)
|
||||||
DeliveryFailureTracker.new(inbox_url).track_success!
|
DeliveryFailureTracker.track_success!(inbox_url)
|
||||||
ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
|
ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ class Relay < ApplicationRecord
|
|||||||
payload = Oj.dump(unfollow_activity(activity_id))
|
payload = Oj.dump(unfollow_activity(activity_id))
|
||||||
|
|
||||||
update!(state: :idle, follow_activity_id: nil)
|
update!(state: :idle, follow_activity_id: nil)
|
||||||
DeliveryFailureTracker.new(inbox_url).track_success!
|
DeliveryFailureTracker.track_success!(inbox_url)
|
||||||
ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
|
ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
22
app/models/unavailable_domain.rb
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: unavailable_domains
|
||||||
|
#
|
||||||
|
# id :bigint(8) not null, primary key
|
||||||
|
# domain :string default(""), not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
#
|
||||||
|
|
||||||
|
class UnavailableDomain < ApplicationRecord
|
||||||
|
include DomainNormalizable
|
||||||
|
|
||||||
|
after_commit :reset_cache!
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def reset_cache!
|
||||||
|
Rails.cache.delete('unavailable_domains')
|
||||||
|
end
|
||||||
|
end
|
@ -98,6 +98,7 @@ class User < ApplicationRecord
|
|||||||
|
|
||||||
before_validation :sanitize_languages
|
before_validation :sanitize_languages
|
||||||
before_create :set_approved
|
before_create :set_approved
|
||||||
|
after_commit :send_pending_devise_notifications
|
||||||
|
|
||||||
# This avoids a deprecation warning from Rails 5.1
|
# This avoids a deprecation warning from Rails 5.1
|
||||||
# It seems possible that a future release of devise-two-factor will
|
# It seems possible that a future release of devise-two-factor will
|
||||||
@ -306,11 +307,38 @@ class User < ApplicationRecord
|
|||||||
protected
|
protected
|
||||||
|
|
||||||
def send_devise_notification(notification, *args)
|
def send_devise_notification(notification, *args)
|
||||||
devise_mailer.send(notification, self, *args).deliver_later
|
# This method can be called in `after_update` and `after_commit` hooks,
|
||||||
|
# but we must make sure the mailer is actually called *after* commit,
|
||||||
|
# otherwise it may work on stale data. To do this, figure out if we are
|
||||||
|
# within a transaction.
|
||||||
|
if ActiveRecord::Base.connection.current_transaction.try(:records)&.include?(self)
|
||||||
|
pending_devise_notifications << [notification, args]
|
||||||
|
else
|
||||||
|
render_and_send_devise_message(notification, *args)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def send_pending_devise_notifications
|
||||||
|
pending_devise_notifications.each do |notification, args|
|
||||||
|
render_and_send_devise_message(notification, *args)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Empty the pending notifications array because the
|
||||||
|
# after_commit hook can be called multiple times which
|
||||||
|
# could cause multiple emails to be sent.
|
||||||
|
pending_devise_notifications.clear
|
||||||
|
end
|
||||||
|
|
||||||
|
def pending_devise_notifications
|
||||||
|
@pending_devise_notifications ||= []
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_and_send_devise_message(notification, *args)
|
||||||
|
devise_mailer.send(notification, self, *args).deliver_later
|
||||||
|
end
|
||||||
|
|
||||||
def set_approved
|
def set_approved
|
||||||
self.approved = open_registrations? || valid_invitation? || external?
|
self.approved = open_registrations? || valid_invitation? || external?
|
||||||
end
|
end
|
||||||
|
@ -171,12 +171,12 @@
|
|||||||
%th= t('admin.accounts.inbox_url')
|
%th= t('admin.accounts.inbox_url')
|
||||||
%td
|
%td
|
||||||
= @account.inbox_url
|
= @account.inbox_url
|
||||||
= fa_icon DeliveryFailureTracker.unavailable?(@account.inbox_url) ? 'times' : 'check'
|
= fa_icon DeliveryFailureTracker.available?(@account.inbox_url) ? 'check' : 'times'
|
||||||
%tr
|
%tr
|
||||||
%th= t('admin.accounts.shared_inbox_url')
|
%th= t('admin.accounts.shared_inbox_url')
|
||||||
%td
|
%td
|
||||||
= @account.shared_inbox_url
|
= @account.shared_inbox_url
|
||||||
= fa_icon DeliveryFailureTracker.unavailable?(@account.shared_inbox_url) ? 'times' : 'check'
|
= fa_icon DeliveryFailureTracker.available?(@account.shared_inbox_url) ? 'check': 'times'
|
||||||
|
|
||||||
%div{ style: 'overflow: hidden' }
|
%div{ style: 'overflow: hidden' }
|
||||||
%div{ style: 'float: right' }
|
%div{ style: 'float: right' }
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
%h4= t 'footer.developers'
|
%h4= t 'footer.developers'
|
||||||
%ul
|
%ul
|
||||||
%li= link_to t('about.documentation'), 'https://docs.joinmastodon.org/'
|
%li= link_to t('about.documentation'), 'https://docs.joinmastodon.org/'
|
||||||
%li= link_to t('about.api'), 'https://docs.joinmastodon.org/api/guidelines/'
|
%li= link_to t('about.api'), 'https://docs.joinmastodon.org/client/intro/'
|
||||||
.column-2
|
.column-2
|
||||||
%h4= link_to t('about.what_is_mastodon'), 'https://joinmastodon.org/'
|
%h4= link_to t('about.what_is_mastodon'), 'https://joinmastodon.org/'
|
||||||
= link_to svg_logo, root_url, class: 'brand'
|
= link_to svg_logo, root_url, class: 'brand'
|
||||||
|
@ -23,6 +23,10 @@
|
|||||||
%th= t('simple_form.labels.account_alias.acct')
|
%th= t('simple_form.labels.account_alias.acct')
|
||||||
%th
|
%th
|
||||||
%tbody
|
%tbody
|
||||||
|
- if @aliases.empty?
|
||||||
|
%tr
|
||||||
|
%td.muted-hint{ colspan: 2 }= t('aliases.empty')
|
||||||
|
- else
|
||||||
- @aliases.each do |account_alias|
|
- @aliases.each do |account_alias|
|
||||||
%tr
|
%tr
|
||||||
%td= account_alias.acct
|
%td= account_alias.acct
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
= render 'application/card', account: @account
|
= render 'application/card', account: @account
|
||||||
|
|
||||||
.fields-row__column.fields-group.fields-row__column-6
|
.fields-row__column.fields-group.fields-row__column-6
|
||||||
= f.input :header, wrapper: :with_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT))
|
= f.input :header, wrapper: :with_label, input_html: { accept: AccountHeader::IMAGE_MIME_TYPES.join(',') }, hint: picture_hint(t('simple_form.hints.defaults.header', dimensions: '1500x500', size: number_to_human_size(AccountHeader::LIMIT)), @account.header)
|
||||||
|
|
||||||
= f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT))
|
= f.input :avatar, wrapper: :with_label, input_html: { accept: AccountAvatar::IMAGE_MIME_TYPES.join(',') }, hint: picture_hint(t('simple_form.hints.defaults.avatar', dimensions: '400x400', size: number_to_human_size(AccountAvatar::LIMIT)), @account.avatar)
|
||||||
|
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
|
|
||||||
|
@ -12,13 +12,15 @@
|
|||||||
%span.poll__number><
|
%span.poll__number><
|
||||||
- if own_votes.include?(index)
|
- if own_votes.include?(index)
|
||||||
%i.poll__voted__mark.fa.fa-check
|
%i.poll__voted__mark.fa.fa-check
|
||||||
= percent.round
|
= "#{percent.round}%"
|
||||||
|
%span.poll__option__text
|
||||||
= Formatter.instance.format_poll_option(status, option, autoplay: autoplay)
|
= Formatter.instance.format_poll_option(status, option, autoplay: autoplay)
|
||||||
|
|
||||||
%span.poll__chart{ style: "width: #{percent}%" }
|
%span.poll__chart{ style: "width: #{percent}%" }
|
||||||
- else
|
- else
|
||||||
%label.poll__option><
|
%label.poll__option><
|
||||||
%span.poll__input{ class: poll.multiple? ? 'checkbox' : nil}><
|
%span.poll__input{ class: poll.multiple? ? 'checkbox' : nil}><
|
||||||
|
%span.poll__option__text
|
||||||
= Formatter.instance.format_poll_option(status, option, autoplay: autoplay)
|
= Formatter.instance.format_poll_option(status, option, autoplay: autoplay)
|
||||||
.poll__footer
|
.poll__footer
|
||||||
- unless show_results
|
- unless show_results
|
||||||
|
@ -12,5 +12,5 @@
|
|||||||
%h1= "##{@tag.name}"
|
%h1= "##{@tag.name}"
|
||||||
%p= t('about.about_hashtag_html', hashtag: @tag.name)
|
%p= t('about.about_hashtag_html', hashtag: @tag.name)
|
||||||
|
|
||||||
#mastodon-timeline{ data: { props: Oj.dump(default_props.merge(hashtag: @tag.name)) }}
|
#mastodon-timeline{ data: { props: Oj.dump(default_props.merge(hashtag: @tag.name, local: @local)) }}
|
||||||
#modal-container
|
#modal-container
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
%table.input{ align: 'center', cellspacing: 0, cellpadding: 0 }
|
%table.input{ align: 'center', cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
%tr
|
%tr
|
||||||
%td= @resource.try(:unconfirmed_email) ? @resource.unconfirmed_email : @resource.email
|
%td= @resource.unconfirmed_email
|
||||||
|
|
||||||
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
%table.email-table{ cellspacing: 0, cellpadding: 0 }
|
||||||
%tbody
|
%tbody
|
||||||
|
@ -4,6 +4,6 @@
|
|||||||
|
|
||||||
<%= t 'devise.mailer.email_changed.explanation' %>
|
<%= t 'devise.mailer.email_changed.explanation' %>
|
||||||
|
|
||||||
<%= @resource.try(:unconfirmed_email) ? @resource.unconfirmed_email : @resource.email %>
|
<%= @resource.unconfirmed_email %>
|
||||||
|
|
||||||
<%= t 'devise.mailer.email_changed.extra' %>
|
<%= t 'devise.mailer.email_changed.extra' %>
|
||||||
|
@ -12,7 +12,7 @@ class ActivityPub::DeliveryWorker
|
|||||||
HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
|
HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
|
||||||
|
|
||||||
def perform(json, source_account_id, inbox_url, options = {})
|
def perform(json, source_account_id, inbox_url, options = {})
|
||||||
return if DeliveryFailureTracker.unavailable?(inbox_url)
|
return unless DeliveryFailureTracker.available?(inbox_url)
|
||||||
|
|
||||||
@options = options.with_indifferent_access
|
@options = options.with_indifferent_access
|
||||||
@json = json
|
@json = json
|
||||||
@ -23,12 +23,14 @@ class ActivityPub::DeliveryWorker
|
|||||||
|
|
||||||
perform_request
|
perform_request
|
||||||
ensure
|
ensure
|
||||||
|
if @inbox_url.present?
|
||||||
if @performed
|
if @performed
|
||||||
failure_tracker.track_success!
|
failure_tracker.track_success!
|
||||||
else
|
else
|
||||||
failure_tracker.track_failure!
|
failure_tracker.track_failure!
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ class PostProcessMediaWorker
|
|||||||
media_attachment = MediaAttachment.find(media_attachment_id)
|
media_attachment = MediaAttachment.find(media_attachment_id)
|
||||||
media_attachment.processing = :in_progress
|
media_attachment.processing = :in_progress
|
||||||
media_attachment.save
|
media_attachment.save
|
||||||
media_attachment.file.reprocess_original!
|
media_attachment.file.reprocess!(:original)
|
||||||
media_attachment.processing = :complete
|
media_attachment.processing = :complete
|
||||||
media_attachment.save
|
media_attachment.save
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
@ -23,3 +23,9 @@ module Chewy
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# ElasticSearch uses Faraday internally. Faraday interprets the
|
||||||
|
# http_proxy env variable by default which leads to issues when
|
||||||
|
# Mastodon is run with hidden services enabled, because
|
||||||
|
# ElasticSearch is *not* supposed to be accessed through a proxy
|
||||||
|
Faraday.ignore_env_proxy = true
|
||||||
|
@ -635,6 +635,7 @@ en:
|
|||||||
add_new: Create alias
|
add_new: Create alias
|
||||||
created_msg: Successfully created a new alias. You can now initiate the move from the old account.
|
created_msg: Successfully created a new alias. You can now initiate the move from the old account.
|
||||||
deleted_msg: Successfully remove the alias. Moving from that account to this one will no longer be possible.
|
deleted_msg: Successfully remove the alias. Moving from that account to this one will no longer be possible.
|
||||||
|
empty: You have no aliases.
|
||||||
hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is <strong>harmless and reversible</strong>. <strong>The account migration is initiated from the old account</strong>.
|
hint_html: If you want to move from another account to this one, here you can create an alias, which is required before you can proceed with moving followers from the old account to this one. This action by itself is <strong>harmless and reversible</strong>. <strong>The account migration is initiated from the old account</strong>.
|
||||||
remove: Unlink alias
|
remove: Unlink alias
|
||||||
appearance:
|
appearance:
|
||||||
|
@ -100,7 +100,9 @@ Rails.application.routes.draw do
|
|||||||
get '/settings', to: redirect('/settings/profile')
|
get '/settings', to: redirect('/settings/profile')
|
||||||
|
|
||||||
namespace :settings do
|
namespace :settings do
|
||||||
resource :profile, only: [:show, :update]
|
resource :profile, only: [:show, :update] do
|
||||||
|
resources :pictures, only: :destroy
|
||||||
|
end
|
||||||
|
|
||||||
get :preferences, to: redirect('/settings/preferences/appearance')
|
get :preferences, to: redirect('/settings/preferences/appearance')
|
||||||
|
|
||||||
|
9
db/migrate/20200407201300_create_unavailable_domains.rb
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
class CreateUnavailableDomains < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
create_table :unavailable_domains do |t|
|
||||||
|
t.string :domain, default: '', null: false, index: { unique: true }
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
21
db/migrate/20200407202420_migrate_unavailable_inboxes.rb
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
class MigrateUnavailableInboxes < ActiveRecord::Migration[5.2]
|
||||||
|
disable_ddl_transaction!
|
||||||
|
|
||||||
|
def up
|
||||||
|
urls = Redis.current.smembers('unavailable_inboxes')
|
||||||
|
|
||||||
|
hosts = urls.map do |url|
|
||||||
|
Addressable::URI.parse(url).normalized_host
|
||||||
|
end.compact.uniq
|
||||||
|
|
||||||
|
UnavailableDomain.delete_all
|
||||||
|
|
||||||
|
hosts.each do |host|
|
||||||
|
UnavailableDomain.create(domain: host)
|
||||||
|
end
|
||||||
|
|
||||||
|
Redis.current.del(*(['unavailable_inboxes'] + Redis.current.keys('exhausted_deliveries:*')))
|
||||||
|
end
|
||||||
|
|
||||||
|
def down; end
|
||||||
|
end
|
@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 2020_03_12_185443) do
|
ActiveRecord::Schema.define(version: 2020_04_07_202420) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
@ -769,6 +769,13 @@ ActiveRecord::Schema.define(version: 2020_03_12_185443) do
|
|||||||
t.index ["uri"], name: "index_tombstones_on_uri"
|
t.index ["uri"], name: "index_tombstones_on_uri"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "unavailable_domains", force: :cascade do |t|
|
||||||
|
t.string "domain", default: "", null: false
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
t.index ["domain"], name: "index_unavailable_domains_on_domain", unique: true
|
||||||
|
end
|
||||||
|
|
||||||
create_table "user_invite_requests", force: :cascade do |t|
|
create_table "user_invite_requests", force: :cascade do |t|
|
||||||
t.bigint "user_id"
|
t.bigint "user_id"
|
||||||
t.text "text"
|
t.text "text"
|
||||||
|
@ -4,6 +4,7 @@ services:
|
|||||||
db:
|
db:
|
||||||
restart: always
|
restart: always
|
||||||
image: postgres:9.6-alpine
|
image: postgres:9.6-alpine
|
||||||
|
shm_size: 256mb
|
||||||
networks:
|
networks:
|
||||||
- internal_network
|
- internal_network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
|
@ -276,7 +276,7 @@ module Mastodon
|
|||||||
preload_map = Hash.new { |hash, key| hash[key] = [] }
|
preload_map = Hash.new { |hash, key| hash[key] = [] }
|
||||||
|
|
||||||
objects.map do |object|
|
objects.map do |object|
|
||||||
segments = object.key.split('/').first
|
segments = object.key.split('/')
|
||||||
model_name = segments.first.classify
|
model_name = segments.first.classify
|
||||||
record_id = segments[2..-2].join.to_i
|
record_id = segments[2..-2].join.to_i
|
||||||
|
|
||||||
|
@ -14,17 +14,6 @@ module Paperclip
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def reprocess_original!
|
|
||||||
old_original_path = path(:original)
|
|
||||||
reprocess!(:original)
|
|
||||||
new_original_path = path(:original)
|
|
||||||
|
|
||||||
if new_original_path != old_original_path
|
|
||||||
@queued_for_delete << old_original_path
|
|
||||||
flush_deletes
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def variant?(other_filename)
|
def variant?(other_filename)
|
||||||
return true if original_filename == other_filename
|
return true if original_filename == other_filename
|
||||||
return false if original_filename.nil?
|
return false if original_filename.nil?
|
||||||
|
@ -15,7 +15,7 @@ end
|
|||||||
namespace :emojis do
|
namespace :emojis do
|
||||||
desc 'Generate a unicode to filename mapping'
|
desc 'Generate a unicode to filename mapping'
|
||||||
task :generate do
|
task :generate do
|
||||||
source = 'http://www.unicode.org/Public/emoji/11.0/emoji-test.txt'
|
source = 'http://www.unicode.org/Public/emoji/12.0/emoji-test.txt'
|
||||||
codes = []
|
codes = []
|
||||||
dest = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json')
|
dest = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json')
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@
|
|||||||
"@rails/ujs": "^6.0.2",
|
"@rails/ujs": "^6.0.2",
|
||||||
"array-includes": "^3.1.1",
|
"array-includes": "^3.1.1",
|
||||||
"arrow-key-navigation": "^1.1.0",
|
"arrow-key-navigation": "^1.1.0",
|
||||||
"autoprefixer": "^9.7.5",
|
"autoprefixer": "^9.7.6",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"babel-loader": "^8.1.0",
|
"babel-loader": "^8.1.0",
|
||||||
"babel-plugin-lodash": "^3.3.4",
|
"babel-plugin-lodash": "^3.3.4",
|
||||||
@ -111,7 +111,7 @@
|
|||||||
"mark-loader": "^0.1.6",
|
"mark-loader": "^0.1.6",
|
||||||
"marky": "^1.2.1",
|
"marky": "^1.2.1",
|
||||||
"mini-css-extract-plugin": "^0.9.0",
|
"mini-css-extract-plugin": "^0.9.0",
|
||||||
"mkdirp": "^1.0.3",
|
"mkdirp": "^1.0.4",
|
||||||
"npmlog": "^4.1.2",
|
"npmlog": "^4.1.2",
|
||||||
"object-assign": "^4.1.1",
|
"object-assign": "^4.1.1",
|
||||||
"object-fit-images": "^3.2.3",
|
"object-fit-images": "^3.2.3",
|
||||||
@ -160,7 +160,7 @@
|
|||||||
"tesseract.js": "^2.0.0-alpha.16",
|
"tesseract.js": "^2.0.0-alpha.16",
|
||||||
"throng": "^4.0.0",
|
"throng": "^4.0.0",
|
||||||
"tiny-queue": "^0.2.1",
|
"tiny-queue": "^0.2.1",
|
||||||
"uuid": "^7.0.2",
|
"uuid": "^7.0.3",
|
||||||
"wavesurfer.js": "^3.3.1",
|
"wavesurfer.js": "^3.3.1",
|
||||||
"webpack": "^4.42.1",
|
"webpack": "^4.42.1",
|
||||||
"webpack-assets-manifest": "^3.1.1",
|
"webpack-assets-manifest": "^3.1.1",
|
||||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F7DECE" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#F7DECE" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#292F33" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#F7DECE" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F7DECE" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#F7DECE" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#292F33" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#F7DECE" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F3D2A2" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#F3D2A2" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#FFE51E" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#F3D2A2" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F3D2A2" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#F3D2A2" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#FFE51E" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#F3D2A2" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#D4AB88" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#D4AB88" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#963B22" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#D4AB88" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#D4AB88" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#D4AB88" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#963B22" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#D4AB88" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#AF7E57" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#AF7E57" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#60352A" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#AF7E57" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#AF7E57" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#AF7E57" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#60352A" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#AF7E57" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#7C533E" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#7C533E" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#0B0200" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#7C533E" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#7C533E" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#7C533E" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#0B0200" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#7C533E" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#FFDC5D" d="M2.789 15.057c-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566l-.833-.959zm22.862-3.211c.379.095 1.515.151 2.104.386.477.19 1.122.088 1.073.455-.043.316-.701.317-1.422.371-.722.054-1.949.085-2.39-.113l.635-1.099zM14.698.997c-1.593-.627-4.077.182-4.365 2.043-.287 1.848.239 4.747 1.863 4.572 1.702-.184 3.448-.554 4.138-2.307.69-1.752-.043-3.681-1.636-4.308z"/><path fill="#FFDC5D" d="M15.882 5.757c2.318-2.723-3.266-2.458-3.266-2.458-1.057.038-.329 1.799-.827 2.761-.341.665 1.095 1.018 1.095 1.018s.659-.01.694.79v.007c.008.204-.013.445-.108.769-.473 1.601 1.677 2.582 2.149.978.187-.635.114-1.193.02-1.708l-.009-.046c-.144-.766-.322-1.438.252-2.111z"/><path fill="#FFAC33" d="M16.518 1.64C15.457.398 13.998-.117 11.499.849c-2.183.844-1.366 2.72-.972 2.282.628-.696 1.477-.483 1.477-.483l.66 1.944s.314.189.445-.473 1.017-.729 1.308-.198c.452.826-.139.984-.193 1.478-.17 1.562 1.56 1.502 1.56 1.502s.337.132.912-1.001c.575-1.132.876-3.027-.178-4.26z"/><path fill="#FFDC5D" d="M16.261 28.432c-.378-.1-.67-.432-.807-.785-.059-.152-.245-.89-.245-.89l-2.284.284c.043.214.114.512.185.94.054.324-.089.753.012.954.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.223-.254-.427-.725-.806-.825zm7.51-3.222c-.334-.065-.607-.336-.746-.634-.06-.129-.22-.651-.22-.651l-2.009.274c.05.183.129.438.216.804.066.278-.033.659.066.827.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.177-.233-.415-.603-.749-.668z"/><path fill="#292F33" d="M25.676 11.812c-.242-.036-2.877-.731-3.554-1.052-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.836 1.068c.312-.281 1.748-.596 2.748-1.046.396-.178 1.452-.296 1.982-.81l.017.017c1.396-.979 2.326-2.021 2.722-2.599L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008 1.412 0 2.24-.56 2.24-.56s-.278-.638-.165-1.577c.069-.572.58-1.601.58-2.45 0-.849-.095-1.367.031-1.719s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.893-.133 1.966-.567 1.966-.567s-.096-1.268-.078-1.848c.023-.706.412-2.193.265-2.824-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.365-2.469-.005-3.781-.005-3.781s1.81.804 3.578 1.344c.577.285 2.27.562 3.989.5.432-.016.452-1.233.125-1.282z"/><path fill="#67757F" d="M7.265 13.194c.795-1.126 2.994-4.365 5.435-4.576 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639l-.751.766L13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.685.614-.896.735-.389.223-2.813 1.505-3.334 2.005l.288.368c1.224-.797 3.829-1.949 4.189-2.232zm15.956-1.75c.453.215 1.771.594 2.674.834-.016-.24-.089-.446-.219-.465-.2-.03-2.502-.686-3.513-1.033.212.162.682.465 1.058.664zm-2.139 11.291c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.433 1.658.54 2.703.309-.046.638-.128.938-.216-.613-.262-.707-1.099-.745-1.705z"/><path fill="#67757F" d="M13.135 24.147c-.303-1.149.176-2.906.176-2.906 0-.435-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.21 1.309-5.224.906c-.347-.718-1.03-4.737-1.03-4.737-.213-.025-.499.231-.642.487L12.208 17s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.611 3.468.653 4.008.386 0 .724-.044 1.018-.104-.688-.618-.566-1.979-.853-3.065z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4289C1" d="M36 5v27s0 4-4 4H4c-4 0-4-4-4-4v-5s25-2 36-22z"/><path fill="#1C6399" d="M31.844 23.243s2.565-1.635 2.258-2.288c-.309-.654-11.778.99-17.528 2.954-8.627 2.947-13.144 7.522-12.526 8.828.617 1.306 7.602 1.953 16.228-.993 5.752-1.964 15.368-7.524 15.06-8.177-.309-.653-3.492-.324-3.492-.324z"/><path fill="#A6D388" d="M31.474 22.747s2.65-1.619 2.349-2.291c-.303-.673-12.042.782-17.949 2.675C7.01 25.972 2.311 30.555 2.916 31.9c.605 1.345 7.723 2.141 16.585-.699 5.91-1.893 15.833-7.383 15.532-8.055-.303-.673-3.559-.399-3.559-.399z"/><path fill="#F5F8FA" d="M31.474 22.747s2.507-1.534 2.358-2.235L3.756 29.978c-.722.837-1.019 1.523-.84 1.922.156.348.755.657 1.7.878l30.395-9.566c.003-.02.029-.051.022-.066-.303-.673-3.559-.399-3.559-.399z"/><path fill="#FFDC5D" d="M14.919 1.309c-1.46-.632-3.707.061-4.116 1.762-.572 2.374.726 4.444 2.239 4.331 1.586-.118 2.568-.436 3.263-2.042.695-1.605.074-3.419-1.386-4.051z"/><path fill="#FFDC5D" d="M15.871 5.765c2.237-2.457-2.957-2.383-2.957-2.383-.983.003-.362 1.661-.853 2.538-.337.607.985.979.985.979s.612.011.62.755v.007c.001.189-.026.413-.124.71-.489 1.472 1.477 2.449 1.965.975.193-.584.143-1.104.071-1.586l-.007-.043c-.109-.715-.253-1.344.3-1.952z"/><path fill="#FFAC33" d="M16.763 1.884c-.697-1.012-3.117-1.965-4.713-.767-1.07-.222-1.517.787-1.445 1.379.057.473 1.209.633 1.469 1.535.209-.217.277-.674.242-.921.356.366.165 1.292 1.592 1.949 1.38.634 1.091 1.862 1.091 1.862s.749-.324 1.281-.9c1.019-1.101 1.251-3.022.483-4.137z"/><path fill="#FFDC5D" d="M16.261 28.432c-.378-.1-.971-.58-1.154-.912-.661-1.197.171-3.476.19-4.777.005-.37-2.213-1.974-2.86-1.016s.991 4.719.812 6.193c-.04.326-.227.814-.126 1.015.101.201.817.74 1.301.839 1.237.255 2.491-.342 2.644-.517.222-.254-.428-.725-.807-.825zm7.51-3.222c-.334-.065-.85-.469-1.016-.753-.29-.498.157-3.642.127-4.946-.35-.234-2.393.926-2.393.926-.437 1.815.817 2.863.659 4.262-.032.284-.17.964-.071 1.132.099.169.752.594 1.178.652 1.088.148 2.141-.443 2.264-.604.178-.234-.414-.604-.748-.669zm3.984-12.977c-.589-.235-1.348-.276-2.104-.386-1.198-.175-2.852-.765-3.529-1.086-.825-.495-2.577-1.661-3.012-1.948S18.093 8.128 17.375 8h-.156c.385.542.609 1.159.748 2.841 0 0 3.319 1.661 3.595 1.753 1.125.375 3.182.366 4.344.512.602.076 1.021-.014 1.499-.047.722-.049 1.38-.055 1.422-.371.05-.367-.595-.265-1.072-.455zM10.999 8.402c-1.666.993-3.368 3.049-3.98 3.914-.36.283-.686.614-.897.736-.389.223-2.154 1.432-3.334 2.005-.354.166-1.458.438-1.992.781-.432.278-.845.262-.727.612.102.302.508.216 1.227.132.719-.084 1.929-.289 2.325-.566.8-.531 3.347-1.156 4.597-2.031.221-.155 2.385-2.163 2.781-2.741.543-1.515.282-2.556 0-2.842z"/><path fill="#292F33" d="M23.042 19.417c-.229-.981-1.5-2.047-2.677-2.948-1.177-.901-2.375-1.438-2.375-1.438.034-.487-.172-1.295-.089-2.016.099-.853.26-1.689.26-1.689s1.633.727 3.402 1.267c.302-.363.618-1.395.559-1.833-.903-.841-2.483-1.754-2.919-2.042s-.837-.637-1.828-.718h-1.639s-.099.856-.749.918C14.337 8.98 13.56 8 13.56 8l-1.748.167c-2.198.338-4 3.024-4.794 4.151-.36.283-.36.283-.526.447.927.602 2.128 1.035 2.128 1.035 1.188-1.024 2.078-1.535 2.474-2.113 0 0 .659 1.356.912 2.388.253 1.032.202 2.925.202 2.925s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884 0 0-.606 1.335-.302 2.484.403 1.529.885 3.468.927 4.008 1.412 0 1.667-.359 1.667-.359s.02-.839.134-1.778c.069-.572.269-1.544.269-2.393 0-.849.217-1.424.343-1.776s.601-1.452.677-2.052c.02-.162.008-.374-.022-.6.534.292 1.493.792 2.084.954.849.232 1.494.595 1.718.79s.376.335.376.335-.201.557-.141 1.516c.055.877.693 1.658.8 2.703.893-.133 1.53-.499 1.53-.499s.079-1.336.098-1.916c.023-.706.412-2.193.265-2.824z"/><path fill="#67757F" d="M7.192 13.168c.795-1.126 3.067-4.339 5.508-4.55 0 0 1.118 1.459 2.565 1.235 1.447-.224 1.482-1.318 1.482-1.318l1.727.149c.494.04.841.148 1.12.281-.163-.101-.304-.189-.391-.246-.435-.287-.837-.638-1.828-.719h-1.639s-.309.699-.751.766S13.56 8 13.56 8l-1.748.167c-2.678.421-4.566 3.941-5.32 4.598.106.104.456.283.7.403z"/><path fill="#67757F" d="M13.762 27.297c-.402-1.36-1.283-4.497-.45-6.056.075-.368-.23-1.357-.318-1.729-.063-.266-.103-2.438-.072-2.717 3.859-.123 5.068-1.763 5.068-1.763s-2.139 1.191-5.354.57c.174-1.719-1.134-4.337-1.134-4.337-.213-.025-.265.168-.408.424 0 0 .774 1.865.912 2.718.137.852.202 2.593.202 2.593s-.005 1.674.058 1.94c.088.372.353 1.449.353 1.884-.952 1.783-.099 2.98.625 6.492.169.008.336.008.518-.019zm7.32-4.562c-.06-.958.024-1.639-.072-1.843-.096-.204-.52-.455-.52-.455s-.201.557-.141 1.516c.055.877.69 1.734.8 2.703.309-.046.406-.073.706-.161-.613-.261-.735-1.154-.773-1.76z"/></svg>
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.5 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F7DECE" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#D89882" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F7DECE" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#E0AA94" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F3D2A2" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#C68F6A" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F3D2A2" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#D2A077" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D5AB88" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#AA8052" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D4AB88" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#B78B60" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#AF7E57" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#845636" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#AF7E57" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#90603E" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#7C533E" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#543226" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#7C533E" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#583529" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
@ -1 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFDC5D" d="M36 20.363C34.648 19.937 32.158 17 30 17c-3 0-3-7-4-9s-3-4-3-5-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.658.179 7-.136.794-.107 1.493-.357 2-.864 0 0 0 8 2 11 0 0-1 1-2 4s-2 0-2-2-1-5-5-7c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#4289C1" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#EF9645" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFDC5D" d="M36 20.363C34.529 19.5 31.846 18 30 17c-2.638-1.429-3.53-5.558-4.14-7.737C25.256 7.11 23.201 3.737 23 3c-.263-.965-3-2-8 0S7 5 5 5 2 7 1 9s0 2 0 2c1 1 2-2 4-3s3 1 5 0c1.493-.747 4.146.009 6.488-.305.794-.107 2.005-.188 2.512-.695 0 0 .572 6.698 2 11 0 0-.209 1.075-1.209 4.075-.5 1.5-1.791 1.425-2.166.8S17 21 17 20c0-2-1-5-5-7-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9s3 2 7 2c1.943 0 17.812.48 22 .364v-6.001z"/><path fill="#FA743E" d="M21 18c3.745 2.204 12.107.993 12.798.897S36 20.363 36 20.363v4.918H19.626s.348-2.123-.23-3.073C20.396 20.754 21 18 21 18z"/><path fill="#DD551F" d="M8.182 16.405c2.186-1.941 5.633-1.688 8.025.472C15.49 15.504 14.201 14.101 12 13c-1.789-.894-5.658-.683-7 2-2 4 0 8 2 9 .239.119.463.239.681.356-1.814-2.621-1.665-6.025.501-7.951z"/><path fill="#FCAB40" d="M12 18.5c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C12.78 16.513 13.951 16.5 14 16.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028 0-.821.028-1.646.854-.098.097-.226.146-.354.146zm-4 3c-.128 0-.256-.049-.354-.146-.195-.195-.195-.512 0-.707C8.78 19.513 9.951 19.5 10 19.5c.276 0 .5.224.5.5s-.224.5-.5.5c-.028.001-.821.028-1.646.854-.098.097-.226.146-.354.146z"/><path fill="#55ACEE" d="M0 24h36v12H0z"/><path fill="#55ACEE" d="M6 24c3-2 7-5 6-3s-1.001 3 1 2c2-1 5-2 4 0s2 1 3 0 4 0 3 1-9 2-12 2-5-2-5-2z"/></svg>
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 6.2 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 4.6 KiB |
1
public/emoji/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
1
public/emoji/1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff.svg
Normal file
After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.0 KiB |