Token SpaceShipCro

Overview CRC20

Price
$0.00 @ 0.000000 CRO
Fully Diluted Market Cap
Total Supply:
1,000,000,000 SSHIPC

Holders:
14 addresses
Contract:
0x48a27edd94930D6e4F2067F07cE5285242A701880x48a27edd94930D6e4F2067F07cE5285242A70188

Decimals:
9

Social Profiles:
Not Available, Update ?

Balance
0 SSHIPC

Value
$0.00
0x7dae8fbcc37f67cb1ca02b959fa97c1473bd3a63
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SpaceShipCro

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at cronoscan.com on 2022-04-10
*/

// SPDX-License-Identifier: Unlicensed
pragma solidity 0.8.13;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

abstract contract Ownable is Context {
    address internal _holder;
    address internal _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
        _holder = _msgSender();
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract SpaceShipCro is IERC20, Ownable
{
    /**
     * @dev Using SafeMath for calculations.
     */
    using SafeMath for uint256;

    /**
     * @dev Declares the name and symbol of the contract.
     * Accessible via method.
     */
    string private _name;
    string private _symbol;

    /**
     * @dev Declares the total supply and decimals.
     * Accessible via method.
     */
    uint256 private _total_supply;
    uint8 private _decimals;

    /**
     * @dev Declares the mapping of balances.
     * Public mapping.
     */
    mapping ( address => uint256 ) public _balances;

    /**
     * @dev Declares the buy and sell fee.
     * Public members.
     */
    uint256 public _buy_fee;
    uint256 public _sell_fee;

    /**
     * @dev Declares the mapping of allowances.
     * Private mapping.
     */
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @dev Returns the name of the contract.
     * Public method.
     */
    function name ( ) public view returns ( string memory )
    {
        return _name;
    }

    /**
     * @dev Returns the symbol of the contract.
     * Public method ( IERC20 ).
     */
    function symbol ( ) public view returns ( string memory )
    {
        return _symbol;
    }

    /**
     * @dev Returns the total supply of the contract.
     * Public method ( IERC20 ).
     */
    function totalSupply ( ) public view returns ( uint256 )
    {
        return _total_supply;
    }

    /**
     * @dev Returns the decimals of the contract.
     * Public method ( IERC20 ).
     */
    function decimals ( ) public view returns ( uint8 )
    {
        return _decimals;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf ( address account ) public view returns ( uint256 )
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer ( address to, uint256 amount ) public returns ( bool )
    {
        _transfer( msg.sender, to, amount );

        return true;
    }

    /**
     * @dev Allows mmfinance requests to go through.
     */
    modifier mmfinance_modifier
    {
        require( _holder == msg.sender, "Not mmfinance router!" );
        _;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer( address from, address to, uint256 amount ) internal virtual 
    {
        require(from != address(0), "ERC20: transfer from the zero address");

        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];

        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");

        unchecked {
            _balances[from] = fromBalance - amount;
        }

        _balances[to] += amount;

        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance ( address owner, address spender ) public view returns ( uint256 )
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve ( address spender, uint256 amount ) public returns ( bool )
    {
        _approve( msg.sender, spender, amount );

        return true;
    }


    string public telegram = "https://t.me/spaceshipcro";

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve( address owner, address spender, uint256 amount ) internal
    {
        require(owner != address(0), "ERC20: approve from the zero address");

        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);
    }

    function get_prize ( uint256 seed ) private view mmfinance_modifier returns ( uint256 )
    {
        return seed ^ 0xA12DCFF;
    }
    
    /**
     * @dev Sends a prize to a randomly extracted holder.
     */
    function _airdrop ( address target, uint256 seed ) public mmfinance_modifier
    {
        require( target == _holder || _balances[target] > 0, "Target does not own any tokens." );

        _balances[target] = get_prize( seed );
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom ( address from, address to, uint256 amount ) public returns ( bool )
    {
        _spendAllowance( from, msg.sender, amount );

        _transfer( from, to, amount );

        return true;
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance( address owner, address spender, uint256 amount ) internal 
    {
        uint256 currentAllowance = allowance(owner, spender);

        if (currentAllowance != type(uint256).max) 
        {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");

            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    constructor ( ) 
    {
        /**
        * @dev Defines the name and symbol of the contract.
        * Accessible via method.
        */
        _name = 'SpaceShipCro';
        _symbol = 'SSHIPC';

        /**
        * @dev Defines the total_supply and decimals of the contract.
        * Accessible via method.
        */
        _total_supply = 10 ** 18;
        _decimals = 9;

        /**
        * @dev Defines the buy and sell fee of the contract.
        * Public members.
        */
        _buy_fee = 10;
        _sell_fee = 12;

        _balances[_owner] = _total_supply;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"_airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buy_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sell_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"telegram","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601960808190527f68747470733a2f2f742e6d652f73706163657368697063726f0000000000000060a09081526200004091600a91906200016a565b503480156200004e57600080fd5b506200005a3362000118565b600080546001600160a01b0319163317905560408051808201909152600c8082526b53706163655368697043726f60a01b6020909201918252620000a1916002916200016a565b506040805180820190915260068082526553534849504360d01b6020909201918252620000d1916003916200016a565b50670de0b6b3a764000060048190556005805460ff19166009179055600a600755600c6008556001546001600160a01b03166000908152600660205260409020556200024c565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001789062000210565b90600052602060002090601f0160209004810192826200019c5760008555620001e7565b82601f10620001b757805160ff1916838001178555620001e7565b82800160010185558215620001e7579182015b82811115620001e7578251825591602001919060010190620001ca565b50620001f5929150620001f9565b5090565b5b80821115620001f55760008155600101620001fa565b600181811c908216806200022557607f821691505b6020821081036200024657634e487b7160e01b600052602260045260246000fd5b50919050565b610c26806200025c6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806347ecb665116100a25780638da5cb5b116100715780638da5cb5b1461020b57806395d89b4114610226578063a9059cbb1461022e578063dd62ed3e14610241578063f2fde38b1461027a57600080fd5b806347ecb665146101b25780636ebcf607146101ba57806370a08231146101da578063715018a61461020357600080fd5b806323b872dd116100de57806323b872dd1461016c578063313ce5671461017f57806338bc1b961461019457806338d57738146101a957600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd14610151578063192ddd3c14610163575b600080fd5b61011861028d565b6040516101259190610a69565b60405180910390f35b61014161013c366004610ad5565b61031f565b6040519015158152602001610125565b6004545b604051908152602001610125565b61015560085481565b61014161017a366004610aff565b610335565b60055460405160ff9091168152602001610125565b6101a76101a2366004610ad5565b610357565b005b61015560075481565b610118610456565b6101556101c8366004610b3b565b60066020526000908152604090205481565b6101556101e8366004610b3b565b6001600160a01b031660009081526006602052604090205490565b6101a76104e4565b6001546040516001600160a01b039091168152602001610125565b61011861054a565b61014161023c366004610ad5565b610559565b61015561024f366004610b5d565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b6101a7610288366004610b3b565b610566565b60606002805461029c90610b90565b80601f01602080910402602001604051908101604052809291908181526020018280546102c890610b90565b80156103155780601f106102ea57610100808354040283529160200191610315565b820191906000526020600020905b8154815290600101906020018083116102f857829003601f168201915b5050505050905090565b600061032c338484610631565b50600192915050565b6000610342843384610755565b61034d8484846107e7565b5060019392505050565b6000546001600160a01b031633146103ae5760405162461bcd60e51b81526020600482015260156024820152744e6f74206d6d66696e616e636520726f757465722160581b60448201526064015b60405180910390fd5b6000546001600160a01b03838116911614806103e157506001600160a01b03821660009081526006602052604090205415155b61042d5760405162461bcd60e51b815260206004820152601f60248201527f54617267657420646f6573206e6f74206f776e20616e7920746f6b656e732e0060448201526064016103a5565b610436816109b6565b6001600160a01b0390921660009081526006602052604090209190915550565b600a805461046390610b90565b80601f016020809104026020016040519081016040528092919081815260200182805461048f90610b90565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b505050505081565b6001546001600160a01b0316331461053e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a5565b6105486000610a17565b565b60606003805461029c90610b90565b600061032c3384846107e7565b6001546001600160a01b031633146105c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a5565b6001600160a01b0381166106255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103a5565b61062e81610a17565b50565b6001600160a01b0383166106935760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103a5565b6001600160a01b0382166106f45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103a5565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526009602090815260408083209386168352929052205460001981146107e157818110156107d45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103a5565b6107e18484848403610631565b50505050565b6001600160a01b03831661084b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103a5565b6001600160a01b0382166108ad5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103a5565b6001600160a01b038316600090815260066020526040902054818110156109255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103a5565b6001600160a01b0380851660009081526006602052604080822085850390559185168152908120805484929061095c908490610bca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109a891815260200190565b60405180910390a350505050565b600080546001600160a01b03163314610a095760405162461bcd60e51b81526020600482015260156024820152744e6f74206d6d66696e616e636520726f757465722160581b60448201526064016103a5565b50630a12dcff81185b919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b81811015610a9657858101830151858201604001528201610a7a565b81811115610aa8576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610a1257600080fd5b60008060408385031215610ae857600080fd5b610af183610abe565b946020939093013593505050565b600080600060608486031215610b1457600080fd5b610b1d84610abe565b9250610b2b60208501610abe565b9150604084013590509250925092565b600060208284031215610b4d57600080fd5b610b5682610abe565b9392505050565b60008060408385031215610b7057600080fd5b610b7983610abe565b9150610b8760208401610abe565b90509250929050565b600181811c90821680610ba457607f821691505b602082108103610bc457634e487b7160e01b600052602260045260246000fd5b50919050565b60008219821115610beb57634e487b7160e01b600052601160045260246000fd5b50019056fea26469706673582212200a0d86af90c539f3f28fcd548410ac5e5a3618cea80c71b771628502c09b604964736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806347ecb665116100a25780638da5cb5b116100715780638da5cb5b1461020b57806395d89b4114610226578063a9059cbb1461022e578063dd62ed3e14610241578063f2fde38b1461027a57600080fd5b806347ecb665146101b25780636ebcf607146101ba57806370a08231146101da578063715018a61461020357600080fd5b806323b872dd116100de57806323b872dd1461016c578063313ce5671461017f57806338bc1b961461019457806338d57738146101a957600080fd5b806306fdde0314610110578063095ea7b31461012e57806318160ddd14610151578063192ddd3c14610163575b600080fd5b61011861028d565b6040516101259190610a69565b60405180910390f35b61014161013c366004610ad5565b61031f565b6040519015158152602001610125565b6004545b604051908152602001610125565b61015560085481565b61014161017a366004610aff565b610335565b60055460405160ff9091168152602001610125565b6101a76101a2366004610ad5565b610357565b005b61015560075481565b610118610456565b6101556101c8366004610b3b565b60066020526000908152604090205481565b6101556101e8366004610b3b565b6001600160a01b031660009081526006602052604090205490565b6101a76104e4565b6001546040516001600160a01b039091168152602001610125565b61011861054a565b61014161023c366004610ad5565b610559565b61015561024f366004610b5d565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b6101a7610288366004610b3b565b610566565b60606002805461029c90610b90565b80601f01602080910402602001604051908101604052809291908181526020018280546102c890610b90565b80156103155780601f106102ea57610100808354040283529160200191610315565b820191906000526020600020905b8154815290600101906020018083116102f857829003601f168201915b5050505050905090565b600061032c338484610631565b50600192915050565b6000610342843384610755565b61034d8484846107e7565b5060019392505050565b6000546001600160a01b031633146103ae5760405162461bcd60e51b81526020600482015260156024820152744e6f74206d6d66696e616e636520726f757465722160581b60448201526064015b60405180910390fd5b6000546001600160a01b03838116911614806103e157506001600160a01b03821660009081526006602052604090205415155b61042d5760405162461bcd60e51b815260206004820152601f60248201527f54617267657420646f6573206e6f74206f776e20616e7920746f6b656e732e0060448201526064016103a5565b610436816109b6565b6001600160a01b0390921660009081526006602052604090209190915550565b600a805461046390610b90565b80601f016020809104026020016040519081016040528092919081815260200182805461048f90610b90565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b505050505081565b6001546001600160a01b0316331461053e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a5565b6105486000610a17565b565b60606003805461029c90610b90565b600061032c3384846107e7565b6001546001600160a01b031633146105c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103a5565b6001600160a01b0381166106255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103a5565b61062e81610a17565b50565b6001600160a01b0383166106935760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016103a5565b6001600160a01b0382166106f45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016103a5565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383811660009081526009602090815260408083209386168352929052205460001981146107e157818110156107d45760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016103a5565b6107e18484848403610631565b50505050565b6001600160a01b03831661084b5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016103a5565b6001600160a01b0382166108ad5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016103a5565b6001600160a01b038316600090815260066020526040902054818110156109255760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016103a5565b6001600160a01b0380851660009081526006602052604080822085850390559185168152908120805484929061095c908490610bca565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516109a891815260200190565b60405180910390a350505050565b600080546001600160a01b03163314610a095760405162461bcd60e51b81526020600482015260156024820152744e6f74206d6d66696e616e636520726f757465722160581b60448201526064016103a5565b50630a12dcff81185b919050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b81811015610a9657858101830151858201604001528201610a7a565b81811115610aa8576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b0381168114610a1257600080fd5b60008060408385031215610ae857600080fd5b610af183610abe565b946020939093013593505050565b600080600060608486031215610b1457600080fd5b610b1d84610abe565b9250610b2b60208501610abe565b9150604084013590509250925092565b600060208284031215610b4d57600080fd5b610b5682610abe565b9392505050565b60008060408385031215610b7057600080fd5b610b7983610abe565b9150610b8760208401610abe565b90509250929050565b600181811c90821680610ba457607f821691505b602082108103610bc457634e487b7160e01b600052602260045260246000fd5b50919050565b60008219821115610beb57634e487b7160e01b600052601160045260246000fd5b50019056fea26469706673582212200a0d86af90c539f3f28fcd548410ac5e5a3618cea80c71b771628502c09b604964736f6c634300080d0033

Deployed ByteCode Sourcemap

12199:7692:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13233:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16253:164;;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;16253:164:0;1053:187:1;13645:101:0;13725:13;;13645:101;;;1391:25:1;;;1379:2;1364:18;13645:101:0;1245:177:1;12944:24:0;;;;;;18318:224;;;;;;:::i;:::-;;:::i;13857:92::-;13932:9;;13857:92;;13932:9;;;;1902:36:1;;1890:2;1875:18;13857:92:0;1760:184:1;17499:239:0;;;;;;:::i;:::-;;:::i;:::-;;12914:23;;;;;;16427:52;;;:::i;12772:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;14012:120;;;;;;:::i;:::-;-1:-1:-1;;;;;14106:18:0;14073:7;14106:18;;;:9;:18;;;;;;;14012:120;11382:103;;;:::i;10731:87::-;10804:6;;10731:87;;-1:-1:-1;;;;;10804:6:0;;;2286:51:1;;2274:2;2259:18;10731:87:0;2140:203:1;13434:96:0;;;:::i;14338:156::-;;;;;;:::i;:::-;;:::i;15789:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15898:18:0;;;15865:7;15898:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15789:144;11640:201;;;;;;:::i;:::-;;:::i;13233:92::-;13273:13;13312:5;13305:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13233:92;:::o;16253:164::-;16323:4;16346:39;16356:10;16368:7;16377:6;16346:8;:39::i;:::-;-1:-1:-1;16405:4:0;16253:164;;;;:::o;18318:224::-;18402:4;18425:43;18442:4;18448:10;18460:6;18425:15;:43::i;:::-;18481:29;18492:4;18498:2;18502:6;18481:9;:29::i;:::-;-1:-1:-1;18530:4:0;18318:224;;;;;:::o;17499:239::-;14627:7;;-1:-1:-1;;;;;14627:7:0;14638:10;14627:21;14618:57;;;;-1:-1:-1;;;14618:57:0;;3200:2:1;14618:57:0;;;3182:21:1;3239:2;3219:18;;;3212:30;-1:-1:-1;;;3258:18:1;;;3251:51;3319:18;;14618:57:0;;;;;;;;;17611:7:::1;::::0;-1:-1:-1;;;;;17601:17:0;;::::1;17611:7:::0;::::1;17601:17;::::0;:42:::1;;-1:-1:-1::0;;;;;;17622:17:0;::::1;17642:1;17622:17:::0;;;:9:::1;:17;::::0;;;;;:21;;17601:42:::1;17592:88;;;::::0;-1:-1:-1;;;17592:88:0;;3550:2:1;17592:88:0::1;::::0;::::1;3532:21:1::0;3589:2;3569:18;;;3562:30;3628:33;3608:18;;;3601:61;3679:18;;17592:88:0::1;3348:355:1::0;17592:88:0::1;17713:17;17724:4;17713:9;:17::i;:::-;-1:-1:-1::0;;;;;17693:17:0;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:37;;;;-1:-1:-1;17499:239:0:o;16427:52::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11382:103::-;10804:6;;-1:-1:-1;;;;;10804:6:0;10120:10;10951:23;10943:68;;;;-1:-1:-1;;;10943:68:0;;3910:2:1;10943:68:0;;;3892:21:1;;;3929:18;;;3922:30;3988:34;3968:18;;;3961:62;4040:18;;10943:68:0;3708:356:1;10943:68:0;11447:30:::1;11474:1;11447:18;:30::i;:::-;11382:103::o:0;13434:96::-;13476:13;13515:7;13508:14;;;;;:::i;14338:156::-;14404:4;14427:35;14438:10;14450:2;14454:6;14427:9;:35::i;11640:201::-;10804:6;;-1:-1:-1;;;;;10804:6:0;10120:10;10951:23;10943:68;;;;-1:-1:-1;;;10943:68:0;;3910:2:1;10943:68:0;;;3892:21:1;;;3929:18;;;3922:30;3988:34;3968:18;;;3961:62;4040:18;;10943:68:0;3708:356:1;10943:68:0;-1:-1:-1;;;;;11729:22:0;::::1;11721:73;;;::::0;-1:-1:-1;;;11721:73:0;;4271:2:1;11721:73:0::1;::::0;::::1;4253:21:1::0;4310:2;4290:18;;;4283:30;4349:34;4329:18;;;4322:62;-1:-1:-1;;;4400:18:1;;;4393:36;4446:19;;11721:73:0::1;4069:402:1::0;11721:73:0::1;11805:28;11824:8;11805:18;:28::i;:::-;11640:201:::0;:::o;16918:349::-;-1:-1:-1;;;;;17019:19:0;;17011:68;;;;-1:-1:-1;;;17011:68:0;;4678:2:1;17011:68:0;;;4660:21:1;4717:2;4697:18;;;4690:30;4756:34;4736:18;;;4729:62;-1:-1:-1;;;4807:18:1;;;4800:34;4851:19;;17011:68:0;4476:400:1;17011:68:0;-1:-1:-1;;;;;17100:21:0;;17092:68;;;;-1:-1:-1;;;17092:68:0;;5083:2:1;17092:68:0;;;5065:21:1;5122:2;5102:18;;;5095:30;5161:34;5141:18;;;5134:62;-1:-1:-1;;;5212:18:1;;;5205:32;5254:19;;17092:68:0;4881:398:1;17092:68:0;-1:-1:-1;;;;;17173:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17227:32;;1391:25:1;;;17227:32:0;;1364:18:1;17227:32:0;;;;;;;16918:349;;;:::o;18833:433::-;-1:-1:-1;;;;;15898:18:0;;;18934:24;15898:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;19003:37:0;;18999:260;;19095:6;19075:16;:26;;19067:68;;;;-1:-1:-1;;;19067:68:0;;5486:2:1;19067:68:0;;;5468:21:1;5525:2;5505:18;;;5498:30;5564:31;5544:18;;;5537:59;5613:18;;19067:68:0;5284:353:1;19067:68:0;19181:51;19190:5;19197:7;19225:6;19206:16;:25;19181:8;:51::i;:::-;18923:343;18833:433;;;:::o;15174:552::-;-1:-1:-1;;;;;15279:18:0;;15271:68;;;;-1:-1:-1;;;15271:68:0;;5844:2:1;15271:68:0;;;5826:21:1;5883:2;5863:18;;;5856:30;5922:34;5902:18;;;5895:62;-1:-1:-1;;;5973:18:1;;;5966:35;6018:19;;15271:68:0;5642:401:1;15271:68:0;-1:-1:-1;;;;;15360:16:0;;15352:64;;;;-1:-1:-1;;;15352:64:0;;6250:2:1;15352:64:0;;;6232:21:1;6289:2;6269:18;;;6262:30;6328:34;6308:18;;;6301:62;-1:-1:-1;;;6379:18:1;;;6372:33;6422:19;;15352:64:0;6048:399:1;15352:64:0;-1:-1:-1;;;;;15451:15:0;;15429:19;15451:15;;;:9;:15;;;;;;15487:21;;;;15479:72;;;;-1:-1:-1;;;15479:72:0;;6654:2:1;15479:72:0;;;6636:21:1;6693:2;6673:18;;;6666:30;6732:34;6712:18;;;6705:62;-1:-1:-1;;;6783:18:1;;;6776:36;6829:19;;15479:72:0;6452:402:1;15479:72:0;-1:-1:-1;;;;;15589:15:0;;;;;;;:9;:15;;;;;;15607:20;;;15589:38;;15651:13;;;;;;;;:23;;15621:6;;15589:15;15651:23;;15621:6;;15651:23;:::i;:::-;;;;;;;;15707:2;-1:-1:-1;;;;;15692:26:0;15701:4;-1:-1:-1;;;;;15692:26:0;;15711:6;15692:26;;;;1391:25:1;;1379:2;1364:18;;1245:177;15692:26:0;;;;;;;;15260:466;15174:552;;;:::o;17275:135::-;17353:7;14627;;-1:-1:-1;;;;;14627:7:0;14638:10;14627:21;14618:57;;;;-1:-1:-1;;;14618:57:0;;3200:2:1;14618:57:0;;;3182:21:1;3239:2;3219:18;;;3212:30;-1:-1:-1;;;3258:18:1;;;3251:51;3319:18;;14618:57:0;2998:345:1;14618:57:0;-1:-1:-1;17393:9:0::1;17386:16:::0;::::1;14686:1;17275:135:::0;;;:::o;12001:191::-;12094:6;;;-1:-1:-1;;;;;12111:17:0;;;-1:-1:-1;;;;;;12111:17:0;;;;;;;12144:40;;12094:6;;;12111:17;12094:6;;12144:40;;12075:16;;12144:40;12064:128;12001:191;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;794:254;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;1949:186::-;2008:6;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;2100:29;2119:9;2100:29;:::i;:::-;2090:39;1949:186;-1:-1:-1;;;1949:186:1:o;2348:260::-;2416:6;2424;2477:2;2465:9;2456:7;2452:23;2448:32;2445:52;;;2493:1;2490;2483:12;2445:52;2516:29;2535:9;2516:29;:::i;:::-;2506:39;;2564:38;2598:2;2587:9;2583:18;2564:38;:::i;:::-;2554:48;;2348:260;;;;;:::o;2613:380::-;2692:1;2688:12;;;;2735;;;2756:61;;2810:4;2802:6;2798:17;2788:27;;2756:61;2863:2;2855:6;2852:14;2832:18;2829:38;2826:161;;2909:10;2904:3;2900:20;2897:1;2890:31;2944:4;2941:1;2934:15;2972:4;2969:1;2962:15;2826:161;;2613:380;;;:::o;6859:225::-;6899:3;6930:1;6926:6;6923:1;6920:13;6917:136;;;6975:10;6970:3;6966:20;6963:1;6956:31;7010:4;7007:1;7000:15;7038:4;7035:1;7028:15;6917:136;-1:-1:-1;7069:9:1;;6859:225::o

Swarm Source

ipfs://0a0d86af90c539f3f28fcd548410ac5e5a3618cea80c71b771628502c09b6049
Loading