Merge branch 'master' into glitch-soc/merge-upstream
This commit is contained in:
		
						commit
						c4ae7aab6f
					
				
							
								
								
									
										4
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Gemfile
									
									
									
									
									
								
							@ -5,7 +5,7 @@ ruby '>= 2.4.0', '< 2.7.0'
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
gem 'pkg-config', '~> 1.3'
 | 
					gem 'pkg-config', '~> 1.3'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gem 'puma', '~> 4.0'
 | 
					gem 'puma', '~> 4.1'
 | 
				
			||||||
gem 'rails', '~> 5.2.3'
 | 
					gem 'rails', '~> 5.2.3'
 | 
				
			||||||
gem 'thor', '~> 0.20'
 | 
					gem 'thor', '~> 0.20'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -32,7 +32,7 @@ gem 'iso-639'
 | 
				
			|||||||
gem 'chewy', '~> 5.0'
 | 
					gem 'chewy', '~> 5.0'
 | 
				
			||||||
gem 'cld3', '~> 3.2.4'
 | 
					gem 'cld3', '~> 3.2.4'
 | 
				
			||||||
gem 'devise', '~> 4.6'
 | 
					gem 'devise', '~> 4.6'
 | 
				
			||||||
gem 'devise-two-factor', '~> 3.0'
 | 
					gem 'devise-two-factor', '~> 3.1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
group :pam_authentication, optional: true do
 | 
					group :pam_authentication, optional: true do
 | 
				
			||||||
  gem 'devise_pam_authenticatable2', '~> 9.2'
 | 
					  gem 'devise_pam_authenticatable2', '~> 9.2'
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										32
									
								
								Gemfile.lock
									
									
									
									
									
								
							
							
						
						
									
										32
									
								
								Gemfile.lock
									
									
									
									
									
								
							@ -112,7 +112,7 @@ GEM
 | 
				
			|||||||
      aws-sigv4 (~> 1.1)
 | 
					      aws-sigv4 (~> 1.1)
 | 
				
			||||||
    aws-sigv4 (1.1.0)
 | 
					    aws-sigv4 (1.1.0)
 | 
				
			||||||
      aws-eventstream (~> 1.0, >= 1.0.2)
 | 
					      aws-eventstream (~> 1.0, >= 1.0.2)
 | 
				
			||||||
    bcrypt (3.1.12)
 | 
					    bcrypt (3.1.13)
 | 
				
			||||||
    benchmark-ips (2.7.2)
 | 
					    benchmark-ips (2.7.2)
 | 
				
			||||||
    better_errors (2.5.1)
 | 
					    better_errors (2.5.1)
 | 
				
			||||||
      coderay (>= 1.0.0)
 | 
					      coderay (>= 1.0.0)
 | 
				
			||||||
@ -194,11 +194,11 @@ GEM
 | 
				
			|||||||
      railties (>= 4.1.0, < 6.0)
 | 
					      railties (>= 4.1.0, < 6.0)
 | 
				
			||||||
      responders
 | 
					      responders
 | 
				
			||||||
      warden (~> 1.2.3)
 | 
					      warden (~> 1.2.3)
 | 
				
			||||||
    devise-two-factor (3.0.3)
 | 
					    devise-two-factor (3.1.0)
 | 
				
			||||||
      activesupport (< 5.3)
 | 
					      activesupport (< 6.1)
 | 
				
			||||||
      attr_encrypted (>= 1.3, < 4, != 2)
 | 
					      attr_encrypted (>= 1.3, < 4, != 2)
 | 
				
			||||||
      devise (~> 4.0)
 | 
					      devise (~> 4.0)
 | 
				
			||||||
      railties (< 5.3)
 | 
					      railties (< 6.1)
 | 
				
			||||||
      rotp (~> 2.0)
 | 
					      rotp (~> 2.0)
 | 
				
			||||||
    devise_pam_authenticatable2 (9.2.0)
 | 
					    devise_pam_authenticatable2 (9.2.0)
 | 
				
			||||||
      devise (>= 4.0.0)
 | 
					      devise (>= 4.0.0)
 | 
				
			||||||
@ -229,8 +229,8 @@ GEM
 | 
				
			|||||||
      tzinfo
 | 
					      tzinfo
 | 
				
			||||||
    excon (0.62.0)
 | 
					    excon (0.62.0)
 | 
				
			||||||
    fabrication (2.20.2)
 | 
					    fabrication (2.20.2)
 | 
				
			||||||
    faker (2.1.0)
 | 
					    faker (2.1.2)
 | 
				
			||||||
      i18n (>= 0.7)
 | 
					      i18n (>= 0.8)
 | 
				
			||||||
    faraday (0.15.0)
 | 
					    faraday (0.15.0)
 | 
				
			||||||
      multipart-post (>= 1.2, < 3)
 | 
					      multipart-post (>= 1.2, < 3)
 | 
				
			||||||
    fast_blank (1.0.0)
 | 
					    fast_blank (1.0.0)
 | 
				
			||||||
@ -377,8 +377,8 @@ GEM
 | 
				
			|||||||
    net-scp (1.2.1)
 | 
					    net-scp (1.2.1)
 | 
				
			||||||
      net-ssh (>= 2.6.5)
 | 
					      net-ssh (>= 2.6.5)
 | 
				
			||||||
    net-ssh (5.0.2)
 | 
					    net-ssh (5.0.2)
 | 
				
			||||||
    nio4r (2.3.1)
 | 
					    nio4r (2.4.0)
 | 
				
			||||||
    nokogiri (1.10.3)
 | 
					    nokogiri (1.10.4)
 | 
				
			||||||
      mini_portile2 (~> 2.4.0)
 | 
					      mini_portile2 (~> 2.4.0)
 | 
				
			||||||
    nokogumbo (2.0.0)
 | 
					    nokogumbo (2.0.0)
 | 
				
			||||||
      nokogiri (~> 1.8, >= 1.8.4)
 | 
					      nokogiri (~> 1.8, >= 1.8.4)
 | 
				
			||||||
@ -414,7 +414,7 @@ GEM
 | 
				
			|||||||
      av (~> 0.9.0)
 | 
					      av (~> 0.9.0)
 | 
				
			||||||
      paperclip (>= 2.5.2)
 | 
					      paperclip (>= 2.5.2)
 | 
				
			||||||
    parallel (1.17.0)
 | 
					    parallel (1.17.0)
 | 
				
			||||||
    parallel_tests (2.29.1)
 | 
					    parallel_tests (2.29.2)
 | 
				
			||||||
      parallel
 | 
					      parallel
 | 
				
			||||||
    parser (2.6.3.0)
 | 
					    parser (2.6.3.0)
 | 
				
			||||||
      ast (~> 2.4.0)
 | 
					      ast (~> 2.4.0)
 | 
				
			||||||
