ETH Price: $3,787.35 (+6.11%)

Token

TOKS ATTACK! (TOKS)
 

Overview

Max Total Supply

10,000 TOKS

Holders

1,994

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
x1aok.eth
Balance
0 TOKS
0x67622b5a8d7a245966d6656e493a3815d15252ab
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Toks are a collection of 10K clay sculpted extraterrestrial beings originating from the farthest points in the universe.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
toksinvasion

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 20000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 20 of 20: toksinvasion.sol
// SPDX-License-Identifier: MIT

// Contract by TOKS

pragma solidity ^0.8.7;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./MerkleProof.sol";
import "./RoyaltiesV2Impl.sol";
import "./LibPart.sol";
import "./LibRoyaltiesV2.sol";

contract toksinvasion is ERC721Enumerable, Ownable, RoyaltiesV2Impl {
  using Strings for uint256;

  string public _baseTokenURI;

  bool public _active = false;
  bool public _presaleActive = false;

  bytes32 public _merkleRoot = 0x3454ba2028cca49223166a1b2b5f75c59cfeaa353eced6a39bd596a31a5fe29e;

  uint256 public _gifts = 300;
  uint256 public _price = 0.05 ether;
  uint256 public _presaleMintLimit = 2;
  uint256 public constant _MINT_LIMIT = 10;
  uint256 public constant _SUPPLY = 10000;
  uint256 public _SALE_SUPPLY = 3200;
  uint256 public _PRESALE_SUPPLY = 6500;

  mapping(address => uint256) private _claimed;

  address public _v1 = 0xB72b8e32860fEB870553D00F421311008a93236C;
  address public _v2 = 0x0d35F889C276b8566DB407fB6BD240388Fb3EdeB;
  address public _v3 = 0x0dB9a71032A1573a0C8ecfC18E99333Bc2e8503E;
  address public _v4 = 0xa28A7bBa6d373805C0E7afC9044F17EAbF3C066E;

  bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;

  constructor() ERC721("TOKS ATTACK!", "TOKS") {}

  function _baseURI() internal view virtual override returns (string memory) {
    return _baseTokenURI;
  }

  function setBaseURI(string memory baseURI) public onlyOwner {
    _baseTokenURI = baseURI;
  }

  function setActive(bool active) public onlyOwner {
    _active = active;
  }

  function setPresaleActive(bool presaleActive) public onlyOwner {
    _presaleActive = presaleActive;
  }

  function setSaleSupply(uint256 saleSupply) public onlyOwner {
    _SALE_SUPPLY= saleSupply;
  }

  function setPresaleSupply(uint256 presaleSupply) public onlyOwner {
    _PRESALE_SUPPLY= presaleSupply;
  }

  function setPresaleMintLimit(uint256 presaleMintLimit) public onlyOwner {
    _presaleMintLimit = presaleMintLimit;
  }

  function setMerkleRoot(bytes32 merkleRoot) public onlyOwner {
    _merkleRoot = merkleRoot;
  }

  function setPrice(uint256 price) public onlyOwner {
    _price = price;
  }

  function setRoyalties(uint _tokenId, address payable _royaltiesReceipientAddress, uint96 _percentageBasisPoints) public onlyOwner {
        LibPart.Part[] memory _royalties = new LibPart.Part[](1);
        _royalties[0].value = _percentageBasisPoints;
        _royalties[0].account = _royaltiesReceipientAddress;
        _saveRoyalties(_tokenId, _royalties);
   }

  function royaltyInfo(uint256 _tokenId, uint256 _secndprice) external view returns (address receiver, uint256 royaltyAmount) {
        LibPart.Part[] memory _royalties = royalties[_tokenId];
        if(_royalties.length > 0) {
            return (_royalties[0].account, (_secndprice * _royalties[0].value)/7500);
        }
        return (address(0), 0);
   }

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) {
        if(interfaceId == LibRoyaltiesV2._INTERFACE_ID_ROYALTIES) {
            return true;
        }
        if(interfaceId == _INTERFACE_ID_ERC2981) {
            return true;
        }
        return super.supportsInterface(interfaceId);
  } 

  function getTokensByWallet(address _owner) public view returns(uint256[] memory) {
    uint256 tokenCount = balanceOf(_owner);
    uint256[] memory tokensId = new uint256[](tokenCount);

    for(uint256 i; i < tokenCount; i++){
      tokensId[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokensId;
  }

  function getPresaleMints(address owner) public view returns (uint256){    
    return _claimed[owner];    
  }    
    
  function gift(address _to, uint256 _amount) public onlyOwner {    
    uint256 supply = totalSupply();    
    require(_amount <= _gifts, "Gift reserve exceeded with provided amount.");    
    
    for(uint256 i; i < _amount; i++){    
      _safeMint( _to, supply + i );    
    }    
    _gifts -= _amount;    
  } 

  function mint(uint256 _amount) public payable {
    uint256 supply = totalSupply();

    require( _active, "Not active");
    require( _amount <= _MINT_LIMIT, "Amount denied");
    require( msg.value >= _price * _amount, "Insufficient ether");
    require( supply + _amount <= _SALE_SUPPLY, "Supply denied");

    for(uint256 i; i < _amount; i++){
      _safeMint( msg.sender, supply + i );
    }
  }

  function presale(bytes32[] calldata _merkleProof, uint256 _amount) public payable {
    uint256 supply = totalSupply();
    bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

    require( _presaleActive, "Not active");
    require( _amount + _claimed[msg.sender] <= _presaleMintLimit, "Amount denied");
    require( MerkleProof.verify(_merkleProof, _merkleRoot, leaf), "Invalid Address");
    require( msg.value >= _price * _amount, "Insufficient ether");
    require( supply + _amount <= _PRESALE_SUPPLY, "Supply denied");

    for(uint256 i; i < _amount; i++){
      _safeMint( msg.sender, supply + i );
      _claimed[msg.sender] += 1;
    }
  }

  function withdraw() public payable onlyOwner {
    uint256 _p1 = address(this).balance * 2 / 5;
    uint256 _p2 = address(this).balance * 2 / 10;
    uint256 _p3 = address(this).balance * 2 / 10;
    uint256 _p4 = address(this).balance * 2 / 10;

    require(payable(_v1).send(_p1));
    require(payable(_v2).send(_p2));
    require(payable(_v3).send(_p3));
    require(payable(_v4).send(_p4));
  }
}

File 1 of 20: AbstractRoyalties.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./LibPart.sol";

abstract contract AbstractRoyalties {
    mapping (uint256 => LibPart.Part[]) public royalties;

    function _saveRoyalties(uint256 _id, LibPart.Part[] memory _royalties) internal {
        for (uint i = 0; i < _royalties.length; i++) {
            require(_royalties[i].account != address(0x0), "Recipient should be present");
            require(_royalties[i].value != 0, "Royalty value should be positive");
            royalties[_id].push(_royalties[i]);
        }
        _onRoyaltiesSet(_id, _royalties);
    }

    function _updateAccount(uint256 _id, address _from, address _to) internal {
        uint length = royalties[_id].length;
        for(uint i = 0; i < length; i++) {
            if (royalties[_id][i].account == _from) {
                royalties[_id][i].account = payable(address(uint160(_to)));
            }
        }
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) virtual internal;
}

File 2 of 20: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

File 4 of 20: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 20: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 6 of 20: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 20: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 20: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 9 of 20: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 20: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 11 of 20: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 20: IRoyaltiesProvider.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./LibPart.sol";
interface IRoyaltiesProvider {
    function getRoyalties(address token, uint tokenId) external returns (LibPart.Part[] memory);
}

File 13 of 20: LibPart.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library LibPart {
    bytes32 public constant TYPE_HASH = keccak256("Part(address account,uint96 value)");

    struct Part {
        address payable account;
        uint96 value;
    }

    function hash(Part memory part) internal pure returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, part.account, part.value));
    }
}

File 14 of 20: LibRoyaltiesV2.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library LibRoyaltiesV2 {
    /*
    * bytes4(keccak256('getRoyalties(LibAsset.AssetType)')) == 0x44c74bcc
    */
    bytes4 constant _INTERFACE_ID_ROYALTIES = 0x44c74bcc;
}

File 15 of 20: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

File 16 of 20: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 17 of 20: RoyaltiesV2.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./LibPart.sol";

interface RoyaltiesV2 {
    event RoyaltiesSet(uint256 tokenId, LibPart.Part[] royalties);

    function getRaribleV2Royalties(uint256 id) external view returns (LibPart.Part[] memory);
}

File 18 of 20: RoyaltiesV2Impl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./AbstractRoyalties.sol";
import "./RoyaltiesV2.sol";

contract RoyaltiesV2Impl is AbstractRoyalties, RoyaltiesV2 {
    function getRaribleV2Royalties(uint256 id) override external view returns (LibPart.Part[] memory) {
        return royalties[id];
    }

    function _onRoyaltiesSet(uint256 _id, LibPart.Part[] memory _royalties) override internal {
        emit RoyaltiesSet(_id, _royalties);
    }
}

