ETH Price: $3,073.36 (-1.24%)
Gas: 4 Gwei

Token

Reserve (RSV)
 

Overview

Max Total Supply

221,656.399002330344626494 RSV

Holders

457 (0.00%)

Total Transfers

-

Market

Price

$1.00 @ 0.000325 ETH

Onchain Market Cap

$221,066.79

Circulating Supply Market Cap

$426,567.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Reserve aims to create a stable decentralized currency targeted at emerging economies.

Market

Volume (24H):$4.05
Market Capitalization:$426,567.00
Circulating Supply:427,704.00 RSV
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Reserve

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 10000000 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-07-20
*/

pragma solidity 0.5.7;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @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 Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @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 sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @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) {
        // 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 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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.
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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 GSN 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.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
/**
 * @dev Contract module which provides a basic access control mechanism, where there is an account
 * (owner) that can be granted exclusive access to specific functions.
 *
 * This module is used through inheritance by using the modifier `onlyOwner`.
 *
 * To change ownership, use a 2-part nominate-accept pattern.
 *
 * This contract is loosely based off of https://git.io/JenNF but additionally requires new owners
 * to accept ownership before the transition occurs.
 */
contract Ownable is Context {
    address private _owner;
    address private _nominatedOwner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Returns the address of the current nominated owner.
     */
    function nominatedOwner() external view returns (address) {
        return _nominatedOwner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    function _onlyOwner() internal view {
        require(_msgSender() == _owner, "caller is not owner");
    }

    /**
     * @dev Nominates a new owner `newOwner`.
     * Requires a follow-up `acceptOwnership`.
     * Can only be called by the current owner.
     */
    function nominateNewOwner(address newOwner) external onlyOwner {
        require(newOwner != address(0), "new owner is 0 address");
        emit NewOwnerNominated(_owner, newOwner);
        _nominatedOwner = newOwner;
    }

    /**
     * @dev Accepts ownership of the contract.
     */
    function acceptOwnership() external {
        require(_nominatedOwner == _msgSender(), "unauthorized");
        emit OwnershipTransferred(_owner, _nominatedOwner);
        _owner = _nominatedOwner;
    }

    /** Set `_owner` to the 0 address.
     * Only do this to deliberately lock in the current permissions.
     *
     * THIS CANNOT BE UNDONE! Call this only if you know what you're doing and why you're doing it!
     */
    function renounceOwnership(string calldata declaration) external onlyOwner {
        string memory requiredDeclaration = "I hereby renounce ownership of this contract forever.";
        require(
            keccak256(abi.encodePacked(declaration)) ==
            keccak256(abi.encodePacked(requiredDeclaration)),
            "declaration incorrect");

        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
}


/**
 * @title Eternal Storage for the Reserve Token
 *
 * @dev Eternal Storage facilitates future upgrades.
 *
 * If Reserve chooses to release an upgraded contract for the Reserve in the future, Reserve will
 * have the option of reusing the deployed version of this data contract to simplify migration.
 *
 * The use of this contract does not imply that Reserve will choose to do a future upgrade, nor
 * that any future upgrades will necessarily re-use this storage. It merely provides option value.
 */
contract ReserveEternalStorage is Ownable {

    using SafeMath for uint256;


    // ===== auth =====

    address public reserveAddress;

    event ReserveAddressTransferred(
        address indexed oldReserveAddress,
        address indexed newReserveAddress
    );

    /// On construction, set auth fields.
    constructor() public {
        reserveAddress = _msgSender();
        emit ReserveAddressTransferred(address(0), reserveAddress);
    }

    /// Only run modified function if sent by `reserveAddress`.
    modifier onlyReserveAddress() {
        require(_msgSender() == reserveAddress, "onlyReserveAddress");
        _;
    }

    /// Set `reserveAddress`.
    function updateReserveAddress(address newReserveAddress) external {
        require(newReserveAddress != address(0), "zero address");
        require(_msgSender() == reserveAddress || _msgSender() == owner(), "not authorized");
        emit ReserveAddressTransferred(reserveAddress, newReserveAddress);
        reserveAddress = newReserveAddress;
    }



    // ===== balance =====

    mapping(address => uint256) public balance;

    /// Add `value` to `balance[key]`, unless this causes integer overflow.
    ///
    /// @dev This is a slight divergence from the strict Eternal Storage pattern, but it reduces
    /// the gas for the by-far most common token usage, it's a *very simple* divergence, and
    /// `setBalance` is available anyway.
    function addBalance(address key, uint256 value) external onlyReserveAddress {
        balance[key] = balance[key].add(value);
    }

    /// Subtract `value` from `balance[key]`, unless this causes integer underflow.
    function subBalance(address key, uint256 value) external onlyReserveAddress {
        balance[key] = balance[key].sub(value);
    }

    /// Set `balance[key]` to `value`.
    function setBalance(address key, uint256 value) external onlyReserveAddress {
        balance[key] = value;
    }



    // ===== allowed =====

    mapping(address => mapping(address => uint256)) public allowed;

    /// Set `to`'s allowance of `from`'s tokens to `value`.
    function setAllowed(address from, address to, uint256 value) external onlyReserveAddress {
        allowed[from][to] = value;
    }
}

/**
 * @title An interface representing a contract that calculates transaction fees
 */
 interface ITXFee {
     function calculateFee(address from, address to, uint256 amount) external returns (uint256);
 }

/**
 * @title The Reserve Token
 * @dev An ERC-20 token with minting, burning, pausing, and user freezing.
 * Based on OpenZeppelin's [implementation](https://github.com/OpenZeppelin/openzeppelin-solidity/blob/41aa39afbc13f0585634061701c883fe512a5469/contracts/token/ERC20/ERC20.sol).
 *
 * Non-constant-sized data is held in ReserveEternalStorage, to facilitate potential future upgrades.
 */
contract Reserve is IERC20, Ownable {
    using SafeMath for uint256;


    // ==== State ====


    // Non-constant-sized data
    ReserveEternalStorage internal trustedData;

    // TX Fee helper contract
    ITXFee public trustedTxFee;

    // Relayer
    address public trustedRelayer;

    // Basic token data
    uint256 public totalSupply;
    uint256 public maxSupply;

    // Paused data
    bool public paused;

    // Auth roles
    address public minter;
    address public pauser;
    address public feeRecipient;


    // ==== Events, Constants, and Constructor ====


    // Auth role change events
    event MinterChanged(address indexed newMinter);
    event PauserChanged(address indexed newPauser);
    event FeeRecipientChanged(address indexed newFeeRecipient);
    event MaxSupplyChanged(uint256 indexed newMaxSupply);
    event EternalStorageTransferred(address indexed newReserveAddress);
    event TxFeeHelperChanged(address indexed newTxFeeHelper);
    event TrustedRelayerChanged(address indexed newTrustedRelayer);

    // Pause events
    event Paused(address indexed account);
    event Unpaused(address indexed account);

    // Basic information as constants
    string public constant name = "Reserve";
    string public constant symbol = "RSV";
    string public constant version = "2.1";
    uint8 public constant decimals = 18;

    /// Initialize critical fields.
    constructor() public {
        pauser = msg.sender;
        feeRecipient = msg.sender;
        // minter defaults to the zero address.

        maxSupply = 2 ** 256 - 1;
        paused = true;

        trustedTxFee = ITXFee(address(0));
        trustedRelayer = address(0);
        trustedData = ReserveEternalStorage(address(0));
    }

    /// Accessor for eternal storage contract address.
    function getEternalStorageAddress() external view returns(address) {
        return address(trustedData);
    }


    // ==== Admin functions ====


    /// Modifies a function to only run if sent by `role`.
    modifier only(address role) {
        require(msg.sender == role, "unauthorized: not role holder");
        _;
    }

    /// Modifies a function to only run if sent by `role` or the contract's `owner`.
    modifier onlyOwnerOr(address role) {
        require(msg.sender == owner() || msg.sender == role, "unauthorized: not owner or role");
        _;
    }

    /// Change who holds the `minter` role.
    function changeMinter(address newMinter) external onlyOwnerOr(minter) {
        minter = newMinter;
        emit MinterChanged(newMinter);
    }

    /// Change who holds the `pauser` role.
    function changePauser(address newPauser) external onlyOwnerOr(pauser) {
        pauser = newPauser;
        emit PauserChanged(newPauser);
    }

    function changeFeeRecipient(address newFeeRecipient) external onlyOwnerOr(feeRecipient) {
        feeRecipient = newFeeRecipient;
        emit FeeRecipientChanged(newFeeRecipient);
    }

    /// Make a different address the EternalStorage contract's reserveAddress.
    /// This will break this contract, so only do it if you're
    /// abandoning this contract, e.g., for an upgrade.
    function transferEternalStorage(address newReserveAddress) external onlyOwner isPaused {
        require(newReserveAddress != address(0), "zero address");
        emit EternalStorageTransferred(newReserveAddress);
        trustedData.updateReserveAddress(newReserveAddress);
    }

    /// Change the contract that is able to do metatransactions.
    function changeRelayer(address newTrustedRelayer) external onlyOwner {
        trustedRelayer = newTrustedRelayer;
        emit TrustedRelayerChanged(newTrustedRelayer);
    }

    /// Change the contract that helps with transaction fee calculation.
    function changeTxFeeHelper(address newTrustedTxFee) external onlyOwner {
        trustedTxFee = ITXFee(newTrustedTxFee);
        emit TxFeeHelperChanged(newTrustedTxFee);
    }

    /// Change the maximum supply allowed.
    function changeMaxSupply(uint256 newMaxSupply) external onlyOwner {
        maxSupply = newMaxSupply;
        emit MaxSupplyChanged(newMaxSupply);
    }

    /// Pause the contract.
    function pause() external only(pauser) {
        paused = true;
        emit Paused(pauser);
    }

    /// Unpause the contract.
    function unpause() external only(pauser) {
        paused = false;
        emit Unpaused(pauser);
    }

    /// Modifies a function to run only when the contract is paused.
    modifier isPaused() {
        require(paused, "contract is not paused");
        _;
    }

    /// Modifies a function to run only when the contract is not paused.
    modifier notPaused() {
        require(!paused, "contract is paused");
        _;
    }


    // ==== Token transfers, allowances, minting, and burning ====


    /// @return how many attoRSV are held by `holder`.
    function balanceOf(address holder) external view returns (uint256) {
        return trustedData.balance(holder);
    }

    /// @return how many attoRSV `holder` has allowed `spender` to control.
    function allowance(address holder, address spender) external view returns (uint256) {
        return trustedData.allowed(holder, spender);
    }

    /// Transfer `value` attoRSV from `msg.sender` to `to`.
    function transfer(address to, uint256 value)
        external
        notPaused
        returns (bool)
    {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * Approve `spender` to spend `value` attotokens on behalf of `msg.sender`.
     *
     * Beware that changing a nonzero allowance with this method brings the risk that
     * someone may use both the old and the new allowance by unfortunate transaction ordering. One
     * way to mitigate this risk is to first reduce the spender's allowance
     * to 0, and then set the desired value afterwards, per
     * [this ERC-20 issue](https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729).
     *
     * A simpler workaround is to use `increaseAllowance` or `decreaseAllowance`, below.
     *
     * @param spender address The address which will spend the funds.
     * @param value uint256 How many attotokens to allow `spender` to spend.
     */
    function approve(address spender, uint256 value)
        external
        notPaused
        returns (bool)
    {
        _approve(msg.sender, spender, value);
        return true;
    }

    /// Transfer approved tokens from one address to another.
    /// @param from address The address to send tokens from.
    /// @param to address The address to send tokens to.
    /// @param value uint256 The number of attotokens to send.
    function transferFrom(address from, address to, uint256 value)
        external
        notPaused
        returns (bool)
    {
        _transfer(from, to, value);
        _approve(from, msg.sender, trustedData.allowed(from, msg.sender).sub(value));
        return true;
    }

    /// Increase `spender`'s allowance of the sender's tokens.
    /// @dev From MonolithDAO Token.sol
    /// @param spender The address which will spend the funds.
    /// @param addedValue How many attotokens to increase the allowance by.
    function increaseAllowance(address spender, uint256 addedValue)
        external
        notPaused
        returns (bool)
    {
        _approve(msg.sender, spender, trustedData.allowed(msg.sender, spender).add(addedValue));
        return true;
    }

    /// Decrease `spender`'s allowance of the sender's tokens.
    /// @dev From MonolithDAO Token.sol
    /// @param spender The address which will spend the funds.
    /// @param subtractedValue How many attotokens to decrease the allowance by.
    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        notPaused
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            trustedData.allowed(msg.sender, spender).sub(subtractedValue)
        );
        return true;
    }

    /// Mint `value` new attotokens to `account`.
    function mint(address account, uint256 value)
        external
        notPaused
        only(minter)
    {
        require(account != address(0), "can't mint to address zero");

        totalSupply = totalSupply.add(value);
        require(totalSupply < maxSupply, "max supply exceeded");
        trustedData.addBalance(account, value);
        emit Transfer(address(0), account, value);
    }

    /// Burn `value` attotokens from `account`, if sender has that much allowance from `account`.
    function burnFrom(address account, uint256 value)
        external
        notPaused
        only(minter)
    {
        _burn(account, value);
        _approve(account, msg.sender, trustedData.allowed(account, msg.sender).sub(value));
    }

    // ==== Relay functions === //
    
    /// Transfer `value` attotokens from `from` to `to`.
    /// Callable only by the relay contract.
    function relayTransfer(address from, address to, uint256 value) 
        external 
        notPaused
        only(trustedRelayer)
        returns (bool)
    {
        _transfer(from, to, value);
        return true;
    }

    /// Approve `value` attotokens to be spent by `spender` from `holder`.
    /// Callable only by the relay contract.
    function relayApprove(address holder, address spender, uint256 value) 
        external 
        notPaused
        only(trustedRelayer)
        returns (bool)
    {
        _approve(holder, spender, value);
        return true;
    }

    /// `spender` transfers `value` attotokens from `holder` to `to`.
    /// Requires allowance.
    /// Callable only by the relay contract.
    function relayTransferFrom(address holder, address spender, address to, uint256 value) 
        external 
        notPaused
        only(trustedRelayer)
        returns (bool)
    {
        _transfer(holder, to, value);
        _approve(holder, spender, trustedData.allowed(holder, spender).sub(value));
        return true;
    }

    /// @dev Transfer of `value` attotokens from `from` to `to`.
    /// Internal; doesn't check permissions.
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0), "can't transfer to address zero");
        trustedData.subBalance(from, value);
        uint256 fee = 0;

        if (address(trustedTxFee) != address(0)) {
            fee = trustedTxFee.calculateFee(from, to, value);
            require(fee <= value, "transaction fee out of bounds");

            trustedData.addBalance(feeRecipient, fee);
            emit Transfer(from, feeRecipient, fee);
        }

        trustedData.addBalance(to, value.sub(fee));
        emit Transfer(from, to, value.sub(fee));
    }

    /// @dev Burn `value` attotokens from `account`.
    /// Internal; doesn't check permissions.
    function _burn(address account, uint256 value) internal {
        require(account != address(0), "can't burn from address zero");

        totalSupply = totalSupply.sub(value);
        trustedData.subBalance(account, value);
        emit Transfer(account, address(0), value);
    }

    /// @dev Set `spender`'s allowance on `holder`'s tokens to `value` attotokens.
    /// Internal; doesn't check permissions.
    function _approve(address holder, address spender, uint256 value) internal {
        require(spender != address(0), "spender cannot be address zero");
        require(holder != address(0), "holder cannot be address zero");

        trustedData.setAllowed(holder, spender, value);
        emit Approval(holder, spender, value);
    }

