ERC-721
Overview
Max Total Supply
0 AOL
Holders
118
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 AOLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AshesOfLight
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-19 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: contracts/interfaces/ILayerZeroEndpoint.sol interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: contracts/interfaces/ILayerZeroReceiver.sol interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /* * @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); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: contracts/NonblockingReceiver.sol abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override { require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract"); // try-catch all errors/exceptions // having failed messages does not block messages passing try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) { // do nothing } catch { // error / exception failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload)); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); } } function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public { // only internal transaction require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge."); // handle incoming message _LzReceive( _srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal { endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam); } function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable { // assert there is message to retry FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce]; require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message"); require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload"); // clear the stored message failedMsg.payloadLength = 0; failedMsg.payloadHash = bytes32(0); // execute the message. revert if it fails again this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } function setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } contract AshesOfLight is Ownable, ERC721, NonblockingReceiver { address public _owner; string private baseURI; uint256 public nextTokenId; uint256 public maxMint; bool public paused = true; uint256 public GIFT_RESERVED; uint gasForDestinationLzReceive = 350000; constructor(uint256 _nextTokenId , uint256 _maxMint , uint256 _giftReserved , string memory baseURI_, address _layerZeroEndpoint) ERC721("Ashes Of Light", "AOL") { _owner = msg.sender; nextTokenId = _nextTokenId; maxMint = _maxMint; GIFT_RESERVED = _giftReserved; endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); baseURI = baseURI_; } // mint function // you can choose to mint 1 or 2 // mint is free, but payments are accepted function mint(uint8 numTokens) external payable { require(!paused, "The contract is paused!"); require(numTokens < 3, "Max 2 NFTs per transaction"); require(nextTokenId + numTokens <= maxMint - GIFT_RESERVED, "Mint exceeds supply"); _safeMint(msg.sender, ++nextTokenId); if (numTokens == 2) { _safeMint(msg.sender, ++nextTokenId); } } // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint tokenId) public payable { require(msg.sender == ownerOf(tokenId), "You must own the token to traverse"); require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel"); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams); require(msg.value >= messageFee, "msg.value not enough to cover messageFee. Send gas for message fees"); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } function setBaseURI(string memory URI) external onlyOwner { baseURI = URI; } function gift(uint8 numTokens, address _to) external payable onlyOwner { require(nextTokenId + numTokens <= maxMint, "Mint exceeds supply"); for(uint256 i = 1; i <= numTokens; i++) { _safeMint(_to , ++nextTokenId); } } function setPaused(bool _state) external onlyOwner { paused = _state; } function withdraw(uint amt) external onlyOwner { (bool sent, ) = payable(_owner).call{value: amt}(""); require(sent, "Failed to withdraw Ether"); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } // ------------------ // Internal Functions // ------------------ function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal { // decode (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint)); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } function _baseURI() override internal view returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_nextTokenId","type":"uint256"},{"internalType":"uint256","name":"_maxMint","type":"uint256"},{"internalType":"uint256","name":"_giftReserved","type":"uint256"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GIFT_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"},{"internalType":"address","name":"_to","type":"address"}],"name":"gift","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600e60006101000a81548160ff021916908315150217905550620557306010553480156200003357600080fd5b50604051620056a5380380620056a58339818101604052810190620000599190620003f0565b6040518060400160405280600e81526020017f4173686573204f66204c696768740000000000000000000000000000000000008152506040518060400160405280600381526020017f414f4c0000000000000000000000000000000000000000000000000000000000815250620000e5620000d9620001d460201b60201c565b620001dc60201b60201c565b8160019080519060200190620000fd929190620002a0565b50806002908051906020019062000116929190620002a0565b50505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600c8190555083600d8190555082600f8190555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b9080519060200190620001c8929190620002a0565b5050505050506200066d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002ae906200055e565b90600052602060002090601f016020900481019282620002d257600085556200031e565b82601f10620002ed57805160ff19168380011785556200031e565b828001600101855582156200031e579182015b828111156200031d57825182559160200191906001019062000300565b5b5090506200032d919062000331565b5090565b5b808211156200034c57600081600090555060010162000332565b5090565b6000620003676200036184620004b4565b6200048b565b9050828152602081018484840111156200038057600080fd5b6200038d84828562000528565b509392505050565b600081519050620003a68162000639565b92915050565b600082601f830112620003be57600080fd5b8151620003d084826020860162000350565b91505092915050565b600081519050620003ea8162000653565b92915050565b600080600080600060a086880312156200040957600080fd5b60006200041988828901620003d9565b95505060206200042c88828901620003d9565b94505060406200043f88828901620003d9565b935050606086015167ffffffffffffffff8111156200045d57600080fd5b6200046b88828901620003ac565b92505060806200047e8882890162000395565b9150509295509295909350565b600062000497620004aa565b9050620004a5828262000594565b919050565b6000604051905090565b600067ffffffffffffffff821115620004d257620004d1620005f9565b5b620004dd8262000628565b9050602081019050919050565b6000620004f782620004fe565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620005485780820151818401526020810190506200052b565b8381111562000558576000848401525b50505050565b600060028204905060018216806200057757607f821691505b602082108114156200058e576200058d620005ca565b5b50919050565b6200059f8262000628565b810181811067ffffffffffffffff82111715620005c157620005c0620005f9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200064481620004ea565b81146200065057600080fd5b50565b6200065e816200051e565b81146200066a57600080fd5b50565b615028806200067d6000396000f3fe6080604052600436106101f85760003560e01c80637501f7411161010d578063b2bdfa7b116100a0578063d1deba1f1161006f578063d1deba1f14610704578063e985e9c514610720578063eb8d72b71461075d578063f2fde38b14610786578063fd8024f9146107af576101f8565b8063b2bdfa7b14610657578063b88d4fde14610682578063c87b56dd146106ab578063cf89fa03146106e8576101f8565b80638ee74912116100dc5780638ee749121461059c578063943fb872146105da57806395d89b4114610603578063a22cb4651461062e576101f8565b80637501f741146104de5780637533d7881461050957806375794a3c146105465780638da5cb5b14610571576101f8565b80632e1a7d4d116101905780636352211e1161015f5780636352211e146104155780636ecd2306146104525780636eed53631461046e57806370a082311461048a578063715018a6146104c7576101f8565b80632e1a7d4d1461036f57806342842e0e1461039857806355f804b3146103c15780635c975abb146103ea576101f8565b8063095ea7b3116101cc578063095ea7b3146102cb57806316c38b3c146102f45780631c37a8221461031d57806323b872dd14610346576101f8565b80621d3567146101fd57806301ffc9a71461022657806306fdde0314610263578063081812fc1461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f919061351e565b6107da565b005b34801561023257600080fd5b5061024d6004803603810190610248919061330b565b610a1c565b60405161025a9190613e60565b60405180910390f35b34801561026f57600080fd5b50610278610afe565b6040516102859190613e9d565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b091906135ed565b610b90565b6040516102c29190613dd0565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906132a6565b610c15565b005b34801561030057600080fd5b5061031b600480360381019061031691906132e2565b610d2d565b005b34801561032957600080fd5b50610344600480360381019061033f919061351e565b610dc6565b005b34801561035257600080fd5b5061036d600480360381019061036891906131a0565b610e46565b005b34801561037b57600080fd5b50610396600480360381019061039191906135ed565b610ea6565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906131a0565b610ff4565b005b3480156103cd57600080fd5b506103e860048036038101906103e3919061335d565b611014565b005b3480156103f657600080fd5b506103ff6110aa565b60405161040c9190613e60565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906135ed565b6110bd565b6040516104499190613dd0565b60405180910390f35b61046c60048036038101906104679190613652565b61116f565b005b6104886004803603810190610483919061367b565b6112b3565b005b34801561049657600080fd5b506104b160048036038101906104ac91906130ff565b6113cb565b6040516104be919061437e565b60405180910390f35b3480156104d357600080fd5b506104dc611483565b005b3480156104ea57600080fd5b506104f361150b565b604051610500919061437e565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061339e565b611511565b60405161053d9190613e7b565b60405180910390f35b34801561055257600080fd5b5061055b6115b1565b604051610568919061437e565b60405180910390f35b34801561057d57600080fd5b506105866115b7565b6040516105939190613dd0565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be919061341f565b6115e0565b6040516105d1929190614399565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906135ed565b611634565b005b34801561060f57600080fd5b506106186116ba565b6040516106259190613e9d565b60405180910390f35b34801561063a57600080fd5b506106556004803603810190610650919061326a565b61174c565b005b34801561066357600080fd5b5061066c611762565b6040516106799190613dd0565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131ef565b611788565b005b3480156106b757600080fd5b506106d260048036038101906106cd91906135ed565b6117ea565b6040516106df9190613e9d565b60405180910390f35b61070260048036038101906106fd91906135b1565b611891565b005b61071e60048036038101906107199190613486565b611b84565b005b34801561072c57600080fd5b5061074760048036038101906107429190613164565b611d24565b6040516107549190613e60565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f91906133c7565b611db8565b005b34801561079257600080fd5b506107ad60048036038101906107a891906130ff565b611e64565b005b3480156107bb57600080fd5b506107c4611f5c565b6040516107d1919061437e565b60405180910390f35b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461083457600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461085a90614668565b905083511480156108a05750600960008561ffff1661ffff16815260200190815260200160002060405161088e9190613d54565b60405180910390208380519060200120145b6108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d6906140ff565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b815260040161091e94939291906142b5565b600060405180830381600087803b15801561093857600080fd5b505af1925050508015610949575060015b610a15576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516109939190613d3d565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051610a0894939291906142b5565b60405180910390a1610a16565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af75750610af682611f62565b5b9050919050565b606060018054610b0d90614668565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3990614668565b8015610b865780601f10610b5b57610100808354040283529160200191610b86565b820191906000526020600020905b815481529060010190602001808311610b6957829003601f168201915b5050505050905090565b6000610b9b82611fcc565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906140bf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c20826110bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c889061419f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb0612038565b73ffffffffffffffffffffffffffffffffffffffff161480610cdf5750610cde81610cd9612038565b611d24565b5b610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d159061401f565b60405180910390fd5b610d288383612040565b505050565b610d35612038565b73ffffffffffffffffffffffffffffffffffffffff16610d536115b7565b73ffffffffffffffffffffffffffffffffffffffff1614610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906140df565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061407f565b60405180910390fd5b610e40848484846120f9565b50505050565b610e57610e51612038565b82612126565b610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906141bf565b60405180910390fd5b610ea1838383612204565b505050565b610eae612038565b73ffffffffffffffffffffffffffffffffffffffff16610ecc6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19906140df565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f6a90613d8f565b60006040518083038185875af1925050503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b5050905080610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061417f565b60405180910390fd5b5050565b61100f83838360405180602001604052806000815250611788565b505050565b61101c612038565b73ffffffffffffffffffffffffffffffffffffffff1661103a6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611090576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611087906140df565b60405180910390fd5b80600b90805190602001906110a6929190612dea565b5050565b600e60009054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d9061405f565b60405180910390fd5b80915050919050565b600e60009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b69061411f565b60405180910390fd5b60038160ff1610611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90613fff565b60405180910390fd5b600f54600d546112159190614533565b8160ff16600c5461122691906144ac565b1115611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613fbf565b60405180910390fd5b61128533600c6000815461127a906146cb565b919050819055612460565b60028160ff1614156112b0576112af33600c600081546112a4906146cb565b919050819055612460565b5b50565b6112bb612038565b73ffffffffffffffffffffffffffffffffffffffff166112d96115b7565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611326906140df565b60405180910390fd5b600d548260ff16600c5461134391906144ac565b1115611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613fbf565b60405180910390fd5b6000600190505b8260ff1681116113c6576113b382600c600081546113a8906146cb565b919050819055612460565b80806113be906146cb565b91505061138b565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061403f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61148b612038565b73ffffffffffffffffffffffffffffffffffffffff166114a96115b7565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906140df565b60405180910390fd5b611509600061247e565b565b600d5481565b6009602052806000526040600020600091509050805461153090614668565b80601f016020809104026020016040519081016040528092919081815260200182805461155c90614668565b80156115a95780601f1061157e576101008083540402835291602001916115a9565b820191906000526020600020905b81548152906001019060200180831161158c57829003601f168201915b505050505081565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b61163c612038565b73ffffffffffffffffffffffffffffffffffffffff1661165a6115b7565b73ffffffffffffffffffffffffffffffffffffffff16146116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a7906140df565b60405180910390fd5b8060108190555050565b6060600280546116c990614668565b80601f01602080910402602001604051908101604052809291908181526020018280546116f590614668565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b5050505050905090565b61175e611757612038565b8383612542565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611799611793612038565b83612126565b6117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906141bf565b60405180910390fd5b6117e4848484846126af565b50505050565b60606117f582611fcc565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061415f565b60405180910390fd5b600061183e61270b565b9050600081511161185e5760405180602001604052806000815250611889565b806118688461279d565b604051602001611879929190613d6b565b6040516020818303038152906040525b915050919050565b61189a816110bd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90613f9f565b60405180910390fd5b6000600960008461ffff1661ffff168152602001908152602001600020805461192f90614668565b905011611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613f5f565b60405180910390fd5b61197a8161294a565b6000338260405160200161198f929190613e37565b60405160208183030381529060405290506000600190506000816010546040516020016119bd929190613da4565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b8152600401611a349594939291906141ff565b604080518083038186803b158015611a4b57600080fd5b505afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a839190613616565b50905080341015611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090613ebf565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b8152600401611b4a96959493929190614308565b6000604051808303818588803b158015611b6357600080fd5b505af1158015611b77573d6000803e3d6000fd5b5050505050505050505050565b6000600860008761ffff1661ffff16815260200190815260200160002085604051611baf9190613d3d565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b906141df565b60405180910390fd5b806000015483839050148015611c54575080600101548383604051611c4a929190613d24565b6040518091039020145b611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613f7f565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401611cea959493929190614260565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dc0612038565b73ffffffffffffffffffffffffffffffffffffffff16611dde6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906140df565b60405180910390fd5b8181600960008661ffff1661ffff1681526020019081526020016000209190611e5e929190612e70565b50505050565b611e6c612038565b73ffffffffffffffffffffffffffffffffffffffff16611e8a6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906140df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790613eff565b60405180910390fd5b611f598161247e565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120b3836110bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906121109190613128565b9150915061211e8282612460565b505050505050565b600061213182611fcc565b612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790613fdf565b60405180910390fd5b600061217b836110bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121ea57508373ffffffffffffffffffffffffffffffffffffffff166121d284610b90565b73ffffffffffffffffffffffffffffffffffffffff16145b806121fb57506121fa8185611d24565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612224826110bd565b73ffffffffffffffffffffffffffffffffffffffff161461227a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122719061413f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613f1f565b60405180910390fd5b6122f5838383612a5b565b612300600082612040565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123509190614533565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a791906144ac565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61247a828260405180602001604052806000815250612a60565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890613f3f565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126a29190613e60565b60405180910390a3505050565b6126ba848484612204565b6126c684848484612abb565b612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90613edf565b60405180910390fd5b50505050565b6060600b805461271a90614668565b80601f016020809104026020016040519081016040528092919081815260200182805461274690614668565b80156127935780601f1061276857610100808354040283529160200191612793565b820191906000526020600020905b81548152906001019060200180831161277657829003601f168201915b5050505050905090565b606060008214156127e5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b60008214612817578080612800906146cb565b915050600a826128109190614502565b91506127ed565b60008167ffffffffffffffff811115612859577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561288b5781602001600182028036833780820191505090505b5090505b6000851461293e576001826128a49190614533565b9150600a856128b39190614730565b60306128bf91906144ac565b60f81b8183815181106128fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129379190614502565b945061288f565b8093505050505b919050565b6000612955826110bd565b905061296381600084612a5b565b61296e600083612040565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129be9190614533565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b612a6a8383612c52565b612a776000848484612abb565b612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad90613edf565b60405180910390fd5b505050565b6000612adc8473ffffffffffffffffffffffffffffffffffffffff16612dd7565b15612c45578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b05612038565b8786866040518563ffffffff1660e01b8152600401612b279493929190613deb565b602060405180830381600087803b158015612b4157600080fd5b505af1925050508015612b7257506040513d601f19601f82011682018060405250810190612b6f9190613334565b60015b612bf5573d8060008114612ba2576040519150601f19603f3d011682016040523d82523d6000602084013e612ba7565b606091505b50600081511415612bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be490613edf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c4a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb99061409f565b60405180910390fd5b612cce60008383612a5b565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d1e91906144ac565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612df690614668565b90600052602060002090601f016020900481019282612e185760008555612e5f565b82601f10612e3157805160ff1916838001178555612e5f565b82800160010185558215612e5f579182015b82811115612e5e578251825591602001919060010190612e43565b5b509050612e6c9190612ef6565b5090565b828054612e7c90614668565b90600052602060002090601f016020900481019282612e9e5760008555612ee5565b82601f10612eb757803560ff1916838001178555612ee5565b82800160010185558215612ee5579182015b82811115612ee4578235825591602001919060010190612ec9565b5b509050612ef29190612ef6565b5090565b5b80821115612f0f576000816000905550600101612ef7565b5090565b6000612f26612f21846143e7565b6143c2565b905082815260208101848484011115612f3e57600080fd5b612f49848285614626565b509392505050565b6000612f64612f5f84614418565b6143c2565b905082815260208101848484011115612f7c57600080fd5b612f87848285614626565b509392505050565b600081359050612f9e81614f3a565b92915050565b600081519050612fb381614f51565b92915050565b600081359050612fc881614f68565b92915050565b600081359050612fdd81614f7f565b92915050565b600081519050612ff281614f7f565b92915050565b60008083601f84011261300a57600080fd5b8235905067ffffffffffffffff81111561302357600080fd5b60208301915083600182028301111561303b57600080fd5b9250929050565b600082601f83011261305357600080fd5b8135613063848260208601612f13565b91505092915050565b600082601f83011261307d57600080fd5b813561308d848260208601612f51565b91505092915050565b6000813590506130a581614f96565b92915050565b6000813590506130ba81614fad565b92915050565b6000815190506130cf81614fad565b92915050565b6000813590506130e481614fc4565b92915050565b6000813590506130f981614fdb565b92915050565b60006020828403121561311157600080fd5b600061311f84828501612f8f565b91505092915050565b6000806040838503121561313b57600080fd5b600061314985828601612fa4565b925050602061315a858286016130c0565b9150509250929050565b6000806040838503121561317757600080fd5b600061318585828601612f8f565b925050602061319685828601612f8f565b9150509250929050565b6000806000606084860312156131b557600080fd5b60006131c386828701612f8f565b93505060206131d486828701612f8f565b92505060406131e5868287016130ab565b9150509250925092565b6000806000806080858703121561320557600080fd5b600061321387828801612f8f565b945050602061322487828801612f8f565b9350506040613235878288016130ab565b925050606085013567ffffffffffffffff81111561325257600080fd5b61325e87828801613042565b91505092959194509250565b6000806040838503121561327d57600080fd5b600061328b85828601612f8f565b925050602061329c85828601612fb9565b9150509250929050565b600080604083850312156132b957600080fd5b60006132c785828601612f8f565b92505060206132d8858286016130ab565b9150509250929050565b6000602082840312156132f457600080fd5b600061330284828501612fb9565b91505092915050565b60006020828403121561331d57600080fd5b600061332b84828501612fce565b91505092915050565b60006020828403121561334657600080fd5b600061335484828501612fe3565b91505092915050565b60006020828403121561336f57600080fd5b600082013567ffffffffffffffff81111561338957600080fd5b6133958482850161306c565b91505092915050565b6000602082840312156133b057600080fd5b60006133be84828501613096565b91505092915050565b6000806000604084860312156133dc57600080fd5b60006133ea86828701613096565b935050602084013567ffffffffffffffff81111561340757600080fd5b61341386828701612ff8565b92509250509250925092565b60008060006060848603121561343457600080fd5b600061344286828701613096565b935050602084013567ffffffffffffffff81111561345f57600080fd5b61346b86828701613042565b925050604061347c868287016130ab565b9150509250925092565b60008060008060006080868803121561349e57600080fd5b60006134ac88828901613096565b955050602086013567ffffffffffffffff8111156134c957600080fd5b6134d588828901613042565b94505060406134e6888289016130d5565b935050606086013567ffffffffffffffff81111561350357600080fd5b61350f88828901612ff8565b92509250509295509295909350565b6000806000806080858703121561353457600080fd5b600061354287828801613096565b945050602085013567ffffffffffffffff81111561355f57600080fd5b61356b87828801613042565b935050604061357c878288016130d5565b925050606085013567ffffffffffffffff81111561359957600080fd5b6135a587828801613042565b91505092959194509250565b600080604083850312156135c457600080fd5b60006135d285828601613096565b92505060206135e3858286016130ab565b9150509250929050565b6000602082840312156135ff57600080fd5b600061360d848285016130ab565b91505092915050565b6000806040838503121561362957600080fd5b6000613637858286016130c0565b9250506020613648858286016130c0565b9150509250929050565b60006020828403121561366457600080fd5b6000613672848285016130ea565b91505092915050565b6000806040838503121561368e57600080fd5b600061369c858286016130ea565b92505060206136ad85828601612f8f565b9150509250929050565b6136c081614579565b82525050565b6136cf81614567565b82525050565b6136de8161458b565b82525050565b6136ed81614597565b82525050565b60006136ff8385614474565b935061370c838584614626565b6137158361481d565b840190509392505050565b600061372c8385614485565b9350613739838584614626565b82840190509392505050565b60006137508261445e565b61375a8185614474565b935061376a818560208601614635565b6137738161481d565b840191505092915050565b60006137898261445e565b6137938185614485565b93506137a3818560208601614635565b80840191505092915050565b600081546137bc81614668565b6137c68186614474565b945060018216600081146137e157600181146137f357613826565b60ff1983168652602086019350613826565b6137fc85614449565b60005b8381101561381e578154818901526001820191506020810190506137ff565b808801955050505b50505092915050565b6000815461383c81614668565b6138468186614485565b945060018216600081146138615760018114613872576138a5565b60ff198316865281860193506138a5565b61387b85614449565b60005b8381101561389d5781548189015260018201915060208101905061387e565b838801955050505b50505092915050565b60006138b982614469565b6138c38185614490565b93506138d3818560208601614635565b6138dc8161481d565b840191505092915050565b60006138f282614469565b6138fc81856144a1565b935061390c818560208601614635565b80840191505092915050565b6000613925604383614490565b91506139308261483b565b606082019050919050565b6000613948603283614490565b9150613953826148b0565b604082019050919050565b600061396b602683614490565b9150613976826148ff565b604082019050919050565b600061398e602483614490565b91506139998261494e565b604082019050919050565b60006139b1601983614490565b91506139bc8261499d565b602082019050919050565b60006139d4602e83614490565b91506139df826149c6565b604082019050919050565b60006139f7601a83614490565b9150613a0282614a15565b602082019050919050565b6000613a1a602283614490565b9150613a2582614a3e565b604082019050919050565b6000613a3d601383614490565b9150613a4882614a8d565b602082019050919050565b6000613a60602c83614490565b9150613a6b82614ab6565b604082019050919050565b6000613a83601a83614490565b9150613a8e82614b05565b602082019050919050565b6000613aa6603883614490565b9150613ab182614b2e565b604082019050919050565b6000613ac9602a83614490565b9150613ad482614b7d565b604082019050919050565b6000613aec602983614490565b9150613af782614bcc565b604082019050919050565b6000613b0f602b83614490565b9150613b1a82614c1b565b604082019050919050565b6000613b32602083614490565b9150613b3d82614c6a565b602082019050919050565b6000613b55602c83614490565b9150613b6082614c93565b604082019050919050565b6000613b78602083614490565b9150613b8382614ce2565b602082019050919050565b6000613b9b603483614490565b9150613ba682614d0b565b604082019050919050565b6000613bbe601783614490565b9150613bc982614d5a565b602082019050919050565b6000613be1602983614490565b9150613bec82614d83565b604082019050919050565b6000613c04602f83614490565b9150613c0f82614dd2565b604082019050919050565b6000613c27601883614490565b9150613c3282614e21565b602082019050919050565b6000613c4a602183614490565b9150613c5582614e4a565b604082019050919050565b6000613c6d600083614485565b9150613c7882614e99565b600082019050919050565b6000613c90603183614490565b9150613c9b82614e9c565b604082019050919050565b6000613cb3602683614490565b9150613cbe82614eeb565b604082019050919050565b613cd2816145cd565b82525050565b613ce9613ce4826145cd565b614714565b82525050565b613cf8816145fb565b82525050565b613d0f613d0a826145fb565b614726565b82525050565b613d1e81614605565b82525050565b6000613d31828486613720565b91508190509392505050565b6000613d49828461377e565b915081905092915050565b6000613d60828461382f565b915081905092915050565b6000613d7782856138e7565b9150613d8382846138e7565b91508190509392505050565b6000613d9a82613c60565b9150819050919050565b6000613db08285613cd8565b600282019150613dc08284613cfe565b6020820191508190509392505050565b6000602082019050613de560008301846136c6565b92915050565b6000608082019050613e0060008301876136c6565b613e0d60208301866136c6565b613e1a6040830185613cef565b8181036060830152613e2c8184613745565b905095945050505050565b6000604082019050613e4c60008301856136c6565b613e596020830184613cef565b9392505050565b6000602082019050613e7560008301846136d5565b92915050565b60006020820190508181036000830152613e958184613745565b905092915050565b60006020820190508181036000830152613eb781846138ae565b905092915050565b60006020820190508181036000830152613ed881613918565b9050919050565b60006020820190508181036000830152613ef88161393b565b9050919050565b60006020820190508181036000830152613f188161395e565b9050919050565b60006020820190508181036000830152613f3881613981565b9050919050565b60006020820190508181036000830152613f58816139a4565b9050919050565b60006020820190508181036000830152613f78816139c7565b9050919050565b60006020820190508181036000830152613f98816139ea565b9050919050565b60006020820190508181036000830152613fb881613a0d565b9050919050565b60006020820190508181036000830152613fd881613a30565b9050919050565b60006020820190508181036000830152613ff881613a53565b9050919050565b6000602082019050818103600083015261401881613a76565b9050919050565b6000602082019050818103600083015261403881613a99565b9050919050565b6000602082019050818103600083015261405881613abc565b9050919050565b6000602082019050818103600083015261407881613adf565b9050919050565b6000602082019050818103600083015261409881613b02565b9050919050565b600060208201905081810360008301526140b881613b25565b9050919050565b600060208201905081810360008301526140d881613b48565b9050919050565b600060208201905081810360008301526140f881613b6b565b9050919050565b6000602082019050818103600083015261411881613b8e565b9050919050565b6000602082019050818103600083015261413881613bb1565b9050919050565b6000602082019050818103600083015261415881613bd4565b9050919050565b6000602082019050818103600083015261417881613bf7565b9050919050565b6000602082019050818103600083015261419881613c1a565b9050919050565b600060208201905081810360008301526141b881613c3d565b9050919050565b600060208201905081810360008301526141d881613c83565b9050919050565b600060208201905081810360008301526141f881613ca6565b9050919050565b600060a0820190506142146000830188613cc9565b61422160208301876136c6565b81810360408301526142338186613745565b905061424260608301856136d5565b81810360808301526142548184613745565b90509695505050505050565b60006080820190506142756000830188613cc9565b81810360208301526142878187613745565b90506142966040830186613d15565b81810360608301526142a98184866136f3565b90509695505050505050565b60006080820190506142ca6000830187613cc9565b81810360208301526142dc8186613745565b90506142eb6040830185613d15565b81810360608301526142fd8184613745565b905095945050505050565b600060c08201905061431d6000830189613cc9565b818103602083015261432f81886137af565b905081810360408301526143438187613745565b905061435260608301866136b7565b61435f60808301856136c6565b81810360a08301526143718184613745565b9050979650505050505050565b60006020820190506143936000830184613cef565b92915050565b60006040820190506143ae6000830185613cef565b6143bb60208301846136e4565b9392505050565b60006143cc6143dd565b90506143d8828261469a565b919050565b6000604051905090565b600067ffffffffffffffff821115614402576144016147ee565b5b61440b8261481d565b9050602081019050919050565b600067ffffffffffffffff821115614433576144326147ee565b5b61443c8261481d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144b7826145fb565b91506144c2836145fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144f7576144f6614761565b5b828201905092915050565b600061450d826145fb565b9150614518836145fb565b92508261452857614527614790565b5b828204905092915050565b600061453e826145fb565b9150614549836145fb565b92508282101561455c5761455b614761565b5b828203905092915050565b6000614572826145db565b9050919050565b6000614584826145db565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614653578082015181840152602081019050614638565b83811115614662576000848401525b50505050565b6000600282049050600182168061468057607f821691505b60208210811415614694576146936147bf565b5b50919050565b6146a38261481d565b810181811067ffffffffffffffff821117156146c2576146c16147ee565b5b80604052505050565b60006146d6826145fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561470957614708614761565b5b600182019050919050565b600061471f8261482e565b9050919050565b6000819050919050565b600061473b826145fb565b9150614746836145fb565b92508261475657614755614790565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b7f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560008201527f73736167654665652e2053656e642067617320666f72206d657373616765206660208201527f6565730000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5468697320636861696e2069732063757272656e746c7920756e617661696c6160008201527f626c6520666f722074726176656c000000000000000000000000000000000000602082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320737570706c7900000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d61782032204e46547320706572207472616e73616374696f6e000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b614f4381614567565b8114614f4e57600080fd5b50565b614f5a81614579565b8114614f6557600080fd5b50565b614f718161458b565b8114614f7c57600080fd5b50565b614f88816145a1565b8114614f9357600080fd5b50565b614f9f816145cd565b8114614faa57600080fd5b50565b614fb6816145fb565b8114614fc157600080fd5b50565b614fcd81614605565b8114614fd857600080fd5b50565b614fe481614619565b8114614fef57600080fd5b5056fea26469706673582212208d9a39d0f918e9d813e4d052651501e7cd3b9605bad63131f15c2f481064f5d664736f6c63430008010033000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b100000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6d657461646174612e61736865732d6f662d6c696768742e6172742f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101f85760003560e01c80637501f7411161010d578063b2bdfa7b116100a0578063d1deba1f1161006f578063d1deba1f14610704578063e985e9c514610720578063eb8d72b71461075d578063f2fde38b14610786578063fd8024f9146107af576101f8565b8063b2bdfa7b14610657578063b88d4fde14610682578063c87b56dd146106ab578063cf89fa03146106e8576101f8565b80638ee74912116100dc5780638ee749121461059c578063943fb872146105da57806395d89b4114610603578063a22cb4651461062e576101f8565b80637501f741146104de5780637533d7881461050957806375794a3c146105465780638da5cb5b14610571576101f8565b80632e1a7d4d116101905780636352211e1161015f5780636352211e146104155780636ecd2306146104525780636eed53631461046e57806370a082311461048a578063715018a6146104c7576101f8565b80632e1a7d4d1461036f57806342842e0e1461039857806355f804b3146103c15780635c975abb146103ea576101f8565b8063095ea7b3116101cc578063095ea7b3146102cb57806316c38b3c146102f45780631c37a8221461031d57806323b872dd14610346576101f8565b80621d3567146101fd57806301ffc9a71461022657806306fdde0314610263578063081812fc1461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f919061351e565b6107da565b005b34801561023257600080fd5b5061024d6004803603810190610248919061330b565b610a1c565b60405161025a9190613e60565b60405180910390f35b34801561026f57600080fd5b50610278610afe565b6040516102859190613e9d565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b091906135ed565b610b90565b6040516102c29190613dd0565b60405180910390f35b3480156102d757600080fd5b506102f260048036038101906102ed91906132a6565b610c15565b005b34801561030057600080fd5b5061031b600480360381019061031691906132e2565b610d2d565b005b34801561032957600080fd5b50610344600480360381019061033f919061351e565b610dc6565b005b34801561035257600080fd5b5061036d600480360381019061036891906131a0565b610e46565b005b34801561037b57600080fd5b50610396600480360381019061039191906135ed565b610ea6565b005b3480156103a457600080fd5b506103bf60048036038101906103ba91906131a0565b610ff4565b005b3480156103cd57600080fd5b506103e860048036038101906103e3919061335d565b611014565b005b3480156103f657600080fd5b506103ff6110aa565b60405161040c9190613e60565b60405180910390f35b34801561042157600080fd5b5061043c600480360381019061043791906135ed565b6110bd565b6040516104499190613dd0565b60405180910390f35b61046c60048036038101906104679190613652565b61116f565b005b6104886004803603810190610483919061367b565b6112b3565b005b34801561049657600080fd5b506104b160048036038101906104ac91906130ff565b6113cb565b6040516104be919061437e565b60405180910390f35b3480156104d357600080fd5b506104dc611483565b005b3480156104ea57600080fd5b506104f361150b565b604051610500919061437e565b60405180910390f35b34801561051557600080fd5b50610530600480360381019061052b919061339e565b611511565b60405161053d9190613e7b565b60405180910390f35b34801561055257600080fd5b5061055b6115b1565b604051610568919061437e565b60405180910390f35b34801561057d57600080fd5b506105866115b7565b6040516105939190613dd0565b60405180910390f35b3480156105a857600080fd5b506105c360048036038101906105be919061341f565b6115e0565b6040516105d1929190614399565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc91906135ed565b611634565b005b34801561060f57600080fd5b506106186116ba565b6040516106259190613e9d565b60405180910390f35b34801561063a57600080fd5b506106556004803603810190610650919061326a565b61174c565b005b34801561066357600080fd5b5061066c611762565b6040516106799190613dd0565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131ef565b611788565b005b3480156106b757600080fd5b506106d260048036038101906106cd91906135ed565b6117ea565b6040516106df9190613e9d565b60405180910390f35b61070260048036038101906106fd91906135b1565b611891565b005b61071e60048036038101906107199190613486565b611b84565b005b34801561072c57600080fd5b5061074760048036038101906107429190613164565b611d24565b6040516107549190613e60565b60405180910390f35b34801561076957600080fd5b50610784600480360381019061077f91906133c7565b611db8565b005b34801561079257600080fd5b506107ad60048036038101906107a891906130ff565b611e64565b005b3480156107bb57600080fd5b506107c4611f5c565b6040516107d1919061437e565b60405180910390f35b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461083457600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461085a90614668565b905083511480156108a05750600960008561ffff1661ffff16815260200190815260200160002060405161088e9190613d54565b60405180910390208380519060200120145b6108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d6906140ff565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b815260040161091e94939291906142b5565b600060405180830381600087803b15801561093857600080fd5b505af1925050508015610949575060015b610a15576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff168152602001908152602001600020846040516109939190613d3d565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d84848484604051610a0894939291906142b5565b60405180910390a1610a16565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610af75750610af682611f62565b5b9050919050565b606060018054610b0d90614668565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3990614668565b8015610b865780601f10610b5b57610100808354040283529160200191610b86565b820191906000526020600020905b815481529060010190602001808311610b6957829003601f168201915b5050505050905090565b6000610b9b82611fcc565b610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906140bf565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c20826110bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c889061419f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cb0612038565b73ffffffffffffffffffffffffffffffffffffffff161480610cdf5750610cde81610cd9612038565b611d24565b5b610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d159061401f565b60405180910390fd5b610d288383612040565b505050565b610d35612038565b73ffffffffffffffffffffffffffffffffffffffff16610d536115b7565b73ffffffffffffffffffffffffffffffffffffffff1614610da9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da0906140df565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b9061407f565b60405180910390fd5b610e40848484846120f9565b50505050565b610e57610e51612038565b82612126565b610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906141bf565b60405180910390fd5b610ea1838383612204565b505050565b610eae612038565b73ffffffffffffffffffffffffffffffffffffffff16610ecc6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f19906140df565b60405180910390fd5b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1682604051610f6a90613d8f565b60006040518083038185875af1925050503d8060008114610fa7576040519150601f19603f3d011682016040523d82523d6000602084013e610fac565b606091505b5050905080610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061417f565b60405180910390fd5b5050565b61100f83838360405180602001604052806000815250611788565b505050565b61101c612038565b73ffffffffffffffffffffffffffffffffffffffff1661103a6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611090576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611087906140df565b60405180910390fd5b80600b90805190602001906110a6929190612dea565b5050565b600e60009054906101000a900460ff1681565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d9061405f565b60405180910390fd5b80915050919050565b600e60009054906101000a900460ff16156111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b69061411f565b60405180910390fd5b60038160ff1610611205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fc90613fff565b60405180910390fd5b600f54600d546112159190614533565b8160ff16600c5461122691906144ac565b1115611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613fbf565b60405180910390fd5b61128533600c6000815461127a906146cb565b919050819055612460565b60028160ff1614156112b0576112af33600c600081546112a4906146cb565b919050819055612460565b5b50565b6112bb612038565b73ffffffffffffffffffffffffffffffffffffffff166112d96115b7565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611326906140df565b60405180910390fd5b600d548260ff16600c5461134391906144ac565b1115611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137b90613fbf565b60405180910390fd5b6000600190505b8260ff1681116113c6576113b382600c600081546113a8906146cb565b919050819055612460565b80806113be906146cb565b91505061138b565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114339061403f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61148b612038565b73ffffffffffffffffffffffffffffffffffffffff166114a96115b7565b73ffffffffffffffffffffffffffffffffffffffff16146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906140df565b60405180910390fd5b611509600061247e565b565b600d5481565b6009602052806000526040600020600091509050805461153090614668565b80601f016020809104026020016040519081016040528092919081815260200182805461155c90614668565b80156115a95780601f1061157e576101008083540402835291602001916115a9565b820191906000526020600020905b81548152906001019060200180831161158c57829003601f168201915b505050505081565b600c5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b61163c612038565b73ffffffffffffffffffffffffffffffffffffffff1661165a6115b7565b73ffffffffffffffffffffffffffffffffffffffff16146116b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a7906140df565b60405180910390fd5b8060108190555050565b6060600280546116c990614668565b80601f01602080910402602001604051908101604052809291908181526020018280546116f590614668565b80156117425780601f1061171757610100808354040283529160200191611742565b820191906000526020600020905b81548152906001019060200180831161172557829003601f168201915b5050505050905090565b61175e611757612038565b8383612542565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611799611793612038565b83612126565b6117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf906141bf565b60405180910390fd5b6117e4848484846126af565b50505050565b60606117f582611fcc565b611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b9061415f565b60405180910390fd5b600061183e61270b565b9050600081511161185e5760405180602001604052806000815250611889565b806118688461279d565b604051602001611879929190613d6b565b6040516020818303038152906040525b915050919050565b61189a816110bd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fe90613f9f565b60405180910390fd5b6000600960008461ffff1661ffff168152602001908152602001600020805461192f90614668565b905011611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613f5f565b60405180910390fd5b61197a8161294a565b6000338260405160200161198f929190613e37565b60405160208183030381529060405290506000600190506000816010546040516020016119bd929190613da4565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108730876000876040518663ffffffff1660e01b8152600401611a349594939291906141ff565b604080518083038186803b158015611a4b57600080fd5b505afa158015611a5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a839190613616565b50905080341015611ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac090613ebf565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003488600960008b61ffff1661ffff16815260200190815260200160002088336000896040518863ffffffff1660e01b8152600401611b4a96959493929190614308565b6000604051808303818588803b158015611b6357600080fd5b505af1158015611b77573d6000803e3d6000fd5b5050505050505050505050565b6000600860008761ffff1661ffff16815260200190815260200160002085604051611baf9190613d3d565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415611c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1b906141df565b60405180910390fd5b806000015483839050148015611c54575080600101548383604051611c4a929190613d24565b6040518091039020145b611c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8a90613f7f565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401611cea959493929190614260565b600060405180830381600087803b158015611d0457600080fd5b505af1158015611d18573d6000803e3d6000fd5b50505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dc0612038565b73ffffffffffffffffffffffffffffffffffffffff16611dde6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906140df565b60405180910390fd5b8181600960008661ffff1661ffff1681526020019081526020016000209190611e5e929190612e70565b50505050565b611e6c612038565b73ffffffffffffffffffffffffffffffffffffffff16611e8a6115b7565b73ffffffffffffffffffffffffffffffffffffffff1614611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906140df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4790613eff565b60405180910390fd5b611f598161247e565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166120b3836110bd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906121109190613128565b9150915061211e8282612460565b505050505050565b600061213182611fcc565b612170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216790613fdf565b60405180910390fd5b600061217b836110bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121ea57508373ffffffffffffffffffffffffffffffffffffffff166121d284610b90565b73ffffffffffffffffffffffffffffffffffffffff16145b806121fb57506121fa8185611d24565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612224826110bd565b73ffffffffffffffffffffffffffffffffffffffff161461227a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122719061413f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e190613f1f565b60405180910390fd5b6122f5838383612a5b565b612300600082612040565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123509190614533565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123a791906144ac565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61247a828260405180602001604052806000815250612a60565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a890613f3f565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516126a29190613e60565b60405180910390a3505050565b6126ba848484612204565b6126c684848484612abb565b612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90613edf565b60405180910390fd5b50505050565b6060600b805461271a90614668565b80601f016020809104026020016040519081016040528092919081815260200182805461274690614668565b80156127935780601f1061276857610100808354040283529160200191612793565b820191906000526020600020905b81548152906001019060200180831161277657829003601f168201915b5050505050905090565b606060008214156127e5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b60008214612817578080612800906146cb565b915050600a826128109190614502565b91506127ed565b60008167ffffffffffffffff811115612859577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561288b5781602001600182028036833780820191505090505b5090505b6000851461293e576001826128a49190614533565b9150600a856128b39190614730565b60306128bf91906144ac565b60f81b8183815181106128fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129379190614502565b945061288f565b8093505050505b919050565b6000612955826110bd565b905061296381600084612a5b565b61296e600083612040565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129be9190614533565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b612a6a8383612c52565b612a776000848484612abb565b612ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aad90613edf565b60405180910390fd5b505050565b6000612adc8473ffffffffffffffffffffffffffffffffffffffff16612dd7565b15612c45578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b05612038565b8786866040518563ffffffff1660e01b8152600401612b279493929190613deb565b602060405180830381600087803b158015612b4157600080fd5b505af1925050508015612b7257506040513d601f19601f82011682018060405250810190612b6f9190613334565b60015b612bf5573d8060008114612ba2576040519150601f19603f3d011682016040523d82523d6000602084013e612ba7565b606091505b50600081511415612bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be490613edf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c4a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cb99061409f565b60405180910390fd5b612cce60008383612a5b565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d1e91906144ac565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612df690614668565b90600052602060002090601f016020900481019282612e185760008555612e5f565b82601f10612e3157805160ff1916838001178555612e5f565b82800160010185558215612e5f579182015b82811115612e5e578251825591602001919060010190612e43565b5b509050612e6c9190612ef6565b5090565b828054612e7c90614668565b90600052602060002090601f016020900481019282612e9e5760008555612ee5565b82601f10612eb757803560ff1916838001178555612ee5565b82800160010185558215612ee5579182015b82811115612ee4578235825591602001919060010190612ec9565b5b509050612ef29190612ef6565b5090565b5b80821115612f0f576000816000905550600101612ef7565b5090565b6000612f26612f21846143e7565b6143c2565b905082815260208101848484011115612f3e57600080fd5b612f49848285614626565b509392505050565b6000612f64612f5f84614418565b6143c2565b905082815260208101848484011115612f7c57600080fd5b612f87848285614626565b509392505050565b600081359050612f9e81614f3a565b92915050565b600081519050612fb381614f51565b92915050565b600081359050612fc881614f68565b92915050565b600081359050612fdd81614f7f565b92915050565b600081519050612ff281614f7f565b92915050565b60008083601f84011261300a57600080fd5b8235905067ffffffffffffffff81111561302357600080fd5b60208301915083600182028301111561303b57600080fd5b9250929050565b600082601f83011261305357600080fd5b8135613063848260208601612f13565b91505092915050565b600082601f83011261307d57600080fd5b813561308d848260208601612f51565b91505092915050565b6000813590506130a581614f96565b92915050565b6000813590506130ba81614fad565b92915050565b6000815190506130cf81614fad565b92915050565b6000813590506130e481614fc4565b92915050565b6000813590506130f981614fdb565b92915050565b60006020828403121561311157600080fd5b600061311f84828501612f8f565b91505092915050565b6000806040838503121561313b57600080fd5b600061314985828601612fa4565b925050602061315a858286016130c0565b9150509250929050565b6000806040838503121561317757600080fd5b600061318585828601612f8f565b925050602061319685828601612f8f565b9150509250929050565b6000806000606084860312156131b557600080fd5b60006131c386828701612f8f565b93505060206131d486828701612f8f565b92505060406131e5868287016130ab565b9150509250925092565b6000806000806080858703121561320557600080fd5b600061321387828801612f8f565b945050602061322487828801612f8f565b9350506040613235878288016130ab565b925050606085013567ffffffffffffffff81111561325257600080fd5b61325e87828801613042565b91505092959194509250565b6000806040838503121561327d57600080fd5b600061328b85828601612f8f565b925050602061329c85828601612fb9565b9150509250929050565b600080604083850312156132b957600080fd5b60006132c785828601612f8f565b92505060206132d8858286016130ab565b9150509250929050565b6000602082840312156132f457600080fd5b600061330284828501612fb9565b91505092915050565b60006020828403121561331d57600080fd5b600061332b84828501612fce565b91505092915050565b60006020828403121561334657600080fd5b600061335484828501612fe3565b91505092915050565b60006020828403121561336f57600080fd5b600082013567ffffffffffffffff81111561338957600080fd5b6133958482850161306c565b91505092915050565b6000602082840312156133b057600080fd5b60006133be84828501613096565b91505092915050565b6000806000604084860312156133dc57600080fd5b60006133ea86828701613096565b935050602084013567ffffffffffffffff81111561340757600080fd5b61341386828701612ff8565b92509250509250925092565b60008060006060848603121561343457600080fd5b600061344286828701613096565b935050602084013567ffffffffffffffff81111561345f57600080fd5b61346b86828701613042565b925050604061347c868287016130ab565b9150509250925092565b60008060008060006080868803121561349e57600080fd5b60006134ac88828901613096565b955050602086013567ffffffffffffffff8111156134c957600080fd5b6134d588828901613042565b94505060406134e6888289016130d5565b935050606086013567ffffffffffffffff81111561350357600080fd5b61350f88828901612ff8565b92509250509295509295909350565b6000806000806080858703121561353457600080fd5b600061354287828801613096565b945050602085013567ffffffffffffffff81111561355f57600080fd5b61356b87828801613042565b935050604061357c878288016130d5565b925050606085013567ffffffffffffffff81111561359957600080fd5b6135a587828801613042565b91505092959194509250565b600080604083850312156135c457600080fd5b60006135d285828601613096565b92505060206135e3858286016130ab565b9150509250929050565b6000602082840312156135ff57600080fd5b600061360d848285016130ab565b91505092915050565b6000806040838503121561362957600080fd5b6000613637858286016130c0565b9250506020613648858286016130c0565b9150509250929050565b60006020828403121561366457600080fd5b6000613672848285016130ea565b91505092915050565b6000806040838503121561368e57600080fd5b600061369c858286016130ea565b92505060206136ad85828601612f8f565b9150509250929050565b6136c081614579565b82525050565b6136cf81614567565b82525050565b6136de8161458b565b82525050565b6136ed81614597565b82525050565b60006136ff8385614474565b935061370c838584614626565b6137158361481d565b840190509392505050565b600061372c8385614485565b9350613739838584614626565b82840190509392505050565b60006137508261445e565b61375a8185614474565b935061376a818560208601614635565b6137738161481d565b840191505092915050565b60006137898261445e565b6137938185614485565b93506137a3818560208601614635565b80840191505092915050565b600081546137bc81614668565b6137c68186614474565b945060018216600081146137e157600181146137f357613826565b60ff1983168652602086019350613826565b6137fc85614449565b60005b8381101561381e578154818901526001820191506020810190506137ff565b808801955050505b50505092915050565b6000815461383c81614668565b6138468186614485565b945060018216600081146138615760018114613872576138a5565b60ff198316865281860193506138a5565b61387b85614449565b60005b8381101561389d5781548189015260018201915060208101905061387e565b838801955050505b50505092915050565b60006138b982614469565b6138c38185614490565b93506138d3818560208601614635565b6138dc8161481d565b840191505092915050565b60006138f282614469565b6138fc81856144a1565b935061390c818560208601614635565b80840191505092915050565b6000613925604383614490565b91506139308261483b565b606082019050919050565b6000613948603283614490565b9150613953826148b0565b604082019050919050565b600061396b602683614490565b9150613976826148ff565b604082019050919050565b600061398e602483614490565b91506139998261494e565b604082019050919050565b60006139b1601983614490565b91506139bc8261499d565b602082019050919050565b60006139d4602e83614490565b91506139df826149c6565b604082019050919050565b60006139f7601a83614490565b9150613a0282614a15565b602082019050919050565b6000613a1a602283614490565b9150613a2582614a3e565b604082019050919050565b6000613a3d601383614490565b9150613a4882614a8d565b602082019050919050565b6000613a60602c83614490565b9150613a6b82614ab6565b604082019050919050565b6000613a83601a83614490565b9150613a8e82614b05565b602082019050919050565b6000613aa6603883614490565b9150613ab182614b2e565b604082019050919050565b6000613ac9602a83614490565b9150613ad482614b7d565b604082019050919050565b6000613aec602983614490565b9150613af782614bcc565b604082019050919050565b6000613b0f602b83614490565b9150613b1a82614c1b565b604082019050919050565b6000613b32602083614490565b9150613b3d82614c6a565b602082019050919050565b6000613b55602c83614490565b9150613b6082614c93565b604082019050919050565b6000613b78602083614490565b9150613b8382614ce2565b602082019050919050565b6000613b9b603483614490565b9150613ba682614d0b565b604082019050919050565b6000613bbe601783614490565b9150613bc982614d5a565b602082019050919050565b6000613be1602983614490565b9150613bec82614d83565b604082019050919050565b6000613c04602f83614490565b9150613c0f82614dd2565b604082019050919050565b6000613c27601883614490565b9150613c3282614e21565b602082019050919050565b6000613c4a602183614490565b9150613c5582614e4a565b604082019050919050565b6000613c6d600083614485565b9150613c7882614e99565b600082019050919050565b6000613c90603183614490565b9150613c9b82614e9c565b604082019050919050565b6000613cb3602683614490565b9150613cbe82614eeb565b604082019050919050565b613cd2816145cd565b82525050565b613ce9613ce4826145cd565b614714565b82525050565b613cf8816145fb565b82525050565b613d0f613d0a826145fb565b614726565b82525050565b613d1e81614605565b82525050565b6000613d31828486613720565b91508190509392505050565b6000613d49828461377e565b915081905092915050565b6000613d60828461382f565b915081905092915050565b6000613d7782856138e7565b9150613d8382846138e7565b91508190509392505050565b6000613d9a82613c60565b9150819050919050565b6000613db08285613cd8565b600282019150613dc08284613cfe565b6020820191508190509392505050565b6000602082019050613de560008301846136c6565b92915050565b6000608082019050613e0060008301876136c6565b613e0d60208301866136c6565b613e1a6040830185613cef565b8181036060830152613e2c8184613745565b905095945050505050565b6000604082019050613e4c60008301856136c6565b613e596020830184613cef565b9392505050565b6000602082019050613e7560008301846136d5565b92915050565b60006020820190508181036000830152613e958184613745565b905092915050565b60006020820190508181036000830152613eb781846138ae565b905092915050565b60006020820190508181036000830152613ed881613918565b9050919050565b60006020820190508181036000830152613ef88161393b565b9050919050565b60006020820190508181036000830152613f188161395e565b9050919050565b60006020820190508181036000830152613f3881613981565b9050919050565b60006020820190508181036000830152613f58816139a4565b9050919050565b60006020820190508181036000830152613f78816139c7565b9050919050565b60006020820190508181036000830152613f98816139ea565b9050919050565b60006020820190508181036000830152613fb881613a0d565b9050919050565b60006020820190508181036000830152613fd881613a30565b9050919050565b60006020820190508181036000830152613ff881613a53565b9050919050565b6000602082019050818103600083015261401881613a76565b9050919050565b6000602082019050818103600083015261403881613a99565b9050919050565b6000602082019050818103600083015261405881613abc565b9050919050565b6000602082019050818103600083015261407881613adf565b9050919050565b6000602082019050818103600083015261409881613b02565b9050919050565b600060208201905081810360008301526140b881613b25565b9050919050565b600060208201905081810360008301526140d881613b48565b9050919050565b600060208201905081810360008301526140f881613b6b565b9050919050565b6000602082019050818103600083015261411881613b8e565b9050919050565b6000602082019050818103600083015261413881613bb1565b9050919050565b6000602082019050818103600083015261415881613bd4565b9050919050565b6000602082019050818103600083015261417881613bf7565b9050919050565b6000602082019050818103600083015261419881613c1a565b9050919050565b600060208201905081810360008301526141b881613c3d565b9050919050565b600060208201905081810360008301526141d881613c83565b9050919050565b600060208201905081810360008301526141f881613ca6565b9050919050565b600060a0820190506142146000830188613cc9565b61422160208301876136c6565b81810360408301526142338186613745565b905061424260608301856136d5565b81810360808301526142548184613745565b90509695505050505050565b60006080820190506142756000830188613cc9565b81810360208301526142878187613745565b90506142966040830186613d15565b81810360608301526142a98184866136f3565b90509695505050505050565b60006080820190506142ca6000830187613cc9565b81810360208301526142dc8186613745565b90506142eb6040830185613d15565b81810360608301526142fd8184613745565b905095945050505050565b600060c08201905061431d6000830189613cc9565b818103602083015261432f81886137af565b905081810360408301526143438187613745565b905061435260608301866136b7565b61435f60808301856136c6565b81810360a08301526143718184613745565b9050979650505050505050565b60006020820190506143936000830184613cef565b92915050565b60006040820190506143ae6000830185613cef565b6143bb60208301846136e4565b9392505050565b60006143cc6143dd565b90506143d8828261469a565b919050565b6000604051905090565b600067ffffffffffffffff821115614402576144016147ee565b5b61440b8261481d565b9050602081019050919050565b600067ffffffffffffffff821115614433576144326147ee565b5b61443c8261481d565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144b7826145fb565b91506144c2836145fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144f7576144f6614761565b5b828201905092915050565b600061450d826145fb565b9150614518836145fb565b92508261452857614527614790565b5b828204905092915050565b600061453e826145fb565b9150614549836145fb565b92508282101561455c5761455b614761565b5b828203905092915050565b6000614572826145db565b9050919050565b6000614584826145db565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614653578082015181840152602081019050614638565b83811115614662576000848401525b50505050565b6000600282049050600182168061468057607f821691505b60208210811415614694576146936147bf565b5b50919050565b6146a38261481d565b810181811067ffffffffffffffff821117156146c2576146c16147ee565b5b80604052505050565b60006146d6826145fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561470957614708614761565b5b600182019050919050565b600061471f8261482e565b9050919050565b6000819050919050565b600061473b826145fb565b9150614746836145fb565b92508261475657614755614790565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b7f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560008201527f73736167654665652e2053656e642067617320666f72206d657373616765206660208201527f6565730000000000000000000000000000000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f5468697320636861696e2069732063757272656e746c7920756e617661696c6160008201527f626c6520666f722074726176656c000000000000000000000000000000000000602082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f596f75206d757374206f776e2074686520746f6b656e20746f2074726176657260008201527f7365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206578636565647320737570706c7900000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d61782032204e46547320706572207472616e73616374696f6e000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b614f4381614567565b8114614f4e57600080fd5b50565b614f5a81614579565b8114614f6557600080fd5b50565b614f718161458b565b8114614f7c57600080fd5b50565b614f88816145a1565b8114614f9357600080fd5b50565b614f9f816145cd565b8114614faa57600080fd5b50565b614fb6816145fb565b8114614fc157600080fd5b50565b614fcd81614605565b8114614fd857600080fd5b50565b614fe481614619565b8114614fef57600080fd5b5056fea26469706673582212208d9a39d0f918e9d813e4d052651501e7cd3b9605bad63131f15c2f481064f5d664736f6c63430008010033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009b100000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000a000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6d657461646174612e61736865732d6f662d6c696768742e6172742f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _nextTokenId (uint256): 0
Arg [1] : _maxMint (uint256): 2481
Arg [2] : _giftReserved (uint256): 200
Arg [3] : baseURI_ (string): https://metadata.ashes-of-light.art/
Arg [4] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 00000000000000000000000000000000000000000000000000000000000009b1
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [6] : 68747470733a2f2f6d657461646174612e61736865732d6f662d6c696768742e
Arg [7] : 6172742f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
46799:4334:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44080:948;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31180:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32125:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33684:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33207:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50121:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45036:356;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34434:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50214:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34844:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49752:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46989:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31819:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47624:406;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49850:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31549:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12359:103;;;;;;;;;;;;;:::i;:::-;;46960:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43922:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46927:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11708:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43825:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;50468:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32294:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33977:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46870:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35100:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32469:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48169:1575;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45868:758;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34203:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46634:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12617:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47021:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44080:948;44242:8;;;;;;;;;;;44220:31;;:10;:31;;;44212:40;;;;;;44363:19;:32;44383:11;44363:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;44341:11;:18;:61;:134;;;;;44442:19;:32;44462:11;44442:32;;;;;;;;;;;;;;;44432:43;;;;;;:::i;:::-;;;;;;;;44416:11;44406:22;;;;;;:69;44341:134;44333:212;;;;;;;;;;;;:::i;:::-;;;;;;;;;44673:4;:16;;;44690:11;44703;44716:6;44724:8;44673:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44669:352;;44880:52;;;;;;;;44895:8;:15;44880:52;;;;44922:8;44912:19;;;;;;44880:52;;;44829:14;:27;44844:11;44829:27;;;;;;;;;;;;;;;44857:11;44829:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;44870:6;44829:48;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;;;;;44952:57;44966:11;44979;44992:6;45000:8;44952:57;;;;;;;;;:::i;:::-;;;;;;;;44669:352;;;;44080:948;;;;:::o;31180:305::-;31282:4;31334:25;31319:40;;;:11;:40;;;;:105;;;;31391:33;31376:48;;;:11;:48;;;;31319:105;:158;;;;31441:36;31465:11;31441:23;:36::i;:::-;31319:158;31299:178;;31180:305;;;:::o;32125:100::-;32179:13;32212:5;32205:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32125:100;:::o;33684:221::-;33760:7;33788:16;33796:7;33788;:16::i;:::-;33780:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33873:15;:24;33889:7;33873:24;;;;;;;;;;;;;;;;;;;;;33866:31;;33684:221;;;:::o;33207:411::-;33288:13;33304:23;33319:7;33304:14;:23::i;:::-;33288:39;;33352:5;33346:11;;:2;:11;;;;33338:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33446:5;33430:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33455:37;33472:5;33479:12;:10;:12::i;:::-;33455:16;:37::i;:::-;33430:62;33408:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33589:21;33598:2;33602:7;33589:8;:21::i;:::-;33207:411;;;:::o;50121:85::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50192:6:::1;50183;;:15;;;;;;;;;;;;;;;;;;50121:85:::0;:::o;45036:356::-;45227:4;45205:27;;:10;:27;;;45197:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;45329:55;45341:11;45354;45367:6;45375:8;45329:10;:55::i;:::-;45036:356;;;;:::o;34434:339::-;34629:41;34648:12;:10;:12::i;:::-;34662:7;34629:18;:41::i;:::-;34621:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34737:28;34747:4;34753:2;34757:7;34737:9;:28::i;:::-;34434:339;;;:::o;50214:170::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50273:9:::1;50296:6;;;;;;;;;;;50288:20;;50316:3;50288:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50272:52;;;50343:4;50335:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;11999:1;50214:170:::0;:::o;34844:185::-;34982:39;34999:4;35005:2;35009:7;34982:39;;;;;;;;;;;;:16;:39::i;:::-;34844:185;;;:::o;49752:90::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49831:3:::1;49821:7;:13;;;;;;;;;;;;:::i;:::-;;49752:90:::0;:::o;46989:25::-;;;;;;;;;;;;;:::o;31819:239::-;31891:7;31911:13;31927:7;:16;31935:7;31927:16;;;;;;;;;;;;;;;;;;;;;31911:32;;31979:1;31962:19;;:5;:19;;;;31954:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32045:5;32038:12;;;31819:239;;;:::o;47624:406::-;47692:6;;;;;;;;;;;47691:7;47683:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47757:1;47745:9;:13;;;47737:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;47845:13;;47835:7;;:23;;;;:::i;:::-;47822:9;47808:23;;:11;;:23;;;;:::i;:::-;:50;;47800:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;47893:36;47903:10;47917:11;;47915:13;;;;;:::i;:::-;;;;;;;47893:9;:36::i;:::-;47957:1;47944:9;:14;;;47940:83;;;47975:36;47985:10;47999:11;;47997:13;;;;;:::i;:::-;;;;;;;47975:9;:36::i;:::-;47940:83;47624:406;:::o;49850:263::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49967:7:::1;;49954:9;49940:23;;:11;;:23;;;;:::i;:::-;:34;;49932:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50013:9;50025:1;50013:13;;50009:97;50033:9;50028:14;;:1;:14;50009:97;;50064:30;50074:3;50082:11;;50080:13;;;;;:::i;:::-;;;;;;;50064:9;:30::i;:::-;50044:3;;;;;:::i;:::-;;;;50009:97;;;;49850:263:::0;;:::o;31549:208::-;31621:7;31666:1;31649:19;;:5;:19;;;;31641:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31733:9;:16;31743:5;31733:16;;;;;;;;;;;;;;;;31726:23;;31549:208;;;:::o;12359:103::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12424:30:::1;12451:1;12424:18;:30::i;:::-;12359:103::o:0;46960:22::-;;;;:::o;43922:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46927:26::-;;;;:::o;11708:87::-;11754:7;11781:6;;;;;;;;;;;11774:13;;11708:87;:::o;43825:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50468:125::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50579:6:::1;50550:26;:35;;;;50468:125:::0;:::o;32294:104::-;32350:13;32383:7;32376:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32294:104;:::o;33977:155::-;34072:52;34091:12;:10;:12::i;:::-;34105:8;34115;34072:18;:52::i;:::-;33977:155;;:::o;46870:21::-;;;;;;;;;;;;;:::o;35100:328::-;35275:41;35294:12;:10;:12::i;:::-;35308:7;35275:18;:41::i;:::-;35267:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35381:39;35395:4;35401:2;35405:7;35414:5;35381:13;:39::i;:::-;35100:328;;;;:::o;32469:334::-;32542:13;32576:16;32584:7;32576;:16::i;:::-;32568:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;32657:21;32681:10;:8;:10::i;:::-;32657:34;;32733:1;32715:7;32709:21;:25;:86;;;;;;;;;;;;;;;;;32761:7;32770:18;:7;:16;:18::i;:::-;32744:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32709:86;32702:93;;;32469:334;;;:::o;48169:1575::-;48272:16;48280:7;48272;:16::i;:::-;48258:30;;:10;:30;;;48250:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;48385:1;48346:19;:29;48366:8;48346:29;;;;;;;;;;;;;;;:36;;;;;:::i;:::-;;;:40;48338:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;48517:14;48523:7;48517:5;:14::i;:::-;48605:20;48639:10;48651:7;48628:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48605:54;;48745:14;48762:1;48745:18;;48774:26;48820:7;48829:26;;48803:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48774:82;;49011:15;49032:8;;;;;;;;;;;:21;;;49054:8;49072:4;49079:7;49088:5;49095:13;49032:77;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49010:99;;;49143:10;49130:9;:23;;49122:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49238:8;;;;;;;;;;;:13;;;49259:9;49284:8;49356:19;:29;49376:8;49356:29;;;;;;;;;;;;;;;49444:7;49527:10;49594:3;49674:13;49238:498;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48169:1575;;;;;;:::o;45868:758::-;46049:32;46084:14;:27;46099:11;46084:27;;;;;;;;;;;;;;;46112:11;46084:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;46125:6;46084:48;;;;;;;;;;;;;46049:83;;46184:1;46176:10;;46151:9;:21;;;:35;;46143:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;46267:9;:23;;;46248:8;;:15;;:42;:90;;;;;46317:9;:21;;;46304:8;;46294:19;;;;;;;:::i;:::-;;;;;;;;:44;46248:90;46240:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;46443:1;46417:9;:23;;:27;;;;46487:1;46479:10;;46455:9;:21;;:34;;;;46558:4;:16;;;46575:11;46588;46601:6;46609:8;;46558:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45868:758;;;;;;:::o;34203:164::-;34300:4;34324:18;:25;34343:5;34324:25;;;;;;;;;;;;;;;:35;34350:8;34324:35;;;;;;;;;;;;;;;;;;;;;;;;;34317:42;;34203:164;;;;:::o;46634:158::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46770:14:::1;;46738:19;:29;46758:8;46738:29;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;46634:158:::0;;;:::o;12617:201::-;11939:12;:10;:12::i;:::-;11928:23;;:7;:5;:7::i;:::-;:23;;;11920:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12726:1:::1;12706:22;;:8;:22;;;;12698:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12782:28;12801:8;12782:18;:28::i;:::-;12617:201:::0;:::o;47021:28::-;;;;:::o;24038:157::-;24123:4;24162:25;24147:40;;;:11;:40;;;;24140:47;;24038:157;;;:::o;36938:127::-;37003:4;37055:1;37027:30;;:7;:16;37035:7;37027:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37020:37;;36938:127;;;:::o;10462:98::-;10515:7;10542:10;10535:17;;10462:98;:::o;40851:174::-;40953:2;40926:15;:24;40942:7;40926:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41009:7;41005:2;40971:46;;40980:23;40995:7;40980:14;:23::i;:::-;40971:46;;;;;;;;;;;;40851:174;;:::o;50684:338::-;50837:14;50853:12;50880:8;50869:37;;;;;;;;;;;;:::i;:::-;50836:70;;;;50988:26;50998:6;51006:7;50988:9;:26::i;:::-;50684:338;;;;;;:::o;37232:348::-;37325:4;37350:16;37358:7;37350;:16::i;:::-;37342:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37426:13;37442:23;37457:7;37442:14;:23::i;:::-;37426:39;;37495:5;37484:16;;:7;:16;;;:51;;;;37528:7;37504:31;;:20;37516:7;37504:11;:20::i;:::-;:31;;;37484:51;:87;;;;37539:32;37556:5;37563:7;37539:16;:32::i;:::-;37484:87;37476:96;;;37232:348;;;;:::o;40155:578::-;40314:4;40287:31;;:23;40302:7;40287:14;:23::i;:::-;:31;;;40279:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40397:1;40383:16;;:2;:16;;;;40375:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40453:39;40474:4;40480:2;40484:7;40453:20;:39::i;:::-;40557:29;40574:1;40578:7;40557:8;:29::i;:::-;40618:1;40599:9;:15;40609:4;40599:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;40647:1;40630:9;:13;40640:2;40630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40678:2;40659:7;:16;40667:7;40659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40717:7;40713:2;40698:27;;40707:4;40698:27;;;;;;;;;;;;40155:578;;;:::o;37922:110::-;37998:26;38008:2;38012:7;37998:26;;;;;;;;;;;;:9;:26::i;:::-;37922:110;;:::o;12978:191::-;13052:16;13071:6;;;;;;;;;;;13052:25;;13097:8;13088:6;;:17;;;;;;;;;;;;;;;;;;13152:8;13121:40;;13142:8;13121:40;;;;;;;;;;;;12978:191;;:::o;41167:315::-;41322:8;41313:17;;:5;:17;;;;41305:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;41409:8;41371:18;:25;41390:5;41371:25;;;;;;;;;;;;;;;:35;41397:8;41371:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;41455:8;41433:41;;41448:5;41433:41;;;41465:8;41433:41;;;;;;:::i;:::-;;;;;;;;41167:315;;;:::o;36310:::-;36467:28;36477:4;36483:2;36487:7;36467:9;:28::i;:::-;36514:48;36537:4;36543:2;36547:7;36556:5;36514:22;:48::i;:::-;36506:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36310:315;;;;:::o;51030:100::-;51082:13;51115:7;51108:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51030:100;:::o;8051:723::-;8107:13;8337:1;8328:5;:10;8324:53;;;8355:10;;;;;;;;;;;;;;;;;;;;;8324:53;8387:12;8402:5;8387:20;;8418:14;8443:78;8458:1;8450:4;:9;8443:78;;8476:8;;;;;:::i;:::-;;;;8507:2;8499:10;;;;;:::i;:::-;;;8443:78;;;8531:19;8563:6;8553:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8531:39;;8581:154;8597:1;8588:5;:10;8581:154;;8625:1;8615:11;;;;;:::i;:::-;;;8692:2;8684:5;:10;;;;:::i;:::-;8671:2;:24;;;;:::i;:::-;8658:39;;8641:6;8648;8641:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8721:2;8712:11;;;;;:::i;:::-;;;8581:154;;;8759:6;8745:21;;;;;8051:723;;;;:::o;39458:360::-;39518:13;39534:23;39549:7;39534:14;:23::i;:::-;39518:39;;39570:48;39591:5;39606:1;39610:7;39570:20;:48::i;:::-;39659:29;39676:1;39680:7;39659:8;:29::i;:::-;39721:1;39701:9;:16;39711:5;39701:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;39740:7;:16;39748:7;39740:16;;;;;;;;;;;;39733:23;;;;;;;;;;;39802:7;39798:1;39774:36;;39783:5;39774:36;;;;;;;;;;;;39458:360;;:::o;43418:126::-;;;;:::o;38259:321::-;38389:18;38395:2;38399:7;38389:5;:18::i;:::-;38440:54;38471:1;38475:2;38479:7;38488:5;38440:22;:54::i;:::-;38418:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;38259:321;;;:::o;42047:799::-;42202:4;42223:15;:2;:13;;;:15::i;:::-;42219:620;;;42275:2;42259:36;;;42296:12;:10;:12::i;:::-;42310:4;42316:7;42325:5;42259:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42255:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42518:1;42501:6;:13;:18;42497:272;;;42544:60;;;;;;;;;;:::i;:::-;;;;;;;;42497:272;42719:6;42713:13;42704:6;42700:2;42696:15;42689:38;42255:529;42392:41;;;42382:51;;;:6;:51;;;;42375:58;;;;;42219:620;42823:4;42816:11;;42047:799;;;;;;;:::o;38916:313::-;39010:1;38996:16;;:2;:16;;;;38988:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39062:45;39091:1;39095:2;39099:7;39062:20;:45::i;:::-;39137:1;39120:9;:13;39130:2;39120:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39168:2;39149:7;:16;39157:7;39149:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39213:7;39209:2;39188:33;;39205:1;39188:33;;;;;;;;;;;;38916:313;;:::o;13971:387::-;14031:4;14239:12;14306:7;14294:20;14286:28;;14349:1;14342:4;:8;14335:15;;;13971:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:159::-;;948:6;942:13;933:22;;964:41;999:5;964:41;:::i;:::-;923:88;;;;:::o;1017:133::-;;1098:6;1085:20;1076:29;;1114:30;1138:5;1114:30;:::i;:::-;1066:84;;;;:::o;1156:137::-;;1239:6;1226:20;1217:29;;1255:32;1281:5;1255:32;:::i;:::-;1207:86;;;;:::o;1299:141::-;;1386:6;1380:13;1371:22;;1402:32;1428:5;1402:32;:::i;:::-;1361:79;;;;:::o;1459:351::-;;;1576:3;1569:4;1561:6;1557:17;1553:27;1543:2;;1594:1;1591;1584:12;1543:2;1630:6;1617:20;1607:30;;1660:18;1652:6;1649:30;1646:2;;;1692:1;1689;1682:12;1646:2;1729:4;1721:6;1717:17;1705:29;;1783:3;1775:4;1767:6;1763:17;1753:8;1749:32;1746:41;1743:2;;;1800:1;1797;1790:12;1743:2;1533:277;;;;;:::o;1829:271::-;;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:137::-;;2482:6;2469:20;2460:29;;2498:32;2524:5;2498:32;:::i;:::-;2450:86;;;;:::o;2542:139::-;;2626:6;2613:20;2604:29;;2642:33;2669:5;2642:33;:::i;:::-;2594:87;;;;:::o;2687:143::-;;2775:6;2769:13;2760:22;;2791:33;2818:5;2791:33;:::i;:::-;2750:80;;;;:::o;2836:137::-;;2919:6;2906:20;2897:29;;2935:32;2961:5;2935:32;:::i;:::-;2887:86;;;;:::o;2979:135::-;;3061:6;3048:20;3039:29;;3077:31;3102:5;3077:31;:::i;:::-;3029:85;;;;:::o;3120:262::-;;3228:2;3216:9;3207:7;3203:23;3199:32;3196:2;;;3244:1;3241;3234:12;3196:2;3287:1;3312:53;3357:7;3348:6;3337:9;3333:22;3312:53;:::i;:::-;3302:63;;3258:117;3186:196;;;;:::o;3388:456::-;;;3532:2;3520:9;3511:7;3507:23;3503:32;3500:2;;;3548:1;3545;3538:12;3500:2;3591:1;3616:72;3680:7;3671:6;3660:9;3656:22;3616:72;:::i;:::-;3606:82;;3562:136;3737:2;3763:64;3819:7;3810:6;3799:9;3795:22;3763:64;:::i;:::-;3753:74;;3708:129;3490:354;;;;;:::o;3850:407::-;;;3975:2;3963:9;3954:7;3950:23;3946:32;3943:2;;;3991:1;3988;3981:12;3943:2;4034:1;4059:53;4104:7;4095:6;4084:9;4080:22;4059:53;:::i;:::-;4049:63;;4005:117;4161:2;4187:53;4232:7;4223:6;4212:9;4208:22;4187:53;:::i;:::-;4177:63;;4132:118;3933:324;;;;;:::o;4263:552::-;;;;4405:2;4393:9;4384:7;4380:23;4376:32;4373:2;;;4421:1;4418;4411:12;4373:2;4464:1;4489:53;4534:7;4525:6;4514:9;4510:22;4489:53;:::i;:::-;4479:63;;4435:117;4591:2;4617:53;4662:7;4653:6;4642:9;4638:22;4617:53;:::i;:::-;4607:63;;4562:118;4719:2;4745:53;4790:7;4781:6;4770:9;4766:22;4745:53;:::i;:::-;4735:63;;4690:118;4363:452;;;;;:::o;4821:809::-;;;;;4989:3;4977:9;4968:7;4964:23;4960:33;4957:2;;;5006:1;5003;4996:12;4957:2;5049:1;5074:53;5119:7;5110:6;5099:9;5095:22;5074:53;:::i;:::-;5064:63;;5020:117;5176:2;5202:53;5247:7;5238:6;5227:9;5223:22;5202:53;:::i;:::-;5192:63;;5147:118;5304:2;5330:53;5375:7;5366:6;5355:9;5351:22;5330:53;:::i;:::-;5320:63;;5275:118;5460:2;5449:9;5445:18;5432:32;5491:18;5483:6;5480:30;5477:2;;;5523:1;5520;5513:12;5477:2;5551:62;5605:7;5596:6;5585:9;5581:22;5551:62;:::i;:::-;5541:72;;5403:220;4947:683;;;;;;;:::o;5636:401::-;;;5758:2;5746:9;5737:7;5733:23;5729:32;5726:2;;;5774:1;5771;5764:12;5726:2;5817:1;5842:53;5887:7;5878:6;5867:9;5863:22;5842:53;:::i;:::-;5832:63;;5788:117;5944:2;5970:50;6012:7;6003:6;5992:9;5988:22;5970:50;:::i;:::-;5960:60;;5915:115;5716:321;;;;;:::o;6043:407::-;;;6168:2;6156:9;6147:7;6143:23;6139:32;6136:2;;;6184:1;6181;6174:12;6136:2;6227:1;6252:53;6297:7;6288:6;6277:9;6273:22;6252:53;:::i;:::-;6242:63;;6198:117;6354:2;6380:53;6425:7;6416:6;6405:9;6401:22;6380:53;:::i;:::-;6370:63;;6325:118;6126:324;;;;;:::o;6456:256::-;;6561:2;6549:9;6540:7;6536:23;6532:32;6529:2;;;6577:1;6574;6567:12;6529:2;6620:1;6645:50;6687:7;6678:6;6667:9;6663:22;6645:50;:::i;:::-;6635:60;;6591:114;6519:193;;;;:::o;6718:260::-;;6825:2;6813:9;6804:7;6800:23;6796:32;6793:2;;;6841:1;6838;6831:12;6793:2;6884:1;6909:52;6953:7;6944:6;6933:9;6929:22;6909:52;:::i;:::-;6899:62;;6855:116;6783:195;;;;:::o;6984:282::-;;7102:2;7090:9;7081:7;7077:23;7073:32;7070:2;;;7118:1;7115;7108:12;7070:2;7161:1;7186:63;7241:7;7232:6;7221:9;7217:22;7186:63;:::i;:::-;7176:73;;7132:127;7060:206;;;;:::o;7272:375::-;;7390:2;7378:9;7369:7;7365:23;7361:32;7358:2;;;7406:1;7403;7396:12;7358:2;7477:1;7466:9;7462:17;7449:31;7507:18;7499:6;7496:30;7493:2;;;7539:1;7536;7529:12;7493:2;7567:63;7622:7;7613:6;7602:9;7598:22;7567:63;:::i;:::-;7557:73;;7420:220;7348:299;;;;:::o;7653:260::-;;7760:2;7748:9;7739:7;7735:23;7731:32;7728:2;;;7776:1;7773;7766:12;7728:2;7819:1;7844:52;7888:7;7879:6;7868:9;7864:22;7844:52;:::i;:::-;7834:62;;7790:116;7718:195;;;;:::o;7919:536::-;;;;8062:2;8050:9;8041:7;8037:23;8033:32;8030:2;;;8078:1;8075;8068:12;8030:2;8121:1;8146:52;8190:7;8181:6;8170:9;8166:22;8146:52;:::i;:::-;8136:62;;8092:116;8275:2;8264:9;8260:18;8247:32;8306:18;8298:6;8295:30;8292:2;;;8338:1;8335;8328:12;8292:2;8374:64;8430:7;8421:6;8410:9;8406:22;8374:64;:::i;:::-;8356:82;;;;8218:230;8020:435;;;;;:::o;8461:661::-;;;;8611:2;8599:9;8590:7;8586:23;8582:32;8579:2;;;8627:1;8624;8617:12;8579:2;8670:1;8695:52;8739:7;8730:6;8719:9;8715:22;8695:52;:::i;:::-;8685:62;;8641:116;8824:2;8813:9;8809:18;8796:32;8855:18;8847:6;8844:30;8841:2;;;8887:1;8884;8877:12;8841:2;8915:62;8969:7;8960:6;8949:9;8945:22;8915:62;:::i;:::-;8905:72;;8767:220;9026:2;9052:53;9097:7;9088:6;9077:9;9073:22;9052:53;:::i;:::-;9042:63;;8997:118;8569:553;;;;;:::o;9128:936::-;;;;;;9313:3;9301:9;9292:7;9288:23;9284:33;9281:2;;;9330:1;9327;9320:12;9281:2;9373:1;9398:52;9442:7;9433:6;9422:9;9418:22;9398:52;:::i;:::-;9388:62;;9344:116;9527:2;9516:9;9512:18;9499:32;9558:18;9550:6;9547:30;9544:2;;;9590:1;9587;9580:12;9544:2;9618:62;9672:7;9663:6;9652:9;9648:22;9618:62;:::i;:::-;9608:72;;9470:220;9729:2;9755:52;9799:7;9790:6;9779:9;9775:22;9755:52;:::i;:::-;9745:62;;9700:117;9884:2;9873:9;9869:18;9856:32;9915:18;9907:6;9904:30;9901:2;;;9947:1;9944;9937:12;9901:2;9983:64;10039:7;10030:6;10019:9;10015:22;9983:64;:::i;:::-;9965:82;;;;9827:230;9271:793;;;;;;;;:::o;10070:916::-;;;;;10245:3;10233:9;10224:7;10220:23;10216:33;10213:2;;;10262:1;10259;10252:12;10213:2;10305:1;10330:52;10374:7;10365:6;10354:9;10350:22;10330:52;:::i;:::-;10320:62;;10276:116;10459:2;10448:9;10444:18;10431:32;10490:18;10482:6;10479:30;10476:2;;;10522:1;10519;10512:12;10476:2;10550:62;10604:7;10595:6;10584:9;10580:22;10550:62;:::i;:::-;10540:72;;10402:220;10661:2;10687:52;10731:7;10722:6;10711:9;10707:22;10687:52;:::i;:::-;10677:62;;10632:117;10816:2;10805:9;10801:18;10788:32;10847:18;10839:6;10836:30;10833:2;;;10879:1;10876;10869:12;10833:2;10907:62;10961:7;10952:6;10941:9;10937:22;10907:62;:::i;:::-;10897:72;;10759:220;10203:783;;;;;;;:::o;10992:405::-;;;11116:2;11104:9;11095:7;11091:23;11087:32;11084:2;;;11132:1;11129;11122:12;11084:2;11175:1;11200:52;11244:7;11235:6;11224:9;11220:22;11200:52;:::i;:::-;11190:62;;11146:116;11301:2;11327:53;11372:7;11363:6;11352:9;11348:22;11327:53;:::i;:::-;11317:63;;11272:118;11074:323;;;;;:::o;11403:262::-;;11511:2;11499:9;11490:7;11486:23;11482:32;11479:2;;;11527:1;11524;11517:12;11479:2;11570:1;11595:53;11640:7;11631:6;11620:9;11616:22;11595:53;:::i;:::-;11585:63;;11541:117;11469:196;;;;:::o;11671:440::-;;;11807:2;11795:9;11786:7;11782:23;11778:32;11775:2;;;11823:1;11820;11813:12;11775:2;11866:1;11891:64;11947:7;11938:6;11927:9;11923:22;11891:64;:::i;:::-;11881:74;;11837:128;12004:2;12030:64;12086:7;12077:6;12066:9;12062:22;12030:64;:::i;:::-;12020:74;;11975:129;11765:346;;;;;:::o;12117:258::-;;12223:2;12211:9;12202:7;12198:23;12194:32;12191:2;;;12239:1;12236;12229:12;12191:2;12282:1;12307:51;12350:7;12341:6;12330:9;12326:22;12307:51;:::i;:::-;12297:61;;12253:115;12181:194;;;;:::o;12381:403::-;;;12504:2;12492:9;12483:7;12479:23;12475:32;12472:2;;;12520:1;12517;12510:12;12472:2;12563:1;12588:51;12631:7;12622:6;12611:9;12607:22;12588:51;:::i;:::-;12578:61;;12534:115;12688:2;12714:53;12759:7;12750:6;12739:9;12735:22;12714:53;:::i;:::-;12704:63;;12659:118;12462:322;;;;;:::o;12790:142::-;12893:32;12919:5;12893:32;:::i;:::-;12888:3;12881:45;12871:61;;:::o;12938:118::-;13025:24;13043:5;13025:24;:::i;:::-;13020:3;13013:37;13003:53;;:::o;13062:109::-;13143:21;13158:5;13143:21;:::i;:::-;13138:3;13131:34;13121:50;;:::o;13177:118::-;13264:24;13282:5;13264:24;:::i;:::-;13259:3;13252:37;13242:53;;:::o;13323:301::-;;13440:70;13503:6;13498:3;13440:70;:::i;:::-;13433:77;;13520:43;13556:6;13551:3;13544:5;13520:43;:::i;:::-;13588:29;13610:6;13588:29;:::i;:::-;13583:3;13579:39;13572:46;;13423:201;;;;;:::o;13652:314::-;;13787:88;13868:6;13863:3;13787:88;:::i;:::-;13780:95;;13885:43;13921:6;13916:3;13909:5;13885:43;:::i;:::-;13953:6;13948:3;13944:16;13937:23;;13770:196;;;;;:::o;13972:360::-;;14086:38;14118:5;14086:38;:::i;:::-;14140:70;14203:6;14198:3;14140:70;:::i;:::-;14133:77;;14219:52;14264:6;14259:3;14252:4;14245:5;14241:16;14219:52;:::i;:::-;14296:29;14318:6;14296:29;:::i;:::-;14291:3;14287:39;14280:46;;14062:270;;;;;:::o;14338:373::-;;14470:38;14502:5;14470:38;:::i;:::-;14524:88;14605:6;14600:3;14524:88;:::i;:::-;14517:95;;14621:52;14666:6;14661:3;14654:4;14647:5;14643:16;14621:52;:::i;:::-;14698:6;14693:3;14689:16;14682:23;;14446:265;;;;;:::o;14739:798::-;;14859:5;14853:12;14888:36;14914:9;14888:36;:::i;:::-;14940:70;15003:6;14998:3;14940:70;:::i;:::-;14933:77;;15041:1;15030:9;15026:17;15057:1;15052:135;;;;15201:1;15196:335;;;;15019:512;;15052:135;15136:4;15132:9;15121;15117:25;15112:3;15105:38;15172:4;15167:3;15163:14;15156:21;;15052:135;;15196:335;15263:37;15294:5;15263:37;:::i;:::-;15322:1;15336:154;15350:6;15347:1;15344:13;15336:154;;;15424:7;15418:14;15414:1;15409:3;15405:11;15398:35;15474:1;15465:7;15461:15;15450:26;;15372:4;15369:1;15365:12;15360:17;;15336:154;;;15519:1;15514:3;15510:11;15503:18;;15203:328;;15019:512;;14826:711;;;;;;:::o;15565:841::-;;15703:5;15697:12;15732:36;15758:9;15732:36;:::i;:::-;15784:88;15865:6;15860:3;15784:88;:::i;:::-;15777:95;;15903:1;15892:9;15888:17;15919:1;15914:137;;;;16065:1;16060:340;;;;15881:519;;15914:137;15998:4;15994:9;15983;15979:25;15974:3;15967:38;16034:6;16029:3;16025:16;16018:23;;15914:137;;16060:340;16127:37;16158:5;16127:37;:::i;:::-;16186:1;16200:154;16214:6;16211:1;16208:13;16200:154;;;16288:7;16282:14;16278:1;16273:3;16269:11;16262:35;16338:1;16329:7;16325:15;16314:26;;16236:4;16233:1;16229:12;16224:17;;16200:154;;;16383:6;16378:3;16374:16;16367:23;;16067:333;;15881:519;;15670:736;;;;;;:::o;16412:364::-;;16528:39;16561:5;16528:39;:::i;:::-;16583:71;16647:6;16642:3;16583:71;:::i;:::-;16576:78;;16663:52;16708:6;16703:3;16696:4;16689:5;16685:16;16663:52;:::i;:::-;16740:29;16762:6;16740:29;:::i;:::-;16735:3;16731:39;16724:46;;16504:272;;;;;:::o;16782:377::-;;16916:39;16949:5;16916:39;:::i;:::-;16971:89;17053:6;17048:3;16971:89;:::i;:::-;16964:96;;17069:52;17114:6;17109:3;17102:4;17095:5;17091:16;17069:52;:::i;:::-;17146:6;17141:3;17137:16;17130:23;;16892:267;;;;;:::o;17165:366::-;;17328:67;17392:2;17387:3;17328:67;:::i;:::-;17321:74;;17404:93;17493:3;17404:93;:::i;:::-;17522:2;17517:3;17513:12;17506:19;;17311:220;;;:::o;17537:366::-;;17700:67;17764:2;17759:3;17700:67;:::i;:::-;17693:74;;17776:93;17865:3;17776:93;:::i;:::-;17894:2;17889:3;17885:12;17878:19;;17683:220;;;:::o;17909:366::-;;18072:67;18136:2;18131:3;18072:67;:::i;:::-;18065:74;;18148:93;18237:3;18148:93;:::i;:::-;18266:2;18261:3;18257:12;18250:19;;18055:220;;;:::o;18281:366::-;;18444:67;18508:2;18503:3;18444:67;:::i;:::-;18437:74;;18520:93;18609:3;18520:93;:::i;:::-;18638:2;18633:3;18629:12;18622:19;;18427:220;;;:::o;18653:366::-;;18816:67;18880:2;18875:3;18816:67;:::i;:::-;18809:74;;18892:93;18981:3;18892:93;:::i;:::-;19010:2;19005:3;19001:12;18994:19;;18799:220;;;:::o;19025:366::-;;19188:67;19252:2;19247:3;19188:67;:::i;:::-;19181:74;;19264:93;19353:3;19264:93;:::i;:::-;19382:2;19377:3;19373:12;19366:19;;19171:220;;;:::o;19397:366::-;;19560:67;19624:2;19619:3;19560:67;:::i;:::-;19553:74;;19636:93;19725:3;19636:93;:::i;:::-;19754:2;19749:3;19745:12;19738:19;;19543:220;;;:::o;19769:366::-;;19932:67;19996:2;19991:3;19932:67;:::i;:::-;19925:74;;20008:93;20097:3;20008:93;:::i;:::-;20126:2;20121:3;20117:12;20110:19;;19915:220;;;:::o;20141:366::-;;20304:67;20368:2;20363:3;20304:67;:::i;:::-;20297:74;;20380:93;20469:3;20380:93;:::i;:::-;20498:2;20493:3;20489:12;20482:19;;20287:220;;;:::o;20513:366::-;;20676:67;20740:2;20735:3;20676:67;:::i;:::-;20669:74;;20752:93;20841:3;20752:93;:::i;:::-;20870:2;20865:3;20861:12;20854:19;;20659:220;;;:::o;20885:366::-;;21048:67;21112:2;21107:3;21048:67;:::i;:::-;21041:74;;21124:93;21213:3;21124:93;:::i;:::-;21242:2;21237:3;21233:12;21226:19;;21031:220;;;:::o;21257:366::-;;21420:67;21484:2;21479:3;21420:67;:::i;:::-;21413:74;;21496:93;21585:3;21496:93;:::i;:::-;21614:2;21609:3;21605:12;21598:19;;21403:220;;;:::o;21629:366::-;;21792:67;21856:2;21851:3;21792:67;:::i;:::-;21785:74;;21868:93;21957:3;21868:93;:::i;:::-;21986:2;21981:3;21977:12;21970:19;;21775:220;;;:::o;22001:366::-;;22164:67;22228:2;22223:3;22164:67;:::i;:::-;22157:74;;22240:93;22329:3;22240:93;:::i;:::-;22358:2;22353:3;22349:12;22342:19;;22147:220;;;:::o;22373:366::-;;22536:67;22600:2;22595:3;22536:67;:::i;:::-;22529:74;;22612:93;22701:3;22612:93;:::i;:::-;22730:2;22725:3;22721:12;22714:19;;22519:220;;;:::o;22745:366::-;;22908:67;22972:2;22967:3;22908:67;:::i;:::-;22901:74;;22984:93;23073:3;22984:93;:::i;:::-;23102:2;23097:3;23093:12;23086:19;;22891:220;;;:::o;23117:366::-;;23280:67;23344:2;23339:3;23280:67;:::i;:::-;23273:74;;23356:93;23445:3;23356:93;:::i;:::-;23474:2;23469:3;23465:12;23458:19;;23263:220;;;:::o;23489:366::-;;23652:67;23716:2;23711:3;23652:67;:::i;:::-;23645:74;;23728:93;23817:3;23728:93;:::i;:::-;23846:2;23841:3;23837:12;23830:19;;23635:220;;;:::o;23861:366::-;;24024:67;24088:2;24083:3;24024:67;:::i;:::-;24017:74;;24100:93;24189:3;24100:93;:::i;:::-;24218:2;24213:3;24209:12;24202:19;;24007:220;;;:::o;24233:366::-;;24396:67;24460:2;24455:3;24396:67;:::i;:::-;24389:74;;24472:93;24561:3;24472:93;:::i;:::-;24590:2;24585:3;24581:12;24574:19;;24379:220;;;:::o;24605:366::-;;24768:67;24832:2;24827:3;24768:67;:::i;:::-;24761:74;;24844:93;24933:3;24844:93;:::i;:::-;24962:2;24957:3;24953:12;24946:19;;24751:220;;;:::o;24977:366::-;;25140:67;25204:2;25199:3;25140:67;:::i;:::-;25133:74;;25216:93;25305:3;25216:93;:::i;:::-;25334:2;25329:3;25325:12;25318:19;;25123:220;;;:::o;25349:366::-;;25512:67;25576:2;25571:3;25512:67;:::i;:::-;25505:74;;25588:93;25677:3;25588:93;:::i;:::-;25706:2;25701:3;25697:12;25690:19;;25495:220;;;:::o;25721:366::-;;25884:67;25948:2;25943:3;25884:67;:::i;:::-;25877:74;;25960:93;26049:3;25960:93;:::i;:::-;26078:2;26073:3;26069:12;26062:19;;25867:220;;;:::o;26093:398::-;;26273:83;26354:1;26349:3;26273:83;:::i;:::-;26266:90;;26365:93;26454:3;26365:93;:::i;:::-;26483:1;26478:3;26474:11;26467:18;;26256:235;;;:::o;26497:366::-;;26660:67;26724:2;26719:3;26660:67;:::i;:::-;26653:74;;26736:93;26825:3;26736:93;:::i;:::-;26854:2;26849:3;26845:12;26838:19;;26643:220;;;:::o;26869:366::-;;27032:67;27096:2;27091:3;27032:67;:::i;:::-;27025:74;;27108:93;27197:3;27108:93;:::i;:::-;27226:2;27221:3;27217:12;27210:19;;27015:220;;;:::o;27241:115::-;27326:23;27343:5;27326:23;:::i;:::-;27321:3;27314:36;27304:52;;:::o;27362:153::-;27465:43;27484:23;27501:5;27484:23;:::i;:::-;27465:43;:::i;:::-;27460:3;27453:56;27443:72;;:::o;27521:118::-;27608:24;27626:5;27608:24;:::i;:::-;27603:3;27596:37;27586:53;;:::o;27645:157::-;27750:45;27770:24;27788:5;27770:24;:::i;:::-;27750:45;:::i;:::-;27745:3;27738:58;27728:74;;:::o;27808:115::-;27893:23;27910:5;27893:23;:::i;:::-;27888:3;27881:36;27871:52;;:::o;27929:291::-;;28091:103;28190:3;28181:6;28173;28091:103;:::i;:::-;28084:110;;28211:3;28204:10;;28073:147;;;;;:::o;28226:271::-;;28378:93;28467:3;28458:6;28378:93;:::i;:::-;28371:100;;28488:3;28481:10;;28360:137;;;;:::o;28503:265::-;;28652:90;28738:3;28729:6;28652:90;:::i;:::-;28645:97;;28759:3;28752:10;;28634:134;;;;:::o;28774:435::-;;28976:95;29067:3;29058:6;28976:95;:::i;:::-;28969:102;;29088:95;29179:3;29170:6;29088:95;:::i;:::-;29081:102;;29200:3;29193:10;;28958:251;;;;;:::o;29215:379::-;;29421:147;29564:3;29421:147;:::i;:::-;29414:154;;29585:3;29578:10;;29403:191;;;:::o;29600:392::-;;29753:73;29822:3;29813:6;29753:73;:::i;:::-;29851:1;29846:3;29842:11;29835:18;;29863:75;29934:3;29925:6;29863:75;:::i;:::-;29963:2;29958:3;29954:12;29947:19;;29983:3;29976:10;;29742:250;;;;;:::o;29998:222::-;;30129:2;30118:9;30114:18;30106:26;;30142:71;30210:1;30199:9;30195:17;30186:6;30142:71;:::i;:::-;30096:124;;;;:::o;30226:640::-;;30459:3;30448:9;30444:19;30436:27;;30473:71;30541:1;30530:9;30526:17;30517:6;30473:71;:::i;:::-;30554:72;30622:2;30611:9;30607:18;30598:6;30554:72;:::i;:::-;30636;30704:2;30693:9;30689:18;30680:6;30636:72;:::i;:::-;30755:9;30749:4;30745:20;30740:2;30729:9;30725:18;30718:48;30783:76;30854:4;30845:6;30783:76;:::i;:::-;30775:84;;30426:440;;;;;;;:::o;30872:332::-;;31031:2;31020:9;31016:18;31008:26;;31044:71;31112:1;31101:9;31097:17;31088:6;31044:71;:::i;:::-;31125:72;31193:2;31182:9;31178:18;31169:6;31125:72;:::i;:::-;30998:206;;;;;:::o;31210:210::-;;31335:2;31324:9;31320:18;31312:26;;31348:65;31410:1;31399:9;31395:17;31386:6;31348:65;:::i;:::-;31302:118;;;;:::o;31426:309::-;;31575:2;31564:9;31560:18;31552:26;;31624:9;31618:4;31614:20;31610:1;31599:9;31595:17;31588:47;31652:76;31723:4;31714:6;31652:76;:::i;:::-;31644:84;;31542:193;;;;:::o;31741:313::-;;31892:2;31881:9;31877:18;31869:26;;31941:9;31935:4;31931:20;31927:1;31916:9;31912:17;31905:47;31969:78;32042:4;32033:6;31969:78;:::i;:::-;31961:86;;31859:195;;;;:::o;32060:419::-;;32264:2;32253:9;32249:18;32241:26;;32313:9;32307:4;32303:20;32299:1;32288:9;32284:17;32277:47;32341:131;32467:4;32341:131;:::i;:::-;32333:139;;32231:248;;;:::o;32485:419::-;;32689:2;32678:9;32674:18;32666:26;;32738:9;32732:4;32728:20;32724:1;32713:9;32709:17;32702:47;32766:131;32892:4;32766:131;:::i;:::-;32758:139;;32656:248;;;:::o;32910:419::-;;33114:2;33103:9;33099:18;33091:26;;33163:9;33157:4;33153:20;33149:1;33138:9;33134:17;33127:47;33191:131;33317:4;33191:131;:::i;:::-;33183:139;;33081:248;;;:::o;33335:419::-;;33539:2;33528:9;33524:18;33516:26;;33588:9;33582:4;33578:20;33574:1;33563:9;33559:17;33552:47;33616:131;33742:4;33616:131;:::i;:::-;33608:139;;33506:248;;;:::o;33760:419::-;;33964:2;33953:9;33949:18;33941:26;;34013:9;34007:4;34003:20;33999:1;33988:9;33984:17;33977:47;34041:131;34167:4;34041:131;:::i;:::-;34033:139;;33931:248;;;:::o;34185:419::-;;34389:2;34378:9;34374:18;34366:26;;34438:9;34432:4;34428:20;34424:1;34413:9;34409:17;34402:47;34466:131;34592:4;34466:131;:::i;:::-;34458:139;;34356:248;;;:::o;34610:419::-;;34814:2;34803:9;34799:18;34791:26;;34863:9;34857:4;34853:20;34849:1;34838:9;34834:17;34827:47;34891:131;35017:4;34891:131;:::i;:::-;34883:139;;34781:248;;;:::o;35035:419::-;;35239:2;35228:9;35224:18;35216:26;;35288:9;35282:4;35278:20;35274:1;35263:9;35259:17;35252:47;35316:131;35442:4;35316:131;:::i;:::-;35308:139;;35206:248;;;:::o;35460:419::-;;35664:2;35653:9;35649:18;35641:26;;35713:9;35707:4;35703:20;35699:1;35688:9;35684:17;35677:47;35741:131;35867:4;35741:131;:::i;:::-;35733:139;;35631:248;;;:::o;35885:419::-;;36089:2;36078:9;36074:18;36066:26;;36138:9;36132:4;36128:20;36124:1;36113:9;36109:17;36102:47;36166:131;36292:4;36166:131;:::i;:::-;36158:139;;36056:248;;;:::o;36310:419::-;;36514:2;36503:9;36499:18;36491:26;;36563:9;36557:4;36553:20;36549:1;36538:9;36534:17;36527:47;36591:131;36717:4;36591:131;:::i;:::-;36583:139;;36481:248;;;:::o;36735:419::-;;36939:2;36928:9;36924:18;36916:26;;36988:9;36982:4;36978:20;36974:1;36963:9;36959:17;36952:47;37016:131;37142:4;37016:131;:::i;:::-;37008:139;;36906:248;;;:::o;37160:419::-;;37364:2;37353:9;37349:18;37341:26;;37413:9;37407:4;37403:20;37399:1;37388:9;37384:17;37377:47;37441:131;37567:4;37441:131;:::i;:::-;37433:139;;37331:248;;;:::o;37585:419::-;;37789:2;37778:9;37774:18;37766:26;;37838:9;37832:4;37828:20;37824:1;37813:9;37809:17;37802:47;37866:131;37992:4;37866:131;:::i;:::-;37858:139;;37756:248;;;:::o;38010:419::-;;38214:2;38203:9;38199:18;38191:26;;38263:9;38257:4;38253:20;38249:1;38238:9;38234:17;38227:47;38291:131;38417:4;38291:131;:::i;:::-;38283:139;;38181:248;;;:::o;38435:419::-;;38639:2;38628:9;38624:18;38616:26;;38688:9;38682:4;38678:20;38674:1;38663:9;38659:17;38652:47;38716:131;38842:4;38716:131;:::i;:::-;38708:139;;38606:248;;;:::o;38860:419::-;;39064:2;39053:9;39049:18;39041:26;;39113:9;39107:4;39103:20;39099:1;39088:9;39084:17;39077:47;39141:131;39267:4;39141:131;:::i;:::-;39133:139;;39031:248;;;:::o;39285:419::-;;39489:2;39478:9;39474:18;39466:26;;39538:9;39532:4;39528:20;39524:1;39513:9;39509:17;39502:47;39566:131;39692:4;39566:131;:::i;:::-;39558:139;;39456:248;;;:::o;39710:419::-;;39914:2;39903:9;39899:18;39891:26;;39963:9;39957:4;39953:20;39949:1;39938:9;39934:17;39927:47;39991:131;40117:4;39991:131;:::i;:::-;39983:139;;39881:248;;;:::o;40135:419::-;;40339:2;40328:9;40324:18;40316:26;;40388:9;40382:4;40378:20;40374:1;40363:9;40359:17;40352:47;40416:131;40542:4;40416:131;:::i;:::-;40408:139;;40306:248;;;:::o;40560:419::-;;40764:2;40753:9;40749:18;40741:26;;40813:9;40807:4;40803:20;40799:1;40788:9;40784:17;40777:47;40841:131;40967:4;40841:131;:::i;:::-;40833:139;;40731:248;;;:::o;40985:419::-;;41189:2;41178:9;41174:18;41166:26;;41238:9;41232:4;41228:20;41224:1;41213:9;41209:17;41202:47;41266:131;41392:4;41266:131;:::i;:::-;41258:139;;41156:248;;;:::o;41410:419::-;;41614:2;41603:9;41599:18;41591:26;;41663:9;41657:4;41653:20;41649:1;41638:9;41634:17;41627:47;41691:131;41817:4;41691:131;:::i;:::-;41683:139;;41581:248;;;:::o;41835:419::-;;42039:2;42028:9;42024:18;42016:26;;42088:9;42082:4;42078:20;42074:1;42063:9;42059:17;42052:47;42116:131;42242:4;42116:131;:::i;:::-;42108:139;;42006:248;;;:::o;42260:419::-;;42464:2;42453:9;42449:18;42441:26;;42513:9;42507:4;42503:20;42499:1;42488:9;42484:17;42477:47;42541:131;42667:4;42541:131;:::i;:::-;42533:139;;42431:248;;;:::o;42685:419::-;;42889:2;42878:9;42874:18;42866:26;;42938:9;42932:4;42928:20;42924:1;42913:9;42909:17;42902:47;42966:131;43092:4;42966:131;:::i;:::-;42958:139;;42856:248;;;:::o;43110:822::-;;43381:3;43370:9;43366:19;43358:27;;43395:69;43461:1;43450:9;43446:17;43437:6;43395:69;:::i;:::-;43474:72;43542:2;43531:9;43527:18;43518:6;43474:72;:::i;:::-;43593:9;43587:4;43583:20;43578:2;43567:9;43563:18;43556:48;43621:76;43692:4;43683:6;43621:76;:::i;:::-;43613:84;;43707:66;43769:2;43758:9;43754:18;43745:6;43707:66;:::i;:::-;43821:9;43815:4;43811:20;43805:3;43794:9;43790:19;43783:49;43849:76;43920:4;43911:6;43849:76;:::i;:::-;43841:84;;43348:584;;;;;;;;:::o;43938:739::-;;44195:3;44184:9;44180:19;44172:27;;44209:69;44275:1;44264:9;44260:17;44251:6;44209:69;:::i;:::-;44325:9;44319:4;44315:20;44310:2;44299:9;44295:18;44288:48;44353:76;44424:4;44415:6;44353:76;:::i;:::-;44345:84;;44439:70;44505:2;44494:9;44490:18;44481:6;44439:70;:::i;:::-;44556:9;44550:4;44546:20;44541:2;44530:9;44526:18;44519:48;44584:86;44665:4;44656:6;44648;44584:86;:::i;:::-;44576:94;;44162:515;;;;;;;;:::o;44683:719::-;;44930:3;44919:9;44915:19;44907:27;;44944:69;45010:1;44999:9;44995:17;44986:6;44944:69;:::i;:::-;45060:9;45054:4;45050:20;45045:2;45034:9;45030:18;45023:48;45088:76;45159:4;45150:6;45088:76;:::i;:::-;45080:84;;45174:70;45240:2;45229:9;45225:18;45216:6;45174:70;:::i;:::-;45291:9;45285:4;45281:20;45276:2;45265:9;45261:18;45254:48;45319:76;45390:4;45381:6;45319:76;:::i;:::-;45311:84;;44897:505;;;;;;;:::o;45408:1058::-;;45744:3;45733:9;45729:19;45721:27;;45758:69;45824:1;45813:9;45809:17;45800:6;45758:69;:::i;:::-;45874:9;45868:4;45864:20;45859:2;45848:9;45844:18;45837:48;45902:73;45970:4;45961:6;45902:73;:::i;:::-;45894:81;;46022:9;46016:4;46012:20;46007:2;45996:9;45992:18;45985:48;46050:76;46121:4;46112:6;46050:76;:::i;:::-;46042:84;;46136:88;46220:2;46209:9;46205:18;46196:6;46136:88;:::i;:::-;46234:73;46302:3;46291:9;46287:19;46278:6;46234:73;:::i;:::-;46355:9;46349:4;46345:20;46339:3;46328:9;46324:19;46317:49;46383:76;46454:4;46445:6;46383:76;:::i;:::-;46375:84;;45711:755;;;;;;;;;:::o;46472:222::-;;46603:2;46592:9;46588:18;46580:26;;46616:71;46684:1;46673:9;46669:17;46660:6;46616:71;:::i;:::-;46570:124;;;;:::o;46700:332::-;;46859:2;46848:9;46844:18;46836:26;;46872:71;46940:1;46929:9;46925:17;46916:6;46872:71;:::i;:::-;46953:72;47021:2;47010:9;47006:18;46997:6;46953:72;:::i;:::-;46826:206;;;;;:::o;47038:129::-;;47099:20;;:::i;:::-;47089:30;;47128:33;47156:4;47148:6;47128:33;:::i;:::-;47079:88;;;:::o;47173:75::-;;47239:2;47233:9;47223:19;;47213:35;:::o;47254:307::-;;47405:18;47397:6;47394:30;47391:2;;;47427:18;;:::i;:::-;47391:2;47465:29;47487:6;47465:29;:::i;:::-;47457:37;;47549:4;47543;47539:15;47531:23;;47320:241;;;:::o;47567:308::-;;47719:18;47711:6;47708:30;47705:2;;;47741:18;;:::i;:::-;47705:2;47779:29;47801:6;47779:29;:::i;:::-;47771:37;;47863:4;47857;47853:15;47845:23;;47634:241;;;:::o;47881:140::-;;47952:3;47944:11;;47975:3;47972:1;47965:14;48009:4;48006:1;47996:18;47988:26;;47934:87;;;:::o;48027:98::-;;48112:5;48106:12;48096:22;;48085:40;;;:::o;48131:99::-;;48217:5;48211:12;48201:22;;48190:40;;;:::o;48236:168::-;;48353:6;48348:3;48341:19;48393:4;48388:3;48384:14;48369:29;;48331:73;;;;:::o;48410:147::-;;48548:3;48533:18;;48523:34;;;;:::o;48563:169::-;;48681:6;48676:3;48669:19;48721:4;48716:3;48712:14;48697:29;;48659:73;;;;:::o;48738:148::-;;48877:3;48862:18;;48852:34;;;;:::o;48892:305::-;;48951:20;48969:1;48951:20;:::i;:::-;48946:25;;48985:20;49003:1;48985:20;:::i;:::-;48980:25;;49139:1;49071:66;49067:74;49064:1;49061:81;49058:2;;;49145:18;;:::i;:::-;49058:2;49189:1;49186;49182:9;49175:16;;48936:261;;;;:::o;49203:185::-;;49260:20;49278:1;49260:20;:::i;:::-;49255:25;;49294:20;49312:1;49294:20;:::i;:::-;49289:25;;49333:1;49323:2;;49338:18;;:::i;:::-;49323:2;49380:1;49377;49373:9;49368:14;;49245:143;;;;:::o;49394:191::-;;49454:20;49472:1;49454:20;:::i;:::-;49449:25;;49488:20;49506:1;49488:20;:::i;:::-;49483:25;;49527:1;49524;49521:8;49518:2;;;49532:18;;:::i;:::-;49518:2;49577:1;49574;49570:9;49562:17;;49439:146;;;;:::o;49591:96::-;;49657:24;49675:5;49657:24;:::i;:::-;49646:35;;49636:51;;;:::o;49693:104::-;;49767:24;49785:5;49767:24;:::i;:::-;49756:35;;49746:51;;;:::o;49803:90::-;;49880:5;49873:13;49866:21;49855:32;;49845:48;;;:::o;49899:77::-;;49965:5;49954:16;;49944:32;;;:::o;49982:149::-;;50058:66;50051:5;50047:78;50036:89;;50026:105;;;:::o;50137:89::-;;50213:6;50206:5;50202:18;50191:29;;50181:45;;;:::o;50232:126::-;;50309:42;50302:5;50298:54;50287:65;;50277:81;;;:::o;50364:77::-;;50430:5;50419:16;;50409:32;;;:::o;50447:101::-;;50523:18;50516:5;50512:30;50501:41;;50491:57;;;:::o;50554:86::-;;50629:4;50622:5;50618:16;50607:27;;50597:43;;;:::o;50646:154::-;50730:6;50725:3;50720;50707:30;50792:1;50783:6;50778:3;50774:16;50767:27;50697:103;;;:::o;50806:307::-;50874:1;50884:113;50898:6;50895:1;50892:13;50884:113;;;50983:1;50978:3;50974:11;50968:18;50964:1;50959:3;50955:11;50948:39;50920:2;50917:1;50913:10;50908:15;;50884:113;;;51015:6;51012:1;51009:13;51006:2;;;51095:1;51086:6;51081:3;51077:16;51070:27;51006:2;50855:258;;;;:::o;51119:320::-;;51200:1;51194:4;51190:12;51180:22;;51247:1;51241:4;51237:12;51268:18;51258:2;;51324:4;51316:6;51312:17;51302:27;;51258:2;51386;51378:6;51375:14;51355:18;51352:38;51349:2;;;51405:18;;:::i;:::-;51349:2;51170:269;;;;:::o;51445:281::-;51528:27;51550:4;51528:27;:::i;:::-;51520:6;51516:40;51658:6;51646:10;51643:22;51622:18;51610:10;51607:34;51604:62;51601:2;;;51669:18;;:::i;:::-;51601:2;51709:10;51705:2;51698:22;51488:238;;;:::o;51732:233::-;;51794:24;51812:5;51794:24;:::i;:::-;51785:33;;51840:66;51833:5;51830:77;51827:2;;;51910:18;;:::i;:::-;51827:2;51957:1;51950:5;51946:13;51939:20;;51775:190;;;:::o;51971:94::-;;52038:21;52053:5;52038:21;:::i;:::-;52027:32;;52017:48;;;:::o;52071:79::-;;52139:5;52128:16;;52118:32;;;:::o;52156:176::-;;52205:20;52223:1;52205:20;:::i;:::-;52200:25;;52239:20;52257:1;52239:20;:::i;:::-;52234:25;;52278:1;52268:2;;52283:18;;:::i;:::-;52268:2;52324:1;52321;52317:9;52312:14;;52190:142;;;;:::o;52338:180::-;52386:77;52383:1;52376:88;52483:4;52480:1;52473:15;52507:4;52504:1;52497:15;52524:180;52572:77;52569:1;52562:88;52669:4;52666:1;52659:15;52693:4;52690:1;52683:15;52710:180;52758:77;52755:1;52748:88;52855:4;52852:1;52845:15;52879:4;52876:1;52869:15;52896:180;52944:77;52941:1;52934:88;53041:4;53038:1;53031:15;53065:4;53062:1;53055:15;53082:102;;53174:2;53170:7;53165:2;53158:5;53154:14;53150:28;53140:38;;53130:54;;;:::o;53190:96::-;;53273:5;53268:3;53264:15;53243:36;;53233:53;;;:::o;53292:291::-;53432:34;53428:1;53420:6;53416:14;53409:58;53501:34;53496:2;53488:6;53484:15;53477:59;53570:5;53565:2;53557:6;53553:15;53546:30;53398:185;:::o;53589:237::-;53729:34;53725:1;53717:6;53713:14;53706:58;53798:20;53793:2;53785:6;53781:15;53774:45;53695:131;:::o;53832:225::-;53972:34;53968:1;53960:6;53956:14;53949:58;54041:8;54036:2;54028:6;54024:15;54017:33;53938:119;:::o;54063:223::-;54203:34;54199:1;54191:6;54187:14;54180:58;54272:6;54267:2;54259:6;54255:15;54248:31;54169:117;:::o;54292:175::-;54432:27;54428:1;54420:6;54416:14;54409:51;54398:69;:::o;54473:233::-;54613:34;54609:1;54601:6;54597:14;54590:58;54682:16;54677:2;54669:6;54665:15;54658:41;54579:127;:::o;54712:176::-;54852:28;54848:1;54840:6;54836:14;54829:52;54818:70;:::o;54894:221::-;55034:34;55030:1;55022:6;55018:14;55011:58;55103:4;55098:2;55090:6;55086:15;55079:29;55000:115;:::o;55121:169::-;55261:21;55257:1;55249:6;55245:14;55238:45;55227:63;:::o;55296:231::-;55436:34;55432:1;55424:6;55420:14;55413:58;55505:14;55500:2;55492:6;55488:15;55481:39;55402:125;:::o;55533:176::-;55673:28;55669:1;55661:6;55657:14;55650:52;55639:70;:::o;55715:243::-;55855:34;55851:1;55843:6;55839:14;55832:58;55924:26;55919:2;55911:6;55907:15;55900:51;55821:137;:::o;55964:229::-;56104:34;56100:1;56092:6;56088:14;56081:58;56173:12;56168:2;56160:6;56156:15;56149:37;56070:123;:::o;56199:228::-;56339:34;56335:1;56327:6;56323:14;56316:58;56408:11;56403:2;56395:6;56391:15;56384:36;56305:122;:::o;56433:230::-;56573:34;56569:1;56561:6;56557:14;56550:58;56642:13;56637:2;56629:6;56625:15;56618:38;56539:124;:::o;56669:182::-;56809:34;56805:1;56797:6;56793:14;56786:58;56775:76;:::o;56857:231::-;56997:34;56993:1;56985:6;56981:14;56974:58;57066:14;57061:2;57053:6;57049:15;57042:39;56963:125;:::o;57094:182::-;57234:34;57230:1;57222:6;57218:14;57211:58;57200:76;:::o;57282:239::-;57422:34;57418:1;57410:6;57406:14;57399:58;57491:22;57486:2;57478:6;57474:15;57467:47;57388:133;:::o;57527:173::-;57667:25;57663:1;57655:6;57651:14;57644:49;57633:67;:::o;57706:228::-;57846:34;57842:1;57834:6;57830:14;57823:58;57915:11;57910:2;57902:6;57898:15;57891:36;57812:122;:::o;57940:234::-;58080:34;58076:1;58068:6;58064:14;58057:58;58149:17;58144:2;58136:6;58132:15;58125:42;58046:128;:::o;58180:174::-;58320:26;58316:1;58308:6;58304:14;58297:50;58286:68;:::o;58360:220::-;58500:34;58496:1;58488:6;58484:14;58477:58;58569:3;58564:2;58556:6;58552:15;58545:28;58466:114;:::o;58586:::-;58692:8;:::o;58706:236::-;58846:34;58842:1;58834:6;58830:14;58823:58;58915:19;58910:2;58902:6;58898:15;58891:44;58812:130;:::o;58948:225::-;59088:34;59084:1;59076:6;59072:14;59065:58;59157:8;59152:2;59144:6;59140:15;59133:33;59054:119;:::o;59179:122::-;59252:24;59270:5;59252:24;:::i;:::-;59245:5;59242:35;59232:2;;59291:1;59288;59281:12;59232:2;59222:79;:::o;59307:138::-;59388:32;59414:5;59388:32;:::i;:::-;59381:5;59378:43;59368:2;;59435:1;59432;59425:12;59368:2;59358:87;:::o;59451:116::-;59521:21;59536:5;59521:21;:::i;:::-;59514:5;59511:32;59501:2;;59557:1;59554;59547:12;59501:2;59491:76;:::o;59573:120::-;59645:23;59662:5;59645:23;:::i;:::-;59638:5;59635:34;59625:2;;59683:1;59680;59673:12;59625:2;59615:78;:::o;59699:120::-;59771:23;59788:5;59771:23;:::i;:::-;59764:5;59761:34;59751:2;;59809:1;59806;59799:12;59751:2;59741:78;:::o;59825:122::-;59898:24;59916:5;59898:24;:::i;:::-;59891:5;59888:35;59878:2;;59937:1;59934;59927:12;59878:2;59868:79;:::o;59953:120::-;60025:23;60042:5;60025:23;:::i;:::-;60018:5;60015:34;60005:2;;60063:1;60060;60053:12;60005:2;59995:78;:::o;60079:118::-;60150:22;60166:5;60150:22;:::i;:::-;60143:5;60140:33;60130:2;;60187:1;60184;60177:12;60130:2;60120:77;:::o
Swarm Source
ipfs://8d9a39d0f918e9d813e4d052651501e7cd3b9605bad63131f15c2f481064f5d6
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.