ETH Price: $3,390.39 (-1.51%)
Gas: 1 Gwei

Token

Colorglyphs (☲)
 

Overview

Max Total Supply

520

Holders

184

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 ☲
0x08040b86837f0a78a9b05D5B64d6bd37AAa900Ad
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Colorglyphs are an extension of Larva Labs' peerless Autoglyphs project. Each Colorglyph is a colorful version of an Autoglyph. Colorglyphs turns the black elements in an Autoglyph colorful, using hex colors drawn from the address of the Colorglyph's creator. Buying a Colorglyph is not the same as buying an Autoglyph.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Colorglyphs

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-12-11
*/

pragma solidity ^0.4.24;

    /**
     *
     *     ****      *****   **         *****   *******     ****    **     **    ** *******   **     **   ****   
     *   **    **  **     ** **       **     ** **     ** **    **  **      **  **  **     ** **     ** **    ** 
     *   **        **     ** **       **     ** **     ** **        **       ****   **     ** **     ** **       
     *   **        **     ** **       **     ** *******   **   **** **        **    *******   *********   ****   
     *   **        **     ** **       **     ** **   **   **    **  **        **    **        **     **       ** 
     *   **    **  **     ** **       **     ** **    **  **    **  **        **    **        **     ** **    ** 
     *     ****      *****   ********   *****   **     **   ****    ********  **    **        **     **   ****   
     *
     *
     *                                                                by Daniel Viau
     *
     * Colorglyphs extends Autoglyphs.
     * Quoting from Autoglyphs:
     *  The output of the 'tokenURI' function is a set of instructions to make a drawing.
     *  Each symbol in the output corresponds to a cell, and there are 64x64 cells arranged in a square grid.
     *  The drawing can be any size, and the pen's stroke width should be between 1/5th to 1/10th the size of a cell.
     *  The drawing instructions for the nine different symbols are as follows:
     *
     *    .  Draw nothing in the cell.
     *    O  Draw a circle bounded by the cell.
     *    +  Draw centered lines vertically and horizontally the length of the cell.
     *    X  Draw diagonal lines connecting opposite corners of the cell.
     *    |  Draw a centered vertical line the length of the cell.
     *    -  Draw a centered horizontal line the length of the cell.
     *    \  Draw a line connecting the top left corner of the cell to the bottom right corner.
     *    /  Draw a line connecting the bottom left corner of teh cell to the top right corner.
     *    #  Fill in the cell completely.
     *
     * The 'tokenURI' function of colorglyphs adds two pieces of information to the response provided by autoglyphs:
     *  1) The color scheme to apply to the Colorglyph.
     *  2) The address of the Colorglyph's creator, from which colors are derived.
     *
     * The address of the Colorglyph's creator is split up into 35 6 digit chunks.
     * For example, the first three chunks of 0xb189f76323678E094D4996d182A792E52369c005 are: b189f7, 189f76, and 89f763.
     * The last chunk is 69c005.
     * Each Colorglyph is an Autoglyph with a color scheme applied to it.
     * Each Colorglyph takes the same shape as the Autoglyph of the corresponding ID.
     * If the Colorglyph's ID is higher than 512, it takes the shape of the Autoglyph with its Colorglyphs ID - 512.
     * Each black element in the Autoglyph is assigned a new color.
     * The background color of the Autoglyph is changed to either black or one of the address colors.
     * Visual implementations of Colorglyphs may exercise a substantial degree of flexibility.
     * Color schemes that use multiple colors may apply any permitted color to any element,
     * but no color should appear more than 16 times as often as the color with the lowest number of incidences.
     * In the event that a color meets two conditions (reddest and orangest, for example),
     * it may be used for both purposes.  The previous guideline establishing a threshold ratio of occurances
     * treats the reddest color and the orangest color as two different colors, even if they have the same actual value.

     * lightest address color = chunk with the lowest value resulting from red value + green value + blue value
     * second lightest address color = second lightest chunk in relevant address
     * third lightest address color = third lightest chunk in relevant address
     * fourth lightest address color = fourth lightest chunk in relevant address
     * fifth lightest address color = fifth lightest chunk in relevant address
     * reddest address color = chunk with the lowest value resulting from red value - green value - blue value
     * orangest address color = chunk with the highest value resulting from red value - blue value
     * yellowest address color = chunk with higest value resulting from red value + green value - blue value
     * greenest address color = chunk with higest value resulting from green value - red value - blue value
     * bluest address color = chunk with higest value resulting from blue value - green value - red value
     * darkest address color = darkest chunk in relevant address
     * white = ffffff
     * black = 020408

     * scheme 1 = lightest address color, third lightest address color, and fifth lightest address color on black
     * scheme 2 = lighest 4 address colors on black                            
     * scheme 3 = reddest address color, orangest address color, and yellowest address color on black                                             
     * scheme 4 = reddest address color, yellowest address color, greenest address color, and white on black                                      
     * scheme 5 = lightest address color, reddest address color, yellowest address color, greenest address color, and bluest address color on black                                      
     * scheme 6 = reddest address color and white on black                     
     * scheme 7 = greenest address color on black                              
     * scheme 8 = lightest address color on darkest address color              
     * scheme 9 = greenest address color on reddest address color                                        
     * scheme 10 = reddest address color, yellowest address color, bluest address color, lightest address color, and black on white
     */

library Strings {
  // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
  function strConcat(string _a, string _b, string _c, string _d, string _e) internal pure returns (string) {
      bytes memory _ba = bytes(_a);
      bytes memory _bb = bytes(_b);
      bytes memory _bc = bytes(_c);
      bytes memory _bd = bytes(_d);
      bytes memory _be = bytes(_e);
      string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
      bytes memory babcde = bytes(abcde);
      uint k = 0;
      for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
      for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
      for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
      for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
      for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
      return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal pure returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal pure returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal pure returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    function uint2str(uint i) internal pure returns (string) {
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }
}

interface ERC721TokenReceiver
{

    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);

}

contract Autoglyphs { 
  function draw(uint id) public view returns (string);
  function ownerOf(uint256 _tokenId) external view returns (address);
}

contract Colorglyphs {

    event Generated(uint indexed index, address indexed a, string value);

    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

    uint public constant CLAIMABLE_TOKEN_LIMIT = 512;
    uint public constant CREATEABLE_TOKEN_LIMIT = 512;
    uint public constant TOTAL_TOKEN_LIMIT = 1024;
    uint public constant ARTIST_PRINTS = 32;

    uint public constant PRICE = 50 finney;

    // The beneficiary is eff.org
    address public constant BENEFICIARY = 0xb189f76323678E094D4996d182A792E52369c005;

    address public autoglyphsAddress = 0xd4e4078ca3495de5b1d4db434bebc5a986197782;

    /**
     * @dev A mapping from NFT ID to a boolean representing whether an owner of the corresponding Autoglyph has claimed it.
     */
    mapping (uint256 => bool) private idToGlyphIsClaimed;

    /**
     * @dev A mapping from NFT ID to the address that created it.
     */
    mapping (uint => address) private idToCreator;
    /**
     * @dev A mapping from NFT ID to the color scheme that applies it.
     */
    mapping (uint => string) private idToColorScheme;

    // ERC 165
    mapping(bytes4 => bool) internal supportedInterfaces;

    /**
     * @dev A mapping from NFT ID to the address that owns it.
     */
    mapping (uint256 => address) internal idToOwner;

    /**
     * @dev A mapping from NFT ID to the seed used to make it.
     */
    mapping (uint256 => uint256) internal idToSeed;
    mapping (uint256 => uint256) internal seedToId;

    /**
     * @dev Mapping from NFT ID to approved address.
     */
    mapping (uint256 => address) internal idToApproval;

    /**
     * @dev Mapping from owner address to mapping of operator addresses.
     */
    mapping (address => mapping (address => bool)) internal ownerToOperators;

    /**
     * @dev Mapping from owner to list of owned NFT IDs.
     */
    mapping(address => uint256[]) internal ownerToIds;

    /**
     * @dev Mapping from NFT ID to its index in the owner tokens list.
     */
    mapping(uint256 => uint256) internal idToOwnerIndex;

    /**
     * @dev Total number of createablw tokens. Range 1-512.
     */
    uint internal numCreatedTokens = 0;

    /**
     * @dev Total number of claimable tokens. Range 513-1024.
     */
    uint internal numClaimedTokens = 0;

    /**
     * @dev Total number of tokens.
     */
    uint internal numTotalTokens = 0;

    /**
     * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier canOperate(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender]);
        _;
    }

    /**
     * @dev Guarantees that the msg.sender is allowed to transfer NFT.
     * @param _tokenId ID of the NFT to transfer.
     */
    modifier canTransfer(uint256 _tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(
            tokenOwner == msg.sender
            || idToApproval[_tokenId] == msg.sender
            || ownerToOperators[tokenOwner][msg.sender]
        );
        _;
    }

    /**
     * @dev Guarantees that _tokenId is a valid Token.
     * @param _tokenId ID of the NFT to validate.
     */
    modifier validNFToken(uint256 _tokenId) {
        require(idToOwner[_tokenId] != address(0));
        _;
    }

    /**
     * @dev Contract constructor.
     */
    constructor() public {
        supportedInterfaces[0x01ffc9a7] = true; // ERC165
        supportedInterfaces[0x80ac58cd] = true; // ERC721
        supportedInterfaces[0x780e9d63] = true; // ERC721 Enumerable
        supportedInterfaces[0x5b5e139f] = true; // ERC721 Metadata
    }

    string internal nftName = "Colorglyphs";
    string internal nftSymbol = "☲";

    ///////////////////
    //// GENERATOR ////
    ///////////////////

    function draw(uint256 _tokenId) public view returns (string memory) {
        Autoglyphs autoglyphs = Autoglyphs(autoglyphsAddress);
        uint autoglyphsTokenId;
        if (_tokenId > 512) {
            autoglyphsTokenId = _tokenId - 512;
        } else {
            autoglyphsTokenId = _tokenId;
        }
        string memory drawing = autoglyphs.draw(autoglyphsTokenId);
        string memory scheme = idToColorScheme[_tokenId];
        string memory creator_address = toAsciiString(idToCreator[_tokenId]);
        return Strings.strConcat(
            drawing,
            scheme,
            creator_address
        );
    }

    function getScheme(uint a) internal pure returns (string) {
        uint index = a % 83;
        string memory scheme;
        if (index < 20) {
            scheme = ' 1 ';
        } else if (index < 35) {
            scheme = ' 2 ';
        } else if (index < 48) {
            scheme = ' 3 ';
        } else if (index < 59) {
            scheme = ' 4 ';
        } else if (index < 68) {
            scheme = ' 5 ';
        } else if (index < 73) {
            scheme = ' 6 ';
        } else if (index < 77) {
            scheme = ' 7 ';
        } else if (index < 80) {
            scheme = ' 8 ';
        } else if (index < 82) {
            scheme = ' 9 ';
        } else {
            scheme = ' 10 ';
        }
        return scheme;
    }

    function toAsciiString(address x) returns (string) {
        bytes memory s = new bytes(40);
        for (uint i = 0; i < 20; i++) {
        byte b = byte(uint8(uint(x) / (2**(8*(19 - i)))));
        byte hi = byte(uint8(b) / 16);
        byte lo = byte(uint8(b) - 16 * uint8(hi));
        s[2*i] = char(hi);
        s[2*i+1] = char(lo);            
        }
        return string(s);
    }

    function char(byte b) returns (byte c) {
        if (b < 10) return byte(uint8(b) + 0x30);
        else return byte(uint8(b) + 0x57);
    }

    function creator(uint _id) external view returns (address) {
        return idToCreator[_id];
    }

    function colorScheme(uint _id) external view returns (string) {
        return idToColorScheme[_id];
    }

    function createGlyph(uint seed) external payable returns (string) {
        return _mint(msg.sender, seed, false, 0);
    }

    function claimGlyph(uint seed, uint idBeingClaimed) external payable returns (string) {
        return _mint(msg.sender, seed, true, idBeingClaimed);
    }

    //////////////////////////
    //// ERC 721 and 165  ////
    //////////////////////////

    /**
     * @dev Returns whether the target address is a contract.
     * @param _addr Address to check.
     * @return True if _addr is a contract, false if not.
     */
    function isContract(address _addr) internal view returns (bool addressCheck) {
        uint256 size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line
        addressCheck = size > 0;
    }

    /**
     * @dev Function to check which interfaces are suported by this contract.
     * @param _interfaceID Id of the interface.
     * @return True if _interfaceID is supported, false otherwise.
     */
    function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
        return supportedInterfaces[_interfaceID];
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the
     * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is
     * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this
     * function checks if `_to` is a smart contract (code size > 0). If so, it calls
     * `onERC721Received` on `_to` and throws if the return value is not
     * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     * @param _data Additional data with no specified format, sent in call to `_to`.
     */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes _data) external {
        _safeTransferFrom(_from, _to, _tokenId, _data);
    }

    /**
     * @dev Transfers the ownership of an NFT from one address to another address. This function can
     * be changed to payable.
     * @notice This works identically to the other function with an extra data parameter, except this
     * function just sets data to ""
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     */
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        _safeTransferFrom(_from, _to, _tokenId, "");
    }

    /**
     * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
     * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
     * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
     * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
     * they maybe be permanently lost.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     */
    function transferFrom(address _from, address _to, uint256 _tokenId) external canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));
        _transfer(_to, _tokenId);
    }

    /**
     * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
     * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
     * the current NFT owner, or an authorized operator of the current owner.
     * @param _approved Address to be approved for the given NFT ID.
     * @param _tokenId ID of the token to be approved.
     */
    function approve(address _approved, uint256 _tokenId) external canOperate(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(_approved != tokenOwner);
        idToApproval[_tokenId] = _approved;
        emit Approval(tokenOwner, _approved, _tokenId);
    }

    /**
     * @dev Enables or disables approval for a third party ("operator") to manage all of
     * `msg.sender`'s assets. It also emits the ApprovalForAll event.
     * @notice This works even if sender doesn't own any tokens at the time.
     * @param _operator Address to add to the set of authorized operators.
     * @param _approved True if the operators is approved, false to revoke approval.
     */
    function setApprovalForAll(address _operator, bool _approved) external {
        ownerToOperators[msg.sender][_operator] = _approved;
        emit ApprovalForAll(msg.sender, _operator, _approved);
    }

    /**
     * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
     * considered invalid, and this function throws for queries about the zero address.
     * @param _owner Address for whom to query the balance.
     * @return Balance of _owner.
     */
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0));
        return _getOwnerNFTCount(_owner);
    }

    /**
     * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered
     * invalid, and queries about them do throw.
     * @param _tokenId The identifier for an NFT.
     * @return Address of _tokenId owner.
     */
    function ownerOf(uint256 _tokenId) external view returns (address _owner) {
        _owner = idToOwner[_tokenId];
        require(_owner != address(0));
    }

    /**
     * @dev Get the approved address for a single NFT.
     * @notice Throws if `_tokenId` is not a valid NFT.
     * @param _tokenId ID of the NFT to query the approval of.
     * @return Address that _tokenId is approved for.
     */
    function getApproved(uint256 _tokenId) external view validNFToken(_tokenId) returns (address) {
        return idToApproval[_tokenId];
    }

    /**
     * @dev Checks if `_operator` is an approved operator for `_owner`.
     * @param _owner The address that owns the NFTs.
     * @param _operator The address that acts on behalf of the owner.
     * @return True if approved for all, false otherwise.
     */
    function isApprovedForAll(address _owner, address _operator) external view returns (bool) {
        return ownerToOperators[_owner][_operator];
    }

    /**
     * @dev Actually preforms the transfer.
     * @notice Does NO checks.
     * @param _to Address of a new owner.
     * @param _tokenId The NFT that is being transferred.
     */
    function _transfer(address _to, uint256 _tokenId) internal {
        address from = idToOwner[_tokenId];
        _clearApproval(_tokenId);

        _removeNFToken(from, _tokenId);
        _addNFToken(_to, _tokenId);

        emit Transfer(from, _to, _tokenId);
    }

    /**
     * @dev Mints a new NFT.
     * @notice This is an internal function which should be called from user-implemented external
     * mint function. Its purpose is to show and properly initialize data structures when using this
     * implementation.
     * @param _to The address that will own the minted NFT.
     */
    function _mint(address _to, uint seed, bool autoglyphOwnerIsClaimingToken, uint idBeingClaimed) internal returns (string) {
        require(_to != address(0));
        require(numCreatedTokens < CREATEABLE_TOKEN_LIMIT);
        require(numClaimedTokens < CLAIMABLE_TOKEN_LIMIT);
        require(numTotalTokens < TOTAL_TOKEN_LIMIT);
        if (autoglyphOwnerIsClaimingToken) {
            Autoglyphs autoglyphs = Autoglyphs(autoglyphsAddress);
            require(idToGlyphIsClaimed[idBeingClaimed] == false);
            require(autoglyphs.ownerOf(idBeingClaimed) == msg.sender);
        }
        uint amount = 0;
        if (numCreatedTokens >= ARTIST_PRINTS && autoglyphOwnerIsClaimingToken == false) {
            amount = PRICE;
            require(msg.value >= amount);
        }
        require(seedToId[seed] == 0);
        uint id;
        if (autoglyphOwnerIsClaimingToken) {
            id = idBeingClaimed + 512;
        } else {
            id = numCreatedTokens + 1;
        }

        idToCreator[id] = _to;
        idToSeed[id] = seed;
        seedToId[seed] = id;
        uint a = uint(uint160(keccak256(abi.encodePacked(seed))));
        idToColorScheme[id] = getScheme(a);
        string memory uri = draw(id);
        emit Generated(id, _to, uri);

        numTotalTokens = numTotalTokens + 1;
        if (autoglyphOwnerIsClaimingToken) {
            numClaimedTokens = numClaimedTokens + 1;
        } else {
            numCreatedTokens = numCreatedTokens + 1;
        }
        _addNFToken(_to, id);

        if (msg.value > amount) {
            msg.sender.transfer(msg.value - amount);
        }
        if (amount > 0) {
            BENEFICIARY.transfer(amount);
        }

        emit Transfer(address(0), _to, id);
        return uri;
    }

    /**
     * @dev Assigns a new NFT to an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _to Address to which we want to add the NFT.
     * @param _tokenId Which NFT we want to add.
     */
    function _addNFToken(address _to, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == address(0));
        idToOwner[_tokenId] = _to;

        uint256 length = ownerToIds[_to].push(_tokenId);
        idToOwnerIndex[_tokenId] = length - 1;
    }

    /**
     * @dev Removes a NFT from an address.
     * @notice Use and override this function with caution. Wrong usage can have serious consequences.
     * @param _from Address from wich we want to remove the NFT.
     * @param _tokenId Which NFT we want to remove.
     */
    function _removeNFToken(address _from, uint256 _tokenId) internal {
        require(idToOwner[_tokenId] == _from);
        delete idToOwner[_tokenId];

        uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
        uint256 lastTokenIndex = ownerToIds[_from].length - 1;

        if (lastTokenIndex != tokenToRemoveIndex) {
            uint256 lastToken = ownerToIds[_from][lastTokenIndex];
            ownerToIds[_from][tokenToRemoveIndex] = lastToken;
            idToOwnerIndex[lastToken] = tokenToRemoveIndex;
        }

        ownerToIds[_from].length--;
    }

    /**
     * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
     * extension to remove double storage (gas optimization) of owner nft count.
     * @param _owner Address for whom to query the count.
     * @return Number of _owner NFTs.
     */
    function _getOwnerNFTCount(address _owner) internal view returns (uint256) {
        return ownerToIds[_owner].length;
    }

    /**
     * @dev Actually perform the safeTransferFrom.
     * @param _from The current owner of the NFT.
     * @param _to The new owner.
     * @param _tokenId The NFT to transfer.
     * @param _data Additional data with no specified format, sent in call to `_to`.
     */
    function _safeTransferFrom(address _from,  address _to,  uint256 _tokenId,  bytes memory _data) private canTransfer(_tokenId) validNFToken(_tokenId) {
        address tokenOwner = idToOwner[_tokenId];
        require(tokenOwner == _from);
        require(_to != address(0));

        _transfer(_to, _tokenId);

        if (isContract(_to)) {
            bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
            require(retval == MAGIC_ON_ERC721_RECEIVED);
        }
    }

    /**
     * @dev Clears the current approval of a given NFT ID.
     * @param _tokenId ID of the NFT to be transferred.
     */
    function _clearApproval(uint256 _tokenId) private {
        if (idToApproval[_tokenId] != address(0)) {
            delete idToApproval[_tokenId];
        }
    }

    //// Enumerable

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

    function totalCreatedSupply() public view returns (uint256) {
        return numCreatedTokens;
    }

    function totalClaimedSupply() public view returns (uint256) {
        return numClaimedTokens;
    }

    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < TOTAL_TOKEN_LIMIT);
        if (index < CREATEABLE_TOKEN_LIMIT) {
            require(index < numCreatedTokens);
        } else {
            require(idToGlyphIsClaimed[index]);
        }
        return index;
    }

    /**
     * @dev returns the n-th NFT ID from a list of owner's tokens.
     * @param _owner Token owner's address.
     * @param _index Index number representing n-th token in owner's list of tokens.
     * @return Token id.
     */
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        require(_index < ownerToIds[_owner].length);
        return ownerToIds[_owner][_index];
    }

    //// Metadata

    /**
      * @dev Returns a descriptive name for a collection of NFTokens.
      * @return Representing name.
      */
    function name() external view returns (string memory _name) {
        _name = nftName;
    }

    /**
     * @dev Returns an abbreviated name for NFTokens.
     * @return Representing symbol.
     */
    function symbol() external view returns (string memory _symbol) {
        _symbol = nftSymbol;
    }

    /**
     * @dev A distinct URI (RFC 3986) for a given NFT.
     * @param _tokenId Id for which we want uri.
     * @return URI of _tokenId.
     */
    function tokenURI(uint256 _tokenId) external view validNFToken(_tokenId) returns (string memory) {
        return draw(_tokenId);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_name","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_approved","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ARTIST_PRINTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"CREATEABLE_TOKEN_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"address"}],"name":"toAsciiString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BENEFICIARY","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"draw","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"autoglyphsAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"creator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CLAIMABLE_TOKEN_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"b","type":"bytes1"}],"name":"char","outputs":[{"name":"c","type":"bytes1"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCreatedSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOTAL_TOKEN_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"seed","type":"uint256"},{"name":"idBeingClaimed","type":"uint256"}],"name":"claimGlyph","outputs":[{"name":"","type":"string"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"PRICE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_symbol","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"colorScheme","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalClaimedSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"seed","type":"uint256"}],"name":"createGlyph","outputs":[{"name":"","type":"string"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"index","type":"uint256"},{"indexed":true,"name":"a","type":"address"},{"indexed":false,"name":"value","type":"string"}],"name":"Generated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

608060405273d4e4078ca3495de5b1d4db434bebc5a9861977826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c556000600d556000600e556040805190810160405280600b81526020017f436f6c6f72676c79706873000000000000000000000000000000000000000000815250600f9080519060200190620000b4929190620002cf565b506040805190810160405280600381526020017fe298b200000000000000000000000000000000000000000000000000000000008152506010908051906020019062000102929190620002cf565b503480156200011057600080fd5b506001600460006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600460006380ac58cd7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555060016004600063780e9d637c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff021916908315150217905550600160046000635b5e139f7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff0219169083151502179055506200037e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200031257805160ff191683800117855562000343565b8280016001018555821562000343579182015b828111156200034257825182559160200191906001019062000325565b5b50905062000352919062000356565b5090565b6200037b91905b80821115620003775760008160009055506001016200035d565b5090565b90565b6138e1806200038e6000396000f300608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461019b57806306fdde03146101ff578063081812fc1461028f578063095ea7b3146102fc578063180f0afd1461034957806318160ddd1461037457806323b872dd1461039f57806327e0b0c61461040c5780632c6e7598146104375780632f745c59146104f35780632f99c6cc146105545780633b304147146105ab57806342842e0e146106515780634d2b5cad146106be5780634f6ccce714610715578063510b515814610756578063543ba602146107c35780636352211e146107ee57806369f9ad2f1461085b57806370a08231146109025780637b3ce1be146109595780638bbd0480146109845780638c3ea925146109af5780638d859f3e14610a5257806395d89b4114610a7d578063a22cb46514610b0d578063a87b0f9114610b5c578063b88d4fde14610c02578063c87b56dd14610c87578063d0e0d42614610d2d578063dba5a7f514610d58578063e985e9c514610df1575b600080fd5b3480156101a757600080fd5b506101e560048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610e6c565b604051808215151515815260200191505060405180910390f35b34801561020b57600080fd5b50610214610ed4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610254578082015181840152602081019050610239565b50505050905090810190601f1680156102815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029b57600080fd5b506102ba60048036038101908080359060200190929190505050610f76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030857600080fd5b50610347600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611024565b005b34801561035557600080fd5b5061035e6112c0565b6040518082815260200191505060405180910390f35b34801561038057600080fd5b506103896112c5565b6040518082815260200191505060405180910390f35b3480156103ab57600080fd5b5061040a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112cf565b005b34801561041857600080fd5b5061042161156d565b6040518082815260200191505060405180910390f35b34801561044357600080fd5b50610478600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611573565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104b857808201518184015260208101905061049d565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ff57600080fd5b5061053e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611788565b6040518082815260200191505060405180910390f35b34801561056057600080fd5b50610569611839565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b757600080fd5b506105d660048036038101908080359060200190929190505050611851565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106165780820151818401526020810190506105fb565b50505050905090810190601f1680156106435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561065d57600080fd5b506106bc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a9e565b005b3480156106ca57600080fd5b506106d3611abf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561072157600080fd5b5061074060048036038101908080359060200190929190505050611ae4565b6040518082815260200191505060405180910390f35b34801561076257600080fd5b5061078160048036038101908080359060200190929190505050611b4a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107cf57600080fd5b506107d8611b87565b6040518082815260200191505060405180910390f35b3480156107fa57600080fd5b5061081960048036038101908080359060200190929190505050611b8d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561086757600080fd5b506108a860048036038101908080357effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611c06565b60405180827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561090e57600080fd5b50610943600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf6565b6040518082815260200191505060405180910390f35b34801561096557600080fd5b5061096e611d43565b6040518082815260200191505060405180910390f35b34801561099057600080fd5b50610999611d4d565b6040518082815260200191505060405180910390f35b6109d76004803603810190808035906020019092919080359060200190929190505050611d53565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a175780820151818401526020810190506109fc565b50505050905090810190601f168015610a445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a5e57600080fd5b50610a67611d6a565b6040518082815260200191505060405180910390f35b348015610a8957600080fd5b50610a92611d75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ad2578082015181840152602081019050610ab7565b50505050905090810190601f168015610aff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b1957600080fd5b50610b5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611e17565b005b348015610b6857600080fd5b50610b8760048036038101908080359060200190929190505050611f18565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc7578082015181840152602081019050610bac565b50505050905090810190601f168015610bf45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0e57600080fd5b50610c85600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050611fcd565b005b348015610c9357600080fd5b50610cb260048036038101908080359060200190929190505050612012565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cf2578082015181840152602081019050610cd7565b50505050905090810190601f168015610d1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610d3957600080fd5b50610d42612095565b6040518082815260200191505060405180910390f35b610d766004803603810190808035906020019092919050505061209f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610db6578082015181840152602081019050610d9b565b50505050905090810190601f168015610de35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dfd57600080fd5b50610e52600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b5565b604051808215151515815260200191505060405180910390f35b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610fe857600080fd5b6008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061111f5750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561112a57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561119a57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561120b57600080fd5b856008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b602081565b6000600e54905090565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113a257503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806114335750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561143e57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156114ae57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151561151e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561155a57600080fd5b6115648686612149565b50505050505050565b61020081565b60608060008060008060286040519080825280601f01601f1916602001820160405280156115b05781602001602082028038833980820191505090505b509450600093505b601484101561177b578360130360080260020a8773ffffffffffffffffffffffffffffffffffffffff168115156115eb57fe5b047f01000000000000000000000000000000000000000000000000000000000000000292506010837f0100000000000000000000000000000000000000000000000000000000000000900460ff1681151561164257fe5b047f0100000000000000000000000000000000000000000000000000000000000000029150817f01000000000000000000000000000000000000000000000000000000000000009004601002837f01000000000000000000000000000000000000000000000000000000000000009004037f01000000000000000000000000000000000000000000000000000000000000000290506116e082611c06565b85856002028151811015156116f157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061172a81611c06565b856001866002020181518110151561173e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535083806001019450506115b8565b8495505050505050919050565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821015156117da57600080fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561182657fe5b9060005260206000200154905092915050565b73b189f76323678e094d4996d182a792e52369c00581565b606060008060608060606000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694506102008711156118955761020087039350611899565b8693505b8473ffffffffffffffffffffffffffffffffffffffff16633b304147856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561190857600080fd5b505af115801561191c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561194657600080fd5b81019080805164010000000081111561195e57600080fd5b8281019050602081018481111561197457600080fd5b815185600182028301116401000000008211171561199157600080fd5b50509291905050509250600360008881526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a425780601f10611a1757610100808354040283529160200191611a42565b820191906000526020600020905b815481529060010190602001808311611a2557829003601f168201915b50505050509150611a856002600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611573565b9050611a928383836121fe565b95505050505050919050565b611aba8383836020604051908101604052806000815250612236565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061040082101515611af657600080fd5b610200821015611b1557600c5482101515611b1057600080fd5b611b42565b6001600083815260200190815260200160002060009054906101000a900460ff161515611b4157600080fd5b5b819050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61020081565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c0157600080fd5b919050565b6000600a7f010000000000000000000000000000000000000000000000000000000000000002827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015611ca5576030827f01000000000000000000000000000000000000000000000000000000000000009004017f0100000000000000000000000000000000000000000000000000000000000000029050611cf1565b6057827f01000000000000000000000000000000000000000000000000000000000000009004017f01000000000000000000000000000000000000000000000000000000000000000290505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d3357600080fd5b611d3c826126d6565b9050919050565b6000600c54905090565b61040081565b6060611d623384600185612722565b905092915050565b66b1a2bc2ec5000081565b606060108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e0d5780601f10611de257610100808354040283529160200191611e0d565b820191906000526020600020905b815481529060010190602001808311611df057829003601f168201915b5050505050905090565b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6060600360008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fc15780601f10611f9657610100808354040283529160200191611fc1565b820191906000526020600020905b815481529060010190602001808311611fa457829003601f168201915b50505050509050919050565b61200b85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050612236565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561208457600080fd5b61208d83611851565b915050919050565b6000600d54905090565b60606120ae3383600080612722565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061218a82612cc2565b6121948183612d65565b61219e8383612f9b565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606061222d848484602060405190810160405280600081525060206040519081016040528060008152506130e6565b90509392505050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061230a57503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061239b5750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15156123a657600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561241657600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151561248657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141515156124c257600080fd5b6124cc8888612149565b6124d5886134fb565b156126cb578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156125cf5780820151818401526020810190506125b4565b50505050905090810190601f1680156125fc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561261e57600080fd5b505af1158015612632573d6000803e3d6000fd5b505050506040513d602081101561264857600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156126ca57600080fd5b5b505050505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606000806000806060600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415151561276857600080fd5b610200600c5410151561277a57600080fd5b610200600d5410151561278c57600080fd5b610400600e5410151561279e57600080fd5b87156128df576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600015156001600089815260200190815260200160002060009054906101000a900460ff1615151415156127fb57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16636352211e896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561288157600080fd5b505af1158015612895573d6000803e3d6000fd5b505050506040513d60208110156128ab57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156128de57600080fd5b5b600093506020600c54101580156128fa575060001515881515145b156129195766b1a2bc2ec50000935083341015151561291857600080fd5b5b6000600760008b81526020019081526020016000205414151561293b57600080fd5b871561294d5761020087019250612956565b6001600c540192505b896002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600660008581526020019081526020016000208190555082600760008b81526020019081526020016000208190555088604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515612a2d5780518252602082019150602081019050602083039250612a08565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900473ffffffffffffffffffffffffffffffffffffffff169150612a7f8261350e565b600360008581526020019081526020016000209080519060200190612aa59291906137e4565b50612aaf83611851565b90508973ffffffffffffffffffffffffffffffffffffffff16837fa197d2acc8f19f456842a59ba3699aa028ad72b616fd9c26679a516e7443683e836040518080602001828103825283818151815260200191508051906020019080838360005b83811015612b2b578082015181840152602081019050612b10565b50505050905090810190601f168015612b585780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001600e5401600e819055508715612b88576001600d5401600d81905550612b95565b6001600c5401600c819055505b612b9f8a84612f9b565b83341115612bf1573373ffffffffffffffffffffffffffffffffffffffff166108fc8534039081150290604051600060405180830381858888f19350505050158015612bef573d6000803e3d6000fd5b505b6000841115612c565773b189f76323678e094d4996d182a792e52369c00573ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015612c54573d6000803e3d6000fd5b505b828a73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48095505050505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612d62576008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b60008060008473ffffffffffffffffffffffffffffffffffffffff166005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612dd757600080fd5b6005600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b60008581526020019081526020016000205492506001600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500391508282141515612f4157600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612ec057fe5b9060005260206000200154905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612f1a57fe5b906000526020600020018190555082600b6000838152602001908152602001600020819055505b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612f939190613864565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561300a57600080fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150509060018203906000526020600020016000909192909190915055905060018103600b600084815260200190815260200160002081905550505050565b6060806060806060806060806000808e98508d97508c96508b95508a94508451865188518a518c51010101016040519080825280601f01601f1916602001820160405280156131445781602001602082028038833980820191505090505b50935083925060009150600090505b885181101561320657888181518110151561316a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156131c957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613153565b600090505b87518110156132be57878181518110151561322257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561328157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061320b565b600090505b86518110156133765786818151811015156132da57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561333957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506132c3565b600090505b855181101561342e57858181518110151561339257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156133f157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061337b565b600090505b84518110156134e657848181518110151561344a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156134a957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613433565b82995050505050505050505095945050505050565b600080823b905060008111915050919050565b60606000606060538481151561352057fe5b0691506014821015613569576040805190810160405280600381526020017f203120000000000000000000000000000000000000000000000000000000000081525090506137da565b60238210156135af576040805190810160405280600381526020017f203220000000000000000000000000000000000000000000000000000000000081525090506137d9565b60308210156135f5576040805190810160405280600381526020017f203320000000000000000000000000000000000000000000000000000000000081525090506137d8565b603b82101561363b576040805190810160405280600381526020017f203420000000000000000000000000000000000000000000000000000000000081525090506137d7565b6044821015613681576040805190810160405280600381526020017f203520000000000000000000000000000000000000000000000000000000000081525090506137d6565b60498210156136c7576040805190810160405280600381526020017f203620000000000000000000000000000000000000000000000000000000000081525090506137d5565b604d82101561370d576040805190810160405280600381526020017f203720000000000000000000000000000000000000000000000000000000000081525090506137d4565b6050821015613753576040805190810160405280600381526020017f203820000000000000000000000000000000000000000000000000000000000081525090506137d3565b6052821015613799576040805190810160405280600381526020017f203920000000000000000000000000000000000000000000000000000000000081525090506137d2565b6040805190810160405280600481526020017f203130200000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b8092505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382557805160ff1916838001178555613853565b82800160010185558215613853579182015b82811115613852578251825591602001919060010190613837565b5b5090506138609190613890565b5090565b81548183558181111561388b5781836000526020600020918201910161388a9190613890565b5b505050565b6138b291905b808211156138ae576000816000905550600101613896565b5090565b905600a165627a7a723058208bfae894c7b106d69dafffd5efde9e5bf2bcaf7e63797217130d922ec6ee26bd0029

Deployed Bytecode

0x608060405260043610610196576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a71461019b57806306fdde03146101ff578063081812fc1461028f578063095ea7b3146102fc578063180f0afd1461034957806318160ddd1461037457806323b872dd1461039f57806327e0b0c61461040c5780632c6e7598146104375780632f745c59146104f35780632f99c6cc146105545780633b304147146105ab57806342842e0e146106515780634d2b5cad146106be5780634f6ccce714610715578063510b515814610756578063543ba602146107c35780636352211e146107ee57806369f9ad2f1461085b57806370a08231146109025780637b3ce1be146109595780638bbd0480146109845780638c3ea925146109af5780638d859f3e14610a5257806395d89b4114610a7d578063a22cb46514610b0d578063a87b0f9114610b5c578063b88d4fde14610c02578063c87b56dd14610c87578063d0e0d42614610d2d578063dba5a7f514610d58578063e985e9c514610df1575b600080fd5b3480156101a757600080fd5b506101e560048036038101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610e6c565b604051808215151515815260200191505060405180910390f35b34801561020b57600080fd5b50610214610ed4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610254578082015181840152602081019050610239565b50505050905090810190601f1680156102815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029b57600080fd5b506102ba60048036038101908080359060200190929190505050610f76565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030857600080fd5b50610347600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611024565b005b34801561035557600080fd5b5061035e6112c0565b6040518082815260200191505060405180910390f35b34801561038057600080fd5b506103896112c5565b6040518082815260200191505060405180910390f35b3480156103ab57600080fd5b5061040a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506112cf565b005b34801561041857600080fd5b5061042161156d565b6040518082815260200191505060405180910390f35b34801561044357600080fd5b50610478600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611573565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104b857808201518184015260208101905061049d565b50505050905090810190601f1680156104e55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104ff57600080fd5b5061053e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611788565b6040518082815260200191505060405180910390f35b34801561056057600080fd5b50610569611839565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105b757600080fd5b506105d660048036038101908080359060200190929190505050611851565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106165780820151818401526020810190506105fb565b50505050905090810190601f1680156106435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561065d57600080fd5b506106bc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a9e565b005b3480156106ca57600080fd5b506106d3611abf565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561072157600080fd5b5061074060048036038101908080359060200190929190505050611ae4565b6040518082815260200191505060405180910390f35b34801561076257600080fd5b5061078160048036038101908080359060200190929190505050611b4a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107cf57600080fd5b506107d8611b87565b6040518082815260200191505060405180910390f35b3480156107fa57600080fd5b5061081960048036038101908080359060200190929190505050611b8d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561086757600080fd5b506108a860048036038101908080357effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050611c06565b60405180827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b34801561090e57600080fd5b50610943600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cf6565b6040518082815260200191505060405180910390f35b34801561096557600080fd5b5061096e611d43565b6040518082815260200191505060405180910390f35b34801561099057600080fd5b50610999611d4d565b6040518082815260200191505060405180910390f35b6109d76004803603810190808035906020019092919080359060200190929190505050611d53565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610a175780820151818401526020810190506109fc565b50505050905090810190601f168015610a445780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610a5e57600080fd5b50610a67611d6a565b6040518082815260200191505060405180910390f35b348015610a8957600080fd5b50610a92611d75565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ad2578082015181840152602081019050610ab7565b50505050905090810190601f168015610aff5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610b1957600080fd5b50610b5a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050611e17565b005b348015610b6857600080fd5b50610b8760048036038101908080359060200190929190505050611f18565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc7578082015181840152602081019050610bac565b50505050905090810190601f168015610bf45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610c0e57600080fd5b50610c85600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001908201803590602001919091929391929390505050611fcd565b005b348015610c9357600080fd5b50610cb260048036038101908080359060200190929190505050612012565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cf2578082015181840152602081019050610cd7565b50505050905090810190601f168015610d1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610d3957600080fd5b50610d42612095565b6040518082815260200191505060405180910390f35b610d766004803603810190808035906020019092919050505061209f565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610db6578082015181840152602081019050610d9b565b50505050905090810190601f168015610de35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610dfd57600080fd5b50610e52600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120b5565b604051808215151515815260200191505060405180910390f35b600060046000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6060600f8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f6c5780601f10610f4157610100808354040283529160200191610f6c565b820191906000526020600020905b815481529060010190602001808311610f4f57829003601f168201915b5050505050905090565b600081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515610fe857600080fd5b6008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061111f5750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561112a57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561119a57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561120b57600080fd5b856008600087815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550848673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050505050565b602081565b6000600e54905090565b60008160006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113a257503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b806114335750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b151561143e57600080fd5b83600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156114ae57600080fd5b6005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693508673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614151561151e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415151561155a57600080fd5b6115648686612149565b50505050505050565b61020081565b60608060008060008060286040519080825280601f01601f1916602001820160405280156115b05781602001602082028038833980820191505090505b509450600093505b601484101561177b578360130360080260020a8773ffffffffffffffffffffffffffffffffffffffff168115156115eb57fe5b047f01000000000000000000000000000000000000000000000000000000000000000292506010837f0100000000000000000000000000000000000000000000000000000000000000900460ff1681151561164257fe5b047f0100000000000000000000000000000000000000000000000000000000000000029150817f01000000000000000000000000000000000000000000000000000000000000009004601002837f01000000000000000000000000000000000000000000000000000000000000009004037f01000000000000000000000000000000000000000000000000000000000000000290506116e082611c06565b85856002028151811015156116f157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061172a81611c06565b856001866002020181518110151561173e57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535083806001019450506115b8565b8495505050505050919050565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821015156117da57600080fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561182657fe5b9060005260206000200154905092915050565b73b189f76323678e094d4996d182a792e52369c00581565b606060008060608060606000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694506102008711156118955761020087039350611899565b8693505b8473ffffffffffffffffffffffffffffffffffffffff16633b304147856040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561190857600080fd5b505af115801561191c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561194657600080fd5b81019080805164010000000081111561195e57600080fd5b8281019050602081018481111561197457600080fd5b815185600182028301116401000000008211171561199157600080fd5b50509291905050509250600360008881526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a425780601f10611a1757610100808354040283529160200191611a42565b820191906000526020600020905b815481529060010190602001808311611a2557829003601f168201915b50505050509150611a856002600089815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611573565b9050611a928383836121fe565b95505050505050919050565b611aba8383836020604051908101604052806000815250612236565b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061040082101515611af657600080fd5b610200821015611b1557600c5482101515611b1057600080fd5b611b42565b6001600083815260200190815260200160002060009054906101000a900460ff161515611b4157600080fd5b5b819050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61020081565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c0157600080fd5b919050565b6000600a7f010000000000000000000000000000000000000000000000000000000000000002827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015611ca5576030827f01000000000000000000000000000000000000000000000000000000000000009004017f0100000000000000000000000000000000000000000000000000000000000000029050611cf1565b6057827f01000000000000000000000000000000000000000000000000000000000000009004017f01000000000000000000000000000000000000000000000000000000000000000290505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611d3357600080fd5b611d3c826126d6565b9050919050565b6000600c54905090565b61040081565b6060611d623384600185612722565b905092915050565b66b1a2bc2ec5000081565b606060108054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611e0d5780601f10611de257610100808354040283529160200191611e0d565b820191906000526020600020905b815481529060010190602001808311611df057829003601f168201915b5050505050905090565b80600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b6060600360008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fc15780601f10611f9657610100808354040283529160200191611fc1565b820191906000526020600020905b815481529060010190602001808311611fa457829003601f168201915b50505050509050919050565b61200b85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050612236565b5050505050565b606081600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561208457600080fd5b61208d83611851565b915050919050565b6000600d54905090565b60606120ae3383600080612722565b9050919050565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061218a82612cc2565b6121948183612d65565b61219e8383612f9b565b818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606061222d848484602060405190810160405280600081525060206040519081016040528060008152506130e6565b90509392505050565b6000808360006005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061230a57503373ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8061239b5750600960008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15156123a657600080fd5b85600073ffffffffffffffffffffffffffffffffffffffff166005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561241657600080fd5b6005600088815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1694508873ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614151561248657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141515156124c257600080fd5b6124cc8888612149565b6124d5886134fb565b156126cb578773ffffffffffffffffffffffffffffffffffffffff1663150b7a02338b8a8a6040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156125cf5780820151818401526020810190506125b4565b50505050905090810190601f1680156125fc5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561261e57600080fd5b505af1158015612632573d6000803e3d6000fd5b505050506040513d602081101561264857600080fd5b8101908080519060200190929190505050935063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415156126ca57600080fd5b5b505050505050505050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490509050919050565b60606000806000806060600073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff161415151561276857600080fd5b610200600c5410151561277a57600080fd5b610200600d5410151561278c57600080fd5b610400600e5410151561279e57600080fd5b87156128df576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff169450600015156001600089815260200190815260200160002060009054906101000a900460ff1615151415156127fb57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16636352211e896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561288157600080fd5b505af1158015612895573d6000803e3d6000fd5b505050506040513d60208110156128ab57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156128de57600080fd5b5b600093506020600c54101580156128fa575060001515881515145b156129195766b1a2bc2ec50000935083341015151561291857600080fd5b5b6000600760008b81526020019081526020016000205414151561293b57600080fd5b871561294d5761020087019250612956565b6001600c540192505b896002600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555088600660008581526020019081526020016000208190555082600760008b81526020019081526020016000208190555088604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083101515612a2d5780518252602082019150602081019050602083039250612a08565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206001900473ffffffffffffffffffffffffffffffffffffffff169150612a7f8261350e565b600360008581526020019081526020016000209080519060200190612aa59291906137e4565b50612aaf83611851565b90508973ffffffffffffffffffffffffffffffffffffffff16837fa197d2acc8f19f456842a59ba3699aa028ad72b616fd9c26679a516e7443683e836040518080602001828103825283818151815260200191508051906020019080838360005b83811015612b2b578082015181840152602081019050612b10565b50505050905090810190601f168015612b585780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001600e5401600e819055508715612b88576001600d5401600d81905550612b95565b6001600c5401600c819055505b612b9f8a84612f9b565b83341115612bf1573373ffffffffffffffffffffffffffffffffffffffff166108fc8534039081150290604051600060405180830381858888f19350505050158015612bef573d6000803e3d6000fd5b505b6000841115612c565773b189f76323678e094d4996d182a792e52369c00573ffffffffffffffffffffffffffffffffffffffff166108fc859081150290604051600060405180830381858888f19350505050158015612c54573d6000803e3d6000fd5b505b828a73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48095505050505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff166008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612d62576008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b50565b60008060008473ffffffffffffffffffffffffffffffffffffffff166005600086815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612dd757600080fd5b6005600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600b60008581526020019081526020016000205492506001600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490500391508282141515612f4157600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481101515612ec057fe5b9060005260206000200154905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002084815481101515612f1a57fe5b906000526020600020018190555082600b6000838152602001908152602001600020819055505b600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480919060019003612f939190613864565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151561300a57600080fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150509060018203906000526020600020016000909192909190915055905060018103600b600084815260200190815260200160002081905550505050565b6060806060806060806060806000808e98508d97508c96508b95508a94508451865188518a518c51010101016040519080825280601f01601f1916602001820160405280156131445781602001602082028038833980820191505090505b50935083925060009150600090505b885181101561320657888181518110151561316a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156131c957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613153565b600090505b87518110156132be57878181518110151561322257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561328157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061320b565b600090505b86518110156133765786818151811015156132da57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f010000000000000000000000000000000000000000000000000000000000000002838380600101945081518110151561333957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080806001019150506132c3565b600090505b855181101561342e57858181518110151561339257fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156133f157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808060010191505061337b565b600090505b84518110156134e657848181518110151561344a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f01000000000000000000000000000000000000000000000000000000000000000283838060010194508151811015156134a957fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613433565b82995050505050505050505095945050505050565b600080823b905060008111915050919050565b60606000606060538481151561352057fe5b0691506014821015613569576040805190810160405280600381526020017f203120000000000000000000000000000000000000000000000000000000000081525090506137da565b60238210156135af576040805190810160405280600381526020017f203220000000000000000000000000000000000000000000000000000000000081525090506137d9565b60308210156135f5576040805190810160405280600381526020017f203320000000000000000000000000000000000000000000000000000000000081525090506137d8565b603b82101561363b576040805190810160405280600381526020017f203420000000000000000000000000000000000000000000000000000000000081525090506137d7565b6044821015613681576040805190810160405280600381526020017f203520000000000000000000000000000000000000000000000000000000000081525090506137d6565b60498210156136c7576040805190810160405280600381526020017f203620000000000000000000000000000000000000000000000000000000000081525090506137d5565b604d82101561370d576040805190810160405280600381526020017f203720000000000000000000000000000000000000000000000000000000000081525090506137d4565b6050821015613753576040805190810160405280600381526020017f203820000000000000000000000000000000000000000000000000000000000081525090506137d3565b6052821015613799576040805190810160405280600381526020017f203920000000000000000000000000000000000000000000000000000000000081525090506137d2565b6040805190810160405280600481526020017f203130200000000000000000000000000000000000000000000000000000000081525090505b5b5b5b5b5b5b5b5b8092505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061382557805160ff1916838001178555613853565b82800160010185558215613853579182015b82811115613852578251825591602001919060010190613837565b5b5090506138609190613890565b5090565b81548183558181111561388b5781836000526020600020918201910161388a9190613890565b5b505050565b6138b291905b808211156138ae576000816000905550600101613896565b5090565b905600a165627a7a723058208bfae894c7b106d69dafffd5efde9e5bf2bcaf7e63797217130d922ec6ee26bd0029

Deployed Bytecode Sourcemap

8036:21681:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16405:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16405:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29096:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29096:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29096:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21607:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21607:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19506:311;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19506:311:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9490:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9490:39:0;;;;;;;;;;;;;;;;;;;;;;;27854:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27854:93:0;;;;;;;;;;;;;;;;;;;;;;;18777:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18777:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9382:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9382:49:0;;;;;;;;;;;;;;;;;;;;;;;14609:401;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14609:401:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14609:401:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28742:199;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28742:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9620:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9620:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13172:651;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13172:651:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;13172:651:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18034:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18034:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9709:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9709:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28175:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28175:316:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15168:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15168:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9327:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9327:48:0;;;;;;;;;;;;;;;;;;;;;;;21188:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21188:161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15018:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15018:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20757:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20757:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27955:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27955:102:0;;;;;;;;;;;;;;;;;;;;;;;9438:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9438:45:0;;;;;;;;;;;;;;;;;;;;;;;15526:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15526:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9538:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9538:38:0;;;;;;;;;;;;;;;;;;;;;;;29308:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29308:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29308:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20244:205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20244:205:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15277:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15277:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15277:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17445:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17445:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29575:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29575:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;29575:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28065:102;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28065:102:0;;;;;;;;;;;;;;;;;;;;;;;15393:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;15393:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22032:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22032:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16405:136;16476:4;16500:19;:33;16520:12;16500:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16493:40;;16405:136;;;:::o;29096:94::-;29135:19;29175:7;29167:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29096:94;:::o;21607:142::-;21692:7;21673:8;12630:1;12599:33;;:9;:19;12609:8;12599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;12591:42;;;;;;;;21719:12;:22;21732:8;21719:22;;;;;;;;;;;;;;;;;;;;;21712:29;;21607:142;;;;:::o;19506:311::-;19624:18;19580:8;11822:18;11843:9;:19;11853:8;11843:19;;;;;;;;;;;;;;;;;;;;;11822:40;;11895:10;11881:24;;:10;:24;;;:68;;;;11909:16;:28;11926:10;11909:28;;;;;;;;;;;;;;;:40;11938:10;11909:40;;;;;;;;;;;;;;;;;;;;;;;;;11881:68;11873:77;;;;;;;;19603:8;12630:1;12599:33;;:9;:19;12609:8;12599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;12591:42;;;;;;;;19645:9;:19;19655:8;19645:19;;;;;;;;;;;;;;;;;;;;;19624:40;;19696:10;19683:23;;:9;:23;;;;19675:32;;;;;;;;19743:9;19718:12;:22;19731:8;19718:22;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;19800:8;19789:9;19768:41;;19777:10;19768:41;;;;;;;;;;;;11961:1;19506:311;;;;;:::o;9490:39::-;9527:2;9490:39;:::o;27854:93::-;27898:7;27925:14;;27918:21;;27854:93;:::o;18777:292::-;18910:18;18866:8;12169:18;12190:9;:19;12200:8;12190:19;;;;;;;;;;;;;;;;;;;;;12169:40;;12256:10;12242:24;;:10;:24;;;:77;;;;12309:10;12283:36;;:12;:22;12296:8;12283:22;;;;;;;;;;;;;;;;;;;;;:36;;;12242:77;:134;;;;12336:16;:28;12353:10;12336:28;;;;;;;;;;;;;;;:40;12365:10;12336:40;;;;;;;;;;;;;;;;;;;;;;;;;12242:134;12220:167;;;;;;;;18889:8;12630:1;12599:33;;:9;:19;12609:8;12599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;12591:42;;;;;;;;18931:9;:19;18941:8;18931:19;;;;;;;;;;;;;;;;;;;;;18910:40;;18983:5;18969:19;;:10;:19;;;18961:28;;;;;;;;19023:1;19008:17;;:3;:17;;;;19000:26;;;;;;;;19037:24;19047:3;19052:8;19037:9;:24::i;:::-;12398:1;18777:292;;;;;;:::o;9382:49::-;9428:3;9382:49;:::o;14609:401::-;14652:6;14671:14;14717:6;14753;14813:7;14853;14698:2;14688:13;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;14688:13:0;;;;14671:30;;14726:1;14717:10;;14712:264;14733:2;14729:1;:6;14712:264;;;14796:1;14791:2;:6;14788:1;:10;14784:1;:15;14778:1;14773:7;;:27;;;;;;;;14762:40;;14753:49;;14839:2;14834:1;14828:8;;;:13;;;;;;;;;;14823:19;;14813:29;;14890:2;14884:9;;;14879:2;:14;14874:1;14868:8;;;:25;14863:31;;14853:41;;14914:8;14919:2;14914:4;:8::i;:::-;14905:1;14909;14907;:3;14905:6;;;;;;;;;;;;;;:17;;;;;;;;;;;14944:8;14949:2;14944:4;:8::i;:::-;14933:1;14939;14937;14935;:3;:5;14933:8;;;;;;;;;;;;;;:19;;;;;;;;;;;14737:3;;;;;;;14712:264;;;15000:1;14986:16;;14609:401;;;;;;;;:::o;28742:199::-;28826:7;28863:10;:18;28874:6;28863:18;;;;;;;;;;;;;;;:25;;;;28854:6;:34;28846:43;;;;;;;;28907:10;:18;28918:6;28907:18;;;;;;;;;;;;;;;28926:6;28907:26;;;;;;;;;;;;;;;;;;28900:33;;28742:199;;;;:::o;9620:80::-;9658:42;9620:80;:::o;13172:651::-;13225:6;13251:21;13315:22;13500:21;13569:20;13628:29;13286:17;;;;;;;;;;;13251:53;;13363:3;13352:8;:14;13348:142;;;13414:3;13403:8;:14;13383:34;;13348:142;;;13470:8;13450:28;;13348:142;13524:10;:15;;;13540:17;13524:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13524:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13524:34:0;;;;;;39:16:-1;36:1;17:17;2:54;13524:34:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13524:34:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;73:11;68:3;64:21;57:28;;126:4;121:3;117:14;163:9;145:16;142:31;139:2;;;186:1;183;176:12;139:2;224:3;218:10;338:9;333:1;319:12;315:20;297:16;293:43;290:58;268:11;254:12;251:29;239:118;236:2;;;370:1;367;360:12;236:2;0:382;;13524:34:0;;;;;;13500:58;;13592:15;:25;13608:8;13592:25;;;;;;;;;;;13569:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13660:36;13674:11;:21;13686:8;13674:21;;;;;;;;;;;;;;;;;;;;;13660:13;:36::i;:::-;13628:68;;13714:101;13746:7;13768:6;13789:15;13714:17;:101::i;:::-;13707:108;;13172:651;;;;;;;;:::o;18034:143::-;18126:43;18144:5;18151:3;18156:8;18126:43;;;;;;;;;;;;;:17;:43::i;:::-;18034:143;;;:::o;9709:77::-;;;;;;;;;;;;;:::o;28175:316::-;28233:7;9479:4;28261:5;:25;28253:34;;;;;;;;9428:3;28302:5;:30;28298:163;;;28365:16;;28357:5;:24;28349:33;;;;;;;;28298:163;;;28423:18;:25;28442:5;28423:25;;;;;;;;;;;;;;;;;;;;;28415:34;;;;;;;;28298:163;28478:5;28471:12;;28175:316;;;:::o;15168:101::-;15218:7;15245:11;:16;15257:3;15245:16;;;;;;;;;;;;;;;;;;;;;15238:23;;15168:101;;;:::o;9327:48::-;9372:3;9327:48;:::o;21188:161::-;21246:14;21282:9;:19;21292:8;21282:19;;;;;;;;;;;;;;;;;;;;;21273:28;;21338:1;21320:20;;:6;:20;;;;21312:29;;;;;;;;21188:161;;;:::o;15018:142::-;15049:6;15076:2;15072:6;;:1;:6;;;;15068:84;;;15103:4;15098:1;15092:8;;;:15;15087:21;;15080:28;;;;15068:84;15147:4;15142:1;15136:8;;;:15;15131:21;;15124:28;;15018:142;;;;:::o;20757:158::-;20815:7;20861:1;20843:20;;:6;:20;;;;20835:29;;;;;;;;20882:25;20900:6;20882:17;:25::i;:::-;20875:32;;20757:158;;;:::o;27955:102::-;28006:7;28033:16;;28026:23;;27955:102;:::o;9438:45::-;9479:4;9438:45;:::o;15526:157::-;15604:6;15630:45;15636:10;15648:4;15654;15660:14;15630:5;:45::i;:::-;15623:52;;15526:157;;;;:::o;9538:38::-;9567:9;9538:38;:::o;29308:102::-;29349:21;29393:9;29383:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29308:102;:::o;20244:205::-;20368:9;20326:16;:28;20343:10;20326:28;;;;;;;;;;;;;;;:39;20355:9;20326:39;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;20420:9;20393:48;;20408:10;20393:48;;;20431:9;20393:48;;;;;;;;;;;;;;;;;;;;;;20244:205;;:::o;15277:108::-;15331:6;15357:15;:20;15373:3;15357:20;;;;;;;;;;;15350:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15277:108;;;:::o;17445:159::-;17550:46;17568:5;17575:3;17580:8;17590:5;;17550:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:46::i;:::-;17445:159;;;;;:::o;29575:137::-;29657:6;29638:8;12630:1;12599:33;;:9;:19;12609:8;12599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;12591:42;;;;;;;;29690:14;29695:8;29690:4;:14::i;:::-;29683:21;;29575:137;;;;:::o;28065:102::-;28116:7;28143:16;;28136:23;;28065:102;:::o;15393:125::-;15451:6;15477:33;15483:10;15495:4;15501:5;15508:1;15477:5;:33::i;:::-;15470:40;;15393:125;;;:::o;22032:151::-;22116:4;22140:16;:24;22157:6;22140:24;;;;;;;;;;;;;;;:35;22165:9;22140:35;;;;;;;;;;;;;;;;;;;;;;;;;22133:42;;22032:151;;;;:::o;22388:274::-;22458:12;22473:9;:19;22483:8;22473:19;;;;;;;;;;;;;;;;;;;;;22458:34;;22503:24;22518:8;22503:14;:24::i;:::-;22540:30;22555:4;22561:8;22540:14;:30::i;:::-;22581:26;22593:3;22598:8;22581:11;:26::i;:::-;22645:8;22640:3;22625:29;;22634:4;22625:29;;;;;;;;;;;;22388:274;;;:::o;7007:138::-;7082:6;7108:29;7118:2;7122;7126;7108:29;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;7101:36;;7007:138;;;;;:::o;26982:532::-;27142:18;27344:13;27098:8;12169:18;12190:9;:19;12200:8;12190:19;;;;;;;;;;;;;;;;;;;;;12169:40;;12256:10;12242:24;;:10;:24;;;:77;;;;12309:10;12283:36;;:12;:22;12296:8;12283:22;;;;;;;;;;;;;;;;;;;;;:36;;;12242:77;:134;;;;12336:16;:28;12353:10;12336:28;;;;;;;;;;;;;;;:40;12365:10;12336:40;;;;;;;;;;;;;;;;;;;;;;;;;12242:134;12220:167;;;;;;;;27121:8;12630:1;12599:33;;:9;:19;12609:8;12599:19;;;;;;;;;;;;;;;;;;;;;:33;;;;12591:42;;;;;;;;27163:9;:19;27173:8;27163:19;;;;;;;;;;;;;;;;;;;;;27142:40;;27215:5;27201:19;;:10;:19;;;27193:28;;;;;;;;27255:1;27240:17;;:3;:17;;;;27232:26;;;;;;;;27271:24;27281:3;27286:8;27271:9;:24::i;:::-;27312:15;27323:3;27312:10;:15::i;:::-;27308:199;;;27380:3;27360:41;;;27402:10;27414:5;27421:8;27431:5;27360:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;27360:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27360:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27360:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27360:77:0;;;;;;;;;;;;;;;;27344:93;;9308:10;27470:24;;27460:34;;;:6;:34;;;;27452:43;;;;;;;;27308:199;12398:1;26982:532;;;;;;;;:::o;26562:126::-;26628:7;26655:10;:18;26666:6;26655:18;;;;;;;;;;;;;;;:25;;;;26648:32;;26562:126;;;:::o;23004:1817::-;23118:6;23399:21;23613:11;23853:7;24120:6;24233:17;23160:1;23145:17;;:3;:17;;;;23137:26;;;;;;;;9428:3;23182:16;;:41;23174:50;;;;;;;;9372:3;23243:16;;:40;23235:49;;;;;;;;9479:4;23303:14;;:34;23295:43;;;;;;;;23353:29;23349:254;;;23434:17;;;;;;;;;;;23399:53;;23513:5;23475:43;;:18;:34;23494:14;23475:34;;;;;;;;;;;;;;;;;;;;;:43;;;23467:52;;;;;;;;23580:10;23542:48;;:10;:18;;;23561:14;23542:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23542:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23542:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23542:34:0;;;;;;;;;;;;;;;;:48;;;23534:57;;;;;;;;23349:254;23627:1;23613:15;;9527:2;23643:16;;:33;;:75;;;;;23713:5;23680:38;;:29;:38;;;23643:75;23639:165;;;9567:9;23735:14;;23785:6;23772:9;:19;;23764:28;;;;;;;;23639:165;23840:1;23822:8;:14;23831:4;23822:14;;;;;;;;;;;;:19;23814:28;;;;;;;;23875:29;23871:145;;;23943:3;23926:14;:20;23921:25;;23871:145;;;24003:1;23984:16;;:20;23979:25;;23871:145;24046:3;24028:11;:15;24040:2;24028:15;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;24075:4;24060:8;:12;24069:2;24060:12;;;;;;;;;;;:19;;;;24107:2;24090:8;:14;24099:4;24090:14;;;;;;;;;;;:19;;;;24169:4;24152:22;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;24152:22:0;;;24142:33;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;24142:33:0;;;;;;;;;;;;;;;;24134:42;;;24129:48;;24120:57;;24210:12;24220:1;24210:9;:12::i;:::-;24188:15;:19;24204:2;24188:19;;;;;;;;;;;:34;;;;;;;;;;;;:::i;:::-;;24253:8;24258:2;24253:4;:8::i;:::-;24233:28;;24291:3;24277:23;;24287:2;24277:23;24296:3;24277:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24277:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24347:1;24330:14;;:18;24313:14;:35;;;;24363:29;24359:173;;;24447:1;24428:16;;:20;24409:16;:39;;;;24359:173;;;24519:1;24500:16;;:20;24481:16;:39;;;;24359:173;24542:20;24554:3;24559:2;24542:11;:20::i;:::-;24591:6;24579:9;:18;24575:90;;;24614:10;:19;;:39;24646:6;24634:9;:18;24614:39;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24614:39:0;24575:90;24688:1;24679:6;:10;24675:71;;;9658:42;24706:20;;:28;24727:6;24706:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24706:28:0;24675:71;24789:2;24784:3;24763:29;;24780:1;24763:29;;;;;;;;;;;;24810:3;24803:10;;23004:1817;;;;;;;;;;;:::o;27657:166::-;27756:1;27722:36;;:12;:22;27735:8;27722:22;;;;;;;;;;;;;;;;;;;;;:36;;;;27718:98;;;27782:12;:22;27795:8;27782:22;;;;;;;;;;;;27775:29;;;;;;;;;;;27718:98;27657:166;:::o;25666:587::-;25830:26;25894:22;26017:17;25774:5;25751:28;;:9;:19;25761:8;25751:19;;;;;;;;;;;;;;;;;;;;;:28;;;25743:37;;;;;;;;25798:9;:19;25808:8;25798:19;;;;;;;;;;;;25791:26;;;;;;;;;;;25859:14;:24;25874:8;25859:24;;;;;;;;;;;;25830:53;;25946:1;25919:10;:17;25930:5;25919:17;;;;;;;;;;;;;;;:24;;;;:28;25894:53;;25982:18;25964:14;:36;;25960:247;;;26037:10;:17;26048:5;26037:17;;;;;;;;;;;;;;;26055:14;26037:33;;;;;;;;;;;;;;;;;;26017:53;;26125:9;26085:10;:17;26096:5;26085:17;;;;;;;;;;;;;;;26103:18;26085:37;;;;;;;;;;;;;;;;;:49;;;;26177:18;26149:14;:25;26164:9;26149:25;;;;;;;;;;;:46;;;;25960:247;26219:10;:17;26230:5;26219:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;25666:587;;;;;:::o;25107:266::-;25270:14;25218:1;25187:33;;:9;:19;25197:8;25187:19;;;;;;;;;;;;;;;;;;;;;:33;;;25179:42;;;;;;;;25254:3;25232:9;:19;25242:8;25232:19;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25287:10;:15;25298:3;25287:15;;;;;;;;;;;;;;;25308:8;25287:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;25287:30:0;;;;;;;;;;;;;;;;;;;;;25270:47;;25364:1;25355:6;:10;25328:14;:24;25343:8;25328:24;;;;;;;;;;;:37;;;;25107:266;;;:::o;6032:810::-;6129:6;6146:16;6183;6220;6257;6294;6331:19;6436;6479:6;6503;6171:2;6146:28;;6208:2;6183:28;;6245:2;6220:28;;6282:2;6257:28;;6319:2;6294:28;;6416:3;:10;6403:3;:10;6390:3;:10;6377:3;:10;6364:3;:10;:23;:36;:49;:62;6353:74;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;6353:74:0;;;;6331:96;;6464:5;6436:34;;6488:1;6479:10;;6512:1;6503:10;;6498:58;6519:3;:10;6515:1;:14;6498:58;;;6550:3;6554:1;6550:6;;;;;;;;;;;;;;;;;;;;6536;6543:3;;;;;;6536:11;;;;;;;;;;;;;;:20;;;;;;;;;;;6531:3;;;;;;;6498:58;;;6574:1;6570:5;;6565:53;6581:3;:10;6577:1;:14;6565:53;;;6612:3;6616:1;6612:6;;;;;;;;;;;;;;;;;;;;6598;6605:3;;;;;;6598:11;;;;;;;;;;;;;;:20;;;;;;;;;;;6593:3;;;;;;;6565:53;;;6636:1;6632:5;;6627:53;6643:3;:10;6639:1;:14;6627:53;;;6674:3;6678:1;6674:6;;;;;;;;;;;;;;;;;;;;6660;6667:3;;;;;;6660:11;;;;;;;;;;;;;;:20;;;;;;;;;;;6655:3;;;;;;;6627:53;;;6698:1;6694:5;;6689:53;6705:3;:10;6701:1;:14;6689:53;;;6736:3;6740:1;6736:6;;;;;;;;;;;;;;;;;;;;6722;6729:3;;;;;;6722:11;;;;;;;;;;;;;;:20;;;;;;;;;;;6717:3;;;;;;;6689:53;;;6760:1;6756:5;;6751:53;6767:3;:10;6763:1;:14;6751:53;;;6798:3;6802:1;6798:6;;;;;;;;;;;;;;;;;;;;6784;6791:3;;;;;;6784:11;;;;;;;;;;;;;;:20;;;;;;;;;;;6779:3;;;;;;;6751:53;;;6827:6;6813:21;;6032:810;;;;;;;;;;;;;;;;:::o;15968:215::-;16026:17;16056:12;16110:5;16098:18;16090:26;;16174:1;16167:4;:8;16152:23;;15968:215;;;;:::o;13831:770::-;13881:6;13900:10;13930:20;13917:2;13913:1;:6;;;;;;;;13900:19;;13973:2;13965:5;:10;13961:609;;;13992:14;;;;;;;;;;;;;;;;;;;;13961:609;;;14036:2;14028:5;:10;14024:546;;;14055:14;;;;;;;;;;;;;;;;;;;;14024:546;;;14099:2;14091:5;:10;14087:483;;;14118:14;;;;;;;;;;;;;;;;;;;;14087:483;;;14162:2;14154:5;:10;14150:420;;;14181:14;;;;;;;;;;;;;;;;;;;;14150:420;;;14225:2;14217:5;:10;14213:357;;;14244:14;;;;;;;;;;;;;;;;;;;;14213:357;;;14288:2;14280:5;:10;14276:294;;;14307:14;;;;;;;;;;;;;;;;;;;;14276:294;;;14351:2;14343:5;:10;14339:231;;;14370:14;;;;;;;;;;;;;;;;;;;;14339:231;;;14414:2;14406:5;:10;14402:168;;;14433:14;;;;;;;;;;;;;;;;;;;;14402:168;;;14477:2;14469:5;:10;14465:105;;;14496:14;;;;;;;;;;;;;;;;;;;;14465:105;;;14543:15;;;;;;;;;;;;;;;;;;;;14465:105;14402:168;14339:231;14276:294;14213:357;14150:420;14087:483;14024:546;13961:609;14587:6;14580:13;;13831:770;;;;;:::o;8036:21681::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://8bfae894c7b106d69dafffd5efde9e5bf2bcaf7e63797217130d922ec6ee26bd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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