// ===========================  Upgradeability   =====================================

    /// Accept upgrade from previous RSV instance. Can only be called once. 
    function acceptUpgrade(address previousImplementation) external onlyOwner {
        require(address(trustedData) == address(0), "can only be run once");
        Reserve previous = Reserve(previousImplementation);
        trustedData = ReserveEternalStorage(previous.getEternalStorageAddress());

        // Copy values from old contract
        totalSupply = previous.totalSupply();
        maxSupply = previous.maxSupply();
        emit MaxSupplyChanged(maxSupply);
        
        // Unpause.
        paused = false;
        emit Unpaused(pauser);

        previous.acceptOwnership();

        // Take control of Eternal Storage.
        previous.changePauser(address(this));
        previous.pause();
        previous.transferEternalStorage(address(this));

        // Burn the bridge behind us.
        previous.changeMinter(address(0));
        previous.changePauser(address(0));
        previous.renounceOwnership("I hereby renounce ownership of this contract forever.");
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"relayTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFeeRecipient","type":"address"}],"name":"changeFeeRecipient","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMinter","type":"address"}],"name":"changeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newPauser","type":"address"}],"name":"changePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newMaxSupply","type":"uint256"}],"name":"changeMaxSupply","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newTrustedRelayer","type":"address"}],"name":"changeRelayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"declaration","type":"string"}],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"relayTransferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"trustedRelayer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newReserveAddress","type":"address"}],"name":"transferEternalStorage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pauser","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newTrustedTxFee","type":"address"}],"name":"changeTxFeeHelper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"trustedTxFee","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"previousImplementation","type":"address"}],"name":"acceptUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"relayApprove","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEternalStorageAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newMinter","type":"address"}],"name":"MinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newPauser","type":"address"}],"name":"PauserChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newFeeRecipient","type":"address"}],"name":"FeeRecipientChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newMaxSupply","type":"uint256"}],"name":"MaxSupplyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newReserveAddress","type":"address"}],"name":"EternalStorageTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newTxFeeHelper","type":"address"}],"name":"TxFeeHelperChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newTrustedRelayer","type":"address"}],"name":"TrustedRelayerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"nominee","type":"address"}],"name":"NewOwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040523480156200001157600080fd5b50600062000024620000c260201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060088054336001600160a01b031991821681179092556009805482169092179091556000196006556007805460ff1916600117905560038054821690556004805482169055600280549091169055620000c6565b3390565b61364380620000d66000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c806354fd4d501161017b5780639fd0506d116100d8578063cfc1b4191161008c578063dd62ed3e11610071578063dd62ed3e146108ae578063e00f0ee4146108e9578063fb5689661461092c576102c8565b8063cfc1b41914610873578063d5abeb01146108a6576102c8565b8063a9059cbb116100bd578063a9059cbb146107ff578063ac5b54c214610838578063bdd1b96e1461086b576102c8565b80639fd0506d146107be578063a457c2d7146107c6576102c8565b80638456cb591161012f5780638da5cb5b116101145780638da5cb5b1461077b57806395d89b411461078357806396cd55361461078b576102c8565b80638456cb591461076b5780638596c22614610773576102c8565b806370a082311161016057806370a08231146106f757806379ba50971461072a57806379cc679014610732576102c8565b806354fd4d50146106e75780635c975abb146106ef576102c8565b8063313ce5671161022957806346904840116101dd5780634fdb7f44116101c25780634fdb7f44146106265780635354b9141461069657806353a47bb7146106df576102c8565b806346904840146105eb57806348d23829146105f3576102c8565b80633f4ba83a1161020e5780633f4ba83a1461058d578063404c7cdd1461059557806340c10f19146105b2576102c8565b8063313ce567146105365780633950935114610554576102c8565b806318160ddd1161028057806323b872dd1161026557806323b872dd1461048d5780632c4d4d18146104d05780632cd271e714610503576102c8565b806318160ddd14610440578063236040711461045a576102c8565b8063095ea7b3116102b1578063095ea7b31461037b5780630b9684fe146103c85780631627540c1461040b576102c8565b806306fdde03146102cd578063075461721461034a575b600080fd5b6102d5610934565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030f5781810151838201526020016102f7565b50505050905090810190601f16801561033c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035261096d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103b46004803603604081101561039157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561098e565b604080519115158252519081900360200190f35b6103b4600480360360608110156103de57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610a17565b61043e6004803603602081101561042157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b29565b005b610448610c40565b60408051918252519081900360200190f35b61043e6004803603602081101561047057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c46565b6103b4600480360360608110156104a357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610d90565b61043e600480360360208110156104e657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ede565b61043e6004803603602081101561051957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611034565b61053e61117e565b6040805160ff9092168252519081900360200190f35b6103b46004803603604081101561056a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611183565b61043e6112b8565b61043e600480360360208110156105ab57600080fd5b50356113af565b61043e600480360360408110156105c857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113ea565b6103526116d7565b61043e6004803603602081101561060957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116f3565b61043e6004803603602081101561063c57600080fd5b81019060208101813564010000000081111561065757600080fd5b82018360208201111561066957600080fd5b8035906020019184600183028401116401000000008311171561068b57600080fd5b50909250905061176a565b6103b4600480360360808110156106ac57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040820135169060600135611929565b610352611ac6565b6102d5611ae2565b6103b4611b1b565b6104486004803603602081101561070d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b24565b61043e611bcd565b61043e6004803603604081101561074857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cf1565b61043e611e85565b610352611f7f565b610352611f9b565b6102d5611fb7565b61043e600480360360208110156107a157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ff0565b6103526121bb565b6103b4600480360360408110156107dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356121d7565b6103b46004803603604081101561081557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356122d4565b61043e6004803603602081101561084e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612354565b6103526123cb565b61043e6004803603602081101561088957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166123e7565b610448612a30565b610448600480360360408110156108c457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a36565b6103b4600480360360608110156108ff57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612ae8565b610352612bef565b6040518060400160405280600781526020017f526573657276650000000000000000000000000000000000000000000000000081525081565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60075460009060ff1615610a0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610a0e338484612c0b565b50600192915050565b60075460009060ff1615610a8c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114610b1357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b610b1e858585612dfe565b506001949350505050565b610b3161324e565b73ffffffffffffffffffffffffffffffffffffffff8116610bb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6577206f776e65722069732030206164647265737300000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917fb59bab42c554cfd49f4f001c983b6ed93ede25748b10114b7d1cb1b3c97df7af91a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055481565b60095473ffffffffffffffffffffffffffffffffffffffff16610c67611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cb557503373ffffffffffffffffffffffffffffffffffffffff8216145b610d2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f167cccccc6e9b2892a740ec13fc1e51d3de8ea384f25bd87fee7412d588637e290600090a25050565b60075460009060ff1615610e0557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610e10848484612dfe565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808816600483015233602483018190529251610ed494899493610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b50519063ffffffff6132f316565b612c0b565b5060019392505050565b600754610100900473ffffffffffffffffffffffffffffffffffffffff16610f04611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f5257503373ffffffffffffffffffffffffffffffffffffffff8216145b610fbd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600780547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8516908102919091179091556040517fb6b8f1859c5c352e5ffad07d0f77e384ac725512c015bd3a3ffc885831c8a42590600090a25050565b60085473ffffffffffffffffffffffffffffffffffffffff16611055611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110a357503373ffffffffffffffffffffffffffffffffffffffff8216145b61110e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a25050565b601281565b60075460009060ff16156111f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600254604080517f5c658165000000000000000000000000000000000000000000000000000000008152336004820181905273ffffffffffffffffffffffffffffffffffffffff80881660248401529251610a0e9491938893610ecf938993921691635c65816591604480820192602092909190829003018186803b15801561128057600080fd5b505afa158015611294573d6000803e3d6000fd5b505050506040513d60208110156112aa57600080fd5b50519063ffffffff61333c16565b60085473ffffffffffffffffffffffffffffffffffffffff1633811461133f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a250565b6113b761324e565b600681905560405181907f28a10a2e0b5582da7164754cb994f6214b8af6aa7f7e003305fbc09e7106c51390600090a250565b60075460ff161561145c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600754610100900473ffffffffffffffffffffffffffffffffffffffff163381146114e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831661156a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e2774206d696e7420746f2061646472657373207a65726f000000000000604482015290519081900360640190fd5b60055461157d908363ffffffff61333c16565b6005819055600654116115f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d617820737570706c7920657863656564656400000000000000000000000000604482015290519081900360640190fd5b600254604080517f21e5383a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201869052915191909216916321e5383a91604480830192600092919082900301818387803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505060408051858152905173ffffffffffffffffffffffffffffffffffffffff87169350600092507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b6116fb61324e565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fc06d038b1f32a4f7e4b7cc1d794af10bf1dbbdc710af43782ae78f704d9beafc90600090a250565b61177261324e565b60606040518060600160405280603581526020016135e3603591399050806040516020018082805190602001908083835b602083106117e057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016117a3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120146118b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6465636c61726174696f6e20696e636f72726563740000000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35050600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b60075460009060ff161561199e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114611a2557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b611a30868585612dfe565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808a16600483015280891660248301529151611aba938a938a93610ecf938a939290921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b50600195945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b6040518060400160405280600381526020017f322e31000000000000000000000000000000000000000000000000000000000081525081565b60075460ff1681565b600254604080517fe3d670d700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151600093929092169163e3d670d791602480820192602092909190829003018186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505192915050565b611bd56133b0565b60015473ffffffffffffffffffffffffffffffffffffffff908116911614611c5e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f756e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60075460ff1615611d6357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600754610100900473ffffffffffffffffffffffffffffffffffffffff16338114611def57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b611df983836133b4565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483015233602483018190529251611e8094889493610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16338114611f0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a250565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040518060400160405280600381526020017f525356000000000000000000000000000000000000000000000000000000000081525081565b611ff861324e565b60075460ff1661206957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f636f6e7472616374206973206e6f742070617573656400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166120eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f20616464726573730000000000000000000000000000000000000000604482015290519081900360640190fd5b60405173ffffffffffffffffffffffffffffffffffffffff8216907f170ee3488a79c35a0d86eff88a7857910c11193864052c0323ad49222232a2d790600090a2600254604080517ff84afd4800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151919092169163f84afd4891602480830192600092919082900301818387803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60075460009060ff161561224c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600254604080517f5c658165000000000000000000000000000000000000000000000000000000008152336004820181905273ffffffffffffffffffffffffffffffffffffffff80881660248401529251610a0e9491938893610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b60075460009060ff161561234957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610a0e338484612dfe565b61235c61324e565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe554fc9a6ce410c9b9537cefc8440997bdbd03a2a87193c1a7f4ee085188ced190600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6123ef61324e565b60025473ffffffffffffffffffffffffffffffffffffffff161561247457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f63616e206f6e6c792062652072756e206f6e6365000000000000000000000000604482015290519081900360640190fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663fb5689666040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bf57600080fd5b505afa1580156124d3573d6000803e3d6000fd5b505050506040513d60208110156124e957600080fd5b5051600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918316916318160ddd91600480820192602092909190829003018186803b15801561257f57600080fd5b505afa158015612593573d6000803e3d6000fd5b505050506040513d60208110156125a957600080fd5b5051600555604080517fd5abeb01000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff83169163d5abeb01916004808301926020929190829003018186803b15801561261457600080fd5b505afa158015612628573d6000803e3d6000fd5b505050506040513d602081101561263e57600080fd5b505160068190556040517f28a10a2e0b5582da7164754cb994f6214b8af6aa7f7e003305fbc09e7106c51390600090a2600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a28073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561272357600080fd5b505af1158015612737573d6000803e3d6000fd5b5050604080517f2cd271e7000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff85169350632cd271e79250602480830192600092919082900301818387803b1580156127a857600080fd5b505af11580156127bc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b5050604080517f96cd5536000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff851693506396cd55369250602480830192600092919082900301818387803b15801561288d57600080fd5b505af11580156128a1573d6000803e3d6000fd5b5050604080517f2c4d4d18000000000000000000000000000000000000000000000000000000008152600060048201819052915173ffffffffffffffffffffffffffffffffffffffff86169450632c4d4d1893506024808301939282900301818387803b15801561291157600080fd5b505af1158015612925573d6000803e3d6000fd5b5050604080517f2cd271e7000000000000000000000000000000000000000000000000000000008152600060048201819052915173ffffffffffffffffffffffffffffffffffffffff86169450632cd271e793506024808301939282900301818387803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16634fdb7f446040518163ffffffff1660e01b81526004018080602001828103825260358152602001806135e360359139604001915050600060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050505050565b60065481565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015291516000939290921691635c65816591604480820192602092909190829003018186803b158015612ab557600080fd5b505afa158015612ac9573d6000803e3d6000fd5b505050506040513d6020811015612adf57600080fd5b50519392505050565b60075460009060ff1615612b5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114612be457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b610b1e858585612c0b565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff8216612c8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7370656e6465722063616e6e6f742062652061646472657373207a65726f0000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316612d0f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f686f6c6465722063616e6e6f742062652061646472657373207a65726f000000604482015290519081900360640190fd5b600254604080517f33dd1b8a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152858116602483015260448201859052915191909216916333dd1b8a91606480830192600092919082900301818387803b158015612d9257600080fd5b505af1158015612da6573d6000803e3d6000fd5b505060408051848152905173ffffffffffffffffffffffffffffffffffffffff8087169450871692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8216612e8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f63616e2774207472616e7366657220746f2061646472657373207a65726f0000604482015290519081900360640190fd5b600254604080517fcf8eeb7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018590529151919092169163cf8eeb7e91604480830192600092919082900301818387803b158015612efb57600080fd5b505af1158015612f0f573d6000803e3d6000fd5b50506003546000925073ffffffffffffffffffffffffffffffffffffffff1615905061314157600354604080517f7ca87cb600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015286811660248301526044820186905291519190921691637ca87cb69160648083019260209291908290030181600087803b158015612fb957600080fd5b505af1158015612fcd573d6000803e3d6000fd5b505050506040513d6020811015612fe357600080fd5b505190508181111561305657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e73616374696f6e20666565206f7574206f6620626f756e6473000000604482015290519081900360640190fd5b600254600954604080517f21e5383a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015260248101859052905191909216916321e5383a91604480830192600092919082900301818387803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b505060095460408051858152905173ffffffffffffffffffffffffffffffffffffffff928316945091881692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35b60025473ffffffffffffffffffffffffffffffffffffffff166321e5383a84613170858563ffffffff6132f316565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156131d957600080fd5b505af11580156131ed573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff848116915085167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61323785856132f3565b60408051918252519081900360200190a350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1661326f6133b0565b73ffffffffffffffffffffffffffffffffffffffff16146132f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f63616c6c6572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b565b600061333583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613531565b9392505050565b60008282018381101561333557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b73ffffffffffffffffffffffffffffffffffffffff821661343657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e2774206275726e2066726f6d2061646472657373207a65726f00000000604482015290519081900360640190fd5b600554613449908263ffffffff6132f316565b600555600254604080517fcf8eeb7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163cf8eeb7e91604480830192600092919082900301818387803b1580156134c757600080fd5b505af11580156134db573d6000803e3d6000fd5b50506040805184815290516000935073ffffffffffffffffffffffffffffffffffffffff861692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600081848411156135da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561359f578181015183820152602001613587565b50505050905090810190601f1680156135cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe49206865726562792072656e6f756e6365206f776e657273686970206f66207468697320636f6e747261637420666f72657665722ea165627a7a72305820ff21448e107a290591da2fb4a5c38e03f84252d226792d92dae425cf027694d90029

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102c85760003560e01c806354fd4d501161017b5780639fd0506d116100d8578063cfc1b4191161008c578063dd62ed3e11610071578063dd62ed3e146108ae578063e00f0ee4146108e9578063fb5689661461092c576102c8565b8063cfc1b41914610873578063d5abeb01146108a6576102c8565b8063a9059cbb116100bd578063a9059cbb146107ff578063ac5b54c214610838578063bdd1b96e1461086b576102c8565b80639fd0506d146107be578063a457c2d7146107c6576102c8565b80638456cb591161012f5780638da5cb5b116101145780638da5cb5b1461077b57806395d89b411461078357806396cd55361461078b576102c8565b80638456cb591461076b5780638596c22614610773576102c8565b806370a082311161016057806370a08231146106f757806379ba50971461072a57806379cc679014610732576102c8565b806354fd4d50146106e75780635c975abb146106ef576102c8565b8063313ce5671161022957806346904840116101dd5780634fdb7f44116101c25780634fdb7f44146106265780635354b9141461069657806353a47bb7146106df576102c8565b806346904840146105eb57806348d23829146105f3576102c8565b80633f4ba83a1161020e5780633f4ba83a1461058d578063404c7cdd1461059557806340c10f19146105b2576102c8565b8063313ce567146105365780633950935114610554576102c8565b806318160ddd1161028057806323b872dd1161026557806323b872dd1461048d5780632c4d4d18146104d05780632cd271e714610503576102c8565b806318160ddd14610440578063236040711461045a576102c8565b8063095ea7b3116102b1578063095ea7b31461037b5780630b9684fe146103c85780631627540c1461040b576102c8565b806306fdde03146102cd578063075461721461034a575b600080fd5b6102d5610934565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030f5781810151838201526020016102f7565b50505050905090810190601f16801561033c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61035261096d565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6103b46004803603604081101561039157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561098e565b604080519115158252519081900360200190f35b6103b4600480360360608110156103de57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610a17565b61043e6004803603602081101561042157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b29565b005b610448610c40565b60408051918252519081900360200190f35b61043e6004803603602081101561047057600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c46565b6103b4600480360360608110156104a357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610d90565b61043e600480360360208110156104e657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610ede565b61043e6004803603602081101561051957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611034565b61053e61117e565b6040805160ff9092168252519081900360200190f35b6103b46004803603604081101561056a57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611183565b61043e6112b8565b61043e600480360360208110156105ab57600080fd5b50356113af565b61043e600480360360408110156105c857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356113ea565b6103526116d7565b61043e6004803603602081101561060957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166116f3565b61043e6004803603602081101561063c57600080fd5b81019060208101813564010000000081111561065757600080fd5b82018360208201111561066957600080fd5b8035906020019184600183028401116401000000008311171561068b57600080fd5b50909250905061176a565b6103b4600480360360808110156106ac57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101358216916040820135169060600135611929565b610352611ac6565b6102d5611ae2565b6103b4611b1b565b6104486004803603602081101561070d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611b24565b61043e611bcd565b61043e6004803603604081101561074857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611cf1565b61043e611e85565b610352611f7f565b610352611f9b565b6102d5611fb7565b61043e600480360360208110156107a157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ff0565b6103526121bb565b6103b4600480360360408110156107dc57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356121d7565b6103b46004803603604081101561081557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356122d4565b61043e6004803603602081101561084e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612354565b6103526123cb565b61043e6004803603602081101561088957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166123e7565b610448612a30565b610448600480360360408110156108c457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a36565b6103b4600480360360608110156108ff57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135612ae8565b610352612bef565b6040518060400160405280600781526020017f526573657276650000000000000000000000000000000000000000000000000081525081565b600754610100900473ffffffffffffffffffffffffffffffffffffffff1681565b60075460009060ff1615610a0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610a0e338484612c0b565b50600192915050565b60075460009060ff1615610a8c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114610b1357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b610b1e858585612dfe565b506001949350505050565b610b3161324e565b73ffffffffffffffffffffffffffffffffffffffff8116610bb357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6577206f776e65722069732030206164647265737300000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917fb59bab42c554cfd49f4f001c983b6ed93ede25748b10114b7d1cb1b3c97df7af91a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60055481565b60095473ffffffffffffffffffffffffffffffffffffffff16610c67611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610cb557503373ffffffffffffffffffffffffffffffffffffffff8216145b610d2057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f167cccccc6e9b2892a740ec13fc1e51d3de8ea384f25bd87fee7412d588637e290600090a25050565b60075460009060ff1615610e0557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610e10848484612dfe565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808816600483015233602483018190529251610ed494899493610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b505afa158015610eab573d6000803e3d6000fd5b505050506040513d6020811015610ec157600080fd5b50519063ffffffff6132f316565b612c0b565b5060019392505050565b600754610100900473ffffffffffffffffffffffffffffffffffffffff16610f04611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f5257503373ffffffffffffffffffffffffffffffffffffffff8216145b610fbd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600780547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8516908102919091179091556040517fb6b8f1859c5c352e5ffad07d0f77e384ac725512c015bd3a3ffc885831c8a42590600090a25050565b60085473ffffffffffffffffffffffffffffffffffffffff16611055611f9b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110a357503373ffffffffffffffffffffffffffffffffffffffff8216145b61110e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f756e617574686f72697a65643a206e6f74206f776e6572206f7220726f6c6500604482015290519081900360640190fd5b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fb80482a293ca2e013eda8683c9bd7fc8347cfdaeea5ede58cba46df502c2a60490600090a25050565b601281565b60075460009060ff16156111f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600254604080517f5c658165000000000000000000000000000000000000000000000000000000008152336004820181905273ffffffffffffffffffffffffffffffffffffffff80881660248401529251610a0e9491938893610ecf938993921691635c65816591604480820192602092909190829003018186803b15801561128057600080fd5b505afa158015611294573d6000803e3d6000fd5b505050506040513d60208110156112aa57600080fd5b50519063ffffffff61333c16565b60085473ffffffffffffffffffffffffffffffffffffffff1633811461133f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a250565b6113b761324e565b600681905560405181907f28a10a2e0b5582da7164754cb994f6214b8af6aa7f7e003305fbc09e7106c51390600090a250565b60075460ff161561145c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600754610100900473ffffffffffffffffffffffffffffffffffffffff163381146114e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831661156a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f63616e2774206d696e7420746f2061646472657373207a65726f000000000000604482015290519081900360640190fd5b60055461157d908363ffffffff61333c16565b6005819055600654116115f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6d617820737570706c7920657863656564656400000000000000000000000000604482015290519081900360640190fd5b600254604080517f21e5383a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201869052915191909216916321e5383a91604480830192600092919082900301818387803b15801561166c57600080fd5b505af1158015611680573d6000803e3d6000fd5b505060408051858152905173ffffffffffffffffffffffffffffffffffffffff87169350600092507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b6116fb61324e565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fc06d038b1f32a4f7e4b7cc1d794af10bf1dbbdc710af43782ae78f704d9beafc90600090a250565b61177261324e565b60606040518060600160405280603581526020016135e3603591399050806040516020018082805190602001908083835b602083106117e057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016117a3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120838360405160200180838380828437808301925050509250505060405160208183030381529060405280519060200120146118b757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f6465636c61726174696f6e20696e636f72726563740000000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a35050600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b60075460009060ff161561199e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114611a2557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b611a30868585612dfe565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808a16600483015280891660248301529151611aba938a938a93610ecf938a939290921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b50600195945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b6040518060400160405280600381526020017f322e31000000000000000000000000000000000000000000000000000000000081525081565b60075460ff1681565b600254604080517fe3d670d700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151600093929092169163e3d670d791602480820192602092909190829003018186803b158015611b9b57600080fd5b505afa158015611baf573d6000803e3d6000fd5b505050506040513d6020811015611bc557600080fd5b505192915050565b611bd56133b0565b60015473ffffffffffffffffffffffffffffffffffffffff908116911614611c5e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f756e617574686f72697a65640000000000000000000000000000000000000000604482015290519081900360640190fd5b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60075460ff1615611d6357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600754610100900473ffffffffffffffffffffffffffffffffffffffff16338114611def57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b611df983836133b4565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808716600483015233602483018190529251611e8094889493610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b505050565b60085473ffffffffffffffffffffffffffffffffffffffff16338114611f0c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a250565b60045473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040518060400160405280600381526020017f525356000000000000000000000000000000000000000000000000000000000081525081565b611ff861324e565b60075460ff1661206957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f636f6e7472616374206973206e6f742070617573656400000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166120eb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f7a65726f20616464726573730000000000000000000000000000000000000000604482015290519081900360640190fd5b60405173ffffffffffffffffffffffffffffffffffffffff8216907f170ee3488a79c35a0d86eff88a7857910c11193864052c0323ad49222232a2d790600090a2600254604080517ff84afd4800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529151919092169163f84afd4891602480830192600092919082900301818387803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60075460009060ff161561224c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b600254604080517f5c658165000000000000000000000000000000000000000000000000000000008152336004820181905273ffffffffffffffffffffffffffffffffffffffff80881660248401529251610a0e9491938893610ecf938993921691635c65816591604480820192602092909190829003018186803b158015610e9757600080fd5b60075460009060ff161561234957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b610a0e338484612dfe565b61235c61324e565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fe554fc9a6ce410c9b9537cefc8440997bdbd03a2a87193c1a7f4ee085188ced190600090a250565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6123ef61324e565b60025473ffffffffffffffffffffffffffffffffffffffff161561247457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f63616e206f6e6c792062652072756e206f6e6365000000000000000000000000604482015290519081900360640190fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663fb5689666040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bf57600080fd5b505afa1580156124d3573d6000803e3d6000fd5b505050506040513d60208110156124e957600080fd5b5051600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918316916318160ddd91600480820192602092909190829003018186803b15801561257f57600080fd5b505afa158015612593573d6000803e3d6000fd5b505050506040513d60208110156125a957600080fd5b5051600555604080517fd5abeb01000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff83169163d5abeb01916004808301926020929190829003018186803b15801561261457600080fd5b505afa158015612628573d6000803e3d6000fd5b505050506040513d602081101561263e57600080fd5b505160068190556040517f28a10a2e0b5582da7164754cb994f6214b8af6aa7f7e003305fbc09e7106c51390600090a2600780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560085460405173ffffffffffffffffffffffffffffffffffffffff909116907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a28073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561272357600080fd5b505af1158015612737573d6000803e3d6000fd5b5050604080517f2cd271e7000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff85169350632cd271e79250602480830192600092919082900301818387803b1580156127a857600080fd5b505af11580156127bc573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16638456cb596040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b5050604080517f96cd5536000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff851693506396cd55369250602480830192600092919082900301818387803b15801561288d57600080fd5b505af11580156128a1573d6000803e3d6000fd5b5050604080517f2c4d4d18000000000000000000000000000000000000000000000000000000008152600060048201819052915173ffffffffffffffffffffffffffffffffffffffff86169450632c4d4d1893506024808301939282900301818387803b15801561291157600080fd5b505af1158015612925573d6000803e3d6000fd5b5050604080517f2cd271e7000000000000000000000000000000000000000000000000000000008152600060048201819052915173ffffffffffffffffffffffffffffffffffffffff86169450632cd271e793506024808301939282900301818387803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16634fdb7f446040518163ffffffff1660e01b81526004018080602001828103825260358152602001806135e360359139604001915050600060405180830381600087803b158015612a1457600080fd5b505af1158015612a28573d6000803e3d6000fd5b505050505050565b60065481565b600254604080517f5c65816500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152848116602483015291516000939290921691635c65816591604480820192602092909190829003018186803b158015612ab557600080fd5b505afa158015612ac9573d6000803e3d6000fd5b505050506040513d6020811015612adf57600080fd5b50519392505050565b60075460009060ff1615612b5d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f636f6e7472616374206973207061757365640000000000000000000000000000604482015290519081900360640190fd5b60045473ffffffffffffffffffffffffffffffffffffffff16338114612be457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f756e617574686f72697a65643a206e6f7420726f6c6520686f6c646572000000604482015290519081900360640190fd5b610b1e858585612c0b565b60025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff8216612c8d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f7370656e6465722063616e6e6f742062652061646472657373207a65726f0000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316612d0f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f686f6c6465722063616e6e6f742062652061646472657373207a65726f000000604482015290519081900360640190fd5b600254604080517f33dd1b8a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152858116602483015260448201859052915191909216916333dd1b8a91606480830192600092919082900301818387803b158015612d9257600080fd5b505af1158015612da6573d6000803e3d6000fd5b505060408051848152905173ffffffffffffffffffffffffffffffffffffffff8087169450871692507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8216612e8057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f63616e2774207472616e7366657220746f2061646472657373207a65726f0000604482015290519081900360640190fd5b600254604080517fcf8eeb7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8681166004830152602482018590529151919092169163cf8eeb7e91604480830192600092919082900301818387803b158015612efb57600080fd5b505af1158015612f0f573d6000803e3d6000fd5b50506003546000925073ffffffffffffffffffffffffffffffffffffffff1615905061314157600354604080517f7ca87cb600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015286811660248301526044820186905291519190921691637ca87cb69160648083019260209291908290030181600087803b158015612fb957600080fd5b505af1158015612fcd573d6000803e3d6000fd5b505050506040513d6020811015612fe357600080fd5b505190508181111561305657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7472616e73616374696f6e20666565206f7574206f6620626f756e6473000000604482015290519081900360640190fd5b600254600954604080517f21e5383a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015260248101859052905191909216916321e5383a91604480830192600092919082900301818387803b1580156130d457600080fd5b505af11580156130e8573d6000803e3d6000fd5b505060095460408051858152905173ffffffffffffffffffffffffffffffffffffffff928316945091881692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35b60025473ffffffffffffffffffffffffffffffffffffffff166321e5383a84613170858563ffffffff6132f316565b6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156131d957600080fd5b505af11580156131ed573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff848116915085167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61323785856132f3565b60408051918252519081900360200190a350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1661326f6133b0565b73ffffffffffffffffffffffffffffffffffffffff16146132f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f63616c6c6572206973206e6f74206f776e657200000000000000000000000000604482015290519081900360640190fd5b565b600061333583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613531565b9392505050565b60008282018381101561333557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b73ffffffffffffffffffffffffffffffffffffffff821661343657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f63616e2774206275726e2066726f6d2061646472657373207a65726f00000000604482015290519081900360640190fd5b600554613449908263ffffffff6132f316565b600555600254604080517fcf8eeb7e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529151919092169163cf8eeb7e91604480830192600092919082900301818387803b1580156134c757600080fd5b505af11580156134db573d6000803e3d6000fd5b50506040805184815290516000935073ffffffffffffffffffffffffffffffffffffffff861692507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600081848411156135da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561359f578181015183820152602001613587565b50505050905090810190601f1680156135cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505090039056fe49206865726562792072656e6f756e6365206f776e657273686970206f66207468697320636f6e747261637420666f72657665722ea165627a7a72305820ff21448e107a290591da2fb4a5c38e03f84252d226792d92dae425cf027694d90029

