Token Sandbox's LANDs

 

Overview [ERC-721]

Min. Price
$0.00 @ 0.000000 ETH
Max Total Supply:
0 LAND

Holders:
27

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Token migration announcement. Sandbox's LANDs token contract has migrated to 0x5CC5B05a8A13E3fBDB0BB9FcCd98D38e50F90c38.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Land

Compiler Version
v0.5.9+commit.e560f70d

Optimization Enabled:
Yes with 2000 runs

Other Settings:
petersburg EvmVersion, None license
File 1 of 10 : Admin.sol
pragma solidity ^0.5.2;

contract Admin {

    address internal _admin;

    event AdminChanged(address oldAdmin, address newAdmin);

    /// @notice gives the current administrator of this contract.
    /// @return the current administrator of this contract.
    function getAdmin() external view returns (address) {
        return _admin;
    }

    /// @notice change the administrator to be `newAdmin`.
    /// @param newAdmin address of the new administrator.
    function changeAdmin(address newAdmin) external {
        require(msg.sender == _admin, "only admin can change admin");
        emit AdminChanged(_admin, newAdmin);
        _admin = newAdmin;
    }

    modifier onlyAdmin() {
        require (msg.sender == _admin, "only admin allowed");
        _;
    }

}

File 2 of 10 : MetaTransactionReceiver.sol
pragma solidity ^0.5.2;

import "./Admin.sol";

contract MetaTransactionReceiver is Admin{

    mapping(address => bool) internal _metaTransactionContracts;
    event MetaTransactionProcessor(address metaTransactionProcessor, bool enabled);

    /// @notice Enable or disable the ability of `metaTransactionProcessor` to perform meta-tx (metaTransactionProcessor rights).
    /// @param metaTransactionProcessor address that will be given/removed metaTransactionProcessor rights.
    /// @param enabled set whether the metaTransactionProcessor is enabled or disabled.
    function setMetaTransactionProcessor(address metaTransactionProcessor, bool enabled) public {
        require(
            msg.sender == _admin,
            "only admin can setup metaTransactionProcessors"
        );
        _setMetaTransactionProcessor(metaTransactionProcessor, enabled);
    }

    function _setMetaTransactionProcessor(address metaTransactionProcessor, bool enabled) internal {
        _metaTransactionContracts[metaTransactionProcessor] = enabled;
        emit MetaTransactionProcessor(metaTransactionProcessor, enabled);
    }

    /// @notice check whether address `who` is given meta-transaction execution rights.
    /// @param who The address to query.
    /// @return whether the address has meta-transaction execution rights.
    function isMetaTransactionProcessor(address who) external view returns(bool) {
        return _metaTransactionContracts[who];
    }
}

File 3 of 10 : SuperOperators.sol
pragma solidity ^0.5.2;

import "./Admin.sol";

contract SuperOperators is Admin {

    mapping(address => bool) internal _superOperators;

    event SuperOperator(address superOperator, bool enabled);

    /// @notice Enable or disable the ability of `superOperator` to transfer tokens of all (superOperator rights).
    /// @param superOperator address that will be given/removed superOperator right.
    /// @param enabled set whether the superOperator is enabled or disabled.
    function setSuperOperator(address superOperator, bool enabled) external {
        require(
            msg.sender == _admin,
            "only admin is allowed to add super operators"
        );
        _superOperators[superOperator] = enabled;
        emit SuperOperator(superOperator, enabled);
    }

    /// @notice check whether address `who` is given superOperator rights.
    /// @param who The address to query.
    /// @return whether the address has superOperator rights.
    function isSuperOperator(address who) public view returns (bool) {
        return _superOperators[who];
    }
}

File 4 of 10 : ERC721Events.sol
pragma solidity ^0.5.2;

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
interface ERC721Events {
    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
    );
}

File 5 of 10 : ERC721MandatoryTokenReceiver.sol
pragma solidity ^0.5.2;

/**
    Note: The ERC-165 identifier for this interface is 0x5e8bf644.
*/
interface ERC721MandatoryTokenReceiver {
    function onERC721BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        bytes calldata data
    ) external returns (bytes4); // needs to return 0x4b808c46

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4); // needs to return 0x150b7a02

    // needs to implements EIP-165
    // function supportsInterface(bytes4 interfaceId)
    //     external
    //     view
    //     returns (bool);
}

File 6 of 10 : ERC721TokenReceiver.sol
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */
// solhint-disable-next-line compiler-fixed
pragma solidity ^0.5.2;

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

File 7 of 10 : AddressUtils.sol
pragma solidity ^0.5.2;

library AddressUtils {

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

    function isContract(address addr) internal view returns (bool) {
        // for accounts without code, i.e. `keccak256('')`:
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

        bytes32 codehash;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            codehash := extcodehash(addr)
        }
        return (codehash != 0x0 && codehash != accountHash);
    }
}

File 8 of 10 : Land.sol
/* solhint-disable no-empty-blocks */

pragma solidity 0.5.9;

import "./Land/erc721/LandBaseToken.sol";

contract Land is LandBaseToken {
    constructor(
        address metaTransactionContract,
        address admin
    ) public LandBaseToken(
        metaTransactionContract,
        admin
    ) {
    }

    /**
     * @notice Return the name of the token contract
     * @return The name of the token contract
     */
    function name() external pure returns (string memory) {
        return "Sandbox's LANDs";
    }

    /**
     * @notice Return the symbol of the token contract
     * @return The symbol of the token contract
     */
    function symbol() external pure returns (string memory) {
        return "LAND";
    }

    // solium-disable-next-line security/no-assign-params
    function uint2str(uint _i) internal pure returns (string memory) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    /**
     * @notice Return the URI of a specific token
     * @param id The id of the token
     * @return The URI of the token
     */
    function tokenURI(uint256 id) public view returns (string memory) {
        require(_ownerOf(id) != address(0), "Id does not exist");
        return
            string(
                abi.encodePacked(
                    "https://api.sandbox.game/lands/",
                    uint2str(id),
                    "/metadata.json"
                )
            );
    }

    /**
     * @notice Check if the contract supports an interface
     * 0x01ffc9a7 is ERC-165
     * 0x80ac58cd is ERC-721
     * 0x5b5e139f is ERC-721 metadata
     * @param id The id of the interface
     * @return True if the interface is supported
     */
    function supportsInterface(bytes4 id) external pure returns (bool) {
        return id == 0x01ffc9a7 || id == 0x80ac58cd || id == 0x5b5e139f;
    }
}

File 9 of 10 : ERC721BaseToken.sol
/* solhint-disable func-order, code-complexity */
pragma solidity 0.5.9;

import "../../../contracts_common/src/Libraries/AddressUtils.sol";
import "../../../contracts_common/src/Interfaces/ERC721TokenReceiver.sol";
import "../../../contracts_common/src/Interfaces/ERC721Events.sol";
import "../../../contracts_common/src/BaseWithStorage/SuperOperators.sol";
import "../../../contracts_common/src/BaseWithStorage/MetaTransactionReceiver.sol";
import "../../../contracts_common/src/Interfaces/ERC721MandatoryTokenReceiver.sol";

contract ERC721BaseToken is ERC721Events, SuperOperators, MetaTransactionReceiver {
    using AddressUtils for address;

    bytes4 internal constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 internal constant _ERC721_BATCH_RECEIVED = 0x4b808c46;

    bytes4 internal constant ERC165ID = 0x01ffc9a7;
    bytes4 internal constant ERC721_MANDATORY_RECEIVER = 0x5e8bf644;

    mapping (address => uint256) public _numNFTPerAddress;
    mapping (uint256 => uint256) public _owners;
    mapping (address => mapping(address => bool)) public _operatorsForAll;
    mapping (uint256 => address) public _operators;

    constructor(
        address metaTransactionContract,
        address admin
    ) internal {
        _admin = admin;
        _setMetaTransactionProcessor(metaTransactionContract, true);
    }

    function _transferFrom(address from, address to, uint256 id) internal {
        _numNFTPerAddress[from]--;
        _numNFTPerAddress[to]++;
        _owners[id] = uint256(to);
        emit Transfer(from, to, id);
    }

    /**
     * @notice Return the number of Land owned by an address
     * @param owner The address to look for
     * @return The number of Land token owned by the address
     */
    function balanceOf(address owner) external view returns (uint256) {
        require(owner != address(0), "owner is zero address");
        return _numNFTPerAddress[owner];
    }


    function _ownerOf(uint256 id) internal view returns (address) {
        return address(_owners[id]);
    }

    function _ownerAndOperatorEnabledOf(uint256 id) internal view returns (address owner, bool operatorEnabled) {
        uint256 data = _owners[id];
        owner = address(data);
        operatorEnabled = (data / 2**255) == 1;
    }

    /**
     * @notice Return the owner of a Land
     * @param id The id of the Land
     * @return The address of the owner
     */
    function ownerOf(uint256 id) external view returns (address owner) {
        owner = _ownerOf(id);
        require(owner != address(0), "token does not exist");
    }

    function _approveFor(address owner, address operator, uint256 id) internal {
        if(operator == address(0)) {
            _owners[id] = uint256(owner); // no need to resset the operator, it will be overriden next time
        } else {
            _owners[id] = uint256(owner) + 2**255;
            _operators[id] = operator;
        }
        emit Approval(owner, operator, id);
    }

    /**
     * @notice Approve an operator to spend tokens on the sender behalf
     * @param sender The address giving the approval
     * @param operator The address receiving the approval
     * @param id The id of the token
     */
    function approveFor(
        address sender,
        address operator,
        uint256 id
    ) external {
        address owner = _ownerOf(id);
        require(sender != address(0), "sender is zero address");
        require(
            msg.sender == sender ||
            _metaTransactionContracts[msg.sender] ||
            _superOperators[msg.sender] ||
            _operatorsForAll[sender][msg.sender],
            "not authorized to approve"
        );
        require(owner == sender, "owner != sender");
        _approveFor(owner, operator, id);
    }

    /**
     * @notice Approve an operator to spend tokens on the sender behalf
     * @param operator The address receiving the approval
     * @param id The id of the token
     */
    function approve(address operator, uint256 id) external {
        address owner = _ownerOf(id);
        require(owner != address(0), "token does not exist");
        require(
            owner == msg.sender ||
            _superOperators[msg.sender] ||
            _operatorsForAll[owner][msg.sender],
            "not authorized to approve"
        );
        _approveFor(owner, operator, id);
    }

    /**
     * @notice Get the approved operator for a specific token
     * @param id The id of the token
     * @return The address of the operator
     */
    function getApproved(uint256 id) external view returns (address) {
        (address owner, bool operatorEnabled) = _ownerAndOperatorEnabledOf(id);
        require(owner != address(0), "token does not exist");
        if (operatorEnabled) {
            return _operators[id];
        } else {
            return address(0);
        }
    }

    function _checkTransfer(address from, address to, uint256 id) internal view returns (bool isMetaTx) {
        (address owner, bool operatorEnabled) = _ownerAndOperatorEnabledOf(id);
        require(owner != address(0), "token does not exist");
        require(owner == from, "not owner in _checkTransfer");
        require(to != address(0), "can't send to zero address");
        isMetaTx = msg.sender != from && _metaTransactionContracts[msg.sender];
        if (msg.sender != from && !isMetaTx) {
            require(
                _superOperators[msg.sender] ||
                _operatorsForAll[from][msg.sender] ||
                (operatorEnabled && _operators[id] == msg.sender),
                "not approved to transfer"
            );
        }
    }

    function _checkInterfaceWith10000Gas(address _contract, bytes4 interfaceId)
        internal
        view
        returns (bool)
    {
        bool success;
        bool result;
        bytes memory call_data = abi.encodeWithSelector(
            ERC165ID,
            interfaceId
        );
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let call_ptr := add(0x20, call_data)
            let call_size := mload(call_data)
            let output := mload(0x40) // Find empty storage location using "free memory pointer"
            mstore(output, 0x0)
            success := staticcall(
                10000,
                _contract,
                call_ptr,
                call_size,
                output,
                0x20
            ) // 32 bytes
            result := mload(output)
        }
        // (10000 / 63) "not enough for supportsInterface(...)" // consume all gas, so caller can potentially know that there was not enough gas
        assert(gasleft() > 158);
        return success && result;
    }

    /**
     * @notice Transfer a token between 2 addresses
     * @param from The sender of the token
     * @param to The recipient of the token
     * @param id The id of the token
    */
    function transferFrom(address from, address to, uint256 id) external {
        bool metaTx = _checkTransfer(from, to, id);
        _transferFrom(from, to, id);
        if (to.isContract() && _checkInterfaceWith10000Gas(to, ERC721_MANDATORY_RECEIVER)) {
            require(
                _checkOnERC721Received(metaTx ? from : msg.sender, from, to, id, ""),
                "erc721 transfer rejected by to"
            );
        }
    }

    /**
     * @notice Transfer a token between 2 addresses letting the receiver knows of the transfer
     * @param from The sender of the token
     * @param to The recipient of the token
     * @param id The id of the token
     * @param data Additional data
     */
    function safeTransferFrom(address from, address to, uint256 id, bytes memory data) public {
        bool metaTx = _checkTransfer(from, to, id);
        _transferFrom(from, to, id);
        if (to.isContract()) {
            require(
                _checkOnERC721Received(metaTx ? from : msg.sender, from, to, id, data),
                "ERC721: transfer rejected by to"
            );
        }
    }

    /**
     * @notice Transfer a token between 2 addresses letting the receiver knows of the transfer
     * @param from The send of the token
     * @param to The recipient of the token
     * @param id The id of the token
     */
    function safeTransferFrom(address from, address to, uint256 id) external {
        safeTransferFrom(from, to, id, "");
    }

    /**
     * @notice Transfer many tokens between 2 addresses
     * @param from The sender of the token
     * @param to The recipient of the token
     * @param ids The ids of the tokens
     * @param data additional data
    */
    function batchTransferFrom(address from, address to, uint256[] calldata ids, bytes calldata data) external {
        _batchTransferFrom(from, to, ids, data, false);
    }

    function _batchTransferFrom(address from, address to, uint256[] memory ids, bytes memory data, bool safe) internal {
        bool metaTx = msg.sender != from && _metaTransactionContracts[msg.sender];
        bool authorized = msg.sender == from ||
            metaTx ||
            _superOperators[msg.sender] ||
            _operatorsForAll[from][msg.sender];

        require(from != address(0), "from is zero address");
        require(to != address(0), "can't send to zero address");

        uint256 numTokens = ids.length;
        for(uint256 i = 0; i < numTokens; i ++) {
            uint256 id = ids[i];
            (address owner, bool operatorEnabled) = _ownerAndOperatorEnabledOf(id);
            require(owner == from, "not owner in batchTransferFrom");
            require(authorized || (operatorEnabled && _operators[id] == msg.sender), "not authorized");
            _owners[id] = uint256(to);
            emit Transfer(from, to, id);
        }
        if (from != to) {
            _numNFTPerAddress[from] -= numTokens;
            _numNFTPerAddress[to] += numTokens;
        }

        if (to.isContract() && (safe || _checkInterfaceWith10000Gas(to, ERC721_MANDATORY_RECEIVER))) {
            require(
                _checkOnERC721BatchReceived(metaTx ? from : msg.sender, from, to, ids, data),
                "erc721 batch transfer rejected by to"
            );
        }
    }

    /**
     * @notice Transfer many tokens between 2 addresses ensuring the receiving contract has a receiver method
     * @param from The sender of the token
     * @param to The recipient of the token
     * @param ids The ids of the tokens
     * @param data additional data
    */
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, bytes calldata data) external {
        _batchTransferFrom(from, to, ids, data, true);
    }

    /**
     * @notice Check if the contract supports an interface
     * 0x01ffc9a7 is ERC-165
     * 0x80ac58cd is ERC-721
     * @param id The id of the interface
     * @return True if the interface is supported
     */
    function supportsInterface(bytes4 id) external pure returns (bool) {
        return id == 0x01ffc9a7 || id == 0x80ac58cd;
    }

    /**
     * @notice Set the approval for an operator to manage all the tokens of the sender
     * @param sender The address giving the approval
     * @param operator The address receiving the approval
     * @param approved The determination of the approval
     */
    function setApprovalForAllFor(
        address sender,
        address operator,
        bool approved
    ) external {
        require(sender != address(0), "Invalid sender address");
        require(
            msg.sender == sender ||
            _metaTransactionContracts[msg.sender] ||
            _superOperators[msg.sender],
            "not authorized to approve for all"
        );

        _setApprovalForAll(sender, operator, approved);
    }

    /**
     * @notice Set the approval for an operator to manage all the tokens of the sender
     * @param operator The address receiving the approval
     * @param approved The determination of the approval
     */
    function setApprovalForAll(address operator, bool approved) external {
        _setApprovalForAll(msg.sender, operator, approved);
    }


    function _setApprovalForAll(
        address sender,
        address operator,
        bool approved
    ) internal {
        require(
            !_superOperators[operator],
            "super operator can't have their approvalForAll changed"
        );
        _operatorsForAll[sender][operator] = approved;

        emit ApprovalForAll(sender, operator, approved);
    }

    /**
     * @notice Check if the sender approved the operator
     * @param owner The address of the owner
     * @param operator The address of the operator
     * @return The status of the approval
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool isOperator)
    {
        return _operatorsForAll[owner][operator] || _superOperators[operator];
    }

    function _burn(address from, address owner, uint256 id) public {
        require(from == owner, "not owner");
        _owners[id] = 2**160; // cannot mint it again
        _numNFTPerAddress[from]--;
        emit Transfer(from, address(0), id);
    }

    /// @notice Burns token `id`.
    /// @param id token which will be burnt.
    function burn(uint256 id) external {
        _burn(msg.sender, _ownerOf(id), id);
    }

    /// @notice Burn token`id` from `from`.
    /// @param from address whose token is to be burnt.
    /// @param id token which will be burnt.
    function burnFrom(address from, uint256 id) external {
        require(from != address(0), "Invalid sender address");
        (address owner, bool operatorEnabled) = _ownerAndOperatorEnabledOf(id);
        require(
            msg.sender == from ||
            _metaTransactionContracts[msg.sender] ||
            (operatorEnabled && _operators[id] == msg.sender) ||
            _superOperators[msg.sender] ||
            _operatorsForAll[from][msg.sender],
            "not authorized to burn"
        );
        _burn(from, owner, id);
    }

    function _checkOnERC721Received(address operator, address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        bytes4 retval = ERC721TokenReceiver(to).onERC721Received(operator, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    function _checkOnERC721BatchReceived(address operator, address from, address to, uint256[] memory ids, bytes memory _data)
        internal returns (bool)
    {
        bytes4 retval = ERC721MandatoryTokenReceiver(to).onERC721BatchReceived(operator, from, ids, _data);
        return (retval == _ERC721_BATCH_RECEIVED);
    }
}

File 10 of 10 : LandBaseToken.sol
/* solhint-disable func-order, code-complexity */
pragma solidity 0.5.9;

