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

Token

Gods Unchained Cards (CARD)
 

Overview

Max Total Supply

6,680,552 CARD

Holders

9,770

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
185 CARD
0xf0ccf93438aebc3065cef29e013fc5f4835c4780
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Cards

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2019-10-29
*/

pragma solidity 0.5.11;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 */
contract Ownable {
    address private _owner;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * > Note: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


contract InscribableToken {

    mapping(bytes32 => bytes32) public properties;

    event ClassPropertySet(
        bytes32 indexed key,
        bytes32 value
    );

    event TokenPropertySet(
        uint indexed id,
        bytes32 indexed key,
        bytes32 value
    );

    function _setProperty(
        uint _id,
        bytes32 _key,
        bytes32 _value
    )
        internal
    {
        properties[getTokenKey(_id, _key)] = _value;
        emit TokenPropertySet(_id, _key, _value);
    }

    function getProperty(
        uint _id,
        bytes32 _key
    )
        public
        view
        returns (bytes32 _value)
    {
        return properties[getTokenKey(_id, _key)];
    }

    function _setClassProperty(
        bytes32 _key,
        bytes32 _value
    )
        internal
    {
        emit ClassPropertySet(_key, _value);
        properties[getClassKey(_key)] = _value;
    }

    function getTokenKey(
        uint _tokenId,
        bytes32 _key
    )
        public
        pure
        returns (bytes32)
    {
        // one prefix to prevent collisions
        return keccak256(abi.encodePacked(uint(1), _tokenId, _key));
    }

    function getClassKey(bytes32 _key)
        public
        pure
        returns (bytes32)
    {
        // zero prefix to prevent collisions
        return keccak256(abi.encodePacked(uint(0), _key));
    }

    function getClassProperty(bytes32 _key)
        public
        view
        returns (bytes32)
    {
        return properties[getClassKey(_key)];
    }

}

// solium-disable security/no-inline-assembly


library StorageWrite {

    using SafeMath for uint256;

    function _getStorageArraySlot(uint _dest, uint _index) internal view returns (uint result) {
        uint slot = _getArraySlot(_dest, _index);
        assembly { result := sload(slot) }
    }

    function _getArraySlot(uint _dest, uint _index) internal pure returns (uint slot) {
        assembly {
            let free := mload(0x40)
            mstore(free, _dest)
            slot := add(keccak256(free, 32), _index)
        }
    }

    function _setArraySlot(uint _dest, uint _index, uint _value) internal {
        uint slot = _getArraySlot(_dest, _index);
        assembly { sstore(slot, _value) }
    }

    function _loadSlots(uint _slot, uint _offset, uint _perSlot, uint _length) internal view returns (uint[] memory slots) {
        uint slotCount = _slotCount(_offset, _perSlot, _length);
        slots = new uint[](slotCount);
        // top and tail the slots
        uint firstPos = _pos(_offset, _perSlot); // _offset.div(_perSlot);
        slots[0] = _getStorageArraySlot(_slot, firstPos);
        if (slotCount > 1) {
            uint lastPos = _pos(_offset.add(_length), _perSlot); // .div(_perSlot);
            slots[slotCount-1] = _getStorageArraySlot(_slot, lastPos);
        }
    }

    function _pos(uint items, uint perPage) internal pure returns (uint) {
        return items / perPage;
    }

    function _slotCount(uint _offset, uint _perSlot, uint _length) internal pure returns (uint) {
        uint start = _offset / _perSlot;
        uint end = (_offset + _length) / _perSlot;
        return (end - start) + 1;
    }

    function _saveSlots(uint _slot, uint _offset, uint _size, uint[] memory _slots) internal {
        uint offset = _offset.div((256/_size));
        for (uint i = 0; i < _slots.length; i++) {
            _setArraySlot(_slot, offset + i, _slots[i]);
        }
    }

    function _write(uint[] memory _slots, uint _offset, uint _size, uint _index, uint _value) internal pure {
        uint perSlot = 256 / _size;
        uint initialOffset = _offset % perSlot;
        uint slotPosition = (initialOffset + _index) / perSlot;
        uint withinSlot = ((_index + _offset) % perSlot) * _size;
        // evil bit shifting magic
        for (uint q = 0; q < _size; q += 8) {
            _slots[slotPosition] |= ((_value >> q) & 0xFF) << (withinSlot + q);
        }
    }

    function repeatUint16(uint _slot, uint _offset, uint _length, uint16 _item) internal {
        uint[] memory slots = _loadSlots(_slot, _offset, 16, _length);
        for (uint i = 0; i < _length; i++) {
            _write(slots, _offset, 16, i, _item);
        }
        _saveSlots(_slot, _offset, 16, slots);
    }

    function uint16s(uint _slot, uint _offset, uint16[] memory _items) internal {
        uint[] memory slots = _loadSlots(_slot, _offset, 16, _items.length);
        for (uint i = 0; i < _items.length; i++) {
            _write(slots, _offset, 16, i, _items[i]);
        }
        _saveSlots(_slot, _offset, 16, slots);
    }

    function uint8s(uint _slot, uint _offset, uint8[] memory _items) internal {
        uint[] memory slots = _loadSlots(_slot, _offset, 32, _items.length);
        for (uint i = 0; i < _items.length; i++) {
            _write(slots, _offset, 8, i, _items[i]);
        }
        _saveSlots(_slot, _offset, 8, slots);
    }

}

library String {

    /**
     * @dev Converts a `uint256` to a `string`.
     * via OraclizeAPI - MIT licence
     * https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
     */
    function fromUint(uint256 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }

    bytes constant alphabet = "0123456789abcdef";

    function fromAddress(address _addr) internal pure returns(string memory) {
        bytes32 value = bytes32(uint256(_addr));
        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0F))];
        }
        return string(str);
    }

}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    /**
     * @notice Handle the receipt of an NFT
     * @dev The ERC721 smart contract calls this function on the recipient
     * after a `safeTransfer`. This function MUST return the function selector,
     * otherwise the caller will revert the transaction. The selector to be
     * returned can be obtained as `this.onERC721Received.selector`. This
     * function MAY throw to revert and reject the transfer.
     * Note: the ERC721 contract address is always the message sender.
     * @param operator The address which called `safeTransferFrom` function
     * @param from The address which previously owned the token
     * @param tokenId The NFT identifier which is being transferred
     * @param data Additional data with no specified format
     * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}


/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
}


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}


/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others (`ERC165Checker`).
 *
 * For an implementation, see `ERC165`.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

contract ImmutableToken {

    string public constant baseURI = "https://api.immutable.com/asset/";

    function tokenURI(uint256 tokenId) external view returns (string memory) {
        return string(abi.encodePacked(
            baseURI,
            String.fromAddress(address(this)),
            "/",
            String.fromUint(tokenId)
        ));
    }

}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract 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);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * 
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}


/**
 * @dev Implementation of the `IERC165` interface.
 *
 * Contracts may inherit from this and call `_registerInterface` to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See `IERC165.supportsInterface`.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See `IERC165.supportsInterface`.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract 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);
}


contract ICards is IERC721 {

    function getDetails(uint tokenId) public view returns (uint16 proto, uint8 quality);
    function setQuality(uint tokenId, uint8 quality) public;
    function burn(uint tokenId) public;
    function batchMintCards(address to, uint16[] memory _protos, uint8[] memory _qualities) public returns (uint);
    function mintCards(address to, uint16[] memory _protos, uint8[] memory _qualities) public returns (uint);
    function mintCard(address to, uint16 _proto, uint8 _quality) public returns (uint);
    function batchSize() public view returns (uint);
}






/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping (uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping (address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param owner address to query the balance of
     * @return uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokensCount[owner].current();
    }

    /**
     * @dev Gets the owner of the specified token ID.
     * @param tokenId uint256 ID of the token to query the owner of
     * @return address currently marked as the owner of the given token ID
     */
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }

    /**
     * @dev Approves another address to transfer the given token ID
     * The zero address indicates there is no approved address.
     * There can only be one approved address per token at a given time.
     * Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        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"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Gets the approved address for a token ID, or zero if no address set
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev Sets or unsets the approval of a given operator
     * An operator is allowed to transfer all tokens of the sender on their behalf.
     * @param to operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, "ERC721: approve to caller");

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    /**
     * @dev Tells whether an operator is approved by a given owner.
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev Transfers the ownership of a given token ID to another address.
     * Usage of this method is discouraged, use `safeTransferFrom` whenever possible.
     * Requires the msg.sender to be the owner, approved, or operator.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(address from, address to, uint256 tokenId) public {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transferFrom(from, to, tokenId);
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev Safely transfers the ownership of a given token ID to another address
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     * Requires the msg.sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        transferFrom(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether the specified token exists.
     * @param tokenId uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    /**
     * @dev Returns whether the given spender can transfer a given token ID.
     * @param spender address of the spender to query
     * @param tokenId uint256 ID of the token to be transferred
     * @return bool whether the msg.sender is approved for the given token ID,
     * is an operator of the owner, or is the owner of the token
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to The address that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

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

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Internal function to invoke `onERC721Received` on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * This function is deprecated.
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    /**
     * @dev Private function to clear current approval of a given token ID.
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}




contract ERC721Metadata is ERC165, ERC721, IERC721Metadata {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name.
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol.
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns an URI for a given token ID.
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     */
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return _tokenURIs[tokenId];
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to set its URI
     * @param uri string URI to assign
     */
    function _setTokenURI(uint256 tokenId, string memory uri) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = uri;
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned by the msg.sender
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}


contract MultiTransfer is IERC721 {

    function transferBatch(
        address from,
        address to,
        uint256 start,
        uint256 end
    )
        public
    {
        for (uint i = start; i < end; i++) {
            transferFrom(from, to, i);
        }
    }

    function transferAllFrom(
        address from,
        address to,
        uint256[] memory tokenIDs
    )
        public
    {
        for (uint i = 0; i < tokenIDs.length; i++) {
            transferFrom(from, to, tokenIDs[i]);
        }
    }

    function safeTransferBatch(
        address from,
        address to,
        uint256 start,
        uint256 end
    )
        public
    {
        for (uint i = start; i < end; i++) {
            safeTransferFrom(from, to, i);
        }
    }

    function safeTransferAllFrom(
        address from,
        address to,
        uint256[] memory tokenIDs
    )
        public
    {
        for (uint i = 0; i < tokenIDs.length; i++) {
            safeTransferFrom(from, to, tokenIDs[i]);
        }
    }

}


contract BatchToken is ERC721Metadata {

    using SafeMath for uint256;

    struct Batch {
        uint48 userID;
        uint16 size;
    }

    mapping(uint48 => address) public userIDToAddress;
    mapping(address => uint48) public addressToUserID;

    uint256 public batchSize;
    uint256 public nextBatch;
    uint256 public tokenCount;

    uint48[] internal ownerIDs;
    uint48[] internal approvedIDs;

    mapping(uint => Batch) public batches;

    uint48 internal userCount = 1;

    mapping(address => uint) internal _balances;

    uint256 internal constant MAX_LENGTH = uint(2**256 - 1);

    constructor(
        uint256 _batchSize,
        string memory name,
        string memory symbol
    )
        public
        ERC721Metadata(name, symbol)
    {
        batchSize = _batchSize;
        ownerIDs.length = MAX_LENGTH;
        approvedIDs.length = MAX_LENGTH;
    }

    function _getUserID(address to)
        internal
        returns (uint48)
    {
        if (to == address(0)) {
            return 0;
        }
        uint48 uID = addressToUserID[to];
        if (uID == 0) {
            require(
                userCount + 1 > userCount,
                "BT: must not overflow"
            );
            uID = userCount++;
            userIDToAddress[uID] = to;
            addressToUserID[to] = uID;
        }
        return uID;
    }

    function _batchMint(
        address to,
        uint16 size
    )
        internal
        returns (uint)
    {
        require(
            to != address(0),
            "BT: must not be null"
        );

        require(
            size > 0 && size <= batchSize,
            "BT: size must be within limits"
        );

        uint256 start = nextBatch;
        uint48 uID = _getUserID(to);
        batches[start] = Batch({
            userID: uID,
            size: size
        });
        uint256 end = start.add(size);
        for (uint256 i = start; i < end; i++) {
            emit Transfer(address(0), to, i);
        }
        nextBatch = nextBatch.add(batchSize);
        _balances[to] = _balances[to].add(size);
        tokenCount = tokenCount.add(size);
        return start;
    }

    function getBatchStart(uint256 tokenId) public view returns (uint) {
        return tokenId.div(batchSize).mul(batchSize);
    }

    function getBatch(uint256 index) public view returns (uint48 userID, uint16 size) {
        return (batches[index].userID, batches[index].size);
    }

    // Overridden ERC721 functions
    // @OZ: please stop making variables/functions private

    function ownerOf(uint256 tokenId)
        public
        view
        returns (address)
    {
        uint48 uID = ownerIDs[tokenId];
        if (uID == 0) {
            uint256 start = getBatchStart(tokenId);
            Batch memory b = batches[start];

            require(
                start + b.size > tokenId,
                "BT: token does not exist"
            );

            uID = b.userID;
            require(
                uID != 0,
                "BT: bad batch owner"
            );
        }
        return userIDToAddress[uID];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    )
        public
    {
        require(
            ownerOf(tokenId) == from,
            "BT: transfer of token that is not own"
        );

        require(
            to != address(0),
            "BT: transfer to the zero address"
        );

        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "BT: caller is not owner nor approved"
        );

        _cancelApproval(tokenId);
        _balances[from] = _balances[from].sub(1);
        _balances[to] = _balances[to].add(1);
        ownerIDs[tokenId] = _getUserID(to);
        emit Transfer(from, to, tokenId);
    }

    function burn(uint256 tokenId) public {
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            "BT: caller is not owner nor approved"
        );

        _cancelApproval(tokenId);
        address owner = ownerOf(tokenId);
        _balances[owner] = _balances[owner].sub(1);
        ownerIDs[tokenId] = 0;
        tokenCount = tokenCount.sub(1);
        emit Transfer(owner, address(0), tokenId);
    }

    function _cancelApproval(uint256 tokenId) internal {
        if (approvedIDs[tokenId] != 0) {
            approvedIDs[tokenId] = 0;
        }
    }

    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);

        require(
            to != owner,
            "BT: approval to current owner"
        );

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "BT: approve caller is not owner nor approved for all"
        );

        approvedIDs[tokenId] = _getUserID(to);
        emit Approval(owner, to, tokenId);
    }

    function _exists(uint256 tokenId)
        internal
        view
        returns (bool)
    {
        return ownerOf(tokenId) != address(0);
    }

    function getApproved(uint256 tokenId)
        public
        view
        returns (address)
    {
        require(
            _exists(tokenId),
            "BT: approved query for nonexistent token"
        );

        return userIDToAddress[approvedIDs[tokenId]];
    }

    function totalSupply()
        public
        view
        returns (uint)
    {
        return tokenCount;
    }

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

}

// solium-disable security/no-inline-assembly