@ -443,7 +443,7 @@ GEM
 | 
				
			|||||||
    pry-rails (0.3.9)
 | 
					    pry-rails (0.3.9)
 | 
				
			||||||
      pry (>= 0.10.4)
 | 
					      pry (>= 0.10.4)
 | 
				
			||||||
    public_suffix (3.1.1)
 | 
					    public_suffix (3.1.1)
 | 
				
			||||||
    puma (4.0.1)
 | 
					    puma (4.1.0)
 | 
				
			||||||
      nio4r (~> 2.0)
 | 
					      nio4r (~> 2.0)
 | 
				
			||||||
    pundit (2.0.1)
 | 
					    pundit (2.0.1)
 | 
				
			||||||
      activesupport (>= 3.0.0)
 | 
					      activesupport (>= 3.0.0)
 | 
				
			||||||
@ -478,7 +478,7 @@ GEM
 | 
				
			|||||||
    rails-dom-testing (2.0.3)
 | 
					    rails-dom-testing (2.0.3)
 | 
				
			||||||
      activesupport (>= 4.2.0)
 | 
					      activesupport (>= 4.2.0)
 | 
				
			||||||
      nokogiri (>= 1.6)
 | 
					      nokogiri (>= 1.6)
 | 
				
			||||||
    rails-html-sanitizer (1.1.0)
 | 
					    rails-html-sanitizer (1.2.0)
 | 
				
			||||||
      loofah (~> 2.2, >= 2.2.2)
 | 
					      loofah (~> 2.2, >= 2.2.2)
 | 
				
			||||||
    rails-i18n (5.1.3)
 | 
					    rails-i18n (5.1.3)
 | 
				
			||||||
      i18n (>= 0.7, < 2)
 | 
					      i18n (>= 0.7, < 2)
 | 
				
			||||||
@ -521,9 +521,9 @@ GEM
 | 
				
			|||||||
    regexp_parser (1.6.0)
 | 
					    regexp_parser (1.6.0)
 | 
				
			||||||
    request_store (1.4.1)
 | 
					    request_store (1.4.1)
 | 
				
			||||||
      rack (>= 1.4)
 | 
					      rack (>= 1.4)
 | 
				
			||||||
    responders (2.4.1)
 | 
					    responders (3.0.0)
 | 
				
			||||||
      actionpack (>= 4.2.0, < 6.0)
 | 
					      actionpack (>= 5.0)
 | 
				
			||||||
      railties (>= 4.2.0, < 6.0)
 | 
					      railties (>= 5.0)
 | 
				
			||||||
    rotp (2.1.2)
 | 
					    rotp (2.1.2)
 | 
				
			||||||
    rpam2 (4.0.2)
 | 
					    rpam2 (4.0.2)
 | 
				
			||||||
    rqrcode (0.10.1)
 | 
					    rqrcode (0.10.1)
 | 
				
			||||||
@ -693,7 +693,7 @@ DEPENDENCIES
 | 
				
			|||||||
  connection_pool
 | 
					  connection_pool
 | 
				
			||||||
  derailed_benchmarks
 | 
					  derailed_benchmarks
 | 
				
			||||||
  devise (~> 4.6)
 | 
					  devise (~> 4.6)
 | 
				
			||||||
  devise-two-factor (~> 3.0)
 | 
					  devise-two-factor (~> 3.1)
 | 
				
			||||||
  devise_pam_authenticatable2 (~> 9.2)
 | 
					  devise_pam_authenticatable2 (~> 9.2)
 | 
				
			||||||
  doorkeeper (~> 5.1)
 | 
					  doorkeeper (~> 5.1)
 | 
				
			||||||
  dotenv-rails (~> 2.7)
 | 
					  dotenv-rails (~> 2.7)
 | 
				
			||||||
@ -750,7 +750,7 @@ DEPENDENCIES
 | 
				
			|||||||
  private_address_check (~> 0.5)
 | 
					  private_address_check (~> 0.5)
 | 
				
			||||||
  pry-byebug (~> 3.7)
 | 
					  pry-byebug (~> 3.7)
 | 
				
			||||||
  pry-rails (~> 0.3)
 | 
					  pry-rails (~> 0.3)
 | 
				
			||||||
  puma (~> 4.0)
 | 
					  puma (~> 4.1)
 | 
				
			||||||
  pundit (~> 2.0)
 | 
					  pundit (~> 2.0)
 | 
				
			||||||
  rack-attack (~> 6.1)
 | 
					  rack-attack (~> 6.1)
 | 
				
			||||||
  rack-cors (~> 1.0)
 | 
					  rack-cors (~> 1.0)
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,8 @@ class AccountsController < ApplicationController
 | 
				
			|||||||
  before_action :set_cache_headers
 | 
					  before_action :set_cache_headers
 | 
				
			||||||
  before_action :set_body_classes
 | 
					  before_action :set_body_classes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  skip_around_action :set_locale, if: -> { request.format == :json }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def show
 | 
					  def show
 | 
				
			||||||
    respond_to do |format|
 | 
					    respond_to do |format|
 | 
				
			||||||
      format.html do
 | 
					      format.html do
 | 
				
			||||||
 | 
				
			|||||||
@ -71,7 +71,7 @@ module Admin
 | 
				
			|||||||
      now = Time.now.utc.beginning_of_day.to_date
 | 
					      now = Time.now.utc.beginning_of_day.to_date
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      (Date.commercial(now.cwyear, now.cweek)..now).map do |date|
 | 
					      (Date.commercial(now.cwyear, now.cweek)..now).map do |date|
 | 
				
			||||||
        date.to_time.utc.beginning_of_day.to_i
 | 
					        date.to_time(:utc).beginning_of_day.to_i
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,8 @@ class Api::BaseController < ApplicationController
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  protect_from_forgery with: :null_session
 | 
					  protect_from_forgery with: :null_session
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  skip_around_action :set_locale
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
 | 
					  rescue_from ActiveRecord::RecordInvalid, Mastodon::ValidationError do |e|
 | 
				
			||||||
    render json: { error: e.to_s }, status: 422
 | 
					    render json: { error: e.to_s }, status: 422
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,8 @@
 | 
				
			|||||||
