ETH Price: $3,286.43 (-5.13%)

MoonCatLootprint (📜)
 

Overview

TokenID

8415

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

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

OVERVIEW

Build Plans for a MoonCat Spacecraft

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MoonCatLootprints

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 2 : MoonCatLootprints.sol
// SPDX-License-Identifier: AGPL-3.0

pragma solidity 0.8.1;

interface IMoonCatAcclimator {
    function getApproved(uint256 tokenId) external view returns (address);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function ownerOf(uint256 tokenId) external view returns (address);
}

interface IMoonCatRescue {
    function rescueOrder(uint256 tokenId) external view returns (bytes5);
    function catOwners(bytes5 catId) external view returns (address);
}

interface IReverseResolver {
    function claim(address owner) external returns (bytes32);
}

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

interface IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
    function approve(address to, uint256 tokenId) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved) external;
    function isApprovedForAll(address owner, address operator) external view returns (bool);
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface IMoonCatLootprintsMetadata {
    function getJSON(uint256 lootprintId,
                     uint8 classId,
                     uint8 colorId,
                     uint8 bays,
                     string calldata shipName)
        external view returns (string memory);
    function getImage(uint256 lootprintId,
                      uint8 classId,
                      uint8 colorId,
                      uint8 bays,
                      string calldata shipName)
        external view returns (string memory);
    function getClassName(uint8 classId) external view returns (string memory);
    function getColorName(uint8 classId) external view returns (string memory);
}


/**
 * @dev Derived from OpenZeppelin standard template
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/EnumerableSet.sol
 * b0cf6fbb7a70f31527f36579ad644e1cf12fdf4e
 */
library EnumerableSet {
    struct Set {
        uint256[] _values;
        mapping (uint256 => uint256) _indexes;
    }

    function at(Set storage set, uint256 index) internal view returns (uint256) {
        return set._values[index];
    }

    function contains(Set storage set, uint256 value) internal view returns (bool) {
        return set._indexes[value] != 0;
    }

    function length(Set storage set) internal view returns (uint256) {
        return set._values.length;
    }

    function add(Set storage set, uint256 value) internal returns (bool) {
        if (!contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function remove(Set storage set, uint256 value) internal returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            if (lastIndex != toDeleteIndex) {
                uint256 lastvalue = set._values[lastIndex];
                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastvalue;
                // Update the index for the moved value
                set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();
            // Delete the index for the deleted slot
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }
}

/**
 * @title MoonCat​Lootprints
 * @dev MoonCats have found some plans for building spaceships
 */
contract MoonCatLootprints is IERC165, IERC721Enumerable, IERC721Metadata {

    /* ERC-165 */

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) {
        return (interfaceId == type(IERC721).interfaceId ||
                interfaceId == type(IERC721Metadata).interfaceId ||
                interfaceId == type(IERC721Enumerable).interfaceId);
    }

    /* External Contracts */

    IMoonCatAcclimator MCA = IMoonCatAcclimator(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69);
    IMoonCatRescue MCR = IMoonCatRescue(0x60cd862c9C687A9dE49aecdC3A99b74A4fc54aB6);
    IMoonCatLootprintsMetadata public Metadata;

    /* Name String Data */

    string[4] internal honorifics =
        [
         "Legendary",
         "Notorious",
         "Distinguished",
         "Renowned"
         ];

    string[32] internal adjectives =
        [
         "Turbo",
         "Tectonic",
         "Rugged",
         "Derelict",
         "Scratchscarred",
         "Purrfect",
         "Rickety",
         "Sparkly",
         "Ethereal",
         "Hissing",
         "Pouncing",
         "Stalking",
         "Standing",
         "Sleeping",
         "Playful",
         "Menancing", // Poor Steve.
         "Cuddly",
         "Neurotic",
         "Skittish",
         "Impulsive",
         "Sly",
         "Ponderous",
         "Prodigal",
         "Hungry",
         "Grumpy",
         "Harmless",
         "Mysterious",
         "Frisky",
         "Furry",
         "Scratchy",
         "Patchy",
         "Hairless"
         ];

    string[15] internal mods =
        [
         "Star",
         "Galaxy",
         "Constellation",
         "World",
         "Moon",
         "Alley",
         "Midnight",
         "Wander",
         "Tuna",
         "Mouse",
         "Catnip",
         "Toy",
         "Kibble",
         "Hairball",
         "Litterbox"
         ];

    string[32] internal mains =
        [
         "Lightning",
         "Wonder",
         "Toebean",
         "Whisker",
         "Paw",
         "Fang",
         "Tail",
         "Purrbox",
         "Meow",
         "Claw",
         "Scratcher",
         "Chomper",
         "Nibbler",
         "Mouser",
         "Racer",
         "Teaser",
         "Chaser",
         "Hunter",
         "Leaper",
         "Sleeper",
         "Pouncer",
         "Stalker",
         "Stander",
         "TopCat",
         "Ambassador",
         "Admiral",
         "Commander",
         "Negotiator",
         "Vandal",
         "Mischief",
         "Ultimatum",
         "Frolic"
         ];

    string[16] internal designations =
        [
         "Alpha",
         "Tau",
         "Pi",
         "I",
         "II",
         "III",
         "IV",
         "V",
         "X",
         "Prime",
         "Proper",
         "1",
         "1701-D",
         "2017",
         "A",
         "Runt"
         ];

    /* Data */

    bytes32[400] ColorTable;

    /* Structs */

    struct Lootprint {
        uint16 index;
        address owner;
    }

    /* State */

    using EnumerableSet for EnumerableSet.Set;

    address payable public contractOwner;

    bool public frozen = true;

    bool public mintingWindowOpen = true;

    uint8 revealCount = 0;

    uint256 public price = 50000000000000000;

    bytes32[100] NoChargeList;

    bytes32[20] revealBlockHashes;

    Lootprint[25600] public Lootprints; // lootprints by lootprintId/rescueOrder

    EnumerableSet.Set internal LootprintIdByIndex;

    mapping(address => EnumerableSet.Set) internal LootprintsByOwner;

    mapping(uint256 => address) private TokenApprovals; // lootprint id -> approved address

    mapping(address => mapping(address => bool)) private OperatorApprovals; // owner address -> operator address -> bool

    /* Modifiers */

    modifier onlyContractOwner () {
        require(msg.sender == contractOwner, "Only Contract Owner");
        _;
    }

    modifier lootprintExists (uint256 lootprintId) {
        require(LootprintIdByIndex.contains(lootprintId), "ERC721: operator query for nonexistent token");
        _;
    }

    modifier onlyOwnerOrApproved(uint256 lootprintId) {
        require(LootprintIdByIndex.contains(lootprintId), "ERC721: query for nonexistent token");
        address owner = ownerOf(lootprintId);
        require(msg.sender == owner || msg.sender == TokenApprovals[lootprintId] || OperatorApprovals[owner][msg.sender],
                "ERC721: transfer caller is not owner nor approved");
        _;
    }

    modifier notFrozen () {
        require(!frozen, "Frozen");
        _;
    }

    /* ERC-721 Helpers */

    function setApprove(address to, uint256 lootprintId) private {
        TokenApprovals[lootprintId] = to;
        emit Approval(msg.sender, to, lootprintId);
    }

    function handleTransfer(address from, address to, uint256 lootprintId) private {
        require(to != address(0), "ERC721: transfer to the zero address");
        setApprove(address(0), lootprintId);
        LootprintsByOwner[from].remove(lootprintId);
        LootprintsByOwner[to].add(lootprintId);
        Lootprints[lootprintId].owner = to;
        emit Transfer(from, to, lootprintId);
    }

    /* ERC-721 */

    function totalSupply() public view override returns (uint256) {
        return LootprintIdByIndex.length();
    }

    function balanceOf(address owner) public view override returns (uint256 balance) {
        return LootprintsByOwner[owner].length();
    }

    function ownerOf(uint256 lootprintId) public view override returns (address owner) {
        return Lootprints[lootprintId].owner;
    }

    function approve(address to, uint256 lootprintId) public override lootprintExists(lootprintId) {
        address owner = ownerOf(lootprintId);
        require(to != owner, "ERC721: approval to current owner");
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all");
        setApprove(to, lootprintId);
    }

    function getApproved(uint256 lootprintId) public view override returns (address operator) {
        return TokenApprovals[lootprintId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != msg.sender, "ERC721: approve to caller");
        OperatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return OperatorApprovals[owner][operator];
    }

    function safeTransferFrom(address from, address to, uint256 lootprintId, bytes memory _data) public override onlyOwnerOrApproved(lootprintId) {
        handleTransfer(from, to, lootprintId);
        uint256 size;
        assembly {
            size := extcodesize(to)
        }
        if (size > 0) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, lootprintId, _data) returns (bytes4 retval) {
                if (retval != IERC721Receiver.onERC721Received.selector) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                }
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }

    function safeTransferFrom(address from, address to, uint256 lootprintId) public override {
        safeTransferFrom(from, to, lootprintId, "");
    }

    function transferFrom(address from, address to, uint256 lootprintId) public override onlyOwnerOrApproved(lootprintId) {
        handleTransfer(from, to, lootprintId);
    }

    /* ERC-721 Enumerable */

    function tokenByIndex(uint256 index) public view override returns (uint256) {
        return LootprintIdByIndex.at(index);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return LootprintsByOwner[owner].at(index);
    }

    /* Reveal */

    bool pendingReveal = false;
    uint256 revealPrepBlock;
    bytes32 revealSeedHash;

    /**
     * @dev How many lootprints are awaiting being revealed?
     */
    function pendingRevealCount() public view returns (uint256) {
        uint256 numRevealed = revealCount * 2560;
        if (numRevealed > LootprintIdByIndex.length()) return 0;
        return LootprintIdByIndex.length() - numRevealed;
    }

    /**
     * @dev Start a reveal action.
     * The hash submitted here must be the keccak256 hash of a secret number that will be submitted to the next function
     */
    function prepReveal(bytes32 seedHash) public onlyContractOwner {
        require(!pendingReveal && seedHash != revealSeedHash && revealCount < 20, "Prep Conditions Not Met");
        revealSeedHash = seedHash;
        revealPrepBlock = block.number;
        pendingReveal = true;
    }

    /**
     * @dev Finalize a reveal action.
     * Must take place at least one block after the `prepReveal` action was taken
     */
    function reveal(uint256 revealSeed) public onlyContractOwner{
        require(pendingReveal
                && block.number > revealPrepBlock
                && keccak256(abi.encodePacked(revealSeed)) == revealSeedHash
                , "Reveal Conditions Not Met");

        if (block.number - revealPrepBlock < 255) {
            bytes32 blockSeed = keccak256(abi.encodePacked(revealSeed, blockhash(revealPrepBlock)));
            revealBlockHashes[revealCount] = blockSeed;
            revealCount++;
        }
        pendingReveal = false;
    }

    /* Minting */

    /**
     * @dev Is the minting of a specific rescueOrder needing payment or is it free?
     */
    function paidMint(uint256 rescueOrder) public view returns (bool) {
        uint256 wordIndex = rescueOrder / 256;
        uint256 bitIndex = rescueOrder % 256;
        return (uint(NoChargeList[wordIndex] >> (255 - bitIndex)) & 1) == 0;
    }

    /**
     * @dev Create the token
     * Checks that the address minting is the current owner of the MoonCat, and ensures that MoonCat is Acclimated
     */
    function handleMint(uint256 rescueOrder, address to) private {
        require(mintingWindowOpen, "Minting Window Closed");
        require(MCR.catOwners(MCR.rescueOrder(rescueOrder)) == 0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69,
                "Not Acclimated");
        address moonCatOwner = MCA.ownerOf(rescueOrder);
        require((msg.sender == moonCatOwner)
            || (msg.sender == MCA.getApproved(rescueOrder))
            || (MCA.isApprovedForAll(moonCatOwner, msg.sender)),
            "Not AMC Owner or Approved"
        );

        require(!LootprintIdByIndex.contains(rescueOrder), "Already Minted");
        Lootprints[rescueOrder] = Lootprint(uint16(LootprintIdByIndex.length()), to);
        LootprintIdByIndex.add(rescueOrder);
        LootprintsByOwner[to].add(rescueOrder);
        emit Transfer(address(0), to, rescueOrder);
    }

    /**
     * @dev Mint a lootprint, and give it to a specific address
     */
    function mint(uint256 rescueOrder, address to) public payable notFrozen {
        if (paidMint(rescueOrder)) {
            require(address(this).balance >= price, "Insufficient Value");
            contractOwner.transfer(price);
        }
        handleMint(rescueOrder, to);
        if (address(this).balance > 0) {
            // The buyer over-paid; transfer their funds back to them
            payable(msg.sender).transfer(address(this).balance);
        }
    }

    /**
     * @dev Mint a lootprint, and give it to the address making the transaction
     */
    function mint(uint256 rescueOrder) public payable {
        mint(rescueOrder, msg.sender);
    }

    /**
     * @dev Mint multiple lootprints, sending them all to a specific address
     */
    function mintMultiple(uint256[] calldata rescueOrders, address to) public payable notFrozen {
        uint256 totalPrice = 0;
        for (uint i = 0; i < rescueOrders.length; i++) {
            if (paidMint(rescueOrders[i])) {
                totalPrice += price;
            }
            handleMint(rescueOrders[i], to);
        }
        require(address(this).balance >= totalPrice, "Insufficient Value");
        if (totalPrice > 0) {
            contractOwner.transfer(totalPrice);
        }
        if (address(this).balance > 0) {
            // The buyer over-paid; transfer their funds back to them
            payable(msg.sender).transfer(address(this).balance);
        }
    }

    /**
     * @dev Mint multiple lootprints, sending them all to the address making the transaction
     */
    function mintMultiple(uint256[] calldata rescueOrders) public payable {
        mintMultiple(rescueOrders, msg.sender);
    }

    /* Contract Owner */

    constructor(address metadataContract) {
        contractOwner = payable(msg.sender);

        Metadata = IMoonCatLootprintsMetadata(metadataContract);

        // https://docs.ens.domains/contract-api-reference/reverseregistrar#claim-address
        IReverseResolver(0x084b1c3C81545d370f3634392De611CaaBFf8148)
            .claim(msg.sender);
    }

    /**
     * @dev Mint the 160 Hero lootprint tokens, and give them to the contract owner
     */
    function setupHeroShips(bool groupTwo) public onlyContractOwner {
        uint startIndex = 25440;
        if (groupTwo) {
             startIndex = 25520;
        }
        require(Lootprints[startIndex].owner == address(0), "Already Set Up");
        for (uint i = startIndex; i < (startIndex+80); i++) {
            Lootprints[i] = Lootprint(uint16(LootprintIdByIndex.length()), contractOwner);
            LootprintIdByIndex.add(i);
            LootprintsByOwner[contractOwner].add(i);
            emit Transfer(address(0), contractOwner, i);
        }
    }

    /**
     * @dev Update the contract used for image/JSON rendering
     */
    function setMetadataContract(address metadataContract) public onlyContractOwner{
        Metadata = IMoonCatLootprintsMetadata(metadataContract);
    }

    /**
     * @dev Set configuration values for which MoonCat creates which color lootprint when minted
     */
    function setColorTable(bytes32[] calldata table, uint startAt) public onlyContractOwner {
        for (uint i = 0; i < table.length; i++) {
            ColorTable[startAt + i] = table[i];
        }
    }

    /**
     * @dev Set configuration values for which MoonCats need to pay for minting a lootprint
     */
    function setNoChargeList (bytes32[100] calldata noChargeList) public onlyContractOwner {
        NoChargeList = noChargeList;
    }

    /**
     * @dev Set configuration values for how much a paid lootprint costs
     */
    function setPrice(uint256 priceWei) public onlyContractOwner {
        price = priceWei;
    }

    /**
     * @dev Allow current `owner` to transfer ownership to another address
     */
    function transferOwnership (address payable newOwner) public onlyContractOwner {
        contractOwner = newOwner;
    }

    /**
     * @dev Prevent creating lootprints
     */
    function freeze () public onlyContractOwner notFrozen {
        frozen = true;
    }

    /**
     * @dev Enable creating lootprints
     */
    function unfreeze () public onlyContractOwner {
        frozen = false;
    }

    /**
     * @dev Prevent any further minting from happening
     * Checks to ensure all have been revealed before allowing locking down the minting process
     */
    function permanentlyCloseMintingWindow() public onlyContractOwner {
        require(revealCount >= 20, "Reveal Pending");
        mintingWindowOpen = false;
    }

    /* Property Decoders */

    function decodeColor(uint256 rescueOrder) public view returns (uint8) {
        uint256 wordIndex = rescueOrder / 64;
        uint256 nibbleIndex = rescueOrder % 64;
        bytes32 word = ColorTable[wordIndex];
        return uint8(uint(word >> (252 - nibbleIndex * 4)) & 15);
    }

    function decodeName(uint32 seed) internal view returns (string memory) {
        seed = seed >> 8;
        uint index;
        string[9] memory parts;
        //honorific
        index = seed & 15;
        if (index < 8) {
            parts[0] = "The ";
            if (index < 4) {
                parts[1] = honorifics[index];
                parts[2] = " ";
            }
        }
        seed >>= 4;
        //adjective
        if ((seed & 1) == 1) {
            index = (seed >> 1) & 31;
            parts[3] = adjectives[index];
            parts[4] = " ";
        }
        seed >>= 6;
        //mod
        index = seed & 15;
        if (index < 15) {
            parts[5] = mods[index];
        }
        seed >>= 4;
        //main
        index = seed & 31;
        parts[6] = mains[index];
        seed >>= 5;
        //designation
        if ((seed & 1) == 1) {
            index = (seed >> 1) & 15;
            parts[7] = " ";
            parts[8] = designations[index];
        }

        return string(abi.encodePacked(parts[0], parts[1], parts[2],
                                       parts[3], parts[4], parts[5],
                                       parts[6], parts[7], parts[8]));

    }

    function decodeClass(uint32 seed) internal pure returns (uint8) {
        uint class_determiner = seed & 15;
        if (class_determiner < 2) {
            return 0;
        } else if (class_determiner < 5) {
            return 1;
        } else if (class_determiner < 9) {
            return 2;
        } else {
            return 3;
        }
    }

    function decodeBays(uint32 seed) internal pure returns (uint8) {
        uint bay_determiner = (seed >> 4) & 15;

        if (bay_determiner < 3) {
            return 5;
        } else if (bay_determiner < 8) {
            return 4;
        } else {
            return 3;
        }
    }

    uint8 constant internal STATUS_NOT_MINTED = 0;
    uint8 constant internal STATUS_NOT_MINTED_FREE = 1;
    uint8 constant internal STATUS_PENDING = 2;
    uint8 constant internal STATUS_MINTED = 3;

    /**
     * @dev Get detailed traits about a lootprint token
     * Provides trait values in native contract return values, which can be used by other contracts
     */
    function getDetails (uint256 lootprintId)
        public
        view
        returns (uint8 status, string memory class, uint8 bays, string memory colorName, string memory shipName, address tokenOwner, uint32 seed)
    {
        Lootprint memory lootprint = Lootprints[lootprintId];
        colorName = Metadata.getColorName(decodeColor(lootprintId));
        tokenOwner = address(0);
        if (LootprintIdByIndex.contains(lootprintId)) {
            if (revealBlockHashes[lootprint.index / 1280] > 0) {
                seed = uint32(uint256(keccak256(abi.encodePacked(lootprintId, revealBlockHashes[lootprint.index / 1280]))));
                return (STATUS_MINTED,
                        Metadata.getClassName(decodeClass(seed)),
                        decodeBays(seed),
                        colorName,
                        decodeName(seed),
                        lootprint.owner,
                        seed);
            }
            status = STATUS_PENDING;
            tokenOwner = lootprint.owner;
        } else if (paidMint(lootprintId)) {
            status = STATUS_NOT_MINTED;
        } else {
            status = STATUS_NOT_MINTED_FREE;
        }
        return (status, "Unknown", 0, colorName, "?", tokenOwner, 0);
    }

    /* ERC-721 Metadata */

    function name() public pure override returns (string memory) {
        return "MoonCatLootprint";
    }

    function symbol() public pure override returns (string memory) {
        return unicode"📜";
    }

    function tokenURI(uint256 lootprintId) public view override lootprintExists(lootprintId) returns (string memory) {
        Lootprint memory lootprint = Lootprints[lootprintId];
        uint8 colorId = decodeColor(lootprintId);
        if (revealBlockHashes[lootprint.index / 1280] > 0) {
            uint32 seed = uint32(uint256(keccak256(abi.encodePacked(lootprintId, revealBlockHashes[lootprint.index / 1280]))));
            uint8 classId = decodeClass(seed);
            string memory shipName = decodeName(seed);
            uint8 bays = decodeBays(seed);
            return Metadata.getJSON(lootprintId, classId, colorId, bays, shipName);
        } else {
            return Metadata.getJSON(lootprintId, 4, colorId, 0, "?");
        }
    }

    function imageURI(uint256 lootprintId) public view lootprintExists(lootprintId) returns (string memory) {
        Lootprint memory lootprint = Lootprints[lootprintId];
        uint8 colorId = decodeColor(lootprintId);
        if (revealBlockHashes[lootprint.index / 1280] > 0) {
            uint32 seed = uint32(uint256(keccak256(abi.encodePacked(lootprintId, revealBlockHashes[lootprint.index / 1280]))));
            uint8 classId = decodeClass(seed);
            string memory shipName = decodeName(seed);
            uint8 bays = decodeBays(seed);
            return Metadata.getImage(lootprintId, classId, colorId, bays, shipName);
        } else {
            return Metadata.getImage(lootprintId, 4, colorId, 0, "?");
        }
    }

    /* Rescue Tokens */

    /**
     * @dev Rescue ERC20 assets sent directly to this contract.
     */
    function withdrawForeignERC20(address tokenContract)
        public
        onlyContractOwner
    {
        IERC20 token = IERC20(tokenContract);
        token.transfer(contractOwner, token.balanceOf(address(this)));
    }

    /**
     * @dev Rescue ERC721 assets sent directly to this contract.
     */
    function withdrawForeignERC721(address tokenContract, uint256 lootprintId)
        public
        onlyContractOwner
    {
        IERC721(tokenContract).safeTransferFrom(address(this), contractOwner, lootprintId);
    }

}

