ETH Price: $1,975.07 (+0.72%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Unit Cap244397872026-02-12 9:25:359 days ago1770888335IN
BFH: Sphere
0 ETH0.000005420.06835982
Set Unit Cap244394392026-02-12 8:15:359 days ago1770884135IN
BFH: Sphere
0 ETH0.000006270.07918028
Set Unit Cap244392922026-02-12 7:45:599 days ago1770882359IN
BFH: Sphere
0 ETH0.000011630.14666355
Set Unit Cap244391182026-02-12 7:11:119 days ago1770880271IN
BFH: Sphere
0 ETH0.000005490.06924273
Approve241355332025-12-31 22:15:3552 days ago1767219335IN
BFH: Sphere
0 ETH0.000098652.03082565
Approve241355322025-12-31 22:15:2352 days ago1767219323IN
BFH: Sphere
0 ETH0.000098542.02863395
Transfer Ownersh...240435452025-12-19 2:04:1165 days ago1766109851IN
BFH: Sphere
0 ETH0.000062582.02875448
Add Minter240435402025-12-19 2:03:1165 days ago1766109791IN
BFH: Sphere
0 ETH0.000096422.02407198
Set Unit Cap240379642025-12-18 7:21:1165 days ago1766042471IN
BFH: Sphere
0 ETH0.000002470.0312222
Set Unit Cap240378882025-12-18 7:05:5965 days ago1766041559IN
BFH: Sphere
0 ETH0.000002420.03062828
Set Unit Cap240376372025-12-18 6:15:4766 days ago1766038547IN
BFH: Sphere
0 ETH0.000002160.02726805
Set Unit Cap240375992025-12-18 6:07:4766 days ago1766038067IN
BFH: Sphere
0 ETH0.000002250.02845541
Set Unit Cap240374392025-12-18 5:35:4766 days ago1766036147IN
BFH: Sphere
0 ETH0.000002280.0288031
Set Unit Cap239915942025-12-11 19:42:4772 days ago1765482167IN
BFH: Sphere
0 ETH0.000011650.14688907
Set Unit Cap239911192025-12-11 18:06:5972 days ago1765476419IN
BFH: Sphere
0 ETH0.000010030.1264483
Set Unit Cap239910152025-12-11 17:46:1172 days ago1765475171IN
BFH: Sphere
0 ETH0.000010970.13835505
Set Unit Cap239910092025-12-11 17:44:4772 days ago1765475087IN
BFH: Sphere
0 ETH0.000009080.11453473
Set Unit Cap239909272025-12-11 17:28:1172 days ago1765474091IN
BFH: Sphere
0 ETH0.000011570.1459815
Set Unit Cap239908942025-12-11 17:21:2372 days ago1765473683IN
BFH: Sphere
0 ETH0.000010360.13064603
Set Unit Cap239908802025-12-11 17:18:3572 days ago1765473515IN
BFH: Sphere
0 ETH0.000011240.14171827
Set Unit Cap239907192025-12-11 16:45:5972 days ago1765471559IN
BFH: Sphere
0 ETH0.000009820.12393307
Set Unit Cap239906892025-12-11 16:39:5972 days ago1765471199IN
BFH: Sphere
0 ETH0.000011150.14057888
Set Unit Cap239906612025-12-11 16:34:1172 days ago1765470851IN
BFH: Sphere
0 ETH0.000011480.14474798
Set Unit Cap239906462025-12-11 16:31:1172 days ago1765470671IN
BFH: Sphere
0 ETH0.000010380.13088164
Set Unit Cap239906282025-12-11 16:27:3572 days ago1765470455IN
BFH: Sphere
0 ETH0.000011530.14538712
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BFHSphere

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-01-21
*/

pragma solidity 0.5.12;

// Copyright (c) 2018-2020 double jump.tokyo inc.

interface IApprovalProxy {
  function setApprovalForAll(address _owner, address _spender, bool _approved) external;
  function isApprovedForAll(address _owner, address _spender, bool _original) external view returns (bool);
}
library Address {

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    function toHex(address account) internal pure returns (string memory) {
        bytes32 value = bytes32(uint256(account));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }
}
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    function add(Role storage role, address account) internal {
        require(!has(role, account), "role already has the account");
        role.bearer[account] = true;
    }

    function remove(Role storage role, address account) internal {
        require(has(role, account), "role dosen't have the account");
        role.bearer[account] = false;
    }

    function has(Role storage role, address account) internal view returns (bool) {
        return role.bearer[account];
    }
}

library Uint256 {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(a >= b, "subtraction overflow");
        return a - b;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "division by 0");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "modulo by 0");
        return a % b;
    }

    function toString(uint256 a) internal pure returns (string memory) {
        bytes32 retBytes32;
        uint256 len = 0;
        if (a == 0) {
            retBytes32 = "0";
            len++;
        } else {
            uint256 value = a;
            while (value > 0) {
                retBytes32 = bytes32(uint256(retBytes32) / (2 ** 8));
                retBytes32 |= bytes32(((value % 10) + 48) * 2 ** (8 * 31));
                value /= 10;
                len++;
            }
        }

        bytes memory ret = new bytes(len);
        uint256 i;

        for (i = 0; i < len; i++) {
            ret[i] = retBytes32[i];
        }
        return string(ret);
    }
}

interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes calldata _data
    )
        external
        returns(bytes4);
}

interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string memory _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/// @title ERC-165 Standard Interface Detection
/// @dev See https://eips.ethereum.org/EIPS/eip-165
contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

interface IERC721 /* is ERC165 */ {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function balanceOf(address _owner) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

library Uint32 {

    function add(uint32 a, uint32 b) internal pure returns (uint32) {
        uint32 c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub(uint32 a, uint32 b) internal pure returns (uint32) {
        require(a >= b, "subtraction overflow");
        return a - b;
    }

    function mul(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) {
            return 0;
        }
        uint32 c = a * b;
        require(c / a == b, "multiplication overflow");
        return c;
    }

    function div(uint32 a, uint32 b) internal pure returns (uint32) {
        require(b != 0, "division by 0");
        return a / b;
    }

    function mod(uint32 a, uint32 b) internal pure returns (uint32) {
        require(b != 0, "modulo by 0");
        return a % b;
    }

}

library String {

    function compare(string memory _a, string memory _b) public pure returns (bool) {
        return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));
    }

    function cut(string memory _s, uint256 _from, uint256 _range) public pure returns (string memory) {
        bytes memory s = bytes(_s);
        require(s.length >= _from + _range, "_s length must be longer than _from + _range");
        bytes memory ret = new bytes(_range);

        for (uint256 i = 0; i < _range; i++) {
            ret[i] = s[_from+i];
        }
        return string(ret);
    }

    function concat(string memory _a, string memory _b) internal pure returns (string memory) {
        return string(abi.encodePacked(_a, _b));
    }
}

