ERC-721
Overview
Max Total Supply
0 FUL
Holders
79
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FULLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WorldcupNFT
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.1; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(operatorFilterRegistry).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if ( !( operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender) && operatorFilterRegistry.isOperatorAllowed(address(this), from) ) ) { revert OperatorNotAllowed(msg.sender); } } _; } } abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { 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" ); } 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); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } 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); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } 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); } 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); } } } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; 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); } 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); } 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); } } interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165 is IERC165 { function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _setOwner(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } 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); } } interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } interface IERC721 is IERC165 { event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId ) external ; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address owner, address operator) external view returns (bool); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } interface IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @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; string public BaseURI; // 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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); 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) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : ""; } /** * @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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return BaseURI; } /** * @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 token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @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 _ownerOf(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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @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 from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256, /* firstTokenId */ uint256 batchSize ) internal virtual { if (batchSize > 1) { if (from != address(0)) { _balances[from] -= batchSize; } if (to != address(0)) { _balances[to] += batchSize; } } } /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} } contract WorldcupNFT is ERC721, Ownable,DefaultOperatorFilterer{ using SafeMath for uint256; constructor() ERC721("FUL world Cup Collection", "FUL") {} uint256 public Max_NFT = 333; uint256 public NFT_counter; mapping(address => uint256[]) internal usersNFT; mapping(uint => bytes32) private tierToRoot; mapping(bytes32 => mapping(bytes32 => bool)) private validLeaf; event nftMinted(uint256 tokenId); event nftBurned(uint256 tokenId); function setBaseURI(string memory BaseUri_)public onlyOwner{ BaseURI = BaseUri_; } function setTierRoot(bytes32[] memory root)public onlyOwner{ for(uint i = 0; i < 3; i++){ tierToRoot[i+1] = root[i]; } } function verify(bytes32 root, bytes32 leaf, bytes32[] memory proof)internal pure returns (bool){ bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } function mintWorldCupNFT(uint256 tier_, bytes32 leaf_ , bytes32[] calldata proof_, uint256[] calldata tokenId)public { require(validLeaf[tierToRoot[tier_]][leaf_] == false, "same root and leaf can be use only once."); require(verify(tierToRoot[tier_],leaf_,proof_), "verification fail"); require(tier_ > 0 && tier_ < 4,"Tier should be in between 1-3"); require((NFT_counter + tier_) <= Max_NFT,"You can't mint more than 333"); for(uint i = 0; i < tier_; i++){ _mint(msg.sender, tokenId[i]); usersNFT[msg.sender].push(tokenId[i]); validLeaf[tierToRoot[tier_]][leaf_] = true; emit nftMinted(tokenId[i]); } NFT_counter += tier_; } function nftOfUser(address user)public view returns(uint256[] memory){ return usersNFT[user]; } function transferFrom(address from,address to,uint256 tokenId) public onlyAllowedOperator(from) override { uint256 temp; for (uint256 i; i < usersNFT[from].length; i++) { if (usersNFT[from][i] == tokenId) { temp = usersNFT[from][i]; usersNFT[from][i] = usersNFT[from][usersNFT[from].length - 1]; usersNFT[from].pop(); usersNFT[to].push(temp); break; } } super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public onlyAllowedOperator(from) override { uint256 temp; for (uint256 i; i < usersNFT[from].length; i++) { if (usersNFT[from][i] == tokenId) { temp = usersNFT[from][i]; usersNFT[from][i] = usersNFT[from][usersNFT[from].length - 1]; usersNFT[from].pop(); usersNFT[to].push(temp); break; } } safeTransferFrom(from, to, tokenId, ""); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public onlyAllowedOperator(from) override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); uint256 temp; for (uint256 i; i < usersNFT[from].length; i++) { if (usersNFT[from][i] == tokenId) { temp = usersNFT[from][i]; usersNFT[from][i] = usersNFT[from][usersNFT[from].length - 1]; usersNFT[from].pop(); usersNFT[to].push(temp); break; } } _safeTransfer(from, to, tokenId, data); } function burnNFT(uint256 tokenId)public { require(ownerOf(tokenId) == msg.sender, "Only Owner of NFT Can put NFT on Auction"); for (uint256 i; i < usersNFT[msg.sender].length; i++) { if (usersNFT[msg.sender][i] == tokenId) { usersNFT[msg.sender][i] = usersNFT[msg.sender][usersNFT[msg.sender].length - 1]; usersNFT[msg.sender].pop(); break; } } super._burn(tokenId); emit nftBurned(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"uint256","name":"tokenId","type":"uint256"}],"name":"nftBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"nftMinted","type":"event"},{"inputs":[],"name":"BaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Max_NFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnNFT","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tier_","type":"uint256"},{"internalType":"bytes32","name":"leaf_","type":"bytes32"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"}],"name":"mintWorldCupNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"nftOfUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"BaseUri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"root","type":"bytes32[]"}],"name":"setTierRoot","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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"}]
Contract Creation Code
608060405261014d6008553480156200001757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601881526020017f46554c20776f726c642043757020436f6c6c656374696f6e00000000000000008152506040518060400160405280600381526020017f46554c00000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b3929190620003ba565b508060019080519060200190620000cc929190620003ba565b505050620000ef620000e3620002ec60201b60201c565b620002f460201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002e4578015620001aa576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000170929190620004af565b600060405180830381600087803b1580156200018b57600080fd5b505af1158015620001a0573d6000803e3d6000fd5b50505050620002e3565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000264576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200022a929190620004af565b600060405180830381600087803b1580156200024557600080fd5b505af11580156200025a573d6000803e3d6000fd5b50505050620002e2565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002ad9190620004dc565b600060405180830381600087803b158015620002c857600080fd5b505af1158015620002dd573d6000803e3d6000fd5b505050505b5b5b50506200055d565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003c89062000528565b90600052602060002090601f016020900481019282620003ec576000855562000438565b82601f106200040757805160ff191683800117855562000438565b8280016001018555821562000438579182015b82811115620004375782518255916020019190600101906200041a565b5b5090506200044791906200044b565b5090565b5b80821115620004665760008160009055506001016200044c565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000497826200046a565b9050919050565b620004a9816200048a565b82525050565b6000604082019050620004c660008301856200049e565b620004d560208301846200049e565b9392505050565b6000602082019050620004f360008301846200049e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200054157607f821691505b602082108103620005575762000556620004f9565b5b50919050565b615711806200056d6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063b88d4fde1161007c578063b88d4fde146103b1578063c87b56dd146103cd578063dd9d29d5146103fd578063e985e9c514610419578063f2fde38b14610449578063ffcc43c41461046557610158565b80638da5cb5b146102ed57806390cd38ba1461030b57806395d89b411461033b578063a1c613f614610359578063a22cb46514610377578063aa1c61531461039357610158565b806342842e0e1161011557806342842e0e1461022f57806355f804b31461024b5780636352211e146102675780636518a1d81461029757806370a08231146102b3578063715018a6146102e357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806323b872dd146101f75780632890e0d714610213575b600080fd5b61017760048036038101906101729190613f65565b610483565b6040516101849190613fad565b60405180910390f35b610195610565565b6040516101a29190614061565b60405180910390f35b6101c560048036038101906101c091906140b9565b6105f7565b6040516101d29190614127565b60405180910390f35b6101f560048036038101906101f0919061416e565b61063d565b005b610211600480360381019061020c91906141ae565b610754565b005b61022d600480360381019061022891906140b9565b610f2e565b005b610249600480360381019061024491906141ae565b61121c565b005b61026560048036038101906102609190614336565b611a16565b005b610281600480360381019061027c91906140b9565b611aac565b60405161028e9190614127565b60405180910390f35b6102b160048036038101906102ac919061446b565b611b32565b005b6102cd60048036038101906102c89190614512565b611e7e565b6040516102da919061454e565b60405180910390f35b6102eb611f35565b005b6102f5611fbd565b6040516103029190614127565b60405180910390f35b61032560048036038101906103209190614512565b611fe7565b6040516103329190614627565b60405180910390f35b61034361207e565b6040516103509190614061565b60405180910390f35b610361612110565b60405161036e919061454e565b60405180910390f35b610391600480360381019061038c9190614675565b612116565b005b61039b61212c565b6040516103a8919061454e565b60405180910390f35b6103cb60048036038101906103c69190614756565b612132565b005b6103e760048036038101906103e291906140b9565b6129af565b6040516103f49190614061565b60405180910390f35b6104176004803603810190610412919061489c565b612a17565b005b610433600480360381019061042e91906148e5565b612af4565b6040516104409190613fad565b60405180910390f35b610463600480360381019061045e9190614512565b612b88565b005b61046d612c7f565b60405161047a9190614061565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055e575061055d82612d0d565b5b9050919050565b60606000805461057490614954565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090614954565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b600061060282612d77565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064882611aac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106af906149f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d7612dc2565b73ffffffffffffffffffffffffffffffffffffffff161480610706575061070581610700612dc2565b612af4565b5b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90614a89565b60405180910390fd5b61074f8383612dca565b505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c20573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac2576000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610ab05783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061085657610855614aa9565b5b906000526020600020015403610a9d57600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106108b7576108b6614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506109529190614b07565b8154811061096357610962614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106109bf576109be614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610a1c57610a1b614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055610ab0565b8080610aa890614b6a565b9150506107ba565b50610abc858585612e83565b50610f28565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b0b929190614bb2565b602060405180830381865afa158015610b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614bf0565b8015610bde57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b9c929190614bb2565b602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190614bf0565b5b610c1f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c169190614127565b60405180910390fd5b5b6000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610f1a5783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cc057610cbf614aa9565b5b906000526020600020015403610f0757600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110610d2157610d20614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050610dbc9190614b07565b81548110610dcd57610dcc614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610e2957610e28614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610e8657610e85614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055610f1a565b8080610f1290614b6a565b915050610c24565b50610f26858585612e83565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16610f4e82611aac565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90614c8f565b60405180910390fd5b60005b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156111d95781600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061104357611042614aa9565b5b9060005260206000200154036111c657600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506110e19190614b07565b815481106110f2576110f1614aa9565b5b9060005260206000200154600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061114e5761114d614aa9565b5b9060005260206000200181905550600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806111ab576111aa614b3b565b5b600190038181906000526020600020016000905590556111d9565b80806111d190614b6a565b915050610fa7565b506111e381612ee3565b7ee4cc2a180e59819deb5e6645169fc467bb89c3ab34f99642d6e27c31363afb81604051611211919061454e565b60405180910390a150565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156116f8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361159a576000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156115785783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061131e5761131d614aa9565b5b90600052602060002001540361156557600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061137f5761137e614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061141a9190614b07565b8154811061142b5761142a614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061148757611486614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806114e4576114e3614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611578565b808061157090614b6a565b915050611282565b5061159485858560405180602001604052806000815250612132565b50611a10565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115e3929190614bb2565b602060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190614bf0565b80156116b657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611674929190614bb2565b602060405180830381865afa158015611691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b59190614bf0565b5b6116f757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116ee9190614127565b60405180910390fd5b5b6000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156119f25783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061179857611797614aa9565b5b9060005260206000200154036119df57600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106117f9576117f8614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506118949190614b07565b815481106118a5576118a4614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061190157611900614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061195e5761195d614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556119f2565b80806119ea90614b6a565b9150506116fc565b50611a0e85858560405180602001604052806000815250612132565b505b50505050565b611a1e612dc2565b73ffffffffffffffffffffffffffffffffffffffff16611a3c611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990614cfb565b60405180910390fd5b8060029080519060200190611aa8929190613e56565b5050565b600080611ab883613031565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614d67565b60405180910390fd5b80915050919050565b60001515600c6000600b60008a8152602001908152602001600020548152602001908152602001600020600087815260200190815260200160002060009054906101000a900460ff16151514611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614df9565b60405180910390fd5b611c1c600b60008881526020019081526020016000205486868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061306e565b611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614e65565b60405180910390fd5b600086118015611c6b5750600486105b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190614ed1565b60405180910390fd5b60085486600954611cbb9190614ef1565b1115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614f93565b60405180910390fd5b60005b86811015611e5c57611d2a33848484818110611d1e57611d1d614aa9565b5b90506020020135613124565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838383818110611d7c57611d7b614aa9565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600c6000600b60008b8152602001908152602001600020548152602001908152602001600020600088815260200190815260200160002060006101000a81548160ff0219169083151502179055507fffd68f154a856e351841a0ab55b762d44c0ab63bb8df164aced57a49d25c8449838383818110611e2d57611e2c614aa9565b5b90506020020135604051611e41919061454e565b60405180910390a18080611e5490614b6a565b915050611cff565b508560096000828254611e6f9190614ef1565b92505081905550505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee590615025565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f3d612dc2565b73ffffffffffffffffffffffffffffffffffffffff16611f5b611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614cfb565b60405180910390fd5b611fbb6000613341565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561207257602002820191906000526020600020905b81548152602001906001019080831161205e575b50505050509050919050565b60606001805461208d90614954565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990614954565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b5050505050905090565b60085481565b612128612121612dc2565b8383613407565b5050565b60095481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561264f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124f1576121a561219f612dc2565b84613573565b6121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906150b7565b60405180910390fd5b6000805b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156124de5784600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061228457612283614aa9565b5b9060005260206000200154036124cb57600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106122e5576122e4614aa9565b5b90600052602060002001549150600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506123809190614b07565b8154811061239157612390614aa9565b5b9060005260206000200154600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123ed576123ec614aa9565b5b9060005260206000200181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061244a57612449614b3b565b5b60019003818190600052602060002001600090559055600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556124de565b80806124d690614b6a565b9150506121e8565b506124eb86868686613608565b506129a8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161253a929190614bb2565b602060405180830381865afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b9190614bf0565b801561260d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016125cb929190614bb2565b602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260c9190614bf0565b5b61264e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016126459190614127565b60405180910390fd5b5b61266061265a612dc2565b84613573565b61269f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612696906150b7565b60405180910390fd5b6000805b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156129995784600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061273f5761273e614aa9565b5b90600052602060002001540361298657600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106127a05761279f614aa9565b5b90600052602060002001549150600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061283b9190614b07565b8154811061284c5761284b614aa9565b5b9060005260206000200154600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106128a8576128a7614aa9565b5b9060005260206000200181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061290557612904614b3b565b5b60019003818190600052602060002001600090559055600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055612999565b808061299190614b6a565b9150506126a3565b506129a686868686613608565b505b5050505050565b60606129ba82612d77565b60006129c4613664565b905060008151116129e45760405180602001604052806000815250612a0f565b806129ee846136f6565b6040516020016129ff92919061515f565b6040516020818303038152906040525b915050919050565b612a1f612dc2565b73ffffffffffffffffffffffffffffffffffffffff16612a3d611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614cfb565b60405180910390fd5b60005b6003811015612af057818181518110612ab257612ab1614aa9565b5b6020026020010151600b6000600184612acb9190614ef1565b8152602001908152602001600020819055508080612ae890614b6a565b915050612a96565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b90612dc2565b73ffffffffffffffffffffffffffffffffffffffff16612bae611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90614cfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6a90615200565b60405180910390fd5b612c7c81613341565b50565b60028054612c8c90614954565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb890614954565b8015612d055780601f10612cda57610100808354040283529160200191612d05565b820191906000526020600020905b815481529060010190602001808311612ce857829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d8081613856565b612dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db690614d67565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e3d83611aac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e94612e8e612dc2565b82613573565b612ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eca906150b7565b60405180910390fd5b612ede838383613897565b505050565b6000612eee82611aac565b9050612efe816000846001613b90565b612f0782611aac565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461302d816000846001613cb6565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008083905060005b835181101561311657600084828151811061309557613094614aa9565b5b602002602001015190508083116130d65782816040516020016130b9929190615241565b604051602081830303815290604052805190602001209250613102565b80836040516020016130e9929190615241565b6040516020818303038152906040528051906020012092505b50808061310e90614b6a565b915050613077565b508481149150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a906152b9565b60405180910390fd5b61319c81613856565b156131dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d390615325565b60405180910390fd5b6131ea600083836001613b90565b6131f381613856565b15613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90615325565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461333d600083836001613cb6565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346c90615391565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135669190613fad565b60405180910390a3505050565b60008061357f83611aac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135c157506135c08185612af4565b5b806135ff57508373ffffffffffffffffffffffffffffffffffffffff166135e7846105f7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b613613848484613897565b61361f84848484613cbc565b61365e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365590615423565b60405180910390fd5b50505050565b60606002805461367390614954565b80601f016020809104026020016040519081016040528092919081815260200182805461369f90614954565b80156136ec5780601f106136c1576101008083540402835291602001916136ec565b820191906000526020600020905b8154815290600101906020018083116136cf57829003601f168201915b5050505050905090565b60606000820361373d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613851565b600082905060005b6000821461376f57808061375890614b6a565b915050600a826137689190615472565b9150613745565b60008167ffffffffffffffff81111561378b5761378a61420b565b5b6040519080825280601f01601f1916602001820160405280156137bd5781602001600182028036833780820191505090505b5090505b6000851461384a576001826137d69190614b07565b9150600a856137e591906154a3565b60306137f19190614ef1565b60f81b81838151811061380757613806614aa9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138439190615472565b94506137c1565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661387883613031565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8273ffffffffffffffffffffffffffffffffffffffff166138b782611aac565b73ffffffffffffffffffffffffffffffffffffffff161461390d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390490615546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361397c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613973906155d8565b60405180910390fd5b6139898383836001613b90565b8273ffffffffffffffffffffffffffffffffffffffff166139a982611aac565b73ffffffffffffffffffffffffffffffffffffffff16146139ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f690615546565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b8b8383836001613cb6565b505050565b6001811115613cb057600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c245780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c1c9190614b07565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613caf5780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ca79190614ef1565b925050819055505b5b50505050565b50505050565b6000613cdd8473ffffffffffffffffffffffffffffffffffffffff16613e43565b15613e36578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d06612dc2565b8786866040518563ffffffff1660e01b8152600401613d28949392919061564d565b6020604051808303816000875af1925050508015613d6457506040513d601f19601f82011682018060405250810190613d6191906156ae565b60015b613de6573d8060008114613d94576040519150601f19603f3d011682016040523d82523d6000602084013e613d99565b606091505b506000815103613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615423565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e3b565b600190505b949350505050565b600080823b905060008111915050919050565b828054613e6290614954565b90600052602060002090601f016020900481019282613e845760008555613ecb565b82601f10613e9d57805160ff1916838001178555613ecb565b82800160010185558215613ecb579182015b82811115613eca578251825591602001919060010190613eaf565b5b509050613ed89190613edc565b5090565b5b80821115613ef5576000816000905550600101613edd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f4281613f0d565b8114613f4d57600080fd5b50565b600081359050613f5f81613f39565b92915050565b600060208284031215613f7b57613f7a613f03565b5b6000613f8984828501613f50565b91505092915050565b60008115159050919050565b613fa781613f92565b82525050565b6000602082019050613fc26000830184613f9e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614002578082015181840152602081019050613fe7565b83811115614011576000848401525b50505050565b6000601f19601f8301169050919050565b600061403382613fc8565b61403d8185613fd3565b935061404d818560208601613fe4565b61405681614017565b840191505092915050565b6000602082019050818103600083015261407b8184614028565b905092915050565b6000819050919050565b61409681614083565b81146140a157600080fd5b50565b6000813590506140b38161408d565b92915050565b6000602082840312156140cf576140ce613f03565b5b60006140dd848285016140a4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614111826140e6565b9050919050565b61412181614106565b82525050565b600060208201905061413c6000830184614118565b92915050565b61414b81614106565b811461415657600080fd5b50565b60008135905061416881614142565b92915050565b6000806040838503121561418557614184613f03565b5b600061419385828601614159565b92505060206141a4858286016140a4565b9150509250929050565b6000806000606084860312156141c7576141c6613f03565b5b60006141d586828701614159565b93505060206141e686828701614159565b92505060406141f7868287016140a4565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424382614017565b810181811067ffffffffffffffff821117156142625761426161420b565b5b80604052505050565b6000614275613ef9565b9050614281828261423a565b919050565b600067ffffffffffffffff8211156142a1576142a061420b565b5b6142aa82614017565b9050602081019050919050565b82818337600083830152505050565b60006142d96142d484614286565b61426b565b9050828152602081018484840111156142f5576142f4614206565b5b6143008482856142b7565b509392505050565b600082601f83011261431d5761431c614201565b5b813561432d8482602086016142c6565b91505092915050565b60006020828403121561434c5761434b613f03565b5b600082013567ffffffffffffffff81111561436a57614369613f08565b5b61437684828501614308565b91505092915050565b6000819050919050565b6143928161437f565b811461439d57600080fd5b50565b6000813590506143af81614389565b92915050565b600080fd5b600080fd5b60008083601f8401126143d5576143d4614201565b5b8235905067ffffffffffffffff8111156143f2576143f16143b5565b5b60208301915083602082028301111561440e5761440d6143ba565b5b9250929050565b60008083601f84011261442b5761442a614201565b5b8235905067ffffffffffffffff811115614448576144476143b5565b5b602083019150836020820283011115614464576144636143ba565b5b9250929050565b6000806000806000806080878903121561448857614487613f03565b5b600061449689828a016140a4565b96505060206144a789828a016143a0565b955050604087013567ffffffffffffffff8111156144c8576144c7613f08565b5b6144d489828a016143bf565b9450945050606087013567ffffffffffffffff8111156144f7576144f6613f08565b5b61450389828a01614415565b92509250509295509295509295565b60006020828403121561452857614527613f03565b5b600061453684828501614159565b91505092915050565b61454881614083565b82525050565b6000602082019050614563600083018461453f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61459e81614083565b82525050565b60006145b08383614595565b60208301905092915050565b6000602082019050919050565b60006145d482614569565b6145de8185614574565b93506145e983614585565b8060005b8381101561461a57815161460188826145a4565b975061460c836145bc565b9250506001810190506145ed565b5085935050505092915050565b6000602082019050818103600083015261464181846145c9565b905092915050565b61465281613f92565b811461465d57600080fd5b50565b60008135905061466f81614649565b92915050565b6000806040838503121561468c5761468b613f03565b5b600061469a85828601614159565b92505060206146ab85828601614660565b9150509250929050565b600067ffffffffffffffff8211156146d0576146cf61420b565b5b6146d982614017565b9050602081019050919050565b60006146f96146f4846146b5565b61426b565b90508281526020810184848401111561471557614714614206565b5b6147208482856142b7565b509392505050565b600082601f83011261473d5761473c614201565b5b813561474d8482602086016146e6565b91505092915050565b600080600080608085870312156147705761476f613f03565b5b600061477e87828801614159565b945050602061478f87828801614159565b93505060406147a0878288016140a4565b925050606085013567ffffffffffffffff8111156147c1576147c0613f08565b5b6147cd87828801614728565b91505092959194509250565b600067ffffffffffffffff8211156147f4576147f361420b565b5b602082029050602081019050919050565b6000614818614813846147d9565b61426b565b9050808382526020820190506020840283018581111561483b5761483a6143ba565b5b835b81811015614864578061485088826143a0565b84526020840193505060208101905061483d565b5050509392505050565b600082601f83011261488357614882614201565b5b8135614893848260208601614805565b91505092915050565b6000602082840312156148b2576148b1613f03565b5b600082013567ffffffffffffffff8111156148d0576148cf613f08565b5b6148dc8482850161486e565b91505092915050565b600080604083850312156148fc576148fb613f03565b5b600061490a85828601614159565b925050602061491b85828601614159565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061496c57607f821691505b60208210810361497f5761497e614925565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149e1602183613fd3565b91506149ec82614985565b604082019050919050565b60006020820190508181036000830152614a10816149d4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614a73603d83613fd3565b9150614a7e82614a17565b604082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b1282614083565b9150614b1d83614083565b925082821015614b3057614b2f614ad8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614b7582614083565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ba757614ba6614ad8565b5b600182019050919050565b6000604082019050614bc76000830185614118565b614bd46020830184614118565b9392505050565b600081519050614bea81614649565b92915050565b600060208284031215614c0657614c05613f03565b5b6000614c1484828501614bdb565b91505092915050565b7f4f6e6c79204f776e6572206f66204e4654202043616e20707574204e4654206f60008201527f6e2041756374696f6e0000000000000000000000000000000000000000000000602082015250565b6000614c79602983613fd3565b9150614c8482614c1d565b604082019050919050565b60006020820190508181036000830152614ca881614c6c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ce5602083613fd3565b9150614cf082614caf565b602082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614d51601883613fd3565b9150614d5c82614d1b565b602082019050919050565b60006020820190508181036000830152614d8081614d44565b9050919050565b7f73616d6520726f6f7420616e64206c6561662063616e20626520757365206f6e60008201527f6c79206f6e63652e000000000000000000000000000000000000000000000000602082015250565b6000614de3602883613fd3565b9150614dee82614d87565b604082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f766572696669636174696f6e206661696c000000000000000000000000000000600082015250565b6000614e4f601183613fd3565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f546965722073686f756c6420626520696e206265747765656e20312d33000000600082015250565b6000614ebb601d83613fd3565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b6000614efc82614083565b9150614f0783614083565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3c57614f3b614ad8565b5b828201905092915050565b7f596f752063616e2774206d696e74206d6f7265207468616e2033333300000000600082015250565b6000614f7d601c83613fd3565b9150614f8882614f47565b602082019050919050565b60006020820190508181036000830152614fac81614f70565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061500f602983613fd3565b915061501a82614fb3565b604082019050919050565b6000602082019050818103600083015261503e81615002565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006150a1602d83613fd3565b91506150ac82615045565b604082019050919050565b600060208201905081810360008301526150d081615094565b9050919050565b600081905092915050565b60006150ed82613fc8565b6150f781856150d7565b9350615107818560208601613fe4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006151496005836150d7565b915061515482615113565b600582019050919050565b600061516b82856150e2565b915061517782846150e2565b91506151828261513c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151ea602683613fd3565b91506151f58261518e565b604082019050919050565b60006020820190508181036000830152615219816151dd565b9050919050565b6000819050919050565b61523b6152368261437f565b615220565b82525050565b600061524d828561522a565b60208201915061525d828461522a565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006152a3602083613fd3565b91506152ae8261526d565b602082019050919050565b600060208201905081810360008301526152d281615296565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061530f601c83613fd3565b915061531a826152d9565b602082019050919050565b6000602082019050818103600083015261533e81615302565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061537b601983613fd3565b915061538682615345565b602082019050919050565b600060208201905081810360008301526153aa8161536e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061540d603283613fd3565b9150615418826153b1565b604082019050919050565b6000602082019050818103600083015261543c81615400565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061547d82614083565b915061548883614083565b92508261549857615497615443565b5b828204905092915050565b60006154ae82614083565b91506154b983614083565b9250826154c9576154c8615443565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615530602583613fd3565b915061553b826154d4565b604082019050919050565b6000602082019050818103600083015261555f81615523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155c2602483613fd3565b91506155cd82615566565b604082019050919050565b600060208201905081810360008301526155f1816155b5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061561f826155f8565b6156298185615603565b9350615639818560208601613fe4565b61564281614017565b840191505092915050565b60006080820190506156626000830187614118565b61566f6020830186614118565b61567c604083018561453f565b818103606083015261568e8184615614565b905095945050505050565b6000815190506156a881613f39565b92915050565b6000602082840312156156c4576156c3613f03565b5b60006156d284828501615699565b9150509291505056fea2646970667358221220e281a9c77de0e3d8ec87768ff28c03f6932166e204975320b182e90d14c246e064736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c80638da5cb5b116100c3578063b88d4fde1161007c578063b88d4fde146103b1578063c87b56dd146103cd578063dd9d29d5146103fd578063e985e9c514610419578063f2fde38b14610449578063ffcc43c41461046557610158565b80638da5cb5b146102ed57806390cd38ba1461030b57806395d89b411461033b578063a1c613f614610359578063a22cb46514610377578063aa1c61531461039357610158565b806342842e0e1161011557806342842e0e1461022f57806355f804b31461024b5780636352211e146102675780636518a1d81461029757806370a08231146102b3578063715018a6146102e357610158565b806301ffc9a71461015d57806306fdde031461018d578063081812fc146101ab578063095ea7b3146101db57806323b872dd146101f75780632890e0d714610213575b600080fd5b61017760048036038101906101729190613f65565b610483565b6040516101849190613fad565b60405180910390f35b610195610565565b6040516101a29190614061565b60405180910390f35b6101c560048036038101906101c091906140b9565b6105f7565b6040516101d29190614127565b60405180910390f35b6101f560048036038101906101f0919061416e565b61063d565b005b610211600480360381019061020c91906141ae565b610754565b005b61022d600480360381019061022891906140b9565b610f2e565b005b610249600480360381019061024491906141ae565b61121c565b005b61026560048036038101906102609190614336565b611a16565b005b610281600480360381019061027c91906140b9565b611aac565b60405161028e9190614127565b60405180910390f35b6102b160048036038101906102ac919061446b565b611b32565b005b6102cd60048036038101906102c89190614512565b611e7e565b6040516102da919061454e565b60405180910390f35b6102eb611f35565b005b6102f5611fbd565b6040516103029190614127565b60405180910390f35b61032560048036038101906103209190614512565b611fe7565b6040516103329190614627565b60405180910390f35b61034361207e565b6040516103509190614061565b60405180910390f35b610361612110565b60405161036e919061454e565b60405180910390f35b610391600480360381019061038c9190614675565b612116565b005b61039b61212c565b6040516103a8919061454e565b60405180910390f35b6103cb60048036038101906103c69190614756565b612132565b005b6103e760048036038101906103e291906140b9565b6129af565b6040516103f49190614061565b60405180910390f35b6104176004803603810190610412919061489c565b612a17565b005b610433600480360381019061042e91906148e5565b612af4565b6040516104409190613fad565b60405180910390f35b610463600480360381019061045e9190614512565b612b88565b005b61046d612c7f565b60405161047a9190614061565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061054e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061055e575061055d82612d0d565b5b9050919050565b60606000805461057490614954565b80601f01602080910402602001604051908101604052809291908181526020018280546105a090614954565b80156105ed5780601f106105c2576101008083540402835291602001916105ed565b820191906000526020600020905b8154815290600101906020018083116105d057829003601f168201915b5050505050905090565b600061060282612d77565b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061064882611aac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106af906149f7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106d7612dc2565b73ffffffffffffffffffffffffffffffffffffffff161480610706575061070581610700612dc2565b612af4565b5b610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073c90614a89565b60405180910390fd5b61074f8383612dca565b505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c20573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ac2576000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610ab05783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061085657610855614aa9565b5b906000526020600020015403610a9d57600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106108b7576108b6614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506109529190614b07565b8154811061096357610962614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106109bf576109be614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610a1c57610a1b614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055610ab0565b8080610aa890614b6a565b9150506107ba565b50610abc858585612e83565b50610f28565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b0b929190614bb2565b602060405180830381865afa158015610b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614bf0565b8015610bde57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b9c929190614bb2565b602060405180830381865afa158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190614bf0565b5b610c1f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c169190614127565b60405180910390fd5b5b6000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015610f1a5783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cc057610cbf614aa9565b5b906000526020600020015403610f0757600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110610d2157610d20614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050610dbc9190614b07565b81548110610dcd57610dcc614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610e2957610e28614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480610e8657610e85614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055610f1a565b8080610f1290614b6a565b915050610c24565b50610f26858585612e83565b505b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16610f4e82611aac565b73ffffffffffffffffffffffffffffffffffffffff1614610fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9b90614c8f565b60405180910390fd5b60005b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156111d95781600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061104357611042614aa9565b5b9060005260206000200154036111c657600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506110e19190614b07565b815481106110f2576110f1614aa9565b5b9060005260206000200154600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061114e5761114d614aa9565b5b9060005260206000200181905550600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806111ab576111aa614b3b565b5b600190038181906000526020600020016000905590556111d9565b80806111d190614b6a565b915050610fa7565b506111e381612ee3565b7ee4cc2a180e59819deb5e6645169fc467bb89c3ab34f99642d6e27c31363afb81604051611211919061454e565b60405180910390a150565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156116f8573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361159a576000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156115785783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061131e5761131d614aa9565b5b90600052602060002001540361156557600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020818154811061137f5761137e614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061141a9190614b07565b8154811061142b5761142a614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061148757611486614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806114e4576114e3614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055611578565b808061157090614b6a565b915050611282565b5061159485858560405180602001604052806000815250612132565b50611a10565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016115e3929190614bb2565b602060405180830381865afa158015611600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116249190614bf0565b80156116b657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611674929190614bb2565b602060405180830381865afa158015611691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b59190614bf0565b5b6116f757336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016116ee9190614127565b60405180910390fd5b5b6000805b600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156119f25783600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061179857611797614aa9565b5b9060005260206000200154036119df57600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106117f9576117f8614aa9565b5b90600052602060002001549150600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506118949190614b07565b815481106118a5576118a4614aa9565b5b9060005260206000200154600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061190157611900614aa9565b5b9060005260206000200181905550600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061195e5761195d614b3b565b5b60019003818190600052602060002001600090559055600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556119f2565b80806119ea90614b6a565b9150506116fc565b50611a0e85858560405180602001604052806000815250612132565b505b50505050565b611a1e612dc2565b73ffffffffffffffffffffffffffffffffffffffff16611a3c611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614611a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8990614cfb565b60405180910390fd5b8060029080519060200190611aa8929190613e56565b5050565b600080611ab883613031565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614d67565b60405180910390fd5b80915050919050565b60001515600c6000600b60008a8152602001908152602001600020548152602001908152602001600020600087815260200190815260200160002060009054906101000a900460ff16151514611bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb490614df9565b60405180910390fd5b611c1c600b60008881526020019081526020016000205486868680806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505061306e565b611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290614e65565b60405180910390fd5b600086118015611c6b5750600486105b611caa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca190614ed1565b60405180910390fd5b60085486600954611cbb9190614ef1565b1115611cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf390614f93565b60405180910390fd5b60005b86811015611e5c57611d2a33848484818110611d1e57611d1d614aa9565b5b90506020020135613124565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838383818110611d7c57611d7b614aa9565b5b9050602002013590806001815401808255809150506001900390600052602060002001600090919091909150556001600c6000600b60008b8152602001908152602001600020548152602001908152602001600020600088815260200190815260200160002060006101000a81548160ff0219169083151502179055507fffd68f154a856e351841a0ab55b762d44c0ab63bb8df164aced57a49d25c8449838383818110611e2d57611e2c614aa9565b5b90506020020135604051611e41919061454e565b60405180910390a18080611e5490614b6a565b915050611cff565b508560096000828254611e6f9190614ef1565b92505081905550505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee590615025565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f3d612dc2565b73ffffffffffffffffffffffffffffffffffffffff16611f5b611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614611fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa890614cfb565b60405180910390fd5b611fbb6000613341565b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561207257602002820191906000526020600020905b81548152602001906001019080831161205e575b50505050509050919050565b60606001805461208d90614954565b80601f01602080910402602001604051908101604052809291908181526020018280546120b990614954565b80156121065780601f106120db57610100808354040283529160200191612106565b820191906000526020600020905b8154815290600101906020018083116120e957829003601f168201915b5050505050905090565b60085481565b612128612121612dc2565b8383613407565b5050565b60095481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561264f573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124f1576121a561219f612dc2565b84613573565b6121e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121db906150b7565b60405180910390fd5b6000805b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156124de5784600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061228457612283614aa9565b5b9060005260206000200154036124cb57600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106122e5576122e4614aa9565b5b90600052602060002001549150600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506123809190614b07565b8154811061239157612390614aa9565b5b9060005260206000200154600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106123ed576123ec614aa9565b5b9060005260206000200181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061244a57612449614b3b565b5b60019003818190600052602060002001600090559055600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208290806001815401808255809150506001900390600052602060002001600090919091909150556124de565b80806124d690614b6a565b9150506121e8565b506124eb86868686613608565b506129a8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161253a929190614bb2565b602060405180830381865afa158015612557573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257b9190614bf0565b801561260d57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016125cb929190614bb2565b602060405180830381865afa1580156125e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061260c9190614bf0565b5b61264e57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016126459190614127565b60405180910390fd5b5b61266061265a612dc2565b84613573565b61269f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612696906150b7565b60405180910390fd5b6000805b600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156129995784600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061273f5761273e614aa9565b5b90600052602060002001540361298657600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081815481106127a05761279f614aa9565b5b90600052602060002001549150600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600a60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061283b9190614b07565b8154811061284c5761284b614aa9565b5b9060005260206000200154600a60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106128a8576128a7614aa9565b5b9060005260206000200181905550600a60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061290557612904614b3b565b5b60019003818190600052602060002001600090559055600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055612999565b808061299190614b6a565b9150506126a3565b506129a686868686613608565b505b5050505050565b60606129ba82612d77565b60006129c4613664565b905060008151116129e45760405180602001604052806000815250612a0f565b806129ee846136f6565b6040516020016129ff92919061515f565b6040516020818303038152906040525b915050919050565b612a1f612dc2565b73ffffffffffffffffffffffffffffffffffffffff16612a3d611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614612a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8a90614cfb565b60405180910390fd5b60005b6003811015612af057818181518110612ab257612ab1614aa9565b5b6020026020010151600b6000600184612acb9190614ef1565b8152602001908152602001600020819055508080612ae890614b6a565b915050612a96565b5050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612b90612dc2565b73ffffffffffffffffffffffffffffffffffffffff16612bae611fbd565b73ffffffffffffffffffffffffffffffffffffffff1614612c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfb90614cfb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6a90615200565b60405180910390fd5b612c7c81613341565b50565b60028054612c8c90614954565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb890614954565b8015612d055780601f10612cda57610100808354040283529160200191612d05565b820191906000526020600020905b815481529060010190602001808311612ce857829003601f168201915b505050505081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d8081613856565b612dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db690614d67565b60405180910390fd5b50565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e3d83611aac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612e94612e8e612dc2565b82613573565b612ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eca906150b7565b60405180910390fd5b612ede838383613897565b505050565b6000612eee82611aac565b9050612efe816000846001613b90565b612f0782611aac565b90506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461302d816000846001613cb6565b5050565b60006003600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008083905060005b835181101561311657600084828151811061309557613094614aa9565b5b602002602001015190508083116130d65782816040516020016130b9929190615241565b604051602081830303815290604052805190602001209250613102565b80836040516020016130e9929190615241565b6040516020818303038152906040528051906020012092505b50808061310e90614b6a565b915050613077565b508481149150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161318a906152b9565b60405180910390fd5b61319c81613856565b156131dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d390615325565b60405180910390fd5b6131ea600083836001613b90565b6131f381613856565b15613233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322a90615325565b60405180910390fd5b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461333d600083836001613cb6565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346c90615391565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135669190613fad565b60405180910390a3505050565b60008061357f83611aac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806135c157506135c08185612af4565b5b806135ff57508373ffffffffffffffffffffffffffffffffffffffff166135e7846105f7565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b613613848484613897565b61361f84848484613cbc565b61365e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365590615423565b60405180910390fd5b50505050565b60606002805461367390614954565b80601f016020809104026020016040519081016040528092919081815260200182805461369f90614954565b80156136ec5780601f106136c1576101008083540402835291602001916136ec565b820191906000526020600020905b8154815290600101906020018083116136cf57829003601f168201915b5050505050905090565b60606000820361373d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613851565b600082905060005b6000821461376f57808061375890614b6a565b915050600a826137689190615472565b9150613745565b60008167ffffffffffffffff81111561378b5761378a61420b565b5b6040519080825280601f01601f1916602001820160405280156137bd5781602001600182028036833780820191505090505b5090505b6000851461384a576001826137d69190614b07565b9150600a856137e591906154a3565b60306137f19190614ef1565b60f81b81838151811061380757613806614aa9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138439190615472565b94506137c1565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff1661387883613031565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b8273ffffffffffffffffffffffffffffffffffffffff166138b782611aac565b73ffffffffffffffffffffffffffffffffffffffff161461390d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390490615546565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361397c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613973906155d8565b60405180910390fd5b6139898383836001613b90565b8273ffffffffffffffffffffffffffffffffffffffff166139a982611aac565b73ffffffffffffffffffffffffffffffffffffffff16146139ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139f690615546565b60405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b8b8383836001613cb6565b505050565b6001811115613cb057600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614613c245780600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c1c9190614b07565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613caf5780600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ca79190614ef1565b925050819055505b5b50505050565b50505050565b6000613cdd8473ffffffffffffffffffffffffffffffffffffffff16613e43565b15613e36578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d06612dc2565b8786866040518563ffffffff1660e01b8152600401613d28949392919061564d565b6020604051808303816000875af1925050508015613d6457506040513d601f19601f82011682018060405250810190613d6191906156ae565b60015b613de6573d8060008114613d94576040519150601f19603f3d011682016040523d82523d6000602084013e613d99565b606091505b506000815103613dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613dd590615423565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e3b565b600190505b949350505050565b600080823b905060008111915050919050565b828054613e6290614954565b90600052602060002090601f016020900481019282613e845760008555613ecb565b82601f10613e9d57805160ff1916838001178555613ecb565b82800160010185558215613ecb579182015b82811115613eca578251825591602001919060010190613eaf565b5b509050613ed89190613edc565b5090565b5b80821115613ef5576000816000905550600101613edd565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613f4281613f0d565b8114613f4d57600080fd5b50565b600081359050613f5f81613f39565b92915050565b600060208284031215613f7b57613f7a613f03565b5b6000613f8984828501613f50565b91505092915050565b60008115159050919050565b613fa781613f92565b82525050565b6000602082019050613fc26000830184613f9e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614002578082015181840152602081019050613fe7565b83811115614011576000848401525b50505050565b6000601f19601f8301169050919050565b600061403382613fc8565b61403d8185613fd3565b935061404d818560208601613fe4565b61405681614017565b840191505092915050565b6000602082019050818103600083015261407b8184614028565b905092915050565b6000819050919050565b61409681614083565b81146140a157600080fd5b50565b6000813590506140b38161408d565b92915050565b6000602082840312156140cf576140ce613f03565b5b60006140dd848285016140a4565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614111826140e6565b9050919050565b61412181614106565b82525050565b600060208201905061413c6000830184614118565b92915050565b61414b81614106565b811461415657600080fd5b50565b60008135905061416881614142565b92915050565b6000806040838503121561418557614184613f03565b5b600061419385828601614159565b92505060206141a4858286016140a4565b9150509250929050565b6000806000606084860312156141c7576141c6613f03565b5b60006141d586828701614159565b93505060206141e686828701614159565b92505060406141f7868287016140a4565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61424382614017565b810181811067ffffffffffffffff821117156142625761426161420b565b5b80604052505050565b6000614275613ef9565b9050614281828261423a565b919050565b600067ffffffffffffffff8211156142a1576142a061420b565b5b6142aa82614017565b9050602081019050919050565b82818337600083830152505050565b60006142d96142d484614286565b61426b565b9050828152602081018484840111156142f5576142f4614206565b5b6143008482856142b7565b509392505050565b600082601f83011261431d5761431c614201565b5b813561432d8482602086016142c6565b91505092915050565b60006020828403121561434c5761434b613f03565b5b600082013567ffffffffffffffff81111561436a57614369613f08565b5b61437684828501614308565b91505092915050565b6000819050919050565b6143928161437f565b811461439d57600080fd5b50565b6000813590506143af81614389565b92915050565b600080fd5b600080fd5b60008083601f8401126143d5576143d4614201565b5b8235905067ffffffffffffffff8111156143f2576143f16143b5565b5b60208301915083602082028301111561440e5761440d6143ba565b5b9250929050565b60008083601f84011261442b5761442a614201565b5b8235905067ffffffffffffffff811115614448576144476143b5565b5b602083019150836020820283011115614464576144636143ba565b5b9250929050565b6000806000806000806080878903121561448857614487613f03565b5b600061449689828a016140a4565b96505060206144a789828a016143a0565b955050604087013567ffffffffffffffff8111156144c8576144c7613f08565b5b6144d489828a016143bf565b9450945050606087013567ffffffffffffffff8111156144f7576144f6613f08565b5b61450389828a01614415565b92509250509295509295509295565b60006020828403121561452857614527613f03565b5b600061453684828501614159565b91505092915050565b61454881614083565b82525050565b6000602082019050614563600083018461453f565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61459e81614083565b82525050565b60006145b08383614595565b60208301905092915050565b6000602082019050919050565b60006145d482614569565b6145de8185614574565b93506145e983614585565b8060005b8381101561461a57815161460188826145a4565b975061460c836145bc565b9250506001810190506145ed565b5085935050505092915050565b6000602082019050818103600083015261464181846145c9565b905092915050565b61465281613f92565b811461465d57600080fd5b50565b60008135905061466f81614649565b92915050565b6000806040838503121561468c5761468b613f03565b5b600061469a85828601614159565b92505060206146ab85828601614660565b9150509250929050565b600067ffffffffffffffff8211156146d0576146cf61420b565b5b6146d982614017565b9050602081019050919050565b60006146f96146f4846146b5565b61426b565b90508281526020810184848401111561471557614714614206565b5b6147208482856142b7565b509392505050565b600082601f83011261473d5761473c614201565b5b813561474d8482602086016146e6565b91505092915050565b600080600080608085870312156147705761476f613f03565b5b600061477e87828801614159565b945050602061478f87828801614159565b93505060406147a0878288016140a4565b925050606085013567ffffffffffffffff8111156147c1576147c0613f08565b5b6147cd87828801614728565b91505092959194509250565b600067ffffffffffffffff8211156147f4576147f361420b565b5b602082029050602081019050919050565b6000614818614813846147d9565b61426b565b9050808382526020820190506020840283018581111561483b5761483a6143ba565b5b835b81811015614864578061485088826143a0565b84526020840193505060208101905061483d565b5050509392505050565b600082601f83011261488357614882614201565b5b8135614893848260208601614805565b91505092915050565b6000602082840312156148b2576148b1613f03565b5b600082013567ffffffffffffffff8111156148d0576148cf613f08565b5b6148dc8482850161486e565b91505092915050565b600080604083850312156148fc576148fb613f03565b5b600061490a85828601614159565b925050602061491b85828601614159565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061496c57607f821691505b60208210810361497f5761497e614925565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006149e1602183613fd3565b91506149ec82614985565b604082019050919050565b60006020820190508181036000830152614a10816149d4565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614a73603d83613fd3565b9150614a7e82614a17565b604082019050919050565b60006020820190508181036000830152614aa281614a66565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614b1282614083565b9150614b1d83614083565b925082821015614b3057614b2f614ad8565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614b7582614083565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614ba757614ba6614ad8565b5b600182019050919050565b6000604082019050614bc76000830185614118565b614bd46020830184614118565b9392505050565b600081519050614bea81614649565b92915050565b600060208284031215614c0657614c05613f03565b5b6000614c1484828501614bdb565b91505092915050565b7f4f6e6c79204f776e6572206f66204e4654202043616e20707574204e4654206f60008201527f6e2041756374696f6e0000000000000000000000000000000000000000000000602082015250565b6000614c79602983613fd3565b9150614c8482614c1d565b604082019050919050565b60006020820190508181036000830152614ca881614c6c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614ce5602083613fd3565b9150614cf082614caf565b602082019050919050565b60006020820190508181036000830152614d1481614cd8565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614d51601883613fd3565b9150614d5c82614d1b565b602082019050919050565b60006020820190508181036000830152614d8081614d44565b9050919050565b7f73616d6520726f6f7420616e64206c6561662063616e20626520757365206f6e60008201527f6c79206f6e63652e000000000000000000000000000000000000000000000000602082015250565b6000614de3602883613fd3565b9150614dee82614d87565b604082019050919050565b60006020820190508181036000830152614e1281614dd6565b9050919050565b7f766572696669636174696f6e206661696c000000000000000000000000000000600082015250565b6000614e4f601183613fd3565b9150614e5a82614e19565b602082019050919050565b60006020820190508181036000830152614e7e81614e42565b9050919050565b7f546965722073686f756c6420626520696e206265747765656e20312d33000000600082015250565b6000614ebb601d83613fd3565b9150614ec682614e85565b602082019050919050565b60006020820190508181036000830152614eea81614eae565b9050919050565b6000614efc82614083565b9150614f0783614083565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614f3c57614f3b614ad8565b5b828201905092915050565b7f596f752063616e2774206d696e74206d6f7265207468616e2033333300000000600082015250565b6000614f7d601c83613fd3565b9150614f8882614f47565b602082019050919050565b60006020820190508181036000830152614fac81614f70565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061500f602983613fd3565b915061501a82614fb3565b604082019050919050565b6000602082019050818103600083015261503e81615002565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006150a1602d83613fd3565b91506150ac82615045565b604082019050919050565b600060208201905081810360008301526150d081615094565b9050919050565b600081905092915050565b60006150ed82613fc8565b6150f781856150d7565b9350615107818560208601613fe4565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006151496005836150d7565b915061515482615113565b600582019050919050565b600061516b82856150e2565b915061517782846150e2565b91506151828261513c565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151ea602683613fd3565b91506151f58261518e565b604082019050919050565b60006020820190508181036000830152615219816151dd565b9050919050565b6000819050919050565b61523b6152368261437f565b615220565b82525050565b600061524d828561522a565b60208201915061525d828461522a565b6020820191508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006152a3602083613fd3565b91506152ae8261526d565b602082019050919050565b600060208201905081810360008301526152d281615296565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061530f601c83613fd3565b915061531a826152d9565b602082019050919050565b6000602082019050818103600083015261533e81615302565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061537b601983613fd3565b915061538682615345565b602082019050919050565b600060208201905081810360008301526153aa8161536e565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061540d603283613fd3565b9150615418826153b1565b604082019050919050565b6000602082019050818103600083015261543c81615400565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061547d82614083565b915061548883614083565b92508261549857615497615443565b5b828204905092915050565b60006154ae82614083565b91506154b983614083565b9250826154c9576154c8615443565b5b828206905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000615530602583613fd3565b915061553b826154d4565b604082019050919050565b6000602082019050818103600083015261555f81615523565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006155c2602483613fd3565b91506155cd82615566565b604082019050919050565b600060208201905081810360008301526155f1816155b5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061561f826155f8565b6156298185615603565b9350615639818560208601613fe4565b61564281614017565b840191505092915050565b60006080820190506156626000830187614118565b61566f6020830186614118565b61567c604083018561453f565b818103606083015261568e8184615614565b905095945050505050565b6000815190506156a881613f39565b92915050565b6000602082840312156156c4576156c3613f03565b5b60006156d284828501615699565b9150509291505056fea2646970667358221220e281a9c77de0e3d8ec87768ff28c03f6932166e204975320b182e90d14c246e064736f6c634300080d0033
Deployed Bytecode Sourcemap
35841:4778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19988:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20916:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22441:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21959:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38280:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40090:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38834:554;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36344:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20626:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37404:751;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20357:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16316:94;;;:::i;:::-;;16082:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38163:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21085:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36014:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22684:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36049:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39400:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21260:289;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36448:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22910:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16424:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19211:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19988:305;20090:4;20142:25;20127:40;;;:11;:40;;;;:105;;;;20199:33;20184:48;;;:11;:48;;;;20127:105;:158;;;;20249:36;20273:11;20249:23;:36::i;:::-;20127:158;20107:178;;19988:305;;;:::o;20916:100::-;20970:13;21003:5;20996:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20916:100;:::o;22441:171::-;22517:7;22537:23;22552:7;22537:14;:23::i;:::-;22580:15;:24;22596:7;22580:24;;;;;;;;;;;;;;;;;;;;;22573:31;;22441:171;;;:::o;21959:416::-;22040:13;22056:23;22071:7;22056:14;:23::i;:::-;22040:39;;22104:5;22098:11;;:2;:11;;;22090:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22198:5;22182:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22207:37;22224:5;22231:12;:10;:12::i;:::-;22207:16;:37::i;:::-;22182:62;22160:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;22346:21;22355:2;22359:7;22346:8;:21::i;:::-;22029:346;21959:416;;:::o;38280:546::-;38370:4;3504:1;2318:42;3458:43;;;:47;3454:699;;;3745:10;3737:18;;:4;:18;;;3733:85;;38396:12:::1;38424:9:::0;38419:352:::1;38439:8;:14;38448:4;38439:14;;;;;;;;;;;;;;;:21;;;;38435:1;:25;38419:352;;;38507:7;38486:8;:14;38495:4;38486:14;;;;;;;;;;;;;;;38501:1;38486:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;38482:278:::1;;38542:8;:14;38551:4;38542:14;;;;;;;;;;;;;;;38557:1;38542:17;;;;;;;;:::i;:::-;;;;;;;;;;38535:24;;38598:8;:14;38607:4;38598:14;;;;;;;;;;;;;;;38637:1;38613:8;:14;38622:4;38613:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;38598:41;;;;;;;;:::i;:::-;;;;;;;;;;38578:8;:14;38587:4;38578:14;;;;;;;;;;;;;;;38593:1;38578:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;38658:8;:14;38667:4;38658:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38697:8;:12;38706:2;38697:12;;;;;;;;;;;;;;;38715:4;38697:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38739:5;;38482:278;38462:3;;;;;:::i;:::-;;;;38419:352;;;;38781:37;38800:4;38806:2;38810:7;38781:18;:37::i;:::-;38385:441;3796:7:::0;;3733:85;2318:42;3878:40;;;3927:4;3934:10;3878:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2318:42;3974:40;;;4023:4;4030;3974:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3878:157;3832:310;;4115:10;4096:30;;;;;;;;;;;:::i;:::-;;;;;;;;3832:310;3454:699;38396:12:::1;38424:9:::0;38419:352:::1;38439:8;:14;38448:4;38439:14;;;;;;;;;;;;;;;:21;;;;38435:1;:25;38419:352;;;38507:7;38486:8;:14;38495:4;38486:14;;;;;;;;;;;;;;;38501:1;38486:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;38482:278:::1;;38542:8;:14;38551:4;38542:14;;;;;;;;;;;;;;;38557:1;38542:17;;;;;;;;:::i;:::-;;;;;;;;;;38535:24;;38598:8;:14;38607:4;38598:14;;;;;;;;;;;;;;;38637:1;38613:8;:14;38622:4;38613:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;38598:41;;;;;;;;:::i;:::-;;;;;;;;;;38578:8;:14;38587:4;38578:14;;;;;;;;;;;;;;;38593:1;38578:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;38658:8;:14;38667:4;38658:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38697:8;:12;38706:2;38697:12;;;;;;;;;;;;;;;38715:4;38697:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38739:5;;38482:278;38462:3;;;;;:::i;:::-;;;;38419:352;;;;38781:37;38800:4;38806:2;38810:7;38781:18;:37::i;:::-;38385:441;38280:546:::0;;;;;:::o;40090:524::-;40170:10;40150:30;;:16;40158:7;40150;:16::i;:::-;:30;;;40142:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;40242:9;40237:303;40257:8;:20;40266:10;40257:20;;;;;;;;;;;;;;;:27;;;;40253:1;:31;40237:303;;;40337:7;40310:8;:20;40319:10;40310:20;;;;;;;;;;;;;;;40331:1;40310:23;;;;;;;;:::i;:::-;;;;;;;;;;:34;40306:223;;40391:8;:20;40400:10;40391:20;;;;;;;;;;;;;;;40442:1;40412:8;:20;40421:10;40412:20;;;;;;;;;;;;;;;:27;;;;:31;;;;:::i;:::-;40391:53;;;;;;;;:::i;:::-;;;;;;;;;;40365:8;:20;40374:10;40365:20;;;;;;;;;;;;;;;40386:1;40365:23;;;;;;;;:::i;:::-;;;;;;;;;:79;;;;40463:8;:20;40472:10;40463:20;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40508:5;;40306:223;40286:3;;;;;:::i;:::-;;;;40237:303;;;;40550:20;40562:7;40550:11;:20::i;:::-;40586:18;40596:7;40586:18;;;;;;:::i;:::-;;;;;;;;40090:524;:::o;38834:554::-;38930:4;3504:1;2318:42;3458:43;;;:47;3454:699;;;3745:10;3737:18;;:4;:18;;;3733:85;;38956:12:::1;38984:9:::0;38979:352:::1;38999:8;:14;39008:4;38999:14;;;;;;;;;;;;;;;:21;;;;38995:1;:25;38979:352;;;39067:7;39046:8;:14;39055:4;39046:14;;;;;;;;;;;;;;;39061:1;39046:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;39042:278:::1;;39102:8;:14;39111:4;39102:14;;;;;;;;;;;;;;;39117:1;39102:17;;;;;;;;:::i;:::-;;;;;;;;;;39095:24;;39158:8;:14;39167:4;39158:14;;;;;;;;;;;;;;;39197:1;39173:8;:14;39182:4;39173:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;39158:41;;;;;;;;:::i;:::-;;;;;;;;;;39138:8;:14;39147:4;39138:14;;;;;;;;;;;;;;;39153:1;39138:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;39218:8;:14;39227:4;39218:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39257:8;:12;39266:2;39257:12;;;;;;;;;;;;;;;39275:4;39257:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:5;;39042:278;39022:3;;;;;:::i;:::-;;;;38979:352;;;;39341:39;39358:4;39364:2;39368:7;39341:39;;;;;;;;;;;::::0;:16:::1;:39::i;:::-;38945:443;3796:7:::0;;3733:85;2318:42;3878:40;;;3927:4;3934:10;3878:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2318:42;3974:40;;;4023:4;4030;3974:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3878:157;3832:310;;4115:10;4096:30;;;;;;;;;;;:::i;:::-;;;;;;;;3832:310;3454:699;38956:12:::1;38984:9:::0;38979:352:::1;38999:8;:14;39008:4;38999:14;;;;;;;;;;;;;;;:21;;;;38995:1;:25;38979:352;;;39067:7;39046:8;:14;39055:4;39046:14;;;;;;;;;;;;;;;39061:1;39046:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;39042:278:::1;;39102:8;:14;39111:4;39102:14;;;;;;;;;;;;;;;39117:1;39102:17;;;;;;;;:::i;:::-;;;;;;;;;;39095:24;;39158:8;:14;39167:4;39158:14;;;;;;;;;;;;;;;39197:1;39173:8;:14;39182:4;39173:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;39158:41;;;;;;;;:::i;:::-;;;;;;;;;;39138:8;:14;39147:4;39138:14;;;;;;;;;;;;;;;39153:1;39138:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;39218:8;:14;39227:4;39218:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39257:8;:12;39266:2;39257:12;;;;;;;;;;;;;;;39275:4;39257:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:5;;39042:278;39022:3;;;;;:::i;:::-;;;;38979:352;;;;39341:39;39358:4;39364:2;39368:7;39341:39;;;;;;;;;;;::::0;:16:::1;:39::i;:::-;38945:443;38834:554:::0;;;;;:::o;36344:96::-;16234:12;:10;:12::i;:::-;16223:23;;:7;:5;:7::i;:::-;:23;;;16215:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36424:8:::1;36414:7;:18;;;;;;;;;;;;:::i;:::-;;36344:96:::0;:::o;20626:223::-;20698:7;20718:13;20734:17;20743:7;20734:8;:17::i;:::-;20718:33;;20787:1;20770:19;;:5;:19;;;20762:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;20836:5;20829:12;;;20626:223;;;:::o;37404:751::-;37580:5;37541:44;;:9;:28;37551:10;:17;37562:5;37551:17;;;;;;;;;;;;37541:28;;;;;;;;;;;:35;37570:5;37541:35;;;;;;;;;;;;;;;;;;;;;:44;;;37533:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;37649:38;37656:10;:17;37667:5;37656:17;;;;;;;;;;;;37674:5;37680:6;;37649:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;:38::i;:::-;37641:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37736:1;37728:5;:9;:22;;;;;37749:1;37741:5;:9;37728:22;37720:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;37828:7;;37818:5;37803:11;;:20;;;;:::i;:::-;37802:33;;37794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37884:6;37880:237;37900:5;37896:1;:9;37880:237;;;37926:29;37932:10;37944:7;;37952:1;37944:10;;;;;;;:::i;:::-;;;;;;;;37926:5;:29::i;:::-;37970:8;:20;37979:10;37970:20;;;;;;;;;;;;;;;37996:7;;38004:1;37996:10;;;;;;;:::i;:::-;;;;;;;;37970:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38060:4;38022:9;:28;38032:10;:17;38043:5;38032:17;;;;;;;;;;;;38022:28;;;;;;;;;;;:35;38051:5;38022:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;38084:21;38094:7;;38102:1;38094:10;;;;;;;:::i;:::-;;;;;;;;38084:21;;;;;;:::i;:::-;;;;;;;;37907:3;;;;;:::i;:::-;;;;37880:237;;;;38142:5;38127:11;;:20;;;;;;;:::i;:::-;;;;;;;;37404:751;;;;;;:::o;20357:207::-;20429:7;20474:1;20457:19;;:5;:19;;;20449:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20540:9;:16;20550:5;20540:16;;;;;;;;;;;;;;;;20533:23;;20357:207;;;:::o;16316:94::-;16234:12;:10;:12::i;:::-;16223:23;;:7;:5;:7::i;:::-;:23;;;16215:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16381:21:::1;16399:1;16381:9;:21::i;:::-;16316:94::o:0;16082:87::-;16128:7;16155:6;;;;;;;;;;;16148:13;;16082:87;:::o;38163:109::-;38215:16;38250:8;:14;38259:4;38250:14;;;;;;;;;;;;;;;38243:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38163:109;;;:::o;21085:104::-;21141:13;21174:7;21167:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21085:104;:::o;36014:28::-;;;;:::o;22684:155::-;22779:52;22798:12;:10;:12::i;:::-;22812:8;22822;22779:18;:52::i;:::-;22684:155;;:::o;36049:26::-;;;;:::o;39400:682::-;39515:4;3504:1;2318:42;3458:43;;;:47;3454:699;;;3745:10;3737:18;;:4;:18;;;3733:85;;39549:41:::1;39568:12;:10;:12::i;:::-;39582:7;39549:18;:41::i;:::-;39541:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39651:12;39679:9:::0;39674:352:::1;39694:8;:14;39703:4;39694:14;;;;;;;;;;;;;;;:21;;;;39690:1;:25;39674:352;;;39762:7;39741:8;:14;39750:4;39741:14;;;;;;;;;;;;;;;39756:1;39741:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;39737:278:::1;;39797:8;:14;39806:4;39797:14;;;;;;;;;;;;;;;39812:1;39797:17;;;;;;;;:::i;:::-;;;;;;;;;;39790:24;;39853:8;:14;39862:4;39853:14;;;;;;;;;;;;;;;39892:1;39868:8;:14;39877:4;39868:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;39853:41;;;;;;;;:::i;:::-;;;;;;;;;;39833:8;:14;39842:4;39833:14;;;;;;;;;;;;;;;39848:1;39833:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;39913:8;:14;39922:4;39913:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39952:8;:12;39961:2;39952:12;;;;;;;;;;;;;;;39970:4;39952:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39994:5;;39737:278;39717:3;;;;;:::i;:::-;;;;39674:352;;;;40036:38;40050:4;40056:2;40060:7;40069:4;40036:13;:38::i;:::-;39530:552;3796:7:::0;;3733:85;2318:42;3878:40;;;3927:4;3934:10;3878:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;2318:42;3974:40;;;4023:4;4030;3974:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3878:157;3832:310;;4115:10;4096:30;;;;;;;;;;;:::i;:::-;;;;;;;;3832:310;3454:699;39549:41:::1;39568:12;:10;:12::i;:::-;39582:7;39549:18;:41::i;:::-;39541:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39651:12;39679:9:::0;39674:352:::1;39694:8;:14;39703:4;39694:14;;;;;;;;;;;;;;;:21;;;;39690:1;:25;39674:352;;;39762:7;39741:8;:14;39750:4;39741:14;;;;;;;;;;;;;;;39756:1;39741:17;;;;;;;;:::i;:::-;;;;;;;;;;:28:::0;39737:278:::1;;39797:8;:14;39806:4;39797:14;;;;;;;;;;;;;;;39812:1;39797:17;;;;;;;;:::i;:::-;;;;;;;;;;39790:24;;39853:8;:14;39862:4;39853:14;;;;;;;;;;;;;;;39892:1;39868:8;:14;39877:4;39868:14;;;;;;;;;;;;;;;:21;;;;:25;;;;:::i;:::-;39853:41;;;;;;;;:::i;:::-;;;;;;;;;;39833:8;:14;39842:4;39833:14;;;;;;;;;;;;;;;39848:1;39833:17;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;39913:8;:14;39922:4;39913:14;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39952:8;:12;39961:2;39952:12;;;;;;;;;;;;;;;39970:4;39952:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39994:5;;39737:278;39717:3;;;;;:::i;:::-;;;;39674:352;;;;40036:38;40050:4;40056:2;40060:7;40069:4;40036:13;:38::i;:::-;39530:552;39400:682:::0;;;;;;:::o;21260:289::-;21333:13;21359:23;21374:7;21359:14;:23::i;:::-;21395:21;21419:10;:8;:10::i;:::-;21395:34;;21471:1;21453:7;21447:21;:25;:94;;;;;;;;;;;;;;;;;21499:7;21508:18;:7;:16;:18::i;:::-;21482:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21447:94;21440:101;;;21260:289;;;:::o;36448:156::-;16234:12;:10;:12::i;:::-;16223:23;;:7;:5;:7::i;:::-;:23;;;16215:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36522:6:::1;36518:79;36538:1;36534;:5;36518:79;;;36578:4;36583:1;36578:7;;;;;;;;:::i;:::-;;;;;;;;36560:10;:15;36573:1;36571;:3;;;;:::i;:::-;36560:15;;;;;;;;;;;:25;;;;36541:3;;;;;:::i;:::-;;;;36518:79;;;;36448:156:::0;:::o;22910:164::-;23007:4;23031:18;:25;23050:5;23031:25;;;;;;;;;;;;;;;:35;23057:8;23031:35;;;;;;;;;;;;;;;;;;;;;;;;;23024:42;;22910:164;;;;:::o;16424:229::-;16234:12;:10;:12::i;:::-;16223:23;;:7;:5;:7::i;:::-;:23;;;16215:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16547:1:::1;16527:22;;:8;:22;;::::0;16505:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;16626:19;16636:8;16626:9;:19::i;:::-;16424:229:::0;:::o;19211:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15603:207::-;15733:4;15777:25;15762:40;;;:11;:40;;;;15755:47;;15603:207;;;:::o;32260:135::-;32342:16;32350:7;32342;:16::i;:::-;32334:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;32260:135;:::o;13555:98::-;13608:7;13635:10;13628:17;;13555:98;:::o;31539:174::-;31641:2;31614:15;:24;31630:7;31614:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31697:7;31693:2;31659:46;;31668:23;31683:7;31668:14;:23::i;:::-;31659:46;;;;;;;;;;;;31539:174;;:::o;23141:335::-;23336:41;23355:12;:10;:12::i;:::-;23369:7;23336:18;:41::i;:::-;23328:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;23440:28;23450:4;23456:2;23460:7;23440:9;:28::i;:::-;23141:335;;;:::o;29037:783::-;29097:13;29113:23;29128:7;29113:14;:23::i;:::-;29097:39;;29149:51;29170:5;29185:1;29189:7;29198:1;29149:20;:51::i;:::-;29313:23;29328:7;29313:14;:23::i;:::-;29305:31;;29384:15;:24;29400:7;29384:24;;;;;;;;;;;;29377:31;;;;;;;;;;;29649:1;29629:9;:16;29639:5;29629:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;29679:7;:16;29687:7;29679:16;;;;;;;;;;;;29672:23;;;;;;;;;;;29741:7;29737:1;29713:36;;29722:5;29713:36;;;;;;;;;;;;29762:50;29782:5;29797:1;29801:7;29810:1;29762:19;:50::i;:::-;29086:734;29037:783;:::o;25433:117::-;25499:7;25526;:16;25534:7;25526:16;;;;;;;;;;;;;;;;;;;;;25519:23;;25433:117;;;:::o;36612:784::-;36702:4;36718:20;36741:4;36718:27;;36763:9;36758:515;36782:5;:12;36778:1;:16;36758:515;;;36816:20;36839:5;36845:1;36839:8;;;;;;;;:::i;:::-;;;;;;;;36816:31;;36884:12;36868;:28;36864:398;;37030:12;37044;37013:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37003:55;;;;;;36988:70;;36864:398;;;37218:12;37232;37201:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37191:55;;;;;;37176:70;;36864:398;36801:472;36796:3;;;;;:::i;:::-;;;;36758:515;;;;37384:4;37368:12;:20;37361:27;;;36612:784;;;;;:::o;27756:942::-;27850:1;27836:16;;:2;:16;;;27828:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27909:16;27917:7;27909;:16::i;:::-;27908:17;27900:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27971:48;28000:1;28004:2;28008:7;28017:1;27971:20;:48::i;:::-;28118:16;28126:7;28118;:16::i;:::-;28117:17;28109:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28533:1;28516:9;:13;28526:2;28516:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;28577:2;28558:7;:16;28566:7;28558:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28622:7;28618:2;28597:33;;28614:1;28597:33;;;;;;;;;;;;28643:47;28671:1;28675:2;28679:7;28688:1;28643:19;:47::i;:::-;27756:942;;:::o;16661:173::-;16717:16;16736:6;;;;;;;;;;;16717:25;;16762:8;16753:6;;:17;;;;;;;;;;;;;;;;;;16817:8;16786:40;;16807:8;16786:40;;;;;;;;;;;;16706:128;16661:173;:::o;31856:315::-;32011:8;32002:17;;:5;:17;;;31994:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32098:8;32060:18;:25;32079:5;32060:25;;;;;;;;;;;;;;;:35;32086:8;32060:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32144:8;32122:41;;32137:5;32122:41;;;32154:8;32122:41;;;;;;:::i;:::-;;;;;;;;31856:315;;;:::o;26158:264::-;26251:4;26268:13;26284:23;26299:7;26284:14;:23::i;:::-;26268:39;;26337:5;26326:16;;:7;:16;;;:52;;;;26346:32;26363:5;26370:7;26346:16;:32::i;:::-;26326:52;:87;;;;26406:7;26382:31;;:20;26394:7;26382:11;:20::i;:::-;:31;;;26326:87;26318:96;;;26158:264;;;;:::o;25006:313::-;25162:28;25172:4;25178:2;25182:7;25162:9;:28::i;:::-;25209:47;25232:4;25238:2;25242:7;25251:4;25209:22;:47::i;:::-;25201:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;25006:313;;;;:::o;21798:99::-;21849:13;21882:7;21875:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21798:99;:::o;13859:723::-;13915:13;14145:1;14136:5;:10;14132:53;;14163:10;;;;;;;;;;;;;;;;;;;;;14132:53;14195:12;14210:5;14195:20;;14226:14;14251:78;14266:1;14258:4;:9;14251:78;;14284:8;;;;;:::i;:::-;;;;14315:2;14307:10;;;;;:::i;:::-;;;14251:78;;;14339:19;14371:6;14361:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14339:39;;14389:154;14405:1;14396:5;:10;14389:154;;14433:1;14423:11;;;;;:::i;:::-;;;14500:2;14492:5;:10;;;;:::i;:::-;14479:2;:24;;;;:::i;:::-;14466:39;;14449:6;14456;14449:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14529:2;14520:11;;;;;:::i;:::-;;;14389:154;;;14567:6;14553:21;;;;;13859:723;;;;:::o;25863:128::-;25928:4;25981:1;25952:31;;:17;25961:7;25952:8;:17::i;:::-;:31;;;;25945:38;;25863:128;;;:::o;30157:1263::-;30316:4;30289:31;;:23;30304:7;30289:14;:23::i;:::-;:31;;;30281:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30395:1;30381:16;;:2;:16;;;30373:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30451:42;30472:4;30478:2;30482:7;30491:1;30451:20;:42::i;:::-;30623:4;30596:31;;:23;30611:7;30596:14;:23::i;:::-;:31;;;30588:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30741:15;:24;30757:7;30741:24;;;;;;;;;;;;30734:31;;;;;;;;;;;31236:1;31217:9;:15;31227:4;31217:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;31269:1;31252:9;:13;31262:2;31252:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;31311:2;31292:7;:16;31300:7;31292:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31350:7;31346:2;31331:27;;31340:4;31331:27;;;;;;;;;;;;31371:41;31391:4;31397:2;31401:7;31410:1;31371:19;:41::i;:::-;30157:1263;;;:::o;34544:410::-;34734:1;34722:9;:13;34718:229;;;34772:1;34756:18;;:4;:18;;;34752:87;;34814:9;34795;:15;34805:4;34795:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;34752:87;34871:1;34857:16;;:2;:16;;;34853:83;;34911:9;34894;:13;34904:2;34894:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;34853:83;34718:229;34544:410;;;;:::o;35676:158::-;;;;;:::o;32959:853::-;33113:4;33134:15;:2;:13;;;:15::i;:::-;33130:675;;;33186:2;33170:36;;;33207:12;:10;:12::i;:::-;33221:4;33227:7;33236:4;33170:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33166:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33428:1;33411:6;:13;:18;33407:328;;33454:60;;;;;;;;;;:::i;:::-;;;;;;;;33407:328;33685:6;33679:13;33670:6;33666:2;33662:15;33655:38;33166:584;33302:41;;;33292:51;;;:6;:51;;;;33285:58;;;;;33130:675;33789:4;33782:11;;32959:853;;;;;;;:::o;5506:205::-;5566:4;5592:12;5659:7;5647:20;5639:28;;5702:1;5695:4;:8;5688:15;;;5506:205;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:117::-;5672:1;5669;5662:12;5686:117;5795:1;5792;5785:12;5809:180;5857:77;5854:1;5847:88;5954:4;5951:1;5944:15;5978:4;5975:1;5968:15;5995:281;6078:27;6100:4;6078:27;:::i;:::-;6070:6;6066:40;6208:6;6196:10;6193:22;6172:18;6160:10;6157:34;6154:62;6151:88;;;6219:18;;:::i;:::-;6151:88;6259:10;6255:2;6248:22;6038:238;5995:281;;:::o;6282:129::-;6316:6;6343:20;;:::i;:::-;6333:30;;6372:33;6400:4;6392:6;6372:33;:::i;:::-;6282:129;;;:::o;6417:308::-;6479:4;6569:18;6561:6;6558:30;6555:56;;;6591:18;;:::i;:::-;6555:56;6629:29;6651:6;6629:29;:::i;:::-;6621:37;;6713:4;6707;6703:15;6695:23;;6417:308;;;:::o;6731:154::-;6815:6;6810:3;6805;6792:30;6877:1;6868:6;6863:3;6859:16;6852:27;6731:154;;;:::o;6891:412::-;6969:5;6994:66;7010:49;7052:6;7010:49;:::i;:::-;6994:66;:::i;:::-;6985:75;;7083:6;7076:5;7069:21;7121:4;7114:5;7110:16;7159:3;7150:6;7145:3;7141:16;7138:25;7135:112;;;7166:79;;:::i;:::-;7135:112;7256:41;7290:6;7285:3;7280;7256:41;:::i;:::-;6975:328;6891:412;;;;;:::o;7323:340::-;7379:5;7428:3;7421:4;7413:6;7409:17;7405:27;7395:122;;7436:79;;:::i;:::-;7395:122;7553:6;7540:20;7578:79;7653:3;7645:6;7638:4;7630:6;7626:17;7578:79;:::i;:::-;7569:88;;7385:278;7323:340;;;;:::o;7669:509::-;7738:6;7787:2;7775:9;7766:7;7762:23;7758:32;7755:119;;;7793:79;;:::i;:::-;7755:119;7941:1;7930:9;7926:17;7913:31;7971:18;7963:6;7960:30;7957:117;;;7993:79;;:::i;:::-;7957:117;8098:63;8153:7;8144:6;8133:9;8129:22;8098:63;:::i;:::-;8088:73;;7884:287;7669:509;;;;:::o;8184:77::-;8221:7;8250:5;8239:16;;8184:77;;;:::o;8267:122::-;8340:24;8358:5;8340:24;:::i;:::-;8333:5;8330:35;8320:63;;8379:1;8376;8369:12;8320:63;8267:122;:::o;8395:139::-;8441:5;8479:6;8466:20;8457:29;;8495:33;8522:5;8495:33;:::i;:::-;8395:139;;;;:::o;8540:117::-;8649:1;8646;8639:12;8663:117;8772:1;8769;8762:12;8803:568;8876:8;8886:6;8936:3;8929:4;8921:6;8917:17;8913:27;8903:122;;8944:79;;:::i;:::-;8903:122;9057:6;9044:20;9034:30;;9087:18;9079:6;9076:30;9073:117;;;9109:79;;:::i;:::-;9073:117;9223:4;9215:6;9211:17;9199:29;;9277:3;9269:4;9261:6;9257:17;9247:8;9243:32;9240:41;9237:128;;;9284:79;;:::i;:::-;9237:128;8803:568;;;;;:::o;9394:::-;9467:8;9477:6;9527:3;9520:4;9512:6;9508:17;9504:27;9494:122;;9535:79;;:::i;:::-;9494:122;9648:6;9635:20;9625:30;;9678:18;9670:6;9667:30;9664:117;;;9700:79;;:::i;:::-;9664:117;9814:4;9806:6;9802:17;9790:29;;9868:3;9860:4;9852:6;9848:17;9838:8;9834:32;9831:41;9828:128;;;9875:79;;:::i;:::-;9828:128;9394:568;;;;;:::o;9968:1225::-;10108:6;10116;10124;10132;10140;10148;10197:3;10185:9;10176:7;10172:23;10168:33;10165:120;;;10204:79;;:::i;:::-;10165:120;10324:1;10349:53;10394:7;10385:6;10374:9;10370:22;10349:53;:::i;:::-;10339:63;;10295:117;10451:2;10477:53;10522:7;10513:6;10502:9;10498:22;10477:53;:::i;:::-;10467:63;;10422:118;10607:2;10596:9;10592:18;10579:32;10638:18;10630:6;10627:30;10624:117;;;10660:79;;:::i;:::-;10624:117;10773:80;10845:7;10836:6;10825:9;10821:22;10773:80;:::i;:::-;10755:98;;;;10550:313;10930:2;10919:9;10915:18;10902:32;10961:18;10953:6;10950:30;10947:117;;;10983:79;;:::i;:::-;10947:117;11096:80;11168:7;11159:6;11148:9;11144:22;11096:80;:::i;:::-;11078:98;;;;10873:313;9968:1225;;;;;;;;:::o;11199:329::-;11258:6;11307:2;11295:9;11286:7;11282:23;11278:32;11275:119;;;11313:79;;:::i;:::-;11275:119;11433:1;11458:53;11503:7;11494:6;11483:9;11479:22;11458:53;:::i;:::-;11448:63;;11404:117;11199:329;;;;:::o;11534:118::-;11621:24;11639:5;11621:24;:::i;:::-;11616:3;11609:37;11534:118;;:::o;11658:222::-;11751:4;11789:2;11778:9;11774:18;11766:26;;11802:71;11870:1;11859:9;11855:17;11846:6;11802:71;:::i;:::-;11658:222;;;;:::o;11886:114::-;11953:6;11987:5;11981:12;11971:22;;11886:114;;;:::o;12006:184::-;12105:11;12139:6;12134:3;12127:19;12179:4;12174:3;12170:14;12155:29;;12006:184;;;;:::o;12196:132::-;12263:4;12286:3;12278:11;;12316:4;12311:3;12307:14;12299:22;;12196:132;;;:::o;12334:108::-;12411:24;12429:5;12411:24;:::i;:::-;12406:3;12399:37;12334:108;;:::o;12448:179::-;12517:10;12538:46;12580:3;12572:6;12538:46;:::i;:::-;12616:4;12611:3;12607:14;12593:28;;12448:179;;;;:::o;12633:113::-;12703:4;12735;12730:3;12726:14;12718:22;;12633:113;;;:::o;12782:732::-;12901:3;12930:54;12978:5;12930:54;:::i;:::-;13000:86;13079:6;13074:3;13000:86;:::i;:::-;12993:93;;13110:56;13160:5;13110:56;:::i;:::-;13189:7;13220:1;13205:284;13230:6;13227:1;13224:13;13205:284;;;13306:6;13300:13;13333:63;13392:3;13377:13;13333:63;:::i;:::-;13326:70;;13419:60;13472:6;13419:60;:::i;:::-;13409:70;;13265:224;13252:1;13249;13245:9;13240:14;;13205:284;;;13209:14;13505:3;13498:10;;12906:608;;;12782:732;;;;:::o;13520:373::-;13663:4;13701:2;13690:9;13686:18;13678:26;;13750:9;13744:4;13740:20;13736:1;13725:9;13721:17;13714:47;13778:108;13881:4;13872:6;13778:108;:::i;:::-;13770:116;;13520:373;;;;:::o;13899:116::-;13969:21;13984:5;13969:21;:::i;:::-;13962:5;13959:32;13949:60;;14005:1;14002;13995:12;13949:60;13899:116;:::o;14021:133::-;14064:5;14102:6;14089:20;14080:29;;14118:30;14142:5;14118:30;:::i;:::-;14021:133;;;;:::o;14160:468::-;14225:6;14233;14282:2;14270:9;14261:7;14257:23;14253:32;14250:119;;;14288:79;;:::i;:::-;14250:119;14408:1;14433:53;14478:7;14469:6;14458:9;14454:22;14433:53;:::i;:::-;14423:63;;14379:117;14535:2;14561:50;14603:7;14594:6;14583:9;14579:22;14561:50;:::i;:::-;14551:60;;14506:115;14160:468;;;;;:::o;14634:307::-;14695:4;14785:18;14777:6;14774:30;14771:56;;;14807:18;;:::i;:::-;14771:56;14845:29;14867:6;14845:29;:::i;:::-;14837:37;;14929:4;14923;14919:15;14911:23;;14634:307;;;:::o;14947:410::-;15024:5;15049:65;15065:48;15106:6;15065:48;:::i;:::-;15049:65;:::i;:::-;15040:74;;15137:6;15130:5;15123:21;15175:4;15168:5;15164:16;15213:3;15204:6;15199:3;15195:16;15192:25;15189:112;;;15220:79;;:::i;:::-;15189:112;15310:41;15344:6;15339:3;15334;15310:41;:::i;:::-;15030:327;14947:410;;;;;:::o;15376:338::-;15431:5;15480:3;15473:4;15465:6;15461:17;15457:27;15447:122;;15488:79;;:::i;:::-;15447:122;15605:6;15592:20;15630:78;15704:3;15696:6;15689:4;15681:6;15677:17;15630:78;:::i;:::-;15621:87;;15437:277;15376:338;;;;:::o;15720:943::-;15815:6;15823;15831;15839;15888:3;15876:9;15867:7;15863:23;15859:33;15856:120;;;15895:79;;:::i;:::-;15856:120;16015:1;16040:53;16085:7;16076:6;16065:9;16061:22;16040:53;:::i;:::-;16030:63;;15986:117;16142:2;16168:53;16213:7;16204:6;16193:9;16189:22;16168:53;:::i;:::-;16158:63;;16113:118;16270:2;16296:53;16341:7;16332:6;16321:9;16317:22;16296:53;:::i;:::-;16286:63;;16241:118;16426:2;16415:9;16411:18;16398:32;16457:18;16449:6;16446:30;16443:117;;;16479:79;;:::i;:::-;16443:117;16584:62;16638:7;16629:6;16618:9;16614:22;16584:62;:::i;:::-;16574:72;;16369:287;15720:943;;;;;;;:::o;16669:311::-;16746:4;16836:18;16828:6;16825:30;16822:56;;;16858:18;;:::i;:::-;16822:56;16908:4;16900:6;16896:17;16888:25;;16968:4;16962;16958:15;16950:23;;16669:311;;;:::o;17003:710::-;17099:5;17124:81;17140:64;17197:6;17140:64;:::i;:::-;17124:81;:::i;:::-;17115:90;;17225:5;17254:6;17247:5;17240:21;17288:4;17281:5;17277:16;17270:23;;17341:4;17333:6;17329:17;17321:6;17317:30;17370:3;17362:6;17359:15;17356:122;;;17389:79;;:::i;:::-;17356:122;17504:6;17487:220;17521:6;17516:3;17513:15;17487:220;;;17596:3;17625:37;17658:3;17646:10;17625:37;:::i;:::-;17620:3;17613:50;17692:4;17687:3;17683:14;17676:21;;17563:144;17547:4;17542:3;17538:14;17531:21;;17487:220;;;17491:21;17105:608;;17003:710;;;;;:::o;17736:370::-;17807:5;17856:3;17849:4;17841:6;17837:17;17833:27;17823:122;;17864:79;;:::i;:::-;17823:122;17981:6;17968:20;18006:94;18096:3;18088:6;18081:4;18073:6;18069:17;18006:94;:::i;:::-;17997:103;;17813:293;17736:370;;;;:::o;18112:539::-;18196:6;18245:2;18233:9;18224:7;18220:23;18216:32;18213:119;;;18251:79;;:::i;:::-;18213:119;18399:1;18388:9;18384:17;18371:31;18429:18;18421:6;18418:30;18415:117;;;18451:79;;:::i;:::-;18415:117;18556:78;18626:7;18617:6;18606:9;18602:22;18556:78;:::i;:::-;18546:88;;18342:302;18112:539;;;;:::o;18657:474::-;18725:6;18733;18782:2;18770:9;18761:7;18757:23;18753:32;18750:119;;;18788:79;;:::i;:::-;18750:119;18908:1;18933:53;18978:7;18969:6;18958:9;18954:22;18933:53;:::i;:::-;18923:63;;18879:117;19035:2;19061:53;19106:7;19097:6;19086:9;19082:22;19061:53;:::i;:::-;19051:63;;19006:118;18657:474;;;;;:::o;19137:180::-;19185:77;19182:1;19175:88;19282:4;19279:1;19272:15;19306:4;19303:1;19296:15;19323:320;19367:6;19404:1;19398:4;19394:12;19384:22;;19451:1;19445:4;19441:12;19472:18;19462:81;;19528:4;19520:6;19516:17;19506:27;;19462:81;19590:2;19582:6;19579:14;19559:18;19556:38;19553:84;;19609:18;;:::i;:::-;19553:84;19374:269;19323:320;;;:::o;19649:220::-;19789:34;19785:1;19777:6;19773:14;19766:58;19858:3;19853:2;19845:6;19841:15;19834:28;19649:220;:::o;19875:366::-;20017:3;20038:67;20102:2;20097:3;20038:67;:::i;:::-;20031:74;;20114:93;20203:3;20114:93;:::i;:::-;20232:2;20227:3;20223:12;20216:19;;19875:366;;;:::o;20247:419::-;20413:4;20451:2;20440:9;20436:18;20428:26;;20500:9;20494:4;20490:20;20486:1;20475:9;20471:17;20464:47;20528:131;20654:4;20528:131;:::i;:::-;20520:139;;20247:419;;;:::o;20672:248::-;20812:34;20808:1;20800:6;20796:14;20789:58;20881:31;20876:2;20868:6;20864:15;20857:56;20672:248;:::o;20926:366::-;21068:3;21089:67;21153:2;21148:3;21089:67;:::i;:::-;21082:74;;21165:93;21254:3;21165:93;:::i;:::-;21283:2;21278:3;21274:12;21267:19;;20926:366;;;:::o;21298:419::-;21464:4;21502:2;21491:9;21487:18;21479:26;;21551:9;21545:4;21541:20;21537:1;21526:9;21522:17;21515:47;21579:131;21705:4;21579:131;:::i;:::-;21571:139;;21298:419;;;:::o;21723:180::-;21771:77;21768:1;21761:88;21868:4;21865:1;21858:15;21892:4;21889:1;21882:15;21909:180;21957:77;21954:1;21947:88;22054:4;22051:1;22044:15;22078:4;22075:1;22068:15;22095:191;22135:4;22155:20;22173:1;22155:20;:::i;:::-;22150:25;;22189:20;22207:1;22189:20;:::i;:::-;22184:25;;22228:1;22225;22222:8;22219:34;;;22233:18;;:::i;:::-;22219:34;22278:1;22275;22271:9;22263:17;;22095:191;;;;:::o;22292:180::-;22340:77;22337:1;22330:88;22437:4;22434:1;22427:15;22461:4;22458:1;22451:15;22478:233;22517:3;22540:24;22558:5;22540:24;:::i;:::-;22531:33;;22586:66;22579:5;22576:77;22573:103;;22656:18;;:::i;:::-;22573:103;22703:1;22696:5;22692:13;22685:20;;22478:233;;;:::o;22717:332::-;22838:4;22876:2;22865:9;22861:18;22853:26;;22889:71;22957:1;22946:9;22942:17;22933:6;22889:71;:::i;:::-;22970:72;23038:2;23027:9;23023:18;23014:6;22970:72;:::i;:::-;22717:332;;;;;:::o;23055:137::-;23109:5;23140:6;23134:13;23125:22;;23156:30;23180:5;23156:30;:::i;:::-;23055:137;;;;:::o;23198:345::-;23265:6;23314:2;23302:9;23293:7;23289:23;23285:32;23282:119;;;23320:79;;:::i;:::-;23282:119;23440:1;23465:61;23518:7;23509:6;23498:9;23494:22;23465:61;:::i;:::-;23455:71;;23411:125;23198:345;;;;:::o;23549:228::-;23689:34;23685:1;23677:6;23673:14;23666:58;23758:11;23753:2;23745:6;23741:15;23734:36;23549:228;:::o;23783:366::-;23925:3;23946:67;24010:2;24005:3;23946:67;:::i;:::-;23939:74;;24022:93;24111:3;24022:93;:::i;:::-;24140:2;24135:3;24131:12;24124:19;;23783:366;;;:::o;24155:419::-;24321:4;24359:2;24348:9;24344:18;24336:26;;24408:9;24402:4;24398:20;24394:1;24383:9;24379:17;24372:47;24436:131;24562:4;24436:131;:::i;:::-;24428:139;;24155:419;;;:::o;24580:182::-;24720:34;24716:1;24708:6;24704:14;24697:58;24580:182;:::o;24768:366::-;24910:3;24931:67;24995:2;24990:3;24931:67;:::i;:::-;24924:74;;25007:93;25096:3;25007:93;:::i;:::-;25125:2;25120:3;25116:12;25109:19;;24768:366;;;:::o;25140:419::-;25306:4;25344:2;25333:9;25329:18;25321:26;;25393:9;25387:4;25383:20;25379:1;25368:9;25364:17;25357:47;25421:131;25547:4;25421:131;:::i;:::-;25413:139;;25140:419;;;:::o;25565:174::-;25705:26;25701:1;25693:6;25689:14;25682:50;25565:174;:::o;25745:366::-;25887:3;25908:67;25972:2;25967:3;25908:67;:::i;:::-;25901:74;;25984:93;26073:3;25984:93;:::i;:::-;26102:2;26097:3;26093:12;26086:19;;25745:366;;;:::o;26117:419::-;26283:4;26321:2;26310:9;26306:18;26298:26;;26370:9;26364:4;26360:20;26356:1;26345:9;26341:17;26334:47;26398:131;26524:4;26398:131;:::i;:::-;26390:139;;26117:419;;;:::o;26542:227::-;26682:34;26678:1;26670:6;26666:14;26659:58;26751:10;26746:2;26738:6;26734:15;26727:35;26542:227;:::o;26775:366::-;26917:3;26938:67;27002:2;26997:3;26938:67;:::i;:::-;26931:74;;27014:93;27103:3;27014:93;:::i;:::-;27132:2;27127:3;27123:12;27116:19;;26775:366;;;:::o;27147:419::-;27313:4;27351:2;27340:9;27336:18;27328:26;;27400:9;27394:4;27390:20;27386:1;27375:9;27371:17;27364:47;27428:131;27554:4;27428:131;:::i;:::-;27420:139;;27147:419;;;:::o;27572:167::-;27712:19;27708:1;27700:6;27696:14;27689:43;27572:167;:::o;27745:366::-;27887:3;27908:67;27972:2;27967:3;27908:67;:::i;:::-;27901:74;;27984:93;28073:3;27984:93;:::i;:::-;28102:2;28097:3;28093:12;28086:19;;27745:366;;;:::o;28117:419::-;28283:4;28321:2;28310:9;28306:18;28298:26;;28370:9;28364:4;28360:20;28356:1;28345:9;28341:17;28334:47;28398:131;28524:4;28398:131;:::i;:::-;28390:139;;28117:419;;;:::o;28542:179::-;28682:31;28678:1;28670:6;28666:14;28659:55;28542:179;:::o;28727:366::-;28869:3;28890:67;28954:2;28949:3;28890:67;:::i;:::-;28883:74;;28966:93;29055:3;28966:93;:::i;:::-;29084:2;29079:3;29075:12;29068:19;;28727:366;;;:::o;29099:419::-;29265:4;29303:2;29292:9;29288:18;29280:26;;29352:9;29346:4;29342:20;29338:1;29327:9;29323:17;29316:47;29380:131;29506:4;29380:131;:::i;:::-;29372:139;;29099:419;;;:::o;29524:305::-;29564:3;29583:20;29601:1;29583:20;:::i;:::-;29578:25;;29617:20;29635:1;29617:20;:::i;:::-;29612:25;;29771:1;29703:66;29699:74;29696:1;29693:81;29690:107;;;29777:18;;:::i;:::-;29690:107;29821:1;29818;29814:9;29807:16;;29524:305;;;;:::o;29835:178::-;29975:30;29971:1;29963:6;29959:14;29952:54;29835:178;:::o;30019:366::-;30161:3;30182:67;30246:2;30241:3;30182:67;:::i;:::-;30175:74;;30258:93;30347:3;30258:93;:::i;:::-;30376:2;30371:3;30367:12;30360:19;;30019:366;;;:::o;30391:419::-;30557:4;30595:2;30584:9;30580:18;30572:26;;30644:9;30638:4;30634:20;30630:1;30619:9;30615:17;30608:47;30672:131;30798:4;30672:131;:::i;:::-;30664:139;;30391:419;;;:::o;30816:228::-;30956:34;30952:1;30944:6;30940:14;30933:58;31025:11;31020:2;31012:6;31008:15;31001:36;30816:228;:::o;31050:366::-;31192:3;31213:67;31277:2;31272:3;31213:67;:::i;:::-;31206:74;;31289:93;31378:3;31289:93;:::i;:::-;31407:2;31402:3;31398:12;31391:19;;31050:366;;;:::o;31422:419::-;31588:4;31626:2;31615:9;31611:18;31603:26;;31675:9;31669:4;31665:20;31661:1;31650:9;31646:17;31639:47;31703:131;31829:4;31703:131;:::i;:::-;31695:139;;31422:419;;;:::o;31847:232::-;31987:34;31983:1;31975:6;31971:14;31964:58;32056:15;32051:2;32043:6;32039:15;32032:40;31847:232;:::o;32085:366::-;32227:3;32248:67;32312:2;32307:3;32248:67;:::i;:::-;32241:74;;32324:93;32413:3;32324:93;:::i;:::-;32442:2;32437:3;32433:12;32426:19;;32085:366;;;:::o;32457:419::-;32623:4;32661:2;32650:9;32646:18;32638:26;;32710:9;32704:4;32700:20;32696:1;32685:9;32681:17;32674:47;32738:131;32864:4;32738:131;:::i;:::-;32730:139;;32457:419;;;:::o;32882:148::-;32984:11;33021:3;33006:18;;32882:148;;;;:::o;33036:377::-;33142:3;33170:39;33203:5;33170:39;:::i;:::-;33225:89;33307:6;33302:3;33225:89;:::i;:::-;33218:96;;33323:52;33368:6;33363:3;33356:4;33349:5;33345:16;33323:52;:::i;:::-;33400:6;33395:3;33391:16;33384:23;;33146:267;33036:377;;;;:::o;33419:155::-;33559:7;33555:1;33547:6;33543:14;33536:31;33419:155;:::o;33580:400::-;33740:3;33761:84;33843:1;33838:3;33761:84;:::i;:::-;33754:91;;33854:93;33943:3;33854:93;:::i;:::-;33972:1;33967:3;33963:11;33956:18;;33580:400;;;:::o;33986:701::-;34267:3;34289:95;34380:3;34371:6;34289:95;:::i;:::-;34282:102;;34401:95;34492:3;34483:6;34401:95;:::i;:::-;34394:102;;34513:148;34657:3;34513:148;:::i;:::-;34506:155;;34678:3;34671:10;;33986:701;;;;;:::o;34693:225::-;34833:34;34829:1;34821:6;34817:14;34810:58;34902:8;34897:2;34889:6;34885:15;34878:33;34693:225;:::o;34924:366::-;35066:3;35087:67;35151:2;35146:3;35087:67;:::i;:::-;35080:74;;35163:93;35252:3;35163:93;:::i;:::-;35281:2;35276:3;35272:12;35265:19;;34924:366;;;:::o;35296:419::-;35462:4;35500:2;35489:9;35485:18;35477:26;;35549:9;35543:4;35539:20;35535:1;35524:9;35520:17;35513:47;35577:131;35703:4;35577:131;:::i;:::-;35569:139;;35296:419;;;:::o;35721:79::-;35760:7;35789:5;35778:16;;35721:79;;;:::o;35806:157::-;35911:45;35931:24;35949:5;35931:24;:::i;:::-;35911:45;:::i;:::-;35906:3;35899:58;35806:157;;:::o;35969:397::-;36109:3;36124:75;36195:3;36186:6;36124:75;:::i;:::-;36224:2;36219:3;36215:12;36208:19;;36237:75;36308:3;36299:6;36237:75;:::i;:::-;36337:2;36332:3;36328:12;36321:19;;36357:3;36350:10;;35969:397;;;;;:::o;36372:182::-;36512:34;36508:1;36500:6;36496:14;36489:58;36372:182;:::o;36560:366::-;36702:3;36723:67;36787:2;36782:3;36723:67;:::i;:::-;36716:74;;36799:93;36888:3;36799:93;:::i;:::-;36917:2;36912:3;36908:12;36901:19;;36560:366;;;:::o;36932:419::-;37098:4;37136:2;37125:9;37121:18;37113:26;;37185:9;37179:4;37175:20;37171:1;37160:9;37156:17;37149:47;37213:131;37339:4;37213:131;:::i;:::-;37205:139;;36932:419;;;:::o;37357:178::-;37497:30;37493:1;37485:6;37481:14;37474:54;37357:178;:::o;37541:366::-;37683:3;37704:67;37768:2;37763:3;37704:67;:::i;:::-;37697:74;;37780:93;37869:3;37780:93;:::i;:::-;37898:2;37893:3;37889:12;37882:19;;37541:366;;;:::o;37913:419::-;38079:4;38117:2;38106:9;38102:18;38094:26;;38166:9;38160:4;38156:20;38152:1;38141:9;38137:17;38130:47;38194:131;38320:4;38194:131;:::i;:::-;38186:139;;37913:419;;;:::o;38338:175::-;38478:27;38474:1;38466:6;38462:14;38455:51;38338:175;:::o;38519:366::-;38661:3;38682:67;38746:2;38741:3;38682:67;:::i;:::-;38675:74;;38758:93;38847:3;38758:93;:::i;:::-;38876:2;38871:3;38867:12;38860:19;;38519:366;;;:::o;38891:419::-;39057:4;39095:2;39084:9;39080:18;39072:26;;39144:9;39138:4;39134:20;39130:1;39119:9;39115:17;39108:47;39172:131;39298:4;39172:131;:::i;:::-;39164:139;;38891:419;;;:::o;39316:237::-;39456:34;39452:1;39444:6;39440:14;39433:58;39525:20;39520:2;39512:6;39508:15;39501:45;39316:237;:::o;39559:366::-;39701:3;39722:67;39786:2;39781:3;39722:67;:::i;:::-;39715:74;;39798:93;39887:3;39798:93;:::i;:::-;39916:2;39911:3;39907:12;39900:19;;39559:366;;;:::o;39931:419::-;40097:4;40135:2;40124:9;40120:18;40112:26;;40184:9;40178:4;40174:20;40170:1;40159:9;40155:17;40148:47;40212:131;40338:4;40212:131;:::i;:::-;40204:139;;39931:419;;;:::o;40356:180::-;40404:77;40401:1;40394:88;40501:4;40498:1;40491:15;40525:4;40522:1;40515:15;40542:185;40582:1;40599:20;40617:1;40599:20;:::i;:::-;40594:25;;40633:20;40651:1;40633:20;:::i;:::-;40628:25;;40672:1;40662:35;;40677:18;;:::i;:::-;40662:35;40719:1;40716;40712:9;40707:14;;40542:185;;;;:::o;40733:176::-;40765:1;40782:20;40800:1;40782:20;:::i;:::-;40777:25;;40816:20;40834:1;40816:20;:::i;:::-;40811:25;;40855:1;40845:35;;40860:18;;:::i;:::-;40845:35;40901:1;40898;40894:9;40889:14;;40733:176;;;;:::o;40915:224::-;41055:34;41051:1;41043:6;41039:14;41032:58;41124:7;41119:2;41111:6;41107:15;41100:32;40915:224;:::o;41145:366::-;41287:3;41308:67;41372:2;41367:3;41308:67;:::i;:::-;41301:74;;41384:93;41473:3;41384:93;:::i;:::-;41502:2;41497:3;41493:12;41486:19;;41145:366;;;:::o;41517:419::-;41683:4;41721:2;41710:9;41706:18;41698:26;;41770:9;41764:4;41760:20;41756:1;41745:9;41741:17;41734:47;41798:131;41924:4;41798:131;:::i;:::-;41790:139;;41517:419;;;:::o;41942:223::-;42082:34;42078:1;42070:6;42066:14;42059:58;42151:6;42146:2;42138:6;42134:15;42127:31;41942:223;:::o;42171:366::-;42313:3;42334:67;42398:2;42393:3;42334:67;:::i;:::-;42327:74;;42410:93;42499:3;42410:93;:::i;:::-;42528:2;42523:3;42519:12;42512:19;;42171:366;;;:::o;42543:419::-;42709:4;42747:2;42736:9;42732:18;42724:26;;42796:9;42790:4;42786:20;42782:1;42771:9;42767:17;42760:47;42824:131;42950:4;42824:131;:::i;:::-;42816:139;;42543:419;;;:::o;42968:98::-;43019:6;43053:5;43047:12;43037:22;;42968:98;;;:::o;43072:168::-;43155:11;43189:6;43184:3;43177:19;43229:4;43224:3;43220:14;43205:29;;43072:168;;;;:::o;43246:360::-;43332:3;43360:38;43392:5;43360:38;:::i;:::-;43414:70;43477:6;43472:3;43414:70;:::i;:::-;43407:77;;43493:52;43538:6;43533:3;43526:4;43519:5;43515:16;43493:52;:::i;:::-;43570:29;43592:6;43570:29;:::i;:::-;43565:3;43561:39;43554:46;;43336:270;43246:360;;;;:::o;43612:640::-;43807:4;43845:3;43834:9;43830:19;43822:27;;43859:71;43927:1;43916:9;43912:17;43903:6;43859:71;:::i;:::-;43940:72;44008:2;43997:9;43993:18;43984:6;43940:72;:::i;:::-;44022;44090:2;44079:9;44075:18;44066:6;44022:72;:::i;:::-;44141:9;44135:4;44131:20;44126:2;44115:9;44111:18;44104:48;44169:76;44240:4;44231:6;44169:76;:::i;:::-;44161:84;;43612:640;;;;;;;:::o;44258:141::-;44314:5;44345:6;44339:13;44330:22;;44361:32;44387:5;44361:32;:::i;:::-;44258:141;;;;:::o;44405:349::-;44474:6;44523:2;44511:9;44502:7;44498:23;44494:32;44491:119;;;44529:79;;:::i;:::-;44491:119;44649:1;44674:63;44729:7;44720:6;44709:9;44705:22;44674:63;:::i;:::-;44664:73;;44620:127;44405:349;;;;:::o
Swarm Source
ipfs://e281a9c77de0e3d8ec87768ff28c03f6932166e204975320b182e90d14c246e0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.