contract Cards is Ownable, MultiTransfer, BatchToken, ImmutableToken, InscribableToken {

    uint16 private constant MAX_UINT16 = 2**16 - 1;

    uint16[] public cardProtos;
    uint8[] public cardQualities;

    struct Season {
        uint16 high;
        uint16 low;
    }

    struct Proto {
        bool locked;
        bool exists;
        uint8 god;
        uint8 cardType;
        uint8 rarity;
        uint8 mana;
        uint8 attack;
        uint8 health;
        uint8 tribe;
    }

    event ProtoUpdated(
        uint16 indexed id
    );

    event SeasonStarted(
        uint16 indexed id,
        string name,
        uint16 indexed low,
        uint16 indexed high
    );

    event QualityChanged(
        uint256 indexed tokenId,
        uint8 quality,
        address factory
    );

    event CardsMinted(
        uint256 indexed start,
        address to,
        uint16[] protos,
        uint8[] qualities
    );

    // Value of index proto = season
    uint16[] public protoToSeason;

    address public propertyManager;

    // Array containing all protos
    Proto[] public protos;

    // Array containing all seasons
    Season[] public seasons;

    // Map whether a season is tradeable or not
    mapping(uint256 => bool) public seasonTradable;

    // Map whether a factory has been authorised or not
    mapping(address => mapping(uint256 => bool)) public factoryApproved;

    // Whether a factory is approved to create a particular mythic
    mapping(uint16 => mapping(address => bool)) public mythicApproved;

    // Whether a mythic is tradable
    mapping(uint16 => bool) public mythicTradable;

    // Map whether a mythic exists or not
    mapping(uint16 => bool) public mythicCreated;

    uint16 public constant MYTHIC_THRESHOLD = 65000;

    constructor(
        uint256 _batchSize,
        string memory _name,
        string memory _symbol
    )
        public
        BatchToken(_batchSize, _name, _symbol)
    {
        cardProtos.length = MAX_LENGTH;
        cardQualities.length = MAX_LENGTH;
        protoToSeason.length = MAX_LENGTH;
        protos.length = MAX_LENGTH;
        propertyManager = msg.sender;
    }

    function getDetails(
        uint256 tokenId
    )
        public
        view
        returns (uint16 proto, uint8 quality)
    {
        return (cardProtos[tokenId], cardQualities[tokenId]);
    }

    function mintCard(
        address to,
        uint16 _proto,
        uint8 _quality
    )
        external
        returns (uint id)
    {
        id = _batchMint(to, 1);
        _validateProto(_proto);
        cardProtos[id] = _proto;
        cardQualities[id] = _quality;

        uint16[] memory ps = new uint16[](1);
        ps[0] = _proto;

        uint8[] memory qs = new uint8[](1);
        qs[0] = _quality;

        emit CardsMinted(id, to, ps, qs);
        return id;
    }

    function mintCards(
        address to,
        uint16[] calldata _protos,
        uint8[] calldata _qualities
    )
        external
        returns (uint)
    {
        require(
            _protos.length > 0,
            "Core: must be some protos"
        );

        require(
            _protos.length == _qualities.length,
            "Core: must be the same number of protos/qualities"
        );

        uint256 start = _batchMint(to, uint16(_protos.length));
        _validateAndSaveDetails(start, _protos, _qualities);

        emit CardsMinted(start, to, _protos, _qualities);

        return start;
    }

    function addFactory(
        address _factory,
        uint256 _season
    )
        public
        onlyOwner
    {
        require(
            seasons.length >= _season,
            "Core: season must exist"
        );

        require(
            _season > 0,
            "Core: season must not be 0"
        );

        require(
            !factoryApproved[_factory][_season],
            "Core: this factory is already approved"
        );

        require(
            !seasonTradable[_season],
            "Core: season must not be tradable"
        );

        factoryApproved[_factory][_season] = true;
    }

    function approveForMythic(
        address _factory,
        uint16 _mythic
    )
        public
        onlyOwner
    {
        require(
            _mythic >= MYTHIC_THRESHOLD,
            "not a mythic"
        );

        require(
            !mythicApproved[_mythic][_factory],
            "Core: this factory is already approved for this mythic"
        );

        mythicApproved[_mythic][_factory] = true;
    }

    function makeMythicTradable(
        uint16 _mythic
    )
        public
        onlyOwner
    {
        require(
            _mythic >= MYTHIC_THRESHOLD,
            "Core: not a mythic"
        );

        require(
            !mythicTradable[_mythic],
            "Core: must not be tradable already"
        );

        mythicTradable[_mythic] = true;
    }

    function unlockTrading(
        uint256 _season
    )
        public
        onlyOwner
    {
        require(
            _season > 0 && _season <= seasons.length,
            "Core: must be a current season"
        );

        require(
            !seasonTradable[_season],
            "Core: season must not be tradable"
        );

        seasonTradable[_season] = true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    )
        public
    {
        require(
            isTradable(tokenId),
            "Core: not yet tradable"
        );

        super.transferFrom(from, to, tokenId);
    }

    function burn(uint256 _tokenId) public {
        require(
            isTradable(_tokenId),
            "Core: not yet tradable"
        );

        super.burn(_tokenId);
    }

    function burnAll(uint256[] memory tokenIDs) public {
        for (uint256 i = 0; i < tokenIDs.length; i++) {
            burn(tokenIDs[i]);
        }
    }

    function isTradable(uint256 _tokenId) public view returns (bool) {
        uint16 proto = cardProtos[_tokenId];
        if (proto >= MYTHIC_THRESHOLD) {
            return mythicTradable[proto];
        }
        return seasonTradable[protoToSeason[proto]];
    }

    function startSeason(
        string memory name,
        uint16 low,
        uint16 high
    )
        public
        onlyOwner
        returns (uint)
    {
        require(
            low > 0,
            "Core: must not be zero proto"
        );

        require(
            high > low,
            "Core: must be a valid range"
        );

        require(
            seasons.length == 0 || low > seasons[seasons.length - 1].high,
            "Core: seasons cannot overlap"
        );

        require(
            MYTHIC_THRESHOLD > high,
            "Core: cannot go into mythic territory"
        );

        // seasons start at 1
        uint16 id = uint16(seasons.push(Season({ high: high, low: low })));

        uint256 cp;
        assembly { cp := protoToSeason_slot }
        StorageWrite.repeatUint16(cp, low, (high - low) + 1, id);

        emit SeasonStarted(id, name, low, high);

        return id;
    }

    function updateProtos(
        uint16[] memory _ids,
        uint8[] memory _gods,
        uint8[] memory _cardTypes,
        uint8[] memory _rarities,
        uint8[] memory _manas,
        uint8[] memory _attacks,
        uint8[] memory _healths,
        uint8[] memory _tribes
    ) public onlyOwner {
        for (uint256 i = 0; i < _ids.length; i++) {
            uint16 id = _ids[i];

            require(
                id > 0,
                "Core: proto must not be zero"
            );

            Proto memory proto = protos[id];
            require(
                !proto.locked,
                "Core: proto is locked"
            );

            protos[id] = Proto({
                locked: false,
                exists: true,
                god: _gods[i],
                cardType: _cardTypes[i],
                rarity: _rarities[i],
                mana: _manas[i],
                attack: _attacks[i],
                health: _healths[i],
                tribe: _tribes[i]
            });
            emit ProtoUpdated(id);
        }
    }

    function lockProtos(uint16[] memory _ids) public onlyOwner {
        require(
            _ids.length > 0,
            "must lock some"
        );

        for (uint256 i = 0; i < _ids.length; i++) {
            uint16 id = _ids[i];
            require(
                id > 0,
                "proto must not be zero"
            );

            Proto storage proto = protos[id];

            require(
                !proto.locked,
                "proto is locked"
            );

            require(
                proto.exists,
                "proto must exist"
            );

            proto.locked = true;
            emit ProtoUpdated(id);
        }
    }

    function _validateAndSaveDetails(
        uint256 start,
        uint16[] memory _protos,
        uint8[] memory _qualities
    )
        internal
    {
        _validateProtos(_protos);

        uint256 cp;
        assembly { cp := cardProtos_slot }
        StorageWrite.uint16s(cp, start, _protos);
        uint256 cq;
        assembly { cq := cardQualities_slot }
        StorageWrite.uint8s(cq, start, _qualities);
    }

    function _validateProto(uint16 proto) internal {
        if (proto >= MYTHIC_THRESHOLD) {
            _checkCanCreateMythic(proto);
        } else {

            uint256 season = protoToSeason[proto];

            require(
                season != 0,
                "Core: must have season set"
            );

            require(
                factoryApproved[msg.sender][season],
                "Core: must be approved factory for this season"
            );
        }
    }

    function _validateProtos(uint16[] memory _protos) internal {
        uint16 maxProto = 0;
        uint16 minProto = MAX_UINT16;
        for (uint256 i = 0; i < _protos.length; i++) {
            uint16 proto = _protos[i];
            if (proto >= MYTHIC_THRESHOLD) {
                _checkCanCreateMythic(proto);
            } else {
                if (proto > maxProto) {
                    maxProto = proto;
                }
                if (minProto > proto) {
                    minProto = proto;
                }
            }
        }

        if (maxProto != 0) {
            uint256 season = protoToSeason[maxProto];
            // cards must be from the same season
            require(
                season != 0,
                "Core: must have season set"
            );

            require(
                season == protoToSeason[minProto],
                "Core: can only create cards from the same season"
            );

            require(
                factoryApproved[msg.sender][season],
                "Core: must be approved factory for this season"
            );
        }
    }

    function _checkCanCreateMythic(uint16 proto) internal {

        require(
            mythicApproved[proto][msg.sender],
            "Core: not approved to create this mythic"
        );

        require(
            !mythicCreated[proto],
            "Core: mythic has already been created"
        );

        mythicCreated[proto] = true;
    }

    function setQuality(
        uint256 _tokenId,
        uint8 _quality
    )
        public
    {
        uint16 proto = cardProtos[_tokenId];
        // wont' be able to change mythic season
        uint256 season = protoToSeason[proto];

        require(
            factoryApproved[msg.sender][season],
            "Core: factory can't change quality of this season"
        );

        cardQualities[_tokenId] = _quality;
        emit QualityChanged(_tokenId, _quality, msg.sender);
    }

    function setPropertyManager(address _manager) public onlyOwner {
        propertyManager = _manager;
    }

    function setProperty(uint256 _id, bytes32 _key, bytes32 _value) public {
        require(
            msg.sender == propertyManager,
            "Core: must be property manager"
        );

        _setProperty(_id, _key, _value);
    }

    function setClassProperty(bytes32 _key, bytes32 _value) public {
        require(
            msg.sender == propertyManager,
            "Core: must be property manager"
        );

        _setClassProperty(_key, _value);
    }

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardQualities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"mythicTradable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"transferAllFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"burnAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"},{"internalType":"uint8[]","name":"_gods","type":"uint8[]"},{"internalType":"uint8[]","name":"_cardTypes","type":"uint8[]"},{"internalType":"uint8[]","name":"_rarities","type":"uint8[]"},{"internalType":"uint8[]","name":"_manas","type":"uint8[]"},{"internalType":"uint8[]","name":"_attacks","type":"uint8[]"},{"internalType":"uint8[]","name":"_healths","type":"uint8[]"},{"internalType":"uint8[]","name":"_tribes","type":"uint8[]"}],"name":"updateProtos","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setPropertyManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToUserID","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"address","name":"","type":"address"}],"name":"mythicApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"factoryApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MYTHIC_THRESHOLD","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16[]","name":"_ids","type":"uint16[]"}],"name":"lockProtos","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"getTokenKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"getClassKey","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"setProperty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getBatch","outputs":[{"internalType":"uint48","name":"userID","type":"uint48"},{"internalType":"uint16","name":"size","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"_proto","type":"uint16"},{"internalType":"uint8","name":"_quality","type":"uint8"}],"name":"mintCard","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint16","name":"_mythic","type":"uint16"}],"name":"approveForMythic","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint48","name":"","type":"uint48"}],"name":"userIDToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"safeTransferAllFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBatchStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"low","type":"uint16"},{"internalType":"uint16","name":"high","type":"uint16"}],"name":"startSeason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"getClassProperty","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"setClassProperty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protos","outputs":[{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint8","name":"god","type":"uint8"},{"internalType":"uint8","name":"cardType","type":"uint8"},{"internalType":"uint8","name":"rarity","type":"uint8"},{"internalType":"uint8","name":"mana","type":"uint8"},{"internalType":"uint8","name":"attack","type":"uint8"},{"internalType":"uint8","name":"health","type":"uint8"},{"internalType":"uint8","name":"tribe","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"safeTransferBatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonTradable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batches","outputs":[{"internalType":"uint48","name":"userID","type":"uint48"},{"internalType":"uint16","name":"size","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"protoToSeason","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDetails","outputs":[{"internalType":"uint16","name":"proto","type":"uint16"},{"internalType":"uint8","name":"quality","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"unlockTrading","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"properties","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"transferBatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16[]","name":"_protos","type":"uint16[]"},{"internalType":"uint8[]","name":"_qualities","type":"uint8[]"}],"name":"mintCards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes32","name":"_key","type":"bytes32"}],"name":"getProperty","outputs":[{"internalType":"bytes32","name":"_value","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"mythicCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isTradable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint8","name":"_quality","type":"uint8"}],"name":"setQuality","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"propertyManager","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextBatch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_mythic","type":"uint16"}],"name":"makeMythicTradable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint256","name":"_season","type":"uint256"}],"name":"addFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cardProtos","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"batchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasons","outputs":[{"internalType":"uint16","name":"high","type":"uint16"},{"internalType":"uint16","name":"low","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_batchSize","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"id","type":"uint16"}],"name":"ProtoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"id","type":"uint16"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"uint16","name":"low","type":"uint16"},{"indexed":true,"internalType":"uint16","name":"high","type":"uint16"}],"name":"SeasonStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"quality","type":"uint8"},{"indexed":false,"internalType":"address","name":"factory","type":"address"}],"name":"QualityChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint16[]","name":"protos","type":"uint16[]"},{"indexed":false,"internalType":"uint8[]","name":"qualities","type":"uint8[]"}],"name":"CardsMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"ClassPropertySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"key","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"TokenPropertySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040526011805465ffffffffffff191660011790553480156200002357600080fd5b506040516200577738038062005777833981810160405260608110156200004957600080fd5b8151602083018051604051929492938301929190846401000000008211156200007157600080fd5b9083019060208201858111156200008757600080fd5b8251640100000000811182820188101715620000a257600080fd5b82525081516020918201929091019080838360005b83811015620000d1578181015183820152602001620000b7565b50505050905090810190601f168015620000ff5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012357600080fd5b9083019060208201858111156200013957600080fd5b82516401000000008111828201881017156200015457600080fd5b82525081516020918201929091019080838360005b838110156200018357818101518382015260200162000169565b50505050905090810190601f168015620001b15780820380516001836020036101000a031916815260200191505b506040819052600080546001600160a01b0319163317808255889550879450869350849284926001600160a01b039290921691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36200023e7f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b036200036016565b620002727f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b036200036016565b81516200028790600690602085019062000432565b5080516200029d90600790602084019062000432565b50620002d27f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b036200036016565b5050600b839055600019620002e9600e82620004b7565b50600019620002fa600f82620004b7565b50505050600019601481620003109190620004f3565b50600019620003216015826200052a565b5060001962000332601682620004f3565b506000196200034360188262000561565b5050601780546001600160a01b0319163317905550620005cf9050565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620003f257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152600160208190526040909120805460ff19169091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200047557805160ff1916838001178555620004a5565b82800160010185558215620004a5579182015b82811115620004a557825182559160200191906001019062000488565b50620004b392915062000588565b5090565b815481835581811115620004ee576004016005900481600401600590048360005260206000209182019101620004ee919062000588565b505050565b815481835581811115620004ee57600f016010900481600f01601090048360005260206000209182019101620004ee919062000588565b815481835581811115620004ee57601f016020900481601f01602090048360005260206000209182019101620004ee919062000588565b815481835581811115620004ee57600083815260209020620004ee918101908301620005a8565b620005a591905b80821115620004b357600081556001016200058f565b90565b620005a591905b80821115620004b35780546001600160481b0319168155600101620005af565b61519880620005df6000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c8063856516c31161020a578063bd15627311610125578063e7356cb5116100b8578063ef42259b11610087578063ef42259b146114f5578063f2fde38b14611521578063f3beae6b14611547578063f4daaba114611564578063f5d709a11461156c576103db565b8063e7356cb514611496578063e7c51f1b1461149e578063e8c238a1146114a6578063e985e9c5146114c7576103db565b8063cdc2cfe2116100f4578063cdc2cfe21461140f578063e0c931df14611432578063e27aa1d814611453578063e3fb1ac614611470576103db565b8063bd156273146112cb578063c5f4127a146112e8578063c87b56dd14611324578063c8be6b9b14611341576103db565b8063ab17d0401161019d578063b76e8d011161016c578063b76e8d0114611190578063b88d4fde146111ad578063b93a89f714611271578063bc048525146112ae576103db565b8063ab17d040146110aa578063b0c4297c1461111a578063b309c36b14611156578063b32c4d8d14611173576103db565b80639f181b5e116101d95780639f181b5e14611034578063a138e44e1461103c578063a22cb46514611059578063a9c1a20014611087576103db565b8063856516c314610f675780638da5cb5b1461101c5780638f32d59b1461102457806395d89b411461102c576103db565b80632fa438a3116102fa5780636315a84d1161028d57806370a082311161025c57806370a0823114610e62578063715018a614610e885780637962d59b14610e90578063815d9fa014610f4a576103db565b80636315a84d14610de85780636352211e14610e185780636602eaf914610e355780636c0360eb14610e5a576103db565b806342966c68116102c957806342966c6814610d2757806358895f6214610d445780635ac4428214610d6d5780635b65afe914610daf576103db565b80632fa438a314610c105780633751429514610cb15780633af0725614610cd457806342842e0e14610cf1576103db565b806318160ddd1161037257806321f3c4691161034157806321f3c46914610b5f57806323b872dd14610b8f5780632488508714610bc557806324a01da114610bf1576103db565b806318160ddd146106ae5780631e41613c146106c85780631e50739314610af85780631fe25e4f14610b1e576103db565b8063081812fc116103ae578063081812fc146104ec578063095ea7b3146105255780630bbe0ee314610553578063100cdd911461060d576103db565b806301ffc9a7146103e057806302b19cea1461041b57806304f8bcdf1461044e57806306fdde031461046f575b600080fd5b610407600480360360208110156103f657600080fd5b50356001600160e01b0319166115aa565b604080519115158252519081900360200190f35b6104386004803603602081101561043157600080fd5b50356115cd565b6040805160ff9092168252519081900360200190f35b6104076004803603602081101561046457600080fd5b503561ffff166115fe565b610477611613565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b1578181015183820152602001610499565b50505050905090810190601f1680156104de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105096004803603602081101561050257600080fd5b50356116a9565b604080516001600160a01b039092168252519081900360200190f35b6105516004803603604081101561053b57600080fd5b506001600160a01b038135169060200135611744565b005b6105516004803603606081101561056957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561059c57600080fd5b8201836020820111156105ae57600080fd5b803590602001918460208302840111600160201b831117156105cf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118a2945050505050565b6105516004803603602081101561062357600080fd5b810190602081018135600160201b81111561063d57600080fd5b82018360208201111561064f57600080fd5b803590602001918460208302840111600160201b8311171561067057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118da945050505050565b6106b661190e565b60408051918252519081900360200190f35b61055160048036036101008110156106df57600080fd5b810190602081018135600160201b8111156106f957600080fd5b82018360208201111561070b57600080fd5b803590602001918460208302840111600160201b8311171561072c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077b57600080fd5b82018360208201111561078d57600080fd5b803590602001918460208302840111600160201b831117156107ae57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107fd57600080fd5b82018360208201111561080f57600080fd5b803590602001918460208302840111600160201b8311171561083057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561087f57600080fd5b82018360208201111561089157600080fd5b803590602001918460208302840111600160201b831117156108b257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561090157600080fd5b82018360208201111561091357600080fd5b803590602001918460208302840111600160201b8311171561093457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098357600080fd5b82018360208201111561099557600080fd5b803590602001918460208302840111600160201b831117156109b657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0557600080fd5b820183602082011115610a1757600080fd5b803590602001918460208302840111600160201b83111715610a3857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460208302840111600160201b83111715610aba57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611914945050505050565b61055160048036036020811015610b0e57600080fd5b50356001600160a01b0316611d45565b610b4460048036036020811015610b3457600080fd5b50356001600160a01b0316611dae565b6040805165ffffffffffff9092168252519081900360200190f35b61040760048036036040811015610b7557600080fd5b50803561ffff1690602001356001600160a01b0316611dc8565b61055160048036036060811015610ba557600080fd5b506001600160a01b03813581169160208101359091169060400135611de8565b61040760048036036040811015610bdb57600080fd5b506001600160a01b038135169060200135611e4b565b610bf9611e6b565b6040805161ffff9092168252519081900360200190f35b61055160048036036020811015610c2657600080fd5b810190602081018135600160201b811115610c4057600080fd5b820183602082011115610c5257600080fd5b803590602001918460208302840111600160201b83111715610c7357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e71945050505050565b6106b660048036036040811015610cc757600080fd5b5080359060200135612071565b6106b660048036036020811015610cea57600080fd5b50356120ac565b61055160048036036060811015610d0757600080fd5b506001600160a01b038135811691602081013590911690604001356120db565b61055160048036036020811015610d3d57600080fd5b50356120f6565b61055160048036036060811015610d5a57600080fd5b5080359060208101359060400135612155565b610d8a60048036036020811015610d8357600080fd5b50356121bf565b6040805165ffffffffffff909316835261ffff90911660208301528051918290030190f35b6106b660048036036060811015610dc557600080fd5b5080356001600160a01b031690602081013561ffff16906040013560ff166121e7565b61055160048036036040811015610dfe57600080fd5b5080356001600160a01b0316906020013561ffff166123ea565b61050960048036036020811015610e2e57600080fd5b5035612515565b61050960048036036020811015610e4b57600080fd5b503565ffffffffffff1661267f565b61047761269a565b6106b660048036036020811015610e7857600080fd5b50356001600160a01b03166126d3565b6105516126ee565b61055160048036036060811015610ea657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610ed957600080fd5b820183602082011115610eeb57600080fd5b803590602001918460208302840111600160201b83111715610f0c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061277f945050505050565b6106b660048036036020811015610f6057600080fd5b50356127b1565b6106b660048036036060811015610f7d57600080fd5b810190602081018135600160201b811115610f9757600080fd5b820183602082011115610fa957600080fd5b803590602001918460018302840111600160201b83111715610fca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505061ffff83358116945060209093013590921691506127d79050565b610509612ae9565b610407612af8565b610477612b09565b6106b6612b6a565b6106b66004803603602081101561105257600080fd5b5035612b70565b6105516004803603604081101561106f57600080fd5b506001600160a01b0381351690602001351515612b95565b6105516004803603604081101561109d57600080fd5b5080359060200135612c61565b6110c7600480360360208110156110c057600080fd5b5035612cca565b604080519915158a5297151560208a015260ff968716898901529486166060890152928516608088015290841660a0870152831660c0860152821660e08501521661010083015251908190036101200190f35b6105516004803603608081101561113057600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612d3a565b6104076004803603602081101561116c57600080fd5b5035612d5e565b610d8a6004803603602081101561118957600080fd5b5035612d73565b610bf9600480360360208110156111a657600080fd5b5035612d9a565b610551600480360360808110156111c357600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156111fd57600080fd5b82018360208201111561120f57600080fd5b803590602001918460018302840111600160201b8311171561123057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612dcf945050505050565b61128e6004803603602081101561128757600080fd5b5035612e21565b6040805161ffff909316835260ff90911660208301528051918290030190f35b610551600480360360208110156112c457600080fd5b5035612e8b565b6106b6600480360360208110156112e157600080fd5b5035612f9e565b610551600480360360808110156112fe57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612fb0565b6104776004803603602081101561133a57600080fd5b5035612fcd565b6106b66004803603606081101561135757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561138157600080fd5b82018360208201111561139357600080fd5b803590602001918460208302840111600160201b831117156113b457600080fd5b919390929091602081019035600160201b8111156113d157600080fd5b8201836020820111156113e357600080fd5b803590602001918460208302840111600160201b8311171561140457600080fd5b509092509050613127565b6106b66004803603604081101561142557600080fd5b50803590602001356132ed565b6104076004803603602081101561144857600080fd5b503561ffff16613314565b6104076004803603602081101561146957600080fd5b5035613329565b6105516004803603604081101561148657600080fd5b508035906020013560ff166133d3565b610509613515565b6106b6613524565b610551600480360360208110156114bc57600080fd5b503561ffff1661352a565b610407600480360360408110156114dd57600080fd5b506001600160a01b0381358116916020013516613633565b6105516004803603604081101561150b57600080fd5b506001600160a01b038135169060200135613661565b6105516004803603602081101561153757600080fd5b50356001600160a01b0316613835565b610bf96004803603602081101561155d57600080fd5b5035613885565b6106b6613892565b6115896004803603602081101561158257600080fd5b5035613898565b6040805161ffff938416815291909216602082015281519081900390910190f35b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b601581815481106115da57fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b601d6020526000908152604090205460ff1681565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561169f5780601f106116745761010080835404028352916020019161169f565b820191906000526020600020905b81548152906001019060200180831161168257829003601f168201915b5050505050905090565b60006116b4826138c4565b6116ef5760405162461bcd60e51b8152600401808060200182810382526028815260200180614ea16028913960400191505060405180910390fd5b60096000600f848154811061170057fe5b6000918252602080832060058084049091015492066006026101000a90910465ffffffffffff1683528201929092526040019020546001600160a01b031692915050565b600061174f82612515565b9050806001600160a01b0316836001600160a01b031614156117b8576040805162461bcd60e51b815260206004820152601d60248201527f42543a20617070726f76616c20746f2063757272656e74206f776e6572000000604482015290519081900360640190fd5b336001600160a01b03821614806117d457506117d48133613633565b61180f5760405162461bcd60e51b8152600401808060200182810382526034815260200180614fa96034913960400191505060405180910390fd5b611818836138e1565b600f838154811061182557fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555081836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60005b81518110156118d4576118cc84848484815181106118bf57fe5b6020026020010151611de8565b6001016118a5565b50505050565b60005b815181101561190a576119028282815181106118f557fe5b60200260200101516120f6565b6001016118dd565b5050565b600d5490565b61191c612af8565b61195b576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b60005b8851811015611d3a57600089828151811061197557fe5b6020026020010151905060008161ffff16116119d8576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a2070726f746f206d757374206e6f74206265207a65726f00000000604482015290519081900360640190fd5b6119e0614dc5565b60188261ffff16815481106119f157fe5b60009182526020918290206040805161012081018252929091015460ff808216158015855261010080840483161515968601969096526201000083048216938501939093526301000000820481166060850152600160201b820481166080850152650100000000008204811660a0850152600160301b8204811660c0850152600160381b8204811660e0850152600160401b90910416928201929092529150611ad9576040805162461bcd60e51b815260206004820152601560248201527410dbdc994e881c1c9bdd1bc81a5cc81b1bd8dad959605a1b604482015290519081900360640190fd5b6040518061012001604052806000151581526020016001151581526020018b8581518110611b0357fe5b602002602001015160ff1681526020018a8581518110611b1f57fe5b602002602001015160ff168152602001898581518110611b3b57fe5b602002602001015160ff168152602001888581518110611b5757fe5b602002602001015160ff168152602001878581518110611b7357fe5b602002602001015160ff168152602001868581518110611b8f57fe5b602002602001015160ff168152602001858581518110611bab57fe5b602002602001015160ff1681525060188361ffff1681548110611bca57fe5b9060005260206000200160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055509050508161ffff167fe5d944d271f23cc2929e365ddfb8aa53de16aeb0e3c43908c454fc1110ceed7f60405160405180910390a2505060010161195e565b505050505050505050565b611d4d612af8565b611d8c576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205465ffffffffffff1681565b601c60209081526000928352604080842090915290825290205460ff1681565b611df181613329565b611e3b576040805162461bcd60e51b8152602060048201526016602482015275436f72653a206e6f7420796574207472616461626c6560501b604482015290519081900360640190fd5b611e468383836139e8565b505050565b601b60209081526000928352604080842090915290825290205460ff1681565b61fde881565b611e79612af8565b611eb8576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b6000815111611eff576040805162461bcd60e51b815260206004820152600e60248201526d6d757374206c6f636b20736f6d6560901b604482015290519081900360640190fd5b60005b815181101561190a576000828281518110611f1957fe5b6020026020010151905060008161ffff1611611f75576040805162461bcd60e51b815260206004820152601660248201527570726f746f206d757374206e6f74206265207a65726f60501b604482015290519081900360640190fd5b600060188261ffff1681548110611f8857fe5b6000918252602090912001805490915060ff1615611fdf576040805162461bcd60e51b815260206004820152600f60248201526e1c1c9bdd1bc81a5cc81b1bd8dad959608a1b604482015290519081900360640190fd5b8054610100900460ff1661202d576040805162461bcd60e51b815260206004820152601060248201526f1c1c9bdd1bc81b5d5cdd08195e1a5cdd60821b604482015290519081900360640190fd5b805460ff1916600117815560405161ffff8316907fe5d944d271f23cc2929e365ddfb8aa53de16aeb0e3c43908c454fc1110ceed7f90600090a25050600101611f02565b604080516001602080830191909152818301859052606080830185905283518084039091018152608090920190925280519101205b92915050565b604080516000602080830191909152818301939093528151808203830181526060909101909152805191012090565b611e4683838360405180602001604052806000815250612dcf565b6120ff81613329565b612149576040805162461bcd60e51b8152602060048201526016602482015275436f72653a206e6f7420796574207472616461626c6560501b604482015290519081900360640190fd5b61215281613bf5565b50565b6017546001600160a01b031633146121b4576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d7573742062652070726f7065727479206d616e616765720000604482015290519081900360640190fd5b611e46838383613d31565b60009081526010602052604090205465ffffffffffff811691600160301b90910461ffff1690565b60006121f4846001613d90565b90506121ff83613f9d565b826014828154811061220d57fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550816015828154811061224a57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550606060016040519080825280602002602001820160405280156122a1578160200160208202803883390190505b50905083816000815181106122b257fe5b61ffff9092166020928302919091019091015260408051600180825281830190925260609181602001602082028038833901905050905083816000815181106122f757fe5b602002602001019060ff16908160ff1681525050827f9c681932e4a9582af05182ce765050b6b731e429b839bcdf8463177531afdae587848460405180846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561238c578181015183820152602001612374565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156123cb5781810151838201526020016123b3565b505050509050019550505050505060405180910390a250509392505050565b6123f2612af8565b612431576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b61fde861ffff8216101561247b576040805162461bcd60e51b815260206004820152600c60248201526b6e6f742061206d797468696360a01b604482015290519081900360640190fd5b61ffff81166000908152601c602090815260408083206001600160a01b038616845290915290205460ff16156124e25760405162461bcd60e51b815260040180806020018281038252603681526020018061512e6036913960400191505060405180910390fd5b61ffff166000908152601c602090815260408083206001600160a01b03909416835292905220805460ff19166001179055565b600080600e838154811061252557fe5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff1690508065ffffffffffff166000141561265957600061256b846127b1565b9050612575614e11565b5060008181526010602090815260409182902082518084019093525465ffffffffffff81168352600160301b900461ffff1690820181905282018510612602576040805162461bcd60e51b815260206004820152601860248201527f42543a20746f6b656e20646f6573206e6f742065786973740000000000000000604482015290519081900360640190fd5b8051925065ffffffffffff8316612656576040805162461bcd60e51b8152602060048201526013602482015272212a1d103130b2103130ba31b41037bbb732b960691b604482015290519081900360640190fd5b50505b65ffffffffffff166000908152600960205260409020546001600160a01b031692915050565b6009602052600090815260409020546001600160a01b031681565b6040518060400160405280602081526020017f68747470733a2f2f6170692e696d6d757461626c652e636f6d2f61737365742f81525081565b6001600160a01b031660009081526012602052604090205490565b6126f6612af8565b612735576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60005b81518110156118d4576127a9848484848151811061279c57fe5b60200260200101516120db565b600101612782565b600b546000906120a6906127cb848263ffffffff61409a16565b9063ffffffff61410416565b60006127e1612af8565b612820576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b60008361ffff1611612879576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a206d757374206e6f74206265207a65726f2070726f746f00000000604482015290519081900360640190fd5b8261ffff168261ffff16116128d5576040805162461bcd60e51b815260206004820152601b60248201527f436f72653a206d75737420626520612076616c69642072616e67650000000000604482015290519081900360640190fd5b601954158061290857506019805460001981019081106128f157fe5b60009182526020909120015461ffff908116908416115b612959576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a20736561736f6e732063616e6e6f74206f7665726c617000000000604482015290519081900360640190fd5b61ffff821661fde81161299d5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f3a6025913960400191505060405180910390fd5b6040805180820190915261ffff80841682528481166020830181815260198054600181810180845560009390935295517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695909101805493518616620100000263ffff00001992871661ffff1990951694909417919091169290921790915592601692612a3492849290918989039091011685614164565b8361ffff168561ffff168361ffff167f894c7f27fb3eb8728566da10c21ff64cffafe6700bf22074e653fcd20acc8bba896040518080602001828103825283818151815260200191508051906020019080838360005b83811015612aa2578181015183820152602001612a8a565b50505050905090810190601f168015612acf5780820380516001836020036101000a031916815260200191505b509250505060405180910390a45061ffff16949350505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561169f5780601f106116745761010080835404028352916020019161169f565b600d5481565b600060136000612b7f846120ac565b8152602001908152602001600020549050919050565b6001600160a01b038216331415612bf3576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6017546001600160a01b03163314612cc0576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d7573742062652070726f7065727479206d616e616765720000604482015290519081900360640190fd5b61190a82826141a8565b60188181548110612cd757fe5b60009182526020909120015460ff8082169250610100820481169162010000810482169163010000008204811691600160201b8104821691650100000000008204811691600160301b8104821691600160381b8204811691600160401b90041689565b815b81811015612d5757612d4f8585836120db565b600101612d3c565b5050505050565b601a6020526000908152604090205460ff1681565b60106020526000908152604090205465ffffffffffff811690600160301b900461ffff1682565b60168181548110612da757fe5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b612dda848484611de8565b612de684848484614201565b6118d45760405162461bcd60e51b8152600401808060200182810382526032815260200180614e6f6032913960400191505060405180910390fd5b60008060148381548110612e3157fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660158481548110612e6257fe5b90600052602060002090602091828204019190069054906101000a900460ff1691509150915091565b612e93612af8565b612ed2576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b600081118015612ee457506019548111155b612f35576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d75737420626520612063757272656e7420736561736f6e0000604482015290519081900360640190fd5b6000818152601a602052604090205460ff1615612f835760405162461bcd60e51b8152600401808060200182810382526021815260200180614e296021913960400191505060405180910390fd5b6000908152601a60205260409020805460ff19166001179055565b60136020526000908152604090205481565b815b81811015612d5757612fc5858583611de8565b600101612fb2565b60606040518060400160405280602081526020017f68747470733a2f2f6170692e696d6d757461626c652e636f6d2f61737365742f81525061300e30614335565b613017846144db565b6040516020018084805190602001908083835b602083106130495780518252601f19909201916020918201910161302a565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106130915780518252601f199092019160209182019101613072565b6001836020036101000a03801982511681845116808217855250505050505090500180602f60f81b81525060010182805190602001908083835b602083106130ea5780518252601f1990920191602091820191016130cb565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050919050565b60008361317b576040805162461bcd60e51b815260206004820152601960248201527f436f72653a206d75737420626520736f6d652070726f746f7300000000000000604482015290519081900360640190fd5b8382146131b95760405162461bcd60e51b81526004018080602001828103825260318152602001806150096031913960400191505060405180910390fd5b60006131c58786613d90565b90506132358187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525061459f92505050565b807f9c681932e4a9582af05182ce765050b6b731e429b839bcdf8463177531afdae5888888888860405180866001600160a01b03166001600160a01b0316815260200180602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f1916909201829003995090975050505050505050a29695505050505050565b6000601360006132fd8585612071565b815260200190815260200160002054905092915050565b601e6020526000908152604090205460ff1681565b6000806014838154811061333957fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905061fde881106133835761ffff166000908152601d602052604090205460ff1690506115c8565b601a600060168361ffff168154811061339857fe5b60009182526020808320601083040154600f9092166002026101000a90910461ffff16835282019290925260400190205460ff169392505050565b6000601483815481106133e257fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050600060168261ffff168154811061341b57fe5b60009182526020808320601083040154338452601b82526040808520600f9094166002026101000a90910461ffff16808552929091529091205490915060ff166134965760405162461bcd60e51b81526004018080602001828103825260318152602001806150cd6031913960400191505060405180910390fd5b82601585815481106134a457fe5b600091825260209182902082820401805460ff948516601f9093166101000a92830292850219169190911790556040805192861683523391830191909152805186927f892269e637adec3404715b55a46b36fba9383a540f8f5859b364909469fcd04d92908290030190a250505050565b6017546001600160a01b031681565b600c5481565b613532612af8565b613571576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b61fde861ffff821610156135c1576040805162461bcd60e51b8152602060048201526012602482015271436f72653a206e6f742061206d797468696360701b604482015290519081900360640190fd5b61ffff81166000908152601d602052604090205460ff16156136145760405162461bcd60e51b8152600401808060200182810382526022815260200180614f5f6022913960400191505060405180910390fd5b61ffff166000908152601d60205260409020805460ff19166001179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b613669612af8565b6136a8576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b6019548111156136ff576040805162461bcd60e51b815260206004820152601760248201527f436f72653a20736561736f6e206d757374206578697374000000000000000000604482015290519081900360640190fd5b60008111613754576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a20736561736f6e206d757374206e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152601b6020908152604080832084845290915290205460ff16156137b75760405162461bcd60e51b8152600401808060200182810382526026815260200180614eef6026913960400191505060405180910390fd5b6000818152601a602052604090205460ff16156138055760405162461bcd60e51b8152600401808060200182810382526021815260200180614e296021913960400191505060405180910390fd5b6001600160a01b039091166000908152601b6020908152604080832093835292905220805460ff19166001179055565b61383d612af8565b61387c576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b612152816145c2565b60148181548110612da757fe5b600b5481565b601981815481106138a557fe5b60009182526020909120015461ffff8082169250620100009091041682565b6000806138d083612515565b6001600160a01b0316141592915050565b60006001600160a01b0382166138f9575060006115c8565b6001600160a01b0382166000908152600a602052604090205465ffffffffffff16806120a65760115465ffffffffffff908116600181019091161161397d576040805162461bcd60e51b815260206004820152601560248201527442543a206d757374206e6f74206f766572666c6f7760581b604482015290519081900360640190fd5b506011805465ffffffffffff8082166001810190911665ffffffffffff1992831617909255600082815260096020908152604080832080546001600160a01b0389166001600160a01b031990911681179091558352600a909152902080549091168217905592915050565b826001600160a01b03166139fb82612515565b6001600160a01b031614613a405760405162461bcd60e51b8152600401808060200182810382526025815260200180614f156025913960400191505060405180910390fd5b6001600160a01b038216613a9b576040805162461bcd60e51b815260206004820181905260248201527f42543a207472616e7366657220746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613aa53382614662565b613ae05760405162461bcd60e51b81526004018080602001828103825260248152602001806150a96024913960400191505060405180910390fd5b613ae9816146fe565b6001600160a01b038316600090815260126020526040902054613b1390600163ffffffff61478b16565b6001600160a01b038085166000908152601260205260408082209390935590841681522054613b4990600163ffffffff6147e816565b6001600160a01b038316600090815260126020526040902055613b6b826138e1565b600e8281548110613b7857fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613bff3382614662565b613c3a5760405162461bcd60e51b81526004018080602001828103825260248152602001806150a96024913960400191505060405180910390fd5b613c43816146fe565b6000613c4e82612515565b6001600160a01b038116600090815260126020526040902054909150613c7b90600163ffffffff61478b16565b6001600160a01b038216600090815260126020526040812091909155600e805484908110613ca557fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff160217905550613cf26001600d5461478b90919063ffffffff16565b600d5560405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b8060136000613d408686612071565b81526020019081526020016000208190555081837fe437ad402a50c14d9de944e1d68d9708776aaccb860bd49a6e875a64e7d0b22a836040518082815260200191505060405180910390a3505050565b60006001600160a01b038316613de4576040805162461bcd60e51b815260206004820152601460248201527310950e881b5d5cdd081b9bdd081899481b9d5b1b60621b604482015290519081900360640190fd5b60008261ffff16118015613dfe5750600b548261ffff1611155b613e4f576040805162461bcd60e51b815260206004820152601e60248201527f42543a2073697a65206d7573742062652077697468696e206c696d6974730000604482015290519081900360640190fd5b600c546000613e5d856138e1565b60408051808201825265ffffffffffff838116825261ffff888116602080850182815260008a8152601090925295812094518554965165ffffffffffff1990971694169390931767ffff0000000000001916600160301b959092169490940217909155919250613ece9084906147e8565b9050825b81811015613f1a5760405181906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101613ed2565b50600b54600c54613f309163ffffffff6147e816565b600c556001600160a01b038616600090815260126020526040902054613f609061ffff871663ffffffff6147e816565b6001600160a01b038716600090815260126020526040902055600d54613f909061ffff871663ffffffff6147e816565b600d555090949350505050565b61fde861ffff821610613fb857613fb381614842565b612152565b600060168261ffff1681548110613fcb57fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905080614041576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a206d757374206861766520736561736f6e20736574000000000000604482015290519081900360640190fd5b336000908152601b6020908152604080832084845290915290205460ff1661190a5760405162461bcd60e51b815260040180806020018281038252602e81526020018061503a602e913960400191505060405180910390fd5b60008082116140f0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816140fb57fe5b04949350505050565b600082614113575060006120a6565b8282028284828161412057fe5b041461415d5760405162461bcd60e51b81526004018080602001828103825260218152602001806150686021913960400191505060405180910390fd5b9392505050565b60606141738585601086614911565b905060005b8381101561419a5761419282866010848761ffff166149d7565b600101614178565b50612d578585601084614a5f565b60408051828152905183917fa065fb8968d66241513c49df78364990dc9917fcd41ede326cef2c15e82f4aec919081900360200190a280601360006141ec856120ac565b81526020810191909152604001600020555050565b6000614215846001600160a01b0316614abc565b6142215750600161432d565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561429b578181015183820152602001614283565b50505050905090810190601f1680156142c85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156142ea57600080fd5b505af11580156142fe573d6000803e3d6000fd5b505050506040513d602081101561431457600080fd5b50516001600160e01b031916630a85bd0160e11b149150505b949350505050565b60408051602a80825260608281019093526001600160a01b038416918391602082018180388339019050509050600360fc1b8160008151811061437457fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061439d57fe5b60200101906001600160f81b031916908160001a90535060005b60148110156144d3576040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b81525060048483600c01602081106143fa57fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061441a57fe5b602001015160f81c60f81b82826002026002018151811061443757fe5b60200101906001600160f81b031916908160001a9053506040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b8152508382600c016020811061448657fe5b825191901a600f1690811061449757fe5b602001015160f81c60f81b8282600202600301815181106144b457fe5b60200101906001600160f81b031916908160001a9053506001016143b7565b509392505050565b60608161450057506040805180820190915260018152600360fc1b60208201526115c8565b8160005b811561451857600101600a82049150614504565b6060816040519080825280601f01601f191660200182016040528015614545576020820181803883390190505b50859350905060001982015b831561459657600a840660300160f81b8282806001900393508151811061457457fe5b60200101906001600160f81b031916908160001a905350600a84049350614551565b50949350505050565b6145a882614ac2565b60146145b5818585614c97565b6015612d57818685614cf0565b6001600160a01b0381166146075760405162461bcd60e51b8152600401808060200182810382526026815260200180614ec96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061466d826138c4565b6146a85760405162461bcd60e51b815260040180806020018281038252602c815260200180614fdd602c913960400191505060405180910390fd5b60006146b383612515565b9050806001600160a01b0316846001600160a01b031614806146ee5750836001600160a01b03166146e3846116a9565b6001600160a01b0316145b8061432d575061432d8185613633565b600f818154811061470b57fe5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff1665ffffffffffff16600014612152576000600f828154811061475157fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b6000828211156147e2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561415d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61ffff81166000908152601c6020908152604080832033845290915290205460ff1661489f5760405162461bcd60e51b8152600401808060200182810382526028815260200180614f816028913960400191505060405180910390fd5b61ffff81166000908152601e602052604090205460ff16156148f25760405162461bcd60e51b8152600401808060200182810382526025815260200180614e4a6025913960400191505060405180910390fd5b61ffff166000908152601e60205260409020805460ff19166001179055565b60606000614920858585614d48565b90508060405190808252806020026020018201604052801561494c578160200160208202803883390190505b509150600061495b8686614d78565b90506149678782614d8b565b8360008151811061497457fe5b60200260200101818152505060018211156149cd5760006149a461499e888763ffffffff6147e816565b87614d78565b90506149b08882614d8b565b8460018503815181106149bf57fe5b602002602001018181525050505b5050949350505050565b600083610100816149e457fe5b04905060008186816149f257fe5b06905060008285830181614a0257fe5b0490506000868489880181614a1357fe5b0602905060005b87811015614a53578082018187901c60ff16901b8a8481518110614a3a57fe5b6020908102919091010180519091179052600801614a1a565b50505050505050505050565b6000614a7e8361010081614a6f57fe5b8691900463ffffffff61409a16565b905060005b8251811015614ab457614aac86828401858481518110614a9f57fe5b6020026020010151614da1565b600101614a83565b505050505050565b3b151590565b600061ffff815b8351811015614b3a576000848281518110614ae057fe5b6020026020010151905061fde861ffff168161ffff1610614b0957614b0481614842565b614b31565b8361ffff168161ffff161115614b1d578093505b8061ffff168361ffff161115614b31578092505b50600101614ac9565b5061ffff821615611e4657600060168361ffff1681548110614b5857fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905080614bce576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a206d757374206861766520736561736f6e20736574000000000000604482015290519081900360640190fd5b60168261ffff1681548110614bdf57fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff168114614c3e5760405162461bcd60e51b81526004018080602001828103825260308152602001806150fe6030913960400191505060405180910390fd5b336000908152601b6020908152604080832084845290915290205460ff166118d45760405162461bcd60e51b815260040180806020018281038252602e81526020018061503a602e913960400191505060405180910390fd5b6060614ca7848460108551614911565b905060005b8251811015614ce257614cda8285601084878681518110614cc957fe5b602002602001015161ffff166149d7565b600101614cac565b506118d48484601084614a5f565b6060614d00848460208551614911565b905060005b8251811015614d3a57614d328285600884878681518110614d2257fe5b602002602001015160ff166149d7565b600101614d05565b506118d48484600884614a5f565b600080838581614d5457fe5b04905060008484870181614d6457fe5b049050818103600101925050509392505050565b6000818381614d8357fe5b049392505050565b600080614d988484614db6565b54949350505050565b6000614dad8484614db6565b91909155505050565b60405191825260209091200190565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b60408051808201909152600080825260208201529056fe436f72653a20736561736f6e206d757374206e6f74206265207472616461626c65436f72653a206d79746869632068617320616c7265616479206265656e20637265617465644552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657242543a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f72653a207468697320666163746f727920697320616c726561647920617070726f76656442543a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e436f72653a2063616e6e6f7420676f20696e746f206d7974686963207465727269746f7279436f72653a206d757374206e6f74206265207472616461626c6520616c7265616479436f72653a206e6f7420617070726f76656420746f206372656174652074686973206d797468696342543a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f72653a206d757374206265207468652073616d65206e756d626572206f662070726f746f732f7175616c6974696573436f72653a206d75737420626520617070726f76656420666163746f727920666f72207468697320736561736f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242543a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564436f72653a20666163746f72792063616e2774206368616e6765207175616c697479206f66207468697320736561736f6e436f72653a2063616e206f6e6c79206372656174652063617264732066726f6d207468652073616d6520736561736f6e436f72653a207468697320666163746f727920697320616c726561647920617070726f76656420666f722074686973206d7974686963a265627a7a72315820ea03eb4ccb13d3e64897f91580776ef46a46ca0d5b549e9a4bceacaa8b92890264736f6c634300050b003200000000000000000000000000000000000000000000000000000000000004e3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014476f647320556e636861696e656420436172647300000000000000000000000000000000000000000000000000000000000000000000000000000000000000044341524400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103db5760003560e01c8063856516c31161020a578063bd15627311610125578063e7356cb5116100b8578063ef42259b11610087578063ef42259b146114f5578063f2fde38b14611521578063f3beae6b14611547578063f4daaba114611564578063f5d709a11461156c576103db565b8063e7356cb514611496578063e7c51f1b1461149e578063e8c238a1146114a6578063e985e9c5146114c7576103db565b8063cdc2cfe2116100f4578063cdc2cfe21461140f578063e0c931df14611432578063e27aa1d814611453578063e3fb1ac614611470576103db565b8063bd156273146112cb578063c5f4127a146112e8578063c87b56dd14611324578063c8be6b9b14611341576103db565b8063ab17d0401161019d578063b76e8d011161016c578063b76e8d0114611190578063b88d4fde146111ad578063b93a89f714611271578063bc048525146112ae576103db565b8063ab17d040146110aa578063b0c4297c1461111a578063b309c36b14611156578063b32c4d8d14611173576103db565b80639f181b5e116101d95780639f181b5e14611034578063a138e44e1461103c578063a22cb46514611059578063a9c1a20014611087576103db565b8063856516c314610f675780638da5cb5b1461101c5780638f32d59b1461102457806395d89b411461102c576103db565b80632fa438a3116102fa5780636315a84d1161028d57806370a082311161025c57806370a0823114610e62578063715018a614610e885780637962d59b14610e90578063815d9fa014610f4a576103db565b80636315a84d14610de85780636352211e14610e185780636602eaf914610e355780636c0360eb14610e5a576103db565b806342966c68116102c957806342966c6814610d2757806358895f6214610d445780635ac4428214610d6d5780635b65afe914610daf576103db565b80632fa438a314610c105780633751429514610cb15780633af0725614610cd457806342842e0e14610cf1576103db565b806318160ddd1161037257806321f3c4691161034157806321f3c46914610b5f57806323b872dd14610b8f5780632488508714610bc557806324a01da114610bf1576103db565b806318160ddd146106ae5780631e41613c146106c85780631e50739314610af85780631fe25e4f14610b1e576103db565b8063081812fc116103ae578063081812fc146104ec578063095ea7b3146105255780630bbe0ee314610553578063100cdd911461060d576103db565b806301ffc9a7146103e057806302b19cea1461041b57806304f8bcdf1461044e57806306fdde031461046f575b600080fd5b610407600480360360208110156103f657600080fd5b50356001600160e01b0319166115aa565b604080519115158252519081900360200190f35b6104386004803603602081101561043157600080fd5b50356115cd565b6040805160ff9092168252519081900360200190f35b6104076004803603602081101561046457600080fd5b503561ffff166115fe565b610477611613565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104b1578181015183820152602001610499565b50505050905090810190601f1680156104de5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105096004803603602081101561050257600080fd5b50356116a9565b604080516001600160a01b039092168252519081900360200190f35b6105516004803603604081101561053b57600080fd5b506001600160a01b038135169060200135611744565b005b6105516004803603606081101561056957600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561059c57600080fd5b8201836020820111156105ae57600080fd5b803590602001918460208302840111600160201b831117156105cf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118a2945050505050565b6105516004803603602081101561062357600080fd5b810190602081018135600160201b81111561063d57600080fd5b82018360208201111561064f57600080fd5b803590602001918460208302840111600160201b8311171561067057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506118da945050505050565b6106b661190e565b60408051918252519081900360200190f35b61055160048036036101008110156106df57600080fd5b810190602081018135600160201b8111156106f957600080fd5b82018360208201111561070b57600080fd5b803590602001918460208302840111600160201b8311171561072c57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561077b57600080fd5b82018360208201111561078d57600080fd5b803590602001918460208302840111600160201b831117156107ae57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156107fd57600080fd5b82018360208201111561080f57600080fd5b803590602001918460208302840111600160201b8311171561083057600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561087f57600080fd5b82018360208201111561089157600080fd5b803590602001918460208302840111600160201b831117156108b257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561090157600080fd5b82018360208201111561091357600080fd5b803590602001918460208302840111600160201b8311171561093457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561098357600080fd5b82018360208201111561099557600080fd5b803590602001918460208302840111600160201b831117156109b657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a0557600080fd5b820183602082011115610a1757600080fd5b803590602001918460208302840111600160201b83111715610a3857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460208302840111600160201b83111715610aba57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611914945050505050565b61055160048036036020811015610b0e57600080fd5b50356001600160a01b0316611d45565b610b4460048036036020811015610b3457600080fd5b50356001600160a01b0316611dae565b6040805165ffffffffffff9092168252519081900360200190f35b61040760048036036040811015610b7557600080fd5b50803561ffff1690602001356001600160a01b0316611dc8565b61055160048036036060811015610ba557600080fd5b506001600160a01b03813581169160208101359091169060400135611de8565b61040760048036036040811015610bdb57600080fd5b506001600160a01b038135169060200135611e4b565b610bf9611e6b565b6040805161ffff9092168252519081900360200190f35b61055160048036036020811015610c2657600080fd5b810190602081018135600160201b811115610c4057600080fd5b820183602082011115610c5257600080fd5b803590602001918460208302840111600160201b83111715610c7357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e71945050505050565b6106b660048036036040811015610cc757600080fd5b5080359060200135612071565b6106b660048036036020811015610cea57600080fd5b50356120ac565b61055160048036036060811015610d0757600080fd5b506001600160a01b038135811691602081013590911690604001356120db565b61055160048036036020811015610d3d57600080fd5b50356120f6565b61055160048036036060811015610d5a57600080fd5b5080359060208101359060400135612155565b610d8a60048036036020811015610d8357600080fd5b50356121bf565b6040805165ffffffffffff909316835261ffff90911660208301528051918290030190f35b6106b660048036036060811015610dc557600080fd5b5080356001600160a01b031690602081013561ffff16906040013560ff166121e7565b61055160048036036040811015610dfe57600080fd5b5080356001600160a01b0316906020013561ffff166123ea565b61050960048036036020811015610e2e57600080fd5b5035612515565b61050960048036036020811015610e4b57600080fd5b503565ffffffffffff1661267f565b61047761269a565b6106b660048036036020811015610e7857600080fd5b50356001600160a01b03166126d3565b6105516126ee565b61055160048036036060811015610ea657600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b811115610ed957600080fd5b820183602082011115610eeb57600080fd5b803590602001918460208302840111600160201b83111715610f0c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061277f945050505050565b6106b660048036036020811015610f6057600080fd5b50356127b1565b6106b660048036036060811015610f7d57600080fd5b810190602081018135600160201b811115610f9757600080fd5b820183602082011115610fa957600080fd5b803590602001918460018302840111600160201b83111715610fca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505061ffff83358116945060209093013590921691506127d79050565b610509612ae9565b610407612af8565b610477612b09565b6106b6612b6a565b6106b66004803603602081101561105257600080fd5b5035612b70565b6105516004803603604081101561106f57600080fd5b506001600160a01b0381351690602001351515612b95565b6105516004803603604081101561109d57600080fd5b5080359060200135612c61565b6110c7600480360360208110156110c057600080fd5b5035612cca565b604080519915158a5297151560208a015260ff968716898901529486166060890152928516608088015290841660a0870152831660c0860152821660e08501521661010083015251908190036101200190f35b6105516004803603608081101561113057600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612d3a565b6104076004803603602081101561116c57600080fd5b5035612d5e565b610d8a6004803603602081101561118957600080fd5b5035612d73565b610bf9600480360360208110156111a657600080fd5b5035612d9a565b610551600480360360808110156111c357600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156111fd57600080fd5b82018360208201111561120f57600080fd5b803590602001918460018302840111600160201b8311171561123057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612dcf945050505050565b61128e6004803603602081101561128757600080fd5b5035612e21565b6040805161ffff909316835260ff90911660208301528051918290030190f35b610551600480360360208110156112c457600080fd5b5035612e8b565b6106b6600480360360208110156112e157600080fd5b5035612f9e565b610551600480360360808110156112fe57600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135612fb0565b6104776004803603602081101561133a57600080fd5b5035612fcd565b6106b66004803603606081101561135757600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561138157600080fd5b82018360208201111561139357600080fd5b803590602001918460208302840111600160201b831117156113b457600080fd5b919390929091602081019035600160201b8111156113d157600080fd5b8201836020820111156113e357600080fd5b803590602001918460208302840111600160201b8311171561140457600080fd5b509092509050613127565b6106b66004803603604081101561142557600080fd5b50803590602001356132ed565b6104076004803603602081101561144857600080fd5b503561ffff16613314565b6104076004803603602081101561146957600080fd5b5035613329565b6105516004803603604081101561148657600080fd5b508035906020013560ff166133d3565b610509613515565b6106b6613524565b610551600480360360208110156114bc57600080fd5b503561ffff1661352a565b610407600480360360408110156114dd57600080fd5b506001600160a01b0381358116916020013516613633565b6105516004803603604081101561150b57600080fd5b506001600160a01b038135169060200135613661565b6105516004803603602081101561153757600080fd5b50356001600160a01b0316613835565b610bf96004803603602081101561155d57600080fd5b5035613885565b6106b6613892565b6115896004803603602081101561158257600080fd5b5035613898565b6040805161ffff938416815291909216602082015281519081900390910190f35b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b601581815481106115da57fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b601d6020526000908152604090205460ff1681565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561169f5780601f106116745761010080835404028352916020019161169f565b820191906000526020600020905b81548152906001019060200180831161168257829003601f168201915b5050505050905090565b60006116b4826138c4565b6116ef5760405162461bcd60e51b8152600401808060200182810382526028815260200180614ea16028913960400191505060405180910390fd5b60096000600f848154811061170057fe5b6000918252602080832060058084049091015492066006026101000a90910465ffffffffffff1683528201929092526040019020546001600160a01b031692915050565b600061174f82612515565b9050806001600160a01b0316836001600160a01b031614156117b8576040805162461bcd60e51b815260206004820152601d60248201527f42543a20617070726f76616c20746f2063757272656e74206f776e6572000000604482015290519081900360640190fd5b336001600160a01b03821614806117d457506117d48133613633565b61180f5760405162461bcd60e51b8152600401808060200182810382526034815260200180614fa96034913960400191505060405180910390fd5b611818836138e1565b600f838154811061182557fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555081836001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60005b81518110156118d4576118cc84848484815181106118bf57fe5b6020026020010151611de8565b6001016118a5565b50505050565b60005b815181101561190a576119028282815181106118f557fe5b60200260200101516120f6565b6001016118dd565b5050565b600d5490565b61191c612af8565b61195b576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b60005b8851811015611d3a57600089828151811061197557fe5b6020026020010151905060008161ffff16116119d8576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a2070726f746f206d757374206e6f74206265207a65726f00000000604482015290519081900360640190fd5b6119e0614dc5565b60188261ffff16815481106119f157fe5b60009182526020918290206040805161012081018252929091015460ff808216158015855261010080840483161515968601969096526201000083048216938501939093526301000000820481166060850152600160201b820481166080850152650100000000008204811660a0850152600160301b8204811660c0850152600160381b8204811660e0850152600160401b90910416928201929092529150611ad9576040805162461bcd60e51b815260206004820152601560248201527410dbdc994e881c1c9bdd1bc81a5cc81b1bd8dad959605a1b604482015290519081900360640190fd5b6040518061012001604052806000151581526020016001151581526020018b8581518110611b0357fe5b602002602001015160ff1681526020018a8581518110611b1f57fe5b602002602001015160ff168152602001898581518110611b3b57fe5b602002602001015160ff168152602001888581518110611b5757fe5b602002602001015160ff168152602001878581518110611b7357fe5b602002602001015160ff168152602001868581518110611b8f57fe5b602002602001015160ff168152602001858581518110611bab57fe5b602002602001015160ff1681525060188361ffff1681548110611bca57fe5b9060005260206000200160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff02191690831515021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055509050508161ffff167fe5d944d271f23cc2929e365ddfb8aa53de16aeb0e3c43908c454fc1110ceed7f60405160405180910390a2505060010161195e565b505050505050505050565b611d4d612af8565b611d8c576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b600a6020526000908152604090205465ffffffffffff1681565b601c60209081526000928352604080842090915290825290205460ff1681565b611df181613329565b611e3b576040805162461bcd60e51b8152602060048201526016602482015275436f72653a206e6f7420796574207472616461626c6560501b604482015290519081900360640190fd5b611e468383836139e8565b505050565b601b60209081526000928352604080842090915290825290205460ff1681565b61fde881565b611e79612af8565b611eb8576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b6000815111611eff576040805162461bcd60e51b815260206004820152600e60248201526d6d757374206c6f636b20736f6d6560901b604482015290519081900360640190fd5b60005b815181101561190a576000828281518110611f1957fe5b6020026020010151905060008161ffff1611611f75576040805162461bcd60e51b815260206004820152601660248201527570726f746f206d757374206e6f74206265207a65726f60501b604482015290519081900360640190fd5b600060188261ffff1681548110611f8857fe5b6000918252602090912001805490915060ff1615611fdf576040805162461bcd60e51b815260206004820152600f60248201526e1c1c9bdd1bc81a5cc81b1bd8dad959608a1b604482015290519081900360640190fd5b8054610100900460ff1661202d576040805162461bcd60e51b815260206004820152601060248201526f1c1c9bdd1bc81b5d5cdd08195e1a5cdd60821b604482015290519081900360640190fd5b805460ff1916600117815560405161ffff8316907fe5d944d271f23cc2929e365ddfb8aa53de16aeb0e3c43908c454fc1110ceed7f90600090a25050600101611f02565b604080516001602080830191909152818301859052606080830185905283518084039091018152608090920190925280519101205b92915050565b604080516000602080830191909152818301939093528151808203830181526060909101909152805191012090565b611e4683838360405180602001604052806000815250612dcf565b6120ff81613329565b612149576040805162461bcd60e51b8152602060048201526016602482015275436f72653a206e6f7420796574207472616461626c6560501b604482015290519081900360640190fd5b61215281613bf5565b50565b6017546001600160a01b031633146121b4576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d7573742062652070726f7065727479206d616e616765720000604482015290519081900360640190fd5b611e46838383613d31565b60009081526010602052604090205465ffffffffffff811691600160301b90910461ffff1690565b60006121f4846001613d90565b90506121ff83613f9d565b826014828154811061220d57fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff160217905550816015828154811061224a57fe5b90600052602060002090602091828204019190066101000a81548160ff021916908360ff160217905550606060016040519080825280602002602001820160405280156122a1578160200160208202803883390190505b50905083816000815181106122b257fe5b61ffff9092166020928302919091019091015260408051600180825281830190925260609181602001602082028038833901905050905083816000815181106122f757fe5b602002602001019060ff16908160ff1681525050827f9c681932e4a9582af05182ce765050b6b731e429b839bcdf8463177531afdae587848460405180846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561238c578181015183820152602001612374565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156123cb5781810151838201526020016123b3565b505050509050019550505050505060405180910390a250509392505050565b6123f2612af8565b612431576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b61fde861ffff8216101561247b576040805162461bcd60e51b815260206004820152600c60248201526b6e6f742061206d797468696360a01b604482015290519081900360640190fd5b61ffff81166000908152601c602090815260408083206001600160a01b038616845290915290205460ff16156124e25760405162461bcd60e51b815260040180806020018281038252603681526020018061512e6036913960400191505060405180910390fd5b61ffff166000908152601c602090815260408083206001600160a01b03909416835292905220805460ff19166001179055565b600080600e838154811061252557fe5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff1690508065ffffffffffff166000141561265957600061256b846127b1565b9050612575614e11565b5060008181526010602090815260409182902082518084019093525465ffffffffffff81168352600160301b900461ffff1690820181905282018510612602576040805162461bcd60e51b815260206004820152601860248201527f42543a20746f6b656e20646f6573206e6f742065786973740000000000000000604482015290519081900360640190fd5b8051925065ffffffffffff8316612656576040805162461bcd60e51b8152602060048201526013602482015272212a1d103130b2103130ba31b41037bbb732b960691b604482015290519081900360640190fd5b50505b65ffffffffffff166000908152600960205260409020546001600160a01b031692915050565b6009602052600090815260409020546001600160a01b031681565b6040518060400160405280602081526020017f68747470733a2f2f6170692e696d6d757461626c652e636f6d2f61737365742f81525081565b6001600160a01b031660009081526012602052604090205490565b6126f6612af8565b612735576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60005b81518110156118d4576127a9848484848151811061279c57fe5b60200260200101516120db565b600101612782565b600b546000906120a6906127cb848263ffffffff61409a16565b9063ffffffff61410416565b60006127e1612af8565b612820576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b60008361ffff1611612879576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a206d757374206e6f74206265207a65726f2070726f746f00000000604482015290519081900360640190fd5b8261ffff168261ffff16116128d5576040805162461bcd60e51b815260206004820152601b60248201527f436f72653a206d75737420626520612076616c69642072616e67650000000000604482015290519081900360640190fd5b601954158061290857506019805460001981019081106128f157fe5b60009182526020909120015461ffff908116908416115b612959576040805162461bcd60e51b815260206004820152601c60248201527f436f72653a20736561736f6e732063616e6e6f74206f7665726c617000000000604482015290519081900360640190fd5b61ffff821661fde81161299d5760405162461bcd60e51b8152600401808060200182810382526025815260200180614f3a6025913960400191505060405180910390fd5b6040805180820190915261ffff80841682528481166020830181815260198054600181810180845560009390935295517f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c9695909101805493518616620100000263ffff00001992871661ffff1990951694909417919091169290921790915592601692612a3492849290918989039091011685614164565b8361ffff168561ffff168361ffff167f894c7f27fb3eb8728566da10c21ff64cffafe6700bf22074e653fcd20acc8bba896040518080602001828103825283818151815260200191508051906020019080838360005b83811015612aa2578181015183820152602001612a8a565b50505050905090810190601f168015612acf5780820380516001836020036101000a031916815260200191505b509250505060405180910390a45061ffff16949350505050565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561169f5780601f106116745761010080835404028352916020019161169f565b600d5481565b600060136000612b7f846120ac565b8152602001908152602001600020549050919050565b6001600160a01b038216331415612bf3576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6017546001600160a01b03163314612cc0576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d7573742062652070726f7065727479206d616e616765720000604482015290519081900360640190fd5b61190a82826141a8565b60188181548110612cd757fe5b60009182526020909120015460ff8082169250610100820481169162010000810482169163010000008204811691600160201b8104821691650100000000008204811691600160301b8104821691600160381b8204811691600160401b90041689565b815b81811015612d5757612d4f8585836120db565b600101612d3c565b5050505050565b601a6020526000908152604090205460ff1681565b60106020526000908152604090205465ffffffffffff811690600160301b900461ffff1682565b60168181548110612da757fe5b9060005260206000209060109182820401919006600202915054906101000a900461ffff1681565b612dda848484611de8565b612de684848484614201565b6118d45760405162461bcd60e51b8152600401808060200182810382526032815260200180614e6f6032913960400191505060405180910390fd5b60008060148381548110612e3157fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660158481548110612e6257fe5b90600052602060002090602091828204019190069054906101000a900460ff1691509150915091565b612e93612af8565b612ed2576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b600081118015612ee457506019548111155b612f35576040805162461bcd60e51b815260206004820152601e60248201527f436f72653a206d75737420626520612063757272656e7420736561736f6e0000604482015290519081900360640190fd5b6000818152601a602052604090205460ff1615612f835760405162461bcd60e51b8152600401808060200182810382526021815260200180614e296021913960400191505060405180910390fd5b6000908152601a60205260409020805460ff19166001179055565b60136020526000908152604090205481565b815b81811015612d5757612fc5858583611de8565b600101612fb2565b60606040518060400160405280602081526020017f68747470733a2f2f6170692e696d6d757461626c652e636f6d2f61737365742f81525061300e30614335565b613017846144db565b6040516020018084805190602001908083835b602083106130495780518252601f19909201916020918201910161302a565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b602083106130915780518252601f199092019160209182019101613072565b6001836020036101000a03801982511681845116808217855250505050505090500180602f60f81b81525060010182805190602001908083835b602083106130ea5780518252601f1990920191602091820191016130cb565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050919050565b60008361317b576040805162461bcd60e51b815260206004820152601960248201527f436f72653a206d75737420626520736f6d652070726f746f7300000000000000604482015290519081900360640190fd5b8382146131b95760405162461bcd60e51b81526004018080602001828103825260318152602001806150096031913960400191505060405180910390fd5b60006131c58786613d90565b90506132358187878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525061459f92505050565b807f9c681932e4a9582af05182ce765050b6b731e429b839bcdf8463177531afdae5888888888860405180866001600160a01b03166001600160a01b0316815260200180602001806020018381038352878782818152602001925060200280828437600083820152601f01601f19169091018481038352858152602090810191508690860280828437600083820152604051601f909101601f1916909201829003995090975050505050505050a29695505050505050565b6000601360006132fd8585612071565b815260200190815260200160002054905092915050565b601e6020526000908152604090205460ff1681565b6000806014838154811061333957fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905061fde881106133835761ffff166000908152601d602052604090205460ff1690506115c8565b601a600060168361ffff168154811061339857fe5b60009182526020808320601083040154600f9092166002026101000a90910461ffff16835282019290925260400190205460ff169392505050565b6000601483815481106133e257fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050600060168261ffff168154811061341b57fe5b60009182526020808320601083040154338452601b82526040808520600f9094166002026101000a90910461ffff16808552929091529091205490915060ff166134965760405162461bcd60e51b81526004018080602001828103825260318152602001806150cd6031913960400191505060405180910390fd5b82601585815481106134a457fe5b600091825260209182902082820401805460ff948516601f9093166101000a92830292850219169190911790556040805192861683523391830191909152805186927f892269e637adec3404715b55a46b36fba9383a540f8f5859b364909469fcd04d92908290030190a250505050565b6017546001600160a01b031681565b600c5481565b613532612af8565b613571576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b61fde861ffff821610156135c1576040805162461bcd60e51b8152602060048201526012602482015271436f72653a206e6f742061206d797468696360701b604482015290519081900360640190fd5b61ffff81166000908152601d602052604090205460ff16156136145760405162461bcd60e51b8152600401808060200182810382526022815260200180614f5f6022913960400191505060405180910390fd5b61ffff166000908152601d60205260409020805460ff19166001179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b613669612af8565b6136a8576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b6019548111156136ff576040805162461bcd60e51b815260206004820152601760248201527f436f72653a20736561736f6e206d757374206578697374000000000000000000604482015290519081900360640190fd5b60008111613754576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a20736561736f6e206d757374206e6f742062652030000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152601b6020908152604080832084845290915290205460ff16156137b75760405162461bcd60e51b8152600401808060200182810382526026815260200180614eef6026913960400191505060405180910390fd5b6000818152601a602052604090205460ff16156138055760405162461bcd60e51b8152600401808060200182810382526021815260200180614e296021913960400191505060405180910390fd5b6001600160a01b039091166000908152601b6020908152604080832093835292905220805460ff19166001179055565b61383d612af8565b61387c576040805162461bcd60e51b81526020600482018190526024820152600080516020615089833981519152604482015290519081900360640190fd5b612152816145c2565b60148181548110612da757fe5b600b5481565b601981815481106138a557fe5b60009182526020909120015461ffff8082169250620100009091041682565b6000806138d083612515565b6001600160a01b0316141592915050565b60006001600160a01b0382166138f9575060006115c8565b6001600160a01b0382166000908152600a602052604090205465ffffffffffff16806120a65760115465ffffffffffff908116600181019091161161397d576040805162461bcd60e51b815260206004820152601560248201527442543a206d757374206e6f74206f766572666c6f7760581b604482015290519081900360640190fd5b506011805465ffffffffffff8082166001810190911665ffffffffffff1992831617909255600082815260096020908152604080832080546001600160a01b0389166001600160a01b031990911681179091558352600a909152902080549091168217905592915050565b826001600160a01b03166139fb82612515565b6001600160a01b031614613a405760405162461bcd60e51b8152600401808060200182810382526025815260200180614f156025913960400191505060405180910390fd5b6001600160a01b038216613a9b576040805162461bcd60e51b815260206004820181905260248201527f42543a207472616e7366657220746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b613aa53382614662565b613ae05760405162461bcd60e51b81526004018080602001828103825260248152602001806150a96024913960400191505060405180910390fd5b613ae9816146fe565b6001600160a01b038316600090815260126020526040902054613b1390600163ffffffff61478b16565b6001600160a01b038085166000908152601260205260408082209390935590841681522054613b4990600163ffffffff6147e816565b6001600160a01b038316600090815260126020526040902055613b6b826138e1565b600e8281548110613b7857fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b613bff3382614662565b613c3a5760405162461bcd60e51b81526004018080602001828103825260248152602001806150a96024913960400191505060405180910390fd5b613c43816146fe565b6000613c4e82612515565b6001600160a01b038116600090815260126020526040902054909150613c7b90600163ffffffff61478b16565b6001600160a01b038216600090815260126020526040812091909155600e805484908110613ca557fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff160217905550613cf26001600d5461478b90919063ffffffff16565b600d5560405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b8060136000613d408686612071565b81526020019081526020016000208190555081837fe437ad402a50c14d9de944e1d68d9708776aaccb860bd49a6e875a64e7d0b22a836040518082815260200191505060405180910390a3505050565b60006001600160a01b038316613de4576040805162461bcd60e51b815260206004820152601460248201527310950e881b5d5cdd081b9bdd081899481b9d5b1b60621b604482015290519081900360640190fd5b60008261ffff16118015613dfe5750600b548261ffff1611155b613e4f576040805162461bcd60e51b815260206004820152601e60248201527f42543a2073697a65206d7573742062652077697468696e206c696d6974730000604482015290519081900360640190fd5b600c546000613e5d856138e1565b60408051808201825265ffffffffffff838116825261ffff888116602080850182815260008a8152601090925295812094518554965165ffffffffffff1990971694169390931767ffff0000000000001916600160301b959092169490940217909155919250613ece9084906147e8565b9050825b81811015613f1a5760405181906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101613ed2565b50600b54600c54613f309163ffffffff6147e816565b600c556001600160a01b038616600090815260126020526040902054613f609061ffff871663ffffffff6147e816565b6001600160a01b038716600090815260126020526040902055600d54613f909061ffff871663ffffffff6147e816565b600d555090949350505050565b61fde861ffff821610613fb857613fb381614842565b612152565b600060168261ffff1681548110613fcb57fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905080614041576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a206d757374206861766520736561736f6e20736574000000000000604482015290519081900360640190fd5b336000908152601b6020908152604080832084845290915290205460ff1661190a5760405162461bcd60e51b815260040180806020018281038252602e81526020018061503a602e913960400191505060405180910390fd5b60008082116140f0576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816140fb57fe5b04949350505050565b600082614113575060006120a6565b8282028284828161412057fe5b041461415d5760405162461bcd60e51b81526004018080602001828103825260218152602001806150686021913960400191505060405180910390fd5b9392505050565b60606141738585601086614911565b905060005b8381101561419a5761419282866010848761ffff166149d7565b600101614178565b50612d578585601084614a5f565b60408051828152905183917fa065fb8968d66241513c49df78364990dc9917fcd41ede326cef2c15e82f4aec919081900360200190a280601360006141ec856120ac565b81526020810191909152604001600020555050565b6000614215846001600160a01b0316614abc565b6142215750600161432d565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561429b578181015183820152602001614283565b50505050905090810190601f1680156142c85780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156142ea57600080fd5b505af11580156142fe573d6000803e3d6000fd5b505050506040513d602081101561431457600080fd5b50516001600160e01b031916630a85bd0160e11b149150505b949350505050565b60408051602a80825260608281019093526001600160a01b038416918391602082018180388339019050509050600360fc1b8160008151811061437457fe5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061439d57fe5b60200101906001600160f81b031916908160001a90535060005b60148110156144d3576040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b81525060048483600c01602081106143fa57fe5b1a60f81b6001600160f81b031916901c60f81c60ff168151811061441a57fe5b602001015160f81c60f81b82826002026002018151811061443757fe5b60200101906001600160f81b031916908160001a9053506040518060400160405280601081526020016f181899199a1a9b1b9c1cb0b131b232b360811b8152508382600c016020811061448657fe5b825191901a600f1690811061449757fe5b602001015160f81c60f81b8282600202600301815181106144b457fe5b60200101906001600160f81b031916908160001a9053506001016143b7565b509392505050565b60608161450057506040805180820190915260018152600360fc1b60208201526115c8565b8160005b811561451857600101600a82049150614504565b6060816040519080825280601f01601f191660200182016040528015614545576020820181803883390190505b50859350905060001982015b831561459657600a840660300160f81b8282806001900393508151811061457457fe5b60200101906001600160f81b031916908160001a905350600a84049350614551565b50949350505050565b6145a882614ac2565b60146145b5818585614c97565b6015612d57818685614cf0565b6001600160a01b0381166146075760405162461bcd60e51b8152600401808060200182810382526026815260200180614ec96026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061466d826138c4565b6146a85760405162461bcd60e51b815260040180806020018281038252602c815260200180614fdd602c913960400191505060405180910390fd5b60006146b383612515565b9050806001600160a01b0316846001600160a01b031614806146ee5750836001600160a01b03166146e3846116a9565b6001600160a01b0316145b8061432d575061432d8185613633565b600f818154811061470b57fe5b90600052602060002090600591828204019190066006029054906101000a900465ffffffffffff1665ffffffffffff16600014612152576000600f828154811061475157fe5b90600052602060002090600591828204019190066006026101000a81548165ffffffffffff021916908365ffffffffffff16021790555050565b6000828211156147e2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561415d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b61ffff81166000908152601c6020908152604080832033845290915290205460ff1661489f5760405162461bcd60e51b8152600401808060200182810382526028815260200180614f816028913960400191505060405180910390fd5b61ffff81166000908152601e602052604090205460ff16156148f25760405162461bcd60e51b8152600401808060200182810382526025815260200180614e4a6025913960400191505060405180910390fd5b61ffff166000908152601e60205260409020805460ff19166001179055565b60606000614920858585614d48565b90508060405190808252806020026020018201604052801561494c578160200160208202803883390190505b509150600061495b8686614d78565b90506149678782614d8b565b8360008151811061497457fe5b60200260200101818152505060018211156149cd5760006149a461499e888763ffffffff6147e816565b87614d78565b90506149b08882614d8b565b8460018503815181106149bf57fe5b602002602001018181525050505b5050949350505050565b600083610100816149e457fe5b04905060008186816149f257fe5b06905060008285830181614a0257fe5b0490506000868489880181614a1357fe5b0602905060005b87811015614a53578082018187901c60ff16901b8a8481518110614a3a57fe5b6020908102919091010180519091179052600801614a1a565b50505050505050505050565b6000614a7e8361010081614a6f57fe5b8691900463ffffffff61409a16565b905060005b8251811015614ab457614aac86828401858481518110614a9f57fe5b6020026020010151614da1565b600101614a83565b505050505050565b3b151590565b600061ffff815b8351811015614b3a576000848281518110614ae057fe5b6020026020010151905061fde861ffff168161ffff1610614b0957614b0481614842565b614b31565b8361ffff168161ffff161115614b1d578093505b8061ffff168361ffff161115614b31578092505b50600101614ac9565b5061ffff821615611e4657600060168361ffff1681548110614b5857fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff16905080614bce576040805162461bcd60e51b815260206004820152601a60248201527f436f72653a206d757374206861766520736561736f6e20736574000000000000604482015290519081900360640190fd5b60168261ffff1681548110614bdf57fe5b60009182526020909120601082040154600f9091166002026101000a900461ffff168114614c3e5760405162461bcd60e51b81526004018080602001828103825260308152602001806150fe6030913960400191505060405180910390fd5b336000908152601b6020908152604080832084845290915290205460ff166118d45760405162461bcd60e51b815260040180806020018281038252602e81526020018061503a602e913960400191505060405180910390fd5b6060614ca7848460108551614911565b905060005b8251811015614ce257614cda8285601084878681518110614cc957fe5b602002602001015161ffff166149d7565b600101614cac565b506118d48484601084614a5f565b6060614d00848460208551614911565b905060005b8251811015614d3a57614d328285600884878681518110614d2257fe5b602002602001015160ff166149d7565b600101614d05565b506118d48484600884614a5f565b600080838581614d5457fe5b04905060008484870181614d6457fe5b049050818103600101925050509392505050565b6000818381614d8357fe5b049392505050565b600080614d988484614db6565b54949350505050565b6000614dad8484614db6565b91909155505050565b60405191825260209091200190565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b60408051808201909152600080825260208201529056fe436f72653a20736561736f6e206d757374206e6f74206265207472616461626c65436f72653a206d79746869632068617320616c7265616479206265656e20637265617465644552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657242543a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373436f72653a207468697320666163746f727920697320616c726561647920617070726f76656442543a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e436f72653a2063616e6e6f7420676f20696e746f206d7974686963207465727269746f7279436f72653a206d757374206e6f74206265207472616461626c6520616c7265616479436f72653a206e6f7420617070726f76656420746f206372656174652074686973206d797468696342543a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e436f72653a206d757374206265207468652073616d65206e756d626572206f662070726f746f732f7175616c6974696573436f72653a206d75737420626520617070726f76656420666163746f727920666f72207468697320736561736f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657242543a2063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564436f72653a20666163746f72792063616e2774206368616e6765207175616c697479206f66207468697320736561736f6e436f72653a2063616e206f6e6c79206372656174652063617264732066726f6d207468652073616d6520736561736f6e436f72653a207468697320666163746f727920697320616c726561647920617070726f76656420666f722074686973206d7974686963a265627a7a72315820ea03eb4ccb13d3e64897f91580776ef46a46ca0d5b549e9a4bceacaa8b92890264736f6c634300050b0032

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

