ETH Price: $1,921.46 (-1.48%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...241159262025-12-29 4:31:1156 days ago1766982671IN
0x585CFdd1...8FbF0FF85
0 ETH0.000095212.05586332
Set Approval For...239054522025-11-29 16:15:2385 days ago1764432923IN
0x585CFdd1...8FbF0FF85
0 ETH0.000001810.03919927
Set Approval For...238143702025-11-16 21:16:5998 days ago1763327819IN
0x585CFdd1...8FbF0FF85
0 ETH0.000003280.07070008
Set Approval For...237683222025-11-10 10:39:35105 days ago1762771175IN
0x585CFdd1...8FbF0FF85
0 ETH0.000111042.39773694
Set Approval For...236035962025-10-18 9:19:35128 days ago1760779175IN
0x585CFdd1...8FbF0FF85
0 ETH0.000004750.18
Set Approval For...233805622025-09-17 4:58:47159 days ago1758085127IN
0x585CFdd1...8FbF0FF85
0 ETH0.000006730.14537382
Set Approval For...233110842025-09-07 12:01:35169 days ago1757246495IN
0x585CFdd1...8FbF0FF85
0 ETH0.000006390.13806262
Set Approval For...233093092025-09-07 6:04:59169 days ago1757225099IN
0x585CFdd1...8FbF0FF85
0 ETH0.000007180.15522838
Set Approval For...233035592025-09-06 10:47:35170 days ago1757155655IN
0x585CFdd1...8FbF0FF85
0 ETH0.000008790.19
Set Approval For...228266542025-07-01 20:04:35236 days ago1751400275IN
0x585CFdd1...8FbF0FF85
0 ETH0.000216614.67735288
Set Approval For...219496232025-03-01 4:27:23359 days ago1740803243IN
0x585CFdd1...8FbF0FF85
0 ETH0.000046491.9
Set Approval For...215267342025-01-01 2:49:11418 days ago1735699751IN
0x585CFdd1...8FbF0FF85
0 ETH0.000200964.33931601
Set Approval For...215159562024-12-30 14:41:59419 days ago1735569719IN
0x585CFdd1...8FbF0FF85
0 ETH0.0009047219.5
Set Approval For...214992832024-12-28 6:50:59422 days ago1735368659IN
0x585CFdd1...8FbF0FF85
0 ETH0.000176943.81971548
Set Approval For...209888062024-10-18 0:16:23493 days ago1729210583IN
0x585CFdd1...8FbF0FF85
0 ETH0.0003269313.3991269
Set Approval For...206339692024-08-29 11:33:59543 days ago1724931239IN
0x585CFdd1...8FbF0FF85
0 ETH0.000085921.85532017
Set Approval For...205823362024-08-22 6:24:11550 days ago1724307851IN
0x585CFdd1...8FbF0FF85
0 ETH0.00005881.26980404
Set Approval For...205809532024-08-22 1:45:35550 days ago1724291135IN
0x585CFdd1...8FbF0FF85
0 ETH0.000037410.80780354
Set Approval For...205477682024-08-17 10:32:35555 days ago1723890755IN
0x585CFdd1...8FbF0FF85
0 ETH0.000024781.01230424
Set Approval For...200081832024-06-03 2:02:23630 days ago1717380143IN
0x585CFdd1...8FbF0FF85
0 ETH0.0003695415.09352708
Set Approval For...197349482024-04-25 21:04:35668 days ago1714079075IN
0x585CFdd1...8FbF0FF85
0 ETH0.000438069.4590694
Set Approval For...197349482024-04-25 21:04:35668 days ago1714079075IN
0x585CFdd1...8FbF0FF85
0 ETH0.000438869.4590694
Set Approval For...194038632024-03-10 9:41:11715 days ago1710063671IN
0x585CFdd1...8FbF0FF85
0 ETH0.0026355456.90836387
Safe Transfer Fr...193654922024-03-05 0:49:59720 days ago1709599799IN
0x585CFdd1...8FbF0FF85
0 ETH0.0038030776.11334391
Set Approval For...193218492024-02-27 22:24:35726 days ago1709072675IN
0x585CFdd1...8FbF0FF85
0 ETH0.0021166145.62065601
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:
Pirates

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 2000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : Pirates.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/Pausable.sol";
import "./ERC721.sol";
import "./interfaces/IPirates.sol";
import "./interfaces/ITPirates.sol";
import "./interfaces/IHPirates.sol";
import "./interfaces/IOrbitalBlockade.sol";
import "./interfaces/IRandomizer.sol";
import "./interfaces/IEON.sol";

contract Pirates is IPirates, ERC721, Pausable {
    struct LastWrite {
        uint64 time;
        uint64 blockNum;
    }

    event PirateNamed(uint256 indexed tokenId, string newName);
    event PirateMinted(uint256 indexed tokenId);
    event PirateStolen(uint256 indexed tokenId);

    // tally of the number of pirates that have been minted
    uint16 public override piratesMinted;

    // an arbatrary counter to dish out IDs
    uint16 public override minted;
    //
    uint256 public migrated;

    // toggle naming
    bool public namingActive;

    // number of max pirates that can exist with the total minted to keep a 10:1 ratio

    uint256 public constant MAX_PIRATES = 6000;

    // cost to name
    uint256 public constant costToName = 2000 ether; //2000 EON

    // mapping from tokenId to a struct containing the colonist token's traits
    mapping(uint256 => Pirate) public tokenTraitsPirate;

    // mapping from tokenId to a stuct containing the honors pirates
    mapping(uint256 => HPirates) public tokenTraitsHonors;
    mapping(uint256 => bool) public isHonors;

    // mapping from hashed(tokenTrait) to the tokenId it's associated with
    // used to ensure there are no duplicates
    mapping(uint256 => uint256) public existingCombinations;

    // Mapping from token ID to name
    mapping(uint256 => string) private _tokenName;

    mapping(uint256 => bool) private _hasName;

    // Mapping if certain name string has already been reserved
    mapping(string => bool) private _nameReserved;

    // Tracks the last block and timestamp that a caller has written to state.
    // Disallow some access to functions if they occur while a change is being written.
    mapping(address => LastWrite) private lastWriteAddress;
    mapping(uint256 => LastWrite) private lastWriteToken;

    // list of probabilities for each trait type
    uint8[][9] public rarities;
    uint8[][9] public aliases;

    // reference to the orbital for transfers without approval
    IOrbitalBlockade public orbital;

    // reference to Traits
    ITPirates public traits;

    // reference to honors traits
    IHPirates public honorTraits;

    //reference to Randomizer
    IRandomizer public randomizer;

    //referenve to EON
    IEON public EON;

    //reference to the original pirates contract
    IPirates public originalPirates;

    address public auth;

    // address => used in allowing system communication between contracts
    mapping(address => bool) private admins;

    // Imperial Guild Treasury
    address private imperialGuildTreasury;

    /**
     * instantiates contract and rarity tables
     */
    constructor() ERC721("ShatteredEon", "Pirates Migrated") {
        minted = 151;
        piratesMinted = 151;
        _pause();
        
        auth = msg.sender;
        admins[msg.sender] = true;

        //PIRATES
        //sky
        rarities[0] = [200, 200, 200, 200, 200, 255];
        aliases[0] = [1, 2, 0, 4, 3, 5];
        //cockpit
        rarities[1] = [255];
        aliases[1] = [0];
        //base
        rarities[2] = [
            255,
            255,
            255,
            255,
            200,
            200,
            200,
            200,
            40,
            40,
            40,
            40,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255
        ];
        aliases[2] = [
            16,
            17,
            18,
            19,
            7,
            6,
            5,
            4,
            3,
            2,
            1,
            0,
            16,
            17,
            18,
            19,
            0,
            1,
            2,
            3
        ];
        //engine
        rarities[3] = [
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            100,
            100,
            100,
            100,
            255,
            255,
            255,
            255,
            40,
            40,
            40,
            40
        ];
        aliases[3] = [
            8,
            9,
            10,
            11,
            12,
            13,
            14,
            15,
            15,
            14,
            13,
            12,
            7,
            6,
            5,
            4,
            8,
            9,
            10,
            11
        ];
        //nose
        rarities[4] = [
            255,
            255,
            255,
            255,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            120,
            120,
            120,
            120,
            40,
            40,
            40,
            40
        ];
        aliases[4] = [
            0,
            1,
            2,
            3,
            15,
            14,
            13,
            12,
            11,
            10,
            9,
            8,
            3,
            2,
            1,
            0,
            12,
            13,
            14,
            15
        ];
        //wing
        rarities[5] = [
            120,
            120,
            120,
            120,
            40,
            40,
            40,
            40,
            150,
            150,
            150,
            150,
            255,
            255,
            255,
            255,
            255,
            255,
            255,
            255
        ];
        aliases[5] = [
            19,
            18,
            17,
            16,
            3,
            2,
            1,
            0,
            0,
            1,
            2,
            3,
            19,
            18,
            17,
            16,
            15,
            14,
            13,
            12
        ];
        //weapon1
        rarities[6] = [255, 150, 220, 220, 120, 30];
        aliases[6] = [0, 0, 0, 0, 0, 0];
        //weapon2
        rarities[7] = [255, 150, 30, 100, 20, 200];
        aliases[7] = [0, 0, 0, 0, 0, 0];
        //rank
        rarities[8] = [12, 160, 73, 255];
        aliases[8] = [2, 3, 3, 3];
    }

    modifier requireContractsSet() {
        require(
            address(traits) != address(0) &&
                address(orbital) != address(0) &&
                address(randomizer) != address(0)
        );
        _;
    }

      modifier blockIfChangingAddress() {
        require(admins[msg.sender] || lastWriteAddress[tx.origin].blockNum < block.number, "Your trying the cheat");
        _;
    }

     modifier blockIfChangingToken(uint256 tokenId) {
        require(admins[msg.sender] || lastWriteToken[tokenId].blockNum < block.number, "Your trying the cheat");
        _;
    }


    modifier onlyOwner() {
        require(msg.sender == auth);
        _;
    }

    function setContracts(
        address _traits,
        address _honorTraits,
        address _orbital,
        address _rand,
        address _eon,
        address _originalPirates
    ) external onlyOwner {
        traits = ITPirates(_traits);
        honorTraits = IHPirates(_honorTraits);
        orbital = IOrbitalBlockade(_orbital);
        randomizer = IRandomizer(_rand);
        EON = IEON(_eon);
        originalPirates = IPirates(_originalPirates);
    }

    /*///////////////////////////////////////////////////////////////
                    EXTERNAL
    //////////////////////////////////////////////////////////////*/

    function _mintPirate(address recipient, uint256 seed)
        external
        override
        whenNotPaused
    {
        require(admins[msg.sender], "Only Admins");
        require(piratesMinted + 1 <= MAX_PIRATES, "Pirate forces are full");
        minted++;
        piratesMinted++;
        generatePirate(minted, seed);
        if (tx.origin != recipient && recipient != address(orbital)) {
            // Stolen!
            emit PirateStolen(minted);
        }
        _mint(recipient, minted);
    }

    function _mintHonors(address recipient, uint8 id)
        external
        whenNotPaused
        onlyOwner
    {
        require(minted + 1 <= MAX_PIRATES, "All Pirates Minted");
        minted++;
        piratesMinted++;
        generateHonors(minted, id);
        _mint(recipient, minted);
    }

    /**
     * Burn a token - any game logic should be handled before this function.
     */
    function burn(uint256 tokenId) external override whenNotPaused {
        require(admins[msg.sender]);
        require(ownerOf[tokenId] == tx.origin, "not owner");
        _burn(tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IPirates) {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");
        // allow admin contracts to send without approval
        if (!admins[msg.sender]) {
            require(
                msg.sender == from ||
                    msg.sender == getApproved[id] ||
                    isApprovedForAll[from][msg.sender],
                "NOT_AUTHORIZED"
            );
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function generatePirate(uint256 tokenId, uint256 seed)
        internal
        returns (Pirate memory p)
    {
        p = selectPiTraits(seed);
        if (existingCombinations[structToHashPi(p)] == 0) {
            tokenTraitsPirate[tokenId] = p;
            existingCombinations[structToHashPi(p)] = tokenId;
            emit PirateMinted(tokenId);
            return p;
        }
        return generatePirate(tokenId, randomizer.random(seed));
    }

    function generateHonors(uint256 tokenId, uint8 id)
        internal
        returns (HPirates memory r)
    {
        r.Legendary = id;
        tokenTraitsHonors[minted] = r;
        isHonors[minted] = true;
        emit PirateMinted(tokenId);
        return r;
    }

    /**
     * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup
     * ensuring O(1) instead of O(n) reduces mint cost by more than 50%
     * probability & alias tables are generated off-chain beforehand
     * @param seed portion of the 256 bit seed to remove trait correlation
     * @param traitType the trait type to select a trait for
     * @return the ID of the randomly selected trait
     */
    function selectTrait(uint16 seed, uint8 traitType)
        internal
        view
        returns (uint8)
    {
        uint8 trait = uint8(seed) % uint8(rarities[traitType].length);
        // If a selected random trait probability is selected (biased coin) return that trait
        if (seed >> 8 < rarities[traitType][trait]) return trait;
        return aliases[traitType][trait];
    }

    function selectPiTraits(uint256 seed)
        internal
        view
        returns (Pirate memory p)
    {
        p.isPirate = true;
        seed >>= 16;
        p.sky = selectTrait(uint16(seed & 0xFFFF), 0);
        seed >>= 16;
        p.cockpit = selectTrait(uint16(seed & 0xFFFF), 1);
        seed >>= 16;
        p.base = selectTrait(uint16(seed & 0xFFFF), 2);
        seed >>= 16;
        p.engine = selectTrait(uint16(seed & 0xFFFF), 3);
        seed >>= 16;
        p.nose = selectTrait(uint16(seed & 0xFFFF), 4);
        seed >>= 16;
        p.wing = selectTrait(uint16(seed & 0xFFFF), 5);
        seed >>= 16;
        p.weapon1 = selectTrait(uint16(seed & 0xFFFF), 6);
        seed >>= 16;
        p.weapon2 = selectTrait(uint16(seed & 0xFFFF), 7);
        seed >>= 16;
        p.rank = selectTrait(uint16(seed & 0xFFFF), 8);
    }

    function structToHashPi(Pirate memory q) internal pure returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        q.sky,
                        q.cockpit,
                        q.base,
                        q.engine,
                        q.nose,
                        q.wing,
                        q.weapon1,
                        q.weapon2,
                        q.rank
                    )
                )
            );
    }

        
    function updateOriginAccess(uint16[] memory tokenIds) external override {
        require(admins[_msgSender()], "Only admins can call this");
        uint64 blockNum = uint64(block.number);
        uint64 time = uint64(block.timestamp);
        lastWriteAddress[tx.origin] = LastWrite(time, blockNum);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            lastWriteToken[tokenIds[i]] = LastWrite(time, blockNum);
        }
    }

    function tokenNameByIndex(uint256 index)
        public
        view
        returns (string memory)
    {
        return _tokenName[index];
    }

    function isNameReserved(string memory nameString)
        public
        view
        returns (bool)
    {
        return _nameReserved[toLower(nameString)];
    }

    function hasBeenNamed(uint256 tokenId) public view returns (bool) {
        return _hasName[tokenId];
    }

    function namePirate(uint256 tokenId, string memory newName) public {
        require(namingActive == true, "naming not yet availanle");
        require(ownerOf[tokenId] == msg.sender, "Not your pirate to name");
        require(hasBeenNamed(tokenId) == false, "Pirate already named");
        require(validateName(newName) == true, "Not a valid name");
        require(isNameReserved(newName) == false, "Name already reserved");

        //   IERC20(_eonAddress).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);

        toggleReserveName(newName, true);
        toggleHasName(tokenId, true);
        _tokenName[tokenId] = newName;
        EON.burn(msg.sender, costToName);
        emit PirateNamed(tokenId, newName);
    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[toLower(str)] = isReserve;
    }

    function toggleHasName(uint256 tokenId, bool hasName) internal {
        _hasName[tokenId] = hasName;
    }

    /**
     * @dev Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
     */
    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 1) return false;
        if (b.length > 25) return false; // Cannot be longer than 25 characters
        if (b[0] == 0x20) return false; // Leading space
        if (b[b.length - 1] == 0x20) return false; // Trailing space

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];

            if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            ) return false;

            lastChar = char;
        }

        return true;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

      /**
   * creates identical tokens in the new contract
   * and burns any original tokens
   * @param tokenIds the ids of the tokens to migrate
   */
  function migrate(uint16[] calldata tokenIds) external whenNotPaused {
    for (uint16 i = 0; i < tokenIds.length; i++) {
      require(originalPirates.isOwner(tokenIds[i]) == msg.sender, "THIEF!");
       tokenTraitsPirate[tokenIds[i]] = originalPirates.getTokenTraitsPirate(tokenIds[i]);
      originalPirates.burn(tokenIds[i]);
      _mint(address(orbital), tokenIds[i]);
      migrated++;
    }
    orbital.addPiratesToCrew(msg.sender, tokenIds); 

  }

    /**
     * enables owner to pause / unpause minting
     */
    function setPaused(bool _paused) external requireContractsSet onlyOwner {
        if (_paused) _pause();
        else _unpause();
    }

    function getBalance(address tokenOwner)
        public
        view
        returns (uint256)
        
    {
        //Prevent chencking balance in the same block it's being modified..
        require(
            admins[msg.sender] ||
                lastWriteAddress[tokenOwner].blockNum < block.number,
            "no checking balance in the same block it's being modified"
        );
        return balanceOf[tokenOwner];
    }

      function getTokenWriteBlock(uint256 tokenId) external view override returns(uint64) {
        require(
            admins[msg.sender], 
            "Only admins can call this"
            );
        return lastWriteToken[tokenId].blockNum;
    }

    /**
     * enables an address to mint / burn
     * @param addr the address to enable
     */
    function addAdmin(address addr) external onlyOwner {
        admins[addr] = true;
    }

    /**
     * disables an address from minting / burning
     * @param addr the address to disbale
     */
    function removeAdmin(address addr) external onlyOwner {
        admins[addr] = false;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        auth = newOwner;
    }

    function toggleNameing(bool _namingActive) external onlyOwner {
        namingActive = _namingActive;
    }

    function setImperialGuildTreasury(address _imperialTreasury)
        external
        onlyOwner
    {
        imperialGuildTreasury = _imperialTreasury;
    }

    /** Traits */

    function getTokenTraitsPirate(uint256 tokenId)
        external
        view
        override
        blockIfChangingAddress blockIfChangingToken (tokenId) 
        returns (Pirate memory)
    {
        return tokenTraitsPirate[tokenId];
    }

    function getTokenTraitsHonors(uint256 tokenId) 
        external
        view
        override
        returns (HPirates memory)
    {
        return tokenTraitsHonors[tokenId];
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        blockIfChangingAddress blockIfChangingToken (tokenId) 
        returns (string memory)
    {
        if (isHonors[tokenId]) {
            return honorTraits.tokenURI(tokenId);
        }
        return traits.tokenURI(tokenId);
    }

    function isOwner(uint256 tokenId) blockIfChangingToken(tokenId) public view returns (address) {
        address addr = ownerOf[tokenId];
        return addr;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IPirates) blockIfChangingToken(id) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public override(ERC721, IPirates) blockIfChangingToken(id) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    // For OpenSeas
    function owner() public view virtual returns (address) {
        return auth;
    }
    }

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) internal balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(
            msg.sender == owner || isApprovedForAll[owner][msg.sender],
            "NOT_AUTHORIZED"
        );

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from ||
                msg.sender == getApproved[id] ||
                isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IEON {
    function mint(address to, uint256 amount) external;

    function burn(address from, uint256 amount) external;

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface IHPirates {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IOrbitalBlockade {
    function addPiratesToCrew(address account, uint16[] calldata tokenIds)
        external;
    
    function claimPiratesFromCrew(address account, uint16[] calldata tokenIds, bool unstake)
        external;

    function payPirateTax(uint256 amount) external;

    function randomPirateOwner(uint256 seed) external view returns (address);
}

// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IPirates {
    // struct to store each Colonist's traits
    struct Pirate {
        bool isPirate;
        uint8 sky;
        uint8 cockpit;
        uint8 base;
        uint8 engine;
        uint8 nose;
        uint8 wing;
        uint8 weapon1;
        uint8 weapon2;
        uint8 rank;
    }

    struct HPirates {
        uint8 Legendary;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external;

    function minted() external returns (uint16);

    function piratesMinted() external returns (uint16);

    function isOwner(uint256 tokenId)
        external
        view
        returns (address);

    function _mintPirate(address recipient, uint256 seed) external;

    function burn(uint256 tokenId) external;

    function getTokenTraitsPirate(uint256 tokenId)
        external
        view
        returns (Pirate memory);

    function getTokenTraitsHonors(uint256 tokenId)
        external
        view
        returns (HPirates memory);

    function tokenNameByIndex(uint256 index)
        external
        view
        returns (string memory);
    
    function isHonors(uint256 tokenId)
        external
        view
        returns (bool);

    function updateOriginAccess(uint16[] memory tokenIds) external;

    function getTokenWriteBlock(uint256 tokenId) 
    external 
    view  
    returns(uint64);

    function hasBeenNamed(uint256 tokenId) external view returns (bool);

    function namePirate(uint256 tokenId, string memory newName) external;
}

File 9 of 10 : IRandomizer.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IRandomizer {
    function random(uint256) external returns (uint256);
}

// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface ITPirates {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "inliner": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "yul": true,
      "yulDetails": {
        "optimizerSteps": "dhfoDgvulfnTUtnIf",
        "stackAllocation": true
      }
    },
    "runs": 2000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"PirateMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"PirateNamed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"PirateStolen","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"},{"inputs":[],"name":"EON","outputs":[{"internalType":"contract IEON","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PIRATES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint8","name":"id","type":"uint8"}],"name":"_mintHonors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"_mintPirate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costToName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsHonors","outputs":[{"components":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"internalType":"struct IPirates.HPirates","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsPirate","outputs":[{"components":[{"internalType":"bool","name":"isPirate","type":"bool"},{"internalType":"uint8","name":"sky","type":"uint8"},{"internalType":"uint8","name":"cockpit","type":"uint8"},{"internalType":"uint8","name":"base","type":"uint8"},{"internalType":"uint8","name":"engine","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"wing","type":"uint8"},{"internalType":"uint8","name":"weapon1","type":"uint8"},{"internalType":"uint8","name":"weapon2","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"}],"internalType":"struct IPirates.Pirate","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenWriteBlock","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasBeenNamed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honorTraits","outputs":[{"internalType":"contract IHPirates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isHonors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"namePirate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"namingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orbital","outputs":[{"internalType":"contract IOrbitalBlockade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalPirates","outputs":[{"internalType":"contract IPirates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"piratesMinted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_honorTraits","type":"address"},{"internalType":"address","name":"_orbital","type":"address"},{"internalType":"address","name":"_rand","type":"address"},{"internalType":"address","name":"_eon","type":"address"},{"internalType":"address","name":"_originalPirates","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_imperialTreasury","type":"address"}],"name":"setImperialGuildTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"_namingActive","type":"bool"}],"name":"toggleNameing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsHonors","outputs":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsPirate","outputs":[{"internalType":"bool","name":"isPirate","type":"bool"},{"internalType":"uint8","name":"sky","type":"uint8"},{"internalType":"uint8","name":"cockpit","type":"uint8"},{"internalType":"uint8","name":"base","type":"uint8"},{"internalType":"uint8","name":"engine","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"wing","type":"uint8"},{"internalType":"uint8","name":"weapon1","type":"uint8"},{"internalType":"uint8","name":"weapon2","type":"uint8"},{"internalType":"uint8","name":"rank","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITPirates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"tokenIds","type":"uint16[]"}],"name":"updateOriginAccess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600c81526b29b430ba3a32b932b222b7b760a11b60208083019182528351808501909452601084526f141a5c985d195cc8135a59dc985d195960821b9084015281519192916200006e9160009162000954565b5080516200008490600190602084019062000954565b50506006805464ffffffffff1916639700970017905550620000a5620008d6565b602a80546001600160a01b031916339081179091556000908152602b6020908152604091829020805460ff19166001179055815160c08101835260c880825291810182905291820181905260608201819052608082015260ff60a082015262000113906012906006620009e3565b506040805160c08101825260018152600260208201526000918101919091526004606082015260036080820152600560a08201526200015790601b906006620009e3565b50604080516020810190915260ff815262000177906013906001620009e3565b506040805160208101909152600081526200019790601c906001620009e3565b50604080516102808101825260ff808252602082018190529181018290526060810182905260c86080820181905260a0820181905260c0820181905260e08201526028610100820181905261012082018190526101408201819052610160820152609661018082018190526101a082018190526101c082018190526101e0820152610200810182905261022081018290526102408101829052610260810191909152620002489060149081620009e3565b5060408051610280810182526010808252601160208301819052601293830184905260136060840181905260076080850152600660a0850152600560c0850152600460e0850152600361010085018190526002610120860181905260016101408701819052600061016088018190526101808801969096526101a08701949094526101c08601969096526101e0850191909152610200840192909252610220830152610240820183905261026082015290601b906200030c929101906014620009e3565b506040805161028081018252609680825260208201819052918101829052606081019190915260ff6080820181905260a0820181905260c0820181905260e08201819052606461010083018190526101208301819052610140830181905261016083015261018082018190526101a082018190526101c082018190526101e08201526028610200820181905261022082018190526102408201819052610260820152620003be906015906014620009e3565b5060408051610280810182526008808252600960208301819052600a938301849052600b60608401819052600c60808501819052600d60a08601819052600e60c08701819052600f60e08801819052610100880152610120870152610140860152610160850152600761018085015260066101a085015260056101c085015260046101e08501526102008401929092526102208301526102408201929092526102608101919091526200047690601e906014620009e3565b50604080516102808101825260ff808252602082018190529181018290526060810182905260966080820181905260a0820181905260c0820181905260e0820152610100810182905261012081018290526101408101829052610160810191909152607861018082018190526101a082018190526101c082018190526101e0820152602861020082018190526102208201819052610240820181905261026082015262000528906016906014620009e3565b50604080516102808101825260008082526001602083018190526002938301849052600360608401819052600f60808501819052600e60a08601819052600d60c08701819052600c60e08801819052600b610100890152600a610120890152600961014089015260086101608901526101808801949094526101a08701979097526101c08601939093526101e0850193909352610200840152610220830193909352610240820192909252610260810191909152620005ec90601f906014620009e3565b506040805161028081018252607880825260208201819052918101829052606081019190915260286080820181905260a0820181905260c0820181905260e0820152609661010082018190526101208201819052610140820181905261016082015260ff61018082018190526101a082018190526101c082018190526101e082018190526102008201819052610220820181905261024082018190526102608201526200069e906017906014620009e3565b5060408051610280810182526013808252601260208084018290526011948401859052601060608501819052600360808601819052600260a08701819052600160c08801819052600060e089018190526101008901526101208801526101408701526101608601526101808501939093526101a08401919091526101c08301939093526101e0820152600f610200820152600e610220820152600d610240820152600c6102608201526200075591906014620009e3565b506040805160c08101825260ff81526096602082015260dc918101829052606081019190915260786080820152601e60a082015262000799906018906006620009e3565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152620007dc906021906006620009e3565b506040805160c08101825260ff815260966020820152601e91810191909152606460608201526014608082015260c860a082015262000820906019906006620009e3565b506040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915262000863906022906006620009e3565b5060408051608081018252600c815260a0602082015260499181019190915260ff60608201526200089990601a906004620009e3565b5060408051608081018252600281526003602082018190529181018290526060810191909152620008cf906023906004620009e3565b5062000b4c565b60065460ff1615620009055760405162461bcd60e51b8152600401620008fc9062000a9d565b60405180910390fd5b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200093b3390565b6040516200094a919062000af5565b60405180910390a1565b828054620009629062000b1b565b90600052602060002090601f016020900481019282620009865760008555620009d1565b82601f10620009a157805160ff1916838001178555620009d1565b82800160010185558215620009d1579182015b82811115620009d1578251825591602001919060010190620009b4565b50620009df92915062000a86565b5090565b82805482825590600052602060002090601f01602090048101928215620009d15791602002820160005b8382111562000a4d57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000a0d565b801562000a7c5782816101000a81549060ff021916905560010160208160000104928301926001030262000a4d565b5050620009df9291505b5b80821115620009df576000815560010162000a87565b6020808252810162000acc81601081526f14185d5cd8589b194e881c185d5cd95960821b602082015260400190565b92915050565b60006001600160a01b03821662000acc565b62000aef8162000ad2565b82525050565b6020810162000acc828462000ae4565b634e487b7160e01b600052602260045260246000fd5b60028104600182168062000b3057607f821691505b6020821081141562000b465762000b4662000b05565b50919050565b6145488062000b5c6000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806370480275116101d3578063b88d4fde11610104578063e985e9c5116100a2578063eed4b34c1161007c578063eed4b34c146108e4578063f10fb584146108f7578063f2fde38b1461090a578063f8b2cb4f1461091d57600080fd5b8063e985e9c51461088d578063ebd17368146108bb578063edca3f17146108db57600080fd5b8063ddcbd86b116100de578063ddcbd86b146107a3578063de9375f214610844578063e1fc334f14610857578063e60738691461086a57600080fd5b8063b88d4fde1461075a578063c87b56dd1461076d578063d41d416d1461078057600080fd5b806395d89b4111610171578063a1b8f3741161014b578063a1b8f374146106cd578063a22cb465146106ed578063b07ba6a714610700578063b6a719531461074757600080fd5b806395d89b411461069f5780639e1bd408146106a75780639ffdb65a146106ba57600080fd5b806383c79d43116101ad57806383c79d43146106485780638da5cb5b146106585780638f58e7a8146106695780639416b4231461068c57600080fd5b8063704802751461060f57806370c124cc1461062257806375ab9b761461063557600080fd5b80632463a55a116102ad57806342966c681161024b5780635c975abb116102255780635c975abb146105b55780636352211e146105c05780636ca865ba146105e95780636d522418146105fc57600080fd5b806342966c681461058057806347486c75146105935780634f02c420146105a057600080fd5b806335ca838b1161028757806335ca838b14610534578063368383911461054757806339c7639c1461055a57806342842e0e1461056d57600080fd5b80632463a55a146104eb5780632c678c64146104fe57806333df4b2c1461051457600080fd5b806315b56d101161031a5780631785f53c116102f45780631785f53c1461049257806318d21284146104a55780631a2fbc7c146104c557806323b872dd146104d857600080fd5b806315b56d101461044c578063165272311461045f57806316c38b3c1461047f57600080fd5b806306fdde031161035657806306fdde03146103db578063081812fc146103f0578063095ea7b3146104265780631509f2941461043957600080fd5b806301ffc9a71461037d57806302815835146103a6578063046b07aa146103bb575b600080fd5b61039061038b3660046130e3565b610930565b60405161039d9190613116565b60405180910390f35b6103b96103b4366004613137565b610a15565b005b6006546103ce90610100900461ffff1681565b60405161039d9190613162565b6103e3610a3f565b60405161039d91906131ce565b6104196103fe3660046131f0565b6004602052600090815260409020546001600160a01b031681565b60405161039d919061322b565b6103b961043436600461324d565b610acd565b6103b961044736600461328a565b610ba4565b61039061045a36600461339e565b610bea565b602454610472906001600160a01b031681565b60405161039d919061341b565b6103b961048d366004613137565b610c1d565b6103b96104a036600461328a565b610c90565b6104b86104b33660046131f0565b610cc8565b60405161039d91906134f2565b6103b96104d3366004613501565b610e8e565b6103b96104e636600461354f565b611069565b6103b96104f936600461359f565b6111f2565b61050760075481565b60405161039d919061362f565b61052761052236600461363d565b611285565b60405161039d919061365f565b6103b9610542366004613723565b6112cb565b61052761055536600461363d565b611437565b6104196105683660046131f0565b611447565b6103b961057b36600461354f565b6114bf565b6103b961058e3660046131f0565b611605565b6008546103909060ff1681565b6006546103ce906301000000900461ffff1681565b60065460ff16610390565b6104196105ce3660046131f0565b6003602052600090815260409020546001600160a01b031681565b602854610472906001600160a01b031681565b6103e361060a3660046131f0565b611683565b6103b961061d36600461328a565b611725565b6103b961063036600461324d565b611760565b602654610472906001600160a01b031681565b610507686c6b935b8bbd40000081565b602a546001600160a01b0316610419565b6103906106773660046131f0565b6000908152600e602052604090205460ff1690565b6103e361069a36600461339e565b6118fb565b6103e3611a8e565b6103b96106b53660046137b0565b611a9b565b6103906106c836600461339e565b611f15565b6105076106db3660046131f0565b600c6020526000908152604090205481565b6103b96106fb3660046137f8565b6121cc565b61073a61070e3660046131f0565b6040805160208082018352600091829052928152600a835281902081519283019091525460ff16815290565b60405161039d9190613837565b6103b9610755366004613859565b61223b565b6103b961076836600461388c565b612356565b6103e361077b3660046131f0565b6124a5565b61052761078e3660046131f0565b600a6020526000908152604090205460ff1681565b61082e6107b13660046131f0565b60096020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691600160401b820481169169010000000000000000009004168a565b60405161039d9a9998979695949392919061390b565b602a54610419906001600160a01b031681565b602554610472906001600160a01b031681565b6103906108783660046131f0565b600b6020526000908152604090205460ff1681565b61039061089b3660046139a0565b600560209081526000928352604080842090915290825290205460ff1681565b6108ce6108c93660046131f0565b61269e565b60405161039d91906139e3565b61050761177081565b602954610472906001600160a01b031681565b602754610472906001600160a01b031681565b6103b961091836600461328a565b6126f1565b61050761092b36600461328a565b612737565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109c357507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a0f57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602a546001600160a01b03163314610a2c57600080fd5b6008805460ff1916911515919091179055565b60008054610a4c90613a07565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613a07565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610b1657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b3b5760405162461bcd60e51b8152600401610b3290613a62565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602a546001600160a01b03163314610bbb57600080fd5b602c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600f610bf7836118fb565b604051610c049190613a94565b9081526040519081900360200190205460ff1692915050565b6025546001600160a01b031615801590610c4157506024546001600160a01b031615155b8015610c5757506027546001600160a01b031615155b610c6057600080fd5b602a546001600160a01b03163314610c7757600080fd5b8015610c8857610c856127b6565b50565b610c85612825565b602a546001600160a01b03163314610ca757600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19169055565b604080516101408101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301829052338252602b9052919091205460ff1680610d5357503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b610d6f5760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680610dae575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b610dca5760405162461bcd60e51b8152600401610b3290613ad0565b600083815260096020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152600160401b8104841692820192909252690100000000000000000090910490911661012082015291505b50919050565b60085460ff161515600114610eb55760405162461bcd60e51b8152600401610b3290613b12565b6000828152600360205260409020546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610b3290613b54565b6000828152600e602052604090205460ff1615610f1a5760405162461bcd60e51b8152600401610b3290613b96565b610f2381611f15565b1515600114610f445760405162461bcd60e51b8152600401610b3290613bd8565b610f4d81610bea565b15610f6a5760405162461bcd60e51b8152600401610b3290613c1a565b610f75816001612878565b6000828152600e60209081526040808320805460ff19166001179055600d82529091208251610fa692840190613010565b506028546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690639dc29fac90610ffb903390686c6b935b8bbd40000090600401613c2a565b600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b50505050817ff82afa02631c3ed951c54b199dcaaa44d042ba6804e1e1dc55d4f3998b5c6e768260405161105d91906131ce565b60405180910390a25050565b6000818152600360205260409020546001600160a01b038481169116146110a25760405162461bcd60e51b8152600401610b3290613c77565b6001600160a01b0382166110c85760405162461bcd60e51b8152600401610b3290613cb9565b336000908152602b602052604090205460ff1661115657336001600160a01b038416148061110c57506000818152600460205260409020546001600160a01b031633145b8061113a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b6111565760405162461bcd60e51b8152600401610b3290613a62565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602a546001600160a01b0316331461120957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0398891617909155602680548216968816969096179095556024805486169487169490941790935560278054851692861692909217909155602880548416918516919091179055602980549092169216919091179055565b6012826009811061129557600080fd5b0181815481106112a457600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b336000908152602b602052604090205460ff166112fa5760405162461bcd60e51b8152600401610b3290613cfb565b60408051808201825267ffffffffffffffff42818116835243828116602080860191825232600090815260109091529586209451855491518516600160401b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921694169390931792909217909255915b83518110156114315760405180604001604052808367ffffffffffffffff1681526020018467ffffffffffffffff16815250601160008684815181106113b5576113b5613d0b565b60209081029190910181015161ffff1682528181019290925260400160002082518154939092015167ffffffffffffffff908116600160401b027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169216919091179190911790558061142981613d37565b91505061136d565b50505050565b601b826009811061129557600080fd5b336000908152602b6020526040812054829060ff1680611486575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6114a25760405162461bcd60e51b8152600401610b3290613ad0565b50506000908152600360205260409020546001600160a01b031690565b336000908152602b6020526040902054819060ff16806114fe575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61151a5760405162461bcd60e51b8152600401610b3290613ad0565b611525848484611069565b6001600160a01b0383163b15806115e957506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a029061158290339089908890600401613d52565b6020604051808303816000875af11580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6114315760405162461bcd60e51b8152600401610b3290613df2565b60065460ff16156116285760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff1661164457600080fd5b6000818152600360205260409020546001600160a01b0316321461167a5760405162461bcd60e51b8152600401610b3290613e76565b610c85816128b5565b6000818152600d602052604090208054606091906116a090613a07565b80601f01602080910402602001604051908101604052809291908181526020018280546116cc90613a07565b80156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050919050565b602a546001600160a01b0316331461173c57600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19166001179055565b60065460ff16156117835760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff166117b25760405162461bcd60e51b8152600401610b3290613eb8565b600654611770906117cd90610100900461ffff166001613ec8565b61ffff1611156117ef5760405162461bcd60e51b8152600401610b3290613f23565b600680546301000000900461ffff1690600361180a83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161183e83613f33565b91906101000a81548161ffff021916908361ffff16021790555050611877600660039054906101000a900461ffff1661ffff1682612972565b50326001600160a01b0383161480159061189f57506024546001600160a01b03838116911614155b156118de57600654604051630100000090910461ffff16907fc5ba9b981116d2c5dee43379fd5b23fb0248800776ae0f450bdd57f81e898a4490600090a25b6006546118f79083906301000000900461ffff16612c10565b5050565b606060008290506000815167ffffffffffffffff81111561191e5761191e6132ab565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b50905060005b8251811015611a8657604183828151811061196b5761196b613d0b565b016020015160f81c1080159061199b5750605a83828151811061199057611990613d0b565b016020015160f81c11155b15611a15578281815181106119b2576119b2613d0b565b602001015160f81c60f81b60f81c60206119cc9190613f4e565b60f81b8282815181106119e1576119e1613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a74565b828181518110611a2757611a27613d0b565b602001015160f81c60f81b828281518110611a4457611a44613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80611a7e81613d37565b91505061194e565b509392505050565b60018054610a4c90613a07565b60065460ff1615611abe5760405162461bcd60e51b8152600401610b3290613e34565b60005b61ffff8116821115611e915760295433906001600160a01b03166339c7639c858561ffff8616818110611af657611af6613d0b565b9050602002016020810190611b0b9190613f6f565b6040518263ffffffff1660e01b8152600401611b279190613fa9565b602060405180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613fc2565b6001600160a01b031614611b8e5760405162461bcd60e51b8152600401610b3290614015565b6029546001600160a01b03166318d21284848461ffff8516818110611bb557611bb5613d0b565b9050602002016020810190611bca9190613f6f565b6040518263ffffffff1660e01b8152600401611be69190613fa9565b61014060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190614118565b6009600085858561ffff16818110611c4257611c42613d0b565b9050602002016020810190611c579190613f6f565b61ffff908116825260208083019390935260409182016000208451815494860151938601516060870151608088015160a089015160c08a015160e08b0151610100808d0151610120909d015161ffff19909c1697151561ff0019169790971760ff9a8b169097029690961763ffff0000191662010000958a169590950263ff0000001916949094176301000000938916939093029290921765ffff0000000019166401000000009188169190910265ff000000000019161765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9584169590950269ff00000000000000000019169490941769010000000000000000009290931691909102919091179091556029546001600160a01b0316906342966c6890859085908516818110611dc157611dc1613d0b565b9050602002016020810190611dd69190613f6f565b6040518263ffffffff1660e01b8152600401611df29190613fa9565b600060405180830381600087803b158015611e0c57600080fd5b505af1158015611e20573d6000803e3d6000fd5b5050602454611e6992506001600160a01b03169050848461ffff8516818110611e4b57611e4b613d0b565b9050602002016020810190611e609190613f6f565b61ffff16612c10565b60078054906000611e7983613d37565b91905055508080611e8990613f33565b915050611ac1565b506024546040517fa36410330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a364103390611edf903390869086906004016141a3565b600060405180830381600087803b158015611ef957600080fd5b505af1158015611f0d573d6000803e3d6000fd5b505050505050565b600080829050600181511015611f2e5750600092915050565b601981511115611f415750600092915050565b80600081518110611f5457611f54613d0b565b6020910101516001600160f81b031916600160fd1b1415611f785750600092915050565b8060018251611f8791906141c4565b81518110611f9757611f97613d0b565b6020910101516001600160f81b031916600160fd1b1415611fbb5750600092915050565b600081600081518110611fd057611fd0613d0b565b01602001516001600160f81b031916905060005b82518110156121c157600083828151811061200157612001613d0b565b01602001516001600160f81b0319169050600160fd1b811480156120325750600160fd1b6001600160f81b03198416145b156120435750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906120a757507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561211557507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061211357507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561218257507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061218057507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561219c5750600160fd1b6001600160f81b0319821614155b156121ad5750600095945050505050565b9150806121b981613d37565b915050611fe4565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061222f908590613116565b60405180910390a35050565b60065460ff161561225e5760405162461bcd60e51b8152600401610b3290613e34565b602a546001600160a01b0316331461227557600080fd5b60065461177090612292906301000000900461ffff166001613ec8565b61ffff1611156122b45760405162461bcd60e51b8152600401610b329061420d565b600680546301000000900461ffff169060036122cf83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161230383613f33565b91906101000a81548161ffff021916908361ffff1602179055505061233c600660039054906101000a900461ffff1661ffff1682612ce3565b506006546118f79083906301000000900461ffff16612c10565b336000908152602b6020526040902054829060ff1680612395575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6123b15760405162461bcd60e51b8152600401610b3290613ad0565b6123bc858585611069565b6001600160a01b0384163b158061248257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a029061241b9033908a908990899060040161421d565b6020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e9190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61249e5760405162461bcd60e51b8152600401610b3290613df2565b5050505050565b336000908152602b602052604090205460609060ff16806124e657503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b6125025760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680612541575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61255d5760405162461bcd60e51b8152600401610b3290613ad0565b6000838152600b602052604090205460ff1615612609576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd906125bd90869060040161362f565b600060405180830381865afa1580156125da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261260291908101906142b9565b9150610e88565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd9061265290869060040161362f565b600060405180830381865afa15801561266f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261269791908101906142b9565b9392505050565b336000908152602b602052604081205460ff166126cd5760405162461bcd60e51b8152600401610b3290613cfb565b50600090815260116020526040902054600160401b900467ffffffffffffffff1690565b602a546001600160a01b0316331461270857600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336000908152602b602052604081205460ff168061277e57506001600160a01b03821660009081526010602052604090205443600160401b90910467ffffffffffffffff16105b61279a5760405162461bcd60e51b8152600401610b32906142f4565b506001600160a01b031660009081526002602052604090205490565b60065460ff16156127d95760405162461bcd60e51b8152600401610b3290613e34565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861280e3390565b60405161281b919061322b565b60405180910390a1565b60065460ff166128475760405162461bcd60e51b8152600401610b3290614387565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361280e565b80600f612884846118fb565b6040516128919190613a94565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000818152600360205260409020546001600160a01b0316806128ea5760405162461bcd60e51b8152600401610b32906143c9565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526129cc82612d6d565b9050600c60006129db83612ed4565b81526020019081526020016000205460001415612b795760008381526009602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e015161ffff19909c1698151561ff0019169890981760ff9a8b169091021763ffff0000191662010000968a169690960263ff0000001916959095176301000000948916949094029390931765ffff0000000019166401000000009288169290920265ff000000000019169190911765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9184169190910269ff000000000000000000191617690100000000000000000092909316919091029190911790558390600c90612b3584612ed4565b815260200190815260200160002081905550827fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb975860405160405180910390a2610a0f565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526126979185916001600160a01b039091169063b863bd3790612bc890879060040161362f565b6020604051808303816000875af1158015612be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0b91906143e4565b612972565b6001600160a01b038216612c365760405162461bcd60e51b8152600401610b3290613cb9565b6000818152600360205260409020546001600160a01b031615612c6b5760405162461bcd60e51b8152600401610b3290614437565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526006805461ffff63010000009182900481166000908152600a865287812087518154961660ff19968716179055925491909104168152600b909252838220805490911660011790559151909184917fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb97589190a292915050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c9190612dd59061ffff841690612f34565b60ff16602082015260109190911c90612df361ffff83166001612f34565b60ff16604082015260109190911c90612e1161ffff83166002612f34565b60ff16606082015260109190911c90612e2f61ffff83166003612f34565b60ff16608082015260109190911c90612e4d61ffff83166004612f34565b60ff1660a082015260109190911c90612e6b61ffff83166005612f34565b60ff1660c082015260109190911c90612e8961ffff83166006612f34565b60ff1660e082015260109190911c90612ea761ffff83166007612f34565b60ff1661010082015260109190911c90612ec661ffff83166008612f34565b60ff16610120820152919050565b6020808201516040808401516060850151608086015160a087015160c088015160e08901516101008a01516101208b0151975160009a612f169a99910161445f565b60408051601f19818403018152919052805160209091012092915050565b60008060128360ff1660098110612f4d57612f4d613d0b565b0154612f5990856144f7565b905060128360ff1660098110612f7157612f71613d0b565b018160ff1681548110612f8657612f86613d0b565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612fbc579050610a0f565b601b8360ff1660098110612fd257612fd2613d0b565b018160ff1681548110612fe757612fe7613d0b565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805461301c90613a07565b90600052602060002090601f01602090048101928261303e5760008555613084565b82601f1061305757805160ff1916838001178555613084565b82800160010185558215613084579182015b82811115613084578251825591602001919060010190613069565b50613090929150613094565b5090565b5b808211156130905760008155600101613095565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610c8557600080fd5b8035610a0f816130a9565b6000602082840312156130f8576130f8600080fd5b600061310484846130d8565b949350505050565b8015155b82525050565b60208101610a0f828461310c565b8015156130cd565b8035610a0f81613124565b60006020828403121561314c5761314c600080fd5b6000613104848461312c565b61ffff8116613110565b60208101610a0f8284613158565b60005b8381101561318b578181015183820152602001613173565b838111156114315750506000910152565b60006131a6825190565b8084526020840193506131bd818560208601613170565b601f01601f19169290920192915050565b60208082528101612697818461319c565b806130cd565b8035610a0f816131df565b60006020828403121561320557613205600080fd5b600061310484846131e5565b60006001600160a01b038216610a0f565b61311081613211565b60208101610a0f8284613222565b6130cd81613211565b8035610a0f81613239565b6000806040838503121561326357613263600080fd5b600061326f8585613242565b9250506020613280858286016131e5565b9150509250929050565b60006020828403121561329f5761329f600080fd5b60006131048484613242565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156132e7576132e76132ab565b6040525050565b60006132f960405190565b905061330582826132c1565b919050565b600067ffffffffffffffff821115613324576133246132ab565b601f19601f83011660200192915050565b82818337506000910152565b600061335461334f8461330a565b6132ee565b90508281526020810184848401111561336f5761336f600080fd5b611a86848285613335565b600082601f83011261338e5761338e600080fd5b8135613104848260208601613341565b6000602082840312156133b3576133b3600080fd5b813567ffffffffffffffff8111156133cd576133cd600080fd5b6131048482850161337a565b6000610a0f6001600160a01b0383166133f0565b90565b6001600160a01b031690565b6000610a0f826133d9565b6000610a0f826133fc565b61311081613407565b60208101610a0f8284613412565b60ff8116613110565b805161343e838261310c565b5060208101516134516020840182613429565b5060408101516134646040840182613429565b5060608101516134776060840182613429565b50608081015161348a6080840182613429565b5060a081015161349d60a0840182613429565b5060c08101516134b060c0840182613429565b5060e08101516134c360e0840182613429565b506101008101516134d8610100840182613429565b506101208101516134ed610120840182613429565b505050565b6101408101610a0f8284613432565b6000806040838503121561351757613517600080fd5b600061352385856131e5565b925050602083013567ffffffffffffffff81111561354357613543600080fd5b6132808582860161337a565b60008060006060848603121561356757613567600080fd5b60006135738686613242565b935050602061358486828701613242565b9250506040613595868287016131e5565b9150509250925092565b60008060008060008060c087890312156135bb576135bb600080fd5b60006135c78989613242565b96505060206135d889828a01613242565b95505060406135e989828a01613242565b94505060606135fa89828a01613242565b935050608061360b89828a01613242565b92505060a061361c89828a01613242565b9150509295509295509295565b80613110565b60208101610a0f8284613629565b6000806040838503121561365357613653600080fd5b600061326f85856131e5565b60208101610a0f8284613429565b600067ffffffffffffffff821115613687576136876132ab565b5060209081020190565b61ffff81166130cd565b8035610a0f81613691565b60006136b461334f8461366d565b838152905060208082019084028301858111156136d3576136d3600080fd5b835b818110156136f5576136e7878261369b565b8352602092830192016136d5565b5050509392505050565b600082601f83011261371357613713600080fd5b81356131048482602086016136a6565b60006020828403121561373857613738600080fd5b813567ffffffffffffffff81111561375257613752600080fd5b613104848285016136ff565b60008083601f84011261377357613773600080fd5b50813567ffffffffffffffff81111561378e5761378e600080fd5b6020830191508360208202830111156137a9576137a9600080fd5b9250929050565b600080602083850312156137c6576137c6600080fd5b823567ffffffffffffffff8111156137e0576137e0600080fd5b6137ec8582860161375e565b92509250509250929050565b6000806040838503121561380e5761380e600080fd5b600061381a8585613242565b92505060206132808582860161312c565b80516134ed8382613429565b60208101610a0f828461382b565b60ff81166130cd565b8035610a0f81613845565b6000806040838503121561386f5761386f600080fd5b600061387b8585613242565b92505060206132808582860161384e565b600080600080608085870312156138a5576138a5600080fd5b60006138b18787613242565b94505060206138c287828801613242565b93505060406138d3878288016131e5565b925050606085013567ffffffffffffffff8111156138f3576138f3600080fd5b6138ff8782880161337a565b91505092959194509250565b610140810161391a828d61310c565b613927602083018c613429565b613934604083018b613429565b613941606083018a613429565b61394e6080830189613429565b61395b60a0830188613429565b61396860c0830187613429565b61397560e0830186613429565b613983610100830185613429565b613991610120830184613429565b9b9a5050505050505050505050565b600080604083850312156139b6576139b6600080fd5b60006139c28585613242565b925050602061328085828601613242565b67ffffffffffffffff8116613110565b60208101610a0f82846139d3565b634e487b7160e01b600052602260045260246000fd5b600281046001821680613a1b57607f821691505b60208210811415610e8857610e886139f1565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610a0f81613a2e565b6000613a7c825190565b613a8a818560208601613170565b9290920192915050565b610a0f8183613a72565b60158152602081017f596f757220747279696e6720746865206368656174000000000000000000000081529050613a5c565b60208082528101610a0f81613a9e565b60188152602081017f6e616d696e67206e6f742079657420617661696c616e6c65000000000000000081529050613a5c565b60208082528101610a0f81613ae0565b60178152602081017f4e6f7420796f75722070697261746520746f206e616d6500000000000000000081529050613a5c565b60208082528101610a0f81613b22565b60148152602081017f50697261746520616c7265616479206e616d656400000000000000000000000081529050613a5c565b60208082528101610a0f81613b64565b60108152602081017f4e6f7420612076616c6964206e616d650000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613ba6565b60158152602081017f4e616d6520616c7265616479207265736572766564000000000000000000000081529050613a5c565b60208082528101610a0f81613be8565b60408101613c388285613222565b6126976020830184613629565b600a8152602081017f57524f4e475f46524f4d0000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c45565b60118152602081017f494e56414c49445f524543495049454e5400000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c87565b60198152602081017f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000081529050613a5c565b60208082528101610a0f81613cc9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d4b57613d4b613d21565b5060010190565b60808101613d608286613222565b613d6d6020830185613222565b613d7a6040830184613629565b818103606083015260008152602081015b95945050505050565b8051610a0f816130a9565b600060208284031215613db457613db4600080fd5b60006131048484613d94565b60108152602081017f554e534146455f524543495049454e540000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613dc0565b60108152602081017f5061757361626c653a207061757365640000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e02565b60098152602081017f6e6f74206f776e6572000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e44565b600b8152602081017f4f6e6c792041646d696e7300000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e86565b61ffff8116905061ffff8216915060008261ffff03821115613eec57613eec613d21565b500190565b60168152602081017f50697261746520666f72636573206172652066756c6c0000000000000000000081529050613a5c565b60208082528101610a0f81613ef1565b61ffff81169050600061ffff821415613d4b57613d4b613d21565b60ff8116905060ff8216915060008260ff03821115613eec57613eec613d21565b600060208284031215613f8457613f84600080fd5b6000613104848461369b565b6000610a0f6133ed61ffff841681565b61311081613f90565b60208101610a0f8284613fa0565b8051610a0f81613239565b600060208284031215613fd757613fd7600080fd5b60006131048484613fb7565b60068152602081017f544849454621000000000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613fe3565b8051610a0f81613124565b8051610a0f81613845565b6000610140828403121561405157614051600080fd5b61405c6101406132ee565b9050600061406a8484614025565b90820152602061407c84848301614030565b90820152604061408e84848301614030565b9082015260606140a084848301614030565b9082015260806140b284848301614030565b9082015260a06140c484848301614030565b9082015260c06140d684848301614030565b9082015260e06140e884848301614030565b908201526101006140fb84848301614030565b9082015261012061410e84848301614030565b9082015292915050565b6000610140828403121561412e5761412e600080fd5b6000613104848461403b565b6141448282613158565b5060200190565b506000610a0f602083018361369b565b8183526020830192506000818060005b858110156141985761417d828461414b565b614187888261413a565b97505060208201915060010161416b565b509495945050505050565b604081016141b18286613222565b8181036020830152613d8b81848661415b565b6000828210156141d6576141d6613d21565b500390565b60128152602081017f416c6c2050697261746573204d696e746564000000000000000000000000000081529050613a5c565b60208082528101610a0f816141db565b6080810161422b8287613222565b6142386020830186613222565b6142456040830185613629565b8181036060830152614257818461319c565b9695505050505050565b600061426f61334f8461330a565b90508281526020810184848401111561428a5761428a600080fd5b611a86848285613170565b600082601f8301126142a9576142a9600080fd5b8151613104848260208601614261565b6000602082840312156142ce576142ce600080fd5b815167ffffffffffffffff8111156142e8576142e8600080fd5b61310484828501614295565b60208082528101610a0f81603981527f6e6f20636865636b696e672062616c616e636520696e207468652073616d652060208201527f626c6f636b2069742773206265696e67206d6f64696669656400000000000000604082015260600190565b60148152602081017f5061757361626c653a206e6f742070617573656400000000000000000000000081529050613a5c565b60208082528101610a0f81614355565b600a8152602081017f4e4f545f4d494e5445440000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614397565b8051610a0f816131df565b6000602082840312156143f9576143f9600080fd5b600061310484846143d9565b600e8152602081017f414c52454144595f4d494e54454400000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614405565b6000610a0f8260f81b90565b61311060ff8216614447565b614469818b614453565b600101614476818a614453565b6001016144838189614453565b6001016144908188614453565b60010161449d8187614453565b6001016144aa8186614453565b6001016144b78185614453565b6001016144c48184614453565b6001016144d18183614453565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff918216911660008261450d5761450d6144e1565b50069056fea2646970667358221220631276743fb4245f2baf966a5c6faa318730a8d6955b5a3d77b0cfc2d9599af064736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103785760003560e01c806370480275116101d3578063b88d4fde11610104578063e985e9c5116100a2578063eed4b34c1161007c578063eed4b34c146108e4578063f10fb584146108f7578063f2fde38b1461090a578063f8b2cb4f1461091d57600080fd5b8063e985e9c51461088d578063ebd17368146108bb578063edca3f17146108db57600080fd5b8063ddcbd86b116100de578063ddcbd86b146107a3578063de9375f214610844578063e1fc334f14610857578063e60738691461086a57600080fd5b8063b88d4fde1461075a578063c87b56dd1461076d578063d41d416d1461078057600080fd5b806395d89b4111610171578063a1b8f3741161014b578063a1b8f374146106cd578063a22cb465146106ed578063b07ba6a714610700578063b6a719531461074757600080fd5b806395d89b411461069f5780639e1bd408146106a75780639ffdb65a146106ba57600080fd5b806383c79d43116101ad57806383c79d43146106485780638da5cb5b146106585780638f58e7a8146106695780639416b4231461068c57600080fd5b8063704802751461060f57806370c124cc1461062257806375ab9b761461063557600080fd5b80632463a55a116102ad57806342966c681161024b5780635c975abb116102255780635c975abb146105b55780636352211e146105c05780636ca865ba146105e95780636d522418146105fc57600080fd5b806342966c681461058057806347486c75146105935780634f02c420146105a057600080fd5b806335ca838b1161028757806335ca838b14610534578063368383911461054757806339c7639c1461055a57806342842e0e1461056d57600080fd5b80632463a55a146104eb5780632c678c64146104fe57806333df4b2c1461051457600080fd5b806315b56d101161031a5780631785f53c116102f45780631785f53c1461049257806318d21284146104a55780631a2fbc7c146104c557806323b872dd146104d857600080fd5b806315b56d101461044c578063165272311461045f57806316c38b3c1461047f57600080fd5b806306fdde031161035657806306fdde03146103db578063081812fc146103f0578063095ea7b3146104265780631509f2941461043957600080fd5b806301ffc9a71461037d57806302815835146103a6578063046b07aa146103bb575b600080fd5b61039061038b3660046130e3565b610930565b60405161039d9190613116565b60405180910390f35b6103b96103b4366004613137565b610a15565b005b6006546103ce90610100900461ffff1681565b60405161039d9190613162565b6103e3610a3f565b60405161039d91906131ce565b6104196103fe3660046131f0565b6004602052600090815260409020546001600160a01b031681565b60405161039d919061322b565b6103b961043436600461324d565b610acd565b6103b961044736600461328a565b610ba4565b61039061045a36600461339e565b610bea565b602454610472906001600160a01b031681565b60405161039d919061341b565b6103b961048d366004613137565b610c1d565b6103b96104a036600461328a565b610c90565b6104b86104b33660046131f0565b610cc8565b60405161039d91906134f2565b6103b96104d3366004613501565b610e8e565b6103b96104e636600461354f565b611069565b6103b96104f936600461359f565b6111f2565b61050760075481565b60405161039d919061362f565b61052761052236600461363d565b611285565b60405161039d919061365f565b6103b9610542366004613723565b6112cb565b61052761055536600461363d565b611437565b6104196105683660046131f0565b611447565b6103b961057b36600461354f565b6114bf565b6103b961058e3660046131f0565b611605565b6008546103909060ff1681565b6006546103ce906301000000900461ffff1681565b60065460ff16610390565b6104196105ce3660046131f0565b6003602052600090815260409020546001600160a01b031681565b602854610472906001600160a01b031681565b6103e361060a3660046131f0565b611683565b6103b961061d36600461328a565b611725565b6103b961063036600461324d565b611760565b602654610472906001600160a01b031681565b610507686c6b935b8bbd40000081565b602a546001600160a01b0316610419565b6103906106773660046131f0565b6000908152600e602052604090205460ff1690565b6103e361069a36600461339e565b6118fb565b6103e3611a8e565b6103b96106b53660046137b0565b611a9b565b6103906106c836600461339e565b611f15565b6105076106db3660046131f0565b600c6020526000908152604090205481565b6103b96106fb3660046137f8565b6121cc565b61073a61070e3660046131f0565b6040805160208082018352600091829052928152600a835281902081519283019091525460ff16815290565b60405161039d9190613837565b6103b9610755366004613859565b61223b565b6103b961076836600461388c565b612356565b6103e361077b3660046131f0565b6124a5565b61052761078e3660046131f0565b600a6020526000908152604090205460ff1681565b61082e6107b13660046131f0565b60096020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691660100000000000082048116916701000000000000008104821691600160401b820481169169010000000000000000009004168a565b60405161039d9a9998979695949392919061390b565b602a54610419906001600160a01b031681565b602554610472906001600160a01b031681565b6103906108783660046131f0565b600b6020526000908152604090205460ff1681565b61039061089b3660046139a0565b600560209081526000928352604080842090915290825290205460ff1681565b6108ce6108c93660046131f0565b61269e565b60405161039d91906139e3565b61050761177081565b602954610472906001600160a01b031681565b602754610472906001600160a01b031681565b6103b961091836600461328a565b6126f1565b61050761092b36600461328a565b612737565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614806109c357507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610a0f57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602a546001600160a01b03163314610a2c57600080fd5b6008805460ff1916911515919091179055565b60008054610a4c90613a07565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7890613a07565b8015610ac55780601f10610a9a57610100808354040283529160200191610ac5565b820191906000526020600020905b815481529060010190602001808311610aa857829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610b1657506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610b3b5760405162461bcd60e51b8152600401610b3290613a62565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602a546001600160a01b03163314610bbb57600080fd5b602c805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000600f610bf7836118fb565b604051610c049190613a94565b9081526040519081900360200190205460ff1692915050565b6025546001600160a01b031615801590610c4157506024546001600160a01b031615155b8015610c5757506027546001600160a01b031615155b610c6057600080fd5b602a546001600160a01b03163314610c7757600080fd5b8015610c8857610c856127b6565b50565b610c85612825565b602a546001600160a01b03163314610ca757600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19169055565b604080516101408101825260008082526020808301829052828401829052606083018290526080830182905260a0830182905260c0830182905260e0830182905261010083018290526101208301829052338252602b9052919091205460ff1680610d5357503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b610d6f5760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680610dae575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b610dca5760405162461bcd60e51b8152600401610b3290613ad0565b600083815260096020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152600160401b8104841692820192909252690100000000000000000090910490911661012082015291505b50919050565b60085460ff161515600114610eb55760405162461bcd60e51b8152600401610b3290613b12565b6000828152600360205260409020546001600160a01b03163314610eeb5760405162461bcd60e51b8152600401610b3290613b54565b6000828152600e602052604090205460ff1615610f1a5760405162461bcd60e51b8152600401610b3290613b96565b610f2381611f15565b1515600114610f445760405162461bcd60e51b8152600401610b3290613bd8565b610f4d81610bea565b15610f6a5760405162461bcd60e51b8152600401610b3290613c1a565b610f75816001612878565b6000828152600e60209081526040808320805460ff19166001179055600d82529091208251610fa692840190613010565b506028546040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690639dc29fac90610ffb903390686c6b935b8bbd40000090600401613c2a565b600060405180830381600087803b15801561101557600080fd5b505af1158015611029573d6000803e3d6000fd5b50505050817ff82afa02631c3ed951c54b199dcaaa44d042ba6804e1e1dc55d4f3998b5c6e768260405161105d91906131ce565b60405180910390a25050565b6000818152600360205260409020546001600160a01b038481169116146110a25760405162461bcd60e51b8152600401610b3290613c77565b6001600160a01b0382166110c85760405162461bcd60e51b8152600401610b3290613cb9565b336000908152602b602052604090205460ff1661115657336001600160a01b038416148061110c57506000818152600460205260409020546001600160a01b031633145b8061113a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b6111565760405162461bcd60e51b8152600401610b3290613a62565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602a546001600160a01b0316331461120957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0398891617909155602680548216968816969096179095556024805486169487169490941790935560278054851692861692909217909155602880548416918516919091179055602980549092169216919091179055565b6012826009811061129557600080fd5b0181815481106112a457600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b336000908152602b602052604090205460ff166112fa5760405162461bcd60e51b8152600401610b3290613cfb565b60408051808201825267ffffffffffffffff42818116835243828116602080860191825232600090815260109091529586209451855491518516600160401b027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090921694169390931792909217909255915b83518110156114315760405180604001604052808367ffffffffffffffff1681526020018467ffffffffffffffff16815250601160008684815181106113b5576113b5613d0b565b60209081029190910181015161ffff1682528181019290925260400160002082518154939092015167ffffffffffffffff908116600160401b027fffffffffffffffffffffffffffffffff000000000000000000000000000000009094169216919091179190911790558061142981613d37565b91505061136d565b50505050565b601b826009811061129557600080fd5b336000908152602b6020526040812054829060ff1680611486575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6114a25760405162461bcd60e51b8152600401610b3290613ad0565b50506000908152600360205260409020546001600160a01b031690565b336000908152602b6020526040902054819060ff16806114fe575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61151a5760405162461bcd60e51b8152600401610b3290613ad0565b611525848484611069565b6001600160a01b0383163b15806115e957506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a029061158290339089908890600401613d52565b6020604051808303816000875af11580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6114315760405162461bcd60e51b8152600401610b3290613df2565b60065460ff16156116285760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff1661164457600080fd5b6000818152600360205260409020546001600160a01b0316321461167a5760405162461bcd60e51b8152600401610b3290613e76565b610c85816128b5565b6000818152600d602052604090208054606091906116a090613a07565b80601f01602080910402602001604051908101604052809291908181526020018280546116cc90613a07565b80156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050919050565b602a546001600160a01b0316331461173c57600080fd5b6001600160a01b03166000908152602b60205260409020805460ff19166001179055565b60065460ff16156117835760405162461bcd60e51b8152600401610b3290613e34565b336000908152602b602052604090205460ff166117b25760405162461bcd60e51b8152600401610b3290613eb8565b600654611770906117cd90610100900461ffff166001613ec8565b61ffff1611156117ef5760405162461bcd60e51b8152600401610b3290613f23565b600680546301000000900461ffff1690600361180a83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161183e83613f33565b91906101000a81548161ffff021916908361ffff16021790555050611877600660039054906101000a900461ffff1661ffff1682612972565b50326001600160a01b0383161480159061189f57506024546001600160a01b03838116911614155b156118de57600654604051630100000090910461ffff16907fc5ba9b981116d2c5dee43379fd5b23fb0248800776ae0f450bdd57f81e898a4490600090a25b6006546118f79083906301000000900461ffff16612c10565b5050565b606060008290506000815167ffffffffffffffff81111561191e5761191e6132ab565b6040519080825280601f01601f191660200182016040528015611948576020820181803683370190505b50905060005b8251811015611a8657604183828151811061196b5761196b613d0b565b016020015160f81c1080159061199b5750605a83828151811061199057611990613d0b565b016020015160f81c11155b15611a15578281815181106119b2576119b2613d0b565b602001015160f81c60f81b60f81c60206119cc9190613f4e565b60f81b8282815181106119e1576119e1613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611a74565b828181518110611a2757611a27613d0b565b602001015160f81c60f81b828281518110611a4457611a44613d0b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b80611a7e81613d37565b91505061194e565b509392505050565b60018054610a4c90613a07565b60065460ff1615611abe5760405162461bcd60e51b8152600401610b3290613e34565b60005b61ffff8116821115611e915760295433906001600160a01b03166339c7639c858561ffff8616818110611af657611af6613d0b565b9050602002016020810190611b0b9190613f6f565b6040518263ffffffff1660e01b8152600401611b279190613fa9565b602060405180830381865afa158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b689190613fc2565b6001600160a01b031614611b8e5760405162461bcd60e51b8152600401610b3290614015565b6029546001600160a01b03166318d21284848461ffff8516818110611bb557611bb5613d0b565b9050602002016020810190611bca9190613f6f565b6040518263ffffffff1660e01b8152600401611be69190613fa9565b61014060405180830381865afa158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190614118565b6009600085858561ffff16818110611c4257611c42613d0b565b9050602002016020810190611c579190613f6f565b61ffff908116825260208083019390935260409182016000208451815494860151938601516060870151608088015160a089015160c08a015160e08b0151610100808d0151610120909d015161ffff19909c1697151561ff0019169790971760ff9a8b169097029690961763ffff0000191662010000958a169590950263ff0000001916949094176301000000938916939093029290921765ffff0000000019166401000000009188169190910265ff000000000019161765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9584169590950269ff00000000000000000019169490941769010000000000000000009290931691909102919091179091556029546001600160a01b0316906342966c6890859085908516818110611dc157611dc1613d0b565b9050602002016020810190611dd69190613f6f565b6040518263ffffffff1660e01b8152600401611df29190613fa9565b600060405180830381600087803b158015611e0c57600080fd5b505af1158015611e20573d6000803e3d6000fd5b5050602454611e6992506001600160a01b03169050848461ffff8516818110611e4b57611e4b613d0b565b9050602002016020810190611e609190613f6f565b61ffff16612c10565b60078054906000611e7983613d37565b91905055508080611e8990613f33565b915050611ac1565b506024546040517fa36410330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063a364103390611edf903390869086906004016141a3565b600060405180830381600087803b158015611ef957600080fd5b505af1158015611f0d573d6000803e3d6000fd5b505050505050565b600080829050600181511015611f2e5750600092915050565b601981511115611f415750600092915050565b80600081518110611f5457611f54613d0b565b6020910101516001600160f81b031916600160fd1b1415611f785750600092915050565b8060018251611f8791906141c4565b81518110611f9757611f97613d0b565b6020910101516001600160f81b031916600160fd1b1415611fbb5750600092915050565b600081600081518110611fd057611fd0613d0b565b01602001516001600160f81b031916905060005b82518110156121c157600083828151811061200157612001613d0b565b01602001516001600160f81b0319169050600160fd1b811480156120325750600160fd1b6001600160f81b03198416145b156120435750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906120a757507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561211557507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061211357507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561218257507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061218057507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b801561219c5750600160fd1b6001600160f81b0319821614155b156121ad5750600095945050505050565b9150806121b981613d37565b915050611fe4565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061222f908590613116565b60405180910390a35050565b60065460ff161561225e5760405162461bcd60e51b8152600401610b3290613e34565b602a546001600160a01b0316331461227557600080fd5b60065461177090612292906301000000900461ffff166001613ec8565b61ffff1611156122b45760405162461bcd60e51b8152600401610b329061420d565b600680546301000000900461ffff169060036122cf83613f33565b825461ffff91821661010093840a908102908302199091161790925560068054919091049091169150600161230383613f33565b91906101000a81548161ffff021916908361ffff1602179055505061233c600660039054906101000a900461ffff1661ffff1682612ce3565b506006546118f79083906301000000900461ffff16612c10565b336000908152602b6020526040902054829060ff1680612395575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b6123b15760405162461bcd60e51b8152600401610b3290613ad0565b6123bc858585611069565b6001600160a01b0384163b158061248257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a029061241b9033908a908990899060040161421d565b6020604051808303816000875af115801561243a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061245e9190613d9f565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b61249e5760405162461bcd60e51b8152600401610b3290613df2565b5050505050565b336000908152602b602052604090205460609060ff16806124e657503260009081526010602052604090205443600160401b90910467ffffffffffffffff16105b6125025760405162461bcd60e51b8152600401610b3290613ad0565b336000908152602b6020526040902054829060ff1680612541575060008181526011602052604090205443600160401b90910467ffffffffffffffff16105b61255d5760405162461bcd60e51b8152600401610b3290613ad0565b6000838152600b602052604090205460ff1615612609576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd906125bd90869060040161362f565b600060405180830381865afa1580156125da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261260291908101906142b9565b9150610e88565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd9061265290869060040161362f565b600060405180830381865afa15801561266f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261269791908101906142b9565b9392505050565b336000908152602b602052604081205460ff166126cd5760405162461bcd60e51b8152600401610b3290613cfb565b50600090815260116020526040902054600160401b900467ffffffffffffffff1690565b602a546001600160a01b0316331461270857600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b336000908152602b602052604081205460ff168061277e57506001600160a01b03821660009081526010602052604090205443600160401b90910467ffffffffffffffff16105b61279a5760405162461bcd60e51b8152600401610b32906142f4565b506001600160a01b031660009081526002602052604090205490565b60065460ff16156127d95760405162461bcd60e51b8152600401610b3290613e34565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861280e3390565b60405161281b919061322b565b60405180910390a1565b60065460ff166128475760405162461bcd60e51b8152600401610b3290614387565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361280e565b80600f612884846118fb565b6040516128919190613a94565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000818152600360205260409020546001600160a01b0316806128ea5760405162461bcd60e51b8152600401610b32906143c9565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091526129cc82612d6d565b9050600c60006129db83612ed4565b81526020019081526020016000205460001415612b795760008381526009602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e015161ffff19909c1698151561ff0019169890981760ff9a8b169091021763ffff0000191662010000968a169690960263ff0000001916959095176301000000948916949094029390931765ffff0000000019166401000000009288169290920265ff000000000019169190911765010000000000918716919091021767ffff000000000000191666010000000000009186169190910267ff00000000000000191617670100000000000000918516919091021769ffff00000000000000001916600160401b9184169190910269ff000000000000000000191617690100000000000000000092909316919091029190911790558390600c90612b3584612ed4565b815260200190815260200160002081905550827fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb975860405160405180910390a2610a0f565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526126979185916001600160a01b039091169063b863bd3790612bc890879060040161362f565b6020604051808303816000875af1158015612be7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0b91906143e4565b612972565b6001600160a01b038216612c365760405162461bcd60e51b8152600401610b3290613cb9565b6000818152600360205260409020546001600160a01b031615612c6b5760405162461bcd60e51b8152600401610b3290614437565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526006805461ffff63010000009182900481166000908152600a865287812087518154961660ff19968716179055925491909104168152600b909252838220805490911660011790559151909184917fa3ba0e0a42560fe2a8ab34eb02d0456175176330eb0198f660592c8464cb97589190a292915050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c9190612dd59061ffff841690612f34565b60ff16602082015260109190911c90612df361ffff83166001612f34565b60ff16604082015260109190911c90612e1161ffff83166002612f34565b60ff16606082015260109190911c90612e2f61ffff83166003612f34565b60ff16608082015260109190911c90612e4d61ffff83166004612f34565b60ff1660a082015260109190911c90612e6b61ffff83166005612f34565b60ff1660c082015260109190911c90612e8961ffff83166006612f34565b60ff1660e082015260109190911c90612ea761ffff83166007612f34565b60ff1661010082015260109190911c90612ec661ffff83166008612f34565b60ff16610120820152919050565b6020808201516040808401516060850151608086015160a087015160c088015160e08901516101008a01516101208b0151975160009a612f169a99910161445f565b60408051601f19818403018152919052805160209091012092915050565b60008060128360ff1660098110612f4d57612f4d613d0b565b0154612f5990856144f7565b905060128360ff1660098110612f7157612f71613d0b565b018160ff1681548110612f8657612f86613d0b565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c9091161015612fbc579050610a0f565b601b8360ff1660098110612fd257612fd2613d0b565b018160ff1681548110612fe757612fe7613d0b565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b82805461301c90613a07565b90600052602060002090601f01602090048101928261303e5760008555613084565b82601f1061305757805160ff1916838001178555613084565b82800160010185558215613084579182015b82811115613084578251825591602001919060010190613069565b50613090929150613094565b5090565b5b808211156130905760008155600101613095565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610c8557600080fd5b8035610a0f816130a9565b6000602082840312156130f8576130f8600080fd5b600061310484846130d8565b949350505050565b8015155b82525050565b60208101610a0f828461310c565b8015156130cd565b8035610a0f81613124565b60006020828403121561314c5761314c600080fd5b6000613104848461312c565b61ffff8116613110565b60208101610a0f8284613158565b60005b8381101561318b578181015183820152602001613173565b838111156114315750506000910152565b60006131a6825190565b8084526020840193506131bd818560208601613170565b601f01601f19169290920192915050565b60208082528101612697818461319c565b806130cd565b8035610a0f816131df565b60006020828403121561320557613205600080fd5b600061310484846131e5565b60006001600160a01b038216610a0f565b61311081613211565b60208101610a0f8284613222565b6130cd81613211565b8035610a0f81613239565b6000806040838503121561326357613263600080fd5b600061326f8585613242565b9250506020613280858286016131e5565b9150509250929050565b60006020828403121561329f5761329f600080fd5b60006131048484613242565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156132e7576132e76132ab565b6040525050565b60006132f960405190565b905061330582826132c1565b919050565b600067ffffffffffffffff821115613324576133246132ab565b601f19601f83011660200192915050565b82818337506000910152565b600061335461334f8461330a565b6132ee565b90508281526020810184848401111561336f5761336f600080fd5b611a86848285613335565b600082601f83011261338e5761338e600080fd5b8135613104848260208601613341565b6000602082840312156133b3576133b3600080fd5b813567ffffffffffffffff8111156133cd576133cd600080fd5b6131048482850161337a565b6000610a0f6001600160a01b0383166133f0565b90565b6001600160a01b031690565b6000610a0f826133d9565b6000610a0f826133fc565b61311081613407565b60208101610a0f8284613412565b60ff8116613110565b805161343e838261310c565b5060208101516134516020840182613429565b5060408101516134646040840182613429565b5060608101516134776060840182613429565b50608081015161348a6080840182613429565b5060a081015161349d60a0840182613429565b5060c08101516134b060c0840182613429565b5060e08101516134c360e0840182613429565b506101008101516134d8610100840182613429565b506101208101516134ed610120840182613429565b505050565b6101408101610a0f8284613432565b6000806040838503121561351757613517600080fd5b600061352385856131e5565b925050602083013567ffffffffffffffff81111561354357613543600080fd5b6132808582860161337a565b60008060006060848603121561356757613567600080fd5b60006135738686613242565b935050602061358486828701613242565b9250506040613595868287016131e5565b9150509250925092565b60008060008060008060c087890312156135bb576135bb600080fd5b60006135c78989613242565b96505060206135d889828a01613242565b95505060406135e989828a01613242565b94505060606135fa89828a01613242565b935050608061360b89828a01613242565b92505060a061361c89828a01613242565b9150509295509295509295565b80613110565b60208101610a0f8284613629565b6000806040838503121561365357613653600080fd5b600061326f85856131e5565b60208101610a0f8284613429565b600067ffffffffffffffff821115613687576136876132ab565b5060209081020190565b61ffff81166130cd565b8035610a0f81613691565b60006136b461334f8461366d565b838152905060208082019084028301858111156136d3576136d3600080fd5b835b818110156136f5576136e7878261369b565b8352602092830192016136d5565b5050509392505050565b600082601f83011261371357613713600080fd5b81356131048482602086016136a6565b60006020828403121561373857613738600080fd5b813567ffffffffffffffff81111561375257613752600080fd5b613104848285016136ff565b60008083601f84011261377357613773600080fd5b50813567ffffffffffffffff81111561378e5761378e600080fd5b6020830191508360208202830111156137a9576137a9600080fd5b9250929050565b600080602083850312156137c6576137c6600080fd5b823567ffffffffffffffff8111156137e0576137e0600080fd5b6137ec8582860161375e565b92509250509250929050565b6000806040838503121561380e5761380e600080fd5b600061381a8585613242565b92505060206132808582860161312c565b80516134ed8382613429565b60208101610a0f828461382b565b60ff81166130cd565b8035610a0f81613845565b6000806040838503121561386f5761386f600080fd5b600061387b8585613242565b92505060206132808582860161384e565b600080600080608085870312156138a5576138a5600080fd5b60006138b18787613242565b94505060206138c287828801613242565b93505060406138d3878288016131e5565b925050606085013567ffffffffffffffff8111156138f3576138f3600080fd5b6138ff8782880161337a565b91505092959194509250565b610140810161391a828d61310c565b613927602083018c613429565b613934604083018b613429565b613941606083018a613429565b61394e6080830189613429565b61395b60a0830188613429565b61396860c0830187613429565b61397560e0830186613429565b613983610100830185613429565b613991610120830184613429565b9b9a5050505050505050505050565b600080604083850312156139b6576139b6600080fd5b60006139c28585613242565b925050602061328085828601613242565b67ffffffffffffffff8116613110565b60208101610a0f82846139d3565b634e487b7160e01b600052602260045260246000fd5b600281046001821680613a1b57607f821691505b60208210811415610e8857610e886139f1565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610a0f81613a2e565b6000613a7c825190565b613a8a818560208601613170565b9290920192915050565b610a0f8183613a72565b60158152602081017f596f757220747279696e6720746865206368656174000000000000000000000081529050613a5c565b60208082528101610a0f81613a9e565b60188152602081017f6e616d696e67206e6f742079657420617661696c616e6c65000000000000000081529050613a5c565b60208082528101610a0f81613ae0565b60178152602081017f4e6f7420796f75722070697261746520746f206e616d6500000000000000000081529050613a5c565b60208082528101610a0f81613b22565b60148152602081017f50697261746520616c7265616479206e616d656400000000000000000000000081529050613a5c565b60208082528101610a0f81613b64565b60108152602081017f4e6f7420612076616c6964206e616d650000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613ba6565b60158152602081017f4e616d6520616c7265616479207265736572766564000000000000000000000081529050613a5c565b60208082528101610a0f81613be8565b60408101613c388285613222565b6126976020830184613629565b600a8152602081017f57524f4e475f46524f4d0000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c45565b60118152602081017f494e56414c49445f524543495049454e5400000000000000000000000000000081529050613a5c565b60208082528101610a0f81613c87565b60198152602081017f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000081529050613a5c565b60208082528101610a0f81613cc9565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d4b57613d4b613d21565b5060010190565b60808101613d608286613222565b613d6d6020830185613222565b613d7a6040830184613629565b818103606083015260008152602081015b95945050505050565b8051610a0f816130a9565b600060208284031215613db457613db4600080fd5b60006131048484613d94565b60108152602081017f554e534146455f524543495049454e540000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613dc0565b60108152602081017f5061757361626c653a207061757365640000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e02565b60098152602081017f6e6f74206f776e6572000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e44565b600b8152602081017f4f6e6c792041646d696e7300000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613e86565b61ffff8116905061ffff8216915060008261ffff03821115613eec57613eec613d21565b500190565b60168152602081017f50697261746520666f72636573206172652066756c6c0000000000000000000081529050613a5c565b60208082528101610a0f81613ef1565b61ffff81169050600061ffff821415613d4b57613d4b613d21565b60ff8116905060ff8216915060008260ff03821115613eec57613eec613d21565b600060208284031215613f8457613f84600080fd5b6000613104848461369b565b6000610a0f6133ed61ffff841681565b61311081613f90565b60208101610a0f8284613fa0565b8051610a0f81613239565b600060208284031215613fd757613fd7600080fd5b60006131048484613fb7565b60068152602081017f544849454621000000000000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81613fe3565b8051610a0f81613124565b8051610a0f81613845565b6000610140828403121561405157614051600080fd5b61405c6101406132ee565b9050600061406a8484614025565b90820152602061407c84848301614030565b90820152604061408e84848301614030565b9082015260606140a084848301614030565b9082015260806140b284848301614030565b9082015260a06140c484848301614030565b9082015260c06140d684848301614030565b9082015260e06140e884848301614030565b908201526101006140fb84848301614030565b9082015261012061410e84848301614030565b9082015292915050565b6000610140828403121561412e5761412e600080fd5b6000613104848461403b565b6141448282613158565b5060200190565b506000610a0f602083018361369b565b8183526020830192506000818060005b858110156141985761417d828461414b565b614187888261413a565b97505060208201915060010161416b565b509495945050505050565b604081016141b18286613222565b8181036020830152613d8b81848661415b565b6000828210156141d6576141d6613d21565b500390565b60128152602081017f416c6c2050697261746573204d696e746564000000000000000000000000000081529050613a5c565b60208082528101610a0f816141db565b6080810161422b8287613222565b6142386020830186613222565b6142456040830185613629565b8181036060830152614257818461319c565b9695505050505050565b600061426f61334f8461330a565b90508281526020810184848401111561428a5761428a600080fd5b611a86848285613170565b600082601f8301126142a9576142a9600080fd5b8151613104848260208601614261565b6000602082840312156142ce576142ce600080fd5b815167ffffffffffffffff8111156142e8576142e8600080fd5b61310484828501614295565b60208082528101610a0f81603981527f6e6f20636865636b696e672062616c616e636520696e207468652073616d652060208201527f626c6f636b2069742773206265696e67206d6f64696669656400000000000000604082015260600190565b60148152602081017f5061757361626c653a206e6f742070617573656400000000000000000000000081529050613a5c565b60208082528101610a0f81614355565b600a8152602081017f4e4f545f4d494e5445440000000000000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614397565b8051610a0f816131df565b6000602082840312156143f9576143f9600080fd5b600061310484846143d9565b600e8152602081017f414c52454144595f4d494e54454400000000000000000000000000000000000081529050613a5c565b60208082528101610a0f81614405565b6000610a0f8260f81b90565b61311060ff8216614447565b614469818b614453565b600101614476818a614453565b6001016144838189614453565b6001016144908188614453565b60010161449d8187614453565b6001016144aa8186614453565b6001016144b78185614453565b6001016144c48184614453565b6001016144d18183614453565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff918216911660008261450d5761450d6144e1565b50069056fea2646970667358221220631276743fb4245f2baf966a5c6faa318730a8d6955b5a3d77b0cfc2d9599af064736f6c634300080b0033

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.