Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
- Contract name:
- HeroesBattleArena
- Optimization enabled
- false
- Compiler version
- v0.8.19+commit.7dd6d404
- EVM Version
- default
- Verified at
- 2023-07-13T10:59:12.924909Z
Constructor Arguments
0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000059656d6572616c642d6661722d636f72616c2d3738302e6d7970696e6174612e636c6f75642f697066732f516d5452534e34424a716d524a426b57467674716d39436b79423138434d44486d50696a577067754763657a786a2f00000000000000
Arg [0] (string) : emerald-far-coral-780.mypinata.cloud/ipfs/QmTRSN4BJqmRJBkWFvtqm9CkyB18CMDHmPijWpguGcezxj/
Contract source code
// SPDX-License-Identifier: MIT // File: @chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } pragma solidity >=0.4.22 <0.9.0; pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _admin; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); transferAdmin(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } function admin() public view virtual returns (address) { return _admin; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } modifier onlyAdmin() { require(admin() == _msgSender(), "Admin: caller is not the admin"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _transferOwnership(newOwner); } function transferAdmin(address newAdmin) public virtual onlyOwner { _admin = newAdmin; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value ); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll( address indexed account, address indexed operator, bool approved ); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { return ( string(abi.encodePacked(_uri, Strings.toString(tokenId), ".json")) ); } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data ); uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][to] += amount; for (uint256 i = 0; i < amount; i++) { emit TransferSingle(operator, address(0), to, id, 1); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, 1, data ); } } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "" ); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require( fromBalance >= amount, "ERC1155: burn amount exceeds balance" ); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @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, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver.onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } pragma solidity ^0.8; pragma experimental ABIEncoderV2; interface IStdReference { /// A structure returned whenever someone requests for standard reference data. struct ReferenceData { uint256 rate; // base/quote exchange rate, multiplied by 1e18. uint256 lastUpdatedBase; // UNIX epoch of the last time when base price gets updated. uint256 lastUpdatedQuote; // UNIX epoch of the last time when quote price gets updated. } /// Returns the price data for the given base/quote pair. Revert if not available. function getReferenceData(string memory _base, string memory _quote) external view returns (ReferenceData memory); /// Similar to getReferenceData, but with multiple base/quote pairs at once. function getReferenceDataBulk( string[] memory _bases, string[] memory _quotes ) external view returns (ReferenceData[] memory); } pragma solidity ^0.8.7; abstract contract PriceConsumerV3 { AggregatorV3Interface internal priceFeed; constructor() { priceFeed = AggregatorV3Interface( 0xDf8842c6e739DcF1d5D752Bc81b5E5434eD23F06 ); } /** * Returns the latest price */ function getLatestPrice() public view returns (int256) { ( , /*uint80 roundID*/ int256 price, /*uint startedAt*/ /*uint timeStamp*/ , , ) = /*uint80 answeredInRound*/ priceFeed.latestRoundData(); return price; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155, Ownable { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()) || _msgSender() == admin(), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } 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); } } pragma solidity ^0.8.4; contract HeroesBattleArena is ERC1155, Ownable, ERC1155Burnable, PriceConsumerV3 { struct PartWithPrice { string name; uint256 price; string herotype; } string public name; using SafeMath for uint256; mapping(uint256 => PartWithPrice) allParts; uint256[] public partIds; uint256 public earlyHeroesSupply; uint256 public olympHeroesSupply; uint256 public nordHeroesSupply; uint256 public freeStonesSupply; uint256 public earlyHeroesNumber; uint256 public olympHeroesNumber; uint256 public nordHeroesNumber; bool reentrancyGuardFlag = false; constructor(string memory _url) ERC1155(_url) { name = "HEROES BATTLE ARENA"; earlyHeroesSupply = 5000; olympHeroesSupply = 3000; nordHeroesSupply = 2000; freeStonesSupply = 6; } function addPart( string memory nftName, uint256 id, uint256 price, string memory herotype ) public onlyAdmin { PartWithPrice storage newPart = allParts[id]; newPart.name = nftName; newPart.herotype = herotype; newPart.price = price; partIds.push(id); } function getPartById(uint256 id) public view returns (string memory, uint256) { PartWithPrice storage s = allParts[id]; return (s.name, s.price); } function getPartByName(string memory _name) public view returns (uint256) { for (uint256 i = 0; i <= partIds.length; i++) { PartWithPrice storage s = allParts[i]; if ( keccak256(abi.encodePacked(s.name)) == keccak256(abi.encodePacked(_name)) ) { return s.price; } } return 0; } function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } function mint(string memory _name, uint256 amount) public payable { require(!reentrancyGuardFlag, "Reentrancy Guard Activated"); reentrancyGuardFlag = true; uint256 resultPrice = uint256(getLatestPrice()); uint256 coinAmount = msg.value; for (uint256 i = 0; i <= partIds.length; ++i) { PartWithPrice storage s = allParts[i]; if (keccak256(abi.encodePacked(s.name)) == keccak256(abi.encodePacked(_name))) { uint256 cost = amount.mul(s.price.mul(10**18)).div(resultPrice); if (msg.sender != owner()) { require(cost <= msg.value,"Value sent is not correct"); if (coinAmount > cost) { address payable refundAccount = payable(msg.sender); refundAccount.transfer(coinAmount.sub(cost)); coinAmount = cost; } } if (keccak256(abi.encodePacked((s.herotype))) == keccak256(abi.encodePacked(("Free")))) { require(balanceOf(msg.sender, i) + amount < freeStonesSupply,"You already have maximum free stone."); _mint(msg.sender, i, amount, "0x0"); continue; } else if (keccak256(abi.encodePacked((s.herotype))) == keccak256(abi.encodePacked(("Early")))) { require(earlyHeroesNumber.add(amount) <= earlyHeroesSupply,"There is no supply, right now."); _mint(msg.sender, i, amount, "0x0"); earlyHeroesNumber.add(amount); } else if (keccak256(abi.encodePacked((s.herotype))) == keccak256(abi.encodePacked(("Olymp")))) { require(earlyHeroesNumber.add(amount) <= olympHeroesSupply, "There is no supply, right now."); _mint(msg.sender, i, amount, "0x0"); olympHeroesNumber.add(amount); } else if (keccak256(abi.encodePacked((s.herotype))) ==keccak256(abi.encodePacked(("North")))) { require(nordHeroesNumber.add(amount) <= nordHeroesSupply,"There is no supply, right now."); _mint(msg.sender, i, amount, "0x0"); nordHeroesNumber.add(amount); } else { _mint(msg.sender, i, amount, "0x0"); } } } reentrancyGuardFlag = false; } function changeEarlySupply(uint256 supply) public onlyOwner { earlyHeroesSupply = supply; } function changeOlympSupply(uint256 supply) public onlyOwner { olympHeroesSupply = supply; } function changeNordSupply(uint256 supply) public onlyOwner { nordHeroesSupply = supply; } function changeFreeSupply(uint256 supply) public onlyOwner { freeStonesSupply = supply; } function withdrawBalance() public onlyOwner { payable(owner()).transfer(address(this).balance); } function getEstimatedCoinAmountForMint(uint256 amount , uint256 partId) public view returns (uint256) { uint256 resultPrice = uint256(getLatestPrice()); PartWithPrice storage s = allParts[partId]; return amount.mul(s.price.mul(10**18)).div(resultPrice); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"string","name":"_url","internalType":"string"}]},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"account","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TransferBatch","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256[]","name":"ids","internalType":"uint256[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false}],"anonymous":false},{"type":"event","name":"TransferSingle","inputs":[{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"URI","inputs":[{"type":"string","name":"value","internalType":"string","indexed":false},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addPart","inputs":[{"type":"string","name":"nftName","internalType":"string"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"price","internalType":"uint256"},{"type":"string","name":"herotype","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"balanceOfBatch","inputs":[{"type":"address[]","name":"accounts","internalType":"address[]"},{"type":"uint256[]","name":"ids","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnBatch","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256[]","name":"ids","internalType":"uint256[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeEarlySupply","inputs":[{"type":"uint256","name":"supply","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeFreeSupply","inputs":[{"type":"uint256","name":"supply","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeNordSupply","inputs":[{"type":"uint256","name":"supply","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeOlympSupply","inputs":[{"type":"uint256","name":"supply","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"earlyHeroesNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"earlyHeroesSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"freeStonesSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEstimatedCoinAmountForMint","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"partId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int256","name":"","internalType":"int256"}],"name":"getLatestPrice","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPartById","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPartByName","inputs":[{"type":"string","name":"_name","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"mint","inputs":[{"type":"string","name":"_name","internalType":"string"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nordHeroesNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nordHeroesSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"olympHeroesNumber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"olympHeroesSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"partIds","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeBatchTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256[]","name":"ids","internalType":"uint256[]"},{"type":"uint256[]","name":"amounts","internalType":"uint256[]"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setURI","inputs":[{"type":"string","name":"newuri","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"uri","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawBalance","inputs":[]}]
Contract Creation Code
0x60806040526000601060006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040516200608b3803806200608b8339818101604052810190620000529190620004de565b8062000064816200016b60201b60201c565b5062000085620000796200018060201b60201c565b6200018860201b60201c565b620000a5620000996200018060201b60201c565b6200024e60201b60201c565b73df8842c6e739dcf1d5d752bc81b5e5434ed23f06600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601381526020017f4845524f455320424154544c45204152454e4100000000000000000000000000815250600690816200014091906200077a565b50611388600981905550610bb8600a819055506107d0600b819055506006600c8190555050620008e4565b80600290816200017c91906200077a565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200025e6200018060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002846200032160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d490620008c2565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003b48262000369565b810181811067ffffffffffffffff82111715620003d657620003d56200037a565b5b80604052505050565b6000620003eb6200034b565b9050620003f98282620003a9565b919050565b600067ffffffffffffffff8211156200041c576200041b6200037a565b5b620004278262000369565b9050602081019050919050565b60005b838110156200045457808201518184015260208101905062000437565b60008484015250505050565b6000620004776200047184620003fe565b620003df565b90508281526020810184848401111562000496576200049562000364565b5b620004a384828562000434565b509392505050565b600082601f830112620004c357620004c26200035f565b5b8151620004d584826020860162000460565b91505092915050565b600060208284031215620004f757620004f662000355565b5b600082015167ffffffffffffffff8111156200051857620005176200035a565b5b6200052684828501620004ab565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200058257607f821691505b6020821081036200059857620005976200053a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005c3565b6200060e8683620005c3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200065b620006556200064f8462000626565b62000630565b62000626565b9050919050565b6000819050919050565b62000677836200063a565b6200068f620006868262000662565b848454620005d0565b825550505050565b600090565b620006a662000697565b620006b38184846200066c565b505050565b5b81811015620006db57620006cf6000826200069c565b600181019050620006b9565b5050565b601f8211156200072a57620006f4816200059e565b620006ff84620005b3565b810160208510156200070f578190505b620007276200071e85620005b3565b830182620006b8565b50505b505050565b600082821c905092915050565b60006200074f600019846008026200072f565b1980831691505092915050565b60006200076a83836200073c565b9150826002028217905092915050565b62000785826200052f565b67ffffffffffffffff811115620007a157620007a06200037a565b5b620007ad825462000569565b620007ba828285620006df565b600060209050601f831160018114620007f25760008415620007dd578287015190505b620007e985826200075c565b86555062000859565b601f19841662000802866200059e565b60005b828110156200082c5784890151825560018201915060208501945060208101905062000805565b868310156200084c578489015162000848601f8916826200073c565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620008aa60208362000861565b9150620008b78262000872565b602082019050919050565b60006020820190508181036000830152620008dd816200089b565b9050919050565b61579780620008f46000396000f3fe60806040526004361061020e5760003560e01c80635fd8c71011610118578063a22cb465116100a0578063f11a6b1a1161006f578063f11a6b1a146107a0578063f242432a146107cb578063f2fde38b146107f4578063f5298aca1461081d578063f851a440146108465761020e565b8063a22cb465146106e6578063a736e1331461070f578063c51bc9351461073a578063e985e9c5146107635761020e565b806375829def116100e757806375829def1461061357806387887bc61461063c57806387d7dbd9146106675780638da5cb5b146106905780638e15f473146106bb5761020e565b80635fd8c7101461057e5780636b20c454146105955780636ea34ce4146105be578063715018a6146105fc5761020e565b80632cbce36a1161019b5780633cb7ed581161016a5780633cb7ed58146104855780634e1273f4146104b057806352fe38e6146104ed57806359929e47146105165780635b391aba146105535761020e565b80632cbce36a146103cb5780632eb2c2d6146104085780633bd1b485146104315780633bf2abe31461045a5761020e565b80630399e445116101e25780630399e445146102f3578063056b01ce1461031e57806306fdde031461033a5780630e89341c146103655780631ff06178146103a25761020e565b8062fdd58e1461021357806301e427c81461025057806301ffc9a71461028d57806302fe5305146102ca575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613546565b610871565b6040516102479190613595565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906135b0565b610939565b6040516102849190613595565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613635565b61095d565b6040516102c1919061367d565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906137de565b610a3f565b005b3480156102ff57600080fd5b50610308610ac7565b6040516103159190613595565b60405180910390f35b61033860048036038101906103339190613827565b610acd565b005b34801561034657600080fd5b5061034f61117f565b60405161035c9190613902565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906135b0565b61120d565b6040516103999190613902565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906135b0565b611241565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906137de565b6112c7565b6040516103ff9190613595565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613a8d565b611375565b005b34801561043d57600080fd5b50610458600480360381019061045391906135b0565b611416565b005b34801561046657600080fd5b5061046f61149c565b60405161047c9190613595565b60405180910390f35b34801561049157600080fd5b5061049a6114a2565b6040516104a79190613595565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190613c1f565b6114a8565b6040516104e49190613d55565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613d77565b6115c1565b005b34801561052257600080fd5b5061053d60048036038101906105389190613e16565b6116b1565b60405161054a9190613595565b60405180910390f35b34801561055f57600080fd5b50610568611722565b6040516105759190613595565b60405180910390f35b34801561058a57600080fd5b50610593611728565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613e56565b6117f4565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906135b0565b611891565b6040516105f3929190613ee1565b60405180910390f35b34801561060857600080fd5b5061061161194a565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613f11565b6119d2565b005b34801561064857600080fd5b50610651611a92565b60405161065e9190613595565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906135b0565b611a98565b005b34801561069c57600080fd5b506106a5611b1e565b6040516106b29190613f4d565b60405180910390f35b3480156106c757600080fd5b506106d0611b48565b6040516106dd9190613f81565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613fc8565b611be9565b005b34801561071b57600080fd5b50610724611bff565b6040516107319190613595565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c91906135b0565b611c05565b005b34801561076f57600080fd5b5061078a60048036038101906107859190614008565b611c8b565b604051610797919061367d565b60405180910390f35b3480156107ac57600080fd5b506107b5611d1f565b6040516107c29190613595565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190614048565b611d25565b005b34801561080057600080fd5b5061081b60048036038101906108169190613f11565b611dc6565b005b34801561082957600080fd5b50610844600480360381019061083f91906140df565b611ebd565b005b34801561085257600080fd5b5061085b611f9e565b6040516108689190613f4d565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906141a4565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6008818154811061094957600080fd5b906000526020600020016000915090505481565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a385750610a3782611fc8565b5b9050919050565b610a47612032565b73ffffffffffffffffffffffffffffffffffffffff16610a65611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290614210565b60405180910390fd5b610ac48161203a565b50565b600b5481565b601060009054906101000a900460ff1615610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061427c565b60405180910390fd5b6001601060006101000a81548160ff0219169083151502179055506000610b42611b48565b9050600034905060005b600880549050811161115d57600060076000838152602001908152602001600020905085604051602001610b8091906142d8565b6040516020818303038152906040528051906020012081600001604051602001610baa91906143e7565b604051602081830303815290604052805190602001200361114a576000610c0a85610bfc610bed670de0b6b3a7640000866001015461204d90919063ffffffff16565b8961204d90919063ffffffff16565b61206390919063ffffffff16565b9050610c14611b1e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cf55734811115610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061444a565b60405180910390fd5b80841115610cf45760003390508073ffffffffffffffffffffffffffffffffffffffff166108fc610cc3848861207990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610cee573d6000803e3d6000fd5b50819450505b5b604051602001610d04906144b6565b6040516020818303038152906040528051906020012082600201604051602001610d2e91906143e7565b6040516020818303038152906040528051906020012003610de957600c5486610d573386610871565b610d6191906144fa565b10610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d98906145a0565b60405180910390fd5b610de23384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b505061114c565b604051602001610df89061460c565b6040516020818303038152906040528051906020012082600201604051602001610e2291906143e7565b6040516020818303038152906040528051906020012003610ef257600954610e5587600d5461224590919063ffffffff16565b1115610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061466d565b60405180910390fd5b610ed73384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b610eec86600d5461224590919063ffffffff16565b50611148565b604051602001610f01906146d9565b6040516020818303038152906040528051906020012082600201604051602001610f2b91906143e7565b6040516020818303038152906040528051906020012003610ffb57600a54610f5e87600d5461224590919063ffffffff16565b1115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f969061466d565b60405180910390fd5b610fe03384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b610ff586600e5461224590919063ffffffff16565b50611147565b60405160200161100a9061473a565b604051602081830303815290604052805190602001208260020160405160200161103491906143e7565b604051602081830303815290604052805190602001200361110457600b5461106787600f5461224590919063ffffffff16565b11156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f9061466d565b60405180910390fd5b6110e93384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b6110fe86600f5461224590919063ffffffff16565b50611146565b6111453384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b5b5b5b505b505b806111569061474f565b9050610b4c565b506000601060006101000a81548160ff02191690831515021790555050505050565b6006805461118c9061431e565b80601f01602080910402602001604051908101604052809291908181526020018280546111b89061431e565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b505050505081565b6060600261121a8361225b565b60405160200161122b9291906147e3565b6040516020818303038152906040529050919050565b611249612032565b73ffffffffffffffffffffffffffffffffffffffff16611267611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614210565b60405180910390fd5b80600a8190555050565b600080600090505b600880549050811161136a5760006007600083815260200190815260200160002090508360405160200161130391906142d8565b604051602081830303815290604052805190602001208160000160405160200161132d91906143e7565b604051602081830303815290604052805190602001200361135657806001015492505050611370565b5080806113629061474f565b9150506112cf565b50600090505b919050565b61137d612032565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113c357506113c2856113bd612032565b611c8b565b5b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614884565b60405180910390fd5b61140f85858585856123bb565b5050505050565b61141e612032565b73ffffffffffffffffffffffffffffffffffffffff1661143c611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614210565b60405180910390fd5b80600b8190555050565b600d5481565b600f5481565b606081518351146114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614916565b60405180910390fd5b6000835167ffffffffffffffff81111561150b5761150a6136b3565b5b6040519080825280602002602001820160405280156115395781602001602082028036833780820191505090505b50905060005b84518110156115b65761158685828151811061155e5761155d614936565b5b602002602001015185838151811061157957611578614936565b5b6020026020010151610871565b82828151811061159957611598614936565b5b602002602001018181525050806115af9061474f565b905061153f565b508091505092915050565b6115c9612032565b73ffffffffffffffffffffffffffffffffffffffff166115e7611f9e565b73ffffffffffffffffffffffffffffffffffffffff161461163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906149b1565b60405180910390fd5b6000600760008581526020019081526020016000209050848160000190816116659190614b68565b50818160020190816116779190614b68565b5082816001018190555060088490806001815401808255809150506001900390600052602060002001600090919091909150555050505050565b6000806116bc611b48565b905060006007600085815260200190815260200160002090506117188261170a6116fb670de0b6b3a7640000856001015461204d90919063ffffffff16565b8861204d90919063ffffffff16565b61206390919063ffffffff16565b9250505092915050565b600e5481565b611730612032565b73ffffffffffffffffffffffffffffffffffffffff1661174e611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614210565b60405180910390fd5b6117ac611b1e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117f1573d6000803e3d6000fd5b50565b6117fc612032565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061184257506118418361183c612032565b611c8b565b5b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890614cac565b60405180910390fd5b61188c8383836126ce565b505050565b60606000806007600085815260200190815260200160002090508060000181600101548180546118c09061431e565b80601f01602080910402602001604051908101604052809291908181526020018280546118ec9061431e565b80156119395780601f1061190e57610100808354040283529160200191611939565b820191906000526020600020905b81548152906001019060200180831161191c57829003601f168201915b505050505091509250925050915091565b611952612032565b73ffffffffffffffffffffffffffffffffffffffff16611970611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90614210565b60405180910390fd5b6119d0600061297c565b565b6119da612032565b73ffffffffffffffffffffffffffffffffffffffff166119f8611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590614210565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b611aa0612032565b73ffffffffffffffffffffffffffffffffffffffff16611abe611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614210565b60405180910390fd5b80600c8190555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdc9190614d4f565b5050509150508091505090565b611bfb611bf4612032565b8383612a42565b5050565b60095481565b611c0d612032565b73ffffffffffffffffffffffffffffffffffffffff16611c2b611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614210565b60405180910390fd5b8060098190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b611d2d612032565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611d735750611d7285611d6d612032565b611c8b565b5b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614cac565b60405180910390fd5b611dbf8585858585612bae565b5050505050565b611dce612032565b73ffffffffffffffffffffffffffffffffffffffff16611dec611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990614210565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea890614e3c565b60405180910390fd5b611eba8161297c565b50565b611ec5612032565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611f0b5750611f0a83611f05612032565b611c8b565b5b80611f4f5750611f19611f9e565b73ffffffffffffffffffffffffffffffffffffffff16611f37612032565b73ffffffffffffffffffffffffffffffffffffffff16145b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590614cac565b60405180910390fd5b611f99838383612e2f565b505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b80600290816120499190614b68565b5050565b6000818361205b9190614e5c565b905092915050565b600081836120719190614ecd565b905092915050565b600081836120879190614efe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f590614fa4565b60405180910390fd5b6000612108612032565b90506121298160008761211a8861304b565b6121238861304b565b876130c5565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218891906144fa565b9250508190555060005b8381101561223d578573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051612212929190614fff565b60405180910390a461222a82600088886001886130cd565b80806122359061474f565b915050612192565b505050505050565b6000818361225391906144fa565b905092915050565b6060600082036122a2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b6565b600082905060005b600082146122d45780806122bd9061474f565b915050600a826122cd9190614ecd565b91506122aa565b60008167ffffffffffffffff8111156122f0576122ef6136b3565b5b6040519080825280601f01601f1916602001820160405280156123225781602001600182028036833780820191505090505b5090505b600085146123af5760018261233b9190614efe565b9150600a8561234a9190615028565b603061235691906144fa565b60f81b81838151811061236c5761236b614936565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123a89190614ecd565b9450612326565b8093505050505b919050565b81518351146123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f6906150cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361246e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659061515d565b60405180910390fd5b6000612478612032565b90506124888187878787876130c5565b60005b84518110156126395760008582815181106124a9576124a8614936565b5b6020026020010151905060008583815181106124c8576124c7614936565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612560906151ef565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261e91906144fa565b92505081905550505050806126329061474f565b905061248b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126b092919061520f565b60405180910390a46126c68187878787876132a4565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612734906152b8565b60405180910390fd5b8051825114612781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612778906150cb565b60405180910390fd5b600061278b612032565b90506127ab818560008686604051806020016040528060008152506130c5565b60005b83518110156128f65760008482815181106127cc576127cb614936565b5b6020026020010151905060008483815181106127eb576127ea614936565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561288c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128839061534a565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050806128ef9061474f565b90506127ae565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161296e92919061520f565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa7906153dc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ba1919061367d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c149061515d565b60405180910390fd5b6000612c27612032565b9050612c47818787612c388861304b565b612c418861304b565b876130c5565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd5906151ef565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9391906144fa565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612e109291906153fc565b60405180910390a4612e268288888888886130cd565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906152b8565b60405180910390fd5b6000612ea8612032565b9050612ed881856000612eba8761304b565b612ec38761304b565b604051806020016040528060008152506130c5565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f669061534a565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161303c9291906153fc565b60405180910390a45050505050565b60606000600167ffffffffffffffff81111561306a576130696136b3565b5b6040519080825280602002602001820160405280156130985781602001602082028036833780820191505090505b50905082816000815181106130b0576130af614936565b5b60200260200101818152505080915050919050565b505050505050565b6130ec8473ffffffffffffffffffffffffffffffffffffffff1661347b565b1561329c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161313295949392919061547a565b6020604051808303816000875af192505050801561316e57506040513d601f19601f8201168201806040525081019061316b91906154e9565b60015b6132135761317a615523565b806308c379a0036131d6575061318e615545565b8061319957506131d8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cd9190613902565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320a90615647565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461329a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613291906156d9565b60405180910390fd5b505b505050505050565b6132c38473ffffffffffffffffffffffffffffffffffffffff1661347b565b15613473578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133099594939291906156f9565b6020604051808303816000875af192505050801561334557506040513d601f19601f8201168201806040525081019061334291906154e9565b60015b6133ea57613351615523565b806308c379a0036133ad5750613365615545565b8061337057506133af565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a49190613902565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190615647565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613468906156d9565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134dd826134b2565b9050919050565b6134ed816134d2565b81146134f857600080fd5b50565b60008135905061350a816134e4565b92915050565b6000819050919050565b61352381613510565b811461352e57600080fd5b50565b6000813590506135408161351a565b92915050565b6000806040838503121561355d5761355c6134a8565b5b600061356b858286016134fb565b925050602061357c85828601613531565b9150509250929050565b61358f81613510565b82525050565b60006020820190506135aa6000830184613586565b92915050565b6000602082840312156135c6576135c56134a8565b5b60006135d484828501613531565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613612816135dd565b811461361d57600080fd5b50565b60008135905061362f81613609565b92915050565b60006020828403121561364b5761364a6134a8565b5b600061365984828501613620565b91505092915050565b60008115159050919050565b61367781613662565b82525050565b6000602082019050613692600083018461366e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136eb826136a2565b810181811067ffffffffffffffff8211171561370a576137096136b3565b5b80604052505050565b600061371d61349e565b905061372982826136e2565b919050565b600067ffffffffffffffff821115613749576137486136b3565b5b613752826136a2565b9050602081019050919050565b82818337600083830152505050565b600061378161377c8461372e565b613713565b90508281526020810184848401111561379d5761379c61369d565b5b6137a884828561375f565b509392505050565b600082601f8301126137c5576137c4613698565b5b81356137d584826020860161376e565b91505092915050565b6000602082840312156137f4576137f36134a8565b5b600082013567ffffffffffffffff811115613812576138116134ad565b5b61381e848285016137b0565b91505092915050565b6000806040838503121561383e5761383d6134a8565b5b600083013567ffffffffffffffff81111561385c5761385b6134ad565b5b613868858286016137b0565b925050602061387985828601613531565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bd5780820151818401526020810190506138a2565b60008484015250505050565b60006138d482613883565b6138de818561388e565b93506138ee81856020860161389f565b6138f7816136a2565b840191505092915050565b6000602082019050818103600083015261391c81846138c9565b905092915050565b600067ffffffffffffffff82111561393f5761393e6136b3565b5b602082029050602081019050919050565b600080fd5b600061396861396384613924565b613713565b9050808382526020820190506020840283018581111561398b5761398a613950565b5b835b818110156139b457806139a08882613531565b84526020840193505060208101905061398d565b5050509392505050565b600082601f8301126139d3576139d2613698565b5b81356139e3848260208601613955565b91505092915050565b600067ffffffffffffffff821115613a0757613a066136b3565b5b613a10826136a2565b9050602081019050919050565b6000613a30613a2b846139ec565b613713565b905082815260208101848484011115613a4c57613a4b61369d565b5b613a5784828561375f565b509392505050565b600082601f830112613a7457613a73613698565b5b8135613a84848260208601613a1d565b91505092915050565b600080600080600060a08688031215613aa957613aa86134a8565b5b6000613ab7888289016134fb565b9550506020613ac8888289016134fb565b945050604086013567ffffffffffffffff811115613ae957613ae86134ad565b5b613af5888289016139be565b935050606086013567ffffffffffffffff811115613b1657613b156134ad565b5b613b22888289016139be565b925050608086013567ffffffffffffffff811115613b4357613b426134ad565b5b613b4f88828901613a5f565b9150509295509295909350565b600067ffffffffffffffff821115613b7757613b766136b3565b5b602082029050602081019050919050565b6000613b9b613b9684613b5c565b613713565b90508083825260208201905060208402830185811115613bbe57613bbd613950565b5b835b81811015613be75780613bd388826134fb565b845260208401935050602081019050613bc0565b5050509392505050565b600082601f830112613c0657613c05613698565b5b8135613c16848260208601613b88565b91505092915050565b60008060408385031215613c3657613c356134a8565b5b600083013567ffffffffffffffff811115613c5457613c536134ad565b5b613c6085828601613bf1565b925050602083013567ffffffffffffffff811115613c8157613c806134ad565b5b613c8d858286016139be565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ccc81613510565b82525050565b6000613cde8383613cc3565b60208301905092915050565b6000602082019050919050565b6000613d0282613c97565b613d0c8185613ca2565b9350613d1783613cb3565b8060005b83811015613d48578151613d2f8882613cd2565b9750613d3a83613cea565b925050600181019050613d1b565b5085935050505092915050565b60006020820190508181036000830152613d6f8184613cf7565b905092915050565b60008060008060808587031215613d9157613d906134a8565b5b600085013567ffffffffffffffff811115613daf57613dae6134ad565b5b613dbb878288016137b0565b9450506020613dcc87828801613531565b9350506040613ddd87828801613531565b925050606085013567ffffffffffffffff811115613dfe57613dfd6134ad565b5b613e0a878288016137b0565b91505092959194509250565b60008060408385031215613e2d57613e2c6134a8565b5b6000613e3b85828601613531565b9250506020613e4c85828601613531565b9150509250929050565b600080600060608486031215613e6f57613e6e6134a8565b5b6000613e7d868287016134fb565b935050602084013567ffffffffffffffff811115613e9e57613e9d6134ad565b5b613eaa868287016139be565b925050604084013567ffffffffffffffff811115613ecb57613eca6134ad565b5b613ed7868287016139be565b9150509250925092565b60006040820190508181036000830152613efb81856138c9565b9050613f0a6020830184613586565b9392505050565b600060208284031215613f2757613f266134a8565b5b6000613f35848285016134fb565b91505092915050565b613f47816134d2565b82525050565b6000602082019050613f626000830184613f3e565b92915050565b6000819050919050565b613f7b81613f68565b82525050565b6000602082019050613f966000830184613f72565b92915050565b613fa581613662565b8114613fb057600080fd5b50565b600081359050613fc281613f9c565b92915050565b60008060408385031215613fdf57613fde6134a8565b5b6000613fed858286016134fb565b9250506020613ffe85828601613fb3565b9150509250929050565b6000806040838503121561401f5761401e6134a8565b5b600061402d858286016134fb565b925050602061403e858286016134fb565b9150509250929050565b600080600080600060a08688031215614064576140636134a8565b5b6000614072888289016134fb565b9550506020614083888289016134fb565b945050604061409488828901613531565b93505060606140a588828901613531565b925050608086013567ffffffffffffffff8111156140c6576140c56134ad565b5b6140d288828901613a5f565b9150509295509295909350565b6000806000606084860312156140f8576140f76134a8565b5b6000614106868287016134fb565b935050602061411786828701613531565b925050604061412886828701613531565b9150509250925092565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061418e602b8361388e565b915061419982614132565b604082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fa60208361388e565b9150614205826141c4565b602082019050919050565b60006020820190508181036000830152614229816141ed565b9050919050565b7f5265656e7472616e637920477561726420416374697661746564000000000000600082015250565b6000614266601a8361388e565b915061427182614230565b602082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b600081905092915050565b60006142b282613883565b6142bc818561429c565b93506142cc81856020860161389f565b80840191505092915050565b60006142e482846142a7565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061433657607f821691505b602082108103614349576143486142ef565b5b50919050565b60008190508160005260206000209050919050565b600081546143718161431e565b61437b818661429c565b9450600182166000811461439657600181146143ab576143de565b60ff19831686528115158202860193506143de565b6143b48561434f565b60005b838110156143d6578154818901526001820191506020810190506143b7565b838801955050505b50505092915050565b60006143f38284614364565b915081905092915050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b600061443460198361388e565b915061443f826143fe565b602082019050919050565b6000602082019050818103600083015261446381614427565b9050919050565b7f4672656500000000000000000000000000000000000000000000000000000000600082015250565b60006144a060048361429c565b91506144ab8261446a565b600482019050919050565b60006144c182614493565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450582613510565b915061451083613510565b9250828201905080821115614528576145276144cb565b5b92915050565b7f596f7520616c72656164792068617665206d6178696d756d206672656520737460008201527f6f6e652e00000000000000000000000000000000000000000000000000000000602082015250565b600061458a60248361388e565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b7f4561726c79000000000000000000000000000000000000000000000000000000600082015250565b60006145f660058361429c565b9150614601826145c0565b600582019050919050565b6000614617826145e9565b9150819050919050565b7f5468657265206973206e6f20737570706c792c207269676874206e6f772e0000600082015250565b6000614657601e8361388e565b915061466282614621565b602082019050919050565b600060208201905081810360008301526146868161464a565b9050919050565b7f4f6c796d70000000000000000000000000000000000000000000000000000000600082015250565b60006146c360058361429c565b91506146ce8261468d565b600582019050919050565b60006146e4826146b6565b9150819050919050565b7f4e6f727468000000000000000000000000000000000000000000000000000000600082015250565b600061472460058361429c565b915061472f826146ee565b600582019050919050565b600061474582614717565b9150819050919050565b600061475a82613510565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361478c5761478b6144cb565b5b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006147cd60058361429c565b91506147d882614797565b600582019050919050565b60006147ef8285614364565b91506147fb82846142a7565b9150614806826147c0565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061486e60328361388e565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061490060298361388e565b915061490b826148a4565b604082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f41646d696e3a2063616c6c6572206973206e6f74207468652061646d696e0000600082015250565b600061499b601e8361388e565b91506149a682614965565b602082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826149e1565b614a2886836149e1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a65614a60614a5b84613510565b614a40565b613510565b9050919050565b6000819050919050565b614a7f83614a4a565b614a93614a8b82614a6c565b8484546149ee565b825550505050565b600090565b614aa8614a9b565b614ab3818484614a76565b505050565b5b81811015614ad757614acc600082614aa0565b600181019050614ab9565b5050565b601f821115614b1c57614aed8161434f565b614af6846149d1565b81016020851015614b05578190505b614b19614b11856149d1565b830182614ab8565b50505b505050565b600082821c905092915050565b6000614b3f60001984600802614b21565b1980831691505092915050565b6000614b588383614b2e565b9150826002028217905092915050565b614b7182613883565b67ffffffffffffffff811115614b8a57614b896136b3565b5b614b94825461431e565b614b9f828285614adb565b600060209050601f831160018114614bd25760008415614bc0578287015190505b614bca8582614b4c565b865550614c32565b601f198416614be08661434f565b60005b82811015614c0857848901518255600182019150602085019450602081019050614be3565b86831015614c255784890151614c21601f891682614b2e565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614c9660298361388e565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b600069ffffffffffffffffffff82169050919050565b614ceb81614ccc565b8114614cf657600080fd5b50565b600081519050614d0881614ce2565b92915050565b614d1781613f68565b8114614d2257600080fd5b50565b600081519050614d3481614d0e565b92915050565b600081519050614d498161351a565b92915050565b600080600080600060a08688031215614d6b57614d6a6134a8565b5b6000614d7988828901614cf9565b9550506020614d8a88828901614d25565b9450506040614d9b88828901614d3a565b9350506060614dac88828901614d3a565b9250506080614dbd88828901614cf9565b9150509295509295909350565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e2660268361388e565b9150614e3182614dca565b604082019050919050565b60006020820190508181036000830152614e5581614e19565b9050919050565b6000614e6782613510565b9150614e7283613510565b9250828202614e8081613510565b91508282048414831517614e9757614e966144cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed882613510565b9150614ee383613510565b925082614ef357614ef2614e9e565b5b828204905092915050565b6000614f0982613510565b9150614f1483613510565b9250828203905081811115614f2c57614f2b6144cb565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f8e60218361388e565b9150614f9982614f32565b604082019050919050565b60006020820190508181036000830152614fbd81614f81565b9050919050565b6000819050919050565b6000614fe9614fe4614fdf84614fc4565b614a40565b613510565b9050919050565b614ff981614fce565b82525050565b60006040820190506150146000830185613586565b6150216020830184614ff0565b9392505050565b600061503382613510565b915061503e83613510565b92508261504e5761504d614e9e565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006150b560288361388e565b91506150c082615059565b604082019050919050565b600060208201905081810360008301526150e4816150a8565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061514760258361388e565b9150615152826150eb565b604082019050919050565b600060208201905081810360008301526151768161513a565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006151d9602a8361388e565b91506151e48261517d565b604082019050919050565b60006020820190508181036000830152615208816151cc565b9050919050565b600060408201905081810360008301526152298185613cf7565b9050818103602083015261523d8184613cf7565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006152a260238361388e565b91506152ad82615246565b604082019050919050565b600060208201905081810360008301526152d181615295565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061533460248361388e565b915061533f826152d8565b604082019050919050565b6000602082019050818103600083015261536381615327565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006153c660298361388e565b91506153d18261536a565b604082019050919050565b600060208201905081810360008301526153f5816153b9565b9050919050565b60006040820190506154116000830185613586565b61541e6020830184613586565b9392505050565b600081519050919050565b600082825260208201905092915050565b600061544c82615425565b6154568185615430565b935061546681856020860161389f565b61546f816136a2565b840191505092915050565b600060a08201905061548f6000830188613f3e565b61549c6020830187613f3e565b6154a96040830186613586565b6154b66060830185613586565b81810360808301526154c88184615441565b90509695505050505050565b6000815190506154e381613609565b92915050565b6000602082840312156154ff576154fe6134a8565b5b600061550d848285016154d4565b91505092915050565b60008160e01c9050919050565b600060033d11156155425760046000803e61553f600051615516565b90505b90565b600060443d106155d25761555761349e565b60043d036004823e80513d602482011167ffffffffffffffff8211171561557f5750506155d2565b808201805167ffffffffffffffff81111561559d57505050506155d2565b80602083010160043d0385018111156155ba5750505050506155d2565b6155c9826020018501866136e2565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061563160348361388e565b915061563c826155d5565b604082019050919050565b6000602082019050818103600083015261566081615624565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006156c360288361388e565b91506156ce82615667565b604082019050919050565b600060208201905081810360008301526156f2816156b6565b9050919050565b600060a08201905061570e6000830188613f3e565b61571b6020830187613f3e565b818103604083015261572d8186613cf7565b905081810360608301526157418185613cf7565b905081810360808301526157558184615441565b9050969550505050505056fea264697066735822122029d8a7c1c8eca7ea715f8e00f6c6378edfd8dd4f199b93e56dafd6a773bb35ad64736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000059656d6572616c642d6661722d636f72616c2d3738302e6d7970696e6174612e636c6f75642f697066732f516d5452534e34424a716d524a426b57467674716d39436b79423138434d44486d50696a577067754763657a786a2f00000000000000
Deployed ByteCode
0x60806040526004361061020e5760003560e01c80635fd8c71011610118578063a22cb465116100a0578063f11a6b1a1161006f578063f11a6b1a146107a0578063f242432a146107cb578063f2fde38b146107f4578063f5298aca1461081d578063f851a440146108465761020e565b8063a22cb465146106e6578063a736e1331461070f578063c51bc9351461073a578063e985e9c5146107635761020e565b806375829def116100e757806375829def1461061357806387887bc61461063c57806387d7dbd9146106675780638da5cb5b146106905780638e15f473146106bb5761020e565b80635fd8c7101461057e5780636b20c454146105955780636ea34ce4146105be578063715018a6146105fc5761020e565b80632cbce36a1161019b5780633cb7ed581161016a5780633cb7ed58146104855780634e1273f4146104b057806352fe38e6146104ed57806359929e47146105165780635b391aba146105535761020e565b80632cbce36a146103cb5780632eb2c2d6146104085780633bd1b485146104315780633bf2abe31461045a5761020e565b80630399e445116101e25780630399e445146102f3578063056b01ce1461031e57806306fdde031461033a5780630e89341c146103655780631ff06178146103a25761020e565b8062fdd58e1461021357806301e427c81461025057806301ffc9a71461028d57806302fe5305146102ca575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613546565b610871565b6040516102479190613595565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906135b0565b610939565b6040516102849190613595565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613635565b61095d565b6040516102c1919061367d565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906137de565b610a3f565b005b3480156102ff57600080fd5b50610308610ac7565b6040516103159190613595565b60405180910390f35b61033860048036038101906103339190613827565b610acd565b005b34801561034657600080fd5b5061034f61117f565b60405161035c9190613902565b60405180910390f35b34801561037157600080fd5b5061038c600480360381019061038791906135b0565b61120d565b6040516103999190613902565b60405180910390f35b3480156103ae57600080fd5b506103c960048036038101906103c491906135b0565b611241565b005b3480156103d757600080fd5b506103f260048036038101906103ed91906137de565b6112c7565b6040516103ff9190613595565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613a8d565b611375565b005b34801561043d57600080fd5b50610458600480360381019061045391906135b0565b611416565b005b34801561046657600080fd5b5061046f61149c565b60405161047c9190613595565b60405180910390f35b34801561049157600080fd5b5061049a6114a2565b6040516104a79190613595565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d29190613c1f565b6114a8565b6040516104e49190613d55565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613d77565b6115c1565b005b34801561052257600080fd5b5061053d60048036038101906105389190613e16565b6116b1565b60405161054a9190613595565b60405180910390f35b34801561055f57600080fd5b50610568611722565b6040516105759190613595565b60405180910390f35b34801561058a57600080fd5b50610593611728565b005b3480156105a157600080fd5b506105bc60048036038101906105b79190613e56565b6117f4565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906135b0565b611891565b6040516105f3929190613ee1565b60405180910390f35b34801561060857600080fd5b5061061161194a565b005b34801561061f57600080fd5b5061063a60048036038101906106359190613f11565b6119d2565b005b34801561064857600080fd5b50610651611a92565b60405161065e9190613595565b60405180910390f35b34801561067357600080fd5b5061068e600480360381019061068991906135b0565b611a98565b005b34801561069c57600080fd5b506106a5611b1e565b6040516106b29190613f4d565b60405180910390f35b3480156106c757600080fd5b506106d0611b48565b6040516106dd9190613f81565b60405180910390f35b3480156106f257600080fd5b5061070d60048036038101906107089190613fc8565b611be9565b005b34801561071b57600080fd5b50610724611bff565b6040516107319190613595565b60405180910390f35b34801561074657600080fd5b50610761600480360381019061075c91906135b0565b611c05565b005b34801561076f57600080fd5b5061078a60048036038101906107859190614008565b611c8b565b604051610797919061367d565b60405180910390f35b3480156107ac57600080fd5b506107b5611d1f565b6040516107c29190613595565b60405180910390f35b3480156107d757600080fd5b506107f260048036038101906107ed9190614048565b611d25565b005b34801561080057600080fd5b5061081b60048036038101906108169190613f11565b611dc6565b005b34801561082957600080fd5b50610844600480360381019061083f91906140df565b611ebd565b005b34801561085257600080fd5b5061085b611f9e565b6040516108689190613f4d565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906141a4565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6008818154811061094957600080fd5b906000526020600020016000915090505481565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a2857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a385750610a3782611fc8565b5b9050919050565b610a47612032565b73ffffffffffffffffffffffffffffffffffffffff16610a65611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614610abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab290614210565b60405180910390fd5b610ac48161203a565b50565b600b5481565b601060009054906101000a900460ff1615610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b149061427c565b60405180910390fd5b6001601060006101000a81548160ff0219169083151502179055506000610b42611b48565b9050600034905060005b600880549050811161115d57600060076000838152602001908152602001600020905085604051602001610b8091906142d8565b6040516020818303038152906040528051906020012081600001604051602001610baa91906143e7565b604051602081830303815290604052805190602001200361114a576000610c0a85610bfc610bed670de0b6b3a7640000866001015461204d90919063ffffffff16565b8961204d90919063ffffffff16565b61206390919063ffffffff16565b9050610c14611b1e565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cf55734811115610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c809061444a565b60405180910390fd5b80841115610cf45760003390508073ffffffffffffffffffffffffffffffffffffffff166108fc610cc3848861207990919063ffffffff16565b9081150290604051600060405180830381858888f19350505050158015610cee573d6000803e3d6000fd5b50819450505b5b604051602001610d04906144b6565b6040516020818303038152906040528051906020012082600201604051602001610d2e91906143e7565b6040516020818303038152906040528051906020012003610de957600c5486610d573386610871565b610d6191906144fa565b10610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d98906145a0565b60405180910390fd5b610de23384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b505061114c565b604051602001610df89061460c565b6040516020818303038152906040528051906020012082600201604051602001610e2291906143e7565b6040516020818303038152906040528051906020012003610ef257600954610e5587600d5461224590919063ffffffff16565b1115610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d9061466d565b60405180910390fd5b610ed73384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b610eec86600d5461224590919063ffffffff16565b50611148565b604051602001610f01906146d9565b6040516020818303038152906040528051906020012082600201604051602001610f2b91906143e7565b6040516020818303038152906040528051906020012003610ffb57600a54610f5e87600d5461224590919063ffffffff16565b1115610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f969061466d565b60405180910390fd5b610fe03384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b610ff586600e5461224590919063ffffffff16565b50611147565b60405160200161100a9061473a565b604051602081830303815290604052805190602001208260020160405160200161103491906143e7565b604051602081830303815290604052805190602001200361110457600b5461106787600f5461224590919063ffffffff16565b11156110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f9061466d565b60405180910390fd5b6110e93384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b6110fe86600f5461224590919063ffffffff16565b50611146565b6111453384886040518060400160405280600381526020017f307830000000000000000000000000000000000000000000000000000000000081525061208f565b5b5b5b505b505b806111569061474f565b9050610b4c565b506000601060006101000a81548160ff02191690831515021790555050505050565b6006805461118c9061431e565b80601f01602080910402602001604051908101604052809291908181526020018280546111b89061431e565b80156112055780601f106111da57610100808354040283529160200191611205565b820191906000526020600020905b8154815290600101906020018083116111e857829003601f168201915b505050505081565b6060600261121a8361225b565b60405160200161122b9291906147e3565b6040516020818303038152906040529050919050565b611249612032565b73ffffffffffffffffffffffffffffffffffffffff16611267611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146112bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b490614210565b60405180910390fd5b80600a8190555050565b600080600090505b600880549050811161136a5760006007600083815260200190815260200160002090508360405160200161130391906142d8565b604051602081830303815290604052805190602001208160000160405160200161132d91906143e7565b604051602081830303815290604052805190602001200361135657806001015492505050611370565b5080806113629061474f565b9150506112cf565b50600090505b919050565b61137d612032565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113c357506113c2856113bd612032565b611c8b565b5b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614884565b60405180910390fd5b61140f85858585856123bb565b5050505050565b61141e612032565b73ffffffffffffffffffffffffffffffffffffffff1661143c611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148990614210565b60405180910390fd5b80600b8190555050565b600d5481565b600f5481565b606081518351146114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590614916565b60405180910390fd5b6000835167ffffffffffffffff81111561150b5761150a6136b3565b5b6040519080825280602002602001820160405280156115395781602001602082028036833780820191505090505b50905060005b84518110156115b65761158685828151811061155e5761155d614936565b5b602002602001015185838151811061157957611578614936565b5b6020026020010151610871565b82828151811061159957611598614936565b5b602002602001018181525050806115af9061474f565b905061153f565b508091505092915050565b6115c9612032565b73ffffffffffffffffffffffffffffffffffffffff166115e7611f9e565b73ffffffffffffffffffffffffffffffffffffffff161461163d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611634906149b1565b60405180910390fd5b6000600760008581526020019081526020016000209050848160000190816116659190614b68565b50818160020190816116779190614b68565b5082816001018190555060088490806001815401808255809150506001900390600052602060002001600090919091909150555050505050565b6000806116bc611b48565b905060006007600085815260200190815260200160002090506117188261170a6116fb670de0b6b3a7640000856001015461204d90919063ffffffff16565b8861204d90919063ffffffff16565b61206390919063ffffffff16565b9250505092915050565b600e5481565b611730612032565b73ffffffffffffffffffffffffffffffffffffffff1661174e611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146117a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179b90614210565b60405180910390fd5b6117ac611b1e565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156117f1573d6000803e3d6000fd5b50565b6117fc612032565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061184257506118418361183c612032565b611c8b565b5b611881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187890614cac565b60405180910390fd5b61188c8383836126ce565b505050565b60606000806007600085815260200190815260200160002090508060000181600101548180546118c09061431e565b80601f01602080910402602001604051908101604052809291908181526020018280546118ec9061431e565b80156119395780601f1061190e57610100808354040283529160200191611939565b820191906000526020600020905b81548152906001019060200180831161191c57829003601f168201915b505050505091509250925050915091565b611952612032565b73ffffffffffffffffffffffffffffffffffffffff16611970611b1e565b73ffffffffffffffffffffffffffffffffffffffff16146119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90614210565b60405180910390fd5b6119d0600061297c565b565b6119da612032565b73ffffffffffffffffffffffffffffffffffffffff166119f8611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611a4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4590614210565b60405180910390fd5b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b611aa0612032565b73ffffffffffffffffffffffffffffffffffffffff16611abe611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614210565b60405180910390fd5b80600c8190555050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdc9190614d4f565b5050509150508091505090565b611bfb611bf4612032565b8383612a42565b5050565b60095481565b611c0d612032565b73ffffffffffffffffffffffffffffffffffffffff16611c2b611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614210565b60405180910390fd5b8060098190555050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b611d2d612032565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611d735750611d7285611d6d612032565b611c8b565b5b611db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da990614cac565b60405180910390fd5b611dbf8585858585612bae565b5050505050565b611dce612032565b73ffffffffffffffffffffffffffffffffffffffff16611dec611b1e565b73ffffffffffffffffffffffffffffffffffffffff1614611e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3990614210565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea890614e3c565b60405180910390fd5b611eba8161297c565b50565b611ec5612032565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611f0b5750611f0a83611f05612032565b611c8b565b5b80611f4f5750611f19611f9e565b73ffffffffffffffffffffffffffffffffffffffff16611f37612032565b73ffffffffffffffffffffffffffffffffffffffff16145b611f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8590614cac565b60405180910390fd5b611f99838383612e2f565b505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b80600290816120499190614b68565b5050565b6000818361205b9190614e5c565b905092915050565b600081836120719190614ecd565b905092915050565b600081836120879190614efe565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036120fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f590614fa4565b60405180910390fd5b6000612108612032565b90506121298160008761211a8861304b565b6121238861304b565b876130c5565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461218891906144fa565b9250508190555060005b8381101561223d578573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051612212929190614fff565b60405180910390a461222a82600088886001886130cd565b80806122359061474f565b915050612192565b505050505050565b6000818361225391906144fa565b905092915050565b6060600082036122a2576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b6565b600082905060005b600082146122d45780806122bd9061474f565b915050600a826122cd9190614ecd565b91506122aa565b60008167ffffffffffffffff8111156122f0576122ef6136b3565b5b6040519080825280601f01601f1916602001820160405280156123225781602001600182028036833780820191505090505b5090505b600085146123af5760018261233b9190614efe565b9150600a8561234a9190615028565b603061235691906144fa565b60f81b81838151811061236c5761236b614936565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123a89190614ecd565b9450612326565b8093505050505b919050565b81518351146123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f6906150cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361246e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124659061515d565b60405180910390fd5b6000612478612032565b90506124888187878787876130c5565b60005b84518110156126395760008582815181106124a9576124a8614936565b5b6020026020010151905060008583815181106124c8576124c7614936565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612560906151ef565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461261e91906144fa565b92505081905550505050806126329061474f565b905061248b565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126b092919061520f565b60405180910390a46126c68187878787876132a4565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361273d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612734906152b8565b60405180910390fd5b8051825114612781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612778906150cb565b60405180910390fd5b600061278b612032565b90506127ab818560008686604051806020016040528060008152506130c5565b60005b83518110156128f65760008482815181106127cc576127cb614936565b5b6020026020010151905060008483815181106127eb576127ea614936565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561288c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128839061534a565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050806128ef9061474f565b90506127ae565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb868660405161296e92919061520f565b60405180910390a450505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa7906153dc565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ba1919061367d565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c149061515d565b60405180910390fd5b6000612c27612032565b9050612c47818787612c388861304b565b612c418861304b565b876130c5565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015612cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd5906151ef565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d9391906144fa565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051612e109291906153fc565b60405180910390a4612e268288888888886130cd565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906152b8565b60405180910390fd5b6000612ea8612032565b9050612ed881856000612eba8761304b565b612ec38761304b565b604051806020016040528060008152506130c5565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f669061534a565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62878760405161303c9291906153fc565b60405180910390a45050505050565b60606000600167ffffffffffffffff81111561306a576130696136b3565b5b6040519080825280602002602001820160405280156130985781602001602082028036833780820191505090505b50905082816000815181106130b0576130af614936565b5b60200260200101818152505080915050919050565b505050505050565b6130ec8473ffffffffffffffffffffffffffffffffffffffff1661347b565b1561329c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161313295949392919061547a565b6020604051808303816000875af192505050801561316e57506040513d601f19601f8201168201806040525081019061316b91906154e9565b60015b6132135761317a615523565b806308c379a0036131d6575061318e615545565b8061319957506131d8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cd9190613902565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320a90615647565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461329a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613291906156d9565b60405180910390fd5b505b505050505050565b6132c38473ffffffffffffffffffffffffffffffffffffffff1661347b565b15613473578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133099594939291906156f9565b6020604051808303816000875af192505050801561334557506040513d601f19601f8201168201806040525081019061334291906154e9565b60015b6133ea57613351615523565b806308c379a0036133ad5750613365615545565b8061337057506133af565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a49190613902565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e190615647565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613468906156d9565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134dd826134b2565b9050919050565b6134ed816134d2565b81146134f857600080fd5b50565b60008135905061350a816134e4565b92915050565b6000819050919050565b61352381613510565b811461352e57600080fd5b50565b6000813590506135408161351a565b92915050565b6000806040838503121561355d5761355c6134a8565b5b600061356b858286016134fb565b925050602061357c85828601613531565b9150509250929050565b61358f81613510565b82525050565b60006020820190506135aa6000830184613586565b92915050565b6000602082840312156135c6576135c56134a8565b5b60006135d484828501613531565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613612816135dd565b811461361d57600080fd5b50565b60008135905061362f81613609565b92915050565b60006020828403121561364b5761364a6134a8565b5b600061365984828501613620565b91505092915050565b60008115159050919050565b61367781613662565b82525050565b6000602082019050613692600083018461366e565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6136eb826136a2565b810181811067ffffffffffffffff8211171561370a576137096136b3565b5b80604052505050565b600061371d61349e565b905061372982826136e2565b919050565b600067ffffffffffffffff821115613749576137486136b3565b5b613752826136a2565b9050602081019050919050565b82818337600083830152505050565b600061378161377c8461372e565b613713565b90508281526020810184848401111561379d5761379c61369d565b5b6137a884828561375f565b509392505050565b600082601f8301126137c5576137c4613698565b5b81356137d584826020860161376e565b91505092915050565b6000602082840312156137f4576137f36134a8565b5b600082013567ffffffffffffffff811115613812576138116134ad565b5b61381e848285016137b0565b91505092915050565b6000806040838503121561383e5761383d6134a8565b5b600083013567ffffffffffffffff81111561385c5761385b6134ad565b5b613868858286016137b0565b925050602061387985828601613531565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156138bd5780820151818401526020810190506138a2565b60008484015250505050565b60006138d482613883565b6138de818561388e565b93506138ee81856020860161389f565b6138f7816136a2565b840191505092915050565b6000602082019050818103600083015261391c81846138c9565b905092915050565b600067ffffffffffffffff82111561393f5761393e6136b3565b5b602082029050602081019050919050565b600080fd5b600061396861396384613924565b613713565b9050808382526020820190506020840283018581111561398b5761398a613950565b5b835b818110156139b457806139a08882613531565b84526020840193505060208101905061398d565b5050509392505050565b600082601f8301126139d3576139d2613698565b5b81356139e3848260208601613955565b91505092915050565b600067ffffffffffffffff821115613a0757613a066136b3565b5b613a10826136a2565b9050602081019050919050565b6000613a30613a2b846139ec565b613713565b905082815260208101848484011115613a4c57613a4b61369d565b5b613a5784828561375f565b509392505050565b600082601f830112613a7457613a73613698565b5b8135613a84848260208601613a1d565b91505092915050565b600080600080600060a08688031215613aa957613aa86134a8565b5b6000613ab7888289016134fb565b9550506020613ac8888289016134fb565b945050604086013567ffffffffffffffff811115613ae957613ae86134ad565b5b613af5888289016139be565b935050606086013567ffffffffffffffff811115613b1657613b156134ad565b5b613b22888289016139be565b925050608086013567ffffffffffffffff811115613b4357613b426134ad565b5b613b4f88828901613a5f565b9150509295509295909350565b600067ffffffffffffffff821115613b7757613b766136b3565b5b602082029050602081019050919050565b6000613b9b613b9684613b5c565b613713565b90508083825260208201905060208402830185811115613bbe57613bbd613950565b5b835b81811015613be75780613bd388826134fb565b845260208401935050602081019050613bc0565b5050509392505050565b600082601f830112613c0657613c05613698565b5b8135613c16848260208601613b88565b91505092915050565b60008060408385031215613c3657613c356134a8565b5b600083013567ffffffffffffffff811115613c5457613c536134ad565b5b613c6085828601613bf1565b925050602083013567ffffffffffffffff811115613c8157613c806134ad565b5b613c8d858286016139be565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613ccc81613510565b82525050565b6000613cde8383613cc3565b60208301905092915050565b6000602082019050919050565b6000613d0282613c97565b613d0c8185613ca2565b9350613d1783613cb3565b8060005b83811015613d48578151613d2f8882613cd2565b9750613d3a83613cea565b925050600181019050613d1b565b5085935050505092915050565b60006020820190508181036000830152613d6f8184613cf7565b905092915050565b60008060008060808587031215613d9157613d906134a8565b5b600085013567ffffffffffffffff811115613daf57613dae6134ad565b5b613dbb878288016137b0565b9450506020613dcc87828801613531565b9350506040613ddd87828801613531565b925050606085013567ffffffffffffffff811115613dfe57613dfd6134ad565b5b613e0a878288016137b0565b91505092959194509250565b60008060408385031215613e2d57613e2c6134a8565b5b6000613e3b85828601613531565b9250506020613e4c85828601613531565b9150509250929050565b600080600060608486031215613e6f57613e6e6134a8565b5b6000613e7d868287016134fb565b935050602084013567ffffffffffffffff811115613e9e57613e9d6134ad565b5b613eaa868287016139be565b925050604084013567ffffffffffffffff811115613ecb57613eca6134ad565b5b613ed7868287016139be565b9150509250925092565b60006040820190508181036000830152613efb81856138c9565b9050613f0a6020830184613586565b9392505050565b600060208284031215613f2757613f266134a8565b5b6000613f35848285016134fb565b91505092915050565b613f47816134d2565b82525050565b6000602082019050613f626000830184613f3e565b92915050565b6000819050919050565b613f7b81613f68565b82525050565b6000602082019050613f966000830184613f72565b92915050565b613fa581613662565b8114613fb057600080fd5b50565b600081359050613fc281613f9c565b92915050565b60008060408385031215613fdf57613fde6134a8565b5b6000613fed858286016134fb565b9250506020613ffe85828601613fb3565b9150509250929050565b6000806040838503121561401f5761401e6134a8565b5b600061402d858286016134fb565b925050602061403e858286016134fb565b9150509250929050565b600080600080600060a08688031215614064576140636134a8565b5b6000614072888289016134fb565b9550506020614083888289016134fb565b945050604061409488828901613531565b93505060606140a588828901613531565b925050608086013567ffffffffffffffff8111156140c6576140c56134ad565b5b6140d288828901613a5f565b9150509295509295909350565b6000806000606084860312156140f8576140f76134a8565b5b6000614106868287016134fb565b935050602061411786828701613531565b925050604061412886828701613531565b9150509250925092565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061418e602b8361388e565b915061419982614132565b604082019050919050565b600060208201905081810360008301526141bd81614181565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141fa60208361388e565b9150614205826141c4565b602082019050919050565b60006020820190508181036000830152614229816141ed565b9050919050565b7f5265656e7472616e637920477561726420416374697661746564000000000000600082015250565b6000614266601a8361388e565b915061427182614230565b602082019050919050565b6000602082019050818103600083015261429581614259565b9050919050565b600081905092915050565b60006142b282613883565b6142bc818561429c565b93506142cc81856020860161389f565b80840191505092915050565b60006142e482846142a7565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061433657607f821691505b602082108103614349576143486142ef565b5b50919050565b60008190508160005260206000209050919050565b600081546143718161431e565b61437b818661429c565b9450600182166000811461439657600181146143ab576143de565b60ff19831686528115158202860193506143de565b6143b48561434f565b60005b838110156143d6578154818901526001820191506020810190506143b7565b838801955050505b50505092915050565b60006143f38284614364565b915081905092915050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b600061443460198361388e565b915061443f826143fe565b602082019050919050565b6000602082019050818103600083015261446381614427565b9050919050565b7f4672656500000000000000000000000000000000000000000000000000000000600082015250565b60006144a060048361429c565b91506144ab8261446a565b600482019050919050565b60006144c182614493565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061450582613510565b915061451083613510565b9250828201905080821115614528576145276144cb565b5b92915050565b7f596f7520616c72656164792068617665206d6178696d756d206672656520737460008201527f6f6e652e00000000000000000000000000000000000000000000000000000000602082015250565b600061458a60248361388e565b91506145958261452e565b604082019050919050565b600060208201905081810360008301526145b98161457d565b9050919050565b7f4561726c79000000000000000000000000000000000000000000000000000000600082015250565b60006145f660058361429c565b9150614601826145c0565b600582019050919050565b6000614617826145e9565b9150819050919050565b7f5468657265206973206e6f20737570706c792c207269676874206e6f772e0000600082015250565b6000614657601e8361388e565b915061466282614621565b602082019050919050565b600060208201905081810360008301526146868161464a565b9050919050565b7f4f6c796d70000000000000000000000000000000000000000000000000000000600082015250565b60006146c360058361429c565b91506146ce8261468d565b600582019050919050565b60006146e4826146b6565b9150819050919050565b7f4e6f727468000000000000000000000000000000000000000000000000000000600082015250565b600061472460058361429c565b915061472f826146ee565b600582019050919050565b600061474582614717565b9150819050919050565b600061475a82613510565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361478c5761478b6144cb565b5b600182019050919050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006147cd60058361429c565b91506147d882614797565b600582019050919050565b60006147ef8285614364565b91506147fb82846142a7565b9150614806826147c0565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061486e60328361388e565b915061487982614812565b604082019050919050565b6000602082019050818103600083015261489d81614861565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b600061490060298361388e565b915061490b826148a4565b604082019050919050565b6000602082019050818103600083015261492f816148f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f41646d696e3a2063616c6c6572206973206e6f74207468652061646d696e0000600082015250565b600061499b601e8361388e565b91506149a682614965565b602082019050919050565b600060208201905081810360008301526149ca8161498e565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614a1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826149e1565b614a2886836149e1565b95508019841693508086168417925050509392505050565b6000819050919050565b6000614a65614a60614a5b84613510565b614a40565b613510565b9050919050565b6000819050919050565b614a7f83614a4a565b614a93614a8b82614a6c565b8484546149ee565b825550505050565b600090565b614aa8614a9b565b614ab3818484614a76565b505050565b5b81811015614ad757614acc600082614aa0565b600181019050614ab9565b5050565b601f821115614b1c57614aed8161434f565b614af6846149d1565b81016020851015614b05578190505b614b19614b11856149d1565b830182614ab8565b50505b505050565b600082821c905092915050565b6000614b3f60001984600802614b21565b1980831691505092915050565b6000614b588383614b2e565b9150826002028217905092915050565b614b7182613883565b67ffffffffffffffff811115614b8a57614b896136b3565b5b614b94825461431e565b614b9f828285614adb565b600060209050601f831160018114614bd25760008415614bc0578287015190505b614bca8582614b4c565b865550614c32565b601f198416614be08661434f565b60005b82811015614c0857848901518255600182019150602085019450602081019050614be3565b86831015614c255784890151614c21601f891682614b2e565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614c9660298361388e565b9150614ca182614c3a565b604082019050919050565b60006020820190508181036000830152614cc581614c89565b9050919050565b600069ffffffffffffffffffff82169050919050565b614ceb81614ccc565b8114614cf657600080fd5b50565b600081519050614d0881614ce2565b92915050565b614d1781613f68565b8114614d2257600080fd5b50565b600081519050614d3481614d0e565b92915050565b600081519050614d498161351a565b92915050565b600080600080600060a08688031215614d6b57614d6a6134a8565b5b6000614d7988828901614cf9565b9550506020614d8a88828901614d25565b9450506040614d9b88828901614d3a565b9350506060614dac88828901614d3a565b9250506080614dbd88828901614cf9565b9150509295509295909350565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614e2660268361388e565b9150614e3182614dca565b604082019050919050565b60006020820190508181036000830152614e5581614e19565b9050919050565b6000614e6782613510565b9150614e7283613510565b9250828202614e8081613510565b91508282048414831517614e9757614e966144cb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed882613510565b9150614ee383613510565b925082614ef357614ef2614e9e565b5b828204905092915050565b6000614f0982613510565b9150614f1483613510565b9250828203905081811115614f2c57614f2b6144cb565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614f8e60218361388e565b9150614f9982614f32565b604082019050919050565b60006020820190508181036000830152614fbd81614f81565b9050919050565b6000819050919050565b6000614fe9614fe4614fdf84614fc4565b614a40565b613510565b9050919050565b614ff981614fce565b82525050565b60006040820190506150146000830185613586565b6150216020830184614ff0565b9392505050565b600061503382613510565b915061503e83613510565b92508261504e5761504d614e9e565b5b828206905092915050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006150b560288361388e565b91506150c082615059565b604082019050919050565b600060208201905081810360008301526150e4816150a8565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061514760258361388e565b9150615152826150eb565b604082019050919050565b600060208201905081810360008301526151768161513a565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006151d9602a8361388e565b91506151e48261517d565b604082019050919050565b60006020820190508181036000830152615208816151cc565b9050919050565b600060408201905081810360008301526152298185613cf7565b9050818103602083015261523d8184613cf7565b90509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006152a260238361388e565b91506152ad82615246565b604082019050919050565b600060208201905081810360008301526152d181615295565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061533460248361388e565b915061533f826152d8565b604082019050919050565b6000602082019050818103600083015261536381615327565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b60006153c660298361388e565b91506153d18261536a565b604082019050919050565b600060208201905081810360008301526153f5816153b9565b9050919050565b60006040820190506154116000830185613586565b61541e6020830184613586565b9392505050565b600081519050919050565b600082825260208201905092915050565b600061544c82615425565b6154568185615430565b935061546681856020860161389f565b61546f816136a2565b840191505092915050565b600060a08201905061548f6000830188613f3e565b61549c6020830187613f3e565b6154a96040830186613586565b6154b66060830185613586565b81810360808301526154c88184615441565b90509695505050505050565b6000815190506154e381613609565b92915050565b6000602082840312156154ff576154fe6134a8565b5b600061550d848285016154d4565b91505092915050565b60008160e01c9050919050565b600060033d11156155425760046000803e61553f600051615516565b90505b90565b600060443d106155d25761555761349e565b60043d036004823e80513d602482011167ffffffffffffffff8211171561557f5750506155d2565b808201805167ffffffffffffffff81111561559d57505050506155d2565b80602083010160043d0385018111156155ba5750505050506155d2565b6155c9826020018501866136e2565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061563160348361388e565b915061563c826155d5565b604082019050919050565b6000602082019050818103600083015261566081615624565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006156c360288361388e565b91506156ce82615667565b604082019050919050565b600060208201905081810360008301526156f2816156b6565b9050919050565b600060a08201905061570e6000830188613f3e565b61571b6020830187613f3e565b818103604083015261572d8186613cf7565b905081810360608301526157418185613cf7565b905081810360808301526157558184615441565b9050969550505050505056fea264697066735822122029d8a7c1c8eca7ea715f8e00f6c6378edfd8dd4f199b93e56dafd6a773bb35ad64736f6c63430008130033