class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
					class Api::V1::Accounts::StatusesController < Api::BaseController
 | 
				
			||||||
  before_action -> { authorize_if_got_token! :read, :'read:statuses' }
 | 
					  before_action -> { authorize_if_got_token! :read, :'read:statuses' }
 | 
				
			||||||
  before_action :set_account
 | 
					  before_action :set_account
 | 
				
			||||||
  after_action :insert_pagination_headers
 | 
					
 | 
				
			||||||
 | 
					  after_action :insert_pagination_headers, unless: -> { truthy_param?(:pinned) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  respond_to :json
 | 
					  respond_to :json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,8 @@ class StatusesController < ApplicationController
 | 
				
			|||||||
  before_action :set_body_classes
 | 
					  before_action :set_body_classes
 | 
				
			||||||
  before_action :set_autoplay, only: :embed
 | 
					  before_action :set_autoplay, only: :embed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  skip_around_action :set_locale, if: -> { request.format == :json }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  content_security_policy only: :embed do |p|
 | 
					  content_security_policy only: :embed do |p|
 | 
				
			||||||
    p.frame_ancestors(false)
 | 
					    p.frame_ancestors(false)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
@ -12,6 +12,7 @@ export default class Button extends React.PureComponent {
 | 
				
			|||||||
    secondary: PropTypes.bool,
 | 
					    secondary: PropTypes.bool,
 | 
				
			||||||
    size: PropTypes.number,
 | 
					    size: PropTypes.number,
 | 
				
			||||||
    className: PropTypes.string,
 | 
					    className: PropTypes.string,
 | 
				
			||||||
 | 
					    title: PropTypes.string,
 | 
				
			||||||
    style: PropTypes.object,
 | 
					    style: PropTypes.object,
 | 
				
			||||||
    children: PropTypes.node,
 | 
					    children: PropTypes.node,
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
@ -54,6 +55,7 @@ export default class Button extends React.PureComponent {
 | 
				
			|||||||
        onClick={this.handleClick}
 | 
					        onClick={this.handleClick}
 | 
				
			||||||
        ref={this.setRef}
 | 
					        ref={this.setRef}
 | 
				
			||||||
        style={style}
 | 
					        style={style}
 | 
				
			||||||
 | 
					        title={this.props.title}
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        {this.props.text || this.props.children}
 | 
					        {this.props.text || this.props.children}
 | 
				
			||||||
      </button>
 | 
					      </button>
 | 
				
			||||||
 | 
				
			|||||||
@ -166,11 +166,6 @@ export default class StatusContent extends React.PureComponent {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  handleCollapsedClick = (e) => {
 | 
					 | 
				
			||||||
    e.preventDefault();
 | 
					 | 
				
			||||||
    this.setState({ collapsed: !this.state.collapsed });
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  setRef = (c) => {
 | 
					  setRef = (c) => {
 | 
				
			||||||
    this.node = c;
 | 
					    this.node = c;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -234,15 +229,19 @@ export default class StatusContent extends React.PureComponent {
 | 
				
			|||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
    } else if (this.props.onClick) {
 | 
					    } else if (this.props.onClick) {
 | 
				
			||||||
      return (
 | 
					      const output = [
 | 
				
			||||||
        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
 | 
					        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
 | 
				
			||||||
          <div className='status__content__text status__content__text--visible' style={directionStyle} dangerouslySetInnerHTML={content} lang={status.get('language')} />
 | 
					          <div className='status__content__text status__content__text--visible' style={directionStyle} dangerouslySetInnerHTML={content} lang={status.get('language')} />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          {!!this.state.collapsed && readMoreButton}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 | 
					          {!!status.get('poll') && <PollContainer pollId={status.get('poll')} />}
 | 
				
			||||||
        </div>
 | 
					        </div>,
 | 
				
			||||||
      );
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.state.collapsed) {
 | 
				
			||||||
 | 
					        output.push(readMoreButton);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return output;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      return (
 | 
					      return (
 | 
				
			||||||
        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle}>
 | 
					        <div className={classNames} ref={this.setRef} tabIndex='0' style={directionStyle}>
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,7 @@ import DropdownMenuContainer from 'mastodon/containers/dropdown_menu_container';
 | 
				
			|||||||
const messages = defineMessages({
 | 
					const messages = defineMessages({
 | 
				
			||||||
  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
 | 
					  unfollow: { id: 'account.unfollow', defaultMessage: 'Unfollow' },
 | 
				
			||||||
  follow: { id: 'account.follow', defaultMessage: 'Follow' },
 | 
					  follow: { id: 'account.follow', defaultMessage: 'Follow' },
 | 
				
			||||||
 | 
					  cancel_follow_request: { id: 'account.cancel_follow_request', defaultMessage: 'Cancel follow request' },
 | 
				
			||||||
  requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
 | 
					  requested: { id: 'account.requested', defaultMessage: 'Awaiting approval. Click to cancel follow request' },
 | 
				
			||||||
  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
 | 
					  unblock: { id: 'account.unblock', defaultMessage: 'Unblock @{name}' },
 | 
				
			||||||
  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
 | 
					  edit_profile: { id: 'account.edit_profile', defaultMessage: 'Edit profile' },
 | 
				
			||||||
@ -148,7 +149,7 @@ class Header extends ImmutablePureComponent {
 | 
				
			|||||||
      if (!account.get('relationship')) { // Wait until the relationship is loaded
 | 
					      if (!account.get('relationship')) { // Wait until the relationship is loaded
 | 
				
			||||||
        actionBtn = '';
 | 
					        actionBtn = '';
 | 
				
			||||||
      } else if (account.getIn(['relationship', 'requested'])) {
 | 
					      } else if (account.getIn(['relationship', 'requested'])) {
 | 
				
			||||||
        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
 | 
					        actionBtn = <Button className='logo-button' text={intl.formatMessage(messages.cancel_follow_request)} title={intl.formatMessage(messages.requested)} onClick={this.props.onFollow} />;
 | 
				
			||||||
      } else if (!account.getIn(['relationship', 'blocking'])) {
 | 
					      } else if (!account.getIn(['relationship', 'blocking'])) {
 | 
				
			||||||
        actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
 | 
					        actionBtn = <Button disabled={account.getIn(['relationship', 'blocked_by'])} className={classNames('logo-button', { 'button--destructive': account.getIn(['relationship', 'following']) })} text={intl.formatMessage(account.getIn(['relationship', 'following']) ? messages.unfollow : messages.follow)} onClick={this.props.onFollow} />;
 | 
				
			||||||
      } else if (account.getIn(['relationship', 'blocking'])) {
 | 
					      } else if (account.getIn(['relationship', 'blocking'])) {
 | 
				
			||||||
 | 
				
			|||||||
@ -508,7 +508,7 @@ class Account < ApplicationRecord
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def emojifiable_text
 | 
					  def emojifiable_text
 | 
				
			||||||
    [note, display_name, fields.map(&:value)].join(' ')
 | 
					    [note, display_name, fields.map(&:name), fields.map(&:value)].join(' ')
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def clean_feed_manager
 | 
					  def clean_feed_manager
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ class AccountDomainBlock < ApplicationRecord
 | 
				
			|||||||
  include DomainNormalizable
 | 
					  include DomainNormalizable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  belongs_to :account
 | 
					  belongs_to :account
 | 
				
			||||||
  validates :domain, presence: true, uniqueness: { scope: :account_id }
 | 
					  validates :domain, presence: true, uniqueness: { scope: :account_id }, domain: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  after_commit :remove_blocking_cache
 | 
					  after_commit :remove_blocking_cache
 | 
				
			||||||
  after_commit :remove_relationship_cache
 | 
					  after_commit :remove_relationship_cache
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ module DomainNormalizable
 | 
				
			|||||||
  extend ActiveSupport::Concern
 | 
					  extend ActiveSupport::Concern
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  included do
 | 
					  included do
 | 
				
			||||||
    before_validation :normalize_domain
 | 
					    before_save :normalize_domain
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private
 | 
					  private
 | 
				
			||||||
 | 
				
			|||||||
@ -28,6 +28,8 @@ class CustomEmoji < ApplicationRecord
 | 
				
			|||||||
    :(#{SHORTCODE_RE_FRAGMENT}):
 | 
					    :(#{SHORTCODE_RE_FRAGMENT}):
 | 
				
			||||||
    (?=[^[:alnum:]:]|$)/x
 | 
					    (?=[^[:alnum:]:]|$)/x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  IMAGE_MIME_TYPES = %w(image/png image/gif image/webp).freeze
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  belongs_to :category, class_name: 'CustomEmojiCategory', optional: true
 | 
					  belongs_to :category, class_name: 'CustomEmojiCategory', optional: true
 | 
				
			||||||
  has_one :local_counterpart, -> { where(domain: nil) }, class_name: 'CustomEmoji', primary_key: :shortcode, foreign_key: :shortcode
 | 
					  has_one :local_counterpart, -> { where(domain: nil) }, class_name: 'CustomEmoji', primary_key: :shortcode, foreign_key: :shortcode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -35,7 +37,7 @@ class CustomEmoji < ApplicationRecord
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  before_validation :downcase_domain
 | 
					  before_validation :downcase_domain
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates_attachment :image, content_type: { content_type: 'image/png' }, presence: true, size: { less_than: LIMIT }
 | 
					  validates_attachment :image, content_type: { content_type: IMAGE_MIME_TYPES }, presence: true, size: { less_than: LIMIT }
 | 
				
			||||||
  validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
 | 
					  validates :shortcode, uniqueness: { scope: :domain }, format: { with: /\A#{SHORTCODE_RE_FRAGMENT}\z/ }, length: { minimum: 2 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  scope :local,      -> { where(domain: nil) }
 | 
					  scope :local,      -> { where(domain: nil) }
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@
 | 
				
			|||||||
class DomainAllow < ApplicationRecord
 | 
					class DomainAllow < ApplicationRecord
 | 
				
			||||||
  include DomainNormalizable
 | 
					  include DomainNormalizable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates :domain, presence: true, uniqueness: true
 | 
					  validates :domain, presence: true, uniqueness: true, domain: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
 | 
					  scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -19,7 +19,7 @@ class DomainBlock < ApplicationRecord
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  enum severity: [:silence, :suspend, :noop]
 | 
					  enum severity: [:silence, :suspend, :noop]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates :domain, presence: true, uniqueness: true
 | 
					  validates :domain, presence: true, uniqueness: true, domain: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  has_many :accounts, foreign_key: :domain, primary_key: :domain
 | 
					  has_many :accounts, foreign_key: :domain, primary_key: :domain
 | 
				
			||||||
  delegate :count, to: :accounts, prefix: true
 | 
					  delegate :count, to: :accounts, prefix: true
 | 
				
			||||||
 | 
				
			|||||||
@ -12,7 +12,7 @@
 | 
				
			|||||||
class EmailDomainBlock < ApplicationRecord
 | 
					class EmailDomainBlock < ApplicationRecord
 | 
				
			||||||
  include DomainNormalizable
 | 
					  include DomainNormalizable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  validates :domain, presence: true, uniqueness: true
 | 
					  validates :domain, presence: true, uniqueness: true, domain: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def self.block?(email)
 | 
					  def self.block?(email)
 | 
				
			||||||
    _, domain = email.split('@', 2)
 | 
					    _, domain = email.split('@', 2)
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ class TrendingTags
 | 
				
			|||||||
  EXPIRE_TRENDS_AFTER  = 1.day.seconds
 | 
					  EXPIRE_TRENDS_AFTER  = 1.day.seconds
 | 
				
			||||||
  THRESHOLD            = 5
 | 
					  THRESHOLD            = 5
 | 
				
			||||||
  LIMIT                = 10
 | 
					  LIMIT                = 10
 | 
				
			||||||
 | 
					  REVIEW_THRESHOLD     = 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  class << self
 | 
					  class << self
 | 
				
			||||||
    include Redisable
 | 
					    include Redisable
 | 
				
			||||||
@ -60,7 +61,7 @@ class TrendingTags
 | 
				
			|||||||
        old_rank = redis.zrevrank(key, tag.id)
 | 
					        old_rank = redis.zrevrank(key, tag.id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        redis.zadd(key, score, tag.id)
 | 
					        redis.zadd(key, score, tag.id)
 | 
				
			||||||
        request_review!(tag) if (old_rank.nil? || old_rank > LIMIT) && redis.zrevrank(key, tag.id) <= LIMIT && !tag.trendable? && tag.requires_review? && !tag.requested_review?
 | 
					        request_review!(tag) if (old_rank.nil? || old_rank > REVIEW_THRESHOLD) && redis.zrevrank(key, tag.id) <= REVIEW_THRESHOLD && !tag.trendable? && tag.requires_review? && !tag.requested_review?
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      redis.expire(key, EXPIRE_TRENDS_AFTER)
 | 
					      redis.expire(key, EXPIRE_TRENDS_AFTER)
 | 
				
			||||||
 | 
				
			|||||||
@ -21,18 +21,22 @@ class AccountSearchService < BaseService
 | 
				
			|||||||
    if resolving_non_matching_remote_account?
 | 
					    if resolving_non_matching_remote_account?
 | 
				
			||||||
      [ResolveAccountService.new.call("#{query_username}@#{query_domain}")].compact
 | 
					      [ResolveAccountService.new.call("#{query_username}@#{query_domain}")].compact
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      search_results_and_exact_match.compact.uniq.slice(0, limit)
 | 
					      search_results_and_exact_match.compact.uniq
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def resolving_non_matching_remote_account?
 | 
					  def resolving_non_matching_remote_account?
 | 
				
			||||||
    options[:resolve] && !exact_match && !domain_is_local?
 | 
					    offset.zero? && options[:resolve] && !exact_match? && !domain_is_local?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def search_results_and_exact_match
 | 
					  def search_results_and_exact_match
 | 
				
			||||||
    exact = [exact_match]
 | 
					    return search_results.to_a unless offset.zero?
 | 
				
			||||||
    return exact if !exact[0].nil? && limit == 1
 | 
					
 | 
				
			||||||
    exact + search_results.to_a
 | 
					    results = [exact_match]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return results if exact_match? && limit == 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    results + search_results.to_a
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def query_blank_or_hashtag?
 | 
					  def query_blank_or_hashtag?
 | 
				
			||||||
@ -40,15 +44,15 @@ class AccountSearchService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def split_query_string
 | 
					  def split_query_string
 | 
				
			||||||
    @_split_query_string ||= query.gsub(/\A@/, '').split('@')
 | 
					    @split_query_string ||= query.gsub(/\A@/, '').split('@')
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def query_username
 | 
					  def query_username
 | 
				
			||||||
    @_query_username ||= split_query_string.first || ''
 | 
					    @query_username ||= split_query_string.first || ''
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def query_domain
 | 
					  def query_domain
 | 
				
			||||||
    @_query_domain ||= query_without_split? ? nil : split_query_string.last
 | 
					    @query_domain ||= query_without_split? ? nil : split_query_string.last
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def query_without_split?
 | 
					  def query_without_split?
 | 
				
			||||||
@ -56,15 +60,21 @@ class AccountSearchService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def domain_is_local?
 | 
					  def domain_is_local?
 | 
				
			||||||
    @_domain_is_local ||= TagManager.instance.local_domain?(query_domain)
 | 
					    @domain_is_local ||= TagManager.instance.local_domain?(query_domain)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def search_from
 | 
					  def search_from
 | 
				
			||||||
    options[:following] && account ? account.following : Account
 | 
					    options[:following] && account ? account.following : Account
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def exact_match?
 | 
				
			||||||
 | 
					    exact_match.present?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def exact_match
 | 
					  def exact_match
 | 
				
			||||||
    @_exact_match ||= begin
 | 
					    return @exact_match if defined?(@exact_match)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @exact_match = begin
 | 
				
			||||||
      if domain_is_local?
 | 
					      if domain_is_local?
 | 
				
			||||||
        search_from.without_suspended.find_local(query_username)
 | 
					        search_from.without_suspended.find_local(query_username)
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
@ -74,7 +84,7 @@ class AccountSearchService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def search_results
 | 
					  def search_results
 | 
				
			||||||
    @_search_results ||= begin
 | 
					    @search_results ||= begin
 | 
				
			||||||
      if account
 | 
					      if account
 | 
				
			||||||
        advanced_search_results
 | 
					        advanced_search_results
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
@ -84,11 +94,19 @@ class AccountSearchService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def advanced_search_results
 | 
					  def advanced_search_results
 | 
				
			||||||
    Account.advanced_search_for(terms_for_query, account, limit, options[:following], offset)
 | 
					    Account.advanced_search_for(terms_for_query, account, limit_for_non_exact_results, options[:following], offset)
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def simple_search_results
 | 
					  def simple_search_results
 | 
				
			||||||
    Account.search_for(terms_for_query, limit, offset)
 | 
					    Account.search_for(terms_for_query, limit_for_non_exact_results, offset)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def limit_for_non_exact_results
 | 
				
			||||||
 | 
					    if offset.zero? && exact_match?
 | 
				
			||||||
 | 
					      limit - 1
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      limit
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def terms_for_query
 | 
					  def terms_for_query
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								app/validators/domain_validator.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								app/validators/domain_validator.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					# frozen_string_literal: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class DomainValidator < ActiveModel::EachValidator
 | 
				
			||||||
 | 
					  def validate_each(record, attribute, value)
 | 
				
			||||||
 | 
					    return if value.blank?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(value)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def compliant?(value)
 | 
				
			||||||
 | 
					    Addressable::URI.new.tap { |uri| uri.host = value }
 | 
				
			||||||
 | 
					  rescue Addressable::URI::InvalidURIError
 | 
				
			||||||
 | 
					    false
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
@ -41,5 +41,5 @@
 | 
				
			|||||||
      - @usage_by_domain.each do |(domain, count)|
 | 
					      - @usage_by_domain.each do |(domain, count)|
 | 
				
			||||||
        %tr
 | 
					        %tr
 | 
				
			||||||
          %th= domain || site_hostname
 | 
					          %th= domain || site_hostname
 | 
				
			||||||
          %td= "#{number_with_delimiter((count.to_f / @tag.history[0][:uses].to_f) * 100)}%"
 | 
					          %td= number_to_percentage((count / @tag.history[0][:uses].to_f) * 100)
 | 
				
			||||||
          %td= number_with_delimiter count
 | 
					          %td= number_with_delimiter count
 | 
				
			||||||
 | 
				
			|||||||
@ -641,6 +641,8 @@ en:
 | 
				
			|||||||
    people:
 | 
					    people:
 | 
				
			||||||
      one: "%{count} person"
 | 
					      one: "%{count} person"
 | 
				
			||||||
      other: "%{count} people"
 | 
					      other: "%{count} people"
 | 
				
			||||||
 | 
					  domain_validator:
 | 
				
			||||||
 | 
					    invalid_domain: is not a valid domain name
 | 
				
			||||||
  errors:
 | 
					  errors:
 | 
				
			||||||
    '403': You don't have permission to view this page.
 | 
					    '403': You don't have permission to view this page.
 | 
				
			||||||
    '404': The page you are looking for isn't here.
 | 
					    '404': The page you are looking for isn't here.
 | 
				
			||||||
 | 
				
			|||||||
@ -87,7 +87,7 @@
 | 
				
			|||||||
    "classnames": "^2.2.5",
 | 
					    "classnames": "^2.2.5",
 | 
				
			||||||
    "compression-webpack-plugin": "^3.0.0",
 | 
					    "compression-webpack-plugin": "^3.0.0",
 | 
				
			||||||
    "cross-env": "^5.1.4",
 | 
					    "cross-env": "^5.1.4",
 | 
				
			||||||
    "css-loader": "^3.1.0",
 | 
					    "css-loader": "^3.2.0",
 | 
				
			||||||
    "cssnano": "^4.1.10",
 | 
					    "cssnano": "^4.1.10",
 | 
				
			||||||
    "detect-passive-events": "^1.0.2",
 | 
					    "detect-passive-events": "^1.0.2",
 | 
				
			||||||
    "dotenv": "^8.0.0",
 | 
					    "dotenv": "^8.0.0",
 | 
				
			||||||
@ -153,11 +153,11 @@
 | 
				
			|||||||
    "requestidlecallback": "^0.3.0",
 | 
					    "requestidlecallback": "^0.3.0",
 | 
				
			||||||
    "reselect": "^4.0.0",
 | 
					    "reselect": "^4.0.0",
 | 
				
			||||||
    "rimraf": "^2.6.3",
 | 
					    "rimraf": "^2.6.3",
 | 
				
			||||||
    "sass": "^1.22.7",
 | 
					    "sass": "^1.22.9",
 | 
				
			||||||
    "sass-loader": "^7.0.3",
 | 
					    "sass-loader": "^7.0.3",
 | 
				
			||||||
    "stringz": "^2.0.0",
 | 
					    "stringz": "^2.0.0",
 | 
				
			||||||
    "substring-trie": "^1.0.2",
 | 
					    "substring-trie": "^1.0.2",
 | 
				
			||||||
    "terser-webpack-plugin": "^1.3.0",
 | 
					    "terser-webpack-plugin": "^1.4.1",
 | 
				
			||||||
    "throng": "^4.0.0",
 | 
					    "throng": "^4.0.0",
 | 
				
			||||||
    "tiny-queue": "^0.2.1",
 | 
					    "tiny-queue": "^0.2.1",
 | 
				
			||||||
    "uuid": "^3.1.0",
 | 
					    "uuid": "^3.1.0",
 | 
				
			||||||
@ -183,7 +183,7 @@
 | 
				
			|||||||
    "react-intl-translations-manager": "^5.0.3",
 | 
					    "react-intl-translations-manager": "^5.0.3",
 | 
				
			||||||
    "react-test-renderer": "^16.8.6",
 | 
					    "react-test-renderer": "^16.8.6",
 | 
				
			||||||
    "sass-lint": "^1.13.1",
 | 
					    "sass-lint": "^1.13.1",
 | 
				
			||||||
    "webpack-dev-server": "^3.7.2",
 | 
					    "webpack-dev-server": "^3.8.0",
 | 
				
			||||||
    "yargs": "^13.3.0"
 | 
					    "yargs": "^13.3.0"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										171
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										171
									
								
								yarn.lock
									
									
									
									
									
								
							@ -1969,6 +1969,11 @@ bluebird@^3.5.1, bluebird@^3.5.3:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
 | 
					  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
 | 
				
			||||||
  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
 | 
					  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bluebird@^3.5.5:
 | 
				
			||||||
 | 
					  version "3.5.5"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
 | 
				
			||||||
 | 
					  integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
blurhash@^1.0.0:
 | 
					blurhash@^1.0.0:
 | 
				
			||||||
  version "1.0.0"
 | 
					  version "1.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.0.0.tgz#9087bc5cc4d482f1305059d7410df4133adcab2e"
 | 
					  resolved "https://registry.yarnpkg.com/blurhash/-/blurhash-1.0.0.tgz#9087bc5cc4d482f1305059d7410df4133adcab2e"
 | 
				
			||||||
@ -2191,7 +2196,7 @@ bytes@3.1.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
 | 
					  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
 | 
				
			||||||
  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 | 
					  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cacache@^11.2.0, cacache@^11.3.2:
 | 
					cacache@^11.2.0:
 | 
				
			||||||
  version "11.3.2"
 | 
					  version "11.3.2"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
 | 
					  resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
 | 
				
			||||||
  integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
 | 
					  integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
 | 
				
			||||||
@ -2211,6 +2216,27 @@ cacache@^11.2.0, cacache@^11.3.2:
 | 
				
			|||||||
    unique-filename "^1.1.1"
 | 
					    unique-filename "^1.1.1"
 | 
				
			||||||
    y18n "^4.0.0"
 | 
					    y18n "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cacache@^12.0.2:
 | 
				
			||||||
 | 
					  version "12.0.2"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.2.tgz#8db03205e36089a3df6954c66ce92541441ac46c"
 | 
				
			||||||
 | 
					  integrity sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    bluebird "^3.5.5"
 | 
				
			||||||
 | 
					    chownr "^1.1.1"
 | 
				
			||||||
 | 
					    figgy-pudding "^3.5.1"
 | 
				
			||||||
 | 
					    glob "^7.1.4"
 | 
				
			||||||
 | 
					    graceful-fs "^4.1.15"
 | 
				
			||||||
 | 
					    infer-owner "^1.0.3"
 | 
				
			||||||
 | 
					    lru-cache "^5.1.1"
 | 
				
			||||||
 | 
					    mississippi "^3.0.0"
 | 
				
			||||||
 | 
					    mkdirp "^0.5.1"
 | 
				
			||||||
 | 
					    move-concurrently "^1.0.1"
 | 
				
			||||||
 | 
					    promise-inflight "^1.0.1"
 | 
				
			||||||
 | 
					    rimraf "^2.6.3"
 | 
				
			||||||
 | 
					    ssri "^6.0.1"
 | 
				
			||||||
 | 
					    unique-filename "^1.1.1"
 | 
				
			||||||
 | 
					    y18n "^4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cache-base@^1.0.1:
 | 
					cache-base@^1.0.1:
 | 
				
			||||||
  version "1.0.1"
 | 
					  version "1.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
 | 
					  resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
 | 
				
			||||||
@ -2534,7 +2560,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    delayed-stream "~1.0.0"
 | 
					    delayed-stream "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.8.1, commander@~2.20.0:
 | 
					commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@^2.8.1, commander@~2.20.0:
 | 
				
			||||||
  version "2.20.0"
 | 
					  version "2.20.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
 | 
					  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
 | 
				
			||||||
  integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
 | 
					  integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
 | 
				
			||||||
@ -2853,10 +2879,10 @@ css-list-helpers@^1.0.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    tcomb "^2.5.0"
 | 
					    tcomb "^2.5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
css-loader@^3.1.0:
 | 
					css-loader@^3.2.0:
 | 
				
			||||||
  version "3.1.0"
 | 
					  version "3.2.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.1.0.tgz#6f008b993b8ce812e6bab57f3cbfdc7a7cf28685"
 | 
					  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.2.0.tgz#bb570d89c194f763627fcf1f80059c6832d009b2"
 | 
				
			||||||
  integrity sha512-MuL8WsF/KSrHCBCYaozBKlx+r7vIfUaDTEreo7wR7Vv3J6N0z6fqWjRk3e/6wjneitXN1r/Y9FTK1psYNOBdJQ==
 | 
					  integrity sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    camelcase "^5.3.1"
 | 
					    camelcase "^5.3.1"
 | 
				
			||||||
    cssesc "^3.0.0"
 | 
					    cssesc "^3.0.0"
 | 
				
			||||||
@ -4239,13 +4265,13 @@ finalhandler@~1.1.2:
 | 
				
			|||||||
    statuses "~1.5.0"
 | 
					    statuses "~1.5.0"
 | 
				
			||||||
    unpipe "~1.0.0"
 | 
					    unpipe "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
find-cache-dir@^2.0.0:
 | 
					find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
 | 
				
			||||||
  version "2.0.0"
 | 
					  version "2.1.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d"
 | 
					  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
 | 
				
			||||||
  integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==
 | 
					  integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    commondir "^1.0.1"
 | 
					    commondir "^1.0.1"
 | 
				
			||||||
    make-dir "^1.0.0"
 | 
					    make-dir "^2.0.0"
 | 
				
			||||||
    pkg-dir "^3.0.0"
 | 
					    pkg-dir "^3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
find-cache-dir@^3.0.0:
 | 
					find-cache-dir@^3.0.0:
 | 
				
			||||||
@ -4557,7 +4583,7 @@ glob-parent@^5.0.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    is-glob "^4.0.1"
 | 
					    is-glob "^4.0.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1:
 | 
					glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.1:
 | 
				
			||||||
  version "7.1.4"
 | 
					  version "7.1.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
 | 
					  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
 | 
				
			||||||
  integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
 | 
					  integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
 | 
				
			||||||
@ -5056,6 +5082,11 @@ indexof@0.0.1:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
 | 
					  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
 | 
				
			||||||
  integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
 | 
					  integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					infer-owner@^1.0.3:
 | 
				
			||||||
 | 
					  version "1.0.4"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
 | 
				
			||||||
 | 
					  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
inflight@^1.0.4:
 | 
					inflight@^1.0.4:
 | 
				
			||||||
  version "1.0.6"
 | 
					  version "1.0.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
 | 
					  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
 | 
				
			||||||
@ -5206,6 +5237,11 @@ is-absolute-url@^2.0.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
 | 
					  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
 | 
				
			||||||
  integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
 | 
					  integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					is-absolute-url@^3.0.0:
 | 
				
			||||||
 | 
					  version "3.0.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.0.tgz#eb21d69df2ed8ef72a3e6f243e216563036a0913"
 | 
				
			||||||
 | 
					  integrity sha512-3OkP8XrM2Xq4/IxsJnClfMp3OaM3TAatLPLKPeWcxLBTrpe6hihwtX+XZfJTcXg/FTRi4qjy0y/C5qiyNxY24g==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
is-accessor-descriptor@^0.1.6:
 | 
					is-accessor-descriptor@^0.1.6:
 | 
				
			||||||
  version "0.1.6"
 | 
					  version "0.1.6"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
 | 
					  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
 | 
				
			||||||
@ -6367,13 +6403,21 @@ lru-cache@^5.1.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    yallist "^3.0.2"
 | 
					    yallist "^3.0.2"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make-dir@^1.0.0, make-dir@^1.3.0:
 | 
					make-dir@^1.3.0:
 | 
				
			||||||
  version "1.3.0"
 | 
					  version "1.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
 | 
					  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
 | 
				
			||||||
  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
 | 
					  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    pify "^3.0.0"
 | 
					    pify "^3.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					make-dir@^2.0.0:
 | 
				
			||||||
 | 
					  version "2.1.0"
 | 
				
			||||||
 | 
					  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
 | 
				
			||||||
 | 
					  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
 | 
				
			||||||
 | 
					  dependencies:
 | 
				
			||||||
 | 
					    pify "^4.0.1"
 | 
				
			||||||
 | 
					    semver "^5.6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
make-dir@^3.0.0:
 | 
					make-dir@^3.0.0:
 | 
				
			||||||
  version "3.0.0"
 | 
					  version "3.0.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801"
 | 
					  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.0.tgz#1b5f39f6b9270ed33f9f054c5c0f84304989f801"
 | 
				
			||||||
@ -7589,10 +7633,10 @@ pn@^1.1.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
 | 
					  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
 | 
				
			||||||
  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 | 
					  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
portfinder@^1.0.20:
 | 
					portfinder@^1.0.21:
 | 
				
			||||||
  version "1.0.20"
 | 
					  version "1.0.21"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
 | 
					  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.21.tgz#60e1397b95ac170749db70034ece306b9a27e324"
 | 
				
			||||||
  integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
 | 
					  integrity sha512-ESabpDCzmBS3ekHbmpAIiESq3udRsCBGiBZLsC+HgBKv2ezb0R4oG+7RnYEVZ/ZCfhel5Tx3UzdNWA0Lox2QCA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async "^1.5.2"
 | 
					    async "^1.5.2"
 | 
				
			||||||
    debug "^2.2.0"
 | 
					    debug "^2.2.0"
 | 
				
			||||||
@ -9066,10 +9110,10 @@ sass-loader@^7.0.3:
 | 
				
			|||||||
    pify "^3.0.0"
 | 
					    pify "^3.0.0"
 | 
				
			||||||
    semver "^5.5.0"
 | 
					    semver "^5.5.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sass@^1.22.7:
 | 
					sass@^1.22.9:
 | 
				
			||||||
  version "1.22.7"
 | 
					  version "1.22.9"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.7.tgz#5a1a77dc11aa659db4e782d238bf9f3d44a60546"
 | 
					  resolved "https://registry.yarnpkg.com/sass/-/sass-1.22.9.tgz#41a2ed6038027f58be2bd5041293452a29c2cb84"
 | 
				
			||||||
  integrity sha512-ahREi0AdG7RTovSv14+yd1prQSfIvFcrDpOsth5EQf1+RM7SvOxsSttzNQaFmK1aa/k/3vyYwlYF5l0Xl+6c+g==
 | 
					  integrity sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    chokidar ">=2.0.0 <4.0.0"
 | 
					    chokidar ">=2.0.0 <4.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -9133,10 +9177,10 @@ semver@4.3.2:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
 | 
					  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
 | 
				
			||||||
  integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
 | 
					  integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2:
 | 
					semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.3.0:
 | 
				
			||||||
  version "6.2.0"
 | 
					  version "6.3.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db"
 | 
					  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
 | 
				
			||||||
  integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==
 | 
					  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
send@0.17.1:
 | 
					send@0.17.1:
 | 
				
			||||||
  version "0.17.1"
 | 
					  version "0.17.1"
 | 
				
			||||||
@ -9386,10 +9430,10 @@ source-map-support@^0.5.6:
 | 
				
			|||||||
    buffer-from "^1.0.0"
 | 
					    buffer-from "^1.0.0"
 | 
				
			||||||
    source-map "^0.6.0"
 | 
					    source-map "^0.6.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
source-map-support@~0.5.10:
 | 
					source-map-support@~0.5.12:
 | 
				
			||||||
  version "0.5.12"
 | 
					  version "0.5.13"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599"
 | 
					  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
 | 
				
			||||||
  integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==
 | 
					  integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    buffer-from "^1.0.0"
 | 
					    buffer-from "^1.0.0"
 | 
				
			||||||
    source-map "^0.6.0"
 | 
					    source-map "^0.6.0"
 | 
				
			||||||
@ -9452,10 +9496,10 @@ spdy-transport@^3.0.0:
 | 
				
			|||||||
    readable-stream "^3.0.6"
 | 
					    readable-stream "^3.0.6"
 | 
				
			||||||
    wbuf "^1.7.3"
 | 
					    wbuf "^1.7.3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
spdy@^4.0.0:
 | 
					spdy@^4.0.1:
 | 
				
			||||||
  version "4.0.0"
 | 
					  version "4.0.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
 | 
					  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2"
 | 
				
			||||||
  integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
 | 
					  integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    debug "^4.1.0"
 | 
					    debug "^4.1.0"
 | 
				
			||||||
    handle-thing "^2.0.0"
 | 
					    handle-thing "^2.0.0"
 | 
				
			||||||
@ -9804,30 +9848,29 @@ tcomb@^2.5.0:
 | 
				
			|||||||
  resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz#10d62958041669a5d53567b9a4ee8cde22b1c2b0"
 | 
					  resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-2.7.0.tgz#10d62958041669a5d53567b9a4ee8cde22b1c2b0"
 | 
				
			||||||
  integrity sha1-ENYpWAQWaaXVNWe5pO6M3iKxwrA=
 | 
					  integrity sha1-ENYpWAQWaaXVNWe5pO6M3iKxwrA=
 | 
				
			||||||
 | 
					
 | 
				
			||||||
terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.3.0:
 | 
					terser-webpack-plugin@^1.1.0, terser-webpack-plugin@^1.4.1:
 | 
				
			||||||
  version "1.3.0"
 | 
					  version "1.4.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.3.0.tgz#69aa22426299f4b5b3775cbed8cb2c5d419aa1d4"
 | 
					  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.1.tgz#61b18e40eaee5be97e771cdbb10ed1280888c2b4"
 | 
				
			||||||
  integrity sha512-W2YWmxPjjkUcOWa4pBEv4OP4er1aeQJlSo2UhtCFQCuRXEHjOFscO8VyWHj9JLlA0RzQb8Y2/Ta78XZvT54uGg==
 | 
					  integrity sha512-ZXmmfiwtCLfz8WKZyYUuuHf3dMYEjg8NrjHMb0JqHVHVOSkzp3cW2/XG1fP3tRhqEqSzMwzzRQGtAPbs4Cncxg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    cacache "^11.3.2"
 | 
					    cacache "^12.0.2"
 | 
				
			||||||
    find-cache-dir "^2.0.0"
 | 
					    find-cache-dir "^2.1.0"
 | 
				
			||||||
    is-wsl "^1.1.0"
 | 
					    is-wsl "^1.1.0"
 | 
				
			||||||
    loader-utils "^1.2.3"
 | 
					 | 
				
			||||||
    schema-utils "^1.0.0"
 | 
					    schema-utils "^1.0.0"
 | 
				
			||||||
    serialize-javascript "^1.7.0"
 | 
					    serialize-javascript "^1.7.0"
 | 
				
			||||||
    source-map "^0.6.1"
 | 
					    source-map "^0.6.1"
 | 
				
			||||||
    terser "^4.0.0"
 | 
					    terser "^4.1.2"
 | 
				
			||||||
    webpack-sources "^1.3.0"
 | 
					    webpack-sources "^1.4.0"
 | 
				
			||||||
    worker-farm "^1.7.0"
 | 
					    worker-farm "^1.7.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
terser@^4.0.0:
 | 
					terser@^4.1.2:
 | 
				
			||||||
  version "4.0.0"
 | 
					  version "4.1.4"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/terser/-/terser-4.0.0.tgz#ef356f6f359a963e2cc675517f21c1c382877374"
 | 
					  resolved "https://registry.yarnpkg.com/terser/-/terser-4.1.4.tgz#4478b6a08bb096a61e793fea1a4434408bab936c"
 | 
				
			||||||
  integrity sha512-dOapGTU0hETFl1tCo4t56FN+2jffoKyER9qBGoUFyZ6y7WLoKT0bF+lAYi6B6YsILcGF3q1C2FBh8QcKSCgkgA==
 | 
					  integrity sha512-+ZwXJvdSwbd60jG0Illav0F06GDJF0R4ydZ21Q3wGAFKoBGyJGo34F63vzJHgvYxc1ukOtIjvwEvl9MkjzM6Pg==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    commander "^2.19.0"
 | 
					    commander "^2.20.0"
 | 
				
			||||||
    source-map "~0.6.1"
 | 
					    source-map "~0.6.1"
 | 
				
			||||||
    source-map-support "~0.5.10"
 | 
					    source-map-support "~0.5.12"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test-exclude@^5.0.0:
 | 
					test-exclude@^5.0.0:
 | 
				
			||||||
  version "5.1.0"
 | 
					  version "5.1.0"
 | 
				
			||||||
@ -10364,10 +10407,10 @@ webpack-dev-middleware@^3.7.0:
 | 
				
			|||||||
    range-parser "^1.2.1"
 | 
					    range-parser "^1.2.1"
 | 
				
			||||||
    webpack-log "^2.0.0"
 | 
					    webpack-log "^2.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
webpack-dev-server@^3.7.2:
 | 
					webpack-dev-server@^3.8.0:
 | 
				
			||||||
  version "3.7.2"
 | 
					  version "3.8.0"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz#f79caa5974b7f8b63268ef5421222a8486d792f5"
 | 
					  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.8.0.tgz#06cc4fc2f440428508d0e9770da1fef10e5ef28d"
 | 
				
			||||||
  integrity sha512-mjWtrKJW2T9SsjJ4/dxDC2fkFVUw8jlpemDERqV0ZJIkjjjamR2AbQlr3oz+j4JLhYCHImHnXZK5H06P2wvUew==
 | 
					  integrity sha512-Hs8K9yI6pyMvGkaPTeTonhD6JXVsigXDApYk9JLW4M7viVBspQvb1WdAcWxqtmttxNW4zf2UFLsLNe0y87pIGQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    ansi-html "0.0.7"
 | 
					    ansi-html "0.0.7"
 | 
				
			||||||
    bonjour "^3.5.0"
 | 
					    bonjour "^3.5.0"
 | 
				
			||||||
@ -10382,23 +10425,25 @@ webpack-dev-server@^3.7.2:
 | 
				
			|||||||
    import-local "^2.0.0"
 | 
					    import-local "^2.0.0"
 | 
				
			||||||
    internal-ip "^4.3.0"
 | 
					    internal-ip "^4.3.0"
 | 
				
			||||||
    ip "^1.1.5"
 | 
					    ip "^1.1.5"
 | 
				
			||||||
 | 
					    is-absolute-url "^3.0.0"
 | 
				
			||||||
    killable "^1.0.1"
 | 
					    killable "^1.0.1"
 | 
				
			||||||
    loglevel "^1.6.3"
 | 
					    loglevel "^1.6.3"
 | 
				
			||||||
    opn "^5.5.0"
 | 
					    opn "^5.5.0"
 | 
				
			||||||
    p-retry "^3.0.1"
 | 
					    p-retry "^3.0.1"
 | 
				
			||||||
    portfinder "^1.0.20"
 | 
					    portfinder "^1.0.21"
 | 
				
			||||||
    schema-utils "^1.0.0"
 | 
					    schema-utils "^1.0.0"
 | 
				
			||||||
    selfsigned "^1.10.4"
 | 
					    selfsigned "^1.10.4"
 | 
				
			||||||
    semver "^6.1.1"
 | 
					    semver "^6.3.0"
 | 
				
			||||||
    serve-index "^1.9.1"
 | 
					    serve-index "^1.9.1"
 | 
				
			||||||
    sockjs "0.3.19"
 | 
					    sockjs "0.3.19"
 | 
				
			||||||
    sockjs-client "1.3.0"
 | 
					    sockjs-client "1.3.0"
 | 
				
			||||||
    spdy "^4.0.0"
 | 
					    spdy "^4.0.1"
 | 
				
			||||||
    strip-ansi "^3.0.1"
 | 
					    strip-ansi "^3.0.1"
 | 
				
			||||||
    supports-color "^6.1.0"
 | 
					    supports-color "^6.1.0"
 | 
				
			||||||
    url "^0.11.0"
 | 
					    url "^0.11.0"
 | 
				
			||||||
    webpack-dev-middleware "^3.7.0"
 | 
					    webpack-dev-middleware "^3.7.0"
 | 
				
			||||||
    webpack-log "^2.0.0"
 | 
					    webpack-log "^2.0.0"
 | 
				
			||||||
 | 
					    ws "^6.2.1"
 | 
				
			||||||
    yargs "12.0.5"
 | 
					    yargs "12.0.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
webpack-log@^2.0.0:
 | 
					webpack-log@^2.0.0:
 | 
				
			||||||
@ -10416,10 +10461,10 @@ webpack-merge@^4.2.1:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    lodash "^4.17.5"
 | 
					    lodash "^4.17.5"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0:
 | 
					webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0:
 | 
				
			||||||
  version "1.3.0"
 | 
					  version "1.4.3"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
 | 
					  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
 | 
				
			||||||
  integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
 | 
					  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    source-list-map "^2.0.0"
 | 
					    source-list-map "^2.0.0"
 | 
				
			||||||
    source-map "~0.6.1"
 | 
					    source-map "~0.6.1"
 | 
				
			||||||
@ -10596,10 +10641,10 @@ ws@^5.2.0:
 | 
				
			|||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async-limiter "~1.0.0"
 | 
					    async-limiter "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ws@^6.0.0:
 | 
					ws@^6.0.0, ws@^6.2.1:
 | 
				
			||||||
  version "6.1.2"
 | 
					  version "6.2.1"
 | 
				
			||||||
  resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
 | 
					  resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
 | 
				
			||||||
  integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
 | 
					  integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
 | 
				
			||||||
  dependencies:
 | 
					  dependencies:
 | 
				
			||||||
    async-limiter "~1.0.0"
 | 
					    async-limiter "~1.0.0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user