Deployed Bytecode Sourcemap

16175:13117:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16175:13117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17415:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17415:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16643:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22597:192;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22597:192:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;25388:229;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25388:229:0;;;;;;;;;;;;;;;;;;:::i;11527:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11527:227:0;;;;:::i;:::-;;16511:26;;;:::i;:::-;;;;;;;;;;;;;;;;19037:189;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19037:189:0;;;;:::i;23044:283::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23044:283:0;;;;;;;;;;;;;;;;;;:::i;18682:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18682:147:0;;;;:::i;18882:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18882:147:0;;;;:::i;17550:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;23581:258;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23581:258:0;;;;;;;;;:::i;20616:106::-;;;:::i;20284:155::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20284:155:0;;:::i;24475:405::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24475:405:0;;;;;;;;;:::i;16699:27::-;;;:::i;19793:178::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19793:178:0;;;;:::i;12271:450::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12271:450:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;12271:450:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12271:450:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;12271:450:0;;-1:-1:-1;12271:450:0;-1:-1:-1;12271:450:0;:::i;26142:339::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;26142:339:0;;;;;;;;;;;;;;;;;;;;;;;:::i;10984:99::-;;;:::i;17505:38::-;;;:::i;16597:18::-;;;:::i;21202:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21202:120:0;;;;:::i;11828:207::-;;;:::i;24987:247::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24987:247:0;;;;;;;;;:::i;20476:101::-;;;:::i;16448:29::-;;;:::i;10814:79::-;;;:::i;17461:37::-;;;:::i;19435:284::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19435:284:0;;;;:::i;16671:21::-;;;:::i;24098:318::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24098:318:0;;;;;;;;;:::i;21622:184::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21622:184:0;;;;;;;;;:::i;20053:179::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20053:179:0;;;;:::i;16397:26::-;;;:::i;28280:1009::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28280:1009:0;;;;:::i;16544:24::-;;;:::i;21407:146::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21407:146:0;;;;;;;;;;;:::i;25747:241::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25747:241:0;;;;;;;;;;;;;;;;;;:::i;18042:113::-;;;:::i;17415:39::-;;;;;;;;;;;;;;;;;;;:::o;16643:21::-;;;;;;;;;:::o;22597:192::-;21015:6;;22701:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22723:36;22732:10;22744:7;22753:5;22723:8;:36::i;:::-;-1:-1:-1;22777:4:0;22597:192;;;;:::o;25388:229::-;21015:6;;25539:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25505:14;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25561:26;25571:4;25577:2;25581:5;25561:9;:26::i;:::-;-1:-1:-1;25605:4:0;;25388:229;-1:-1:-1;;;;25388:229:0:o;11527:227::-;11208:12;:10;:12::i;:::-;11609:22;;;11601:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11692:6;;;11674:35;;;;;;;11692:6;;;11674:35;;;11720:15;:26;;;;;;;;;;;;;;;11527:227::o;16511:26::-;;;;:::o;19037:189::-;19111:12;;;;18544:7;:5;:7::i;:::-;18530:21;;:10;:21;;;:43;;;-1:-1:-1;18555:10:0;:18;;;;18530:43;18522:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19136:12;:30;;;;;;;;;;;;;19182:36;;;;-1:-1:-1;;19182:36:0;19037:189;;:::o;23044:283::-;21015:6;;23162:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23184:26;23194:4;23200:2;23204:5;23184:9;:26::i;:::-;23248:11;;:37;;;;;;:11;:37;;;;;;;23236:10;23248:37;;;;;;;;23221:76;;23230:4;;23236:10;23248:48;;23290:5;;23248:11;;;:19;;:37;;;;;;;;;;;;;;;:11;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;23248:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23248:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23248:37:0;;:48;:41;:48;:::i;:::-;23221:8;:76::i;:::-;-1:-1:-1;23315:4:0;23044:283;;;;;:::o;18682:147::-;18744:6;;;;;;;18544:7;:5;:7::i;:::-;18530:21;;:10;:21;;;:43;;;-1:-1:-1;18555:10:0;:18;;;;18530:43;18522:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18763:6;:18;;;;;;;;;;;;;;;;;;18797:24;;;;-1:-1:-1;;18797:24:0;18682:147;;:::o;18882:::-;18944:6;;;;18544:7;:5;:7::i;:::-;18530:21;;:10;:21;;;:43;;;-1:-1:-1;18555:10:0;:18;;;;18530:43;18522:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18963:6;:18;;;;;;;;;;;;;18997:24;;;;-1:-1:-1;;18997:24:0;18882:147;;:::o;17550:35::-;17583:2;17550:35;:::o;23581:258::-;21015:6;;23700:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23752:11;;:40;;;;;;23731:10;23752:40;;;;;;:11;:40;;;;;;;;;23722:87;;23731:10;;23743:7;;23752:56;;23797:10;;23752:11;;;:19;;:40;;;;;;;;;;;;;;;:11;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;23752:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23752:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23752:40:0;;:56;:44;:56;:::i;20616:106::-;20649:6;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20668:6;:14;;;;;;20707:6;;20698:16;;20707:6;;;;;20698:16;;20677:5;;20698:16;20616:106;:::o;20284:155::-;11208:12;:10;:12::i;:::-;20361:9;:24;;;20401:30;;20373:12;;20401:30;;;;;20284:155;:::o;24475:405::-;21015:6;;;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24572:6;;;;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24604:21;;;24596:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24683:11;;:22;;24699:5;24683:22;:15;:22;:::i;:::-;24669:11;:36;;;24738:9;;-1:-1:-1;24716:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24782:11;;:38;;;;;;:11;:38;;;;;;;;;;;;;;;:11;;;;;:22;;:38;;;;;:11;;:38;;;;;;;:11;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;24782:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24836:36:0;;;;;;;;;;;;-1:-1:-1;24853:1:0;;-1:-1:-1;24836:36:0;;;;;;;;;21055:1;24475:405;;:::o;16699:27::-;;;;;;:::o;19793:178::-;11208:12;:10;:12::i;:::-;19873:14;:34;;;;;;;;;;;;;19923:40;;;;-1:-1:-1;;19923:40:0;19793:178;:::o;12271:450::-;11208:12;:10;:12::i;:::-;12357:33;:91;;;;;;;;;;;;;;;;;;;12565:19;12548:37;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12548:37:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12548:37:0;;;12538:48;;;;;;12508:11;;12491:29;;;;;;;30:3:-1;22:6;14;1:33;57:3;49:6;45:16;35:26;;12491:29:0;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12491:29:0;;;12481:40;;;;;;:105;12459:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12680:1;12664:6;;12643:40;;;12664:6;;;;12643:40;;12680:1;;12643:40;-1:-1:-1;;12711:1:0;12694:19;;;;;;-1:-1:-1;12271:450:0:o;26142:339::-;21015:6;;26316:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26282:14;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26338:28;26348:6;26356:2;26360:5;26338:9;:28::i;:::-;26403:11;;:36;;;;;;:11;:36;;;;;;;;;;;;;;;;26377:74;;26386:6;;26394:7;;26403:47;;26444:5;;26403:11;;;;;:19;;:36;;;;;;;;;;;;;;;:11;:36;;;5:2:-1;;;;30:1;27;20:12;26377:74:0;-1:-1:-1;26469:4:0;;26142:339;-1:-1:-1;;;;;26142:339:0:o;10984:99::-;11060:15;;;;10984:99;:::o;17505:38::-;;;;;;;;;;;;;;;;;;;:::o;16597:18::-;;;;;;:::o;21202:120::-;21287:11;;:27;;;;;;:11;:27;;;;;;;;;21260:7;;21287:11;;;;;:19;;:27;;;;;;;;;;;;;;;:11;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;21287:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21287:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21287:27:0;;21202:120;-1:-1:-1;;21202:120:0:o;11828:207::-;11902:12;:10;:12::i;:::-;11883:15;;:31;:15;;;:31;;;11875:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11976:15;;;11968:6;;11947:45;;11976:15;;;;;11968:6;;;;11947:45;;;12012:15;;;12003:24;;;;12012:15;;;;12003:24;;;;;;11828:207::o;24987:247::-;21015:6;;;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25088:6;;;;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25112:21;25118:7;25127:5;25112;:21::i;:::-;25174:11;;:40;;;;;;:11;:40;;;;;;;25162:10;25174:40;;;;;;;;25144:82;;25153:7;;25162:10;25174:51;;25219:5;;25174:11;;;:19;;:40;;;;;;;;;;;;;;;:11;:40;;;5:2:-1;;;;30:1;27;20:12;25144:82:0;21055:1;24987:247;;:::o;20476:101::-;20507:6;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20526:6;:13;;;;20535:4;20526:13;;;20562:6;;20555:14;;20562:6;;;;;20555:14;;20526:6;;20555:14;20476:101;:::o;16448:29::-;;;;;;:::o;10814:79::-;10852:7;10879:6;;;10814:79;:::o;17461:37::-;;;;;;;;;;;;;;;;;;;:::o;19435:284::-;11208:12;:10;:12::i;:::-;20839:6;;;;20831:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19541:31;;;19533:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19605:44;;;;;;;;;;;19660:11;;:51;;;;;;:11;:51;;;;;;;;;:11;;;;;:32;;:51;;;;;:11;;:51;;;;;;;:11;;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;19660:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19660:51:0;;;;19435:284;:::o;16671:21::-;;;;;;:::o;24098:318::-;21015:6;;24222:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24314:11;;:40;;;;;;24267:10;24314:40;;;;;;:11;:40;;;;;;;;;24244:142;;24267:10;;24292:7;;24314:61;;24359:15;;24314:11;;;:19;;:40;;;;;;;;;;;;;;;:11;:40;;;5:2:-1;;;;30:1;27;20:12;21622:184:0;21015:6;;21722:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21744:32;21754:10;21766:2;21770:5;21744:9;:32::i;20053:179::-;11208:12;:10;:12::i;:::-;20135;:38;;;;;;;;;;;;;20189:35;;;;-1:-1:-1;;20189:35:0;20053:179;:::o;16397:26::-;;;;;;:::o;28280:1009::-;11208:12;:10;:12::i;:::-;28381:11;;28373:34;28381:11;28373:34;28365:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28443:16;28470:22;28443:50;;28540:8;:33;;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28540:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28540:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28540:35:0;28504:11;:72;;;;;;;;;;;28645:22;;;;;;;;:20;;;;;;:22;;;;;28540:35;;28645:22;;;;;;;;:20;:22;;;5:2:-1;;;;30:1;27;20:12;5:2;28645:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28645:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28645:22:0;28631:11;:36;28690:20;;;;;;;;:18;;;;;;:20;;;;;28645:22;;28690:20;;;;;;;:18;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;28690:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28690:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28690:20:0;28678:9;:32;;;28726:27;;;;;;;28795:6;:14;;;;;;28834:6;;28825:16;;28834:6;;;;;28825:16;;28804:5;;28825:16;28854:8;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28854:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28938:36:0;;;;;;28968:4;28938:36;;;;;;:21;;;;-1:-1:-1;28938:21:0;;-1:-1:-1;28938:36:0;;;;;-1:-1:-1;;28938:36:0;;;;;;;-1:-1:-1;28938:21:0;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;28938:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28938:36:0;;;;28985:8;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28985:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29012:46:0;;;;;;29052:4;29012:46;;;;;;:31;;;;-1:-1:-1;29012:31:0;;-1:-1:-1;29012:46:0;;;;;-1:-1:-1;;29012:46:0;;;;;;;-1:-1:-1;29012:31:0;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;29012:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29110:33:0;;;;;;29140:1;29110:33;;;;;;;;:21;;;;-1:-1:-1;29110:21:0;;-1:-1:-1;29110:33:0;;;;;29140:1;29110:33;;;;;29140:1;29110:21;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29110:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;29154:33:0;;;;;;29184:1;29154:33;;;;;;;;:21;;;;-1:-1:-1;29154:21:0;;-1:-1:-1;29154:33:0;;;;;29184:1;29154:33;;;;;29184:1;29154:21;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;29154:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29154:33:0;;;;29198:8;:26;;;:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29198:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29198:83:0;;;;11231:1;28280:1009;:::o;16544:24::-;;;;:::o;21407:146::-;21509:11;;:36;;;;;;:11;:36;;;;;;;;;;;;;;;;21482:7;;21509:11;;;;;:19;;:36;;;;;;;;;;;;;;;:11;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;21509:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21509:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21509:36:0;;21407:146;-1:-1:-1;;;21407:146:0:o;25747:241::-;21015:6;;25904:4;;21015:6;;21014:7;21006:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25870:14;;;;18310:10;:18;;18302:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25926:32;25935:6;25943:7;25952:5;25926:8;:32::i;18042:113::-;18135:11;;;;18042:113;:::o;27766:338::-;27860:21;;;27852:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27935:20;;;27927:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28002:11;;:46;;;;;;:11;:46;;;;;;;;;;;;;;;;;;;;;;:11;;;;;:22;;:46;;;;;:11;;:46;;;;;;;:11;;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;28002:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28064:32:0;;;;;;;;;;;;;-1:-1:-1;28064:32:0;;;-1:-1:-1;28064:32:0;;;;;;;;;27766:338;;;:::o;26601:632::-;26689:16;;;26681:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26751:11;;:35;;;;;;:11;:35;;;;;;;;;;;;;;;:11;;;;;:22;;:35;;;;;:11;;:35;;;;;;;:11;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;26751:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;26837:12:0;;26797:11;;-1:-1:-1;26829:35:0;26837:12;26829:35;;-1:-1:-1;26825:296:0;;26887:12;;:42;;;;;;:12;:42;;;;;;;;;;;;;;;;;;;;;;:12;;;;;:25;;:42;;;;;;;;;;;;;;:12;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;26887:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26887:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26887:42:0;;-1:-1:-1;26952:12:0;;;;26944:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27015:11;;27038:12;;27015:41;;;;;;:11;27038:12;;;27015:41;;;;;;;;;;;;:11;;;;;:22;;:41;;;;;:11;;:41;;;;;;;:11;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;27015:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27091:12:0;;27076:33;;;;;;;;27091:12;;;;;-1:-1:-1;27076:33:0;;;;-1:-1:-1;27076:33:0;;;;;;;;;;26825:296;27133:11;;;;:22;27156:2;27160:14;:5;27170:3;27160:14;:9;:14;:::i;:::-;27133:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27133:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;27191:34:0;;;;;-1:-1:-1;27191:34:0;;;27210:14;:5;27220:3;27210:9;:14::i;:::-;27191:34;;;;;;;;;;;;;;;26601:632;;;;:::o;11248:109::-;11319:6;;;;11303:12;:10;:12::i;:::-;:22;;;11295:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11248:109::o;4110:136::-;4168:7;4195:43;4199:1;4202;4195:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4188:50;4110:136;-1:-1:-1;;;4110:136:0:o;3654:181::-;3712:7;3744:5;;;3768:6;;;;3760:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9363:98;9443:10;9363:98;:::o;27341:287::-;27416:21;;;27408:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27497:11;;:22;;27513:5;27497:22;:15;:22;:::i;:::-;27483:11;:36;27530:11;;:38;;;;;;:11;:38;;;;;;;;;;;;;;;:11;;;;;:22;;:38;;;;;:11;;:38;;;;;;;:11;;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;27530:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;27584:36:0;;;;;;;;27610:1;;-1:-1:-1;27584:36:0;;;;-1:-1:-1;27584:36:0;;;;;;;;;27341:287;;:::o;4696:192::-;4782:7;4818:12;4810:6;;;;4802:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4802:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4854:5:0;;;4696:192::o

Swarm Source

bzzr://ff21448e107a290591da2fb4a5c38e03f84252d226792d92dae425cf027694d9
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.