Token Shogun War Golden Ticket
Overview ERC-721
Total Supply:
3,275 GoldenTickets
Holders:
1,372 addresses
Contract:
Balance
1 GoldenTickets
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GoldenTicket
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-04-07 */ // Sources flattened with hardhat v2.8.3 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File contracts/MinterControl.sol pragma solidity 0.8.7; abstract contract MinterControl is AccessControl { bytes32 public constant SHOGUN_OWNER_ROLE = keccak256("SHOGUN_OWNER_ROLE"); bytes32 public constant SHOGUN_MINTER_ROLE = keccak256("SHOGUN_MINTER_ROLE"); modifier onlyOwner() { require(hasRole(SHOGUN_OWNER_ROLE, _msgSender()), "MinterControl: not a SHOGUN_OWNER_ROLE"); _; } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterControl: not a SHOGUN_MINTER_ROLE"); _; } constructor() { _setRoleAdmin(SHOGUN_OWNER_ROLE, SHOGUN_OWNER_ROLE); _setRoleAdmin(SHOGUN_MINTER_ROLE, SHOGUN_OWNER_ROLE); _setupRole(SHOGUN_OWNER_ROLE, _msgSender()); } function grantMinter(address _minter) external { grantRole(SHOGUN_MINTER_ROLE, _minter); } function grantMinterMass(address[] memory minters) external { for(uint i = 0; i < minters.length; i++) { grantRole(SHOGUN_MINTER_ROLE, minters[i]); } } function removeMinter(address _minter) external { revokeRole(SHOGUN_MINTER_ROLE, _minter); } function isMinter(address _minter) public view returns (bool) { return hasRole(SHOGUN_MINTER_ROLE, _minter); } function grantOwner(address _owner) external { grantRole(SHOGUN_OWNER_ROLE, _owner); } function isOwner(address _owner) public view returns (bool) { return hasRole(SHOGUN_OWNER_ROLE, _owner); } } // File contracts/GoldenTicket.sol pragma solidity 0.8.7; contract GoldenTicket is MinterControl, ERC721Enumerable { using Strings for uint256; using Counters for Counters.Counter; address public constant paymentToken = 0x539bdE0d7Dbd336b79148AA742883198BBF60342; uint256 private constant maxTokensPerTransaction = 100; uint256 private tokenPrice = 19000000000000000000; Counters.Counter private _tokenIdCounter; string public baseURI; uint256 public ticketsMinted; event GoldenTicketMint(address to, uint256 tokenId); constructor() ERC721("Shogun War Golden Ticket", "GoldenTickets") { _tokenIdCounter._value = 1; } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, AccessControl) returns (bool) { return ERC721Enumerable.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } function safeMint(address to) public onlyOwner { _mint(to); } function mint(uint tokensNumber) external { require(tokensNumber > 0, "Wrong amount"); require(tokensNumber <= maxTokensPerTransaction, "Max tokens per transaction number exceeded"); IERC20(paymentToken).transferFrom(_msgSender(), 0x5d75D6A019dEeAB32Cc2Af685900F4a96aF22852, tokenPrice * tokensNumber); for(uint i = 0; i < tokensNumber; i++) { _mint(msg.sender); } } function totalTickets() public view returns (uint256) { return ticketsMinted; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { // set up api URL to return golden ticket metadata require(_exists(_tokenId), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked( baseURI, _tokenId.toString() )) : ""; } function _mint(address _to) internal { uint256 _tokenId; _tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); ticketsMinted++; emit GoldenTicketMint(_to, _tokenId); _safeMint(_to, _tokenId); } function _baseURI() internal view override returns (string memory) { return baseURI; } // ADMIN function setBaseURI(string memory _baseURItoSet) external onlyOwner { baseURI = _baseURItoSet; } }
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":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"GoldenTicketMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHOGUN_MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHOGUN_OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"grantMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"minters","type":"address[]"}],"name":"grantMinterMass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"grantOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_minter","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURItoSet","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketsMinted","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":[],"name":"totalTickets","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"}]
Contract Creation Code
6080604052680107ad8f556c6c0000600b553480156200001e57600080fd5b506040518060400160405280601881526020017f53686f67756e2057617220476f6c64656e205469636b657400000000000000008152506040518060400160405280600d81526020017f476f6c64656e5469636b65747300000000000000000000000000000000000000815250620000bd7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5806200019560201b60201c565b6200010f7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56200019560201b60201c565b620001507ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b562000144620001f860201b60201c565b6200020060201b60201c565b81600190805190602001906200016892919062000390565b5080600290805190602001906200018192919062000390565b5050506001600c60000181905550620004a5565b6000620001a8836200021660201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b6200021282826200023560201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b6200024782826200032660201b60201c565b6200032257600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002c7620001f860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200039e9062000440565b90600052602060002090601f016020900481019282620003c257600085556200040e565b82601f10620003dd57805160ff19168380011785556200040e565b828001600101855582156200040e579182015b828111156200040d578251825591602001919060010190620003f0565b5b5090506200041d919062000421565b5090565b5b808211156200043c57600081600090555060010162000422565b5090565b600060028204905060018216806200045957607f821691505b6020821081141562000470576200046f62000476565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6146d380620004b56000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c806355f804b311610130578063a35a3436116100b8578063d547741f1161007c578063d547741f14610698578063dc978059146106b4578063dd11247e146106d0578063e985e9c5146106ee578063f91bfc7c1461071e57610227565b8063a35a3436146105e2578063aa271e1a14610600578063b4549a4b14610630578063b88d4fde1461064c578063c87b56dd1461066857610227565b806391d14854116100ff57806391d148541461053e57806395d89b411461056e578063a0712d681461058c578063a217fddf146105a8578063a22cb465146105c657610227565b806355f804b3146104a45780636352211e146104c05780636c0360eb146104f057806370a082311461050e57610227565b80632f54bf6e116101b357806336568abe1161018257806336568abe1461040257806340d097c31461041e57806342842e0e1461043a57806349ab216c146104565780634f6ccce71461047457610227565b80632f54bf6e146103685780632f745c59146103985780633013ce29146103c85780633092afd5146103e657610227565b806318160ddd116101fa57806318160ddd146102c657806323b872dd146102e4578063248a9ca314610300578063261707fa146103305780632f2ff15d1461034c57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061318b565b61073c565b6040516102539190613803565b60405180910390f35b61026461075e565b6040516102719190613839565b60405180910390f35b610294600480360381019061028f919061322e565b6107f0565b6040516102a1919061373c565b60405180910390f35b6102c460048036038101906102bf9190613068565b610875565b005b6102ce61098d565b6040516102db9190613afb565b60405180910390f35b6102fe60048036038101906102f99190612f52565b61099a565b005b61031a6004803603810190610315919061311e565b6109fa565b604051610327919061381e565b60405180910390f35b61034a60048036038101906103459190612ee5565b610a19565b005b6103666004803603810190610361919061314b565b610a46565b005b610382600480360381019061037d9190612ee5565b610a6f565b60405161038f9190613803565b60405180910390f35b6103b260048036038101906103ad9190613068565b610aa2565b6040516103bf9190613afb565b60405180910390f35b6103d0610b47565b6040516103dd919061373c565b60405180910390f35b61040060048036038101906103fb9190612ee5565b610b5f565b005b61041c6004803603810190610417919061314b565b610b8c565b005b61043860048036038101906104339190612ee5565b610c0f565b005b610454600480360381019061044f9190612f52565b610c8b565b005b61045e610cab565b60405161046b919061381e565b60405180910390f35b61048e6004803603810190610489919061322e565b610ccf565b60405161049b9190613afb565b60405180910390f35b6104be60048036038101906104b991906131e5565b610d40565b005b6104da60048036038101906104d5919061322e565b610dca565b6040516104e7919061373c565b60405180910390f35b6104f8610e7c565b6040516105059190613839565b60405180910390f35b61052860048036038101906105239190612ee5565b610f0a565b6040516105359190613afb565b60405180910390f35b6105586004803603810190610553919061314b565b610fc2565b6040516105659190613803565b60405180910390f35b61057661102c565b6040516105839190613839565b60405180910390f35b6105a660048036038101906105a1919061322e565b6110be565b005b6105b061123c565b6040516105bd919061381e565b60405180910390f35b6105e060048036038101906105db9190613028565b611243565b005b6105ea611259565b6040516105f79190613afb565b60405180910390f35b61061a60048036038101906106159190612ee5565b61125f565b6040516106279190613803565b60405180910390f35b61064a600480360381019061064591906130a8565b611292565b005b61066660048036038101906106619190612fa5565b6112f9565b005b610682600480360381019061067d919061322e565b61135b565b60405161068f9190613839565b60405180910390f35b6106b260048036038101906106ad919061314b565b611403565b005b6106ce60048036038101906106c99190612ee5565b61142c565b005b6106d8611459565b6040516106e59190613afb565b60405180910390f35b61070860048036038101906107039190612f12565b611463565b6040516107159190613803565b60405180910390f35b6107266114f7565b604051610733919061381e565b60405180910390f35b60006107478261151b565b80610757575061075682611595565b5b9050919050565b60606001805461076d90613e20565b80601f016020809104026020016040519081016040528092919081815260200182805461079990613e20565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb8261160f565b61083a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610831906139fb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088082610dca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890613a3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091061167b565b73ffffffffffffffffffffffffffffffffffffffff16148061093f575061093e8161093961167b565b611463565b5b61097e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109759061395b565b60405180910390fd5b6109888383611683565b505050565b6000600980549050905090565b6109ab6109a561167b565b8261173c565b6109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613a5b565b60405180910390fd5b6109f583838361181a565b505050565b6000806000838152602001908152602001600020600101549050919050565b610a437f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610a46565b50565b610a4f826109fa565b610a6081610a5b61167b565b611a76565b610a6a8383611b13565b505050565b6000610a9b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b583610fc2565b9050919050565b6000610aad83610f0a565b8210610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae59061389b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b73539bde0d7dbd336b79148aa742883198bbf6034281565b610b897f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82611403565b50565b610b9461167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613adb565b60405180910390fd5b610c0b8282611bf3565b5050565b610c407ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610c3b61167b565b610fc2565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906139bb565b60405180910390fd5b610c8881611cd4565b50565b610ca6838383604051806020016040528060008152506112f9565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000610cd961098d565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613a7b565b60405180910390fd5b60098281548110610d2e57610d2d613fb9565b5b90600052602060002001549050919050565b610d717ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610d6c61167b565b610fc2565b610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da7906139bb565b60405180910390fd5b80600d9080519060200190610dc6929190612c31565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a9061399b565b60405180910390fd5b80915050919050565b600d8054610e8990613e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb590613e20565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061397b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461103b90613e20565b80601f016020809104026020016040519081016040528092919081815260200182805461106790613e20565b80156110b45780601f10611089576101008083540402835291602001916110b4565b820191906000526020600020905b81548152906001019060200180831161109757829003601f168201915b5050505050905090565b60008111611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613abb565b60405180910390fd5b6064811115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613a9b565b60405180910390fd5b73539bde0d7dbd336b79148aa742883198bbf6034273ffffffffffffffffffffffffffffffffffffffff166323b872dd61117d61167b565b735d75d6a019deeab32cc2af685900f4a96af2285284600b546111a09190613ca8565b6040518463ffffffff1660e01b81526004016111be93929190613757565b602060405180830381600087803b1580156111d857600080fd5b505af11580156111ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121091906130f1565b5060005b818110156112385761122533611cd4565b808061123090613e83565b915050611214565b5050565b6000801b81565b61125561124e61167b565b8383611d4b565b5050565b600e5481565b600061128b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d83610fc2565b9050919050565b60005b81518110156112f5576112e27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d8383815181106112d5576112d4613fb9565b5b6020026020010151610a46565b80806112ed90613e83565b915050611295565b5050565b61130a61130461167b565b8361173c565b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613a5b565b60405180910390fd5b61135584848484611eb8565b50505050565b60606113668261160f565b6113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c9061387b565b60405180910390fd5b6000600d80546113b490613e20565b9050116113d057604051806020016040528060008152506113fc565b600d6113db83611f14565b6040516020016113ec9291906136de565b6040516020818303038152906040525b9050919050565b61140c826109fa565b61141d8161141861167b565b611a76565b6114278383611bf3565b505050565b6114567ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610a46565b50565b6000600e54905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061158e575061158d82612075565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611608575061160782612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116f683610dca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117478261160f565b611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d9061393b565b60405180910390fd5b600061179183610dca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061180057508373ffffffffffffffffffffffffffffffffffffffff166117e8846107f0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061181157506118108185611463565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183a82610dca565b73ffffffffffffffffffffffffffffffffffffffff1614611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613a1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906138fb565b60405180910390fd5b61190b8383836121c1565b611916600082611683565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119669190613d02565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bd9190613c21565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a808282610fc2565b611b0f57611aa58173ffffffffffffffffffffffffffffffffffffffff1660146122d5565b611ab38360001c60206122d5565b604051602001611ac4929190613702565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b069190613839565b60405180910390fd5b5050565b611b1d8282610fc2565b611bef57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b9461167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611bfd8282610fc2565b15611cd057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c7561167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611ce0600c612511565b9050611cec600c61251f565b600e6000815480929190611cff90613e83565b91905055507f5a36486a1ee61a35db8e3b9d1f7f76db43c92d3fcbabcea8dbbb5c7b26bfc5be8282604051611d359291906137da565b60405180910390a1611d478282612535565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19061391b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eab9190613803565b60405180910390a3505050565b611ec384848461181a565b611ecf84848484612553565b611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f05906138bb565b60405180910390fd5b50505050565b60606000821415611f5c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612070565b600082905060005b60008214611f8e578080611f7790613e83565b915050600a82611f879190613c77565b9150611f64565b60008167ffffffffffffffff811115611faa57611fa9613fe8565b5b6040519080825280601f01601f191660200182016040528015611fdc5781602001600182028036833780820191505090505b5090505b6000851461206957600182611ff59190613d02565b9150600a856120049190613ecc565b60306120109190613c21565b60f81b81838151811061202657612025613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120629190613c77565b9450611fe0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612150575061214f82611595565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121cc8383836126ea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561220f5761220a816126ef565b61224e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461224d5761224c8382612738565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122915761228c816128a5565b6122d0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122cf576122ce8282612976565b5b5b505050565b6060600060028360026122e89190613ca8565b6122f29190613c21565b67ffffffffffffffff81111561230b5761230a613fe8565b5b6040519080825280601f01601f19166020018201604052801561233d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061237557612374613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123d9576123d8613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026124199190613ca8565b6124239190613c21565b90505b60018111156124c3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061246557612464613fb9565b5b1a60f81b82828151811061247c5761247b613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806124bc90613df6565b9050612426565b5060008414612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe9061385b565b60405180910390fd5b8091505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61254f8282604051806020016040528060008152506129f5565b5050565b60006125748473ffffffffffffffffffffffffffffffffffffffff16612a50565b156126dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261259d61167b565b8786866040518563ffffffff1660e01b81526004016125bf949392919061378e565b602060405180830381600087803b1580156125d957600080fd5b505af192505050801561260a57506040513d601f19601f8201168201806040525081019061260791906131b8565b60015b61268d573d806000811461263a576040519150601f19603f3d011682016040523d82523d6000602084013e61263f565b606091505b50600081511415612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c906138bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126e2565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161274584610f0a565b61274f9190613d02565b9050600060086000848152602001908152602001600020549050818114612834576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506128b99190613d02565b90506000600a60008481526020019081526020016000205490506000600983815481106128e9576128e8613fb9565b5b90600052602060002001549050806009838154811061290b5761290a613fb9565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061295a57612959613f8a565b5b6001900381819060005260206000200160009055905550505050565b600061298183610f0a565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6129ff8383612a63565b612a0c6000848484612553565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906138bb565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca906139db565b60405180910390fd5b612adc8161160f565b15612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b13906138db565b60405180910390fd5b612b28600083836121c1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b789190613c21565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c3d90613e20565b90600052602060002090601f016020900481019282612c5f5760008555612ca6565b82601f10612c7857805160ff1916838001178555612ca6565b82800160010185558215612ca6579182015b82811115612ca5578251825591602001919060010190612c8a565b5b509050612cb39190612cb7565b5090565b5b80821115612cd0576000816000905550600101612cb8565b5090565b6000612ce7612ce284613b3b565b613b16565b90508083825260208201905082856020860282011115612d0a57612d0961401c565b5b60005b85811015612d3a5781612d208882612dc8565b845260208401935060208301925050600181019050612d0d565b5050509392505050565b6000612d57612d5284613b67565b613b16565b905082815260208101848484011115612d7357612d72614021565b5b612d7e848285613db4565b509392505050565b6000612d99612d9484613b98565b613b16565b905082815260208101848484011115612db557612db4614021565b5b612dc0848285613db4565b509392505050565b600081359050612dd78161462a565b92915050565b600082601f830112612df257612df1614017565b5b8135612e02848260208601612cd4565b91505092915050565b600081359050612e1a81614641565b92915050565b600081519050612e2f81614641565b92915050565b600081359050612e4481614658565b92915050565b600081359050612e598161466f565b92915050565b600081519050612e6e8161466f565b92915050565b600082601f830112612e8957612e88614017565b5b8135612e99848260208601612d44565b91505092915050565b600082601f830112612eb757612eb6614017565b5b8135612ec7848260208601612d86565b91505092915050565b600081359050612edf81614686565b92915050565b600060208284031215612efb57612efa61402b565b5b6000612f0984828501612dc8565b91505092915050565b60008060408385031215612f2957612f2861402b565b5b6000612f3785828601612dc8565b9250506020612f4885828601612dc8565b9150509250929050565b600080600060608486031215612f6b57612f6a61402b565b5b6000612f7986828701612dc8565b9350506020612f8a86828701612dc8565b9250506040612f9b86828701612ed0565b9150509250925092565b60008060008060808587031215612fbf57612fbe61402b565b5b6000612fcd87828801612dc8565b9450506020612fde87828801612dc8565b9350506040612fef87828801612ed0565b925050606085013567ffffffffffffffff8111156130105761300f614026565b5b61301c87828801612e74565b91505092959194509250565b6000806040838503121561303f5761303e61402b565b5b600061304d85828601612dc8565b925050602061305e85828601612e0b565b9150509250929050565b6000806040838503121561307f5761307e61402b565b5b600061308d85828601612dc8565b925050602061309e85828601612ed0565b9150509250929050565b6000602082840312156130be576130bd61402b565b5b600082013567ffffffffffffffff8111156130dc576130db614026565b5b6130e884828501612ddd565b91505092915050565b6000602082840312156131075761310661402b565b5b600061311584828501612e20565b91505092915050565b6000602082840312156131345761313361402b565b5b600061314284828501612e35565b91505092915050565b600080604083850312156131625761316161402b565b5b600061317085828601612e35565b925050602061318185828601612dc8565b9150509250929050565b6000602082840312156131a1576131a061402b565b5b60006131af84828501612e4a565b91505092915050565b6000602082840312156131ce576131cd61402b565b5b60006131dc84828501612e5f565b91505092915050565b6000602082840312156131fb576131fa61402b565b5b600082013567ffffffffffffffff81111561321957613218614026565b5b61322584828501612ea2565b91505092915050565b6000602082840312156132445761324361402b565b5b600061325284828501612ed0565b91505092915050565b61326481613d36565b82525050565b61327381613d48565b82525050565b61328281613d54565b82525050565b600061329382613bde565b61329d8185613bf4565b93506132ad818560208601613dc3565b6132b681614030565b840191505092915050565b60006132cc82613be9565b6132d68185613c05565b93506132e6818560208601613dc3565b6132ef81614030565b840191505092915050565b600061330582613be9565b61330f8185613c16565b935061331f818560208601613dc3565b80840191505092915050565b6000815461333881613e20565b6133428186613c16565b9450600182166000811461335d576001811461336e576133a1565b60ff198316865281860193506133a1565b61337785613bc9565b60005b838110156133995781548189015260018201915060208101905061337a565b838801955050505b50505092915050565b60006133b7602083613c05565b91506133c282614041565b602082019050919050565b60006133da601f83613c05565b91506133e58261406a565b602082019050919050565b60006133fd602b83613c05565b915061340882614093565b604082019050919050565b6000613420603283613c05565b915061342b826140e2565b604082019050919050565b6000613443601c83613c05565b915061344e82614131565b602082019050919050565b6000613466602483613c05565b91506134718261415a565b604082019050919050565b6000613489601983613c05565b9150613494826141a9565b602082019050919050565b60006134ac602c83613c05565b91506134b7826141d2565b604082019050919050565b60006134cf603883613c05565b91506134da82614221565b604082019050919050565b60006134f2602a83613c05565b91506134fd82614270565b604082019050919050565b6000613515602983613c05565b9150613520826142bf565b604082019050919050565b6000613538602683613c05565b91506135438261430e565b604082019050919050565b600061355b602083613c05565b91506135668261435d565b602082019050919050565b600061357e602c83613c05565b915061358982614386565b604082019050919050565b60006135a1602983613c05565b91506135ac826143d5565b604082019050919050565b60006135c4602183613c05565b91506135cf82614424565b604082019050919050565b60006135e7603183613c05565b91506135f282614473565b604082019050919050565b600061360a602c83613c05565b9150613615826144c2565b604082019050919050565b600061362d601783613c16565b915061363882614511565b601782019050919050565b6000613650602a83613c05565b915061365b8261453a565b604082019050919050565b6000613673601183613c16565b915061367e82614589565b601182019050919050565b6000613696600c83613c05565b91506136a1826145b2565b602082019050919050565b60006136b9602f83613c05565b91506136c4826145db565b604082019050919050565b6136d881613daa565b82525050565b60006136ea828561332b565b91506136f682846132fa565b91508190509392505050565b600061370d82613620565b915061371982856132fa565b915061372482613666565b915061373082846132fa565b91508190509392505050565b6000602082019050613751600083018461325b565b92915050565b600060608201905061376c600083018661325b565b613779602083018561325b565b61378660408301846136cf565b949350505050565b60006080820190506137a3600083018761325b565b6137b0602083018661325b565b6137bd60408301856136cf565b81810360608301526137cf8184613288565b905095945050505050565b60006040820190506137ef600083018561325b565b6137fc60208301846136cf565b9392505050565b6000602082019050613818600083018461326a565b92915050565b60006020820190506138336000830184613279565b92915050565b6000602082019050818103600083015261385381846132c1565b905092915050565b60006020820190508181036000830152613874816133aa565b9050919050565b60006020820190508181036000830152613894816133cd565b9050919050565b600060208201905081810360008301526138b4816133f0565b9050919050565b600060208201905081810360008301526138d481613413565b9050919050565b600060208201905081810360008301526138f481613436565b9050919050565b6000602082019050818103600083015261391481613459565b9050919050565b600060208201905081810360008301526139348161347c565b9050919050565b600060208201905081810360008301526139548161349f565b9050919050565b60006020820190508181036000830152613974816134c2565b9050919050565b60006020820190508181036000830152613994816134e5565b9050919050565b600060208201905081810360008301526139b481613508565b9050919050565b600060208201905081810360008301526139d48161352b565b9050919050565b600060208201905081810360008301526139f48161354e565b9050919050565b60006020820190508181036000830152613a1481613571565b9050919050565b60006020820190508181036000830152613a3481613594565b9050919050565b60006020820190508181036000830152613a54816135b7565b9050919050565b60006020820190508181036000830152613a74816135da565b9050919050565b60006020820190508181036000830152613a94816135fd565b9050919050565b60006020820190508181036000830152613ab481613643565b9050919050565b60006020820190508181036000830152613ad481613689565b9050919050565b60006020820190508181036000830152613af4816136ac565b9050919050565b6000602082019050613b1060008301846136cf565b92915050565b6000613b20613b31565b9050613b2c8282613e52565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5657613b55613fe8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8257613b81613fe8565b5b613b8b82614030565b9050602081019050919050565b600067ffffffffffffffff821115613bb357613bb2613fe8565b5b613bbc82614030565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2c82613daa565b9150613c3783613daa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613efd565b5b828201905092915050565b6000613c8282613daa565b9150613c8d83613daa565b925082613c9d57613c9c613f2c565b5b828204905092915050565b6000613cb382613daa565b9150613cbe83613daa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cf757613cf6613efd565b5b828202905092915050565b6000613d0d82613daa565b9150613d1883613daa565b925082821015613d2b57613d2a613efd565b5b828203905092915050565b6000613d4182613d8a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613de1578082015181840152602081019050613dc6565b83811115613df0576000848401525b50505050565b6000613e0182613daa565b91506000821415613e1557613e14613efd565b5b600182039050919050565b60006002820490506001821680613e3857607f821691505b60208210811415613e4c57613e4b613f5b565b5b50919050565b613e5b82614030565b810181811067ffffffffffffffff82111715613e7a57613e79613fe8565b5b80604052505050565b6000613e8e82613daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec157613ec0613efd565b5b600182019050919050565b6000613ed782613daa565b9150613ee283613daa565b925082613ef257613ef1613f2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d626560008201527f7220657863656564656400000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61463381613d36565b811461463e57600080fd5b50565b61464a81613d48565b811461465557600080fd5b50565b61466181613d54565b811461466c57600080fd5b50565b61467881613d5e565b811461468357600080fd5b50565b61468f81613daa565b811461469a57600080fd5b5056fea26469706673582212208f5a3fba9d7f122453327b2d5cba4877cdd6544ab4adcf9bc85fdf9ace0ecefc64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c806355f804b311610130578063a35a3436116100b8578063d547741f1161007c578063d547741f14610698578063dc978059146106b4578063dd11247e146106d0578063e985e9c5146106ee578063f91bfc7c1461071e57610227565b8063a35a3436146105e2578063aa271e1a14610600578063b4549a4b14610630578063b88d4fde1461064c578063c87b56dd1461066857610227565b806391d14854116100ff57806391d148541461053e57806395d89b411461056e578063a0712d681461058c578063a217fddf146105a8578063a22cb465146105c657610227565b806355f804b3146104a45780636352211e146104c05780636c0360eb146104f057806370a082311461050e57610227565b80632f54bf6e116101b357806336568abe1161018257806336568abe1461040257806340d097c31461041e57806342842e0e1461043a57806349ab216c146104565780634f6ccce71461047457610227565b80632f54bf6e146103685780632f745c59146103985780633013ce29146103c85780633092afd5146103e657610227565b806318160ddd116101fa57806318160ddd146102c657806323b872dd146102e4578063248a9ca314610300578063261707fa146103305780632f2ff15d1461034c57610227565b806301ffc9a71461022c57806306fdde031461025c578063081812fc1461027a578063095ea7b3146102aa575b600080fd5b6102466004803603810190610241919061318b565b61073c565b6040516102539190613803565b60405180910390f35b61026461075e565b6040516102719190613839565b60405180910390f35b610294600480360381019061028f919061322e565b6107f0565b6040516102a1919061373c565b60405180910390f35b6102c460048036038101906102bf9190613068565b610875565b005b6102ce61098d565b6040516102db9190613afb565b60405180910390f35b6102fe60048036038101906102f99190612f52565b61099a565b005b61031a6004803603810190610315919061311e565b6109fa565b604051610327919061381e565b60405180910390f35b61034a60048036038101906103459190612ee5565b610a19565b005b6103666004803603810190610361919061314b565b610a46565b005b610382600480360381019061037d9190612ee5565b610a6f565b60405161038f9190613803565b60405180910390f35b6103b260048036038101906103ad9190613068565b610aa2565b6040516103bf9190613afb565b60405180910390f35b6103d0610b47565b6040516103dd919061373c565b60405180910390f35b61040060048036038101906103fb9190612ee5565b610b5f565b005b61041c6004803603810190610417919061314b565b610b8c565b005b61043860048036038101906104339190612ee5565b610c0f565b005b610454600480360381019061044f9190612f52565b610c8b565b005b61045e610cab565b60405161046b919061381e565b60405180910390f35b61048e6004803603810190610489919061322e565b610ccf565b60405161049b9190613afb565b60405180910390f35b6104be60048036038101906104b991906131e5565b610d40565b005b6104da60048036038101906104d5919061322e565b610dca565b6040516104e7919061373c565b60405180910390f35b6104f8610e7c565b6040516105059190613839565b60405180910390f35b61052860048036038101906105239190612ee5565b610f0a565b6040516105359190613afb565b60405180910390f35b6105586004803603810190610553919061314b565b610fc2565b6040516105659190613803565b60405180910390f35b61057661102c565b6040516105839190613839565b60405180910390f35b6105a660048036038101906105a1919061322e565b6110be565b005b6105b061123c565b6040516105bd919061381e565b60405180910390f35b6105e060048036038101906105db9190613028565b611243565b005b6105ea611259565b6040516105f79190613afb565b60405180910390f35b61061a60048036038101906106159190612ee5565b61125f565b6040516106279190613803565b60405180910390f35b61064a600480360381019061064591906130a8565b611292565b005b61066660048036038101906106619190612fa5565b6112f9565b005b610682600480360381019061067d919061322e565b61135b565b60405161068f9190613839565b60405180910390f35b6106b260048036038101906106ad919061314b565b611403565b005b6106ce60048036038101906106c99190612ee5565b61142c565b005b6106d8611459565b6040516106e59190613afb565b60405180910390f35b61070860048036038101906107039190612f12565b611463565b6040516107159190613803565b60405180910390f35b6107266114f7565b604051610733919061381e565b60405180910390f35b60006107478261151b565b80610757575061075682611595565b5b9050919050565b60606001805461076d90613e20565b80601f016020809104026020016040519081016040528092919081815260200182805461079990613e20565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb8261160f565b61083a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610831906139fb565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088082610dca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e890613a3b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091061167b565b73ffffffffffffffffffffffffffffffffffffffff16148061093f575061093e8161093961167b565b611463565b5b61097e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109759061395b565b60405180910390fd5b6109888383611683565b505050565b6000600980549050905090565b6109ab6109a561167b565b8261173c565b6109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190613a5b565b60405180910390fd5b6109f583838361181a565b505050565b6000806000838152602001908152602001600020600101549050919050565b610a437f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610a46565b50565b610a4f826109fa565b610a6081610a5b61167b565b611a76565b610a6a8383611b13565b505050565b6000610a9b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b583610fc2565b9050919050565b6000610aad83610f0a565b8210610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae59061389b565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b73539bde0d7dbd336b79148aa742883198bbf6034281565b610b897f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82611403565b50565b610b9461167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf890613adb565b60405180910390fd5b610c0b8282611bf3565b5050565b610c407ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610c3b61167b565b610fc2565b610c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c76906139bb565b60405180910390fd5b610c8881611cd4565b50565b610ca6838383604051806020016040528060008152506112f9565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000610cd961098d565b8210610d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1190613a7b565b60405180910390fd5b60098281548110610d2e57610d2d613fb9565b5b90600052602060002001549050919050565b610d717ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610d6c61167b565b610fc2565b610db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da7906139bb565b60405180910390fd5b80600d9080519060200190610dc6929190612c31565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a9061399b565b60405180910390fd5b80915050919050565b600d8054610e8990613e20565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb590613e20565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f729061397b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461103b90613e20565b80601f016020809104026020016040519081016040528092919081815260200182805461106790613e20565b80156110b45780601f10611089576101008083540402835291602001916110b4565b820191906000526020600020905b81548152906001019060200180831161109757829003601f168201915b5050505050905090565b60008111611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613abb565b60405180910390fd5b6064811115611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90613a9b565b60405180910390fd5b73539bde0d7dbd336b79148aa742883198bbf6034273ffffffffffffffffffffffffffffffffffffffff166323b872dd61117d61167b565b735d75d6a019deeab32cc2af685900f4a96af2285284600b546111a09190613ca8565b6040518463ffffffff1660e01b81526004016111be93929190613757565b602060405180830381600087803b1580156111d857600080fd5b505af11580156111ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121091906130f1565b5060005b818110156112385761122533611cd4565b808061123090613e83565b915050611214565b5050565b6000801b81565b61125561124e61167b565b8383611d4b565b5050565b600e5481565b600061128b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d83610fc2565b9050919050565b60005b81518110156112f5576112e27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d8383815181106112d5576112d4613fb9565b5b6020026020010151610a46565b80806112ed90613e83565b915050611295565b5050565b61130a61130461167b565b8361173c565b611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090613a5b565b60405180910390fd5b61135584848484611eb8565b50505050565b60606113668261160f565b6113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139c9061387b565b60405180910390fd5b6000600d80546113b490613e20565b9050116113d057604051806020016040528060008152506113fc565b600d6113db83611f14565b6040516020016113ec9291906136de565b6040516020818303038152906040525b9050919050565b61140c826109fa565b61141d8161141861167b565b611a76565b6114278383611bf3565b505050565b6114567ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610a46565b50565b6000600e54905090565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061158e575061158d82612075565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611608575061160782612157565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116f683610dca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117478261160f565b611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d9061393b565b60405180910390fd5b600061179183610dca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061180057508373ffffffffffffffffffffffffffffffffffffffff166117e8846107f0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061181157506118108185611463565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661183a82610dca565b73ffffffffffffffffffffffffffffffffffffffff1614611890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188790613a1b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f7906138fb565b60405180910390fd5b61190b8383836121c1565b611916600082611683565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119669190613d02565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119bd9190613c21565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611a808282610fc2565b611b0f57611aa58173ffffffffffffffffffffffffffffffffffffffff1660146122d5565b611ab38360001c60206122d5565b604051602001611ac4929190613702565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b069190613839565b60405180910390fd5b5050565b611b1d8282610fc2565b611bef57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b9461167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611bfd8282610fc2565b15611cd057600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611c7561167b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000611ce0600c612511565b9050611cec600c61251f565b600e6000815480929190611cff90613e83565b91905055507f5a36486a1ee61a35db8e3b9d1f7f76db43c92d3fcbabcea8dbbb5c7b26bfc5be8282604051611d359291906137da565b60405180910390a1611d478282612535565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db19061391b565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eab9190613803565b60405180910390a3505050565b611ec384848461181a565b611ecf84848484612553565b611f0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f05906138bb565b60405180910390fd5b50505050565b60606000821415611f5c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612070565b600082905060005b60008214611f8e578080611f7790613e83565b915050600a82611f879190613c77565b9150611f64565b60008167ffffffffffffffff811115611faa57611fa9613fe8565b5b6040519080825280601f01601f191660200182016040528015611fdc5781602001600182028036833780820191505090505b5090505b6000851461206957600182611ff59190613d02565b9150600a856120049190613ecc565b60306120109190613c21565b60f81b81838151811061202657612025613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120629190613c77565b9450611fe0565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612150575061214f82611595565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121cc8383836126ea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561220f5761220a816126ef565b61224e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461224d5761224c8382612738565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122915761228c816128a5565b6122d0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122cf576122ce8282612976565b5b5b505050565b6060600060028360026122e89190613ca8565b6122f29190613c21565b67ffffffffffffffff81111561230b5761230a613fe8565b5b6040519080825280601f01601f19166020018201604052801561233d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061237557612374613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106123d9576123d8613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026124199190613ca8565b6124239190613c21565b90505b60018111156124c3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061246557612464613fb9565b5b1a60f81b82828151811061247c5761247b613fb9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806124bc90613df6565b9050612426565b5060008414612507576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fe9061385b565b60405180910390fd5b8091505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b61254f8282604051806020016040528060008152506129f5565b5050565b60006125748473ffffffffffffffffffffffffffffffffffffffff16612a50565b156126dd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261259d61167b565b8786866040518563ffffffff1660e01b81526004016125bf949392919061378e565b602060405180830381600087803b1580156125d957600080fd5b505af192505050801561260a57506040513d601f19601f8201168201806040525081019061260791906131b8565b60015b61268d573d806000811461263a576040519150601f19603f3d011682016040523d82523d6000602084013e61263f565b606091505b50600081511415612685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267c906138bb565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126e2565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161274584610f0a565b61274f9190613d02565b9050600060086000848152602001908152602001600020549050818114612834576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506128b99190613d02565b90506000600a60008481526020019081526020016000205490506000600983815481106128e9576128e8613fb9565b5b90600052602060002001549050806009838154811061290b5761290a613fb9565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061295a57612959613f8a565b5b6001900381819060005260206000200160009055905550505050565b600061298183610f0a565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b6129ff8383612a63565b612a0c6000848484612553565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906138bb565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aca906139db565b60405180910390fd5b612adc8161160f565b15612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b13906138db565b60405180910390fd5b612b28600083836121c1565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b789190613c21565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c3d90613e20565b90600052602060002090601f016020900481019282612c5f5760008555612ca6565b82601f10612c7857805160ff1916838001178555612ca6565b82800160010185558215612ca6579182015b82811115612ca5578251825591602001919060010190612c8a565b5b509050612cb39190612cb7565b5090565b5b80821115612cd0576000816000905550600101612cb8565b5090565b6000612ce7612ce284613b3b565b613b16565b90508083825260208201905082856020860282011115612d0a57612d0961401c565b5b60005b85811015612d3a5781612d208882612dc8565b845260208401935060208301925050600181019050612d0d565b5050509392505050565b6000612d57612d5284613b67565b613b16565b905082815260208101848484011115612d7357612d72614021565b5b612d7e848285613db4565b509392505050565b6000612d99612d9484613b98565b613b16565b905082815260208101848484011115612db557612db4614021565b5b612dc0848285613db4565b509392505050565b600081359050612dd78161462a565b92915050565b600082601f830112612df257612df1614017565b5b8135612e02848260208601612cd4565b91505092915050565b600081359050612e1a81614641565b92915050565b600081519050612e2f81614641565b92915050565b600081359050612e4481614658565b92915050565b600081359050612e598161466f565b92915050565b600081519050612e6e8161466f565b92915050565b600082601f830112612e8957612e88614017565b5b8135612e99848260208601612d44565b91505092915050565b600082601f830112612eb757612eb6614017565b5b8135612ec7848260208601612d86565b91505092915050565b600081359050612edf81614686565b92915050565b600060208284031215612efb57612efa61402b565b5b6000612f0984828501612dc8565b91505092915050565b60008060408385031215612f2957612f2861402b565b5b6000612f3785828601612dc8565b9250506020612f4885828601612dc8565b9150509250929050565b600080600060608486031215612f6b57612f6a61402b565b5b6000612f7986828701612dc8565b9350506020612f8a86828701612dc8565b9250506040612f9b86828701612ed0565b9150509250925092565b60008060008060808587031215612fbf57612fbe61402b565b5b6000612fcd87828801612dc8565b9450506020612fde87828801612dc8565b9350506040612fef87828801612ed0565b925050606085013567ffffffffffffffff8111156130105761300f614026565b5b61301c87828801612e74565b91505092959194509250565b6000806040838503121561303f5761303e61402b565b5b600061304d85828601612dc8565b925050602061305e85828601612e0b565b9150509250929050565b6000806040838503121561307f5761307e61402b565b5b600061308d85828601612dc8565b925050602061309e85828601612ed0565b9150509250929050565b6000602082840312156130be576130bd61402b565b5b600082013567ffffffffffffffff8111156130dc576130db614026565b5b6130e884828501612ddd565b91505092915050565b6000602082840312156131075761310661402b565b5b600061311584828501612e20565b91505092915050565b6000602082840312156131345761313361402b565b5b600061314284828501612e35565b91505092915050565b600080604083850312156131625761316161402b565b5b600061317085828601612e35565b925050602061318185828601612dc8565b9150509250929050565b6000602082840312156131a1576131a061402b565b5b60006131af84828501612e4a565b91505092915050565b6000602082840312156131ce576131cd61402b565b5b60006131dc84828501612e5f565b91505092915050565b6000602082840312156131fb576131fa61402b565b5b600082013567ffffffffffffffff81111561321957613218614026565b5b61322584828501612ea2565b91505092915050565b6000602082840312156132445761324361402b565b5b600061325284828501612ed0565b91505092915050565b61326481613d36565b82525050565b61327381613d48565b82525050565b61328281613d54565b82525050565b600061329382613bde565b61329d8185613bf4565b93506132ad818560208601613dc3565b6132b681614030565b840191505092915050565b60006132cc82613be9565b6132d68185613c05565b93506132e6818560208601613dc3565b6132ef81614030565b840191505092915050565b600061330582613be9565b61330f8185613c16565b935061331f818560208601613dc3565b80840191505092915050565b6000815461333881613e20565b6133428186613c16565b9450600182166000811461335d576001811461336e576133a1565b60ff198316865281860193506133a1565b61337785613bc9565b60005b838110156133995781548189015260018201915060208101905061337a565b838801955050505b50505092915050565b60006133b7602083613c05565b91506133c282614041565b602082019050919050565b60006133da601f83613c05565b91506133e58261406a565b602082019050919050565b60006133fd602b83613c05565b915061340882614093565b604082019050919050565b6000613420603283613c05565b915061342b826140e2565b604082019050919050565b6000613443601c83613c05565b915061344e82614131565b602082019050919050565b6000613466602483613c05565b91506134718261415a565b604082019050919050565b6000613489601983613c05565b9150613494826141a9565b602082019050919050565b60006134ac602c83613c05565b91506134b7826141d2565b604082019050919050565b60006134cf603883613c05565b91506134da82614221565b604082019050919050565b60006134f2602a83613c05565b91506134fd82614270565b604082019050919050565b6000613515602983613c05565b9150613520826142bf565b604082019050919050565b6000613538602683613c05565b91506135438261430e565b604082019050919050565b600061355b602083613c05565b91506135668261435d565b602082019050919050565b600061357e602c83613c05565b915061358982614386565b604082019050919050565b60006135a1602983613c05565b91506135ac826143d5565b604082019050919050565b60006135c4602183613c05565b91506135cf82614424565b604082019050919050565b60006135e7603183613c05565b91506135f282614473565b604082019050919050565b600061360a602c83613c05565b9150613615826144c2565b604082019050919050565b600061362d601783613c16565b915061363882614511565b601782019050919050565b6000613650602a83613c05565b915061365b8261453a565b604082019050919050565b6000613673601183613c16565b915061367e82614589565b601182019050919050565b6000613696600c83613c05565b91506136a1826145b2565b602082019050919050565b60006136b9602f83613c05565b91506136c4826145db565b604082019050919050565b6136d881613daa565b82525050565b60006136ea828561332b565b91506136f682846132fa565b91508190509392505050565b600061370d82613620565b915061371982856132fa565b915061372482613666565b915061373082846132fa565b91508190509392505050565b6000602082019050613751600083018461325b565b92915050565b600060608201905061376c600083018661325b565b613779602083018561325b565b61378660408301846136cf565b949350505050565b60006080820190506137a3600083018761325b565b6137b0602083018661325b565b6137bd60408301856136cf565b81810360608301526137cf8184613288565b905095945050505050565b60006040820190506137ef600083018561325b565b6137fc60208301846136cf565b9392505050565b6000602082019050613818600083018461326a565b92915050565b60006020820190506138336000830184613279565b92915050565b6000602082019050818103600083015261385381846132c1565b905092915050565b60006020820190508181036000830152613874816133aa565b9050919050565b60006020820190508181036000830152613894816133cd565b9050919050565b600060208201905081810360008301526138b4816133f0565b9050919050565b600060208201905081810360008301526138d481613413565b9050919050565b600060208201905081810360008301526138f481613436565b9050919050565b6000602082019050818103600083015261391481613459565b9050919050565b600060208201905081810360008301526139348161347c565b9050919050565b600060208201905081810360008301526139548161349f565b9050919050565b60006020820190508181036000830152613974816134c2565b9050919050565b60006020820190508181036000830152613994816134e5565b9050919050565b600060208201905081810360008301526139b481613508565b9050919050565b600060208201905081810360008301526139d48161352b565b9050919050565b600060208201905081810360008301526139f48161354e565b9050919050565b60006020820190508181036000830152613a1481613571565b9050919050565b60006020820190508181036000830152613a3481613594565b9050919050565b60006020820190508181036000830152613a54816135b7565b9050919050565b60006020820190508181036000830152613a74816135da565b9050919050565b60006020820190508181036000830152613a94816135fd565b9050919050565b60006020820190508181036000830152613ab481613643565b9050919050565b60006020820190508181036000830152613ad481613689565b9050919050565b60006020820190508181036000830152613af4816136ac565b9050919050565b6000602082019050613b1060008301846136cf565b92915050565b6000613b20613b31565b9050613b2c8282613e52565b919050565b6000604051905090565b600067ffffffffffffffff821115613b5657613b55613fe8565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8257613b81613fe8565b5b613b8b82614030565b9050602081019050919050565b600067ffffffffffffffff821115613bb357613bb2613fe8565b5b613bbc82614030565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2c82613daa565b9150613c3783613daa565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6c57613c6b613efd565b5b828201905092915050565b6000613c8282613daa565b9150613c8d83613daa565b925082613c9d57613c9c613f2c565b5b828204905092915050565b6000613cb382613daa565b9150613cbe83613daa565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cf757613cf6613efd565b5b828202905092915050565b6000613d0d82613daa565b9150613d1883613daa565b925082821015613d2b57613d2a613efd565b5b828203905092915050565b6000613d4182613d8a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613de1578082015181840152602081019050613dc6565b83811115613df0576000848401525b50505050565b6000613e0182613daa565b91506000821415613e1557613e14613efd565b5b600182039050919050565b60006002820490506001821680613e3857607f821691505b60208210811415613e4c57613e4b613f5b565b5b50919050565b613e5b82614030565b810181811067ffffffffffffffff82111715613e7a57613e79613fe8565b5b80604052505050565b6000613e8e82613daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ec157613ec0613efd565b5b600182019050919050565b6000613ed782613daa565b9150613ee283613daa565b925082613ef257613ef1613f2c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d626560008201527f7220657863656564656400000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f57726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61463381613d36565b811461463e57600080fd5b50565b61464a81613d48565b811461465557600080fd5b50565b61466181613d54565b811461466c57600080fd5b50565b61467881613d5e565b811461468357600080fd5b50565b61468f81613daa565b811461469a57600080fd5b5056fea26469706673582212208f5a3fba9d7f122453327b2d5cba4877cdd6544ab4adcf9bc85fdf9ace0ecefc64736f6c63430008070033
Deployed ByteCode Sourcemap
59924:2418:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60562:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22298:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23857:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23380:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36525:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24607:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54732:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59068:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55117:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59721:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36193:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60064:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59369:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56165:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60807:75;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25017:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58405:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36715:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62229:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21992:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60320:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21722:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53617:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22467:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60890:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52708:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24150:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60348:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59481:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59180:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25273:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61426:392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55509:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59613:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61327:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24376:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58486:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60562:237;60672:4;60696:47;60731:11;60696:34;:47::i;:::-;:95;;;;60747:44;60779:11;60747:31;:44::i;:::-;60696:95;60689:102;;60562:237;;;:::o;22298:100::-;22352:13;22385:5;22378:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22298:100;:::o;23857:221::-;23933:7;23961:16;23969:7;23961;:16::i;:::-;23953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24046:15;:24;24062:7;24046:24;;;;;;;;;;;;;;;;;;;;;24039:31;;23857:221;;;:::o;23380:411::-;23461:13;23477:23;23492:7;23477:14;:23::i;:::-;23461:39;;23525:5;23519:11;;:2;:11;;;;23511:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23619:5;23603:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23628:37;23645:5;23652:12;:10;:12::i;:::-;23628:16;:37::i;:::-;23603:62;23581:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23762:21;23771:2;23775:7;23762:8;:21::i;:::-;23450:341;23380:411;;:::o;36525:113::-;36586:7;36613:10;:17;;;;36606:24;;36525:113;:::o;24607:339::-;24802:41;24821:12;:10;:12::i;:::-;24835:7;24802:18;:41::i;:::-;24794:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24910:28;24920:4;24926:2;24930:7;24910:9;:28::i;:::-;24607:339;;;:::o;54732:123::-;54798:7;54825:6;:12;54832:4;54825:12;;;;;;;;;;;:22;;;54818:29;;54732:123;;;:::o;59068:104::-;59126:38;58531:31;59156:7;59126:9;:38::i;:::-;59068:104;:::o;55117:147::-;55200:18;55213:4;55200:12;:18::i;:::-;53199:30;53210:4;53216:12;:10;:12::i;:::-;53199:10;:30::i;:::-;55231:25:::1;55242:4;55248:7;55231:10;:25::i;:::-;55117:147:::0;;;:::o;59721:120::-;59775:4;59799:34;58449:30;59826:6;59799:7;:34::i;:::-;59792:41;;59721:120;;;:::o;36193:256::-;36290:7;36326:23;36343:5;36326:16;:23::i;:::-;36318:5;:31;36310:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36415:12;:19;36428:5;36415:19;;;;;;;;;;;;;;;:26;36435:5;36415:26;;;;;;;;;;;;36408:33;;36193:256;;;;:::o;60064:81::-;60103:42;60064:81;:::o;59369:104::-;59426:39;58531:31;59457:7;59426:10;:39::i;:::-;59369:104;:::o;56165:218::-;56272:12;:10;:12::i;:::-;56261:23;;:7;:23;;;56253:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56349:26;56361:4;56367:7;56349:11;:26::i;:::-;56165:218;;:::o;60807:75::-;58611:40;58449:30;58638:12;:10;:12::i;:::-;58611:7;:40::i;:::-;58603:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;60865:9:::1;60871:2;60865:5;:9::i;:::-;60807:75:::0;:::o;25017:185::-;25155:39;25172:4;25178:2;25182:7;25155:39;;;;;;;;;;;;:16;:39::i;:::-;25017:185;;;:::o;58405:74::-;58449:30;58405:74;:::o;36715:233::-;36790:7;36826:30;:28;:30::i;:::-;36818:5;:38;36810:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36923:10;36934:5;36923:17;;;;;;;;:::i;:::-;;;;;;;;;;36916:24;;36715:233;;;:::o;62229:110::-;58611:40;58449:30;58638:12;:10;:12::i;:::-;58611:7;:40::i;:::-;58603:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;62318:13:::1;62308:7;:23;;;;;;;;;;;;:::i;:::-;;62229:110:::0;:::o;21992:239::-;22064:7;22084:13;22100:7;:16;22108:7;22100:16;;;;;;;;;;;;;;;;;;;;;22084:32;;22152:1;22135:19;;:5;:19;;;;22127:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22218:5;22211:12;;;21992:239;;;:::o;60320:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21722:208::-;21794:7;21839:1;21822:19;;:5;:19;;;;21814:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21906:9;:16;21916:5;21906:16;;;;;;;;;;;;;;;;21899:23;;21722:208;;;:::o;53617:139::-;53695:4;53719:6;:12;53726:4;53719:12;;;;;;;;;;;:20;;:29;53740:7;53719:29;;;;;;;;;;;;;;;;;;;;;;;;;53712:36;;53617:139;;;;:::o;22467:104::-;22523:13;22556:7;22549:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22467:104;:::o;60890:429::-;60966:1;60951:12;:16;60943:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;60203:3;61003:12;:39;;60995:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;60103:42;61100:33;;;61134:12;:10;:12::i;:::-;61148:42;61205:12;61192:10;;:25;;;;:::i;:::-;61100:118;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61233:6;61229:81;61249:12;61245:1;:16;61229:81;;;61281:17;61287:10;61281:5;:17::i;:::-;61263:3;;;;;:::i;:::-;;;;61229:81;;;;60890:429;:::o;52708:49::-;52753:4;52708:49;;;:::o;24150:155::-;24245:52;24264:12;:10;:12::i;:::-;24278:8;24288;24245:18;:52::i;:::-;24150:155;;:::o;60348:28::-;;;;:::o;59481:124::-;59537:4;59561:36;58531:31;59589:7;59561;:36::i;:::-;59554:43;;59481:124;;;:::o;59180:181::-;59253:6;59249:105;59269:7;:14;59265:1;:18;59249:105;;;59303:41;58531:31;59333:7;59341:1;59333:10;;;;;;;;:::i;:::-;;;;;;;;59303:9;:41::i;:::-;59285:3;;;;;:::i;:::-;;;;59249:105;;;;59180:181;:::o;25273:328::-;25448:41;25467:12;:10;:12::i;:::-;25481:7;25448:18;:41::i;:::-;25440:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25554:39;25568:4;25574:2;25578:7;25587:5;25554:13;:39::i;:::-;25273:328;;;;:::o;61426:392::-;61492:13;61577:17;61585:8;61577:7;:17::i;:::-;61569:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61672:1;61654:7;61648:21;;;;;:::i;:::-;;;:25;:162;;;;;;;;;;;;;;;;;61731:7;61757:19;:8;:17;:19::i;:::-;61696:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61648:162;61641:169;;61426:392;;;:::o;55509:149::-;55593:18;55606:4;55593:12;:18::i;:::-;53199:30;53210:4;53216:12;:10;:12::i;:::-;53199:10;:30::i;:::-;55624:26:::1;55636:4;55642:7;55624:11;:26::i;:::-;55509:149:::0;;;:::o;59613:100::-;59669:36;58449:30;59698:6;59669:9;:36::i;:::-;59613:100;:::o;61327:91::-;61372:7;61397:13;;61390:20;;61327:91;:::o;24376:164::-;24473:4;24497:18;:25;24516:5;24497:25;;;;;;;;;;;;;;;:35;24523:8;24497:35;;;;;;;;;;;;;;;;;;;;;;;;;24490:42;;24376:164;;;;:::o;58486:76::-;58531:31;58486:76;:::o;35885:224::-;35987:4;36026:35;36011:50;;;:11;:50;;;;:90;;;;36065:36;36089:11;36065:23;:36::i;:::-;36011:90;36004:97;;35885:224;;;:::o;53321:204::-;53406:4;53445:32;53430:47;;;:11;:47;;;;:87;;;;53481:36;53505:11;53481:23;:36::i;:::-;53430:87;53423:94;;53321:204;;;:::o;27111:127::-;27176:4;27228:1;27200:30;;:7;:16;27208:7;27200:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27193:37;;27111:127;;;:::o;16580:98::-;16633:7;16660:10;16653:17;;16580:98;:::o;31093:174::-;31195:2;31168:15;:24;31184:7;31168:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31251:7;31247:2;31213:46;;31222:23;31237:7;31222:14;:23::i;:::-;31213:46;;;;;;;;;;;;31093:174;;:::o;27405:348::-;27498:4;27523:16;27531:7;27523;:16::i;:::-;27515:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27599:13;27615:23;27630:7;27615:14;:23::i;:::-;27599:39;;27668:5;27657:16;;:7;:16;;;:51;;;;27701:7;27677:31;;:20;27689:7;27677:11;:20::i;:::-;:31;;;27657:51;:87;;;;27712:32;27729:5;27736:7;27712:16;:32::i;:::-;27657:87;27649:96;;;27405:348;;;;:::o;30397:578::-;30556:4;30529:31;;:23;30544:7;30529:14;:23::i;:::-;:31;;;30521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30639:1;30625:16;;:2;:16;;;;30617:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30695:39;30716:4;30722:2;30726:7;30695:20;:39::i;:::-;30799:29;30816:1;30820:7;30799:8;:29::i;:::-;30860:1;30841:9;:15;30851:4;30841:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30889:1;30872:9;:13;30882:2;30872:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30920:2;30901:7;:16;30909:7;30901:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30959:7;30955:2;30940:27;;30949:4;30940:27;;;;;;;;;;;;30397:578;;;:::o;54046:497::-;54127:22;54135:4;54141:7;54127;:22::i;:::-;54122:414;;54315:41;54343:7;54315:41;;54353:2;54315:19;:41::i;:::-;54429:38;54457:4;54449:13;;54464:2;54429:19;:38::i;:::-;54220:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54166:358;;;;;;;;;;;:::i;:::-;;;;;;;;54122:414;54046:497;;:::o;57666:238::-;57750:22;57758:4;57764:7;57750;:22::i;:::-;57745:152;;57821:4;57789:6;:12;57796:4;57789:12;;;;;;;;;;;:20;;:29;57810:7;57789:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57872:12;:10;:12::i;:::-;57845:40;;57863:7;57845:40;;57857:4;57845:40;;;;;;;;;;57745:152;57666:238;;:::o;58036:239::-;58120:22;58128:4;58134:7;58120;:22::i;:::-;58116:152;;;58191:5;58159:6;:12;58166:4;58159:12;;;;;;;;;;;:20;;:29;58180:7;58159:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58243:12;:10;:12::i;:::-;58216:40;;58234:7;58216:40;;58228:4;58216:40;;;;;;;;;;58116:152;58036:239;;:::o;61828:265::-;61876:16;61914:25;:15;:23;:25::i;:::-;61903:36;;61950:27;:15;:25;:27::i;:::-;61988:13;;:15;;;;;;;;;:::i;:::-;;;;;;62019:31;62036:3;62041:8;62019:31;;;;;;;:::i;:::-;;;;;;;;62061:24;62071:3;62076:8;62061:9;:24::i;:::-;61865:228;61828:265;:::o;31409:315::-;31564:8;31555:17;;:5;:17;;;;31547:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31651:8;31613:18;:25;31632:5;31613:25;;;;;;;;;;;;;;;:35;31639:8;31613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31697:8;31675:41;;31690:5;31675:41;;;31707:8;31675:41;;;;;;:::i;:::-;;;;;;;;31409:315;;;:::o;26483:::-;26640:28;26650:4;26656:2;26660:7;26640:9;:28::i;:::-;26687:48;26710:4;26716:2;26720:7;26729:5;26687:22;:48::i;:::-;26679:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26483:315;;;;:::o;17165:723::-;17221:13;17451:1;17442:5;:10;17438:53;;;17469:10;;;;;;;;;;;;;;;;;;;;;17438:53;17501:12;17516:5;17501:20;;17532:14;17557:78;17572:1;17564:4;:9;17557:78;;17590:8;;;;;:::i;:::-;;;;17621:2;17613:10;;;;;:::i;:::-;;;17557:78;;;17645:19;17677:6;17667:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17645:39;;17695:154;17711:1;17702:5;:10;17695:154;;17739:1;17729:11;;;;;:::i;:::-;;;17806:2;17798:5;:10;;;;:::i;:::-;17785:2;:24;;;;:::i;:::-;17772:39;;17755:6;17762;17755:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17835:2;17826:11;;;;;:::i;:::-;;;17695:154;;;17873:6;17859:21;;;;;17165:723;;;;:::o;21353:305::-;21455:4;21507:25;21492:40;;;:11;:40;;;;:105;;;;21564:33;21549:48;;;:11;:48;;;;21492:105;:158;;;;21614:36;21638:11;21614:23;:36::i;:::-;21492:158;21472:178;;21353:305;;;:::o;19793:157::-;19878:4;19917:25;19902:40;;;:11;:40;;;;19895:47;;19793:157;;;:::o;37561:589::-;37705:45;37732:4;37738:2;37742:7;37705:26;:45::i;:::-;37783:1;37767:18;;:4;:18;;;37763:187;;;37802:40;37834:7;37802:31;:40::i;:::-;37763:187;;;37872:2;37864:10;;:4;:10;;;37860:90;;37891:47;37924:4;37930:7;37891:32;:47::i;:::-;37860:90;37763:187;37978:1;37964:16;;:2;:16;;;37960:183;;;37997:45;38034:7;37997:36;:45::i;:::-;37960:183;;;38070:4;38064:10;;:2;:10;;;38060:83;;38091:40;38119:2;38123:7;38091:27;:40::i;:::-;38060:83;37960:183;37561:589;;;:::o;18466:451::-;18541:13;18567:19;18612:1;18603:6;18599:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18589:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18567:47;;18625:15;:6;18632:1;18625:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18651;:6;18658:1;18651:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18682:9;18707:1;18698:6;18694:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18682:26;;18677:135;18714:1;18710;:5;18677:135;;;18749:12;18770:3;18762:5;:11;18749:25;;;;;;;:::i;:::-;;;;;18737:6;18744:1;18737:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18799:1;18789:11;;;;;18717:3;;;;:::i;:::-;;;18677:135;;;;18839:1;18830:5;:10;18822:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18902:6;18888:21;;;18466:451;;;;:::o;47101:114::-;47166:7;47193;:14;;;47186:21;;47101:114;;;:::o;47223:127::-;47330:1;47312:7;:14;;;:19;;;;;;;;;;;47223:127;:::o;28095:110::-;28171:26;28181:2;28185:7;28171:26;;;;;;;;;;;;:9;:26::i;:::-;28095:110;;:::o;32289:799::-;32444:4;32465:15;:2;:13;;;:15::i;:::-;32461:620;;;32517:2;32501:36;;;32538:12;:10;:12::i;:::-;32552:4;32558:7;32567:5;32501:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32497:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32760:1;32743:6;:13;:18;32739:272;;;32786:60;;;;;;;;;;:::i;:::-;;;;;;;;32739:272;32961:6;32955:13;32946:6;32942:2;32938:15;32931:38;32497:529;32634:41;;;32624:51;;;:6;:51;;;;32617:58;;;;;32461:620;33065:4;33058:11;;32289:799;;;;;;;:::o;33660:126::-;;;;:::o;38873:164::-;38977:10;:17;;;;38950:15;:24;38966:7;38950:24;;;;;;;;;;;:44;;;;39005:10;39021:7;39005:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38873:164;:::o;39664:988::-;39930:22;39980:1;39955:22;39972:4;39955:16;:22::i;:::-;:26;;;;:::i;:::-;39930:51;;39992:18;40013:17;:26;40031:7;40013:26;;;;;;;;;;;;39992:47;;40160:14;40146:10;:28;40142:328;;40191:19;40213:12;:18;40226:4;40213:18;;;;;;;;;;;;;;;:34;40232:14;40213:34;;;;;;;;;;;;40191:56;;40297:11;40264:12;:18;40277:4;40264:18;;;;;;;;;;;;;;;:30;40283:10;40264:30;;;;;;;;;;;:44;;;;40414:10;40381:17;:30;40399:11;40381:30;;;;;;;;;;;:43;;;;40176:294;40142:328;40566:17;:26;40584:7;40566:26;;;;;;;;;;;40559:33;;;40610:12;:18;40623:4;40610:18;;;;;;;;;;;;;;;:34;40629:14;40610:34;;;;;;;;;;;40603:41;;;39745:907;;39664:988;;:::o;40947:1079::-;41200:22;41245:1;41225:10;:17;;;;:21;;;;:::i;:::-;41200:46;;41257:18;41278:15;:24;41294:7;41278:24;;;;;;;;;;;;41257:45;;41629:19;41651:10;41662:14;41651:26;;;;;;;;:::i;:::-;;;;;;;;;;41629:48;;41715:11;41690:10;41701;41690:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41826:10;41795:15;:28;41811:11;41795:28;;;;;;;;;;;:41;;;;41967:15;:24;41983:7;41967:24;;;;;;;;;;;41960:31;;;42002:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41018:1008;;;40947:1079;:::o;38451:221::-;38536:14;38553:20;38570:2;38553:16;:20::i;:::-;38536:37;;38611:7;38584:12;:16;38597:2;38584:16;;;;;;;;;;;;;;;:24;38601:6;38584:24;;;;;;;;;;;:34;;;;38658:6;38629:17;:26;38647:7;38629:26;;;;;;;;;;;:35;;;;38525:147;38451:221;;:::o;28432:321::-;28562:18;28568:2;28572:7;28562:5;:18::i;:::-;28613:54;28644:1;28648:2;28652:7;28661:5;28613:22;:54::i;:::-;28591:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28432:321;;;:::o;8564:387::-;8624:4;8832:12;8899:7;8887:20;8879:28;;8942:1;8935:4;:8;8928:15;;;8564:387;;;:::o;29089:382::-;29183:1;29169:16;;:2;:16;;;;29161:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29242:16;29250:7;29242;:16::i;:::-;29241:17;29233:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29304:45;29333:1;29337:2;29341:7;29304:20;:45::i;:::-;29379:1;29362:9;:13;29372:2;29362:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29410:2;29391:7;:16;29399:7;29391:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29455:7;29451:2;29430:33;;29447:1;29430:33;;;;;;;;;;;;29089:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2317:5;2348:6;2342:13;2333:22;;2364:30;2388:5;2364:30;:::i;:::-;2263:137;;;;:::o;2406:139::-;2452:5;2490:6;2477:20;2468:29;;2506:33;2533:5;2506:33;:::i;:::-;2406:139;;;;:::o;2551:137::-;2596:5;2634:6;2621:20;2612:29;;2650:32;2676:5;2650:32;:::i;:::-;2551:137;;;;:::o;2694:141::-;2750:5;2781:6;2775:13;2766:22;;2797:32;2823:5;2797:32;:::i;:::-;2694:141;;;;:::o;2854:338::-;2909:5;2958:3;2951:4;2943:6;2939:17;2935:27;2925:122;;2966:79;;:::i;:::-;2925:122;3083:6;3070:20;3108:78;3182:3;3174:6;3167:4;3159:6;3155:17;3108:78;:::i;:::-;3099:87;;2915:277;2854:338;;;;:::o;3212:340::-;3268:5;3317:3;3310:4;3302:6;3298:17;3294:27;3284:122;;3325:79;;:::i;:::-;3284:122;3442:6;3429:20;3467:79;3542:3;3534:6;3527:4;3519:6;3515:17;3467:79;:::i;:::-;3458:88;;3274:278;3212:340;;;;:::o;3558:139::-;3604:5;3642:6;3629:20;3620:29;;3658:33;3685:5;3658:33;:::i;:::-;3558:139;;;;:::o;3703:329::-;3762:6;3811:2;3799:9;3790:7;3786:23;3782:32;3779:119;;;3817:79;;:::i;:::-;3779:119;3937:1;3962:53;4007:7;3998:6;3987:9;3983:22;3962:53;:::i;:::-;3952:63;;3908:117;3703:329;;;;:::o;4038:474::-;4106:6;4114;4163:2;4151:9;4142:7;4138:23;4134:32;4131:119;;;4169:79;;:::i;:::-;4131:119;4289:1;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4260:117;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4038:474;;;;;:::o;4518:619::-;4595:6;4603;4611;4660:2;4648:9;4639:7;4635:23;4631:32;4628:119;;;4666:79;;:::i;:::-;4628:119;4786:1;4811:53;4856:7;4847:6;4836:9;4832:22;4811:53;:::i;:::-;4801:63;;4757:117;4913:2;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4884:118;5041:2;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5012:118;4518:619;;;;;:::o;5143:943::-;5238:6;5246;5254;5262;5311:3;5299:9;5290:7;5286:23;5282:33;5279:120;;;5318:79;;:::i;:::-;5279:120;5438:1;5463:53;5508:7;5499:6;5488:9;5484:22;5463:53;:::i;:::-;5453:63;;5409:117;5565:2;5591:53;5636:7;5627:6;5616:9;5612:22;5591:53;:::i;:::-;5581:63;;5536:118;5693:2;5719:53;5764:7;5755:6;5744:9;5740:22;5719:53;:::i;:::-;5709:63;;5664:118;5849:2;5838:9;5834:18;5821:32;5880:18;5872:6;5869:30;5866:117;;;5902:79;;:::i;:::-;5866:117;6007:62;6061:7;6052:6;6041:9;6037:22;6007:62;:::i;:::-;5997:72;;5792:287;5143:943;;;;;;;:::o;6092:468::-;6157:6;6165;6214:2;6202:9;6193:7;6189:23;6185:32;6182:119;;;6220:79;;:::i;:::-;6182:119;6340:1;6365:53;6410:7;6401:6;6390:9;6386:22;6365:53;:::i;:::-;6355:63;;6311:117;6467:2;6493:50;6535:7;6526:6;6515:9;6511:22;6493:50;:::i;:::-;6483:60;;6438:115;6092:468;;;;;:::o;6566:474::-;6634:6;6642;6691:2;6679:9;6670:7;6666:23;6662:32;6659:119;;;6697:79;;:::i;:::-;6659:119;6817:1;6842:53;6887:7;6878:6;6867:9;6863:22;6842:53;:::i;:::-;6832:63;;6788:117;6944:2;6970:53;7015:7;7006:6;6995:9;6991:22;6970:53;:::i;:::-;6960:63;;6915:118;6566:474;;;;;:::o;7046:539::-;7130:6;7179:2;7167:9;7158:7;7154:23;7150:32;7147:119;;;7185:79;;:::i;:::-;7147:119;7333:1;7322:9;7318:17;7305:31;7363:18;7355:6;7352:30;7349:117;;;7385:79;;:::i;:::-;7349:117;7490:78;7560:7;7551:6;7540:9;7536:22;7490:78;:::i;:::-;7480:88;;7276:302;7046:539;;;;:::o;7591:345::-;7658:6;7707:2;7695:9;7686:7;7682:23;7678:32;7675:119;;;7713:79;;:::i;:::-;7675:119;7833:1;7858:61;7911:7;7902:6;7891:9;7887:22;7858:61;:::i;:::-;7848:71;;7804:125;7591:345;;;;:::o;7942:329::-;8001:6;8050:2;8038:9;8029:7;8025:23;8021:32;8018:119;;;8056:79;;:::i;:::-;8018:119;8176:1;8201:53;8246:7;8237:6;8226:9;8222:22;8201:53;:::i;:::-;8191:63;;8147:117;7942:329;;;;:::o;8277:474::-;8345:6;8353;8402:2;8390:9;8381:7;8377:23;8373:32;8370:119;;;8408:79;;:::i;:::-;8370:119;8528:1;8553:53;8598:7;8589:6;8578:9;8574:22;8553:53;:::i;:::-;8543:63;;8499:117;8655:2;8681:53;8726:7;8717:6;8706:9;8702:22;8681:53;:::i;:::-;8671:63;;8626:118;8277:474;;;;;:::o;8757:327::-;8815:6;8864:2;8852:9;8843:7;8839:23;8835:32;8832:119;;;8870:79;;:::i;:::-;8832:119;8990:1;9015:52;9059:7;9050:6;9039:9;9035:22;9015:52;:::i;:::-;9005:62;;8961:116;8757:327;;;;:::o;9090:349::-;9159:6;9208:2;9196:9;9187:7;9183:23;9179:32;9176:119;;;9214:79;;:::i;:::-;9176:119;9334:1;9359:63;9414:7;9405:6;9394:9;9390:22;9359:63;:::i;:::-;9349:73;;9305:127;9090:349;;;;:::o;9445:509::-;9514:6;9563:2;9551:9;9542:7;9538:23;9534:32;9531:119;;;9569:79;;:::i;:::-;9531:119;9717:1;9706:9;9702:17;9689:31;9747:18;9739:6;9736:30;9733:117;;;9769:79;;:::i;:::-;9733:117;9874:63;9929:7;9920:6;9909:9;9905:22;9874:63;:::i;:::-;9864:73;;9660:287;9445:509;;;;:::o;9960:329::-;10019:6;10068:2;10056:9;10047:7;10043:23;10039:32;10036:119;;;10074:79;;:::i;:::-;10036:119;10194:1;10219:53;10264:7;10255:6;10244:9;10240:22;10219:53;:::i;:::-;10209:63;;10165:117;9960:329;;;;:::o;10295:118::-;10382:24;10400:5;10382:24;:::i;:::-;10377:3;10370:37;10295:118;;:::o;10419:109::-;10500:21;10515:5;10500:21;:::i;:::-;10495:3;10488:34;10419:109;;:::o;10534:118::-;10621:24;10639:5;10621:24;:::i;:::-;10616:3;10609:37;10534:118;;:::o;10658:360::-;10744:3;10772:38;10804:5;10772:38;:::i;:::-;10826:70;10889:6;10884:3;10826:70;:::i;:::-;10819:77;;10905:52;10950:6;10945:3;10938:4;10931:5;10927:16;10905:52;:::i;:::-;10982:29;11004:6;10982:29;:::i;:::-;10977:3;10973:39;10966:46;;10748:270;10658:360;;;;:::o;11024:364::-;11112:3;11140:39;11173:5;11140:39;:::i;:::-;11195:71;11259:6;11254:3;11195:71;:::i;:::-;11188:78;;11275:52;11320:6;11315:3;11308:4;11301:5;11297:16;11275:52;:::i;:::-;11352:29;11374:6;11352:29;:::i;:::-;11347:3;11343:39;11336:46;;11116:272;11024:364;;;;:::o;11394:377::-;11500:3;11528:39;11561:5;11528:39;:::i;:::-;11583:89;11665:6;11660:3;11583:89;:::i;:::-;11576:96;;11681:52;11726:6;11721:3;11714:4;11707:5;11703:16;11681:52;:::i;:::-;11758:6;11753:3;11749:16;11742:23;;11504:267;11394:377;;;;:::o;11801:845::-;11904:3;11941:5;11935:12;11970:36;11996:9;11970:36;:::i;:::-;12022:89;12104:6;12099:3;12022:89;:::i;:::-;12015:96;;12142:1;12131:9;12127:17;12158:1;12153:137;;;;12304:1;12299:341;;;;12120:520;;12153:137;12237:4;12233:9;12222;12218:25;12213:3;12206:38;12273:6;12268:3;12264:16;12257:23;;12153:137;;12299:341;12366:38;12398:5;12366:38;:::i;:::-;12426:1;12440:154;12454:6;12451:1;12448:13;12440:154;;;12528:7;12522:14;12518:1;12513:3;12509:11;12502:35;12578:1;12569:7;12565:15;12554:26;;12476:4;12473:1;12469:12;12464:17;;12440:154;;;12623:6;12618:3;12614:16;12607:23;;12306:334;;12120:520;;11908:738;;11801:845;;;;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12652:366;;;:::o;13024:::-;13166:3;13187:67;13251:2;13246:3;13187:67;:::i;:::-;13180:74;;13263:93;13352:3;13263:93;:::i;:::-;13381:2;13376:3;13372:12;13365:19;;13024:366;;;:::o;13396:::-;13538:3;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13635:93;13724:3;13635:93;:::i;:::-;13753:2;13748:3;13744:12;13737:19;;13396:366;;;:::o;13768:::-;13910:3;13931:67;13995:2;13990:3;13931:67;:::i;:::-;13924:74;;14007:93;14096:3;14007:93;:::i;:::-;14125:2;14120:3;14116:12;14109:19;;13768:366;;;:::o;14140:::-;14282:3;14303:67;14367:2;14362:3;14303:67;:::i;:::-;14296:74;;14379:93;14468:3;14379:93;:::i;:::-;14497:2;14492:3;14488:12;14481:19;;14140:366;;;:::o;14512:::-;14654:3;14675:67;14739:2;14734:3;14675:67;:::i;:::-;14668:74;;14751:93;14840:3;14751:93;:::i;:::-;14869:2;14864:3;14860:12;14853:19;;14512:366;;;:::o;14884:::-;15026:3;15047:67;15111:2;15106:3;15047:67;:::i;:::-;15040:74;;15123:93;15212:3;15123:93;:::i;:::-;15241:2;15236:3;15232:12;15225:19;;14884:366;;;:::o;15256:::-;15398:3;15419:67;15483:2;15478:3;15419:67;:::i;:::-;15412:74;;15495:93;15584:3;15495:93;:::i;:::-;15613:2;15608:3;15604:12;15597:19;;15256:366;;;:::o;15628:::-;15770:3;15791:67;15855:2;15850:3;15791:67;:::i;:::-;15784:74;;15867:93;15956:3;15867:93;:::i;:::-;15985:2;15980:3;15976:12;15969:19;;15628:366;;;:::o;16000:::-;16142:3;16163:67;16227:2;16222:3;16163:67;:::i;:::-;16156:74;;16239:93;16328:3;16239:93;:::i;:::-;16357:2;16352:3;16348:12;16341:19;;16000:366;;;:::o;16372:::-;16514:3;16535:67;16599:2;16594:3;16535:67;:::i;:::-;16528:74;;16611:93;16700:3;16611:93;:::i;:::-;16729:2;16724:3;16720:12;16713:19;;16372:366;;;:::o;16744:::-;16886:3;16907:67;16971:2;16966:3;16907:67;:::i;:::-;16900:74;;16983:93;17072:3;16983:93;:::i;:::-;17101:2;17096:3;17092:12;17085:19;;16744:366;;;:::o;17116:::-;17258:3;17279:67;17343:2;17338:3;17279:67;:::i;:::-;17272:74;;17355:93;17444:3;17355:93;:::i;:::-;17473:2;17468:3;17464:12;17457:19;;17116:366;;;:::o;17488:::-;17630:3;17651:67;17715:2;17710:3;17651:67;:::i;:::-;17644:74;;17727:93;17816:3;17727:93;:::i;:::-;17845:2;17840:3;17836:12;17829:19;;17488:366;;;:::o;17860:::-;18002:3;18023:67;18087:2;18082:3;18023:67;:::i;:::-;18016:74;;18099:93;18188:3;18099:93;:::i;:::-;18217:2;18212:3;18208:12;18201:19;;17860:366;;;:::o;18232:::-;18374:3;18395:67;18459:2;18454:3;18395:67;:::i;:::-;18388:74;;18471:93;18560:3;18471:93;:::i;:::-;18589:2;18584:3;18580:12;18573:19;;18232:366;;;:::o;18604:::-;18746:3;18767:67;18831:2;18826:3;18767:67;:::i;:::-;18760:74;;18843:93;18932:3;18843:93;:::i;:::-;18961:2;18956:3;18952:12;18945:19;;18604:366;;;:::o;18976:::-;19118:3;19139:67;19203:2;19198:3;19139:67;:::i;:::-;19132:74;;19215:93;19304:3;19215:93;:::i;:::-;19333:2;19328:3;19324:12;19317:19;;18976:366;;;:::o;19348:402::-;19508:3;19529:85;19611:2;19606:3;19529:85;:::i;:::-;19522:92;;19623:93;19712:3;19623:93;:::i;:::-;19741:2;19736:3;19732:12;19725:19;;19348:402;;;:::o;19756:366::-;19898:3;19919:67;19983:2;19978:3;19919:67;:::i;:::-;19912:74;;19995:93;20084:3;19995:93;:::i;:::-;20113:2;20108:3;20104:12;20097:19;;19756:366;;;:::o;20128:402::-;20288:3;20309:85;20391:2;20386:3;20309:85;:::i;:::-;20302:92;;20403:93;20492:3;20403:93;:::i;:::-;20521:2;20516:3;20512:12;20505:19;;20128:402;;;:::o;20536:366::-;20678:3;20699:67;20763:2;20758:3;20699:67;:::i;:::-;20692:74;;20775:93;20864:3;20775:93;:::i;:::-;20893:2;20888:3;20884:12;20877:19;;20536:366;;;:::o;20908:::-;21050:3;21071:67;21135:2;21130:3;21071:67;:::i;:::-;21064:74;;21147:93;21236:3;21147:93;:::i;:::-;21265:2;21260:3;21256:12;21249:19;;20908:366;;;:::o;21280:118::-;21367:24;21385:5;21367:24;:::i;:::-;21362:3;21355:37;21280:118;;:::o;21404:429::-;21581:3;21603:92;21691:3;21682:6;21603:92;:::i;:::-;21596:99;;21712:95;21803:3;21794:6;21712:95;:::i;:::-;21705:102;;21824:3;21817:10;;21404:429;;;;;:::o;21839:967::-;22221:3;22243:148;22387:3;22243:148;:::i;:::-;22236:155;;22408:95;22499:3;22490:6;22408:95;:::i;:::-;22401:102;;22520:148;22664:3;22520:148;:::i;:::-;22513:155;;22685:95;22776:3;22767:6;22685:95;:::i;:::-;22678:102;;22797:3;22790:10;;21839:967;;;;;:::o;22812:222::-;22905:4;22943:2;22932:9;22928:18;22920:26;;22956:71;23024:1;23013:9;23009:17;23000:6;22956:71;:::i;:::-;22812:222;;;;:::o;23040:442::-;23189:4;23227:2;23216:9;23212:18;23204:26;;23240:71;23308:1;23297:9;23293:17;23284:6;23240:71;:::i;:::-;23321:72;23389:2;23378:9;23374:18;23365:6;23321:72;:::i;:::-;23403;23471:2;23460:9;23456:18;23447:6;23403:72;:::i;:::-;23040:442;;;;;;:::o;23488:640::-;23683:4;23721:3;23710:9;23706:19;23698:27;;23735:71;23803:1;23792:9;23788:17;23779:6;23735:71;:::i;:::-;23816:72;23884:2;23873:9;23869:18;23860:6;23816:72;:::i;:::-;23898;23966:2;23955:9;23951:18;23942:6;23898:72;:::i;:::-;24017:9;24011:4;24007:20;24002:2;23991:9;23987:18;23980:48;24045:76;24116:4;24107:6;24045:76;:::i;:::-;24037:84;;23488:640;;;;;;;:::o;24134:332::-;24255:4;24293:2;24282:9;24278:18;24270:26;;24306:71;24374:1;24363:9;24359:17;24350:6;24306:71;:::i;:::-;24387:72;24455:2;24444:9;24440:18;24431:6;24387:72;:::i;:::-;24134:332;;;;;:::o;24472:210::-;24559:4;24597:2;24586:9;24582:18;24574:26;;24610:65;24672:1;24661:9;24657:17;24648:6;24610:65;:::i;:::-;24472:210;;;;:::o;24688:222::-;24781:4;24819:2;24808:9;24804:18;24796:26;;24832:71;24900:1;24889:9;24885:17;24876:6;24832:71;:::i;:::-;24688:222;;;;:::o;24916:313::-;25029:4;25067:2;25056:9;25052:18;25044:26;;25116:9;25110:4;25106:20;25102:1;25091:9;25087:17;25080:47;25144:78;25217:4;25208:6;25144:78;:::i;:::-;25136:86;;24916:313;;;;:::o;25235:419::-;25401:4;25439:2;25428:9;25424:18;25416:26;;25488:9;25482:4;25478:20;25474:1;25463:9;25459:17;25452:47;25516:131;25642:4;25516:131;:::i;:::-;25508:139;;25235:419;;;:::o;25660:::-;25826:4;25864:2;25853:9;25849:18;25841:26;;25913:9;25907:4;25903:20;25899:1;25888:9;25884:17;25877:47;25941:131;26067:4;25941:131;:::i;:::-;25933:139;;25660:419;;;:::o;26085:::-;26251:4;26289:2;26278:9;26274:18;26266:26;;26338:9;26332:4;26328:20;26324:1;26313:9;26309:17;26302:47;26366:131;26492:4;26366:131;:::i;:::-;26358:139;;26085:419;;;:::o;26510:::-;26676:4;26714:2;26703:9;26699:18;26691:26;;26763:9;26757:4;26753:20;26749:1;26738:9;26734:17;26727:47;26791:131;26917:4;26791:131;:::i;:::-;26783:139;;26510:419;;;:::o;26935:::-;27101:4;27139:2;27128:9;27124:18;27116:26;;27188:9;27182:4;27178:20;27174:1;27163:9;27159:17;27152:47;27216:131;27342:4;27216:131;:::i;:::-;27208:139;;26935:419;;;:::o;27360:::-;27526:4;27564:2;27553:9;27549:18;27541:26;;27613:9;27607:4;27603:20;27599:1;27588:9;27584:17;27577:47;27641:131;27767:4;27641:131;:::i;:::-;27633:139;;27360:419;;;:::o;27785:::-;27951:4;27989:2;27978:9;27974:18;27966:26;;28038:9;28032:4;28028:20;28024:1;28013:9;28009:17;28002:47;28066:131;28192:4;28066:131;:::i;:::-;28058:139;;27785:419;;;:::o;28210:::-;28376:4;28414:2;28403:9;28399:18;28391:26;;28463:9;28457:4;28453:20;28449:1;28438:9;28434:17;28427:47;28491:131;28617:4;28491:131;:::i;:::-;28483:139;;28210:419;;;:::o;28635:::-;28801:4;28839:2;28828:9;28824:18;28816:26;;28888:9;28882:4;28878:20;28874:1;28863:9;28859:17;28852:47;28916:131;29042:4;28916:131;:::i;:::-;28908:139;;28635:419;;;:::o;29060:::-;29226:4;29264:2;29253:9;29249:18;29241:26;;29313:9;29307:4;29303:20;29299:1;29288:9;29284:17;29277:47;29341:131;29467:4;29341:131;:::i;:::-;29333:139;;29060:419;;;:::o;29485:::-;29651:4;29689:2;29678:9;29674:18;29666:26;;29738:9;29732:4;29728:20;29724:1;29713:9;29709:17;29702:47;29766:131;29892:4;29766:131;:::i;:::-;29758:139;;29485:419;;;:::o;29910:::-;30076:4;30114:2;30103:9;30099:18;30091:26;;30163:9;30157:4;30153:20;30149:1;30138:9;30134:17;30127:47;30191:131;30317:4;30191:131;:::i;:::-;30183:139;;29910:419;;;:::o;30335:::-;30501:4;30539:2;30528:9;30524:18;30516:26;;30588:9;30582:4;30578:20;30574:1;30563:9;30559:17;30552:47;30616:131;30742:4;30616:131;:::i;:::-;30608:139;;30335:419;;;:::o;30760:::-;30926:4;30964:2;30953:9;30949:18;30941:26;;31013:9;31007:4;31003:20;30999:1;30988:9;30984:17;30977:47;31041:131;31167:4;31041:131;:::i;:::-;31033:139;;30760:419;;;:::o;31185:::-;31351:4;31389:2;31378:9;31374:18;31366:26;;31438:9;31432:4;31428:20;31424:1;31413:9;31409:17;31402:47;31466:131;31592:4;31466:131;:::i;:::-;31458:139;;31185:419;;;:::o;31610:::-;31776:4;31814:2;31803:9;31799:18;31791:26;;31863:9;31857:4;31853:20;31849:1;31838:9;31834:17;31827:47;31891:131;32017:4;31891:131;:::i;:::-;31883:139;;31610:419;;;:::o;32035:::-;32201:4;32239:2;32228:9;32224:18;32216:26;;32288:9;32282:4;32278:20;32274:1;32263:9;32259:17;32252:47;32316:131;32442:4;32316:131;:::i;:::-;32308:139;;32035:419;;;:::o;32460:::-;32626:4;32664:2;32653:9;32649:18;32641:26;;32713:9;32707:4;32703:20;32699:1;32688:9;32684:17;32677:47;32741:131;32867:4;32741:131;:::i;:::-;32733:139;;32460:419;;;:::o;32885:::-;33051:4;33089:2;33078:9;33074:18;33066:26;;33138:9;33132:4;33128:20;33124:1;33113:9;33109:17;33102:47;33166:131;33292:4;33166:131;:::i;:::-;33158:139;;32885:419;;;:::o;33310:::-;33476:4;33514:2;33503:9;33499:18;33491:26;;33563:9;33557:4;33553:20;33549:1;33538:9;33534:17;33527:47;33591:131;33717:4;33591:131;:::i;:::-;33583:139;;33310:419;;;:::o;33735:::-;33901:4;33939:2;33928:9;33924:18;33916:26;;33988:9;33982:4;33978:20;33974:1;33963:9;33959:17;33952:47;34016:131;34142:4;34016:131;:::i;:::-;34008:139;;33735:419;;;:::o;34160:222::-;34253:4;34291:2;34280:9;34276:18;34268:26;;34304:71;34372:1;34361:9;34357:17;34348:6;34304:71;:::i;:::-;34160:222;;;;:::o;34388:129::-;34422:6;34449:20;;:::i;:::-;34439:30;;34478:33;34506:4;34498:6;34478:33;:::i;:::-;34388:129;;;:::o;34523:75::-;34556:6;34589:2;34583:9;34573:19;;34523:75;:::o;34604:311::-;34681:4;34771:18;34763:6;34760:30;34757:56;;;34793:18;;:::i;:::-;34757:56;34843:4;34835:6;34831:17;34823:25;;34903:4;34897;34893:15;34885:23;;34604:311;;;:::o;34921:307::-;34982:4;35072:18;35064:6;35061:30;35058:56;;;35094:18;;:::i;:::-;35058:56;35132:29;35154:6;35132:29;:::i;:::-;35124:37;;35216:4;35210;35206:15;35198:23;;34921:307;;;:::o;35234:308::-;35296:4;35386:18;35378:6;35375:30;35372:56;;;35408:18;;:::i;:::-;35372:56;35446:29;35468:6;35446:29;:::i;:::-;35438:37;;35530:4;35524;35520:15;35512:23;;35234:308;;;:::o;35548:141::-;35597:4;35620:3;35612:11;;35643:3;35640:1;35633:14;35677:4;35674:1;35664:18;35656:26;;35548:141;;;:::o;35695:98::-;35746:6;35780:5;35774:12;35764:22;;35695:98;;;:::o;35799:99::-;35851:6;35885:5;35879:12;35869:22;;35799:99;;;:::o;35904:168::-;35987:11;36021:6;36016:3;36009:19;36061:4;36056:3;36052:14;36037:29;;35904:168;;;;:::o;36078:169::-;36162:11;36196:6;36191:3;36184:19;36236:4;36231:3;36227:14;36212:29;;36078:169;;;;:::o;36253:148::-;36355:11;36392:3;36377:18;;36253:148;;;;:::o;36407:305::-;36447:3;36466:20;36484:1;36466:20;:::i;:::-;36461:25;;36500:20;36518:1;36500:20;:::i;:::-;36495:25;;36654:1;36586:66;36582:74;36579:1;36576:81;36573:107;;;36660:18;;:::i;:::-;36573:107;36704:1;36701;36697:9;36690:16;;36407:305;;;;:::o;36718:185::-;36758:1;36775:20;36793:1;36775:20;:::i;:::-;36770:25;;36809:20;36827:1;36809:20;:::i;:::-;36804:25;;36848:1;36838:35;;36853:18;;:::i;:::-;36838:35;36895:1;36892;36888:9;36883:14;;36718:185;;;;:::o;36909:348::-;36949:7;36972:20;36990:1;36972:20;:::i;:::-;36967:25;;37006:20;37024:1;37006:20;:::i;:::-;37001:25;;37194:1;37126:66;37122:74;37119:1;37116:81;37111:1;37104:9;37097:17;37093:105;37090:131;;;37201:18;;:::i;:::-;37090:131;37249:1;37246;37242:9;37231:20;;36909:348;;;;:::o;37263:191::-;37303:4;37323:20;37341:1;37323:20;:::i;:::-;37318:25;;37357:20;37375:1;37357:20;:::i;:::-;37352:25;;37396:1;37393;37390:8;37387:34;;;37401:18;;:::i;:::-;37387:34;37446:1;37443;37439:9;37431:17;;37263:191;;;;:::o;37460:96::-;37497:7;37526:24;37544:5;37526:24;:::i;:::-;37515:35;;37460:96;;;:::o;37562:90::-;37596:7;37639:5;37632:13;37625:21;37614:32;;37562:90;;;:::o;37658:77::-;37695:7;37724:5;37713:16;;37658:77;;;:::o;37741:149::-;37777:7;37817:66;37810:5;37806:78;37795:89;;37741:149;;;:::o;37896:126::-;37933:7;37973:42;37966:5;37962:54;37951:65;;37896:126;;;:::o;38028:77::-;38065:7;38094:5;38083:16;;38028:77;;;:::o;38111:154::-;38195:6;38190:3;38185;38172:30;38257:1;38248:6;38243:3;38239:16;38232:27;38111:154;;;:::o;38271:307::-;38339:1;38349:113;38363:6;38360:1;38357:13;38349:113;;;38448:1;38443:3;38439:11;38433:18;38429:1;38424:3;38420:11;38413:39;38385:2;38382:1;38378:10;38373:15;;38349:113;;;38480:6;38477:1;38474:13;38471:101;;;38560:1;38551:6;38546:3;38542:16;38535:27;38471:101;38320:258;38271:307;;;:::o;38584:171::-;38623:3;38646:24;38664:5;38646:24;:::i;:::-;38637:33;;38692:4;38685:5;38682:15;38679:41;;;38700:18;;:::i;:::-;38679:41;38747:1;38740:5;38736:13;38729:20;;38584:171;;;:::o;38761:320::-;38805:6;38842:1;38836:4;38832:12;38822:22;;38889:1;38883:4;38879:12;38910:18;38900:81;;38966:4;38958:6;38954:17;38944:27;;38900:81;39028:2;39020:6;39017:14;38997:18;38994:38;38991:84;;;39047:18;;:::i;:::-;38991:84;38812:269;38761:320;;;:::o;39087:281::-;39170:27;39192:4;39170:27;:::i;:::-;39162:6;39158:40;39300:6;39288:10;39285:22;39264:18;39252:10;39249:34;39246:62;39243:88;;;39311:18;;:::i;:::-;39243:88;39351:10;39347:2;39340:22;39130:238;39087:281;;:::o;39374:233::-;39413:3;39436:24;39454:5;39436:24;:::i;:::-;39427:33;;39482:66;39475:5;39472:77;39469:103;;;39552:18;;:::i;:::-;39469:103;39599:1;39592:5;39588:13;39581:20;;39374:233;;;:::o;39613:176::-;39645:1;39662:20;39680:1;39662:20;:::i;:::-;39657:25;;39696:20;39714:1;39696:20;:::i;:::-;39691:25;;39735:1;39725:35;;39740:18;;:::i;:::-;39725:35;39781:1;39778;39774:9;39769:14;;39613:176;;;;:::o;39795:180::-;39843:77;39840:1;39833:88;39940:4;39937:1;39930:15;39964:4;39961:1;39954:15;39981:180;40029:77;40026:1;40019:88;40126:4;40123:1;40116:15;40150:4;40147:1;40140:15;40167:180;40215:77;40212:1;40205:88;40312:4;40309:1;40302:15;40336:4;40333:1;40326:15;40353:180;40401:77;40398:1;40391:88;40498:4;40495:1;40488:15;40522:4;40519:1;40512:15;40539:180;40587:77;40584:1;40577:88;40684:4;40681:1;40674:15;40708:4;40705:1;40698:15;40725:180;40773:77;40770:1;40763:88;40870:4;40867:1;40860:15;40894:4;40891:1;40884:15;40911:117;41020:1;41017;41010:12;41034:117;41143:1;41140;41133:12;41157:117;41266:1;41263;41256:12;41280:117;41389:1;41386;41379:12;41403:117;41512:1;41509;41502:12;41526:102;41567:6;41618:2;41614:7;41609:2;41602:5;41598:14;41594:28;41584:38;;41526:102;;;:::o;41634:182::-;41774:34;41770:1;41762:6;41758:14;41751:58;41634:182;:::o;41822:181::-;41962:33;41958:1;41950:6;41946:14;41939:57;41822:181;:::o;42009:230::-;42149:34;42145:1;42137:6;42133:14;42126:58;42218:13;42213:2;42205:6;42201:15;42194:38;42009:230;:::o;42245:237::-;42385:34;42381:1;42373:6;42369:14;42362:58;42454:20;42449:2;42441:6;42437:15;42430:45;42245:237;:::o;42488:178::-;42628:30;42624:1;42616:6;42612:14;42605:54;42488:178;:::o;42672:223::-;42812:34;42808:1;42800:6;42796:14;42789:58;42881:6;42876:2;42868:6;42864:15;42857:31;42672:223;:::o;42901:175::-;43041:27;43037:1;43029:6;43025:14;43018:51;42901:175;:::o;43082:231::-;43222:34;43218:1;43210:6;43206:14;43199:58;43291:14;43286:2;43278:6;43274:15;43267:39;43082:231;:::o;43319:243::-;43459:34;43455:1;43447:6;43443:14;43436:58;43528:26;43523:2;43515:6;43511:15;43504:51;43319:243;:::o;43568:229::-;43708:34;43704:1;43696:6;43692:14;43685:58;43777:12;43772:2;43764:6;43760:15;43753:37;43568:229;:::o;43803:228::-;43943:34;43939:1;43931:6;43927:14;43920:58;44012:11;44007:2;43999:6;43995:15;43988:36;43803:228;:::o;44037:225::-;44177:34;44173:1;44165:6;44161:14;44154:58;44246:8;44241:2;44233:6;44229:15;44222:33;44037:225;:::o;44268:182::-;44408:34;44404:1;44396:6;44392:14;44385:58;44268:182;:::o;44456:231::-;44596:34;44592:1;44584:6;44580:14;44573:58;44665:14;44660:2;44652:6;44648:15;44641:39;44456:231;:::o;44693:228::-;44833:34;44829:1;44821:6;44817:14;44810:58;44902:11;44897:2;44889:6;44885:15;44878:36;44693:228;:::o;44927:220::-;45067:34;45063:1;45055:6;45051:14;45044:58;45136:3;45131:2;45123:6;45119:15;45112:28;44927:220;:::o;45153:236::-;45293:34;45289:1;45281:6;45277:14;45270:58;45362:19;45357:2;45349:6;45345:15;45338:44;45153:236;:::o;45395:231::-;45535:34;45531:1;45523:6;45519:14;45512:58;45604:14;45599:2;45591:6;45587:15;45580:39;45395:231;:::o;45632:173::-;45772:25;45768:1;45760:6;45756:14;45749:49;45632:173;:::o;45811:229::-;45951:34;45947:1;45939:6;45935:14;45928:58;46020:12;46015:2;46007:6;46003:15;45996:37;45811:229;:::o;46046:167::-;46186:19;46182:1;46174:6;46170:14;46163:43;46046:167;:::o;46219:162::-;46359:14;46355:1;46347:6;46343:14;46336:38;46219:162;:::o;46387:234::-;46527:34;46523:1;46515:6;46511:14;46504:58;46596:17;46591:2;46583:6;46579:15;46572:42;46387:234;:::o;46627:122::-;46700:24;46718:5;46700:24;:::i;:::-;46693:5;46690:35;46680:63;;46739:1;46736;46729:12;46680:63;46627:122;:::o;46755:116::-;46825:21;46840:5;46825:21;:::i;:::-;46818:5;46815:32;46805:60;;46861:1;46858;46851:12;46805:60;46755:116;:::o;46877:122::-;46950:24;46968:5;46950:24;:::i;:::-;46943:5;46940:35;46930:63;;46989:1;46986;46979:12;46930:63;46877:122;:::o;47005:120::-;47077:23;47094:5;47077:23;:::i;:::-;47070:5;47067:34;47057:62;;47115:1;47112;47105:12;47057:62;47005:120;:::o;47131:122::-;47204:24;47222:5;47204:24;:::i;:::-;47197:5;47194:35;47184:63;;47243:1;47240;47233:12;47184:63;47131:122;:::o
Metadata Hash
ipfs://8f5a3fba9d7f122453327b2d5cba4877cdd6544ab4adcf9bc85fdf9ace0ecefc