Token ArbiDudesGenOne

 

Overview

TokenID:
6707

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ArbiDudesGenOne

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 16 : Arbidudes.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

/* 

      _____________________________________
     |                                     |
     |                  The                |
     |               ARBIDUDES             |
     |             Dudes Gen One           |
     |      https://www.arbidudes.xyz/     |
     |          Twitter: @ArbiDudes        |
     |_____________________________________|


//////////////////////////////////////////////////
/////////////@@@@@@@@@@@//////////////////////////
/////////@@@@@@@@@@@@@@@@@////////////////////////
///////@@@@@@@@@@@@@@@@@@@@@//////////////////////
/////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@///////
/////@@[email protected]@@@@@/...................//////@@///
/////@@[email protected]@/...................//////@@///
/////@@[email protected]@@@[email protected]@@@.....//////@@///
/////&&[email protected]@@@[email protected]@@@.....//////&&///
/////@@[email protected]@@@[email protected]@@@.....//////@@///
/////@@..****...................*****..//////@@///
/////@@[email protected]@@@@@@@@@@@@@@@@@@@@.......//////@@///
/////@&................................//////@&///
/////@@[email protected]@@@@@/...................//////@@///
/////@@..............................////////@@///
/////@@..............................////////@@///
/////&&...........................///////////&&///
///////@&//.....................///////////@@/////
/////////@@////////,......///////////////@@///////
///////////@@@@......./////////////////@&@@///////

*/

contract ArbiDudesGenOne is
  ERC721,
  ERC721Enumerable,
  Pausable,
  Ownable,
  ReentrancyGuard
{
  using Counters for Counters.Counter;

  uint256 public price = 50000000000000000; //0.05 ETH
  uint256 public changeNamePrice = 10000000000000000; // 0.01 ETH
  uint256 public chatPrice = 0;
  uint256 public maxGiveawayTokenId = 550;
  uint256 private _maxSupply = 10000;
  uint256 private _maxMintAmount = 20;

  Counters.Counter private _tokenIdCounter;

  event ArbiDudeCreated(uint256 indexed tokenId, uint256 indexed soul);
  event NameChanged(uint256 tokenId, string name);

  struct Dude {
    string nickname;
    mapping(uint256 => EternalMessage[]) chats; // tokenId -> chat
    mapping(uint256 => uint256) blockedChat; // tokenId -> blocked
  }

  struct EternalMessage {
    string message;
    uint256 from;
    uint256 timestamp;
  }

  mapping(uint256 => Dude) private dudes;
  mapping(uint256 => uint256) private souls;
  mapping(address => bool) public mintedFree;

  constructor(string memory newBaseURI, uint256 newMaxSupply)
    ERC721("ArbiDudesGenOne", "DUDE")
  {
    setBaseURI(newBaseURI);
    setMaxSupply(newMaxSupply);

    // Increment tokenIdCounter so it starts at one
    _tokenIdCounter.increment();
  }

  function getCurrentTokenId() public view returns (uint256) {
    return _tokenIdCounter.current();
  }

  function getDudeName(uint256 _tokenId) public view returns (string memory) {
    // Dude info is public - chats are private
    return dudes[_tokenId].nickname;
  }

  function getDudesChat(uint256 _tokenId, uint256 _to)
    public
    view
    returns (EternalMessage[] memory)
  {
    require(
      _isApprovedOrOwner(msg.sender, _tokenId),
      "ERC721: Not owner nor approved"
    );
    require(souls[_to] == _tokenId, "These ArbiDudes aren't soulmates");
    require(
      dudes[_tokenId].blockedChat[_to] == 0 &&
        dudes[_to].blockedChat[_tokenId] == 0,
      "Chat is blocked"
    );

    return dudes[_tokenId].chats[_to];
  }

  function setPublicPrice(uint256 newPrice) public onlyOwner {
    price = newPrice;
  }

  function setChangeNamePrice(uint256 newPrice) public onlyOwner {
    changeNamePrice = newPrice;
  }

  function setChatPrice(uint256 newPrice) public onlyOwner {
    chatPrice = newPrice;
  }

  function setMaxGiveawayTokenId(uint256 _newMaxToken) public onlyOwner {
    maxGiveawayTokenId = _newMaxToken;
  }

  function setMaxSupply(uint256 _newMaxSupply) private {
    _maxSupply = _newMaxSupply;
  }

  function ownerWithdraw() external onlyOwner {
    payable(owner()).transfer(address(this).balance);
  }

  function pause() public onlyOwner {
    _pause();
  }

  function unpause() public onlyOwner {
    _unpause();
  }

  /**
   * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
   * in child contracts.
   */
  string private baseURI = "";

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

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

  // Souls
  function soulAssignment(uint256 tokenId) internal {
    if (souls[tokenId] == 0) {
      uint256 next = tokenId + 25;
      if (next > _maxSupply) {
        uint256 n = tokenId + 25 - _maxSupply;
        next = n + tokenId;
      }
      souls[tokenId] = next;
      souls[next] = tokenId;
    }
  }

  function getSoul(uint256 tokenId) public view returns (uint256) {
    return souls[tokenId];
  }

  // Mint
  modifier tokenMintable(uint256 tokenId) {
    require(tokenId > 0 && tokenId <= _maxSupply, "Token ID invalid");
    require(price <= msg.value, "Ether value sent is not correct");
    _;
  }

  // Only called internally
  function _internalMint(address to) internal {
    // minting logic
    uint256 tokenId = _tokenIdCounter.current();
    require(tokenId > 0 && tokenId <= _maxSupply, "Token ID invalid");
    _safeMint(to, tokenId);
    soulAssignment(tokenId);
    emit ArbiDudeCreated(tokenId, souls[tokenId]);
    _tokenIdCounter.increment();
  }

  // Normal mint
  function mint()
    public
    payable
    nonReentrant
    tokenMintable(_tokenIdCounter.current())
  {
    _internalMint(_msgSender());
  }

  function mintFree() public nonReentrant {
    require(mintedFree[msg.sender] != true, "Already minted for free");
    uint256 tokenId = _tokenIdCounter.current();
    require(tokenId <= maxGiveawayTokenId, "No more free Dudes at the moment");
    _internalMint(_msgSender());
    mintedFree[msg.sender] = true;
  }

  // Mint multiple units
  function mintMultiple(uint256 _num) public payable {
    address to = _msgSender();
    require(_num > 0, "The minimum is one dude");
    require(_num <= _maxMintAmount, "You can mint a max of 20 dudes");
    require(msg.value >= price * _num, "Ether sent is not enough");

    for (uint256 i; i < _num; i++) {
      _internalMint(to);
    }
  }

  // Allow the owner to claim any amount of NFTs and direct them to another address.
  function ownerClaimMultiple(uint256 amount, address to)
    public
    nonReentrant
    onlyOwner
  {
    require(amount > 0, "The minimum is one dude");
    for (uint256 i = 0; i < amount; i++) {
      _internalMint(to);
    }
  }

  // Name
  function changeName(uint256 _tokenId, string memory _name)
    external
    payable
    nonReentrant
  {
    require(msg.value >= changeNamePrice, "Eth sent is not enough");
    require(
      _isApprovedOrOwner(msg.sender, _tokenId),
      "ERC721: Not owner nor approved"
    );
    require(
      bytes(_name).length <= 20 && bytes(_name).length > 2,
      "Name between 3 and 20 characters"
    );
    dudes[_tokenId].nickname = _name;
    emit NameChanged(_tokenId, _name);
  }

  // Chat
  modifier canSendMessage(
    uint256 _from,
    uint256 _to,
    string memory _text
  ) {
    require(
      _isApprovedOrOwner(msg.sender, _from),
      "ERC721: Not owner nor approved"
    );
    require(souls[_from] == _to, "These Arbidudes aren't soulmates");
    require(
      bytes(_text).length <= 140 && bytes(_text).length > 2,
      "Text between 3 and 140 long"
    );
    _;
  }

  function sendMessage(
    uint256 _from,
    uint256 _to,
    string memory _text
  ) external payable nonReentrant canSendMessage(_from, _to, _text) {
    require(
      dudes[_from].blockedChat[_to] == 0 && dudes[_to].blockedChat[_from] == 0,
      "Chat is blocked"
    );
    Dude storage fromDude = dudes[_from];
    Dude storage toDude = dudes[_to];

    // Eternal message - stored in the blockchain
    if (
      fromDude.chats[_to].length == 0 || fromDude.chats[_to].length % 5 == 0
    ) {
      require(chatPrice <= msg.value, "Eth not enough to unlock chat");
    }
    EternalMessage memory eternalMessage = EternalMessage(
      _text,
      _from,
      block.timestamp
    );
    fromDude.chats[_to].push(eternalMessage);
    toDude.chats[_from].push(eternalMessage);
  }

  function deleteChat(uint256 _from, uint256 _to)
    external
    nonReentrant
    canSendMessage(_from, _to, "DELETE")
  {
    delete dudes[_from].chats[_to];
    delete dudes[_to].chats[_from];
  }

  function blockChat(
    uint256 _from,
    uint256 _to,
    uint256 _block
  ) external nonReentrant canSendMessage(_from, _to, "BLOCK") {
    dudes[_from].blockedChat[_to] = _block;
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
    super._beforeTokenTransfer(from, to, tokenId);
  }

  // The following functions are overrides required by Solidity.

  function supportsInterface(bytes4 interfaceId)
    public
    view
    override(ERC721, ERC721Enumerable)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }
}

File 2 of 16 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 3 of 16 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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 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 4 of 16 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../../utils/introspection/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 5 of 16 : IERC165.sol
// SPDX-License-Identifier: MIT

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 6 of 16 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 7 of 16 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 8 of 16 : Address.sol
// SPDX-License-Identifier: MIT

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 9 of 16 : Context.sol
// SPDX-License-Identifier: MIT

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 10 of 16 : Strings.sol
// SPDX-License-Identifier: MIT

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);
    }
}

