Commit e7aa8ded by Francisco Giordano Committed by Leo Arias

Turn off blank-lines Solium rule (#1284)

* turn off blank-lines rule

* remove triple newlines

(cherry picked from commit 9b371046)
parent 49d2dd9e
......@@ -2,6 +2,7 @@
"extends": "solium:all",
"plugins": ["security"],
"rules": {
"blank-lines": "off",
"error-reason": "off",
"indentation": ["error", 2],
"lbrace": "off",
......
pragma solidity ^0.4.24;
/**
* @title Roles
* @dev Library for managing addresses assigned to a Role.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../Roles.sol";
contract CapperRole {
using Roles for Roles.Role;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../Roles.sol";
contract MinterRole {
using Roles for Roles.Role;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../Roles.sol";
contract PauserRole {
using Roles for Roles.Role;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../Roles.sol";
contract SignerRole {
using Roles for Roles.Role;
......
......@@ -4,7 +4,6 @@ import "../token/ERC20/IERC20.sol";
import "../math/SafeMath.sol";
import "../token/ERC20/SafeERC20.sol";
/**
* @title Crowdsale
* @dev Crowdsale is a base contract for managing a token crowdsale,
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../../math/SafeMath.sol";
import "../validation/TimedCrowdsale.sol";
/**
* @title FinalizableCrowdsale
* @dev Extension of Crowdsale with a one-off finalization action, where one
......
......@@ -4,7 +4,6 @@ import "../validation/TimedCrowdsale.sol";
import "../../token/ERC20/IERC20.sol";
import "../../math/SafeMath.sol";
/**
* @title PostDeliveryCrowdsale
* @dev Crowdsale that locks tokens from withdrawal until it ends.
......
pragma solidity ^0.4.24;
import "../../math/SafeMath.sol";
import "./FinalizableCrowdsale.sol";
import "../../payment/RefundEscrow.sol";
/**
* @title RefundableCrowdsale
* @dev Extension of Crowdsale contract that adds a funding goal, and
......
......@@ -5,7 +5,6 @@ import "../../token/ERC20/IERC20.sol";
import "../../token/ERC20/SafeERC20.sol";
import "../../math/SafeMath.sol";
/**
* @title AllowanceCrowdsale
* @dev Extension of Crowdsale where tokens are held by a wallet, which approves an allowance to the crowdsale.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../Crowdsale.sol";
import "../../token/ERC20/ERC20Mintable.sol";
/**
* @title MintedCrowdsale
* @dev Extension of Crowdsale contract whose tokens are minted in each purchase.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../validation/TimedCrowdsale.sol";
import "../../math/SafeMath.sol";
/**
* @title IncreasingPriceCrowdsale
* @dev Extension of Crowdsale contract that increases the price of tokens linearly in time.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../../math/SafeMath.sol";
import "../Crowdsale.sol";
/**
* @title CappedCrowdsale
* @dev Crowdsale with a limit for total contributions.
......
......@@ -4,7 +4,6 @@ import "../../math/SafeMath.sol";
import "../Crowdsale.sol";
import "../../access/roles/CapperRole.sol";
/**
* @title IndividuallyCappedCrowdsale
* @dev Crowdsale with per-beneficiary caps.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../../math/SafeMath.sol";
import "../Crowdsale.sol";
/**
* @title TimedCrowdsale
* @dev Crowdsale accepting contributions only within a time frame.
......
pragma solidity ^0.4.24;
/**
* @title Elliptic curve signature operations
* @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
......
pragma solidity ^0.4.24;
/**
* @title MerkleProof
* @dev Merkle proof verification based on
......
pragma solidity ^0.4.24;
import "../payment/PullPayment.sol";
import "../ownership/Ownable.sol";
/**
* @title BreakInvariantBounty
* @dev This bounty will pay out to a researcher if they break invariant logic of the contract.
......@@ -79,7 +77,6 @@ contract BreakInvariantBounty is PullPayment, Ownable {
}
/**
* @title Target
* @dev Your main contract should inherit from this class and implement the checkInvariant method.
......
pragma solidity ^0.4.24;
/**
* @title Counter
* @author Matt Condon (@shrugs)
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../../token/ERC20/IERC20.sol";
/**
* @title ERC-1047 Token Metadata
* @dev See https://eips.ethereum.org/EIPS/eip-1046
......@@ -13,7 +12,6 @@ contract ERC20TokenMetadata is IERC20 {
function tokenURI() external view returns (string);
}
contract ERC20WithMetadata is ERC20TokenMetadata {
string private _tokenURI = "";
......
......@@ -5,7 +5,6 @@ import "../token/ERC20/ERC20Mintable.sol";
import "../token/ERC20/SafeERC20.sol";
import "../math/Math.sol";
/**
* @title ERC20Migrator
* @dev This contract can be used to migrate an ERC20 token from one
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../access/roles/SignerRole.sol";
import "../cryptography/ECDSA.sol";
/**
* @title SignatureBouncer
* @author PhABC, Shrugs and aflesher
......
......@@ -6,7 +6,6 @@ import "../token/ERC20/SafeERC20.sol";
import "../ownership/Ownable.sol";
import "../math/SafeMath.sol";
/**
* @title TokenVesting
* @dev A token holder contract that can release its token balance gradually like a
......
......@@ -5,7 +5,6 @@ import "../crowdsale/distribution/RefundableCrowdsale.sol";
import "../crowdsale/emission/MintedCrowdsale.sol";
import "../token/ERC20/ERC20Mintable.sol";
/**
* @title SampleCrowdsaleToken
* @dev Very simple ERC20 Token that can be minted.
......@@ -18,7 +17,6 @@ contract SampleCrowdsaleToken is ERC20Mintable {
uint8 public constant decimals = 18;
}
/**
* @title SampleCrowdsale
* @dev This is an example of a fully fledged crowdsale.
......
pragma solidity ^0.4.24;
import "../token/ERC20/ERC20.sol";
/**
* @title SimpleToken
* @dev Very simple ERC20 Token example, where all tokens are pre-assigned to the creator.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./IERC165.sol";
/**
* @title ERC165
* @author Matt Condon (@shrugs)
......
pragma solidity ^0.4.24;
/**
* @title ERC165Checker
* @dev Use `using ERC165Checker for address`; to include this library
......@@ -16,7 +15,6 @@ library ERC165Checker {
* bytes4(keccak256('supportsInterface(bytes4)'))
*/
/**
* @notice Query if a contract supports ERC165
* @param account The address of the contract to query for support of ERC165
......
pragma solidity ^0.4.24;
/**
* @title IERC165
* @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/roles/PauserRole.sol";
/**
* @title Pausable
* @dev Base contract which allows children to implement an emergency stop mechanism.
......@@ -13,7 +12,6 @@ contract Pausable is PauserRole {
bool private _paused = false;
/**
* @return true if the contract is paused, false otherwise.
*/
......
pragma solidity ^0.4.24;
/**
* @title Math
* @dev Assorted math operations
......
pragma solidity ^0.4.24;
/**
* @title SafeMath
* @dev Math operations with safety checks that revert on error
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../utils/Address.sol";
contract AddressImpl {
function isContract(address account)
external
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../crowdsale/emission/AllowanceCrowdsale.sol";
contract AllowanceCrowdsaleImpl is AllowanceCrowdsale {
constructor (
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../crowdsale/validation/CappedCrowdsale.sol";
contract CappedCrowdsaleImpl is CappedCrowdsale {
constructor (
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/roles/CapperRole.sol";
contract CapperRoleMock is CapperRole {
function removeCapper(address account) public {
_removeCapper(account);
......
pragma solidity ^0.4.24;
import "../payment/ConditionalEscrow.sol";
// mock class using ConditionalEscrow
contract ConditionalEscrowMock is ConditionalEscrow {
mapping(address => bool) private _allowed;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../drafts/Counter.sol";
contract CounterImpl {
using Counter for Counter.Counter;
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20.sol";
import "../token/ERC20/ERC20Detailed.sol";
contract ERC20DetailedMock is ERC20, ERC20Detailed {
constructor(
string name,
......
pragma solidity ^0.4.24;
import "../cryptography/ECDSA.sol";
contract ECDSAMock {
using ECDSA for bytes32;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../../introspection/IERC165.sol";
/**
* https://github.com/ethereum/EIPs/blob/master/EIPS/eip-214.md#specification
* > Any attempts to make state-changing operations inside an execution instance with STATIC set to true will instead throw an exception.
......@@ -56,8 +55,6 @@ contract SupportsInterfaceWithLookupMock is IERC165 {
}
}
contract ERC165InterfacesSupported is SupportsInterfaceWithLookupMock {
constructor (bytes4[] interfaceIds)
public
......
pragma solidity ^0.4.24;
contract ERC165NotSupported {
}
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../introspection/ERC165Checker.sol";
contract ERC165CheckerMock {
using ERC165Checker for address;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../introspection/ERC165.sol";
contract ERC165Mock is ERC165 {
function registerInterface(bytes4 interfaceId)
public
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20Burnable.sol";
contract ERC20BurnableMock is ERC20Burnable {
constructor(address initialAccount, uint256 initialBalance) public {
......
......@@ -3,6 +3,5 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20Mintable.sol";
import "./MinterRoleMock.sol";
contract ERC20MintableMock is ERC20Mintable, MinterRoleMock {
}
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20.sol";
// mock class using ERC20
contract ERC20Mock is ERC20 {
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20Pausable.sol";
import "./PauserRoleMock.sol";
// mock class using ERC20Pausable
contract ERC20PausableMock is ERC20Pausable, PauserRoleMock {
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20.sol";
import "../drafts/ERC1046/TokenMetadata.sol";
contract ERC20WithMetadataMock is ERC20, ERC20WithMetadata {
constructor(string tokenURI) public
ERC20WithMetadata(tokenURI)
......
......@@ -5,7 +5,6 @@ import "../token/ERC721/ERC721Mintable.sol";
import "../token/ERC721/ERC721MetadataMintable.sol";
import "../token/ERC721/ERC721Burnable.sol";
/**
* @title ERC721FullMock
* This mock just provides a public mint and burn functions for testing purposes,
......
......@@ -5,7 +5,6 @@ import "../token/ERC721/ERC721Mintable.sol";
import "../token/ERC721/ERC721MetadataMintable.sol";
import "../token/ERC721/ERC721Burnable.sol";
/**
* @title ERC721MintableBurnableImpl
*/
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../token/ERC721/ERC721.sol";
/**
* @title ERC721Mock
* This mock just provides a public mint and burn functions for testing purposes
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC721/ERC721Pausable.sol";
import "./PauserRoleMock.sol";
/**
* @title ERC721PausableMock
* This mock just provides a public mint, burn and exists functions for testing purposes
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../token/ERC721/IERC721Receiver.sol";
contract ERC721ReceiverMock is IERC721Receiver {
bytes4 private _retval;
bool private _reverts;
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../crowdsale/distribution/FinalizableCrowdsale.sol";
contract FinalizableCrowdsaleImpl is FinalizableCrowdsale {
constructor (
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../crowdsale/price/IncreasingPriceCrowdsale.sol";
import "../math/SafeMath.sol";
contract IncreasingPriceCrowdsaleImpl is IncreasingPriceCrowdsale {
constructor (
......
......@@ -4,7 +4,6 @@ import "../token/ERC20/IERC20.sol";
import "../crowdsale/validation/IndividuallyCappedCrowdsale.sol";
import "./CapperRoleMock.sol";
contract IndividuallyCappedCrowdsaleImpl
is IndividuallyCappedCrowdsale, CapperRoleMock {
......
pragma solidity ^0.4.24;
import "../math/Math.sol";
contract MathMock {
function max(uint256 a, uint256 b) public pure returns (uint256) {
return Math.max(a, b);
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import { MerkleProof } from "../cryptography/MerkleProof.sol";
contract MerkleProofWrapper {
function verify(
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20Mintable.sol";
import "../crowdsale/emission/MintedCrowdsale.sol";
contract MintedCrowdsaleImpl is MintedCrowdsale {
constructor (
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/roles/MinterRole.sol";
contract MinterRoleMock is MinterRole {
function removeMinter(address account) public {
_removeMinter(account);
......
pragma solidity ^0.4.24;
import "../lifecycle/Pausable.sol";
import "./PauserRoleMock.sol";
// mock class using Pausable
contract PausableMock is Pausable, PauserRoleMock {
bool public drasticMeasureTaken;
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/roles/PauserRole.sol";
contract PauserRoleMock is PauserRole {
function removePauser(address account) public {
_removePauser(account);
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../crowdsale/distribution/PostDeliveryCrowdsale.sol";
contract PostDeliveryCrowdsaleImpl is PostDeliveryCrowdsale {
constructor (
......
pragma solidity ^0.4.24;
import "../payment/PullPayment.sol";
// mock class using PullPayment
contract PullPaymentMock is PullPayment {
......
pragma solidity ^0.4.24;
contract ReentrancyAttack {
function callSender(bytes4 data) public {
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../utils/ReentrancyGuard.sol";
import "./ReentrancyAttack.sol";
contract ReentrancyMock is ReentrancyGuard {
uint256 public counter;
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/ERC20Mintable.sol";
import "../crowdsale/distribution/RefundableCrowdsale.sol";
contract RefundableCrowdsaleImpl is RefundableCrowdsale {
constructor (
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/Roles.sol";
contract RolesMock {
using Roles for Roles.Role;
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../token/ERC20/SafeERC20.sol";
contract ERC20FailingMock is IERC20 {
function totalSupply() public view returns (uint256) {
return 0;
......@@ -30,7 +29,6 @@ contract ERC20FailingMock is IERC20 {
}
}
contract ERC20SucceedingMock is IERC20 {
function totalSupply() public view returns (uint256) {
return 0;
......@@ -57,7 +55,6 @@ contract ERC20SucceedingMock is IERC20 {
}
}
contract SafeERC20Helper {
using SafeERC20 for IERC20;
......
pragma solidity ^0.4.24;
import "../math/SafeMath.sol";
contract SafeMathMock {
function mul(uint256 a, uint256 b) public pure returns (uint256) {
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../ownership/Secondary.sol";
contract SecondaryMock is Secondary {
function onlyPrimaryMock() public view onlyPrimary {
}
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../drafts/SignatureBouncer.sol";
import "./SignerRoleMock.sol";
contract SignatureBouncerMock is SignatureBouncer, SignerRoleMock {
function checkValidSignature(address account, bytes signature)
public
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../access/roles/SignerRole.sol";
contract SignerRoleMock is SignerRole {
function removeSigner(address account) public {
_removeSigner(account);
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../token/ERC20/IERC20.sol";
import "../crowdsale/validation/TimedCrowdsale.sol";
contract TimedCrowdsaleImpl is TimedCrowdsale {
constructor (
......
pragma solidity ^0.4.24;
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
......@@ -14,7 +13,6 @@ contract Ownable {
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
......
pragma solidity ^0.4.24;
/**
* @title Secondary
* @dev A Secondary contract can only be used by its primary account (the one that created it)
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./Escrow.sol";
/**
* @title ConditionalEscrow
* @dev Base abstract escrow to only allow withdrawal if a condition is met.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "../math/SafeMath.sol";
import "../ownership/Secondary.sol";
/**
* @title Escrow
* @dev Base escrow contract, holds funds destinated to a payee until they
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./Escrow.sol";
/**
* @title PullPayment
* @dev Base contract supporting async send for pull payments. Inherit from this
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./ConditionalEscrow.sol";
/**
* @title RefundEscrow
* @dev Escrow that holds funds for a beneficiary, deposited from multiple parties.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../math/SafeMath.sol";
/**
* @title SplitPayment
* @dev This contract can be used when payments need to be received by a group
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./IERC20.sol";
import "../../math/SafeMath.sol";
/**
* @title Standard ERC20 token
*
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./ERC20.sol";
/**
* @title Burnable Token
* @dev Token that can be irreversibly burned (destroyed).
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./ERC20Mintable.sol";
/**
* @title Capped token
* @dev Mintable token with a token cap.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./IERC20.sol";
/**
* @title ERC20Detailed token
* @dev The decimals are only for visualization purposes.
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./ERC20.sol";
import "../../access/roles/MinterRole.sol";
/**
* @title ERC20Mintable
* @dev ERC20 minting logic
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./ERC20.sol";
import "../../lifecycle/Pausable.sol";
/**
* @title Pausable token
* @dev ERC20 modified with pausable transfers.
......
pragma solidity ^0.4.24;
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./ERC20.sol";
import "./IERC20.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./SafeERC20.sol";
/**
* @title TokenTimelock
* @dev TokenTimelock is a token holder contract that will allow a
......
......@@ -6,7 +6,6 @@ import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
import "../../introspection/ERC165.sol";
/**
* @title ERC721 Non-Fungible Token Standard basic implementation
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./ERC721.sol";
contract ERC721Burnable is ERC721 {
function burn(uint256 tokenId)
public
......
......@@ -4,7 +4,6 @@ import "./IERC721Enumerable.sol";
import "./ERC721.sol";
import "../../introspection/ERC165.sol";
contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => uint256[]) private _ownedTokens;
......
......@@ -4,7 +4,6 @@ import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Metadata.sol";
/**
* @title Full ERC721 Token
* This implementation includes all the required and some optional functionality of the ERC721 standard
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "./IERC721Receiver.sol";
contract ERC721Holder is IERC721Receiver {
function onERC721Received(
address,
......
......@@ -4,7 +4,6 @@ import "./ERC721.sol";
import "./IERC721Metadata.sol";
import "../../introspection/ERC165.sol";
contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
// Token name
string internal _name;
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./ERC721.sol";
import "../../access/roles/MinterRole.sol";
/**
* @title ERC721Mintable
* @dev ERC721 minting logic
......
......@@ -3,7 +3,6 @@ pragma solidity ^0.4.24;
import "./ERC721.sol";
import "../../lifecycle/Pausable.sol";
/**
* @title ERC721 Non-Fungible Pausable token
* @dev ERC721 modified with pausable transfers.
......
......@@ -2,7 +2,6 @@ pragma solidity ^0.4.24;
import "../../introspection/IERC165.sol";
/**
* @title ERC721 Non-Fungible Token Standard basic interface
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment