Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
999 CC
Holders
265
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
59 CCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ChaosClownz
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-17 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol /// @title Chaos Clownz /// @author André Costa @ Terratecc pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract ChaosClownz is ERC721A, Ownable { using Strings for uint256; //initial part of the URI for the metadata string private _currentBaseURI; //cost of mints depending on state of sale uint private mintCost_ = 0.03 ether; //maximum amount of mints allowed per person uint256 public constant maxMintPresale = 3; //the amount of reserved mints that have currently been executed by creator and giveaways uint private _reservedMints = 0; //the maximum amount of reserved mints allowed for creator and giveaways uint private maxReservedMints = 200; //dummy address that we use to sign the mint transaction to make sure it is valid address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c; //marks the timestamp of when the respective sales open uint256 internal presaleLaunchTime; uint256 internal publicSaleLaunchTime; uint256 internal revealTime; //amount of mints that each address has executed mapping(address => uint256) public mintsPerAddress; //current state os sale enum State {NoSale, Presale, PublicSale} //defines the uri for when the NFTs have not been yet revealed string public unrevealedURI; //declaring initial values for variables constructor() ERC721A('Chaos Clownz', 'CC', 10, 999) { unrevealedURI = "ipfs://QmfCc521c8y2CLKwhZi2cmnmfyuL8egSe6njoQJDC57YE1/"; } //in case somebody accidentaly sends funds or transaction to contract receive() payable external {} fallback() payable external { revert(); } //visualize baseURI function _baseURI() internal view virtual override returns (string memory) { return _currentBaseURI; } //change baseURI in case needed for IPFS function changeBaseURI(string memory baseURI_) public onlyOwner { _currentBaseURI = baseURI_; } function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner { unrevealedURI = unrevealedURI_; } function switchToPresale() public onlyOwner { require(saleState() == State.NoSale, 'Sale is already Open!'); presaleLaunchTime = block.timestamp; } function switchToPublicSale() public onlyOwner { require(saleState() == State.Presale, 'Sale must be in Presale!'); publicSaleLaunchTime = block.timestamp; } modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) { require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' ); _; } /* * @dev Verifies if message was signed by owner to give access to _add for this contract. * Assumes Geth signature prefix. * @param _add Address of agent with access * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. * @return Validity of access message for a given address. */ function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) { bytes32 hash = keccak256(abi.encodePacked(address(this), _add)); return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s); } //mint a @param number of NFTs in presale function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { State saleState_ = saleState(); require(saleState_ != State.NoSale, "Sale in not open yet!"); require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!"); require(totalSupply() + number <= collectionSize - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMintPresale, "Maximum 3 Mints per Address allowed!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.03 ether each NFT)"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } //mint a @param number of NFTs in public sale function publicSaleMint(uint256 number) public payable { State saleState_ = saleState(); require(saleState_ == State.PublicSale, "Public Sale in not open yet!"); require(totalSupply() + number <= collectionSize - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.03 ether for each NFT)"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) { require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token"); //check to see that 24 hours have passed since beginning of publicsale launch if (revealTime == 0) { return unrevealedURI; } else { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : ""; } } //reserved NFTs for creator function reservedMint(uint number, address recipient) public onlyOwner { require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs left to mint.."); _safeMint(recipient, number); mintsPerAddress[recipient] += number; _reservedMints += number; } //se the current account balance function accountBalance() public onlyOwner view returns(uint) { return address(this).balance; } //retrieve all funds recieved from minting function withdraw() public onlyOwner { uint256 balance = accountBalance(); require(balance > 0, 'No Funds to withdraw, Balance is 0'); _withdraw(payable(0x9cE6671D8cc327a3E6F164db0B7d5E2dD7D57761), balance); } //send the percentage of funds to a shareholder´s wallet function _withdraw(address payable account, uint256 amount) internal { (bool sent, ) = account.call{value: amount}(""); require(sent, "Failed to send Ether"); } //change the dummy account used for signing transactions function changeDummy(address _dummy) public onlyOwner { dummy = _dummy; } //to see the total amount of reserved mints left function reservedMintsLeft() public onlyOwner view returns(uint) { return maxReservedMints - _reservedMints; } //see current state of sale //see the current state of the sale function saleState() public view returns(State){ if (presaleLaunchTime == 0) { return State.NoSale; } else if (publicSaleLaunchTime == 0) { return State.Presale; } else { return State.PublicSale; } } //gets the cost of current mint function mintCost() public view returns(uint) { return mintCost_; } //see when NFTs will be revealed function timeOfReveal() public view returns(uint256) { require(revealTime != 0, 'NFT Reveal Time has not been determined yet!'); return revealTime; } function reveal() public onlyOwner { require(revealTime == 0, "Collection has already been revealed!"); revealTime = block.timestamp; } function changeMintCost(uint256 newCost) public onlyOwner { mintCost_ = newCost; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","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":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","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":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPresale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","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":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reveal","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":[],"name":"saleState","outputs":[{"internalType":"enum ChaosClownz.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeOfReveal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052600080556000600755666a94d74f430000600a556000600b5560c8600c557380e4929c869102140e69550bbecc20bed61b080c600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008457600080fd5b506040518060400160405280600c81526020017f4368616f7320436c6f776e7a00000000000000000000000000000000000000008152506040518060400160405280600281526020017f4343000000000000000000000000000000000000000000000000000000000000815250600a6103e7600081116200013c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001339062000425565b60405180910390fd5b6000821162000182576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017990620004bd565b60405180910390fd5b83600190805190602001906200019a929190620002ee565b508260029080519060200190620001b3929190620002ee565b508160a08181525050806080818152505050505050620001e8620001dc6200022060201b60201c565b6200022860201b60201c565b60405180606001604052806036815260200162006121603691396012908051906020019062000219929190620002ee565b5062000544565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002fc906200050e565b90600052602060002090601f0160209004810192826200032057600085556200036c565b82601f106200033b57805160ff19168380011785556200036c565b828001600101855582156200036c579182015b828111156200036b5782518255916020019190600101906200034e565b5b5090506200037b91906200037f565b5090565b5b808211156200039a57600081600090555060010162000380565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200040d602e836200039e565b91506200041a82620003af565b604082019050919050565b600060208201905081810360008301526200044081620003fe565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620004a56027836200039e565b9150620004b28262000447565b604082019050919050565b60006020820190508181036000830152620004d88162000496565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200052757607f821691505b602082108114156200053e576200053d620004df565b5b50919050565b60805160a051615ba26200057f60003960008181612d8901528181612db20152613449015260008181611b83015261203b0152615ba26000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063bdb4b848116100ab578063e985e9c51161006f578063e985e9c514610860578063eab417821461089d578063f2fde38b146108b4578063ff984994146108dd578063ffcd55a8146108f457610246565b8063bdb4b84814610788578063c4d8b9df146107b3578063c87b56dd146107dc578063d7224ba014610819578063dcd4e7321461084457610246565b8063a22cb465116100f2578063a22cb465146106d8578063a475b5dd14610701578063b0a1c1c414610718578063b3ab66b014610743578063b88d4fde1461075f57610246565b8063715018a6146106175780637c76f6981461062e5780637f1921ef146106595780638da5cb5b1461068257806395d89b41146106ad57610246565b806332624114116101bc5780634f6ccce7116101805780634f6ccce71461050a578063603f4d52146105475780636352211e146105725780637035bf18146105af57806370a08231146105da57610246565b8063326241141461043957806339a0c6f9146104765780633ccfd60b1461049f57806342842e0e146104b65780634520e916146104df57610246565b806318160ddd1161020357806318160ddd1461034257806318df64031461036d57806323b872dd146103965780632f745c59146103bf5780633023eba6146103fc57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139d5565b61091f565b005b34801561028057600080fd5b5061029b60048036038101906102969190613a5a565b6109df565b6040516102a89190613aa2565b60405180910390f35b3480156102bd57600080fd5b506102c6610b29565b6040516102d39190613b56565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613bae565b610bbb565b6040516103109190613bea565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613c05565b610c40565b005b34801561034e57600080fd5b50610357610d59565b6040516103649190613c54565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613c6f565b610d62565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613caf565b610ead565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613c05565b610ebd565b6040516103f39190613c54565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e91906139d5565b6110bb565b6040516104309190613c54565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613d71565b6110d3565b60405161046d9190613aa2565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613f0d565b6111d1565b005b3480156104ab57600080fd5b506104b4611267565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613caf565b611353565b005b3480156104eb57600080fd5b506104f4611373565b6040516105019190613c54565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613bae565b611406565b60405161053e9190613c54565b60405180910390f35b34801561055357600080fd5b5061055c611459565b6040516105699190613fcd565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613bae565b61148a565b6040516105a69190613bea565b60405180910390f35b3480156105bb57600080fd5b506105c46114a0565b6040516105d19190613b56565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906139d5565b61152e565b60405161060e9190613c54565b60405180910390f35b34801561062357600080fd5b5061062c611617565b005b34801561063a57600080fd5b5061064361169f565b6040516106509190613c54565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613bae565b6116ee565b005b34801561068e57600080fd5b50610697611774565b6040516106a49190613bea565b60405180910390f35b3480156106b957600080fd5b506106c261179e565b6040516106cf9190613b56565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190614014565b611830565b005b34801561070d57600080fd5b506107166119b1565b005b34801561072457600080fd5b5061072d611a7b565b60405161073a9190613c54565b60405180910390f35b61075d60048036038101906107589190613bae565b611aff565b005b34801561076b57600080fd5b50610786600480360381019061078191906140f5565b611cb9565b005b34801561079457600080fd5b5061079d611d15565b6040516107aa9190613c54565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613f0d565b611d1f565b005b3480156107e857600080fd5b5061080360048036038101906107fe9190613bae565b611db5565b6040516108109190613b56565b60405180910390f35b34801561082557600080fd5b5061082e611efa565b60405161083b9190613c54565b60405180910390f35b61085e60048036038101906108599190614178565b611f00565b005b34801561086c57600080fd5b50610887600480360381019061088291906141df565b612205565b6040516108949190613aa2565b60405180910390f35b3480156108a957600080fd5b506108b2612299565b005b3480156108c057600080fd5b506108db60048036038101906108d691906139d5565b61238c565b005b3480156108e957600080fd5b506108f2612484565b005b34801561090057600080fd5b50610909612577565b6040516109169190613c54565b60405180910390f35b61092761257c565b73ffffffffffffffffffffffffffffffffffffffff16610945611774565b73ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109929061426b565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aaa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b225750610b2182612584565b5b9050919050565b606060018054610b38906142ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b64906142ba565b8015610bb15780601f10610b8657610100808354040283529160200191610bb1565b820191906000526020600020905b815481529060010190602001808311610b9457829003601f168201915b5050505050905090565b6000610bc6826125ee565b610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc9061435e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4b8261148a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906143f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdb61257c565b73ffffffffffffffffffffffffffffffffffffffff161480610d0a5750610d0981610d0461257c565b612205565b5b610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090614482565b60405180910390fd5b610d548383836125fb565b505050565b60008054905090565b610d6a61257c565b73ffffffffffffffffffffffffffffffffffffffff16610d88611774565b73ffffffffffffffffffffffffffffffffffffffff1614610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd59061426b565b60405180910390fd5b600c5482600b54610def91906144d1565b1115610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790614599565b60405180910390fd5b610e3a81836126ad565b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e8991906144d1565b9250508190555081600b6000828254610ea291906144d1565b925050819055505050565b610eb88383836126cb565b505050565b6000610ec88361152e565b8210610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f009061462b565b60405180910390fd5b6000610f13610d59565b905060008060005b83811015611079576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461100d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561106557868414156110565781955050505050506110b5565b83806110619061464b565b9450505b5080806110719061464b565b915050610f1b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614706565b60405180910390fd5b92915050565b60116020528060005260406000206000915090505481565b60008030866040516020016110e992919061476e565b6040516020818303038152906040528051906020012090506001816040516020016111149190614812565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161114a9493929190614856565b6020604051602081039080840390855afa15801561116c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6111d961257c565b73ffffffffffffffffffffffffffffffffffffffff166111f7611774565b73ffffffffffffffffffffffffffffffffffffffff161461124d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112449061426b565b60405180910390fd5b8060099080519060200190611263929190613886565b5050565b61126f61257c565b73ffffffffffffffffffffffffffffffffffffffff1661128d611774565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da9061426b565b60405180910390fd5b60006112ed611a7b565b905060008111611332576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113299061490d565b60405180910390fd5b611350739ce6671d8cc327a3e6f164db0b7d5e2dd7d5776182612c84565b50565b61136e83838360405180602001604052806000815250611cb9565b505050565b600061137d61257c565b73ffffffffffffffffffffffffffffffffffffffff1661139b611774565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e89061426b565b60405180910390fd5b600b54600c54611401919061492d565b905090565b6000611410610d59565b8210611451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611448906149d3565b60405180910390fd5b819050919050565b600080600e54141561146e5760009050611487565b6000600f5414156114825760019050611487565b600290505b90565b600061149582612d35565b600001519050919050565b601280546114ad906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546114d9906142ba565b80156115265780601f106114fb57610100808354040283529160200191611526565b820191906000526020600020905b81548152906001019060200180831161150957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690614a65565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61161f61257c565b73ffffffffffffffffffffffffffffffffffffffff1661163d611774565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a9061426b565b60405180910390fd5b61169d6000612f38565b565b60008060105414156116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614af7565b60405180910390fd5b601054905090565b6116f661257c565b73ffffffffffffffffffffffffffffffffffffffff16611714611774565b73ffffffffffffffffffffffffffffffffffffffff161461176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061426b565b60405180910390fd5b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546117ad906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546117d9906142ba565b80156118265780601f106117fb57610100808354040283529160200191611826565b820191906000526020600020905b81548152906001019060200180831161180957829003601f168201915b5050505050905090565b61183861257c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90614b63565b60405180910390fd5b80600660006118b361257c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661196061257c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a59190613aa2565b60405180910390a35050565b6119b961257c565b73ffffffffffffffffffffffffffffffffffffffff166119d7611774565b73ffffffffffffffffffffffffffffffffffffffff1614611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a249061426b565b60405180910390fd5b600060105414611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990614bf5565b60405180910390fd5b42601081905550565b6000611a8561257c565b73ffffffffffffffffffffffffffffffffffffffff16611aa3611774565b73ffffffffffffffffffffffffffffffffffffffff1614611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af09061426b565b60405180910390fd5b47905090565b6000611b09611459565b9050600280811115611b1e57611b1d613f56565b5b816002811115611b3157611b30613f56565b5b14611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890614c61565b60405180910390fd5b600b54600c54611b81919061492d565b7f0000000000000000000000000000000000000000000000000000000000000000611bac919061492d565b82611bb5610d59565b611bbf91906144d1565b1115611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614ccd565b60405180910390fd5b81611c09611d15565b611c139190614ced565b341015611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90614ddf565b60405180910390fd5b611c5f33836126ad565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cae91906144d1565b925050819055505050565b611cc48484846126cb565b611cd084848484612ffe565b611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690614e71565b60405180910390fd5b50505050565b6000600a54905090565b611d2761257c565b73ffffffffffffffffffffffffffffffffffffffff16611d45611774565b73ffffffffffffffffffffffffffffffffffffffff1614611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061426b565b60405180910390fd5b8060129080519060200190611db1929190613886565b5050565b6060611dc0826125ee565b611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614f03565b60405180910390fd5b60006010541415611e9c5760128054611e17906142ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611e43906142ba565b8015611e905780601f10611e6557610100808354040283529160200191611e90565b820191906000526020600020905b815481529060010190602001808311611e7357829003601f168201915b50505050509050611ef5565b6000611ea6613195565b90506000815111611ec65760405180602001604052806000815250611ef1565b80611ed084613227565b604051602001611ee1929190614fa0565b6040516020818303038152906040525b9150505b919050565b60075481565b828282611f0f338484846110d3565b611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061501b565b60405180910390fd5b6000611f58611459565b905060006002811115611f6e57611f6d613f56565b5b816002811115611f8157611f80613f56565b5b1415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990615087565b60405180910390fd5b600280811115611fd557611fd4613f56565b5b816002811115611fe857611fe7613f56565b5b1415612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090615119565b60405180910390fd5b600b54600c54612039919061492d565b7f0000000000000000000000000000000000000000000000000000000000000000612064919061492d565b8861206d610d59565b61207791906144d1565b11156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90614ccd565b60405180910390fd5b600388601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461210591906144d1565b1115612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d906151ab565b60405180910390fd5b8761214f611d15565b6121599190614ced565b34101561219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290615263565b60405180910390fd5b6121a533896126ad565b87601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f491906144d1565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a161257c565b73ffffffffffffffffffffffffffffffffffffffff166122bf611774565b73ffffffffffffffffffffffffffffffffffffffff1614612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c9061426b565b60405180910390fd5b6000600281111561232957612328613f56565b5b612331611459565b600281111561234357612342613f56565b5b14612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906152cf565b60405180910390fd5b42600e81905550565b61239461257c565b73ffffffffffffffffffffffffffffffffffffffff166123b2611774565b73ffffffffffffffffffffffffffffffffffffffff1614612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff9061426b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f90615361565b60405180910390fd5b61248181612f38565b50565b61248c61257c565b73ffffffffffffffffffffffffffffffffffffffff166124aa611774565b73ffffffffffffffffffffffffffffffffffffffff1614612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f79061426b565b60405180910390fd5b6001600281111561251457612513613f56565b5b61251c611459565b600281111561252e5761252d613f56565b5b1461256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906153cd565b60405180910390fd5b42600f81905550565b600381565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6126c7828260405180602001604052806000815250613388565b5050565b60006126d682612d35565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126fd61257c565b73ffffffffffffffffffffffffffffffffffffffff161480612759575061272261257c565b73ffffffffffffffffffffffffffffffffffffffff1661274184610bbb565b73ffffffffffffffffffffffffffffffffffffffff16145b806127755750612774826000015161276f61257c565b612205565b5b9050806127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae9061545f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612820906154f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289090615583565b60405180910390fd5b6128a68585856001613867565b6128b660008484600001516125fb565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661292491906155bf565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129c891906155f3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612ace91906144d1565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c1457612b44816125ee565b15612c13576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7c868686600161386d565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612caa9061566a565b60006040518083038185875af1925050503d8060008114612ce7576040519150601f19603f3d011682016040523d82523d6000602084013e612cec565b606091505b5050905080612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d27906156cb565b60405180910390fd5b505050565b612d3d61390c565b612d46826125ee565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c9061575d565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612de95760017f000000000000000000000000000000000000000000000000000000000000000084612ddc919061492d565b612de691906144d1565b90505b60008390505b818110612ef7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ee357809350505050612f33565b508080612eef9061577d565b915050612def565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90615819565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061301f8473ffffffffffffffffffffffffffffffffffffffff16613873565b15613188578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304861257c565b8786866040518563ffffffff1660e01b815260040161306a949392919061588e565b602060405180830381600087803b15801561308457600080fd5b505af19250505080156130b557506040513d601f19601f820116820180604052508101906130b291906158ef565b60015b613138573d80600081146130e5576040519150601f19603f3d011682016040523d82523d6000602084013e6130ea565b606091505b50600081511415613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312790614e71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061318d565b600190505b949350505050565b6060600980546131a4906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546131d0906142ba565b801561321d5780601f106131f25761010080835404028352916020019161321d565b820191906000526020600020905b81548152906001019060200180831161320057829003601f168201915b5050505050905090565b6060600082141561326f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613383565b600082905060005b600082146132a157808061328a9061464b565b915050600a8261329a919061594b565b9150613277565b60008167ffffffffffffffff8111156132bd576132bc613de2565b5b6040519080825280601f01601f1916602001820160405280156132ef5781602001600182028036833780820191505090505b5090505b6000851461337c57600182613308919061492d565b9150600a85613317919061597c565b603061332391906144d1565b60f81b818381518110613339576133386159ad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613375919061594b565b94506132f3565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f590615a4e565b60405180910390fd5b613407816125ee565b15613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e90615aba565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a190615b4c565b60405180910390fd5b6134b76000858386613867565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135b491906155f3565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135db91906155f3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561384a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137ea6000888488612ffe565b613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382090614e71565b60405180910390fd5b81806138349061464b565b92505080806138429061464b565b915050613779565b508060008190555061385f600087858861386d565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613892906142ba565b90600052602060002090601f0160209004810192826138b457600085556138fb565b82601f106138cd57805160ff19168380011785556138fb565b828001600101855582156138fb579182015b828111156138fa5782518255916020019190600101906138df565b5b5090506139089190613946565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561395f576000816000905550600101613947565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139a282613977565b9050919050565b6139b281613997565b81146139bd57600080fd5b50565b6000813590506139cf816139a9565b92915050565b6000602082840312156139eb576139ea61396d565b5b60006139f9848285016139c0565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f61396d565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613af7578082015181840152602081019050613adc565b83811115613b06576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b2882613abd565b613b328185613ac8565b9350613b42818560208601613ad9565b613b4b81613b0c565b840191505092915050565b60006020820190508181036000830152613b708184613b1d565b905092915050565b6000819050919050565b613b8b81613b78565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc361396d565b5b6000613bd284828501613b99565b91505092915050565b613be481613997565b82525050565b6000602082019050613bff6000830184613bdb565b92915050565b60008060408385031215613c1c57613c1b61396d565b5b6000613c2a858286016139c0565b9250506020613c3b85828601613b99565b9150509250929050565b613c4e81613b78565b82525050565b6000602082019050613c696000830184613c45565b92915050565b60008060408385031215613c8657613c8561396d565b5b6000613c9485828601613b99565b9250506020613ca5858286016139c0565b9150509250929050565b600080600060608486031215613cc857613cc761396d565b5b6000613cd6868287016139c0565b9350506020613ce7868287016139c0565b9250506040613cf886828701613b99565b9150509250925092565b600060ff82169050919050565b613d1881613d02565b8114613d2357600080fd5b50565b600081359050613d3581613d0f565b92915050565b6000819050919050565b613d4e81613d3b565b8114613d5957600080fd5b50565b600081359050613d6b81613d45565b92915050565b60008060008060808587031215613d8b57613d8a61396d565b5b6000613d99878288016139c0565b9450506020613daa87828801613d26565b9350506040613dbb87828801613d5c565b9250506060613dcc87828801613d5c565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e1a82613b0c565b810181811067ffffffffffffffff82111715613e3957613e38613de2565b5b80604052505050565b6000613e4c613963565b9050613e588282613e11565b919050565b600067ffffffffffffffff821115613e7857613e77613de2565b5b613e8182613b0c565b9050602081019050919050565b82818337600083830152505050565b6000613eb0613eab84613e5d565b613e42565b905082815260208101848484011115613ecc57613ecb613ddd565b5b613ed7848285613e8e565b509392505050565b600082601f830112613ef457613ef3613dd8565b5b8135613f04848260208601613e9d565b91505092915050565b600060208284031215613f2357613f2261396d565b5b600082013567ffffffffffffffff811115613f4157613f40613972565b5b613f4d84828501613edf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613f9657613f95613f56565b5b50565b6000819050613fa782613f85565b919050565b6000613fb782613f99565b9050919050565b613fc781613fac565b82525050565b6000602082019050613fe26000830184613fbe565b92915050565b613ff181613a87565b8114613ffc57600080fd5b50565b60008135905061400e81613fe8565b92915050565b6000806040838503121561402b5761402a61396d565b5b6000614039858286016139c0565b925050602061404a85828601613fff565b9150509250929050565b600067ffffffffffffffff82111561406f5761406e613de2565b5b61407882613b0c565b9050602081019050919050565b600061409861409384614054565b613e42565b9050828152602081018484840111156140b4576140b3613ddd565b5b6140bf848285613e8e565b509392505050565b600082601f8301126140dc576140db613dd8565b5b81356140ec848260208601614085565b91505092915050565b6000806000806080858703121561410f5761410e61396d565b5b600061411d878288016139c0565b945050602061412e878288016139c0565b935050604061413f87828801613b99565b925050606085013567ffffffffffffffff8111156141605761415f613972565b5b61416c878288016140c7565b91505092959194509250565b600080600080608085870312156141925761419161396d565b5b60006141a087828801613b99565b94505060206141b187828801613d26565b93505060406141c287828801613d5c565b92505060606141d387828801613d5c565b91505092959194509250565b600080604083850312156141f6576141f561396d565b5b6000614204858286016139c0565b9250506020614215858286016139c0565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614255602083613ac8565b91506142608261421f565b602082019050919050565b6000602082019050818103600083015261428481614248565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142d257607f821691505b602082108114156142e6576142e561428b565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614348602d83613ac8565b9150614353826142ec565b604082019050919050565b600060208201905081810360008301526143778161433b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143da602283613ac8565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061446c603983613ac8565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144dc82613b78565b91506144e783613b78565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561451c5761451b6144a2565b5b828201905092915050565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b6000614583602783613ac8565b915061458e82614527565b604082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614615602283613ac8565b9150614620826145b9565b604082019050919050565b6000602082019050818103600083015261464481614608565b9050919050565b600061465682613b78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614689576146886144a2565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006146f0602e83613ac8565b91506146fb82614694565b604082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b60008160601b9050919050565b600061473e82614726565b9050919050565b600061475082614733565b9050919050565b61476861476382613997565b614745565b82525050565b600061477a8285614757565b60148201915061478a8284614757565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006147db601c8361479a565b91506147e6826147a5565b601c82019050919050565b6000819050919050565b61480c61480782613d3b565b6147f1565b82525050565b600061481d826147ce565b915061482982846147fb565b60208201915081905092915050565b61484181613d3b565b82525050565b61485081613d02565b82525050565b600060808201905061486b6000830187614838565b6148786020830186614847565b6148856040830185614838565b6148926060830184614838565b95945050505050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b60006148f7602283613ac8565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b600061493882613b78565b915061494383613b78565b925082821015614956576149556144a2565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006149bd602383613ac8565b91506149c882614961565b604082019050919050565b600060208201905081810360008301526149ec816149b0565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614a4f602b83613ac8565b9150614a5a826149f3565b604082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b6000614ae1602c83613ac8565b9150614aec82614a85565b604082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614b4d601a83613ac8565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f436f6c6c656374696f6e2068617320616c7265616479206265656e207265766560008201527f616c656421000000000000000000000000000000000000000000000000000000602082015250565b6000614bdf602583613ac8565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b6000614c4b601c83613ac8565b9150614c5682614c15565b602082019050919050565b60006020820190508181036000830152614c7a81614c3e565b9050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614cb7601e83613ac8565b9150614cc282614c81565b602082019050919050565b60006020820190508181036000830152614ce681614caa565b9050919050565b6000614cf882613b78565b9150614d0383613b78565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3c57614d3b6144a2565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303320657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b6000614dc9605183613ac8565b9150614dd482614d47565b606082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614e5b603383613ac8565b9150614e6682614dff565b604082019050919050565b60006020820190508181036000830152614e8a81614e4e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614eed602f83613ac8565b9150614ef882614e91565b604082019050919050565b60006020820190508181036000830152614f1c81614ee0565b9050919050565b6000614f2e82613abd565b614f38818561479a565b9350614f48818560208601613ad9565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f8a60058361479a565b9150614f9582614f54565b600582019050919050565b6000614fac8285614f23565b9150614fb88284614f23565b9150614fc382614f7d565b91508190509392505050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000615005601183613ac8565b915061501082614fcf565b602082019050919050565b6000602082019050818103600083015261503481614ff8565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000615071601583613ac8565b915061507c8261503b565b602082019050919050565b600060208201905081810360008301526150a081615064565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000615103602a83613ac8565b915061510e826150a7565b604082019050919050565b60006020820190508181036000830152615132816150f6565b9050919050565b7f4d6178696d756d2033204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000615195602483613ac8565b91506151a082615139565b604082019050919050565b600060208201905081810360008301526151c481615188565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303320657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b600061524d604d83613ac8565b9150615258826151cb565b606082019050919050565b6000602082019050818103600083015261527c81615240565b9050919050565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b60006152b9601583613ac8565b91506152c482615283565b602082019050919050565b600060208201905081810360008301526152e8816152ac565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061534b602683613ac8565b9150615356826152ef565b604082019050919050565b6000602082019050818103600083015261537a8161533e565b9050919050565b7f53616c65206d75737420626520696e2050726573616c65210000000000000000600082015250565b60006153b7601883613ac8565b91506153c282615381565b602082019050919050565b600060208201905081810360008301526153e6816153aa565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615449603283613ac8565b9150615454826153ed565b604082019050919050565b600060208201905081810360008301526154788161543c565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006154db602683613ac8565b91506154e68261547f565b604082019050919050565b6000602082019050818103600083015261550a816154ce565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061556d602583613ac8565b915061557882615511565b604082019050919050565b6000602082019050818103600083015261559c81615560565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006155ca826155a3565b91506155d5836155a3565b9250828210156155e8576155e76144a2565b5b828203905092915050565b60006155fe826155a3565b9150615609836155a3565b9250826fffffffffffffffffffffffffffffffff0382111561562e5761562d6144a2565b5b828201905092915050565b600081905092915050565b50565b6000615654600083615639565b915061565f82615644565b600082019050919050565b600061567582615647565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b60006156b5601483613ac8565b91506156c08261567f565b602082019050919050565b600060208201905081810360008301526156e4816156a8565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615747602a83613ac8565b9150615752826156eb565b604082019050919050565b600060208201905081810360008301526157768161573a565b9050919050565b600061578882613b78565b9150600082141561579c5761579b6144a2565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615803602f83613ac8565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061586082615839565b61586a8185615844565b935061587a818560208601613ad9565b61588381613b0c565b840191505092915050565b60006080820190506158a36000830187613bdb565b6158b06020830186613bdb565b6158bd6040830185613c45565b81810360608301526158cf8184615855565b905095945050505050565b6000815190506158e981613a2e565b92915050565b6000602082840312156159055761590461396d565b5b6000615913848285016158da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061595682613b78565b915061596183613b78565b9250826159715761597061591c565b5b828204905092915050565b600061598782613b78565b915061599283613b78565b9250826159a2576159a161591c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a38602183613ac8565b9150615a43826159dc565b604082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615aa4601d83613ac8565b9150615aaf82615a6e565b602082019050919050565b60006020820190508181036000830152615ad381615a97565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b36602283613ac8565b9150615b4182615ada565b604082019050919050565b60006020820190508181036000830152615b6581615b29565b905091905056fea2646970667358221220ba78458034063d1177c649e935ffcde3efd2f3202c29270eb5483051bfa30f5064736f6c63430008090033697066733a2f2f516d66436335323163387932434c4b77685a6932636d6e6d6679754c3865675365366e6a6f514a444335375945312f
Deployed Bytecode
0x60806040526004361061023f5760003560e01c8063715018a61161012e578063bdb4b848116100ab578063e985e9c51161006f578063e985e9c514610860578063eab417821461089d578063f2fde38b146108b4578063ff984994146108dd578063ffcd55a8146108f457610246565b8063bdb4b84814610788578063c4d8b9df146107b3578063c87b56dd146107dc578063d7224ba014610819578063dcd4e7321461084457610246565b8063a22cb465116100f2578063a22cb465146106d8578063a475b5dd14610701578063b0a1c1c414610718578063b3ab66b014610743578063b88d4fde1461075f57610246565b8063715018a6146106175780637c76f6981461062e5780637f1921ef146106595780638da5cb5b1461068257806395d89b41146106ad57610246565b806332624114116101bc5780634f6ccce7116101805780634f6ccce71461050a578063603f4d52146105475780636352211e146105725780637035bf18146105af57806370a08231146105da57610246565b8063326241141461043957806339a0c6f9146104765780633ccfd60b1461049f57806342842e0e146104b65780634520e916146104df57610246565b806318160ddd1161020357806318160ddd1461034257806318df64031461036d57806323b872dd146103965780632f745c59146103bf5780633023eba6146103fc57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906139d5565b61091f565b005b34801561028057600080fd5b5061029b60048036038101906102969190613a5a565b6109df565b6040516102a89190613aa2565b60405180910390f35b3480156102bd57600080fd5b506102c6610b29565b6040516102d39190613b56565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613bae565b610bbb565b6040516103109190613bea565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613c05565b610c40565b005b34801561034e57600080fd5b50610357610d59565b6040516103649190613c54565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f9190613c6f565b610d62565b005b3480156103a257600080fd5b506103bd60048036038101906103b89190613caf565b610ead565b005b3480156103cb57600080fd5b506103e660048036038101906103e19190613c05565b610ebd565b6040516103f39190613c54565b60405180910390f35b34801561040857600080fd5b50610423600480360381019061041e91906139d5565b6110bb565b6040516104309190613c54565b60405180910390f35b34801561044557600080fd5b50610460600480360381019061045b9190613d71565b6110d3565b60405161046d9190613aa2565b60405180910390f35b34801561048257600080fd5b5061049d60048036038101906104989190613f0d565b6111d1565b005b3480156104ab57600080fd5b506104b4611267565b005b3480156104c257600080fd5b506104dd60048036038101906104d89190613caf565b611353565b005b3480156104eb57600080fd5b506104f4611373565b6040516105019190613c54565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613bae565b611406565b60405161053e9190613c54565b60405180910390f35b34801561055357600080fd5b5061055c611459565b6040516105699190613fcd565b60405180910390f35b34801561057e57600080fd5b5061059960048036038101906105949190613bae565b61148a565b6040516105a69190613bea565b60405180910390f35b3480156105bb57600080fd5b506105c46114a0565b6040516105d19190613b56565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906139d5565b61152e565b60405161060e9190613c54565b60405180910390f35b34801561062357600080fd5b5061062c611617565b005b34801561063a57600080fd5b5061064361169f565b6040516106509190613c54565b60405180910390f35b34801561066557600080fd5b50610680600480360381019061067b9190613bae565b6116ee565b005b34801561068e57600080fd5b50610697611774565b6040516106a49190613bea565b60405180910390f35b3480156106b957600080fd5b506106c261179e565b6040516106cf9190613b56565b60405180910390f35b3480156106e457600080fd5b506106ff60048036038101906106fa9190614014565b611830565b005b34801561070d57600080fd5b506107166119b1565b005b34801561072457600080fd5b5061072d611a7b565b60405161073a9190613c54565b60405180910390f35b61075d60048036038101906107589190613bae565b611aff565b005b34801561076b57600080fd5b50610786600480360381019061078191906140f5565b611cb9565b005b34801561079457600080fd5b5061079d611d15565b6040516107aa9190613c54565b60405180910390f35b3480156107bf57600080fd5b506107da60048036038101906107d59190613f0d565b611d1f565b005b3480156107e857600080fd5b5061080360048036038101906107fe9190613bae565b611db5565b6040516108109190613b56565b60405180910390f35b34801561082557600080fd5b5061082e611efa565b60405161083b9190613c54565b60405180910390f35b61085e60048036038101906108599190614178565b611f00565b005b34801561086c57600080fd5b50610887600480360381019061088291906141df565b612205565b6040516108949190613aa2565b60405180910390f35b3480156108a957600080fd5b506108b2612299565b005b3480156108c057600080fd5b506108db60048036038101906108d691906139d5565b61238c565b005b3480156108e957600080fd5b506108f2612484565b005b34801561090057600080fd5b50610909612577565b6040516109169190613c54565b60405180910390f35b61092761257c565b73ffffffffffffffffffffffffffffffffffffffff16610945611774565b73ffffffffffffffffffffffffffffffffffffffff161461099b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109929061426b565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aaa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1257507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b225750610b2182612584565b5b9050919050565b606060018054610b38906142ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610b64906142ba565b8015610bb15780601f10610b8657610100808354040283529160200191610bb1565b820191906000526020600020905b815481529060010190602001808311610b9457829003601f168201915b5050505050905090565b6000610bc6826125ee565b610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc9061435e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4b8261148a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb3906143f0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdb61257c565b73ffffffffffffffffffffffffffffffffffffffff161480610d0a5750610d0981610d0461257c565b612205565b5b610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090614482565b60405180910390fd5b610d548383836125fb565b505050565b60008054905090565b610d6a61257c565b73ffffffffffffffffffffffffffffffffffffffff16610d88611774565b73ffffffffffffffffffffffffffffffffffffffff1614610dde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd59061426b565b60405180910390fd5b600c5482600b54610def91906144d1565b1115610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790614599565b60405180910390fd5b610e3a81836126ad565b81601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e8991906144d1565b9250508190555081600b6000828254610ea291906144d1565b925050819055505050565b610eb88383836126cb565b505050565b6000610ec88361152e565b8210610f09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f009061462b565b60405180910390fd5b6000610f13610d59565b905060008060005b83811015611079576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461100d57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561106557868414156110565781955050505050506110b5565b83806110619061464b565b9450505b5080806110719061464b565b915050610f1b565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90614706565b60405180910390fd5b92915050565b60116020528060005260406000206000915090505481565b60008030866040516020016110e992919061476e565b6040516020818303038152906040528051906020012090506001816040516020016111149190614812565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161114a9493929190614856565b6020604051602081039080840390855afa15801561116c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6111d961257c565b73ffffffffffffffffffffffffffffffffffffffff166111f7611774565b73ffffffffffffffffffffffffffffffffffffffff161461124d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112449061426b565b60405180910390fd5b8060099080519060200190611263929190613886565b5050565b61126f61257c565b73ffffffffffffffffffffffffffffffffffffffff1661128d611774565b73ffffffffffffffffffffffffffffffffffffffff16146112e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112da9061426b565b60405180910390fd5b60006112ed611a7b565b905060008111611332576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113299061490d565b60405180910390fd5b611350739ce6671d8cc327a3e6f164db0b7d5e2dd7d5776182612c84565b50565b61136e83838360405180602001604052806000815250611cb9565b505050565b600061137d61257c565b73ffffffffffffffffffffffffffffffffffffffff1661139b611774565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e89061426b565b60405180910390fd5b600b54600c54611401919061492d565b905090565b6000611410610d59565b8210611451576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611448906149d3565b60405180910390fd5b819050919050565b600080600e54141561146e5760009050611487565b6000600f5414156114825760019050611487565b600290505b90565b600061149582612d35565b600001519050919050565b601280546114ad906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546114d9906142ba565b80156115265780601f106114fb57610100808354040283529160200191611526565b820191906000526020600020905b81548152906001019060200180831161150957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561159f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159690614a65565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61161f61257c565b73ffffffffffffffffffffffffffffffffffffffff1661163d611774565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a9061426b565b60405180910390fd5b61169d6000612f38565b565b60008060105414156116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614af7565b60405180910390fd5b601054905090565b6116f661257c565b73ffffffffffffffffffffffffffffffffffffffff16611714611774565b73ffffffffffffffffffffffffffffffffffffffff161461176a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117619061426b565b60405180910390fd5b80600a8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546117ad906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546117d9906142ba565b80156118265780601f106117fb57610100808354040283529160200191611826565b820191906000526020600020905b81548152906001019060200180831161180957829003601f168201915b5050505050905090565b61183861257c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90614b63565b60405180910390fd5b80600660006118b361257c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661196061257c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119a59190613aa2565b60405180910390a35050565b6119b961257c565b73ffffffffffffffffffffffffffffffffffffffff166119d7611774565b73ffffffffffffffffffffffffffffffffffffffff1614611a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a249061426b565b60405180910390fd5b600060105414611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6990614bf5565b60405180910390fd5b42601081905550565b6000611a8561257c565b73ffffffffffffffffffffffffffffffffffffffff16611aa3611774565b73ffffffffffffffffffffffffffffffffffffffff1614611af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af09061426b565b60405180910390fd5b47905090565b6000611b09611459565b9050600280811115611b1e57611b1d613f56565b5b816002811115611b3157611b30613f56565b5b14611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890614c61565b60405180910390fd5b600b54600c54611b81919061492d565b7f00000000000000000000000000000000000000000000000000000000000003e7611bac919061492d565b82611bb5610d59565b611bbf91906144d1565b1115611c00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf790614ccd565b60405180910390fd5b81611c09611d15565b611c139190614ced565b341015611c55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4c90614ddf565b60405180910390fd5b611c5f33836126ad565b81601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cae91906144d1565b925050819055505050565b611cc48484846126cb565b611cd084848484612ffe565b611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0690614e71565b60405180910390fd5b50505050565b6000600a54905090565b611d2761257c565b73ffffffffffffffffffffffffffffffffffffffff16611d45611774565b73ffffffffffffffffffffffffffffffffffffffff1614611d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d929061426b565b60405180910390fd5b8060129080519060200190611db1929190613886565b5050565b6060611dc0826125ee565b611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df690614f03565b60405180910390fd5b60006010541415611e9c5760128054611e17906142ba565b80601f0160208091040260200160405190810160405280929190818152602001828054611e43906142ba565b8015611e905780601f10611e6557610100808354040283529160200191611e90565b820191906000526020600020905b815481529060010190602001808311611e7357829003601f168201915b50505050509050611ef5565b6000611ea6613195565b90506000815111611ec65760405180602001604052806000815250611ef1565b80611ed084613227565b604051602001611ee1929190614fa0565b6040516020818303038152906040525b9150505b919050565b60075481565b828282611f0f338484846110d3565b611f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f459061501b565b60405180910390fd5b6000611f58611459565b905060006002811115611f6e57611f6d613f56565b5b816002811115611f8157611f80613f56565b5b1415611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990615087565b60405180910390fd5b600280811115611fd557611fd4613f56565b5b816002811115611fe857611fe7613f56565b5b1415612029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202090615119565b60405180910390fd5b600b54600c54612039919061492d565b7f00000000000000000000000000000000000000000000000000000000000003e7612064919061492d565b8861206d610d59565b61207791906144d1565b11156120b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120af90614ccd565b60405180910390fd5b600388601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461210591906144d1565b1115612146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213d906151ab565b60405180910390fd5b8761214f611d15565b6121599190614ced565b34101561219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219290615263565b60405180910390fd5b6121a533896126ad565b87601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f491906144d1565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122a161257c565b73ffffffffffffffffffffffffffffffffffffffff166122bf611774565b73ffffffffffffffffffffffffffffffffffffffff1614612315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230c9061426b565b60405180910390fd5b6000600281111561232957612328613f56565b5b612331611459565b600281111561234357612342613f56565b5b14612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237a906152cf565b60405180910390fd5b42600e81905550565b61239461257c565b73ffffffffffffffffffffffffffffffffffffffff166123b2611774565b73ffffffffffffffffffffffffffffffffffffffff1614612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff9061426b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246f90615361565b60405180910390fd5b61248181612f38565b50565b61248c61257c565b73ffffffffffffffffffffffffffffffffffffffff166124aa611774565b73ffffffffffffffffffffffffffffffffffffffff1614612500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f79061426b565b60405180910390fd5b6001600281111561251457612513613f56565b5b61251c611459565b600281111561252e5761252d613f56565b5b1461256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906153cd565b60405180910390fd5b42600f81905550565b600381565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6126c7828260405180602001604052806000815250613388565b5050565b60006126d682612d35565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166126fd61257c565b73ffffffffffffffffffffffffffffffffffffffff161480612759575061272261257c565b73ffffffffffffffffffffffffffffffffffffffff1661274184610bbb565b73ffffffffffffffffffffffffffffffffffffffff16145b806127755750612774826000015161276f61257c565b612205565b5b9050806127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae9061545f565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612820906154f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612899576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289090615583565b60405180910390fd5b6128a68585856001613867565b6128b660008484600001516125fb565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661292491906155bf565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129c891906155f3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612ace91906144d1565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c1457612b44816125ee565b15612c13576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c7c868686600161386d565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612caa9061566a565b60006040518083038185875af1925050503d8060008114612ce7576040519150601f19603f3d011682016040523d82523d6000602084013e612cec565b606091505b5050905080612d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d27906156cb565b60405180910390fd5b505050565b612d3d61390c565b612d46826125ee565b612d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7c9061575d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a8310612de95760017f000000000000000000000000000000000000000000000000000000000000000a84612ddc919061492d565b612de691906144d1565b90505b60008390505b818110612ef7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ee357809350505050612f33565b508080612eef9061577d565b915050612def565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2a90615819565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061301f8473ffffffffffffffffffffffffffffffffffffffff16613873565b15613188578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261304861257c565b8786866040518563ffffffff1660e01b815260040161306a949392919061588e565b602060405180830381600087803b15801561308457600080fd5b505af19250505080156130b557506040513d601f19601f820116820180604052508101906130b291906158ef565b60015b613138573d80600081146130e5576040519150601f19603f3d011682016040523d82523d6000602084013e6130ea565b606091505b50600081511415613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312790614e71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061318d565b600190505b949350505050565b6060600980546131a4906142ba565b80601f01602080910402602001604051908101604052809291908181526020018280546131d0906142ba565b801561321d5780601f106131f25761010080835404028352916020019161321d565b820191906000526020600020905b81548152906001019060200180831161320057829003601f168201915b5050505050905090565b6060600082141561326f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613383565b600082905060005b600082146132a157808061328a9061464b565b915050600a8261329a919061594b565b9150613277565b60008167ffffffffffffffff8111156132bd576132bc613de2565b5b6040519080825280601f01601f1916602001820160405280156132ef5781602001600182028036833780820191505090505b5090505b6000851461337c57600182613308919061492d565b9150600a85613317919061597c565b603061332391906144d1565b60f81b818381518110613339576133386159ad565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613375919061594b565b94506132f3565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f590615a4e565b60405180910390fd5b613407816125ee565b15613447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161343e90615aba565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156134aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a190615b4c565b60405180910390fd5b6134b76000858386613867565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516135b491906155f3565b6fffffffffffffffffffffffffffffffff1681526020018583602001516135db91906155f3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561384a57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46137ea6000888488612ffe565b613829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161382090614e71565b60405180910390fd5b81806138349061464b565b92505080806138429061464b565b915050613779565b508060008190555061385f600087858861386d565b505050505050565b50505050565b50505050565b600080823b905060008111915050919050565b828054613892906142ba565b90600052602060002090601f0160209004810192826138b457600085556138fb565b82601f106138cd57805160ff19168380011785556138fb565b828001600101855582156138fb579182015b828111156138fa5782518255916020019190600101906138df565b5b5090506139089190613946565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561395f576000816000905550600101613947565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006139a282613977565b9050919050565b6139b281613997565b81146139bd57600080fd5b50565b6000813590506139cf816139a9565b92915050565b6000602082840312156139eb576139ea61396d565b5b60006139f9848285016139c0565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613a3781613a02565b8114613a4257600080fd5b50565b600081359050613a5481613a2e565b92915050565b600060208284031215613a7057613a6f61396d565b5b6000613a7e84828501613a45565b91505092915050565b60008115159050919050565b613a9c81613a87565b82525050565b6000602082019050613ab76000830184613a93565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613af7578082015181840152602081019050613adc565b83811115613b06576000848401525b50505050565b6000601f19601f8301169050919050565b6000613b2882613abd565b613b328185613ac8565b9350613b42818560208601613ad9565b613b4b81613b0c565b840191505092915050565b60006020820190508181036000830152613b708184613b1d565b905092915050565b6000819050919050565b613b8b81613b78565b8114613b9657600080fd5b50565b600081359050613ba881613b82565b92915050565b600060208284031215613bc457613bc361396d565b5b6000613bd284828501613b99565b91505092915050565b613be481613997565b82525050565b6000602082019050613bff6000830184613bdb565b92915050565b60008060408385031215613c1c57613c1b61396d565b5b6000613c2a858286016139c0565b9250506020613c3b85828601613b99565b9150509250929050565b613c4e81613b78565b82525050565b6000602082019050613c696000830184613c45565b92915050565b60008060408385031215613c8657613c8561396d565b5b6000613c9485828601613b99565b9250506020613ca5858286016139c0565b9150509250929050565b600080600060608486031215613cc857613cc761396d565b5b6000613cd6868287016139c0565b9350506020613ce7868287016139c0565b9250506040613cf886828701613b99565b9150509250925092565b600060ff82169050919050565b613d1881613d02565b8114613d2357600080fd5b50565b600081359050613d3581613d0f565b92915050565b6000819050919050565b613d4e81613d3b565b8114613d5957600080fd5b50565b600081359050613d6b81613d45565b92915050565b60008060008060808587031215613d8b57613d8a61396d565b5b6000613d99878288016139c0565b9450506020613daa87828801613d26565b9350506040613dbb87828801613d5c565b9250506060613dcc87828801613d5c565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613e1a82613b0c565b810181811067ffffffffffffffff82111715613e3957613e38613de2565b5b80604052505050565b6000613e4c613963565b9050613e588282613e11565b919050565b600067ffffffffffffffff821115613e7857613e77613de2565b5b613e8182613b0c565b9050602081019050919050565b82818337600083830152505050565b6000613eb0613eab84613e5d565b613e42565b905082815260208101848484011115613ecc57613ecb613ddd565b5b613ed7848285613e8e565b509392505050565b600082601f830112613ef457613ef3613dd8565b5b8135613f04848260208601613e9d565b91505092915050565b600060208284031215613f2357613f2261396d565b5b600082013567ffffffffffffffff811115613f4157613f40613972565b5b613f4d84828501613edf565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613f9657613f95613f56565b5b50565b6000819050613fa782613f85565b919050565b6000613fb782613f99565b9050919050565b613fc781613fac565b82525050565b6000602082019050613fe26000830184613fbe565b92915050565b613ff181613a87565b8114613ffc57600080fd5b50565b60008135905061400e81613fe8565b92915050565b6000806040838503121561402b5761402a61396d565b5b6000614039858286016139c0565b925050602061404a85828601613fff565b9150509250929050565b600067ffffffffffffffff82111561406f5761406e613de2565b5b61407882613b0c565b9050602081019050919050565b600061409861409384614054565b613e42565b9050828152602081018484840111156140b4576140b3613ddd565b5b6140bf848285613e8e565b509392505050565b600082601f8301126140dc576140db613dd8565b5b81356140ec848260208601614085565b91505092915050565b6000806000806080858703121561410f5761410e61396d565b5b600061411d878288016139c0565b945050602061412e878288016139c0565b935050604061413f87828801613b99565b925050606085013567ffffffffffffffff8111156141605761415f613972565b5b61416c878288016140c7565b91505092959194509250565b600080600080608085870312156141925761419161396d565b5b60006141a087828801613b99565b94505060206141b187828801613d26565b93505060406141c287828801613d5c565b92505060606141d387828801613d5c565b91505092959194509250565b600080604083850312156141f6576141f561396d565b5b6000614204858286016139c0565b9250506020614215858286016139c0565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614255602083613ac8565b91506142608261421f565b602082019050919050565b6000602082019050818103600083015261428481614248565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142d257607f821691505b602082108114156142e6576142e561428b565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000614348602d83613ac8565b9150614353826142ec565b604082019050919050565b600060208201905081810360008301526143778161433b565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143da602283613ac8565b91506143e58261437e565b604082019050919050565b60006020820190508181036000830152614409816143cd565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061446c603983613ac8565b915061447782614410565b604082019050919050565b6000602082019050818103600083015261449b8161445f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144dc82613b78565b91506144e783613b78565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561451c5761451b6144a2565b5b828201905092915050565b7f4e6f7420656e6f756768205265736572766564204e465473206c65667420746f60008201527f206d696e742e2e00000000000000000000000000000000000000000000000000602082015250565b6000614583602783613ac8565b915061458e82614527565b604082019050919050565b600060208201905081810360008301526145b281614576565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000614615602283613ac8565b9150614620826145b9565b604082019050919050565b6000602082019050818103600083015261464481614608565b9050919050565b600061465682613b78565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614689576146886144a2565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006146f0602e83613ac8565b91506146fb82614694565b604082019050919050565b6000602082019050818103600083015261471f816146e3565b9050919050565b60008160601b9050919050565b600061473e82614726565b9050919050565b600061475082614733565b9050919050565b61476861476382613997565b614745565b82525050565b600061477a8285614757565b60148201915061478a8284614757565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006147db601c8361479a565b91506147e6826147a5565b601c82019050919050565b6000819050919050565b61480c61480782613d3b565b6147f1565b82525050565b600061481d826147ce565b915061482982846147fb565b60208201915081905092915050565b61484181613d3b565b82525050565b61485081613d02565b82525050565b600060808201905061486b6000830187614838565b6148786020830186614847565b6148856040830185614838565b6148926060830184614838565b95945050505050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b60006148f7602283613ac8565b91506149028261489b565b604082019050919050565b60006020820190508181036000830152614926816148ea565b9050919050565b600061493882613b78565b915061494383613b78565b925082821015614956576149556144a2565b5b828203905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006149bd602383613ac8565b91506149c882614961565b604082019050919050565b600060208201905081810360008301526149ec816149b0565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614a4f602b83613ac8565b9150614a5a826149f3565b604082019050919050565b60006020820190508181036000830152614a7e81614a42565b9050919050565b7f4e46542052657665616c2054696d6520686173206e6f74206265656e2064657460008201527f65726d696e656420796574210000000000000000000000000000000000000000602082015250565b6000614ae1602c83613ac8565b9150614aec82614a85565b604082019050919050565b60006020820190508181036000830152614b1081614ad4565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614b4d601a83613ac8565b9150614b5882614b17565b602082019050919050565b60006020820190508181036000830152614b7c81614b40565b9050919050565b7f436f6c6c656374696f6e2068617320616c7265616479206265656e207265766560008201527f616c656421000000000000000000000000000000000000000000000000000000602082015250565b6000614bdf602583613ac8565b9150614bea82614b83565b604082019050919050565b60006020820190508181036000830152614c0e81614bd2565b9050919050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b6000614c4b601c83613ac8565b9150614c5682614c15565b602082019050919050565b60006020820190508181036000830152614c7a81614c3e565b9050919050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614cb7601e83613ac8565b9150614cc282614c81565b602082019050919050565b60006020820190508181036000830152614ce681614caa565b9050919050565b6000614cf882613b78565b9150614d0383613b78565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614d3c57614d3b6144a2565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303320657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b6000614dc9605183613ac8565b9150614dd482614d47565b606082019050919050565b60006020820190508181036000830152614df881614dbc565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614e5b603383613ac8565b9150614e6682614dff565b604082019050919050565b60006020820190508181036000830152614e8a81614e4e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614eed602f83613ac8565b9150614ef882614e91565b604082019050919050565b60006020820190508181036000830152614f1c81614ee0565b9050919050565b6000614f2e82613abd565b614f38818561479a565b9350614f48818560208601613ad9565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614f8a60058361479a565b9150614f9582614f54565b600582019050919050565b6000614fac8285614f23565b9150614fb88284614f23565b9150614fc382614f7d565b91508190509392505050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000615005601183613ac8565b915061501082614fcf565b602082019050919050565b6000602082019050818103600083015261503481614ff8565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000615071601583613ac8565b915061507c8261503b565b602082019050919050565b600060208201905081810360008301526150a081615064565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000615103602a83613ac8565b915061510e826150a7565b604082019050919050565b60006020820190508181036000830152615132816150f6565b9050919050565b7f4d6178696d756d2033204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000615195602483613ac8565b91506151a082615139565b604082019050919050565b600060208201905081810360008301526151c481615188565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303320657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b600061524d604d83613ac8565b9150615258826151cb565b606082019050919050565b6000602082019050818103600083015261527c81615240565b9050919050565b7f53616c6520697320616c7265616479204f70656e210000000000000000000000600082015250565b60006152b9601583613ac8565b91506152c482615283565b602082019050919050565b600060208201905081810360008301526152e8816152ac565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061534b602683613ac8565b9150615356826152ef565b604082019050919050565b6000602082019050818103600083015261537a8161533e565b9050919050565b7f53616c65206d75737420626520696e2050726573616c65210000000000000000600082015250565b60006153b7601883613ac8565b91506153c282615381565b602082019050919050565b600060208201905081810360008301526153e6816153aa565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615449603283613ac8565b9150615454826153ed565b604082019050919050565b600060208201905081810360008301526154788161543c565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006154db602683613ac8565b91506154e68261547f565b604082019050919050565b6000602082019050818103600083015261550a816154ce565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061556d602583613ac8565b915061557882615511565b604082019050919050565b6000602082019050818103600083015261559c81615560565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006155ca826155a3565b91506155d5836155a3565b9250828210156155e8576155e76144a2565b5b828203905092915050565b60006155fe826155a3565b9150615609836155a3565b9250826fffffffffffffffffffffffffffffffff0382111561562e5761562d6144a2565b5b828201905092915050565b600081905092915050565b50565b6000615654600083615639565b915061565f82615644565b600082019050919050565b600061567582615647565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b60006156b5601483613ac8565b91506156c08261567f565b602082019050919050565b600060208201905081810360008301526156e4816156a8565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615747602a83613ac8565b9150615752826156eb565b604082019050919050565b600060208201905081810360008301526157768161573a565b9050919050565b600061578882613b78565b9150600082141561579c5761579b6144a2565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615803602f83613ac8565b915061580e826157a7565b604082019050919050565b60006020820190508181036000830152615832816157f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061586082615839565b61586a8185615844565b935061587a818560208601613ad9565b61588381613b0c565b840191505092915050565b60006080820190506158a36000830187613bdb565b6158b06020830186613bdb565b6158bd6040830185613c45565b81810360608301526158cf8184615855565b905095945050505050565b6000815190506158e981613a2e565b92915050565b6000602082840312156159055761590461396d565b5b6000615913848285016158da565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061595682613b78565b915061596183613b78565b9250826159715761597061591c565b5b828204905092915050565b600061598782613b78565b915061599283613b78565b9250826159a2576159a161591c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615a38602183613ac8565b9150615a43826159dc565b604082019050919050565b60006020820190508181036000830152615a6781615a2b565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b6000615aa4601d83613ac8565b9150615aaf82615a6e565b602082019050919050565b60006020820190508181036000830152615ad381615a97565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b36602283613ac8565b9150615b4182615ada565b604082019050919050565b60006020820190508181036000830152615b6581615b29565b905091905056fea2646970667358221220ba78458034063d1177c649e935ffcde3efd2f3202c29270eb5483051bfa30f5064736f6c63430008090033
Deployed Bytecode Sourcemap
38090:7886:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39744:8;;;44682:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25786:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27512:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29037:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28600:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24347:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43569:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29887:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24978:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39143:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41168:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39971:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44106:244;;;;;;;;;;;;;:::i;:::-;;30092:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44836:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24510:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45046:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27335:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39351:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26212:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4656:94;;;;;;;;;;;;;:::i;:::-;;45520:172;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45866:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4005:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27667:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29305:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45700:158;;;;;;;;;;;;;:::i;:::-;;43937:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42395:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30312:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45392:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40088:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42956:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34727:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41533:803;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29642:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40221:170;;;;;;;;;;;;;:::i;:::-;;4905:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40399:180;;;;;;;;;;;;;:::i;:::-;;38421:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44682:87;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44755:6:::1;44747:5;;:14;;;;;;;;;;;;;;;;;;44682:87:::0;:::o;25786:370::-;25913:4;25958:25;25943:40;;;:11;:40;;;;:99;;;;26009:33;25994:48;;;:11;:48;;;;25943:99;:160;;;;26068:35;26053:50;;;:11;:50;;;;25943:160;:207;;;;26114:36;26138:11;26114:23;:36::i;:::-;25943:207;25929:221;;25786:370;;;:::o;27512:94::-;27566:13;27595:5;27588:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27512:94;:::o;29037:204::-;29105:7;29129:16;29137:7;29129;:16::i;:::-;29121:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29211:15;:24;29227:7;29211:24;;;;;;;;;;;;;;;;;;;;;29204:31;;29037:204;;;:::o;28600:379::-;28669:13;28685:24;28701:7;28685:15;:24::i;:::-;28669:40;;28730:5;28724:11;;:2;:11;;;;28716:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28815:5;28799:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28824:37;28841:5;28848:12;:10;:12::i;:::-;28824:16;:37::i;:::-;28799:62;28783:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28945:28;28954:2;28958:7;28967:5;28945:8;:28::i;:::-;28662:317;28600:379;;:::o;24347:94::-;24400:7;24423:12;;24416:19;;24347:94;:::o;43569:318::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43686:16:::1;;43676:6;43659:14;;:23;;;;:::i;:::-;:43;;43651:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43759:28;43769:9;43780:6;43759:9;:28::i;:::-;43828:6;43798:15;:26;43814:9;43798:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;43863:6;43845:14;;:24;;;;;;;:::i;:::-;;;;;;;;43569:318:::0;;:::o;29887:142::-;29995:28;30005:4;30011:2;30015:7;29995:9;:28::i;:::-;29887:142;;;:::o;24978:744::-;25087:7;25122:16;25132:5;25122:9;:16::i;:::-;25114:5;:24;25106:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25184:22;25209:13;:11;:13::i;:::-;25184:38;;25229:19;25259:25;25309:9;25304:350;25328:14;25324:1;:18;25304:350;;;25358:31;25392:11;:14;25404:1;25392:14;;;;;;;;;;;25358:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25445:1;25419:28;;:9;:14;;;:28;;;25415:89;;25480:9;:14;;;25460:34;;25415:89;25537:5;25516:26;;:17;:26;;;25512:135;;;25574:5;25559:11;:20;25555:59;;;25601:1;25594:8;;;;;;;;;25555:59;25624:13;;;;;:::i;:::-;;;;25512:135;25349:305;25344:3;;;;;:::i;:::-;;;;25304:350;;;;25660:56;;;;;;;;;;:::i;:::-;;;;;;;;24978:744;;;;;:::o;39143:50::-;;;;;;;;;;;;;;;;;:::o;41168:306::-;41267:4;41284:12;41334:4;41341;41309:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41299:48;;;;;;41284:63;;41374:92;41447:4;41394:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;41384:69;;;;;;41455:2;41459;41463;41374:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41365:101;;:5;;;;;;;;;;;:101;;;41358:108;;;41168:306;;;;;;:::o;39971:109::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40064:8:::1;40046:15;:26;;;;;;;;;;;;:::i;:::-;;39971:109:::0;:::o;44106:244::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44154:15:::1;44172:16;:14;:16::i;:::-;44154:34;;44217:1;44207:7;:11;44199:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44270:71;44288:42;44333:7;44270:9;:71::i;:::-;44143:207;44106:244::o:0;30092:157::-;30204:39;30221:4;30227:2;30231:7;30204:39;;;;;;;;;;;;:16;:39::i;:::-;30092:157;;;:::o;44836:124::-;44895:4;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44938:14:::1;;44919:16;;:33;;;;:::i;:::-;44912:40;;44836:124:::0;:::o;24510:177::-;24577:7;24609:13;:11;:13::i;:::-;24601:5;:21;24593:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24676:5;24669:12;;24510:177;;;:::o;45046:297::-;45087:5;45129:1;45108:17;;:22;45104:232;;;45154:12;45147:19;;;;45104:232;45221:1;45197:20;;:25;45193:143;;;45246:13;45239:20;;;;45193:143;45308:16;45301:23;;45046:297;;:::o;27335:118::-;27399:7;27422:20;27434:7;27422:11;:20::i;:::-;:25;;;27415:32;;27335:118;;;:::o;39351:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26212:211::-;26276:7;26317:1;26300:19;;:5;:19;;;;26292:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26389:12;:19;26402:5;26389:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26381:36;;26374:43;;26212:211;;;:::o;4656:94::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4721:21:::1;4739:1;4721:9;:21::i;:::-;4656:94::o:0;45520:172::-;45564:7;45606:1;45592:10;;:15;;45584:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;45674:10;;45667:17;;45520:172;:::o;45866:96::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45947:7:::1;45935:9;:19;;;;45866:96:::0;:::o;4005:87::-;4051:7;4078:6;;;;;;;;;;;4071:13;;4005:87;:::o;27667:98::-;27723:13;27752:7;27745:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27667:98;:::o;29305:274::-;29408:12;:10;:12::i;:::-;29396:24;;:8;:24;;;;29388:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29505:8;29460:18;:32;29479:12;:10;:12::i;:::-;29460:32;;;;;;;;;;;;;;;:42;29493:8;29460:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29554:8;29525:48;;29540:12;:10;:12::i;:::-;29525:48;;;29564:8;29525:48;;;;;;:::i;:::-;;;;;;;;29305:274;;:::o;45700:158::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45768:1:::1;45754:10;;:15;45746:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45835:15;45822:10;:28;;;;45700:158::o:0;43937:109::-;43993:4;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44017:21:::1;44010:28;;43937:109:::0;:::o;42395:549::-;42461:16;42480:11;:9;:11::i;:::-;42461:30;;42524:16;42510:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;42502:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42655:14;;42636:16;;:33;;;;:::i;:::-;42618:14;:52;;;;:::i;:::-;42608:6;42592:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:78;;42584:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42750:6;42737:10;:8;:10::i;:::-;:19;;;;:::i;:::-;42724:9;:32;;42716:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;42857:29;42867:10;42879:6;42857:9;:29::i;:::-;42928:6;42897:15;:27;42913:10;42897:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;42450:494;42395:549;:::o;30312:311::-;30449:28;30459:4;30465:2;30469:7;30449:9;:28::i;:::-;30500:48;30523:4;30529:2;30533:7;30542:5;30500:22;:48::i;:::-;30484:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;30312:311;;;;:::o;45392:82::-;45432:4;45456:9;;45449:16;;45392:82;:::o;40088:125::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40191:14:::1;40175:13;:30;;;;;;;;;;;;:::i;:::-;;40088:125:::0;:::o;42956:568::-;43030:13;43064:17;43072:8;43064:7;:17::i;:::-;43056:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43259:1;43245:10;;:15;43241:272;;;43284:13;43277:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43241:272;43349:21;43373:10;:8;:10::i;:::-;43349:34;;43429:1;43411:7;43405:21;:25;:96;;;;;;;;;;;;;;;;;43457:7;43466:19;:8;:17;:19::i;:::-;43440:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43405:96;43398:103;;;42956:568;;;;:::o;34727:43::-;;;;:::o;41533:803::-;41620:2;41625;41629;40670:41;40691:10;40702:2;40705;40708;40670:20;:41::i;:::-;40661:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41659:16:::1;41678:11;:9;:11::i;:::-;41659:30;;41722:12;41708:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;41700:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41793:16;41779:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;41771:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41939:14;;41919:16;;:34;;;;:::i;:::-;41901:14;:53;;;;:::i;:::-;41891:6;41875:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:79;;41867:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;38462:1;42038:6;42008:15;:27;42024:10;42008:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:54;;42000:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;42148:6;42135:10;:8;:10::i;:::-;:19;;;;:::i;:::-;42122:9;:32;;42114:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;42249:29;42259:10;42271:6;42249:9;:29::i;:::-;42320:6;42289:15;:27;42305:10;42289:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;41648:688;41533:803:::0;;;;;;;:::o;29642:186::-;29764:4;29787:18;:25;29806:5;29787:25;;;;;;;;;;;;;;;:35;29813:8;29787:35;;;;;;;;;;;;;;;;;;;;;;;;;29780:42;;29642:186;;;;:::o;40221:170::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40299:12:::1;40284:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;40276:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40368:15;40348:17;:35;;;;40221:170::o:0;4905:192::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5014:1:::1;4994:22;;:8;:22;;;;4986:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5070:19;5080:8;5070:9;:19::i;:::-;4905:192:::0;:::o;40399:180::-;4236:12;:10;:12::i;:::-;4225:23;;:7;:5;:7::i;:::-;:23;;;4217:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40480:13:::1;40465:28;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:28;;;;;;;;:::i;:::-;;;40457:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40556:15;40533:20;:38;;;;40399:180::o:0;38421:42::-;38462:1;38421:42;:::o;2793:98::-;2846:7;2873:10;2866:17;;2793:98;:::o;15991:157::-;16076:4;16115:25;16100:40;;;:11;:40;;;;16093:47;;15991:157;;;:::o;30862:105::-;30919:4;30949:12;;30939:7;:22;30932:29;;30862:105;;;:::o;34549:172::-;34673:2;34646:15;:24;34662:7;34646:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34707:7;34703:2;34687:28;;34696:5;34687:28;;;;;;;;;;;;34549:172;;;:::o;30973:98::-;31038:27;31048:2;31052:8;31038:27;;;;;;;;;;;;:9;:27::i;:::-;30973:98;;:::o;32914:1529::-;33011:35;33049:20;33061:7;33049:11;:20::i;:::-;33011:58;;33078:22;33120:13;:18;;;33104:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;33173:12;:10;:12::i;:::-;33149:36;;:20;33161:7;33149:11;:20::i;:::-;:36;;;33104:81;:142;;;;33196:50;33213:13;:18;;;33233:12;:10;:12::i;:::-;33196:16;:50::i;:::-;33104:142;33078:169;;33272:17;33256:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;33404:4;33382:26;;:13;:18;;;:26;;;33366:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;33493:1;33479:16;;:2;:16;;;;33471:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33546:43;33568:4;33574:2;33578:7;33587:1;33546:21;:43::i;:::-;33646:49;33663:1;33667:7;33676:13;:18;;;33646:8;:49::i;:::-;33734:1;33704:12;:18;33717:4;33704:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33770:1;33742:12;:16;33755:2;33742:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33801:43;;;;;;;;33816:2;33801:43;;;;;;33827:15;33801:43;;;;;33778:11;:20;33790:7;33778:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34072:19;34104:1;34094:7;:11;;;;:::i;:::-;34072:33;;34157:1;34116:43;;:11;:24;34128:11;34116:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;34112:236;;;34174:20;34182:11;34174:7;:20::i;:::-;34170:171;;;34234:97;;;;;;;;34261:13;:18;;;34234:97;;;;;;34292:13;:28;;;34234:97;;;;;34207:11;:24;34219:11;34207:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34170:171;34112:236;34380:7;34376:2;34361:27;;34370:4;34361:27;;;;;;;;;;;;34395:42;34416:4;34422:2;34426:7;34435:1;34395:20;:42::i;:::-;33004:1439;;;32914:1529;;;:::o;44425:183::-;44506:9;44521:7;:12;;44541:6;44521:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44505:47;;;44571:4;44563:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;44494:114;44425:183;;:::o;26675:606::-;26751:21;;:::i;:::-;26792:16;26800:7;26792;:16::i;:::-;26784:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26864:26;26912:12;26901:7;:23;26897:93;;26981:1;26966:12;26956:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;26935:47;;26897:93;27003:12;27018:7;27003:22;;26998:212;27035:18;27027:4;:26;26998:212;;27072:31;27106:11;:17;27118:4;27106:17;;;;;;;;;;;27072:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27162:1;27136:28;;:9;:14;;;:28;;;27132:71;;27184:9;27177:16;;;;;;;27132:71;27063:147;27055:6;;;;;:::i;:::-;;;;26998:212;;;;27218:57;;;;;;;;;;:::i;:::-;;;;;;;;26675:606;;;;:::o;5105:173::-;5161:16;5180:6;;;;;;;;;;;5161:25;;5206:8;5197:6;;:17;;;;;;;;;;;;;;;;;;5261:8;5230:40;;5251:8;5230:40;;;;;;;;;;;;5150:128;5105:173;:::o;36264:690::-;36401:4;36418:15;:2;:13;;;:15::i;:::-;36414:535;;;36473:2;36457:36;;;36494:12;:10;:12::i;:::-;36508:4;36514:7;36523:5;36457:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36444:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36705:1;36688:6;:13;:18;36684:215;;;36721:61;;;;;;;;;;:::i;:::-;;;;;;;;36684:215;36867:6;36861:13;36852:6;36848:2;36844:15;36837:38;36444:464;36589:45;;;36579:55;;;:6;:55;;;;36572:62;;;;;36414:535;36937:4;36930:11;;36264:690;;;;;;;:::o;39797:116::-;39857:13;39890:15;39883:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39797:116;:::o;409:723::-;465:13;695:1;686:5;:10;682:53;;;713:10;;;;;;;;;;;;;;;;;;;;;682:53;745:12;760:5;745:20;;776:14;801:78;816:1;808:4;:9;801:78;;834:8;;;;;:::i;:::-;;;;865:2;857:10;;;;;:::i;:::-;;;801:78;;;889:19;921:6;911:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;889:39;;939:154;955:1;946:5;:10;939:154;;983:1;973:11;;;;;:::i;:::-;;;1050:2;1042:5;:10;;;;:::i;:::-;1029:2;:24;;;;:::i;:::-;1016:39;;999:6;1006;999:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1079:2;1070:11;;;;;:::i;:::-;;;939:154;;;1117:6;1103:21;;;;;409:723;;;;:::o;31410:1272::-;31515:20;31538:12;;31515:35;;31579:1;31565:16;;:2;:16;;;;31557:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31756:21;31764:12;31756:7;:21::i;:::-;31755:22;31747:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31838:12;31826:8;:24;;31818:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31898:61;31928:1;31932:2;31936:12;31950:8;31898:21;:61::i;:::-;31968:30;32001:12;:16;32014:2;32001:16;;;;;;;;;;;;;;;31968:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32043:119;;;;;;;;32093:8;32063:11;:19;;;:39;;;;:::i;:::-;32043:119;;;;;;32146:8;32111:11;:24;;;:44;;;;:::i;:::-;32043:119;;;;;32024:12;:16;32037:2;32024:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32197:43;;;;;;;;32212:2;32197:43;;;;;;32223:15;32197:43;;;;;32169:11;:25;32181:12;32169:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32249:20;32272:12;32249:35;;32298:9;32293:281;32317:8;32313:1;:12;32293:281;;;32371:12;32367:2;32346:38;;32363:1;32346:38;;;;;;;;;;;;32411:59;32442:1;32446:2;32450:12;32464:5;32411:22;:59::i;:::-;32393:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;32552:14;;;;;:::i;:::-;;;;32327:3;;;;;:::i;:::-;;;;32293:281;;;;32597:12;32582;:27;;;;32616:60;32645:1;32649:2;32653:12;32667:8;32616:20;:60::i;:::-;31508:1174;;;31410:1272;;;:::o;37416:141::-;;;;;:::o;37943:140::-;;;;;:::o;6051:387::-;6111:4;6319:12;6386:7;6374:20;6366:28;;6429:1;6422:4;:8;6415:15;;;6051:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:474::-;5693:6;5701;5750:2;5738:9;5729:7;5725:23;5721:32;5718:119;;;5756:79;;:::i;:::-;5718:119;5876:1;5901:53;5946:7;5937:6;5926:9;5922:22;5901:53;:::i;:::-;5891:63;;5847:117;6003:2;6029:53;6074:7;6065:6;6054:9;6050:22;6029:53;:::i;:::-;6019:63;;5974:118;5625:474;;;;;:::o;6105:619::-;6182:6;6190;6198;6247:2;6235:9;6226:7;6222:23;6218:32;6215:119;;;6253:79;;:::i;:::-;6215:119;6373:1;6398:53;6443:7;6434:6;6423:9;6419:22;6398:53;:::i;:::-;6388:63;;6344:117;6500:2;6526:53;6571:7;6562:6;6551:9;6547:22;6526:53;:::i;:::-;6516:63;;6471:118;6628:2;6654:53;6699:7;6690:6;6679:9;6675:22;6654:53;:::i;:::-;6644:63;;6599:118;6105:619;;;;;:::o;6730:86::-;6765:7;6805:4;6798:5;6794:16;6783:27;;6730:86;;;:::o;6822:118::-;6893:22;6909:5;6893:22;:::i;:::-;6886:5;6883:33;6873:61;;6930:1;6927;6920:12;6873:61;6822:118;:::o;6946:135::-;6990:5;7028:6;7015:20;7006:29;;7044:31;7069:5;7044:31;:::i;:::-;6946:135;;;;:::o;7087:77::-;7124:7;7153:5;7142:16;;7087:77;;;:::o;7170:122::-;7243:24;7261:5;7243:24;:::i;:::-;7236:5;7233:35;7223:63;;7282:1;7279;7272:12;7223:63;7170:122;:::o;7298:139::-;7344:5;7382:6;7369:20;7360:29;;7398:33;7425:5;7398:33;:::i;:::-;7298:139;;;;:::o;7443:761::-;7527:6;7535;7543;7551;7600:3;7588:9;7579:7;7575:23;7571:33;7568:120;;;7607:79;;:::i;:::-;7568:120;7727:1;7752:53;7797:7;7788:6;7777:9;7773:22;7752:53;:::i;:::-;7742:63;;7698:117;7854:2;7880:51;7923:7;7914:6;7903:9;7899:22;7880:51;:::i;:::-;7870:61;;7825:116;7980:2;8006:53;8051:7;8042:6;8031:9;8027:22;8006:53;:::i;:::-;7996:63;;7951:118;8108:2;8134:53;8179:7;8170:6;8159:9;8155:22;8134:53;:::i;:::-;8124:63;;8079:118;7443:761;;;;;;;:::o;8210:117::-;8319:1;8316;8309:12;8333:117;8442:1;8439;8432:12;8456:180;8504:77;8501:1;8494:88;8601:4;8598:1;8591:15;8625:4;8622:1;8615:15;8642:281;8725:27;8747:4;8725:27;:::i;:::-;8717:6;8713:40;8855:6;8843:10;8840:22;8819:18;8807:10;8804:34;8801:62;8798:88;;;8866:18;;:::i;:::-;8798:88;8906:10;8902:2;8895:22;8685:238;8642:281;;:::o;8929:129::-;8963:6;8990:20;;:::i;:::-;8980:30;;9019:33;9047:4;9039:6;9019:33;:::i;:::-;8929:129;;;:::o;9064:308::-;9126:4;9216:18;9208:6;9205:30;9202:56;;;9238:18;;:::i;:::-;9202:56;9276:29;9298:6;9276:29;:::i;:::-;9268:37;;9360:4;9354;9350:15;9342:23;;9064:308;;;:::o;9378:154::-;9462:6;9457:3;9452;9439:30;9524:1;9515:6;9510:3;9506:16;9499:27;9378:154;;;:::o;9538:412::-;9616:5;9641:66;9657:49;9699:6;9657:49;:::i;:::-;9641:66;:::i;:::-;9632:75;;9730:6;9723:5;9716:21;9768:4;9761:5;9757:16;9806:3;9797:6;9792:3;9788:16;9785:25;9782:112;;;9813:79;;:::i;:::-;9782:112;9903:41;9937:6;9932:3;9927;9903:41;:::i;:::-;9622:328;9538:412;;;;;:::o;9970:340::-;10026:5;10075:3;10068:4;10060:6;10056:17;10052:27;10042:122;;10083:79;;:::i;:::-;10042:122;10200:6;10187:20;10225:79;10300:3;10292:6;10285:4;10277:6;10273:17;10225:79;:::i;:::-;10216:88;;10032:278;9970:340;;;;:::o;10316:509::-;10385:6;10434:2;10422:9;10413:7;10409:23;10405:32;10402:119;;;10440:79;;:::i;:::-;10402:119;10588:1;10577:9;10573:17;10560:31;10618:18;10610:6;10607:30;10604:117;;;10640:79;;:::i;:::-;10604:117;10745:63;10800:7;10791:6;10780:9;10776:22;10745:63;:::i;:::-;10735:73;;10531:287;10316:509;;;;:::o;10831:180::-;10879:77;10876:1;10869:88;10976:4;10973:1;10966:15;11000:4;10997:1;10990:15;11017:115;11100:1;11093:5;11090:12;11080:46;;11106:18;;:::i;:::-;11080:46;11017:115;:::o;11138:131::-;11185:7;11214:5;11203:16;;11220:43;11257:5;11220:43;:::i;:::-;11138:131;;;:::o;11275:::-;11333:9;11366:34;11394:5;11366:34;:::i;:::-;11353:47;;11275:131;;;:::o;11412:147::-;11507:45;11546:5;11507:45;:::i;:::-;11502:3;11495:58;11412:147;;:::o;11565:238::-;11666:4;11704:2;11693:9;11689:18;11681:26;;11717:79;11793:1;11782:9;11778:17;11769:6;11717:79;:::i;:::-;11565:238;;;;:::o;11809:116::-;11879:21;11894:5;11879:21;:::i;:::-;11872:5;11869:32;11859:60;;11915:1;11912;11905:12;11859:60;11809:116;:::o;11931:133::-;11974:5;12012:6;11999:20;11990:29;;12028:30;12052:5;12028:30;:::i;:::-;11931:133;;;;:::o;12070:468::-;12135:6;12143;12192:2;12180:9;12171:7;12167:23;12163:32;12160:119;;;12198:79;;:::i;:::-;12160:119;12318:1;12343:53;12388:7;12379:6;12368:9;12364:22;12343:53;:::i;:::-;12333:63;;12289:117;12445:2;12471:50;12513:7;12504:6;12493:9;12489:22;12471:50;:::i;:::-;12461:60;;12416:115;12070:468;;;;;:::o;12544:307::-;12605:4;12695:18;12687:6;12684:30;12681:56;;;12717:18;;:::i;:::-;12681:56;12755:29;12777:6;12755:29;:::i;:::-;12747:37;;12839:4;12833;12829:15;12821:23;;12544:307;;;:::o;12857:410::-;12934:5;12959:65;12975:48;13016:6;12975:48;:::i;:::-;12959:65;:::i;:::-;12950:74;;13047:6;13040:5;13033:21;13085:4;13078:5;13074:16;13123:3;13114:6;13109:3;13105:16;13102:25;13099:112;;;13130:79;;:::i;:::-;13099:112;13220:41;13254:6;13249:3;13244;13220:41;:::i;:::-;12940:327;12857:410;;;;;:::o;13286:338::-;13341:5;13390:3;13383:4;13375:6;13371:17;13367:27;13357:122;;13398:79;;:::i;:::-;13357:122;13515:6;13502:20;13540:78;13614:3;13606:6;13599:4;13591:6;13587:17;13540:78;:::i;:::-;13531:87;;13347:277;13286:338;;;;:::o;13630:943::-;13725:6;13733;13741;13749;13798:3;13786:9;13777:7;13773:23;13769:33;13766:120;;;13805:79;;:::i;:::-;13766:120;13925:1;13950:53;13995:7;13986:6;13975:9;13971:22;13950:53;:::i;:::-;13940:63;;13896:117;14052:2;14078:53;14123:7;14114:6;14103:9;14099:22;14078:53;:::i;:::-;14068:63;;14023:118;14180:2;14206:53;14251:7;14242:6;14231:9;14227:22;14206:53;:::i;:::-;14196:63;;14151:118;14336:2;14325:9;14321:18;14308:32;14367:18;14359:6;14356:30;14353:117;;;14389:79;;:::i;:::-;14353:117;14494:62;14548:7;14539:6;14528:9;14524:22;14494:62;:::i;:::-;14484:72;;14279:287;13630:943;;;;;;;:::o;14579:761::-;14663:6;14671;14679;14687;14736:3;14724:9;14715:7;14711:23;14707:33;14704:120;;;14743:79;;:::i;:::-;14704:120;14863:1;14888:53;14933:7;14924:6;14913:9;14909:22;14888:53;:::i;:::-;14878:63;;14834:117;14990:2;15016:51;15059:7;15050:6;15039:9;15035:22;15016:51;:::i;:::-;15006:61;;14961:116;15116:2;15142:53;15187:7;15178:6;15167:9;15163:22;15142:53;:::i;:::-;15132:63;;15087:118;15244:2;15270:53;15315:7;15306:6;15295:9;15291:22;15270:53;:::i;:::-;15260:63;;15215:118;14579:761;;;;;;;:::o;15346:474::-;15414:6;15422;15471:2;15459:9;15450:7;15446:23;15442:32;15439:119;;;15477:79;;:::i;:::-;15439:119;15597:1;15622:53;15667:7;15658:6;15647:9;15643:22;15622:53;:::i;:::-;15612:63;;15568:117;15724:2;15750:53;15795:7;15786:6;15775:9;15771:22;15750:53;:::i;:::-;15740:63;;15695:118;15346:474;;;;;:::o;15826:182::-;15966:34;15962:1;15954:6;15950:14;15943:58;15826:182;:::o;16014:366::-;16156:3;16177:67;16241:2;16236:3;16177:67;:::i;:::-;16170:74;;16253:93;16342:3;16253:93;:::i;:::-;16371:2;16366:3;16362:12;16355:19;;16014:366;;;:::o;16386:419::-;16552:4;16590:2;16579:9;16575:18;16567:26;;16639:9;16633:4;16629:20;16625:1;16614:9;16610:17;16603:47;16667:131;16793:4;16667:131;:::i;:::-;16659:139;;16386:419;;;:::o;16811:180::-;16859:77;16856:1;16849:88;16956:4;16953:1;16946:15;16980:4;16977:1;16970:15;16997:320;17041:6;17078:1;17072:4;17068:12;17058:22;;17125:1;17119:4;17115:12;17146:18;17136:81;;17202:4;17194:6;17190:17;17180:27;;17136:81;17264:2;17256:6;17253:14;17233:18;17230:38;17227:84;;;17283:18;;:::i;:::-;17227:84;17048:269;16997:320;;;:::o;17323:232::-;17463:34;17459:1;17451:6;17447:14;17440:58;17532:15;17527:2;17519:6;17515:15;17508:40;17323:232;:::o;17561:366::-;17703:3;17724:67;17788:2;17783:3;17724:67;:::i;:::-;17717:74;;17800:93;17889:3;17800:93;:::i;:::-;17918:2;17913:3;17909:12;17902:19;;17561:366;;;:::o;17933:419::-;18099:4;18137:2;18126:9;18122:18;18114:26;;18186:9;18180:4;18176:20;18172:1;18161:9;18157:17;18150:47;18214:131;18340:4;18214:131;:::i;:::-;18206:139;;17933:419;;;:::o;18358:221::-;18498:34;18494:1;18486:6;18482:14;18475:58;18567:4;18562:2;18554:6;18550:15;18543:29;18358:221;:::o;18585:366::-;18727:3;18748:67;18812:2;18807:3;18748:67;:::i;:::-;18741:74;;18824:93;18913:3;18824:93;:::i;:::-;18942:2;18937:3;18933:12;18926:19;;18585:366;;;:::o;18957:419::-;19123:4;19161:2;19150:9;19146:18;19138:26;;19210:9;19204:4;19200:20;19196:1;19185:9;19181:17;19174:47;19238:131;19364:4;19238:131;:::i;:::-;19230:139;;18957:419;;;:::o;19382:244::-;19522:34;19518:1;19510:6;19506:14;19499:58;19591:27;19586:2;19578:6;19574:15;19567:52;19382:244;:::o;19632:366::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19632:366;;;:::o;20004:419::-;20170:4;20208:2;20197:9;20193:18;20185:26;;20257:9;20251:4;20247:20;20243:1;20232:9;20228:17;20221:47;20285:131;20411:4;20285:131;:::i;:::-;20277:139;;20004:419;;;:::o;20429:180::-;20477:77;20474:1;20467:88;20574:4;20571:1;20564:15;20598:4;20595:1;20588:15;20615:305;20655:3;20674:20;20692:1;20674:20;:::i;:::-;20669:25;;20708:20;20726:1;20708:20;:::i;:::-;20703:25;;20862:1;20794:66;20790:74;20787:1;20784:81;20781:107;;;20868:18;;:::i;:::-;20781:107;20912:1;20909;20905:9;20898:16;;20615:305;;;;:::o;20926:226::-;21066:34;21062:1;21054:6;21050:14;21043:58;21135:9;21130:2;21122:6;21118:15;21111:34;20926:226;:::o;21158:366::-;21300:3;21321:67;21385:2;21380:3;21321:67;:::i;:::-;21314:74;;21397:93;21486:3;21397:93;:::i;:::-;21515:2;21510:3;21506:12;21499:19;;21158:366;;;:::o;21530:419::-;21696:4;21734:2;21723:9;21719:18;21711:26;;21783:9;21777:4;21773:20;21769:1;21758:9;21754:17;21747:47;21811:131;21937:4;21811:131;:::i;:::-;21803:139;;21530:419;;;:::o;21955:221::-;22095:34;22091:1;22083:6;22079:14;22072:58;22164:4;22159:2;22151:6;22147:15;22140:29;21955:221;:::o;22182:366::-;22324:3;22345:67;22409:2;22404:3;22345:67;:::i;:::-;22338:74;;22421:93;22510:3;22421:93;:::i;:::-;22539:2;22534:3;22530:12;22523:19;;22182:366;;;:::o;22554:419::-;22720:4;22758:2;22747:9;22743:18;22735:26;;22807:9;22801:4;22797:20;22793:1;22782:9;22778:17;22771:47;22835:131;22961:4;22835:131;:::i;:::-;22827:139;;22554:419;;;:::o;22979:233::-;23018:3;23041:24;23059:5;23041:24;:::i;:::-;23032:33;;23087:66;23080:5;23077:77;23074:103;;;23157:18;;:::i;:::-;23074:103;23204:1;23197:5;23193:13;23186:20;;22979:233;;;:::o;23218:::-;23358:34;23354:1;23346:6;23342:14;23335:58;23427:16;23422:2;23414:6;23410:15;23403:41;23218:233;:::o;23457:366::-;23599:3;23620:67;23684:2;23679:3;23620:67;:::i;:::-;23613:74;;23696:93;23785:3;23696:93;:::i;:::-;23814:2;23809:3;23805:12;23798:19;;23457:366;;;:::o;23829:419::-;23995:4;24033:2;24022:9;24018:18;24010:26;;24082:9;24076:4;24072:20;24068:1;24057:9;24053:17;24046:47;24110:131;24236:4;24110:131;:::i;:::-;24102:139;;23829:419;;;:::o;24254:94::-;24287:8;24335:5;24331:2;24327:14;24306:35;;24254:94;;;:::o;24354:::-;24393:7;24422:20;24436:5;24422:20;:::i;:::-;24411:31;;24354:94;;;:::o;24454:100::-;24493:7;24522:26;24542:5;24522:26;:::i;:::-;24511:37;;24454:100;;;:::o;24560:157::-;24665:45;24685:24;24703:5;24685:24;:::i;:::-;24665:45;:::i;:::-;24660:3;24653:58;24560:157;;:::o;24723:397::-;24863:3;24878:75;24949:3;24940:6;24878:75;:::i;:::-;24978:2;24973:3;24969:12;24962:19;;24991:75;25062:3;25053:6;24991:75;:::i;:::-;25091:2;25086:3;25082:12;25075:19;;25111:3;25104:10;;24723:397;;;;;:::o;25126:148::-;25228:11;25265:3;25250:18;;25126:148;;;;:::o;25280:214::-;25420:66;25416:1;25408:6;25404:14;25397:90;25280:214;:::o;25500:402::-;25660:3;25681:85;25763:2;25758:3;25681:85;:::i;:::-;25674:92;;25775:93;25864:3;25775:93;:::i;:::-;25893:2;25888:3;25884:12;25877:19;;25500:402;;;:::o;25908:79::-;25947:7;25976:5;25965:16;;25908:79;;;:::o;25993:157::-;26098:45;26118:24;26136:5;26118:24;:::i;:::-;26098:45;:::i;:::-;26093:3;26086:58;25993:157;;:::o;26156:522::-;26369:3;26391:148;26535:3;26391:148;:::i;:::-;26384:155;;26549:75;26620:3;26611:6;26549:75;:::i;:::-;26649:2;26644:3;26640:12;26633:19;;26669:3;26662:10;;26156:522;;;;:::o;26684:118::-;26771:24;26789:5;26771:24;:::i;:::-;26766:3;26759:37;26684:118;;:::o;26808:112::-;26891:22;26907:5;26891:22;:::i;:::-;26886:3;26879:35;26808:112;;:::o;26926:545::-;27099:4;27137:3;27126:9;27122:19;27114:27;;27151:71;27219:1;27208:9;27204:17;27195:6;27151:71;:::i;:::-;27232:68;27296:2;27285:9;27281:18;27272:6;27232:68;:::i;:::-;27310:72;27378:2;27367:9;27363:18;27354:6;27310:72;:::i;:::-;27392;27460:2;27449:9;27445:18;27436:6;27392:72;:::i;:::-;26926:545;;;;;;;:::o;27477:221::-;27617:34;27613:1;27605:6;27601:14;27594:58;27686:4;27681:2;27673:6;27669:15;27662:29;27477:221;:::o;27704:366::-;27846:3;27867:67;27931:2;27926:3;27867:67;:::i;:::-;27860:74;;27943:93;28032:3;27943:93;:::i;:::-;28061:2;28056:3;28052:12;28045:19;;27704:366;;;:::o;28076:419::-;28242:4;28280:2;28269:9;28265:18;28257:26;;28329:9;28323:4;28319:20;28315:1;28304:9;28300:17;28293:47;28357:131;28483:4;28357:131;:::i;:::-;28349:139;;28076:419;;;:::o;28501:191::-;28541:4;28561:20;28579:1;28561:20;:::i;:::-;28556:25;;28595:20;28613:1;28595:20;:::i;:::-;28590:25;;28634:1;28631;28628:8;28625:34;;;28639:18;;:::i;:::-;28625:34;28684:1;28681;28677:9;28669:17;;28501:191;;;;:::o;28698:222::-;28838:34;28834:1;28826:6;28822:14;28815:58;28907:5;28902:2;28894:6;28890:15;28883:30;28698:222;:::o;28926:366::-;29068:3;29089:67;29153:2;29148:3;29089:67;:::i;:::-;29082:74;;29165:93;29254:3;29165:93;:::i;:::-;29283:2;29278:3;29274:12;29267:19;;28926:366;;;:::o;29298:419::-;29464:4;29502:2;29491:9;29487:18;29479:26;;29551:9;29545:4;29541:20;29537:1;29526:9;29522:17;29515:47;29579:131;29705:4;29579:131;:::i;:::-;29571:139;;29298:419;;;:::o;29723:230::-;29863:34;29859:1;29851:6;29847:14;29840:58;29932:13;29927:2;29919:6;29915:15;29908:38;29723:230;:::o;29959:366::-;30101:3;30122:67;30186:2;30181:3;30122:67;:::i;:::-;30115:74;;30198:93;30287:3;30198:93;:::i;:::-;30316:2;30311:3;30307:12;30300:19;;29959:366;;;:::o;30331:419::-;30497:4;30535:2;30524:9;30520:18;30512:26;;30584:9;30578:4;30574:20;30570:1;30559:9;30555:17;30548:47;30612:131;30738:4;30612:131;:::i;:::-;30604:139;;30331:419;;;:::o;30756:231::-;30896:34;30892:1;30884:6;30880:14;30873:58;30965:14;30960:2;30952:6;30948:15;30941:39;30756:231;:::o;30993:366::-;31135:3;31156:67;31220:2;31215:3;31156:67;:::i;:::-;31149:74;;31232:93;31321:3;31232:93;:::i;:::-;31350:2;31345:3;31341:12;31334:19;;30993:366;;;:::o;31365:419::-;31531:4;31569:2;31558:9;31554:18;31546:26;;31618:9;31612:4;31608:20;31604:1;31593:9;31589:17;31582:47;31646:131;31772:4;31646:131;:::i;:::-;31638:139;;31365:419;;;:::o;31790:176::-;31930:28;31926:1;31918:6;31914:14;31907:52;31790:176;:::o;31972:366::-;32114:3;32135:67;32199:2;32194:3;32135:67;:::i;:::-;32128:74;;32211:93;32300:3;32211:93;:::i;:::-;32329:2;32324:3;32320:12;32313:19;;31972:366;;;:::o;32344:419::-;32510:4;32548:2;32537:9;32533:18;32525:26;;32597:9;32591:4;32587:20;32583:1;32572:9;32568:17;32561:47;32625:131;32751:4;32625:131;:::i;:::-;32617:139;;32344:419;;;:::o;32769:224::-;32909:34;32905:1;32897:6;32893:14;32886:58;32978:7;32973:2;32965:6;32961:15;32954:32;32769:224;:::o;32999:366::-;33141:3;33162:67;33226:2;33221:3;33162:67;:::i;:::-;33155:74;;33238:93;33327:3;33238:93;:::i;:::-;33356:2;33351:3;33347:12;33340:19;;32999:366;;;:::o;33371:419::-;33537:4;33575:2;33564:9;33560:18;33552:26;;33624:9;33618:4;33614:20;33610:1;33599:9;33595:17;33588:47;33652:131;33778:4;33652:131;:::i;:::-;33644:139;;33371:419;;;:::o;33796:178::-;33936:30;33932:1;33924:6;33920:14;33913:54;33796:178;:::o;33980:366::-;34122:3;34143:67;34207:2;34202:3;34143:67;:::i;:::-;34136:74;;34219:93;34308:3;34219:93;:::i;:::-;34337:2;34332:3;34328:12;34321:19;;33980:366;;;:::o;34352:419::-;34518:4;34556:2;34545:9;34541:18;34533:26;;34605:9;34599:4;34595:20;34591:1;34580:9;34576:17;34569:47;34633:131;34759:4;34633:131;:::i;:::-;34625:139;;34352:419;;;:::o;34777:180::-;34917:32;34913:1;34905:6;34901:14;34894:56;34777:180;:::o;34963:366::-;35105:3;35126:67;35190:2;35185:3;35126:67;:::i;:::-;35119:74;;35202:93;35291:3;35202:93;:::i;:::-;35320:2;35315:3;35311:12;35304:19;;34963:366;;;:::o;35335:419::-;35501:4;35539:2;35528:9;35524:18;35516:26;;35588:9;35582:4;35578:20;35574:1;35563:9;35559:17;35552:47;35616:131;35742:4;35616:131;:::i;:::-;35608:139;;35335:419;;;:::o;35760:348::-;35800:7;35823:20;35841:1;35823:20;:::i;:::-;35818:25;;35857:20;35875:1;35857:20;:::i;:::-;35852:25;;36045:1;35977:66;35973:74;35970:1;35967:81;35962:1;35955:9;35948:17;35944:105;35941:131;;;36052:18;;:::i;:::-;35941:131;36100:1;36097;36093:9;36082:20;;35760:348;;;;:::o;36114:305::-;36254:34;36250:1;36242:6;36238:14;36231:58;36323:34;36318:2;36310:6;36306:15;36299:59;36392:19;36387:2;36379:6;36375:15;36368:44;36114:305;:::o;36425:366::-;36567:3;36588:67;36652:2;36647:3;36588:67;:::i;:::-;36581:74;;36664:93;36753:3;36664:93;:::i;:::-;36782:2;36777:3;36773:12;36766:19;;36425:366;;;:::o;36797:419::-;36963:4;37001:2;36990:9;36986:18;36978:26;;37050:9;37044:4;37040:20;37036:1;37025:9;37021:17;37014:47;37078:131;37204:4;37078:131;:::i;:::-;37070:139;;36797:419;;;:::o;37222:238::-;37362:34;37358:1;37350:6;37346:14;37339:58;37431:21;37426:2;37418:6;37414:15;37407:46;37222:238;:::o;37466:366::-;37608:3;37629:67;37693:2;37688:3;37629:67;:::i;:::-;37622:74;;37705:93;37794:3;37705:93;:::i;:::-;37823:2;37818:3;37814:12;37807:19;;37466:366;;;:::o;37838:419::-;38004:4;38042:2;38031:9;38027:18;38019:26;;38091:9;38085:4;38081:20;38077:1;38066:9;38062:17;38055:47;38119:131;38245:4;38119:131;:::i;:::-;38111:139;;37838:419;;;:::o;38263:234::-;38403:34;38399:1;38391:6;38387:14;38380:58;38472:17;38467:2;38459:6;38455:15;38448:42;38263:234;:::o;38503:366::-;38645:3;38666:67;38730:2;38725:3;38666:67;:::i;:::-;38659:74;;38742:93;38831:3;38742:93;:::i;:::-;38860:2;38855:3;38851:12;38844:19;;38503:366;;;:::o;38875:419::-;39041:4;39079:2;39068:9;39064:18;39056:26;;39128:9;39122:4;39118:20;39114:1;39103:9;39099:17;39092:47;39156:131;39282:4;39156:131;:::i;:::-;39148:139;;38875:419;;;:::o;39300:377::-;39406:3;39434:39;39467:5;39434:39;:::i;:::-;39489:89;39571:6;39566:3;39489:89;:::i;:::-;39482:96;;39587:52;39632:6;39627:3;39620:4;39613:5;39609:16;39587:52;:::i;:::-;39664:6;39659:3;39655:16;39648:23;;39410:267;39300:377;;;;:::o;39683:155::-;39823:7;39819:1;39811:6;39807:14;39800:31;39683:155;:::o;39844:400::-;40004:3;40025:84;40107:1;40102:3;40025:84;:::i;:::-;40018:91;;40118:93;40207:3;40118:93;:::i;:::-;40236:1;40231:3;40227:11;40220:18;;39844:400;;;:::o;40250:701::-;40531:3;40553:95;40644:3;40635:6;40553:95;:::i;:::-;40546:102;;40665:95;40756:3;40747:6;40665:95;:::i;:::-;40658:102;;40777:148;40921:3;40777:148;:::i;:::-;40770:155;;40942:3;40935:10;;40250:701;;;;;:::o;40957:167::-;41097:19;41093:1;41085:6;41081:14;41074:43;40957:167;:::o;41130:366::-;41272:3;41293:67;41357:2;41352:3;41293:67;:::i;:::-;41286:74;;41369:93;41458:3;41369:93;:::i;:::-;41487:2;41482:3;41478:12;41471:19;;41130:366;;;:::o;41502:419::-;41668:4;41706:2;41695:9;41691:18;41683:26;;41755:9;41749:4;41745:20;41741:1;41730:9;41726:17;41719:47;41783:131;41909:4;41783:131;:::i;:::-;41775:139;;41502:419;;;:::o;41927:171::-;42067:23;42063:1;42055:6;42051:14;42044:47;41927:171;:::o;42104:366::-;42246:3;42267:67;42331:2;42326:3;42267:67;:::i;:::-;42260:74;;42343:93;42432:3;42343:93;:::i;:::-;42461:2;42456:3;42452:12;42445:19;;42104:366;;;:::o;42476:419::-;42642:4;42680:2;42669:9;42665:18;42657:26;;42729:9;42723:4;42719:20;42715:1;42704:9;42700:17;42693:47;42757:131;42883:4;42757:131;:::i;:::-;42749:139;;42476:419;;;:::o;42901:229::-;43041:34;43037:1;43029:6;43025:14;43018:58;43110:12;43105:2;43097:6;43093:15;43086:37;42901:229;:::o;43136:366::-;43278:3;43299:67;43363:2;43358:3;43299:67;:::i;:::-;43292:74;;43375:93;43464:3;43375:93;:::i;:::-;43493:2;43488:3;43484:12;43477:19;;43136:366;;;:::o;43508:419::-;43674:4;43712:2;43701:9;43697:18;43689:26;;43761:9;43755:4;43751:20;43747:1;43736:9;43732:17;43725:47;43789:131;43915:4;43789:131;:::i;:::-;43781:139;;43508:419;;;:::o;43933:223::-;44073:34;44069:1;44061:6;44057:14;44050:58;44142:6;44137:2;44129:6;44125:15;44118:31;43933:223;:::o;44162:366::-;44304:3;44325:67;44389:2;44384:3;44325:67;:::i;:::-;44318:74;;44401:93;44490:3;44401:93;:::i;:::-;44519:2;44514:3;44510:12;44503:19;;44162:366;;;:::o;44534:419::-;44700:4;44738:2;44727:9;44723:18;44715:26;;44787:9;44781:4;44777:20;44773:1;44762:9;44758:17;44751:47;44815:131;44941:4;44815:131;:::i;:::-;44807:139;;44534:419;;;:::o;44959:301::-;45099:34;45095:1;45087:6;45083:14;45076:58;45168:34;45163:2;45155:6;45151:15;45144:59;45237:15;45232:2;45224:6;45220:15;45213:40;44959:301;:::o;45266:366::-;45408:3;45429:67;45493:2;45488:3;45429:67;:::i;:::-;45422:74;;45505:93;45594:3;45505:93;:::i;:::-;45623:2;45618:3;45614:12;45607:19;;45266:366;;;:::o;45638:419::-;45804:4;45842:2;45831:9;45827:18;45819:26;;45891:9;45885:4;45881:20;45877:1;45866:9;45862:17;45855:47;45919:131;46045:4;45919:131;:::i;:::-;45911:139;;45638:419;;;:::o;46063:171::-;46203:23;46199:1;46191:6;46187:14;46180:47;46063:171;:::o;46240:366::-;46382:3;46403:67;46467:2;46462:3;46403:67;:::i;:::-;46396:74;;46479:93;46568:3;46479:93;:::i;:::-;46597:2;46592:3;46588:12;46581:19;;46240:366;;;:::o;46612:419::-;46778:4;46816:2;46805:9;46801:18;46793:26;;46865:9;46859:4;46855:20;46851:1;46840:9;46836:17;46829:47;46893:131;47019:4;46893:131;:::i;:::-;46885:139;;46612:419;;;:::o;47037:225::-;47177:34;47173:1;47165:6;47161:14;47154:58;47246:8;47241:2;47233:6;47229:15;47222:33;47037:225;:::o;47268:366::-;47410:3;47431:67;47495:2;47490:3;47431:67;:::i;:::-;47424:74;;47507:93;47596:3;47507:93;:::i;:::-;47625:2;47620:3;47616:12;47609:19;;47268:366;;;:::o;47640:419::-;47806:4;47844:2;47833:9;47829:18;47821:26;;47893:9;47887:4;47883:20;47879:1;47868:9;47864:17;47857:47;47921:131;48047:4;47921:131;:::i;:::-;47913:139;;47640:419;;;:::o;48065:174::-;48205:26;48201:1;48193:6;48189:14;48182:50;48065:174;:::o;48245:366::-;48387:3;48408:67;48472:2;48467:3;48408:67;:::i;:::-;48401:74;;48484:93;48573:3;48484:93;:::i;:::-;48602:2;48597:3;48593:12;48586:19;;48245:366;;;:::o;48617:419::-;48783:4;48821:2;48810:9;48806:18;48798:26;;48870:9;48864:4;48860:20;48856:1;48845:9;48841:17;48834:47;48898:131;49024:4;48898:131;:::i;:::-;48890:139;;48617:419;;;:::o;49042:237::-;49182:34;49178:1;49170:6;49166:14;49159:58;49251:20;49246:2;49238:6;49234:15;49227:45;49042:237;:::o;49285:366::-;49427:3;49448:67;49512:2;49507:3;49448:67;:::i;:::-;49441:74;;49524:93;49613:3;49524:93;:::i;:::-;49642:2;49637:3;49633:12;49626:19;;49285:366;;;:::o;49657:419::-;49823:4;49861:2;49850:9;49846:18;49838:26;;49910:9;49904:4;49900:20;49896:1;49885:9;49881:17;49874:47;49938:131;50064:4;49938:131;:::i;:::-;49930:139;;49657:419;;;:::o;50082:225::-;50222:34;50218:1;50210:6;50206:14;50199:58;50291:8;50286:2;50278:6;50274:15;50267:33;50082:225;:::o;50313:366::-;50455:3;50476:67;50540:2;50535:3;50476:67;:::i;:::-;50469:74;;50552:93;50641:3;50552:93;:::i;:::-;50670:2;50665:3;50661:12;50654:19;;50313:366;;;:::o;50685:419::-;50851:4;50889:2;50878:9;50874:18;50866:26;;50938:9;50932:4;50928:20;50924:1;50913:9;50909:17;50902:47;50966:131;51092:4;50966:131;:::i;:::-;50958:139;;50685:419;;;:::o;51110:224::-;51250:34;51246:1;51238:6;51234:14;51227:58;51319:7;51314:2;51306:6;51302:15;51295:32;51110:224;:::o;51340:366::-;51482:3;51503:67;51567:2;51562:3;51503:67;:::i;:::-;51496:74;;51579:93;51668:3;51579:93;:::i;:::-;51697:2;51692:3;51688:12;51681:19;;51340:366;;;:::o;51712:419::-;51878:4;51916:2;51905:9;51901:18;51893:26;;51965:9;51959:4;51955:20;51951:1;51940:9;51936:17;51929:47;51993:131;52119:4;51993:131;:::i;:::-;51985:139;;51712:419;;;:::o;52137:118::-;52174:7;52214:34;52207:5;52203:46;52192:57;;52137:118;;;:::o;52261:191::-;52301:4;52321:20;52339:1;52321:20;:::i;:::-;52316:25;;52355:20;52373:1;52355:20;:::i;:::-;52350:25;;52394:1;52391;52388:8;52385:34;;;52399:18;;:::i;:::-;52385:34;52444:1;52441;52437:9;52429:17;;52261:191;;;;:::o;52458:273::-;52498:3;52517:20;52535:1;52517:20;:::i;:::-;52512:25;;52551:20;52569:1;52551:20;:::i;:::-;52546:25;;52673:1;52637:34;52633:42;52630:1;52627:49;52624:75;;;52679:18;;:::i;:::-;52624:75;52723:1;52720;52716:9;52709:16;;52458:273;;;;:::o;52737:147::-;52838:11;52875:3;52860:18;;52737:147;;;;:::o;52890:114::-;;:::o;53010:398::-;53169:3;53190:83;53271:1;53266:3;53190:83;:::i;:::-;53183:90;;53282:93;53371:3;53282:93;:::i;:::-;53400:1;53395:3;53391:11;53384:18;;53010:398;;;:::o;53414:379::-;53598:3;53620:147;53763:3;53620:147;:::i;:::-;53613:154;;53784:3;53777:10;;53414:379;;;:::o;53799:170::-;53939:22;53935:1;53927:6;53923:14;53916:46;53799:170;:::o;53975:366::-;54117:3;54138:67;54202:2;54197:3;54138:67;:::i;:::-;54131:74;;54214:93;54303:3;54214:93;:::i;:::-;54332:2;54327:3;54323:12;54316:19;;53975:366;;;:::o;54347:419::-;54513:4;54551:2;54540:9;54536:18;54528:26;;54600:9;54594:4;54590:20;54586:1;54575:9;54571:17;54564:47;54628:131;54754:4;54628:131;:::i;:::-;54620:139;;54347:419;;;:::o;54772:229::-;54912:34;54908:1;54900:6;54896:14;54889:58;54981:12;54976:2;54968:6;54964:15;54957:37;54772:229;:::o;55007:366::-;55149:3;55170:67;55234:2;55229:3;55170:67;:::i;:::-;55163:74;;55246:93;55335:3;55246:93;:::i;:::-;55364:2;55359:3;55355:12;55348:19;;55007:366;;;:::o;55379:419::-;55545:4;55583:2;55572:9;55568:18;55560:26;;55632:9;55626:4;55622:20;55618:1;55607:9;55603:17;55596:47;55660:131;55786:4;55660:131;:::i;:::-;55652:139;;55379:419;;;:::o;55804:171::-;55843:3;55866:24;55884:5;55866:24;:::i;:::-;55857:33;;55912:4;55905:5;55902:15;55899:41;;;55920:18;;:::i;:::-;55899:41;55967:1;55960:5;55956:13;55949:20;;55804:171;;;:::o;55981:234::-;56121:34;56117:1;56109:6;56105:14;56098:58;56190:17;56185:2;56177:6;56173:15;56166:42;55981:234;:::o;56221:366::-;56363:3;56384:67;56448:2;56443:3;56384:67;:::i;:::-;56377:74;;56460:93;56549:3;56460:93;:::i;:::-;56578:2;56573:3;56569:12;56562:19;;56221:366;;;:::o;56593:419::-;56759:4;56797:2;56786:9;56782:18;56774:26;;56846:9;56840:4;56836:20;56832:1;56821:9;56817:17;56810:47;56874:131;57000:4;56874:131;:::i;:::-;56866:139;;56593:419;;;:::o;57018:98::-;57069:6;57103:5;57097:12;57087:22;;57018:98;;;:::o;57122:168::-;57205:11;57239:6;57234:3;57227:19;57279:4;57274:3;57270:14;57255:29;;57122:168;;;;:::o;57296:360::-;57382:3;57410:38;57442:5;57410:38;:::i;:::-;57464:70;57527:6;57522:3;57464:70;:::i;:::-;57457:77;;57543:52;57588:6;57583:3;57576:4;57569:5;57565:16;57543:52;:::i;:::-;57620:29;57642:6;57620:29;:::i;:::-;57615:3;57611:39;57604:46;;57386:270;57296:360;;;;:::o;57662:640::-;57857:4;57895:3;57884:9;57880:19;57872:27;;57909:71;57977:1;57966:9;57962:17;57953:6;57909:71;:::i;:::-;57990:72;58058:2;58047:9;58043:18;58034:6;57990:72;:::i;:::-;58072;58140:2;58129:9;58125:18;58116:6;58072:72;:::i;:::-;58191:9;58185:4;58181:20;58176:2;58165:9;58161:18;58154:48;58219:76;58290:4;58281:6;58219:76;:::i;:::-;58211:84;;57662:640;;;;;;;:::o;58308:141::-;58364:5;58395:6;58389:13;58380:22;;58411:32;58437:5;58411:32;:::i;:::-;58308:141;;;;:::o;58455:349::-;58524:6;58573:2;58561:9;58552:7;58548:23;58544:32;58541:119;;;58579:79;;:::i;:::-;58541:119;58699:1;58724:63;58779:7;58770:6;58759:9;58755:22;58724:63;:::i;:::-;58714:73;;58670:127;58455:349;;;;:::o;58810:180::-;58858:77;58855:1;58848:88;58955:4;58952:1;58945:15;58979:4;58976:1;58969:15;58996:185;59036:1;59053:20;59071:1;59053:20;:::i;:::-;59048:25;;59087:20;59105:1;59087:20;:::i;:::-;59082:25;;59126:1;59116:35;;59131:18;;:::i;:::-;59116:35;59173:1;59170;59166:9;59161:14;;58996:185;;;;:::o;59187:176::-;59219:1;59236:20;59254:1;59236:20;:::i;:::-;59231:25;;59270:20;59288:1;59270:20;:::i;:::-;59265:25;;59309:1;59299:35;;59314:18;;:::i;:::-;59299:35;59355:1;59352;59348:9;59343:14;;59187:176;;;;:::o;59369:180::-;59417:77;59414:1;59407:88;59514:4;59511:1;59504:15;59538:4;59535:1;59528:15;59555:220;59695:34;59691:1;59683:6;59679:14;59672:58;59764:3;59759:2;59751:6;59747:15;59740:28;59555:220;:::o;59781:366::-;59923:3;59944:67;60008:2;60003:3;59944:67;:::i;:::-;59937:74;;60020:93;60109:3;60020:93;:::i;:::-;60138:2;60133:3;60129:12;60122:19;;59781:366;;;:::o;60153:419::-;60319:4;60357:2;60346:9;60342:18;60334:26;;60406:9;60400:4;60396:20;60392:1;60381:9;60377:17;60370:47;60434:131;60560:4;60434:131;:::i;:::-;60426:139;;60153:419;;;:::o;60578:179::-;60718:31;60714:1;60706:6;60702:14;60695:55;60578:179;:::o;60763:366::-;60905:3;60926:67;60990:2;60985:3;60926:67;:::i;:::-;60919:74;;61002:93;61091:3;61002:93;:::i;:::-;61120:2;61115:3;61111:12;61104:19;;60763:366;;;:::o;61135:419::-;61301:4;61339:2;61328:9;61324:18;61316:26;;61388:9;61382:4;61378:20;61374:1;61363:9;61359:17;61352:47;61416:131;61542:4;61416:131;:::i;:::-;61408:139;;61135:419;;;:::o;61560:221::-;61700:34;61696:1;61688:6;61684:14;61677:58;61769:4;61764:2;61756:6;61752:15;61745:29;61560:221;:::o;61787:366::-;61929:3;61950:67;62014:2;62009:3;61950:67;:::i;:::-;61943:74;;62026:93;62115:3;62026:93;:::i;:::-;62144:2;62139:3;62135:12;62128:19;;61787:366;;;:::o;62159:419::-;62325:4;62363:2;62352:9;62348:18;62340:26;;62412:9;62406:4;62402:20;62398:1;62387:9;62383:17;62376:47;62440:131;62566:4;62440:131;:::i;:::-;62432:139;;62159:419;;;:::o
Swarm Source
ipfs://ba78458034063d1177c649e935ffcde3efd2f3202c29270eb5483051bfa30f50
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.