File 2 of 2 : MoonCatLootprintsMetadata.sol
// SPDX-License-Identifier: AGPL-3.0

pragma solidity 0.8.1;

/**
 * @dev On-chain art generation for MoonCatLootprints
 * Takes individual trait values as parameters, and outputs complete representations of them.
 */
contract MoonCatLootprintsMetadata {

    string[5] internal class_names =
        [
         "Mech",
         "Sub",
         "Tank",
         "Cruiser",
         "Unknown"
         ];

    /**
     * @dev Convert a Classification ID number into a string name
     */
    function getClassName(uint8 classId) public view returns (string memory) {
        return class_names[classId];
    }

    string[15] internal color_names =
        ["Hero Silver",
         "Genesis White",
         "Genesis Black",
         "Red",
         "Orange",
         "Yellow",
         "Chartreuse",
         "Green",
         "Teal",
         "Cyan",
         "SkyBlue",
         "Blue",
         "Purple",
         "Magenta",
         "Fuchsia"];

    /**
     * @dev Convert a Color ID number into a string name
     */
    function getColorName(uint8 colorId) public view returns (string memory) {
        return color_names[colorId];
    }

    // Color codes used for the background color of an image representation
    string[15] internal color_codes =
        ["#777777", // Silver
         "#cccccc", // White
         "#111111", // Black
         "hsl(0,60%,38%)", // Red
         "hsl(30,60%,38%)", // Orange
         "hsl(60,60%,38%)", // Yellow
         "hsl(80,60%,38%)", // Chartreuse
         "hsl(120,60%,38%)", // Green
         "hsl(150,60%,38%)", // Teal
         "hsl(180,60%,38%)", // Cyan
         "hsl(210,60%,38%)", // SkyBlue
         "hsl(240,60%,38%)", // Blue
         "hsl(270,60%,38%)", // Purple
         "hsl(300,60%,38%)", // Magenta
         "hsl(330,60%,38%)"]; // Fuchsia

    // SVG codes for the different icons for each ship classification
    string[4] public ship_images =
        ["<path class=\"s\" d=\"M-61.74,77.79h-12.61V32.32h12.61V77.79z M-28.03,26.64l-7.58-12.63v44.12h7.58V26.64z M-0.65,52.52h10.99 L41.41,1.36L24.74-12.66H-0.65h-25.39L-42.72,1.36l31.07,51.16H-0.65z M60.43,77.79h12.61V32.32H60.43V77.79z M26.73,58.14h7.58 V14.02l-7.58,12.63V58.14z\"/><path class=\"s\" d=\"M-23.89,32.56v4.77h-44.15V8.75h29.81 M-58.76,13.76h-18.55v18.55h18.55V13.76z M22.59,32.56v4.77h44.15V8.75 H36.92 M57.46,32.32h18.55V13.76H57.46V32.32z M5.79,46.98L5.79,46.98c0-1.07-0.87-1.94-1.94-1.94h-9c-1.07,0-1.94,0.87-1.94,1.94 v0c0,1.07,0.87,1.94,1.94,1.94h9C4.92,48.93,5.79,48.06,5.79,46.98z\"/><path class=\"s s1\" d=\"M-79.92,94.43V86.1 M-56.04,94.43V86.1 M78.61,94.43V86.1 M54.74,94.43V86.1 M-14.48,5.33h28.04 M-9.45,1.1 H8.52\"/><path class=\"s s1\" d=\"M-44.11,94.43h-47.87V82.76c0-2.76,2.24-5,5-5h37.87c2.76,0,5,2.24,5,5V94.43z M-19.88,57.67v-6.18 c0-1.64-1.33-2.97-2.97-2.97h-9.15v12.13h9.15C-21.22,60.65-19.88,59.32-19.88,57.67z M42.8,94.43h47.87V82.76c0-2.76-2.24-5-5-5 H47.8c-2.76,0-5,2.24-5,5V94.43z M-0.65,31.11h14.08L33.42,3.86L25.39,2.2l-8.96,8.83H-0.65h-17.08l-8.96-8.83l-8.04,1.66 l19.99,27.25H-0.65z M21.55,60.65h9.15V48.52h-9.15c-1.64,0-2.97,1.33-2.97,2.97v6.18C18.58,59.32,19.91,60.65,21.55,60.65z\"/><path class=\"s s1\" d=\"M-26.04-12.66l-11.17,9.4v-27.46h7.51l16.17,18.06H-26.04z M24.74-12.66l11.17,9.4v-27.46H28.4L12.23-12.66 H24.74z\"/><path class=\"s s2\" d=\"M-19.88,52.86h-3.79 M-19.88,56.46h-3.79 M22.37,52.86h-3.79 M18.58,56.46h3.79\"/>  <path class=\"s s2\" d=\"M-39.67,8.41l-1.58,33.83h-11.47l-1.58-33.83c0-4.04,3.28-7.32,7.32-7.32C-42.95,1.1-39.67,4.37-39.67,8.41z M-43.38,42.24h-6.9l-1.01,4.74h8.91L-43.38,42.24z M38.37,8.41l1.58,33.83h11.47L53,8.41c0-4.04-3.28-7.32-7.32-7.32 C41.64,1.1,38.37,4.37,38.37,8.41z M41.06,46.98h8.91l-1.01-4.74h-6.9L41.06,46.98z\"/>", // Mech

         "<path class=\"s\" d=\"M55.52,60.62l-125.85,7.15c-13.35,0.76-24.59-9.86-24.59-23.23v0c0-13.37,11.24-23.99,24.59-23.23l125.85,7.15 V60.62z\"/><path class=\"s\" d=\"M48.39,42.2v10.28l-5.47-1.16v-7.96L48.39,42.2z M63.26,21.92L63.26,21.92c-2.75,0-4.82,2.5-4.31,5.2 l3.33,17.61h1.97l3.33-17.61C68.09,24.42,66.01,21.92,63.26,21.92z M63.26,67.55L63.26,67.55c2.75,0,4.82-2.5,4.31-5.2l-3.33-17.61 h-1.97l-3.33,17.61C58.44,65.05,60.51,67.55,63.26,67.55z M-44.97,43.64L-44.97,43.64c0.76,0.76,1.99,0.76,2.75,0l6.36-6.36 c0.76-0.76,0.76-1.99,0-2.75l0,0c-0.76-0.76-1.99-0.76-2.75,0l-6.36,6.36C-45.72,41.65-45.72,42.88-44.97,43.64z M-34.82,43.64 L-34.82,43.64c0.76,0.76,1.99,0.76,2.75,0l6.36-6.36c0.76-0.76,0.76-1.99,0-2.75l0,0c-0.76-0.76-1.99-0.76-2.75,0l-6.36,6.36 C-35.58,41.65-35.58,42.88-34.82,43.64z M63.26,43.33h-7.74v2.81h7.74V43.33z\"/><path class=\"s\" d=\"M-71.47,62.75v15.73 M-65.61,62.75v22.93\"/> <path class=\"s s1\" d=\"M52.24,60.8l1.72,11.04l19.89,4.4v6.21L38.9,88.39c-8.09,1.37-15.55-4.68-15.87-12.88l-0.51-13.03 M51.24,28.2 L67.16,2.56l-80.25-3.16c-6.16-0.24-12.13,2.16-16.4,6.61l-16.03,16.69\"/><path class=\"s s1\" d=\"M3.89,39.09l39.03,1.83v13.24L3.89,55.98c-4.66,0-8.44-3.78-8.44-8.44C-4.56,42.87-0.78,39.09,3.89,39.09z M-42.74,31.11l-31.49-1.26c-5.73,0-10.75,3.81-12.3,9.33l-0.67,5.36h29.01L-42.74,31.11z M30.03,47.53L30.03,47.53 c0-1.07-0.87-1.94-1.94-1.94h-9c-1.07,0-1.94,0.87-1.94,1.94v0c0,1.07,0.87,1.94,1.94,1.94h9C29.16,49.47,30.03,48.6,30.03,47.53z\"/>", // Sub

         "<path class=\"s\" d=\"M-41.05,64.38H-76.3c-9.83,0-17.79-7.98-17.77-17.8l0.02-7.96l53-31.34V64.38z M-33.49,21.94v36.39l12.96,9.64 c7.01,5.22,15.52,8.03,24.26,8.03h50.54V7.29l-12-2.39C27.98,2.05,13.19,3.4-0.34,8.77L-33.49,21.94z\"/> <path class=\"s\" d=\"M-53.74,49.67l93.8-17.28 M-53.74,96.38h99.86 M-60.37,44.65L-60.37,44.65c0-1.07-0.87-1.94-1.94-1.94h-9 c-1.07,0-1.94,0.87-1.94,1.94v0c0,1.07,0.87,1.94,1.94,1.94h9C-61.24,46.59-60.37,45.72-60.37,44.65z M-60.37,37.78L-60.37,37.78 c0-1.07-0.87-1.94-1.94-1.94h-9c-1.07,0-1.94,0.87-1.94,1.94v0c0,1.07,0.87,1.94,1.94,1.94h9C-61.24,39.72-60.37,38.85-60.37,37.78 z M-33.49,26.33h-7.56v27.92h7.56V26.33z\"/><path class=\"s s1\" d=\"M-0.29,30.83v-9c0-1.07,0.87-1.94,1.94-1.94h0c1.07,0,1.94,0.87,1.94,1.94v9c0,1.07-0.87,1.94-1.94,1.94h0 C0.58,32.77-0.29,31.9-0.29,30.83z M1.47-0.14c-4.66,0-8.44,3.78-8.44,8.44l1.83,39.03H8.08L9.91,8.3 C9.91,3.64,6.13-0.14,1.47-0.14z\"/> <path class=\"s s1\" d=\"M42.26,32.38c-17.67,0-32,14.33-32,32s14.33,32,32,32s32-14.33,32-32S59.94,32.38,42.26,32.38z M42.26,89.98 c-14.14,0-25.6-11.46-25.6-25.6s11.46-25.6,25.6-25.6s25.6,11.46,25.6,25.6S56.4,89.98,42.26,89.98z M-51.74,49.57 c-12.93,0-23.4,10.48-23.4,23.41c0,12.93,10.48,23.4,23.4,23.4s23.4-10.48,23.4-23.4C-28.33,60.05-38.81,49.57-51.74,49.57z M-51.74,91.7c-10.34,0-18.72-8.38-18.72-18.72c0-10.34,8.38-18.72,18.72-18.72s18.72,8.38,18.72,18.72 C-33.01,83.32-41.4,91.7-51.74,91.7z M-46.35,29.02h-14.78l14.4-10.61L-46.35,29.02z M6.8,52.81H-3.49l1.16-5.47h7.96L6.8,52.81z M54.26,20.3l9-3v18.97l-9-3.28 M54.26,53.04l9-3v18.97l-9-3.28\"/>", // Tank

         "<path class=\"s\" d=\"M0.26,93.33h14.33c0,0-0.76-11.46-2.27-32s13.64-76.47,19.95-99.97s-2.52-60.03-32-60.03 s-38.31,36.54-32,60.03s21.46,79.43,19.95,99.97s-2.27,32-2.27,32H0.26\"/><path class=\"s\" d=\"M-12.9,76.57l-47.02,6.06l3.03-18.95l43.64-22.42 M-26.38-18.46l-9.09,14.31v19.33l14.78-10.8 M13.42,76.57 l47.02,6.06l-3.03-18.95L13.77,41.25 M21.22,4.37L36,15.17V-4.15l-9.09-14.31\"/><path class=\"s s1\" d=\"M-33.66,46.63l-1.83,39.03h-13.24l-1.83-39.03c0-4.66,3.78-8.44,8.44-8.44 C-37.44,38.18-33.66,41.96-33.66,46.63z M34.19,46.63l1.83,39.03h13.24l1.83-39.03c0-4.66-3.78-8.44-8.44-8.44 C37.97,38.18,34.19,41.96,34.19,46.63z\"/><path class=\"s s1\" d=\"M-19.18-74.83c1.04,1.8,0.95,17.15,3.03,27c1.51,7.14,4.01,15.92,2.38,18.14c-1.43,1.94-7.59,1.24-9.95-1.37 c-3.41-3.78-4.15-10.56-4.93-16.67C-30.13-59.39-22.35-80.31-19.18-74.83z M-37.94,85.66h-7.96l-1.16,5.47h10.28L-37.94,85.66z M-10.65,93.33l-1.33,8.05H0.26h12.24l-1.33-8.05 M0.26-34.67c0,0,1.82,0,6.12,0s7.45-32,7.04-43S9.28-88.66,0.26-88.66 s-12.75-0.01-13.16,10.99c-0.41,11,2.74,43,7.04,43S0.26-34.67,0.26-34.67z M19.71-74.83c-1.04,1.8-0.95,17.15-3.03,27 c-1.51,7.14-4.01,15.92-2.38,18.14c1.43,1.94,7.59,1.24,9.95-1.37c3.41-3.78,4.15-10.56,4.93-16.67 C30.65-59.39,22.88-80.31,19.71-74.83z M37.3,91.13h10.28l-1.16-5.47h-7.96L37.3,91.13z\"/>" // Cruiser
         ];

    /**
     * @dev Render an SVG of a ship with the specified features.
     */
    function getImage (uint256 lootprintId, uint8 classId, uint8 colorId, uint8 bays, string calldata shipName)
        public
        view
        returns (string memory)
    {

        string memory regStr = uint2str(lootprintId);
        string memory baysStr = uint2str(bays);

        string[15] memory parts;
        parts[0] = "<svg xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\" viewBox=\"0 0 600 600\"><style> .s{fill:white;stroke:white;stroke-width:2;stroke-miterlimit:10;fill-opacity:0.1;stroke-linecap:round}.s1{fill-opacity:0.3}.s2{stroke-width:1}.t{ fill:white;font-family:serif;font-size:20px;}.k{font-weight:bold;text-anchor:end;fill:#ddd;}.n{font-size:22px;font-weight:bold;text-anchor:middle}.l{fill:none;stroke:rgb(230,230,230,0.5);stroke-width:1;clip-path:url(#c);}.r{fill:rgba(0,0,0,0.5);stroke:white;stroke-width:3;}.r1{stroke-width: 1} .a{fill:#FFFFFF;fill-opacity:0.1;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}.b{fill:none;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;} .c{fill:#FFFFFF;fill-opacity:0.2;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;} .d{fill:#FFFFFF;fill-opacity:0.3;stroke:#FFFFFF;stroke-width:2;stroke-miterlimit:10;}</style><defs><clipPath id=\"c\"><rect width=\"600\" height=\"600\" /></clipPath></defs><rect width=\"600\" height=\"600\" fill=\"";
        parts[1] = color_codes[colorId];
        parts[2] = "\"/><polyline class=\"l\" points=\"40,-5 40,605 80,605 80,-5 120,-5 120,605 160,605 160,-5 200,-5 200,605 240,605 240,-5 280,-5 280,605 320,605 320,-5 360,-5 360,605 400,605 400,-5 440,-5 440,605 480,605 480,-5 520,-5 520,605 560,605 560,-5 600,-5 600,605\" /><polyline class=\"l\" points=\"-5,40 605,40 605,80 -5,80 -5,120 605,120 605,160 -5,160 -5,200 605,200 605,240 -5,240 -5,280 605,280 605,320 -5,320 -5,360 605,360 605,400 -5,400 -5,440 605,440 605,480 -5,480 -5,520 605,520 605,560 -5,560 -5,600 605,600\" /><rect class=\"r\" x=\"10\" y=\"10\" width=\"580\" height=\"50\" rx=\"15\" /><rect class=\"l r r1\" x=\"-5\" y=\"80\" width=\"285\" height=\"535\" /><text class=\"t n\" x=\"300\" y=\"42\">";
        parts[3] = shipName;
        parts[4] = "</text><text class=\"t k\" x=\"115\" y=\"147\">Reg:</text><text class=\"t\" x=\"125\" y=\"147\">#";
        parts[5] = regStr;
        parts[6] = "</text><text class=\"t k\" x=\"115\" y=\"187\">Class:</text><text class=\"t\" x=\"125\" y=\"187\">";
        parts[7] = class_names[classId];
        parts[8] = "</text><text class=\"t k\" x=\"115\" y=\"227\">Color:</text><text class=\"t\" x=\"125\" y=\"227\">";
        parts[9] = color_names[colorId];
        parts[10] = "</text><text class=\"t k\" x=\"115\" y=\"267\">Bays:</text><text class=\"t\" x=\"125\" y=\"267\">";
        parts[11] = baysStr;
        parts[12] = "</text><g transform=\"translate(440,440)scale(1.2)\">";
        if (classId < 4) {
            parts[13] = ship_images[classId];
        }
        parts[14] = "</g></svg>";

        bytes memory svg0 = abi.encodePacked(parts[0], parts[1], parts[2],
                                             parts[3], parts[4], parts[5],
                                             parts[6], parts[7], parts[8]);
        bytes memory svg1 = abi.encodePacked(parts[9], parts[10], parts[11],
                                             parts[12], parts[13], parts[14]);

        return string(abi.encodePacked("data:image/svg+xml;base64,", Base64.encode(abi.encodePacked(svg0, svg1))));
    }

    /**
     * @dev Encode a key/value pair as a JSON trait property, where the value is a numeric item (doesn't need quotes)
     */
    function encodeAttribute(string memory key, string memory value) internal pure returns (string memory) {
        return string(abi.encodePacked("{\"trait_type\":\"", key,"\",\"value\":",value,"}"));
    }

    /**
     * @dev Encode a key/value pair as a JSON trait property, where the value is a string item (needs quotes around it)
     */
    function encodeStringAttribute(string memory key, string memory value) internal pure returns (string memory) {
        return string(abi.encodePacked("{\"trait_type\":\"", key,"\",\"value\":\"",value,"\"}"));
    }

    /**
     * @dev Render a JSON metadata object of a ship with the specified features.
     */
    function getJSON(uint256 lootprintId, uint8 classId, uint8 colorId, uint8 bays, string calldata shipName)
        public
        view
        returns (string memory) {
        string memory colorName = color_names[colorId];
        string memory svg = getImage(lootprintId, classId, colorId, bays, shipName);
        bytes memory tokenName = abi.encodePacked("Lootprint #", uint2str(lootprintId), ": ", shipName);
        bytes memory json = abi.encodePacked("{",
                                             "\"attributes\":[",
                                             encodeAttribute("Registration #", uint2str(lootprintId)), ",",
                                             encodeStringAttribute("Class", class_names[classId]), ",",
                                             encodeAttribute("Bays", uint2str(bays)), ",",
                                             encodeStringAttribute("Color", colorName),
                                             "],\"name\":\"", tokenName,
                                             "\",\"description\":\"Build Plans for a MoonCat Spacecraft\",\"image\":\"", svg,
                                             "\"}");
        return string(abi.encodePacked('data:application/json;base64,', Base64.encode(json)));

    }

    /* Utilities */

    function uint2str(uint value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
                let resultPtr := add(result, 32)

                for {
                     let i := 0
                } lt(i, len) {

            } {
            i := add(i, 3)
            let input := and(mload(add(data, i)), 0xffffff)

            let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
            out := shl(8, out)
            out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
            out := shl(8, out)
            out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
            out := shl(8, out)
            out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
            out := shl(224, out)

            mstore(resultPtr, out)

            resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
                          case 1 {
                                  mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
                }
            case 2 {
                    mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
                }

        return string(result);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"metadataContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Lootprints","outputs":[{"internalType":"uint16","name":"index","type":"uint16"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Metadata","outputs":[{"internalType":"contract IMoonCatLootprintsMetadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractOwner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rescueOrder","type":"uint256"}],"name":"decodeColor","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"getDetails","outputs":[{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"string","name":"class","type":"string"},{"internalType":"uint8","name":"bays","type":"uint8"},{"internalType":"string","name":"colorName","type":"string"},{"internalType":"string","name":"shipName","type":"string"},{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"uint32","name":"seed","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"imageURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rescueOrder","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rescueOrder","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"rescueOrders","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"rescueOrders","type":"uint256[]"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingWindowOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rescueOrder","type":"uint256"}],"name":"paidMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRevealCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permanentlyCloseMintingWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"seedHash","type":"bytes32"}],"name":"prepReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"revealSeed","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"lootprintId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"table","type":"bytes32[]"},{"internalType":"uint256","name":"startAt","type":"uint256"}],"name":"setColorTable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"metadataContract","type":"address"}],"name":"setMetadataContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[100]","name":"noChargeList","type":"bytes32[100]"}],"name":"setNoChargeList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"groupTwo","type":"bool"}],"name":"setupHeroShips","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"lootprintId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600080546001600160a01b031990811673c3f733ca98e0dad0386979eb96fb1722a1a05e6917909155600180549091167360cd862c9c687a9de49aecdc3a99b74a4fc54ab61790556009610100818152684c6567656e6461727960b81b610120526080908152610140918252684e6f746f72696f757360b81b6101605260a091909152600d6101809081526c111a5cdd1a5b99dd5a5cda1959609a1b6101a05260c05261020060405260086101c09081526714995b9bdddb995960c21b6101e05260e052620000d390600390600462000e15565b5060408051610440810182526005610400820181815264547572626f60d81b610420840152825282518084018452600880825267546563746f6e696360c01b6020838101919091528085019290925284518086018652600680825265149d59d9d95960d21b8285015285870191909152855180870187528281526711195c995b1a58dd60c21b81850152606086015285518087018752600e81526d14d8dc985d18da1cd8d85c9c995960921b8185015260808601528551808701875282815267141d5c9c999958dd60c21b8185015260a0860152855180870187526007808252665269636b65747960c81b8286015260c08701919091528651808801885281815266537061726b6c7960c81b8186015260e08701528651808801885283815267115d1a195c99585b60c21b81860152610100870152865180880188528181526648697373696e6760c81b818601526101208701528651808801885283815267506f756e63696e6760c01b8186015261014087015286518088018852838152675374616c6b696e6760c01b8186015261016087015286518088018852838152675374616e64696e6760c01b818601526101808701528651808801885283815267536c656570696e6760c01b818601526101a08701528651808801885281815266141b185e599d5b60ca1b818601526101c0870152865180880188526009808252684d656e616e63696e6760b81b828701526101e08801919091528751808901895283815265437564646c7960d01b8187015261020088015287518089018952848152674e6575726f74696360c01b8187015261022088015287518089018952848152670a6d6d2e8e8d2e6d60c31b818701526102408801528751808901895281815268496d70756c7369766560b81b81870152610260880152875180890189526003815262536c7960e81b818701526102808801528751808901895290815268506f6e6465726f757360b81b818601526102a08701528651808801885283815267141c9bd91a59d85b60c21b818601526102c0870152865180880188528281526548756e67727960d01b818601526102e087015286518088018852828152654772756d707960d01b8186015261030087015286518088018852838152674861726d6c65737360c01b8186015261032087015286518088018852600a8152694d7973746572696f757360b01b818601526103408701528651808801885282815265467269736b7960d01b818601526103608701528651808801885294855264467572727960d81b858501526103808601949094528551808701875282815267536372617463687960c01b818501526103a0860152855180870187529081526550617463687960d01b818401526103c08501528451808601909552845267486169726c65737360c01b848201526103e0830193909352620004f49290919062000e6c565b50604080516102208101825260046101e082018181526329ba30b960e11b61020084015282528251808401845260068082526547616c61787960d01b6020838101919091528085019290925284518086018652600d81526c21b7b739ba32b63630ba34b7b760991b81840152848601528451808601865260058082526415dbdc9b1960da1b828501526060860191909152855180870187528481526326b7b7b760e11b8185015260808601528551808701875281815264416c6c657960d81b8185015260a086015285518087018752600880825267135a591b9a59da1d60c21b8286015260c087019190915286518088018852838152652bb0b73232b960d11b8186015260e0870152865180880188529485526354756e6160e01b8585015261010086019490945285518087018752908152644d6f75736560d81b81840152610120850152845180860186528181526504361746e69760d41b81840152610140850152845180860186526003815262546f7960e81b8184015261016085015284518086018652908152654b6962626c6560d01b81830152610180840152835180850185529182526712185a5c98985b1b60c21b828201526101a083019190915282518084019093526009835268098d2e8e8cae4c4def60bb1b908301526101c0810191909152620006ea90602790600f62000eb1565b50604080516104408101825260096104008201818152684c696768746e696e6760b81b6104208401528252825180840184526006808252652bb7b73232b960d11b60208381019190915280850192909252845180860186526007808252662a37b2b132b0b760c91b828501528587019190915285518087018752818152662bb434b9b5b2b960c91b81850152606086015285518087018752600381526250617760e81b8185015260808601528551808701875260048082526346616e6760e01b8286015260a0870191909152865180880188528181526315185a5b60e21b8186015260c087015286518088018852828152660a0eae4e4c4def60cb1b8186015260e087015286518088018852818152634d656f7760e01b818601526101008701528651808801885290815263436c617760e01b81850152610120860152855180870187528481526829b1b930ba31b432b960b91b81850152610140860152855180870187528181526621b437b6b832b960c91b8185015261016086015285518087018752818152662734b1313632b960c91b81850152610180860152855180870187528281526526b7bab9b2b960d11b818501526101a08601528551808701875260058152642930b1b2b960d91b818501526101c086015285518087018752828152652a32b0b9b2b960d11b818501526101e0860152855180870187528281526521b430b9b2b960d11b818501526102008601528551808701875282815265243ab73a32b960d11b8185015261022086015285518087018752828152652632b0b832b960d11b81850152610240860152855180870187528181526629b632b2b832b960c91b8185015261026086015285518087018752818152662837bab731b2b960c91b81850152610280860152855180870187528181526629ba30b635b2b960c91b818501526102a0860152855180870187528181526629ba30b73232b960c91b818501526102c08601528551808701875282815265151bdc10d85d60d21b818501526102e086015285518087018752600a8082526920b6b130b9b9b0b237b960b11b82860152610300870191909152865180880188529182526610591b5a5c985b60ca1b82850152610320860191909152855180870187528481526821b7b6b6b0b73232b960b91b8185015261034086015285518087018752908152692732b3b7ba34b0ba37b960b11b81840152610360850152845180860186528181526515985b99185b60d21b8184015261038085015284518086018652600881526726b4b9b1b434b2b360c11b818401526103a08501528451808601865292835268556c74696d6174756d60b81b838301526103c084019290925283518085019094529083526546726f6c696360d01b838201526103e082019290925262000af4916036919062000e6c565b5060408051610240810182526005610200820181815264416c70686160d81b61022084015282528251808401845260038082526254617560e81b6020838101919091528085019290925284518086018652600280825261506960f01b8285015285870191909152855180870187526001808252604960f81b8286015260608701919091528651808801885282815261494960f01b818601526080870152865180880188529283526249494960e81b8385015260a0860192909252855180870187529081526124ab60f11b8184015260c085015284518086018652818152602b60f91b8184015260e085015284518086018652818152600b60fb1b8184015261010085015284518086018652928352645072696d6560d81b8383015261012084019290925283518085018552600680825265283937b832b960d11b8284015261014085019190915284518086018652838152603160f81b8184015261016085015284518086018652908152650c4dcc0c4b5160d21b81830152610180840152835180850185526004808252633230313760e01b828401526101a085019190915284518086018652928352604160f81b838301526101c0840192909252835180850190945290835263149d5b9d60e21b908301526101e081019190915262000cdf90605690601062000ef6565b506101f6805460ff60b01b1960ff60a81b1960ff60a01b19909216600160a01b1791909116600160a81b1716905566b1a2bc2ec500006101f755616675805460ff1916905534801562000d3157600080fd5b5060405162004dd838038062004dd883398101604081905262000d549162001043565b6101f68054336001600160a01b03199182168117909255600280549091166001600160a01b038416179055604051630f41a04d60e11b815273084b1c3c81545d370f3634392de611caabff814891631e83409a9162000db791906004016200108c565b602060405180830381600087803b15801562000dd257600080fd5b505af115801562000de7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e0d919062001073565b5050620010dd565b826004810192821562000e5a579160200282015b8281111562000e5a578251805162000e4991849160209091019062000f3b565b509160200191906001019062000e29565b5062000e6892915062000fc6565b5090565b826020810192821562000e5a579160200282015b8281111562000e5a578251805162000ea091849160209091019062000f3b565b509160200191906001019062000e80565b82600f810192821562000e5a579160200282015b8281111562000e5a578251805162000ee591849160209091019062000f3b565b509160200191906001019062000ec5565b826010810192821562000e5a579160200282015b8281111562000e5a578251805162000f2a91849160209091019062000f3b565b509160200191906001019062000f0a565b82805462000f4990620010a0565b90600052602060002090601f01602090048101928262000f6d576000855562000fb8565b82601f1062000f8857805160ff191683800117855562000fb8565b8280016001018555821562000fb8579182015b8281111562000fb857825182559160200191906001019062000f9b565b5062000e6892915062000fe7565b8082111562000e6857600062000fdd828262000ffe565b5060010162000fc6565b5b8082111562000e68576000815560010162000fe8565b5080546200100c90620010a0565b6000825580601f1062001020575062001040565b601f01602090049060005260206000209081019062001040919062000fe7565b50565b60006020828403121562001055578081fd5b81516001600160a01b03811681146200106c578182fd5b9392505050565b60006020828403121562001085578081fd5b5051919050565b6001600160a01b0391909116815260200190565b600281046001821680620010b557607f821691505b60208210811415620010d757634e487b7160e01b600052602260045260246000fd5b50919050565b613ceb80620010ed6000396000f3fe6080604052600436106102675760003560e01c80638f742d1611610144578063b88d4fde116100b6578063ce606ee01161007a578063ce606ee0146106eb578063d47f030d14610700578063da6c928314610713578063e5187f4314610741578063e985e9c514610761578063f2fde38b1461078157610267565b8063b88d4fde14610643578063b93a89f714610663578063c2ca0ac514610696578063c2d2bccb146106b6578063c87b56dd146106cb57610267565b8063a035b1fe11610108578063a035b1fe146105a4578063a0712d68146105b9578063a1a4c27f146105cc578063a22cb465146105f9578063a350de0d14610619578063a5eb6ff21461062e57610267565b80638f742d161461051c57806391b7f5ed1461053c57806394bf804d1461055c57806395d89b411461056f5780639e288b1a1461058457610267565b806339d78e6b116101dd5780636352211e116101a15780636352211e1461047457806365cde733146104945780636a28f000146104b45780636fa14b54146104c957806370a08231146104e957806382db3fb61461050957610267565b806339d78e6b146103ea57806342842e0e146103ff5780634f6ccce71461041f5780635c4719951461043f57806362a5af3b1461045f57610267565b80630ce06b681161022f5780630ce06b681461032857806314152f711461034857806318160ddd1461036857806323b872dd1461038a5780632f745c59146103aa57806335a9cede146103ca57610267565b806301ffc9a71461026c578063054f7d9c146102a257806306fdde03146102b7578063081812fc146102d9578063095ea7b314610306575b600080fd5b34801561027857600080fd5b5061028c6102873660046131fa565b6107a1565b60405161029991906134b4565b60405180910390f35b3480156102ae57600080fd5b5061028c6107f5565b3480156102c357600080fd5b506102cc610806565b60405161029991906134d4565b3480156102e557600080fd5b506102f96102f43660046131e2565b610831565b604051610299919061340c565b34801561031257600080fd5b50610326610321366004613077565b61084d565b005b34801561033457600080fd5b50610326610343366004613077565b610906565b34801561035457600080fd5b506103266103633660046131aa565b61099c565b34801561037457600080fd5b5061037d610b54565b60405161029991906133f5565b34801561039657600080fd5b506103266103a5366004612f63565b610b66565b3480156103b657600080fd5b5061037d6103c5366004613077565b610c27565b3480156103d657600080fd5b506103266103e53660046130cb565b610c7c565b3480156103f657600080fd5b50610326610d1a565b34801561040b57600080fd5b5061032661041a366004612f63565b610d84565b34801561042b57600080fd5b5061037d61043a3660046131e2565b610d9f565b34801561044b57600080fd5b5061032661045a366004612eec565b610dad565b34801561046b57600080fd5b50610326610ed6565b34801561048057600080fd5b506102f961048f3660046131e2565b610f42565b3480156104a057600080fd5b5061028c6104af3660046131e2565b610f7e565b3480156104c057600080fd5b50610326610fdc565b3480156104d557600080fd5b506103266104e43660046131e2565b611017565b3480156104f557600080fd5b5061037d610504366004612eec565b6110a8565b610326610517366004613155565b6110ca565b34801561052857600080fd5b506102cc6105373660046131e2565b61121e565b34801561054857600080fd5b506103266105573660046131e2565b6114a3565b61032661056a3660046132e5565b6114d4565b34801561057b57600080fd5b506102cc6115b0565b34801561059057600080fd5b5061032661059f3660046130a2565b6115ce565b3480156105b057600080fd5b5061037d611607565b6103266105c73660046131e2565b61160e565b3480156105d857600080fd5b506105ec6105e73660046131e2565b61161b565b6040516102999190613a00565b34801561060557600080fd5b5061032661061436600461304a565b611684565b34801561062557600080fd5b5061028c61171d565b34801561063a57600080fd5b506102f961172e565b34801561064f57600080fd5b5061032661065e366004612fa3565b61173d565b34801561066f57600080fd5b5061068361067e3660046131e2565b611910565b6040516102999796959493929190613a0e565b3480156106a257600080fd5b506103266106b13660046131e2565b611bdd565b3480156106c257600080fd5b5061037d611d31565b3480156106d757600080fd5b506102cc6106e63660046131e2565b611d8e565b3480156106f757600080fd5b506102f9611f53565b61032661070e366004613115565b611f63565b34801561071f57600080fd5b5061073361072e3660046131e2565b611f6e565b60405161029992919061396a565b34801561074d57600080fd5b5061032661075c366004612eec565b611f9b565b34801561076d57600080fd5b5061028c61077c366004612f2b565b611fe8565b34801561078d57600080fd5b5061032661079c366004612eec565b612017565b60006001600160e01b031982166380ac58cd60e01b14806107d257506001600160e01b03198216635b5e139f60e01b145b806107ed57506001600160e01b0319821663780e9d6360e01b145b90505b919050565b6101f654600160a01b900460ff1681565b60408051808201909152601081526f135bdbdb90d85d131bdbdd1c1c9a5b9d60821b60208201525b90565b600090815261667360205260409020546001600160a01b031690565b8061085a61667082612065565b61087f5760405162461bcd60e51b81526004016108769061370e565b60405180910390fd5b600061088a83610f42565b9050806001600160a01b0316846001600160a01b031614156108be5760405162461bcd60e51b8152600401610876906138a1565b336001600160a01b03821614806108da57506108da8133611fe8565b6108f65760405162461bcd60e51b8152600401610876906137b1565b610900848461207d565b50505050565b6101f6546001600160a01b031633146109315760405162461bcd60e51b8152600401610876906135e3565b6101f654604051632142170760e11b81526001600160a01b03808516926342842e0e9261096692309216908690600401613453565b600060405180830381600087803b15801561098057600080fd5b505af1158015610994573d6000803e3d6000fd5b505050505050565b6101f6546001600160a01b031633146109c75760405162461bcd60e51b8152600401610876906135e3565b61636081156109d557506163b05b60006102708261640081106109fa57634e487b7160e01b600052603260045260246000fd5b01546201000090046001600160a01b031614610a285760405162461bcd60e51b8152600401610876906136b7565b805b610a35826050613add565b811015610b4f576040518060400160405280610a526166706120d7565b61ffff1681526101f6546001600160a01b0316602090910152610270826164008110610a8e57634e487b7160e01b600052603260045260246000fd5b8251910180546020909301516001600160a01b0316620100000262010000600160b01b031961ffff90931661ffff199094169390931791909116919091179055610ada616670826120db565b506101f6546001600160a01b0316600090815261667260205260409020610b0190826120db565b506101f65460405182916001600160a01b0316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480610b4781613beb565b915050610a2a565b505050565b6000610b616166706120d7565b905090565b80610b7361667082612065565b610b8f5760405162461bcd60e51b815260040161087690613836565b6000610b9a82610f42565b9050336001600160a01b0382161480610bca5750600082815261667360205260409020546001600160a01b031633145b80610bf957506001600160a01b03811660009081526166746020908152604080832033845290915290205460ff165b610c155760405162461bcd60e51b8152600401610876906138e2565b610c20858585612125565b5050505050565b6000610c32836110a8565b8210610c505760405162461bcd60e51b81526004016108769061350f565b6001600160a01b038316600090815261667260205260409020610c73908361221c565b90505b92915050565b6101f6546001600160a01b03163314610ca75760405162461bcd60e51b8152600401610876906135e3565b60005b8281101561090057838382818110610cd257634e487b7160e01b600052603260045260246000fd5b9050602002013560668284610ce79190613add565b6101908110610d0657634e487b7160e01b600052603260045260246000fd5b015580610d1281613beb565b915050610caa565b6101f6546001600160a01b03163314610d455760405162461bcd60e51b8152600401610876906135e3565b6101f6546014600160b01b90910460ff161015610d745760405162461bcd60e51b815260040161087690613879565b6101f6805460ff60a81b19169055565b610b4f8383836040518060200160405280600081525061173d565b60006107ed6166708361221c565b6101f6546001600160a01b03163314610dd85760405162461bcd60e51b8152600401610876906135e3565b6101f6546040516370a0823160e01b815282916001600160a01b038084169263a9059cbb929091169083906370a0823190610e1790309060040161340c565b60206040518083038186803b158015610e2f57600080fd5b505afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906132cd565b6040518363ffffffff1660e01b8152600401610e84929190613420565b602060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f91906131c6565b6101f6546001600160a01b03163314610f015760405162461bcd60e51b8152600401610876906135e3565b6101f654600160a01b900460ff1615610f2c5760405162461bcd60e51b81526004016108769061375a565b6101f6805460ff60a01b1916600160a01b179055565b6000610270826164008110610f6757634e487b7160e01b600052603260045260246000fd5b01546201000090046001600160a01b031692915050565b600080610f8d61010084613b16565b90506000610f9d61010085613c26565b9050610faa8160ff613b73565b6101f88360648110610fcc57634e487b7160e01b600052603260045260246000fd5b0154901c60011615949350505050565b6101f6546001600160a01b031633146110075760405162461bcd60e51b8152600401610876906135e3565b6101f6805460ff60a01b19169055565b6101f6546001600160a01b031633146110425760405162461bcd60e51b8152600401610876906135e3565b6166755460ff161580156110595750616677548114155b801561107357506101f6546014600160b01b90910460ff16105b61108f5760405162461bcd60e51b8152600401610876906135ac565b616677554361667655616675805460ff19166001179055565b6001600160a01b0381166000908152616672602052604081206107ed906120d7565b6101f654600160a01b900460ff16156110f55760405162461bcd60e51b81526004016108769061375a565b6000805b838110156111885761113085858381811061112457634e487b7160e01b600052603260045260246000fd5b90506020020135610f7e565b15611146576101f7546111439083613add565b91505b61117685858381811061116957634e487b7160e01b600052603260045260246000fd5b9050602002013584612254565b8061118081613beb565b9150506110f9565b50804710156111a95760405162461bcd60e51b815260040161087690613610565b80156111ec576101f6546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156111ea573d6000803e3d6000fd5b505b47156109005760405133904780156108fc02916000818181858888f19350505050158015610c20573d6000803e3d6000fd5b60608161122d61667082612065565b6112495760405162461bcd60e51b81526004016108769061370e565b600061027084616400811061126e57634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526201000090046001600160a01b03166020820152905060006112a38561161b565b825190915060009061025c906112bc9061050090613af5565b61ffff16601481106112de57634e487b7160e01b600052603260045260246000fd5b0154111561140d5760008561025c61050085600001516112fe9190613af5565b61ffff166014811061132057634e487b7160e01b600052603260045260246000fd5b01546040516020016113339291906133fe565b6040516020818303038152906040528051906020012060001c90506000611359826126aa565b90506000611366836126f3565b9050600061137384612cdb565b6002546040516335d01c1d60e11b81529192506001600160a01b031690636ba0383a906113ac908c9087908a90879089906004016139c1565b60006040518083038186803b1580156113c457600080fd5b505afa1580156113d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611400919081019061325a565b975050505050505061149d565b6002546040516335d01c1d60e11b81526001600160a01b0390911690636ba0383a9061144490889060049086906000908301613987565b60006040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611498919081019061325a565b935050505b50919050565b6101f6546001600160a01b031633146114ce5760405162461bcd60e51b8152600401610876906135e3565b6101f755565b6101f654600160a01b900460ff16156114ff5760405162461bcd60e51b81526004016108769061375a565b61150882610f7e565b15611570576101f7544710156115305760405162461bcd60e51b815260040161087690613610565b6101f6546101f7546040516001600160a01b039092169181156108fc0291906000818181858888f1935050505015801561156e573d6000803e3d6000fd5b505b61157a8282612254565b47156115ac5760405133904780156108fc02916000818181858888f19350505050158015610b4f573d6000803e3d6000fd5b5050565b6040805180820190915260048152633c27e4e760e21b602082015290565b6101f6546001600160a01b031633146115f95760405162461bcd60e51b8152600401610876906135e3565b6115ac6101f8826064612e28565b6101f75481565b61161881336114d4565b50565b600080611629604084613b16565b90506000611638604085613c26565b90506000606683610190811061165e57634e487b7160e01b600052603260045260246000fd5b0154905061166d826004613b54565b6116789060fc613b73565b1c600f16949350505050565b6001600160a01b0382163314156116ad5760405162461bcd60e51b815260040161087690613680565b336000818152616674602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906117119085906134b4565b60405180910390a35050565b6101f654600160a81b900460ff1681565b6002546001600160a01b031681565b8161174a61667082612065565b6117665760405162461bcd60e51b815260040161087690613836565b600061177182610f42565b9050336001600160a01b03821614806117a15750600082815261667360205260409020546001600160a01b031633145b806117d057506001600160a01b03811660009081526166746020908152604080832033845290915290205460ff165b6117ec5760405162461bcd60e51b8152600401610876906138e2565b6117f7868686612125565b843b801561190757604051630a85bd0160e11b81526001600160a01b0387169063150b7a02906118319033908b908a908a90600401613477565b602060405180830381600087803b15801561184b57600080fd5b505af192505050801561187b575060408051601f3d908101601f1916820190925261187891810190613216565b60015b6118d5573d8080156118a9576040519150601f19603f3d011682016040523d82523d6000602084013e6118ae565b606091505b5080516118cd5760405162461bcd60e51b81526004016108769061355a565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146119055760405162461bcd60e51b81526004016108769061355a565b505b50505050505050565b600060606000606080600080600061027089616400811061194157634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526001600160a01b03620100009091048116602083015260025491925016636082e3a26119808b61161b565b6040518263ffffffff1660e01b815260040161199c9190613a00565b60006040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119f0919081019061325a565b945060009250611a026166708a612065565b15611b7457805160009061025c90611a1d9061050090613af5565b61ffff1660148110611a3f57634e487b7160e01b600052603260045260246000fd5b01541115611b64578861025c6105008360000151611a5d9190613af5565b61ffff1660148110611a7f57634e487b7160e01b600052603260045260246000fd5b0154604051602001611a929291906133fe565b60408051601f1981840301815291905280516020909101206002549092506003906001600160a01b0316632901237c611aca856126aa565b6040518263ffffffff1660e01b8152600401611ae69190613a00565b60006040518083038186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b3a919081019061325a565b611b4384612cdb565b87611b4d866126f3565b856020015197509750975097509750975050611bd2565b6002975080602001519250611b90565b611b7d89610f7e565b15611b8b5760009750611b90565b600197505b505060408051808201825260078152662ab735b737bbb760c91b602080830191909152825180840190935260018352603f60f81b908301529550600094509150835b919395979092949650565b6101f6546001600160a01b03163314611c085760405162461bcd60e51b8152600401610876906135e3565b6166755460ff168015611c1d57506166765443115b8015611c5157506166775481604051602001611c3991906133f5565b60405160208183030381529060405280519060200120145b611c6d5760405162461bcd60e51b81526004016108769061377a565b60ff6166765443611c7e9190613b73565b1015611d23576000816166765440604051602001611c9d9291906133fe565b6040516020818303038152906040528051906020012090508061025c6101f660169054906101000a900460ff1660ff1660148110611ceb57634e487b7160e01b600052603260045260246000fd5b01556101f68054600160b01b900460ff16906016611d0883613c06565b91906101000a81548160ff021916908360ff16021790555050505b50616675805460ff19169055565b6101f6546000908190611d5090600160b01b900460ff16610a00613b2a565b61ffff169050611d616166706120d7565b811115611d7257600091505061082e565b80611d7e6166706120d7565b611d889190613b73565b91505090565b606081611d9d61667082612065565b611db95760405162461bcd60e51b81526004016108769061370e565b6000610270846164008110611dde57634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526201000090046001600160a01b0316602082015290506000611e138561161b565b825190915060009061025c90611e2c9061050090613af5565b61ffff1660148110611e4e57634e487b7160e01b600052603260045260246000fd5b01541115611f1c5760008561025c6105008560000151611e6e9190613af5565b61ffff1660148110611e9057634e487b7160e01b600052603260045260246000fd5b0154604051602001611ea39291906133fe565b6040516020818303038152906040528051906020012060001c90506000611ec9826126aa565b90506000611ed6836126f3565b90506000611ee384612cdb565b600254604051630a85782160e01b81529192506001600160a01b031690630a857821906113ac908c9087908a90879089906004016139c1565b600254604051630a85782160e01b81526001600160a01b0390911690630a8578219061144490889060049086906000908301613987565b6101f6546001600160a01b031681565b6115ac8282336110ca565b610270816164008110611f8057600080fd5b015461ffff811691506201000090046001600160a01b031682565b6101f6546001600160a01b03163314611fc65760405162461bcd60e51b8152600401610876906135e3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526166746020908152604080832093909416825291909152205460ff1690565b6101f6546001600160a01b031633146120425760405162461bcd60e51b8152600401610876906135e3565b6101f680546001600160a01b0319166001600160a01b0392909216919091179055565b60009081526001919091016020526040902054151590565b6000818152616673602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a45050565b5490565b60006120e78383612065565b61211d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c76565b506000610c76565b6001600160a01b03821661214b5760405162461bcd60e51b81526004016108769061363c565b61215660008261207d565b6001600160a01b0383166000908152616672602052604090206121799082612d0b565b506001600160a01b03821660009081526166726020526040902061219d90826120db565b50816102708261640081106121c257634e487b7160e01b600052603260045260246000fd5b01805462010000600160b01b031916620100006001600160a01b0393841602179055604051829184811691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b600082600001828154811061224157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6101f654600160a81b900460ff1661227e5760405162461bcd60e51b8152600401610876906136df565b600154604051630869624160e31b81526001600160a01b0390911690633894ca5790829063434b1208906122b69087906004016133f5565b60206040518083038186803b1580156122ce57600080fd5b505afa1580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190613232565b6040518263ffffffff1660e01b815260040161232291906134bf565b60206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123729190612f0f565b6001600160a01b031673c3f733ca98e0dad0386979eb96fb1722a1a05e696001600160a01b0316146123b65760405162461bcd60e51b8152600401610876906134e7565b600080546040516331a9108f60e11b81526001600160a01b0390911690636352211e906123e79086906004016133f5565b60206040518083038186803b1580156123ff57600080fd5b505afa158015612413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124379190612f0f565b9050336001600160a01b03821614806124e0575060005460405163020604bf60e21b81526001600160a01b039091169063081812fc9061247b9086906004016133f5565b60206040518083038186803b15801561249357600080fd5b505afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612f0f565b6001600160a01b0316336001600160a01b0316145b80612568575060005460405163e985e9c560e01b81526001600160a01b039091169063e985e9c5906125189084903390600401613439565b60206040518083038186803b15801561253057600080fd5b505afa158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906131c6565b6125845760405162461bcd60e51b815260040161087690613933565b61259061667084612065565b156125ad5760405162461bcd60e51b81526004016108769061380e565b60405180604001604052806125c36166706120d7565b61ffff168152602001836001600160a01b03168152506102708461640081106125fc57634e487b7160e01b600052603260045260246000fd5b8251910180546020909301516001600160a01b0316620100000262010000600160b01b031961ffff90931661ffff199094169390931791909116919091179055612648616670846120db565b506001600160a01b03821660009081526166726020526040902061266c90846120db565b5060405183906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b6000600f821660028110156126c35760009150506107f0565b60058110156126d65760019150506107f0565b60098110156126e95760029150506107f0565b60039150506107f0565b60081c62ffffff1660606000612707612e66565b600f841691506008821015612851576040805180820190915260048082526302a3432960e51b6020830152908252821015612851576003826004811061275d57634e487b7160e01b600052603260045260246000fd5b01805461276990613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461279590613bb6565b80156127e25780601f106127b7576101008083540402835291602001916127e2565b820191906000526020600020905b8154815290600101906020018083116127c557829003601f168201915b50505050508160016009811061280857634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060018152602001600160fd1b8152508160026009811061284b57634e487b7160e01b600052603260045260246000fd5b60200201525b60048463ffffffff16901c93508360011663ffffffff166001141561298f57601f600185901c1691506007826020811061289b57634e487b7160e01b600052603260045260246000fd5b0180546128a790613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546128d390613bb6565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b50505050508160036009811061294657634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060018152602001600160fd1b8152508160046009811061298957634e487b7160e01b600052603260045260246000fd5b60200201525b60068463ffffffff16901c935083600f1663ffffffff169150600f821015612a8357602782600f81106129d257634e487b7160e01b600052603260045260246000fd5b0180546129de90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0a90613bb6565b8015612a575780601f10612a2c57610100808354040283529160200191612a57565b820191906000526020600020905b815481529060010190602001808311612a3a57829003601f168201915b505050505081600560098110612a7d57634e487b7160e01b600052603260045260246000fd5b60200201525b630fffffff60049490941c93841693601f16915060368260208110612ab857634e487b7160e01b600052603260045260246000fd5b018054612ac490613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612af090613bb6565b8015612b3d5780601f10612b1257610100808354040283529160200191612b3d565b820191906000526020600020905b815481529060010190602001808311612b2057829003601f168201915b505050505081600660098110612b6357634e487b7160e01b600052603260045260246000fd5b60200201526307ffffff60059490941c9384169360019081161415612c7d57604080518082019091526001808252600160fd1b602083015285901c600f169250816007602002015260568260108110612bcc57634e487b7160e01b600052603260045260246000fd5b018054612bd890613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0490613bb6565b8015612c515780601f10612c2657610100808354040283529160200191612c51565b820191906000526020600020905b815481529060010190602001808311612c3457829003601f168201915b505050505081600860098110612c7757634e487b7160e01b600052603260045260246000fd5b60200201525b80516020808301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01519651612cc39a9996979596949593949293919201613335565b60405160208183030381529060405292505050919050565b6000600f600483901c166003811015612cf85760059150506107f0565b60088110156126e95760049150506107f0565b60008181526001830160205260408120548015612e1e576000612d2f600183613b73565b8554909150600090612d4390600190613b73565b9050818114612dc4576000866000018281548110612d7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612da257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612de357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c76565b6000915050610c76565b8260648101928215612e56579160200282015b82811115612e56578235825591602001919060010190612e3b565b50612e62929150612e8e565b5090565b6040518061012001604052806009905b6060815260200190600190039081612e765790505090565b5b80821115612e625760008155600101612e8f565b60008083601f840112612eb4578182fd5b50813567ffffffffffffffff811115612ecb578182fd5b6020830191508360208083028501011115612ee557600080fd5b9250929050565b600060208284031215612efd578081fd5b8135612f0881613c7c565b9392505050565b600060208284031215612f20578081fd5b8151612f0881613c7c565b60008060408385031215612f3d578081fd5b8235612f4881613c7c565b91506020830135612f5881613c7c565b809150509250929050565b600080600060608486031215612f77578081fd5b8335612f8281613c7c565b92506020840135612f9281613c7c565b929592945050506040919091013590565b60008060008060808587031215612fb8578081fd5b8435612fc381613c7c565b93506020850135612fd381613c7c565b925060408501359150606085013567ffffffffffffffff811115612ff5578182fd5b8501601f81018713613005578182fd5b803561301861301382613ab5565b613a84565b81815288602083850101111561302c578384fd5b81602084016020830137908101602001929092525092959194509250565b6000806040838503121561305c578182fd5b823561306781613c7c565b91506020830135612f5881613c91565b60008060408385031215613089578182fd5b823561309481613c7c565b946020939093013593505050565b6000610c808083850312156130b5578182fd5b8381840111156130c3578182fd5b509092915050565b6000806000604084860312156130df578081fd5b833567ffffffffffffffff8111156130f5578182fd5b61310186828701612ea3565b909790965060209590950135949350505050565b60008060208385031215613127578182fd5b823567ffffffffffffffff81111561313d578283fd5b61314985828601612ea3565b90969095509350505050565b600080600060408486031215613169578081fd5b833567ffffffffffffffff81111561317f578182fd5b61318b86828701612ea3565b909450925050602084013561319f81613c7c565b809150509250925092565b6000602082840312156131bb578081fd5b8135612f0881613c91565b6000602082840312156131d7578081fd5b8151612f0881613c91565b6000602082840312156131f3578081fd5b5035919050565b60006020828403121561320b578081fd5b8135612f0881613c9f565b600060208284031215613227578081fd5b8151612f0881613c9f565b600060208284031215613243578081fd5b81516001600160d81b031981168114612f08578182fd5b60006020828403121561326b578081fd5b815167ffffffffffffffff811115613281578182fd5b8201601f81018413613291578182fd5b805161329f61301382613ab5565b8181528560208385010111156132b3578384fd5b6132c4826020830160208601613b8a565b95945050505050565b6000602082840312156132de578081fd5b5051919050565b600080604083850312156132f7578182fd5b823591506020830135612f5881613c7c565b60008151808452613321816020860160208601613b8a565b601f01601f19169290920160200192915050565b60008a51613347818460208f01613b8a565b8a516133598183860160208f01613b8a565b8a51918401019061336e818360208e01613b8a565b89516133808183850160208e01613b8a565b8951929091010190613396818360208c01613b8a565b87516133a88183850160208c01613b8a565b87519290910101906133be818360208a01613b8a565b85519101906133d1818360208901613b8a565b84516133e38183850160208901613b8a565b9101019b9a5050505050505050505050565b90815260200190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134aa90830184613309565b9695505050505050565b901515815260200190565b6001600160d81b031991909116815260200190565b600060208252610c736020830184613309565b6020808252600e908201526d139bdd081058d8db1a5b585d195960921b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527f5072657020436f6e646974696f6e73204e6f74204d6574000000000000000000604082015260600190565b60208082526013908201527227b7363c9021b7b73a3930b1ba1027bbb732b960691b604082015260600190565b602080825260129082015271496e73756666696369656e742056616c756560701b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252600e908201526d0416c7265616479205365742055760941b604082015260600190565b602080825260159082015274135a5b9d1a5b99c815da5b991bddc810db1bdcd959605a1b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260069082015265233937bd32b760d11b604082015260600190565b60208082526019908201527f52657665616c20436f6e646974696f6e73204e6f74204d657400000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252600e908201526d105b1c9958591e48135a5b9d195960921b604082015260600190565b60208082526023908201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60408201526235b2b760e91b606082015260800190565b6020808252600e908201526d52657665616c2050656e64696e6760901b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f4e6f7420414d43204f776e6572206f7220417070726f76656400000000000000604082015260600190565b61ffff9290921682526001600160a01b0316602082015260400190565b93845260ff9283166020850152908216604084015216606082015260a060808201819052600190820152603f60f81b60c082015260e00190565b600086825260ff8616602083015260ff8516604083015260ff8416606083015260a060808301526139f560a0830184613309565b979650505050505050565b60ff91909116815260200190565b600060ff8916825260e06020830152613a2a60e0830189613309565b60ff881660408401528281036060840152613a458188613309565b90508281036080840152613a598187613309565b6001600160a01b039590951660a0840152505063ffffffff9190911660c09091015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613aad57613aad613c66565b604052919050565b600067ffffffffffffffff821115613acf57613acf613c66565b50601f01601f191660200190565b60008219821115613af057613af0613c3a565b500190565b600061ffff80841680613b0a57613b0a613c50565b92169190910492915050565b600082613b2557613b25613c50565b500490565b600061ffff80831681851681830481118215151615613b4b57613b4b613c3a565b02949350505050565b6000816000190483118215151615613b6e57613b6e613c3a565b500290565b600082821015613b8557613b85613c3a565b500390565b60005b83811015613ba5578181015183820152602001613b8d565b838111156109005750506000910152565b600281046001821680613bca57607f821691505b6020821081141561149d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613bff57613bff613c3a565b5060010190565b600060ff821660ff811415613c1d57613c1d613c3a565b60010192915050565b600082613c3557613c35613c50565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461161857600080fd5b801515811461161857600080fd5b6001600160e01b03198116811461161857600080fdfea264697066735822122081e186b108a804cfc7b946734740a8a096f979c510e10f2759fe1fad1938b9b064736f6c63430008010033000000000000000000000000a48b5c37ecd555354ae27f85902298ff1add7e4b

Deployed Bytecode

0x6080604052600436106102675760003560e01c80638f742d1611610144578063b88d4fde116100b6578063ce606ee01161007a578063ce606ee0146106eb578063d47f030d14610700578063da6c928314610713578063e5187f4314610741578063e985e9c514610761578063f2fde38b1461078157610267565b8063b88d4fde14610643578063b93a89f714610663578063c2ca0ac514610696578063c2d2bccb146106b6578063c87b56dd146106cb57610267565b8063a035b1fe11610108578063a035b1fe146105a4578063a0712d68146105b9578063a1a4c27f146105cc578063a22cb465146105f9578063a350de0d14610619578063a5eb6ff21461062e57610267565b80638f742d161461051c57806391b7f5ed1461053c57806394bf804d1461055c57806395d89b411461056f5780639e288b1a1461058457610267565b806339d78e6b116101dd5780636352211e116101a15780636352211e1461047457806365cde733146104945780636a28f000146104b45780636fa14b54146104c957806370a08231146104e957806382db3fb61461050957610267565b806339d78e6b146103ea57806342842e0e146103ff5780634f6ccce71461041f5780635c4719951461043f57806362a5af3b1461045f57610267565b80630ce06b681161022f5780630ce06b681461032857806314152f711461034857806318160ddd1461036857806323b872dd1461038a5780632f745c59146103aa57806335a9cede146103ca57610267565b806301ffc9a71461026c578063054f7d9c146102a257806306fdde03146102b7578063081812fc146102d9578063095ea7b314610306575b600080fd5b34801561027857600080fd5b5061028c6102873660046131fa565b6107a1565b60405161029991906134b4565b60405180910390f35b3480156102ae57600080fd5b5061028c6107f5565b3480156102c357600080fd5b506102cc610806565b60405161029991906134d4565b3480156102e557600080fd5b506102f96102f43660046131e2565b610831565b604051610299919061340c565b34801561031257600080fd5b50610326610321366004613077565b61084d565b005b34801561033457600080fd5b50610326610343366004613077565b610906565b34801561035457600080fd5b506103266103633660046131aa565b61099c565b34801561037457600080fd5b5061037d610b54565b60405161029991906133f5565b34801561039657600080fd5b506103266103a5366004612f63565b610b66565b3480156103b657600080fd5b5061037d6103c5366004613077565b610c27565b3480156103d657600080fd5b506103266103e53660046130cb565b610c7c565b3480156103f657600080fd5b50610326610d1a565b34801561040b57600080fd5b5061032661041a366004612f63565b610d84565b34801561042b57600080fd5b5061037d61043a3660046131e2565b610d9f565b34801561044b57600080fd5b5061032661045a366004612eec565b610dad565b34801561046b57600080fd5b50610326610ed6565b34801561048057600080fd5b506102f961048f3660046131e2565b610f42565b3480156104a057600080fd5b5061028c6104af3660046131e2565b610f7e565b3480156104c057600080fd5b50610326610fdc565b3480156104d557600080fd5b506103266104e43660046131e2565b611017565b3480156104f557600080fd5b5061037d610504366004612eec565b6110a8565b610326610517366004613155565b6110ca565b34801561052857600080fd5b506102cc6105373660046131e2565b61121e565b34801561054857600080fd5b506103266105573660046131e2565b6114a3565b61032661056a3660046132e5565b6114d4565b34801561057b57600080fd5b506102cc6115b0565b34801561059057600080fd5b5061032661059f3660046130a2565b6115ce565b3480156105b057600080fd5b5061037d611607565b6103266105c73660046131e2565b61160e565b3480156105d857600080fd5b506105ec6105e73660046131e2565b61161b565b6040516102999190613a00565b34801561060557600080fd5b5061032661061436600461304a565b611684565b34801561062557600080fd5b5061028c61171d565b34801561063a57600080fd5b506102f961172e565b34801561064f57600080fd5b5061032661065e366004612fa3565b61173d565b34801561066f57600080fd5b5061068361067e3660046131e2565b611910565b6040516102999796959493929190613a0e565b3480156106a257600080fd5b506103266106b13660046131e2565b611bdd565b3480156106c257600080fd5b5061037d611d31565b3480156106d757600080fd5b506102cc6106e63660046131e2565b611d8e565b3480156106f757600080fd5b506102f9611f53565b61032661070e366004613115565b611f63565b34801561071f57600080fd5b5061073361072e3660046131e2565b611f6e565b60405161029992919061396a565b34801561074d57600080fd5b5061032661075c366004612eec565b611f9b565b34801561076d57600080fd5b5061028c61077c366004612f2b565b611fe8565b34801561078d57600080fd5b5061032661079c366004612eec565b612017565b60006001600160e01b031982166380ac58cd60e01b14806107d257506001600160e01b03198216635b5e139f60e01b145b806107ed57506001600160e01b0319821663780e9d6360e01b145b90505b919050565b6101f654600160a01b900460ff1681565b60408051808201909152601081526f135bdbdb90d85d131bdbdd1c1c9a5b9d60821b60208201525b90565b600090815261667360205260409020546001600160a01b031690565b8061085a61667082612065565b61087f5760405162461bcd60e51b81526004016108769061370e565b60405180910390fd5b600061088a83610f42565b9050806001600160a01b0316846001600160a01b031614156108be5760405162461bcd60e51b8152600401610876906138a1565b336001600160a01b03821614806108da57506108da8133611fe8565b6108f65760405162461bcd60e51b8152600401610876906137b1565b610900848461207d565b50505050565b6101f6546001600160a01b031633146109315760405162461bcd60e51b8152600401610876906135e3565b6101f654604051632142170760e11b81526001600160a01b03808516926342842e0e9261096692309216908690600401613453565b600060405180830381600087803b15801561098057600080fd5b505af1158015610994573d6000803e3d6000fd5b505050505050565b6101f6546001600160a01b031633146109c75760405162461bcd60e51b8152600401610876906135e3565b61636081156109d557506163b05b60006102708261640081106109fa57634e487b7160e01b600052603260045260246000fd5b01546201000090046001600160a01b031614610a285760405162461bcd60e51b8152600401610876906136b7565b805b610a35826050613add565b811015610b4f576040518060400160405280610a526166706120d7565b61ffff1681526101f6546001600160a01b0316602090910152610270826164008110610a8e57634e487b7160e01b600052603260045260246000fd5b8251910180546020909301516001600160a01b0316620100000262010000600160b01b031961ffff90931661ffff199094169390931791909116919091179055610ada616670826120db565b506101f6546001600160a01b0316600090815261667260205260409020610b0190826120db565b506101f65460405182916001600160a01b0316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480610b4781613beb565b915050610a2a565b505050565b6000610b616166706120d7565b905090565b80610b7361667082612065565b610b8f5760405162461bcd60e51b815260040161087690613836565b6000610b9a82610f42565b9050336001600160a01b0382161480610bca5750600082815261667360205260409020546001600160a01b031633145b80610bf957506001600160a01b03811660009081526166746020908152604080832033845290915290205460ff165b610c155760405162461bcd60e51b8152600401610876906138e2565b610c20858585612125565b5050505050565b6000610c32836110a8565b8210610c505760405162461bcd60e51b81526004016108769061350f565b6001600160a01b038316600090815261667260205260409020610c73908361221c565b90505b92915050565b6101f6546001600160a01b03163314610ca75760405162461bcd60e51b8152600401610876906135e3565b60005b8281101561090057838382818110610cd257634e487b7160e01b600052603260045260246000fd5b9050602002013560668284610ce79190613add565b6101908110610d0657634e487b7160e01b600052603260045260246000fd5b015580610d1281613beb565b915050610caa565b6101f6546001600160a01b03163314610d455760405162461bcd60e51b8152600401610876906135e3565b6101f6546014600160b01b90910460ff161015610d745760405162461bcd60e51b815260040161087690613879565b6101f6805460ff60a81b19169055565b610b4f8383836040518060200160405280600081525061173d565b60006107ed6166708361221c565b6101f6546001600160a01b03163314610dd85760405162461bcd60e51b8152600401610876906135e3565b6101f6546040516370a0823160e01b815282916001600160a01b038084169263a9059cbb929091169083906370a0823190610e1790309060040161340c565b60206040518083038186803b158015610e2f57600080fd5b505afa158015610e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6791906132cd565b6040518363ffffffff1660e01b8152600401610e84929190613420565b602060405180830381600087803b158015610e9e57600080fd5b505af1158015610eb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4f91906131c6565b6101f6546001600160a01b03163314610f015760405162461bcd60e51b8152600401610876906135e3565b6101f654600160a01b900460ff1615610f2c5760405162461bcd60e51b81526004016108769061375a565b6101f6805460ff60a01b1916600160a01b179055565b6000610270826164008110610f6757634e487b7160e01b600052603260045260246000fd5b01546201000090046001600160a01b031692915050565b600080610f8d61010084613b16565b90506000610f9d61010085613c26565b9050610faa8160ff613b73565b6101f88360648110610fcc57634e487b7160e01b600052603260045260246000fd5b0154901c60011615949350505050565b6101f6546001600160a01b031633146110075760405162461bcd60e51b8152600401610876906135e3565b6101f6805460ff60a01b19169055565b6101f6546001600160a01b031633146110425760405162461bcd60e51b8152600401610876906135e3565b6166755460ff161580156110595750616677548114155b801561107357506101f6546014600160b01b90910460ff16105b61108f5760405162461bcd60e51b8152600401610876906135ac565b616677554361667655616675805460ff19166001179055565b6001600160a01b0381166000908152616672602052604081206107ed906120d7565b6101f654600160a01b900460ff16156110f55760405162461bcd60e51b81526004016108769061375a565b6000805b838110156111885761113085858381811061112457634e487b7160e01b600052603260045260246000fd5b90506020020135610f7e565b15611146576101f7546111439083613add565b91505b61117685858381811061116957634e487b7160e01b600052603260045260246000fd5b9050602002013584612254565b8061118081613beb565b9150506110f9565b50804710156111a95760405162461bcd60e51b815260040161087690613610565b80156111ec576101f6546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156111ea573d6000803e3d6000fd5b505b47156109005760405133904780156108fc02916000818181858888f19350505050158015610c20573d6000803e3d6000fd5b60608161122d61667082612065565b6112495760405162461bcd60e51b81526004016108769061370e565b600061027084616400811061126e57634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526201000090046001600160a01b03166020820152905060006112a38561161b565b825190915060009061025c906112bc9061050090613af5565b61ffff16601481106112de57634e487b7160e01b600052603260045260246000fd5b0154111561140d5760008561025c61050085600001516112fe9190613af5565b61ffff166014811061132057634e487b7160e01b600052603260045260246000fd5b01546040516020016113339291906133fe565b6040516020818303038152906040528051906020012060001c90506000611359826126aa565b90506000611366836126f3565b9050600061137384612cdb565b6002546040516335d01c1d60e11b81529192506001600160a01b031690636ba0383a906113ac908c9087908a90879089906004016139c1565b60006040518083038186803b1580156113c457600080fd5b505afa1580156113d8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611400919081019061325a565b975050505050505061149d565b6002546040516335d01c1d60e11b81526001600160a01b0390911690636ba0383a9061144490889060049086906000908301613987565b60006040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611498919081019061325a565b935050505b50919050565b6101f6546001600160a01b031633146114ce5760405162461bcd60e51b8152600401610876906135e3565b6101f755565b6101f654600160a01b900460ff16156114ff5760405162461bcd60e51b81526004016108769061375a565b61150882610f7e565b15611570576101f7544710156115305760405162461bcd60e51b815260040161087690613610565b6101f6546101f7546040516001600160a01b039092169181156108fc0291906000818181858888f1935050505015801561156e573d6000803e3d6000fd5b505b61157a8282612254565b47156115ac5760405133904780156108fc02916000818181858888f19350505050158015610b4f573d6000803e3d6000fd5b5050565b6040805180820190915260048152633c27e4e760e21b602082015290565b6101f6546001600160a01b031633146115f95760405162461bcd60e51b8152600401610876906135e3565b6115ac6101f8826064612e28565b6101f75481565b61161881336114d4565b50565b600080611629604084613b16565b90506000611638604085613c26565b90506000606683610190811061165e57634e487b7160e01b600052603260045260246000fd5b0154905061166d826004613b54565b6116789060fc613b73565b1c600f16949350505050565b6001600160a01b0382163314156116ad5760405162461bcd60e51b815260040161087690613680565b336000818152616674602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906117119085906134b4565b60405180910390a35050565b6101f654600160a81b900460ff1681565b6002546001600160a01b031681565b8161174a61667082612065565b6117665760405162461bcd60e51b815260040161087690613836565b600061177182610f42565b9050336001600160a01b03821614806117a15750600082815261667360205260409020546001600160a01b031633145b806117d057506001600160a01b03811660009081526166746020908152604080832033845290915290205460ff165b6117ec5760405162461bcd60e51b8152600401610876906138e2565b6117f7868686612125565b843b801561190757604051630a85bd0160e11b81526001600160a01b0387169063150b7a02906118319033908b908a908a90600401613477565b602060405180830381600087803b15801561184b57600080fd5b505af192505050801561187b575060408051601f3d908101601f1916820190925261187891810190613216565b60015b6118d5573d8080156118a9576040519150601f19603f3d011682016040523d82523d6000602084013e6118ae565b606091505b5080516118cd5760405162461bcd60e51b81526004016108769061355a565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146119055760405162461bcd60e51b81526004016108769061355a565b505b50505050505050565b600060606000606080600080600061027089616400811061194157634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526001600160a01b03620100009091048116602083015260025491925016636082e3a26119808b61161b565b6040518263ffffffff1660e01b815260040161199c9190613a00565b60006040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119f0919081019061325a565b945060009250611a026166708a612065565b15611b7457805160009061025c90611a1d9061050090613af5565b61ffff1660148110611a3f57634e487b7160e01b600052603260045260246000fd5b01541115611b64578861025c6105008360000151611a5d9190613af5565b61ffff1660148110611a7f57634e487b7160e01b600052603260045260246000fd5b0154604051602001611a929291906133fe565b60408051601f1981840301815291905280516020909101206002549092506003906001600160a01b0316632901237c611aca856126aa565b6040518263ffffffff1660e01b8152600401611ae69190613a00565b60006040518083038186803b158015611afe57600080fd5b505afa158015611b12573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b3a919081019061325a565b611b4384612cdb565b87611b4d866126f3565b856020015197509750975097509750975050611bd2565b6002975080602001519250611b90565b611b7d89610f7e565b15611b8b5760009750611b90565b600197505b505060408051808201825260078152662ab735b737bbb760c91b602080830191909152825180840190935260018352603f60f81b908301529550600094509150835b919395979092949650565b6101f6546001600160a01b03163314611c085760405162461bcd60e51b8152600401610876906135e3565b6166755460ff168015611c1d57506166765443115b8015611c5157506166775481604051602001611c3991906133f5565b60405160208183030381529060405280519060200120145b611c6d5760405162461bcd60e51b81526004016108769061377a565b60ff6166765443611c7e9190613b73565b1015611d23576000816166765440604051602001611c9d9291906133fe565b6040516020818303038152906040528051906020012090508061025c6101f660169054906101000a900460ff1660ff1660148110611ceb57634e487b7160e01b600052603260045260246000fd5b01556101f68054600160b01b900460ff16906016611d0883613c06565b91906101000a81548160ff021916908360ff16021790555050505b50616675805460ff19169055565b6101f6546000908190611d5090600160b01b900460ff16610a00613b2a565b61ffff169050611d616166706120d7565b811115611d7257600091505061082e565b80611d7e6166706120d7565b611d889190613b73565b91505090565b606081611d9d61667082612065565b611db95760405162461bcd60e51b81526004016108769061370e565b6000610270846164008110611dde57634e487b7160e01b600052603260045260246000fd5b6040805180820190915291015461ffff811682526201000090046001600160a01b0316602082015290506000611e138561161b565b825190915060009061025c90611e2c9061050090613af5565b61ffff1660148110611e4e57634e487b7160e01b600052603260045260246000fd5b01541115611f1c5760008561025c6105008560000151611e6e9190613af5565b61ffff1660148110611e9057634e487b7160e01b600052603260045260246000fd5b0154604051602001611ea39291906133fe565b6040516020818303038152906040528051906020012060001c90506000611ec9826126aa565b90506000611ed6836126f3565b90506000611ee384612cdb565b600254604051630a85782160e01b81529192506001600160a01b031690630a857821906113ac908c9087908a90879089906004016139c1565b600254604051630a85782160e01b81526001600160a01b0390911690630a8578219061144490889060049086906000908301613987565b6101f6546001600160a01b031681565b6115ac8282336110ca565b610270816164008110611f8057600080fd5b015461ffff811691506201000090046001600160a01b031682565b6101f6546001600160a01b03163314611fc65760405162461bcd60e51b8152600401610876906135e3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0391821660009081526166746020908152604080832093909416825291909152205460ff1690565b6101f6546001600160a01b031633146120425760405162461bcd60e51b8152600401610876906135e3565b6101f680546001600160a01b0319166001600160a01b0392909216919091179055565b60009081526001919091016020526040902054151590565b6000818152616673602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a45050565b5490565b60006120e78383612065565b61211d57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c76565b506000610c76565b6001600160a01b03821661214b5760405162461bcd60e51b81526004016108769061363c565b61215660008261207d565b6001600160a01b0383166000908152616672602052604090206121799082612d0b565b506001600160a01b03821660009081526166726020526040902061219d90826120db565b50816102708261640081106121c257634e487b7160e01b600052603260045260246000fd5b01805462010000600160b01b031916620100006001600160a01b0393841602179055604051829184811691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b600082600001828154811061224157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6101f654600160a81b900460ff1661227e5760405162461bcd60e51b8152600401610876906136df565b600154604051630869624160e31b81526001600160a01b0390911690633894ca5790829063434b1208906122b69087906004016133f5565b60206040518083038186803b1580156122ce57600080fd5b505afa1580156122e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123069190613232565b6040518263ffffffff1660e01b815260040161232291906134bf565b60206040518083038186803b15801561233a57600080fd5b505afa15801561234e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123729190612f0f565b6001600160a01b031673c3f733ca98e0dad0386979eb96fb1722a1a05e696001600160a01b0316146123b65760405162461bcd60e51b8152600401610876906134e7565b600080546040516331a9108f60e11b81526001600160a01b0390911690636352211e906123e79086906004016133f5565b60206040518083038186803b1580156123ff57600080fd5b505afa158015612413573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124379190612f0f565b9050336001600160a01b03821614806124e0575060005460405163020604bf60e21b81526001600160a01b039091169063081812fc9061247b9086906004016133f5565b60206040518083038186803b15801561249357600080fd5b505afa1580156124a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124cb9190612f0f565b6001600160a01b0316336001600160a01b0316145b80612568575060005460405163e985e9c560e01b81526001600160a01b039091169063e985e9c5906125189084903390600401613439565b60206040518083038186803b15801561253057600080fd5b505afa158015612544573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256891906131c6565b6125845760405162461bcd60e51b815260040161087690613933565b61259061667084612065565b156125ad5760405162461bcd60e51b81526004016108769061380e565b60405180604001604052806125c36166706120d7565b61ffff168152602001836001600160a01b03168152506102708461640081106125fc57634e487b7160e01b600052603260045260246000fd5b8251910180546020909301516001600160a01b0316620100000262010000600160b01b031961ffff90931661ffff199094169390931791909116919091179055612648616670846120db565b506001600160a01b03821660009081526166726020526040902061266c90846120db565b5060405183906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4505050565b6000600f821660028110156126c35760009150506107f0565b60058110156126d65760019150506107f0565b60098110156126e95760029150506107f0565b60039150506107f0565b60081c62ffffff1660606000612707612e66565b600f841691506008821015612851576040805180820190915260048082526302a3432960e51b6020830152908252821015612851576003826004811061275d57634e487b7160e01b600052603260045260246000fd5b01805461276990613bb6565b80601f016020809104026020016040519081016040528092919081815260200182805461279590613bb6565b80156127e25780601f106127b7576101008083540402835291602001916127e2565b820191906000526020600020905b8154815290600101906020018083116127c557829003601f168201915b50505050508160016009811061280857634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060018152602001600160fd1b8152508160026009811061284b57634e487b7160e01b600052603260045260246000fd5b60200201525b60048463ffffffff16901c93508360011663ffffffff166001141561298f57601f600185901c1691506007826020811061289b57634e487b7160e01b600052603260045260246000fd5b0180546128a790613bb6565b80601f01602080910402602001604051908101604052809291908181526020018280546128d390613bb6565b80156129205780601f106128f557610100808354040283529160200191612920565b820191906000526020600020905b81548152906001019060200180831161290357829003601f168201915b50505050508160036009811061294657634e487b7160e01b600052603260045260246000fd5b6020020181905250604051806040016040528060018152602001600160fd1b8152508160046009811061298957634e487b7160e01b600052603260045260246000fd5b60200201525b60068463ffffffff16901c935083600f1663ffffffff169150600f821015612a8357602782600f81106129d257634e487b7160e01b600052603260045260246000fd5b0180546129de90613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0a90613bb6565b8015612a575780601f10612a2c57610100808354040283529160200191612a57565b820191906000526020600020905b815481529060010190602001808311612a3a57829003601f168201915b505050505081600560098110612a7d57634e487b7160e01b600052603260045260246000fd5b60200201525b630fffffff60049490941c93841693601f16915060368260208110612ab857634e487b7160e01b600052603260045260246000fd5b018054612ac490613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612af090613bb6565b8015612b3d5780601f10612b1257610100808354040283529160200191612b3d565b820191906000526020600020905b815481529060010190602001808311612b2057829003601f168201915b505050505081600660098110612b6357634e487b7160e01b600052603260045260246000fd5b60200201526307ffffff60059490941c9384169360019081161415612c7d57604080518082019091526001808252600160fd1b602083015285901c600f169250816007602002015260568260108110612bcc57634e487b7160e01b600052603260045260246000fd5b018054612bd890613bb6565b80601f0160208091040260200160405190810160405280929190818152602001828054612c0490613bb6565b8015612c515780601f10612c2657610100808354040283529160200191612c51565b820191906000526020600020905b815481529060010190602001808311612c3457829003601f168201915b505050505081600860098110612c7757634e487b7160e01b600052603260045260246000fd5b60200201525b80516020808301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01519651612cc39a9996979596949593949293919201613335565b60405160208183030381529060405292505050919050565b6000600f600483901c166003811015612cf85760059150506107f0565b60088110156126e95760049150506107f0565b60008181526001830160205260408120548015612e1e576000612d2f600183613b73565b8554909150600090612d4390600190613b73565b9050818114612dc4576000866000018281548110612d7157634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612da257634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612de357634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610c76565b6000915050610c76565b8260648101928215612e56579160200282015b82811115612e56578235825591602001919060010190612e3b565b50612e62929150612e8e565b5090565b6040518061012001604052806009905b6060815260200190600190039081612e765790505090565b5b80821115612e625760008155600101612e8f565b60008083601f840112612eb4578182fd5b50813567ffffffffffffffff811115612ecb578182fd5b6020830191508360208083028501011115612ee557600080fd5b9250929050565b600060208284031215612efd578081fd5b8135612f0881613c7c565b9392505050565b600060208284031215612f20578081fd5b8151612f0881613c7c565b60008060408385031215612f3d578081fd5b8235612f4881613c7c565b91506020830135612f5881613c7c565b809150509250929050565b600080600060608486031215612f77578081fd5b8335612f8281613c7c565b92506020840135612f9281613c7c565b929592945050506040919091013590565b60008060008060808587031215612fb8578081fd5b8435612fc381613c7c565b93506020850135612fd381613c7c565b925060408501359150606085013567ffffffffffffffff811115612ff5578182fd5b8501601f81018713613005578182fd5b803561301861301382613ab5565b613a84565b81815288602083850101111561302c578384fd5b81602084016020830137908101602001929092525092959194509250565b6000806040838503121561305c578182fd5b823561306781613c7c565b91506020830135612f5881613c91565b60008060408385031215613089578182fd5b823561309481613c7c565b946020939093013593505050565b6000610c808083850312156130b5578182fd5b8381840111156130c3578182fd5b509092915050565b6000806000604084860312156130df578081fd5b833567ffffffffffffffff8111156130f5578182fd5b61310186828701612ea3565b909790965060209590950135949350505050565b60008060208385031215613127578182fd5b823567ffffffffffffffff81111561313d578283fd5b61314985828601612ea3565b90969095509350505050565b600080600060408486031215613169578081fd5b833567ffffffffffffffff81111561317f578182fd5b61318b86828701612ea3565b909450925050602084013561319f81613c7c565b809150509250925092565b6000602082840312156131bb578081fd5b8135612f0881613c91565b6000602082840312156131d7578081fd5b8151612f0881613c91565b6000602082840312156131f3578081fd5b5035919050565b60006020828403121561320b578081fd5b8135612f0881613c9f565b600060208284031215613227578081fd5b8151612f0881613c9f565b600060208284031215613243578081fd5b81516001600160d81b031981168114612f08578182fd5b60006020828403121561326b578081fd5b815167ffffffffffffffff811115613281578182fd5b8201601f81018413613291578182fd5b805161329f61301382613ab5565b8181528560208385010111156132b3578384fd5b6132c4826020830160208601613b8a565b95945050505050565b6000602082840312156132de578081fd5b5051919050565b600080604083850312156132f7578182fd5b823591506020830135612f5881613c7c565b60008151808452613321816020860160208601613b8a565b601f01601f19169290920160200192915050565b60008a51613347818460208f01613b8a565b8a516133598183860160208f01613b8a565b8a51918401019061336e818360208e01613b8a565b89516133808183850160208e01613b8a565b8951929091010190613396818360208c01613b8a565b87516133a88183850160208c01613b8a565b87519290910101906133be818360208a01613b8a565b85519101906133d1818360208901613b8a565b84516133e38183850160208901613b8a565b9101019b9a5050505050505050505050565b90815260200190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906134aa90830184613309565b9695505050505050565b901515815260200190565b6001600160d81b031991909116815260200190565b600060208252610c736020830184613309565b6020808252600e908201526d139bdd081058d8db1a5b585d195960921b604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527f5072657020436f6e646974696f6e73204e6f74204d6574000000000000000000604082015260600190565b60208082526013908201527227b7363c9021b7b73a3930b1ba1027bbb732b960691b604082015260600190565b602080825260129082015271496e73756666696369656e742056616c756560701b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252600e908201526d0416c7265616479205365742055760941b604082015260600190565b602080825260159082015274135a5b9d1a5b99c815da5b991bddc810db1bdcd959605a1b604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b602080825260069082015265233937bd32b760d11b604082015260600190565b60208082526019908201527f52657665616c20436f6e646974696f6e73204e6f74204d657400000000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252600e908201526d105b1c9958591e48135a5b9d195960921b604082015260600190565b60208082526023908201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60408201526235b2b760e91b606082015260800190565b6020808252600e908201526d52657665616c2050656e64696e6760901b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526019908201527f4e6f7420414d43204f776e6572206f7220417070726f76656400000000000000604082015260600190565b61ffff9290921682526001600160a01b0316602082015260400190565b93845260ff9283166020850152908216604084015216606082015260a060808201819052600190820152603f60f81b60c082015260e00190565b600086825260ff8616602083015260ff8516604083015260ff8416606083015260a060808301526139f560a0830184613309565b979650505050505050565b60ff91909116815260200190565b600060ff8916825260e06020830152613a2a60e0830189613309565b60ff881660408401528281036060840152613a458188613309565b90508281036080840152613a598187613309565b6001600160a01b039590951660a0840152505063ffffffff9190911660c09091015295945050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715613aad57613aad613c66565b604052919050565b600067ffffffffffffffff821115613acf57613acf613c66565b50601f01601f191660200190565b60008219821115613af057613af0613c3a565b500190565b600061ffff80841680613b0a57613b0a613c50565b92169190910492915050565b600082613b2557613b25613c50565b500490565b600061ffff80831681851681830481118215151615613b4b57613b4b613c3a565b02949350505050565b6000816000190483118215151615613b6e57613b6e613c3a565b500290565b600082821015613b8557613b85613c3a565b500390565b60005b83811015613ba5578181015183820152602001613b8d565b838111156109005750506000910152565b600281046001821680613bca57607f821691505b6020821081141561149d57634e487b7160e01b600052602260045260246000fd5b6000600019821415613bff57613bff613c3a565b5060010190565b600060ff821660ff811415613c1d57613c1d613c3a565b60010192915050565b600082613c3557613c35613c50565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461161857600080fd5b801515811461161857600080fd5b6001600160e01b03198116811461161857600080fdfea264697066735822122081e186b108a804cfc7b946734740a8a096f979c510e10f2759fe1fad1938b9b064736f6c63430008010033

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

000000000000000000000000a48b5c37ecd555354ae27f85902298ff1add7e4b

-----Decoded View---------------
Arg [0] : metadataContract (address): 0xa48b5c37eCd555354aE27F85902298Ff1aDD7e4B

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


Deployed Bytecode Sourcemap

6188:22836:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6292:308;;;;;;;;;;-1:-1:-1;6292:308:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9502:25;;;;;;;;;;;;;:::i;26615:105::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12455:143::-;;;;;;;;;;-1:-1:-1;12455:143:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12053:394::-;;;;;;;;;;-1:-1:-1;12053:394:0;;;;;:::i;:::-;;:::i;:::-;;28795:224;;;;;;;;;;-1:-1:-1;28795:224:0;;;;;:::i;:::-;;:::i;20182:574::-;;;;;;;;;;-1:-1:-1;20182:574:0;;;;;:::i;:::-;;:::i;11636:115::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;14193:174::-;;;;;;;;;;-1:-1:-1;14193:174:0;;;;;:::i;:::-;;:::i;14545:249::-;;;;;;;;;;-1:-1:-1;14545:249:0;;;;;:::i;:::-;;:::i;21122:207::-;;;;;;;;;;-1:-1:-1;21122:207:0;;;;;:::i;:::-;;:::i;22478:165::-;;;;;;;;;;;;;:::i;14034:151::-;;;;;;;;;;-1:-1:-1;14034:151:0;;;;;:::i;:::-;;:::i;14407:130::-;;;;;;;;;;-1:-1:-1;14407:130:0;;;;;:::i;:::-;;:::i;28475:228::-;;;;;;;;;;-1:-1:-1;28475:228:0;;;;;:::i;:::-;;:::i;22068:86::-;;;;;;;;;;;;;:::i;11907:138::-;;;;;;;;;;-1:-1:-1;11907:138:0;;;;;:::i;:::-;;:::i;16556:247::-;;;;;;;;;;-1:-1:-1;16556:247:0;;;;;:::i;:::-;;:::i;22220:79::-;;;;;;;;;;;;;:::i;15424:290::-;;;;;;;;;;-1:-1:-1;15424:290:0;;;;;:::i;:::-;;:::i;11759:140::-;;;;;;;;;;-1:-1:-1;11759:140:0;;;;;:::i;:::-;;:::i;18727:705::-;;;;;;:::i;:::-;;:::i;27605:752::-;;;;;;;;;;-1:-1:-1;27605:752:0;;;;;:::i;:::-;;:::i;21681:96::-;;;;;;;;;;-1:-1:-1;21681:96:0;;;;;:::i;:::-;;:::i;17941:477::-;;;;;;:::i;:::-;;:::i;26728:102::-;;;;;;;;;;;;;:::i;21448:133::-;;;;;;;;;;-1:-1:-1;21448:133:0;;;;;:::i;:::-;;:::i;9611:40::-;;;;;;;;;;;;;:::i;18525:98::-;;;;;;:::i;:::-;;:::i;22682:288::-;;;;;;;;;;-1:-1:-1;22682:288:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12606:278::-;;;;;;;;;;-1:-1:-1;12606:278:0;;;;;:::i;:::-;;:::i;9536:36::-;;;;;;;;;;;;;:::i;6820:42::-;;;;;;;;;;;;;:::i;13055:971::-;;;;;;;;;;-1:-1:-1;13055:971:0;;;;;:::i;:::-;;:::i;25298:1279::-;;;;;;;;;;-1:-1:-1;25298:1279:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;15862:562::-;;;;;;;;;;-1:-1:-1;15862:562:0;;;;;:::i;:::-;;:::i;14996:244::-;;;;;;;;;;;;;:::i;26838:759::-;;;;;;;;;;-1:-1:-1;26838:759:0;;;;;:::i;:::-;;:::i;9457:36::-;;;;;;;;;;;;;:::i;19552:127::-;;;;;;:::i;:::-;;:::i;9732:34::-;;;;;;;;;;-1:-1:-1;9732:34:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;20845:153::-;;;;;;;;;;-1:-1:-1;20845:153:0;;;;;:::i;:::-;;:::i;12892:155::-;;;;;;;;;;-1:-1:-1;12892:155:0;;;;;:::i;:::-;;:::i;21879:122::-;;;;;;;;;;-1:-1:-1;21879:122:0;;;;;:::i;:::-;;:::i;6292:308::-;6386:4;-1:-1:-1;;;;;;6411:40:0;;-1:-1:-1;;;6411:40:0;;:109;;-1:-1:-1;;;;;;;6472:48:0;;-1:-1:-1;;;6472:48:0;6411:109;:180;;;-1:-1:-1;;;;;;;6541:50:0;;-1:-1:-1;;;6541:50:0;6411:180;6403:189;;6292:308;;;;:::o;9502:25::-;;;-1:-1:-1;;;9502:25:0;;;;;:::o;26615:105::-;26687:25;;;;;;;;;;;;-1:-1:-1;;;26687:25:0;;;;26615:105;;:::o;12455:143::-;12527:16;12563:27;;;:14;:27;;;;;;-1:-1:-1;;;;;12563:27:0;;12455:143::o;12053:394::-;12135:11;10379:40;:18;12135:11;10379:27;:40::i;:::-;10371:97;;;;-1:-1:-1;;;10371:97:0;;;;;;;:::i;:::-;;;;;;;;;12159:13:::1;12175:20;12183:11;12175:7;:20::i;:::-;12159:36;;12220:5;-1:-1:-1::0;;;;;12214:11:0::1;:2;-1:-1:-1::0;;;;;12214:11:0::1;;;12206:57;;;;-1:-1:-1::0;;;12206:57:0::1;;;;;;;:::i;:::-;12282:10;-1:-1:-1::0;;;;;12282:19:0;::::1;;::::0;:58:::1;;;12305:35;12322:5;12329:10;12305:16;:35::i;:::-;12274:127;;;;-1:-1:-1::0;;;12274:127:0::1;;;;;;;:::i;:::-;12412:27;12423:2;12427:11;12412:10;:27::i;:::-;10479:1;12053:394:::0;;;:::o;28795:224::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;28984:13:::1;::::0;28929:82:::1;::::0;-1:-1:-1;;;28929:82:0;;-1:-1:-1;;;;;28929:39:0;;::::1;::::0;::::1;::::0;:82:::1;::::0;28977:4:::1;::::0;28984:13:::1;::::0;28999:11;;28929:82:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28795:224:::0;;:::o;20182:574::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;20275:5:::1;20291:60:::0;::::1;;;-1:-1:-1::0;20334:5:0::1;20291:60;20409:1;20369:10;20380::::0;20369:22:::1;::::0;::::1;;;-1:-1:-1::0;;;20369:22:0::1;;;;;;;;;;:28:::0;;;::::1;-1:-1:-1::0;;;;;20369:28:0::1;:42;20361:69;;;;-1:-1:-1::0;;;20361:69:0::1;;;;;;;:::i;:::-;20455:10:::0;20441:308:::1;20472:13;:10:::0;20483:2:::1;20472:13;:::i;:::-;20467:1;:19;20441:308;;;20524:61;;;;;;;;20541:27;:18;:25;:27::i;:::-;20524:61;;::::0;;20571:13:::1;::::0;-1:-1:-1;;;;;20571:13:0::1;20524:61;::::0;;::::1;::::0;20508:10:::1;20519:1:::0;20508:13:::1;::::0;::::1;;;-1:-1:-1::0;;;20508:13:0::1;;;;;;;;;:77:::0;;:13;::::1;:77:::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;;;20508:77:0::1;::::0;::::1;-1:-1:-1::0;;;;;;20508:77:0::1;::::0;;::::1;-1:-1:-1::0;;20508:77:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;20600:25:::1;:18;20623:1:::0;20600:22:::1;:25::i;:::-;-1:-1:-1::0;20658:13:0::1;::::0;-1:-1:-1;;;;;20658:13:0::1;20640:32;::::0;;;:17:::1;:32;::::0;;;;:39:::1;::::0;20677:1;20640:36:::1;:39::i;:::-;-1:-1:-1::0;20720:13:0::1;::::0;20699:38:::1;::::0;20735:1;;-1:-1:-1;;;;;20720:13:0::1;::::0;::::1;::::0;20699:38:::1;::::0;20720:13;;20699:38:::1;20488:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20441:308;;;;10296:1;20182:574:::0;:::o;11636:115::-;11689:7;11716:27;:18;:25;:27::i;:::-;11709:34;;11636:115;:::o;14193:174::-;14298:11;10565:40;:18;14298:11;10565:27;:40::i;:::-;10557:88;;;;-1:-1:-1;;;10557:88:0;;;;;;;:::i;:::-;10656:13;10672:20;10680:11;10672:7;:20::i;:::-;10656:36;-1:-1:-1;10711:10:0;-1:-1:-1;;;;;10711:19:0;;;;:64;;-1:-1:-1;10748:27:0;;;;:14;:27;;;;;;-1:-1:-1;;;;;10748:27:0;10734:10;:41;10711:64;:104;;;-1:-1:-1;;;;;;10779:24:0;;;;;;:17;:24;;;;;;;;10804:10;10779:36;;;;;;;;;;10711:104;10703:183;;;;-1:-1:-1;;;10703:183:0;;;;;;;:::i;:::-;14322:37:::1;14337:4;14343:2;14347:11;14322:14;:37::i;:::-;14193:174:::0;;;;;:::o;14545:249::-;14634:7;14670:16;14680:5;14670:9;:16::i;:::-;14662:5;:24;14654:80;;;;-1:-1:-1;;;14654:80:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14752:24:0;;;;;;:17;:24;;;;;:34;;14780:5;14752:27;:34::i;:::-;14745:41;;14545:249;;;;;:::o;21122:207::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;21226:6:::1;21221:101;21238:16:::0;;::::1;21221:101;;;21302:5;;21308:1;21302:8;;;;;-1:-1:-1::0;;;21302:8:0::1;;;;;;;;;;;;;;;21276:10;21297:1;21287:7;:11;;;;:::i;:::-;21276:23;;;;;-1:-1:-1::0;;;21276:23:0::1;;;;;;;;;;:34:::0;21256:3;::::1;::::0;::::1;:::i;:::-;;;;21221:101;;22478:165:::0;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;22563:11:::1;::::0;22578:2:::1;-1:-1:-1::0;;;22563:11:0;;::::1;;;:17;;22555:44;;;;-1:-1:-1::0;;;22555:44:0::1;;;;;;;:::i;:::-;22610:17;:25:::0;;-1:-1:-1;;;;22610:25:0::1;::::0;;22478:165::o;14034:151::-;14134:43;14151:4;14157:2;14161:11;14134:43;;;;;;;;;;;;:16;:43::i;14407:130::-;14474:7;14501:28;:18;14523:5;14501:21;:28::i;28475:228::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;28649:13:::1;::::0;28664:30:::1;::::0;-1:-1:-1;;;28664:30:0;;28609:13;;-1:-1:-1;;;;;28634:14:0;;::::1;::::0;::::1;::::0;28649:13;;::::1;::::0;28634:14;;28664:15:::1;::::0;:30:::1;::::0;28688:4:::1;::::0;28664:30:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28634:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22068:86::-:0;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;10956:6:::1;::::0;-1:-1:-1;;;10956:6:0;::::1;;;10955:7;10947:26;;;;-1:-1:-1::0;;;10947:26:0::1;;;;;;;:::i;:::-;22133:6:::2;:13:::0;;-1:-1:-1;;;;22133:13:0::2;-1:-1:-1::0;;;22133:13:0::2;::::0;;22068:86::o;11907:138::-;11975:13;12008:10;12019:11;12008:23;;;;;-1:-1:-1;;;12008:23:0;;;;;;;;;;:29;;;;-1:-1:-1;;;;;12008:29:0;;11907:138;-1:-1:-1;;11907:138:0:o;16556:247::-;16616:4;;16653:17;16667:3;16653:11;:17;:::i;:::-;16633:37;-1:-1:-1;16681:16:0;16700:17;16714:3;16700:11;:17;:::i;:::-;16681:36;-1:-1:-1;16769:14:0;16681:36;16769:3;:14;:::i;:::-;16741:12;16754:9;16741:23;;;;;-1:-1:-1;;;16741:23:0;;;;;;;;;;;:43;;16788:1;16736:53;16735:60;;16556:247;-1:-1:-1;;;;16556:247:0:o;22220:79::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;22277:6:::1;:14:::0;;-1:-1:-1;;;;22277:14:0::1;::::0;;22220:79::o;15424:290::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;15507:13:::1;::::0;::::1;;15506:14;:44:::0;::::1;;;;15536:14;;15524:8;:26;;15506:44;:64;;;;-1:-1:-1::0;15554:11:0::1;::::0;15568:2:::1;-1:-1:-1::0;;;15554:11:0;;::::1;;;:16;15506:64;15498:100;;;;-1:-1:-1::0;;;15498:100:0::1;;;;;;;:::i;:::-;15609:14;:25:::0;15663:12:::1;15645:15;:30:::0;15686:13:::1;:20:::0;;-1:-1:-1;;15686:20:0::1;-1:-1:-1::0;15686:20:0::1;::::0;;15424:290::o;11759:140::-;-1:-1:-1;;;;;11858:24:0;;11823:15;11858:24;;;:17;:24;;;;;:33;;:31;:33::i;18727:705::-;10956:6;;-1:-1:-1;;;10956:6:0;;;;10955:7;10947:26;;;;-1:-1:-1;;;10947:26:0;;;;;;;:::i;:::-;18830:18:::1;18868:6:::0;18863:204:::1;18880:23:::0;;::::1;18863:204;;;18929:25;18938:12;;18951:1;18938:15;;;;;-1:-1:-1::0;;;18938:15:0::1;;;;;;;;;;;;;;;18929:8;:25::i;:::-;18925:85;;;18989:5;::::0;18975:19:::1;::::0;;::::1;:::i;:::-;;;18925:85;19024:31;19035:12;;19048:1;19035:15;;;;;-1:-1:-1::0;;;19035:15:0::1;;;;;;;;;;;;;;;19052:2;19024:10;:31::i;:::-;18905:3:::0;::::1;::::0;::::1;:::i;:::-;;;;18863:204;;;;19110:10;19085:21;:35;;19077:66;;;;-1:-1:-1::0;;;19077:66:0::1;;;;;;;:::i;:::-;19158:14:::0;;19154:81:::1;;19189:13;::::0;:34:::1;::::0;-1:-1:-1;;;;;19189:13:0;;::::1;::::0;:34;::::1;;;::::0;19212:10;;19189:13:::1;:34:::0;:13;:34;19212:10;19189:13;:34;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;19154:81;19249:21;:25:::0;19245:180:::1;;19362:51;::::0;19370:10:::1;::::0;19391:21:::1;19362:51:::0;::::1;;;::::0;::::1;::::0;;;19391:21;19370:10;19362:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;27605:752:::0;27694:13;27672:11;10379:40;:18;27672:11;10379:27;:40::i;:::-;10371:97;;;;-1:-1:-1;;;10371:97:0;;;;;;;:::i;:::-;27720:26:::1;27749:10;27760:11;27749:23;;;;;-1:-1:-1::0;;;27749:23:0::1;;;;;;;;;27720:52;::::0;;;;::::1;::::0;;;27749:23;::::1;27720:52:::0;::::1;::::0;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;27720:52:0::1;;::::0;::::1;::::0;;-1:-1:-1;;27799:24:0::1;27811:11:::0;27799::::1;:24::i;:::-;27856:15:::0;;27783:40;;-1:-1:-1;27882:1:0::1;::::0;27838:17:::1;::::0;27856:22:::1;::::0;27874:4:::1;::::0;27856:22:::1;:::i;:::-;27838:41;;;;;;;-1:-1:-1::0;;;27838:41:0::1;;;;;;;;;;;:45;27834:516;;;27900:11;27956;27969:17;28005:4;27987:9;:15;;;:22;;;;:::i;:::-;27969:41;;;;;;;-1:-1:-1::0;;;27969:41:0::1;;;;;;;;;;;27939:72;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27929:83;;;;;;27921:92;;27900:114;;28029:13;28045:17;28057:4;28045:11;:17::i;:::-;28029:33;;28077:22;28102:16;28113:4;28102:10;:16::i;:::-;28077:41;;28133:10;28146:16;28157:4;28146:10;:16::i;:::-;28184:8;::::0;:64:::1;::::0;-1:-1:-1;;;28184:64:0;;28133:29;;-1:-1:-1;;;;;;28184:8:0::1;::::0;:17:::1;::::0;:64:::1;::::0;28202:11;;28215:7;;28224;;28133:29;;28239:8;;28184:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;28184:64:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;28177:71;;;;;;;;;;27834:516;28288:8;::::0;:50:::1;::::0;-1:-1:-1;;;28288:50:0;;-1:-1:-1;;;;;28288:8:0;;::::1;::::0;:17:::1;::::0;:50:::1;::::0;28306:11;;28319:1:::1;::::0;28322:7;;28288:8:::1;::::0;:50;::::1;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;28288:50:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;28281:57;;;;10479:1;27605:752:::0;;;;:::o;21681:96::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;21753:5:::1;:16:::0;21681:96::o;17941:477::-;10956:6;;-1:-1:-1;;;10956:6:0;;;;10955:7;10947:26;;;;-1:-1:-1;;;10947:26:0;;;;;;;:::i;:::-;18028:21:::1;18037:11;18028:8;:21::i;:::-;18024:159;;;18099:5;;18074:21;:30;;18066:61;;;;-1:-1:-1::0;;;18066:61:0::1;;;;;;;:::i;:::-;18142:13;::::0;18165:5:::1;::::0;18142:29:::1;::::0;-1:-1:-1;;;;;18142:13:0;;::::1;::::0;:29;::::1;;;::::0;18165:5;18142:13:::1;:29:::0;:13;:29;18165:5;18142:13;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18024:159;18193:27;18204:11;18217:2;18193:10;:27::i;:::-;18235:21;:25:::0;18231:180:::1;;18348:51;::::0;18356:10:::1;::::0;18377:21:::1;18348:51:::0;::::1;;;::::0;::::1;::::0;;;18377:21;18356:10;18348:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;18231:180;17941:477:::0;;:::o;26728:102::-;26802:20;;;;;;;;;;;;-1:-1:-1;;;26802:20:0;;;;26728:102;:::o;21448:133::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;21546:27:::1;:12;21561::::0;21546:27:::1;;:::i;9611:40::-:0;;;;:::o;18525:98::-;18586:29;18591:11;18604:10;18586:4;:29::i;:::-;18525:98;:::o;22682:288::-;22745:5;;22783:16;22797:2;22783:11;:16;:::i;:::-;22763:36;-1:-1:-1;22810:19:0;22832:16;22846:2;22832:11;:16;:::i;:::-;22810:38;;22859:12;22874:10;22885:9;22874:21;;;;;-1:-1:-1;;;22874:21:0;;;;;;;;;;;;-1:-1:-1;22939:15:0;:11;22953:1;22939:15;:::i;:::-;22933:21;;:3;:21;:::i;:::-;22924:31;22959:2;22919:42;;22682:288;-1:-1:-1;;;;22682:288:0:o;12606:278::-;-1:-1:-1;;;;;12701:22:0;;12713:10;12701:22;;12693:60;;;;-1:-1:-1;;;12693:60:0;;;;;;;:::i;:::-;12782:10;12764:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;12764:39:0;;;;;;;;;;;:50;;-1:-1:-1;;12764:50:0;;;;;;;12830:46;;12764:39;;12782:10;12830:46;;;;12764:50;;12830:46;:::i;:::-;;;;;;;;12606:278;;:::o;9536:36::-;;;-1:-1:-1;;;9536:36:0;;;;;:::o;6820:42::-;;;-1:-1:-1;;;;;6820:42:0;;:::o;13055:971::-;13184:11;10565:40;:18;13184:11;10565:27;:40::i;:::-;10557:88;;;;-1:-1:-1;;;10557:88:0;;;;;;;:::i;:::-;10656:13;10672:20;10680:11;10672:7;:20::i;:::-;10656:36;-1:-1:-1;10711:10:0;-1:-1:-1;;;;;10711:19:0;;;;:64;;-1:-1:-1;10748:27:0;;;;:14;:27;;;;;;-1:-1:-1;;;;;10748:27:0;10734:10;:41;10711:64;:104;;;-1:-1:-1;;;;;;10779:24:0;;;;;;:17;:24;;;;;;;;10804:10;10779:36;;;;;;;;;;10711:104;10703:183;;;;-1:-1:-1;;;10703:183:0;;;;;;;:::i;:::-;13208:37:::1;13223:4;13229:2;13233:11;13208:14;:37::i;:::-;13311:15:::0;::::1;13351:8:::0;;13347:672:::1;;13380:74;::::0;-1:-1:-1;;;13380:74:0;;-1:-1:-1;;;;;13380:36:0;::::1;::::0;::::1;::::0;:74:::1;::::0;13417:10:::1;::::0;13429:4;;13435:11;;13448:5;;13380:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;13380:74:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;13380:74:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;13376:632;;;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;13725:13:0;;13721:272:::1;;13768:60;;-1:-1:-1::0;;;13768:60:0::1;;;;;;;:::i;13721:272::-;13943:6;13937:13;13928:6;13924:2;13920:15;13913:38;13376:632;-1:-1:-1::0;;;;;;13502:51:0;::::1;-1:-1:-1::0;;;13502:51:0::1;13498:160;;13578:60;;-1:-1:-1::0;;;13578:60:0::1;;;;;;;:::i;13498:160::-;13455:218;13376:632;10897:1;13055:971:::0;;;;;;:::o;25298:1279::-;25388:12;25402:19;25423:10;25435:23;25460:22;25484:18;25504:11;25533:26;25562:10;25573:11;25562:23;;;;;-1:-1:-1;;;25562:23:0;;;;;;;;;25533:52;;;;;;;;;25562:23;;25533:52;;;;;;-1:-1:-1;;;;;25533:52:0;;;;;;;;;;;25608:8;25533:52;;-1:-1:-1;25608:8:0;:21;25630:24;25642:11;25630;:24::i;:::-;25608:47;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25608:47:0;;;;;;;;;;;;:::i;:::-;25596:59;-1:-1:-1;25687:1:0;;-1:-1:-1;25704:40:0;:18;25732:11;25704:27;:40::i;:::-;25700:799;;;25783:15;;25809:1;;25765:17;;25783:22;;25801:4;;25783:22;:::i;:::-;25765:41;;;;;;;-1:-1:-1;;;25765:41:0;;;;;;;;;;;:45;25761:496;;;25880:11;25893:17;25929:4;25911:9;:15;;;:22;;;;:::i;:::-;25893:41;;;;;;;-1:-1:-1;;;25893:41:0;;;;;;;;;;;25863:72;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;25863:72:0;;;;;;;;;25853:83;;25863:72;25853:83;;;;26005:8;;25853:83;;-1:-1:-1;25112:1:0;;-1:-1:-1;;;;;26005:8:0;:21;26027:17;25853:83;26027:11;:17::i;:::-;26005:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26005:40:0;;;;;;;;;;;;:::i;:::-;26072:16;26083:4;26072:10;:16::i;:::-;26115:9;26151:16;26162:4;26151:10;:16::i;:::-;26194:9;:15;;;25957:284;;;;;;;;;;;;;;;25761:496;25064:1;26271:23;;26322:9;:15;;;26309:28;;25700:799;;;26359:21;26368:11;26359:8;:21::i;:::-;26355:144;;;24958:1;26397:26;;26355:144;;;25015:1;26456:31;;26355:144;-1:-1:-1;;26509:60:0;;;;;;;;;;;-1:-1:-1;;;26509:60:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26509:60:0;;;;;-1:-1:-1;26536:1:0;;-1:-1:-1;26509:60:0;-1:-1:-1;26536:1:0;25298:1279;;;;;;;;;;:::o;15862:562::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;15941:13:::1;::::0;::::1;;:64:::0;::::1;;;;15990:15;;15975:12;:30;15941:64;:142;;;;;16069:14;;16053:10;16036:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;16026:39;;;;;;:57;15941:142;15933:198;;;;-1:-1:-1::0;;;15933:198:0::1;;;;;;;:::i;:::-;16181:3;16163:15;;16148:12;:30;;;;:::i;:::-;:36;16144:241;;;16201:17;16248:10;16270:15;;16260:26;16231:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16221:67;;;;;;16201:87;;16336:9;16303:17;16321:11;;;;;;;;;;;16303:30;;;;;;;-1:-1:-1::0;;;16303:30:0::1;;;;;;;;;;:42:::0;16360:11:::1;:13:::0;;-1:-1:-1;;;16360:13:0;::::1;;;::::0;:11:::1;:13;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;16144:241;;-1:-1:-1::0;16395:13:0::1;:21:::0;;-1:-1:-1;;16395:21:0::1;::::0;;15862:562::o;14996:244::-;15089:11;;15047:7;;;;15089:18;;-1:-1:-1;;;15089:11:0;;;;15103:4;15089:18;:::i;:::-;15067:40;;;;15136:27;:18;:25;:27::i;:::-;15122:11;:41;15118:55;;;15172:1;15165:8;;;;;15118:55;15221:11;15191:27;:18;:25;:27::i;:::-;:41;;;;:::i;:::-;15184:48;;;14996:244;:::o;26838:759::-;26936:13;26914:11;10379:40;:18;26914:11;10379:27;:40::i;:::-;10371:97;;;;-1:-1:-1;;;10371:97:0;;;;;;;:::i;:::-;26962:26:::1;26991:10;27002:11;26991:23;;;;;-1:-1:-1::0;;;26991:23:0::1;;;;;;;;;26962:52;::::0;;;;::::1;::::0;;;26991:23;::::1;26962:52:::0;::::1;::::0;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;26962:52:0::1;;::::0;::::1;::::0;;-1:-1:-1;;27041:24:0::1;27053:11:::0;27041::::1;:24::i;:::-;27098:15:::0;;27025:40;;-1:-1:-1;27124:1:0::1;::::0;27080:17:::1;::::0;27098:22:::1;::::0;27116:4:::1;::::0;27098:22:::1;:::i;:::-;27080:41;;;;;;;-1:-1:-1::0;;;27080:41:0::1;;;;;;;;;;;:45;27076:514;;;27142:11;27198;27211:17;27247:4;27229:9;:15;;;:22;;;;:::i;:::-;27211:41;;;;;;;-1:-1:-1::0;;;27211:41:0::1;;;;;;;;;;;27181:72;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27171:83;;;;;;27163:92;;27142:114;;27271:13;27287:17;27299:4;27287:11;:17::i;:::-;27271:33;;27319:22;27344:16;27355:4;27344:10;:16::i;:::-;27319:41;;27375:10;27388:16;27399:4;27388:10;:16::i;:::-;27426:8;::::0;:63:::1;::::0;-1:-1:-1;;;27426:63:0;;27375:29;;-1:-1:-1;;;;;;27426:8:0::1;::::0;:16:::1;::::0;:63:::1;::::0;27443:11;;27456:7;;27465;;27375:29;;27480:8;;27426:63:::1;;;:::i;27076:514::-;27529:8;::::0;:49:::1;::::0;-1:-1:-1;;;27529:49:0;;-1:-1:-1;;;;;27529:8:0;;::::1;::::0;:16:::1;::::0;:49:::1;::::0;27546:11;;27559:1:::1;::::0;27562:7;;27529:8:::1;::::0;:49;::::1;;:::i;9457:36::-:0;;;-1:-1:-1;;;;;9457:36:0;;:::o;19552:127::-;19633:38;19646:12;;19660:10;19633:12;:38::i;9732:34::-;;;;;;;;;;;;;;;;;;-1:-1:-1;9732:34:0;;;-1:-1:-1;;;;;9732:34:0;;:::o;20845:153::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;20935:8:::1;:55:::0;;-1:-1:-1;;;;;;20935:55:0::1;-1:-1:-1::0;;;;;20935:55:0;;;::::1;::::0;;;::::1;::::0;;20845:153::o;12892:155::-;-1:-1:-1;;;;;13005:24:0;;;12981:4;13005:24;;;:17;:24;;;;;;;;:34;;;;;;;;;;;;;;;12892:155::o;21879:122::-;10248:13;;-1:-1:-1;;;;;10248:13:0;10234:10;:27;10226:59;;;;-1:-1:-1;;;10226:59:0;;;;;;;:::i;:::-;21969:13:::1;:24:::0;;-1:-1:-1;;;;;;21969:24:0::1;-1:-1:-1::0;;;;;21969:24:0;;;::::1;::::0;;;::::1;::::0;;21879:122::o;4005:129::-;4078:4;4102:19;;;:12;;;;;:19;;;;;;:24;;;4005:129::o;11030:165::-;11102:27;;;;:14;:27;;;;;;:32;;-1:-1:-1;;;;;;11102:32:0;-1:-1:-1;;;;;11102:32:0;;;;;;;;11150:37;;11102:27;;11159:10;;11150:37;;11102:27;11150:37;11030:165;;:::o;4142:109::-;4225:18;;4142:109::o;4259:413::-;4322:4;4344:20;4353:3;4358:5;4344:8;:20::i;:::-;4339:326;;-1:-1:-1;4381:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;4564:18;;4542:19;;;:12;;;:19;;;;;;:40;;;;4597:11;;4339:326;-1:-1:-1;4648:5:0;4641:12;;11203:404;-1:-1:-1;;;;;11301:16:0;;11293:65;;;;-1:-1:-1;;;11293:65:0;;;;;;;:::i;:::-;11369:35;11388:1;11392:11;11369:10;:35::i;:::-;-1:-1:-1;;;;;11415:23:0;;;;;;:17;:23;;;;;:43;;11446:11;11415:30;:43::i;:::-;-1:-1:-1;;;;;;11469:21:0;;;;;;:17;:21;;;;;:38;;11495:11;11469:25;:38::i;:::-;;11550:2;11518:10;11529:11;11518:23;;;;;-1:-1:-1;;;11518:23:0;;;;;;;;;;:34;;-1:-1:-1;;;;;;11518:34:0;;-1:-1:-1;;;;;11518:34:0;;;;;;;11568:31;;11587:11;;11568:31;;;;;;;;;;-1:-1:-1;;11568:31:0;11203:404;;;:::o;3877:120::-;3944:7;3971:3;:11;;3983:5;3971:18;;;;;;-1:-1:-1;;;3971:18:0;;;;;;;;;;;;;;;;;3964:25;;3877:120;;;;:::o;16975:875::-;17055:17;;-1:-1:-1;;;17055:17:0;;;;17047:51;;;;-1:-1:-1;;;17047:51:0;;;;;;;:::i;:::-;17117:3;;17131:28;;-1:-1:-1;;;17131:28:0;;-1:-1:-1;;;;;17117:3:0;;;;:13;;:3;;17131:15;;:28;;17147:11;;17131:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17117:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17117:89:0;17164:42;-1:-1:-1;;;;;17117:89:0;;17109:133;;;;-1:-1:-1;;;17109:133:0;;;;;;;:::i;:::-;17253:20;17276:3;;:24;;-1:-1:-1;;;17276:24:0;;-1:-1:-1;;;;;17276:3:0;;;;:11;;:24;;17288:11;;17276:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17253:47;-1:-1:-1;17320:10:0;-1:-1:-1;;;;;17320:26:0;;;;17319:89;;-1:-1:-1;17379:3:0;;:28;;-1:-1:-1;;;17379:28:0;;-1:-1:-1;;;;;17379:3:0;;;;:15;;:28;;17395:11;;17379:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;17365:42:0;:10;-1:-1:-1;;;;;17365:42:0;;17319:89;:154;;;-1:-1:-1;17426:3:0;;:46;;-1:-1:-1;;;17426:46:0;;-1:-1:-1;;;;;17426:3:0;;;;:20;;:46;;17447:12;;17461:10;;17426:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17311:215;;;;-1:-1:-1;;;17311:215:0;;;;;;;:::i;:::-;17548:40;:18;17576:11;17548:27;:40::i;:::-;17547:41;17539:68;;;;-1:-1:-1;;;17539:68:0;;;;;;;:::i;:::-;17644:50;;;;;;;;17661:27;:18;:25;:27::i;:::-;17644:50;;;;;;17691:2;-1:-1:-1;;;;;17644:50:0;;;;17618:10;17629:11;17618:23;;;;;-1:-1:-1;;;17618:23:0;;;;;;;;;:76;;:23;;:76;;;;;;;-1:-1:-1;;;;;17618:76:0;;;-1:-1:-1;;;;;;17618:76:0;;;;-1:-1:-1;;17618:76:0;;;;;;;;;;;;;;;;;17705:35;:18;17728:11;17705:22;:35::i;:::-;-1:-1:-1;;;;;;17751:21:0;;;;;;:17;:21;;;;;:38;;17777:11;17751:25;:38::i;:::-;-1:-1:-1;17805:37:0;;17830:11;;-1:-1:-1;;;;;17805:37:0;;;17822:1;;17805:37;;17822:1;;17805:37;16975:875;;;:::o;24239:362::-;24296:5;24345:2;24338:9;;24381:1;24362:20;;24358:236;;;24406:1;24399:8;;;;;24358:236;24448:1;24429:16;:20;24425:169;;;24473:1;24466:8;;;;;24425:169;24515:1;24496:16;:20;24492:102;;;24540:1;24533:8;;;;;24492:102;24581:1;24574:8;;;;;22978:1253;23075:1;23067:9;;;23034:13;23087:10;23108:22;;:::i;:::-;23177:2;23170:9;;;-1:-1:-1;23202:1:0;23194:9;;23190:184;;;23220:17;;;;;;;;;;;;;-1:-1:-1;;;23220:17:0;;;;;;;23256:9;;23252:111;;;23297:10;23308:5;23297:17;;;;;-1:-1:-1;;;23297:17:0;;;;;;;;;;23286:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;23292:1;23286:8;;;;;-1:-1:-1;;;23286:8:0;;;;;;;;;;;;:28;;;;23333:14;;;;;;;;;;;;;-1:-1:-1;;;23333:14:0;;;:5;23339:1;23333:8;;;;;-1:-1:-1;;;23333:8:0;;;;;;;;;;;;:14;23252:111;23393:1;23384:10;;;;;;;23431:4;23438:1;23431:8;23430:15;;23444:1;23430:15;23426:144;;;23484:2;23479:1;23471:9;;;23470:16;;-1:-1:-1;23512:10:0;23470:16;23512:17;;;;;-1:-1:-1;;;23512:17:0;;;;;;;;;;23501:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;23507:1;23501:8;;;;;-1:-1:-1;;;23501:8:0;;;;;;;;;;;;:28;;;;23544:14;;;;;;;;;;;;;-1:-1:-1;;;23544:14:0;;;:5;23550:1;23544:8;;;;;-1:-1:-1;;;23544:8:0;;;;;;;;;;;;:14;23426:144;23589:1;23580:10;;;;;;;23624:4;23631:2;23624:9;23616:17;;;;23656:2;23648:5;:10;23644:65;;;23686:4;23691:5;23686:11;;;;;-1:-1:-1;;;23686:11:0;;;;;;;;;;23675:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;23681:1;23675:8;;;;;-1:-1:-1;;;23675:8:0;;;;;;;;;;;;:22;23644:65;23719:10;23728:1;23719:10;;;;;;;;23771:2;23764:9;;-1:-1:-1;23795:5:0;23764:9;23795:12;;;;;-1:-1:-1;;;23795:12:0;;;;;;;;;;23784:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;23790:1;23784:8;;;;;-1:-1:-1;;;23784:8:0;;;;;;;;;;;;:23;23818:10;23827:1;23818:10;;;;;;;;23874:1;23867:8;;;23866:15;23862:146;;;23937:14;;;;;;;;;23915:1;23937:14;;;-1:-1:-1;;;23937:14:0;;;;23907:9;;;23920:2;23906:16;;-1:-1:-1;23937:5:0;23943:1;23937:8;;;:14;23977:12;23990:5;23977:19;;;;;-1:-1:-1;;;23977:19:0;;;;;;;;;;23966:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;23972:1;23966:8;;;;;-1:-1:-1;;;23966:8:0;;;;;;;;;;;;:30;23862:146;24051:8;;;24061;;;;24071;;;;;24121;;;;24131;;;;24141;;;;24191;;;;24201;;;;24211;;;;24034:186;;;;24051:8;24071;;24121;;24131;;24141;;24191;;24201;;24034:186;;:::i;:::-;;;;;;;;;;;;;24020:201;;;;22978:1253;;;:::o;24609:297::-;24665:5;24719:2;24714:1;24706:9;;;24705:16;24755:1;24738:18;;24734:165;;;24780:1;24773:8;;;;;24734:165;24820:1;24803:14;:18;24799:100;;;24845:1;24838:8;;;;;4680:1395;4746:4;4885:19;;;:12;;;:19;;;;;;4919:15;;4915:1153;;5279:21;5303:14;5316:1;5303:10;:14;:::i;:::-;5352:18;;5279:38;;-1:-1:-1;5332:17:0;;5352:22;;5373:1;;5352:22;:::i;:::-;5332:42;;5406:13;5393:9;:26;5389:403;;5440:17;5460:3;:11;;5472:9;5460:22;;;;;;-1:-1:-1;;;5460:22:0;;;;;;;;;;;;;;;;;5440:42;;5612:9;5583:3;:11;;5595:13;5583:26;;;;;;-1:-1:-1;;;5583:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;5697:23;;;:12;;;:23;;;;;:36;;;5389:403;5873:17;;:3;;:17;;;-1:-1:-1;;;5873:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;5966:3;:12;;:19;5979:5;5966:19;;;;;;;;;;;5959:26;;;6007:4;6000:11;;;;;;;4915:1153;6051:5;6044:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:404:2;;;147:3;140:4;132:6;128:17;124:27;114:2;;172:8;162;155:26;114:2;-1:-1:-1;202:20:2;;245:18;234:30;;231:2;;;284:8;274;267:26;231:2;328:4;320:6;316:17;304:29;;391:3;384:4;376;368:6;364:17;356:6;352:30;348:41;345:50;342:2;;;408:1;405;398:12;342:2;104:314;;;;;:::o;423:259::-;;535:2;523:9;514:7;510:23;506:32;503:2;;;556:6;548;541:22;503:2;600:9;587:23;619:33;646:5;619:33;:::i;:::-;671:5;493:189;-1:-1:-1;;;493:189:2:o;687:263::-;;810:2;798:9;789:7;785:23;781:32;778:2;;;831:6;823;816:22;778:2;868:9;862:16;887:33;914:5;887:33;:::i;1227:402::-;;;1356:2;1344:9;1335:7;1331:23;1327:32;1324:2;;;1377:6;1369;1362:22;1324:2;1421:9;1408:23;1440:33;1467:5;1440:33;:::i;:::-;1492:5;-1:-1:-1;1549:2:2;1534:18;;1521:32;1562:35;1521:32;1562:35;:::i;:::-;1616:7;1606:17;;;1314:315;;;;;:::o;1634:470::-;;;;1780:2;1768:9;1759:7;1755:23;1751:32;1748:2;;;1801:6;1793;1786:22;1748:2;1845:9;1832:23;1864:33;1891:5;1864:33;:::i;:::-;1916:5;-1:-1:-1;1973:2:2;1958:18;;1945:32;1986:35;1945:32;1986:35;:::i;:::-;1738:366;;2040:7;;-1:-1:-1;;;2094:2:2;2079:18;;;;2066:32;;1738:366::o;2109:1067::-;;;;;2281:3;2269:9;2260:7;2256:23;2252:33;2249:2;;;2303:6;2295;2288:22;2249:2;2347:9;2334:23;2366:33;2393:5;2366:33;:::i;:::-;2418:5;-1:-1:-1;2475:2:2;2460:18;;2447:32;2488:35;2447:32;2488:35;:::i;:::-;2542:7;-1:-1:-1;2596:2:2;2581:18;;2568:32;;-1:-1:-1;2651:2:2;2636:18;;2623:32;2678:18;2667:30;;2664:2;;;2715:6;2707;2700:22;2664:2;2743:22;;2796:4;2788:13;;2784:27;-1:-1:-1;2774:2:2;;2830:6;2822;2815:22;2774:2;2871;2858:16;2896:50;2912:33;2942:2;2912:33;:::i;:::-;2896:50;:::i;:::-;2969:2;2962:5;2955:17;3009:7;3004:2;2999;2995;2991:11;2987:20;2984:33;2981:2;;;3035:6;3027;3020:22;2981:2;3095;3090;3086;3082:11;3077:2;3070:5;3066:14;3053:45;3118:14;;;3134:2;3114:23;3107:39;;;;-1:-1:-1;2239:937:2;;;;-1:-1:-1;2239:937:2;-1:-1:-1;2239:937:2:o;3181:396::-;;;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3328:6;3320;3313:22;3275:2;3372:9;3359:23;3391:33;3418:5;3391:33;:::i;:::-;3443:5;-1:-1:-1;3500:2:2;3485:18;;3472:32;3513;3472;3513;:::i;3582:327::-;;;3711:2;3699:9;3690:7;3686:23;3682:32;3679:2;;;3732:6;3724;3717:22;3679:2;3776:9;3763:23;3795:33;3822:5;3795:33;:::i;:::-;3847:5;3899:2;3884:18;;;;3871:32;;-1:-1:-1;;;3669:240:2:o;3914:296::-;;4031:4;4076:2;4064:9;4055:7;4051:23;4047:32;4044:2;;;4097:6;4089;4082:22;4044:2;4141:7;4136:2;4125:9;4121:18;4118:31;4115:2;;;4167:6;4159;4152:22;4115:2;-1:-1:-1;4195:9:2;;4011:199;-1:-1:-1;;4011:199:2:o;4215:531::-;;;;4379:2;4367:9;4358:7;4354:23;4350:32;4347:2;;;4400:6;4392;4385:22;4347:2;4445:9;4432:23;4478:18;4470:6;4467:30;4464:2;;;4515:6;4507;4500:22;4464:2;4559:76;4627:7;4618:6;4607:9;4603:22;4559:76;:::i;:::-;4654:8;;4533:102;;-1:-1:-1;4736:2:2;4721:18;;;;4708:32;;4337:409;-1:-1:-1;;;;4337:409:2:o;4751:463::-;;;4898:2;4886:9;4877:7;4873:23;4869:32;4866:2;;;4919:6;4911;4904:22;4866:2;4964:9;4951:23;4997:18;4989:6;4986:30;4983:2;;;5034:6;5026;5019:22;4983:2;5078:76;5146:7;5137:6;5126:9;5122:22;5078:76;:::i;:::-;5173:8;;5052:102;;-1:-1:-1;4856:358:2;-1:-1:-1;;;;4856:358:2:o;5219:600::-;;;;5383:2;5371:9;5362:7;5358:23;5354:32;5351:2;;;5404:6;5396;5389:22;5351:2;5449:9;5436:23;5482:18;5474:6;5471:30;5468:2;;;5519:6;5511;5504:22;5468:2;5563:76;5631:7;5622:6;5611:9;5607:22;5563:76;:::i;:::-;5658:8;;-1:-1:-1;5537:102:2;-1:-1:-1;;5743:2:2;5728:18;;5715:32;5756:33;5715:32;5756:33;:::i;:::-;5808:5;5798:15;;;5341:478;;;;;:::o;5824:253::-;;5933:2;5921:9;5912:7;5908:23;5904:32;5901:2;;;5954:6;5946;5939:22;5901:2;5998:9;5985:23;6017:30;6041:5;6017:30;:::i;6082:257::-;;6202:2;6190:9;6181:7;6177:23;6173:32;6170:2;;;6223:6;6215;6208:22;6170:2;6260:9;6254:16;6279:30;6303:5;6279:30;:::i;6344:190::-;;6456:2;6444:9;6435:7;6431:23;6427:32;6424:2;;;6477:6;6469;6462:22;6424:2;-1:-1:-1;6505:23:2;;6414:120;-1:-1:-1;6414:120:2:o;6539:257::-;;6650:2;6638:9;6629:7;6625:23;6621:32;6618:2;;;6671:6;6663;6656:22;6618:2;6715:9;6702:23;6734:32;6760:5;6734:32;:::i;6801:261::-;;6923:2;6911:9;6902:7;6898:23;6894:32;6891:2;;;6944:6;6936;6929:22;6891:2;6981:9;6975:16;7000:32;7026:5;7000:32;:::i;7067:312::-;;7189:2;7177:9;7168:7;7164:23;7160:32;7157:2;;;7210:6;7202;7195:22;7157:2;7241:16;;-1:-1:-1;;;;;;7286:34:2;;7276:45;;7266:2;;7340:6;7332;7325:22;7384:677;;7517:2;7505:9;7496:7;7492:23;7488:32;7485:2;;;7538:6;7530;7523:22;7485:2;7576:9;7570:16;7609:18;7601:6;7598:30;7595:2;;;7646:6;7638;7631:22;7595:2;7674:22;;7727:4;7719:13;;7715:27;-1:-1:-1;7705:2:2;;7761:6;7753;7746:22;7705:2;7795;7789:9;7820:50;7836:33;7866:2;7836:33;:::i;7820:50::-;7893:2;7886:5;7879:17;7933:7;7928:2;7923;7919;7915:11;7911:20;7908:33;7905:2;;;7959:6;7951;7944:22;7905:2;7977:54;8028:2;8023;8016:5;8012:14;8007:2;8003;7999:11;7977:54;:::i;:::-;8050:5;7475:586;-1:-1:-1;;;;;7475:586:2:o;8261:194::-;;8384:2;8372:9;8363:7;8359:23;8355:32;8352:2;;;8405:6;8397;8390:22;8352:2;-1:-1:-1;8433:16:2;;8342:113;-1:-1:-1;8342:113:2:o;8460:327::-;;;8589:2;8577:9;8568:7;8564:23;8560:32;8557:2;;;8610:6;8602;8595:22;8557:2;8651:9;8638:23;8628:33;;8711:2;8700:9;8696:18;8683:32;8724:33;8751:5;8724:33;:::i;8792:259::-;;8873:5;8867:12;8900:6;8895:3;8888:19;8916:63;8972:6;8965:4;8960:3;8956:14;8949:4;8942:5;8938:16;8916:63;:::i;:::-;9033:2;9012:15;-1:-1:-1;;9008:29:2;8999:39;;;;9040:4;8995:50;;8843:208;-1:-1:-1;;8843:208:2:o;9056:1776::-;;9609:6;9603:13;9625:53;9671:6;9666:3;9659:4;9651:6;9647:17;9625:53;:::i;:::-;9709:6;9703:13;9725:68;9784:8;9775:6;9770:3;9766:16;9759:4;9751:6;9747:17;9725:68;:::i;:::-;9871:13;;9819:16;;;9815:31;;9893:57;9871:13;9815:31;9927:4;9915:17;;9893:57;:::i;:::-;9981:6;9975:13;9997:72;10060:8;10049;10042:5;10038:20;10031:4;10023:6;10019:17;9997:72;:::i;:::-;10151:13;;10095:20;;;;10091:35;;10173:57;10151:13;10091:35;10207:4;10195:17;;10173:57;:::i;:::-;10261:6;10255:13;10277:72;10340:8;10329;10322:5;10318:20;10311:4;10303:6;10299:17;10277:72;:::i;:::-;10431:13;;10375:20;;;;10371:35;;10453:57;10431:13;10371:35;10487:4;10475:17;;10453:57;:::i;:::-;10577:13;;10532:20;;;10599:57;10577:13;10532:20;10633:4;10621:17;;10599:57;:::i;:::-;10687:6;10681:13;10703:72;10766:8;10755;10748:5;10744:20;10737:4;10729:6;10725:17;10703:72;:::i;:::-;10795:20;;10791:35;;9579:1253;-1:-1:-1;;;;;;;;;;;9579:1253:2:o;10837:182::-;10966:19;;;11010:2;11001:12;;10956:63::o;11024:247::-;11181:19;;;11225:2;11216:12;;11209:28;11262:2;11253:12;;11171:100::o;11276:203::-;-1:-1:-1;;;;;11440:32:2;;;;11422:51;;11410:2;11395:18;;11377:102::o;11708:282::-;-1:-1:-1;;;;;11908:32:2;;;;11890:51;;11972:2;11957:18;;11950:34;11878:2;11863:18;;11845:145::o;11995:304::-;-1:-1:-1;;;;;12225:15:2;;;12207:34;;12277:15;;12272:2;12257:18;;12250:43;12157:2;12142:18;;12124:175::o;12304:383::-;-1:-1:-1;;;;;12570:15:2;;;12552:34;;12622:15;;;;12617:2;12602:18;;12595:43;12669:2;12654:18;;12647:34;;;;12502:2;12487:18;;12469:218::o;12692:490::-;-1:-1:-1;;;;;12961:15:2;;;12943:34;;13013:15;;13008:2;12993:18;;12986:43;13060:2;13045:18;;13038:34;;;13108:3;13103:2;13088:18;;13081:31;;;12692:490;;13129:47;;13156:19;;13148:6;13129:47;:::i;:::-;13121:55;12895:287;-1:-1:-1;;;;;;12895:287:2:o;13187:187::-;13352:14;;13345:22;13327:41;;13315:2;13300:18;;13282:92::o;13379:204::-;-1:-1:-1;;;;;;13541:35:2;;;;13523:54;;13511:2;13496:18;;13478:105::o;13830:221::-;;13979:2;13968:9;13961:21;13999:46;14041:2;14030:9;14026:18;14018:6;13999:46;:::i;14056:338::-;14258:2;14240:21;;;14297:2;14277:18;;;14270:30;-1:-1:-1;;;14331:2:2;14316:18;;14309:44;14385:2;14370:18;;14230:164::o;14399:407::-;14601:2;14583:21;;;14640:2;14620:18;;;14613:30;14679:34;14674:2;14659:18;;14652:62;-1:-1:-1;;;14745:2:2;14730:18;;14723:41;14796:3;14781:19;;14573:233::o;14811:414::-;15013:2;14995:21;;;15052:2;15032:18;;;15025:30;15091:34;15086:2;15071:18;;15064:62;-1:-1:-1;;;15157:2:2;15142:18;;15135:48;15215:3;15200:19;;14985:240::o;15230:347::-;15432:2;15414:21;;;15471:2;15451:18;;;15444:30;15510:25;15505:2;15490:18;;15483:53;15568:2;15553:18;;15404:173::o;15582:343::-;15784:2;15766:21;;;15823:2;15803:18;;;15796:30;-1:-1:-1;;;15857:2:2;15842:18;;15835:49;15916:2;15901:18;;15756:169::o;15930:342::-;16132:2;16114:21;;;16171:2;16151:18;;;16144:30;-1:-1:-1;;;16205:2:2;16190:18;;16183:48;16263:2;16248:18;;16104:168::o;16277:400::-;16479:2;16461:21;;;16518:2;16498:18;;;16491:30;16557:34;16552:2;16537:18;;16530:62;-1:-1:-1;;;16623:2:2;16608:18;;16601:34;16667:3;16652:19;;16451:226::o;16682:349::-;16884:2;16866:21;;;16923:2;16903:18;;;16896:30;16962:27;16957:2;16942:18;;16935:55;17022:2;17007:18;;16856:175::o;17036:338::-;17238:2;17220:21;;;17277:2;17257:18;;;17250:30;-1:-1:-1;;;17311:2:2;17296:18;;17289:44;17365:2;17350:18;;17210:164::o;17379:345::-;17581:2;17563:21;;;17620:2;17600:18;;;17593:30;-1:-1:-1;;;17654:2:2;17639:18;;17632:51;17715:2;17700:18;;17553:171::o;17729:408::-;17931:2;17913:21;;;17970:2;17950:18;;;17943:30;18009:34;18004:2;17989:18;;17982:62;-1:-1:-1;;;18075:2:2;18060:18;;18053:42;18127:3;18112:19;;17903:234::o;18142:329::-;18344:2;18326:21;;;18383:1;18363:18;;;18356:29;-1:-1:-1;;;18416:2:2;18401:18;;18394:36;18462:2;18447:18;;18316:155::o;18476:349::-;18678:2;18660:21;;;18717:2;18697:18;;;18690:30;18756:27;18751:2;18736:18;;18729:55;18816:2;18801:18;;18650:175::o;18830:420::-;19032:2;19014:21;;;19071:2;19051:18;;;19044:30;19110:34;19105:2;19090:18;;19083:62;19181:26;19176:2;19161:18;;19154:54;19240:3;19225:19;;19004:246::o;19255:338::-;19457:2;19439:21;;;19496:2;19476:18;;;19469:30;-1:-1:-1;;;19530:2:2;19515:18;;19508:44;19584:2;19569:18;;19429:164::o;19598:399::-;19800:2;19782:21;;;19839:2;19819:18;;;19812:30;19878:34;19873:2;19858:18;;19851:62;-1:-1:-1;;;19944:2:2;19929:18;;19922:33;19987:3;19972:19;;19772:225::o;20002:338::-;20204:2;20186:21;;;20243:2;20223:18;;;20216:30;-1:-1:-1;;;20277:2:2;20262:18;;20255:44;20331:2;20316:18;;20176:164::o;20345:397::-;20547:2;20529:21;;;20586:2;20566:18;;;20559:30;20625:34;20620:2;20605:18;;20598:62;-1:-1:-1;;;20691:2:2;20676:18;;20669:31;20732:3;20717:19;;20519:223::o;20747:413::-;20949:2;20931:21;;;20988:2;20968:18;;;20961:30;21027:34;21022:2;21007:18;;21000:62;-1:-1:-1;;;21093:2:2;21078:18;;21071:47;21150:3;21135:19;;20921:239::o;21165:349::-;21367:2;21349:21;;;21406:2;21386:18;;;21379:30;21445:27;21440:2;21425:18;;21418:55;21505:2;21490:18;;21339:175::o;21519:285::-;21721:6;21709:19;;;;21691:38;;-1:-1:-1;;;;;21765:32:2;21760:2;21745:18;;21738:60;21679:2;21664:18;;21646:158::o;21991:654::-;22295:25;;;22368:4;22356:17;;;22351:2;22336:18;;22329:45;22410:17;;;22405:2;22390:18;;22383:45;22464:17;22459:2;22444:18;;22437:45;22519:3;22513;22498:19;;22491:32;;;22560:1;22539:19;;;22532:30;-1:-1:-1;;;22593:3:2;22578:19;;22571:32;22635:3;22620:19;;22285:360::o;22650:529::-;;22899:6;22888:9;22881:25;22954:4;22946:6;22942:17;22937:2;22926:9;22922:18;22915:45;23008:4;23000:6;22996:17;22991:2;22980:9;22976:18;22969:45;23062:4;23054:6;23050:17;23045:2;23034:9;23030:18;23023:45;23105:3;23099;23088:9;23084:19;23077:32;23126:47;23168:3;23157:9;23153:19;23145:6;23126:47;:::i;:::-;23118:55;22871:308;-1:-1:-1;;;;;;;22871:308:2:o;23184:184::-;23356:4;23344:17;;;;23326:36;;23314:2;23299:18;;23281:87::o;23373:893::-;;23732:4;23724:6;23720:17;23709:9;23702:36;23774:3;23769:2;23758:9;23754:18;23747:31;23801:47;23843:3;23832:9;23828:19;23820:6;23801:47;:::i;:::-;23896:4;23888:6;23884:17;23879:2;23868:9;23864:18;23857:45;23950:9;23942:6;23938:22;23933:2;23922:9;23918:18;23911:50;23984:34;24011:6;24003;23984:34;:::i;:::-;23970:48;;24067:9;24059:6;24055:22;24049:3;24038:9;24034:19;24027:51;24095:34;24122:6;24114;24095:34;:::i;:::-;-1:-1:-1;;;;;24166:32:2;;;;24186:3;24145:19;;24138:61;-1:-1:-1;;24248:10:2;24236:23;;;;24230:3;24215:19;;;24208:52;24087:42;23692:574;-1:-1:-1;;;;;23692:574:2:o;24271:275::-;24342:2;24336:9;24407:2;24388:13;;-1:-1:-1;;24384:27:2;24372:40;;24442:18;24427:34;;24463:22;;;24424:62;24421:2;;;24489:18;;:::i;:::-;24525:2;24518:22;24316:230;;-1:-1:-1;24316:230:2:o;24551:188::-;;24634:18;24626:6;24623:30;24620:2;;;24656:18;;:::i;:::-;-1:-1:-1;24722:2:2;24701:15;-1:-1:-1;;24697:29:2;24728:4;24693:40;;24610:129::o;24744:128::-;;24815:1;24811:6;24808:1;24805:13;24802:2;;;24821:18;;:::i;:::-;-1:-1:-1;24857:9:2;;24792:80::o;24877:187::-;;24942:6;24975:2;24972:1;24968:10;24997:3;24987:2;;25004:18;;:::i;:::-;25042:10;;25038:20;;;;;24922:142;-1:-1:-1;;24922:142:2:o;25069:120::-;;25135:1;25125:2;;25140:18;;:::i;:::-;-1:-1:-1;25174:9:2;;25115:74::o;25194:258::-;;25265:6;25298:2;25295:1;25291:10;25328:2;25325:1;25321:10;25384:3;25380:2;25376:12;25371:3;25368:21;25361:3;25354:11;25347:19;25343:47;25340:2;;;25393:18;;:::i;:::-;25433:13;;25245:207;-1:-1:-1;;;;25245:207:2:o;25457:168::-;;25563:1;25559;25555:6;25551:14;25548:1;25545:21;25540:1;25533:9;25526:17;25522:45;25519:2;;;25570:18;;:::i;:::-;-1:-1:-1;25610:9:2;;25509:116::o;25630:125::-;;25698:1;25695;25692:8;25689:2;;;25703:18;;:::i;:::-;-1:-1:-1;25740:9:2;;25679:76::o;25760:258::-;25832:1;25842:113;25856:6;25853:1;25850:13;25842:113;;;25932:11;;;25926:18;25913:11;;;25906:39;25878:2;25871:10;25842:113;;;25973:6;25970:1;25967:13;25964:2;;;-1:-1:-1;;26008:1:2;25990:16;;25983:27;25813:205::o;26023:380::-;26108:1;26098:12;;26155:1;26145:12;;;26166:2;;26220:4;26212:6;26208:17;26198:27;;26166:2;26273;26265:6;26262:14;26242:18;26239:38;26236:2;;;26319:10;26314:3;26310:20;26307:1;26300:31;26354:4;26351:1;26344:15;26382:4;26379:1;26372:15;26408:135;;-1:-1:-1;;26468:17:2;;26465:2;;;26488:18;;:::i;:::-;-1:-1:-1;26535:1:2;26524:13;;26455:88::o;26548:175::-;;26629:4;26622:5;26618:16;26658:4;26649:7;26646:17;26643:2;;;26666:18;;:::i;:::-;26715:1;26702:15;;26593:130;-1:-1:-1;;26593:130:2:o;26728:112::-;;26786:1;26776:2;;26791:18;;:::i;:::-;-1:-1:-1;26825:9:2;;26766:74::o;26845:127::-;26906:10;26901:3;26897:20;26894:1;26887:31;26937:4;26934:1;26927:15;26961:4;26958:1;26951:15;26977:127;27038:10;27033:3;27029:20;27026:1;27019:31;27069:4;27066:1;27059:15;27093:4;27090:1;27083:15;27109:127;27170:10;27165:3;27161:20;27158:1;27151:31;27201:4;27198:1;27191:15;27225:4;27222:1;27215:15;27241:133;-1:-1:-1;;;;;27318:31:2;;27308:42;;27298:2;;27364:1;27361;27354:12;27379:120;27467:5;27460:13;27453:21;27446:5;27443:32;27433:2;;27489:1;27486;27479:12;27504:133;-1:-1:-1;;;;;;27580:32:2;;27570:43;;27560:2;;27627:1;27624;27617:12

Swarm Source

ipfs://81e186b108a804cfc7b946734740a8a096f979c510e10f2759fe1fad1938b9b0
Loading...
Loading
Loading...
Loading
[ 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.