contract ERC721 is IERC721, ERC165 {
    using Uint256 for uint256;
    using Address for address;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;

    mapping (uint256 => address) private _tokenOwner;
    mapping (address => uint256) private _balance;
    mapping (uint256 => address) private _tokenApproved;
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    constructor () public {
        _registerInterface(_InterfaceId_ERC721);
    }

    function balanceOf(address _owner) public view returns (uint256) {
        return _balance[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address) {
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        return _tokenOwner[_tokenId];
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public payable {
        require(_data.length == 0, "data is not implemented");
        safeTransferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable {
        require(_checkOnERC721Received(_from, _to, _tokenId, ""),
                "`_to` is a smart contract and onERC721Received is invalid");
        transferFrom(_from, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public payable {
        require(_transferable(msg.sender, _tokenId),
                "Unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT."); // solhint-disable-line
        require(ownerOf(_tokenId) == _from,
                "`_from` is not the current owner.");
        require(_to != address(0),
                "`_to` is the zero address.");
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        _transfer(_from, _to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) public payable {
        address owner = ownerOf(_tokenId);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
                "Unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.");

        _tokenApproved[_tokenId] = _approved;
        emit Approval(msg.sender, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) public {
        _setApprovalForAll(msg.sender, _operator, _approved);
    }

    function _setApprovalForAll(address _owner, address _operator, bool _approved) internal {
        _operatorApprovals[_owner][_operator] = _approved;
        emit ApprovalForAll(_owner, _operator, _approved);
    }

    function getApproved(uint256 _tokenId) public view returns (address) {
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        return _tokenApproved[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
        return _isApprovedForAll(_owner, _operator);
    }
    
    function _isApprovedForAll(address _owner, address _operator) internal view returns (bool) {
        return _operatorApprovals[_owner][_operator];
    }

    function _transferable(address _spender, uint256 _tokenId) internal view returns (bool){
        address owner = ownerOf(_tokenId);
        return (_spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender));
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        _clearApproval(_tokenId);
        _tokenOwner[_tokenId] = _to;
        _balance[_from] = _balance[_from].sub(1);
        _balance[_to] = _balance[_to].add(1);
        emit Transfer(_from, _to, _tokenId);
    }
  
    function _mint(address _to, uint256 _tokenId) internal {
        require(!_exist(_tokenId), "mint token already exists");
        _tokenOwner[_tokenId] = _to;
        _balance[_to] = _balance[_to].add(1);
        emit Transfer(address(0), _to, _tokenId);
    }
  
    function _burn(uint256 _tokenId) internal {
        require(_exist(_tokenId), "burn token does not already exists");
        address owner = ownerOf(_tokenId);
        _clearApproval(_tokenId);
        _tokenOwner[_tokenId] = address(0);
        _balance[owner] = _balance[owner].sub(1);
        emit Transfer(owner, address(0), _tokenId);
    }

    function _exist(uint256 _tokenId) internal view returns (bool) {
        address owner = _tokenOwner[_tokenId];
        return owner != address(0);
    }

    function _checkOnERC721Received(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) 
        internal
        returns (bool) 
    {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    function _clearApproval(uint256 tokenId) internal {
        if (_tokenApproved[tokenId] != address(0)) {
            _tokenApproved[tokenId] = address(0);
        }
    }
}

interface IERC173 /* is ERC165 */ {
    /// @dev This emits when ownership of a contract changes.
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice Get the address of the owner
    /// @return The address of the owner.
    function owner() external view returns (address);

    /// @notice Set the address of the new owner of the contract
    /// @param _newOwner The address of the new owner of the contract
    function transferOwnership(address _newOwner) external;
}

contract ERC173 is IERC173, ERC165  {
    address private _owner;

    constructor() public {
        _registerInterface(0x7f5828d0);
        _transferOwnership(msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner(), "Must be owner");
        _;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address _newOwner) public onlyOwner() {
        _transferOwnership(_newOwner);
    }

    function _transferOwnership(address _newOwner) internal {
        address previousOwner = owner();
	_owner = _newOwner;
        emit OwnershipTransferred(previousOwner, _newOwner);
    }
}

contract Operatable is ERC173 {
    using Roles for Roles.Role;

    event OperatorAdded(address indexed account);
    event OperatorRemoved(address indexed account);

    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;
    Roles.Role private operators;

    constructor() public {
        operators.add(msg.sender);
        _paused = false;
    }

    modifier onlyOperator() {
        require(isOperator(msg.sender), "Must be operator");
        _;
    }

    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    function transferOwnership(address _newOwner) public onlyOperator() {
        _transferOwnership(_newOwner);
    }

    function isOperator(address account) public view returns (bool) {
        return operators.has(account);
    }

    function addOperator(address account) public onlyOperator() {
        operators.add(account);
        emit OperatorAdded(account);
    }

    function removeOperator(address account) public onlyOperator() {
        operators.remove(account);
        emit OperatorRemoved(account);
    }

    function paused() public view returns (bool) {
        return _paused;
    }

    function pause() public onlyOperator() whenNotPaused() {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyOperator() whenPaused() {
        _paused = false;
        emit Unpaused(msg.sender);
    }

    function withdrawEther() public onlyOperator() {
        msg.sender.transfer(address(this).balance);
    }

}

interface IERC721Mintable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);
    function exist(uint256 _tokenId) external view returns (bool);
    function mint(address _to, uint256 _tokenId) external;
    function isMinter(address account) external view returns (bool);
    function addMinter(address account) external;
    function removeMinter(address account) external;
}

contract ERC721Mintable is ERC721, IERC721Mintable, Operatable {
    using Roles for Roles.Role;
    Roles.Role private minters;

    constructor() public {
        addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(isMinter(msg.sender), "Must be minter");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return minters.has(account);
    }

    function addMinter(address account) public onlyOperator() {
        minters.add(account);
        emit MinterAdded(account);
    }

    function removeMinter(address account) public onlyOperator() {
        minters.remove(account);
        emit MinterRemoved(account);
    }
    
    function exist(uint256 tokenId) public view returns (bool) {
        return _exist(tokenId);
    }

    function mint(address to, uint256 tokenId) public onlyMinter() {
        _mint(to, tokenId);
    }
}
contract ERC721Metadata is IERC721Metadata, ERC721, Operatable {
    using Uint256 for uint256;
    using String for string;

    event UpdateTokenURIPrefix(
        string tokenUriPrefix
    );

    // Metadata
    string private __name;
    string private __symbol;
    string private __tokenUriPrefix;

    constructor(string memory _name,
                string memory _symbol,
                string memory _tokenUriPrefix) public {
        // ERC721Metadata
        __name = _name;
        __symbol = _symbol;
        setTokenURIPrefix(_tokenUriPrefix);
    }

    function setTokenURIPrefix(string memory _tokenUriPrefix) public onlyOperator() {
        __tokenUriPrefix = _tokenUriPrefix;
        emit UpdateTokenURIPrefix(_tokenUriPrefix);
    }

    function name() public view returns (string memory) {
        return __name;
    }

    function symbol() public view returns (string memory) {
        return __symbol;
    }

    function tokenURI(uint256 _tokenId) public view returns (string memory) {
        return __tokenUriPrefix.concat(_tokenId.toString());
    }
}

contract ERC721TokenPausable is ERC721,Operatable {
    using Roles for Roles.Role;
    Roles.Role private tokenPauser;

    event TokenPauserAdded(address indexed account);
    event TokenPauserRemoved(address indexed account);

    event TokenPaused(uint256 indexed tokenId);
    event TokenUnpaused(uint256 indexed tokenId);

    mapping (uint256 => bool) private _tokenPaused;

    constructor() public {
        tokenPauser.add(msg.sender);
    }

    modifier onlyTokenPauser() {
        require(isTokenPauser(msg.sender), "Only token pauser can call this method");
        _;
    }

    modifier whenNotTokenPaused(uint256 _tokenId) {
        require(!isTokenPaused(_tokenId), "TokenPausable: paused");
        _;
    }

    modifier whenTokenPaused(uint256 _tokenId) {
        require(isTokenPaused(_tokenId), "TokenPausable: not paused");
        _;
    }

    function pauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(!isTokenPaused(_tokenId), "Token is already paused");
        _tokenPaused[_tokenId] = true;
        emit TokenPaused(_tokenId);
    }

    function unpauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(isTokenPaused(_tokenId), "Token is not paused");
        _tokenPaused[_tokenId] = false;
        emit TokenUnpaused(_tokenId);
    }

    function isTokenPaused(uint256 _tokenId) public view returns (bool) {
        return _tokenPaused[_tokenId];
    }

    function isTokenPauser(address account) public view returns (bool) {
        return tokenPauser.has(account);
    }

    function addTokenPauser(address account) public onlyOperator() {
        tokenPauser.add(account);
        emit TokenPauserAdded(account);
    }

    function removeTokenPauser(address account) public onlyOperator() {
        tokenPauser.remove(account);
        emit TokenPauserRemoved(account);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.safeTransferFrom(_from, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.transferFrom(_from, _to, _tokenId);
    }
}

interface IERC721CappedSupply /* IERC721Mintable, IERC721 */ {
    event SetUnitCap(uint32 _assetType, uint32 _unitCap);
    event SetTypeCap(uint256 _typeCap);
    function totalSupply() external view returns (uint256);
    function getTypeOffset() external view returns (uint256);
    function getTypeCap() external view returns (uint256);
    function setTypeCap(uint32 _newTypeCap) external;
    function getTypeCount() external view returns (uint256);
    function existingType(uint32 _assetType) external view returns (bool);
    function getUnitCap(uint32 _assetType) external view returns (uint32);
    function setUnitCap(uint32 _assetType, uint32 _newUnitCap) external;
    function mint(address _to, uint256 _tokenId) external;
}

/// @title ERC-721 Capped Supply
/// @author double jump.tokyo inc.
/// @dev see https://medium.com/@makzent/ca1008866871
contract ERC721CappedSupply is IERC721CappedSupply, ERC721Mintable {
    using Uint256 for uint256;
    using Uint32 for uint32;

    uint32 private assetTypeOffset;
    mapping(uint32 => uint32) private unitCap;
    mapping(uint32 => uint32) private unitCount;
    mapping(uint32 => bool) private unitCapIsSet;
    uint256 private assetTypeCap = 2**256-1;
    uint256 private assetTypeCount = 0;
    uint256 private totalCount = 0;

    constructor(uint32 _assetTypeOffset) public {
        setTypeOffset(_assetTypeOffset);
    }

    function isValidOffset(uint32 _offset) private pure returns (bool) {
        for (uint32 i = _offset; i > 0; i = i.div(10)) {
            if (i == 10) {
                return true;
            }
            if (i.mod(10) != 0) {
                return false;
            }
        }
        return false;
    }

    function totalSupply() public view returns (uint256) {
        return totalCount;
    }

    function setTypeOffset(uint32 _assetTypeOffset) private {
        require(isValidOffset(_assetTypeOffset),  "Offset is invalid");
        assetTypeCap = assetTypeCap / _assetTypeOffset;
        assetTypeOffset = _assetTypeOffset;
    }

    function getTypeOffset() public view returns (uint256) {
        return assetTypeOffset;
    }

    function setTypeCap(uint32 _newTypeCap) public onlyMinter() {
        require(_newTypeCap < assetTypeCap, "New type cap cannot be less than existing type cap");
        require(_newTypeCap >= assetTypeCount, "New type cap must be more than current type count");
        assetTypeCap = _newTypeCap;
        emit SetTypeCap(_newTypeCap);
    }

    function getTypeCap() public view returns (uint256) {
        return assetTypeCap;
    }

    function getTypeCount() public view returns (uint256) {
        return assetTypeCount;
    }

    function existingType(uint32 _assetType) public view returns (bool) {
        return unitCapIsSet[_assetType];
    }

    function setUnitCap(uint32 _assetType, uint32 _newUnitCap) public onlyMinter() {
        require(_assetType != 0, "Asset Type must not be 0");
        require(_newUnitCap < assetTypeOffset, "New unit cap must be less than asset type offset");

        if (!existingType(_assetType)) {
            unitCapIsSet[_assetType] = true;
            assetTypeCount = assetTypeCount.add(1);
            require(assetTypeCount <= assetTypeCap, "Asset type cap is exceeded");
        } else {
            require(_newUnitCap < getUnitCap(_assetType), "New unit cap must be less than previous unit cap");
            require(_newUnitCap >= getUnitCount(_assetType), "New unit cap must be more than current unit count");
        }

        unitCap[_assetType] = _newUnitCap;
        emit SetUnitCap(_assetType, _newUnitCap);
    }

    function getUnitCap(uint32 _assetType) public view returns (uint32) {
        require(existingType(_assetType), "Asset type does not exist");
        return unitCap[_assetType];
    }

    function getUnitCount(uint32 _assetType) public view returns (uint32) {
        return unitCount[_assetType];
    }

    function mint(address _to, uint256 _tokenId) public onlyMinter() {
        require(_tokenId.mod(assetTypeOffset) != 0, "Index must not be 0");
        uint32 assetType = uint32(_tokenId.div(assetTypeOffset));
        unitCount[assetType] = unitCount[assetType].add(1);
        totalCount = totalCount.add(1);
        require(unitCount[assetType] <= getUnitCap(assetType), "Asset unit cap is exceed");
        super.mint(_to, _tokenId);
    }
}

contract BFHSphere is
                    ERC721TokenPausable,
                    ERC721CappedSupply(10000),
                    ERC721Metadata("BFH:Sphere", "BFHS", "https://bravefrontierheroes.com/metadata/spheres/")
                    {

    event UpdateApprovalProxy(address _newProxyContract);
    IApprovalProxy public approvalProxy;
    constructor(address _approvalProxy) public {
        setApprovalProxy(_approvalProxy);
    }

    function setApprovalProxy(address _new) public onlyOperator() {
        approvalProxy = IApprovalProxy(_new);
        emit UpdateApprovalProxy(_new);
    }

    function setApprovalForAll(address _spender, bool _approved) public {
        if (address(approvalProxy) != address(0x0) && _spender.isContract()) {
            approvalProxy.setApprovalForAll(msg.sender, _spender, _approved);
        }
        super.setApprovalForAll(_spender, _approved);
    }

    function isApprovedForAll(address _owner, address _spender) public view returns (bool) {
        bool original = super.isApprovedForAll(_owner, _spender);
        if (address(approvalProxy) != address(0x0)) {
            return approvalProxy.isApprovedForAll(_owner, _spender, original);
        }
        return original;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_approvalProxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_typeCap","type":"uint256"}],"name":"SetTypeCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_assetType","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_unitCap","type":"uint32"}],"name":"SetUnitCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newProxyContract","type":"address"}],"name":"UpdateApprovalProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenUriPrefix","type":"string"}],"name":"UpdateTokenURIPrefix","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addTokenPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"approvalProxy","outputs":[{"internalType":"contract IApprovalProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"existingType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"getUnitCap","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"getUnitCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isTokenPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTokenPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pauseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeTokenPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setApprovalProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_tokenUriPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_newTypeCap","type":"uint32"}],"name":"setTypeCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"},{"internalType":"uint32","name":"_newUnitCap","type":"uint32"}],"name":"setUnitCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unpauseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600019600e556000600f5560006010553480156200002157600080fd5b5060405162003cd938038062003cd9833981810160405260208110156200004757600080fd5b5051604080518082018252600a81527f4246483a5370686572650000000000000000000000000000000000000000000060208281019190915282518084018452600481527f424648530000000000000000000000000000000000000000000000000000000081830152835160608101909452603180855292939092909162003ca890830139612710620001037f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b620001377f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b6200016b7f7f5828d0000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b6200017f336001600160e01b036200031316565b6200019a3360066200037c60201b620027131790919060201c565b6005805460ff60a01b19169055620001c06007336200037c602090811b6200271317901c565b620001d4336001600160e01b036200042316565b620001e8816001600160e01b03620004f516565b508251620001fe906011906020860190620009c0565b50815162000214906012906020850190620009c0565b5062000229816001600160e01b03620005a716565b5050506200023d81620006dc60201b60201c565b5062000a62565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620002d657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b6000620003286001600160e01b03620007b016565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200039182826001600160e01b03620007c016565b15620003fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b62000437336001600160e01b03620007df16565b620004a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b620004be8160096200037c60201b620027131790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b62000509816001600160e01b036200080416565b6200057557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f666673657420697320696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b8063ffffffff16600e54816200058757fe5b04600e55600a805463ffffffff191663ffffffff92909216919091179055565b620005bb336001600160e01b03620007df16565b6200062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b80516200063c906013906020840190620009c0565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156200069e57818101518382015260200162000684565b50505050905090810190601f168015620006cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b620006f0336001600160e01b03620007df16565b6200075c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6005546001600160a01b03165b90565b6001600160a01b03166000908152602091909152604090205460ff1690565b6000620007fc826006620007c060201b620026f41790919060201c565b90505b919050565b6000815b63ffffffff81161562000891578063ffffffff16600a141562000830576001915050620007ff565b62000851600a8263ffffffff166200089a60201b62002f0d1790919060201c565b63ffffffff161562000868576000915050620007ff565b62000889600a8263ffffffff166200092d60201b62002f6a1790919060201c565b905062000808565b50600092915050565b600063ffffffff82166200090f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6d6f64756c6f2062792030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8163ffffffff168363ffffffff16816200092557fe5b069392505050565b600063ffffffff8216620009a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6469766973696f6e206279203000000000000000000000000000000000000000604482015290519081900360640190fd5b8163ffffffff168363ffffffff1681620009b857fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a0357805160ff191683800117855562000a33565b8280016001018555821562000a33579182015b8281111562000a3357825182559160200191906001019062000a16565b5062000a4192915062000a45565b5090565b620007bd91905b8082111562000a41576000815560010162000a4c565b6132368062000a726000396000f3fe6080604052600436106102725760003560e01c8063776ab6341161014f578063ac8a584a116100c1578063ca1728fd1161007a578063ca1728fd14610a8e578063d644736814610ac6578063e985e9c514610af0578063ed841bf114610b2b578063f2fde38b14610b5e578063fbd395f814610b9157610272565b8063ac8a584a146108f3578063b88d4fde14610926578063b97d7895146109ec578063c000582714610a1c578063c2508c4614610a31578063c87b56dd14610a6457610272565b8063983b2d5611610113578063983b2d56146107395780639870d7fe1461076c57806399e0dd7c1461079f5780639bb5c9c314610852578063a22cb46514610885578063aa271e1a146108c057610272565b8063776ab634146106bb5780637d02b1a3146106e55780638456cb59146106fa5780638da5cb5b1461070f57806395d89b411461072457610272565b80634dd09f33116101e85780636352211e116101ac5780636352211e146105b35780636d70f7ae146105dd57806370a08231146106105780637362377b14610643578063739f66871461065857806374db07d81461068857610272565b80634dd09f33146104e65780634ebbc92a146104fb578063532efe60146105255780635c975abb1461056e57806362977e2c1461058357610272565b806323b872dd1161023a57806323b872dd146103e45780632cff5b391461041a5780633092afd51461042f5780633f4ba83a1461046257806340c10f191461047757806342842e0e146104b057610272565b806301ffc9a71461027757806306fdde03146102bf578063081812fc14610349578063095ea7b31461038f57806318160ddd146103bd575b600080fd5b34801561028357600080fd5b506102ab6004803603602081101561029a57600080fd5b50356001600160e01b031916610bbb565b604080519115158252519081900360200190f35b3480156102cb57600080fd5b506102d4610bda565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103736004803603602081101561036c57600080fd5b5035610c71565b604080516001600160a01b039092168252519081900360200190f35b6103bb600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610ce9565b005b3480156103c957600080fd5b506103d2610da7565b60408051918252519081900360200190f35b6103bb600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610dad565b34801561042657600080fd5b506103d2610e64565b34801561043b57600080fd5b506103bb6004803603602081101561045257600080fd5b50356001600160a01b0316610e6a565b34801561046e57600080fd5b506103bb610eff565b34801561048357600080fd5b506103bb6004803603604081101561049a57600080fd5b506001600160a01b038135169060200135610fe3565b6103bb600480360360608110156104c657600080fd5b506001600160a01b03813581169160208101359091169060400135611195565b3480156104f257600080fd5b50610373611246565b34801561050757600080fd5b506102ab6004803603602081101561051e57600080fd5b5035611255565b34801561053157600080fd5b506105556004803603602081101561054857600080fd5b503563ffffffff16611266565b6040805163ffffffff9092168252519081900360200190f35b34801561057a57600080fd5b506102ab611281565b34801561058f57600080fd5b506103bb600480360360208110156105a657600080fd5b503563ffffffff16611291565b3480156105bf57600080fd5b50610373600480360360208110156105d657600080fd5b50356113aa565b3480156105e957600080fd5b506102ab6004803603602081101561060057600080fd5b50356001600160a01b0316611422565b34801561061c57600080fd5b506103d26004803603602081101561063357600080fd5b50356001600160a01b0316611435565b34801561064f57600080fd5b506103bb611450565b34801561066457600080fd5b506105556004803603602081101561067b57600080fd5b503563ffffffff166114cd565b34801561069457600080fd5b506103bb600480360360208110156106ab57600080fd5b50356001600160a01b0316611545565b3480156106c757600080fd5b506103bb600480360360208110156106de57600080fd5b50356115da565b3480156106f157600080fd5b506103d26116ae565b34801561070657600080fd5b506103bb6116b4565b34801561071b57600080fd5b5061037361179b565b34801561073057600080fd5b506102d46117aa565b34801561074557600080fd5b506103bb6004803603602081101561075c57600080fd5b50356001600160a01b031661180b565b34801561077857600080fd5b506103bb6004803603602081101561078f57600080fd5b50356001600160a01b03166118a0565b3480156107ab57600080fd5b506103bb600480360360208110156107c257600080fd5b8101906020810181356401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611935945050505050565b34801561085e57600080fd5b506103bb6004803603602081101561087557600080fd5b50356001600160a01b0316611a32565b34801561089157600080fd5b506103bb600480360360408110156108a857600080fd5b506001600160a01b0381351690602001351515611ad3565b3480156108cc57600080fd5b506102ab600480360360208110156108e357600080fd5b50356001600160a01b0316611b82565b3480156108ff57600080fd5b506103bb6004803603602081101561091657600080fd5b50356001600160a01b0316611b95565b6103bb6004803603608081101561093c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111640100000000831117156109ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c2a945050505050565b3480156109f857600080fd5b506102ab60048036036020811015610a0f57600080fd5b503563ffffffff16611ce3565b348015610a2857600080fd5b506103d2611cfe565b348015610a3d57600080fd5b506103bb60048036036020811015610a5457600080fd5b50356001600160a01b0316611d0a565b348015610a7057600080fd5b506102d460048036036020811015610a8757600080fd5b5035611d9f565b348015610a9a57600080fd5b506103bb60048036036040811015610ab157600080fd5b5063ffffffff81358116916020013516611e46565b348015610ad257600080fd5b506102ab60048036036020811015610ae957600080fd5b50356120e0565b348015610afc57600080fd5b506102ab60048036036040811015610b1357600080fd5b506001600160a01b03813581169160200135166120f5565b348015610b3757600080fd5b506102ab60048036036020811015610b4e57600080fd5b50356001600160a01b03166121af565b348015610b6a57600080fd5b506103bb60048036036020811015610b8157600080fd5b50356001600160a01b03166121c2565b348015610b9d57600080fd5b506103bb60048036036020811015610bb457600080fd5b5035612218565b6001600160e01b03191660009081526020819052604090205460ff1690565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505090505b90565b6000610c7c826122fa565b610ccd576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600360205260409020546001600160a01b031690565b6000610cf4826113aa565b9050336001600160a01b0382161480610d125750610d1281336120f5565b610d4d5760405162461bcd60e51b815260040180806020018281038252605d8152602001806130fb605d913960600191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60105490565b600554600160a01b900460ff1615610dff576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b80610e09816120e0565b15610e53576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612317565b50505050565b600e5490565b610e7333611422565b610eb7576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b610ec860098263ffffffff61247416565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610f0833611422565b610f4c576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff16610fa1576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff60a01b191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b610fec33611b82565b61102e576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600a5461104690829063ffffffff908116906124f116565b61108d576040805162461bcd60e51b81526020600482015260136024820152720496e646578206d757374206e6f74206265203606c1b604482015290519081900360640190fd5b600a546000906110a890839063ffffffff9081169061254416565b63ffffffff8082166000908152600c60205260409020549192506110d29181169060019061259916565b63ffffffff8281166000908152600c60205260409020805463ffffffff19169282169290921790915560105461110b916001906125f016565b601055611117816114cd565b63ffffffff8281166000908152600c602052604090205491811691161115611186576040805162461bcd60e51b815260206004820152601860248201527f417373657420756e697420636170206973206578636565640000000000000000604482015290519081900360640190fd5b611190838361263e565b505050565b600554600160a01b900460ff16156111e7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b806111f1816120e0565b1561123b576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612693565b6014546001600160a01b031681565b6000611260826122fa565b92915050565b63ffffffff9081166000908152600c60205260409020541690565b600554600160a01b900460ff1690565b61129a33611b82565b6112dc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600e548163ffffffff16106113225760405162461bcd60e51b81526004018080602001828103825260328152602001806131796032913960400191505060405180910390fd5b600f548163ffffffff1610156113695760405162461bcd60e51b81526004018080602001828103825260318152602001806131ab6031913960400191505060405180910390fd5b63ffffffff8116600e81905560408051918252517fcffe07c9e7982b6c56cb569d21caedd78c8fbc68a0cbdc4d963c21eae6e8f9109181900360200190a150565b60006113b5826122fa565b611406576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600160205260409020546001600160a01b031690565b600061126060068363ffffffff6126f416565b6001600160a01b031660009081526002602052604090205490565b61145933611422565b61149d576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f193505050501580156114ca573d6000803e3d6000fd5b50565b60006114d882611ce3565b611529576040805162461bcd60e51b815260206004820152601960248201527f4173736574207479706520646f6573206e6f7420657869737400000000000000604482015290519081900360640190fd5b5063ffffffff9081166000908152600b60205260409020541690565b61154e33611422565b611592576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6115a360078263ffffffff61271316565b6040516001600160a01b038216907fff12d576e2fecf516eb406e6618d5e97bcc8046690863b984069b15ada11d61290600090a250565b6115e3336121af565b61161e5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b611627816120e0565b61166e576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b881a5cc81b9bdd081c185d5cd959606a1b604482015290519081900360640190fd5b600081815260086020526040808220805460ff191690555182917f0cfa9cc56bacd896c88effb6a4051b954fcaaf2de7ae98882e39f294ea65184391a250565b600f5490565b6116bd33611422565b611701576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff1615611753576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff60a01b1916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6005546001600160a01b031690565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b61181433611422565b611858576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b61186960098263ffffffff61271316565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6118a933611422565b6118ed576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6118fe60068263ffffffff61271316565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b61193e33611422565b611982576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b8051611995906013906020840190612e75565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156119f55781810151838201526020016119dd565b50505050905090810190601f168015611a225780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611a3b33611422565b611a7f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6014546001600160a01b031615801590611afa5750611afa826001600160a01b0316612794565b15611b745760145460408051631b3b02e560e11b81523360048201526001600160a01b03858116602483015284151560448301529151919092169163367605ca91606480830192600092919082900301818387803b158015611b5b57600080fd5b505af1158015611b6f573d6000803e3d6000fd5b505050505b611b7e828261279a565b5050565b600061126060098363ffffffff6126f416565b611b9e33611422565b611be2576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611bf360068263ffffffff61247416565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b600554600160a01b900460ff1615611c7c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b81611c86816120e0565b15611cd0576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b611cdc858585856127a5565b5050505050565b63ffffffff166000908152600d602052604090205460ff1690565b600a5463ffffffff1690565b611d1333611422565b611d57576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611d6860078263ffffffff61247416565b6040516001600160a01b038216907f2186c7d8e4b2d6a73790355b1a465872175798d2366146e638fc885d54460b8590600090a250565b6060611260611dad83612804565b6013805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611e335780601f10611e0857610100808354040283529160200191611e33565b820191906000526020600020905b815481529060010190602001808311611e1657829003601f168201915b50505050506128d990919063ffffffff16565b611e4f33611b82565b611e91576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b63ffffffff8216611ee9576040805162461bcd60e51b815260206004820152601860248201527f41737365742054797065206d757374206e6f7420626520300000000000000000604482015290519081900360640190fd5b600a5463ffffffff90811690821610611f335760405162461bcd60e51b81526004018080602001828103825260308152602001806130cb6030913960400191505060405180910390fd5b611f3c82611ce3565b611fd45763ffffffff8083166000908152600d60205260409020805460ff19166001908117909155600f54611f74929091906125f016565b600f819055600e541015611fcf576040805162461bcd60e51b815260206004820152601a60248201527f4173736574207479706520636170206973206578636565646564000000000000604482015290519081900360640190fd5b612079565b611fdd826114cd565b63ffffffff168163ffffffff16106120265760405162461bcd60e51b81526004018080602001828103825260308152602001806130316030913960400191505060405180910390fd5b61202f82611266565b63ffffffff168163ffffffff1610156120795760405162461bcd60e51b815260040180806020018281038252603181526020018061309a6031913960400191505060405180910390fd5b63ffffffff8281166000818152600b6020908152604091829020805463ffffffff19169486169485179055815192835282019290925281517f30525f07d1d2ff6b7c2b1817c13c37935c691304253dd353909b5c0381a9dc40929181900390910190a15050565b60009081526008602052604090205460ff1690565b6000806121028484612994565b6014549091506001600160a01b0316156121a857601454604080516346e67e2960e11b81526001600160a01b0387811660048301528681166024830152841515604483015291519190921691638dccfc52916064808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505191506112609050565b9392505050565b600061126060078363ffffffff6126f416565b6121cb33611422565b61220f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6114ca816129a0565b612221336121af565b61225c5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b612265816120e0565b156122b7576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c726561647920706175736564000000000000000000604482015290519081900360640190fd5b600081815260086020526040808220805460ff191660011790555182917fc2d830ac158eec7b589dfadf012044c95b8646222991556ab4cd311e38bc77d191a250565b6000908152600160205260409020546001600160a01b0316151590565b61232133826129fe565b61235c5760405162461bcd60e51b8152600401808060200182810382526067815260200180612fca6067913960800191505060405180910390fd5b826001600160a01b031661236f826113aa565b6001600160a01b0316146123b45760405162461bcd60e51b81526004018080602001828103825260218152602001806131586021913960400191505060405180910390fd5b6001600160a01b03821661240f576040805162461bcd60e51b815260206004820152601a60248201527f605f746f6020697320746865207a65726f20616464726573732e000000000000604482015290519081900360640190fd5b612418816122fa565b612469576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b611190838383612a5d565b61247e82826126f4565b6124cf576040805162461bcd60e51b815260206004820152601d60248201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600081612533576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b81838161253c57fe5b069392505050565b600081612588576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b81838161259157fe5b049392505050565b600082820163ffffffff80851690821610156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6000828201838110156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b61264733611b82565b612689576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b611b7e8282612b30565b6126ae83838360405180602001604052806000815250612c17565b6126e95760405162461bcd60e51b81526004018080602001828103825260398152602001806130616039913960400191505060405180910390fd5b611190838383610dad565b6001600160a01b03166000908152602091909152604090205460ff1690565b61271d82826126f4565b1561276f576040805162461bcd60e51b815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3b151590565b611b7e338383612d4a565b8051156127f9576040805162461bcd60e51b815260206004820152601760248201527f64617461206973206e6f7420696d706c656d656e746564000000000000000000604482015290519081900360640190fd5b610e5e848484611195565b60606000808361281d57600360fc1b915060010161285a565b835b80156128585761010083049250600a8106603001600160f81b0260001b83179250600a818161284a57fe5b60019093019204905061281f565b505b6060816040519080825280601f01601f191660200182016040528015612887576020820181803883390190505b50905060005b828110156128d0578381602081106128a157fe5b1a60f81b8282815181106128b157fe5b60200101906001600160f81b031916908160001a90535060010161288d565b50949350505050565b606082826040516020018083805190602001908083835b6020831061290f5780518252601f1990920191602091820191016128f0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106129575780518252601f199092019160209182019101612938565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b60006121a88383612db8565b60006129aa61179b565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080612a0a836113aa565b9050806001600160a01b0316846001600160a01b03161480612a455750836001600160a01b0316612a3a84610c71565b6001600160a01b0316145b80612a555750612a5581856120f5565b949350505050565b612a6681612de6565b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038881169190911790915587168452600290915290912054612aab91612e21565b6001600160a01b038085166000908152600260205260408082209390935590841681522054612ae190600163ffffffff6125f016565b6001600160a01b03808416600081815260026020526040808220949094559251849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612b39816122fa565b15612b8b576040805162461bcd60e51b815260206004820152601960248201527f6d696e7420746f6b656e20616c72656164792065786973747300000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912054612bcc916125f0565b6001600160a01b0383166000818152600260205260408082209390935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612c2b846001600160a01b0316612794565b612c3757506001612a55565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015612cb1578181015183820152602001612c99565b50505050905090810190601f168015612cde5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600360205260409020546001600160a01b0316156114ca57600090815260036020526040902080546001600160a01b0319169055565b600081831015612e6f576040805162461bcd60e51b81526020600482015260146024820152737375627472616374696f6e206f766572666c6f7760601b604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612eb657805160ff1916838001178555612ee3565b82800160010185558215612ee3579182015b82811115612ee3578251825591602001919060010190612ec8565b50612eef929150612ef3565b5090565b610c6e91905b80821115612eef5760008155600101612ef9565b600063ffffffff8216612f55576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161253c57fe5b600063ffffffff8216612fb4576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161259157fefe556e6c65737320606d73672e73656e64657260206973207468652063757272656e74206f776e65722c20616e20617574686f72697a6564206f70657261746f722c206f722074686520617070726f766564206164647265737320666f722074686973204e46542e4e657720756e697420636170206d757374206265206c657373207468616e2070726576696f757320756e697420636170605f746f60206973206120736d61727420636f6e747261637420616e64206f6e455243373231526563656976656420697320696e76616c69644e657720756e697420636170206d757374206265206d6f7265207468616e2063757272656e7420756e697420636f756e744e657720756e697420636170206d757374206265206c657373207468616e2061737365742074797065206f6666736574556e6c65737320606d73672e73656e64657260206973207468652063757272656e74204e4654206f776e65722c206f7220616e20617574686f72697a6564206f70657261746f72206f66207468652063757272656e74206f776e65722e605f66726f6d60206973206e6f74207468652063757272656e74206f776e65722e4e65772074797065206361702063616e6e6f74206265206c657373207468616e206578697374696e672074797065206361704e6577207479706520636170206d757374206265206d6f7265207468616e2063757272656e74207479706520636f756e744f6e6c7920746f6b656e207061757365722063616e2063616c6c2074686973206d6574686f64a265627a7a723158206b3b4f7ebc3669a9bd1825f180b7b912271e188990be2d302965d1c48aa7453664736f6c634300050c003268747470733a2f2f627261766566726f6e746965726865726f65732e636f6d2f6d657461646174612f737068657265732f000000000000000000000000aa06e5c117dbe8bc52dbaa18aaf447eda556b13c

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063776ab6341161014f578063ac8a584a116100c1578063ca1728fd1161007a578063ca1728fd14610a8e578063d644736814610ac6578063e985e9c514610af0578063ed841bf114610b2b578063f2fde38b14610b5e578063fbd395f814610b9157610272565b8063ac8a584a146108f3578063b88d4fde14610926578063b97d7895146109ec578063c000582714610a1c578063c2508c4614610a31578063c87b56dd14610a6457610272565b8063983b2d5611610113578063983b2d56146107395780639870d7fe1461076c57806399e0dd7c1461079f5780639bb5c9c314610852578063a22cb46514610885578063aa271e1a146108c057610272565b8063776ab634146106bb5780637d02b1a3146106e55780638456cb59146106fa5780638da5cb5b1461070f57806395d89b411461072457610272565b80634dd09f33116101e85780636352211e116101ac5780636352211e146105b35780636d70f7ae146105dd57806370a08231146106105780637362377b14610643578063739f66871461065857806374db07d81461068857610272565b80634dd09f33146104e65780634ebbc92a146104fb578063532efe60146105255780635c975abb1461056e57806362977e2c1461058357610272565b806323b872dd1161023a57806323b872dd146103e45780632cff5b391461041a5780633092afd51461042f5780633f4ba83a1461046257806340c10f191461047757806342842e0e146104b057610272565b806301ffc9a71461027757806306fdde03146102bf578063081812fc14610349578063095ea7b31461038f57806318160ddd146103bd575b600080fd5b34801561028357600080fd5b506102ab6004803603602081101561029a57600080fd5b50356001600160e01b031916610bbb565b604080519115158252519081900360200190f35b3480156102cb57600080fd5b506102d4610bda565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103736004803603602081101561036c57600080fd5b5035610c71565b604080516001600160a01b039092168252519081900360200190f35b6103bb600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610ce9565b005b3480156103c957600080fd5b506103d2610da7565b60408051918252519081900360200190f35b6103bb600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610dad565b34801561042657600080fd5b506103d2610e64565b34801561043b57600080fd5b506103bb6004803603602081101561045257600080fd5b50356001600160a01b0316610e6a565b34801561046e57600080fd5b506103bb610eff565b34801561048357600080fd5b506103bb6004803603604081101561049a57600080fd5b506001600160a01b038135169060200135610fe3565b6103bb600480360360608110156104c657600080fd5b506001600160a01b03813581169160208101359091169060400135611195565b3480156104f257600080fd5b50610373611246565b34801561050757600080fd5b506102ab6004803603602081101561051e57600080fd5b5035611255565b34801561053157600080fd5b506105556004803603602081101561054857600080fd5b503563ffffffff16611266565b6040805163ffffffff9092168252519081900360200190f35b34801561057a57600080fd5b506102ab611281565b34801561058f57600080fd5b506103bb600480360360208110156105a657600080fd5b503563ffffffff16611291565b3480156105bf57600080fd5b50610373600480360360208110156105d657600080fd5b50356113aa565b3480156105e957600080fd5b506102ab6004803603602081101561060057600080fd5b50356001600160a01b0316611422565b34801561061c57600080fd5b506103d26004803603602081101561063357600080fd5b50356001600160a01b0316611435565b34801561064f57600080fd5b506103bb611450565b34801561066457600080fd5b506105556004803603602081101561067b57600080fd5b503563ffffffff166114cd565b34801561069457600080fd5b506103bb600480360360208110156106ab57600080fd5b50356001600160a01b0316611545565b3480156106c757600080fd5b506103bb600480360360208110156106de57600080fd5b50356115da565b3480156106f157600080fd5b506103d26116ae565b34801561070657600080fd5b506103bb6116b4565b34801561071b57600080fd5b5061037361179b565b34801561073057600080fd5b506102d46117aa565b34801561074557600080fd5b506103bb6004803603602081101561075c57600080fd5b50356001600160a01b031661180b565b34801561077857600080fd5b506103bb6004803603602081101561078f57600080fd5b50356001600160a01b03166118a0565b3480156107ab57600080fd5b506103bb600480360360208110156107c257600080fd5b8101906020810181356401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611935945050505050565b34801561085e57600080fd5b506103bb6004803603602081101561087557600080fd5b50356001600160a01b0316611a32565b34801561089157600080fd5b506103bb600480360360408110156108a857600080fd5b506001600160a01b0381351690602001351515611ad3565b3480156108cc57600080fd5b506102ab600480360360208110156108e357600080fd5b50356001600160a01b0316611b82565b3480156108ff57600080fd5b506103bb6004803603602081101561091657600080fd5b50356001600160a01b0316611b95565b6103bb6004803603608081101561093c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111640100000000831117156109ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c2a945050505050565b3480156109f857600080fd5b506102ab60048036036020811015610a0f57600080fd5b503563ffffffff16611ce3565b348015610a2857600080fd5b506103d2611cfe565b348015610a3d57600080fd5b506103bb60048036036020811015610a5457600080fd5b50356001600160a01b0316611d0a565b348015610a7057600080fd5b506102d460048036036020811015610a8757600080fd5b5035611d9f565b348015610a9a57600080fd5b506103bb60048036036040811015610ab157600080fd5b5063ffffffff81358116916020013516611e46565b348015610ad257600080fd5b506102ab60048036036020811015610ae957600080fd5b50356120e0565b348015610afc57600080fd5b506102ab60048036036040811015610b1357600080fd5b506001600160a01b03813581169160200135166120f5565b348015610b3757600080fd5b506102ab60048036036020811015610b4e57600080fd5b50356001600160a01b03166121af565b348015610b6a57600080fd5b506103bb60048036036020811015610b8157600080fd5b50356001600160a01b03166121c2565b348015610b9d57600080fd5b506103bb60048036036020811015610bb457600080fd5b5035612218565b6001600160e01b03191660009081526020819052604090205460ff1690565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505090505b90565b6000610c7c826122fa565b610ccd576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600360205260409020546001600160a01b031690565b6000610cf4826113aa565b9050336001600160a01b0382161480610d125750610d1281336120f5565b610d4d5760405162461bcd60e51b815260040180806020018281038252605d8152602001806130fb605d913960600191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60105490565b600554600160a01b900460ff1615610dff576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b80610e09816120e0565b15610e53576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612317565b50505050565b600e5490565b610e7333611422565b610eb7576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b610ec860098263ffffffff61247416565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610f0833611422565b610f4c576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff16610fa1576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff60a01b191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b610fec33611b82565b61102e576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600a5461104690829063ffffffff908116906124f116565b61108d576040805162461bcd60e51b81526020600482015260136024820152720496e646578206d757374206e6f74206265203606c1b604482015290519081900360640190fd5b600a546000906110a890839063ffffffff9081169061254416565b63ffffffff8082166000908152600c60205260409020549192506110d29181169060019061259916565b63ffffffff8281166000908152600c60205260409020805463ffffffff19169282169290921790915560105461110b916001906125f016565b601055611117816114cd565b63ffffffff8281166000908152600c602052604090205491811691161115611186576040805162461bcd60e51b815260206004820152601860248201527f417373657420756e697420636170206973206578636565640000000000000000604482015290519081900360640190fd5b611190838361263e565b505050565b600554600160a01b900460ff16156111e7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b806111f1816120e0565b1561123b576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612693565b6014546001600160a01b031681565b6000611260826122fa565b92915050565b63ffffffff9081166000908152600c60205260409020541690565b600554600160a01b900460ff1690565b61129a33611b82565b6112dc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600e548163ffffffff16106113225760405162461bcd60e51b81526004018080602001828103825260328152602001806131796032913960400191505060405180910390fd5b600f548163ffffffff1610156113695760405162461bcd60e51b81526004018080602001828103825260318152602001806131ab6031913960400191505060405180910390fd5b63ffffffff8116600e81905560408051918252517fcffe07c9e7982b6c56cb569d21caedd78c8fbc68a0cbdc4d963c21eae6e8f9109181900360200190a150565b60006113b5826122fa565b611406576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600160205260409020546001600160a01b031690565b600061126060068363ffffffff6126f416565b6001600160a01b031660009081526002602052604090205490565b61145933611422565b61149d576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f193505050501580156114ca573d6000803e3d6000fd5b50565b60006114d882611ce3565b611529576040805162461bcd60e51b815260206004820152601960248201527f4173736574207479706520646f6573206e6f7420657869737400000000000000604482015290519081900360640190fd5b5063ffffffff9081166000908152600b60205260409020541690565b61154e33611422565b611592576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6115a360078263ffffffff61271316565b6040516001600160a01b038216907fff12d576e2fecf516eb406e6618d5e97bcc8046690863b984069b15ada11d61290600090a250565b6115e3336121af565b61161e5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b611627816120e0565b61166e576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b881a5cc81b9bdd081c185d5cd959606a1b604482015290519081900360640190fd5b600081815260086020526040808220805460ff191690555182917f0cfa9cc56bacd896c88effb6a4051b954fcaaf2de7ae98882e39f294ea65184391a250565b600f5490565b6116bd33611422565b611701576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff1615611753576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff60a01b1916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6005546001600160a01b031690565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b61181433611422565b611858576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b61186960098263ffffffff61271316565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6118a933611422565b6118ed576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6118fe60068263ffffffff61271316565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b61193e33611422565b611982576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b8051611995906013906020840190612e75565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156119f55781810151838201526020016119dd565b50505050905090810190601f168015611a225780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611a3b33611422565b611a7f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6014546001600160a01b031615801590611afa5750611afa826001600160a01b0316612794565b15611b745760145460408051631b3b02e560e11b81523360048201526001600160a01b03858116602483015284151560448301529151919092169163367605ca91606480830192600092919082900301818387803b158015611b5b57600080fd5b505af1158015611b6f573d6000803e3d6000fd5b505050505b611b7e828261279a565b5050565b600061126060098363ffffffff6126f416565b611b9e33611422565b611be2576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611bf360068263ffffffff61247416565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b600554600160a01b900460ff1615611c7c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b81611c86816120e0565b15611cd0576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b611cdc858585856127a5565b5050505050565b63ffffffff166000908152600d602052604090205460ff1690565b600a5463ffffffff1690565b611d1333611422565b611d57576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611d6860078263ffffffff61247416565b6040516001600160a01b038216907f2186c7d8e4b2d6a73790355b1a465872175798d2366146e638fc885d54460b8590600090a250565b6060611260611dad83612804565b6013805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611e335780601f10611e0857610100808354040283529160200191611e33565b820191906000526020600020905b815481529060010190602001808311611e1657829003601f168201915b50505050506128d990919063ffffffff16565b611e4f33611b82565b611e91576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b63ffffffff8216611ee9576040805162461bcd60e51b815260206004820152601860248201527f41737365742054797065206d757374206e6f7420626520300000000000000000604482015290519081900360640190fd5b600a5463ffffffff90811690821610611f335760405162461bcd60e51b81526004018080602001828103825260308152602001806130cb6030913960400191505060405180910390fd5b611f3c82611ce3565b611fd45763ffffffff8083166000908152600d60205260409020805460ff19166001908117909155600f54611f74929091906125f016565b600f819055600e541015611fcf576040805162461bcd60e51b815260206004820152601a60248201527f4173736574207479706520636170206973206578636565646564000000000000604482015290519081900360640190fd5b612079565b611fdd826114cd565b63ffffffff168163ffffffff16106120265760405162461bcd60e51b81526004018080602001828103825260308152602001806130316030913960400191505060405180910390fd5b61202f82611266565b63ffffffff168163ffffffff1610156120795760405162461bcd60e51b815260040180806020018281038252603181526020018061309a6031913960400191505060405180910390fd5b63ffffffff8281166000818152600b6020908152604091829020805463ffffffff19169486169485179055815192835282019290925281517f30525f07d1d2ff6b7c2b1817c13c37935c691304253dd353909b5c0381a9dc40929181900390910190a15050565b60009081526008602052604090205460ff1690565b6000806121028484612994565b6014549091506001600160a01b0316156121a857601454604080516346e67e2960e11b81526001600160a01b0387811660048301528681166024830152841515604483015291519190921691638dccfc52916064808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505191506112609050565b9392505050565b600061126060078363ffffffff6126f416565b6121cb33611422565b61220f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6114ca816129a0565b612221336121af565b61225c5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b612265816120e0565b156122b7576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c726561647920706175736564000000000000000000604482015290519081900360640190fd5b600081815260086020526040808220805460ff191660011790555182917fc2d830ac158eec7b589dfadf012044c95b8646222991556ab4cd311e38bc77d191a250565b6000908152600160205260409020546001600160a01b0316151590565b61232133826129fe565b61235c5760405162461bcd60e51b8152600401808060200182810382526067815260200180612fca6067913960800191505060405180910390fd5b826001600160a01b031661236f826113aa565b6001600160a01b0316146123b45760405162461bcd60e51b81526004018080602001828103825260218152602001806131586021913960400191505060405180910390fd5b6001600160a01b03821661240f576040805162461bcd60e51b815260206004820152601a60248201527f605f746f6020697320746865207a65726f20616464726573732e000000000000604482015290519081900360640190fd5b612418816122fa565b612469576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b611190838383612a5d565b61247e82826126f4565b6124cf576040805162461bcd60e51b815260206004820152601d60248201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600081612533576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b81838161253c57fe5b069392505050565b600081612588576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b81838161259157fe5b049392505050565b600082820163ffffffff80851690821610156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6000828201838110156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b61264733611b82565b612689576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b611b7e8282612b30565b6126ae83838360405180602001604052806000815250612c17565b6126e95760405162461bcd60e51b81526004018080602001828103825260398152602001806130616039913960400191505060405180910390fd5b611190838383610dad565b6001600160a01b03166000908152602091909152604090205460ff1690565b61271d82826126f4565b1561276f576040805162461bcd60e51b815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3b151590565b611b7e338383612d4a565b8051156127f9576040805162461bcd60e51b815260206004820152601760248201527f64617461206973206e6f7420696d706c656d656e746564000000000000000000604482015290519081900360640190fd5b610e5e848484611195565b60606000808361281d57600360fc1b915060010161285a565b835b80156128585761010083049250600a8106603001600160f81b0260001b83179250600a818161284a57fe5b60019093019204905061281f565b505b6060816040519080825280601f01601f191660200182016040528015612887576020820181803883390190505b50905060005b828110156128d0578381602081106128a157fe5b1a60f81b8282815181106128b157fe5b60200101906001600160f81b031916908160001a90535060010161288d565b50949350505050565b606082826040516020018083805190602001908083835b6020831061290f5780518252601f1990920191602091820191016128f0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106129575780518252601f199092019160209182019101612938565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b60006121a88383612db8565b60006129aa61179b565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080612a0a836113aa565b9050806001600160a01b0316846001600160a01b03161480612a455750836001600160a01b0316612a3a84610c71565b6001600160a01b0316145b80612a555750612a5581856120f5565b949350505050565b612a6681612de6565b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038881169190911790915587168452600290915290912054612aab91612e21565b6001600160a01b038085166000908152600260205260408082209390935590841681522054612ae190600163ffffffff6125f016565b6001600160a01b03808416600081815260026020526040808220949094559251849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612b39816122fa565b15612b8b576040805162461bcd60e51b815260206004820152601960248201527f6d696e7420746f6b656e20616c72656164792065786973747300000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912054612bcc916125f0565b6001600160a01b0383166000818152600260205260408082209390935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612c2b846001600160a01b0316612794565b612c3757506001612a55565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015612cb1578181015183820152602001612c99565b50505050905090810190601f168015612cde5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600360205260409020546001600160a01b0316156114ca57600090815260036020526040902080546001600160a01b0319169055565b600081831015612e6f576040805162461bcd60e51b81526020600482015260146024820152737375627472616374696f6e206f766572666c6f7760601b604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612eb657805160ff1916838001178555612ee3565b82800160010185558215612ee3579182015b82811115612ee3578251825591602001919060010190612ec8565b50612eef929150612ef3565b5090565b610c6e91905b80821115612eef5760008155600101612ef9565b600063ffffffff8216612f55576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161253c57fe5b600063ffffffff8216612fb4576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161259157fefe556e6c65737320606d73672e73656e64657260206973207468652063757272656e74206f776e65722c20616e20617574686f72697a6564206f70657261746f722c206f722074686520617070726f766564206164647265737320666f722074686973204e46542e4e657720756e697420636170206d757374206265206c657373207468616e2070726576696f757320756e697420636170605f746f60206973206120736d61727420636f6e747261637420616e64206f6e455243373231526563656976656420697320696e76616c69644e657720756e697420636170206d757374206265206d6f7265207468616e2063757272656e7420756e697420636f756e744e657720756e697420636170206d757374206265206c657373207468616e2061737365742074797065206f6666736574556e6c65737320606d73672e73656e64657260206973207468652063757272656e74204e4654206f776e65722c206f7220616e20617574686f72697a6564206f70657261746f72206f66207468652063757272656e74206f776e65722e605f66726f6d60206973206e6f74207468652063757272656e74206f776e65722e4e65772074797065206361702063616e6e6f74206265206c657373207468616e206578697374696e672074797065206361704e6577207479706520636170206d757374206265206d6f7265207468616e2063757272656e74207479706520636f756e744f6e6c7920746f6b656e207061757365722063616e2063616c6c2074686973206d6574686f64a265627a7a723158206b3b4f7ebc3669a9bd1825f180b7b912271e188990be2d302965d1c48aa7453664736f6c634300050c0032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000Aa06e5c117dbe8bC52dBaa18AaF447eDA556B13c

-----Decoded View---------------
Arg [0] : _approvalProxy (address): 0xAa06e5c117dbe8bC52dBaa18AaF447eDA556B13c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000Aa06e5c117dbe8bC52dBaa18AaF447eDA556B13c


Deployed Bytecode Sourcemap

26574:1268:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5497:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5497:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5497:135:0;-1:-1:-1;;;;;;5497:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;19097:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19097:84:0;;;:::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;19097:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11432:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11432:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11432:206:0;;:::i;:::-;;;;-1:-1:-1;;;;;11432:206:0;;;;;;;;;;;;;;10633:419;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10633:419:0;;;;;;;;:::i;:::-;;23832:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23832:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;21847:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21847:216:0;;;;;;;;;;;;;;;;;:::i;24634:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24634:90:0;;;:::i;17944:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17944:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17944:141:0;-1:-1:-1;;;;;17944:141:0;;:::i;16686:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16686:124:0;;;:::i;26119:448::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26119:448:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26119:448:0;;;;;;;;:::i;21615:224::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21615:224:0;;;;;;;;;;;;;;;;;:::i;26886:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26886:35:0;;;:::i;18097:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18097:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18097:100:0;;:::i;25994:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25994:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25994:117:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16470:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16470:78:0;;;:::i;24280:346::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24280:346:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24280:346:0;;;;:::i;9281:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9281:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9281:199:0;;:::i;16048:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16048:112:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16048:112:0;-1:-1:-1;;;;;16048:112:0;;:::i;9166:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9166:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9166:107:0;-1:-1:-1;;;;;9166:107:0;;:::i;16818:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16818:108:0;;;:::i;25800:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25800:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25800:186:0;;;;:::i;21038:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21038:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21038:147:0;-1:-1:-1;;;;;21038:147:0;;:::i;20562:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20562:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20562:219:0;;:::i;24732:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24732:94:0;;;:::i;16556:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16556:122:0;;;:::i;14786:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14786:79:0;;;:::i;19189:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19189:88:0;;;:::i;17803:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17803:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17803:133:0;-1:-1:-1;;;;;17803:133:0;;:::i;16168:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16168:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16168:139:0;-1:-1:-1;;;;;16168:139:0;;:::i;18903:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18903:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18903:186:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;18903:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;18903:186: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;18903:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;18903:186:0;;-1:-1:-1;18903:186:0;;-1:-1:-1;;;;;18903:186:0:i;27030:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27030:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27030:158:0;-1:-1:-1;;;;;27030:158:0;;:::i;27196:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27196:301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27196:301:0;;;;;;;;;;:::i;17687:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17687:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17687:108:0;-1:-1:-1;;;;;17687:108:0;;:::i;16315:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16315:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16315:147:0;-1:-1:-1;;;;;16315:147:0;;:::i;21356:251::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;21356:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;21356:251:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;21356:251: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;21356:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;21356:251:0;;-1:-1:-1;21356:251:0;;-1:-1:-1;;;;;21356:251:0:i;24834:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24834:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24834:118:0;;;;:::i;24176:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24176:96:0;;;:::i;21193:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21193:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21193:155:0;-1:-1:-1;;;;;21193:155:0;;:::i;19285:142::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19285:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19285:142:0;;:::i;24960:832::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24960:832:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24960:832:0;;;;;;;;;;;:::i;20789:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20789:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20789:116:0;;:::i;27505:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27505:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27505:334:0;;;;;;;;;;:::i;20913:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20913:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20913:117:0;-1:-1:-1;;;;;20913:117:0;;:::i;15924:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15924:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15924:116:0;-1:-1:-1;;;;;15924:116:0;;:::i;20335:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20335:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20335:219:0;;:::i;5497:135::-;-1:-1:-1;;;;;;5591:33:0;5567:4;5591:33;;;;;;;;;;;;;;5497:135::o;19097:84::-;19167:6;19160:13;;;;;;;;-1:-1:-1;;19160:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19134;;19160;;19167:6;;19160:13;;19167:6;19160:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19097:84;;:::o;11432:206::-;11492:7;11520:16;11527:8;11520:6;:16::i;:::-;11512:76;;;;;-1:-1:-1;;;11512:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11606:24:0;;;;:14;:24;;;;;;-1:-1:-1;;;;;11606:24:0;;11432:206::o;10633:419::-;10713:13;10729:17;10737:8;10729:7;:17::i;:::-;10713:33;-1:-1:-1;10765:10:0;-1:-1:-1;;;;;10765:19:0;;;;:58;;;10788:35;10805:5;10812:10;10788:16;:35::i;:::-;10757:181;;;;-1:-1:-1;;;10757:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10951:24;;;;:14;:24;;;;;;:36;;-1:-1:-1;;;;;;10951:36:0;-1:-1:-1;;;;;10951:36:0;;;;;;;;11003:41;;10951:24;;11012:10;;11003:41;;10951:24;11003:41;10633:419;;;:::o;23832:89::-;23903:10;;23832:89;:::o;21847:216::-;15767:7;;-1:-1:-1;;;15767:7:0;;;;15766:8;15758:37;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;;;;21994:8;20115:23;20129:8;20115:13;:23::i;:::-;20114:24;20106:58;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;;;;22015:40;22034:5;22041:3;22046:8;22015:18;:40::i;:::-;15806:1;21847:216;;;:::o;24634:90::-;24704:12;;24634:90;:::o;17944:141::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;18016:23;:7;18031;18016:23;:14;:23;:::i;:::-;18055:22;;-1:-1:-1;;;;;18055:22:0;;;;;;;;17944:141;:::o;16686:124::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;15864:7;;-1:-1:-1;;;15864:7:0;;;;15856:40;;;;;-1:-1:-1;;;15856:40:0;;;;;;;;;;;;-1:-1:-1;;;15856:40:0;;;;;;;;;;;;;;;16751:7;:15;;-1:-1:-1;;;;16751:15:0;;;16782:20;;;16791:10;16782:20;;;;;;;;;;;;;16686:124::o;26119:448::-;17620:20;17629:10;17620:8;:20::i;:::-;17612:47;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;;;;26216:15;;26203:29;;:8;;26216:15;;;;;26203:12;:29;:::i;:::-;26195:66;;;;;-1:-1:-1;;;26195:66:0;;;;;;;;;;;;-1:-1:-1;;;26195:66:0;;;;;;;;;;;;;;;26311:15;;26272:16;;26298:29;;:8;;26311:15;;;;;26298:12;:29;:::i;:::-;26362:20;;;;;;;;:9;:20;;;;;;26272:56;;-1:-1:-1;26362:27:0;;:20;;;26387:1;;26362:24;:27;:::i;:::-;26339:20;;;;;;;;:9;:20;;;;;:50;;-1:-1:-1;;26339:50:0;;;;;;;;;;;26413:10;;:17;;-1:-1:-1;;26413:14:0;:17;:::i;:::-;26400:10;:30;26473:21;26484:9;26473:10;:21::i;:::-;26449:45;:20;;;;;;;:9;:20;;;;;;:45;;;:20;;:45;;26441:82;;;;;-1:-1:-1;;;26441:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26534:25;26545:3;26550:8;26534:10;:25::i;:::-;17670:1;26119:448;;:::o;21615:224::-;15767:7;;-1:-1:-1;;;15767:7:0;;;;15766:8;15758:37;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;;;;21766:8;20115:23;20129:8;20115:13;:23::i;:::-;20114:24;20106:58;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;;;;21787:44;21810:5;21817:3;21822:8;21787:22;:44::i;26886:35::-;;;-1:-1:-1;;;;;26886:35:0;;:::o;18097:100::-;18150:4;18174:15;18181:7;18174:6;:15::i;:::-;18167:22;18097:100;-1:-1:-1;;18097:100:0:o;25994:117::-;26082:21;;;;26056:6;26082:21;;;:9;:21;;;;;;;;25994:117::o;16470:78::-;16533:7;;-1:-1:-1;;;16533:7:0;;;;;16470:78::o;24280:346::-;17620:20;17629:10;17620:8;:20::i;:::-;17612:47;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;;;;24373:12;;24359:11;:26;;;24351:89;;;;-1:-1:-1;;;24351:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24474:14;;24459:11;:29;;;;24451:91;;;;-1:-1:-1;;;24451:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24553:26;;;:12;:26;;;24595:23;;;;;;;;;;;;;;;;24280:346;:::o;9281:199::-;9337:7;9365:16;9372:8;9365:6;:16::i;:::-;9357:76;;;;;-1:-1:-1;;;9357:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9451:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;9451:21:0;;9281:199::o;16048:112::-;16106:4;16130:22;:9;16144:7;16130:22;:13;:22;:::i;9166:107::-;-1:-1:-1;;;;;9249:16:0;9222:7;9249:16;;;:8;:16;;;;;;;9166:107::o;16818:108::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;16876:42;;:10;;16904:4;16896:21;16876:42;;;;;;;;;16896:21;16876:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16876:42:0;16818:108::o;25800:186::-;25860:6;25887:24;25900:10;25887:12;:24::i;:::-;25879:62;;;;;-1:-1:-1;;;25879:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25959:19:0;;;;;;;;:7;:19;;;;;;;;25800:186::o;21038:147::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;21112:24;:11;21128:7;21112:24;:15;:24;:::i;:::-;21152:25;;-1:-1:-1;;;;;21152:25:0;;;;;;;;21038:147;:::o;20562:219::-;19953:25;19967:10;19953:13;:25::i;:::-;19945:76;;;;-1:-1:-1;;;19945:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20646:23;20660:8;20646:13;:23::i;:::-;20638:55;;;;;-1:-1:-1;;;20638:55:0;;;;;;;;;;;;-1:-1:-1;;;20638:55:0;;;;;;;;;;;;;;;20729:5;20704:22;;;:12;:22;;;;;;:30;;-1:-1:-1;;20704:30:0;;;20750:23;20717:8;;20750:23;;;20562:219;:::o;24732:94::-;24804:14;;24732:94;:::o;16556:122::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;15767:7;;-1:-1:-1;;;15767:7:0;;;;15766:8;15758:37;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;;;;16622:7;:14;;-1:-1:-1;;;;16622:14:0;-1:-1:-1;;;16622:14:0;;;16652:18;;;16659:10;16652:18;;;;;;;;;;;;;16556:122::o;14786:79::-;14851:6;;-1:-1:-1;;;;;14851:6:0;14786:79;:::o;19189:88::-;19261:8;19254:15;;;;;;;;-1:-1:-1;;19254:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19228:13;;19254:15;;19261:8;;19254:15;;19261:8;19254:15;;;;;;;;;;;;;;;;;;;;;;;;17803:133;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;17872:20;:7;17884;17872:20;:11;:20;:::i;:::-;17908;;-1:-1:-1;;;;;17908:20:0;;;;;;;;17803:133;:::o;16168:139::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;16239:22;:9;16253:7;16239:22;:13;:22;:::i;:::-;16277;;-1:-1:-1;;;;;16277:22:0;;;;;;;;16168:139;:::o;18903:186::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;18994:34;;;;:16;;:34;;;;;:::i;:::-;;19044:37;19065:15;19044:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;19044:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18903:186;:::o;27030:158::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;27103:13;:36;;-1:-1:-1;;;;;27103:36:0;;-1:-1:-1;;;;;;27103:36:0;;;;;;;;27155:25;;;;;;;;;;;;;;;;27030:158;:::o;27196:301::-;27287:13;;-1:-1:-1;;;;;27287:13:0;27279:38;;;;:63;;;27321:21;:8;-1:-1:-1;;;;;27321:19:0;;:21::i;:::-;27275:160;;;27359:13;;:64;;;-1:-1:-1;;;27359:64:0;;27391:10;27359:64;;;;-1:-1:-1;;;;;27359:64:0;;;;;;;;;;;;;;;;:13;;;;;:31;;:64;;;;;:13;;:64;;;;;;;:13;;:64;;;5:2:-1;;;;30:1;27;20:12;5:2;27359:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27359:64:0;;;;27275:160;27445:44;27469:8;27479:9;27445:23;:44::i;:::-;27196:301;;:::o;17687:108::-;17743:4;17767:20;:7;17779;17767:20;:11;:20;:::i;16315:147::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;16389:25;:9;16406:7;16389:25;:16;:25;:::i;:::-;16430:24;;-1:-1:-1;;;;;16430:24:0;;;;;;;;16315:147;:::o;21356:251::-;15767:7;;-1:-1:-1;;;15767:7:0;;;;15766:8;15758:37;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;-1:-1:-1;;;15758:37:0;;;;;;;;;;;;;;;21527:8;20115:23;20129:8;20115:13;:23::i;:::-;20114:24;20106:58;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;-1:-1:-1;;;20106:58:0;;;;;;;;;;;;;;;21548:51;21571:5;21578:3;21583:8;21593:5;21548:22;:51::i;:::-;15806:1;21356:251;;;;:::o;24834:118::-;24920:24;;24896:4;24920:24;;;:12;:24;;;;;;;;;24834:118::o;24176:96::-;24249:15;;;;24176:96;:::o;21193:155::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;21270:27;:11;21289:7;21270:27;:18;:27;:::i;:::-;21313;;-1:-1:-1;;;;;21313:27:0;;;;;;;;21193:155;:::o;19285:142::-;19342:13;19375:44;19399:19;:8;:17;:19::i;:::-;19375:16;:23;;;;;;;;;;;;;-1:-1:-1;;19375:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:23;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;:::i;24960:832::-;17620:20;17629:10;17620:8;:20::i;:::-;17612:47;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;;;;25058:15;;;25050:52;;;;;-1:-1:-1;;;25050:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25135:15;;;;;;25121:29;;;;25113:90;;;;-1:-1:-1;;;25113:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25221:24;25234:10;25221:12;:24::i;:::-;25216:472;;25262:24;;;;;;;;:12;:24;;;;;:31;;-1:-1:-1;;25262:31:0;25289:4;25262:31;;;;;;25325:14;;:21;;:14;;25289:4;25325:18;:21;:::i;:::-;25308:14;:38;;;25387:12;;-1:-1:-1;25369:30:0;25361:69;;;;;-1:-1:-1;;;25361:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25216:472;;;25485:22;25496:10;25485;:22::i;:::-;25471:36;;:11;:36;;;25463:97;;;;-1:-1:-1;;;25463:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25598:24;25611:10;25598:12;:24::i;:::-;25583:39;;:11;:39;;;;25575:101;;;;-1:-1:-1;;;25575:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25700:19;;;;;;;;:7;:19;;;;;;;;;:33;;-1:-1:-1;;25700:33:0;;;;;;;;;25749:35;;;;;;;;;;;;;;;;;;;;;;;;24960:832;;:::o;20789:116::-;20851:4;20875:22;;;:12;:22;;;;;;;;;20789:116::o;27505:334::-;27586:4;27603:13;27619:40;27642:6;27650:8;27619:22;:40::i;:::-;27682:13;;27603:56;;-1:-1:-1;;;;;;27682:13:0;27674:38;27670:136;;27736:13;;:58;;;-1:-1:-1;;;27736:58:0;;-1:-1:-1;;;;;27736:58:0;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:30;;:58;;;;;;;;;;;;;;:13;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;27736:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27736:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27736:58:0;;-1:-1:-1;27729:65:0;;-1:-1:-1;27729:65:0;27670:136;27823:8;27505:334;-1:-1:-1;;;27505:334:0:o;20913:117::-;20974:4;20998:24;:11;21014:7;20998:24;:15;:24;:::i;15924:116::-;15651:22;15662:10;15651;:22::i;:::-;15643:51;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;-1:-1:-1;;;15643:51:0;;;;;;;;;;;;;;;16003:29;16022:9;16003:18;:29::i;20335:219::-;19953:25;19967:10;19953:13;:25::i;:::-;19945:76;;;;-1:-1:-1;;;19945:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20418:23;20432:8;20418:13;:23::i;:::-;20417:24;20409:60;;;;;-1:-1:-1;;;20409:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20480:22;;;;:12;:22;;;;;;:29;;-1:-1:-1;;20480:29:0;20505:4;20480:29;;;20525:21;20493:8;;20525:21;;;20335:219;:::o;13172:156::-;13229:4;13262:21;;;:11;:21;;;;;;-1:-1:-1;;;;;13262:21:0;13301:19;;;13172:156::o;10018:607::-;10120:35;10134:10;10146:8;10120:13;:35::i;:::-;10112:168;;;;-1:-1:-1;;;10112:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10344:5;-1:-1:-1;;;;;10323:26:0;:17;10331:8;10323:7;:17::i;:::-;-1:-1:-1;;;;;10323:26:0;;10315:89;;;;-1:-1:-1;;;10315:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10423:17:0;;10415:73;;;;;-1:-1:-1;;;10415:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10507:16;10514:8;10507:6;:16::i;:::-;10499:76;;;;;-1:-1:-1;;;10499:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10586:31;10596:5;10603:3;10608:8;10586:9;:31::i;1427:179::-;1507:18;1511:4;1517:7;1507:3;:18::i;:::-;1499:60;;;;;-1:-1:-1;;;1499:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1570:20:0;1593:5;1570:20;;;;;;;;;;;:28;;-1:-1:-1;;1570:28:0;;;1427:179::o;2496:139::-;2554:7;2582:6;2574:30;;;;;-1:-1:-1;;;2574:30:0;;;;;;;;;;;;-1:-1:-1;;;2574:30:0;;;;;;;;;;;;;;;2626:1;2622;:5;;;;;;;2496:139;-1:-1:-1;;;2496:139:0:o;2347:141::-;2405:7;2433:6;2425:32;;;;;-1:-1:-1;;;2425:32:0;;;;;;;;;;;;-1:-1:-1;;;2425:32:0;;;;;;;;;;;;;;;2479:1;2475;:5;;;;;;;2347:141;-1:-1:-1;;;2347:141:0:o;6964:165::-;7020:6;7050:5;;;7074:6;;;;;;;;;7066:36;;;;;-1:-1:-1;;;7066:36:0;;;;;;;;;;;;-1:-1:-1;;;7066:36:0;;;;;;;;;;;;;;1770:169;1828:7;1860:5;;;1884:6;;;;1876:36;;;;;-1:-1:-1;;;1876:36:0;;;;;;;;;;;;-1:-1:-1;;;1876:36:0;;;;;;;;;;;;;;18205:100;17620:20;17629:10;17620:8;:20::i;:::-;17612:47;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;-1:-1:-1;;;17612:47:0;;;;;;;;;;;;;;;18279:18;18285:2;18289:7;18279:5;:18::i;9724:286::-;9830:48;9853:5;9860:3;9865:8;9830:48;;;;;;;;;;;;:22;:48::i;:::-;9822:135;;;;-1:-1:-1;;;9822:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9968:34;9981:5;9988:3;9993:8;9968:12;:34::i;1614:124::-;-1:-1:-1;;;;;1710:20:0;1686:4;1710:20;;;;;;;;;;;;;;;1614:124::o;1244:175::-;1322:18;1326:4;1332:7;1322:3;:18::i;:::-;1321:19;1313:60;;;;;-1:-1:-1;;;1313:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1384:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;1384:27:0;1407:4;1384:27;;;1244:175::o;335:174::-;454:20;493:8;;;335:174::o;11060:140::-;11140:52;11159:10;11171:9;11182;11140:18;:52::i;9488:228::-;9614:12;;:17;9606:53;;;;;-1:-1:-1;;;9606:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9670:38;9687:5;9694:3;9699:8;9670:16;:38::i;2643:697::-;2695:13;2721:18;;2780:6;2776:375;;-1:-1:-1;;;2803:16:0;-1:-1:-1;2834:5:0;;2776:375;;;2888:1;2904:236;2911:9;;2904:236;;2985:6;2970:10;2962:30;;-1:-1:-1;3044:2:0;3036:5;:10;3050:2;3035:17;-1:-1:-1;;;3034:35:0;3026:44;;3012:58;;;;3098:2;3089:11;;;;;;3119:5;;;;;3089:11;;-1:-1:-1;2904:236:0;;;2776:375;;3163:16;3192:3;3182:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;3182:14:0;87:34:-1;135:17;;-1:-1;3182:14:0;-1:-1:-1;3163:33:0;-1:-1:-1;3207:9:0;3229:75;3245:3;3241:1;:7;3229:75;;;3279:10;3290:1;3279:13;;;;;;;;;;3270:3;3274:1;3270:6;;;;;;;;;;;:22;-1:-1:-1;;;;;3270:22:0;;;;;;;;-1:-1:-1;3250:3:0;;3229:75;;;-1:-1:-1;3328:3:0;2643:697;-1:-1:-1;;;;2643:697:0:o;8443:148::-;8518:13;8575:2;8579;8558:24;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;8558:24:0;;;;;;;;;;-1:-1:-1;8558:24:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;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;;;8558:24:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;8558:24:0;;;8544:39;;8443:148;;;;:::o;11646:150::-;11728:4;11752:36;11770:6;11778:9;11752:17;:36::i;14994:190::-;15061:21;15085:7;:5;:7::i;:::-;15096:6;:18;;-1:-1:-1;;;;;;15096:18:0;-1:-1:-1;;;;;15096:18:0;;;;;;;;;15130:46;;15061:31;;-1:-1:-1;15096:18:0;15130:46;;;;;;-1:-1:-1;;15130:46:0;14994:190;;:::o;11970:250::-;12052:4;12068:13;12084:17;12092:8;12084:7;:17::i;:::-;12068:33;;12132:5;-1:-1:-1;;;;;12120:17:0;:8;-1:-1:-1;;;;;12120:17:0;;:54;;;;12166:8;-1:-1:-1;;;;;12141:33:0;:21;12153:8;12141:11;:21::i;:::-;-1:-1:-1;;;;;12141:33:0;;12120:54;:91;;;;12178:33;12195:5;12202:8;12178:16;:33::i;:::-;12112:100;11970:250;-1:-1:-1;;;;11970:250:0:o;12228:299::-;12313:24;12328:8;12313:14;:24::i;:::-;12348:21;;;;:11;:21;;;;;;;;:27;;-1:-1:-1;;;;;;12348:27:0;-1:-1:-1;;;;;12348:27:0;;;;;;;;;;12404:15;;;;:8;:15;;;;;;;:22;;:19;:22::i;:::-;-1:-1:-1;;;;;12386:15:0;;;;;;;:8;:15;;;;;;:40;;;;12453:13;;;;;;;:20;;12471:1;12453:20;:17;:20;:::i;:::-;-1:-1:-1;;;;;12437:13:0;;;;;;;:8;:13;;;;;;:36;;;;12489:30;;12510:8;;12437:13;;12489:30;;;;;;12228:299;;;:::o;12537:265::-;12612:16;12619:8;12612:6;:16::i;:::-;12611:17;12603:55;;;;;-1:-1:-1;;;12603:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12669:21;;;;:11;:21;;;;;;;;:27;;-1:-1:-1;;;;;;12669:27:0;-1:-1:-1;;;;;12669:27:0;;;;;;;;12723:13;;:8;:13;;;;;;;:20;;:17;:20::i;:::-;-1:-1:-1;;;;;12707:13:0;;;;;;:8;:13;;;;;;:36;;;;12759:35;;12785:8;;12707:13;12759:35;;12707:13;;12759:35;12537:265;;:::o;13336:420::-;13514:4;13542:16;:3;-1:-1:-1;;;;;13542:14:0;;:16::i;:::-;13537:61;;-1:-1:-1;13582:4:0;13575:11;;13537:61;13624:78;;-1:-1:-1;;;13624:78:0;;13667:10;13624:78;;;;;;-1:-1:-1;;;;;13624:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13608:13;;13624:42;;;;;;13667:10;;13679:5;;13686:8;;13696:5;;13624:78;;;;;;;;;;;13608:13;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;13624:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13624:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13624:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13624:78:0;-1:-1:-1;;;;;;13721:26:0;-1:-1:-1;;;13721:26:0;;-1:-1:-1;;13336:420:0;;;;;;:::o;11208:216::-;-1:-1:-1;;;;;11307:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;;:49;;-1:-1:-1;;11307:49:0;;;;;;;;;;11372:44;;;;;;;;;;;;;;;;;11208:216;;;:::o;11808:154::-;-1:-1:-1;;;;;11917:26:0;;;11893:4;11917:26;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;;;;11808:154::o;13764:174::-;13864:1;13829:23;;;:14;:23;;;;;;-1:-1:-1;;;;;13829:23:0;:37;13825:106;;13917:1;13883:23;;;:14;:23;;;;;:36;;-1:-1:-1;;;;;;13883:36:0;;;13764:174::o;1947:148::-;2005:7;2038:1;2033;:6;;2025:39;;;;;-1:-1:-1;;;2025:39:0;;;;;;;;;;;;-1:-1:-1;;;2025:39:0;;;;;;;;;;;;;;;-1:-1:-1;2082:5:0;;;1947:148::o;26574:1268::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26574:1268:0;;;-1:-1:-1;26574:1268:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;7676:136;7732:6;7759;;;7751:30;;;;;-1:-1:-1;;;7751:30:0;;;;;;;;;;;;-1:-1:-1;;;7751:30:0;;;;;;;;;;;;;;;7803:1;7799:5;;:1;:5;;;;;;7530:138;7586:6;7613;;;7605:32;;;;;-1:-1:-1;;;7605:32:0;;;;;;;;;;;;-1:-1:-1;;;7605:32:0;;;;;;;;;;;;;;;7659:1;7655:5;;:1;:5;;;;;

Swarm Source

bzzr://6b3b4f7ebc3669a9bd1825f180b7b912271e188990be2d302965d1c48aa74536

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.