ERC-1155
Overview
Max Total Supply
291 wiwizn
Holders
138
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
LondonToken
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./Ownable.sol"; import "./ERC1155.sol"; import "./ERC2981PerTokenRoyalties.sol"; /// @custom:security-contact [email protected] contract LondonToken is ERC1155, Ownable, ERC2981PerTokenRoyalties { constructor(string memory uri_) ERC1155(uri_) {} string public constant name = "Verse Works"; uint256 public totalSupply; /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * * 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 account, uint256 id, uint256 amount, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { _mint(account, id, amount, ""); if (royaltyValue > 0) { _setTokenRoyalty(id, royaltyRecipient, royaltyValue); } cids[id] = cid; totalSupply += amount; } /** * @dev Batch 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, string[] memory tokenCids, address[] memory royaltyRecipients, uint256[] memory royaltyValues ) public onlyOwner { require( ids.length == royaltyRecipients.length && ids.length == royaltyValues.length, "ERC1155: Arrays length mismatch" ); _mintBatch(to, ids, amounts, ""); for (uint256 i; i < ids.length; i++) { if (royaltyValues[i] > 0) { _setTokenRoyalty( ids[i], royaltyRecipients[i], royaltyValues[i] ); } // update IPFS CID cids[ids[i]] = tokenCids[i]; } uint256 count; for (uint256 i = 0; i < ids.length; i++) { for (uint256 j = 0; j < amounts.length; j++) { count += ids[i] * amounts[j]; } } totalSupply += count; } /** * @dev Checks for supported interface. * */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981Base) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. */ function mintWithCreator( address creator, address to, uint256 tokenId, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { require(to != address(0), "mint to the zero address"); balances[tokenId][to] += 1; totalSupply += 1; cids[tokenId] = cid; if (royaltyValue > 0) { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } address operator = _msgSender(); emit TransferSingle(operator, address(0), creator, tokenId, 1); emit TransferSingle(operator, creator, to, tokenId, 1); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} events for intermediate artist. * * 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 batchMintWithCreator( address to, address[] memory creators, uint256[] memory tokenIds, string[] memory tokenCids, address[] memory royaltyRecipients, uint256[] memory royaltyValues ) public onlyOwner { require( tokenIds.length == royaltyRecipients.length && tokenIds.length == royaltyValues.length, "ERC1155: Arrays length mismatch" ); address operator = _msgSender(); for (uint256 i = 0; i < tokenIds.length; i++) { balances[tokenIds[i]][to] += 1; // check if recipient can accept NFT _doSafeTransferAcceptanceCheck( operator, address(0), to, tokenIds[i], 1, "" ); // update royalties if (royaltyValues[i] > 0) { _setTokenRoyalty( tokenIds[i], royaltyRecipients[i], royaltyValues[i] ); } // update IPFS CID cids[tokenIds[i]] = tokenCids[i]; // emit events based on creator provided if (creators[i] == address(0)) { emit TransferSingle(operator, address(0), to, tokenIds[i], 1); } else { emit TransferSingle( operator, address(0), creators[i], tokenIds[i], 1 ); emit TransferSingle(operator, creators[i], to, tokenIds[i], 1); } } // update total supply totalSupply += tokenIds.length; } /** * @dev Sets base URI for metadata. * */ function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } /** * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`. * */ function setRoyalties( uint256 tokenId, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCID(uint256 tokenId, string memory cid) public onlyOwner { cids[tokenId] = cid; } }
// SPDX-License-Identifier: MIT // 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); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity 0.8.13; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; import "./Strings.sol"; /** * @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)) public balances; // Mapping from token ID to the IPFS cid mapping(uint256 => string) public cids; // 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. string public baseUri; /** * @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 id) public view virtual override returns (string memory) { return string(abi.encodePacked(baseUri, cids[id])); } /** * @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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, 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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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 { baseUri = 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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, amount, 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); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @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 {} /** * @dev Hook that is called after 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 _afterTokenTransfer( 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 ) public { 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./ERC2981Base.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981PerTokenRoyalties is ERC2981Base { mapping(uint256 => RoyaltyInfo) internal _royalties; /// @dev Sets token royalties /// @param tokenId the token id fir which we register the royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setTokenRoyalty( uint256 tokenId, address recipient, uint256 value ) internal { require(value <= 10000, "ERC2981Royalties: Too high"); _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo(uint256 tokenId, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties[tokenId]; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } /** * @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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"_doSafeTransferAcceptanceCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"address[]","name":"creators","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"batchMintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005116380380620051168339818101604052810190620000379190620003a8565b8062000049816200007160201b60201c565b506200006a6200005e6200008d60201b60201c565b6200009560201b60201c565b506200045d565b8060039080519060200190620000899291906200015b565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001699062000428565b90600052602060002090601f0160209004810192826200018d5760008555620001d9565b82601f10620001a857805160ff1916838001178555620001d9565b82800160010185558215620001d9579182015b82811115620001d8578251825591602001919060010190620001bb565b5b509050620001e89190620001ec565b5090565b5b8082111562000207576000816000905550600101620001ed565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620002748262000229565b810181811067ffffffffffffffff821117156200029657620002956200023a565b5b80604052505050565b6000620002ab6200020b565b9050620002b9828262000269565b919050565b600067ffffffffffffffff821115620002dc57620002db6200023a565b5b620002e78262000229565b9050602081019050919050565b60005b8381101562000314578082015181840152602081019050620002f7565b8381111562000324576000848401525b50505050565b6000620003416200033b84620002be565b6200029f565b90508281526020810184848401111562000360576200035f62000224565b5b6200036d848285620002f4565b509392505050565b600082601f8301126200038d576200038c6200021f565b5b81516200039f8482602086016200032a565b91505092915050565b600060208284031215620003c157620003c062000215565b5b600082015167ffffffffffffffff811115620003e257620003e16200021a565b5b620003f08482850162000375565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044157607f821691505b602082108103620004575762000456620003f9565b5b50919050565b614ca9806200046d6000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c8063704fe710116100de5780639abc832011610097578063e2c7f33811610071578063e2c7f33814610446578063e985e9c514610462578063f242432a14610492578063f2fde38b146104ae57610172565b80639abc8320146103f0578063a22cb4651461040e578063af8777071461042a57610172565b8063704fe71014610344578063715018a61461037457806382295a2d1461037e5780638d2bb0931461039a5780638da5cb5b146103b657806398faf29b146103d457610172565b806318160ddd1161013057806318160ddd1461025d5780631f3203311461027b5780632a55205a146102ab5780632eb2c2d6146102dc5780634e1273f4146102f857806369b520171461032857610172565b8062fdd58e1461017757806301ffc9a7146101a757806302fe5305146101d757806306fdde03146101f3578063084e9e24146102115780630e89341c1461022d575b600080fd5b610191600480360381019061018c9190612e4e565b6104ca565b60405161019e9190612e9d565b60405180910390f35b6101c160048036038101906101bc9190612f10565b610592565b6040516101ce9190612f58565b60405180910390f35b6101f160048036038101906101ec91906130b9565b6105a4565b005b6101fb61062c565b604051610208919061318a565b60405180910390f35b61022b6004803603810190610226919061324d565b610665565b005b610247600480360381019061024291906132f6565b61083c565b604051610254919061318a565b60405180910390f35b61026561087a565b6040516102729190612e9d565b60405180910390f35b61029560048036038101906102909190613323565b610880565b6040516102a29190612e9d565b60405180910390f35b6102c560048036038101906102c09190613363565b6108a5565b6040516102d39291906133b2565b60405180910390f35b6102f660048036038101906102f191906134a3565b610976565b005b610312600480360381019061030d9190613635565b610a17565b60405161031f919061376b565b60405180910390f35b610342600480360381019061033d919061386e565b610b30565b005b61035e600480360381019061035991906132f6565b610dc5565b60405161036b919061318a565b60405180910390f35b61037c610e65565b005b61039860048036038101906103939190613987565b610eed565b005b6103b460048036038101906103af91906139e3565b610f95565b005b6103be611252565b6040516103cb9190613a8c565b60405180910390f35b6103ee60048036038101906103e99190613aa7565b61127c565b005b6103f8611371565b604051610405919061318a565b60405180910390f35b61042860048036038101906104239190613b7c565b6113ff565b005b610444600480360381019061043f9190613bbc565b611415565b005b610460600480360381019061045b9190613cd5565b611919565b005b61047c60048036038101906104779190613d28565b6119a5565b6040516104899190612f58565b60405180910390f35b6104ac60048036038101906104a79190613d68565b611a39565b005b6104c860048036038101906104c39190613dff565b611ada565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361053a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053190613e9e565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061059d82611bd1565b9050919050565b6105ac611c4b565b73ffffffffffffffffffffffffffffffffffffffff166105ca611252565b73ffffffffffffffffffffffffffffffffffffffff1614610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790613f0a565b60405180910390fd5b61062981611c53565b50565b6040518060400160405280600b81526020017f566572736520576f726b7300000000000000000000000000000000000000000081525081565b6106848473ffffffffffffffffffffffffffffffffffffffff16611c6d565b15610834578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016106ca959493929190613f7f565b6020604051808303816000875af192505050801561070657506040513d601f19601f820116820180604052508101906107039190613fee565b60015b6107ab57610712614028565b806308c379a00361076e575061072661404a565b806107315750610770565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610765919061318a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a29061414c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906141de565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016108649291906142fd565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109629190614350565b61096c91906143d9565b9150509250929050565b61097e611c4b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109c457506109c3856109be611c4b565b6119a5565b5b610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa9061447c565b60405180910390fd5b610a108585858585611c90565b5050505050565b60608151835114610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a549061450e565b60405180910390fd5b6000835167ffffffffffffffff811115610a7a57610a79612f8e565b5b604051908082528060200260200182016040528015610aa85781602001602082028036833780820191505090505b50905060005b8451811015610b2557610af5858281518110610acd57610acc61452e565b5b6020026020010151858381518110610ae857610ae761452e565b5b60200260200101516104ca565b828281518110610b0857610b0761452e565b5b60200260200101818152505080610b1e9061455d565b9050610aae565b508091505092915050565b610b38611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610b56611252565b73ffffffffffffffffffffffffffffffffffffffff1614610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390613f0a565b60405180910390fd5b81518551148015610bbe575080518551145b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906145f1565b60405180910390fd5b610c1886868660405180602001604052806000815250611fb1565b60005b8551811015610d10576000828281518110610c3957610c3861452e565b5b60200260200101511115610ca157610ca0868281518110610c5d57610c5c61452e565b5b6020026020010151848381518110610c7857610c7761452e565b5b6020026020010151848481518110610c9357610c9261452e565b5b60200260200101516121dd565b5b838181518110610cb457610cb361452e565b5b602002602001015160016000888481518110610cd357610cd261452e565b5b602002602001015181526020019081526020016000209080519060200190610cfc929190612d03565b508080610d089061455d565b915050610c1b565b50600080600090505b8651811015610da25760005b8651811015610d8e57868181518110610d4157610d4061452e565b5b6020026020010151888381518110610d5c57610d5b61452e565b5b6020026020010151610d6e9190614350565b83610d799190614611565b92508080610d869061455d565b915050610d25565b508080610d9a9061455d565b915050610d19565b508060066000828254610db59190614611565b9250508190555050505050505050565b60016020528060005260406000206000915090508054610de49061422d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e109061422d565b8015610e5d5780601f10610e3257610100808354040283529160200191610e5d565b820191906000526020600020905b815481529060010190602001808311610e4057829003601f168201915b505050505081565b610e6d611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610e8b611252565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613f0a565b60405180910390fd5b610eeb60006122d9565b565b610ef5611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610f13611252565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613f0a565b60405180910390fd5b80600160008481526020019081526020016000209080519060200190610f90929190612d03565b505050565b610f9d611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610fbb611252565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890613f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906146b3565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110e09190614611565b925050819055506001600660008282546110fa9190614611565b9250508190555082600160008681526020019081526020016000209080519060200190611128929190612d03565b50600081111561113e5761113d8483836121dd565b5b6000611148611c4b565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516111c2929190614718565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611241929190614718565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611284611c4b565b73ffffffffffffffffffffffffffffffffffffffff166112a2611252565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef90613f0a565b60405180910390fd5b6113138686866040518060200160405280600081525061239f565b6000811115611328576113278583836121dd565b5b8260016000878152602001908152602001600020908051906020019061134f929190612d03565b5083600660008282546113629190614611565b92505081905550505050505050565b6003805461137e9061422d565b80601f01602080910402602001604051908101604052809291908181526020018280546113aa9061422d565b80156113f75780601f106113cc576101008083540402835291602001916113f7565b820191906000526020600020905b8154815290600101906020018083116113da57829003601f168201915b505050505081565b61141161140a611c4b565b838361254f565b5050565b61141d611c4b565b73ffffffffffffffffffffffffffffffffffffffff1661143b611252565b73ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890613f0a565b60405180910390fd5b815184511480156114a3575080518451145b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906145f1565b60405180910390fd5b60006114ec611c4b565b905060005b85518110156118f55760016000808884815181106115125761151161452e565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115749190614611565b925050819055506115b48260008a8985815181106115955761159461452e565b5b6020026020010151600160405180602001604052806000815250610665565b60008382815181106115c9576115c861452e565b5b60200260200101511115611631576116308682815181106115ed576115ec61452e565b5b60200260200101518583815181106116085761160761452e565b5b60200260200101518584815181106116235761162261452e565b5b60200260200101516121dd565b5b8481815181106116445761164361452e565b5b6020026020010151600160008884815181106116635761166261452e565b5b60200260200101518152602001908152602001600020908051906020019061168c929190612d03565b50600073ffffffffffffffffffffffffffffffffffffffff168782815181106116b8576116b761452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361177a578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106117555761175461452e565b5b6020026020010151600160405161176d929190614718565b60405180910390a46118e2565b86818151811061178d5761178c61452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061180e5761180d61452e565b5b60200260200101516001604051611826929190614718565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff168782815181106118585761185761452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118c1576118c061452e565b5b602002602001015160016040516118d9929190614718565b60405180910390a45b80806118ed9061455d565b9150506114f1565b508451600660008282546119099190614611565b9250508190555050505050505050565b611921611c4b565b73ffffffffffffffffffffffffffffffffffffffff1661193f611252565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90613f0a565b60405180910390fd5b6119a08383836121dd565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a41611c4b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611a875750611a8685611a81611c4b565b6119a5565b5b611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd906147b3565b60405180910390fd5b611ad385858585856126bb565b5050505050565b611ae2611c4b565b73ffffffffffffffffffffffffffffffffffffffff16611b00611252565b73ffffffffffffffffffffffffffffffffffffffff1614611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d90613f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614845565b60405180910390fd5b611bce816122d9565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c445750611c4382612956565b5b9050919050565b600033905090565b8060039080519060200190611c69929190612d03565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8151835114611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb906148d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614969565b60405180910390fd5b6000611d4d611c4b565b9050611d5d818787878787612a38565b60005b8451811015611f0e576000858281518110611d7e57611d7d61452e565b5b602002602001015190506000858381518110611d9d57611d9c61452e565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e35906149fb565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef39190614611565b9250508190555050505080611f079061455d565b9050611d60565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f85929190614a1b565b60405180910390a4611f9b818787878787612a40565b611fa9818787878787612a48565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614ac4565b60405180910390fd5b8151835114612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b906148d7565b60405180910390fd5b600061206e611c4b565b905061207f81600087878787612a38565b60005b84518110156121385783818151811061209e5761209d61452e565b5b60200260200101516000808784815181106120bc576120bb61452e565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211e9190614611565b9250508190555080806121309061455d565b915050612082565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121b0929190614a1b565b60405180910390a46121c781600087878787612a40565b6121d681600087878787612a48565b5050505050565b612710811115612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221990614b30565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614ac4565b60405180910390fd5b6000612418611c4b565b9050600061242585612c1f565b9050600061243285612c1f565b905061244383600089858589612a38565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a29190614611565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612520929190614b50565b60405180910390a461253783600089858589612a40565b61254683600089898989610665565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b490614beb565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126ae9190612f58565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361272a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272190614969565b60405180910390fd5b6000612734611c4b565b9050600061274185612c1f565b9050600061274e85612c1f565b905061275e838989858589612a38565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec906149fb565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128aa9190614611565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612927929190614b50565b60405180910390a461293d848a8a86868a612a40565b61294b848a8a8a8a8a610665565b505050505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a2157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a315750612a3082612c99565b5b9050919050565b505050505050565b505050505050565b612a678473ffffffffffffffffffffffffffffffffffffffff16611c6d565b15612c17578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612aad959493929190614c0b565b6020604051808303816000875af1925050508015612ae957506040513d601f19601f82011682018060405250810190612ae69190613fee565b60015b612b8e57612af5614028565b806308c379a003612b515750612b0961404a565b80612b145750612b53565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b48919061318a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b859061414c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c906141de565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612c3e57612c3d612f8e565b5b604051908082528060200260200182016040528015612c6c5781602001602082028036833780820191505090505b5090508281600081518110612c8457612c8361452e565b5b60200260200101818152505080915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612d0f9061422d565b90600052602060002090601f016020900481019282612d315760008555612d78565b82601f10612d4a57805160ff1916838001178555612d78565b82800160010185558215612d78579182015b82811115612d77578251825591602001919060010190612d5c565b5b509050612d859190612d89565b5090565b5b80821115612da2576000816000905550600101612d8a565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de582612dba565b9050919050565b612df581612dda565b8114612e0057600080fd5b50565b600081359050612e1281612dec565b92915050565b6000819050919050565b612e2b81612e18565b8114612e3657600080fd5b50565b600081359050612e4881612e22565b92915050565b60008060408385031215612e6557612e64612db0565b5b6000612e7385828601612e03565b9250506020612e8485828601612e39565b9150509250929050565b612e9781612e18565b82525050565b6000602082019050612eb26000830184612e8e565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eed81612eb8565b8114612ef857600080fd5b50565b600081359050612f0a81612ee4565b92915050565b600060208284031215612f2657612f25612db0565b5b6000612f3484828501612efb565b91505092915050565b60008115159050919050565b612f5281612f3d565b82525050565b6000602082019050612f6d6000830184612f49565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fc682612f7d565b810181811067ffffffffffffffff82111715612fe557612fe4612f8e565b5b80604052505050565b6000612ff8612da6565b90506130048282612fbd565b919050565b600067ffffffffffffffff82111561302457613023612f8e565b5b61302d82612f7d565b9050602081019050919050565b82818337600083830152505050565b600061305c61305784613009565b612fee565b90508281526020810184848401111561307857613077612f78565b5b61308384828561303a565b509392505050565b600082601f8301126130a05761309f612f73565b5b81356130b0848260208601613049565b91505092915050565b6000602082840312156130cf576130ce612db0565b5b600082013567ffffffffffffffff8111156130ed576130ec612db5565b5b6130f98482850161308b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561313c578082015181840152602081019050613121565b8381111561314b576000848401525b50505050565b600061315c82613102565b613166818561310d565b935061317681856020860161311e565b61317f81612f7d565b840191505092915050565b600060208201905081810360008301526131a48184613151565b905092915050565b600067ffffffffffffffff8211156131c7576131c6612f8e565b5b6131d082612f7d565b9050602081019050919050565b60006131f06131eb846131ac565b612fee565b90508281526020810184848401111561320c5761320b612f78565b5b61321784828561303a565b509392505050565b600082601f83011261323457613233612f73565b5b81356132448482602086016131dd565b91505092915050565b60008060008060008060c0878903121561326a57613269612db0565b5b600061327889828a01612e03565b965050602061328989828a01612e03565b955050604061329a89828a01612e03565b94505060606132ab89828a01612e39565b93505060806132bc89828a01612e39565b92505060a087013567ffffffffffffffff8111156132dd576132dc612db5565b5b6132e989828a0161321f565b9150509295509295509295565b60006020828403121561330c5761330b612db0565b5b600061331a84828501612e39565b91505092915050565b6000806040838503121561333a57613339612db0565b5b600061334885828601612e39565b925050602061335985828601612e03565b9150509250929050565b6000806040838503121561337a57613379612db0565b5b600061338885828601612e39565b925050602061339985828601612e39565b9150509250929050565b6133ac81612dda565b82525050565b60006040820190506133c760008301856133a3565b6133d46020830184612e8e565b9392505050565b600067ffffffffffffffff8211156133f6576133f5612f8e565b5b602082029050602081019050919050565b600080fd5b600061341f61341a846133db565b612fee565b9050808382526020820190506020840283018581111561344257613441613407565b5b835b8181101561346b57806134578882612e39565b845260208401935050602081019050613444565b5050509392505050565b600082601f83011261348a57613489612f73565b5b813561349a84826020860161340c565b91505092915050565b600080600080600060a086880312156134bf576134be612db0565b5b60006134cd88828901612e03565b95505060206134de88828901612e03565b945050604086013567ffffffffffffffff8111156134ff576134fe612db5565b5b61350b88828901613475565b935050606086013567ffffffffffffffff81111561352c5761352b612db5565b5b61353888828901613475565b925050608086013567ffffffffffffffff81111561355957613558612db5565b5b6135658882890161321f565b9150509295509295909350565b600067ffffffffffffffff82111561358d5761358c612f8e565b5b602082029050602081019050919050565b60006135b16135ac84613572565b612fee565b905080838252602082019050602084028301858111156135d4576135d3613407565b5b835b818110156135fd57806135e98882612e03565b8452602084019350506020810190506135d6565b5050509392505050565b600082601f83011261361c5761361b612f73565b5b813561362c84826020860161359e565b91505092915050565b6000806040838503121561364c5761364b612db0565b5b600083013567ffffffffffffffff81111561366a57613669612db5565b5b61367685828601613607565b925050602083013567ffffffffffffffff81111561369757613696612db5565b5b6136a385828601613475565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136e281612e18565b82525050565b60006136f483836136d9565b60208301905092915050565b6000602082019050919050565b6000613718826136ad565b61372281856136b8565b935061372d836136c9565b8060005b8381101561375e57815161374588826136e8565b975061375083613700565b925050600181019050613731565b5085935050505092915050565b60006020820190508181036000830152613785818461370d565b905092915050565b600067ffffffffffffffff8211156137a8576137a7612f8e565b5b602082029050602081019050919050565b60006137cc6137c78461378d565b612fee565b905080838252602082019050602084028301858111156137ef576137ee613407565b5b835b8181101561383657803567ffffffffffffffff81111561381457613813612f73565b5b808601613821898261308b565b855260208501945050506020810190506137f1565b5050509392505050565b600082601f83011261385557613854612f73565b5b81356138658482602086016137b9565b91505092915050565b60008060008060008060c0878903121561388b5761388a612db0565b5b600061389989828a01612e03565b965050602087013567ffffffffffffffff8111156138ba576138b9612db5565b5b6138c689828a01613475565b955050604087013567ffffffffffffffff8111156138e7576138e6612db5565b5b6138f389828a01613475565b945050606087013567ffffffffffffffff81111561391457613913612db5565b5b61392089828a01613840565b935050608087013567ffffffffffffffff81111561394157613940612db5565b5b61394d89828a01613607565b92505060a087013567ffffffffffffffff81111561396e5761396d612db5565b5b61397a89828a01613475565b9150509295509295509295565b6000806040838503121561399e5761399d612db0565b5b60006139ac85828601612e39565b925050602083013567ffffffffffffffff8111156139cd576139cc612db5565b5b6139d98582860161308b565b9150509250929050565b60008060008060008060c08789031215613a00576139ff612db0565b5b6000613a0e89828a01612e03565b9650506020613a1f89828a01612e03565b9550506040613a3089828a01612e39565b945050606087013567ffffffffffffffff811115613a5157613a50612db5565b5b613a5d89828a0161308b565b9350506080613a6e89828a01612e03565b92505060a0613a7f89828a01612e39565b9150509295509295509295565b6000602082019050613aa160008301846133a3565b92915050565b60008060008060008060c08789031215613ac457613ac3612db0565b5b6000613ad289828a01612e03565b9650506020613ae389828a01612e39565b9550506040613af489828a01612e39565b945050606087013567ffffffffffffffff811115613b1557613b14612db5565b5b613b2189828a0161308b565b9350506080613b3289828a01612e03565b92505060a0613b4389828a01612e39565b9150509295509295509295565b613b5981612f3d565b8114613b6457600080fd5b50565b600081359050613b7681613b50565b92915050565b60008060408385031215613b9357613b92612db0565b5b6000613ba185828601612e03565b9250506020613bb285828601613b67565b9150509250929050565b60008060008060008060c08789031215613bd957613bd8612db0565b5b6000613be789828a01612e03565b965050602087013567ffffffffffffffff811115613c0857613c07612db5565b5b613c1489828a01613607565b955050604087013567ffffffffffffffff811115613c3557613c34612db5565b5b613c4189828a01613475565b945050606087013567ffffffffffffffff811115613c6257613c61612db5565b5b613c6e89828a01613840565b935050608087013567ffffffffffffffff811115613c8f57613c8e612db5565b5b613c9b89828a01613607565b92505060a087013567ffffffffffffffff811115613cbc57613cbb612db5565b5b613cc889828a01613475565b9150509295509295509295565b600080600060608486031215613cee57613ced612db0565b5b6000613cfc86828701612e39565b9350506020613d0d86828701612e03565b9250506040613d1e86828701612e39565b9150509250925092565b60008060408385031215613d3f57613d3e612db0565b5b6000613d4d85828601612e03565b9250506020613d5e85828601612e03565b9150509250929050565b600080600080600060a08688031215613d8457613d83612db0565b5b6000613d9288828901612e03565b9550506020613da388828901612e03565b9450506040613db488828901612e39565b9350506060613dc588828901612e39565b925050608086013567ffffffffffffffff811115613de657613de5612db5565b5b613df28882890161321f565b9150509295509295909350565b600060208284031215613e1557613e14612db0565b5b6000613e2384828501612e03565b91505092915050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613e88602b8361310d565b9150613e9382613e2c565b604082019050919050565b60006020820190508181036000830152613eb781613e7b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef460208361310d565b9150613eff82613ebe565b602082019050919050565b60006020820190508181036000830152613f2381613ee7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613f5182613f2a565b613f5b8185613f35565b9350613f6b81856020860161311e565b613f7481612f7d565b840191505092915050565b600060a082019050613f9460008301886133a3565b613fa160208301876133a3565b613fae6040830186612e8e565b613fbb6060830185612e8e565b8181036080830152613fcd8184613f46565b90509695505050505050565b600081519050613fe881612ee4565b92915050565b60006020828403121561400457614003612db0565b5b600061401284828501613fd9565b91505092915050565b60008160e01c9050919050565b600060033d11156140475760046000803e61404460005161401b565b90505b90565b600060443d106140d75761405c612da6565b60043d036004823e80513d602482011167ffffffffffffffff821117156140845750506140d7565b808201805167ffffffffffffffff8111156140a257505050506140d7565b80602083010160043d0385018111156140bf5750505050506140d7565b6140ce82602001850186612fbd565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061413660348361310d565b9150614141826140da565b604082019050919050565b6000602082019050818103600083015261416581614129565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006141c860288361310d565b91506141d38261416c565b604082019050919050565b600060208201905081810360008301526141f7816141bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061424557607f821691505b602082108103614258576142576141fe565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461428b8161422d565b614295818661425e565b945060018216600081146142b057600181146142c1576142f4565b60ff198316865281860193506142f4565b6142ca85614269565b60005b838110156142ec578154818901526001820191506020810190506142cd565b838801955050505b50505092915050565b6000614309828561427e565b9150614315828461427e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435b82612e18565b915061436683612e18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439f5761439e614321565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143e482612e18565b91506143ef83612e18565b9250826143ff576143fe6143aa565b5b828204905092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061446660328361310d565b91506144718261440a565b604082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144f860298361310d565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061456882612e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459a57614599614321565b5b600182019050919050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b60006145db601f8361310d565b91506145e6826145a5565b602082019050919050565b6000602082019050818103600083015261460a816145ce565b9050919050565b600061461c82612e18565b915061462783612e18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561465c5761465b614321565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061469d60188361310d565b91506146a882614667565b602082019050919050565b600060208201905081810360008301526146cc81614690565b9050919050565b6000819050919050565b6000819050919050565b60006147026146fd6146f8846146d3565b6146dd565b612e18565b9050919050565b614712816146e7565b82525050565b600060408201905061472d6000830185612e8e565b61473a6020830184614709565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b600061479d60298361310d565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061482f60268361310d565b915061483a826147d3565b604082019050919050565b6000602082019050818103600083015261485e81614822565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006148c160288361310d565b91506148cc82614865565b604082019050919050565b600060208201905081810360008301526148f0816148b4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495360258361310d565b915061495e826148f7565b604082019050919050565b6000602082019050818103600083015261498281614946565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006149e5602a8361310d565b91506149f082614989565b604082019050919050565b60006020820190508181036000830152614a14816149d8565b9050919050565b60006040820190508181036000830152614a35818561370d565b90508181036020830152614a49818461370d565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614aae60218361310d565b9150614ab982614a52565b604082019050919050565b60006020820190508181036000830152614add81614aa1565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614b1a601a8361310d565b9150614b2582614ae4565b602082019050919050565b60006020820190508181036000830152614b4981614b0d565b9050919050565b6000604082019050614b656000830185612e8e565b614b726020830184612e8e565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614bd560298361310d565b9150614be082614b79565b604082019050919050565b60006020820190508181036000830152614c0481614bc8565b9050919050565b600060a082019050614c2060008301886133a3565b614c2d60208301876133a3565b8181036040830152614c3f818661370d565b90508181036060830152614c53818561370d565b90508181036080830152614c678184613f46565b9050969550505050505056fea2646970667358221220f93ba5991962056798453eadf8d50c233421cfbb95fc9621f2153e064cc5f20564736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066732f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101725760003560e01c8063704fe710116100de5780639abc832011610097578063e2c7f33811610071578063e2c7f33814610446578063e985e9c514610462578063f242432a14610492578063f2fde38b146104ae57610172565b80639abc8320146103f0578063a22cb4651461040e578063af8777071461042a57610172565b8063704fe71014610344578063715018a61461037457806382295a2d1461037e5780638d2bb0931461039a5780638da5cb5b146103b657806398faf29b146103d457610172565b806318160ddd1161013057806318160ddd1461025d5780631f3203311461027b5780632a55205a146102ab5780632eb2c2d6146102dc5780634e1273f4146102f857806369b520171461032857610172565b8062fdd58e1461017757806301ffc9a7146101a757806302fe5305146101d757806306fdde03146101f3578063084e9e24146102115780630e89341c1461022d575b600080fd5b610191600480360381019061018c9190612e4e565b6104ca565b60405161019e9190612e9d565b60405180910390f35b6101c160048036038101906101bc9190612f10565b610592565b6040516101ce9190612f58565b60405180910390f35b6101f160048036038101906101ec91906130b9565b6105a4565b005b6101fb61062c565b604051610208919061318a565b60405180910390f35b61022b6004803603810190610226919061324d565b610665565b005b610247600480360381019061024291906132f6565b61083c565b604051610254919061318a565b60405180910390f35b61026561087a565b6040516102729190612e9d565b60405180910390f35b61029560048036038101906102909190613323565b610880565b6040516102a29190612e9d565b60405180910390f35b6102c560048036038101906102c09190613363565b6108a5565b6040516102d39291906133b2565b60405180910390f35b6102f660048036038101906102f191906134a3565b610976565b005b610312600480360381019061030d9190613635565b610a17565b60405161031f919061376b565b60405180910390f35b610342600480360381019061033d919061386e565b610b30565b005b61035e600480360381019061035991906132f6565b610dc5565b60405161036b919061318a565b60405180910390f35b61037c610e65565b005b61039860048036038101906103939190613987565b610eed565b005b6103b460048036038101906103af91906139e3565b610f95565b005b6103be611252565b6040516103cb9190613a8c565b60405180910390f35b6103ee60048036038101906103e99190613aa7565b61127c565b005b6103f8611371565b604051610405919061318a565b60405180910390f35b61042860048036038101906104239190613b7c565b6113ff565b005b610444600480360381019061043f9190613bbc565b611415565b005b610460600480360381019061045b9190613cd5565b611919565b005b61047c60048036038101906104779190613d28565b6119a5565b6040516104899190612f58565b60405180910390f35b6104ac60048036038101906104a79190613d68565b611a39565b005b6104c860048036038101906104c39190613dff565b611ada565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361053a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161053190613e9e565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061059d82611bd1565b9050919050565b6105ac611c4b565b73ffffffffffffffffffffffffffffffffffffffff166105ca611252565b73ffffffffffffffffffffffffffffffffffffffff1614610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790613f0a565b60405180910390fd5b61062981611c53565b50565b6040518060400160405280600b81526020017f566572736520576f726b7300000000000000000000000000000000000000000081525081565b6106848473ffffffffffffffffffffffffffffffffffffffff16611c6d565b15610834578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016106ca959493929190613f7f565b6020604051808303816000875af192505050801561070657506040513d601f19601f820116820180604052508101906107039190613fee565b60015b6107ab57610712614028565b806308c379a00361076e575061072661404a565b806107315750610770565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610765919061318a565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a29061414c565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610832576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610829906141de565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016108649291906142fd565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109629190614350565b61096c91906143d9565b9150509250929050565b61097e611c4b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806109c457506109c3856109be611c4b565b6119a5565b5b610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa9061447c565b60405180910390fd5b610a108585858585611c90565b5050505050565b60608151835114610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a549061450e565b60405180910390fd5b6000835167ffffffffffffffff811115610a7a57610a79612f8e565b5b604051908082528060200260200182016040528015610aa85781602001602082028036833780820191505090505b50905060005b8451811015610b2557610af5858281518110610acd57610acc61452e565b5b6020026020010151858381518110610ae857610ae761452e565b5b60200260200101516104ca565b828281518110610b0857610b0761452e565b5b60200260200101818152505080610b1e9061455d565b9050610aae565b508091505092915050565b610b38611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610b56611252565b73ffffffffffffffffffffffffffffffffffffffff1614610bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba390613f0a565b60405180910390fd5b81518551148015610bbe575080518551145b610bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf4906145f1565b60405180910390fd5b610c1886868660405180602001604052806000815250611fb1565b60005b8551811015610d10576000828281518110610c3957610c3861452e565b5b60200260200101511115610ca157610ca0868281518110610c5d57610c5c61452e565b5b6020026020010151848381518110610c7857610c7761452e565b5b6020026020010151848481518110610c9357610c9261452e565b5b60200260200101516121dd565b5b838181518110610cb457610cb361452e565b5b602002602001015160016000888481518110610cd357610cd261452e565b5b602002602001015181526020019081526020016000209080519060200190610cfc929190612d03565b508080610d089061455d565b915050610c1b565b50600080600090505b8651811015610da25760005b8651811015610d8e57868181518110610d4157610d4061452e565b5b6020026020010151888381518110610d5c57610d5b61452e565b5b6020026020010151610d6e9190614350565b83610d799190614611565b92508080610d869061455d565b915050610d25565b508080610d9a9061455d565b915050610d19565b508060066000828254610db59190614611565b9250508190555050505050505050565b60016020528060005260406000206000915090508054610de49061422d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e109061422d565b8015610e5d5780601f10610e3257610100808354040283529160200191610e5d565b820191906000526020600020905b815481529060010190602001808311610e4057829003601f168201915b505050505081565b610e6d611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610e8b611252565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613f0a565b60405180910390fd5b610eeb60006122d9565b565b610ef5611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610f13611252565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090613f0a565b60405180910390fd5b80600160008481526020019081526020016000209080519060200190610f90929190612d03565b505050565b610f9d611c4b565b73ffffffffffffffffffffffffffffffffffffffff16610fbb611252565b73ffffffffffffffffffffffffffffffffffffffff1614611011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100890613f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611077906146b3565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110e09190614611565b925050819055506001600660008282546110fa9190614611565b9250508190555082600160008681526020019081526020016000209080519060200190611128929190612d03565b50600081111561113e5761113d8483836121dd565b5b6000611148611c4b565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516111c2929190614718565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611241929190614718565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611284611c4b565b73ffffffffffffffffffffffffffffffffffffffff166112a2611252565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef90613f0a565b60405180910390fd5b6113138686866040518060200160405280600081525061239f565b6000811115611328576113278583836121dd565b5b8260016000878152602001908152602001600020908051906020019061134f929190612d03565b5083600660008282546113629190614611565b92505081905550505050505050565b6003805461137e9061422d565b80601f01602080910402602001604051908101604052809291908181526020018280546113aa9061422d565b80156113f75780601f106113cc576101008083540402835291602001916113f7565b820191906000526020600020905b8154815290600101906020018083116113da57829003601f168201915b505050505081565b61141161140a611c4b565b838361254f565b5050565b61141d611c4b565b73ffffffffffffffffffffffffffffffffffffffff1661143b611252565b73ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148890613f0a565b60405180910390fd5b815184511480156114a3575080518451145b6114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d9906145f1565b60405180910390fd5b60006114ec611c4b565b905060005b85518110156118f55760016000808884815181106115125761151161452e565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115749190614611565b925050819055506115b48260008a8985815181106115955761159461452e565b5b6020026020010151600160405180602001604052806000815250610665565b60008382815181106115c9576115c861452e565b5b60200260200101511115611631576116308682815181106115ed576115ec61452e565b5b60200260200101518583815181106116085761160761452e565b5b60200260200101518584815181106116235761162261452e565b5b60200260200101516121dd565b5b8481815181106116445761164361452e565b5b6020026020010151600160008884815181106116635761166261452e565b5b60200260200101518152602001908152602001600020908051906020019061168c929190612d03565b50600073ffffffffffffffffffffffffffffffffffffffff168782815181106116b8576116b761452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361177a578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106117555761175461452e565b5b6020026020010151600160405161176d929190614718565b60405180910390a46118e2565b86818151811061178d5761178c61452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061180e5761180d61452e565b5b60200260200101516001604051611826929190614718565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff168782815181106118585761185761452e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106118c1576118c061452e565b5b602002602001015160016040516118d9929190614718565b60405180910390a45b80806118ed9061455d565b9150506114f1565b508451600660008282546119099190614611565b9250508190555050505050505050565b611921611c4b565b73ffffffffffffffffffffffffffffffffffffffff1661193f611252565b73ffffffffffffffffffffffffffffffffffffffff1614611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90613f0a565b60405180910390fd5b6119a08383836121dd565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a41611c4b565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611a875750611a8685611a81611c4b565b6119a5565b5b611ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abd906147b3565b60405180910390fd5b611ad385858585856126bb565b5050505050565b611ae2611c4b565b73ffffffffffffffffffffffffffffffffffffffff16611b00611252565b73ffffffffffffffffffffffffffffffffffffffff1614611b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4d90613f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90614845565b60405180910390fd5b611bce816122d9565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c445750611c4382612956565b5b9050919050565b600033905090565b8060039080519060200190611c69929190612d03565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8151835114611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb906148d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614969565b60405180910390fd5b6000611d4d611c4b565b9050611d5d818787878787612a38565b60005b8451811015611f0e576000858281518110611d7e57611d7d61452e565b5b602002602001015190506000858381518110611d9d57611d9c61452e565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e35906149fb565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef39190614611565b9250508190555050505080611f079061455d565b9050611d60565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611f85929190614a1b565b60405180910390a4611f9b818787878787612a40565b611fa9818787878787612a48565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612020576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201790614ac4565b60405180910390fd5b8151835114612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b906148d7565b60405180910390fd5b600061206e611c4b565b905061207f81600087878787612a38565b60005b84518110156121385783818151811061209e5761209d61452e565b5b60200260200101516000808784815181106120bc576120bb61452e565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461211e9190614611565b9250508190555080806121309061455d565b915050612082565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516121b0929190614a1b565b60405180910390a46121c781600087878787612a40565b6121d681600087878787612a48565b5050505050565b612710811115612222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221990614b30565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361240e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240590614ac4565b60405180910390fd5b6000612418611c4b565b9050600061242585612c1f565b9050600061243285612c1f565b905061244383600089858589612a38565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a29190614611565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612520929190614b50565b60405180910390a461253783600089858589612a40565b61254683600089898989610665565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036125bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b490614beb565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126ae9190612f58565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361272a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272190614969565b60405180910390fd5b6000612734611c4b565b9050600061274185612c1f565b9050600061274e85612c1f565b905061275e838989858589612a38565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156127f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ec906149fb565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128aa9190614611565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612927929190614b50565b60405180910390a461293d848a8a86868a612a40565b61294b848a8a8a8a8a610665565b505050505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a2157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a315750612a3082612c99565b5b9050919050565b505050505050565b505050505050565b612a678473ffffffffffffffffffffffffffffffffffffffff16611c6d565b15612c17578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612aad959493929190614c0b565b6020604051808303816000875af1925050508015612ae957506040513d601f19601f82011682018060405250810190612ae69190613fee565b60015b612b8e57612af5614028565b806308c379a003612b515750612b0961404a565b80612b145750612b53565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b48919061318a565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b859061414c565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c0c906141de565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612c3e57612c3d612f8e565b5b604051908082528060200260200182016040528015612c6c5781602001602082028036833780820191505090505b5090508281600081518110612c8457612c8361452e565b5b60200260200101818152505080915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612d0f9061422d565b90600052602060002090601f016020900481019282612d315760008555612d78565b82601f10612d4a57805160ff1916838001178555612d78565b82800160010185558215612d78579182015b82811115612d77578251825591602001919060010190612d5c565b5b509050612d859190612d89565b5090565b5b80821115612da2576000816000905550600101612d8a565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612de582612dba565b9050919050565b612df581612dda565b8114612e0057600080fd5b50565b600081359050612e1281612dec565b92915050565b6000819050919050565b612e2b81612e18565b8114612e3657600080fd5b50565b600081359050612e4881612e22565b92915050565b60008060408385031215612e6557612e64612db0565b5b6000612e7385828601612e03565b9250506020612e8485828601612e39565b9150509250929050565b612e9781612e18565b82525050565b6000602082019050612eb26000830184612e8e565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612eed81612eb8565b8114612ef857600080fd5b50565b600081359050612f0a81612ee4565b92915050565b600060208284031215612f2657612f25612db0565b5b6000612f3484828501612efb565b91505092915050565b60008115159050919050565b612f5281612f3d565b82525050565b6000602082019050612f6d6000830184612f49565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fc682612f7d565b810181811067ffffffffffffffff82111715612fe557612fe4612f8e565b5b80604052505050565b6000612ff8612da6565b90506130048282612fbd565b919050565b600067ffffffffffffffff82111561302457613023612f8e565b5b61302d82612f7d565b9050602081019050919050565b82818337600083830152505050565b600061305c61305784613009565b612fee565b90508281526020810184848401111561307857613077612f78565b5b61308384828561303a565b509392505050565b600082601f8301126130a05761309f612f73565b5b81356130b0848260208601613049565b91505092915050565b6000602082840312156130cf576130ce612db0565b5b600082013567ffffffffffffffff8111156130ed576130ec612db5565b5b6130f98482850161308b565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561313c578082015181840152602081019050613121565b8381111561314b576000848401525b50505050565b600061315c82613102565b613166818561310d565b935061317681856020860161311e565b61317f81612f7d565b840191505092915050565b600060208201905081810360008301526131a48184613151565b905092915050565b600067ffffffffffffffff8211156131c7576131c6612f8e565b5b6131d082612f7d565b9050602081019050919050565b60006131f06131eb846131ac565b612fee565b90508281526020810184848401111561320c5761320b612f78565b5b61321784828561303a565b509392505050565b600082601f83011261323457613233612f73565b5b81356132448482602086016131dd565b91505092915050565b60008060008060008060c0878903121561326a57613269612db0565b5b600061327889828a01612e03565b965050602061328989828a01612e03565b955050604061329a89828a01612e03565b94505060606132ab89828a01612e39565b93505060806132bc89828a01612e39565b92505060a087013567ffffffffffffffff8111156132dd576132dc612db5565b5b6132e989828a0161321f565b9150509295509295509295565b60006020828403121561330c5761330b612db0565b5b600061331a84828501612e39565b91505092915050565b6000806040838503121561333a57613339612db0565b5b600061334885828601612e39565b925050602061335985828601612e03565b9150509250929050565b6000806040838503121561337a57613379612db0565b5b600061338885828601612e39565b925050602061339985828601612e39565b9150509250929050565b6133ac81612dda565b82525050565b60006040820190506133c760008301856133a3565b6133d46020830184612e8e565b9392505050565b600067ffffffffffffffff8211156133f6576133f5612f8e565b5b602082029050602081019050919050565b600080fd5b600061341f61341a846133db565b612fee565b9050808382526020820190506020840283018581111561344257613441613407565b5b835b8181101561346b57806134578882612e39565b845260208401935050602081019050613444565b5050509392505050565b600082601f83011261348a57613489612f73565b5b813561349a84826020860161340c565b91505092915050565b600080600080600060a086880312156134bf576134be612db0565b5b60006134cd88828901612e03565b95505060206134de88828901612e03565b945050604086013567ffffffffffffffff8111156134ff576134fe612db5565b5b61350b88828901613475565b935050606086013567ffffffffffffffff81111561352c5761352b612db5565b5b61353888828901613475565b925050608086013567ffffffffffffffff81111561355957613558612db5565b5b6135658882890161321f565b9150509295509295909350565b600067ffffffffffffffff82111561358d5761358c612f8e565b5b602082029050602081019050919050565b60006135b16135ac84613572565b612fee565b905080838252602082019050602084028301858111156135d4576135d3613407565b5b835b818110156135fd57806135e98882612e03565b8452602084019350506020810190506135d6565b5050509392505050565b600082601f83011261361c5761361b612f73565b5b813561362c84826020860161359e565b91505092915050565b6000806040838503121561364c5761364b612db0565b5b600083013567ffffffffffffffff81111561366a57613669612db5565b5b61367685828601613607565b925050602083013567ffffffffffffffff81111561369757613696612db5565b5b6136a385828601613475565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136e281612e18565b82525050565b60006136f483836136d9565b60208301905092915050565b6000602082019050919050565b6000613718826136ad565b61372281856136b8565b935061372d836136c9565b8060005b8381101561375e57815161374588826136e8565b975061375083613700565b925050600181019050613731565b5085935050505092915050565b60006020820190508181036000830152613785818461370d565b905092915050565b600067ffffffffffffffff8211156137a8576137a7612f8e565b5b602082029050602081019050919050565b60006137cc6137c78461378d565b612fee565b905080838252602082019050602084028301858111156137ef576137ee613407565b5b835b8181101561383657803567ffffffffffffffff81111561381457613813612f73565b5b808601613821898261308b565b855260208501945050506020810190506137f1565b5050509392505050565b600082601f83011261385557613854612f73565b5b81356138658482602086016137b9565b91505092915050565b60008060008060008060c0878903121561388b5761388a612db0565b5b600061389989828a01612e03565b965050602087013567ffffffffffffffff8111156138ba576138b9612db5565b5b6138c689828a01613475565b955050604087013567ffffffffffffffff8111156138e7576138e6612db5565b5b6138f389828a01613475565b945050606087013567ffffffffffffffff81111561391457613913612db5565b5b61392089828a01613840565b935050608087013567ffffffffffffffff81111561394157613940612db5565b5b61394d89828a01613607565b92505060a087013567ffffffffffffffff81111561396e5761396d612db5565b5b61397a89828a01613475565b9150509295509295509295565b6000806040838503121561399e5761399d612db0565b5b60006139ac85828601612e39565b925050602083013567ffffffffffffffff8111156139cd576139cc612db5565b5b6139d98582860161308b565b9150509250929050565b60008060008060008060c08789031215613a00576139ff612db0565b5b6000613a0e89828a01612e03565b9650506020613a1f89828a01612e03565b9550506040613a3089828a01612e39565b945050606087013567ffffffffffffffff811115613a5157613a50612db5565b5b613a5d89828a0161308b565b9350506080613a6e89828a01612e03565b92505060a0613a7f89828a01612e39565b9150509295509295509295565b6000602082019050613aa160008301846133a3565b92915050565b60008060008060008060c08789031215613ac457613ac3612db0565b5b6000613ad289828a01612e03565b9650506020613ae389828a01612e39565b9550506040613af489828a01612e39565b945050606087013567ffffffffffffffff811115613b1557613b14612db5565b5b613b2189828a0161308b565b9350506080613b3289828a01612e03565b92505060a0613b4389828a01612e39565b9150509295509295509295565b613b5981612f3d565b8114613b6457600080fd5b50565b600081359050613b7681613b50565b92915050565b60008060408385031215613b9357613b92612db0565b5b6000613ba185828601612e03565b9250506020613bb285828601613b67565b9150509250929050565b60008060008060008060c08789031215613bd957613bd8612db0565b5b6000613be789828a01612e03565b965050602087013567ffffffffffffffff811115613c0857613c07612db5565b5b613c1489828a01613607565b955050604087013567ffffffffffffffff811115613c3557613c34612db5565b5b613c4189828a01613475565b945050606087013567ffffffffffffffff811115613c6257613c61612db5565b5b613c6e89828a01613840565b935050608087013567ffffffffffffffff811115613c8f57613c8e612db5565b5b613c9b89828a01613607565b92505060a087013567ffffffffffffffff811115613cbc57613cbb612db5565b5b613cc889828a01613475565b9150509295509295509295565b600080600060608486031215613cee57613ced612db0565b5b6000613cfc86828701612e39565b9350506020613d0d86828701612e03565b9250506040613d1e86828701612e39565b9150509250925092565b60008060408385031215613d3f57613d3e612db0565b5b6000613d4d85828601612e03565b9250506020613d5e85828601612e03565b9150509250929050565b600080600080600060a08688031215613d8457613d83612db0565b5b6000613d9288828901612e03565b9550506020613da388828901612e03565b9450506040613db488828901612e39565b9350506060613dc588828901612e39565b925050608086013567ffffffffffffffff811115613de657613de5612db5565b5b613df28882890161321f565b9150509295509295909350565b600060208284031215613e1557613e14612db0565b5b6000613e2384828501612e03565b91505092915050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613e88602b8361310d565b9150613e9382613e2c565b604082019050919050565b60006020820190508181036000830152613eb781613e7b565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef460208361310d565b9150613eff82613ebe565b602082019050919050565b60006020820190508181036000830152613f2381613ee7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613f5182613f2a565b613f5b8185613f35565b9350613f6b81856020860161311e565b613f7481612f7d565b840191505092915050565b600060a082019050613f9460008301886133a3565b613fa160208301876133a3565b613fae6040830186612e8e565b613fbb6060830185612e8e565b8181036080830152613fcd8184613f46565b90509695505050505050565b600081519050613fe881612ee4565b92915050565b60006020828403121561400457614003612db0565b5b600061401284828501613fd9565b91505092915050565b60008160e01c9050919050565b600060033d11156140475760046000803e61404460005161401b565b90505b90565b600060443d106140d75761405c612da6565b60043d036004823e80513d602482011167ffffffffffffffff821117156140845750506140d7565b808201805167ffffffffffffffff8111156140a257505050506140d7565b80602083010160043d0385018111156140bf5750505050506140d7565b6140ce82602001850186612fbd565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061413660348361310d565b9150614141826140da565b604082019050919050565b6000602082019050818103600083015261416581614129565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006141c860288361310d565b91506141d38261416c565b604082019050919050565b600060208201905081810360008301526141f7816141bb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061424557607f821691505b602082108103614258576142576141fe565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461428b8161422d565b614295818661425e565b945060018216600081146142b057600181146142c1576142f4565b60ff198316865281860193506142f4565b6142ca85614269565b60005b838110156142ec578154818901526001820191506020810190506142cd565b838801955050505b50505092915050565b6000614309828561427e565b9150614315828461427e565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061435b82612e18565b915061436683612e18565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561439f5761439e614321565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006143e482612e18565b91506143ef83612e18565b9250826143ff576143fe6143aa565b5b828204905092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061446660328361310d565b91506144718261440a565b604082019050919050565b6000602082019050818103600083015261449581614459565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144f860298361310d565b91506145038261449c565b604082019050919050565b60006020820190508181036000830152614527816144eb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061456882612e18565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459a57614599614321565b5b600182019050919050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b60006145db601f8361310d565b91506145e6826145a5565b602082019050919050565b6000602082019050818103600083015261460a816145ce565b9050919050565b600061461c82612e18565b915061462783612e18565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561465c5761465b614321565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b600061469d60188361310d565b91506146a882614667565b602082019050919050565b600060208201905081810360008301526146cc81614690565b9050919050565b6000819050919050565b6000819050919050565b60006147026146fd6146f8846146d3565b6146dd565b612e18565b9050919050565b614712816146e7565b82525050565b600060408201905061472d6000830185612e8e565b61473a6020830184614709565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b600061479d60298361310d565b91506147a882614741565b604082019050919050565b600060208201905081810360008301526147cc81614790565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061482f60268361310d565b915061483a826147d3565b604082019050919050565b6000602082019050818103600083015261485e81614822565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006148c160288361310d565b91506148cc82614865565b604082019050919050565b600060208201905081810360008301526148f0816148b4565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061495360258361310d565b915061495e826148f7565b604082019050919050565b6000602082019050818103600083015261498281614946565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006149e5602a8361310d565b91506149f082614989565b604082019050919050565b60006020820190508181036000830152614a14816149d8565b9050919050565b60006040820190508181036000830152614a35818561370d565b90508181036020830152614a49818461370d565b90509392505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614aae60218361310d565b9150614ab982614a52565b604082019050919050565b60006020820190508181036000830152614add81614aa1565b9050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614b1a601a8361310d565b9150614b2582614ae4565b602082019050919050565b60006020820190508181036000830152614b4981614b0d565b9050919050565b6000604082019050614b656000830185612e8e565b614b726020830184612e8e565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614bd560298361310d565b9150614be082614b79565b604082019050919050565b60006020820190508181036000830152614c0481614bc8565b9050919050565b600060a082019050614c2060008301886133a3565b614c2d60208301876133a3565b8181036040830152614c3f818661370d565b90508181036060830152614c53818561370d565b90508181036080830152614c678184613f46565b9050969550505050505056fea2646970667358221220f93ba5991962056798453eadf8d50c233421cfbb95fc9621f2153e064cc5f20564736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066732f000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri_ (string): https://0prod.infura-ipfs.io/ipfs/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [2] : 68747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066
Arg [3] : 732f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
196:6727:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:305:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2699:217:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6302:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;323:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13959:870:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2008:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;373:26:11;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;693:63:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;836:329:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;4397:430:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2801:542;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1573:1053:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;808:38:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:12;;;:::i;:::-;;6816:105:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3276:663;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1029:85:12;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;865:407:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1060:21:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3411:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4470:1763:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6515:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3659:210:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3936:389;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2339:305:2;2465:7;2528:1;2509:21;;:7;:21;;;2488:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8;:12;2625:2;2616:12;;;;;;;;;;;:21;2629:7;2616:21;;;;;;;;;;;;;;;;2609:28;;2339:305;;;;:::o;2699:217:11:-;2846:4;2873:36;2897:11;2873:23;:36::i;:::-;2866:43;;2699:217;;;:::o;6302:87::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6367:15:11::1;6375:6;6367:7;:15::i;:::-;6302:87:::0;:::o;323:43::-;;;;;;;;;;;;;;;;;;;:::o;13959:870:2:-;14165:15;:2;:13;;;:15::i;:::-;14161:662;;;14233:2;14216:38;;;14276:8;14306:4;14332:2;14356:6;14384:4;14216:190;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14196:617;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;14689:6;14682:14;;;;;;;;;;;:::i;:::-;;;;;;;;14196:617;;;14736:62;;;;;;;;;;:::i;:::-;;;;;;;;14196:617;14479:43;;;14467:55;;;:8;:55;;;;14463:152;;14546:50;;;;;;;;;;:::i;:::-;;;;;;;;14463:152;14419:210;14161:662;13959:870;;;;;;:::o;2008:189::-;2111:13;2171:7;2180:4;:8;2185:2;2180:8;;;;;;;;;;;2154:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2140:50;;2008:189;;;:::o;373:26:11:-;;;;:::o;693:63:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;836:329:5:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;4397:430:2:-;4630:12;:10;:12::i;:::-;4622:20;;:4;:20;;;:60;;;;4646:36;4663:4;4669:12;:10;:12::i;:::-;4646:16;:36::i;:::-;4622:60;4601:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4768:52;4791:4;4797:2;4801:3;4806:7;4815:4;4768:22;:52::i;:::-;4397:430;;;;;:::o;2801:542::-;2952:16;3024:3;:10;3005:8;:15;:29;2984:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3112:30;3159:8;:15;3145:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:63;;3191:9;3186:120;3210:8;:15;3206:1;:19;3186:120;;;3265:30;3275:8;3284:1;3275:11;;;;;;;;:::i;:::-;;;;;;;;3288:3;3292:1;3288:6;;;;;;;;:::i;:::-;;;;;;;;3265:9;:30::i;:::-;3246:13;3260:1;3246:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;3227:3;;;;:::i;:::-;;;3186:120;;;;3323:13;3316:20;;;2801:542;;;;:::o;1573:1053:11:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1863:17:11::1;:24;1849:3;:10;:38;:92;;;;;1921:13;:20;1907:3;:10;:34;1849:92;1828:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:32;2019:2;2023:3;2028:7;2008:32;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;2056:9;2051:335;2071:3;:10;2067:1;:14;2051:335;;;2125:1;2106:13;2120:1;2106:16;;;;;;;;:::i;:::-;;;;;;;;:20;2102:201;;;2146:142;2184:3;2188:1;2184:6;;;;;;;;:::i;:::-;;;;;;;;2212:17;2230:1;2212:20;;;;;;;;:::i;:::-;;;;;;;;2254:13;2268:1;2254:16;;;;;;;;:::i;:::-;;;;;;;;2146;:142::i;:::-;2102:201;2363:9;2373:1;2363:12;;;;;;;;:::i;:::-;;;;;;;;2348:4;:12;2353:3;2357:1;2353:6;;;;;;;;:::i;:::-;;;;;;;;2348:12;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;2083:3;;;;;:::i;:::-;;;;2051:335;;;;2396:13;2424:9:::0;2436:1:::1;2424:13;;2419:171;2443:3;:10;2439:1;:14;2419:171;;;2479:9;2474:106;2498:7;:14;2494:1;:18;2474:106;;;2555:7;2563:1;2555:10;;;;;;;;:::i;:::-;;;;;;;;2546:3;2550:1;2546:6;;;;;;;;:::i;:::-;;;;;;;;:19;;;;:::i;:::-;2537:28;;;;;:::i;:::-;;;2514:3;;;;;:::i;:::-;;;;2474:106;;;;2455:3;;;;;:::i;:::-;;;;2419:171;;;;2614:5;2599:11;;:20;;;;;;;:::i;:::-;;;;;;;;1818:808;1573:1053:::0;;;;;;:::o;808:38:2:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1661:101:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;6816:105:11:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6911:3:11::1;6895:4;:13;6900:7;6895:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;6816:105:::0;;:::o;3276:663::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3517:1:11::1;3503:16;;:2;:16;;::::0;3495:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3584:1;3559:8;:17:::0;3568:7:::1;3559:17;;;;;;;;;;;:21;3577:2;3559:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;3610:1;3595:11;;:16;;;;;;;:::i;:::-;;;;;;;;3637:3;3621:4;:13;3626:7;3621:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;3670:1;3655:12;:16;3651:104;;;3687:57;3704:7;3713:16;3731:12;3687:16;:57::i;:::-;3651:104;3765:16;3784:12;:10;:12::i;:::-;3765:31;;3848:7;3811:57;;3844:1;3811:57;;3826:8;3811:57;;;3857:7;3866:1;3811:57;;;;;;;:::i;:::-;;;;;;;;3917:2;3883:49;;3908:7;3883:49;;3898:8;3883:49;;;3921:7;3930:1;3883:49;;;;;;;:::i;:::-;;;;;;;;3485:454;3276:663:::0;;;;;;:::o;1029:85:12:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;865:407:11:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1072:30:11::1;1078:7;1087:2;1091:6;1072:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;1131:1;1116:12;:16;1112:99;;;1148:52;1165:2;1169:16;1187:12;1148:16;:52::i;:::-;1112:99;1231:3;1220:4;:8;1225:2;1220:8;;;;;;;;;;;:14;;;;;;;;;;;;:::i;:::-;;1259:6;1244:11;;:21;;;;;;;:::i;:::-;;;;;;;;865:407:::0;;;;;;:::o;1060:21:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3411:181::-;3533:52;3552:12;:10;:12::i;:::-;3566:8;3576;3533:18;:52::i;:::-;3411:181;;:::o;4470:1763:11:-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4782:17:11::1;:24;4763:8;:15;:43;:102;;;;;4845:13;:20;4826:8;:15;:39;4763:102;4742:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;4933:16;4952:12;:10;:12::i;:::-;4933:31;;4980:9;4975:1180;4999:8;:15;4995:1;:19;4975:1180;;;5064:1;5035:8;:21:::0;5044:8:::1;5053:1;5044:11;;;;;;;;:::i;:::-;;;;;;;;5035:21;;;;;;;;;;;:25;5057:2;5035:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;5129:186;5177:8;5211:1;5231:2;5251:8;5260:1;5251:11;;;;;;;;:::i;:::-;;;;;;;;5280:1;5129:186;;;;;;;;;;;::::0;:30:::1;:186::i;:::-;5385:1;5366:13;5380:1;5366:16;;;;;;;;:::i;:::-;;;;;;;;:20;5362:206;;;5406:147;5444:8;5453:1;5444:11;;;;;;;;:::i;:::-;;;;;;;;5477:17;5495:1;5477:20;;;;;;;;:::i;:::-;;;;;;;;5519:13;5533:1;5519:16;;;;;;;;:::i;:::-;;;;;;;;5406;:147::i;:::-;5362:206;5633:9;5643:1;5633:12;;;;;;;;:::i;:::-;;;;;;;;5613:4;:17;5618:8;5627:1;5618:11;;;;;;;;:::i;:::-;;;;;;;;5613:17;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;5740:1;5717:25;;:8;5726:1;5717:11;;;;;;;;:::i;:::-;;;;;;;;:25;;::::0;5713:432:::1;;5804:2;5767:56;;5800:1;5767:56;;5782:8;5767:56;;;5808:8;5817:1;5808:11;;;;;;;;:::i;:::-;;;;;;;;5821:1;5767:56;;;;;;;:::i;:::-;;;;;;;;5713:432;;;5965:8;5974:1;5965:11;;;;;;;;:::i;:::-;;;;;;;;5867:183;;5941:1;5867:183;;5903:8;5867:183;;;5998:8;6007:1;5998:11;;;;;;;;:::i;:::-;;;;;;;;6031:1;5867:183;;;;;;;:::i;:::-;;;;;;;;6111:2;6073:57;;6098:8;6107:1;6098:11;;;;;;;;:::i;:::-;;;;;;;;6073:57;;6088:8;6073:57;;;6115:8;6124:1;6115:11;;;;;;;;:::i;:::-;;;;;;;;6128:1;6073:57;;;;;;;:::i;:::-;;;;;;;;5713:432;5016:3;;;;;:::i;:::-;;;;4975:1180;;;;6211:8;:15;6196:11;;:30;;;;;;;:::i;:::-;;;;;;;;4732:1501;4470:1763:::0;;;;;;:::o;6515:208::-;1252:12:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6659:57:11::1;6676:7;6685:16;6703:12;6659:16;:57::i;:::-;6515:208:::0;;;:::o;3659:210:2:-;3798:4;3825:18;:27;3844:7;3825:27;;;;;;;;;;;;;;;:37;3853:8;3825:37;;;;;;;;;;;;;;;;;;;;;;;;;3818:44;;3659:210;;;;:::o;3936:389::-;4144:12;:10;:12::i;:::-;4136:20;;:4;:20;;;:60;;;;4160:36;4177:4;4183:12;:10;:12::i;:::-;4160:16;:36::i;:::-;4136:60;4115:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;4273:45;4291:4;4297:2;4301;4305:6;4313:4;4273:17;:45::i;:::-;3936:389;;;;;:::o;1911:198:12:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;::::0;1991:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;365:273:4:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;8698:89:2:-;8774:6;8764:7;:16;;;;;;;;;;;;:::i;:::-;;8698:89;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;6601:1274:2:-;6834:7;:14;6820:3;:10;:28;6799:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;6946:1;6932:16;;:2;:16;;;6924:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7001:16;7020:12;:10;:12::i;:::-;7001:31;;7043:60;7064:8;7074:4;7080:2;7084:3;7089:7;7098:4;7043:20;:60::i;:::-;7119:9;7114:454;7138:3;:10;7134:1;:14;7114:454;;;7169:10;7182:3;7186:1;7182:6;;;;;;;;:::i;:::-;;;;;;;;7169:19;;7202:14;7219:7;7227:1;7219:10;;;;;;;;:::i;:::-;;;;;;;;7202:27;;7244:19;7266:8;:12;7275:2;7266:12;;;;;;;;;;;:18;7279:4;7266:18;;;;;;;;;;;;;;;;7244:40;;7338:6;7323:11;:21;;7298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;7497:6;7483:11;:20;7462:8;:12;7471:2;7462:12;;;;;;;;;;;:18;7475:4;7462:18;;;;;;;;;;;;;;;:41;;;;7551:6;7531:8;:12;7540:2;7531:12;;;;;;;;;;;:16;7544:2;7531:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;7155:413;;;7150:3;;;;:::i;:::-;;;7114:454;;;;7613:2;7583:47;;7607:4;7583:47;;7597:8;7583:47;;;7617:3;7622:7;7583:47;;;;;;;:::i;:::-;;;;;;;;7641:59;7661:8;7671:4;7677:2;7681:3;7686:7;7695:4;7641:19;:59::i;:::-;7711:157;7760:8;7782:4;7800:2;7816:3;7833:7;7854:4;7711:35;:157::i;:::-;6789:1086;6601:1274;;;;;:::o;10295:906::-;10481:1;10467:16;;:2;:16;;;10459:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10566:7;:14;10552:3;:10;:28;10531:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;10657:16;10676:12;:10;:12::i;:::-;10657:31;;10699:66;10720:8;10738:1;10742:2;10746:3;10751:7;10760:4;10699:20;:66::i;:::-;10781:9;10776:100;10800:3;:10;10796:1;:14;10776:100;;;10855:7;10863:1;10855:10;;;;;;;;:::i;:::-;;;;;;;;10831:8;:16;10840:3;10844:1;10840:6;;;;;;;;:::i;:::-;;;;;;;;10831:16;;;;;;;;;;;:20;10848:2;10831:20;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;10812:3;;;;;:::i;:::-;;;;10776:100;;;;10927:2;10891:53;;10923:1;10891:53;;10905:8;10891:53;;;10931:3;10936:7;10891:53;;;;;;;:::i;:::-;;;;;;;;10955:65;10975:8;10993:1;10997:2;11001:3;11006:7;11015:4;10955:19;:65::i;:::-;11031:163;11080:8;11110:1;11126:2;11142:3;11159:7;11180:4;11031:35;:163::i;:::-;10449:752;10295:906;;;;:::o;537:255:5:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;2263:187:12:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;9160:790:2:-;9321:1;9307:16;;:2;:16;;;9299:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9372:16;9391:12;:10;:12::i;:::-;9372:31;;9413:20;9436:21;9454:2;9436:17;:21::i;:::-;9413:44;;9467:24;9494:25;9512:6;9494:17;:25::i;:::-;9467:52;;9530:66;9551:8;9569:1;9573:2;9577:3;9582:7;9591:4;9530:20;:66::i;:::-;9627:6;9607:8;:12;9616:2;9607:12;;;;;;;;;;;:16;9620:2;9607:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;9685:2;9648:52;;9681:1;9648:52;;9663:8;9648:52;;;9689:2;9693:6;9648:52;;;;;;;:::i;:::-;;;;;;;;9711:65;9731:8;9749:1;9753:2;9757:3;9762:7;9771:4;9711:19;:65::i;:::-;9787:156;9831:8;9861:1;9877:2;9893;9909:6;9929:4;9787:30;:156::i;:::-;9289:661;;;9160:790;;;;:::o;11336:323::-;11486:8;11477:17;;:5;:17;;;11469:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11588:8;11550:18;:25;11569:5;11550:25;;;;;;;;;;;;;;;:35;11576:8;11550:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11633:8;11611:41;;11626:5;11611:41;;;11643:8;11611:41;;;;;;:::i;:::-;;;;;;;;11336:323;;;:::o;5277:978::-;5472:1;5458:16;;:2;:16;;;5450:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5527:16;5546:12;:10;:12::i;:::-;5527:31;;5568:20;5591:21;5609:2;5591:17;:21::i;:::-;5568:44;;5622:24;5649:25;5667:6;5649:17;:25::i;:::-;5622:52;;5685:60;5706:8;5716:4;5722:2;5726:3;5731:7;5740:4;5685:20;:60::i;:::-;5756:19;5778:8;:12;5787:2;5778:12;;;;;;;;;;;:18;5791:4;5778:18;;;;;;;;;;;;;;;;5756:40;;5842:6;5827:11;:21;;5806:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;5985:6;5971:11;:20;5950:8;:12;5959:2;5950:12;;;;;;;;;;;:18;5963:4;5950:18;;;;;;;;;;;;;;;:41;;;;6031:6;6011:8;:12;6020:2;6011:12;;;;;;;;;;;:16;6024:2;6011:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;6084:2;6053:46;;6078:4;6053:46;;6068:8;6053:46;;;6088:2;6092:6;6053:46;;;;;;;:::i;:::-;;;;;;;;6110:59;6130:8;6140:4;6146:2;6150:3;6155:7;6164:4;6110:19;:59::i;:::-;6180:68;6211:8;6221:4;6227:2;6231;6235:6;6243:4;6180:30;:68::i;:::-;5440:815;;;;5277:978;;;;;:::o;1260:349::-;1402:4;1456:26;1441:41;;;:11;:41;;;;:109;;;;1513:37;1498:52;;;:11;:52;;;;1441:109;:161;;;;1566:36;1590:11;1566:23;:36::i;:::-;1441:161;1422:180;;1260:349;;;:::o;12593:214::-;;;;;;;:::o;13740:213::-;;;;;;;:::o;14835:946::-;15067:15;:2;:13;;;:15::i;:::-;15063:712;;;15135:2;15118:43;;;15183:8;15213:4;15239:3;15264:7;15293:4;15118:197;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15098:667;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15641:6;15634:14;;;;;;;;;;;:::i;:::-;;;;;;;;15098:667;;;15688:62;;;;;;;;;;:::i;:::-;;;;;;;;15098:667;15409:48;;;15397:60;;;:8;:60;;;;15372:195;;15498:50;;;;;;;;;;:::i;:::-;;;;;;;;15372:195;15328:253;15063:712;14835:946;;;;;;:::o;15787:221::-;15877:16;15909:22;15948:1;15934:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15909:41;;15971:7;15960:5;15966:1;15960:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;15996:5;15989:12;;;15787:221;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:154::-;4573:6;4568:3;4563;4550:30;4635:1;4626:6;4621:3;4617:16;4610:27;4489:154;;;:::o;4649:412::-;4727:5;4752:66;4768:49;4810:6;4768:49;:::i;:::-;4752:66;:::i;:::-;4743:75;;4841:6;4834:5;4827:21;4879:4;4872:5;4868:16;4917:3;4908:6;4903:3;4899:16;4896:25;4893:112;;;4924:79;;:::i;:::-;4893:112;5014:41;5048:6;5043:3;5038;5014:41;:::i;:::-;4733:328;4649:412;;;;;:::o;5081:340::-;5137:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:122;;5194:79;;:::i;:::-;5153:122;5311:6;5298:20;5336:79;5411:3;5403:6;5396:4;5388:6;5384:17;5336:79;:::i;:::-;5327:88;;5143:278;5081:340;;;;:::o;5427:509::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5699:1;5688:9;5684:17;5671:31;5729:18;5721:6;5718:30;5715:117;;;5751:79;;:::i;:::-;5715:117;5856:63;5911:7;5902:6;5891:9;5887:22;5856:63;:::i;:::-;5846:73;;5642:287;5427:509;;;;:::o;5942:99::-;5994:6;6028:5;6022:12;6012:22;;5942:99;;;:::o;6047:169::-;6131:11;6165:6;6160:3;6153:19;6205:4;6200:3;6196:14;6181:29;;6047:169;;;;:::o;6222:307::-;6290:1;6300:113;6314:6;6311:1;6308:13;6300:113;;;6399:1;6394:3;6390:11;6384:18;6380:1;6375:3;6371:11;6364:39;6336:2;6333:1;6329:10;6324:15;;6300:113;;;6431:6;6428:1;6425:13;6422:101;;;6511:1;6502:6;6497:3;6493:16;6486:27;6422:101;6271:258;6222:307;;;:::o;6535:364::-;6623:3;6651:39;6684:5;6651:39;:::i;:::-;6706:71;6770:6;6765:3;6706:71;:::i;:::-;6699:78;;6786:52;6831:6;6826:3;6819:4;6812:5;6808:16;6786:52;:::i;:::-;6863:29;6885:6;6863:29;:::i;:::-;6858:3;6854:39;6847:46;;6627:272;6535:364;;;;:::o;6905:313::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7105:9;7099:4;7095:20;7091:1;7080:9;7076:17;7069:47;7133:78;7206:4;7197:6;7133:78;:::i;:::-;7125:86;;6905:313;;;;:::o;7224:307::-;7285:4;7375:18;7367:6;7364:30;7361:56;;;7397:18;;:::i;:::-;7361:56;7435:29;7457:6;7435:29;:::i;:::-;7427:37;;7519:4;7513;7509:15;7501:23;;7224:307;;;:::o;7537:410::-;7614:5;7639:65;7655:48;7696:6;7655:48;:::i;:::-;7639:65;:::i;:::-;7630:74;;7727:6;7720:5;7713:21;7765:4;7758:5;7754:16;7803:3;7794:6;7789:3;7785:16;7782:25;7779:112;;;7810:79;;:::i;:::-;7779:112;7900:41;7934:6;7929:3;7924;7900:41;:::i;:::-;7620:327;7537:410;;;;;:::o;7966:338::-;8021:5;8070:3;8063:4;8055:6;8051:17;8047:27;8037:122;;8078:79;;:::i;:::-;8037:122;8195:6;8182:20;8220:78;8294:3;8286:6;8279:4;8271:6;8267:17;8220:78;:::i;:::-;8211:87;;8027:277;7966:338;;;;:::o;8310:1235::-;8423:6;8431;8439;8447;8455;8463;8512:3;8500:9;8491:7;8487:23;8483:33;8480:120;;;8519:79;;:::i;:::-;8480:120;8639:1;8664:53;8709:7;8700:6;8689:9;8685:22;8664:53;:::i;:::-;8654:63;;8610:117;8766:2;8792:53;8837:7;8828:6;8817:9;8813:22;8792:53;:::i;:::-;8782:63;;8737:118;8894:2;8920:53;8965:7;8956:6;8945:9;8941:22;8920:53;:::i;:::-;8910:63;;8865:118;9022:2;9048:53;9093:7;9084:6;9073:9;9069:22;9048:53;:::i;:::-;9038:63;;8993:118;9150:3;9177:53;9222:7;9213:6;9202:9;9198:22;9177:53;:::i;:::-;9167:63;;9121:119;9307:3;9296:9;9292:19;9279:33;9339:18;9331:6;9328:30;9325:117;;;9361:79;;:::i;:::-;9325:117;9466:62;9520:7;9511:6;9500:9;9496:22;9466:62;:::i;:::-;9456:72;;9250:288;8310:1235;;;;;;;;:::o;9551:329::-;9610:6;9659:2;9647:9;9638:7;9634:23;9630:32;9627:119;;;9665:79;;:::i;:::-;9627:119;9785:1;9810:53;9855:7;9846:6;9835:9;9831:22;9810:53;:::i;:::-;9800:63;;9756:117;9551:329;;;;:::o;9886:474::-;9954:6;9962;10011:2;9999:9;9990:7;9986:23;9982:32;9979:119;;;10017:79;;:::i;:::-;9979:119;10137:1;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10108:117;10264:2;10290:53;10335:7;10326:6;10315:9;10311:22;10290:53;:::i;:::-;10280:63;;10235:118;9886:474;;;;;:::o;10366:::-;10434:6;10442;10491:2;10479:9;10470:7;10466:23;10462:32;10459:119;;;10497:79;;:::i;:::-;10459:119;10617:1;10642:53;10687:7;10678:6;10667:9;10663:22;10642:53;:::i;:::-;10632:63;;10588:117;10744:2;10770:53;10815:7;10806:6;10795:9;10791:22;10770:53;:::i;:::-;10760:63;;10715:118;10366:474;;;;;:::o;10846:118::-;10933:24;10951:5;10933:24;:::i;:::-;10928:3;10921:37;10846:118;;:::o;10970:332::-;11091:4;11129:2;11118:9;11114:18;11106:26;;11142:71;11210:1;11199:9;11195:17;11186:6;11142:71;:::i;:::-;11223:72;11291:2;11280:9;11276:18;11267:6;11223:72;:::i;:::-;10970:332;;;;;:::o;11308:311::-;11385:4;11475:18;11467:6;11464:30;11461:56;;;11497:18;;:::i;:::-;11461:56;11547:4;11539:6;11535:17;11527:25;;11607:4;11601;11597:15;11589:23;;11308:311;;;:::o;11625:117::-;11734:1;11731;11724:12;11765:710;11861:5;11886:81;11902:64;11959:6;11902:64;:::i;:::-;11886:81;:::i;:::-;11877:90;;11987:5;12016:6;12009:5;12002:21;12050:4;12043:5;12039:16;12032:23;;12103:4;12095:6;12091:17;12083:6;12079:30;12132:3;12124:6;12121:15;12118:122;;;12151:79;;:::i;:::-;12118:122;12266:6;12249:220;12283:6;12278:3;12275:15;12249:220;;;12358:3;12387:37;12420:3;12408:10;12387:37;:::i;:::-;12382:3;12375:50;12454:4;12449:3;12445:14;12438:21;;12325:144;12309:4;12304:3;12300:14;12293:21;;12249:220;;;12253:21;11867:608;;11765:710;;;;;:::o;12498:370::-;12569:5;12618:3;12611:4;12603:6;12599:17;12595:27;12585:122;;12626:79;;:::i;:::-;12585:122;12743:6;12730:20;12768:94;12858:3;12850:6;12843:4;12835:6;12831:17;12768:94;:::i;:::-;12759:103;;12575:293;12498:370;;;;:::o;12874:1509::-;13028:6;13036;13044;13052;13060;13109:3;13097:9;13088:7;13084:23;13080:33;13077:120;;;13116:79;;:::i;:::-;13077:120;13236:1;13261:53;13306:7;13297:6;13286:9;13282:22;13261:53;:::i;:::-;13251:63;;13207:117;13363:2;13389:53;13434:7;13425:6;13414:9;13410:22;13389:53;:::i;:::-;13379:63;;13334:118;13519:2;13508:9;13504:18;13491:32;13550:18;13542:6;13539:30;13536:117;;;13572:79;;:::i;:::-;13536:117;13677:78;13747:7;13738:6;13727:9;13723:22;13677:78;:::i;:::-;13667:88;;13462:303;13832:2;13821:9;13817:18;13804:32;13863:18;13855:6;13852:30;13849:117;;;13885:79;;:::i;:::-;13849:117;13990:78;14060:7;14051:6;14040:9;14036:22;13990:78;:::i;:::-;13980:88;;13775:303;14145:3;14134:9;14130:19;14117:33;14177:18;14169:6;14166:30;14163:117;;;14199:79;;:::i;:::-;14163:117;14304:62;14358:7;14349:6;14338:9;14334:22;14304:62;:::i;:::-;14294:72;;14088:288;12874:1509;;;;;;;;:::o;14389:311::-;14466:4;14556:18;14548:6;14545:30;14542:56;;;14578:18;;:::i;:::-;14542:56;14628:4;14620:6;14616:17;14608:25;;14688:4;14682;14678:15;14670:23;;14389:311;;;:::o;14723:710::-;14819:5;14844:81;14860:64;14917:6;14860:64;:::i;:::-;14844:81;:::i;:::-;14835:90;;14945:5;14974:6;14967:5;14960:21;15008:4;15001:5;14997:16;14990:23;;15061:4;15053:6;15049:17;15041:6;15037:30;15090:3;15082:6;15079:15;15076:122;;;15109:79;;:::i;:::-;15076:122;15224:6;15207:220;15241:6;15236:3;15233:15;15207:220;;;15316:3;15345:37;15378:3;15366:10;15345:37;:::i;:::-;15340:3;15333:50;15412:4;15407:3;15403:14;15396:21;;15283:144;15267:4;15262:3;15258:14;15251:21;;15207:220;;;15211:21;14825:608;;14723:710;;;;;:::o;15456:370::-;15527:5;15576:3;15569:4;15561:6;15557:17;15553:27;15543:122;;15584:79;;:::i;:::-;15543:122;15701:6;15688:20;15726:94;15816:3;15808:6;15801:4;15793:6;15789:17;15726:94;:::i;:::-;15717:103;;15533:293;15456:370;;;;:::o;15832:894::-;15950:6;15958;16007:2;15995:9;15986:7;15982:23;15978:32;15975:119;;;16013:79;;:::i;:::-;15975:119;16161:1;16150:9;16146:17;16133:31;16191:18;16183:6;16180:30;16177:117;;;16213:79;;:::i;:::-;16177:117;16318:78;16388:7;16379:6;16368:9;16364:22;16318:78;:::i;:::-;16308:88;;16104:302;16473:2;16462:9;16458:18;16445:32;16504:18;16496:6;16493:30;16490:117;;;16526:79;;:::i;:::-;16490:117;16631:78;16701:7;16692:6;16681:9;16677:22;16631:78;:::i;:::-;16621:88;;16416:303;15832:894;;;;;:::o;16732:114::-;16799:6;16833:5;16827:12;16817:22;;16732:114;;;:::o;16852:184::-;16951:11;16985:6;16980:3;16973:19;17025:4;17020:3;17016:14;17001:29;;16852:184;;;;:::o;17042:132::-;17109:4;17132:3;17124:11;;17162:4;17157:3;17153:14;17145:22;;17042:132;;;:::o;17180:108::-;17257:24;17275:5;17257:24;:::i;:::-;17252:3;17245:37;17180:108;;:::o;17294:179::-;17363:10;17384:46;17426:3;17418:6;17384:46;:::i;:::-;17462:4;17457:3;17453:14;17439:28;;17294:179;;;;:::o;17479:113::-;17549:4;17581;17576:3;17572:14;17564:22;;17479:113;;;:::o;17628:732::-;17747:3;17776:54;17824:5;17776:54;:::i;:::-;17846:86;17925:6;17920:3;17846:86;:::i;:::-;17839:93;;17956:56;18006:5;17956:56;:::i;:::-;18035:7;18066:1;18051:284;18076:6;18073:1;18070:13;18051:284;;;18152:6;18146:13;18179:63;18238:3;18223:13;18179:63;:::i;:::-;18172:70;;18265:60;18318:6;18265:60;:::i;:::-;18255:70;;18111:224;18098:1;18095;18091:9;18086:14;;18051:284;;;18055:14;18351:3;18344:10;;17752:608;;;17628:732;;;;:::o;18366:373::-;18509:4;18547:2;18536:9;18532:18;18524:26;;18596:9;18590:4;18586:20;18582:1;18571:9;18567:17;18560:47;18624:108;18727:4;18718:6;18624:108;:::i;:::-;18616:116;;18366:373;;;;:::o;18745:321::-;18832:4;18922:18;18914:6;18911:30;18908:56;;;18944:18;;:::i;:::-;18908:56;18994:4;18986:6;18982:17;18974:25;;19054:4;19048;19044:15;19036:23;;18745:321;;;:::o;19088:945::-;19194:5;19219:91;19235:74;19302:6;19235:74;:::i;:::-;19219:91;:::i;:::-;19210:100;;19330:5;19359:6;19352:5;19345:21;19393:4;19386:5;19382:16;19375:23;;19446:4;19438:6;19434:17;19426:6;19422:30;19475:3;19467:6;19464:15;19461:122;;;19494:79;;:::i;:::-;19461:122;19609:6;19592:435;19626:6;19621:3;19618:15;19592:435;;;19715:3;19702:17;19751:18;19738:11;19735:35;19732:122;;;19773:79;;:::i;:::-;19732:122;19897:11;19889:6;19885:24;19935:47;19978:3;19966:10;19935:47;:::i;:::-;19930:3;19923:60;20012:4;20007:3;20003:14;19996:21;;19668:359;;19652:4;19647:3;19643:14;19636:21;;19592:435;;;19596:21;19200:833;;19088:945;;;;;:::o;20055:390::-;20136:5;20185:3;20178:4;20170:6;20166:17;20162:27;20152:122;;20193:79;;:::i;:::-;20152:122;20310:6;20297:20;20335:104;20435:3;20427:6;20420:4;20412:6;20408:17;20335:104;:::i;:::-;20326:113;;20142:303;20055:390;;;;:::o;20451:2127::-;20690:6;20698;20706;20714;20722;20730;20779:3;20767:9;20758:7;20754:23;20750:33;20747:120;;;20786:79;;:::i;:::-;20747:120;20906:1;20931:53;20976:7;20967:6;20956:9;20952:22;20931:53;:::i;:::-;20921:63;;20877:117;21061:2;21050:9;21046:18;21033:32;21092:18;21084:6;21081:30;21078:117;;;21114:79;;:::i;:::-;21078:117;21219:78;21289:7;21280:6;21269:9;21265:22;21219:78;:::i;:::-;21209:88;;21004:303;21374:2;21363:9;21359:18;21346:32;21405:18;21397:6;21394:30;21391:117;;;21427:79;;:::i;:::-;21391:117;21532:78;21602:7;21593:6;21582:9;21578:22;21532:78;:::i;:::-;21522:88;;21317:303;21687:2;21676:9;21672:18;21659:32;21718:18;21710:6;21707:30;21704:117;;;21740:79;;:::i;:::-;21704:117;21845:88;21925:7;21916:6;21905:9;21901:22;21845:88;:::i;:::-;21835:98;;21630:313;22010:3;21999:9;21995:19;21982:33;22042:18;22034:6;22031:30;22028:117;;;22064:79;;:::i;:::-;22028:117;22169:78;22239:7;22230:6;22219:9;22215:22;22169:78;:::i;:::-;22159:88;;21953:304;22324:3;22313:9;22309:19;22296:33;22356:18;22348:6;22345:30;22342:117;;;22378:79;;:::i;:::-;22342:117;22483:78;22553:7;22544:6;22533:9;22529:22;22483:78;:::i;:::-;22473:88;;22267:304;20451:2127;;;;;;;;:::o;22584:654::-;22662:6;22670;22719:2;22707:9;22698:7;22694:23;22690:32;22687:119;;;22725:79;;:::i;:::-;22687:119;22845:1;22870:53;22915:7;22906:6;22895:9;22891:22;22870:53;:::i;:::-;22860:63;;22816:117;23000:2;22989:9;22985:18;22972:32;23031:18;23023:6;23020:30;23017:117;;;23053:79;;:::i;:::-;23017:117;23158:63;23213:7;23204:6;23193:9;23189:22;23158:63;:::i;:::-;23148:73;;22943:288;22584:654;;;;;:::o;23244:1237::-;23358:6;23366;23374;23382;23390;23398;23447:3;23435:9;23426:7;23422:23;23418:33;23415:120;;;23454:79;;:::i;:::-;23415:120;23574:1;23599:53;23644:7;23635:6;23624:9;23620:22;23599:53;:::i;:::-;23589:63;;23545:117;23701:2;23727:53;23772:7;23763:6;23752:9;23748:22;23727:53;:::i;:::-;23717:63;;23672:118;23829:2;23855:53;23900:7;23891:6;23880:9;23876:22;23855:53;:::i;:::-;23845:63;;23800:118;23985:2;23974:9;23970:18;23957:32;24016:18;24008:6;24005:30;24002:117;;;24038:79;;:::i;:::-;24002:117;24143:63;24198:7;24189:6;24178:9;24174:22;24143:63;:::i;:::-;24133:73;;23928:288;24255:3;24282:53;24327:7;24318:6;24307:9;24303:22;24282:53;:::i;:::-;24272:63;;24226:119;24384:3;24411:53;24456:7;24447:6;24436:9;24432:22;24411:53;:::i;:::-;24401:63;;24355:119;23244:1237;;;;;;;;:::o;24487:222::-;24580:4;24618:2;24607:9;24603:18;24595:26;;24631:71;24699:1;24688:9;24684:17;24675:6;24631:71;:::i;:::-;24487:222;;;;:::o;24715:1237::-;24829:6;24837;24845;24853;24861;24869;24918:3;24906:9;24897:7;24893:23;24889:33;24886:120;;;24925:79;;:::i;:::-;24886:120;25045:1;25070:53;25115:7;25106:6;25095:9;25091:22;25070:53;:::i;:::-;25060:63;;25016:117;25172:2;25198:53;25243:7;25234:6;25223:9;25219:22;25198:53;:::i;:::-;25188:63;;25143:118;25300:2;25326:53;25371:7;25362:6;25351:9;25347:22;25326:53;:::i;:::-;25316:63;;25271:118;25456:2;25445:9;25441:18;25428:32;25487:18;25479:6;25476:30;25473:117;;;25509:79;;:::i;:::-;25473:117;25614:63;25669:7;25660:6;25649:9;25645:22;25614:63;:::i;:::-;25604:73;;25399:288;25726:3;25753:53;25798:7;25789:6;25778:9;25774:22;25753:53;:::i;:::-;25743:63;;25697:119;25855:3;25882:53;25927:7;25918:6;25907:9;25903:22;25882:53;:::i;:::-;25872:63;;25826:119;24715:1237;;;;;;;;:::o;25958:116::-;26028:21;26043:5;26028:21;:::i;:::-;26021:5;26018:32;26008:60;;26064:1;26061;26054:12;26008:60;25958:116;:::o;26080:133::-;26123:5;26161:6;26148:20;26139:29;;26177:30;26201:5;26177:30;:::i;:::-;26080:133;;;;:::o;26219:468::-;26284:6;26292;26341:2;26329:9;26320:7;26316:23;26312:32;26309:119;;;26347:79;;:::i;:::-;26309:119;26467:1;26492:53;26537:7;26528:6;26517:9;26513:22;26492:53;:::i;:::-;26482:63;;26438:117;26594:2;26620:50;26662:7;26653:6;26642:9;26638:22;26620:50;:::i;:::-;26610:60;;26565:115;26219:468;;;;;:::o;26693:2127::-;26932:6;26940;26948;26956;26964;26972;27021:3;27009:9;27000:7;26996:23;26992:33;26989:120;;;27028:79;;:::i;:::-;26989:120;27148:1;27173:53;27218:7;27209:6;27198:9;27194:22;27173:53;:::i;:::-;27163:63;;27119:117;27303:2;27292:9;27288:18;27275:32;27334:18;27326:6;27323:30;27320:117;;;27356:79;;:::i;:::-;27320:117;27461:78;27531:7;27522:6;27511:9;27507:22;27461:78;:::i;:::-;27451:88;;27246:303;27616:2;27605:9;27601:18;27588:32;27647:18;27639:6;27636:30;27633:117;;;27669:79;;:::i;:::-;27633:117;27774:78;27844:7;27835:6;27824:9;27820:22;27774:78;:::i;:::-;27764:88;;27559:303;27929:2;27918:9;27914:18;27901:32;27960:18;27952:6;27949:30;27946:117;;;27982:79;;:::i;:::-;27946:117;28087:88;28167:7;28158:6;28147:9;28143:22;28087:88;:::i;:::-;28077:98;;27872:313;28252:3;28241:9;28237:19;28224:33;28284:18;28276:6;28273:30;28270:117;;;28306:79;;:::i;:::-;28270:117;28411:78;28481:7;28472:6;28461:9;28457:22;28411:78;:::i;:::-;28401:88;;28195:304;28566:3;28555:9;28551:19;28538:33;28598:18;28590:6;28587:30;28584:117;;;28620:79;;:::i;:::-;28584:117;28725:78;28795:7;28786:6;28775:9;28771:22;28725:78;:::i;:::-;28715:88;;28509:304;26693:2127;;;;;;;;:::o;28826:619::-;28903:6;28911;28919;28968:2;28956:9;28947:7;28943:23;28939:32;28936:119;;;28974:79;;:::i;:::-;28936:119;29094:1;29119:53;29164:7;29155:6;29144:9;29140:22;29119:53;:::i;:::-;29109:63;;29065:117;29221:2;29247:53;29292:7;29283:6;29272:9;29268:22;29247:53;:::i;:::-;29237:63;;29192:118;29349:2;29375:53;29420:7;29411:6;29400:9;29396:22;29375:53;:::i;:::-;29365:63;;29320:118;28826:619;;;;;:::o;29451:474::-;29519:6;29527;29576:2;29564:9;29555:7;29551:23;29547:32;29544:119;;;29582:79;;:::i;:::-;29544:119;29702:1;29727:53;29772:7;29763:6;29752:9;29748:22;29727:53;:::i;:::-;29717:63;;29673:117;29829:2;29855:53;29900:7;29891:6;29880:9;29876:22;29855:53;:::i;:::-;29845:63;;29800:118;29451:474;;;;;:::o;29931:1089::-;30035:6;30043;30051;30059;30067;30116:3;30104:9;30095:7;30091:23;30087:33;30084:120;;;30123:79;;:::i;:::-;30084:120;30243:1;30268:53;30313:7;30304:6;30293:9;30289:22;30268:53;:::i;:::-;30258:63;;30214:117;30370:2;30396:53;30441:7;30432:6;30421:9;30417:22;30396:53;:::i;:::-;30386:63;;30341:118;30498:2;30524:53;30569:7;30560:6;30549:9;30545:22;30524:53;:::i;:::-;30514:63;;30469:118;30626:2;30652:53;30697:7;30688:6;30677:9;30673:22;30652:53;:::i;:::-;30642:63;;30597:118;30782:3;30771:9;30767:19;30754:33;30814:18;30806:6;30803:30;30800:117;;;30836:79;;:::i;:::-;30800:117;30941:62;30995:7;30986:6;30975:9;30971:22;30941:62;:::i;:::-;30931:72;;30725:288;29931:1089;;;;;;;;:::o;31026:329::-;31085:6;31134:2;31122:9;31113:7;31109:23;31105:32;31102:119;;;31140:79;;:::i;:::-;31102:119;31260:1;31285:53;31330:7;31321:6;31310:9;31306:22;31285:53;:::i;:::-;31275:63;;31231:117;31026:329;;;;:::o;31361:230::-;31501:34;31497:1;31489:6;31485:14;31478:58;31570:13;31565:2;31557:6;31553:15;31546:38;31361:230;:::o;31597:366::-;31739:3;31760:67;31824:2;31819:3;31760:67;:::i;:::-;31753:74;;31836:93;31925:3;31836:93;:::i;:::-;31954:2;31949:3;31945:12;31938:19;;31597:366;;;:::o;31969:419::-;32135:4;32173:2;32162:9;32158:18;32150:26;;32222:9;32216:4;32212:20;32208:1;32197:9;32193:17;32186:47;32250:131;32376:4;32250:131;:::i;:::-;32242:139;;31969:419;;;:::o;32394:182::-;32534:34;32530:1;32522:6;32518:14;32511:58;32394:182;:::o;32582:366::-;32724:3;32745:67;32809:2;32804:3;32745:67;:::i;:::-;32738:74;;32821:93;32910:3;32821:93;:::i;:::-;32939:2;32934:3;32930:12;32923:19;;32582:366;;;:::o;32954:419::-;33120:4;33158:2;33147:9;33143:18;33135:26;;33207:9;33201:4;33197:20;33193:1;33182:9;33178:17;33171:47;33235:131;33361:4;33235:131;:::i;:::-;33227:139;;32954:419;;;:::o;33379:98::-;33430:6;33464:5;33458:12;33448:22;;33379:98;;;:::o;33483:168::-;33566:11;33600:6;33595:3;33588:19;33640:4;33635:3;33631:14;33616:29;;33483:168;;;;:::o;33657:360::-;33743:3;33771:38;33803:5;33771:38;:::i;:::-;33825:70;33888:6;33883:3;33825:70;:::i;:::-;33818:77;;33904:52;33949:6;33944:3;33937:4;33930:5;33926:16;33904:52;:::i;:::-;33981:29;34003:6;33981:29;:::i;:::-;33976:3;33972:39;33965:46;;33747:270;33657:360;;;;:::o;34023:751::-;34246:4;34284:3;34273:9;34269:19;34261:27;;34298:71;34366:1;34355:9;34351:17;34342:6;34298:71;:::i;:::-;34379:72;34447:2;34436:9;34432:18;34423:6;34379:72;:::i;:::-;34461;34529:2;34518:9;34514:18;34505:6;34461:72;:::i;:::-;34543;34611:2;34600:9;34596:18;34587:6;34543:72;:::i;:::-;34663:9;34657:4;34653:20;34647:3;34636:9;34632:19;34625:49;34691:76;34762:4;34753:6;34691:76;:::i;:::-;34683:84;;34023:751;;;;;;;;:::o;34780:141::-;34836:5;34867:6;34861:13;34852:22;;34883:32;34909:5;34883:32;:::i;:::-;34780:141;;;;:::o;34927:349::-;34996:6;35045:2;35033:9;35024:7;35020:23;35016:32;35013:119;;;35051:79;;:::i;:::-;35013:119;35171:1;35196:63;35251:7;35242:6;35231:9;35227:22;35196:63;:::i;:::-;35186:73;;35142:127;34927:349;;;;:::o;35282:106::-;35326:8;35375:5;35370:3;35366:15;35345:36;;35282:106;;;:::o;35394:183::-;35429:3;35467:1;35449:16;35446:23;35443:128;;;35505:1;35502;35499;35484:23;35527:34;35558:1;35552:8;35527:34;:::i;:::-;35520:41;;35443:128;35394:183;:::o;35583:711::-;35622:3;35660:4;35642:16;35639:26;35668:5;35636:39;35697:20;;:::i;:::-;35772:1;35754:16;35750:24;35747:1;35741:4;35726:49;35805:4;35799:11;35904:16;35897:4;35889:6;35885:17;35882:39;35849:18;35841:6;35838:30;35822:113;35819:146;;;35950:5;;;;35819:146;35996:6;35990:4;35986:17;36032:3;36026:10;36059:18;36051:6;36048:30;36045:43;;;36081:5;;;;;;36045:43;36129:6;36122:4;36117:3;36113:14;36109:27;36188:1;36170:16;36166:24;36160:4;36156:35;36151:3;36148:44;36145:57;;;36195:5;;;;;;;36145:57;36212;36260:6;36254:4;36250:17;36242:6;36238:30;36232:4;36212:57;:::i;:::-;36285:3;36278:10;;35626:668;;;;;35583:711;;:::o;36300:239::-;36440:34;36436:1;36428:6;36424:14;36417:58;36509:22;36504:2;36496:6;36492:15;36485:47;36300:239;:::o;36545:366::-;36687:3;36708:67;36772:2;36767:3;36708:67;:::i;:::-;36701:74;;36784:93;36873:3;36784:93;:::i;:::-;36902:2;36897:3;36893:12;36886:19;;36545:366;;;:::o;36917:419::-;37083:4;37121:2;37110:9;37106:18;37098:26;;37170:9;37164:4;37160:20;37156:1;37145:9;37141:17;37134:47;37198:131;37324:4;37198:131;:::i;:::-;37190:139;;36917:419;;;:::o;37342:227::-;37482:34;37478:1;37470:6;37466:14;37459:58;37551:10;37546:2;37538:6;37534:15;37527:35;37342:227;:::o;37575:366::-;37717:3;37738:67;37802:2;37797:3;37738:67;:::i;:::-;37731:74;;37814:93;37903:3;37814:93;:::i;:::-;37932:2;37927:3;37923:12;37916:19;;37575:366;;;:::o;37947:419::-;38113:4;38151:2;38140:9;38136:18;38128:26;;38200:9;38194:4;38190:20;38186:1;38175:9;38171:17;38164:47;38228:131;38354:4;38228:131;:::i;:::-;38220:139;;37947:419;;;:::o;38372:180::-;38420:77;38417:1;38410:88;38517:4;38514:1;38507:15;38541:4;38538:1;38531:15;38558:320;38602:6;38639:1;38633:4;38629:12;38619:22;;38686:1;38680:4;38676:12;38707:18;38697:81;;38763:4;38755:6;38751:17;38741:27;;38697:81;38825:2;38817:6;38814:14;38794:18;38791:38;38788:84;;38844:18;;:::i;:::-;38788:84;38609:269;38558:320;;;:::o;38884:148::-;38986:11;39023:3;39008:18;;38884:148;;;;:::o;39038:141::-;39087:4;39110:3;39102:11;;39133:3;39130:1;39123:14;39167:4;39164:1;39154:18;39146:26;;39038:141;;;:::o;39209:845::-;39312:3;39349:5;39343:12;39378:36;39404:9;39378:36;:::i;:::-;39430:89;39512:6;39507:3;39430:89;:::i;:::-;39423:96;;39550:1;39539:9;39535:17;39566:1;39561:137;;;;39712:1;39707:341;;;;39528:520;;39561:137;39645:4;39641:9;39630;39626:25;39621:3;39614:38;39681:6;39676:3;39672:16;39665:23;;39561:137;;39707:341;39774:38;39806:5;39774:38;:::i;:::-;39834:1;39848:154;39862:6;39859:1;39856:13;39848:154;;;39936:7;39930:14;39926:1;39921:3;39917:11;39910:35;39986:1;39977:7;39973:15;39962:26;;39884:4;39881:1;39877:12;39872:17;;39848:154;;;40031:6;40026:3;40022:16;40015:23;;39714:334;;39528:520;;39316:738;;39209:845;;;;:::o;40060:423::-;40234:3;40256:92;40344:3;40335:6;40256:92;:::i;:::-;40249:99;;40365:92;40453:3;40444:6;40365:92;:::i;:::-;40358:99;;40474:3;40467:10;;40060:423;;;;;:::o;40489:180::-;40537:77;40534:1;40527:88;40634:4;40631:1;40624:15;40658:4;40655:1;40648:15;40675:348;40715:7;40738:20;40756:1;40738:20;:::i;:::-;40733:25;;40772:20;40790:1;40772:20;:::i;:::-;40767:25;;40960:1;40892:66;40888:74;40885:1;40882:81;40877:1;40870:9;40863:17;40859:105;40856:131;;;40967:18;;:::i;:::-;40856:131;41015:1;41012;41008:9;40997:20;;40675:348;;;;:::o;41029:180::-;41077:77;41074:1;41067:88;41174:4;41171:1;41164:15;41198:4;41195:1;41188:15;41215:185;41255:1;41272:20;41290:1;41272:20;:::i;:::-;41267:25;;41306:20;41324:1;41306:20;:::i;:::-;41301:25;;41345:1;41335:35;;41350:18;;:::i;:::-;41335:35;41392:1;41389;41385:9;41380:14;;41215:185;;;;:::o;41406:237::-;41546:34;41542:1;41534:6;41530:14;41523:58;41615:20;41610:2;41602:6;41598:15;41591:45;41406:237;:::o;41649:366::-;41791:3;41812:67;41876:2;41871:3;41812:67;:::i;:::-;41805:74;;41888:93;41977:3;41888:93;:::i;:::-;42006:2;42001:3;41997:12;41990:19;;41649:366;;;:::o;42021:419::-;42187:4;42225:2;42214:9;42210:18;42202:26;;42274:9;42268:4;42264:20;42260:1;42249:9;42245:17;42238:47;42302:131;42428:4;42302:131;:::i;:::-;42294:139;;42021:419;;;:::o;42446:228::-;42586:34;42582:1;42574:6;42570:14;42563:58;42655:11;42650:2;42642:6;42638:15;42631:36;42446:228;:::o;42680:366::-;42822:3;42843:67;42907:2;42902:3;42843:67;:::i;:::-;42836:74;;42919:93;43008:3;42919:93;:::i;:::-;43037:2;43032:3;43028:12;43021:19;;42680:366;;;:::o;43052:419::-;43218:4;43256:2;43245:9;43241:18;43233:26;;43305:9;43299:4;43295:20;43291:1;43280:9;43276:17;43269:47;43333:131;43459:4;43333:131;:::i;:::-;43325:139;;43052:419;;;:::o;43477:180::-;43525:77;43522:1;43515:88;43622:4;43619:1;43612:15;43646:4;43643:1;43636:15;43663:233;43702:3;43725:24;43743:5;43725:24;:::i;:::-;43716:33;;43771:66;43764:5;43761:77;43758:103;;43841:18;;:::i;:::-;43758:103;43888:1;43881:5;43877:13;43870:20;;43663:233;;;:::o;43902:181::-;44042:33;44038:1;44030:6;44026:14;44019:57;43902:181;:::o;44089:366::-;44231:3;44252:67;44316:2;44311:3;44252:67;:::i;:::-;44245:74;;44328:93;44417:3;44328:93;:::i;:::-;44446:2;44441:3;44437:12;44430:19;;44089:366;;;:::o;44461:419::-;44627:4;44665:2;44654:9;44650:18;44642:26;;44714:9;44708:4;44704:20;44700:1;44689:9;44685:17;44678:47;44742:131;44868:4;44742:131;:::i;:::-;44734:139;;44461:419;;;:::o;44886:305::-;44926:3;44945:20;44963:1;44945:20;:::i;:::-;44940:25;;44979:20;44997:1;44979:20;:::i;:::-;44974:25;;45133:1;45065:66;45061:74;45058:1;45055:81;45052:107;;;45139:18;;:::i;:::-;45052:107;45183:1;45180;45176:9;45169:16;;44886:305;;;;:::o;45197:174::-;45337:26;45333:1;45325:6;45321:14;45314:50;45197:174;:::o;45377:366::-;45519:3;45540:67;45604:2;45599:3;45540:67;:::i;:::-;45533:74;;45616:93;45705:3;45616:93;:::i;:::-;45734:2;45729:3;45725:12;45718:19;;45377:366;;;:::o;45749:419::-;45915:4;45953:2;45942:9;45938:18;45930:26;;46002:9;45996:4;45992:20;45988:1;45977:9;45973:17;45966:47;46030:131;46156:4;46030:131;:::i;:::-;46022:139;;45749:419;;;:::o;46174:85::-;46219:7;46248:5;46237:16;;46174:85;;;:::o;46265:60::-;46293:3;46314:5;46307:12;;46265:60;;;:::o;46331:158::-;46389:9;46422:61;46440:42;46449:32;46475:5;46449:32;:::i;:::-;46440:42;:::i;:::-;46422:61;:::i;:::-;46409:74;;46331:158;;;:::o;46495:147::-;46590:45;46629:5;46590:45;:::i;:::-;46585:3;46578:58;46495:147;;:::o;46648:348::-;46777:4;46815:2;46804:9;46800:18;46792:26;;46828:71;46896:1;46885:9;46881:17;46872:6;46828:71;:::i;:::-;46909:80;46985:2;46974:9;46970:18;46961:6;46909:80;:::i;:::-;46648:348;;;;;:::o;47002:228::-;47142:34;47138:1;47130:6;47126:14;47119:58;47211:11;47206:2;47198:6;47194:15;47187:36;47002:228;:::o;47236:366::-;47378:3;47399:67;47463:2;47458:3;47399:67;:::i;:::-;47392:74;;47475:93;47564:3;47475:93;:::i;:::-;47593:2;47588:3;47584:12;47577:19;;47236:366;;;:::o;47608:419::-;47774:4;47812:2;47801:9;47797:18;47789:26;;47861:9;47855:4;47851:20;47847:1;47836:9;47832:17;47825:47;47889:131;48015:4;47889:131;:::i;:::-;47881:139;;47608:419;;;:::o;48033:225::-;48173:34;48169:1;48161:6;48157:14;48150:58;48242:8;48237:2;48229:6;48225:15;48218:33;48033:225;:::o;48264:366::-;48406:3;48427:67;48491:2;48486:3;48427:67;:::i;:::-;48420:74;;48503:93;48592:3;48503:93;:::i;:::-;48621:2;48616:3;48612:12;48605:19;;48264:366;;;:::o;48636:419::-;48802:4;48840:2;48829:9;48825:18;48817:26;;48889:9;48883:4;48879:20;48875:1;48864:9;48860:17;48853:47;48917:131;49043:4;48917:131;:::i;:::-;48909:139;;48636:419;;;:::o;49061:227::-;49201:34;49197:1;49189:6;49185:14;49178:58;49270:10;49265:2;49257:6;49253:15;49246:35;49061:227;:::o;49294:366::-;49436:3;49457:67;49521:2;49516:3;49457:67;:::i;:::-;49450:74;;49533:93;49622:3;49533:93;:::i;:::-;49651:2;49646:3;49642:12;49635:19;;49294:366;;;:::o;49666:419::-;49832:4;49870:2;49859:9;49855:18;49847:26;;49919:9;49913:4;49909:20;49905:1;49894:9;49890:17;49883:47;49947:131;50073:4;49947:131;:::i;:::-;49939:139;;49666:419;;;:::o;50091:224::-;50231:34;50227:1;50219:6;50215:14;50208:58;50300:7;50295:2;50287:6;50283:15;50276:32;50091:224;:::o;50321:366::-;50463:3;50484:67;50548:2;50543:3;50484:67;:::i;:::-;50477:74;;50560:93;50649:3;50560:93;:::i;:::-;50678:2;50673:3;50669:12;50662:19;;50321:366;;;:::o;50693:419::-;50859:4;50897:2;50886:9;50882:18;50874:26;;50946:9;50940:4;50936:20;50932:1;50921:9;50917:17;50910:47;50974:131;51100:4;50974:131;:::i;:::-;50966:139;;50693:419;;;:::o;51118:229::-;51258:34;51254:1;51246:6;51242:14;51235:58;51327:12;51322:2;51314:6;51310:15;51303:37;51118:229;:::o;51353:366::-;51495:3;51516:67;51580:2;51575:3;51516:67;:::i;:::-;51509:74;;51592:93;51681:3;51592:93;:::i;:::-;51710:2;51705:3;51701:12;51694:19;;51353:366;;;:::o;51725:419::-;51891:4;51929:2;51918:9;51914:18;51906:26;;51978:9;51972:4;51968:20;51964:1;51953:9;51949:17;51942:47;52006:131;52132:4;52006:131;:::i;:::-;51998:139;;51725:419;;;:::o;52150:634::-;52371:4;52409:2;52398:9;52394:18;52386:26;;52458:9;52452:4;52448:20;52444:1;52433:9;52429:17;52422:47;52486:108;52589:4;52580:6;52486:108;:::i;:::-;52478:116;;52641:9;52635:4;52631:20;52626:2;52615:9;52611:18;52604:48;52669:108;52772:4;52763:6;52669:108;:::i;:::-;52661:116;;52150:634;;;;;:::o;52790:220::-;52930:34;52926:1;52918:6;52914:14;52907:58;52999:3;52994:2;52986:6;52982:15;52975:28;52790:220;:::o;53016:366::-;53158:3;53179:67;53243:2;53238:3;53179:67;:::i;:::-;53172:74;;53255:93;53344:3;53255:93;:::i;:::-;53373:2;53368:3;53364:12;53357:19;;53016:366;;;:::o;53388:419::-;53554:4;53592:2;53581:9;53577:18;53569:26;;53641:9;53635:4;53631:20;53627:1;53616:9;53612:17;53605:47;53669:131;53795:4;53669:131;:::i;:::-;53661:139;;53388:419;;;:::o;53813:176::-;53953:28;53949:1;53941:6;53937:14;53930:52;53813:176;:::o;53995:366::-;54137:3;54158:67;54222:2;54217:3;54158:67;:::i;:::-;54151:74;;54234:93;54323:3;54234:93;:::i;:::-;54352:2;54347:3;54343:12;54336:19;;53995:366;;;:::o;54367:419::-;54533:4;54571:2;54560:9;54556:18;54548:26;;54620:9;54614:4;54610:20;54606:1;54595:9;54591:17;54584:47;54648:131;54774:4;54648:131;:::i;:::-;54640:139;;54367:419;;;:::o;54792:332::-;54913:4;54951:2;54940:9;54936:18;54928:26;;54964:71;55032:1;55021:9;55017:17;55008:6;54964:71;:::i;:::-;55045:72;55113:2;55102:9;55098:18;55089:6;55045:72;:::i;:::-;54792:332;;;;;:::o;55130:228::-;55270:34;55266:1;55258:6;55254:14;55247:58;55339:11;55334:2;55326:6;55322:15;55315:36;55130:228;:::o;55364:366::-;55506:3;55527:67;55591:2;55586:3;55527:67;:::i;:::-;55520:74;;55603:93;55692:3;55603:93;:::i;:::-;55721:2;55716:3;55712:12;55705:19;;55364:366;;;:::o;55736:419::-;55902:4;55940:2;55929:9;55925:18;55917:26;;55989:9;55983:4;55979:20;55975:1;55964:9;55960:17;55953:47;56017:131;56143:4;56017:131;:::i;:::-;56009:139;;55736:419;;;:::o;56161:1053::-;56484:4;56522:3;56511:9;56507:19;56499:27;;56536:71;56604:1;56593:9;56589:17;56580:6;56536:71;:::i;:::-;56617:72;56685:2;56674:9;56670:18;56661:6;56617:72;:::i;:::-;56736:9;56730:4;56726:20;56721:2;56710:9;56706:18;56699:48;56764:108;56867:4;56858:6;56764:108;:::i;:::-;56756:116;;56919:9;56913:4;56909:20;56904:2;56893:9;56889:18;56882:48;56947:108;57050:4;57041:6;56947:108;:::i;:::-;56939:116;;57103:9;57097:4;57093:20;57087:3;57076:9;57072:19;57065:49;57131:76;57202:4;57193:6;57131:76;:::i;:::-;57123:84;;56161:1053;;;;;;;;:::o
Swarm Source
ipfs://f93ba5991962056798453eadf8d50c233421cfbb95fc9621f2153e064cc5f205
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.