import "./ERC721BaseToken.sol";

contract LandBaseToken is ERC721BaseToken {
    // Our grid is 408 x 408 lands
    uint256 internal constant GRID_SIZE = 408;

    uint256 internal constant LAYER =          0xFF00000000000000000000000000000000000000000000000000000000000000;
    uint256 internal constant LAYER_1x1 =      0x0000000000000000000000000000000000000000000000000000000000000000;
    uint256 internal constant LAYER_3x3 =      0x0100000000000000000000000000000000000000000000000000000000000000;
    uint256 internal constant LAYER_6x6 =      0x0200000000000000000000000000000000000000000000000000000000000000;
    uint256 internal constant LAYER_12x12 =    0x0300000000000000000000000000000000000000000000000000000000000000;
    uint256 internal constant LAYER_24x24 =    0x0400000000000000000000000000000000000000000000000000000000000000;

    mapping(address => bool) internal _minters;
    event Minter(address superOperator, bool enabled);

    /// @notice Enable or disable the ability of `minter` to mint tokens
    /// @param minter address that will be given/removed minter right.
    /// @param enabled set whether the minter is enabled or disabled.
    function setMinter(address minter, bool enabled) external {
        require(
            msg.sender == _admin,
            "only admin is allowed to add minters"
        );
        _minters[minter] = enabled;
        emit Minter(minter, enabled);
    }

    /// @notice check whether address `who` is given minter rights.
    /// @param who The address to query.
    /// @return whether the address has minter rights.
    function isMinter(address who) public view returns (bool) {
        return _minters[who];
    }

    constructor(
        address metaTransactionContract,
        address admin
    ) public ERC721BaseToken(metaTransactionContract, admin) {
    }

    /// @notice total width of the map
    /// @return width
    function width() external returns(uint256) {
        return GRID_SIZE;
    }

    /// @notice total height of the map
    /// @return height
    function height() external returns(uint256) {
        return GRID_SIZE;
    }

    /// @notice x coordinate of Land token
    /// @param id tokenId
    /// @return the x coordinates
    function x(uint256 id) external returns(uint256) {
        require(_ownerOf(id) != address(0), "token does not exist");
        return id % GRID_SIZE;
    }

    /// @notice y coordinate of Land token
    /// @param id tokenId
    /// @return the y coordinates
    function y(uint256 id) external returns(uint256) {
        require(_ownerOf(id) != address(0), "token does not exist");
        return id / GRID_SIZE;
    }

    /**
     * @notice Mint a new quad (aligned to a quad tree with size 3, 6, 12 or 24 only)
     * @param to The recipient of the new quad
     * @param size The size of the new quad
     * @param x The top left x coordinate of the new quad
     * @param y The top left y coordinate of the new quad
     * @param data extra data to pass to the transfer
     */
    function mintQuad(address to, uint256 size, uint256 x, uint256 y, bytes calldata data) external {
        require(to != address(0), "to is zero address");
        require(
            isMinter(msg.sender),
            "Only a minter can mint"
        );
        require(x % size == 0 && y % size == 0, "Invalid coordinates");
        require(x <= GRID_SIZE - size && y <= GRID_SIZE - size, "Out of bounds");

        uint256 quadId;
        uint256 id = x + y * GRID_SIZE;

        if (size == 1) {
            quadId = id;
        } else if (size == 3) {
            quadId = LAYER_3x3 + id;
        } else if (size == 6) {
            quadId = LAYER_6x6 + id;
        } else if (size == 12) {
            quadId = LAYER_12x12 + id;
        } else if (size == 24) {
            quadId = LAYER_24x24 + id;
        } else {
            require(false, "Invalid size");
        }

        require(_owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE] == 0, "Already minted as 24x24");

        uint256 toX = x+size;
        uint256 toY = y+size;
        if (size <= 12) {
            require(
                _owners[LAYER_12x12 + (x/12) * 12 + ((y/12) * 12) * GRID_SIZE] == 0,
                "Already minted as 12x12"
            );
        } else {
            for (uint256 x12i = x; x12i < toX; x12i += 12) {
                for (uint256 y12i = y; y12i < toY; y12i += 12) {
                    uint256 id12x12 = LAYER_12x12 + x12i + y12i * GRID_SIZE;
                    require(_owners[id12x12] == 0, "Already minted as 12x12");
                }
            }
        }

        if (size <= 6) {
            require(_owners[LAYER_6x6 + (x/6) * 6 + ((y/6) * 6) * GRID_SIZE] == 0, "Already minted as 6x6");
        } else {
            for (uint256 x6i = x; x6i < toX; x6i += 6) {
                for (uint256 y6i = y; y6i < toY; y6i += 6) {
                    uint256 id6x6 = LAYER_6x6 + x6i + y6i * GRID_SIZE;
                    require(_owners[id6x6] == 0, "Already minted as 6x6");
                }
            }
        }

        if (size <= 3) {
            require(_owners[LAYER_3x3 + (x/3) * 3 + ((y/3) * 3) * GRID_SIZE] == 0, "Already minted as 3x3");
        } else {
            for (uint256 x3i = x; x3i < toX; x3i += 3) {
                for (uint256 y3i = y; y3i < toY; y3i += 3) {
                    uint256 id3x3 = LAYER_3x3 + x3i + y3i * GRID_SIZE;
                    require(_owners[id3x3] == 0, "Already minted as 3x3");
                }
            }
        }

        for (uint256 i = 0; i < size*size; i++) {
            uint256 id = _idInPath(i, size, x, y);
            require(_owners[id] == 0, "Already minted");
            emit Transfer(address(0), to, id);
        }

        _owners[quadId] = uint256(to);
        _numNFTPerAddress[to] += size * size;

        _checkBatchReceiverAcceptQuad(msg.sender, address(0), to, size, x, y, data);
    }

    function _idInPath(uint256 i, uint256 size, uint256 x, uint256 y) internal pure returns(uint256) {
        uint256 row = i / size;
        if(row % 2 == 0) { // alow ids to follow a path in a quad
            return (x + (i%size)) + ((y + row) * GRID_SIZE);
        } else {
            return ((x + size) - (1 + i%size)) + ((y + row) * GRID_SIZE);
        }
    }

    /// @notice transfer one quad (aligned to a quad tree with size 3, 6, 12 or 24 only)
    /// @param from current owner of the quad
    /// @param to destination
    /// @param size size of the quad
    /// @param x The top left x coordinate of the quad
    /// @param y The top left y coordinate of the quad
    /// @param data additional data
    function transferQuad(address from, address to, uint256 size, uint256 x, uint256 y, bytes calldata data) external {
        require(from != address(0), "from is zero address");
        require(to != address(0), "can't send to zero address");
        bool metaTx = msg.sender != from && _metaTransactionContracts[msg.sender];
        if (msg.sender != from && !metaTx) {
            require(
                _superOperators[msg.sender] ||
                _operatorsForAll[from][msg.sender],
                "not authorized to transferQuad"
            );
        }
        _transferQuad(from, to, size, x, y);
        _numNFTPerAddress[from] -= size * size;
        _numNFTPerAddress[to] += size * size;

        _checkBatchReceiverAcceptQuad(metaTx ? from : msg.sender, from, to, size, x, y, data);
    }

    function _checkBatchReceiverAcceptQuad(
        address operator,
        address from,
        address to,
        uint256 size,
        uint256 x,
        uint256 y,
        bytes memory data
    ) internal {
        if (to.isContract() && _checkInterfaceWith10000Gas(to, ERC721_MANDATORY_RECEIVER)) {
            uint256[] memory ids = new uint256[](size*size);
            for (uint256 i = 0; i < size*size; i++) {
                ids[i] = _idInPath(i, size, x, y);
            }
            require(
                _checkOnERC721BatchReceived(operator, from, to, ids, data),
                "erc721 batch transfer rejected by to"
            );
        }
    }

    /// @notice transfer multiple quad (aligned to a quad tree with size 3, 6, 12 or 24 only)
    /// @param from current owner of the quad
    /// @param to destination
    /// @param sizes list of sizes for each quad
    /// @param xs list of top left x coordinates for each quad
    /// @param ys list of top left y coordinates for each quad
    /// @param data additional data
    function batchTransferQuad(
        address from,
        address to,
        uint256[] calldata sizes,
        uint256[] calldata xs,
        uint256[] calldata ys,
        bytes calldata data
    ) external {
        require(from != address(0), "from is zero address");
        require(to != address(0), "can't send to zero address");
        require(sizes.length == xs.length && xs.length == ys.length, "invalid data");
        bool metaTx = msg.sender != from && _metaTransactionContracts[msg.sender];
        if (msg.sender != from && !metaTx) {
            require(
                _superOperators[msg.sender] ||
                _operatorsForAll[from][msg.sender],
                "not authorized to transferMultiQuads"
            );
        }
        uint256 numTokensTransfered = 0;
        for (uint256 i = 0; i < sizes.length; i++) {
            uint256 size = sizes[i];
            _transferQuad(from, to, size, xs[i], ys[i]);
            numTokensTransfered += size * size;
        }
        _numNFTPerAddress[from] -= numTokensTransfered;
        _numNFTPerAddress[to] += numTokensTransfered;

        if (to.isContract() && _checkInterfaceWith10000Gas(to, ERC721_MANDATORY_RECEIVER)) {
            uint256[] memory ids = new uint256[](numTokensTransfered);
            uint256 counter = 0;
            for (uint256 j = 0; j < sizes.length; j++) {
                uint256 size = sizes[j];
                for (uint256 i = 0; i < size*size; i++) {
                    ids[counter] = _idInPath(i, size, xs[j], ys[j]);
                    counter++;
                }
            }
            require(
                _checkOnERC721BatchReceived(metaTx ? from : msg.sender, from, to, ids, data),
                "erc721 batch transfer rejected by to"
            );
        }
    }

    function _transferQuad(address from, address to, uint256 size, uint256 x, uint256 y) internal {
        if (size == 1) {
            uint256 id1x1 = x + y * GRID_SIZE;
            address owner = _ownerOf(id1x1);
            require(owner != address(0), "token does not exist");
            require(owner == from, "not owner in _transferQuad");
            _owners[id1x1] = uint256(to);
        } else {
            _regroup(from, to, size, x, y);
        }
        for (uint256 i = 0; i < size*size; i++) {
            emit Transfer(from, to, _idInPath(i, size, x, y));
        }
    }

    function _checkAndClear(address from, uint256 id) internal returns(bool) {
        uint256 owner = _owners[id];
        if (owner != 0) {
            require(address(owner) == from, "not owner");
            _owners[id] = 0;
            return true;
        }
        return false;
    }

    function _regroup(address from, address to, uint256 size, uint256 x, uint256 y) internal {
        require(x % size == 0 && y % size == 0, "Invalid coordinates");
        require(x <= GRID_SIZE - size && y <= GRID_SIZE - size, "Out of bounds");

        if (size == 3) {
            _regroup3x3(from, to, x, y, true);
        } else if (size == 6) {
            _regroup6x6(from, to, x, y, true);
        } else if (size == 12) {
            _regroup12x12(from, to, x, y, true);
        } else if (size == 24) {
            _regroup24x24(from, to, x, y, true);
        } else {
            require(false, "Invalid size");
        }
    }

    function _regroup3x3(address from, address to, uint256 x, uint256 y, bool set) internal returns (bool) {
        uint256 id = x + y * GRID_SIZE;
        uint256 quadId = LAYER_3x3 + id;
        bool ownerOfAll = true;
        for (uint256 xi = x; xi < x+3; xi++) {
            for (uint256 yi = y; yi < y+3; yi++) {
                ownerOfAll = _checkAndClear(from, xi + yi * GRID_SIZE) && ownerOfAll;
            }
        }
        if(set) {
            if(!ownerOfAll) {
                require(
                    _owners[quadId] == uint256(from) ||
                    _owners[LAYER_6x6 + (x/6) * 6 + ((y/6) * 6) * GRID_SIZE] == uint256(from) ||
                    _owners[LAYER_12x12 + (x/12) * 12 + ((y/12) * 12) * GRID_SIZE] == uint256(from) ||
                    _owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE] == uint256(from),
                    "not owner of all sub quads nor parent quads"
                );
            }
            _owners[quadId] = uint256(to);
            return true;
        }
        return ownerOfAll;
    }
    function _regroup6x6(address from, address to, uint256 x, uint256 y, bool set) internal returns (bool) {
        uint256 id = x + y * GRID_SIZE;
        uint256 quadId = LAYER_6x6 + id;
        bool ownerOfAll = true;
        for (uint256 xi = x; xi < x+6; xi += 3) {
            for (uint256 yi = y; yi < y+6; yi += 3) {
                bool ownAllIndividual = _regroup3x3(from, to, xi, yi, false);
                uint256 id3x3 = LAYER_3x3 + xi + yi * GRID_SIZE;
                uint256 owner3x3 = _owners[id3x3];
                if (owner3x3 != 0) {
                    if(!ownAllIndividual) {
                        require(owner3x3 == uint256(from), "not owner of 3x3 quad");
                    }
                    _owners[id3x3] = 0;
                }
                ownerOfAll = (ownAllIndividual || owner3x3 != 0) && ownerOfAll;
            }
        }
        if(set) {
            if(!ownerOfAll) {
                require(
                    _owners[quadId] == uint256(from) ||
                    _owners[LAYER_12x12 + (x/12) * 12 + ((y/12) * 12) * GRID_SIZE] == uint256(from) ||
                    _owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE] == uint256(from),
                    "not owner of all sub quads nor parent quads"
                );
            }
            _owners[quadId] = uint256(to);
            return true;
        }
        return ownerOfAll;
    }
    function _regroup12x12(address from, address to, uint256 x, uint256 y, bool set) internal returns (bool) {
        uint256 id = x + y * GRID_SIZE;
        uint256 quadId = LAYER_12x12 + id;
        bool ownerOfAll = true;
        for (uint256 xi = x; xi < x+12; xi += 6) {
            for (uint256 yi = y; yi < y+12; yi += 6) {
                bool ownAllIndividual = _regroup6x6(from, to, xi, yi, false);
                uint256 id6x6 = LAYER_6x6 + xi + yi * GRID_SIZE;
                uint256 owner6x6 = _owners[id6x6];
                if (owner6x6 != 0) {
                    if(!ownAllIndividual) {
                        require(owner6x6 == uint256(from), "not owner of 6x6 quad");
                    }
                    _owners[id6x6] = 0;
                }
                ownerOfAll = (ownAllIndividual || owner6x6 != 0) && ownerOfAll;
            }
        }
        if(set) {
            if(!ownerOfAll) {
                require(
                    _owners[quadId] == uint256(from) ||
                    _owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE] == uint256(from),
                    "not owner of all sub quads nor parent quads"
                );
            }
            _owners[quadId] = uint256(to);
            return true;
        }
        return ownerOfAll;
    }
    function _regroup24x24(address from, address to, uint256 x, uint256 y, bool set) internal returns (bool) {
        uint256 id = x + y * GRID_SIZE;
        uint256 quadId = LAYER_24x24 + id;
        bool ownerOfAll = true;
        for (uint256 xi = x; xi < x+24; xi += 12) {
            for (uint256 yi = y; yi < y+24; yi += 12) {
                bool ownAllIndividual = _regroup12x12(from, to, xi, yi, false);
                uint256 id12x12 = LAYER_12x12 + xi + yi * GRID_SIZE;
                uint256 owner12x12 = _owners[id12x12];
                if (owner12x12 != 0) {
                    if(!ownAllIndividual) {
                        require(owner12x12 == uint256(from), "not owner of 12x12 quad");
                    }
                    _owners[id12x12] = 0;
                }
                ownerOfAll = (ownAllIndividual || owner12x12 != 0) && ownerOfAll;
            }
        }
        if(set) {
            if(!ownerOfAll) {
                require(
                    _owners[quadId] == uint256(from),
                    "not owner of all sub quads not parent quad"
                );
            }
            _owners[quadId] = uint256(to);
            return true;
        }
        return ownerOfAll || _owners[quadId] == uint256(from);
    }

    function _ownerOf(uint256 id) internal view returns (address) {
        require(id & LAYER == 0, "Invalid token id");
        uint256 x = id % GRID_SIZE;
        uint256 y = id / GRID_SIZE;
        uint256 owner1x1 = _owners[id];

        if (owner1x1 != 0) {
            return address(owner1x1); // cast to zero
        } else {
            address owner3x3 = address(_owners[LAYER_3x3 + (x/3) * 3 + ((y/3) * 3) * GRID_SIZE]);
            if (owner3x3 != address(0)) {
                return owner3x3;
            } else {
                address owner6x6 = address(_owners[LAYER_6x6 + (x/6) * 6 + ((y/6) * 6) * GRID_SIZE]);
                if (owner6x6 != address(0)) {
                    return owner6x6;
                } else {
                    address owner12x12 = address(_owners[LAYER_12x12 + (x/12) * 12 + ((y/12) * 12) * GRID_SIZE]);
                    if (owner12x12 != address(0)) {
                        return owner12x12;
                    } else {
                        return address(_owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE]);
                    }
                }
            }
        }
    }

    function _ownerAndOperatorEnabledOf(uint256 id) internal view returns (address owner, bool operatorEnabled) {
        require(id & LAYER == 0, "Invalid token id");
        uint256 x = id % GRID_SIZE;
        uint256 y = id / GRID_SIZE;
        uint256 owner1x1 = _owners[id];

        if (owner1x1 != 0) {
            owner = address(owner1x1);
            operatorEnabled = (owner1x1 / 2**255) == 1;
        } else {
            address owner3x3 = address(_owners[LAYER_3x3 + (x/3) * 3 + ((y/3) * 3) * GRID_SIZE]);
            if (owner3x3 != address(0)) {
                owner = owner3x3;
                operatorEnabled = false;
            } else {
                address owner6x6 = address(_owners[LAYER_6x6 + (x/6) * 6 + ((y/6) * 6) * GRID_SIZE]);
                if (owner6x6 != address(0)) {
                    owner = owner6x6;
                    operatorEnabled = false;
                } else {
                    address owner12x12 = address(_owners[LAYER_12x12 + (x/12) * 12 + ((y/12) * 12) * GRID_SIZE]);
                    if (owner12x12 != address(0)) {
                        owner = owner12x12;
                        operatorEnabled = false;
                    } else {
                        owner = address(_owners[LAYER_24x24 + (x/24) * 24 + ((y/24) * 24) * GRID_SIZE]);
                        operatorEnabled = false;
                    }
                }
            }
        }
    }

}

Settings
{
  "evmVersion": "petersburg",
  "libraries": {},
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"id","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"id","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"height","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"ids","type":"uint256[]"},{"name":"data","type":"bytes"}],"name":"batchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"ids","type":"uint256[]"},{"name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"operator","type":"address"},{"name":"id","type":"uint256"}],"name":"approveFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"size","type":"uint256"},{"name":"x","type":"uint256"},{"name":"y","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transferQuad","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"x","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"id","type":"uint256"}],"name":"y","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"isSuperOperator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"size","type":"uint256"},{"name":"x","type":"uint256"},{"name":"y","type":"uint256"},{"name":"data","type":"bytes"}],"name":"mintQuad","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"owner","type":"address"},{"name":"id","type":"uint256"}],"name":"_burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"id","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"_numNFTPerAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"metaTransactionProcessor","type":"address"},{"name":"enabled","type":"bool"}],"name":"setMetaTransactionProcessor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_owners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"_operatorsForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"width","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"superOperator","type":"address"},{"name":"enabled","type":"bool"}],"name":"setSuperOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"id","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_operators","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"minter","type":"address"},{"name":"enabled","type":"bool"}],"name":"setMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"isMetaTransactionProcessor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"isOperator","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"sizes","type":"uint256[]"},{"name":"xs","type":"uint256[]"},{"name":"ys","type":"uint256[]"},{"name":"data","type":"bytes"}],"name":"batchTransferQuad","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"operator","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAllFor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"metaTransactionContract","type":"address"},{"name":"admin","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"superOperator","type":"address"},{"indexed":false,"name":"enabled","type":"bool"}],"name":"Minter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"metaTransactionProcessor","type":"address"},{"indexed":false,"name":"enabled","type":"bool"}],"name":"MetaTransactionProcessor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"superOperator","type":"address"},{"indexed":false,"name":"enabled","type":"bool"}],"name":"SuperOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldAdmin","type":"address"},{"indexed":false,"name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