File 11 of 16 : ERC165.sol
// SPDX-License-Identifier: MIT

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 12 of 16 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

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 13 of 16 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

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 14 of 16 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 15 of 16 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 16 of 16 : Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"},{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"soul","type":"uint256"}],"name":"ArbiDudeCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"blockChat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"changeNamePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chatPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"deleteChat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getDudeName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getDudesChat","outputs":[{"components":[{"internalType":"string","name":"message","type":"string"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct ArbiDudesGenOne.EternalMessage[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSoul","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiveawayTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_num","type":"uint256"}],"name":"mintMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedFree","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerClaimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"string","name":"_text","type":"string"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setChangeNamePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setChatPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxToken","type":"uint256"}],"name":"setMaxGiveawayTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec50000600c55662386f26fc10000600d556000600e55610226600f55612710601055601460115560405180602001604052806000815250601690805190602001906200005792919062000372565b503480156200006557600080fd5b506040516200671e3803806200671e83398181016040528101906200008b9190620004ab565b6040518060400160405280600f81526020017f41726269447564657347656e4f6e6500000000000000000000000000000000008152506040518060400160405280600481526020017f445544450000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010f92919062000372565b5080600190805190602001906200012892919062000372565b5050506000600a60006101000a81548160ff021916908315150217905550620001666200015a620001af60201b60201c565b620001b760201b60201c565b6001600b819055506200017f826200027d60201b60201c565b62000190816200032860201b60201c565b620001a760126200033260201b62002ae51760201c565b50506200071c565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028d620001af60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b36200034860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000303906200052c565b60405180910390fd5b80601690805190602001906200032492919062000372565b5050565b8060108190555050565b6001816000016000828254019250508190555050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200038090620005fe565b90600052602060002090601f016020900481019282620003a45760008555620003f0565b82601f10620003bf57805160ff1916838001178555620003f0565b82800160010185558215620003f0579182015b82811115620003ef578251825591602001919060010190620003d2565b5b509050620003ff919062000403565b5090565b5b808211156200041e57600081600090555060010162000404565b5090565b600062000439620004338462000577565b6200054e565b9050828152602081018484840111156200045257600080fd5b6200045f848285620005c8565b509392505050565b600082601f8301126200047957600080fd5b81516200048b84826020860162000422565b91505092915050565b600081519050620004a58162000702565b92915050565b60008060408385031215620004bf57600080fd5b600083015167ffffffffffffffff811115620004da57600080fd5b620004e88582860162000467565b9250506020620004fb8582860162000494565b9150509250929050565b600062000514602083620005ad565b91506200052182620006d9565b602082019050919050565b60006020820190508181036000830152620005478162000505565b9050919050565b60006200055a6200056d565b905062000568828262000634565b919050565b6000604051905090565b600067ffffffffffffffff82111562000595576200059462000699565b5b620005a082620006c8565b9050602081019050919050565b600082825260208201905092915050565b6000819050919050565b60005b83811015620005e8578082015181840152602081019050620005cb565b83811115620005f8576000848401525b50505050565b600060028204905060018216806200061757607f821691505b602082108114156200062e576200062d6200066a565b5b50919050565b6200063f82620006c8565b810181811067ffffffffffffffff8211171562000661576200066062000699565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200070d81620005be565b81146200071957600080fd5b50565b615ff2806200072c6000396000f3fe6080604052600436106102715760003560e01c806355f804b31161014f578063a22cb465116100c1578063cfef954f1161007a578063cfef954f146108db578063e985e9c514610904578063f069389914610941578063f2fde38b1461097e578063f3db2000146109a7578063ffda88d4146109d257610271565b8063a22cb465146107eb578063abbb5a5514610814578063b88d4fde14610830578063c39cbef114610859578063c627525514610875578063c87b56dd1461089e57610271565b8063715018a611610113578063715018a6146107255780638456cb591461073c5780638ab53447146107535780638da5cb5b1461076a57806395d89b4114610795578063a035b1fe146107c057610271565b806355f804b31461062c57806356189236146106555780635c975abb146106805780636352211e146106ab57806370a08231146106e857610271565b80632b6b2cfc116101e85780633f4ba83a116101ac5780633f4ba83a1461054657806342842e0e1461055d5780634311de8f1461058657806343752caa1461059d5780634f6ccce7146105c65780635300b4491461060357610271565b80632b6b2cfc1461045a5780632f745c591461049757806339561dba146104d45780633c7985c5146104f05780633f3272751461051b57610271565b80631249c58b1161023a5780631249c58b1461036d57806313a1288e1461037757806316360ee9146103a057806318160ddd146103c957806320984801146103f457806323b872dd1461043157610271565b8062bb788f1461027657806301ffc9a71461029f57806306fdde03146102dc578063081812fc14610307578063095ea7b314610344575b600080fd5b34801561028257600080fd5b5061029d600480360381019061029891906144c2565b610a0f565b005b3480156102ab57600080fd5b506102c660048036038101906102c1919061442f565b610a95565b6040516102d39190614df7565b60405180910390f35b3480156102e857600080fd5b506102f1610aa7565b6040516102fe9190614e12565b60405180910390f35b34801561031357600080fd5b5061032e600480360381019061032991906144c2565b610b39565b60405161033b9190614d6e565b60405180910390f35b34801561035057600080fd5b5061036b600480360381019061036691906143f3565b610bbe565b005b610375610cd6565b005b34801561038357600080fd5b5061039e600480360381019061039991906144c2565b610ddf565b005b3480156103ac57600080fd5b506103c760048036038101906103c2919061457b565b610e65565b005b3480156103d557600080fd5b506103de611050565b6040516103eb91906152b4565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190614288565b61105d565b6040516104289190614df7565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906142ed565b61107d565b005b34801561046657600080fd5b50610481600480360381019061047c919061457b565b6110dd565b60405161048e9190614dd5565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b991906143f3565b611345565b6040516104cb91906152b4565b60405180910390f35b6104ee60048036038101906104e991906145b7565b6113ea565b005b3480156104fc57600080fd5b506105056117a2565b60405161051291906152b4565b60405180910390f35b34801561052757600080fd5b506105306117a8565b60405161053d91906152b4565b60405180910390f35b34801561055257600080fd5b5061055b6117ae565b005b34801561056957600080fd5b50610584600480360381019061057f91906142ed565b611834565b005b34801561059257600080fd5b5061059b611854565b005b3480156105a957600080fd5b506105c460048036038101906105bf919061461e565b611920565b005b3480156105d257600080fd5b506105ed60048036038101906105e891906144c2565b611ad2565b6040516105fa91906152b4565b60405180910390f35b34801561060f57600080fd5b5061062a600480360381019061062591906144eb565b611b69565b005b34801561063857600080fd5b50610653600480360381019061064e9190614481565b611caa565b005b34801561066157600080fd5b5061066a611d40565b60405161067791906152b4565b60405180910390f35b34801561068c57600080fd5b50610695611d51565b6040516106a29190614df7565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd91906144c2565b611d68565b6040516106df9190614d6e565b60405180910390f35b3480156106f457600080fd5b5061070f600480360381019061070a9190614288565b611e1a565b60405161071c91906152b4565b60405180910390f35b34801561073157600080fd5b5061073a611ed2565b005b34801561074857600080fd5b50610751611f5a565b005b34801561075f57600080fd5b50610768611fe0565b005b34801561077657600080fd5b5061077f612188565b60405161078c9190614d6e565b60405180910390f35b3480156107a157600080fd5b506107aa6121b2565b6040516107b79190614e12565b60405180910390f35b3480156107cc57600080fd5b506107d5612244565b6040516107e291906152b4565b60405180910390f35b3480156107f757600080fd5b50610812600480360381019061080d91906143b7565b61224a565b005b61082e600480360381019061082991906144c2565b6123cb565b005b34801561083c57600080fd5b506108576004803603810190610852919061433c565b6124db565b005b610873600480360381019061086e9190614527565b61253d565b005b34801561088157600080fd5b5061089c600480360381019061089791906144c2565b6126db565b005b3480156108aa57600080fd5b506108c560048036038101906108c091906144c2565b612761565b6040516108d29190614e12565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd91906144c2565b612808565b005b34801561091057600080fd5b5061092b600480360381019061092691906142b1565b61288e565b6040516109389190614df7565b60405180910390f35b34801561094d57600080fd5b50610968600480360381019061096391906144c2565b612922565b60405161097591906152b4565b60405180910390f35b34801561098a57600080fd5b506109a560048036038101906109a09190614288565b61293f565b005b3480156109b357600080fd5b506109bc612a37565b6040516109c991906152b4565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906144c2565b612a3d565b604051610a069190614e12565b60405180910390f35b610a17612afb565b73ffffffffffffffffffffffffffffffffffffffff16610a35612188565b73ffffffffffffffffffffffffffffffffffffffff1614610a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a82906150f4565b60405180910390fd5b80600e8190555050565b6000610aa082612b03565b9050919050565b606060008054610ab6906155de565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae2906155de565b8015610b2f5780601f10610b0457610100808354040283529160200191610b2f565b820191906000526020600020905b815481529060010190602001808311610b1257829003601f168201915b5050505050905090565b6000610b4482612b7d565b610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a906150d4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bc982611d68565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c31906151d4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c59612afb565b73ffffffffffffffffffffffffffffffffffffffff161480610c885750610c8781610c82612afb565b61288e565b5b610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90615054565b60405180910390fd5b610cd18383612be9565b505050565b6002600b541415610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1390615294565b60405180910390fd5b6002600b81905550610d2e6012612ca2565b600081118015610d4057506010548111155b610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690615134565b60405180910390fd5b34600c541115610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90614fb4565b60405180910390fd5b610dd4610dcf612afb565b612cb0565b506001600b81905550565b610de7612afb565b73ffffffffffffffffffffffffffffffffffffffff16610e05612188565b73ffffffffffffffffffffffffffffffffffffffff1614610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e52906150f4565b60405180910390fd5b80600f8190555050565b6002600b541415610eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea290615294565b60405180910390fd5b6002600b8190555081816040518060400160405280600681526020017f44454c4554450000000000000000000000000000000000000000000000000000815250610ef53384612d71565b610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b90615214565b60405180910390fd5b81601460008581526020019081526020016000205414610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090615254565b60405180910390fd5b608c815111158015610f9c575060028151115b610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290614e54565b60405180910390fd5b601360008681526020019081526020016000206001016000858152602001908152602001600020600061100e9190614011565b60136000858152602001908152602001600020600101600086815260200190815260200160002060006110419190614011565b5050506001600b819055505050565b6000600880549050905090565b60156020528060005260406000206000915054906101000a900460ff1681565b61108e611088612afb565b82612d71565b6110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c4906151f4565b60405180910390fd5b6110d8838383612e4f565b505050565b60606110e93384612d71565b611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111f90615214565b60405180910390fd5b8260146000848152602001908152602001600020541461117d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117490615234565b60405180910390fd5b6000601360008581526020019081526020016000206002016000848152602001908152602001600020541480156111db5750600060136000848152602001908152602001600020600201600085815260200190815260200160002054145b61121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190614e74565b60405180910390fd5b601360008481526020019081526020016000206001016000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156113395783829060005260206000209060030201604051806060016040529081600082018054611294906155de565b80601f01602080910402602001604051908101604052809291908181526020018280546112c0906155de565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b505050505081526020016001820154815260200160028201548152505081526020019060010190611261565b50505050905092915050565b600061135083611e1a565b8210611391576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138890614eb4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600b541415611430576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142790615294565b60405180910390fd5b6002600b819055508282826114453384612d71565b611484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147b90615214565b60405180910390fd5b816014600085815260200190815260200160002054146114d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d090615254565b60405180910390fd5b608c8151111580156114ec575060028151115b61152b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152290614e54565b60405180910390fd5b6000601360008881526020019081526020016000206002016000878152602001908152602001600020541480156115895750600060136000878152602001908152602001600020600201600088815260200190815260200160002054145b6115c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bf90614e74565b60405180910390fd5b6000601360008881526020019081526020016000209050600060136000888152602001908152602001600020905060008260010160008981526020019081526020016000208054905014806116415750600060058360010160008a81526020019081526020016000208054905061163f919061568a565b145b1561168c5734600e54111561168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290614fd4565b60405180910390fd5b5b600060405180606001604052808881526020018a81526020014281525090508260010160008981526020019081526020016000208190806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000019080519060200190611706929190614035565b50602082015181600101556040820151816002015550508160010160008a81526020019081526020016000208190806001815401808255809150506001900390600052602060002090600302016000909190919091506000820151816000019080519060200190611778929190614035565b50602082015181600101556040820151816002015550505050505050506001600b81905550505050565b600f5481565b600d5481565b6117b6612afb565b73ffffffffffffffffffffffffffffffffffffffff166117d4612188565b73ffffffffffffffffffffffffffffffffffffffff161461182a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611821906150f4565b60405180910390fd5b6118326130ab565b565b61184f838383604051806020016040528060008152506124db565b505050565b61185c612afb565b73ffffffffffffffffffffffffffffffffffffffff1661187a612188565b73ffffffffffffffffffffffffffffffffffffffff16146118d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c7906150f4565b60405180910390fd5b6118d8612188565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561191d573d6000803e3d6000fd5b50565b6002600b541415611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90615294565b60405180910390fd5b6002600b8190555082826040518060400160405280600581526020017f424c4f434b0000000000000000000000000000000000000000000000000000008152506119b03384612d71565b6119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e690615214565b60405180910390fd5b81601460008581526020019081526020016000205414611a44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3b90615254565b60405180910390fd5b608c815111158015611a57575060028151115b611a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8d90614e54565b60405180910390fd5b83601360008881526020019081526020016000206002016000878152602001908152602001600020819055505050506001600b81905550505050565b6000611adc611050565b8210611b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1490615274565b60405180910390fd5b60088281548110611b57577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6002600b541415611baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba690615294565b60405180910390fd5b6002600b81905550611bbf612afb565b73ffffffffffffffffffffffffffffffffffffffff16611bdd612188565b73ffffffffffffffffffffffffffffffffffffffff1614611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a906150f4565b60405180910390fd5b60008211611c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6d90615114565b60405180910390fd5b60005b82811015611c9d57611c8a82612cb0565b8080611c9590615641565b915050611c79565b506001600b819055505050565b611cb2612afb565b73ffffffffffffffffffffffffffffffffffffffff16611cd0612188565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906150f4565b60405180910390fd5b8060169080519060200190611d3c929190614035565b5050565b6000611d4c6012612ca2565b905090565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890615094565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8290615074565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611eda612afb565b73ffffffffffffffffffffffffffffffffffffffff16611ef8612188565b73ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f45906150f4565b60405180910390fd5b611f58600061314d565b565b611f62612afb565b73ffffffffffffffffffffffffffffffffffffffff16611f80612188565b73ffffffffffffffffffffffffffffffffffffffff1614611fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcd906150f4565b60405180910390fd5b611fde613213565b565b6002600b541415612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d90615294565b60405180910390fd5b6002600b8190555060011515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156120c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b990615194565b60405180910390fd5b60006120ce6012612ca2565b9050600f54811115612115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210c90614ff4565b60405180910390fd5b612125612120612afb565b612cb0565b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550506001600b81905550565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546121c1906155de565b80601f01602080910402602001604051908101604052809291908181526020018280546121ed906155de565b801561223a5780601f1061220f5761010080835404028352916020019161223a565b820191906000526020600020905b81548152906001019060200180831161221d57829003601f168201915b5050505050905090565b600c5481565b612252612afb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614f74565b60405180910390fd5b80600560006122cd612afb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661237a612afb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123bf9190614df7565b60405180910390a35050565b60006123d5612afb565b90506000821161241a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241190615114565b60405180910390fd5b60115482111561245f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245690614e34565b60405180910390fd5b81600c5461246d919061549a565b3410156124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690614f14565b60405180910390fd5b60005b828110156124d6576124c382612cb0565b80806124ce90615641565b9150506124b2565b505050565b6124ec6124e6612afb565b83612d71565b61252b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612522906151f4565b60405180910390fd5b612537848484846132b6565b50505050565b6002600b541415612583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257a90615294565b60405180910390fd5b6002600b81905550600d543410156125d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c7906151b4565b60405180910390fd5b6125da3383612d71565b612619576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261090615214565b60405180910390fd5b601481511115801561262c575060028151115b61266b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266290614f94565b60405180910390fd5b80601360008481526020019081526020016000206000019080519060200190612695929190614035565b507f8edfa912e70e283a8ef6d6f52cd1faef9690ff989eff2f11a134e8478ba7b28b82826040516126c79291906152cf565b60405180910390a16001600b819055505050565b6126e3612afb565b73ffffffffffffffffffffffffffffffffffffffff16612701612188565b73ffffffffffffffffffffffffffffffffffffffff1614612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e906150f4565b60405180910390fd5b80600c8190555050565b606061276c82612b7d565b6127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a290615174565b60405180910390fd5b60006127b5613312565b905060008151116127d55760405180602001604052806000815250612800565b806127df846133a4565b6040516020016127f0929190614d4a565b6040516020818303038152906040525b915050919050565b612810612afb565b73ffffffffffffffffffffffffffffffffffffffff1661282e612188565b73ffffffffffffffffffffffffffffffffffffffff1614612884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287b906150f4565b60405180910390fd5b80600d8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060146000838152602001908152602001600020549050919050565b612947612afb565b73ffffffffffffffffffffffffffffffffffffffff16612965612188565b73ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b2906150f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2290614ef4565b60405180910390fd5b612a348161314d565b50565b600e5481565b6060601360008381526020019081526020016000206000018054612a60906155de565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8c906155de565b8015612ad95780601f10612aae57610100808354040283529160200191612ad9565b820191906000526020600020905b815481529060010190602001808311612abc57829003601f168201915b50505050509050919050565b6001816000016000828254019250508190555050565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b765750612b7582613551565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c5c83611d68565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612cbc6012612ca2565b9050600081118015612cd057506010548111155b612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0690615134565b60405180910390fd5b612d198282613633565b612d2281613651565b6014600082815260200190815260200160002054817fe87cb31528ee5a98f369533738f48dbb4978f76a210dc496b6ddc0f19a51ca7960405160405180910390a3612d6d6012612ae5565b5050565b6000612d7c82612b7d565b612dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db290615014565b60405180910390fd5b6000612dc683611d68565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3557508373ffffffffffffffffffffffffffffffffffffffff16612e1d84610b39565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e465750612e45818561288e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e6f82611d68565b73ffffffffffffffffffffffffffffffffffffffff1614612ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebc90615154565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2c90614f54565b60405180910390fd5b612f408383836136eb565b612f4b600082612be9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f9b91906154f4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ff29190615413565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6130b3611d51565b6130f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e990614e94565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa613136612afb565b6040516131439190614d6e565b60405180910390a1565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61321b611d51565b1561325b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325290615034565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861329f612afb565b6040516132ac9190614d6e565b60405180910390a1565b6132c1848484612e4f565b6132cd84848484613743565b61330c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330390614ed4565b60405180910390fd5b50505050565b606060168054613321906155de565b80601f016020809104026020016040519081016040528092919081815260200182805461334d906155de565b801561339a5780601f1061336f5761010080835404028352916020019161339a565b820191906000526020600020905b81548152906001019060200180831161337d57829003601f168201915b5050505050905090565b606060008214156133ec576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061354c565b600082905060005b6000821461341e57808061340790615641565b915050600a826134179190615469565b91506133f4565b60008167ffffffffffffffff811115613460577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156134925781602001600182028036833780820191505090505b5090505b60008514613545576001826134ab91906154f4565b9150600a856134ba919061568a565b60306134c69190615413565b60f81b818381518110613502577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561353e9190615469565b9450613496565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061361c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061362c575061362b826138da565b5b9050919050565b61364d828260405180602001604052806000815250613944565b5050565b6000601460008381526020019081526020016000205414156136e857600060198261367c9190615413565b90506010548111156136b657600060105460198461369a9190615413565b6136a491906154f4565b905082816136b29190615413565b9150505b806014600084815260200190815260200160002081905550816014600083815260200190815260200160002081905550505b50565b6136f3611d51565b15613733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372a90615034565b60405180910390fd5b61373e83838361399f565b505050565b60006137648473ffffffffffffffffffffffffffffffffffffffff16613ab3565b156138cd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261378d612afb565b8786866040518563ffffffff1660e01b81526004016137af9493929190614d89565b602060405180830381600087803b1580156137c957600080fd5b505af19250505080156137fa57506040513d601f19601f820116820180604052508101906137f79190614458565b60015b61387d573d806000811461382a576040519150601f19603f3d011682016040523d82523d6000602084013e61382f565b606091505b50600081511415613875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161386c90614ed4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138d2565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61394e8383613ac6565b61395b6000848484613743565b61399a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399190614ed4565b60405180910390fd5b505050565b6139aa838383613c94565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156139ed576139e881613c99565b613a2c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613a2b57613a2a8382613ce2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a6f57613a6a81613e4f565b613aae565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613aad57613aac8282613f92565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b2d906150b4565b60405180910390fd5b613b3f81612b7d565b15613b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7690614f34565b60405180910390fd5b613b8b600083836136eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bdb9190615413565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613cef84611e1a565b613cf991906154f4565b9050600060076000848152602001908152602001600020549050818114613dde576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e6391906154f4565b9050600060096000848152602001908152602001600020549050600060088381548110613eb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613f9d83611e1a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054600082556003029060005260206000209081019061403291906140bb565b50565b828054614041906155de565b90600052602060002090601f01602090048101928261406357600085556140aa565b82601f1061407c57805160ff19168380011785556140aa565b828001600101855582156140aa579182015b828111156140a957825182559160200191906001019061408e565b5b5090506140b791906140f2565b5090565b5b808211156140ee57600080820160006140d5919061410f565b60018201600090556002820160009055506003016140bc565b5090565b5b8082111561410b5760008160009055506001016140f3565b5090565b50805461411b906155de565b6000825580601f1061412d575061414c565b601f01602090049060005260206000209081019061414b91906140f2565b5b50565b600061416261415d84615324565b6152ff565b90508281526020810184848401111561417a57600080fd5b61418584828561559c565b509392505050565b60006141a061419b84615355565b6152ff565b9050828152602081018484840111156141b857600080fd5b6141c384828561559c565b509392505050565b6000813590506141da81615f60565b92915050565b6000813590506141ef81615f77565b92915050565b60008135905061420481615f8e565b92915050565b60008151905061421981615f8e565b92915050565b600082601f83011261423057600080fd5b813561424084826020860161414f565b91505092915050565b600082601f83011261425a57600080fd5b813561426a84826020860161418d565b91505092915050565b60008135905061428281615fa5565b92915050565b60006020828403121561429a57600080fd5b60006142a8848285016141cb565b91505092915050565b600080604083850312156142c457600080fd5b60006142d2858286016141cb565b92505060206142e3858286016141cb565b9150509250929050565b60008060006060848603121561430257600080fd5b6000614310868287016141cb565b9350506020614321868287016141cb565b925050604061433286828701614273565b9150509250925092565b6000806000806080858703121561435257600080fd5b6000614360878288016141cb565b9450506020614371878288016141cb565b935050604061438287828801614273565b925050606085013567ffffffffffffffff81111561439f57600080fd5b6143ab8782880161421f565b91505092959194509250565b600080604083850312156143ca57600080fd5b60006143d8858286016141cb565b92505060206143e9858286016141e0565b9150509250929050565b6000806040838503121561440657600080fd5b6000614414858286016141cb565b925050602061442585828601614273565b9150509250929050565b60006020828403121561444157600080fd5b600061444f848285016141f5565b91505092915050565b60006020828403121561446a57600080fd5b60006144788482850161420a565b91505092915050565b60006020828403121561449357600080fd5b600082013567ffffffffffffffff8111156144ad57600080fd5b6144b984828501614249565b91505092915050565b6000602082840312156144d457600080fd5b60006144e284828501614273565b91505092915050565b600080604083850312156144fe57600080fd5b600061450c85828601614273565b925050602061451d858286016141cb565b9150509250929050565b6000806040838503121561453a57600080fd5b600061454885828601614273565b925050602083013567ffffffffffffffff81111561456557600080fd5b61457185828601614249565b9150509250929050565b6000806040838503121561458e57600080fd5b600061459c85828601614273565b92505060206145ad85828601614273565b9150509250929050565b6000806000606084860312156145cc57600080fd5b60006145da86828701614273565b93505060206145eb86828701614273565b925050604084013567ffffffffffffffff81111561460857600080fd5b61461486828701614249565b9150509250925092565b60008060006060848603121561463357600080fd5b600061464186828701614273565b935050602061465286828701614273565b925050604061466386828701614273565b9150509250925092565b60006146798383614cdc565b905092915050565b61468a81615528565b82525050565b600061469b82615396565b6146a581856153c4565b9350836020820285016146b785615386565b8060005b858110156146f357848403895281516146d4858261466d565b94506146df836153b7565b925060208a019950506001810190506146bb565b50829750879550505050505092915050565b61470e8161553a565b82525050565b600061471f826153a1565b61472981856153d5565b93506147398185602086016155ab565b61474281615777565b840191505092915050565b6000614758826153ac565b61476281856153e6565b93506147728185602086016155ab565b61477b81615777565b840191505092915050565b6000614791826153ac565b61479b81856153f7565b93506147ab8185602086016155ab565b6147b481615777565b840191505092915050565b60006147ca826153ac565b6147d48185615408565b93506147e48185602086016155ab565b80840191505092915050565b60006147fd601e836153f7565b915061480882615788565b602082019050919050565b6000614820601b836153f7565b915061482b826157b1565b602082019050919050565b6000614843600f836153f7565b915061484e826157da565b602082019050919050565b60006148666014836153f7565b915061487182615803565b602082019050919050565b6000614889602b836153f7565b91506148948261582c565b604082019050919050565b60006148ac6032836153f7565b91506148b78261587b565b604082019050919050565b60006148cf6026836153f7565b91506148da826158ca565b604082019050919050565b60006148f26018836153f7565b91506148fd82615919565b602082019050919050565b6000614915601c836153f7565b915061492082615942565b602082019050919050565b60006149386024836153f7565b91506149438261596b565b604082019050919050565b600061495b6019836153f7565b9150614966826159ba565b602082019050919050565b600061497e6020836153f7565b9150614989826159e3565b602082019050919050565b60006149a1601f836153f7565b91506149ac82615a0c565b602082019050919050565b60006149c4601d836153f7565b91506149cf82615a35565b602082019050919050565b60006149e76020836153f7565b91506149f282615a5e565b602082019050919050565b6000614a0a602c836153f7565b9150614a1582615a87565b604082019050919050565b6000614a2d6010836153f7565b9150614a3882615ad6565b602082019050919050565b6000614a506038836153f7565b9150614a5b82615aff565b604082019050919050565b6000614a73602a836153f7565b9150614a7e82615b4e565b604082019050919050565b6000614a966029836153f7565b9150614aa182615b9d565b604082019050919050565b6000614ab96020836153f7565b9150614ac482615bec565b602082019050919050565b6000614adc602c836153f7565b9150614ae782615c15565b604082019050919050565b6000614aff6020836153f7565b9150614b0a82615c64565b602082019050919050565b6000614b226017836153f7565b9150614b2d82615c8d565b602082019050919050565b6000614b456010836153f7565b9150614b5082615cb6565b602082019050919050565b6000614b686029836153f7565b9150614b7382615cdf565b604082019050919050565b6000614b8b602f836153f7565b9150614b9682615d2e565b604082019050919050565b6000614bae6017836153f7565b9150614bb982615d7d565b602082019050919050565b6000614bd16016836153f7565b9150614bdc82615da6565b602082019050919050565b6000614bf46021836153f7565b9150614bff82615dcf565b604082019050919050565b6000614c176031836153f7565b9150614c2282615e1e565b604082019050919050565b6000614c3a601e836153f7565b9150614c4582615e6d565b602082019050919050565b6000614c5d6020836153f7565b9150614c6882615e96565b602082019050919050565b6000614c806020836153f7565b9150614c8b82615ebf565b602082019050919050565b6000614ca3602c836153f7565b9150614cae82615ee8565b604082019050919050565b6000614cc6601f836153f7565b9150614cd182615f37565b602082019050919050565b60006060830160008301518482036000860152614cf9828261474d565b9150506020830151614d0e6020860182614d2c565b506040830151614d216040860182614d2c565b508091505092915050565b614d3581615592565b82525050565b614d4481615592565b82525050565b6000614d5682856147bf565b9150614d6282846147bf565b91508190509392505050565b6000602082019050614d836000830184614681565b92915050565b6000608082019050614d9e6000830187614681565b614dab6020830186614681565b614db86040830185614d3b565b8181036060830152614dca8184614714565b905095945050505050565b60006020820190508181036000830152614def8184614690565b905092915050565b6000602082019050614e0c6000830184614705565b92915050565b60006020820190508181036000830152614e2c8184614786565b905092915050565b60006020820190508181036000830152614e4d816147f0565b9050919050565b60006020820190508181036000830152614e6d81614813565b9050919050565b60006020820190508181036000830152614e8d81614836565b9050919050565b60006020820190508181036000830152614ead81614859565b9050919050565b60006020820190508181036000830152614ecd8161487c565b9050919050565b60006020820190508181036000830152614eed8161489f565b9050919050565b60006020820190508181036000830152614f0d816148c2565b9050919050565b60006020820190508181036000830152614f2d816148e5565b9050919050565b60006020820190508181036000830152614f4d81614908565b9050919050565b60006020820190508181036000830152614f6d8161492b565b9050919050565b60006020820190508181036000830152614f8d8161494e565b9050919050565b60006020820190508181036000830152614fad81614971565b9050919050565b60006020820190508181036000830152614fcd81614994565b9050919050565b60006020820190508181036000830152614fed816149b7565b9050919050565b6000602082019050818103600083015261500d816149da565b9050919050565b6000602082019050818103600083015261502d816149fd565b9050919050565b6000602082019050818103600083015261504d81614a20565b9050919050565b6000602082019050818103600083015261506d81614a43565b9050919050565b6000602082019050818103600083015261508d81614a66565b9050919050565b600060208201905081810360008301526150ad81614a89565b9050919050565b600060208201905081810360008301526150cd81614aac565b9050919050565b600060208201905081810360008301526150ed81614acf565b9050919050565b6000602082019050818103600083015261510d81614af2565b9050919050565b6000602082019050818103600083015261512d81614b15565b9050919050565b6000602082019050818103600083015261514d81614b38565b9050919050565b6000602082019050818103600083015261516d81614b5b565b9050919050565b6000602082019050818103600083015261518d81614b7e565b9050919050565b600060208201905081810360008301526151ad81614ba1565b9050919050565b600060208201905081810360008301526151cd81614bc4565b9050919050565b600060208201905081810360008301526151ed81614be7565b9050919050565b6000602082019050818103600083015261520d81614c0a565b9050919050565b6000602082019050818103600083015261522d81614c2d565b9050919050565b6000602082019050818103600083015261524d81614c50565b9050919050565b6000602082019050818103600083015261526d81614c73565b9050919050565b6000602082019050818103600083015261528d81614c96565b9050919050565b600060208201905081810360008301526152ad81614cb9565b9050919050565b60006020820190506152c96000830184614d3b565b92915050565b60006040820190506152e46000830185614d3b565b81810360208301526152f68184614786565b90509392505050565b600061530961531a565b90506153158282615610565b919050565b6000604051905090565b600067ffffffffffffffff82111561533f5761533e615748565b5b61534882615777565b9050602081019050919050565b600067ffffffffffffffff8211156153705761536f615748565b5b61537982615777565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061541e82615592565b915061542983615592565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561545e5761545d6156bb565b5b828201905092915050565b600061547482615592565b915061547f83615592565b92508261548f5761548e6156ea565b5b828204905092915050565b60006154a582615592565b91506154b083615592565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154e9576154e86156bb565b5b828202905092915050565b60006154ff82615592565b915061550a83615592565b92508282101561551d5761551c6156bb565b5b828203905092915050565b600061553382615572565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156155c95780820151818401526020810190506155ae565b838111156155d8576000848401525b50505050565b600060028204905060018216806155f657607f821691505b6020821081141561560a57615609615719565b5b50919050565b61561982615777565b810181811067ffffffffffffffff8211171561563857615637615748565b5b80604052505050565b600061564c82615592565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561567f5761567e6156bb565b5b600182019050919050565b600061569582615592565b91506156a083615592565b9250826156b0576156af6156ea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f596f752063616e206d696e742061206d6178206f662032302064756465730000600082015250565b7f54657874206265747765656e203320616e6420313430206c6f6e670000000000600082015250565b7f4368617420697320626c6f636b65640000000000000000000000000000000000600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420656e6f7567680000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e616d65206265747765656e203320616e642032302063686172616374657273600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f457468206e6f7420656e6f75676820746f20756e6c6f636b2063686174000000600082015250565b7f4e6f206d6f7265206672656520447564657320617420746865206d6f6d656e74600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546865206d696e696d756d206973206f6e652064756465000000000000000000600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c7265616479206d696e74656420666f722066726565000000000000000000600082015250565b7f4574682073656e74206973206e6f7420656e6f75676800000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4552433732313a204e6f74206f776e6572206e6f7220617070726f7665640000600082015250565b7f546865736520417262694475646573206172656e277420736f756c6d61746573600082015250565b7f546865736520417262696475646573206172656e277420736f756c6d61746573600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b615f6981615528565b8114615f7457600080fd5b50565b615f808161553a565b8114615f8b57600080fd5b50565b615f9781615546565b8114615fa257600080fd5b50565b615fae81615592565b8114615fb957600080fd5b5056fea2646970667358221220b6d076072b88651c9d80e1b0efc059b6a67742c479977583eacd7f5bbf6d348564736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7777772e6172626964756465732e78797a2f6170692f647564652f0000000000000000000000000000000000000000000000000000000000

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7777772e6172626964756465732e78797a2f6170692f647564652f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : newBaseURI (string): https://www.arbidudes.xyz/api/dude/
Arg [1] : newMaxSupply (uint256): 10000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [3] : 68747470733a2f2f7777772e6172626964756465732e78797a2f6170692f6475
Arg [4] : 64652f0000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

1811:7769:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4002:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9397:181;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2414:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3925:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3463:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5881:141:0;;;:::i;:::-;;4094:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8732:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1535:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2752:42:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4789:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3328:476:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1211:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7940:788:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2107:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2009:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4470:57;;;;;;;;;;;;;:::i;:::-;;5185:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4306:103:0;;;;;;;;;;;;;:::i;:::-;;8934:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1718:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6803:231:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4784:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3054:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1041:84:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2117:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1855:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1605:92:1;;;;;;;;;;;;;:::i;:::-;;4413:53:0;;;;;;;;;;;;;:::i;:::-;;6026:314;;;;;;;;;;;;;:::i;:::-;;973:85:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2576:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1954:40:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4209:290:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6369:345:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5430:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7048:482:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3808:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2744:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3898:100:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4565:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5196:96:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1846:189:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2075:28:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3160:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4002:88;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4077:8:0::1;4065:9;:20;;;;4002:88:::0;:::o;9397:181::-;9516:4;9537:36;9561:11;9537:23;:36::i;:::-;9530:43;;9397:181;;;:::o;2414:98:4:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;4028:16;4036:7;4028;:16::i;:::-;4020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4111:15;:24;4127:7;4111:24;;;;;;;;;;;;;;;;;;;;;4104:31;;3925:217;;;:::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;3600:11;;:2;:11;;;;3592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3697:5;3681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3706:37;3723:5;3730:12;:10;:12::i;:::-;3706:16;:37::i;:::-;3681:62;3660:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3463:401;;;:::o;5881:141:0:-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;5955:25:0::1;:15;:23;:25::i;:::-;5370:1;5360:7;:11;:36;;;;;5386:10;;5375:7;:21;;5360:36;5352:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5440:9;5431:5;;:18;;5423:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5990:27:::2;6004:12;:10;:12::i;:::-;5990:13;:27::i;:::-;2418:1:3::1;1637::::0;2562:7;:22;;;;5881:141:0:o;4094:114::-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4191:12:0::1;4170:18;:33;;;;4094:114:::0;:::o;8732:198::-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;8829:5:0::1;8836:3;7544:392;;;;;;;;;;;;;;;;::::0;7654:37:::1;7673:10;7685:5;7654:18;:37::i;:::-;7639:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;7767:3;7751:5;:12;7757:5;7751:12;;;;;;;;;;;;:19;7743:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7851:3;7834:5;7828:19;:26;;:53;;;;;7880:1;7864:5;7858:19;:23;7828:53;7813:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;8866:5:::2;:12;8872:5;8866:12;;;;;;;;;;;:18;;:23;8885:3;8866:23;;;;;;;;;;;;8859:30;;;;:::i;:::-;8902:5;:10;8908:3;8902:10;;;;;;;;;;;:16;;:23;8919:5;8902:23;;;;;;;;;;;;8895:30;;;;:::i;:::-;2418:1:3::1;;;1637::::0;2562:7;:22;;;;8732:198:0;;:::o;1535:111:7:-;1596:7;1622:10;:17;;;;1615:24;;1535:111;:::o;2752:42:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;4789:330:4:-;4978:41;4997:12;:10;:12::i;:::-;5011:7;4978:18;:41::i;:::-;4970:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;:::-;4789:330;;;:::o;3328:476:0:-;3414:23;3462:40;3481:10;3493:8;3462:18;:40::i;:::-;3447:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;3576:8;3562:5;:10;3568:3;3562:10;;;;;;;;;;;;:22;3554:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3678:1;3642:5;:15;3648:8;3642:15;;;;;;;;;;;:27;;:32;3670:3;3642:32;;;;;;;;;;;;:37;:86;;;;;3727:1;3691:5;:10;3697:3;3691:10;;;;;;;;;;;:22;;:32;3714:8;3691:32;;;;;;;;;;;;:37;3642:86;3627:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;3773:5;:15;3779:8;3773:15;;;;;;;;;;;:21;;:26;3795:3;3773:26;;;;;;;;;;;3766:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3328:476;;;;:::o;1211:253:7:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1431:12;:19;1444:5;1431:19;;;;;;;;;;;;;;;:26;1451:5;1431:26;;;;;;;;;;;;1424:33;;1211:253;;;;:::o;7940:788:0:-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;8071:5:0::1;8078:3;8083:5;7654:37;7673:10;7685:5;7654:18;:37::i;:::-;7639:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;7767:3;7751:5;:12;7757:5;7751:12;;;;;;;;;;;;:19;7743:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7851:3;7834:5;7828:19;:26;;:53;;;;;7880:1;7864:5;7858:19;:23;7828:53;7813:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;8144:1:::2;8111:5;:12;8117:5;8111:12;;;;;;;;;;;:24;;:29;8136:3;8111:29;;;;;;;;;;;;:34;:72;;;;;8182:1;8149:5;:10;8155:3;8149:10;;;;;;;;;;;:22;;:29;8172:5;8149:29;;;;;;;;;;;;:34;8111:72;8096:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;8220:21;8244:5;:12;8250:5;8244:12;;;;;;;;;;;8220:36;;8262:19;8284:5;:10;8290:3;8284:10;;;;;;;;;;;8262:32;;8392:1;8362:8;:14;;:19;8377:3;8362:19;;;;;;;;;;;:26;;;;:31;:70;;;;8431:1;8426;8397:8;:14;;:19;8412:3;8397:19;;;;;;;;;;;:26;;;;:30;;;;:::i;:::-;:35;8362:70;8351:167;;;8468:9;8455;;:22;;8447:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;8351:167;8523:36;8562:69;;;;;;;;8584:5;8562:69;;;;8597:5;8562:69;;;;8610:15;8562:69;;::::0;8523:108:::2;;8637:8;:14;;:19;8652:3;8637:19;;;;;;;;;;;8662:14;8637:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;8683:6;:12;;:19;8696:5;8683:19;;;;;;;;;;;8708:14;8683:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;7930:1;;;2418::3::1;;;1637::::0;2562:7;:22;;;;7940:788:0;;;:::o;2107:39::-;;;;:::o;2009:50::-;;;;:::o;4470:57::-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4512:10:0::1;:8;:10::i;:::-;4470:57::o:0;5185:179:4:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;:::-;5185:179;;;:::o;4306:103:0:-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4364:7:0::1;:5;:7::i;:::-;4356:25;;:48;4382:21;4356:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4306:103::o:0;8934:186::-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;9050:5:0::1;9057:3;7544:392;;;;;;;;;;;;;;;;::::0;7654:37:::1;7673:10;7685:5;7654:18;:37::i;:::-;7639:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;7767:3;7751:5;:12;7757:5;7751:12;;;;;;;;;;;;:19;7743:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7851:3;7834:5;7828:19;:26;;:53;;;;;7880:1;7864:5;7858:19;:23;7828:53;7813:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;9109:6:::2;9077:5;:12;9083:5;9077:12;;;;;;;;;;;:24;;:29;9102:3;9077:29;;;;;;;;;;;:38;;;;2418:1:3::1;;;1637::::0;2562:7;:22;;;;8934:186:0;;;:::o;1718:230:7:-;1793:7;1828:30;:28;:30::i;:::-;1820:5;:38;1812:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1924:10;1935:5;1924:17;;;;;;;;;;;;;;;;;;;;;;;;1917:24;;1718:230;;;:::o;6803:231:0:-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;1196:12:1::1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6926:1:0::2;6917:6;:10;6909:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6966:9;6961:69;6985:6;6981:1;:10;6961:69;;;7006:17;7020:2;7006:13;:17::i;:::-;6993:3;;;;;:::i;:::-;;;;6961:69;;;;1637:1:3::0;2562:7;:22;;;;6803:231:0;;:::o;4784:94::-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4863:10:0::1;4853:7;:20;;;;;;;;;;;;:::i;:::-;;4784:94:::0;:::o;3054:102::-;3104:7;3126:25;:15;:23;:25::i;:::-;3119:32;;3054:102;:::o;1041:84:2:-;1088:4;1111:7;;;;;;;;;;;1104:14;;1041:84;:::o;2117:235:4:-;2189:7;2208:13;2224:7;:16;2232:7;2224:16;;;;;;;;;;;;;;;;;;;;;2208:32;;2275:1;2258:19;;:5;:19;;;;2250:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2340:5;2333:12;;;2117:235;;;:::o;1855:205::-;1927:7;1971:1;1954:19;;:5;:19;;;;1946:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2037:9;:16;2047:5;2037:16;;;;;;;;;;;;;;;;2030:23;;1855:205;;;:::o;1605:92:1:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;4413:53:0:-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4453:8:0::1;:6;:8::i;:::-;4413:53::o:0;6026:314::-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;6106:4:0::1;6080:30;;:10;:22;6091:10;6080:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;6072:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6144:15;6162:25;:15;:23;:25::i;:::-;6144:43;;6212:18;;6201:7;:29;;6193:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;6273:27;6287:12;:10;:12::i;:::-;6273:13;:27::i;:::-;6331:4;6306:10;:22;6317:10;6306:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;2418:1:3;1637::::0;2562:7;:22;;;;6026:314:0:o;973:85:1:-;1019:7;1045:6;;;;;;;;;;;1038:13;;973:85;:::o;2576:102:4:-;2632:13;2664:7;2657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:102;:::o;1954:40:0:-;;;;:::o;4209:290:4:-;4323:12;:10;:12::i;:::-;4311:24;;:8;:24;;;;4303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4421:8;4376:18;:32;4395:12;:10;:12::i;:::-;4376:32;;;;;;;;;;;;;;;:42;4409:8;4376:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4473:8;4444:48;;4459:12;:10;:12::i;:::-;4444:48;;;4483:8;4444:48;;;;;;:::i;:::-;;;;;;;;4209:290;;:::o;6369:345:0:-;6426:10;6439:12;:10;:12::i;:::-;6426:25;;6472:1;6465:4;:8;6457:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;6523:14;;6515:4;:22;;6507:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;6607:4;6599:5;;:12;;;;:::i;:::-;6586:9;:25;;6578:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;6652:9;6647:63;6667:4;6663:1;:8;6647:63;;;6686:17;6700:2;6686:13;:17::i;:::-;6673:3;;;;;:::i;:::-;;;;6647:63;;;;6369:345;;:::o;5430:320:4:-;5599:41;5618:12;:10;:12::i;:::-;5632:7;5599:18;:41::i;:::-;5591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;7048:482:0:-;1680:1:3;2259:7;;:19;;2251:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1680:1;2389:7;:18;;;;7178:15:0::1;;7165:9;:28;;7157:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7241:40;7260:10;7272:8;7241:18;:40::i;:::-;7226:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;7371:2;7354:5;7348:19;:25;;:52;;;;;7399:1;7383:5;7377:19;:23;7348:52;7333:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;7481:5;7454;:15;7460:8;7454:15;;;;;;;;;;;:24;;:32;;;;;;;;;;;;:::i;:::-;;7497:28;7509:8;7519:5;7497:28;;;;;;;:::i;:::-;;;;;;;;1637:1:3::0;2562:7;:22;;;;7048:482:0;;:::o;3808:86::-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3881:8:0::1;3873:5;:16;;;;3808:86:::0;:::o;2744:329:4:-;2817:13;2850:16;2858:7;2850;:16::i;:::-;2842:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2929:21;2953:10;:8;:10::i;:::-;2929:34;;3004:1;2986:7;2980:21;:25;:86;;;;;;;;;;;;;;;;;3032:7;3041:18;:7;:16;:18::i;:::-;3015:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2980:86;2973:93;;;2744:329;;;:::o;3898:100:0:-;1196:12:1;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3985:8:0::1;3967:15;:26;;;;3898:100:::0;:::o;4565:162:4:-;4662:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4565:162;;;;:::o;5196:96:0:-;5251:7;5273:5;:14;5279:7;5273:14;;;;;;;;;;;;5266:21;;5196:96;;;:::o;1846:189:1:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1:::1;1934:22;;:8;:22;;;;1926:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;2075:28:0:-;;;;:::o;3160:164::-;3220:13;3295:5;:15;3301:8;3295:15;;;;;;;;;;;:24;;3288:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3160:164;;;:::o;891:123:12:-;996:1;978:7;:14;;;:19;;;;;;;;;;;891:123;:::o;587:96:11:-;640:7;666:10;659:17;;587:96;:::o;910:222:7:-;1012:4;1050:35;1035:50;;;:11;:50;;;;:90;;;;1089:36;1113:11;1089:23;:36::i;:::-;1035:90;1028:97;;910:222;;;:::o;7222:125:4:-;7287:4;7338:1;7310:30;;:7;:16;7318:7;7310:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7303:37;;7222:125;;;:::o;11073:171::-;11174:2;11147:15;:24;11163:7;11147:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11229:7;11225:2;11191:46;;11200:23;11215:7;11200:14;:23::i;:::-;11191:46;;;;;;;;;;;;11073:171;;:::o;773:112:12:-;838:7;864;:14;;;857:21;;773:112;;;:::o;5529:331:0:-;5600:15;5618:25;:15;:23;:25::i;:::-;5600:43;;5667:1;5657:7;:11;:36;;;;;5683:10;;5672:7;:21;;5657:36;5649:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;5720:22;5730:2;5734:7;5720:9;:22::i;:::-;5748:23;5763:7;5748:14;:23::i;:::-;5807:5;:14;5813:7;5807:14;;;;;;;;;;;;5798:7;5782:40;;;;;;;;;;5828:27;:15;:25;:27::i;:::-;5529:331;;:::o;7505:344:4:-;7598:4;7622:16;7630:7;7622;:16::i;:::-;7614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;7754:16;;:7;:16;;;:51;;;;7798:7;7774:31;;:20;7786:7;7774:11;:20::i;:::-;:31;;;7754:51;:87;;;;7809:32;7826:5;7833:7;7809:16;:32::i;:::-;7754:87;7746:96;;;7505:344;;;;:::o;10402:560::-;10556:4;10529:31;;:23;10544:7;10529:14;:23::i;:::-;:31;;;10521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10638:1;10624:16;;:2;:16;;;;10616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;10852:1;10833:9;:15;10843:4;10833:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10880:1;10863:9;:13;10873:2;10863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10910:2;10891:7;:16;10899:7;10891:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10947:7;10943:2;10928:27;;10937:4;10928:27;;;;;;;;;;;;10402:560;;;:::o;2053:117:2:-;1620:8;:6;:8::i;:::-;1612:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2121:5:::1;2111:7;;:15;;;;;;;;;;;;;;;;;;2141:22;2150:12;:10;:12::i;:::-;2141:22;;;;;;:::i;:::-;;;;;;;;2053:117::o:0;2041:169:1:-;2096:16;2115:6;;;;;;;;;;;2096:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2194:8;2163:40;;2184:8;2163:40;;;;;;;;;;;;2041:169;;:::o;1806:115:2:-;1355:8;:6;:8::i;:::-;1354:9;1346:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1875:4:::1;1865:7;;:14;;;;;;;;;;;;;;;;;;1894:20;1901:12;:10;:12::i;:::-;1894:20;;;;;;:::i;:::-;;;;;;;;1806:115::o:0;6612:307:4:-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6612:307;;;;:::o;4680:100:0:-;4740:13;4768:7;4761:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4680:100;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;1496:300:4:-;1598:4;1648:25;1633:40;;;:11;:40;;;;:104;;;;1704:33;1689:48;;;:11;:48;;;;1633:104;:156;;;;1753:36;1777:11;1753:23;:36::i;:::-;1633:156;1614:175;;1496:300;;;:::o;8179:108::-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;:::-;8179:108;;:::o;4893:299:0:-;4971:1;4953:5;:14;4959:7;4953:14;;;;;;;;;;;;:19;4949:239;;;4982:12;5007:2;4997:7;:12;;;;:::i;:::-;4982:27;;5028:10;;5021:4;:17;5017:107;;;5050:9;5077:10;;5072:2;5062:7;:12;;;;:::i;:::-;:25;;;;:::i;:::-;5050:37;;5108:7;5104:1;:11;;;;:::i;:::-;5097:18;;5017:107;;5148:4;5131:5;:14;5137:7;5131:14;;;;;;;;;;;:21;;;;5174:7;5160:5;:11;5166:4;5160:11;;;;;;;;;;;:21;;;;4949:239;;4893:299;:::o;9124:203::-;1355:8:2;:6;:8::i;:::-;1354:9;1346:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;9277:45:0::1;9304:4;9310:2;9314:7;9277:26;:45::i;:::-;9124:203:::0;;;:::o;11797:778:4:-;11947:4;11967:15;:2;:13;;;:15::i;:::-;11963:606;;;12018:2;12002:36;;;12039:12;:10;:12::i;:::-;12053:4;12059:7;12068:5;12002:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12258:1;12241:6;:13;:18;12237:266;;;12283:60;;;;;;;;;;:::i;:::-;;;;;;;;12237:266;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;12134:41;;;12124:51;;;:6;:51;;;;12117:58;;;;;11963:606;12554:4;12547:11;;11797:778;;;;;;;:::o;763:155:14:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8508:311:4:-;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8508:311;;;:::o;2544:572:7:-;2683:45;2710:4;2716:2;2720:7;2683:26;:45::i;:::-;2759:1;2743:18;;:4;:18;;;2739:183;;;2777:40;2809:7;2777:31;:40::i;:::-;2739:183;;;2846:2;2838:10;;:4;:10;;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;2834:88;2739:183;2949:1;2935:16;;:2;:16;;;2931:179;;;2967:45;3004:7;2967:36;:45::i;:::-;2931:179;;;3039:4;3033:10;;:2;:10;;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;:::-;3029:81;2931:179;2544:572;;;:::o;718:377:10:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;9141:372:4:-;9234:1;9220:16;;:2;:16;;;;9212:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9292:16;9300:7;9292;:16::i;:::-;9291:17;9283:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;9425:1;9408:9;:13;9418:2;9408:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9455:2;9436:7;:16;9444:7;9436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9498:7;9494:2;9473:33;;9490:1;9473:33;;;;;;;;;;;;9141:372;;:::o;13131:122::-;;;;:::o;3822:161:7:-;3925:10;:17;;;;3898:15;:24;3914:7;3898:24;;;;;;;;;;;:44;;;;3952:10;3968:7;3952:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3822:161;:::o;4600:970::-;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4862:51;;4923:18;4944:17;:26;4962:7;4944:26;;;;;;;;;;;;4923:47;;5088:14;5074:10;:28;5070:323;;5118:19;5140:12;:18;5153:4;5140:18;;;;;;;;;;;;;;;:34;5159:14;5140:34;;;;;;;;;;;;5118:56;;5222:11;5189:12;:18;5202:4;5189:18;;;;;;;;;;;;;;;:30;5208:10;5189:30;;;;;;;;;;;:44;;;;5338:10;5305:17;:30;5323:11;5305:30;;;;;;;;;;;:43;;;;5070:323;;5486:17;:26;5504:7;5486:26;;;;;;;;;;;5479:33;;;5529:12;:18;5542:4;5529:18;;;;;;;;;;;;;;;:34;5548:14;5529:34;;;;;;;;;;;5522:41;;;4600:970;;;;:::o;5858:1061::-;6107:22;6152:1;6132:10;:17;;;;:21;;;;:::i;:::-;6107:46;;6163:18;6184:15;:24;6200:7;6184:24;;;;;;;;;;;;6163:45;;6530:19;6552:10;6563:14;6552:26;;;;;;;;;;;;;;;;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6724:10;6693:15;:28;6709:11;6693:28;;;;;;;;;;;:41;;;;6862:15;:24;6878:7;6862:24;;;;;;;;;;;6855:31;;;6896:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5858:1061;;;;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;3494:37;;3568:7;3541:12;:16;3554:2;3541:16;;;;;;;;;;;;;;;:24;3558:6;3541:24;;;;;;;;;;;:34;;;;3614:6;3585:17;:26;3603:7;3585:26;;;;;;;;;;;:35;;;;3410:217;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;7:343:16:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:407::-;6154:6;6162;6211:2;6199:9;6190:7;6186:23;6182:32;6179:2;;;6227:1;6224;6217:12;6179:2;6270:1;6295:53;6340:7;6331:6;6320:9;6316:22;6295:53;:::i;:::-;6285:63;;6241:117;6397:2;6423:53;6468:7;6459:6;6448:9;6444:22;6423:53;:::i;:::-;6413:63;;6368:118;6169:324;;;;;:::o;6499:520::-;6577:6;6585;6634:2;6622:9;6613:7;6609:23;6605:32;6602:2;;;6650:1;6647;6640:12;6602:2;6693:1;6718:53;6763:7;6754:6;6743:9;6739:22;6718:53;:::i;:::-;6708:63;;6664:117;6848:2;6837:9;6833:18;6820:32;6879:18;6871:6;6868:30;6865:2;;;6911:1;6908;6901:12;6865:2;6939:63;6994:7;6985:6;6974:9;6970:22;6939:63;:::i;:::-;6929:73;;6791:221;6592:427;;;;;:::o;7025:407::-;7093:6;7101;7150:2;7138:9;7129:7;7125:23;7121:32;7118:2;;;7166:1;7163;7156:12;7118:2;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;7336:2;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7307:118;7108:324;;;;;:::o;7438:665::-;7525:6;7533;7541;7590:2;7578:9;7569:7;7565:23;7561:32;7558:2;;;7606:1;7603;7596:12;7558:2;7649:1;7674:53;7719:7;7710:6;7699:9;7695:22;7674:53;:::i;:::-;7664:63;;7620:117;7776:2;7802:53;7847:7;7838:6;7827:9;7823:22;7802:53;:::i;:::-;7792:63;;7747:118;7932:2;7921:9;7917:18;7904:32;7963:18;7955:6;7952:30;7949:2;;;7995:1;7992;7985:12;7949:2;8023:63;8078:7;8069:6;8058:9;8054:22;8023:63;:::i;:::-;8013:73;;7875:221;7548:555;;;;;:::o;8109:552::-;8186:6;8194;8202;8251:2;8239:9;8230:7;8226:23;8222:32;8219:2;;;8267:1;8264;8257:12;8219:2;8310:1;8335:53;8380:7;8371:6;8360:9;8356:22;8335:53;:::i;:::-;8325:63;;8281:117;8437:2;8463:53;8508:7;8499:6;8488:9;8484:22;8463:53;:::i;:::-;8453:63;;8408:118;8565:2;8591:53;8636:7;8627:6;8616:9;8612:22;8591:53;:::i;:::-;8581:63;;8536:118;8209:452;;;;;:::o;8667:276::-;8796:10;8831:106;8933:3;8925:6;8831:106;:::i;:::-;8817:120;;8807:136;;;;:::o;8949:118::-;9036:24;9054:5;9036:24;:::i;:::-;9031:3;9024:37;9014:53;;:::o;9163:1151::-;9342:3;9371:84;9449:5;9371:84;:::i;:::-;9471:116;9580:6;9575:3;9471:116;:::i;:::-;9464:123;;9613:3;9658:4;9650:6;9646:17;9641:3;9637:27;9688:86;9768:5;9688:86;:::i;:::-;9797:7;9828:1;9813:456;9838:6;9835:1;9832:13;9813:456;;;9909:9;9903:4;9899:20;9894:3;9887:33;9960:6;9954:13;9988:124;10107:4;10092:13;9988:124;:::i;:::-;9980:132;;10135:90;10218:6;10135:90;:::i;:::-;10125:100;;10254:4;10249:3;10245:14;10238:21;;9873:396;9860:1;9857;9853:9;9848:14;;9813:456;;;9817:14;10285:4;10278:11;;10305:3;10298:10;;9347:967;;;;;;;;;:::o;10320:109::-;10401:21;10416:5;10401:21;:::i;:::-;10396:3;10389:34;10379:50;;:::o;10435:360::-;10521:3;10549:38;10581:5;10549:38;:::i;:::-;10603:70;10666:6;10661:3;10603:70;:::i;:::-;10596:77;;10682:52;10727:6;10722:3;10715:4;10708:5;10704:16;10682:52;:::i;:::-;10759:29;10781:6;10759:29;:::i;:::-;10754:3;10750:39;10743:46;;10525:270;;;;;:::o;10801:344::-;10879:3;10907:39;10940:5;10907:39;:::i;:::-;10962:61;11016:6;11011:3;10962:61;:::i;:::-;10955:68;;11032:52;11077:6;11072:3;11065:4;11058:5;11054:16;11032:52;:::i;:::-;11109:29;11131:6;11109:29;:::i;:::-;11104:3;11100:39;11093:46;;10883:262;;;;;:::o;11151:364::-;11239:3;11267:39;11300:5;11267:39;:::i;:::-;11322:71;11386:6;11381:3;11322:71;:::i;:::-;11315:78;;11402:52;11447:6;11442:3;11435:4;11428:5;11424:16;11402:52;:::i;:::-;11479:29;11501:6;11479:29;:::i;:::-;11474:3;11470:39;11463:46;;11243:272;;;;;:::o;11521:377::-;11627:3;11655:39;11688:5;11655:39;:::i;:::-;11710:89;11792:6;11787:3;11710:89;:::i;:::-;11703:96;;11808:52;11853:6;11848:3;11841:4;11834:5;11830:16;11808:52;:::i;:::-;11885:6;11880:3;11876:16;11869:23;;11631:267;;;;;:::o;11904:366::-;12046:3;12067:67;12131:2;12126:3;12067:67;:::i;:::-;12060:74;;12143:93;12232:3;12143:93;:::i;:::-;12261:2;12256:3;12252:12;12245:19;;12050:220;;;:::o;12276:366::-;12418:3;12439:67;12503:2;12498:3;12439:67;:::i;:::-;12432:74;;12515:93;12604:3;12515:93;:::i;:::-;12633:2;12628:3;12624:12;12617:19;;12422:220;;;:::o;12648:366::-;12790:3;12811:67;12875:2;12870:3;12811:67;:::i;:::-;12804:74;;12887:93;12976:3;12887:93;:::i;:::-;13005:2;13000:3;12996:12;12989:19;;12794:220;;;:::o;13020:366::-;13162:3;13183:67;13247:2;13242:3;13183:67;:::i;:::-;13176:74;;13259:93;13348:3;13259:93;:::i;:::-;13377:2;13372:3;13368:12;13361:19;;13166:220;;;:::o;13392:366::-;13534:3;13555:67;13619:2;13614:3;13555:67;:::i;:::-;13548:74;;13631:93;13720:3;13631:93;:::i;:::-;13749:2;13744:3;13740:12;13733:19;;13538:220;;;:::o;13764:366::-;13906:3;13927:67;13991:2;13986:3;13927:67;:::i;:::-;13920:74;;14003:93;14092:3;14003:93;:::i;:::-;14121:2;14116:3;14112:12;14105:19;;13910:220;;;:::o;14136:366::-;14278:3;14299:67;14363:2;14358:3;14299:67;:::i;:::-;14292:74;;14375:93;14464:3;14375:93;:::i;:::-;14493:2;14488:3;14484:12;14477:19;;14282:220;;;:::o;14508:366::-;14650:3;14671:67;14735:2;14730:3;14671:67;:::i;:::-;14664:74;;14747:93;14836:3;14747:93;:::i;:::-;14865:2;14860:3;14856:12;14849:19;;14654:220;;;:::o;14880:366::-;15022:3;15043:67;15107:2;15102:3;15043:67;:::i;:::-;15036:74;;15119:93;15208:3;15119:93;:::i;:::-;15237:2;15232:3;15228:12;15221:19;;15026:220;;;:::o;15252:366::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15398:220;;;:::o;15624:366::-;15766:3;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15863:93;15952:3;15863:93;:::i;:::-;15981:2;15976:3;15972:12;15965:19;;15770:220;;;:::o;15996:366::-;16138:3;16159:67;16223:2;16218:3;16159:67;:::i;:::-;16152:74;;16235:93;16324:3;16235:93;:::i;:::-;16353:2;16348:3;16344:12;16337:19;;16142:220;;;:::o;16368:366::-;16510:3;16531:67;16595:2;16590:3;16531:67;:::i;:::-;16524:74;;16607:93;16696:3;16607:93;:::i;:::-;16725:2;16720:3;16716:12;16709:19;;16514:220;;;:::o;16740:366::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16886:220;;;:::o;17112:366::-;17254:3;17275:67;17339:2;17334:3;17275:67;:::i;:::-;17268:74;;17351:93;17440:3;17351:93;:::i;:::-;17469:2;17464:3;17460:12;17453:19;;17258:220;;;:::o;17484:366::-;17626:3;17647:67;17711:2;17706:3;17647:67;:::i;:::-;17640:74;;17723:93;17812:3;17723:93;:::i;:::-;17841:2;17836:3;17832:12;17825:19;;17630:220;;;:::o;17856:366::-;17998:3;18019:67;18083:2;18078:3;18019:67;:::i;:::-;18012:74;;18095:93;18184:3;18095:93;:::i;:::-;18213:2;18208:3;18204:12;18197:19;;18002:220;;;:::o;18228:366::-;18370:3;18391:67;18455:2;18450:3;18391:67;:::i;:::-;18384:74;;18467:93;18556:3;18467:93;:::i;:::-;18585:2;18580:3;18576:12;18569:19;;18374:220;;;:::o;18600:366::-;18742:3;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18839:93;18928:3;18839:93;:::i;:::-;18957:2;18952:3;18948:12;18941:19;;18746:220;;;:::o;18972:366::-;19114:3;19135:67;19199:2;19194:3;19135:67;:::i;:::-;19128:74;;19211:93;19300:3;19211:93;:::i;:::-;19329:2;19324:3;19320:12;19313:19;;19118:220;;;:::o;19344:366::-;19486:3;19507:67;19571:2;19566:3;19507:67;:::i;:::-;19500:74;;19583:93;19672:3;19583:93;:::i;:::-;19701:2;19696:3;19692:12;19685:19;;19490:220;;;:::o;19716:366::-;19858:3;19879:67;19943:2;19938:3;19879:67;:::i;:::-;19872:74;;19955:93;20044:3;19955:93;:::i;:::-;20073:2;20068:3;20064:12;20057:19;;19862:220;;;:::o;20088:366::-;20230:3;20251:67;20315:2;20310:3;20251:67;:::i;:::-;20244:74;;20327:93;20416:3;20327:93;:::i;:::-;20445:2;20440:3;20436:12;20429:19;;20234:220;;;:::o;20460:366::-;20602:3;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20699:93;20788:3;20699:93;:::i;:::-;20817:2;20812:3;20808:12;20801:19;;20606:220;;;:::o;20832:366::-;20974:3;20995:67;21059:2;21054:3;20995:67;:::i;:::-;20988:74;;21071:93;21160:3;21071:93;:::i;:::-;21189:2;21184:3;21180:12;21173:19;;20978:220;;;:::o;21204:366::-;21346:3;21367:67;21431:2;21426:3;21367:67;:::i;:::-;21360:74;;21443:93;21532:3;21443:93;:::i;:::-;21561:2;21556:3;21552:12;21545:19;;21350:220;;;:::o;21576:366::-;21718:3;21739:67;21803:2;21798:3;21739:67;:::i;:::-;21732:74;;21815:93;21904:3;21815:93;:::i;:::-;21933:2;21928:3;21924:12;21917:19;;21722:220;;;:::o;21948:366::-;22090:3;22111:67;22175:2;22170:3;22111:67;:::i;:::-;22104:74;;22187:93;22276:3;22187:93;:::i;:::-;22305:2;22300:3;22296:12;22289:19;;22094:220;;;:::o;22320:366::-;22462:3;22483:67;22547:2;22542:3;22483:67;:::i;:::-;22476:74;;22559:93;22648:3;22559:93;:::i;:::-;22677:2;22672:3;22668:12;22661:19;;22466:220;;;:::o;22692:366::-;22834:3;22855:67;22919:2;22914:3;22855:67;:::i;:::-;22848:74;;22931:93;23020:3;22931:93;:::i;:::-;23049:2;23044:3;23040:12;23033:19;;22838:220;;;:::o;23064:366::-;23206:3;23227:67;23291:2;23286:3;23227:67;:::i;:::-;23220:74;;23303:93;23392:3;23303:93;:::i;:::-;23421:2;23416:3;23412:12;23405:19;;23210:220;;;:::o;23436:366::-;23578:3;23599:67;23663:2;23658:3;23599:67;:::i;:::-;23592:74;;23675:93;23764:3;23675:93;:::i;:::-;23793:2;23788:3;23784:12;23777:19;;23582:220;;;:::o;23808:366::-;23950:3;23971:67;24035:2;24030:3;23971:67;:::i;:::-;23964:74;;24047:93;24136:3;24047:93;:::i;:::-;24165:2;24160:3;24156:12;24149:19;;23954:220;;;:::o;24180:366::-;24322:3;24343:67;24407:2;24402:3;24343:67;:::i;:::-;24336:74;;24419:93;24508:3;24419:93;:::i;:::-;24537:2;24532:3;24528:12;24521:19;;24326:220;;;:::o;24552:366::-;24694:3;24715:67;24779:2;24774:3;24715:67;:::i;:::-;24708:74;;24791:93;24880:3;24791:93;:::i;:::-;24909:2;24904:3;24900:12;24893:19;;24698:220;;;:::o;24924:366::-;25066:3;25087:67;25151:2;25146:3;25087:67;:::i;:::-;25080:74;;25163:93;25252:3;25163:93;:::i;:::-;25281:2;25276:3;25272:12;25265:19;;25070:220;;;:::o;25382:788::-;25501:3;25537:4;25532:3;25528:14;25627:4;25620:5;25616:16;25610:23;25680:3;25674:4;25670:14;25663:4;25658:3;25654:14;25647:38;25706:73;25774:4;25760:12;25706:73;:::i;:::-;25698:81;;25552:238;25872:4;25865:5;25861:16;25855:23;25891:63;25948:4;25943:3;25939:14;25925:12;25891:63;:::i;:::-;25800:164;26051:4;26044:5;26040:16;26034:23;26070:63;26127:4;26122:3;26118:14;26104:12;26070:63;:::i;:::-;25974:169;26160:4;26153:11;;25506:664;;;;;:::o;26176:108::-;26253:24;26271:5;26253:24;:::i;:::-;26248:3;26241:37;26231:53;;:::o;26290:118::-;26377:24;26395:5;26377:24;:::i;:::-;26372:3;26365:37;26355:53;;:::o;26414:435::-;26594:3;26616:95;26707:3;26698:6;26616:95;:::i;:::-;26609:102;;26728:95;26819:3;26810:6;26728:95;:::i;:::-;26721:102;;26840:3;26833:10;;26598:251;;;;;:::o;26855:222::-;26948:4;26986:2;26975:9;26971:18;26963:26;;26999:71;27067:1;27056:9;27052:17;27043:6;26999:71;:::i;:::-;26953:124;;;;:::o;27083:640::-;27278:4;27316:3;27305:9;27301:19;27293:27;;27330:71;27398:1;27387:9;27383:17;27374:6;27330:71;:::i;:::-;27411:72;27479:2;27468:9;27464:18;27455:6;27411:72;:::i;:::-;27493;27561:2;27550:9;27546:18;27537:6;27493:72;:::i;:::-;27612:9;27606:4;27602:20;27597:2;27586:9;27582:18;27575:48;27640:76;27711:4;27702:6;27640:76;:::i;:::-;27632:84;;27283:440;;;;;;;:::o;27729:493::-;27932:4;27970:2;27959:9;27955:18;27947:26;;28019:9;28013:4;28009:20;28005:1;27994:9;27990:17;27983:47;28047:168;28210:4;28201:6;28047:168;:::i;:::-;28039:176;;27937:285;;;;:::o;28228:210::-;28315:4;28353:2;28342:9;28338:18;28330:26;;28366:65;28428:1;28417:9;28413:17;28404:6;28366:65;:::i;:::-;28320:118;;;;:::o;28444:313::-;28557:4;28595:2;28584:9;28580:18;28572:26;;28644:9;28638:4;28634:20;28630:1;28619:9;28615:17;28608:47;28672:78;28745:4;28736:6;28672:78;:::i;:::-;28664:86;;28562:195;;;;:::o;28763:419::-;28929:4;28967:2;28956:9;28952:18;28944:26;;29016:9;29010:4;29006:20;29002:1;28991:9;28987:17;28980:47;29044:131;29170:4;29044:131;:::i;:::-;29036:139;;28934:248;;;:::o;29188:419::-;29354:4;29392:2;29381:9;29377:18;29369:26;;29441:9;29435:4;29431:20;29427:1;29416:9;29412:17;29405:47;29469:131;29595:4;29469:131;:::i;:::-;29461:139;;29359:248;;;:::o;29613:419::-;29779:4;29817:2;29806:9;29802:18;29794:26;;29866:9;29860:4;29856:20;29852:1;29841:9;29837:17;29830:47;29894:131;30020:4;29894:131;:::i;:::-;29886:139;;29784:248;;;:::o;30038:419::-;30204:4;30242:2;30231:9;30227:18;30219:26;;30291:9;30285:4;30281:20;30277:1;30266:9;30262:17;30255:47;30319:131;30445:4;30319:131;:::i;:::-;30311:139;;30209:248;;;:::o;30463:419::-;30629:4;30667:2;30656:9;30652:18;30644:26;;30716:9;30710:4;30706:20;30702:1;30691:9;30687:17;30680:47;30744:131;30870:4;30744:131;:::i;:::-;30736:139;;30634:248;;;:::o;30888:419::-;31054:4;31092:2;31081:9;31077:18;31069:26;;31141:9;31135:4;31131:20;31127:1;31116:9;31112:17;31105:47;31169:131;31295:4;31169:131;:::i;:::-;31161:139;;31059:248;;;:::o;31313:419::-;31479:4;31517:2;31506:9;31502:18;31494:26;;31566:9;31560:4;31556:20;31552:1;31541:9;31537:17;31530:47;31594:131;31720:4;31594:131;:::i;:::-;31586:139;;31484:248;;;:::o;31738:419::-;31904:4;31942:2;31931:9;31927:18;31919:26;;31991:9;31985:4;31981:20;31977:1;31966:9;31962:17;31955:47;32019:131;32145:4;32019:131;:::i;:::-;32011:139;;31909:248;;;:::o;32163:419::-;32329:4;32367:2;32356:9;32352:18;32344:26;;32416:9;32410:4;32406:20;32402:1;32391:9;32387:17;32380:47;32444:131;32570:4;32444:131;:::i;:::-;32436:139;;32334:248;;;:::o;32588:419::-;32754:4;32792:2;32781:9;32777:18;32769:26;;32841:9;32835:4;32831:20;32827:1;32816:9;32812:17;32805:47;32869:131;32995:4;32869:131;:::i;:::-;32861:139;;32759:248;;;:::o;33013:419::-;33179:4;33217:2;33206:9;33202:18;33194:26;;33266:9;33260:4;33256:20;33252:1;33241:9;33237:17;33230:47;33294:131;33420:4;33294:131;:::i;:::-;33286:139;;33184:248;;;:::o;33438:419::-;33604:4;33642:2;33631:9;33627:18;33619:26;;33691:9;33685:4;33681:20;33677:1;33666:9;33662:17;33655:47;33719:131;33845:4;33719:131;:::i;:::-;33711:139;;33609:248;;;:::o;33863:419::-;34029:4;34067:2;34056:9;34052:18;34044:26;;34116:9;34110:4;34106:20;34102:1;34091:9;34087:17;34080:47;34144:131;34270:4;34144:131;:::i;:::-;34136:139;;34034:248;;;:::o;34288:419::-;34454:4;34492:2;34481:9;34477:18;34469:26;;34541:9;34535:4;34531:20;34527:1;34516:9;34512:17;34505:47;34569:131;34695:4;34569:131;:::i;:::-;34561:139;;34459:248;;;:::o;34713:419::-;34879:4;34917:2;34906:9;34902:18;34894:26;;34966:9;34960:4;34956:20;34952:1;34941:9;34937:17;34930:47;34994:131;35120:4;34994:131;:::i;:::-;34986:139;;34884:248;;;:::o;35138:419::-;35304:4;35342:2;35331:9;35327:18;35319:26;;35391:9;35385:4;35381:20;35377:1;35366:9;35362:17;35355:47;35419:131;35545:4;35419:131;:::i;:::-;35411:139;;35309:248;;;:::o;35563:419::-;35729:4;35767:2;35756:9;35752:18;35744:26;;35816:9;35810:4;35806:20;35802:1;35791:9;35787:17;35780:47;35844:131;35970:4;35844:131;:::i;:::-;35836:139;;35734:248;;;:::o;35988:419::-;36154:4;36192:2;36181:9;36177:18;36169:26;;36241:9;36235:4;36231:20;36227:1;36216:9;36212:17;36205:47;36269:131;36395:4;36269:131;:::i;:::-;36261:139;;36159:248;;;:::o;36413:419::-;36579:4;36617:2;36606:9;36602:18;36594:26;;36666:9;36660:4;36656:20;36652:1;36641:9;36637:17;36630:47;36694:131;36820:4;36694:131;:::i;:::-;36686:139;;36584:248;;;:::o;36838:419::-;37004:4;37042:2;37031:9;37027:18;37019:26;;37091:9;37085:4;37081:20;37077:1;37066:9;37062:17;37055:47;37119:131;37245:4;37119:131;:::i;:::-;37111:139;;37009:248;;;:::o;37263:419::-;37429:4;37467:2;37456:9;37452:18;37444:26;;37516:9;37510:4;37506:20;37502:1;37491:9;37487:17;37480:47;37544:131;37670:4;37544:131;:::i;:::-;37536:139;;37434:248;;;:::o;37688:419::-;37854:4;37892:2;37881:9;37877:18;37869:26;;37941:9;37935:4;37931:20;37927:1;37916:9;37912:17;37905:47;37969:131;38095:4;37969:131;:::i;:::-;37961:139;;37859:248;;;:::o;38113:419::-;38279:4;38317:2;38306:9;38302:18;38294:26;;38366:9;38360:4;38356:20;38352:1;38341:9;38337:17;38330:47;38394:131;38520:4;38394:131;:::i;:::-;38386:139;;38284:248;;;:::o;38538:419::-;38704:4;38742:2;38731:9;38727:18;38719:26;;38791:9;38785:4;38781:20;38777:1;38766:9;38762:17;38755:47;38819:131;38945:4;38819:131;:::i;:::-;38811:139;;38709:248;;;:::o;38963:419::-;39129:4;39167:2;39156:9;39152:18;39144:26;;39216:9;39210:4;39206:20;39202:1;39191:9;39187:17;39180:47;39244:131;39370:4;39244:131;:::i;:::-;39236:139;;39134:248;;;:::o;39388:419::-;39554:4;39592:2;39581:9;39577:18;39569:26;;39641:9;39635:4;39631:20;39627:1;39616:9;39612:17;39605:47;39669:131;39795:4;39669:131;:::i;:::-;39661:139;;39559:248;;;:::o;39813:419::-;39979:4;40017:2;40006:9;40002:18;39994:26;;40066:9;40060:4;40056:20;40052:1;40041:9;40037:17;40030:47;40094:131;40220:4;40094:131;:::i;:::-;40086:139;;39984:248;;;:::o;40238:419::-;40404:4;40442:2;40431:9;40427:18;40419:26;;40491:9;40485:4;40481:20;40477:1;40466:9;40462:17;40455:47;40519:131;40645:4;40519:131;:::i;:::-;40511:139;;40409:248;;;:::o;40663:419::-;40829:4;40867:2;40856:9;40852:18;40844:26;;40916:9;40910:4;40906:20;40902:1;40891:9;40887:17;40880:47;40944:131;41070:4;40944:131;:::i;:::-;40936:139;;40834:248;;;:::o;41088:419::-;41254:4;41292:2;41281:9;41277:18;41269:26;;41341:9;41335:4;41331:20;41327:1;41316:9;41312:17;41305:47;41369:131;41495:4;41369:131;:::i;:::-;41361:139;;41259:248;;;:::o;41513:419::-;41679:4;41717:2;41706:9;41702:18;41694:26;;41766:9;41760:4;41756:20;41752:1;41741:9;41737:17;41730:47;41794:131;41920:4;41794:131;:::i;:::-;41786:139;;41684:248;;;:::o;41938:419::-;42104:4;42142:2;42131:9;42127:18;42119:26;;42191:9;42185:4;42181:20;42177:1;42166:9;42162:17;42155:47;42219:131;42345:4;42219:131;:::i;:::-;42211:139;;42109:248;;;:::o;42363:419::-;42529:4;42567:2;42556:9;42552:18;42544:26;;42616:9;42610:4;42606:20;42602:1;42591:9;42587:17;42580:47;42644:131;42770:4;42644:131;:::i;:::-;42636:139;;42534:248;;;:::o;42788:419::-;42954:4;42992:2;42981:9;42977:18;42969:26;;43041:9;43035:4;43031:20;43027:1;43016:9;43012:17;43005:47;43069:131;43195:4;43069:131;:::i;:::-;43061:139;;42959:248;;;:::o;43213:419::-;43379:4;43417:2;43406:9;43402:18;43394:26;;43466:9;43460:4;43456:20;43452:1;43441:9;43437:17;43430:47;43494:131;43620:4;43494:131;:::i;:::-;43486:139;;43384:248;;;:::o;43638:419::-;43804:4;43842:2;43831:9;43827:18;43819:26;;43891:9;43885:4;43881:20;43877:1;43866:9;43862:17;43855:47;43919:131;44045:4;43919:131;:::i;:::-;43911:139;;43809:248;;;:::o;44063:222::-;44156:4;44194:2;44183:9;44179:18;44171:26;;44207:71;44275:1;44264:9;44260:17;44251:6;44207:71;:::i;:::-;44161:124;;;;:::o;44291:423::-;44432:4;44470:2;44459:9;44455:18;44447:26;;44483:71;44551:1;44540:9;44536:17;44527:6;44483:71;:::i;:::-;44601:9;44595:4;44591:20;44586:2;44575:9;44571:18;44564:48;44629:78;44702:4;44693:6;44629:78;:::i;:::-;44621:86;;44437:277;;;;;:::o;44720:129::-;44754:6;44781:20;;:::i;:::-;44771:30;;44810:33;44838:4;44830:6;44810:33;:::i;:::-;44761:88;;;:::o;44855:75::-;44888:6;44921:2;44915:9;44905:19;;44895:35;:::o;44936:307::-;44997:4;45087:18;45079:6;45076:30;45073:2;;;45109:18;;:::i;:::-;45073:2;45147:29;45169:6;45147:29;:::i;:::-;45139:37;;45231:4;45225;45221:15;45213:23;;45002:241;;;:::o;45249:308::-;45311:4;45401:18;45393:6;45390:30;45387:2;;;45423:18;;:::i;:::-;45387:2;45461:29;45483:6;45461:29;:::i;:::-;45453:37;;45545:4;45539;45535:15;45527:23;;45316:241;;;:::o;45563:162::-;45660:4;45683:3;45675:11;;45713:4;45708:3;45704:14;45696:22;;45665:60;;;:::o;45731:144::-;45828:6;45862:5;45856:12;45846:22;;45835:40;;;:::o;45881:98::-;45932:6;45966:5;45960:12;45950:22;;45939:40;;;:::o;45985:99::-;46037:6;46071:5;46065:12;46055:22;;46044:40;;;:::o;46090:143::-;46190:4;46222;46217:3;46213:14;46205:22;;46195:38;;;:::o;46239:214::-;46368:11;46402:6;46397:3;46390:19;46442:4;46437:3;46433:14;46418:29;;46380:73;;;;:::o;46459:168::-;46542:11;46576:6;46571:3;46564:19;46616:4;46611:3;46607:14;46592:29;;46554:73;;;;:::o;46633:159::-;46707:11;46741:6;46736:3;46729:19;46781:4;46776:3;46772:14;46757:29;;46719:73;;;;:::o;46798:169::-;46882:11;46916:6;46911:3;46904:19;46956:4;46951:3;46947:14;46932:29;;46894:73;;;;:::o;46973:148::-;47075:11;47112:3;47097:18;;47087:34;;;;:::o;47127:305::-;47167:3;47186:20;47204:1;47186:20;:::i;:::-;47181:25;;47220:20;47238:1;47220:20;:::i;:::-;47215:25;;47374:1;47306:66;47302:74;47299:1;47296:81;47293:2;;;47380:18;;:::i;:::-;47293:2;47424:1;47421;47417:9;47410:16;;47171:261;;;;:::o;47438:185::-;47478:1;47495:20;47513:1;47495:20;:::i;:::-;47490:25;;47529:20;47547:1;47529:20;:::i;:::-;47524:25;;47568:1;47558:2;;47573:18;;:::i;:::-;47558:2;47615:1;47612;47608:9;47603:14;;47480:143;;;;:::o;47629:348::-;47669:7;47692:20;47710:1;47692:20;:::i;:::-;47687:25;;47726:20;47744:1;47726:20;:::i;:::-;47721:25;;47914:1;47846:66;47842:74;47839:1;47836:81;47831:1;47824:9;47817:17;47813:105;47810:2;;;47921:18;;:::i;:::-;47810:2;47969:1;47966;47962:9;47951:20;;47677:300;;;;:::o;47983:191::-;48023:4;48043:20;48061:1;48043:20;:::i;:::-;48038:25;;48077:20;48095:1;48077:20;:::i;:::-;48072:25;;48116:1;48113;48110:8;48107:2;;;48121:18;;:::i;:::-;48107:2;48166:1;48163;48159:9;48151:17;;48028:146;;;;:::o;48180:96::-;48217:7;48246:24;48264:5;48246:24;:::i;:::-;48235:35;;48225:51;;;:::o;48282:90::-;48316:7;48359:5;48352:13;48345:21;48334:32;;48324:48;;;:::o;48378:149::-;48414:7;48454:66;48447:5;48443:78;48432:89;;48422:105;;;:::o;48533:126::-;48570:7;48610:42;48603:5;48599:54;48588:65;;48578:81;;;:::o;48665:77::-;48702:7;48731:5;48720:16;;48710:32;;;:::o;48748:154::-;48832:6;48827:3;48822;48809:30;48894:1;48885:6;48880:3;48876:16;48869:27;48799:103;;;:::o;48908:307::-;48976:1;48986:113;49000:6;48997:1;48994:13;48986:113;;;49085:1;49080:3;49076:11;49070:18;49066:1;49061:3;49057:11;49050:39;49022:2;49019:1;49015:10;49010:15;;48986:113;;;49117:6;49114:1;49111:13;49108:2;;;49197:1;49188:6;49183:3;49179:16;49172:27;49108:2;48957:258;;;;:::o;49221:320::-;49265:6;49302:1;49296:4;49292:12;49282:22;;49349:1;49343:4;49339:12;49370:18;49360:2;;49426:4;49418:6;49414:17;49404:27;;49360:2;49488;49480:6;49477:14;49457:18;49454:38;49451:2;;;49507:18;;:::i;:::-;49451:2;49272:269;;;;:::o;49547:281::-;49630:27;49652:4;49630:27;:::i;:::-;49622:6;49618:40;49760:6;49748:10;49745:22;49724:18;49712:10;49709:34;49706:62;49703:2;;;49771:18;;:::i;:::-;49703:2;49811:10;49807:2;49800:22;49590:238;;;:::o;49834:233::-;49873:3;49896:24;49914:5;49896:24;:::i;:::-;49887:33;;49942:66;49935:5;49932:77;49929:2;;;50012:18;;:::i;:::-;49929:2;50059:1;50052:5;50048:13;50041:20;;49877:190;;;:::o;50073:176::-;50105:1;50122:20;50140:1;50122:20;:::i;:::-;50117:25;;50156:20;50174:1;50156:20;:::i;:::-;50151:25;;50195:1;50185:2;;50200:18;;:::i;:::-;50185:2;50241:1;50238;50234:9;50229:14;;50107:142;;;;:::o;50255:180::-;50303:77;50300:1;50293:88;50400:4;50397:1;50390:15;50424:4;50421:1;50414:15;50441:180;50489:77;50486:1;50479:88;50586:4;50583:1;50576:15;50610:4;50607:1;50600:15;50627:180;50675:77;50672:1;50665:88;50772:4;50769:1;50762:15;50796:4;50793:1;50786:15;50813:180;50861:77;50858:1;50851:88;50958:4;50955:1;50948:15;50982:4;50979:1;50972:15;50999:102;51040:6;51091:2;51087:7;51082:2;51075:5;51071:14;51067:28;51057:38;;51047:54;;;:::o;51107:180::-;51247:32;51243:1;51235:6;51231:14;51224:56;51213:74;:::o;51293:177::-;51433:29;51429:1;51421:6;51417:14;51410:53;51399:71;:::o;51476:165::-;51616:17;51612:1;51604:6;51600:14;51593:41;51582:59;:::o;51647:170::-;51787:22;51783:1;51775:6;51771:14;51764:46;51753:64;:::o;51823:230::-;51963:34;51959:1;51951:6;51947:14;51940:58;52032:13;52027:2;52019:6;52015:15;52008:38;51929:124;:::o;52059:237::-;52199:34;52195:1;52187:6;52183:14;52176:58;52268:20;52263:2;52255:6;52251:15;52244:45;52165:131;:::o;52302:225::-;52442:34;52438:1;52430:6;52426:14;52419:58;52511:8;52506:2;52498:6;52494:15;52487:33;52408:119;:::o;52533:174::-;52673:26;52669:1;52661:6;52657:14;52650:50;52639:68;:::o;52713:178::-;52853:30;52849:1;52841:6;52837:14;52830:54;52819:72;:::o;52897:223::-;53037:34;53033:1;53025:6;53021:14;53014:58;53106:6;53101:2;53093:6;53089:15;53082:31;53003:117;:::o;53126:175::-;53266:27;53262:1;53254:6;53250:14;53243:51;53232:69;:::o;53307:182::-;53447:34;53443:1;53435:6;53431:14;53424:58;53413:76;:::o;53495:181::-;53635:33;53631:1;53623:6;53619:14;53612:57;53601:75;:::o;53682:179::-;53822:31;53818:1;53810:6;53806:14;53799:55;53788:73;:::o;53867:182::-;54007:34;54003:1;53995:6;53991:14;53984:58;53973:76;:::o;54055:231::-;54195:34;54191:1;54183:6;54179:14;54172:58;54264:14;54259:2;54251:6;54247:15;54240:39;54161:125;:::o;54292:166::-;54432:18;54428:1;54420:6;54416:14;54409:42;54398:60;:::o;54464:243::-;54604:34;54600:1;54592:6;54588:14;54581:58;54673:26;54668:2;54660:6;54656:15;54649:51;54570:137;:::o;54713:229::-;54853:34;54849:1;54841:6;54837:14;54830:58;54922:12;54917:2;54909:6;54905:15;54898:37;54819:123;:::o;54948:228::-;55088:34;55084:1;55076:6;55072:14;55065:58;55157:11;55152:2;55144:6;55140:15;55133:36;55054:122;:::o;55182:182::-;55322:34;55318:1;55310:6;55306:14;55299:58;55288:76;:::o;55370:231::-;55510:34;55506:1;55498:6;55494:14;55487:58;55579:14;55574:2;55566:6;55562:15;55555:39;55476:125;:::o;55607:182::-;55747:34;55743:1;55735:6;55731:14;55724:58;55713:76;:::o;55795:173::-;55935:25;55931:1;55923:6;55919:14;55912:49;55901:67;:::o;55974:166::-;56114:18;56110:1;56102:6;56098:14;56091:42;56080:60;:::o;56146:228::-;56286:34;56282:1;56274:6;56270:14;56263:58;56355:11;56350:2;56342:6;56338:15;56331:36;56252:122;:::o;56380:234::-;56520:34;56516:1;56508:6;56504:14;56497:58;56589:17;56584:2;56576:6;56572:15;56565:42;56486:128;:::o;56620:173::-;56760:25;56756:1;56748:6;56744:14;56737:49;56726:67;:::o;56799:172::-;56939:24;56935:1;56927:6;56923:14;56916:48;56905:66;:::o;56977:220::-;57117:34;57113:1;57105:6;57101:14;57094:58;57186:3;57181:2;57173:6;57169:15;57162:28;57083:114;:::o;57203:236::-;57343:34;57339:1;57331:6;57327:14;57320:58;57412:19;57407:2;57399:6;57395:15;57388:44;57309:130;:::o;57445:180::-;57585:32;57581:1;57573:6;57569:14;57562:56;57551:74;:::o;57631:182::-;57771:34;57767:1;57759:6;57755:14;57748:58;57737:76;:::o;57819:182::-;57959:34;57955:1;57947:6;57943:14;57936:58;57925:76;:::o;58007:231::-;58147:34;58143:1;58135:6;58131:14;58124:58;58216:14;58211:2;58203:6;58199:15;58192:39;58113:125;:::o;58244:181::-;58384:33;58380:1;58372:6;58368:14;58361:57;58350:75;:::o;58431:122::-;58504:24;58522:5;58504:24;:::i;:::-;58497:5;58494:35;58484:2;;58543:1;58540;58533:12;58484:2;58474:79;:::o;58559:116::-;58629:21;58644:5;58629:21;:::i;:::-;58622:5;58619:32;58609:2;;58665:1;58662;58655:12;58609:2;58599:76;:::o;58681:120::-;58753:23;58770:5;58753:23;:::i;:::-;58746:5;58743:34;58733:2;;58791:1;58788;58781:12;58733:2;58723:78;:::o;58807:122::-;58880:24;58898:5;58880:24;:::i;:::-;58873:5;58870:35;58860:2;;58919:1;58916;58909:12;58860:2;58850:79;:::o

Metadata Hash

ipfs://b6d076072b88651c9d80e1b0efc059b6a67742c479977583eacd7f5bbf6d3485
Loading