File 19 of 20: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"indexed":false,"internalType":"struct LibPart.Part[]","name":"royalties","type":"tuple[]"}],"name":"RoyaltiesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_MINT_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_gifts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_presaleMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_v1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_v2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_v3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_v4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getPresaleMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getRaribleV2Royalties","outputs":[{"components":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"internalType":"struct LibPart.Part[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokensByWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"royalties","outputs":[{"internalType":"address payable","name":"account","type":"address"},{"internalType":"uint96","name":"value","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_secndprice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"active","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleActive","type":"bool"}],"name":"setPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleMintLimit","type":"uint256"}],"name":"setPresaleMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"presaleSupply","type":"uint256"}],"name":"setPresaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address payable","name":"_royaltiesReceipientAddress","type":"address"},{"internalType":"uint96","name":"_percentageBasisPoints","type":"uint96"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleSupply","type":"uint256"}],"name":"setSaleSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600d805461ffff191690557f3454ba2028cca49223166a1b2b5f75c59cfeaa353eced6a39bd596a31a5fe29e600e5561012c600f5566b1a2bc2ec500006010556002601155610c80601255611964601355601580546001600160a01b031990811673b72b8e32860feb870553d00f421311008a93236c17909155601680548216730d35f889c276b8566db407fb6bd240388fb3edeb179055601780548216730db9a71032a1573a0c8ecfc18e99333bc2e8503e1790556018805490911673a28a7bba6d373805c0e7afc9044f17eabf3c066e179055348015620000e657600080fd5b50604080518082018252600c81526b544f4b532041545441434b2160a01b602080830191825283518085019094526004845263544f4b5360e01b9084015281519192916200013791600091620001c6565b5080516200014d906001906020840190620001c6565b5050506200016a620001646200017060201b60201c565b62000174565b620002a9565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001d4906200026c565b90600052602060002090601f016020900481019282620001f8576000855562000243565b82601f106200021357805160ff191683800117855562000243565b8280016001018555821562000243579182015b828111156200024357825182559160200191906001019062000226565b506200025192915062000255565b5090565b5b8082111562000251576000815560010162000256565b600181811c908216806200028157607f821691505b60208210811415620002a357634e487b7160e01b600052602260045260246000fd5b50919050565b613f1580620002b96000396000f3fe60806040526004361061033f5760003560e01c806372132870116101b0578063baa551ee116100ec578063cfc86f7b11610095578063ea5cb5321161006f578063ea5cb53214610a0b578063ee40494614610a21578063f2fde38b14610a37578063fdfbe10a14610a5757600080fd5b8063cfc86f7b14610973578063d3b90b3014610988578063e985e9c5146109b557600080fd5b8063c87b56dd116100c6578063c87b56dd14610906578063cad96cca14610926578063cbce4c971461095357600080fd5b8063baa551ee14610869578063c21d0e6e146108ac578063c56597ba146108d957600080fd5b806391b7f5ed11610159578063a22cb46511610133578063a22cb465146107e9578063acec338a14610809578063b88d4fde14610829578063b96502cb1461084957600080fd5b806391b7f5ed146107a157806395d89b41146107c1578063a0712d68146107d657600080fd5b80638be3a8971161018a5780638be3a897146107295780638da5cb5b146107565780638dba521e1461078157600080fd5b8063721328701461069a5780637cb64759146106b05780638924af74146106d057600080fd5b80632f745c591161027f5780634d615d23116102285780636352211e116102025780636352211e146106265780636b0a11761461064657806370a0823114610665578063715018a61461068557600080fd5b80634d615d23146105cc5780634f6ccce7146105e657806355f804b31461060657600080fd5b80633e672ea0116102595780633e672ea0146105765780633f8121a21461058c57806342842e0e146105ac57600080fd5b80632f745c59146105385780632fc37ab2146105585780633ccfd60b1461056e57600080fd5b8063143094db116102ec578063235b6ea1116102c6578063235b6ea1146104a357806323b872dd146104b957806327ed3dce146104d95780632a55205a146104ec57600080fd5b8063143094db1461044f57806318160ddd1461046f5780631c9073601461048e57600080fd5b8063081812fc1161031d578063081812fc146103bd578063095ea7b3146104025780630be702bf1461042257600080fd5b806301ffc9a71461034457806304db5eed1461037957806306fdde031461039b575b600080fd5b34801561035057600080fd5b5061036461035f36600461370e565b610a6d565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061039961039436600461372b565b610b22565b005b3480156103a757600080fd5b506103b0610b93565b60405161037091906137ba565b3480156103c957600080fd5b506103dd6103d836600461372b565b610c25565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610370565b34801561040e57600080fd5b5061039961041d3660046137ef565b610ce5565b34801561042e57600080fd5b506018546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561045b57600080fd5b5061039961046a36600461381b565b610e3e565b34801561047b57600080fd5b506008545b604051908152602001610370565b34801561049a57600080fd5b50610480600a81565b3480156104af57600080fd5b5061048060105481565b3480156104c557600080fd5b506103996104d436600461386e565b610f70565b6103996104e73660046138af565b610ff7565b3480156104f857600080fd5b5061050c61050736600461392a565b6112bb565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610370565b34801561054457600080fd5b506104806105533660046137ef565b6113e9565b34801561056457600080fd5b50610480600e5481565b61039961149e565b34801561058257600080fd5b5061048060115481565b34801561059857600080fd5b506103996105a7366004613961565b61166c565b3480156105b857600080fd5b506103996105c736600461386e565b61170a565b3480156105d857600080fd5b50600d546103649060ff1681565b3480156105f257600080fd5b5061048061060136600461372b565b611725565b34801561061257600080fd5b50610399610621366004613a3f565b6117c9565b34801561063257600080fd5b506103dd61064136600461372b565b611847565b34801561065257600080fd5b50600d5461036490610100900460ff1681565b34801561067157600080fd5b50610480610680366004613a88565b6118df565b34801561069157600080fd5b50610399611993565b3480156106a657600080fd5b5061048060125481565b3480156106bc57600080fd5b506103996106cb36600461372b565b611a06565b3480156106dc57600080fd5b506106f06106eb36600461392a565b611a72565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff909116602083015201610370565b34801561073557600080fd5b506017546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076257600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff166103dd565b34801561078d57600080fd5b5061039961079c36600461372b565b611ade565b3480156107ad57600080fd5b506103996107bc36600461372b565b611b4a565b3480156107cd57600080fd5b506103b0611bb6565b6103996107e436600461372b565b611bc5565b3480156107f557600080fd5b50610399610804366004613aa5565b611d59565b34801561081557600080fd5b50610399610824366004613961565b611d64565b34801561083557600080fd5b50610399610844366004613ada565b611dfc565b34801561085557600080fd5b5061039961086436600461372b565b611e84565b34801561087557600080fd5b50610480610884366004613a88565b73ffffffffffffffffffffffffffffffffffffffff1660009081526014602052604090205490565b3480156108b857600080fd5b506015546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108e557600080fd5b506016546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091257600080fd5b506103b061092136600461372b565b611ef0565b34801561093257600080fd5b5061094661094136600461372b565b611fe6565b6040516103709190613bc4565b34801561095f57600080fd5b5061039961096e3660046137ef565b612098565b34801561097f57600080fd5b506103b06121cc565b34801561099457600080fd5b506109a86109a3366004613a88565b61225a565b6040516103709190613bd7565b3480156109c157600080fd5b506103646109d0366004613c1b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a1757600080fd5b5061048061271081565b348015610a2d57600080fd5b50610480600f5481565b348015610a4357600080fd5b50610399610a52366004613a88565b6122fc565b348015610a6357600080fd5b5061048060135481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f44c74bcc000000000000000000000000000000000000000000000000000000001415610ac157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001415610b1357506001919050565b610b1c826123f8565b92915050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610b8e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601255565b606060008054610ba290613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90613c54565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610cbc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b85565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610cf082611847565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d945760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b85565b3373ffffffffffffffffffffffffffffffffffffffff82161480610dbd5750610dbd81336109d0565b610e2f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b85565b610e39838361244e565b505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610ea55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b604080516001808252818301909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081610ebc5790505090508181600081518110610ef957610ef9613ca8565b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508281600081518110610f3b57610f3b613ca8565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9091169052610f6a84826124ee565b50505050565b610f7a33826126b4565b610fec5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b85565b610e3983838361280a565b600061100260085490565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152909150600090603401604051602081830303815290604052805190602001209050600d60019054906101000a900460ff166110ad5760405162461bcd60e51b815260206004820152600a60248201527f4e6f7420616374697665000000000000000000000000000000000000000000006044820152606401610b85565b601154336000908152601460205260409020546110ca9085613d06565b11156111185760405162461bcd60e51b815260206004820152600d60248201527f416d6f756e742064656e696564000000000000000000000000000000000000006044820152606401610b85565b61115985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612a48565b6111a55760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204164647265737300000000000000000000000000000000006044820152606401610b85565b826010546111b39190613d1e565b3410156112025760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420657468657200000000000000000000000000006044820152606401610b85565b60135461120f8484613d06565b111561125d5760405162461bcd60e51b815260206004820152600d60248201527f537570706c792064656e696564000000000000000000000000000000000000006044820152606401610b85565b60005b838110156112b35761127b336112768386613d06565b612a5e565b33600090815260146020526040812080546001929061129b908490613d06565b909155508190506112ab81613d5b565b915050611260565b505050505050565b6000828152600b60209081526040808320805482518185028101850190935280835284938493929190849084015b8282101561135b576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16818301528252600190920191016112e9565b5050505090506000815111156113d9578060008151811061137e5761137e613ca8565b602002602001015160000151611d4c826000815181106113a0576113a0613ca8565b6020026020010151602001516bffffffffffffffffffffffff16866113c59190613d1e565b6113cf9190613dc3565b92509250506113e2565b60008092509250505b9250929050565b60006113f4836118df565b82106114685760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b85565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146115055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b60006005611514476002613d1e565b61151e9190613dc3565b90506000600a61152f476002613d1e565b6115399190613dc3565b90506000600a61154a476002613d1e565b6115549190613dc3565b90506000600a611565476002613d1e565b61156f9190613dc3565b60155460405191925073ffffffffffffffffffffffffffffffffffffffff169085156108fc029086906000818181858888f193505050506115af57600080fd5b60165460405173ffffffffffffffffffffffffffffffffffffffff9091169084156108fc029085906000818181858888f193505050506115ee57600080fd5b60175460405173ffffffffffffffffffffffffffffffffffffffff9091169083156108fc029084906000818181858888f1935050505061162d57600080fd5b60185460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050610f6a57600080fd5b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600d8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b610e3983838360405180602001604052806000815250611dfc565b600061173060085490565b82106117a45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b85565b600882815481106117b7576117b7613ca8565b90600052602060002001549050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146118305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b805161184390600c906020840190613647565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b1c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b85565b600073ffffffffffffffffffffffffffffffffffffffff821661196a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b85565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146119fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b611a046000612a78565b565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611a6d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600e55565b600b6020528160005260406000208181548110611a8e57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff811692507401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16905082565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611b455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601155565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611bb15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601055565b606060018054610ba290613c54565b6000611bd060085490565b600d5490915060ff16611c255760405162461bcd60e51b815260206004820152600a60248201527f4e6f7420616374697665000000000000000000000000000000000000000000006044820152606401610b85565b600a821115611c765760405162461bcd60e51b815260206004820152600d60248201527f416d6f756e742064656e696564000000000000000000000000000000000000006044820152606401610b85565b81601054611c849190613d1e565b341015611cd35760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420657468657200000000000000000000000000006044820152606401610b85565b601254611ce08383613d06565b1115611d2e5760405162461bcd60e51b815260206004820152600d60248201527f537570706c792064656e696564000000000000000000000000000000000000006044820152606401610b85565b60005b82811015610e3957611d47336112768385613d06565b80611d5181613d5b565b915050611d31565b611843338383612aef565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611dcb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611e0633836126b4565b611e785760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b85565b610f6a84848484612c03565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611eeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601355565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611f8a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b85565b6000611f94612c8c565b90506000815111611fb45760405180602001604052806000815250611fdf565b80611fbe84612c9b565b604051602001611fcf929190613dd7565b6040516020818303038152906040525b9392505050565b6060600b6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561208d576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff168183015282526001909201910161201b565b505050509050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146120ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600061210a60085490565b9050600f548211156121845760405162461bcd60e51b815260206004820152602b60248201527f47696674207265736572766520657863656564656420776974682070726f766960448201527f64656420616d6f756e742e0000000000000000000000000000000000000000006064820152608401610b85565b60005b828110156121af5761219d846112768385613d06565b806121a781613d5b565b915050612187565b5081600f60008282546121c29190613e06565b9091555050505050565b600c80546121d990613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461220590613c54565b80156122525780601f1061222757610100808354040283529160200191612252565b820191906000526020600020905b81548152906001019060200180831161223557829003601f168201915b505050505081565b60606000612267836118df565b905060008167ffffffffffffffff8111156122845761228461397c565b6040519080825280602002602001820160405280156122ad578160200160208202803683370190505b50905060005b828110156122f4576122c585826113e9565b8282815181106122d7576122d7613ca8565b6020908102919091010152806122ec81613d5b565b9150506122b3565b509392505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146123635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b73ffffffffffffffffffffffffffffffffffffffff81166123ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b85565b6123f581612a78565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b1c5750610b1c82612dcd565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906124a882611847565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b81518110156126a957600073ffffffffffffffffffffffffffffffffffffffff1682828151811061252457612524613ca8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156125945760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e7400000000006044820152606401610b85565b8181815181106125a6576125a6613ca8565b6020026020010151602001516bffffffffffffffffffffffff16600014156126105760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f7369746976656044820152606401610b85565b6000838152600b60205260409020825183908390811061263257612632613ca8565b6020908102919091018101518254600181018455600093845292829020815191909201516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff90911617910155806126a181613d5b565b9150506124f1565b506118438282612eb0565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661274b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b85565b600061275683611847565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127c557508373ffffffffffffffffffffffffffffffffffffffff166127ad84610c25565b73ffffffffffffffffffffffffffffffffffffffff16145b80612802575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661282a82611847565b73ffffffffffffffffffffffffffffffffffffffff16146128b35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b85565b73ffffffffffffffffffffffffffffffffffffffff821661293b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b85565b612946838383612eed565b61295160008261244e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290612987908490613e06565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129c2908490613d06565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082612a558584612ff3565b14949350505050565b611843828260405180602001604052806000815250613097565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b6b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b85565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c0e84848461280a565b612c1a84848484613120565b610f6a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b6060600c8054610ba290613c54565b606081612cdb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612d055780612cef81613d5b565b9150612cfe9050600a83613dc3565b9150612cdf565b60008167ffffffffffffffff811115612d2057612d2061397c565b6040519080825280601f01601f191660200182016040528015612d4a576020820181803683370190505b5090505b841561280257612d5f600183613e06565b9150612d6c600a86613e1d565b612d77906030613d06565b60f81b818381518110612d8c57612d8c613ca8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dc6600a86613dc3565b9450612d4e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612e6057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b1c565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612ee1929190613e31565b60405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff8316612f5557612f5081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f9257612f9283826132f6565b73ffffffffffffffffffffffffffffffffffffffff8216612fb657610e39816133ad565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e3957610e39828261345c565b600081815b84518110156122f457600085828151811061301557613015613ca8565b60200260200101519050808311613057576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613084565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061308f81613d5b565b915050612ff8565b6130a183836134ad565b6130ae6000848484613120565b610e395760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b600073ffffffffffffffffffffffffffffffffffffffff84163b156132eb576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613197903390899088908890600401613e4a565b6020604051808303816000875af19250505080156131f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526131ed91810190613e93565b60015b6132a0573d80801561321e576040519150601f19603f3d011682016040523d82523d6000602084013e613223565b606091505b5080516132985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612802565b506001949350505050565b60006001613303846118df565b61330d9190613e06565b60008381526007602052604090205490915080821461336d5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906133bf90600190613e06565b600083815260096020526040812054600880549394509092849081106133e7576133e7613ca8565b90600052602060002001549050806008838154811061340857613408613ca8565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061344057613440613eb0565b6001900381819060005260206000200160009055905550505050565b6000613467836118df565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166135105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b85565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156135825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b61358e60008383612eed565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906135c4908490613d06565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461365390613c54565b90600052602060002090601f01602090048101928261367557600085556136bb565b82601f1061368e57805160ff19168380011785556136bb565b828001600101855582156136bb579182015b828111156136bb5782518255916020019190600101906136a0565b506136c79291506136cb565b5090565b5b808211156136c757600081556001016136cc565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146123f557600080fd5b60006020828403121561372057600080fd5b8135611fdf816136e0565b60006020828403121561373d57600080fd5b5035919050565b60005b8381101561375f578181015183820152602001613747565b83811115610f6a5750506000910152565b60008151808452613788816020860160208601613744565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf6020830184613770565b73ffffffffffffffffffffffffffffffffffffffff811681146123f557600080fd5b6000806040838503121561380257600080fd5b823561380d816137cd565b946020939093013593505050565b60008060006060848603121561383057600080fd5b833592506020840135613842816137cd565b915060408401356bffffffffffffffffffffffff8116811461386357600080fd5b809150509250925092565b60008060006060848603121561388357600080fd5b833561388e816137cd565b9250602084013561389e816137cd565b929592945050506040919091013590565b6000806000604084860312156138c457600080fd5b833567ffffffffffffffff808211156138dc57600080fd5b818601915086601f8301126138f057600080fd5b8135818111156138ff57600080fd5b8760208260051b850101111561391457600080fd5b6020928301989097509590910135949350505050565b6000806040838503121561393d57600080fd5b50508035926020909101359150565b8035801515811461395c57600080fd5b919050565b60006020828403121561397357600080fd5b611fdf8261394c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156139c6576139c661397c565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613a0c57613a0c61397c565b81604052809350858152868686011115613a2557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a5157600080fd5b813567ffffffffffffffff811115613a6857600080fd5b8201601f81018413613a7957600080fd5b612802848235602084016139ab565b600060208284031215613a9a57600080fd5b8135611fdf816137cd565b60008060408385031215613ab857600080fd5b8235613ac3816137cd565b9150613ad16020840161394c565b90509250929050565b60008060008060808587031215613af057600080fd5b8435613afb816137cd565b93506020850135613b0b816137cd565b925060408501359150606085013567ffffffffffffffff811115613b2e57600080fd5b8501601f81018713613b3f57600080fd5b613b4e878235602084016139ab565b91505092959194509250565b600081518084526020808501945080840160005b83811015613bb9578151805173ffffffffffffffffffffffffffffffffffffffff1688528301516bffffffffffffffffffffffff168388015260409096019590820190600101613b6e565b509495945050505050565b602081526000611fdf6020830184613b5a565b6020808252825182820181905260009190848201906040850190845b81811015613c0f57835183529284019291840191600101613bf3565b50909695505050505050565b60008060408385031215613c2e57600080fd5b8235613c39816137cd565b91506020830135613c49816137cd565b809150509250929050565b600181811c90821680613c6857607f821691505b60208210811415613ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613d1957613d19613cd7565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5657613d56613cd7565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d8d57613d8d613cd7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613dd257613dd2613d94565b500490565b60008351613de9818460208801613744565b835190830190613dfd818360208801613744565b01949350505050565b600082821015613e1857613e18613cd7565b500390565b600082613e2c57613e2c613d94565b500690565b8281526040602082015260006128026040830184613b5a565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613e896080830184613770565b9695505050505050565b600060208284031215613ea557600080fd5b8151611fdf816136e0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b8a0ca5883a6638237aa2f8b1ac1b878d34e6433b4e10a055f870a8cd37c32d064736f6c634300080c0033