60806040523480156200001157600080fd5b506040516200496938038062004969833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b0319166001600160a01b038316179055818181816200006c82600162000078565b505050505050620000dc565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915582519384529083015280517fb21eb88b4e33b3f1281830a7178d74d8aa73220416215726b68ae23d539515cb9281900390910190a15050565b61487d80620000ec6000396000f3fe608060405234801561001057600080fd5b50600436106102ad5760003560e01c806370a082311161017b578063aa271e1a116100d8578063cf456ae71161008c578063e985e9c511610071578063e985e9c514610b3d578063eaa5e06714610b6b578063eeb5a5d114610cea576102ad565b8063cf456ae714610ae9578063dc5074af14610b17576102ad565b8063b88d4fde116100bd578063b88d4fde146109e9578063b9b710e914610aaf578063c87b56dd14610acc576102ad565b8063aa271e1a14610995578063ac9fe421146109bb576102ad565b806395d89b411161012f5780639d786bbc116101145780639d786bbc146109395780639ededf77146103d1578063a22cb46514610967576102ad565b806395d89b4114610914578063992924a61461091c576102ad565b80638782676411610160578063878267641461089a5780638a04af6a146108c05780638f283970146108ee576102ad565b806370a082311461084857806379cc67901461086e576102ad565b806338bb305a116102295780636352211e116101dd5780636e1e3bbf116101c25780636e1e3bbf146107795780636e9960c31461080a5780636ee678ae14610812576102ad565b80636352211e14610736578063654b748a14610753576102ad565b806342842e0e1161020e57806342842e0e146106c657806342966c68146106fc5780636259e7e114610719576102ad565b806338bb305a1461060d5780633f4263ef146106a9576102ad565b80630ef267431161028057806323b872dd1161026557806323b872dd146104c657806328cfbd46146104fc5780632b991746146105d7576102ad565b80630ef26743146103d157806315ddc535146103eb576102ad565b806301ffc9a7146102b257806306fdde03146102ed578063081812fc1461036a578063095ea7b3146103a3575b600080fd5b6102d9600480360360208110156102c857600080fd5b50356001600160e01b031916610d22565b604080519115158252519081900360200190f35b6102f5610dc1565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032f578181015183820152602001610317565b50505050905090810190601f16801561035c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103876004803603602081101561038057600080fd5b5035610df8565b604080516001600160a01b039092168252519081900360200190f35b6103cf600480360360408110156103b957600080fd5b506001600160a01b038135169060200135610e8e565b005b6103d9610fa2565b60408051918252519081900360200190f35b6103cf6004803603608081101561040157600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561043557600080fd5b82018360208201111561044757600080fd5b8035906020019184602083028401116401000000008311171561046957600080fd5b91939092909160208101903564010000000081111561048757600080fd5b82018360208201111561049957600080fd5b803590602001918460018302840111640100000000831117156104bb57600080fd5b509092509050610fa8565b6103cf600480360360608110156104dc57600080fd5b506001600160a01b03813581169160208101359091169060400135611022565b6103cf6004803603608081101561051257600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561054657600080fd5b82018360208201111561055857600080fd5b8035906020019184602083028401116401000000008311171561057a57600080fd5b91939092909160208101903564010000000081111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460018302840111640100000000831117156105cc57600080fd5b5090925090506110ea565b6103cf600480360360608110156105ed57600080fd5b506001600160a01b0381358116916020810135909116906040013561115f565b6103cf600480360360c081101561062357600080fd5b6001600160a01b0382358116926020810135909116916040820135916060810135916080820135919081019060c0810160a082013564010000000081111561066a57600080fd5b82018360208201111561067c57600080fd5b8035906020019184600183028401116401000000008311171561069e57600080fd5b5090925090506112f7565b6103d9600480360360208110156106bf57600080fd5b5035611523565b6103cf600480360360608110156106dc57600080fd5b506001600160a01b0381358116916020810135909116906040013561158b565b6103cf6004803603602081101561071257600080fd5b50356115a6565b6103d96004803603602081101561072f57600080fd5b50356115bc565b6103876004803603602081101561074c57600080fd5b5035611624565b6102d96004803603602081101561076957600080fd5b50356001600160a01b0316611683565b6103cf600480360360a081101561078f57600080fd5b6001600160a01b038235169160208101359160408201359160608101359181019060a0810160808201356401000000008111156107cb57600080fd5b8201836020820111156107dd57600080fd5b803590602001918460018302840111640100000000831117156107ff57600080fd5b5090925090506116a1565b610387611e3f565b6103cf6004803603606081101561082857600080fd5b506001600160a01b03813581169160208101359091169060400135611e4e565b6103d96004803603602081101561085e57600080fd5b50356001600160a01b0316611f29565b6103cf6004803603604081101561088457600080fd5b506001600160a01b038135169060200135611fa2565b6103d9600480360360208110156108b057600080fd5b50356001600160a01b0316612101565b6103cf600480360360408110156108d657600080fd5b506001600160a01b0381351690602001351515612113565b6103cf6004803603602081101561090457600080fd5b50356001600160a01b031661216a565b6102f561224b565b6103d96004803603602081101561093257600080fd5b5035612282565b6102d96004803603604081101561094f57600080fd5b506001600160a01b0381358116916020013516612294565b6103cf6004803603604081101561097d57600080fd5b506001600160a01b03813516906020013515156122b4565b6102d9600480360360208110156109ab57600080fd5b50356001600160a01b03166122bf565b6103cf600480360360408110156109d157600080fd5b506001600160a01b03813516906020013515156122dd565b6103cf600480360360808110156109ff57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135640100000000811115610a3a57600080fd5b820183602082011115610a4c57600080fd5b80359060200191846001830284011164010000000083111715610a6e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061238a945050505050565b61038760048036036020811015610ac557600080fd5b503561242c565b6102f560048036036020811015610ae257600080fd5b5035612447565b6103cf60048036036040811015610aff57600080fd5b506001600160a01b03813516906020013515156125b0565b6102d960048036036020811015610b2d57600080fd5b50356001600160a01b031661265d565b6102d960048036036040811015610b5357600080fd5b506001600160a01b038135811691602001351661267b565b6103cf600480360360c0811015610b8157600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135640100000000811115610bb557600080fd5b820183602082011115610bc757600080fd5b80359060200191846020830284011164010000000083111715610be957600080fd5b919390929091602081019035640100000000811115610c0757600080fd5b820183602082011115610c1957600080fd5b80359060200191846020830284011164010000000083111715610c3b57600080fd5b919390929091602081019035640100000000811115610c5957600080fd5b820183602082011115610c6b57600080fd5b80359060200191846020830284011164010000000083111715610c8d57600080fd5b919390929091602081019035640100000000811115610cab57600080fd5b820183602082011115610cbd57600080fd5b80359060200191846001830284011164010000000083111715610cdf57600080fd5b5090925090506126d2565b6103cf60048036036060811015610d0057600080fd5b506001600160a01b038135811691602081013590911690604001351515612ac0565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161480610d8557507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b80610db957507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b90505b919050565b60408051808201909152600f81527f53616e64626f782773204c414e44730000000000000000000000000000000000602082015290565b6000806000610e0684612ba1565b90925090506001600160a01b038216610e5d576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b8015610e83575050506000818152600660205260409020546001600160a01b0316610dbc565b600092505050610dbc565b6000610e9982612dc5565b90506001600160a01b038116610eed576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b038116331480610f1357503360009081526001602052604090205460ff165b80610f4157506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610f92576040805162461bcd60e51b815260206004820152601960248201527f6e6f7420617574686f72697a656420746f20617070726f766500000000000000604482015290519081900360640190fd5b610f9d818484612fba565b505050565b61019890565b61101a868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092018290525092506130a4915050565b505050505050565b600061102f84848461343b565b905061103c84848461366b565b61104e836001600160a01b03166136db565b80156110665750611066836317a2fd9160e21b613717565b156110e45761109381611079573361107b565b845b858585604051806020016040528060008152506137ca565b6110e4576040805162461bcd60e51b815260206004820152601e60248201527f657263373231207472616e736665722072656a656374656420627920746f0000604482015290519081900360640190fd5b50505050565b61101a868686868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020601f8a018190048102820181019092528881529250889150879081908401838280828437600092019190915250600192506130a4915050565b600061116a82612dc5565b90506001600160a01b0384166111c7576040805162461bcd60e51b815260206004820152601660248201527f73656e646572206973207a65726f206164647265737300000000000000000000604482015290519081900360640190fd5b336001600160a01b03851614806111ed57503360009081526002602052604090205460ff165b8061120757503360009081526001602052604090205460ff165b8061123557506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b611286576040805162461bcd60e51b815260206004820152601960248201527f6e6f7420617574686f72697a656420746f20617070726f766500000000000000604482015290519081900360640190fd5b836001600160a01b0316816001600160a01b0316146112ec576040805162461bcd60e51b815260206004820152600f60248201527f6f776e657220213d2073656e6465720000000000000000000000000000000000604482015290519081900360640190fd5b6110e4818484612fba565b6001600160a01b038716611352576040805162461bcd60e51b815260206004820152601460248201527f66726f6d206973207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0386166113ad576040805162461bcd60e51b815260206004820152601a60248201527f63616e27742073656e6420746f207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6000336001600160a01b038916148015906113d757503360009081526002602052604090205460ff165b9050336001600160a01b038916148015906113f0575080155b15611487573360009081526001602052604090205460ff168061143657506001600160a01b038816600090815260056020908152604080832033845290915290205460ff165b611487576040805162461bcd60e51b815260206004820152601e60248201527f6e6f7420617574686f72697a656420746f207472616e73666572517561640000604482015290519081900360640190fd5b6114948888888888613916565b6001600160a01b0380891660009081526003602052604080822080548a800290819003909155928a168252902080549091019055611519816114d657336114d8565b885b898989898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a7992505050565b5050505050505050565b60008061152f83612dc5565b6001600160a01b03161415611582576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b50610198900690565b610f9d8383836040518060200160405280600081525061238a565b6115b9336115b383612dc5565b83611e4e565b50565b6000806115c883612dc5565b6001600160a01b0316141561161b576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b50610198900490565b600061162f82612dc5565b90506001600160a01b038116610dbc576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b6001600160a01b031660009081526001602052604090205460ff1690565b6001600160a01b0386166116fc576040805162461bcd60e51b815260206004820152601260248201527f746f206973207a65726f20616464726573730000000000000000000000000000604482015290519081900360640190fd5b611705336122bf565b611756576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792061206d696e7465722063616e206d696e7400000000000000000000604482015290519081900360640190fd5b84848161175f57fe5b06158015611774575084838161177157fe5b06155b6117c5576040805162461bcd60e51b815260206004820152601360248201527f496e76616c696420636f6f7264696e6174657300000000000000000000000000604482015290519081900360640190fd5b846101980384111580156117dd575084610198038311155b61182e576040805162461bcd60e51b815260206004820152600d60248201527f4f7574206f6620626f756e647300000000000000000000000000000000000000604482015290519081900360640190fd5b6000610198840285016001871415611848578091506118f1565b866003141561185f5780600160f81b0191506118f1565b86600614156118765780600160f91b0191506118f1565b86600c141561188d5780600360f81b0191506118f1565b86601814156118a45780600160fa1b0191506118f1565b6040805162461bcd60e51b815260206004820152600c60248201527f496e76616c69642073697a650000000000000000000000000000000000000000604482015290519081900360640190fd5b6004600061019860188804601802026018898161190a57fe5b04601802600160fa1b0101815260200190815260200160002054600014611978576040805162461bcd60e51b815260206004820152601760248201527f416c7265616479206d696e746564206173203234783234000000000000000000604482015290519081900360640190fd5b858701858801600c8911611a125760046000610198600c8a04600c0202600c8b8161199f57fe5b04600c02600360f81b0101815260200190815260200160002054600014611a0d576040805162461bcd60e51b815260206004820152601760248201527f416c7265616479206d696e746564206173203132783132000000000000000000604482015290519081900360640190fd5b611aa8565b875b82811015611aa657875b82811015611a9d5761019881028201600360f81b0160008181526004602052604090205415611a94576040805162461bcd60e51b815260206004820152601760248201527f416c7265616479206d696e746564206173203132783132000000000000000000604482015290519081900360640190fd5b50600c01611a1e565b50600c01611a14565b505b60068911611b3c576004600061019860068a046006020260068b81611ac957fe5b04600602600160f91b0101815260200190815260200160002054600014611b37576040805162461bcd60e51b815260206004820152601560248201527f416c7265616479206d696e746564206173203678360000000000000000000000604482015290519081900360640190fd5b611bd2565b875b82811015611bd057875b82811015611bc75761019881028201600160f91b0160008181526004602052604090205415611bbe576040805162461bcd60e51b815260206004820152601560248201527f416c7265616479206d696e746564206173203678360000000000000000000000604482015290519081900360640190fd5b50600601611b48565b50600601611b3e565b505b60038911611c66576004600061019860038a046003020260038b81611bf357fe5b04600302600160f81b0101815260200190815260200160002054600014611c61576040805162461bcd60e51b815260206004820152601560248201527f416c7265616479206d696e746564206173203378330000000000000000000000604482015290519081900360640190fd5b611cfc565b875b82811015611cfa57875b82811015611cf15761019881028201600160f81b0160008181526004602052604090205415611ce8576040805162461bcd60e51b815260206004820152601560248201527f416c7265616479206d696e746564206173203378330000000000000000000000604482015290519081900360640190fd5b50600301611c72565b50600301611c68565b505b60005b898a02811015611dbc576000611d17828c8c8c613b28565b60008181526004602052604090205490915015611d7b576040805162461bcd60e51b815260206004820152600e60248201527f416c7265616479206d696e746564000000000000000000000000000000000000604482015290519081900360640190fd5b60405181906001600160a01b038e16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600101611cff565b5060008481526004602090815260408083206001600160a01b038e169081905583526003825280832080548d80020190558051601f8901839004830281018301909152878152611e3392339290918e918e918e918e91908e908e9081908401838280828437600092019190915250613a7992505050565b50505050505050505050565b6000546001600160a01b031690565b816001600160a01b0316836001600160a01b031614611eb4576040805162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60008181526004602090815260408083207401000000000000000000000000000000000000000090556001600160a01b0386168084526003909252808320805460001901905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505050565b60006001600160a01b038216611f86576040805162461bcd60e51b815260206004820152601560248201527f6f776e6572206973207a65726f20616464726573730000000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526003602052604090205490565b6001600160a01b038216611ffd576040805162461bcd60e51b815260206004820152601660248201527f496e76616c69642073656e646572206164647265737300000000000000000000604482015290519081900360640190fd5b60008061200983612ba1565b9092509050336001600160a01b038516148061203457503360009081526002602052604090205460ff165b8061205d575080801561205d57506000838152600660205260409020546001600160a01b031633145b8061207757503360009081526001602052604090205460ff165b806120a557506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b6120f6576040805162461bcd60e51b815260206004820152601660248201527f6e6f7420617574686f72697a656420746f206275726e00000000000000000000604482015290519081900360640190fd5b6110e4848385611e4e565b60036020526000908152604090205481565b6000546001600160a01b0316331461215c5760405162461bcd60e51b815260040180806020018281038252602e8152602001806147a5602e913960400191505060405180910390fd5b6121668282613b7f565b5050565b6000546001600160a01b031633146121c9576040805162461bcd60e51b815260206004820152601b60248201527f6f6e6c792061646d696e2063616e206368616e67652061646d696e0000000000604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f9281900390910190a1600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60408051808201909152600481527f4c414e4400000000000000000000000000000000000000000000000000000000602082015290565b60046020526000908152604090205481565b600560209081526000928352604080842090915290825290205460ff1681565b612166338383613be3565b6001600160a01b031660009081526007602052604090205460ff1690565b6000546001600160a01b031633146123265760405162461bcd60e51b815260040180806020018281038252602c815260200180614755602c913960400191505060405180910390fd5b6001600160a01b038216600081815260016020908152604091829020805460ff191685151590811790915582519384529083015280517f44f92d27abdf4cfb6a7d712c3af68f3be086d4ca747ab802c36f67d6790060d89281900390910190a15050565b600061239785858561343b565b90506123a485858561366b565b6123b6846001600160a01b03166136db565b15612425576123d4816123c957336123cb565b855b868686866137ca565b612425576040805162461bcd60e51b815260206004820152601f60248201527f4552433732313a207472616e736665722072656a656374656420627920746f00604482015290519081900360640190fd5b5050505050565b6006602052600090815260409020546001600160a01b031681565b6060600061245483612dc5565b6001600160a01b031614156124b0576040805162461bcd60e51b815260206004820152601160248201527f496420646f6573206e6f74206578697374000000000000000000000000000000604482015290519081900360640190fd5b6124b982613ca9565b60405160200180807f68747470733a2f2f6170692e73616e64626f782e67616d652f6c616e64732f00815250601f0182805190602001908083835b6020831061253157805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016124f4565b5181516020939093036101000a60001901801990911692169190911790527f2f6d657461646174612e6a736f6e000000000000000000000000000000000000920191825250604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee018152600e9092019052949350505050565b6000546001600160a01b031633146125f95760405162461bcd60e51b81526004018080602001828103825260248152602001806146fb6024913960400191505060405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915582519384529083015280517fff452b3b9159b024a9098f0058c63eccd90d36b3584608202800d662f962bb609281900390910190a15050565b6001600160a01b031660009081526002602052604090205460ff1690565b6001600160a01b03808316600090815260056020908152604080832093851683529290529081205460ff16806126c957506001600160a01b03821660009081526001602052604090205460ff165b90505b92915050565b6001600160a01b038a1661272d576040805162461bcd60e51b815260206004820152601460248201527f66726f6d206973207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b6001600160a01b038916612788576040805162461bcd60e51b815260206004820152601a60248201527f63616e27742073656e6420746f207a65726f2061646472657373000000000000604482015290519081900360640190fd5b868514801561279657508483145b6127e7576040805162461bcd60e51b815260206004820152600c60248201527f696e76616c696420646174610000000000000000000000000000000000000000604482015290519081900360640190fd5b6000336001600160a01b038c161480159061281157503360009081526002602052604090205460ff165b9050336001600160a01b038c161480159061282a575080155b156128ab573360009081526001602052604090205460ff168061287057506001600160a01b038b16600090815260056020908152604080832033845290915290205460ff165b6128ab5760405162461bcd60e51b81526004018080602001828103825260248152602001806147816024913960400191505060405180910390fd5b6000805b8981101561290e5760008b8b838181106128c557fe5b9050602002013590506128ff8e8e838d8d878181106128e057fe5b905060200201358c8c888181106128f357fe5b90506020020135613916565b800291909101906001016128af565b506001600160a01b03808d1660009081526003602052604080822080548590039055918d16808252919020805483019055612948906136db565b801561296057506129608b6317a2fd9160e21b613717565b15612ab257606081604051908082528060200260200182016040528015612991578160200160208202803883390190505b5090506000805b8b811015612a245760008d8d838181106129ae57fe5b90506020020135905060008090505b818202811015612a1a576129f781838f8f878181106129d857fe5b905060200201358e8e888181106129eb57fe5b90506020020135613b28565b858581518110612a0357fe5b6020908102919091010152600193840193016129bd565b5050600101612998565b50612a7484612a335733612a35565b8e5b8f8f858a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613d9e92505050565b612aaf5760405162461bcd60e51b81526004018080602001828103825260248152602001806146d76024913960400191505060405180910390fd5b50505b505050505050505050505050565b6001600160a01b038316612b1b576040805162461bcd60e51b815260206004820152601660248201527f496e76616c69642073656e646572206164647265737300000000000000000000604482015290519081900360640190fd5b336001600160a01b0384161480612b4157503360009081526002602052604090205460ff165b80612b5b57503360009081526001602052604090205460ff165b612b965760405162461bcd60e51b81526004018080602001828103825260218152602001806147fd6021913960400191505060405180910390fd5b610f9d838383613be3565b6000807fff00000000000000000000000000000000000000000000000000000000000000831615612c19576040805162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e20696400000000000000000000000000000000604482015290519081900360640190fd5b60008381526004602052604090205461019880850691908504908015612c69579350837f800000000000000000000000000000000000000000000000000000000000000081046001149350612dbd565b6000600481610198600386046003020260038781612c8357fe5b04600302600160f81b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612cc55780955060009450612dbb565b6000600481610198600687046006020260068881612cdf57fe5b04600602600160f91b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612d215780965060009550612db9565b6000600481610198600c8804600c0202600c8981612d3b57fe5b04600c02600360f81b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612d7d5780975060009650612db7565b60046000610198601888046018020260188981612d9657fe5b04601802600160fa1b01018152602001908152602001600020549750600096505b505b505b505b505050915091565b60007fff00000000000000000000000000000000000000000000000000000000000000821615612e3c576040805162461bcd60e51b815260206004820152601060248201527f496e76616c696420746f6b656e20696400000000000000000000000000000000604482015290519081900360640190fd5b60008281526004602052604090205461019880840691908404908015612e66579250610dbc915050565b6000600481610198600386046003020260038781612e8057fe5b04600302600160f81b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612ec1579350610dbc92505050565b6000600481610198600687046006020260068881612edb57fe5b04600602600160f91b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612f1d579450610dbc9350505050565b6000600481610198600c8804600c0202600c8981612f3757fe5b04600c02600360f81b0101815260200190815260200160002054905060006001600160a01b0316816001600160a01b031614612f7a579550610dbc945050505050565b60046000610198601888046018020260188981612f9357fe5b04601802600160fa1b01018152602001908152602001600020549650505050505050610dbc565b6001600160a01b038216612fe75760008181526004602052604090206001600160a01b038416905561305e565b60008181526004602090815260408083206001600160a01b038781167f800000000000000000000000000000000000000000000000000000000000000001909155600690925290912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169184169190911790555b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000336001600160a01b038716148015906130ce57503360009081526002602052604090205460ff165b90506000336001600160a01b03881614806130e65750815b8061310057503360009081526001602052604090205460ff165b8061312e57506001600160a01b038716600090815260056020908152604080832033845290915290205460ff165b90506001600160a01b03871661318b576040805162461bcd60e51b815260206004820152601460248201527f66726f6d206973207a65726f2061646472657373000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0386166131e6576040805162461bcd60e51b815260206004820152601a60248201527f63616e27742073656e6420746f207a65726f2061646472657373000000000000604482015290519081900360640190fd5b845160005b8181101561336957600087828151811061320157fe5b6020026020010151905060008061321783612ba1565b915091508b6001600160a01b0316826001600160a01b031614613281576040805162461bcd60e51b815260206004820152601e60248201527f6e6f74206f776e657220696e2062617463685472616e7366657246726f6d0000604482015290519081900360640190fd5b85806132ab57508080156132ab57506000838152600660205260409020546001600160a01b031633145b6132fc576040805162461bcd60e51b815260206004820152600e60248201527f6e6f7420617574686f72697a6564000000000000000000000000000000000000604482015290519081900360640190fd5b8a6001600160a01b03166004600085815260200190815260200160002081905550828b6001600160a01b03168d6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050506001016131eb565b50866001600160a01b0316886001600160a01b0316146133b1576001600160a01b03808916600090815260036020526040808220805485900390559189168152208054820190555b6133c3876001600160a01b03166136db565b80156133e2575083806133e257506133e2876317a2fd9160e21b613717565b1561151957613400836133f557336133f7565b885b89898989613d9e565b6115195760405162461bcd60e51b81526004018080602001828103825260248152602001806146d76024913960400191505060405180910390fd5b600080600061344984612ba1565b90925090506001600160a01b0382166134a0576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b856001600160a01b0316826001600160a01b031614613506576040805162461bcd60e51b815260206004820152601b60248201527f6e6f74206f776e657220696e205f636865636b5472616e736665720000000000604482015290519081900360640190fd5b6001600160a01b038516613561576040805162461bcd60e51b815260206004820152601a60248201527f63616e27742073656e6420746f207a65726f2061646472657373000000000000604482015290519081900360640190fd5b336001600160a01b0387161480159061358957503360009081526002602052604090205460ff165b9250336001600160a01b038716148015906135a2575082155b15613662573360009081526001602052604090205460ff16806135e857506001600160a01b038616600090815260056020908152604080832033845290915290205460ff165b80613611575080801561361157506000848152600660205260409020546001600160a01b031633145b613662576040805162461bcd60e51b815260206004820152601860248201527f6e6f7420617070726f76656420746f207472616e736665720000000000000000604482015290519081900360640190fd5b50509392505050565b6001600160a01b03808416600081815260036020908152604080832080546000190190559386168083528483208054600101905585835260049091528382208190559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f801580159061370f5750818114155b949350505050565b604080516001600160e01b031983166024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858c612710fa955080519450505050609e5a116137b657fe5b8280156137c05750815b9695505050505050565b600080846001600160a01b031663150b7a02888887876040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561386257818101518382015260200161384a565b50505050905090810190601f16801561388f5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156138b157600080fd5b505af11580156138c5573d6000803e3d6000fd5b505050506040513d60208110156138db57600080fd5b50516001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149150505b95945050505050565b8260011415613a0b5761019881028201600061393182612dc5565b90506001600160a01b038116613985576040805162461bcd60e51b81526020600482015260146024820152731d1bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015290519081900360640190fd5b866001600160a01b0316816001600160a01b0316146139eb576040805162461bcd60e51b815260206004820152601a60248201527f6e6f74206f776e657220696e205f7472616e7366657251756164000000000000604482015290519081900360640190fd5b5060009081526004602052604090206001600160a01b0385169055613a18565b613a188585858585613f27565b60005b83840281101561101a57613a3181858585613b28565b856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600101613a1b565b613a8b856001600160a01b03166136db565b8015613aa35750613aa3856317a2fd9160e21b613717565b15613b1f576060848502604051908082528060200260200182016040528015613ad6578160200160208202803883390190505b50905060005b858602811015613b1157613af281878787613b28565b828281518110613afe57fe5b6020908102919091010152600101613adc565b506134008888888486613d9e565b50505050505050565b600080848681613b3457fe5b04905060028106613b5b5761019881840102858781613b4f57fe5b0685010191505061370f565b61019881840102858781613b6b57fe5b066001018686010301915050949350505050565b6001600160a01b038216600081815260026020908152604091829020805460ff191685151590811790915582519384529083015280517fb21eb88b4e33b3f1281830a7178d74d8aa73220416215726b68ae23d539515cb9281900390910190a15050565b6001600160a01b03821660009081526001602052604090205460ff1615613c3b5760405162461bcd60e51b815260040180806020018281038252603681526020018061471f6036913960400191505060405180910390fd5b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b606081613cea575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610dbc565b8160005b8115613d0257600101600a82049150613cee565b6060816040519080825280601f01601f191660200182016040528015613d2f576020820181803883390190505b50905060001982015b8515613d9557600a860660300160f81b82828060019003935081518110613d5b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550613d38565b50949350505050565b600080846001600160a01b0316634b808c46888887876040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b031681526020018060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613e37578181015183820152602001613e1f565b50505050905001838103825284818151815260200191508051906020019080838360005b83811015613e73578181015183820152602001613e5b565b50505050905090810190601f168015613ea05780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b505050506040513d6020811015613eed57600080fd5b50516001600160e01b0319167f4b808c46000000000000000000000000000000000000000000000000000000001491505095945050505050565b828281613f3057fe5b06158015613f455750828181613f4257fe5b06155b613f96576040805162461bcd60e51b815260206004820152601360248201527f496e76616c696420636f6f7264696e6174657300000000000000000000000000604482015290519081900360640190fd5b82610198038211158015613fae575082610198038111155b613fff576040805162461bcd60e51b815260206004820152600d60248201527f4f7574206f6620626f756e647300000000000000000000000000000000000000604482015290519081900360640190fd5b826003141561401c57614016858584846001614061565b50612425565b82600614156140335761401685858484600161421c565b82600c141561404a57614016858584846001614362565b82601814156118a4576140168585848460016144a8565b600061019883028401600160f81b81016001865b876003018110156140b957865b876003018110156140b05761409d8b61019883028401614639565b80156140a65750825b9250600101614082565b50600101614075565b50841561421057806141eb576000828152600460205260409020546001600160a01b038a16148061412457506001600160a01b0389166004600061019860068a046006020260068b8161410857fe5b04600602600160f91b0101815260200190815260200160002054145b8061416a57506001600160a01b03891660046000610198600c8a5b04600c0202600c8b8161414e57fe5b04600c02600360f81b0101815260200190815260200160002054145b806141b057506001600160a01b0389166004600061019860188a5b046018020260188b8161419457fe5b04601802600160fa1b0101815260200190815260200160002054145b6141eb5760405162461bcd60e51b815260040180806020018281038252602b81526020018061481e602b913960400191505060405180910390fd5b5060009081526004602052604090206001600160a01b0387169055506001905061390d565b98975050505050505050565b600061019883028401600160f91b81016001865b8760060181101561431d57865b876006018110156143145760006142588c8c85856000614061565b61019883028401600160f81b016000818152600460205260409020549192509080156142f057826142e0578d6001600160a01b031681146142e0576040805162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f662033783320717561640000000000000000000000604482015290519081900360640190fd5b6000828152600460205260408120555b82806142fb57508015155b80156143045750855b955050505060038101905061423d565b50600301614230565b50841561421057806141eb576000828152600460205260409020546001600160a01b038a16148061416a57506001600160a01b03891660046000610198600c8a61413f565b600061019883028401600360f81b81016001865b87600c0181101561446357865b87600c0181101561445a57600061439e8c8c8585600061421c565b61019883028401600160f91b016000818152600460205260409020549192509080156144365782614426578d6001600160a01b03168114614426576040805162461bcd60e51b815260206004820152601560248201527f6e6f74206f776e6572206f662036783620717561640000000000000000000000604482015290519081900360640190fd5b6000828152600460205260408120555b828061444157508015155b801561444a5750855b9550505050600681019050614383565b50600601614376565b50841561421057806141eb576000828152600460205260409020546001600160a01b038a1614806141b057506001600160a01b0389166004600061019860188a614185565b600061019883028401600160fa1b81016001865b876018018110156145a957865b876018018110156145a05760006144e48c8c85856000614362565b61019883028401600360f81b0160008181526004602052604090205491925090801561457c578261456c578d6001600160a01b0316811461456c576040805162461bcd60e51b815260206004820152601760248201527f6e6f74206f776e6572206f662031327831322071756164000000000000000000604482015290519081900360640190fd5b6000828152600460205260408120555b828061458757508015155b80156145905750855b9550505050600c810190506144c9565b50600c016144bc565b50841561460a57806141eb576000828152600460205260409020546001600160a01b038a16146141eb5760405162461bcd60e51b815260040180806020018281038252602a8152602001806147d3602a913960400191505060405180910390fd5b808061462c57506000828152600460205260409020546001600160a01b038a16145b9998505050505050505050565b60008181526004602052604081205480156146cc57836001600160a01b0316816001600160a01b0316146146b4576040805162461bcd60e51b815260206004820152600960248201527f6e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b505060008181526004602052604081205560016126cc565b506000939250505056fe657263373231206261746368207472616e736665722072656a656374656420627920746f6f6e6c792061646d696e20697320616c6c6f77656420746f20616464206d696e746572737375706572206f70657261746f722063616e2774206861766520746865697220617070726f76616c466f72416c6c206368616e6765646f6e6c792061646d696e20697320616c6c6f77656420746f20616464207375706572206f70657261746f72736e6f7420617574686f72697a656420746f207472616e736665724d756c746951756164736f6e6c792061646d696e2063616e207365747570206d6574615472616e73616374696f6e50726f636573736f72736e6f74206f776e6572206f6620616c6c20737562207175616473206e6f7420706172656e7420717561646e6f7420617574686f72697a656420746f20617070726f766520666f7220616c6c6e6f74206f776e6572206f6620616c6c20737562207175616473206e6f7220706172656e74207175616473a265627a7a7230582083895022ccd1f4731144230de229e76c02767e3161aeff679a637da2234bc09f64736f6c634300050900320000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d000000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8

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