00000000000000000000000000000000000000000000000000000000000004e3000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014476f647320556e636861696e656420436172647300000000000000000000000000000000000000000000000000000000000000000000000000000000000000044341524400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _batchSize (uint256): 1251
Arg [1] : _name (string): Gods Unchained Cards
Arg [2] : _symbol (string): CARD

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000004e3
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [4] : 476f647320556e636861696e6564204361726473000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4341524400000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43943:12845:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43943:12845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20008:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20008:135:0;-1:-1:-1;;;;;;20008:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;44127:28;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44127:28:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;45599:45;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45599:45:0;;;;:::i;35296:85::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;35296:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43327:282;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43327:282:0;;:::i;:::-;;;;-1:-1:-1;;;;;43327:282:0;;;;;;;;;;;;;;42686:474;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;42686:474:0;;;;;;;;:::i;:::-;;37294:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;37294:256:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37294:256:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37294:256:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37294:256:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37294:256:0;;-1:-1:-1;37294:256:0;;-1:-1:-1;;;;;37294:256:0:i;49953:159::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;49953:159:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;49953:159:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;49953:159:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;49953:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;49953:159:0;;-1:-1:-1;49953:159:0;;-1:-1:-1;;;;;49953:159:0:i;43617:118::-;;;:::i;:::-;;;;;;;;;;;;;;;;51369:1100;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;51369:1100:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;;;;;;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;51369:1100:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;51369:1100:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;51369:1100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51369:1100:0;;-1:-1:-1;51369:1100:0;;-1:-1:-1;;;;;51369:1100:0:i;56181:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56181:108:0;-1:-1:-1;;;;;56181:108:0;;:::i;38308:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38308:49:0;-1:-1:-1;;;;;38308:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;45488:65;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45488:65:0;;;;;;;;-1:-1:-1;;;;;45488:65:0;;:::i;49474:280::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;49474:280:0;;;;;;;;;;;;;;;;;:::i;45344:67::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45344:67:0;;;;;;;;:::i;45749:47::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52477:697;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;52477:697:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;52477:697:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;52477:697:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;52477:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;52477:697:0;;-1:-1:-1;52477:697:0;;-1:-1:-1;;;;;52477:697:0:i;7046:260::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7046:260:0;;;;;;;:::i;7314:211::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7314:211:0;;:::i;28465:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;28465:134:0;;;;;;;;;;;;;;;;;:::i;49762:183::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49762:183:0;;:::i;56297:243::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56297:243:0;;;;;;;;;;;;:::i;40503:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40503:152:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;46419:505;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46419:505:0;;-1:-1:-1;;;;;46419:505:0;;;;;;;;;;;;;;;:::i;48237:437::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48237:437:0;;-1:-1:-1;;;;;48237:437:0;;;;;;;;:::i;40761:580::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40761:580:0;;:::i;38252:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38252:49:0;;;;:::i;16821:67::-;;;:::i;43743:140::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43743:140:0;-1:-1:-1;;;;;43743:140:0;;:::i;1723:::-;;;:::i;37820:264::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;37820:264:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;37820:264:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37820:264:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37820:264:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;37820:264:0;;-1:-1:-1;37820:264:0;;-1:-1:-1;;;;;37820:264:0:i;40365:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40365:130:0;;:::i;50397:964::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50397:964:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;50397:964:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;50397:964:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;50397:964:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;50397:964:0;;-1:-1:-1;;50397:964:0;;;;;;-1:-1:-1;50397:964:0;;;;;;;;;-1:-1:-1;50397:964:0;;-1:-1:-1;50397:964:0:i;912:79::-;;;:::i;1278:92::-;;;:::i;35496:89::-;;;:::i;38428:25::-;;;:::i;7533:157::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7533:157:0;;:::i;26357:248::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26357:248:0;;;;;;;;;;:::i;56548:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56548:235:0;;;;;;;:::i;45084:21::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45084:21:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37558:254;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;37558:254:0;;;;;;;;;;;;;;;;;;;;;;:::i;45232:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45232:46:0;;:::i;38533:37::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38533:37:0;;:::i;44971:29::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44971:29:0;;:::i;29318:268::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;29318:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;29318:268:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29318:268:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;29318:268:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;29318:268:0;;-1:-1:-1;29318:268:0;;-1:-1:-1;;;;;29318:268:0:i;46205:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46205:206:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;49068:398;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49068:398:0;;:::i;6119:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6119:45:0;;:::i;37040:246::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;37040:246:0;;;;;;;;;;;;;;;;;;;;;;:::i;16897:261::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16897:261:0;;:::i;46932:642::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;46932:642:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46932:642:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46932:642:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46932:642:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46932:642:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46932:642:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;46932:642:0;;-1:-1:-1;46932:642:0;-1:-1:-1;46932:642:0;:::i;6623:199::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6623:199:0;;;;;;;:::i;45696:44::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45696:44:0;;;;:::i;50120:269::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50120:269:0;;:::i;55665:508::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55665:508:0;;;;;;;;;:::i;45009:30::-;;;:::i;38397:24::-;;;:::i;48682:378::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48682:378:0;;;;:::i;26935:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26935:147:0;;;;;;;;;;:::i;47582:647::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;47582:647:0;;;;;;;;:::i;2018:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2018:109:0;-1:-1:-1;;;;;2018:109:0;;:::i;44094:26::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44094:26:0;;:::i;38366:24::-;;;:::i;45151:23::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45151:23:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20008:135;-1:-1:-1;;;;;;20102:33:0;;20078:4;20102:33;;;:20;:33;;;;;;;;20008:135;;;;:::o;44127:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45599:45::-;;;;;;;;;;;;;;;:::o;35296:85::-;35368:5;35361:12;;;;;;;;-1:-1:-1;;35361:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35335:13;;35361:12;;35368:5;;35361:12;;35368:5;35361:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35296:85;:::o;43327:282::-;43413:7;43460:16;43468:7;43460;:16::i;:::-;43438:106;;;;-1:-1:-1;;;43438:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43564:15;:37;43580:11;43592:7;43580:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43564:37;;;;;;;;;;;;;-1:-1:-1;;;;;43564:37:0;;43327:282;-1:-1:-1;;43327:282:0:o;42686:474::-;42750:13;42766:16;42774:7;42766;:16::i;:::-;42750:32;;42823:5;-1:-1:-1;;;;;42817:11:0;:2;-1:-1:-1;;;;;42817:11:0;;;42795:90;;;;;-1:-1:-1;;;42795:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42920:10;-1:-1:-1;;;;;42920:19:0;;;;:58;;;42943:35;42960:5;42967:10;42943:16;:35::i;:::-;42898:160;;;;-1:-1:-1;;;42898:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43094:14;43105:2;43094:10;:14::i;:::-;43071:11;43083:7;43071:20;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;43144:7;43140:2;-1:-1:-1;;;;;43124:28:0;43133:5;-1:-1:-1;;;;;43124:28:0;;;;;;;;;;;42686:474;;;:::o;37294:256::-;37443:6;37438:105;37459:8;:15;37455:1;:19;37438:105;;;37496:35;37509:4;37515:2;37519:8;37528:1;37519:11;;;;;;;;;;;;;;37496:12;:35::i;:::-;37476:3;;37438:105;;;;37294:256;;;:::o;49953:159::-;50020:9;50015:90;50039:8;:15;50035:1;:19;50015:90;;;50076:17;50081:8;50090:1;50081:11;;;;;;;;;;;;;;50076:4;:17::i;:::-;50056:3;;50015:90;;;;49953:159;:::o;43617:118::-;43717:10;;43617:118;:::o;51369:1100::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;51697:9;51692:770;51716:4;:11;51712:1;:15;51692:770;;;51749:9;51761:4;51766:1;51761:7;;;;;;;;;;;;;;51749:19;;51816:1;51811:2;:6;;;51785:96;;;;;-1:-1:-1;;;51785:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51898:18;;:::i;:::-;51919:6;51926:2;51919:10;;;;;;;;;;;;;;;;;;;51898:31;;;;;;;;51919:10;;;;51898:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51898:31:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;51898:31:0;;;;;;;;-1:-1:-1;;;51898:31:0;;;;;;;;-1:-1:-1;;;51898:31:0;;;;;;;;;;;;-1:-1:-1;51944:96:0;;;;;-1:-1:-1;;;51944:96:0;;;;;;;;;;;;-1:-1:-1;;;51944:96:0;;;;;;;;;;;;;;;52070:344;;;;;;;;52103:5;52070:344;;;;;;52135:4;52070:344;;;;;;52163:5;52169:1;52163:8;;;;;;;;;;;;;;52070:344;;;;;;52200:10;52211:1;52200:13;;;;;;;;;;;;;;52070:344;;;;;;52240:9;52250:1;52240:12;;;;;;;;;;;;;;52070:344;;;;;;52277:6;52284:1;52277:9;;;;;;;;;;;;;;52070:344;;;;;;52313:8;52322:1;52313:11;;;;;;;;;;;;;;52070:344;;;;;;52351:8;52360:1;52351:11;;;;;;;;;;;;;;52070:344;;;;;;52388:7;52396:1;52388:10;;;;;;;;;;;;;;52070:344;;;;;52057:6;52064:2;52057:10;;;;;;;;;;;;;;;;;:357;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52447:2;52434:16;;;;;;;;;;;;-1:-1:-1;;51729:3:0;;51692:770;;;;51369:1100;;;;;;;;:::o;56181:108::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;56255:15;:26;;-1:-1:-1;;;;;;56255:26:0;-1:-1:-1;;;;;56255:26:0;;;;;;;;;;56181:108::o;38308:49::-;;;;;;;;;;;;;;;:::o;45488:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49474:280::-;49627:19;49638:7;49627:10;:19::i;:::-;49605:91;;;;;-1:-1:-1;;;49605:91:0;;;;;;;;;;;;-1:-1:-1;;;49605:91:0;;;;;;;;;;;;;;;49709:37;49728:4;49734:2;49738:7;49709:18;:37::i;:::-;49474:280;;;:::o;45344:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45749:47::-;45791:5;45749:47;:::o;52477:697::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;52583:1;52569:4;:11;:15;52547:79;;;;;-1:-1:-1;;;52547:79:0;;;;;;;;;;;;-1:-1:-1;;;52547:79:0;;;;;;;;;;;;;;;52644:9;52639:528;52663:4;:11;52659:1;:15;52639:528;;;52696:9;52708:4;52713:1;52708:7;;;;;;;;;;;;;;52696:19;;52761:1;52756:2;:6;;;52730:90;;;;;-1:-1:-1;;;52730:90:0;;;;;;;;;;;;-1:-1:-1;;;52730:90:0;;;;;;;;;;;;;;;52837:19;52859:6;52866:2;52859:10;;;;;;;;;;;;;;;;;;;52913:12;;52859:10;;-1:-1:-1;52913:12:0;;52912:13;52886:90;;;;;-1:-1:-1;;;52886:90:0;;;;;;;;;;;;-1:-1:-1;;;52886:90:0;;;;;;;;;;;;;;;53019:12;;;;;;;52993:90;;;;;-1:-1:-1;;;52993:90:0;;;;;;;;;;;;-1:-1:-1;;;52993:90:0;;;;;;;;;;;;;;;53100:19;;-1:-1:-1;;53100:19:0;53115:4;53100:19;;;53139:16;;;;;;;;53100:12;;53139:16;-1:-1:-1;;52676:3:0;;52639:528;;7046:260;7256:41;;;7278:1;7256:41;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7256:41:0;;;;;;;7246:52;;;;;7046:260;;;;;:::o;7314:211::-;7485:31;;;7397:7;7485:31;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;7485:31:0;;;;;;;7475:42;;;;;;7314:211::o;28465:134::-;28552:39;28569:4;28575:2;28579:7;28552:39;;;;;;;;;;;;:16;:39::i;49762:183::-;49834:20;49845:8;49834:10;:20::i;:::-;49812:92;;;;;-1:-1:-1;;;49812:92:0;;;;;;;;;;;;-1:-1:-1;;;49812:92:0;;;;;;;;;;;;;;;49917:20;49928:8;49917:10;:20::i;:::-;49762:183;:::o;56297:243::-;56415:15;;-1:-1:-1;;;;;56415:15:0;56401:10;:29;56379:109;;;;;-1:-1:-1;;;56379:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:31;56514:3;56519:4;56525:6;56501:12;:31::i;40503:152::-;40557:13;40604:14;;;:7;:14;;;;;:21;;;;;-1:-1:-1;;;40627:19:0;;;;;;40503:152::o;46419:505::-;46550:7;46580:17;46591:2;46595:1;46580:10;:17::i;:::-;46575:22;;46608;46623:6;46608:14;:22::i;:::-;46658:6;46641:10;46652:2;46641:14;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;46695:8;46675:13;46689:2;46675:17;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;46716:18;46750:1;46737:15;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;46737:15:0;;46716:36;;46771:6;46763:2;46766:1;46763:5;;;;;;;;:14;;;;:5;;;;;;;;;;;:14;46810;;;46822:1;46810:14;;;;;;;;;46790:17;;46810:14;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;46810:14:0;46790:34;;46843:8;46835:2;46838:1;46835:5;;;;;;;;;;;;;:16;;;;;;;;;;;46881:2;46869:27;46885:2;46889;46893;46869:27;;;;-1:-1:-1;;;;;46869:27:0;-1:-1:-1;;;;;46869:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46869:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46869:27:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46419:505:0;;;;;:::o;48237:437::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;45791:5;48395:27;;;;;48373:89;;;;;-1:-1:-1;;;48373:89:0;;;;;;;;;;;;-1:-1:-1;;;48373:89:0;;;;;;;;;;;;;;;48498:23;;;;;;;:14;:23;;;;;;;;-1:-1:-1;;;;;48498:33:0;;;;;;;;;;;;48497:34;48475:138;;;;-1:-1:-1;;;48475:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48626:23;;;;;;:14;:23;;;;;;;;-1:-1:-1;;;;;48626:33:0;;;;;;;;;:40;;-1:-1:-1;;48626:40:0;48662:4;48626:40;;;48237:437::o;40761:580::-;40843:7;40868:10;40881:8;40890:7;40881:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40868:30;;40913:3;:8;;40920:1;40913:8;40909:387;;;40938:13;40954:22;40968:7;40954:13;:22::i;:::-;40938:38;;40991:14;;:::i;:::-;-1:-1:-1;41008:14:0;;;;:7;:14;;;;;;;;;40991:31;;;;;;;;;;;;;;-1:-1:-1;;;40991:31:0;;;;;;;;;;41065:14;;-1:-1:-1;;41039:110:0;;;;;-1:-1:-1;;;41039:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41172:8;;;-1:-1:-1;41221:8:0;;;41195:89;;;;;-1:-1:-1;;;41195:89:0;;;;;;;;;;;;-1:-1:-1;;;41195:89:0;;;;;;;;;;;;;;;40909:387;;;41313:20;;;;;;:15;:20;;;;;;-1:-1:-1;;;;;41313:20:0;;40761:580;-1:-1:-1;;40761:580:0:o;38252:49::-;;;;;;;;;;;;-1:-1:-1;;;;;38252:49:0;;:::o;16821:67::-;;;;;;;;;;;;;;;;;;;:::o;43743:140::-;-1:-1:-1;;;;;43858:17:0;43826:7;43858:17;;;:9;:17;;;;;;;43743:140::o;1723:::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;1822:1;1806:6;;1785:40;;-1:-1:-1;;;;;1806:6:0;;;;1785:40;;1822:1;;1785:40;1853:1;1836:19;;-1:-1:-1;;;;;;1836:19:0;;;1723:140::o;37820:264::-;37973:6;37968:109;37989:8;:15;37985:1;:19;37968:109;;;38026:39;38043:4;38049:2;38053:8;38062:1;38053:11;;;;;;;;;;;;;;38026:16;:39::i;:::-;38006:3;;37968:109;;40365:130;40477:9;;40426:4;;40450:37;;:22;:7;40477:9;40450:22;:11;:22;:::i;:::-;:26;:37;:26;:37;:::i;50397:964::-;50550:4;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;50600:1;50594:3;:7;;;50572:85;;;;;-1:-1:-1;;;50572:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50699:3;50692:10;;:4;:10;;;50670:87;;;;;-1:-1:-1;;;50670:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50792:7;:14;:19;;:61;;-1:-1:-1;50821:7:0;50829:14;;-1:-1:-1;;50829:18:0;;;50821:27;;;;;;;;;;;;;;;:32;;;;;50815:38;;;;50792:61;50770:139;;;;;-1:-1:-1;;;50770:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50944:23;;;45791:5;50944:23;50922:110;;;;-1:-1:-1;;;50922:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51108:32;;;;;;;;;;;;;;;;;;;;;;;;51095:7;27:10:-1;;39:1;23:18;;;45:23;;;51076:9:0;51095:46;;;;;;;;;;;;;;;;;;-1:-1:-1;;51095:46:0;;;-1:-1:-1;;51095:46:0;;;;;;;;;;;;;;;;;;23:18:-1;51193::0;;51223:56;;51193:18;;51108:32;;51259:10;;;51258:16;;;51223:56;23:18:-1;51223:25:0;:56::i;:::-;51326:4;51297:34;;51321:3;51297:34;;51311:2;51297:34;;;51315:4;51297:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;51297:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51344:9:0;;;50397:964;-1:-1:-1;;;;50397:964:0:o;912:79::-;950:7;977:6;-1:-1:-1;;;;;977:6:0;912:79;:::o;1278:92::-;1318:4;1356:6;-1:-1:-1;;;;;1356:6:0;1342:10;:20;;1278:92::o;35496:89::-;35570:7;35563:14;;;;;;;;-1:-1:-1;;35563:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35537:13;;35563:14;;35570:7;;35563:14;;35570:7;35563:14;;;;;;;;;;;;;;;;;;;;;;;;38428:25;;;;:::o;7533:157::-;7621:7;7653:10;:29;7664:17;7676:4;7664:11;:17::i;:::-;7653:29;;;;;;;;;;;;7646:36;;7533:157;;;:::o;26357:248::-;-1:-1:-1;;;;;26437:16:0;;26443:10;26437:16;;26429:54;;;;;-1:-1:-1;;;26429:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26515:10;26496:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;26496:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;26496:45:0;;;;;;;;;;26557:40;;;;;;;26496:34;;26515:10;26557:40;;;;;;;;;;;26357:248;;:::o;56548:235::-;56658:15;;-1:-1:-1;;;;;56658:15:0;56644:10;:29;56622:109;;;;;-1:-1:-1;;;56622:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56744:31;56762:4;56768:6;56744:17;:31::i;45084:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45084:21:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;45084:21:0;;;;;;;;;;;-1:-1:-1;;;45084:21:0;;;;;-1:-1:-1;;;45084:21:0;;;;;-1:-1:-1;;;45084:21:0;;;;:::o;37558:254::-;37728:5;37714:91;37739:3;37735:1;:7;37714:91;;;37764:29;37781:4;37787:2;37791:1;37764:16;:29::i;:::-;37744:3;;37714:91;;;;37558:254;;;;:::o;45232:46::-;;;;;;;;;;;;;;;:::o;38533:37::-;;;;;;;;;;;;;;;;-1:-1:-1;;;38533:37:0;;;;;:::o;44971:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29318:268::-;29425:31;29438:4;29444:2;29448:7;29425:12;:31::i;:::-;29475:48;29498:4;29504:2;29508:7;29517:5;29475:22;:48::i;:::-;29467:111;;;;-1:-1:-1;;;29467:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46205:206;46306:12;46320:13;46359:10;46370:7;46359:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46380:13;46394:7;46380:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46351:52;;;;46205:206;;;:::o;49068:398::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;49207:1;49197:7;:11;:40;;;;-1:-1:-1;49223:7:0;:14;49212:25;;;49197:40;49175:120;;;;;-1:-1:-1;;;49175:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49331:23;;;;:14;:23;;;;;;;;49330:24;49308:107;;;;-1:-1:-1;;;49308:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49428:23;;;;:14;:23;;;;;:30;;-1:-1:-1;;49428:30:0;49454:4;49428:30;;;49068:398::o;6119:45::-;;;;;;;;;;;;;:::o;37040:246::-;37206:5;37192:87;37217:3;37213:1;:7;37192:87;;;37242:25;37255:4;37261:2;37265:1;37242:12;:25::i;:::-;37222:3;;37192:87;;16897:261;16955:13;17026:7;;;;;;;;;;;;;;;;;17048:33;17075:4;17048:18;:33::i;:::-;17114:24;17130:7;17114:15;:24::i;:::-;16995:154;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;16995:154:0;;;;;;;;;;-1:-1:-1;16995:154:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16995:154:0;;;;;;;-1:-1:-1;;;16995:154:0;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;16995:154:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;16995:154:0;;;16981:169;;16897:261;;;:::o;46932:642::-;47089:4;47133:18;47111:93;;;;;-1:-1:-1;;;47111:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47239:35;;;47217:134;;;;-1:-1:-1;;;47217:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47364:13;47380:38;47391:2;47402:7;47380:10;:38::i;:::-;47364:54;;47429:51;47453:5;47460:7;;47429:51;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;47429:51:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47469:10:0;;-1:-1:-1;47469:10:0;;;;47429:51;;;47469:10;;47429:51;47469:10;47429:51;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;47429:23:0;;-1:-1:-1;;;47429:51:0:i;:::-;47510:5;47498:43;47517:2;47521:7;;47530:10;;47498:43;;;;-1:-1:-1;;;;;47498:43:0;-1:-1:-1;;;;;47498:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;137:4;117:14;-1:-1;;113:30;157:16;;;47498:43:0;;;;;;;;;;;;;-1:-1:-1;47498:43:0;;;;;;;1:33:-1;99:1;81:16;;;74:27;47498:43:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;47498:43:0;;;;-1:-1:-1;47498:43:0;;-1:-1:-1;;;;;;;;47498:43:0;47561:5;46932:642;-1:-1:-1;;;;;;46932:642:0:o;6623:199::-;6741:14;6780:10;:34;6791:22;6803:3;6808:4;6791:11;:22::i;:::-;6780:34;;;;;;;;;;;;6773:41;;6623:199;;;;:::o;45696:44::-;;;;;;;;;;;;;;;:::o;50120:269::-;50179:4;50196:12;50211:10;50222:8;50211:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45791:5:0;50246:25;;50242:86;;50295:21;;;;;;:14;:21;;;;;;;;;-1:-1:-1;50288:28:0;;50242:86;50345:14;:36;50360:13;50374:5;50360:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50345:36;;;;;;;;;;;;;;;;50120:269;-1:-1:-1;;;50120:269:0:o;55665:508::-;55776:12;55791:10;55802:8;55791:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55776:35;;55872:14;55889:13;55903:5;55889:20;;;;;;;;;;;;;;;;;;;;;;;55960:10;55944:27;;:15;:27;;;;;;55889:20;;;;;;;;;;;;;55944:35;;;;;;;;;;;55889:20;;-1:-1:-1;55944:35:0;;55922:134;;;;-1:-1:-1;;;55922:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56095:8;56069:13;56083:8;56069:23;;;;;;;;;;;;;;;;;;;;;:34;;;;;;:23;;;;:34;;;;;;;;;;;;;;;;56119:46;;;;;;;;56154:10;56119:46;;;;;;;;;56134:8;;56119:46;;;;;;;;;55665:508;;;;:::o;45009:30::-;;;-1:-1:-1;;;;;45009:30:0;;:::o;38397:24::-;;;;:::o;48682:378::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;45791:5;48815:27;;;;;48793:95;;;;;-1:-1:-1;;;48793:95:0;;;;;;;;;;;;-1:-1:-1;;;48793:95:0;;;;;;;;;;;;;;;48924:23;;;;;;;:14;:23;;;;;;;;48923:24;48901:108;;;;-1:-1:-1;;;48901:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49022:23;;;;;;:14;:23;;;;;:30;;-1:-1:-1;;49022:30:0;49048:4;49022:30;;;48682:378::o;26935:147::-;-1:-1:-1;;;;;27039:25:0;;;27015:4;27039:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26935:147::o;47582:647::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;47735:7;:14;:25;-1:-1:-1;47735:25:0;47713:98;;;;;-1:-1:-1;;;47713:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47856:1;47846:7;:11;47824:87;;;;;-1:-1:-1;;;47824:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47947:25:0;;;;;;:15;:25;;;;;;;;:34;;;;;;;;;;;47946:35;47924:123;;;;-1:-1:-1;;;47924:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48083:23;;;;:14;:23;;;;;;;;48082:24;48060:107;;;;-1:-1:-1;;;48060:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48180:25:0;;;;;;;:15;:25;;;;;;;;:34;;;;;;;:41;;-1:-1:-1;;48180:41:0;48217:4;48180:41;;;47582:647::o;2018:109::-;1124:9;:7;:9::i;:::-;1116:54;;;;;-1:-1:-1;;;1116:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1116:54:0;;;;;;;;;;;;;;;2091:28;2110:8;2091:18;:28::i;44094:26::-;;;;;;;;;;38366:24;;;;:::o;45151:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45151:23:0;;;;;;:::o;43168:151::-;43252:4;;43281:16;43289:7;43281;:16::i;:::-;-1:-1:-1;;;;;43281:30:0;;;;43168:151;-1:-1:-1;;43168:151:0:o;39030:491::-;39098:6;-1:-1:-1;;;;;39126:16:0;;39122:57;;-1:-1:-1;39166:1:0;39159:8;;39122:57;-1:-1:-1;;;;;39202:19:0;;39189:10;39202:19;;;:15;:19;;;;;;;;39236:8;39232:261;;39303:9;;;;;;;39287:13;;:25;;;;39261:108;;;;;-1:-1:-1;;;39261:108:0;;;;;;;;;;;;-1:-1:-1;;;39261:108:0;;;;;;;;;;;;;;;-1:-1:-1;39390:9:0;:11;;;;;;;;;;;;-1:-1:-1;;39390:11:0;;;;;;;:9;39416:20;;;:15;:20;;;;;;;;:25;;-1:-1:-1;;;;;39416:25:0;;-1:-1:-1;;;;;;39416:25:0;;;;;;;;39456:19;;:15;:19;;;;;:25;;;;;;;;;39510:3;39030:491;-1:-1:-1;;39030:491:0:o;41349:722::-;41522:4;-1:-1:-1;;;;;41502:24:0;:16;41510:7;41502;:16::i;:::-;-1:-1:-1;;;;;41502:24:0;;41480:111;;;;-1:-1:-1;;;41480:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41626:16:0;;41604:98;;;;;-1:-1:-1;;;41604:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41737:39;41756:10;41768:7;41737:18;:39::i;:::-;41715:125;;;;-1:-1:-1;;;41715:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41853:24;41869:7;41853:15;:24::i;:::-;-1:-1:-1;;;;;41906:15:0;;;;;;:9;:15;;;;;;:22;;41926:1;41906:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;41888:15:0;;;;;;;:9;:15;;;;;;:40;;;;41955:13;;;;;;;:20;;41973:1;41955:20;:17;:20;:::i;:::-;-1:-1:-1;;;;;41939:13:0;;;;;;:9;:13;;;;;:36;42006:14;41949:2;42006:10;:14::i;:::-;41986:8;41995:7;41986:17;;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;42055:7;42051:2;-1:-1:-1;;;;;42036:27:0;42045:4;-1:-1:-1;;;;;42036:27:0;;;;;;;;;;;41349:722;;;:::o;42079:440::-;42150:39;42169:10;42181:7;42150:18;:39::i;:::-;42128:125;;;;-1:-1:-1;;;42128:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42266:24;42282:7;42266:15;:24::i;:::-;42301:13;42317:16;42325:7;42317;:16::i;:::-;-1:-1:-1;;;;;42363:16:0;;;;;;:9;:16;;;;;;42301:32;;-1:-1:-1;42363:23:0;;42384:1;42363:23;:20;:23;:::i;:::-;-1:-1:-1;;;;;42344:16:0;;;;;;:9;:16;;;;;:42;;;;42397:8;:17;;42406:7;;42397:17;;;;;;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42442:17;42457:1;42442:10;;:14;;:17;;;;:::i;:::-;42429:10;:30;42475:36;;42503:7;;42499:1;;-1:-1:-1;;;;;42475:36:0;;;;;42499:1;;42475:36;42079:440;;:::o;6383:232::-;6550:6;6513:10;:34;6524:22;6536:3;6541:4;6524:11;:22::i;:::-;6513:34;;;;;;;;;;;:43;;;;6594:4;6589:3;6572:35;6600:6;6572:35;;;;;;;;;;;;;;;;;;6383:232;;;:::o;39529:828::-;39635:4;-1:-1:-1;;;;;39679:16:0;;39657:86;;;;;-1:-1:-1;;;39657:86:0;;;;;;;;;;;;-1:-1:-1;;;39657:86:0;;;;;;;;;;;;;;;39785:1;39778:4;:8;;;:29;;;;;39798:9;;39790:4;:17;;;;39778:29;39756:109;;;;;-1:-1:-1;;;39756:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39894:9;;39878:13;39927:14;39938:2;39927:10;:14::i;:::-;39969:69;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39952:14:0;;;:7;:14;;;;;;:86;;;;;;-1:-1:-1;;39952:86:0;;;;;;;;;-1:-1:-1;;39952:86:0;-1:-1:-1;;;39952:86:0;;;;;;;;;;;;39969:69;;-1:-1:-1;40063:15:0;;39952:14;;40063:9;:15::i;:::-;40049:29;-1:-1:-1;40106:5:0;40089:97;40117:3;40113:1;:7;40089:97;;;40147:27;;40172:1;;-1:-1:-1;;;;;40147:27:0;;;40164:1;;40147:27;;40164:1;;40147:27;40122:3;;40089:97;;;-1:-1:-1;40222:9:0;;40208;;:24;;;:13;:24;:::i;:::-;40196:9;:36;-1:-1:-1;;;;;40259:13:0;;;;;;:9;:13;;;;;;:23;;;;;;:17;:23;:::i;:::-;-1:-1:-1;;;;;40243:13:0;;;;;;:9;:13;;;;;:39;40306:10;;:20;;;;;;:14;:20;:::i;:::-;40293:10;:33;-1:-1:-1;40344:5:0;;39529:828;-1:-1:-1;;;;39529:828:0:o;53629:499::-;45791:5;53691:25;;;;53687:434;;53733:28;53755:5;53733:21;:28::i;:::-;53687:434;;;53796:14;53813:13;53827:5;53813:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53813:20:0;53850:99;;;;;-1:-1:-1;;;53850:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54008:10;53992:27;;;;:15;:27;;;;;;;;:35;;;;;;;;;;;53966:143;;;;-1:-1:-1;;;53966:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5133:333;5191:7;5290:1;5286;:5;5278:44;;;;;-1:-1:-1;;;5278:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5333:9;5349:1;5345;:5;;;;;;;5133:333;-1:-1:-1;;;;5133:333:0:o;4194:471::-;4252:7;4497:6;4493:47;;-1:-1:-1;4527:1:0;4520:8;;4493:47;4564:5;;;4568:1;4564;:5;:1;4588:5;;;;;:10;4580:56;;;;-1:-1:-1;;;4580:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4656:1;4194:471;-1:-1:-1;;;4194:471:0:o;10202:321::-;10298:19;10320:39;10331:5;10338:7;10347:2;10351:7;10320:10;:39::i;:::-;10298:61;-1:-1:-1;10375:6:0;10370:98;10391:7;10387:1;:11;10370:98;;;10420:36;10427:5;10434:7;10443:2;10447:1;10450:5;10420:36;;:6;:36::i;:::-;10400:3;;10370:98;;;;10478:37;10489:5;10496:7;10505:2;10509:5;10478:10;:37::i;6830:208::-;6951:30;;;;;;;;6968:4;;6951:30;;;;;;;;;;7024:6;6992:10;:29;7003:17;7015:4;7003:11;:17::i;:::-;6992:29;;;;;;;;;;;-1:-1:-1;6992:29:0;:38;-1:-1:-1;;6830:208:0:o;33560:356::-;33682:4;33709:15;:2;-1:-1:-1;;;;;33709:13:0;;:15::i;:::-;33704:60;;-1:-1:-1;33748:4:0;33741:11;;33704:60;33792:70;;-1:-1:-1;;;33792:70:0;;33829:10;33792:70;;;;;;-1:-1:-1;;;;;33792:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33776:13;;33792:36;;;;;;33829:10;;33841:4;;33847:7;;33856:5;;33792:70;;;;;;;;;;;33776:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;33792:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33792:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33792:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33792:70:0;-1:-1:-1;;;;;;33881:26:0;-1:-1:-1;;;33881:26:0;;-1:-1:-1;;33560:356:0;;;;;;;:::o;12061:441::-;12214:13;;;12224:2;12214:13;;;12119;12214;;;;;;-1:-1:-1;;;;;12169:14:0;;;12119:13;;12214;;;21:6:-1;;104:10;12214:13:0;87:34:-1;135:17;;-1:-1;12214:13:0;12195:32;;-1:-1:-1;;;12238:3:0;12242:1;12238:6;;;;;;;;;;;:12;-1:-1:-1;;;;;12238:12:0;;;;;;;;;-1:-1:-1;;;12261:3:0;12265:1;12261:6;;;;;;;;;;;:12;-1:-1:-1;;;;;12261:12:0;;;;;;;;-1:-1:-1;12289:6:0;12284:182;12305:2;12301:1;:6;12284:182;;;12342:8;;;;;;;;;;;;;-1:-1:-1;;;12342:8:0;;;12379:1;12362:5;12368:1;12372:2;12368:6;12362:13;;;;;;;;;;-1:-1:-1;;;;;12362:18:0;;;;12356:25;;12351:31;;12342:41;;;;;;;;;;;;;;;;12329:3;12335:1;12337;12335:3;12333:1;:5;12329:10;;;;;;;;;;;:54;-1:-1:-1;;;;;12329:54:0;;;;;;;;;12411:8;;;;;;;;;;;;;-1:-1:-1;;;12411:8:0;;;12431:5;12437:1;12441:2;12437:6;12431:13;;;;;;;12411:43;;12431:13;;;12447:4;12425:27;;12411:43;;;;;;;;;;;;;;12398:3;12404:1;12406;12404:3;12402:1;:5;12398:10;;;;;;;;;;;:56;-1:-1:-1;;;;;12398:56:0;;;;;;;;-1:-1:-1;12309:3:0;;12284:182;;;-1:-1:-1;12490:3:0;12061:441;-1:-1:-1;;;12061:441:0:o;11447:553::-;11503:13;11533:10;11529:53;;-1:-1:-1;11560:10:0;;;;;;;;;;;;-1:-1:-1;;;11560:10:0;;;;;;11529:53;11607:5;11592:12;11648:78;11655:9;;11648:78;;11681:8;;11712:2;11704:10;;;;11648:78;;;11736:19;11768:6;11758:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;11758:17:0;87:34:-1;135:17;;-1:-1;11758:17:0;-1:-1:-1;11830:5:0;;-1:-1:-1;11736:39:0;-1:-1:-1;;;11802:10:0;;11846:115;11853:9;;11846:115;;11920:2;11913:4;:9;11908:2;:14;11897:27;;11879:6;11886:7;;;;;;;11879:15;;;;;;;;;;;:45;-1:-1:-1;;;;;11879:45:0;;;;;;;;-1:-1:-1;11947:2:0;11939:10;;;;11846:115;;;-1:-1:-1;11985:6:0;11447:553;-1:-1:-1;;;;11447:553:0:o;53182:439::-;53350:24;53366:7;53350:15;:24::i;:::-;53425:15;53452:40;53425:15;53477:5;53484:7;53452:20;:40::i;:::-;53541:18;53571:42;53541:18;53595:5;53602:10;53571:19;:42::i;2233:229::-;-1:-1:-1;;;;;2307:22:0;;2299:73;;;;-1:-1:-1;;;2299:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2409:6;;;2388:38;;-1:-1:-1;;;;;2388:38:0;;;;2409:6;;;2388:38;;;2437:6;:17;;-1:-1:-1;;;;;;2437:17:0;-1:-1:-1;;;;;2437:17:0;;;;;;;;;;2233:229::o;30313:333::-;30398:4;30423:16;30431:7;30423;:16::i;:::-;30415:73;;;;-1:-1:-1;;;30415:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30499:13;30515:16;30523:7;30515;:16::i;:::-;30499:32;;30561:5;-1:-1:-1;;;;;30550:16:0;:7;-1:-1:-1;;;;;30550:16:0;;:51;;;;30594:7;-1:-1:-1;;;;;30570:31:0;:20;30582:7;30570:11;:20::i;:::-;-1:-1:-1;;;;;30570:31:0;;30550:51;:87;;;;30605:32;30622:5;30629:7;30605:16;:32::i;42527:151::-;42593:11;42605:7;42593:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:25;;42617:1;42593:25;42589:82;;42658:1;42635:11;42647:7;42635:20;;;;;;;;;;;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;42527:151;:::o;3759:184::-;3817:7;3850:1;3845;:6;;3837:49;;;;;-1:-1:-1;;;3837:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3909:5:0;;;3759:184::o;3303:181::-;3361:7;3393:5;;;3417:6;;;;3409:46;;;;;-1:-1:-1;;;3409:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55298:359;55387:21;;;;;;;:14;:21;;;;;;;;55409:10;55387:33;;;;;;;;;;55365:123;;;;-1:-1:-1;;;55365:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55524:20;;;;;;;:13;:20;;;;;;;;55523:21;55501:108;;;;-1:-1:-1;;;55501:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55622:20;;;;;;:13;:20;;;;;:27;;-1:-1:-1;;55622:27:0;55645:4;55622:27;;;55298:359::o;8450:601::-;8548:19;8580:14;8597:38;8608:7;8617:8;8627:7;8597:10;:38::i;:::-;8580:55;;8665:9;8654:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8654:21:0;;8646:29;;8721:13;8737:23;8742:7;8751:8;8737:4;:23::i;:::-;8721:39;;8808:37;8829:5;8836:8;8808:20;:37::i;:::-;8797:5;8803:1;8797:8;;;;;;;;;;;;;:48;;;;;8872:1;8860:9;:13;8856:188;;;8890:12;8905:36;8910:20;:7;8922;8910:20;:11;:20;:::i;:::-;8932:8;8905:4;:36::i;:::-;8890:51;;8996:36;9017:5;9024:7;8996:20;:36::i;:::-;8975:5;8991:1;8981:9;:11;8975:18;;;;;;;;;;;;;:57;;;;;8856:188;;8450:601;;;;;;;;:::o;9689:505::-;9804:12;9825:5;9819:3;:11;;;;;;9804:26;;9841:18;9872:7;9862;:17;;;;;;9841:38;;9890:17;9937:7;9927:6;9911:13;:22;9910:34;;;;;;9890:54;;9955:15;10006:5;9995:7;9984;9975:6;:16;9974:28;;;;;;9973:38;;-1:-1:-1;10063:6:0;10058:129;10079:5;10075:1;:9;10058:129;;;10173:1;10160:10;:14;10145:1;10135:6;:11;;10150:4;10134:20;10133:42;;10109:6;10116:12;10109:20;;;;;;;;;;;;;;;;;:66;;;;;;;10091:1;10086:6;10058:129;;;;9689:505;;;;;;;;;:::o;9414:267::-;9514:11;9528:24;9545:5;9541:3;:9;;;;;9528:7;;9541:9;;9528:24;:11;:24;:::i;:::-;9514:38;-1:-1:-1;9568:6:0;9563:111;9584:6;:13;9580:1;:17;9563:111;;;9619:43;9633:5;9649:1;9640:6;:10;9652:6;9659:1;9652:9;;;;;;;;;;;;;;9619:13;:43::i;:::-;9599:3;;9563:111;;;;9414:267;;;;;:::o;14236:422::-;14603:20;14642:8;;;14236:422::o;54136:1154::-;54206:15;44076:9;54206:15;54275:425;54299:7;:14;54295:1;:18;54275:425;;;54335:12;54350:7;54358:1;54350:10;;;;;;;;;;;;;;54335:25;;45791:5;54379:25;;:5;:25;;;54375:314;;54425:28;54447:5;54425:21;:28::i;:::-;54375:314;;;54506:8;54498:16;;:5;:16;;;54494:81;;;54550:5;54539:16;;54494:81;54608:5;54597:16;;:8;:16;;;54593:81;;;54649:5;54638:16;;54593:81;-1:-1:-1;54315:3:0;;54275:425;;;-1:-1:-1;54716:13:0;;;;54712:571;;54746:14;54763:13;54777:8;54763:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54763:23:0;54852:99;;;;;-1:-1:-1;;;54852:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55004:13;55018:8;55004:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54994:33;;54968:143;;;;-1:-1:-1;;;54968:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55170:10;55154:27;;;;:15;:27;;;;;;;;:35;;;;;;;;;;;55128:143;;;;-1:-1:-1;;;55128:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10531:328;10618:19;10640:45;10651:5;10658:7;10667:2;10671:6;:13;10640:10;:45::i;:::-;10618:67;-1:-1:-1;10701:6:0;10696:108;10717:6;:13;10713:1;:17;10696:108;;;10752:40;10759:5;10766:7;10775:2;10779:1;10782:6;10789:1;10782:9;;;;;;;;;;;;;;10752:40;;:6;:40::i;:::-;10732:3;;10696:108;;;;10814:37;10825:5;10832:7;10841:2;10845:5;10814:10;:37::i;10867:324::-;10952:19;10974:45;10985:5;10992:7;11001:2;11005:6;:13;10974:10;:45::i;:::-;10952:67;-1:-1:-1;11035:6:0;11030:107;11051:6;:13;11047:1;:17;11030:107;;;11086:39;11093:5;11100:7;11109:1;11112;11115:6;11122:1;11115:9;;;;;;;;;;;;;;11086:39;;:6;:39::i;:::-;11066:3;;11030:107;;;;11147:36;11158:5;11165:7;11174:1;11177:5;11147:10;:36::i;9177:229::-;9263:4;9280:10;9303:8;9293:7;:18;;;;;;9280:31;;9322:8;9355;9344:7;9334;:17;9333:30;;;;;;9322:41;;9388:5;9382:3;:11;9397:1;9381:17;9374:24;;;;9177:229;;;;;:::o;9059:110::-;9122:4;9154:7;9146:5;:15;;;;;;;9059:110;-1:-1:-1;;;9059:110:0:o;7815:194::-;7893:11;7917:9;7929:28;7943:5;7950:6;7929:13;:28::i;:::-;7989:11;;7977:25;-1:-1:-1;;;;7977:25:0:o;8270:172::-;8351:9;8363:28;8377:5;8384:6;8363:13;:28::i;:::-;8413:20;;;;-1:-1:-1;;;8411:24:0:o;8017:245::-;8152:4;8146:11;8171:19;;;8232:2;8216:19;;;8212:32;;8119:136::o;43943:12845::-;;;;;;;;;-1:-1:-1;43943:12845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;43943:12845:0;;;;;;;;:::o

Swarm Source

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

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