Deployed Bytecode

0x60806040526004361061033f5760003560e01c806372132870116101b0578063baa551ee116100ec578063cfc86f7b11610095578063ea5cb5321161006f578063ea5cb53214610a0b578063ee40494614610a21578063f2fde38b14610a37578063fdfbe10a14610a5757600080fd5b8063cfc86f7b14610973578063d3b90b3014610988578063e985e9c5146109b557600080fd5b8063c87b56dd116100c6578063c87b56dd14610906578063cad96cca14610926578063cbce4c971461095357600080fd5b8063baa551ee14610869578063c21d0e6e146108ac578063c56597ba146108d957600080fd5b806391b7f5ed11610159578063a22cb46511610133578063a22cb465146107e9578063acec338a14610809578063b88d4fde14610829578063b96502cb1461084957600080fd5b806391b7f5ed146107a157806395d89b41146107c1578063a0712d68146107d657600080fd5b80638be3a8971161018a5780638be3a897146107295780638da5cb5b146107565780638dba521e1461078157600080fd5b8063721328701461069a5780637cb64759146106b05780638924af74146106d057600080fd5b80632f745c591161027f5780634d615d23116102285780636352211e116102025780636352211e146106265780636b0a11761461064657806370a0823114610665578063715018a61461068557600080fd5b80634d615d23146105cc5780634f6ccce7146105e657806355f804b31461060657600080fd5b80633e672ea0116102595780633e672ea0146105765780633f8121a21461058c57806342842e0e146105ac57600080fd5b80632f745c59146105385780632fc37ab2146105585780633ccfd60b1461056e57600080fd5b8063143094db116102ec578063235b6ea1116102c6578063235b6ea1146104a357806323b872dd146104b957806327ed3dce146104d95780632a55205a146104ec57600080fd5b8063143094db1461044f57806318160ddd1461046f5780631c9073601461048e57600080fd5b8063081812fc1161031d578063081812fc146103bd578063095ea7b3146104025780630be702bf1461042257600080fd5b806301ffc9a71461034457806304db5eed1461037957806306fdde031461039b575b600080fd5b34801561035057600080fd5b5061036461035f36600461370e565b610a6d565b60405190151581526020015b60405180910390f35b34801561038557600080fd5b5061039961039436600461372b565b610b22565b005b3480156103a757600080fd5b506103b0610b93565b60405161037091906137ba565b3480156103c957600080fd5b506103dd6103d836600461372b565b610c25565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610370565b34801561040e57600080fd5b5061039961041d3660046137ef565b610ce5565b34801561042e57600080fd5b506018546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561045b57600080fd5b5061039961046a36600461381b565b610e3e565b34801561047b57600080fd5b506008545b604051908152602001610370565b34801561049a57600080fd5b50610480600a81565b3480156104af57600080fd5b5061048060105481565b3480156104c557600080fd5b506103996104d436600461386e565b610f70565b6103996104e73660046138af565b610ff7565b3480156104f857600080fd5b5061050c61050736600461392a565b6112bb565b6040805173ffffffffffffffffffffffffffffffffffffffff9093168352602083019190915201610370565b34801561054457600080fd5b506104806105533660046137ef565b6113e9565b34801561056457600080fd5b50610480600e5481565b61039961149e565b34801561058257600080fd5b5061048060115481565b34801561059857600080fd5b506103996105a7366004613961565b61166c565b3480156105b857600080fd5b506103996105c736600461386e565b61170a565b3480156105d857600080fd5b50600d546103649060ff1681565b3480156105f257600080fd5b5061048061060136600461372b565b611725565b34801561061257600080fd5b50610399610621366004613a3f565b6117c9565b34801561063257600080fd5b506103dd61064136600461372b565b611847565b34801561065257600080fd5b50600d5461036490610100900460ff1681565b34801561067157600080fd5b50610480610680366004613a88565b6118df565b34801561069157600080fd5b50610399611993565b3480156106a657600080fd5b5061048060125481565b3480156106bc57600080fd5b506103996106cb36600461372b565b611a06565b3480156106dc57600080fd5b506106f06106eb36600461392a565b611a72565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff909116602083015201610370565b34801561073557600080fd5b506017546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561076257600080fd5b50600a5473ffffffffffffffffffffffffffffffffffffffff166103dd565b34801561078d57600080fd5b5061039961079c36600461372b565b611ade565b3480156107ad57600080fd5b506103996107bc36600461372b565b611b4a565b3480156107cd57600080fd5b506103b0611bb6565b6103996107e436600461372b565b611bc5565b3480156107f557600080fd5b50610399610804366004613aa5565b611d59565b34801561081557600080fd5b50610399610824366004613961565b611d64565b34801561083557600080fd5b50610399610844366004613ada565b611dfc565b34801561085557600080fd5b5061039961086436600461372b565b611e84565b34801561087557600080fd5b50610480610884366004613a88565b73ffffffffffffffffffffffffffffffffffffffff1660009081526014602052604090205490565b3480156108b857600080fd5b506015546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156108e557600080fd5b506016546103dd9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561091257600080fd5b506103b061092136600461372b565b611ef0565b34801561093257600080fd5b5061094661094136600461372b565b611fe6565b6040516103709190613bc4565b34801561095f57600080fd5b5061039961096e3660046137ef565b612098565b34801561097f57600080fd5b506103b06121cc565b34801561099457600080fd5b506109a86109a3366004613a88565b61225a565b6040516103709190613bd7565b3480156109c157600080fd5b506103646109d0366004613c1b565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a1757600080fd5b5061048061271081565b348015610a2d57600080fd5b50610480600f5481565b348015610a4357600080fd5b50610399610a52366004613a88565b6122fc565b348015610a6357600080fd5b5061048060135481565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f44c74bcc000000000000000000000000000000000000000000000000000000001415610ac157506001919050565b7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a000000000000000000000000000000000000000000000000000000001415610b1357506001919050565b610b1c826123f8565b92915050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610b8e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b601255565b606060008054610ba290613c54565b80601f0160208091040260200160405190810160405280929190818152602001828054610bce90613c54565b8015610c1b5780601f10610bf057610100808354040283529160200191610c1b565b820191906000526020600020905b815481529060010190602001808311610bfe57829003601f168201915b5050505050905090565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16610cbc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b85565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610cf082611847565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d945760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b85565b3373ffffffffffffffffffffffffffffffffffffffff82161480610dbd5750610dbd81336109d0565b610e2f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b85565b610e39838361244e565b505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610ea55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b604080516001808252818301909252600091816020015b6040805180820190915260008082526020820152815260200190600190039081610ebc5790505090508181600081518110610ef957610ef9613ca8565b6020026020010151602001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250508281600081518110610f3b57610f3b613ca8565b602090810291909101015173ffffffffffffffffffffffffffffffffffffffff9091169052610f6a84826124ee565b50505050565b610f7a33826126b4565b610fec5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b85565b610e3983838361280a565b600061100260085490565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152909150600090603401604051602081830303815290604052805190602001209050600d60019054906101000a900460ff166110ad5760405162461bcd60e51b815260206004820152600a60248201527f4e6f7420616374697665000000000000000000000000000000000000000000006044820152606401610b85565b601154336000908152601460205260409020546110ca9085613d06565b11156111185760405162461bcd60e51b815260206004820152600d60248201527f416d6f756e742064656e696564000000000000000000000000000000000000006044820152606401610b85565b61115985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050612a48565b6111a55760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964204164647265737300000000000000000000000000000000006044820152606401610b85565b826010546111b39190613d1e565b3410156112025760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420657468657200000000000000000000000000006044820152606401610b85565b60135461120f8484613d06565b111561125d5760405162461bcd60e51b815260206004820152600d60248201527f537570706c792064656e696564000000000000000000000000000000000000006044820152606401610b85565b60005b838110156112b35761127b336112768386613d06565b612a5e565b33600090815260146020526040812080546001929061129b908490613d06565b909155508190506112ab81613d5b565b915050611260565b505050505050565b6000828152600b60209081526040808320805482518185028101850190935280835284938493929190849084015b8282101561135b576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16818301528252600190920191016112e9565b5050505090506000815111156113d9578060008151811061137e5761137e613ca8565b602002602001015160000151611d4c826000815181106113a0576113a0613ca8565b6020026020010151602001516bffffffffffffffffffffffff16866113c59190613d1e565b6113cf9190613dc3565b92509250506113e2565b60008092509250505b9250929050565b60006113f4836118df565b82106114685760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b85565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146115055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b60006005611514476002613d1e565b61151e9190613dc3565b90506000600a61152f476002613d1e565b6115399190613dc3565b90506000600a61154a476002613d1e565b6115549190613dc3565b90506000600a611565476002613d1e565b61156f9190613dc3565b60155460405191925073ffffffffffffffffffffffffffffffffffffffff169085156108fc029086906000818181858888f193505050506115af57600080fd5b60165460405173ffffffffffffffffffffffffffffffffffffffff9091169084156108fc029085906000818181858888f193505050506115ee57600080fd5b60175460405173ffffffffffffffffffffffffffffffffffffffff9091169083156108fc029084906000818181858888f1935050505061162d57600080fd5b60185460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050610f6a57600080fd5b600a5473ffffffffffffffffffffffffffffffffffffffff1633146116d35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600d8054911515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909216919091179055565b610e3983838360405180602001604052806000815250611dfc565b600061173060085490565b82106117a45760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b85565b600882815481106117b7576117b7613ca8565b90600052602060002001549050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146118305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b805161184390600c906020840190613647565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b1c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b85565b600073ffffffffffffffffffffffffffffffffffffffff821661196a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b85565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146119fa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b611a046000612a78565b565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611a6d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600e55565b600b6020528160005260406000208181548110611a8e57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff811692507401000000000000000000000000000000000000000090046bffffffffffffffffffffffff16905082565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611b455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601155565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611bb15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601055565b606060018054610ba290613c54565b6000611bd060085490565b600d5490915060ff16611c255760405162461bcd60e51b815260206004820152600a60248201527f4e6f7420616374697665000000000000000000000000000000000000000000006044820152606401610b85565b600a821115611c765760405162461bcd60e51b815260206004820152600d60248201527f416d6f756e742064656e696564000000000000000000000000000000000000006044820152606401610b85565b81601054611c849190613d1e565b341015611cd35760405162461bcd60e51b815260206004820152601260248201527f496e73756666696369656e7420657468657200000000000000000000000000006044820152606401610b85565b601254611ce08383613d06565b1115611d2e5760405162461bcd60e51b815260206004820152600d60248201527f537570706c792064656e696564000000000000000000000000000000000000006044820152606401610b85565b60005b82811015610e3957611d47336112768385613d06565b80611d5181613d5b565b915050611d31565b611843338383612aef565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611dcb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b611e0633836126b4565b611e785760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b85565b610f6a84848484612c03565b600a5473ffffffffffffffffffffffffffffffffffffffff163314611eeb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b601355565b60008181526002602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16611f8a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b85565b6000611f94612c8c565b90506000815111611fb45760405180602001604052806000815250611fdf565b80611fbe84612c9b565b604051602001611fcf929190613dd7565b6040516020818303038152906040525b9392505050565b6060600b6000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561208d576000848152602090819020604080518082019091529084015473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff168183015282526001909201910161201b565b505050509050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146120ff5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b600061210a60085490565b9050600f548211156121845760405162461bcd60e51b815260206004820152602b60248201527f47696674207265736572766520657863656564656420776974682070726f766960448201527f64656420616d6f756e742e0000000000000000000000000000000000000000006064820152608401610b85565b60005b828110156121af5761219d846112768385613d06565b806121a781613d5b565b915050612187565b5081600f60008282546121c29190613e06565b9091555050505050565b600c80546121d990613c54565b80601f016020809104026020016040519081016040528092919081815260200182805461220590613c54565b80156122525780601f1061222757610100808354040283529160200191612252565b820191906000526020600020905b81548152906001019060200180831161223557829003601f168201915b505050505081565b60606000612267836118df565b905060008167ffffffffffffffff8111156122845761228461397c565b6040519080825280602002602001820160405280156122ad578160200160208202803683370190505b50905060005b828110156122f4576122c585826113e9565b8282815181106122d7576122d7613ca8565b6020908102919091010152806122ec81613d5b565b9150506122b3565b509392505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146123635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b85565b73ffffffffffffffffffffffffffffffffffffffff81166123ec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b85565b6123f581612a78565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610b1c5750610b1c82612dcd565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906124a882611847565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60005b81518110156126a957600073ffffffffffffffffffffffffffffffffffffffff1682828151811061252457612524613ca8565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1614156125945760405162461bcd60e51b815260206004820152601b60248201527f526563697069656e742073686f756c642062652070726573656e7400000000006044820152606401610b85565b8181815181106125a6576125a6613ca8565b6020026020010151602001516bffffffffffffffffffffffff16600014156126105760405162461bcd60e51b815260206004820181905260248201527f526f79616c74792076616c75652073686f756c6420626520706f7369746976656044820152606401610b85565b6000838152600b60205260409020825183908390811061263257612632613ca8565b6020908102919091018101518254600181018455600093845292829020815191909201516bffffffffffffffffffffffff16740100000000000000000000000000000000000000000273ffffffffffffffffffffffffffffffffffffffff90911617910155806126a181613d5b565b9150506124f1565b506118438282612eb0565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1661274b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b85565b600061275683611847565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127c557508373ffffffffffffffffffffffffffffffffffffffff166127ad84610c25565b73ffffffffffffffffffffffffffffffffffffffff16145b80612802575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661282a82611847565b73ffffffffffffffffffffffffffffffffffffffff16146128b35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b85565b73ffffffffffffffffffffffffffffffffffffffff821661293b5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b85565b612946838383612eed565b61295160008261244e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290612987908490613e06565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906129c2908490613d06565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082612a558584612ff3565b14949350505050565b611843828260405180602001604052806000815250613097565b600a805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b6b5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b85565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612c0e84848461280a565b612c1a84848484613120565b610f6a5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b6060600c8054610ba290613c54565b606081612cdb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115612d055780612cef81613d5b565b9150612cfe9050600a83613dc3565b9150612cdf565b60008167ffffffffffffffff811115612d2057612d2061397c565b6040519080825280601f01601f191660200182016040528015612d4a576020820181803683370190505b5090505b841561280257612d5f600183613e06565b9150612d6c600a86613e1d565b612d77906030613d06565b60f81b818381518110612d8c57612d8c613ca8565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612dc6600a86613dc3565b9450612d4e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480612e6057507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b1c57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610b1c565b7f3fa96d7b6bcbfe71ef171666d84db3cf52fa2d1c8afdb1cc8e486177f208b7df8282604051612ee1929190613e31565b60405180910390a15050565b73ffffffffffffffffffffffffffffffffffffffff8316612f5557612f5081600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612f92565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f9257612f9283826132f6565b73ffffffffffffffffffffffffffffffffffffffff8216612fb657610e39816133ad565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610e3957610e39828261345c565b600081815b84518110156122f457600085828151811061301557613015613ca8565b60200260200101519050808311613057576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613084565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061308f81613d5b565b915050612ff8565b6130a183836134ad565b6130ae6000848484613120565b610e395760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b600073ffffffffffffffffffffffffffffffffffffffff84163b156132eb576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a0290613197903390899088908890600401613e4a565b6020604051808303816000875af19250505080156131f0575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526131ed91810190613e93565b60015b6132a0573d80801561321e576040519150601f19603f3d011682016040523d82523d6000602084013e613223565b606091505b5080516132985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b85565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612802565b506001949350505050565b60006001613303846118df565b61330d9190613e06565b60008381526007602052604090205490915080821461336d5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b6008546000906133bf90600190613e06565b600083815260096020526040812054600880549394509092849081106133e7576133e7613ca8565b90600052602060002001549050806008838154811061340857613408613ca8565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061344057613440613eb0565b6001900381819060005260206000200160009055905550505050565b6000613467836118df565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b73ffffffffffffffffffffffffffffffffffffffff82166135105760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b85565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff16156135825760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b85565b61358e60008383612eed565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054600192906135c4908490613d06565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461365390613c54565b90600052602060002090601f01602090048101928261367557600085556136bb565b82601f1061368e57805160ff19168380011785556136bb565b828001600101855582156136bb579182015b828111156136bb5782518255916020019190600101906136a0565b506136c79291506136cb565b5090565b5b808211156136c757600081556001016136cc565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146123f557600080fd5b60006020828403121561372057600080fd5b8135611fdf816136e0565b60006020828403121561373d57600080fd5b5035919050565b60005b8381101561375f578181015183820152602001613747565b83811115610f6a5750506000910152565b60008151808452613788816020860160208601613744565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611fdf6020830184613770565b73ffffffffffffffffffffffffffffffffffffffff811681146123f557600080fd5b6000806040838503121561380257600080fd5b823561380d816137cd565b946020939093013593505050565b60008060006060848603121561383057600080fd5b833592506020840135613842816137cd565b915060408401356bffffffffffffffffffffffff8116811461386357600080fd5b809150509250925092565b60008060006060848603121561388357600080fd5b833561388e816137cd565b9250602084013561389e816137cd565b929592945050506040919091013590565b6000806000604084860312156138c457600080fd5b833567ffffffffffffffff808211156138dc57600080fd5b818601915086601f8301126138f057600080fd5b8135818111156138ff57600080fd5b8760208260051b850101111561391457600080fd5b6020928301989097509590910135949350505050565b6000806040838503121561393d57600080fd5b50508035926020909101359150565b8035801515811461395c57600080fd5b919050565b60006020828403121561397357600080fd5b611fdf8261394c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff808411156139c6576139c661397c565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613a0c57613a0c61397c565b81604052809350858152868686011115613a2557600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a5157600080fd5b813567ffffffffffffffff811115613a6857600080fd5b8201601f81018413613a7957600080fd5b612802848235602084016139ab565b600060208284031215613a9a57600080fd5b8135611fdf816137cd565b60008060408385031215613ab857600080fd5b8235613ac3816137cd565b9150613ad16020840161394c565b90509250929050565b60008060008060808587031215613af057600080fd5b8435613afb816137cd565b93506020850135613b0b816137cd565b925060408501359150606085013567ffffffffffffffff811115613b2e57600080fd5b8501601f81018713613b3f57600080fd5b613b4e878235602084016139ab565b91505092959194509250565b600081518084526020808501945080840160005b83811015613bb9578151805173ffffffffffffffffffffffffffffffffffffffff1688528301516bffffffffffffffffffffffff168388015260409096019590820190600101613b6e565b509495945050505050565b602081526000611fdf6020830184613b5a565b6020808252825182820181905260009190848201906040850190845b81811015613c0f57835183529284019291840191600101613bf3565b50909695505050505050565b60008060408385031215613c2e57600080fd5b8235613c39816137cd565b91506020830135613c49816137cd565b809150509250929050565b600181811c90821680613c6857607f821691505b60208210811415613ca2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115613d1957613d19613cd7565b500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d5657613d56613cd7565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d8d57613d8d613cd7565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613dd257613dd2613d94565b500490565b60008351613de9818460208801613744565b835190830190613dfd818360208801613744565b01949350505050565b600082821015613e1857613e18613cd7565b500390565b600082613e2c57613e2c613d94565b500690565b8281526040602082015260006128026040830184613b5a565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152613e896080830184613770565b9695505050505050565b600060208284031215613ea557600080fd5b8151611fdf816136e0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220b8a0ca5883a6638237aa2f8b1ac1b878d34e6433b4e10a055f870a8cd37c32d064736f6c634300080c0033

Deployed Bytecode Sourcemap

252:5229:19:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2900:356;;;;;;;;;;-1:-1:-1;2900:356:19;;;;;:::i;:::-;;:::i;:::-;;;611:14:20;;604:22;586:41;;574:2;559:18;2900:356:19;;;;;;;;1660:95;;;;;;;;;;-1:-1:-1;1660:95:19;;;;;:::i;:::-;;:::i;:::-;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:4;;;;;:::i;:::-;;:::i;:::-;;;1809:42:20;1797:55;;;1779:74;;1767:2;1752:18;3919:217:4;1633:226:20;3457:401:4;;;;;;;;;;-1:-1:-1;3457:401:4;;;;;:::i;:::-;;:::i;1082:63:19:-;;;;;;;;;;-1:-1:-1;1082:63:19;;;;;;;;2171:363;;;;;;;;;;-1:-1:-1;2171:363:19;;;;;:::i;:::-;;:::i;1614:111:5:-;;;;;;;;;;-1:-1:-1;1701:10:5;:17;1614:111;;;3005:25:20;;;2993:2;2978:18;1614:111:5;2859:177:20;665:40:19;;;;;;;;;;;;703:2;665:40;;587:34;;;;;;;;;;;;;;;;4646:330:4;;;;;;;;;;-1:-1:-1;4646:330:4;;;;;:::i;:::-;;:::i;4423:654:19:-;;;;;;:::i;:::-;;:::i;2538:358::-;;;;;;;;;;-1:-1:-1;2538:358:19;;;;;:::i;:::-;;:::i;:::-;;;;4653:42:20;4641:55;;;4623:74;;4728:2;4713:18;;4706:34;;;;4596:18;2538:358:19;4449:297:20;1290:253:5;;;;;;;;;;-1:-1:-1;1290:253:5;;;;;:::i;:::-;;:::i;456:95:19:-;;;;;;;;;;;;;;;;5081:398;;;:::i;625:36::-;;;;;;;;;;;;;;;;1552:104;;;;;;;;;;-1:-1:-1;1552:104:19;;;;;:::i;:::-;;:::i;5042:179:4:-;;;;;;;;;;-1:-1:-1;5042:179:4;;;;;:::i;:::-;;:::i;386:27:19:-;;;;;;;;;;-1:-1:-1;386:27:19;;;;;;;;1797:230:5;;;;;;;;;;-1:-1:-1;1797:230:5;;;;;:::i;:::-;;:::i;1374:94:19:-;;;;;;;;;;-1:-1:-1;1374:94:19;;;;;:::i;:::-;;:::i;2111:235:4:-;;;;;;;;;;-1:-1:-1;2111:235:4;;;;;:::i;:::-;;:::i;417:34:19:-;;;;;;;;;;-1:-1:-1;417:34:19;;;;;;;;;;;1849:205:4;;;;;;;;;;-1:-1:-1;1849:205:4;;;;;:::i;:::-;;:::i;1661:101:15:-;;;;;;;;;;;;;:::i;752:34:19:-;;;;;;;;;;;;;;;;1993:95;;;;;;;;;;-1:-1:-1;1993:95:19;;;;;:::i;:::-;;:::i;125:52:0:-;;;;;;;;;;-1:-1:-1;125:52:0;;;;;:::i;:::-;;:::i;:::-;;;;7279:42:20;7267:55;;;7249:74;;7371:26;7359:39;;;7354:2;7339:18;;7332:67;7222:18;125:52:0;7061:344:20;1015:63:19;;;;;;;;;;-1:-1:-1;1015:63:19;;;;;;;;1029:85:15;;;;;;;;;;-1:-1:-1;1101:6:15;;;;1029:85;;1870:119:19;;;;;;;;;;-1:-1:-1;1870:119:19;;;;;:::i;:::-;;:::i;2092:75::-;;;;;;;;;;-1:-1:-1;2092:75:19;;;;;:::i;:::-;;:::i;2570:102:4:-;;;;;;;;;;;;;:::i;4019:400:19:-;;;;;;:::i;:::-;;:::i;4203:153:4:-;;;;;;;;;;-1:-1:-1;4203:153:4;;;;;:::i;:::-;;:::i;1472:76:19:-;;;;;;;;;;-1:-1:-1;1472:76:19;;;;;:::i;:::-;;:::i;5287:320:4:-;;;;;;;;;;-1:-1:-1;5287:320:4;;;;;:::i;:::-;;:::i;1759:107:19:-;;;;;;;;;;-1:-1:-1;1759:107:19;;;;;:::i;:::-;;:::i;3575:110::-;;;;;;;;;;-1:-1:-1;3575:110:19;;;;;:::i;:::-;3661:15;;3636:7;3661:15;;;:8;:15;;;;;;;3575:110;881:63;;;;;;;;;;-1:-1:-1;881:63:19;;;;;;;;948;;;;;;;;;;-1:-1:-1;948:63:19;;;;;;;;2738:329:4;;;;;;;;;;-1:-1:-1;2738:329:4;;;;;:::i;:::-;;:::i;186:135:17:-;;;;;;;;;;-1:-1:-1;186:135:17;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3697:317:19:-;;;;;;;;;;-1:-1:-1;3697:317:19;;;;;:::i;:::-;;:::i;354:27::-;;;;;;;;;;;;;:::i;3261:310::-;;;;;;;;;;-1:-1:-1;3261:310:19;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4422:162:4:-;;;;;;;;;;-1:-1:-1;4422:162:4;;;;;:::i;:::-;4542:25;;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;709:39:19;;;;;;;;;;;;743:5;709:39;;556:27;;;;;;;;;;;;;;;;1911:198:15;;;;;;;;;;-1:-1:-1;1911:198:15;;;;;:::i;:::-;;:::i;790:37:19:-;;;;;;;;;;;;;;;;2900:356;3003:4;3022:53;;;3037:38;3022:53;3019:94;;;-1:-1:-1;3098:4:19;;2900:356;-1:-1:-1;2900:356:19:o;3019:94::-;3125:36;;;3140:21;3125:36;3122:77;;;-1:-1:-1;3184:4:19;;2900:356;-1:-1:-1;2900:356:19:o;3122:77::-;3215:36;3239:11;3215:23;:36::i;:::-;3208:43;2900:356;-1:-1:-1;;2900:356:19:o;1660:95::-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;;;;;;;;;1726:12:19::1;:24:::0;1660:95::o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;:30;:16;4014:73;;;;-1:-1:-1;;;4014:73:4;;11492:2:20;4014:73:4;;;11474:21:20;11531:2;11511:18;;;11504:30;11570:34;11550:18;;;11543:62;11641:14;11621:18;;;11614:42;11673:19;;4014:73:4;11290:408:20;4014:73:4;-1:-1:-1;4105:24:4;;;;:15;:24;;;;;;;;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;-1:-1:-1;;;3586:57:4;;11905:2:20;3586:57:4;;;11887:21:20;11944:2;11924:18;;;11917:30;11983:34;11963:18;;;11956:62;12054:3;12034:18;;;12027:31;12075:19;;3586:57:4;11703:397:20;3586:57:4;719:10:2;3675:21:4;;;;;:62;;-1:-1:-1;3700:37:4;3717:5;719:10:2;4422:162:4;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:4;;12307:2:20;3654:165:4;;;12289:21:20;12346:2;12326:18;;;12319:30;12385:34;12365:18;;;12358:62;12456:26;12436:18;;;12429:54;12500:19;;3654:165:4;12105:420:20;3654:165:4;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;2171:363:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;2346:21:19::1;::::0;;2365:1:::1;2346:21:::0;;;;;::::1;::::0;;;2311:32:::1;::::0;2346:21:::1;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;2346:21:19::1;;;;;;;;;;;;;;;2311:56;;2399:22;2377:10;2388:1;2377:13;;;;;;;;:::i;:::-;;;;;;;:19;;:44;;;;;;;;;::::0;::::1;2455:27;2431:10;2442:1;2431:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;:51:::1;::::0;;::::1;::::0;;2492:36:::1;2507:8:::0;2517:10;2492:14:::1;:36::i;:::-;2301:233;2171:363:::0;;;:::o;4646:330:4:-;4835:41;719:10:2;4868:7:4;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:4;;12921:2:20;4827:103:4;;;12903:21:20;12960:2;12940:18;;;12933:30;12999:34;12979:18;;;12972:62;13070:19;13050:18;;;13043:47;13107:19;;4827:103:4;12719:413:20;4827:103:4;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;4423:654:19:-;4511:14;4528:13;1701:10:5;:17;;1614:111;4528:13:19;4572:28;;13299:66:20;4589:10:19;13286:2:20;13282:15;13278:88;4572:28:19;;;13266:101:20;4511:30:19;;-1:-1:-1;4547:12:19;;13383::20;;4572:28:19;;;;;;;;;;;;4562:39;;;;;;4547:54;;4617:14;;;;;;;;;;;4608:38;;;;-1:-1:-1;;;4608:38:19;;13608:2:20;4608:38:19;;;13590:21:20;13647:2;13627:18;;;13620:30;13686:12;13666:18;;;13659:40;13716:18;;4608:38:19;13406:334:20;4608:38:19;4695:17;;4680:10;4671:20;;;;:8;:20;;;;;;4661:30;;:7;:30;:::i;:::-;:51;;4652:78;;;;-1:-1:-1;;;4652:78:19;;14269:2:20;4652:78:19;;;14251:21:20;14308:2;14288:18;;;14281:30;14347:15;14327:18;;;14320:43;14380:18;;4652:78:19;14067:337:20;4652:78:19;4745:51;4764:12;;4745:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4778:11:19;;;-1:-1:-1;4791:4:19;;-1:-1:-1;4745:18:19;:51::i;:::-;4736:80;;;;-1:-1:-1;;;4736:80:19;;14611:2:20;4736:80:19;;;14593:21:20;14650:2;14630:18;;;14623:30;14689:17;14669:18;;;14662:45;14724:18;;4736:80:19;14409:339:20;4736:80:19;4853:7;4844:6;;:16;;;;:::i;:::-;4831:9;:29;;4822:61;;;;-1:-1:-1;;;4822:61:19;;15188:2:20;4822:61:19;;;15170:21:20;15227:2;15207:18;;;15200:30;15266:20;15246:18;;;15239:48;15304:18;;4822:61:19;14986:342:20;4822:61:19;4918:15;;4898:16;4907:7;4898:6;:16;:::i;:::-;:35;;4889:62;;;;-1:-1:-1;;;4889:62:19;;15535:2:20;4889:62:19;;;15517:21:20;15574:2;15554:18;;;15547:30;15613:15;15593:18;;;15586:43;15646:18;;4889:62:19;15333:337:20;4889:62:19;4962:9;4958:115;4977:7;4973:1;:11;4958:115;;;4998:35;5009:10;5021;5030:1;5021:6;:10;:::i;:::-;4998:9;:35::i;:::-;5050:10;5041:20;;;;:8;:20;;;;;:25;;5065:1;;5041:20;:25;;5065:1;;5041:25;:::i;:::-;;;;-1:-1:-1;4986:3:19;;-1:-1:-1;4986:3:19;;;:::i;:::-;;;;4958:115;;;;4505:572;;4423:654;;;:::o;2538:358::-;2621:16;2707:19;;;:9;:19;;;;;;;;2672:54;;;;;;;;;;;;;;;;;2621:16;;;;2672:54;2707:19;2672:54;2621:16;;2672:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2759:1;2739:10;:17;:21;2736:123;;;2784:10;2795:1;2784:13;;;;;;;;:::i;:::-;;;;;;;:21;;;2843:4;2822:10;2833:1;2822:13;;;;;;;;:::i;:::-;;;;;;;:19;;;2808:33;;:11;:33;;;;:::i;:::-;2807:40;;;;:::i;:::-;2776:72;;;;;;;2736:123;2884:1;2888;2868:22;;;;;2538:358;;;;;;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:5;;16391:2:20;1406:87:5;;;16373:21:20;16430:2;16410:18;;;16403:30;16469:34;16449:18;;;16442:62;16540:13;16520:18;;;16513:41;16571:19;;1406:87:5;16189:407:20;1406:87:5;-1:-1:-1;1510:19:5;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;5081:398:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;5132:11:19::1;5174:1;5146:25;:21;5170:1;5146:25;:::i;:::-;:29;;;;:::i;:::-;5132:43:::0;-1:-1:-1;5181:11:19::1;5223:2;5195:25;:21;5219:1;5195:25;:::i;:::-;:30;;;;:::i;:::-;5181:44:::0;-1:-1:-1;5231:11:19::1;5273:2;5245:25;:21;5269:1;5245:25;:::i;:::-;:30;;;;:::i;:::-;5231:44:::0;-1:-1:-1;5281:11:19::1;5323:2;5295:25;:21;5319:1;5295:25;:::i;:::-;:30;;;;:::i;:::-;5348:3;::::0;5340:22:::1;::::0;5281:44;;-1:-1:-1;5348:3:19::1;;::::0;5340:22;::::1;;;::::0;5358:3;;5348::::1;5340:22:::0;5348:3;5340:22;5358:3;5348;5340:22;::::1;;;;;;5332:31;;;::::0;::::1;;5385:3;::::0;5377:22:::1;::::0;5385:3:::1;::::0;;::::1;::::0;5377:22;::::1;;;::::0;5395:3;;5385::::1;5377:22:::0;5385:3;5377:22;5395:3;5385;5377:22;::::1;;;;;;5369:31;;;::::0;::::1;;5422:3;::::0;5414:22:::1;::::0;5422:3:::1;::::0;;::::1;::::0;5414:22;::::1;;;::::0;5432:3;;5422::::1;5414:22:::0;5422:3;5414:22;5432:3;5422;5414:22;::::1;;;;;;5406:31;;;::::0;::::1;;5459:3;::::0;5451:22:::1;::::0;5459:3:::1;::::0;;::::1;::::0;5451:22;::::1;;;::::0;5469:3;;5459::::1;5451:22:::0;5459:3;5451:22;5469:3;5459;5451:22;::::1;;;;;;5443:31;;;::::0;::::1;1552:104:::0;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1621:14:19::1;:30:::0;;;::::1;;;;::::0;;;::::1;::::0;;;::::1;::::0;;1552:104::o;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;1797:230:5:-;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:5;;16803:2:20;1891:95:5;;;16785:21:20;16842:2;16822:18;;;16815:30;16881:34;16861:18;;;16854:62;16952:14;16932:18;;;16925:42;16984:19;;1891:95:5;16601:408:20;1891:95:5;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;1374:94:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1440:23:19;;::::1;::::0;:13:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1374:94:::0;:::o;2111:235:4:-;2183:7;2218:16;;;:7;:16;;;;;;;;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:4;;17216:2:20;2244:73:4;;;17198:21:20;17255:2;17235:18;;;17228:30;17294:34;17274:18;;;17267:62;17365:11;17345:18;;;17338:39;17394:19;;2244:73:4;17014:405:20;1849:205:4;1921:7;1948:19;;;1940:74;;;;-1:-1:-1;;;1940:74:4;;17626:2:20;1940:74:4;;;17608:21:20;17665:2;17645:18;;;17638:30;17704:34;17684:18;;;17677:62;17775:12;17755:18;;;17748:40;17805:19;;1940:74:4;17424:406:20;1940:74:4;-1:-1:-1;2031:16:4;;;;;;:9;:16;;;;;;;1849:205::o;1661:101:15:-;1101:6;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;1993:95:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;2059:11:19::1;:24:::0;1993:95::o;125:52:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;125:52:0;;;;;;-1:-1:-1;125:52:0;:::o;1870:119:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1948:17:19::1;:36:::0;1870:119::o;2092:75::-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;2148:6:19::1;:14:::0;2092:75::o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;4019:400:19:-;4071:14;4088:13;1701:10:5;:17;;1614:111;4088:13:19;4117:7;;4071:30;;-1:-1:-1;4117:7:19;;4108:31;;;;-1:-1:-1;;;4108:31:19;;13608:2:20;4108:31:19;;;13590:21:20;13647:2;13627:18;;;13620:30;13686:12;13666:18;;;13659:40;13716:18;;4108:31:19;13406:334:20;4108:31:19;703:2;4154:7;:22;;4145:49;;;;-1:-1:-1;;;4145:49:19;;14269:2:20;4145:49:19;;;14251:21:20;14308:2;14288:18;;;14281:30;14347:15;14327:18;;;14320:43;14380:18;;4145:49:19;14067:337:20;4145:49:19;4231:7;4222:6;;:16;;;;:::i;:::-;4209:9;:29;;4200:61;;;;-1:-1:-1;;;4200:61:19;;15188:2:20;4200:61:19;;;15170:21:20;15227:2;15207:18;;;15200:30;15266:20;15246:18;;;15239:48;15304:18;;4200:61:19;14986:342:20;4200:61:19;4296:12;;4276:16;4285:7;4276:6;:16;:::i;:::-;:32;;4267:59;;;;-1:-1:-1;;;4267:59:19;;15535:2:20;4267:59:19;;;15517:21:20;15574:2;15554:18;;;15547:30;15613:15;15593:18;;;15586:43;15646:18;;4267:59:19;15333:337:20;4267:59:19;4337:9;4333:82;4352:7;4348:1;:11;4333:82;;;4373:35;4384:10;4396;4405:1;4396:6;:10;:::i;4373:35::-;4361:3;;;;:::i;:::-;;;;4333:82;;4203:153:4;4297:52;719:10:2;4330:8:4;4340;4297:18;:52::i;1472:76:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1527:7:19::1;:16:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;1472:76::o;5287:320:4:-;5456:41;719:10:2;5489:7:4;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:4;;12921:2:20;5448:103:4;;;12903:21:20;12960:2;12940:18;;;12933:30;12999:34;12979:18;;;12972:62;13070:19;13050:18;;;13043:47;13107:19;;5448:103:4;12719:413:20;5448:103:4;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;1759:107:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1831:15:19::1;:30:::0;1759:107::o;2738:329:4:-;7144:4;7167:16;;;:7;:16;;;;;;2811:13;;7167:30;:16;2836:76;;;;-1:-1:-1;;;2836:76:4;;18037:2:20;2836:76:4;;;18019:21:20;18076:2;18056:18;;;18049:30;18115:34;18095:18;;;18088:62;18186:17;18166:18;;;18159:45;18221:19;;2836:76:4;17835:411:20;2836:76:4;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;2738:329;-1:-1:-1;;;2738:329:4:o;186:135:17:-;261:21;301:9;:13;311:2;301:13;;;;;;;;;;;294:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;186:135;;;:::o;3697:317:19:-;1101:6:15;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;3768:14:19::1;3785:13;1701:10:5::0;:17;;1614:111;3785:13:19::1;3768:30;;3827:6;;3816:7;:17;;3808:73;;;::::0;-1:-1:-1;;;3808:73:19;;18928:2:20;3808:73:19::1;::::0;::::1;18910:21:20::0;18967:2;18947:18;;;18940:30;19006:34;18986:18;;;18979:62;19077:13;19057:18;;;19050:41;19108:19;;3808:73:19::1;18726:407:20::0;3808:73:19::1;3900:9;3896:83;3915:7;3911:1;:11;3896:83;;;3940:28;3951:3:::0;3956:10:::1;3965:1:::0;3956:6;:10:::1;:::i;3940:28::-;3924:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3896:83;;;;3998:7;3988:6;;:17;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;3697:317:19:o;354:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3261:310::-;3324:16;3348:18;3369:17;3379:6;3369:9;:17::i;:::-;3348:38;;3392:25;3434:10;3420:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3420:25:19;;3392:53;;3456:9;3452:94;3471:10;3467:1;:14;3452:94;;;3509:30;3529:6;3537:1;3509:19;:30::i;:::-;3495:8;3504:1;3495:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;3483:3;;;;:::i;:::-;;;;3452:94;;;-1:-1:-1;3558:8:19;3261:310;-1:-1:-1;;;3261:310:19:o;1911:198:15:-;1101:6;;1241:23;1101:6;719:10:2;1241:23:15;1233:68;;;;-1:-1:-1;;;1233:68:15;;10689:2:20;1233:68:15;;;10671:21:20;;;10708:18;;;10701:30;10767:34;10747:18;;;10740:62;10819:18;;1233:68:15;10487:356:20;1233:68:15;1999:22:::1;::::0;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:15;;19470:2:20;1991:73:15::1;::::0;::::1;19452:21:20::0;19509:2;19489:18;;;19482:30;19548:34;19528:18;;;19521:62;19619:8;19599:18;;;19592:36;19645:19;;1991:73:15::1;19268:402:20::0;1991:73:15::1;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;989:222:5:-;1091:4;1114:50;;;1129:35;1114:50;;:90;;;1168:36;1192:11;1168:23;:36::i;10930:171:4:-;11004:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;11057:23;11004:24;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;184:416:0:-;279:6;274:278;295:10;:17;291:1;:21;274:278;;;374:3;341:37;;:10;352:1;341:13;;;;;;;;:::i;:::-;;;;;;;:21;;;:37;;;;333:77;;;;-1:-1:-1;;;333:77:0;;19877:2:20;333:77:0;;;19859:21:20;19916:2;19896:18;;;19889:30;19955:29;19935:18;;;19928:57;20002:18;;333:77:0;19675:351:20;333:77:0;432:10;443:1;432:13;;;;;;;;:::i;:::-;;;;;;;:19;;;:24;;455:1;432:24;;424:69;;;;-1:-1:-1;;;424:69:0;;20233:2:20;424:69:0;;;20215:21:20;;;20252:18;;;20245:30;20311:34;20291:18;;;20284:62;20363:18;;424:69:0;20031:356:20;424:69:0;507:14;;;;:9;:14;;;;;527:13;;:10;;538:1;;527:13;;;;;;:::i;:::-;;;;;;;;;;;;507:34;;;;;;;-1:-1:-1;507:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;314:3;;;;:::i;:::-;;;;274:278;;;;561:32;577:3;582:10;561:15;:32::i;7362:344:4:-;7455:4;7167:16;;;:7;:16;;;;;;:30;:16;7471:73;;;;-1:-1:-1;;;7471:73:4;;20594:2:20;7471:73:4;;;20576:21:20;20633:2;20613:18;;;20606:30;20672:34;20652:18;;;20645:62;20743:14;20723:18;;;20716:42;20775:19;;7471:73:4;20392:408:20;7471:73:4;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;-1:-1:-1;4542:25:4;;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7666:32;7603:96;7362:344;-1:-1:-1;;;;7362:344:4:o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;-1:-1:-1;;;10378:85:4;;21007:2:20;10378:85:4;;;20989:21:20;21046:2;21026:18;;;21019:30;21085:34;21065:18;;;21058:62;21156:11;21136:18;;;21129:39;21185:19;;10378:85:4;20805:405:20;10378:85:4;10481:16;;;10473:65;;;;-1:-1:-1;;;10473:65:4;;21417:2:20;10473:65:4;;;21399:21:20;21456:2;21436:18;;;21429:30;21495:34;21475:18;;;21468:62;21566:6;21546:18;;;21539:34;21590:19;;10473:65:4;21215:400:20;10473:65:4;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10690:15;;;;;;;:9;:15;;;;;:20;;10709:1;;10690:15;:20;;10709:1;;10690:20;:::i;:::-;;;;-1:-1:-1;;10720:13:4;;;;;;;:9;:13;;;;;:18;;10737:1;;10720:13;:18;;10737:1;;10720:18;:::i;:::-;;;;-1:-1:-1;;10748:16:4;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;10785:27;;10748:16;;10785:27;;;;;;;10259:560;;;:::o;847:184:14:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:14:o;8036:108:4:-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;2263:187:15:-;2355:6;;;;2371:17;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;11236:307:4:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;-1:-1:-1;;;11369:55:4;;21822:2:20;11369:55:4;;;21804:21:20;21861:2;21841:18;;;21834:30;21900:27;21880:18;;;21873:55;21945:18;;11369:55:4;21620:349:20;11369:55:4;11434:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;11495:41;;586::20;;;11495::4;;559:18:20;11495:41:4;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:4;;22176:2:20;6658:111:4;;;22158:21:20;22215:2;22195:18;;;22188:30;22254:34;22234:18;;;22227:62;22325:20;22305:18;;;22298:48;22363:19;;6658:111:4;21974:414:20;1264:106:19;1324:13;1352;1345:20;;;;;:::i;328:703:18:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:18;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:18;;-1:-1:-1;773:2:18;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:18;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:18;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:18;981:2;972:11;;:::i;:::-;;;844:150;;1490:300:4;1592:4;1627:40;;;1642:25;1627:40;;:104;;-1:-1:-1;1683:48:4;;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:3;937:40;;;;1747:36:4;829:155:3;327:141:17;432:29;445:3;450:10;432:29;;;;;;;:::i;:::-;;;;;;;;327:141;;:::o;2623:572:5:-;2822:18;;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;3014:16;;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;1383:688:14:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;23052:19:20;;;23087:12;;;23080:28;;;23124:12;;1779:44:14;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;23052:19:20;;;23087:12;;;23080:28;;;23124:12;;1966:44:14;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:14;;;;:::i;:::-;;;;1522:514;;8365:311:4;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;-1:-1:-1;;;8518:151:4;;22176:2:20;8518:151:4;;;22158:21:20;22215:2;22195:18;;;22188:30;22254:34;22234:18;;;22227:62;22325:20;22305:18;;;22298:48;22363:19;;8518:151:4;21974:414:20;12096:778:4;12246:4;12266:13;;;1087:20:1;1133:8;12262:606:4;;12301:72;;;;;:36;;;;;;:72;;719:10:2;;12352:4:4;;12358:7;;12367:5;;12301:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12301:72:4;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12540:13:4;;12536:266;;12582:60;;-1:-1:-1;;;12582:60:4;;22176:2:20;12582:60:4;;;22158:21:20;22215:2;22195:18;;;22188:30;22254:34;22234:18;;;22227:62;22325:20;22305:18;;;22298:48;22363:19;;12582:60:4;21974:414:20;12536:266:4;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12423:51;;12433:41;12423:51;;-1:-1:-1;12416:58:4;;12262:606;-1:-1:-1;12853:4:4;12096:778;;;;;;:::o;4679:970:5:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:5;;;5149:323;;5219:18;;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:5;;;;:17;:26;;;;;;;;5558:33;;;5608:18;;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:5;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3620:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:5:o;8998:372:4:-;9077:16;;;9069:61;;;;-1:-1:-1;;;9069:61:4;;24309:2:20;9069:61:4;;;24291:21:20;;;24328:18;;;24321:30;24387:34;24367:18;;;24360:62;24439:18;;9069:61:4;24107:356:20;9069:61:4;7144:4;7167:16;;;:7;:16;;;;;;:30;:16;:30;9140:58;;;;-1:-1:-1;;;9140:58:4;;24670:2:20;9140:58:4;;;24652:21:20;24709:2;24689:18;;;24682:30;24748;24728:18;;;24721:58;24796:18;;9140:58:4;24468:352:20;9140:58:4;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9265:13;;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:4;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;8998:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:20;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;638:180::-;697:6;750:2;738:9;729:7;725:23;721:32;718:52;;;766:1;763;756:12;718:52;-1:-1:-1;789:23:20;;638:180;-1:-1:-1;638:180:20:o;823:258::-;895:1;905:113;919:6;916:1;913:13;905:113;;;995:11;;;989:18;976:11;;;969:39;941:2;934:10;905:113;;;1036:6;1033:1;1030:13;1027:48;;;-1:-1:-1;;1071:1:20;1053:16;;1046:27;823:258::o;1086:317::-;1128:3;1166:5;1160:12;1193:6;1188:3;1181:19;1209:63;1265:6;1258:4;1253:3;1249:14;1242:4;1235:5;1231:16;1209:63;:::i;:::-;1317:2;1305:15;1322:66;1301:88;1292:98;;;;1392:4;1288:109;;1086:317;-1:-1:-1;;1086:317:20:o;1408:220::-;1557:2;1546:9;1539:21;1520:4;1577:45;1618:2;1607:9;1603:18;1595:6;1577:45;:::i;1864:154::-;1950:42;1943:5;1939:54;1932:5;1929:65;1919:93;;2008:1;2005;1998:12;2023:315;2091:6;2099;2152:2;2140:9;2131:7;2127:23;2123:32;2120:52;;;2168:1;2165;2158:12;2120:52;2207:9;2194:23;2226:31;2251:5;2226:31;:::i;:::-;2276:5;2328:2;2313:18;;;;2300:32;;-1:-1:-1;;;2023:315:20:o;2343:511::-;2427:6;2435;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;2548:9;2535:23;2525:33;;2608:2;2597:9;2593:18;2580:32;2621:31;2646:5;2621:31;:::i;:::-;2671:5;-1:-1:-1;2728:2:20;2713:18;;2700:32;2776:26;2763:40;;2751:53;;2741:81;;2818:1;2815;2808:12;2741:81;2841:7;2831:17;;;2343:511;;;;;:::o;3041:456::-;3118:6;3126;3134;3187:2;3175:9;3166:7;3162:23;3158:32;3155:52;;;3203:1;3200;3193:12;3155:52;3242:9;3229:23;3261:31;3286:5;3261:31;:::i;:::-;3311:5;-1:-1:-1;3368:2:20;3353:18;;3340:32;3381:33;3340:32;3381:33;:::i;:::-;3041:456;;3433:7;;-1:-1:-1;;;3487:2:20;3472:18;;;;3459:32;;3041:456::o;3502:689::-;3597:6;3605;3613;3666:2;3654:9;3645:7;3641:23;3637:32;3634:52;;;3682:1;3679;3672:12;3634:52;3722:9;3709:23;3751:18;3792:2;3784:6;3781:14;3778:34;;;3808:1;3805;3798:12;3778:34;3846:6;3835:9;3831:22;3821:32;;3891:7;3884:4;3880:2;3876:13;3872:27;3862:55;;3913:1;3910;3903:12;3862:55;3953:2;3940:16;3979:2;3971:6;3968:14;3965:34;;;3995:1;3992;3985:12;3965:34;4050:7;4043:4;4033:6;4030:1;4026:14;4022:2;4018:23;4014:34;4011:47;4008:67;;;4071:1;4068;4061:12;4008:67;4102:4;4094:13;;;;4126:6;;-1:-1:-1;4164:20:20;;;;4151:34;;3502:689;-1:-1:-1;;;;3502:689:20:o;4196:248::-;4264:6;4272;4325:2;4313:9;4304:7;4300:23;4296:32;4293:52;;;4341:1;4338;4331:12;4293:52;-1:-1:-1;;4364:23:20;;;4434:2;4419:18;;;4406:32;;-1:-1:-1;4196:248:20:o;4933:160::-;4998:20;;5054:13;;5047:21;5037:32;;5027:60;;5083:1;5080;5073:12;5027:60;4933:160;;;:::o;5098:180::-;5154:6;5207:2;5195:9;5186:7;5182:23;5178:32;5175:52;;;5223:1;5220;5213:12;5175:52;5246:26;5262:9;5246:26;:::i;5283:184::-;5335:77;5332:1;5325:88;5432:4;5429:1;5422:15;5456:4;5453:1;5446:15;5472:691;5537:5;5567:18;5608:2;5600:6;5597:14;5594:40;;;5614:18;;:::i;:::-;5748:2;5742:9;5814:2;5802:15;;5653:66;5798:24;;;5824:2;5794:33;5790:42;5778:55;;;5848:18;;;5868:22;;;5845:46;5842:72;;;5894:18;;:::i;:::-;5934:10;5930:2;5923:22;5963:6;5954:15;;5993:6;5985;5978:22;6033:3;6024:6;6019:3;6015:16;6012:25;6009:45;;;6050:1;6047;6040:12;6009:45;6100:6;6095:3;6088:4;6080:6;6076:17;6063:44;6155:1;6148:4;6139:6;6131;6127:19;6123:30;6116:41;;;;5472:691;;;;;:::o;6168:451::-;6237:6;6290:2;6278:9;6269:7;6265:23;6261:32;6258:52;;;6306:1;6303;6296:12;6258:52;6346:9;6333:23;6379:18;6371:6;6368:30;6365:50;;;6411:1;6408;6401:12;6365:50;6434:22;;6487:4;6479:13;;6475:27;-1:-1:-1;6465:55:20;;6516:1;6513;6506:12;6465:55;6539:74;6605:7;6600:2;6587:16;6582:2;6578;6574:11;6539:74;:::i;6624:247::-;6683:6;6736:2;6724:9;6715:7;6711:23;6707:32;6704:52;;;6752:1;6749;6742:12;6704:52;6791:9;6778:23;6810:31;6835:5;6810:31;:::i;7410:315::-;7475:6;7483;7536:2;7524:9;7515:7;7511:23;7507:32;7504:52;;;7552:1;7549;7542:12;7504:52;7591:9;7578:23;7610:31;7635:5;7610:31;:::i;:::-;7660:5;-1:-1:-1;7684:35:20;7715:2;7700:18;;7684:35;:::i;:::-;7674:45;;7410:315;;;;;:::o;7730:795::-;7825:6;7833;7841;7849;7902:3;7890:9;7881:7;7877:23;7873:33;7870:53;;;7919:1;7916;7909:12;7870:53;7958:9;7945:23;7977:31;8002:5;7977:31;:::i;:::-;8027:5;-1:-1:-1;8084:2:20;8069:18;;8056:32;8097:33;8056:32;8097:33;:::i;:::-;8149:7;-1:-1:-1;8203:2:20;8188:18;;8175:32;;-1:-1:-1;8258:2:20;8243:18;;8230:32;8285:18;8274:30;;8271:50;;;8317:1;8314;8307:12;8271:50;8340:22;;8393:4;8385:13;;8381:27;-1:-1:-1;8371:55:20;;8422:1;8419;8412:12;8371:55;8445:74;8511:7;8506:2;8493:16;8488:2;8484;8480:11;8445:74;:::i;:::-;8435:84;;;7730:795;;;;;;;:::o;8530:608::-;8587:3;8625:5;8619:12;8652:6;8647:3;8640:19;8678:4;8707:2;8702:3;8698:12;8691:19;;8744:2;8737:5;8733:14;8765:1;8775:338;8789:6;8786:1;8783:13;8775:338;;;8848:13;;8890:9;;8901:42;8886:58;8874:71;;8989:11;;8983:18;9003:26;8979:51;8965:12;;;8958:73;9060:4;9051:14;;;;9088:15;;;;8811:1;8804:9;8775:338;;;-1:-1:-1;9129:3:20;;8530:608;-1:-1:-1;;;;;8530:608:20:o;9143:309::-;9366:2;9355:9;9348:21;9329:4;9386:60;9442:2;9431:9;9427:18;9419:6;9386:60;:::i;9457:632::-;9628:2;9680:21;;;9750:13;;9653:18;;;9772:22;;;9599:4;;9628:2;9851:15;;;;9825:2;9810:18;;;9599:4;9894:169;9908:6;9905:1;9902:13;9894:169;;;9969:13;;9957:26;;10038:15;;;;10003:12;;;;9930:1;9923:9;9894:169;;;-1:-1:-1;10080:3:20;;9457:632;-1:-1:-1;;;;;;9457:632:20:o;10094:388::-;10162:6;10170;10223:2;10211:9;10202:7;10198:23;10194:32;10191:52;;;10239:1;10236;10229:12;10191:52;10278:9;10265:23;10297:31;10322:5;10297:31;:::i;:::-;10347:5;-1:-1:-1;10404:2:20;10389:18;;10376:32;10417:33;10376:32;10417:33;:::i;:::-;10469:7;10459:17;;;10094:388;;;;;:::o;10848:437::-;10927:1;10923:12;;;;10970;;;10991:61;;11045:4;11037:6;11033:17;11023:27;;10991:61;11098:2;11090:6;11087:14;11067:18;11064:38;11061:218;;;11135:77;11132:1;11125:88;11236:4;11233:1;11226:15;11264:4;11261:1;11254:15;11061:218;;10848:437;;;:::o;12530:184::-;12582:77;12579:1;12572:88;12679:4;12676:1;12669:15;12703:4;12700:1;12693:15;13745:184;13797:77;13794:1;13787:88;13894:4;13891:1;13884:15;13918:4;13915:1;13908:15;13934:128;13974:3;14005:1;14001:6;13998:1;13995:13;13992:39;;;14011:18;;:::i;:::-;-1:-1:-1;14047:9:20;;13934:128::o;14753:228::-;14793:7;14919:1;14851:66;14847:74;14844:1;14841:81;14836:1;14829:9;14822:17;14818:105;14815:131;;;14926:18;;:::i;:::-;-1:-1:-1;14966:9:20;;14753:228::o;15675:195::-;15714:3;15745:66;15738:5;15735:77;15732:103;;;15815:18;;:::i;:::-;-1:-1:-1;15862:1:20;15851:13;;15675:195::o;15875:184::-;15927:77;15924:1;15917:88;16024:4;16021:1;16014:15;16048:4;16045:1;16038:15;16064:120;16104:1;16130;16120:35;;16135:18;;:::i;:::-;-1:-1:-1;16169:9:20;;16064:120::o;18251:470::-;18430:3;18468:6;18462:13;18484:53;18530:6;18525:3;18518:4;18510:6;18506:17;18484:53;:::i;:::-;18600:13;;18559:16;;;;18622:57;18600:13;18559:16;18656:4;18644:17;;18622:57;:::i;:::-;18695:20;;18251:470;-1:-1:-1;;;;18251:470:20:o;19138:125::-;19178:4;19206:1;19203;19200:8;19197:34;;;19211:18;;:::i;:::-;-1:-1:-1;19248:9:20;;19138:125::o;22393:112::-;22425:1;22451;22441:35;;22456:18;;:::i;:::-;-1:-1:-1;22490:9:20;;22393:112::o;22510:380::-;22761:6;22750:9;22743:25;22804:2;22799;22788:9;22784:18;22777:30;22724:4;22824:60;22880:2;22869:9;22865:18;22857:6;22824:60;:::i;23147:512::-;23341:4;23370:42;23451:2;23443:6;23439:15;23428:9;23421:34;23503:2;23495:6;23491:15;23486:2;23475:9;23471:18;23464:43;;23543:6;23538:2;23527:9;23523:18;23516:34;23586:3;23581:2;23570:9;23566:18;23559:31;23607:46;23648:3;23637:9;23633:19;23625:6;23607:46;:::i;:::-;23599:54;23147:512;-1:-1:-1;;;;;;23147:512:20:o;23664:249::-;23733:6;23786:2;23774:9;23765:7;23761:23;23757:32;23754:52;;;23802:1;23799;23792:12;23754:52;23834:9;23828:16;23853:30;23877:5;23853:30;:::i;23918:184::-;23970:77;23967:1;23960:88;24067:4;24064:1;24057:15;24091:4;24088:1;24081:15

Swarm Source

ipfs://b8a0ca5883a6638237aa2f8b1ac1b878d34e6433b4e10a055f870a8cd37c32d0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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