0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d000000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8

-----Decoded View---------------
Arg [0] : metaTransactionContract (address): 0x3845badAde8e6dFF049820680d1F14bD3903a5d0
Arg [1] : admin (address): 0x18dd4e0eb8699eA4FeE238dE41ECfb95e32272f8

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d0
Arg [1] : 00000000000000000000000018dd4e0eb8699ea4fee238de41ecfb95e32272f8


Deployed ByteCode Sourcemap

106:2072:7:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;106:2072:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2029:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2029:147:7;-1:-1:-1;;;;;;2029:147:7;;:::i;:::-;;;;;;;;;;;;;;;;;;428:95;;;:::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;428:95:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4521:338:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4521:338:8;;:::i;:::-;;;;-1:-1:-1;;;;;4521:338:8;;;;;;;;;;;;;;3957:400;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3957:400:8;;;;;;;;:::i;:::-;;2126:77:9;;;:::i;:::-;;;;;;;;;;;;;;;;8618:170:8;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8618:170:8;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8618:170:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8618:170:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8618:170:8;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8618:170:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8618:170:8;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;8618:170:8;;-1:-1:-1;8618:170:8;-1:-1:-1;8618:170:8;:::i;6900:439::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6900:439:8;;;;;;;;;;;;;;;;;:::i;10485:173::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;10485:173:8;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;10485:173:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10485:173:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;10485:173:8;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;10485:173:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10485:173:8;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;10485:173:8;;-1:-1:-1;10485:173:8;-1:-1:-1;10485:173:8;:::i;3208:560::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3208:560:8;;;;;;;;;;;;;;;;;:::i;6717:804:9:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;6717:804:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;6717:804:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6717:804:9;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;6717:804:9;;-1:-1:-1;6717:804:9;-1:-1:-1;6717:804:9;:::i;2312:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2312:156:9;;:::i;8255:124:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;8255:124:8;;;;;;;;;;;;;;;;;:::i;13255:87::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13255:87:8;;:::i;2577:156:9:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2577:156:9;;:::i;2406:166:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2406:166:8;;:::i;970:109:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;970:109:2;-1:-1:-1;;;;;970:109:2;;:::i;3102:2891:9:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;3102:2891:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3102:2891:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3102:2891:9;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;3102:2891:9;;-1:-1:-1;3102:2891:9;-1:-1:-1;3102:2891:9;:::i;264:82:0:-;;;:::i;12921:249:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12921:249:8;;;;;;;;;;;;;;;;;:::i;1740:177::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1740:177:8;-1:-1:-1;;;;;1740:177:8;;:::i;13493:543::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13493:543:8;;;;;;;;:::i;902:53::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;902:53:8;-1:-1:-1;;;;;902:53:8;;:::i;572:295:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;572:295:1;;;;;;;;;;:::i;469:197:0:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;469:197:0;-1:-1:-1;;;;;469:197:0;;:::i;648:86:7:-;;;:::i;961:43:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;961:43:8;;:::i;1010:69::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1010:69:8;;;;;;;;;;:::i;11969:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11969:136:8;;;;;;;;;;:::i;1669:95:9:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1669:95:9;-1:-1:-1;;;;;1669:95:9;;:::i;484:302:2:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;484:302:2;;;;;;;;;;:::i;7615:401:8:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;7615:401:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;7615:401:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;7615:401:8;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;7615:401:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7615:401:8;;-1:-1:-1;7615:401:8;;-1:-1:-1;;;;;7615:401:8:i;1085:46::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1085:46:8;;:::i;1394:367:7:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1394:367:7;;:::i;1247:252:9:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;1247:252:9;;;;;;;;;;:::i;1330:131:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1330:131:1;-1:-1:-1;;;;;1330:131:1;;:::i;12702:213:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12702:213:8;;;;;;;;;;:::i;8580:1793:9:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;8580:1793:9;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8580:1793:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8580:1793:9;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8580:1793:9;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8580:1793:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8580:1793:9;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8580:1793:9;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8580:1793:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8580:1793:9;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;8580:1793:9;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;8580:1793:9;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;8580:1793:9;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;8580:1793:9;;-1:-1:-1;8580:1793:9;-1:-1:-1;8580:1793:9;:::i;11292:453:8:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11292:453:8;;;;;;;;;;;;;;;;;;;:::i;2029:147:7:-;2090:4;2113:16;-1:-1:-1;;;;;;2113:16:7;;;;:36;;-1:-1:-1;2133:16:7;-1:-1:-1;;;;;;2133:16:7;;;2113:36;:56;;;-1:-1:-1;2153:16:7;-1:-1:-1;;;;;;2153:16:7;;;2113:56;2106:63;;2029:147;;;;:::o;428:95::-;492:24;;;;;;;;;;;;;;;;;428:95;:::o;4521:338:8:-;4577:7;4597:13;4612:20;4636:30;4663:2;4636:26;:30::i;:::-;4596:70;;-1:-1:-1;4596:70:8;-1:-1:-1;;;;;;4684:19:8;;4676:52;;;;;-1:-1:-1;;;4676:52:8;;;;;;;;;;;;-1:-1:-1;;;4676:52:8;;;;;;;;;;;;;;;4742:15;4738:115;;;-1:-1:-1;;;4780:14:8;;;;:10;:14;;;;;;-1:-1:-1;;;;;4780:14:8;4773:21;;4738:115;4840:1;4825:17;;;;;;3957:400;4023:13;4039:12;4048:2;4039:8;:12::i;:::-;4023:28;-1:-1:-1;;;;;;4069:19:8;;4061:52;;;;;-1:-1:-1;;;4061:52:8;;;;;;;;;;;;-1:-1:-1;;;4061:52:8;;;;;;;;;;;;;;;-1:-1:-1;;;;;4144:19:8;;4153:10;4144:19;;:62;;-1:-1:-1;4195:10:8;4179:27;;;;:15;:27;;;;;;;;4144:62;:113;;;-1:-1:-1;;;;;;4222:23:8;;;;;;:16;:23;;;;;;;;4246:10;4222:35;;;;;;;;;;4144:113;4123:185;;;;;-1:-1:-1;;;4123:185:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4318:32;4330:5;4337:8;4347:2;4318:11;:32::i;:::-;3957:400;;;:::o;2126:77:9:-;228:3;2126:77;:::o;8618:170:8:-;8735:46;8754:4;8760:2;8764:3;;8735:46;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;8735:46:8;;;;137:4:-1;8735:46:8;;;;;;;;;;;;;;;;;;-1:-1:-1;8769:4:8;;-1:-1:-1;8769:4:8;;;;8735:46;;8769:4;;;;8735:46;1:33:-1;99:1;81:16;;74:27;;;-1:-1;99:1;-1:-1;8735:18:8;;-1:-1:-1;;8735:46:8:i;:::-;8618:170;;;;;;:::o;6900:439::-;6979:11;6993:28;7008:4;7014:2;7018;6993:14;:28::i;:::-;6979:42;;7031:27;7045:4;7051:2;7055;7031:13;:27::i;:::-;7072:15;:2;-1:-1:-1;;;;;7072:13:8;;:15::i;:::-;:77;;;;-1:-1:-1;7091:58:8;7119:2;-1:-1:-1;;;7091:27:8;:58::i;:::-;7068:265;;;7190:68;7213:6;:26;;7229:10;7213:26;;;7222:4;7213:26;7241:4;7247:2;7251;7190:68;;;;;;;;;;;;:22;:68::i;:::-;7165:157;;;;;-1:-1:-1;;;7165:157:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;6900:439;;;;:::o;10485:173::-;10606:45;10625:4;10631:2;10635:3;;10606:45;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;10606:45:8;;;;137:4:-1;10606:45:8;;;;;;;;;;;;;;;;;;-1:-1:-1;10640:4:8;;-1:-1:-1;10640:4:8;;;;10606:45;;10640:4;;;;10606:45;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;10646:4:8;;-1:-1:-1;10606:18:8;;-1:-1:-1;;10606:45:8:i;3208:560::-;3323:13;3339:12;3348:2;3339:8;:12::i;:::-;3323:28;-1:-1:-1;;;;;;3369:20:8;;3361:55;;;;;-1:-1:-1;;;3361:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3447:10;-1:-1:-1;;;;;3447:20:8;;;;:73;;-1:-1:-1;3509:10:8;3483:37;;;;:25;:37;;;;;;;;3447:73;:116;;;-1:-1:-1;3552:10:8;3536:27;;;;:15;:27;;;;;;;;3447:116;:168;;;-1:-1:-1;;;;;;3579:24:8;;;;;;:16;:24;;;;;;;;3604:10;3579:36;;;;;;;;;;3447:168;3426:240;;;;;-1:-1:-1;;;3426:240:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3693:6;-1:-1:-1;;;;;3684:15:8;:5;-1:-1:-1;;;;;3684:15:8;;3676:43;;;;;-1:-1:-1;;;3676:43:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3729:32;3741:5;3748:8;3758:2;3729:11;:32::i;6717:804:9:-;-1:-1:-1;;;;;6849:18:9;;6841:51;;;;;-1:-1:-1;;;6841:51:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6910:16:9;;6902:55;;;;;-1:-1:-1;;;6902:55:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;6967:11;6981:10;-1:-1:-1;;;;;6981:18:9;;;;;;:59;;-1:-1:-1;7029:10:9;7003:37;;;;:25;:37;;;;;;;;6981:59;6967:73;-1:-1:-1;7054:10:9;-1:-1:-1;;;;;7054:18:9;;;;;;:29;;;7077:6;7076:7;7054:29;7050:230;;;7140:10;7124:27;;;;:15;:27;;;;;;;;;:81;;-1:-1:-1;;;;;;7171:22:9;;;;;;:16;:22;;;;;;;;7194:10;7171:34;;;;;;;;;;7124:81;7099:170;;;;;-1:-1:-1;;;7099:170:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;7289:35;7303:4;7309:2;7313:4;7319:1;7322;7289:13;:35::i;:::-;-1:-1:-1;;;;;7334:23:9;;;;;;;:17;:23;;;;;;:38;;7361:11;;;7334:38;;;;;;;7382:21;;;;;;;:36;;;;;;;7429:85;7459:6;:26;;7475:10;7459:26;;;7468:4;7459:26;7487:4;7493:2;7497:4;7503:1;7506;7509:4;;7429:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7429:29:9;;-1:-1:-1;;;7429:85:9:i;:::-;6717:804;;;;;;;;:::o;2312:156::-;2352:7;;2379:12;2388:2;2379:8;:12::i;:::-;-1:-1:-1;;;;;2379:26:9;;;2371:59;;;;;-1:-1:-1;;;2371:59:9;;;;;;;;;;;;-1:-1:-1;;;2371:59:9;;;;;;;;;;;;;;;-1:-1:-1;228:3:9;2447:14;;;2312:156::o;8255:124:8:-;8338:34;8355:4;8361:2;8365;8338:34;;;;;;;;;;;;:16;:34::i;13255:87::-;13300:35;13306:10;13318:12;13327:2;13318:8;:12::i;:::-;13332:2;13300:5;:35::i;:::-;13255:87;:::o;2577:156:9:-;2617:7;;2644:12;2653:2;2644:8;:12::i;:::-;-1:-1:-1;;;;;2644:26:9;;;2636:59;;;;;-1:-1:-1;;;2636:59:9;;;;;;;;;;;;-1:-1:-1;;;2636:59:9;;;;;;;;;;;;;;;-1:-1:-1;228:3:9;2712:14;;;2577:156::o;2406:166:8:-;2458:13;2491:12;2500:2;2491:8;:12::i;:::-;2483:20;-1:-1:-1;;;;;;2521:19:8;;2513:52;;;;;-1:-1:-1;;;2513:52:8;;;;;;;;;;;;-1:-1:-1;;;2513:52:8;;;;;;;;;;;;;;970:109:2;-1:-1:-1;;;;;1052:20:2;1029:4;1052:20;;;:15;:20;;;;;;;;;970:109::o;3102:2891:9:-;-1:-1:-1;;;;;3216:16:9;;3208:47;;;;;-1:-1:-1;;;3208:47:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3286:20;3295:10;3286:8;:20::i;:::-;3265:89;;;;;-1:-1:-1;;;3265:89:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3376:4;3372:1;:8;;;;;;:13;:30;;;;;3393:4;3389:1;:8;;;;;;:13;3372:30;3364:62;;;;;-1:-1:-1;;;3364:62:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3461:4;228:3;3449:16;3444:1;:21;;:46;;;;;3486:4;228:3;3474:16;3469:1;:21;;3444:46;3436:72;;;;;-1:-1:-1;;;3436:72:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3519:14;228:3;3560:13;;3556:17;;3596:1;3588:9;;3584:394;;;3622:2;3613:11;;3584:394;;;3645:4;3653:1;3645:9;3641:337;;;3691:2;-1:-1:-1;;;3679:14:9;3670:23;;3641:337;;;3714:4;3722:1;3714:9;3710:268;;;3760:2;-1:-1:-1;;;3748:14:9;3739:23;;3710:268;;;3783:4;3791:2;3783:10;3779:199;;;3832:2;-1:-1:-1;;;3818:16:9;3809:25;;3779:199;;;3855:4;3863:2;3855:10;3851:127;;;3904:2;-1:-1:-1;;;3890:16:9;3881:25;;3851:127;;;3937:30;;;-1:-1:-1;;;3937:30:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;3996:7;:62;228:3;4036:2;4034:1;:4;4042:2;4033:11;4032:25;4021:2;4019:1;:4;;;;;;4027:2;4018:11;-1:-1:-1;;;4004:25:9;:53;3996:62;;;;;;;;;;;;4062:1;3996:67;3988:103;;;;;-1:-1:-1;;;3988:103:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4116:6;;;4146;;;4174:2;4166:10;;4162:521;;4217:7;:62;228:3;4257:2;4255:1;:4;4263:2;4254:11;4253:25;4242:2;4240:1;:4;;;;;;4248:2;4239:11;-1:-1:-1;;;4225:25:9;:53;4217:62;;;;;;;;;;;;4283:1;4217:67;4192:149;;;;;-1:-1:-1;;;4192:149:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4162:521;;;4392:1;4372:301;4402:3;4395:4;:10;4372:301;;;4457:1;4437:222;4467:3;4460:4;:10;4437:222;;;228:3;4545:16;;4524:37;;-1:-1:-1;;;4524:37:9;4506:15;4591:16;;;:7;:16;;;;;;:21;4583:57;;;;;-1:-1:-1;;;4583:57:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4480:2:9;4472:10;4437:222;;;-1:-1:-1;4415:2:9;4407:10;4372:301;;;;4162:521;4705:1;4697:4;:9;4693:448;;4730:7;:56;228:3;4766:1;4764;:3;4771:1;4763:9;4762:23;4753:1;4751;:3;;;;;;4758:1;4750:9;-1:-1:-1;;;4738:21:9;:47;4730:56;;;;;;;;;;;;4790:1;4730:61;4722:95;;;;;-1:-1:-1;;;4722:95:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;4693:448;;;4867:1;4848:283;4876:3;4870;:9;4848:283;;;4928:1;4909:208;4937:3;4931;:9;4909:208;;;228:3;5008:15;;4990:33;;-1:-1:-1;;;4990:33:9;4974:13;5053:14;;;:7;:14;;;;;;:19;5045:53;;;;;-1:-1:-1;;;5045:53:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4949:1:9;4942:8;4909:208;;;-1:-1:-1;4888:1:9;4881:8;4848:283;;;;4693:448;5163:1;5155:4;:9;5151:448;;5188:7;:56;228:3;5224:1;5222;:3;5229:1;5221:9;5220:23;5211:1;5209;:3;;;;;;5216:1;5208:9;-1:-1:-1;;;5196:21:9;:47;5188:56;;;;;;;;;;;;5248:1;5188:61;5180:95;;;;;-1:-1:-1;;;5180:95:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;5151:448;;;5325:1;5306:283;5334:3;5328;:9;5306:283;;;5386:1;5367:208;5395:3;5389;:9;5367:208;;;228:3;5466:15;;5448:33;;-1:-1:-1;;;5448:33:9;5432:13;5511:14;;;:7;:14;;;;;;:19;5503:53;;;;;-1:-1:-1;;;5503:53:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5407:1:9;5400:8;5367:208;;;-1:-1:-1;5346:1:9;5339:8;5306:283;;;;5151:448;5614:9;5609:206;5638:4;5633;:9;5629:1;:13;5609:206;;;5663:10;5676:24;5686:1;5689:4;5695:1;5698;5676:9;:24::i;:::-;5722:11;;;;:7;:11;;;;;;5663:37;;-1:-1:-1;5722:16:9;5714:43;;;;;-1:-1:-1;;;5714:43:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;5776:28;;5801:2;;-1:-1:-1;;;;;5776:28:9;;;5793:1;;5776:28;;5793:1;;5776:28;-1:-1:-1;5644:3:9;;5609:206;;;-1:-1:-1;5825:15:9;;;;:7;:15;;;;;;;;-1:-1:-1;;;;;5843:11:9;;5825:29;;;;5864:21;;:17;:21;;;;;:36;;5889:11;;;5864:36;;;5911:75;;;;;;;;;;;;;;;;;;;;;;5941:10;;5825:15;;5851:2;;5896:4;;5975:1;;5978;;5911:75;5981:4;;;;;;5911:75;;5981:4;;;;5911:75;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;5911:29:9;;-1:-1:-1;;;5911:75:9:i;:::-;3102:2891;;;;;;;;;;:::o;264:82:0:-;307:7;333:6;-1:-1:-1;;;;;333:6:0;264:82;:::o;12921:249:8:-;13010:5;-1:-1:-1;;;;;13002:13:8;:4;-1:-1:-1;;;;;13002:13:8;;12994:35;;;;;-1:-1:-1;;;12994:35:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;13039:11;;;;:7;:11;;;;;;;;13053:6;13039:20;;-1:-1:-1;;;;;13093:23:8;;;;;:17;:23;;;;;;:25;;-1:-1:-1;;13093:25:8;;;13133:30;13047:2;;13039:11;13093:23;13133:30;;13039:11;;13133:30;12921:249;;;:::o;1740:177::-;1797:7;-1:-1:-1;;;;;1824:19:8;;1816:53;;;;;-1:-1:-1;;;1816:53:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1886:24:8;;;;;:17;:24;;;;;;;1740:177::o;13493:543::-;-1:-1:-1;;;;;13564:18:8;;13556:53;;;;;-1:-1:-1;;;13556:53:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;13620:13;13635:20;13659:30;13686:2;13659:26;:30::i;:::-;13619:70;;-1:-1:-1;13619:70:8;-1:-1:-1;13720:10:8;-1:-1:-1;;;;;13720:18:8;;;;:71;;-1:-1:-1;13780:10:8;13754:37;;;;:25;:37;;;;;;;;13720:71;:136;;;;13808:15;:47;;;;-1:-1:-1;13827:14:8;;;;:10;:14;;;;;;-1:-1:-1;;;;;13827:14:8;13845:10;13827:28;13808:47;13720:179;;;-1:-1:-1;13888:10:8;13872:27;;;;:15;:27;;;;;;;;13720:179;:229;;;-1:-1:-1;;;;;;13915:22:8;;;;;;:16;:22;;;;;;;;13938:10;13915:34;;;;;;;;;;13720:229;13699:298;;;;;-1:-1:-1;;;13699:298:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;14007:22;14013:4;14019:5;14026:2;14007:5;:22::i;902:53::-;;;;;;;;;;;;;:::o;572:295:1:-;709:6;;-1:-1:-1;;;;;709:6:1;695:10;:20;674:113;;;;-1:-1:-1;;;674:113:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;797:63;826:24;852:7;797:28;:63::i;:::-;572:295;;:::o;469:197:0:-;549:6;;-1:-1:-1;;;;;549:6:0;535:10;:20;527:60;;;;;-1:-1:-1;;;527:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;615:6;;602:30;;;-1:-1:-1;;;;;615:6:0;;;602:30;;;;;;;;;;;;;;;;;;;;;642:6;:17;;;;-1:-1:-1;;;;;642:17:0;;;;;;;;;;469:197::o;648:86:7:-;714:13;;;;;;;;;;;;;;;;;648:86;:::o;961:43:8:-;;;;;;;;;;;;;:::o;1010:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11969:136::-;12048:50;12067:10;12079:8;12089;12048:18;:50::i;1669:95:9:-;-1:-1:-1;;;;;1744:13:9;1721:4;1744:13;;;:8;:13;;;;;;;;;1669:95::o;484:302:2:-;601:6;;-1:-1:-1;;;;;601:6:2;587:10;:20;566:111;;;;-1:-1:-1;;;566:111:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;687:30:2;;;;;;:15;:30;;;;;;;;;:40;;-1:-1:-1;;687:40:2;;;;;;;;;;742:37;;;;;;;;;;;;;;;;;;;;;484:302;;:::o;7615:401:8:-;7715:11;7729:28;7744:4;7750:2;7754;7729:14;:28::i;:::-;7715:42;;7767:27;7781:4;7787:2;7791;7767:13;:27::i;:::-;7808:15;:2;-1:-1:-1;;;;;7808:13:8;;:15::i;:::-;7804:206;;;7864:70;7887:6;:26;;7903:10;7887:26;;;7896:4;7887:26;7915:4;7921:2;7925;7929:4;7864:22;:70::i;:::-;7839:160;;;;;-1:-1:-1;;;7839:160:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;7615:401;;;;;:::o;1085:46::-;;;;;;;;;;;;-1:-1:-1;;;;;1085:46:8;;:::o;1394:367:7:-;1445:13;1502:1;1478:12;1487:2;1478:8;:12::i;:::-;-1:-1:-1;;;;;1478:26:7;;;1470:56;;;;;-1:-1:-1;;;1470:56:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;1672:12;1681:2;1672:8;:12::i;:::-;1579:161;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;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;;1579:161:7;;;;;;-1:-1:-1;1579:161:7;;;26:21:-1;;;22:32;;6:49;;1579:161:7;;;;;;;;-1:-1:-1;;;;1394:367:7:o;1247:252:9:-;1350:6;;-1:-1:-1;;;;;1350:6:9;1336:10;:20;1315:103;;;;-1:-1:-1;;;1315:103:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1428:16:9;;;;;;:8;:16;;;;;;;;;:26;;-1:-1:-1;;1428:26:9;;;;;;;;;;1469:23;;;;;;;;;;;;;;;;;;;;;1247:252;;:::o;1330:131:1:-;-1:-1:-1;;;;;1424:30:1;1401:4;1424:30;;;:25;:30;;;;;;;;;1330:131::o;12702:213:8:-;-1:-1:-1;;;;;12846:23:8;;;12808:15;12846:23;;;:16;:23;;;;;;;;:33;;;;;;;;;;;;;;;:62;;-1:-1:-1;;;;;;12883:25:8;;;;;;:15;:25;;;;;;;;12846:62;12839:69;;12702:213;;;;;:::o;8580:1793:9:-;-1:-1:-1;;;;;8807:18:9;;8799:51;;;;;-1:-1:-1;;;8799:51:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8868:16:9;;8860:55;;;;;-1:-1:-1;;;8860:55:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;8933:25;;;:51;;;;-1:-1:-1;8962:22:9;;;8933:51;8925:76;;;;;-1:-1:-1;;;8925:76:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;9011:11;9025:10;-1:-1:-1;;;;;9025:18:9;;;;;;:59;;-1:-1:-1;9073:10:9;9047:37;;;;:25;:37;;;;;;;;9025:59;9011:73;-1:-1:-1;9098:10:9;-1:-1:-1;;;;;9098:18:9;;;;;;:29;;;9121:6;9120:7;9098:29;9094:236;;;9184:10;9168:27;;;;:15;:27;;;;;;;;;:81;;-1:-1:-1;;;;;;9215:22:9;;;;;;:16;:22;;;;;;;;9238:10;9215:34;;;;;;;;;;9168:81;9143:176;;;;-1:-1:-1;;;9143:176:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9339:27;;9380:196;9400:16;;;9380:196;;;9437:12;9452:5;;9458:1;9452:8;;;;;;;;;;;;;9437:23;;9474:43;9488:4;9494:2;9498:4;9504:2;;9507:1;9504:5;;;;;;;;;;;;;9511:2;;9514:1;9511:5;;;;;;;;;;;;;9474:13;:43::i;:::-;9554:11;;9531:34;;;;;9418:3;;9380:196;;;-1:-1:-1;;;;;;9585:23:9;;;;;;;:17;:23;;;;;;:46;;;;;;;9641:21;;;;;;;;;:44;;;;;;9700:15;;:13;:15::i;:::-;:77;;;;-1:-1:-1;9719:58:9;9747:2;-1:-1:-1;;;9719:27:9;:58::i;:::-;9696:671;;;9793:20;9830:19;9816:34;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;9816:34:9;-1:-1:-1;9793:57:9;-1:-1:-1;9864:15:9;;9897:275;9917:16;;;9897:275;;;9958:12;9973:5;;9979:1;9973:8;;;;;;;;;;;;;9958:23;;10004:9;10016:1;10004:13;;9999:159;10028:4;10023;:9;10019:1;:13;9999:159;;;10076:32;10086:1;10089:4;10095:2;;10098:1;10095:5;;;;;;;;;;;;;10102:2;;10105:1;10102:5;;;;;;;;;;;;;10076:9;:32::i;:::-;10061:3;10065:7;10061:12;;;;;;;;;;;;;;;;;:47;10130:9;;;;;10034:3;9999:159;;;-1:-1:-1;;9935:3:9;;9897:275;;;;10210:76;10238:6;:26;;10254:10;10238:26;;;10247:4;10238:26;10266:4;10272:2;10276:3;10281:4;;10210:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;10210:27:9;;-1:-1:-1;;;10210:76:9:i;:::-;10185:171;;;;-1:-1:-1;;;10185:171:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9696:671;;;8580:1793;;;;;;;;;;;;:::o;11292:453:8:-;-1:-1:-1;;;;;11428:20:8;;11420:55;;;;;-1:-1:-1;;;11420:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;11506:10;-1:-1:-1;;;;;11506:20:8;;;;:73;;-1:-1:-1;11568:10:8;11542:37;;;;:25;:37;;;;;;;;11506:73;:116;;;-1:-1:-1;11611:10:8;11595:27;;;;:15;:27;;;;;;;;11506:116;11485:196;;;;-1:-1:-1;;;11485:196:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11692:46;11711:6;11719:8;11729;11692:18;:46::i;18129:1421:9:-;18200:13;;281:66;18255:10;;:15;18247:44;;;;;-1:-1:-1;;;18247:44:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;18301:9;18392:11;;;:7;:11;;;;;;228:3;18313:14;;;;18349;;;;18418:13;;18414:1130;;18463:8;-1:-1:-1;18463:8:9;18516:6;18463:8;18505:17;18527:1;18504:24;18486:42;;18414:1130;;;18559:16;18586:7;18559:16;228:3;18622:1;18620;:3;18627:1;18619:9;18618:23;18609:1;18607;:3;;;;;;18614:1;18606:9;-1:-1:-1;;;18594:21:9;:47;18586:56;;;;;;;;;;;;18559:84;;18681:1;-1:-1:-1;;;;;18661:22:9;:8;-1:-1:-1;;;;;18661:22:9;;18657:877;;18711:8;18703:16;;18755:5;18737:23;;18657:877;;;18799:16;18826:7;18799:16;228:3;18862:1;18860;:3;18867:1;18859:9;18858:23;18849:1;18847;:3;;;;;;18854:1;18846:9;-1:-1:-1;;;18834:21:9;:47;18826:56;;;;;;;;;;;;18799:84;;18925:1;-1:-1:-1;;;;;18905:22:9;:8;-1:-1:-1;;;;;18905:22:9;;18901:619;;18959:8;18951:16;;19007:5;18989:23;;18901:619;;;19059:18;19088:7;19059:18;228:3;19128:2;19126:1;:4;19134:2;19125:11;19124:25;19113:2;19111:1;:4;;;;;;19119:2;19110:11;-1:-1:-1;;;19096:25:9;:53;19088:62;;;;;;;;;;;;19059:92;;19199:1;-1:-1:-1;;;;;19177:24:9;:10;-1:-1:-1;;;;;19177:24:9;;19173:329;;19237:10;19229:18;;19291:5;19273:23;;19173:329;;;19367:7;:62;228:3;19407:2;19405:1;:4;19413:2;19404:11;19403:25;19392:2;19390:1;:4;;;;;;19398:2;19389:11;-1:-1:-1;;;19375:25:9;:53;19367:62;;;;;;;;;;;;19351:79;;19474:5;19456:23;;19173:329;18901:619;;18657:877;;18414:1130;;18129:1421;;;;;;:::o;16977:1146::-;17030:7;281:66;17057:10;;:15;17049:44;;;;;-1:-1:-1;;;17049:44:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;17103:9;17194:11;;;:7;:11;;;;;;228:3;17115:14;;;;17151;;;;17220:13;;17216:901;;17264:8;-1:-1:-1;17249:24:9;;-1:-1:-1;;17249:24:9;17216:901;17320:16;17347:7;17320:16;228:3;17383:1;17381;:3;17388:1;17380:9;17379:23;17370:1;17368;:3;;;;;;17375:1;17367:9;-1:-1:-1;;;17355:21:9;:47;17347:56;;;;;;;;;;;;17320:84;;17442:1;-1:-1:-1;;;;;17422:22:9;:8;-1:-1:-1;;;;;17422:22:9;;17418:689;;17471:8;-1:-1:-1;17464:15:9;;-1:-1:-1;;;17464:15:9;17418:689;17518:16;17545:7;17518:16;228:3;17581:1;17579;:3;17586:1;17578:9;17577:23;17568:1;17566;:3;;;;;;17573:1;17565:9;-1:-1:-1;;;17553:21:9;:47;17545:56;;;;;;;;;;;;17518:84;;17644:1;-1:-1:-1;;;;;17624:22:9;:8;-1:-1:-1;;;;;17624:22:9;;17620:473;;17677:8;-1:-1:-1;17670:15:9;;-1:-1:-1;;;;17670:15:9;17620:473;17732:18;17761:7;17732:18;228:3;17801:2;17799:1;:4;17807:2;17798:11;17797:25;17786:2;17784:1;:4;;;;;;17792:2;17783:11;-1:-1:-1;;;17769:25:9;:53;17761:62;;;;;;;;;;;;17732:92;;17872:1;-1:-1:-1;;;;;17850:24:9;:10;-1:-1:-1;;;;;17850:24:9;;17846:229;;17909:10;-1:-1:-1;17902:17:9;;-1:-1:-1;;;;;17902:17:9;17846:229;17989:7;:62;228:3;18029:2;18027:1;:4;18035:2;18026:11;18025:25;18014:2;18012:1;:4;;;;;;18020:2;18011:11;-1:-1:-1;;;17997:25:9;:53;17989:62;;;;;;;;;;;;17974:78;;;;;;;;;;2578:388:8;-1:-1:-1;;;;;2666:22:8;;2663:253;;2704:11;;;;:7;:11;;;;;-1:-1:-1;;;;;2718:14:8;;2704:28;;2663:253;;;2829:11;;;;:7;:11;;;;;;;;-1:-1:-1;;;;;2843:14:8;;;2860:6;2843:23;2829:37;;;2880:10;:14;;;;;;:25;;;;;;;;;;;;;2663:253;2956:2;2946:8;-1:-1:-1;;;;;2930:29:8;2939:5;-1:-1:-1;;;;;2930:29:8;;;;;;;;;;;2578:388;;;:::o;8794:1398::-;8919:11;8933:10;-1:-1:-1;;;;;8933:18:8;;;;;;:59;;-1:-1:-1;8981:10:8;8955:37;;;;:25;:37;;;;;;;;8933:59;8919:73;-1:-1:-1;9002:15:8;9020:10;-1:-1:-1;;;;;9020:18:8;;;;:40;;;9054:6;9020:40;:83;;;-1:-1:-1;9092:10:8;9076:27;;;;:15;:27;;;;;;;;9020:83;:133;;;-1:-1:-1;;;;;;9119:22:8;;;;;;:16;:22;;;;;;;;9142:10;9119:34;;;;;;;;;;9020:133;9002:151;-1:-1:-1;;;;;;9172:18:8;;9164:51;;;;;-1:-1:-1;;;9164:51:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9233:16:8;;9225:55;;;;;-1:-1:-1;;;9225:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;9311:10;;9291:17;9331:422;9354:9;9350:1;:13;9331:422;;;9385:10;9398:3;9402:1;9398:6;;;;;;;;;;;;;;9385:19;;9419:13;9434:20;9458:30;9485:2;9458:26;:30::i;:::-;9418:70;;;;9519:4;-1:-1:-1;;;;;9510:13:8;:5;-1:-1:-1;;;;;9510:13:8;;9502:56;;;;;-1:-1:-1;;;9502:56:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;9580:10;:63;;;;9595:15;:47;;;;-1:-1:-1;9614:14:8;;;;:10;:14;;;;;;-1:-1:-1;;;;;9614:14:8;9632:10;9614:28;9595:47;9572:90;;;;;-1:-1:-1;;;9572:90:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;9698:2;-1:-1:-1;;;;;9690:11:8;9676:7;:11;9684:2;9676:11;;;;;;;;;;;:25;;;;9739:2;9735;-1:-1:-1;;;;;9720:22:8;9729:4;-1:-1:-1;;;;;9720:22:8;;;;;;;;;;;-1:-1:-1;;;9365:4:8;;9331:422;;;;9774:2;-1:-1:-1;;;;;9766:10:8;:4;-1:-1:-1;;;;;9766:10:8;;9762:125;;-1:-1:-1;;;;;9792:23:8;;;;;;;:17;:23;;;;;;:36;;;;;;;9842:21;;;;;;:34;;;;;;9762:125;9901:15;:2;-1:-1:-1;;;;;9901:13:8;;:15::i;:::-;:87;;;;;9921:4;:66;;;-1:-1:-1;9929:58:8;9957:2;-1:-1:-1;;;9929:27:8;:58::i;:::-;9897:289;;;10029:76;10057:6;:26;;10073:10;10057:26;;;10066:4;10057:26;10085:4;10091:2;10095:3;10100:4;10029:27;:76::i;:::-;10004:171;;;;-1:-1:-1;;;10004:171:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4865:761;4950:13;4976;4991:20;5015:30;5042:2;5015:26;:30::i;:::-;4975:70;;-1:-1:-1;4975:70:8;-1:-1:-1;;;;;;5063:19:8;;5055:52;;;;;-1:-1:-1;;;5055:52:8;;;;;;;;;;;;-1:-1:-1;;;5055:52:8;;;;;;;;;;;;;;;5134:4;-1:-1:-1;;;;;5125:13:8;:5;-1:-1:-1;;;;;5125:13:8;;5117:53;;;;;-1:-1:-1;;;5117:53:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5188:16:8;;5180:55;;;;;-1:-1:-1;;;5180:55:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;5256:10;-1:-1:-1;;;;;5256:18:8;;;;;;:59;;-1:-1:-1;5304:10:8;5278:37;;;;:25;:37;;;;;;;;5256:59;5245:70;-1:-1:-1;5329:10:8;-1:-1:-1;;;;;5329:18:8;;;;;;:31;;;5352:8;5351:9;5329:31;5325:295;;;5417:10;5401:27;;;;:15;:27;;;;;;;;;:81;;-1:-1:-1;;;;;;5448:22:8;;;;;;:16;:22;;;;;;;;5471:10;5448:34;;;;;;;;;;5401:81;:150;;;;5503:15;:47;;;;-1:-1:-1;5522:14:8;;;;:10;:14;;;;;;-1:-1:-1;;;;;5522:14:8;5540:10;5522:28;5503:47;5376:233;;;;;-1:-1:-1;;;5376:233:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4865:761;;;;;;;:::o;1335:217::-;-1:-1:-1;;;;;1415:23:8;;;;;;;:17;:23;;;;;;;;:25;;-1:-1:-1;;1415:25:8;;;1450:21;;;;;;;;;:23;;1415:25;1450:23;;;1483:11;;;:7;:11;;;;;;:25;;;1523:22;;1491:2;;1450:21;1415:23;1523:22;;;1335:217;;;:::o;195:451:6:-;252:4;350:66;552:17;;596:15;;;;;:42;;;627:11;615:8;:23;;596:42;588:51;195:451;-1:-1:-1;;;;195:451:6:o;5632:1071:8:-;5843:79;;;-1:-1:-1;;;;;;5843:79:8;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;5843:79:8;;;;;;;25:18:-1;;;61:17;;5843:79:8;182:15:-1;5879:8:8;179:29:-1;160:49;;6085:16:8;;6128:11;;5755:4;6211:19;;;5755:4;;;;;5843:79;;25:18:-1;6128:11:8;;6085:16;25:18:-1;6305:9:8;6282:5;6254:173;6243:184;;6468:6;6462:13;6452:23;;6005:480;;;6658:3;6646:9;:15;6639:23;;;;6679:7;:17;;;;;6690:6;6679:17;6672:24;5632:1071;-1:-1:-1;;;;;;5632:1071:8:o;14042:299::-;14181:4;14201:13;14237:2;-1:-1:-1;;;;;14217:40:8;;14258:8;14268:4;14274:7;14283:5;14217:72;;;;;;;;;;;;;-1:-1:-1;;;;;14217:72:8;-1:-1:-1;;;;;14217:72:8;;;;;;-1:-1:-1;;;;;14217:72:8;-1:-1:-1;;;;;14217:72:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;14217:72:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14217:72:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14217:72:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14217:72:8;-1:-1:-1;;;;;;14307:26:8;14317:16;14307:26;;-1:-1:-1;;14042:299:8;;;;;;;;:::o;10379:586:9:-;10487:4;10495:1;10487:9;10483:353;;;228:3;10532:13;;10528:17;;10512:13;10575:15;10528:17;10575:8;:15::i;:::-;10559:31;-1:-1:-1;;;;;;10612:19:9;;10604:52;;;;;-1:-1:-1;;;10604:52:9;;;;;;;;;;;;-1:-1:-1;;;10604:52:9;;;;;;;;;;;;;;;10687:4;-1:-1:-1;;;;;10678:13:9;:5;-1:-1:-1;;;;;10678:13:9;;10670:52;;;;;-1:-1:-1;;;10670:52:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10736:14:9;;;;:7;:14;;;;;-1:-1:-1;;;;;10753:11:9;;10736:28;;10483:353;;;10795:30;10804:4;10810:2;10814:4;10820:1;10823;10795:8;:30::i;:::-;10850:9;10845:114;10874:4;10869;:9;10865:1;:13;10845:114;;;10923:24;10933:1;10936:4;10942:1;10945;10923:9;:24::i;:::-;10919:2;-1:-1:-1;;;;;10904:44:9;10913:4;-1:-1:-1;;;;;10904:44:9;;;;;;;;;;;10880:3;;10845:114;;7527:666;7750:15;:2;-1:-1:-1;;;;;7750:13:9;;:15::i;:::-;:77;;;;-1:-1:-1;7769:58:9;7797:2;-1:-1:-1;;;7769:27:9;:58::i;:::-;7746:441;;;7843:20;7885:4;7880;:9;7866:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;7866:24:9;-1:-1:-1;7843:47:9;-1:-1:-1;7909:9:9;7904:106;7933:4;7928;:9;7924:1;:13;7904:106;;;7971:24;7981:1;7984:4;7990:1;7993;7971:9;:24::i;:::-;7962:3;7966:1;7962:6;;;;;;;;;;;;;;;;;:33;7939:3;;7904:106;;;;8048:58;8076:8;8086:4;8092:2;8096:3;8101:4;8048:27;:58::i;7746:441::-;7527:666;;;;;;;:::o;5999:364::-;6087:7;6106:11;6124:4;6120:1;:8;;;;;;;-1:-1:-1;6147:1:9;6120:8;6141:7;6138:219;;228:3;6238;6234:1;:7;6233:21;6223:4;6221:1;:6;;;;;;6216:1;:12;6215:40;6208:47;;;;;6138:219;228:3;6329;6325:1;:7;6324:21;6314:4;6312:1;:6;;;;;;6308:1;:10;6299:4;6295:1;:8;6294:25;6293:53;6286:60;;;5999:364;;;;;;:::o;873:247:1:-;-1:-1:-1;;;;;978:51:1;;;;;;:25;:51;;;;;;;;;:61;;-1:-1:-1;;978:61:1;;;;;;;;;;1054:59;;;;;;;;;;;;;;;;;;;;;873:247;;:::o;12112:373:8:-;-1:-1:-1;;;;;12260:25:8;;;;;;:15;:25;;;;;;;;12259:26;12238:127;;;;-1:-1:-1;;;12238:127:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12375:24:8;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;;:45;;-1:-1:-1;;12375:45:8;;;;;;;;;;12436:42;;;;;;;;;;;;;;;;;12112:373;;;:::o;798:451:7:-;848:13;877:7;873:48;;-1:-1:-1;900:10:7;;;;;;;;;;;;;;;;;;;873:48;939:2;930:6;969:66;976:6;;969:66;;998:5;;1022:2;1017:7;;;;969:66;;;1044:17;1074:3;1064:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;1064:14:7;87:34:-1;135:17;;-1:-1;1064:14:7;-1:-1:-1;1044:34:7;-1:-1:-1;;;1097:7:7;;1114:100;1121:7;;1114:100;;1177:2;1172;:7;1167:2;:12;1156:25;;1144:4;1149:3;;;;;;;1144:9;;;;;;;;;;;:37;;;;;;;;;;-1:-1:-1;1201:2:7;1195:8;;;;1114:100;;;-1:-1:-1;1237:4:7;798:451;-1:-1:-1;;;;798:451:7:o;14347:325:8:-;14496:4;14516:13;14561:2;-1:-1:-1;;;;;14532:54:8;;14587:8;14597:4;14603:3;14608:5;14532:82;;;;;;;;;;;;;-1:-1:-1;;;;;14532:82:8;-1:-1:-1;;;;;14532:82:8;;;;;;-1:-1:-1;;;;;14532:82:8;-1:-1:-1;;;;;14532:82:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;14532:82:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;14532:82:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14532:82:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14532:82:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14532:82:8;-1:-1:-1;;;;;;14632:32:8;14642:22;14632:32;;-1:-1:-1;;14347:325:8;;;;;;;:::o;11264:637:9:-;11375:4;11371:1;:8;;;;;;:13;:30;;;;;11392:4;11388:1;:8;;;;;;:13;11371:30;11363:62;;;;;-1:-1:-1;;;11363:62:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;11460:4;228:3;11448:16;11443:1;:21;;:46;;;;;11485:4;228:3;11473:16;11468:1;:21;;11443:46;11435:72;;;;;-1:-1:-1;;;11435:72:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;11522:4;11530:1;11522:9;11518:377;;;11547:33;11559:4;11565:2;11569:1;11572;11575:4;11547:11;:33::i;:::-;;11518:377;;;11601:4;11609:1;11601:9;11597:298;;;11626:33;11638:4;11644:2;11648:1;11651;11654:4;11626:11;:33::i;11597:298::-;11680:4;11688:2;11680:10;11676:219;;;11706:35;11720:4;11726:2;11730:1;11733;11736:4;11706:13;:35::i;11676:219::-;11762:4;11770:2;11762:10;11758:137;;;11788:35;11802:4;11808:2;11812:1;11815;11818:4;11788:13;:35::i;11907:1065::-;12004:4;228:3;12037:13;;12033:17;;-1:-1:-1;;;12077:14:9;;12119:4;12033:1;12133:199;12159:1;12161;12159:3;12154:2;:8;12133:199;;;12202:1;12184:138;12210:1;12212;12210:3;12205:2;:8;12184:138;;;12252:41;12267:4;228:3;12278:2;:14;12273:2;:19;12252:14;:41::i;:::-;:55;;;;;12297:10;12252:55;12239:68;-1:-1:-1;12215:4:9;;12184:138;;;-1:-1:-1;12164:4:9;;12133:199;;;;12344:3;12341:598;;;12367:10;12363:498;;12426:15;;;;:7;:15;;;;;;-1:-1:-1;;;;;12445:13:9;;12426:32;;:129;;-1:-1:-1;;;;;;12542:13:9;;12482:7;:56;228:3;12518:1;12516;:3;12523:1;12515:9;12514:23;12505:1;12503;:3;;;;;;12510:1;12502:9;-1:-1:-1;;;12490:21:9;:47;12482:56;;;;;;;;;;;;:73;12426:129;:232;;;-1:-1:-1;;;;;;12645:13:9;;12579:7;:62;228:3;12619:2;12617:1;:4;;12625:2;12616:11;12615:25;12604:2;12602:1;:4;;;;;;12610:2;12601:11;-1:-1:-1;;;12587:25:9;:53;12579:62;;;;;;;;;;;;:79;12426:232;:335;;;-1:-1:-1;;;;;;12748:13:9;;12682:7;:62;228:3;12722:2;12720:1;:4;;12728:2;12719:11;12718:25;12707:2;12705:1;:4;;;;;;12713:2;12704:11;-1:-1:-1;;;12690:25:9;:53;12682:62;;;;;;;;;;;;:79;12426:335;12397:449;;;;-1:-1:-1;;;12397:449:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12874:15:9;;;;:7;:15;;;;;-1:-1:-1;;;;;12892:11:9;;12874:29;;-1:-1:-1;12924:4:9;;-1:-1:-1;12917:11:9;;12341:598;12955:10;11907:1065;-1:-1:-1;;;;;;;;11907:1065:9:o;12977:1408::-;13074:4;228:3;13107:13;;13103:17;;-1:-1:-1;;;13147:14:9;;13189:4;13103:1;13203:639;13229:1;13231;13229:3;13224:2;:8;13203:639;;;13275:1;13257:575;13283:1;13285;13283:3;13278:2;:8;13257:575;;;13315:21;13339:36;13351:4;13357:2;13361;13365;13369:5;13339:11;:36::i;:::-;228:3;13426:14;;13409:31;;-1:-1:-1;;;13409:31:9;13393:13;13477:14;;;:7;:14;;;;;;13315:60;;-1:-1:-1;13409:31:9;13513:13;;13509:229;;13554:16;13550:130;;13626:4;-1:-1:-1;;;;;13618:13:9;13606:8;:25;13598:59;;;;;-1:-1:-1;;;13598:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;13718:1;13701:14;;;:7;:14;;;;;:18;13509:229;13769:16;:33;;;-1:-1:-1;13789:13:9;;;13769:33;13768:49;;;;;13807:10;13768:49;13755:62;;13257:575;;;13294:1;13288:7;;;;13257:575;;;-1:-1:-1;13240:1:9;13234:7;13203:639;;;;13854:3;13851:501;;;13877:10;13873:401;;13936:15;;;;:7;:15;;;;;;-1:-1:-1;;;;;13955:13:9;;13936:32;;:135;;-1:-1:-1;;;;;;14058:13:9;;13992:7;:62;228:3;14032:2;14030:1;:4;;14390:1311;14489:4;228:3;14522:13;;14518:17;;-1:-1:-1;;;14562:16:9;;14606:4;14518:1;14620:641;14646:1;14648:2;14646:4;14641:2;:9;14620:641;;;14693:1;14675:576;14701:1;14703:2;14701:4;14696:2;:9;14675:576;;;14734:21;14758:36;14770:4;14776:2;14780;14784;14788:5;14758:11;:36::i;:::-;228:3;14845:14;;14828:31;;-1:-1:-1;;;14828:31:9;14812:13;14896:14;;;:7;:14;;;;;;14734:60;;-1:-1:-1;14828:31:9;14932:13;;14928:229;;14973:16;14969:130;;15045:4;-1:-1:-1;;;;;15037:13:9;15025:8;:25;15017:59;;;;;-1:-1:-1;;;15017:59:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;15137:1;15120:14;;;:7;:14;;;;;:18;14928:229;15188:16;:33;;;-1:-1:-1;15208:13:9;;;15188:33;15187:49;;;;;15226:10;15187:49;15174:62;;14675:576;;;14713:1;14707:7;;;;14675:576;;;-1:-1:-1;14658:1:9;14652:7;14620:641;;;;15273:3;15270:398;;;15296:10;15292:298;;15355:15;;;;:7;:15;;;;;;-1:-1:-1;;;;;15374:13:9;;15355:32;;:135;;-1:-1:-1;;;;;;15477:13:9;;15411:7;:62;228:3;15451:2;15449:1;:4;;15706:1265;15805:4;228:3;15838:13;;15834:17;;-1:-1:-1;;;15878:16:9;;15922:4;15834:1;15936:663;15962:1;15964:2;15962:4;15957:2;:9;15936:663;;;16010:1;15992:597;16018:1;16020:2;16018:4;16013:2;:9;15992:597;;;16052:21;16076:38;16090:4;16096:2;16100;16104;16108:5;16076:13;:38::i;:::-;228:3;16169:14;;16150:33;;-1:-1:-1;;;16150:33:9;16132:15;16222:16;;;:7;:16;;;;;;16052:62;;-1:-1:-1;16150:33:9;16260:15;;16256:237;;16303:16;16299:134;;16377:4;-1:-1:-1;;;;;16369:13:9;16355:10;:27;16347:63;;;;;-1:-1:-1;;;16347:63:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;16473:1;16454:16;;;:7;:16;;;;;:20;16256:237;16524:16;:35;;;-1:-1:-1;16544:15:9;;;16524:35;16523:51;;;;;16564:10;16523:51;16510:64;;15992:597;;;16030:2;16024:8;;;;15992:597;;;-1:-1:-1;15974:2:9;15968:8;15936:663;;;;16611:3;16608:294;;;16634:10;16630:194;;16693:15;;;;:7;:15;;;;;;-1:-1:-1;;;;;16712:13:9;;16693:32;16664:145;;;;-1:-1:-1;;;16664:145:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16608:294;16918:10;:46;;;-1:-1:-1;16932:15:9;;;;:7;:15;;;;;;-1:-1:-1;;;;;16951:13:9;;16932:32;16918:46;16911:53;15706:1265;-1:-1:-1;;;;;;;;;15706:1265:9:o;10971:287::-;11038:4;11070:11;;;:7;:11;;;;;;11095:10;;11091:139;;11147:4;-1:-1:-1;;;;;11129:22:9;11137:5;-1:-1:-1;;;;;11129:22:9;;11121:44;;;;;-1:-1:-1;;;11121:44:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11193:1:9;11179:11;;;:7;:11;;;;;:15;11215:4;11208:11;;11091:139;-1:-1:-1;11246:5:9;;10971:287;-1:-1:-1;;;10971:287:9:o

Swarm Source

bzzr://83895022ccd1f4731144230de229e76c02767e3161aeff679a637da2234bc09f

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.