Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14623987 | 829 days ago | IN | 0 ETH | 0.34321358 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ERC721ARandomizedCollection
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // // // .;dkkkkkkkkkkkkkkkkkkd' .:xkkkkkkkkd, .:dk0XXXXXXXK0xdl,. .lxkkkkkkkkkkkkkkkkkk:.,okkkkkkko. .cxkkkkkkxc. ;dkkkkkko. // // ;xNMMMMMMMMMMMMMMMMMMMX: .:kNWMMMMMMMMWx. .l0NWWWWWMMMMMMMMMWNO;..lKWMMMMMMMMMMMMMMMMMMMKkKWMMMMMMMK, .c0WMMMMMMMMX: .;xXWMMMMMNo. // // .,lddddddddddddddddxKMMMK; .,lddddddx0WMMMX; .;llc::;;::cox0XWMMMMMWXdcoddddddddddddddddONMW0ddddddxXMMMK, .:odddddONMMMMO' .,lddddd0WWd. // // .. .dWWKl. . :XMMMWx. ... .,oKWMMMMWx. ,KMNc .kMMM0, .. .xWMMMWx'. 'kNk. // // .. .dKo' .. .xWMMMK; .. .'.. ,OWWMMWx. ,Okc' .kMMMK, .. ,0MMMMXl. .dNO' // // .. .:ooo;......,' . :XMMMWd. . .l0XXOc. ;xKMWNo. ,looc'......'... .kMMMK, .. cXMMM0, .oNK; // // .. '0MMMk. .. .kWMMMK,.' ;KMMMWNo. .;kNkc,. .dWMMK: .. .kMMMK, .. .dWMXc cXK: // // .. '0MMMXkxxxxxxxxd' . .:. cXMMMWd,' '0MMMMM0l;;;;;;:c;. .. .dWMMW0xxxxxxxxx; .kMMMK, .. 'ONd. :KXc // // .. '0MMMMMMMMMMMMMNc .. :O: .kMMMMK:. 'd0NWMWWWWWWWNXOl'... .dWMMMMMMMMMMMMWl .kMMMK, . :d' ;0No. // // .. .lkkkkkkkkkKWMMNc . .dNd. cNMMMWo.. .':dOXWMMMMMMMWXk:. :xkkkkkkkk0NMMWl .kMMMK, . . 'ONd. // // .. .oNMXd... '0M0' .kMMMM0, .. .;o0NMMMMMMWx. ,0MN0: .kMMMK, .. .kW0' // // .. cKk, . lNMNl cNMMMNo .',.. .;xXWMMMWx. 'O0c'. .kMMMK, .. .xWMO. // // .. .,ccc,.....,,. .. .kMMMk. .OMMMW0;'d0XX0xc,. :d0MMWx. ':cc:'....';. .. .kMMMK, .. .oNMMO. // // .. '0MMMk. .. ,kKKKk' lNMMMN0KWWWMMMWNKl. cXMWx. .dWMMX: .. .kMMMK, .. .OMMMO. // // .. '0MMMk'.......... ..... 'OMMKo:::::cxNMMMKl'. .OMWx. .dWMMXc.......... .kMMMK:.........,' .OMMMO. // // .. '0MMMNXKKKKKKKKd. lNM0' ;XMMMWN0c .OMWd. .dWMMWXKKKKKKKK0c .kMMMWXKKKKKKKKK0: .OMMMO. // // .. 'OWWWWWWWWWWMMNc 'llc' . '0MNc .kWMMMMX: ,KXx:. .oNWWWWWWWWWWMMWl .xWWWWWWWWWWWMMMN: .OMMMO. // // .. ,:::::::::cOWO. .xWWO' . oNMO' .lkOOx;. .'cd,... .::::::::::dXMWl '::::::::::xWMMX: .OMMWx. // // .. dNl ,0Xd. .. ,0MNo. . ..'. .. ,0WK: :NWOo, .OWKo. // // .' .oO, .co, .. .oOc.... ... .. ,xo,.. ckl..'. 'dd' // // ............................. .......... . .. . ..................... ..................... ......... // // // // // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /** * The contracts below implement a lazy-minted, randomized collection of ERC721A. * It requires that the creator knows the total number of NFTs they want and all belong to a token * directory, commonly will be an IPFS hash, with all the metadata from 0 to the #NFTs - 1. * * It has two main methods to lazy-mint: * One allows the owner or alternate signer to approve single-use signatures for specific wallet addresses * The other allows a general mint, multi-use signature that anyone can use. * * Minting from this collection is always random, this can be done with either a reveal mechanism that * has an optional random offset, or on-chain randomness for revealed collections, or a mix of both! * * Only with a reveal mechanism, does the price of minting utilize ERC721A improvements. */ /** * @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); } /** * @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; } } /** * @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; } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title 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); } /** * @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; } } /** * @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 internal _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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); } } } } /** * @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); } } /** * @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}. * * This ERC721A is set up to better handle batch transactions. It has two layers of optimization: * * First, it assumes tokens are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..) * which allows for up to 5 times cheaper MINT gas fees, but does increase first time TRANSFER gas fees. * Because of this, methods have also been optimized to only call ownerOf() once as it is not a direct lookup. * * Second, it allows a permanent switch to non-sequential mint with still reduced fees because the {_mint} * only updates {_owners} and not {_balances} so that a batch mint method can update _balances a single time. * * Additionally assumes that an owner cannot have more than 2**128 - 1 (max value of uint128) of supply. */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; struct AddressData { uint128 balance; uint128 numberMinted; } // Token name string internal _name; // Token symbol string internal _symbol; // Tracking total minted // Only used when `_isSequential` is false uint256 internal _totalMinted; // Tracking total burned uint256 internal _totalBurned; // Tracking the next sequential mint uint256 internal _nextSequential; // This ensures that ownerOf() can still run in constant time with a max runtime // of checking 5 values, but is up to 5 times cheaper on batch mints. uint256 internal constant SEQ_MINT_LIMIT = 5; // Tracking if the collection is still sequentially minted bool internal _notSequentialMint; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping from token ID to burned // This is necessary because to optimize gas fees for multiple mints a token with // `_owners[tokenId] = address(0)` is not necessarily a token with no owner. mapping(uint256 => bool) internal _burned; // Mapping owner address to token count mapping(address => AddressData) internal _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].balance; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: owner query for nonexistent token"); if (_owners[tokenId] != address(0)) { return _owners[tokenId]; } if (tokenId < _nextSequential) { uint256 lowestTokenToCheck; if (tokenId >= SEQ_MINT_LIMIT) { lowestTokenToCheck = tokenId - SEQ_MINT_LIMIT + 1; } for (uint256 i = tokenId - 1; i >= lowestTokenToCheck; i--) { if (_owners[i] != address(0)) { return _owners[i]; } } } return address(0); } /** * @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 Returns the total current supply of the contract. * * WARNING - Underlying variables do NOT get automatically updated on mints * so that we can save gas on transactions that mint multiple tokens. * */ function totalSupply() public view virtual returns (uint256) { return totalMinted() - _totalBurned; } /** * @dev Returns the total ever minted from this contract. * * WARNING - Underlying variable do NOT get automatically updated on mints * so that we can save gas on transactions that mint multiple tokens. * */ function totalMinted() public view virtual returns (uint256) { if (_notSequentialMint) { return _totalMinted; } return _nextSequential; } /** * @dev returns how many tokens the given address has minted. */ function mintCount(address addr) external view returns (uint256) { return _balances[addr].numberMinted; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721: 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 = 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, owner); } /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { address owner = ownerOf(tokenId); require( _isApprovedOrOwner(_msgSender(), tokenId, owner), "ERC721: transfer caller is not owner nor approved" ); require(owner == from, "ERC721: transfer of token that is not own"); _transferIgnoreOwner(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * This was modified to not call _safeTransfer because that would require fetching * ownerOf() twice which is more expensive than doing it together. * * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { address owner = ownerOf(tokenId); require( _isApprovedOrOwner(_msgSender(), tokenId, owner), "ERC721: transfer caller is not owner nor approved" ); require(owner == from, "ERC721: transfer of token that is not own"); _safeTransferIgnoreOwner(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 This is for functions which already get the owner of the tokenId and can do the check * for `ownerOf(tokenId) == from` because ownerOf() in 721A is potentially an expensive function * and should not be called twice if not needed * * WARNING this method does not check for tokenOwner. This is done because with the * gas optimization calling ownerOf can be an expensive calculation and should only be done once (in the outer most layer) */ function _safeTransferIgnoreOwner( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transferIgnoreOwner(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) { if (_burned[tokenId]) { return false; } if (tokenId < _nextSequential) { return true; } return _owners[tokenId] != address(0); } /** * @dev Returns whether `sender` is allowed to manage `tokenId`. * This is for functions which already get the owner of the tokenId because ownerOf() in * 721A is potentially an expensive function and should not be called twice if not needed * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner( address sender, uint256 tokenId, address owner ) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); return (sender == owner || getApproved(tokenId) == sender || isApprovedForAll(owner, sender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * WARNING - this method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on batch transactions * * 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. * * WARNING: This method does not update totalSupply, please update that externally. Doing so * will allow us to save gas on batch transactions */ 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 * WARNING: This method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on transactions that mint more than one NFT * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(_notSequentialMint, "_notSequentialMint must be true"); require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } // Sequential mint doesn't match _beforeTokenTransfer and instead has a different optional override. function _beforeSequentialMint( address to, uint256 starting, uint256 quantity ) internal virtual {} /** * @dev Mints from `_nextSequential` to `_nextSequential + quantity` and transfers it to `to`. * * WARNING: This method does not update totalSupply or _balances, please update that externally. Doing so * will allow us to save gas on transactions that mint more than one NFT * * Requirements: * * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _safeMintSequential(address to, uint256 quantity) internal virtual { require(!_notSequentialMint, "_notSequentialMint must be false"); require(to != address(0), "ERC721: mint to the zero address"); _beforeSequentialMint(to, _nextSequential, quantity); uint256 lastNum = _nextSequential + quantity; // ensures ownerOf runs quickly even if user is minting a large number like 100 for (uint256 i = _nextSequential; i < lastNum; i += SEQ_MINT_LIMIT) { _owners[i] = to; } // Gas is cheaper to have two separate for loops for (uint256 i = _nextSequential; i < lastNum; i++) { require( _checkOnERC721Received(address(0), to, i, ""), "ERC721: transfer to non ERC721Receiver implementer" ); emit Transfer(address(0), to, i); } _balances[to] = AddressData( _balances[to].balance + uint128(quantity), _balances[to].numberMinted + uint128(quantity) ); _nextSequential = lastNum; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. Since owners[tokenId] can be * the zero address for batch mints, this has been changed to modify _burned mapping instead * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); require( _isApprovedOrOwner(_msgSender(), tokenId, owner), "Caller is not owner nor approved" ); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId, owner); _balances[owner].balance -= 1; _totalBurned += 1; _burned[tokenId] = true; 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( ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); _transferIgnoreOwner(from, to, tokenId); } /** * @dev This is for functions which already get the owner of the tokenId and can do the check * for `ownerOf(tokenId) == from` because ownerOf() in 721A is potentially an expensive function * and should not be called twice if not needed * * WARNING this method does not check for tokenOwner. This is done because with the * gas optimization calling ownerOf can be an expensive calculation and should only be done once (in the outer most layer) */ function _transferIgnoreOwner( address from, address to, uint256 tokenId ) internal virtual { require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId, from); _balances[from].balance -= 1; _balances[to].balance += 1; _owners[tokenId] = to; uint256 nextTokenId = tokenId + 1; if (nextTokenId < _nextSequential) { if (_owners[nextTokenId] == address(0)) { _owners[nextTokenId] = from; } } emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) internal virtual { if (_tokenApprovals[tokenId] != to) { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } } /** * @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 {} } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and( vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if ( uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 ) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); } } /** * @dev Interface for the NFT Royalty Standard */ interface IERC2981 is IERC165 { /** * ERC165 bytes to add to interface array - set in parent contract * implementing this standard * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; * _registerInterface(_INTERFACE_ID_ERC2981); */ /** * @notice Called with the sale price to determine how much royalty * is owed and to whom. * @param _tokenId - the NFT asset queried for royalty information * @param _salePrice - the sale price of the NFT asset specified by _tokenId * @return receiver - address of who should be sent the royalty payment * @return royaltyAmount - the royalty payment amount for _salePrice */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } /** * @dev External interface of the EaselyPayout contract */ interface IEaselyPayout { /** * @dev Takes in a payable amount and splits it among the given royalties. * Also takes a cut of the payable amount depending on the sender and the primaryPayout address. * Ensures that this method never splits over 100% of the payin amount. */ function splitPayable( address primaryPayout, address[] memory royalties, uint256[] memory bps ) external payable; } /** * @dev Extension of the ERC721 contract that integrates a marketplace so that simple lazy-sales * do not have to be done on another contract. This saves gas fees on secondary sales because * buyers will not have to pay a gas fee to setApprovalForAll for another marketplace contract after buying. * * Easely will help power the lazy-selling as well as lazy minting that take place on * directly on the collection, which is why we take a cut of these transactions. Our cut can * be publically seen in the connected EaselyPayout contract and cannot exceed 5%. * * Owners also set a dual signer which they can change at any time. This dual signer helps enable * sales for large batches of addresses without needing to manually sign hundreds or thousands of hashes. * It also makes phishing scams harder as both signatures need to be compromised before an unwanted sale can occur. * * Owner also has an option to allow token owners to loan their tokens to other users which makes the token * untradeable until the original owner reclaims the token. */ abstract contract ERC721Marketplace is ERC721A, Ownable { using ECDSA for bytes32; using Strings for uint256; // Allows token owners to loan tokens to other addresses. bool public loaningActive; /* see {IEaselyPayout} for more */ address public constant PAYOUT_CONTRACT_ADDRESS = 0xa95850bB73459ADB9587A97F103a4A7CCe59B56E; uint256 private constant TIME_PER_DECREMENT = 300; /* Basis points or BPS are 1/100th of a percent, so 10000 basis points accounts for 100% */ uint256 public constant BPS_TOTAL = 10000; /* Max basis points for the owner for secondary sales of this collection */ uint256 public constant MAX_SECONDARY_BPS = 1000; /* Default payout percent if there is no signature set */ uint256 private constant DEFAULT_PAYOUT_BPS = 500; /* Signer for initializing splits to ensure splits were agreed upon by both parties */ address private constant VERIFIED_CONTRACT_SIGNER = 0x1BAAd9BFa20Eb279d2E3f3e859e3ae9ddE666c52; /* * Optional addresses to distribute referral commission for this collection * * Referral commission is taken from easely's cut */ address public referralAddress; /* * Optional addresses to distribute partnership comission for this collection * * Partnership commission is taken in addition to easely's cut */ address public partnershipAddress; /* Optional addresses to distribute revenue of primary sales of this collection */ address public revenueShareAddress; /* Enables dual address signatures to lazy mint */ address public dualSignerAddress; struct WithdrawSplits { /* Optional basis points for the owner for secondary sales of this collection */ uint64 ownerRoyaltyBPS; /* Basis points for easely's payout contract */ uint64 payoutBPS; /* Optional basis points for revenue sharing the owner wants to set up */ uint64 revenueShareBPS; /* * Optional basis points for collections that have been referred. * * Contracts with this will have a reduced easely's payout cut so that * the creator's cut is unaffected */ uint32 referralBPS; /* * Optional basis points for collections that require partnerships * * Contracts with this will have this fee on top of easely's payout cut because the partnership * will offer advanced web3 integration of this contract in some form beyond what easely provides. */ uint32 partnershipBPS; } WithdrawSplits public splits; mapping(uint256 => address) internal _tokenOwnersOnLoan; /* Mapping to the active version for all signed transactions */ mapping(address => uint256) internal _addressToActiveVersion; /* Cancelled or finalized sales by hash to determine buyabliity */ mapping(bytes32 => bool) internal _cancelledOrFinalizedSales; // Events related to lazy selling event SaleCancelled(address indexed seller, bytes32 hash); event SaleCompleted( address indexed seller, address indexed buyer, uint256 indexed tokenId, uint256 price, bytes32 hash ); // Events related to loaning event LoaningActive(bool active); event Loan( address indexed from, address indexed to, uint256 indexed tokenId ); event LoanRetrieved( address indexed from, address indexed to, uint256 indexed tokenId ); // Miscellaneous events event VersionChanged(address indexed seller, uint256 version); event DualSignerChanged(address newSigner); event BalanceWithdrawn(uint256 balance); event RoyaltyUpdated(uint256 bps); event WithdrawSplitsSet( address indexed revenueShareAddress, address indexed referralAddress, address indexed partnershipAddress, uint256 payoutBPS, uint256 revenueShareBPS, uint256 referralBPS, uint256 partnershipBPS ); /** * @dev initializes all of the addresses and percentage of withdrawn funds that * each address will get. These addresses and BPS splits must be signed by both the * verified easely wallet and the creator of the contract. If a signature is missing * the contract has a default of 5% to the easely payout wallet. */ function _initWithdrawSplits( address creator_, address revenueShareAddress_, address referralAddress_, address partnershipAddress_, uint256 payoutBPS_, uint256 ownerRoyaltyBPS_, uint256 revenueShareBPS_, uint256 referralBPS_, uint256 partnershipBPS_, bytes[2] memory signatures ) internal virtual { revenueShareAddress = revenueShareAddress_; require( ownerRoyaltyBPS_ <= MAX_SECONDARY_BPS, "Cannot take more than 10% of secondaries" ); if (signatures[1].length == 0) { require( DEFAULT_PAYOUT_BPS + revenueShareBPS_ <= BPS_TOTAL, "BPS splits too high" ); splits = WithdrawSplits( uint64(ownerRoyaltyBPS_), uint64(DEFAULT_PAYOUT_BPS), uint64(revenueShareBPS_), uint32(0), uint32(0) ); emit WithdrawSplitsSet( revenueShareAddress_, address(0), address(0), DEFAULT_PAYOUT_BPS, revenueShareBPS_, 0, 0 ); } else { require( payoutBPS_ + referralBPS_ + partnershipBPS_ + revenueShareBPS_ <= BPS_TOTAL, "BPS splits too high" ); bytes memory encoded = abi.encode( "InitializeSplits", creator_, revenueShareAddress_, referralAddress_, partnershipAddress_, payoutBPS_, revenueShareBPS_, referralBPS_, partnershipBPS_ ); bytes32 hash = ECDSA.toEthSignedMessageHash(keccak256(encoded)); require( hash.recover(signatures[0]) == creator_, "Not signed by creator" ); require( hash.recover(signatures[1]) == VERIFIED_CONTRACT_SIGNER, "Not signed by verified address" ); referralAddress = referralAddress_; partnershipAddress = partnershipAddress_; splits = WithdrawSplits( uint64(ownerRoyaltyBPS_), uint64(payoutBPS_), uint64(revenueShareBPS_), uint32(referralBPS_), uint32(partnershipBPS_) ); emit WithdrawSplitsSet( revenueShareAddress_, referralAddress_, partnershipAddress_, payoutBPS_, revenueShareBPS_, referralBPS_, partnershipBPS_ ); } emit RoyaltyUpdated(ownerRoyaltyBPS_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(Ownable).interfaceId || interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @dev see {IERC2981-supportsInterface} */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { uint256 royalty = (_salePrice * splits.ownerRoyaltyBPS) / BPS_TOTAL; return (owner(), royalty); } /** * @dev See {_currentPrice} */ function getCurrentPrice(uint256[4] memory pricesAndTimestamps) external view returns (uint256) { return _currentPrice(pricesAndTimestamps); } /** * @dev Returns the current activeVersion of an address both used to create signatures * and to verify signatures of {buyToken} and {buyNewToken} */ function getActiveVersion(address address_) external view returns (uint256) { return _addressToActiveVersion[address_]; } /** * This function, while callable by anybody will always ONLY withdraw the * contract's balance to: * * the owner's account * the addresses the owner has set up for revenue share * the easely payout contract cut - capped at 5% but can be lower for some users * * This is callable by anybody so that Easely can set up automatic payouts * after a contract has reached a certain minimum to save creators the gas fees * involved in withdrawing balances. */ function withdrawBalance(uint256 withdrawAmount) external { if (withdrawAmount > address(this).balance) { withdrawAmount = address(this).balance; } uint256 payoutBasis = withdrawAmount / BPS_TOTAL; if (splits.revenueShareBPS > 0) { payable(revenueShareAddress).transfer( payoutBasis * splits.revenueShareBPS ); } if (splits.referralBPS > 0) { payable(referralAddress).transfer(payoutBasis * splits.referralBPS); } if (splits.partnershipBPS > 0) { payable(partnershipAddress).transfer( payoutBasis * splits.partnershipBPS ); } payable(PAYOUT_CONTRACT_ADDRESS).transfer( payoutBasis * splits.payoutBPS ); uint256 remainingAmount = withdrawAmount - payoutBasis * (splits.revenueShareBPS + splits.partnershipBPS + splits.referralBPS + splits.payoutBPS); payable(owner()).transfer(remainingAmount); emit BalanceWithdrawn(withdrawAmount); } /** * @dev Allows the owner to change who the dual signer is */ function setDualSigner(address alt) external onlyOwner { dualSignerAddress = alt; emit DualSignerChanged(alt); } /** * @dev see {_setSecondary} */ function setRoyaltiesBPS(uint256 newBPS) external onlyOwner { require( newBPS <= MAX_SECONDARY_BPS, "Cannot take more than 10% of secondaries" ); splits.ownerRoyaltyBPS = uint64(newBPS); emit RoyaltyUpdated(newBPS); } /** * @dev Usable by any user to update the version that they want their signatures to check. This is helpful if * an address wants to mass invalidate their signatures without having to call cancelSale on each one. */ function updateVersion(uint256 version) external { _addressToActiveVersion[_msgSender()] = version; emit VersionChanged(_msgSender(), version); } /** * @dev To be updated by contract owner to allow for the loan functionality to be toggled */ function setLoaningActive(bool _loaningActive) public onlyOwner { loaningActive = _loaningActive; emit LoaningActive(_loaningActive); } /** * @dev Returns who is loaning the given tokenId */ function tokenOwnerOnLoan(uint256 tokenId) external view returns (address) { require(_exists(tokenId), "This token does not exist"); return _tokenOwnersOnLoan[tokenId]; } /** * @notice Allow owner to loan their tokens to other addresses */ function loan(uint256 tokenId, address receiver) external { address msgSender = msg.sender; require(loaningActive, "Loans not active"); // Transfer the token // _safeTransfer checks that msgSender is the tokenOwner _safeTransfer(msgSender, receiver, tokenId, ""); // Add it to the mapping of originally loaned tokens _tokenOwnersOnLoan[tokenId] = msgSender; emit Loan(msgSender, receiver, tokenId); } /** * @notice Allow owner to loan their tokens to other addresses */ function retrieveLoan(uint256 tokenId) external { address borrowerAddress = ownerOf(tokenId); address msgSender = msg.sender; require( _tokenOwnersOnLoan[tokenId] == msgSender, "Sender is not the token loaner" ); // Remove it from the array of loaned out tokens delete _tokenOwnersOnLoan[tokenId]; // Transfer the token back _safeTransfer(borrowerAddress, msgSender, tokenId, ""); emit LoanRetrieved(borrowerAddress, msgSender, tokenId); } /** * @dev helper method get ownerRoyalties into an array form */ function _ownerRoyalties() internal view returns (address[] memory) { address[] memory ownerRoyalties = new address[](1); ownerRoyalties[0] = owner(); return ownerRoyalties; } /** * @dev helper method get secondary BPS into array form */ function _ownerBPS() internal view returns (uint256[] memory) { uint256[] memory ownerBPS = new uint256[](1); ownerBPS[0] = splits.ownerRoyaltyBPS; return ownerBPS; } /** * @dev See {ERC721-_beforeTokenTransfer}. * * makes sure tokens on loan can't be transferred */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721A) { super._beforeTokenTransfer(from, to, tokenId); require( _tokenOwnersOnLoan[tokenId] == address(0), "Cannot transfer token on loan" ); } /** * @dev Checks if an address is either the owner, or the approved alternate signer. */ function _checkValidSigner(address signer) internal view { require( signer == owner() || signer == dualSignerAddress, "Not valid signer." ); } /** * @dev Hash an order, returning the hash that a client must sign, including the standard message prefix * @return Hash of message prefix and order hash per Ethereum format */ function _hashForSale( address owner, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner, version, nonce, tokenId, pricesAndTimestamps ) ); } /** * @dev Hash an order, returning the hash that a client must sign, including the standard message prefix * @return Hash of message prefix and order hash per Ethereum format */ function _hashToCheckForSale( address owner, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForSale( owner, version, nonce, tokenId, pricesAndTimestamps ) ); } /** * @dev Current price for a sale which is calculated for the case of a descending sale. So * the ending price must be less than the starting price and the timestamp is active. * Standard single fare sales will have a matching starting and ending price. */ function _currentPrice(uint256[4] memory pricesAndTimestamps) internal view returns (uint256) { uint256 startingPrice = pricesAndTimestamps[0]; uint256 endingPrice = pricesAndTimestamps[1]; uint256 startingTimestamp = pricesAndTimestamps[2]; uint256 endingTimestamp = pricesAndTimestamps[3]; uint256 currTime = block.timestamp; require(currTime >= startingTimestamp, "Has not started yet"); require( startingTimestamp < endingTimestamp, "Must end after it starts" ); require(startingPrice >= endingPrice, "Ending price cannot be bigger"); if (startingPrice == endingPrice || currTime > endingTimestamp) { return endingPrice; } uint256 diff = startingPrice - endingPrice; uint256 decrements = (currTime - startingTimestamp) / TIME_PER_DECREMENT; if (decrements == 0) { return startingPrice; } // decrements will equal 0 before totalDecrements does so we will not divide by 0 uint256 totalDecrements = (endingTimestamp - startingTimestamp) / TIME_PER_DECREMENT; return startingPrice - (diff / totalDecrements) * decrements; } /** * @dev Checks if a hash has been signed by a signer, and if this contract has a dual signer, * that the dual signer has also signed the hash */ function _checkHashAndSignatures( bytes32 hash, address signer, bytes memory signature, bytes memory dualSignature ) internal view { require(!_cancelledOrFinalizedSales[hash], "Sale no longer active"); require( hash.recover(signature) == signer, "Not signed by current owner" ); require( dualSignerAddress == address(0) || hash.recover(dualSignature) == dualSignerAddress, "Not signed by dual signer" ); } /** * @dev Usable by the owner of any token initiate a sale for their token. This does not * lock the tokenId and the owner can freely trade their token, but doing so will * invalidate the ability for others to buy. */ function hashToSignToSellToken( uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) external view returns (bytes32) { require(_msgSender() == ownerOf(tokenId), "Not the owner of the token"); return _hashForSale( _msgSender(), version, nonce, tokenId, pricesAndTimestamps ); } /** * @dev Usable to cancel hashes generated from {hashToSignToSellToken} */ function cancelSale( uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps ) external { bytes32 hash = _hashToCheckForSale( _msgSender(), version, nonce, tokenId, pricesAndTimestamps ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev With a hash signed by the method {hashToSignToSellToken} any user sending enough value can buy * the token from the seller. Tokens not owned by the contract owner are all considered secondary sales and * will give a cut to the owner of the contract based on the secondaryOwnerBPS. */ function buyToken( address seller, uint256 version, uint256 nonce, uint256 tokenId, uint256[4] memory pricesAndTimestamps, bytes memory signature, bytes memory dualSignature ) external payable { uint256 currentPrice = _currentPrice(pricesAndTimestamps); require( _addressToActiveVersion[seller] == version, "Incorrect signature version" ); require(msg.value >= currentPrice, "Not enough ETH to buy"); bytes32 hash = _hashToCheckForSale( seller, version, nonce, tokenId, pricesAndTimestamps ); _checkHashAndSignatures(hash, seller, signature, dualSignature); _cancelledOrFinalizedSales[hash] = true; emit SaleCompleted(seller, _msgSender(), tokenId, currentPrice, hash); _safeTransfer(seller, _msgSender(), tokenId, ""); if (seller != owner()) { IEaselyPayout(PAYOUT_CONTRACT_ADDRESS).splitPayable{ value: currentPrice }(seller, _ownerRoyalties(), _ownerBPS()); } payable(_msgSender()).transfer(msg.value - currentPrice); } } /** * @dev This implements a lazy-minted, randomized collection of ERC721A. * It requires that the creator knows the total number of NFTs they want and all belong to a token * directory, commonly will be an IPFS hash, with all the metadata from 0 to the #NFTs - 1. * * It has two main methods to lazy-mint: * One allows the owner or alternate signer to approve single-use signatures for specific wallet addresses * The other allows a general mint, multi-use signature that anyone can use. * * Minting from this collection is always random, this can be done with either a reveal mechanism that * has an optional random offset, or on-chain randomness for revealed collections, or a mix of both! * * Only with a reveal mechanism, does the price of minting utilize ERC721A improvements. */ contract ERC721ARandomizedCollection is ERC721Marketplace { using ECDSA for bytes32; using Strings for uint256; bool public burnable; // This returns whether or not a collection has been locked yet bool public isLocked; /* * If this is set to true the owner must complete a signature for each address on the allowlist. * If it is false, only the dualSignerAddress is required, which can be a programatic signer the * owner is associted with that can easily sign tens of thousands of signatures. */ bool private requireOwnerOnAllowlist; bool private hasInit = false; uint256 public maxSupply; // Limits how much any single transaction can be uint256 public transactionMax; // Limits how much any single wallet can mint on a collection. uint256 public maxMint; // Used to shuffle tokenURI upon reveal uint256 public offset; // This limit is necessary for onchain randomness uint256 public constant MAX_SUPPLY_LIMIT = 10**9; // Mapping to enable constant time onchain randomness uint256[MAX_SUPPLY_LIMIT] private indices; string public tokenDirectory; // Randomized Collection Events event Minted( address indexed buyer, uint256 amount, uint256 unitPrice, bytes32 hash ); event TokensRevealed(string tokenDirectory); event TokenSupplyLocked(uint256 supply); event TokenDirectoryLocked(); event RequireOwnerOnAllowList(bool required); /** * @dev Constructor function */ constructor( bool[2] memory bools, address[4] memory addresses, uint256[8] memory uints, string[3] memory strings, bytes[2] memory signatures ) ERC721A(strings[0], strings[1]) { _init(bools, addresses, uints, strings, signatures); } function init( bool[2] memory bools, address[4] memory addresses, uint256[8] memory uints, string[3] memory strings, bytes[2] memory signatures ) external { _init(bools, addresses, uints, strings, signatures); } function _init( bool[2] memory bools, address[4] memory addresses, uint256[8] memory uints, string[3] memory strings, bytes[2] memory signatures ) internal { require(!hasInit, "Already has be initiated"); hasInit = true; burnable = bools[0]; _notSequentialMint = bools[1]; _owner = msg.sender; _initWithdrawSplits( _owner, addresses[0], // revenue share address addresses[1], // referral address addresses[2], // partnership address uints[0], // payout BPS uints[1], // owner secondary BPS uints[2], // revenue share BPS uints[3], // referral BPS uints[4], // partnership BPS signatures ); dualSignerAddress = addresses[3]; maxSupply = uints[5]; require(maxSupply < MAX_SUPPLY_LIMIT, "Collection is too big"); // Do not allow more than 500 mints a transaction so users cannot exceed gas limit if (uints[6] == 0 || uints[6] >= 500) { transactionMax = 500; } else { transactionMax = uints[6]; } maxMint = uints[7]; _name = strings[0]; _symbol = strings[1]; tokenDirectory = strings[2]; if (_notSequentialMint) { emit TokensRevealed(tokenDirectory); } } /** * @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 override returns (string memory) { return "ipfs://"; } /** * @dev sets if the owner's signature is also necessary for dual signing. * * This is normally turned off because the dual signer can be an automated * process that can sign hundreds to thousands of sale permits instantly which * would be tedious for a human-operated wallet. */ function setRequireOwnerOnAllowlist(bool required) external onlyOwner { requireOwnerOnAllowlist = required; emit RequireOwnerOnAllowList(required); } /** * @dev If this collection was created with burnable on, owners of tokens * can use this method to burn their tokens. Easely will keep track of * burns in case creators want to reward users for burning tokens. */ function burn(uint256 tokenId) external { require(burnable, "Tokens from this collection are not burnable"); _burn(tokenId); } /** * @dev Method used if the creator wants to keep their collection hidden until * a later release date. On reveal, a collection no longer uses the mint savings * of ERC721A in favor of enabling on-chain randomness minting since the metadata * is no longer hidden. * * Additionally, this method has the option to set a random offset once upon reveal * but once that offset is set it cannot be changed to maintain user consistency. * * This method does not lock the tokenURI as there are cases when the initial metadata is * inaccurate and may need to be updated. The owner of the collection should call {lockTokenURI} * when they are certain of their metadata. */ function changeTokenURI( string calldata revealTokenDirectory, bool shouldOffset ) external onlyOwner { require(!isLocked, "The token URI has been locked"); if (shouldOffset && offset == 0) { offset = _random(maxSupply - 1) + 1; } tokenDirectory = revealTokenDirectory; _notSequentialMint = true; _totalMinted = _nextSequential; emit TokensRevealed(revealTokenDirectory); } /** * Prevents token metadata in this collection from ever changing. * * IMPORTANT - this function can only be called ONCE, if a wrong token directory * is submitted by the owner, it can NEVER be switched to a different one. */ function lockTokenURI() external onlyOwner { require(!isLocked, "Contract already locked"); isLocked = true; emit TokenDirectoryLocked(); } /** * Stops tokens from ever being minted past the current supply. * * IMPORTANT - this function can NEVER be undone. It is for collections * that have not sold out, and the owner choosing to essentially "burn" * the unminted tokens to give more value to the ones already minted. */ function lockTokenSupply() external onlyOwner { require(_notSequentialMint, "The token URI has not been set yet"); // This will lock the unminted tokens at reveal time maxSupply = _totalMinted; emit TokenSupplyLocked(_totalMinted); } /** * @dev tokenURI of a tokenId, will change to include the tokeId and an offset in * the URI once the collection has been revealed. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_notSequentialMint) { return string(abi.encodePacked(_baseURI(), tokenDirectory)); } require(_exists(tokenId), "URI query for nonexistent token"); uint256 offsetId = (tokenId + offset) % maxSupply; return string( abi.encodePacked( _baseURI(), tokenDirectory, "/", offsetId.toString() ) ); } /** * @dev Hash that the owner or alternate wallet must sign to enable a {mintAllow} for a user * @return Hash of message prefix and order hash per Ethereum format */ function _hashForAllowList( address allowedAddress, uint256 nonce, uint256 version, uint256 price, uint256 amount ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner(), allowedAddress, nonce, version, price, amount ) ); } /** * @dev Hash an order that we need to check against the signature to see who the signer is. * see {_hashForAllowList} to see the hash that needs to be signed. */ function _hashToCheckForAllowList( address allowedAddress, uint256 nonce, uint256 version, uint256 price, uint256 amount ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForAllowList(allowedAddress, nonce, version, price, amount) ); } /** * @dev Hash that the owner or approved alternate signer then sign that the approved buyer * can use in order to call the {mintAllow} method. */ function hashToSignForAllowList( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount ) external view returns (bytes32) { _checkValidSigner(_msgSender()); return _hashForAllowList(allowedAddress, version, nonce, price, amount); } /** * @dev A way to invalidate a signature so the given params cannot be used in the {mintAllow} method. */ function cancelAllowList( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount ) external { _checkValidSigner(_msgSender()); bytes32 hash = _hashToCheckForAllowList( allowedAddress, version, nonce, price, amount ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev Allows a user with an approved signature to mint at a price and quantity specified by the * contract. A user is still limited by totalSupply, transactionMax, and mintMax if populated. * signing with amount = 0 will allow any buyAmount less than the other limits. */ function mintAllow( address allowedAddress, uint256 version, uint256 nonce, uint256 price, uint256 amount, uint256 buyAmount, bytes memory signature, bytes memory dualSignature ) external payable { require( totalMinted() + buyAmount <= maxSupply, "Over token supply limit" ); require(buyAmount <= amount && buyAmount > 0, "Invalid buyAmount"); require(buyAmount <= transactionMax, "Over transaction limit"); require( version == _addressToActiveVersion[owner()], "This presale version is disabled" ); require(allowedAddress == _msgSender(), "Invalid sender"); require(!Address.isContract(_msgSender()), "Cannot mint from contract"); uint256 totalPrice = price * buyAmount; require(msg.value >= totalPrice, "Msg value too small"); bytes32 hash = _hashToCheckForAllowList( allowedAddress, version, nonce, price, amount ); require(!_cancelledOrFinalizedSales[hash], "Signature not active"); if (hash.recover(signature) != owner()) { require( !requireOwnerOnAllowlist && dualSignerAddress != address(0) && hash.recover(dualSignature) == dualSignerAddress, "Not signed by dual signer or owner" ); } _cancelledOrFinalizedSales[hash] = true; _mintRandom(_msgSender(), buyAmount); emit Minted(_msgSender(), buyAmount, price, hash); payable(_msgSender()).transfer(msg.value - totalPrice); } /** * @dev Hash that the owner or alternate wallet must sign to enable {mint} for all users */ function _hashForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return keccak256( abi.encode( address(this), block.chainid, owner(), amount, pricesAndTimestamps, version ) ); } /** * @dev Hash an order that we need to check against the signature to see who the signer is. * see {_hashForMint} to see the hash that needs to be signed. */ function _hashToCheckForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) internal view returns (bytes32) { return ECDSA.toEthSignedMessageHash( _hashForMint(version, amount, pricesAndTimestamps) ); } /** * @dev Hash that the owner or approved alternate signer then sign that buyers use * in order to call the {mint} method. */ function hashToSignForMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) external view returns (bytes32) { _checkValidSigner(_msgSender()); require(amount <= transactionMax, "Over transaction limit"); return _hashForMint(version, amount, pricesAndTimestamps); } /** * @dev A way to invalidate a signature so the given params cannot be used in the {mint} method. */ function cancelMint( uint256 version, uint256 amount, uint256[4] memory pricesAndTimestamps ) external { _checkValidSigner(_msgSender()); bytes32 hash = _hashToCheckForMint( version, amount, pricesAndTimestamps ); _cancelledOrFinalizedSales[hash] = true; emit SaleCancelled(_msgSender(), hash); } /** * @dev Allows anyone to buy an amount of tokens at a price which matches * the signature that the owner or alternate signer has approved */ function mint( uint256 version, uint256 amount, uint256 buyAmount, uint256[4] memory pricesAndTimestamps, bytes memory signature, bytes memory dualSignature ) external payable { require( totalMinted() + buyAmount <= maxSupply, "Over token supply limit" ); require(buyAmount != 0, "Invalid buyAmount"); require(buyAmount == amount || amount == 0, "Over signature amount"); require(buyAmount <= transactionMax, "Over transaction limit"); require(version == _addressToActiveVersion[owner()], "Invalid version"); require(!Address.isContract(_msgSender()), "Cannot mint from contract"); uint256 unitPrice = _currentPrice(pricesAndTimestamps); uint256 totalPrice = buyAmount * unitPrice; require(msg.value >= totalPrice, "Msg value too small"); bytes32 hash = _hashToCheckForMint( version, amount, pricesAndTimestamps ); _checkHashAndSignatures(hash, owner(), signature, dualSignature); _mintRandom(_msgSender(), buyAmount); emit Minted(_msgSender(), buyAmount, unitPrice, hash); payable(_msgSender()).transfer(msg.value - totalPrice); } /// @notice Generates a pseudo random index of our tokens that has not been used so far function _mintRandomIndex(address buyer, uint256 amount) internal { // number of tokens left to create uint256 supplyLeft = maxSupply - _totalMinted; for (uint256 i = 0; i < amount; i++) { // generate a random index uint256 index = _random(supplyLeft); uint256 tokenAtPlace = indices[index]; uint256 tokenId; // if we havent stored a replacement token... if (tokenAtPlace == 0) { //... we just return the current index tokenId = index; } else { // else we take the replace we stored with logic below tokenId = tokenAtPlace; } // get the highest token id we havent handed out uint256 lastTokenAvailable = indices[supplyLeft - 1]; // we need to store a replacement token for the next time we roll the same index // if the last token is still unused... if (lastTokenAvailable == 0) { // ... we store the last token as index indices[index] = supplyLeft - 1; } else { // ... we store the token that was stored for the last token indices[index] = lastTokenAvailable; } _safeMint(buyer, tokenId + _nextSequential); supplyLeft--; } _balances[buyer] = AddressData( _balances[buyer].balance + uint128(amount), _balances[buyer].numberMinted + uint128(amount) ); } /// @notice Generates a pseudo random number based on arguments with decent entropy /// @param max The maximum value we want to receive /// @return A random number less than the max function _random(uint256 max) internal view returns (uint256) { if (max == 0) { return 0; } uint256 rand = uint256( keccak256( abi.encode( msg.sender, block.difficulty, block.timestamp, blockhash(block.number - 1) ) ) ); return rand % max; } /** * @dev Wrapper around {_mintRandomIndex} that incrementally if the collection has not * been revealed yet, which also checks the buyer has not exceeded maxMint count */ function _mintRandom(address buyer, uint256 amount) internal { require( maxMint == 0 || _balances[buyer].numberMinted + amount <= maxMint, "Buyer over mint maximum" ); if (_notSequentialMint) { _mintRandomIndex(buyer, amount); _totalMinted += amount; } else { _safeMintSequential(buyer, amount); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bool[2]","name":"bools","type":"bool[2]"},{"internalType":"address[4]","name":"addresses","type":"address[4]"},{"internalType":"uint256[8]","name":"uints","type":"uint256[8]"},{"internalType":"string[3]","name":"strings","type":"string[3]"},{"internalType":"bytes[2]","name":"signatures","type":"bytes[2]"}],"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":"uint256","name":"balance","type":"uint256"}],"name":"BalanceWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"DualSignerChanged","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":"Loan","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":"LoanRetrieved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"LoaningActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unitPrice","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Minted","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":false,"internalType":"bool","name":"required","type":"bool"}],"name":"RequireOwnerOnAllowList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bps","type":"uint256"}],"name":"RoyaltyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"SaleCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"SaleCompleted","type":"event"},{"anonymous":false,"inputs":[],"name":"TokenDirectoryLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"TokenSupplyLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenDirectory","type":"string"}],"name":"TokensRevealed","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"VersionChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"revenueShareAddress","type":"address"},{"indexed":true,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":true,"internalType":"address","name":"partnershipAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"revenueShareBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referralBPS","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"partnershipBPS","type":"uint256"}],"name":"WithdrawSplitsSet","type":"event"},{"inputs":[],"name":"BPS_TOTAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SECONDARY_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYOUT_CONTRACT_ADDRESS","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":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"dualSignature","type":"bytes"}],"name":"buyToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"cancelAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"cancelMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"cancelSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealTokenDirectory","type":"string"},{"internalType":"bool","name":"shouldOffset","type":"bool"}],"name":"changeTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dualSignerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getActiveVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"hashToSignForAllowList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"hashToSignForMint","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"}],"name":"hashToSignToSellToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool[2]","name":"bools","type":"bool[2]"},{"internalType":"address[4]","name":"addresses","type":"address[4]"},{"internalType":"uint256[8]","name":"uints","type":"uint256[8]"},{"internalType":"string[3]","name":"strings","type":"string[3]"},{"internalType":"bytes[2]","name":"signatures","type":"bytes[2]"}],"name":"init","outputs":[],"stateMutability":"nonpayable","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":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"loan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"loaningActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"uint256[4]","name":"pricesAndTimestamps","type":"uint256[4]"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"dualSignature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"version","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes","name":"dualSignature","type":"bytes"}],"name":"mintAllow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partnershipAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"retrieveLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueShareAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"address","name":"alt","type":"address"}],"name":"setDualSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_loaningActive","type":"bool"}],"name":"setLoaningActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"required","type":"bool"}],"name":"setRequireOwnerOnAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBPS","type":"uint256"}],"name":"setRoyaltiesBPS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"splits","outputs":[{"internalType":"uint64","name":"ownerRoyaltyBPS","type":"uint64"},{"internalType":"uint64","name":"payoutBPS","type":"uint64"},{"internalType":"uint64","name":"revenueShareBPS","type":"uint64"},{"internalType":"uint32","name":"referralBPS","type":"uint32"},{"internalType":"uint32","name":"partnershipBPS","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenDirectory","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenOwnerOnLoan","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"updateVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526014805463ff000000191690553480156200001e57600080fd5b5060405162006d7338038062006d73833981016040819052620000419162000ffe565b8151602080840151825190916200005e9160009185019062000c39565b5080516200007490600190602084019062000c39565b505050620000916200008b620000ab60201b60201c565b620000af565b620000a0858585858562000101565b505050505062001220565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6014546301000000900460ff1615620001615760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e69746961746564000000000000000060448201526064015b60405180910390fd5b601480548651630100000063ff0000ff19909216901515171790556020808601516005805460ff1916911515919091179055600b8054336001600160a01b031990911681179091558551868301516040808901518851958901519189015160608a015160808b0151620001da9893949291908a62000339565b6060840151600f80546001600160a01b0319166001600160a01b0390921691909117905560a08301516015819055633b9aca00116200025c5760405162461bcd60e51b815260206004820152601560248201527f436f6c6c656374696f6e20697320746f6f206269670000000000000000000000604482015260640162000158565b60c0830151158062000274575060c08301516101f411155b1562000286576101f46016556200028f565b60c08301516016555b60e083015160175581518051620002af9160009160209091019062000c39565b506020808301518051620002c892600192019062000c39565b5060408201518051620002e791633b9aca199160209091019062000c39565b5060055460ff161562000332577f9e7bf1ba367b3cedbb30aa087793835272865fe2ad4c6de17056568485c063f1633b9aca1960405162000329919062001133565b60405180910390a15b5050505050565b600e80546001600160a01b0319166001600160a01b038b161790556103e8851115620003b95760405162461bcd60e51b815260206004820152602860248201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636044820152676f6e64617269657360c01b606482015260840162000158565b602081015151620004dc57612710620003d5856101f4620011e3565b11156200041b5760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b604482015260640162000158565b6040805160a0810182526001600160401b038781168083526101f46020808501829052928916848601819052600060608087018290526080968701829052601080546001600160801b0319169095176901f40000000000000000176001600160801b0316600160801b9093026001600160c01b03169290921790935585519182529281018990529384018190529083018190529182916001600160a01b038d169160008051602062006d53833981519152910160405180910390a462000815565b6127108483620004ed868a620011e3565b620004f99190620011e3565b620005059190620011e3565b11156200054b5760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b604482015260640162000158565b604080516101206020820181905260106101408301526f496e697469616c697a6553706c69747360801b6101608301526001600160a01b03808e1693830193909352828c166060830152828b16608083015291891660a082015260c0810188905260e0810186905261010081018590529081018390526000906101800160405160208183030381529060405290506000620005f882805190602001206200085460201b62002afe1760201c565b90506001600160a01b038c16620006268460005b602002015183620008a760201b62002b511790919060201c565b6001600160a01b0316146200067e5760405162461bcd60e51b815260206004820152601560248201527f4e6f74207369676e65642062792063726561746f720000000000000000000000604482015260640162000158565b731baad9bfa20eb279d2e3f3e859e3ae9dde666c52620006a08460016200060c565b6001600160a01b031614620006f85760405162461bcd60e51b815260206004820152601e60248201527f4e6f74207369676e656420627920766572696669656420616464726573730000604482015260640162000158565b600c80546001600160a01b03199081166001600160a01b038d8116918217909355600d80549092168c84169081179092556040805160a0810182526001600160401b038c81168083528e82166020808501829052928e1684860181905263ffffffff8e81166060808801829052918f166080978801819052601080546001600160801b0319169096176801000000000000000090950294909417600160801b600160e01b031916600160801b90930263ffffffff60c01b191692909217600160c01b909202919091176001600160e01b0316600160e01b9092029190911790915583518f81529182018d90529281018b905291820189905292939192918f169160008051602062006d53833981519152910160405180910390a450505b6040518581527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b39060200160405180910390a150505050505050505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b60008080620008b78585620008cf565b9092509050620008c78162000947565b509392505050565b6000808251604114156200090a5760208301516040840151606085015160001a620008fd8782858562000b1d565b9450945050505062000940565b8251604014156200093857602083015160408401516200092c86838362000c08565b93509350505062000940565b506000905060025b9250929050565b60008160048111156200095e576200095e6200120a565b1415620009685750565b60018160048111156200097f576200097f6200120a565b1415620009cf5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640162000158565b6002816004811115620009e657620009e66200120a565b141562000a365760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640162000158565b600381600481111562000a4d5762000a4d6200120a565b141562000aa85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840162000158565b600481600481111562000abf5762000abf6200120a565b141562000b1a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840162000158565b50565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0383111562000b4c575060009050600362000bff565b8460ff16601b1415801562000b6557508460ff16601c14155b1562000b78575060009050600462000bff565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801562000bcd573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811662000bf85760006001925092505062000bff565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0162000c2b8782888562000b1d565b935093505050935093915050565b82805462000c4790620010f6565b90600052602060002090601f01602090048101928262000c6b576000855562000cb6565b82601f1062000c8657805160ff191683800117855562000cb6565b8280016001018555821562000cb6579182015b8281111562000cb657825182559160200191906001019062000c99565b5062000cc492915062000cc8565b5090565b5b8082111562000cc4576000815560010162000cc9565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562000d1a5762000d1a62000cdf565b60405290565b600082601f83011262000d3257600080fd5b604051608081016001600160401b038111828210171562000d575762000d5762000cdf565b60405280608084018581111562000d6d57600080fd5b845b8181101562000da05780516001600160a01b038116811462000d915760008081fd5b83526020928301920162000d6f565b509195945050505050565b600082601f83011262000dbd57600080fd5b6040516101008082016001600160401b038111838210171562000de45762000de462000cdf565b6040528301818582111562000df857600080fd5b845b8281101562000da057805182526020918201910162000dfa565b60006001600160401b038084111562000e315762000e3162000cdf565b604051601f8501601f19908116603f0116810190828211818310171562000e5c5762000e5c62000cdf565b8160405280935085815286868601111562000e7657600080fd5b600092505b8583101562000e9b57828501516020848301015260208301925062000e7b565b8583111562000eae576000602087830101525b5050509392505050565b6000601f838184011262000ecb57600080fd5b604051606081016001600160401b03808211838310171562000ef15762000ef162000cdf565b81604052829150606086018781111562000f0a57600080fd5b865b8181101562000f5c5780518381111562000f265760008081fd5b88018681018a1362000f385760008081fd5b8051602062000f4b8c8383860162000e14565b875290950194505060200162000f0c565b5092979650505050505050565b6000601f838184011262000f7c57600080fd5b62000f8662000cf5565b80604085018681111562000f9957600080fd5b855b8181101562000ff25780516001600160401b0381111562000fbc5760008081fd5b8701858101891362000fce5760008081fd5b8051602062000fe18b8383860162000e14565b875290950194505060200162000f9b565b50909695505050505050565b600080600080600061020086880312156200101857600080fd5b86601f8701126200102857600080fd5b6200103262000cf5565b8060408801898111156200104557600080fd5b885b81811015620010715780518015158114620010625760008081fd5b84526020938401930162001047565b50819750620010818a8262000d20565b9650505050620010958760c0880162000dab565b6101c08701519093506001600160401b0380821115620010b457600080fd5b620010c289838a0162000eb8565b93506101e0880151915080821115620010da57600080fd5b50620010e98882890162000f69565b9150509295509295909350565b600181811c908216806200110b57607f821691505b602082108114156200112d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208083526000845481600182811c9150808316806200115657607f831692505b8583108114156200117557634e487b7160e01b85526022600452602485fd5b878601838152602001818015620011955760018114620011a757620011d4565b60ff19861682528782019650620011d4565b60008b81526020902060005b86811015620011ce57815484820152908501908901620011b3565b83019750505b50949998505050505050505050565b600082198211156200120557634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052602160045260246000fd5b615b2380620012306000396000f3fe6080604052600436106103ad5760003560e01c8063801ad21e116101e7578063b88d4fde1161010d578063d5abeb01116100a0578063ed9ec8881161006f578063ed9ec88814610b2f578063ee9c8e7914610b75578063f2fde38b14610b95578063f7c84dda14610bb557600080fd5b8063d5abeb0114610a9a578063d73e627814610ab0578063da76d5cd14610ac6578063e985e9c514610ae657600080fd5b8063c92dae4f116100dc578063c92dae4f14610a24578063ce67e92a14610a44578063d3e1fe1414610a64578063d555654414610a8457600080fd5b8063b88d4fde1461099c578063bc1c741c146109bc578063c53ac347146109e4578063c87b56dd14610a0457600080fd5b8063a22cb46511610185578063adf482b411610154578063adf482b414610926578063b374461f14610946578063b5901fbc14610966578063b5917aa81461098657600080fd5b8063a22cb465146108b2578063a2309ff8146108d2578063a4e2d634146108e7578063a87f884e1461090657600080fd5b80638da5cb5b116101c15780638da5cb5b14610845578063902e69eb1461086357806395d89b4114610883578063a07c7ce41461089857600080fd5b8063801ad21e146107f25780638596dd27146108125780638b4ed1de1461083257600080fd5b806344447f47116102d757806367b6f5d21161026a578063715018a611610239578063715018a614610787578063743717fc1461079c5780637501f741146107bc578063751c1a8e146107d257600080fd5b806367b6f5d2146106995780636b81398a146106b95780636cbdec7d146106d957806370a082311461076757600080fd5b80635e5a9e30116102a65780635e5a9e3014610637578063617d11261461064c5780636352211e1461066457806364143b081461068457600080fd5b806344447f47146105c157806348fc6f1a146105d65780635595fb6a146105f657806359fbb5411461061657600080fd5b806318160ddd1161034f5780632a55205a1161031e5780632a55205a1461052c5780632bbc59db1461056b57806342842e0e1461058157806342966c68146105a157600080fd5b806318160ddd146104b657806321385d0a146104d957806323b872dd146104ec57806323dc350b1461050c57600080fd5b8063081812fc1161038b578063081812fc1461041e578063095ea7b3146104565780630b9526ee1461047657806315a88d221461049657600080fd5b80630198b163146103b257806301ffc9a7146103c757806306fdde03146103fc575b600080fd5b6103c56103c0366004614c2e565b610beb565b005b3480156103d357600080fd5b506103e76103e2366004614ce9565b610e39565b60405190151581526020015b60405180910390f35b34801561040857600080fd5b50610411610e7f565b6040516103f39190614d5e565b34801561042a57600080fd5b5061043e610439366004614d71565b610f11565b6040516001600160a01b0390911681526020016103f3565b34801561046257600080fd5b506103c5610471366004614d8a565b610f99565b34801561048257600080fd5b506103c5610491366004614db4565b6110b0565b3480156104a257600080fd5b50600c5461043e906001600160a01b031681565b3480156104c257600080fd5b506104cb61112a565b6040519081526020016103f3565b6103c56104e7366004614df4565b611146565b3480156104f857600080fd5b506103c5610507366004614e98565b611569565b34801561051857600080fd5b506103c5610527366004614ee4565b6115e0565b34801561053857600080fd5b5061054c610547366004614f64565b6116fc565b604080516001600160a01b0390931683526020830191909152016103f3565b34801561057757600080fd5b506104cb61271081565b34801561058d57600080fd5b506103c561059c366004614e98565b611747565b3480156105ad57600080fd5b506103c56105bc366004614d71565b611762565b3480156105cd57600080fd5b506103c56117d5565b3480156105e257600080fd5b506103c56105f1366004614f86565b611899565b34801561060257600080fd5b5061043e610611366004614d71565b61191b565b34801561062257600080fd5b50600b546103e790600160a01b900460ff1681565b34801561064357600080fd5b506103c561198e565b34801561065857600080fd5b506104cb633b9aca0081565b34801561067057600080fd5b5061043e61067f366004614d71565b611a4a565b34801561069057600080fd5b50610411611b89565b3480156106a557600080fd5b506104cb6106b4366004614fa1565b611c1a565b3480156106c557600080fd5b50600f5461043e906001600160a01b031681565b3480156106e557600080fd5b50601054610726906001600160401b0380821691600160401b8104821691600160801b8204169063ffffffff600160c01b8204811691600160e01b90041685565b604080516001600160401b0396871681529486166020860152929094169183019190915263ffffffff9081166060830152909116608082015260a0016103f3565b34801561077357600080fd5b506104cb610782366004614fbd565b611c25565b34801561079357600080fd5b506103c5611cb5565b3480156107a857600080fd5b506104cb6107b7366004614fd8565b611ceb565b3480156107c857600080fd5b506104cb60175481565b3480156107de57600080fd5b506103c56107ed366004614d71565b611d2b565b3480156107fe57600080fd5b506103c561080d366004614fd8565b611e1f565b34801561081e57600080fd5b506104cb61082d366004615005565b611e9f565b6103c5610840366004615047565b611ec1565b34801561085157600080fd5b50600b546001600160a01b031661043e565b34801561086f57600080fd5b50600e5461043e906001600160a01b031681565b34801561088f57600080fd5b5061041161217b565b3480156108a457600080fd5b506014546103e79060ff1681565b3480156108be57600080fd5b506103c56108cd3660046150d9565b61218a565b3480156108de57600080fd5b506104cb61224f565b3480156108f357600080fd5b506014546103e790610100900460ff1681565b34801561091257600080fd5b506103c5610921366004614d71565b61226b565b34801561093257600080fd5b506103c5610941366004614d71565b6122b4565b34801561095257600080fd5b506103c56109613660046152d0565b61234c565b34801561097257600080fd5b506103c5610981366004615005565b612360565b34801561099257600080fd5b506104cb6103e881565b3480156109a857600080fd5b506103c56109b73660046153ad565b6123e4565b3480156109c857600080fd5b5061043e73a95850bb73459adb9587a97f103a4a7cce59b56e81565b3480156109f057600080fd5b506104cb6109ff366004614db4565b612455565b348015610a1057600080fd5b50610411610a1f366004614d71565b6124d6565b348015610a3057600080fd5b506103c5610a3f366004615414565b6125fc565b348015610a5057600080fd5b506103c5610a5f366004614f86565b6126c2565b348015610a7057600080fd5b50600d5461043e906001600160a01b031681565b348015610a9057600080fd5b506104cb60185481565b348015610aa657600080fd5b506104cb60155481565b348015610abc57600080fd5b506104cb60165481565b348015610ad257600080fd5b506103c5610ae1366004614d71565b612737565b348015610af257600080fd5b506103e7610b01366004615437565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b348015610b3b57600080fd5b506104cb610b4a366004614fbd565b6001600160a01b0316600090815260086020526040902054600160801b90046001600160801b031690565b348015610b8157600080fd5b506103c5610b90366004614fbd565b6129ee565b348015610ba157600080fd5b506103c5610bb0366004614fbd565b612a66565b348015610bc157600080fd5b506104cb610bd0366004614fbd565b6001600160a01b031660009081526012602052604090205490565b6000610bf684612b75565b6001600160a01b0389166000908152601260205260409020549091508714610c655760405162461bcd60e51b815260206004820152601b60248201527f496e636f7272656374207369676e61747572652076657273696f6e000000000060448201526064015b60405180910390fd5b80341015610cad5760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682045544820746f2062757960581b6044820152606401610c5c565b6000610cbc8989898989612d12565b9050610cca818a8686612d29565b6000818152601360205260409020805460ff1916600117905585610ceb3390565b6001600160a01b03168a6001600160a01b03167f7037752486358ce67464a572503f020d1bf316b5d92a7a21d1d7e7ef0d7aab2d8585604051610d38929190918252602082015260400190565b60405180910390a4610d5b89338860405180602001604052806000815250612e6a565b600b546001600160a01b038a8116911614610ded5773a95850bb73459adb9587a97f103a4a7cce59b56e638b52e2cb838b610d94612e9d565b610d9c612eff565b6040518563ffffffff1660e01b8152600401610dba93929190615461565b6000604051808303818588803b158015610dd357600080fd5b505af1158015610de7573d6000803e3d6000fd5b50505050505b335b6001600160a01b03166108fc610e05843461550b565b6040518115909202916000818181858888f19350505050158015610e2d573d6000803e3d6000fd5b50505050505050505050565b60006001600160e01b03198216630704183b60e11b1480610e6a57506001600160e01b0319821663152a902d60e11b145b80610e795750610e7982612f55565b92915050565b606060008054610e8e90615522565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90615522565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b6000610f1c82612fa5565b610f7d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c5c565b506000908152600960205260409020546001600160a01b031690565b6000610fa482611a4a565b9050806001600160a01b0316836001600160a01b031614156110125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c5c565b336001600160a01b038216148061102e575061102e8133610b01565b6110a05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c5c565b6110ab838383612ff4565b505050565b60006110bf3386868686612d12565b6000818152601360205260409020805460ff1916600117905590506110e13390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf78260405161111b91815260200190565b60405180910390a25050505050565b600060035461113761224f565b611141919061550b565b905090565b6015548361115261224f565b61115c919061555d565b11156111a45760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610c5c565b8383111580156111b45750600083115b6111f45760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908189d5e505b5bdd5b9d607a1b6044820152606401610c5c565b6016548311156112165760405162461bcd60e51b8152600401610c5c90615575565b6012600061122c600b546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002054871461129b5760405162461bcd60e51b815260206004820181905260248201527f546869732070726573616c652076657273696f6e2069732064697361626c65646044820152606401610c5c565b6001600160a01b03881633146112e45760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610c5c565b6112ef335b3b151590565b156113385760405162461bcd60e51b815260206004820152601960248201527810d85b9b9bdd081b5a5b9d08199c9bdb4818dbdb9d1c9858dd603a1b6044820152606401610c5c565b600061134484876155a5565b90508034101561138c5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610c5c565b600061139b8a8a8a8a8a613071565b60008181526013602052604090205490915060ff16156113f45760405162461bcd60e51b81526020600482015260146024820152735369676e6174757265206e6f742061637469766560601b6044820152606401610c5c565b600b546001600160a01b031661140a8286612b51565b6001600160a01b0316146114ba5760145462010000900460ff1615801561143b5750600f546001600160a01b031615155b80156114635750600f546001600160a01b03166114588285612b51565b6001600160a01b0316145b6114ba5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207369676e6564206279206475616c207369676e6572206f72206f776e60448201526132b960f11b6064820152608401610c5c565b6000818152601360205260409020805460ff191660011790556114e36114dd3390565b86613083565b6040805186815260208101899052808201839052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc611534843461550b565b6040518115909202916000818181858888f1935050505015801561155c573d6000803e3d6000fd5b5050505050505050505050565b600061157482611a4a565b9050611582335b8383613153565b61159e5760405162461bcd60e51b8152600401610c5c906155c4565b836001600160a01b0316816001600160a01b0316146115cf5760405162461bcd60e51b8152600401610c5c90615615565b6115da84848461322c565b50505050565b600b546001600160a01b0316331461160a5760405162461bcd60e51b8152600401610c5c9061565e565b601454610100900460ff16156116625760405162461bcd60e51b815260206004820152601d60248201527f54686520746f6b656e2055524920686173206265656e206c6f636b65640000006044820152606401610c5c565b80801561166f5750601854155b1561169a5761168b6001601554611686919061550b565b6133fe565b61169690600161555d565b6018555b6116a9633b9aca1984846149c0565b506005805460ff191660011790556004546002556040517f9e7bf1ba367b3cedbb30aa087793835272865fe2ad4c6de17056568485c063f1906116ef9085908590615693565b60405180910390a1505050565b601054600090819081906127109061171d906001600160401b0316866155a5565b61172791906156d8565b905061173b600b546001600160a01b031690565b925090505b9250929050565b6110ab838383604051806020016040528060008152506123e4565b60145460ff166117c95760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e732066726f6d207468697320636f6c6c656374696f6e206172652060448201526b6e6f74206275726e61626c6560a01b6064820152608401610c5c565b6117d281613470565b50565b600b546001600160a01b031633146117ff5760405162461bcd60e51b8152600401610c5c9061565e565b60055460ff1661185c5760405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e2055524920686173206e6f74206265656e207365742079604482015261195d60f21b6064820152608401610c5c565b60025460158190556040519081527f99e2ed63ef06d00d742b538d8e154d800c413d265a20c15ce2653c111d338e7a9060200160405180910390a1565b600b546001600160a01b031633146118c35760405162461bcd60e51b8152600401610c5c9061565e565b600b8054821515600160a01b0260ff60a01b199091161790556040517f71c51fed67dbe96b4985ba8dcf3f768bedc716f27d3b2d1fc53e0c7263555e549061191090831515815260200190565b60405180910390a150565b600061192682612fa5565b6119725760405162461bcd60e51b815260206004820152601960248201527f5468697320746f6b656e20646f6573206e6f74206578697374000000000000006044820152606401610c5c565b506000908152601160205260409020546001600160a01b031690565b600b546001600160a01b031633146119b85760405162461bcd60e51b8152600401610c5c9061565e565b601454610100900460ff1615611a105760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c7265616479206c6f636b65640000000000000000006044820152606401610c5c565b6014805461ff0019166101001790556040517f115e80b2aebbd2a71a30be32c7ebbe8d19d70a6dc91e61e4a0a24947491f240090600090a1565b6000611a5582612fa5565b611ab35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c5c565b6000828152600660205260409020546001600160a01b031615611aec57506000908152600660205260409020546001600160a01b031690565b600454821015611b8157600060058310611b1957611b0b60058461550b565b611b1690600161555d565b90505b6000611b2660018561550b565b90505b818110611b7e576000818152600660205260409020546001600160a01b031615611b6c576000908152600660205260409020546001600160a01b03169392505050565b80611b76816156ec565b915050611b29565b50505b506000919050565b633b9aca198054611b9990615522565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc590615522565b8015611c125780601f10611be757610100808354040283529160200191611c12565b820191906000526020600020905b815481529060010190602001808311611bf557829003601f168201915b505050505081565b6000610e7982612b75565b60006001600160a01b038216611c905760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c5c565b506001600160a01b03166000908152600860205260409020546001600160801b031690565b600b546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610c5c9061565e565b611ce96000613598565b565b6000611cf6336135ea565b601654831115611d185760405162461bcd60e51b8152600401610c5c90615575565b611d23848484613653565b949350505050565b6000611d3682611a4a565b60008381526011602052604090205490915033906001600160a01b03168114611da15760405162461bcd60e51b815260206004820152601e60248201527f53656e646572206973206e6f742074686520746f6b656e206c6f616e657200006044820152606401610c5c565b600083815260116020908152604080832080546001600160a01b031916905580519182019052908152611dd990839083908690612e6a565b82816001600160a01b0316836001600160a01b03167f484cfdc469392f506ef19931236d4aa91abbd5e8e704f155c0a971ee8908bd5f60405160405180910390a4505050565b611e28336135ea565b6000611e358484846136a0565b6000818152601360205260409020805460ff191660011790559050611e573390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf782604051611e9191815260200190565b60405180910390a250505050565b6000611eaa336135ea565b611eb786868686866136b0565b9695505050505050565b60155484611ecd61224f565b611ed7919061555d565b1115611f1f5760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610c5c565b83611f605760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908189d5e505b5bdd5b9d607a1b6044820152606401610c5c565b84841480611f6c575084155b611fb05760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610c5c565b601654841115611fd25760405162461bcd60e51b8152600401610c5c90615575565b60126000611fe8600b546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000205486146120495760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103b32b939b4b7b760891b6044820152606401610c5c565b612052336112e9565b1561209b5760405162461bcd60e51b815260206004820152601960248201527810d85b9b9bdd081b5a5b9d08199c9bdb4818dbdb9d1c9858dd603a1b6044820152606401610c5c565b60006120a684612b75565b905060006120b482876155a5565b9050803410156120fc5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610c5c565b60006121098989886136a0565b905061212881612121600b546001600160a01b031690565b8787612d29565b6121323388613083565b6040805188815260208101859052808201839052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a233610def565b606060018054610e8e90615522565b6001600160a01b0382163314156121e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c5c565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055460009060ff1615612264575060025490565b5060045490565b3360008181526012602090815260409182902084905590518381527f40c93307f56fc72b7eaf9af01e59f7a78540e7dc1a79dd0a73854fedbb6e7867910160405180910390a250565b600b546001600160a01b031633146122de5760405162461bcd60e51b8152600401610c5c9061565e565b6103e88111156123005760405162461bcd60e51b8152600401610c5c90615703565b6010805467ffffffffffffffff19166001600160401b0383161790556040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b390602001611910565b6123598585858585613733565b5050505050565b612369336135ea565b60006123788686868686613071565b6000818152601360205260409020805460ff19166001179055905061239a3390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf7826040516123d491815260200190565b60405180910390a2505050505050565b60006123ef83611a4a565b90506123fc338483613153565b6124185760405162461bcd60e51b8152600401610c5c906155c4565b846001600160a01b0316816001600160a01b0316146124495760405162461bcd60e51b8152600401610c5c90615615565b6123598585858561394c565b600061246083611a4a565b6001600160a01b0316336001600160a01b0316146124c05760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e0000000000006044820152606401610c5c565b6124cd3386868686613957565b95945050505050565b60055460609060ff1661252d57604080518082019091526007815266697066733a2f2f60c81b6020820152633b9aca196040516020016125179291906157ba565b6040516020818303038152906040529050919050565b61253682612fa5565b6125825760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610c5c565b600060155460185484612595919061555d565b61259f91906157d8565b90506125c5604080518082019091526007815266697066733a2f2f60c81b602082015290565b633b9aca196125d383613976565b6040516020016125e5939291906157ec565b604051602081830303815290604052915050919050565b600b543390600160a01b900460ff1661264a5760405162461bcd60e51b815260206004820152601060248201526f4c6f616e73206e6f742061637469766560801b6044820152606401610c5c565b61266581838560405180602001604052806000815250612e6a565b60008381526011602052604080822080546001600160a01b0319166001600160a01b038581169182179092559151869391861692917f4d699c2a3f40be9f50773ce2da5d80769decfefe6c4d557178af6e4a412d29a791a4505050565b600b546001600160a01b031633146126ec5760405162461bcd60e51b8152600401610c5c9061565e565b60148054821515620100000262ff0000199091161790556040517f554a79345f98adca121897124094b27f98f92832c0fd23c2f8aaba39471063dc9061191090831515815260200190565b478111156127425750475b6000612750612710836156d8565b601054909150600160801b90046001600160401b0316156127c557600e546010546001600160a01b03909116906108fc9061279b90600160801b90046001600160401b0316846155a5565b6040518115909202916000818181858888f193505050501580156127c3573d6000803e3d6000fd5b505b601054600160c01b900463ffffffff161561283157600c546010546001600160a01b03909116906108fc9061280790600160c01b900463ffffffff16846155a5565b6040518115909202916000818181858888f1935050505015801561282f573d6000803e3d6000fd5b505b601054600160e01b900463ffffffff161561289d57600d546010546001600160a01b03909116906108fc9061287390600160e01b900463ffffffff16846155a5565b6040518115909202916000818181858888f1935050505015801561289b573d6000803e3d6000fd5b505b60105473a95850bb73459adb9587a97f103a4a7cce59b56e906108fc906128d490600160401b90046001600160401b0316846155a5565b6040518115909202916000818181858888f193505050501580156128fc573d6000803e3d6000fd5b506010546000906001600160401b03600160401b820481169163ffffffff600160c01b820481169261294092600160e01b810490921691600160801b900416615833565b61294a9190615833565b6129549190615833565b612967906001600160401b0316836155a5565b612971908461550b565b9050612985600b546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156129bd573d6000803e3d6000fd5b506040518381527f39f8b889424a1684bd36857c25ab79691ed71adf60bbeca32820cb4de3c5884c906020016116ef565b600b546001600160a01b03163314612a185760405162461bcd60e51b8152600401610c5c9061565e565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f49b0b4a863b68b1adb4ae68ebb653df823103c105582bb73e2507b1b9e10d2be90602001611910565b600b546001600160a01b03163314612a905760405162461bcd60e51b8152600401610c5c9061565e565b6001600160a01b038116612af55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c5c565b6117d281613598565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6000806000612b608585613a73565b91509150612b6d81613ae0565b509392505050565b80516020820151604083015160608401516000939291904282811015612bd35760405162461bcd60e51b815260206004820152601360248201527212185cc81b9bdd081cdd185c9d1959081e595d606a1b6044820152606401610c5c565b818310612c225760405162461bcd60e51b815260206004820152601860248201527f4d75737420656e642061667465722069742073746172747300000000000000006044820152606401610c5c565b83851015612c725760405162461bcd60e51b815260206004820152601d60248201527f456e64696e672070726963652063616e6e6f74206265206269676765720000006044820152606401610c5c565b83851480612c7f57508181115b15612c8f57509195945050505050565b6000612c9b858761550b565b9050600061012c612cac868561550b565b612cb691906156d8565b905080612cca575094979650505050505050565b600061012c612cd9878761550b565b612ce391906156d8565b905081612cf082856156d8565b612cfa91906155a5565b612d04908961550b565b9a9950505050505050505050565b6000611eb7612d248787878787613957565b612afe565b60008481526013602052604090205460ff1615612d805760405162461bcd60e51b815260206004820152601560248201527453616c65206e6f206c6f6e6765722061637469766560581b6044820152606401610c5c565b6001600160a01b038316612d948584612b51565b6001600160a01b031614612dea5760405162461bcd60e51b815260206004820152601b60248201527f4e6f74207369676e65642062792063757272656e74206f776e657200000000006044820152606401610c5c565b600f546001600160a01b03161580612e1e5750600f546001600160a01b0316612e138583612b51565b6001600160a01b0316145b6115da5760405162461bcd60e51b815260206004820152601960248201527f4e6f74207369676e6564206279206475616c207369676e6572000000000000006044820152606401610c5c565b612e75848484613c9b565b612e8184848484613cdf565b6115da5760405162461bcd60e51b8152600401610c5c90615874565b60408051600180825281830190925260609160009190602080830190803683375050600b54919250506001600160a01b031681600081518110612ee257612ee261585e565b6001600160a01b0390921660209283029190910190910152919050565b6040805160018082528183019092526060916000919060208083019080368337505060105482519293506001600160401b031691839150600090612f4557612f4561585e565b6020908102919091010152919050565b60006001600160e01b031982166380ac58cd60e01b1480612f8657506001600160e01b03198216635b5e139f60e01b145b80610e7957506301ffc9a760e01b6001600160e01b0319831614610e79565b60008181526007602052604081205460ff1615612fc457506000919050565b600454821015612fd657506001919050565b506000908152600660205260409020546001600160a01b0316151590565b6000828152600960205260409020546001600160a01b038481169116146110ab5760008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611eb7612d2487878787876136b0565b60175415806130c757506017546001600160a01b0383166000908152600860205260409020546130c4908390600160801b90046001600160801b031661555d565b11155b6131135760405162461bcd60e51b815260206004820152601760248201527f4275796572206f766572206d696e74206d6178696d756d0000000000000000006044820152606401610c5c565b60055460ff1615613145576131288282613de9565b806002600082825461313a919061555d565b9091555061314f9050565b61314f8282613fa7565b5050565b600061315e83612fa5565b6131bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c5c565b816001600160a01b0316846001600160a01b031614806131f85750836001600160a01b03166131ed84610f11565b6001600160a01b0316145b80611d2357506001600160a01b038083166000908152600a602090815260408083209388168352929052205460ff16611d23565b6001600160a01b03821661328e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c5c565b6132998383836141e4565b6132a560008285612ff4565b6001600160a01b03831660009081526008602052604081208054600192906132d79084906001600160801b03166158c6565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03841660009081526008602052604081208054600194509092613323918591166158ee565b82546101009290920a6001600160801b0381810219909316919092169190910217905550600081815260066020526040812080546001600160a01b0319166001600160a01b03851617905561337982600161555d565b90506004548110156133c9576000818152600660205260409020546001600160a01b03166133c957600081815260066020526040902080546001600160a01b0319166001600160a01b0386161790555b81836001600160a01b0316856001600160a01b0316600080516020615ace83398151915260405160405180910390a450505050565b60008161340d57506000919050565b600033444261341d60014361550b565b604080516001600160a01b039095166020860152840192909252606083015240608082015260a00160408051601f198184030181529190528051602090910120905061346983826157d8565b9392505050565b600061347b82611a4a565b90506134863361157b565b6134d25760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610c5c565b6134de816000846141e4565b6134ea60008383612ff4565b6001600160a01b038116600090815260086020526040812080546001929061351c9084906001600160801b03166158c6565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600160036000828254613553919061555d565b9091555050600082815260076020526040808220805460ff19166001179055518391906001600160a01b03841690600080516020615ace833981519152908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b03828116911614806136135750600f546001600160a01b038281169116145b6117d25760405162461bcd60e51b81526020600482015260116024820152702737ba103b30b634b21039b4b3b732b91760791b6044820152606401610c5c565b60003046613669600b546001600160a01b031690565b85858860405160200161368196959493929190615933565b6040516020818303038152906040528051906020012090509392505050565b6000611d23612d24858585613653565b600030466136c6600b546001600160a01b031690565b604080516001600160a01b0394851660208201529081019290925282166060820152908716608082015260a0810186905260c0810185905260e081018490526101008101839052610120015b60405160208183030381529060405280519060200120905095945050505050565b6014546301000000900460ff161561378d5760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e6974696174656400000000000000006044820152606401610c5c565b601480548651630100000063ff0000ff19909216901515171790556020808601516005805460ff1916911515919091179055600b8054336001600160a01b031990911681179091558551868301516040808901518851958901519189015160608a015160808b01516138049893949291908a614249565b6060840151600f80546001600160a01b0319166001600160a01b0390921691909117905560a08301516015819055633b9aca001161387c5760405162461bcd60e51b8152602060048201526015602482015274436f6c6c656374696f6e20697320746f6f2062696760581b6044820152606401610c5c565b60c08301511580613893575060c08301516101f411155b156138a3576101f46016556138ac565b60c08301516016555b60e0830151601755815180516138ca91600091602090910190614a44565b5060208083015180516138e1926001920190614a44565b50604082015180516138fe91633b9aca1991602090910190614a44565b5060055460ff1615612359577f9e7bf1ba367b3cedbb30aa087793835272865fe2ad4c6de17056568485c063f1633b9aca1960405161393d9190615979565b60405180910390a15050505050565b612e7584848461322c565b60003046878787878760405160200161371297969594939291906159fe565b60608161399a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156139c457806139ae81615a4c565b91506139bd9050600a836156d8565b915061399e565b6000816001600160401b038111156139de576139de614ae9565b6040519080825280601f01601f191660200182016040528015613a08576020820181803683370190505b5090505b8415611d2357613a1d60018361550b565b9150613a2a600a866157d8565b613a3590603061555d565b60f81b818381518110613a4a57613a4a61585e565b60200101906001600160f81b031916908160001a905350613a6c600a866156d8565b9450613a0c565b600080825160411415613aaa5760208301516040840151606085015160001a613a9e8782858561470b565b94509450505050611740565b825160401415613ad45760208301516040840151613ac98683836147f8565b935093505050611740565b50600090506002611740565b6000816004811115613af457613af4615a67565b1415613afd5750565b6001816004811115613b1157613b11615a67565b1415613b5f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c5c565b6002816004811115613b7357613b73615a67565b1415613bc15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c5c565b6003816004811115613bd557613bd5615a67565b1415613c2e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c5c565b6004816004811115613c4257613c42615a67565b14156117d25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c5c565b826001600160a01b0316613cae82611a4a565b6001600160a01b031614613cd45760405162461bcd60e51b8152600401610c5c90615615565b6110ab83838361322c565b60006001600160a01b0384163b15613de157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613d23903390899088908890600401615a7d565b602060405180830381600087803b158015613d3d57600080fd5b505af1925050508015613d6d575060408051601f3d908101601f19168201909252613d6a91810190615ab0565b60015b613dc7573d808015613d9b576040519150601f19603f3d011682016040523d82523d6000602084013e613da0565b606091505b508051613dbf5760405162461bcd60e51b8152600401610c5c90615874565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d23565b506001611d23565b6000600254601554613dfb919061550b565b905060005b82811015613eea576000613e13836133fe565b90506000601982633b9aca008110613e2d57613e2d61585e565b01549050600081613e3f575081613e42565b50805b60006019613e5160018861550b565b633b9aca008110613e6457613e6461585e565b0154905080613e9557613e7860018761550b565b601985633b9aca008110613e8e57613e8e61585e565b0155613eaf565b80601985633b9aca008110613eac57613eac61585e565b01555b613ec68860045484613ec1919061555d565b614827565b85613ed0816156ec565b965050505050508080613ee290615a4c565b915050613e00565b506040805180820182526001600160a01b0385166000908152600860205291909120548190613f239085906001600160801b03166158ee565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613f62918691600160801b9004166158ee565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b0291909416179092555050565b60055460ff1615613ffa5760405162461bcd60e51b815260206004820181905260248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652066616c73656044820152606401610c5c565b6001600160a01b0382166140505760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c5c565b600081600454614060919061555d565b6004549091505b818110156140a857600081815260066020526040902080546001600160a01b0319166001600160a01b0386161790556140a160058261555d565b9050614067565b506004545b81811015614125576140d16000858360405180602001604052806000815250613cdf565b6140ed5760405162461bcd60e51b8152600401610c5c90615874565b60405181906001600160a01b03861690600090600080516020615ace833981519152908290a48061411d81615a4c565b9150506140ad565b506040805180820182526001600160a01b038516600090815260086020529190912054819061415e9085906001600160801b03166158ee565b6001600160801b0390811682526001600160a01b03861660009081526008602090815260409091205492019161419d918691600160801b9004166158ee565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b02919094161790925550600455565b6000818152601160205260409020546001600160a01b0316156110ab5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f6b656e206f6e206c6f616e0000006044820152606401610c5c565b600e80546001600160a01b0319166001600160a01b038b161790556103e88511156142865760405162461bcd60e51b8152600401610c5c90615703565b6020810151516143b45761271061429f856101f461555d565b11156142e35760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b6044820152606401610c5c565b6040805160a0810182526001600160401b038781168083526101f46020808501829052928916848601819052600060608087018290526080968701829052601080546001600160801b0319169095176901f40000000000000000176001600160801b0316600160801b9093026001600160c01b03169290921790935585519182529281018990529384018190529083018190529182916001600160a01b038d16917f3cb99bbd0146206440c4e4974b1b43f49bbdcdc6d3dee05326e20fc75c945fec910160405180910390a46146cc565b61271084836143c3868a61555d565b6143cd919061555d565b6143d7919061555d565b111561441b5760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b6044820152606401610c5c565b604080516101206020820181905260106101408301526f496e697469616c697a6553706c69747360801b6101608301526001600160a01b03808e1693830193909352828c166060830152828b16608083015291891660a082015260c0810188905260e08101869052610100810185905290810183905260009061018001604051602081830303815290604052905060006144bb8280519060200120612afe565b90506001600160a01b038c166144da8460005b60200201518390612b51565b6001600160a01b0316146145285760405162461bcd60e51b81526020600482015260156024820152742737ba1039b4b3b732b210313c9031b932b0ba37b960591b6044820152606401610c5c565b731baad9bfa20eb279d2e3f3e859e3ae9dde666c526145488460016144ce565b6001600160a01b03161461459e5760405162461bcd60e51b815260206004820152601e60248201527f4e6f74207369676e6564206279207665726966696564206164647265737300006044820152606401610c5c565b600c80546001600160a01b03199081166001600160a01b038d8116918217909355600d80549092168c84169081179092556040805160a0810182526001600160401b038c81168083528e82166020808501829052928e1684860181905263ffffffff8e81166060808801829052918f166080978801819052601080546001600160801b031916909617600160401b909502949094176bffffffffffffffffffffffff60801b1916600160801b90930263ffffffff60c01b191692909217600160c01b909202919091176001600160e01b0316600160e01b9092029190911790915583518f81529182018d90529281018b905291820189905292939192918f16917f3cb99bbd0146206440c4e4974b1b43f49bbdcdc6d3dee05326e20fc75c945fec910160405180910390a450505b6040518581527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b39060200160405180910390a150505050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561474257506000905060036147ef565b8460ff16601b1415801561475a57508460ff16601c14155b1561476b57506000905060046147ef565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147bf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147e8576000600192509250506147ef565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016148198782888561470b565b935093505050935093915050565b61314f828260405180602001604052806000815250614846838361486f565b6148536000848484613cdf565b6110ab5760405162461bcd60e51b8152600401610c5c90615874565b60055460ff166148c15760405162461bcd60e51b815260206004820152601f60248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652074727565006044820152606401610c5c565b6001600160a01b0382166149175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c5c565b61492081612fa5565b1561496d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c5c565b614979600083836141e4565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ace833981519152908290a45050565b8280546149cc90615522565b90600052602060002090601f0160209004810192826149ee5760008555614a34565b82601f10614a075782800160ff19823516178555614a34565b82800160010185558215614a34579182015b82811115614a34578235825591602001919060010190614a19565b50614a40929150614ab8565b5090565b828054614a5090615522565b90600052602060002090601f016020900481019282614a725760008555614a34565b82601f10614a8b57805160ff1916838001178555614a34565b82800160010185558215614a34579182015b82811115614a34578251825591602001919060010190614a9d565b5b80821115614a405760008155600101614ab9565b80356001600160a01b0381168114614ae457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715614b2157614b21614ae9565b60405290565b604080519081016001600160401b0381118282101715614b2157614b21614ae9565b600082601f830112614b5a57600080fd5b614b62614aff565b806080840185811115614b7457600080fd5b845b81811015614b8e578035845260209384019301614b76565b509095945050505050565b60006001600160401b0380841115614bb357614bb3614ae9565b604051601f8501601f19908116603f01168101908282118183101715614bdb57614bdb614ae9565b81604052809350858152868686011115614bf457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112614c1f57600080fd5b61346983833560208501614b99565b6000806000806000806000610140888a031215614c4a57600080fd5b614c5388614acd565b9650602088013595506040880135945060608801359350614c778960808a01614b49565b92506101008801356001600160401b0380821115614c9457600080fd5b614ca08b838c01614c0e565b93506101208a0135915080821115614cb757600080fd5b50614cc48a828b01614c0e565b91505092959891949750929550565b6001600160e01b0319811681146117d257600080fd5b600060208284031215614cfb57600080fd5b813561346981614cd3565b60005b83811015614d21578181015183820152602001614d09565b838111156115da5750506000910152565b60008151808452614d4a816020860160208601614d06565b601f01601f19169290920160200192915050565b6020815260006134696020830184614d32565b600060208284031215614d8357600080fd5b5035919050565b60008060408385031215614d9d57600080fd5b614da683614acd565b946020939093013593505050565b60008060008060e08587031215614dca57600080fd5b843593506020850135925060408501359150614de98660608701614b49565b905092959194509250565b600080600080600080600080610100898b031215614e1157600080fd5b614e1a89614acd565b97506020890135965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b0380821115614e5957600080fd5b614e658c838d01614c0e565b935060e08b0135915080821115614e7b57600080fd5b50614e888b828c01614c0e565b9150509295985092959890939650565b600080600060608486031215614ead57600080fd5b614eb684614acd565b9250614ec460208501614acd565b9150604084013590509250925092565b80358015158114614ae457600080fd5b600080600060408486031215614ef957600080fd5b83356001600160401b0380821115614f1057600080fd5b818601915086601f830112614f2457600080fd5b813581811115614f3357600080fd5b876020828501011115614f4557600080fd5b602092830195509350614f5b9186019050614ed4565b90509250925092565b60008060408385031215614f7757600080fd5b50508035926020909101359150565b600060208284031215614f9857600080fd5b61346982614ed4565b600060808284031215614fb357600080fd5b6134698383614b49565b600060208284031215614fcf57600080fd5b61346982614acd565b600080600060c08486031215614fed57600080fd5b8335925060208401359150614f5b8560408601614b49565b600080600080600060a0868803121561501d57600080fd5b61502686614acd565b97602087013597506040870135966060810135965060800135945092505050565b600080600080600080610120878903121561506157600080fd5b8635955060208701359450604087013593506150808860608901614b49565b925060e08701356001600160401b038082111561509c57600080fd5b6150a88a838b01614c0e565b93506101008901359150808211156150bf57600080fd5b506150cc89828a01614c0e565b9150509295509295509295565b600080604083850312156150ec57600080fd5b6150f583614acd565b915061510360208401614ed4565b90509250929050565b600082601f83011261511d57600080fd5b615125614aff565b80608084018581111561513757600080fd5b845b81811015614b8e5761514a81614acd565b845260209384019301615139565b600082601f83011261516957600080fd5b6040516101008082018281106001600160401b038211171561518d5761518d614ae9565b604052830181858211156151a057600080fd5b845b828110156151ba5780358252602091820191016151a2565b509195945050505050565b6000601f83818401126151d757600080fd5b604051606081016001600160401b0382821081831117156151fa576151fa614ae9565b81604052829150606086018781111561521257600080fd5b865b8181101561525c5780358381111561522c5760008081fd5b88018681018a1361523d5760008081fd5b602061524d8b8335838501614b99565b86529094019350602001615214565b5092979650505050505050565b600082601f83011261527a57600080fd5b615282614b27565b80604084018581111561529457600080fd5b845b81811015614b8e5780356001600160401b038111156152b55760008081fd5b6152c188828901614c0e565b85525060209384019301615296565b600080600080600061020086880312156152e957600080fd5b86601f8701126152f857600080fd5b615300614b27565b80604088018981111561531257600080fd5b885b818110156153335761532581614ed4565b845260209384019301615314565b508197506153418a8261510c565b96505050506153538760c08801615158565b92506101c08601356001600160401b038082111561537057600080fd5b61537c89838a016151c5565b93506101e088013591508082111561539357600080fd5b506153a088828901615269565b9150509295509295909350565b600080600080608085870312156153c357600080fd5b6153cc85614acd565b93506153da60208601614acd565b92506040850135915060608501356001600160401b038111156153fc57600080fd5b61540887828801614c0e565b91505092959194509250565b6000806040838503121561542757600080fd5b8235915061510360208401614acd565b6000806040838503121561544a57600080fd5b61545383614acd565b915061510360208401614acd565b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156154af578551851683529483019491830191600101615491565b5050858103604087015286518082529082019350915080860160005b838110156154e7578151855293820193908201906001016154cb565b509298975050505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561551d5761551d6154f5565b500390565b600181811c9082168061553657607f821691505b6020821081141561555757634e487b7160e01b600052602260045260246000fd5b50919050565b60008219821115615570576155706154f5565b500190565b60208082526016908201527513dd995c881d1c985b9cd858dd1a5bdb881b1a5b5a5d60521b604082015260600190565b60008160001904831182151516156155bf576155bf6154f5565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601260045260246000fd5b6000826156e7576156e76156c2565b500490565b6000816156fb576156fb6154f5565b506000190190565b60208082526028908201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636040820152676f6e64617269657360c01b606082015260800190565b6000815461575881615522565b600182811680156157705760018114615781576157b0565b60ff198416875282870194506157b0565b8560005260208060002060005b858110156157a75781548a82015290840190820161578e565b50505082870194505b5050505092915050565b600083516157cc818460208801614d06565b6124cd8184018561574b565b6000826157e7576157e76156c2565b500690565b600084516157fe818460208901614d06565b61580a8184018661574b565b9050602f60f81b81528351615826816001840160208801614d06565b0160010195945050505050565b60006001600160401b03808316818516808303821115615855576158556154f5565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001600160801b03838116908316818110156158e6576158e66154f5565b039392505050565b60006001600160801b03808316818516808303821115615855576158556154f5565b8060005b60048110156115da578151845260209384019390910190600101615914565b6001600160a01b03878116825260208201879052851660408201526060810184905261012081016159676080830185615910565b82610100830152979650505050505050565b600060208083526000845461598d81615522565b808487015260406001808416600081146159ae57600181146159c2576159f0565b60ff198516898401526060890195506159f0565b896000528660002060005b858110156159e85781548b82018601529083019088016159cd565b8a0184019650505b509398975050505050505050565b6001600160a01b0388811682526020820188905286166040820152606081018590526080810184905260a081018390526101408101615a4060c0830184615910565b98975050505050505050565b6000600019821415615a6057615a606154f5565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eb790830184614d32565b600060208284031215615ac257600080fd5b815161346981614cd356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201263082eb313ef68798ab10f972f5416757494cedeccd33b017d049659d2a45664736f6c634300080900333cb99bbd0146206440c4e4974b1b43f49bbdcdc6d3dee05326e20fc75c945fec0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000006456173656c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454153450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c8063801ad21e116101e7578063b88d4fde1161010d578063d5abeb01116100a0578063ed9ec8881161006f578063ed9ec88814610b2f578063ee9c8e7914610b75578063f2fde38b14610b95578063f7c84dda14610bb557600080fd5b8063d5abeb0114610a9a578063d73e627814610ab0578063da76d5cd14610ac6578063e985e9c514610ae657600080fd5b8063c92dae4f116100dc578063c92dae4f14610a24578063ce67e92a14610a44578063d3e1fe1414610a64578063d555654414610a8457600080fd5b8063b88d4fde1461099c578063bc1c741c146109bc578063c53ac347146109e4578063c87b56dd14610a0457600080fd5b8063a22cb46511610185578063adf482b411610154578063adf482b414610926578063b374461f14610946578063b5901fbc14610966578063b5917aa81461098657600080fd5b8063a22cb465146108b2578063a2309ff8146108d2578063a4e2d634146108e7578063a87f884e1461090657600080fd5b80638da5cb5b116101c15780638da5cb5b14610845578063902e69eb1461086357806395d89b4114610883578063a07c7ce41461089857600080fd5b8063801ad21e146107f25780638596dd27146108125780638b4ed1de1461083257600080fd5b806344447f47116102d757806367b6f5d21161026a578063715018a611610239578063715018a614610787578063743717fc1461079c5780637501f741146107bc578063751c1a8e146107d257600080fd5b806367b6f5d2146106995780636b81398a146106b95780636cbdec7d146106d957806370a082311461076757600080fd5b80635e5a9e30116102a65780635e5a9e3014610637578063617d11261461064c5780636352211e1461066457806364143b081461068457600080fd5b806344447f47146105c157806348fc6f1a146105d65780635595fb6a146105f657806359fbb5411461061657600080fd5b806318160ddd1161034f5780632a55205a1161031e5780632a55205a1461052c5780632bbc59db1461056b57806342842e0e1461058157806342966c68146105a157600080fd5b806318160ddd146104b657806321385d0a146104d957806323b872dd146104ec57806323dc350b1461050c57600080fd5b8063081812fc1161038b578063081812fc1461041e578063095ea7b3146104565780630b9526ee1461047657806315a88d221461049657600080fd5b80630198b163146103b257806301ffc9a7146103c757806306fdde03146103fc575b600080fd5b6103c56103c0366004614c2e565b610beb565b005b3480156103d357600080fd5b506103e76103e2366004614ce9565b610e39565b60405190151581526020015b60405180910390f35b34801561040857600080fd5b50610411610e7f565b6040516103f39190614d5e565b34801561042a57600080fd5b5061043e610439366004614d71565b610f11565b6040516001600160a01b0390911681526020016103f3565b34801561046257600080fd5b506103c5610471366004614d8a565b610f99565b34801561048257600080fd5b506103c5610491366004614db4565b6110b0565b3480156104a257600080fd5b50600c5461043e906001600160a01b031681565b3480156104c257600080fd5b506104cb61112a565b6040519081526020016103f3565b6103c56104e7366004614df4565b611146565b3480156104f857600080fd5b506103c5610507366004614e98565b611569565b34801561051857600080fd5b506103c5610527366004614ee4565b6115e0565b34801561053857600080fd5b5061054c610547366004614f64565b6116fc565b604080516001600160a01b0390931683526020830191909152016103f3565b34801561057757600080fd5b506104cb61271081565b34801561058d57600080fd5b506103c561059c366004614e98565b611747565b3480156105ad57600080fd5b506103c56105bc366004614d71565b611762565b3480156105cd57600080fd5b506103c56117d5565b3480156105e257600080fd5b506103c56105f1366004614f86565b611899565b34801561060257600080fd5b5061043e610611366004614d71565b61191b565b34801561062257600080fd5b50600b546103e790600160a01b900460ff1681565b34801561064357600080fd5b506103c561198e565b34801561065857600080fd5b506104cb633b9aca0081565b34801561067057600080fd5b5061043e61067f366004614d71565b611a4a565b34801561069057600080fd5b50610411611b89565b3480156106a557600080fd5b506104cb6106b4366004614fa1565b611c1a565b3480156106c557600080fd5b50600f5461043e906001600160a01b031681565b3480156106e557600080fd5b50601054610726906001600160401b0380821691600160401b8104821691600160801b8204169063ffffffff600160c01b8204811691600160e01b90041685565b604080516001600160401b0396871681529486166020860152929094169183019190915263ffffffff9081166060830152909116608082015260a0016103f3565b34801561077357600080fd5b506104cb610782366004614fbd565b611c25565b34801561079357600080fd5b506103c5611cb5565b3480156107a857600080fd5b506104cb6107b7366004614fd8565b611ceb565b3480156107c857600080fd5b506104cb60175481565b3480156107de57600080fd5b506103c56107ed366004614d71565b611d2b565b3480156107fe57600080fd5b506103c561080d366004614fd8565b611e1f565b34801561081e57600080fd5b506104cb61082d366004615005565b611e9f565b6103c5610840366004615047565b611ec1565b34801561085157600080fd5b50600b546001600160a01b031661043e565b34801561086f57600080fd5b50600e5461043e906001600160a01b031681565b34801561088f57600080fd5b5061041161217b565b3480156108a457600080fd5b506014546103e79060ff1681565b3480156108be57600080fd5b506103c56108cd3660046150d9565b61218a565b3480156108de57600080fd5b506104cb61224f565b3480156108f357600080fd5b506014546103e790610100900460ff1681565b34801561091257600080fd5b506103c5610921366004614d71565b61226b565b34801561093257600080fd5b506103c5610941366004614d71565b6122b4565b34801561095257600080fd5b506103c56109613660046152d0565b61234c565b34801561097257600080fd5b506103c5610981366004615005565b612360565b34801561099257600080fd5b506104cb6103e881565b3480156109a857600080fd5b506103c56109b73660046153ad565b6123e4565b3480156109c857600080fd5b5061043e73a95850bb73459adb9587a97f103a4a7cce59b56e81565b3480156109f057600080fd5b506104cb6109ff366004614db4565b612455565b348015610a1057600080fd5b50610411610a1f366004614d71565b6124d6565b348015610a3057600080fd5b506103c5610a3f366004615414565b6125fc565b348015610a5057600080fd5b506103c5610a5f366004614f86565b6126c2565b348015610a7057600080fd5b50600d5461043e906001600160a01b031681565b348015610a9057600080fd5b506104cb60185481565b348015610aa657600080fd5b506104cb60155481565b348015610abc57600080fd5b506104cb60165481565b348015610ad257600080fd5b506103c5610ae1366004614d71565b612737565b348015610af257600080fd5b506103e7610b01366004615437565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b348015610b3b57600080fd5b506104cb610b4a366004614fbd565b6001600160a01b0316600090815260086020526040902054600160801b90046001600160801b031690565b348015610b8157600080fd5b506103c5610b90366004614fbd565b6129ee565b348015610ba157600080fd5b506103c5610bb0366004614fbd565b612a66565b348015610bc157600080fd5b506104cb610bd0366004614fbd565b6001600160a01b031660009081526012602052604090205490565b6000610bf684612b75565b6001600160a01b0389166000908152601260205260409020549091508714610c655760405162461bcd60e51b815260206004820152601b60248201527f496e636f7272656374207369676e61747572652076657273696f6e000000000060448201526064015b60405180910390fd5b80341015610cad5760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682045544820746f2062757960581b6044820152606401610c5c565b6000610cbc8989898989612d12565b9050610cca818a8686612d29565b6000818152601360205260409020805460ff1916600117905585610ceb3390565b6001600160a01b03168a6001600160a01b03167f7037752486358ce67464a572503f020d1bf316b5d92a7a21d1d7e7ef0d7aab2d8585604051610d38929190918252602082015260400190565b60405180910390a4610d5b89338860405180602001604052806000815250612e6a565b600b546001600160a01b038a8116911614610ded5773a95850bb73459adb9587a97f103a4a7cce59b56e638b52e2cb838b610d94612e9d565b610d9c612eff565b6040518563ffffffff1660e01b8152600401610dba93929190615461565b6000604051808303818588803b158015610dd357600080fd5b505af1158015610de7573d6000803e3d6000fd5b50505050505b335b6001600160a01b03166108fc610e05843461550b565b6040518115909202916000818181858888f19350505050158015610e2d573d6000803e3d6000fd5b50505050505050505050565b60006001600160e01b03198216630704183b60e11b1480610e6a57506001600160e01b0319821663152a902d60e11b145b80610e795750610e7982612f55565b92915050565b606060008054610e8e90615522565b80601f0160208091040260200160405190810160405280929190818152602001828054610eba90615522565b8015610f075780601f10610edc57610100808354040283529160200191610f07565b820191906000526020600020905b815481529060010190602001808311610eea57829003601f168201915b5050505050905090565b6000610f1c82612fa5565b610f7d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c5c565b506000908152600960205260409020546001600160a01b031690565b6000610fa482611a4a565b9050806001600160a01b0316836001600160a01b031614156110125760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610c5c565b336001600160a01b038216148061102e575061102e8133610b01565b6110a05760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c5c565b6110ab838383612ff4565b505050565b60006110bf3386868686612d12565b6000818152601360205260409020805460ff1916600117905590506110e13390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf78260405161111b91815260200190565b60405180910390a25050505050565b600060035461113761224f565b611141919061550b565b905090565b6015548361115261224f565b61115c919061555d565b11156111a45760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610c5c565b8383111580156111b45750600083115b6111f45760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908189d5e505b5bdd5b9d607a1b6044820152606401610c5c565b6016548311156112165760405162461bcd60e51b8152600401610c5c90615575565b6012600061122c600b546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002054871461129b5760405162461bcd60e51b815260206004820181905260248201527f546869732070726573616c652076657273696f6e2069732064697361626c65646044820152606401610c5c565b6001600160a01b03881633146112e45760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21039b2b73232b960911b6044820152606401610c5c565b6112ef335b3b151590565b156113385760405162461bcd60e51b815260206004820152601960248201527810d85b9b9bdd081b5a5b9d08199c9bdb4818dbdb9d1c9858dd603a1b6044820152606401610c5c565b600061134484876155a5565b90508034101561138c5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610c5c565b600061139b8a8a8a8a8a613071565b60008181526013602052604090205490915060ff16156113f45760405162461bcd60e51b81526020600482015260146024820152735369676e6174757265206e6f742061637469766560601b6044820152606401610c5c565b600b546001600160a01b031661140a8286612b51565b6001600160a01b0316146114ba5760145462010000900460ff1615801561143b5750600f546001600160a01b031615155b80156114635750600f546001600160a01b03166114588285612b51565b6001600160a01b0316145b6114ba5760405162461bcd60e51b815260206004820152602260248201527f4e6f74207369676e6564206279206475616c207369676e6572206f72206f776e60448201526132b960f11b6064820152608401610c5c565b6000818152601360205260409020805460ff191660011790556114e36114dd3390565b86613083565b6040805186815260208101899052808201839052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a2336108fc611534843461550b565b6040518115909202916000818181858888f1935050505015801561155c573d6000803e3d6000fd5b5050505050505050505050565b600061157482611a4a565b9050611582335b8383613153565b61159e5760405162461bcd60e51b8152600401610c5c906155c4565b836001600160a01b0316816001600160a01b0316146115cf5760405162461bcd60e51b8152600401610c5c90615615565b6115da84848461322c565b50505050565b600b546001600160a01b0316331461160a5760405162461bcd60e51b8152600401610c5c9061565e565b601454610100900460ff16156116625760405162461bcd60e51b815260206004820152601d60248201527f54686520746f6b656e2055524920686173206265656e206c6f636b65640000006044820152606401610c5c565b80801561166f5750601854155b1561169a5761168b6001601554611686919061550b565b6133fe565b61169690600161555d565b6018555b6116a9633b9aca1984846149c0565b506005805460ff191660011790556004546002556040517f9e7bf1ba367b3cedbb30aa087793835272865fe2ad4c6de17056568485c063f1906116ef9085908590615693565b60405180910390a1505050565b601054600090819081906127109061171d906001600160401b0316866155a5565b61172791906156d8565b905061173b600b546001600160a01b031690565b925090505b9250929050565b6110ab838383604051806020016040528060008152506123e4565b60145460ff166117c95760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e732066726f6d207468697320636f6c6c656374696f6e206172652060448201526b6e6f74206275726e61626c6560a01b6064820152608401610c5c565b6117d281613470565b50565b600b546001600160a01b031633146117ff5760405162461bcd60e51b8152600401610c5c9061565e565b60055460ff1661185c5760405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e2055524920686173206e6f74206265656e207365742079604482015261195d60f21b6064820152608401610c5c565b60025460158190556040519081527f99e2ed63ef06d00d742b538d8e154d800c413d265a20c15ce2653c111d338e7a9060200160405180910390a1565b600b546001600160a01b031633146118c35760405162461bcd60e51b8152600401610c5c9061565e565b600b8054821515600160a01b0260ff60a01b199091161790556040517f71c51fed67dbe96b4985ba8dcf3f768bedc716f27d3b2d1fc53e0c7263555e549061191090831515815260200190565b60405180910390a150565b600061192682612fa5565b6119725760405162461bcd60e51b815260206004820152601960248201527f5468697320746f6b656e20646f6573206e6f74206578697374000000000000006044820152606401610c5c565b506000908152601160205260409020546001600160a01b031690565b600b546001600160a01b031633146119b85760405162461bcd60e51b8152600401610c5c9061565e565b601454610100900460ff1615611a105760405162461bcd60e51b815260206004820152601760248201527f436f6e747261637420616c7265616479206c6f636b65640000000000000000006044820152606401610c5c565b6014805461ff0019166101001790556040517f115e80b2aebbd2a71a30be32c7ebbe8d19d70a6dc91e61e4a0a24947491f240090600090a1565b6000611a5582612fa5565b611ab35760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610c5c565b6000828152600660205260409020546001600160a01b031615611aec57506000908152600660205260409020546001600160a01b031690565b600454821015611b8157600060058310611b1957611b0b60058461550b565b611b1690600161555d565b90505b6000611b2660018561550b565b90505b818110611b7e576000818152600660205260409020546001600160a01b031615611b6c576000908152600660205260409020546001600160a01b03169392505050565b80611b76816156ec565b915050611b29565b50505b506000919050565b633b9aca198054611b9990615522565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc590615522565b8015611c125780601f10611be757610100808354040283529160200191611c12565b820191906000526020600020905b815481529060010190602001808311611bf557829003601f168201915b505050505081565b6000610e7982612b75565b60006001600160a01b038216611c905760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610c5c565b506001600160a01b03166000908152600860205260409020546001600160801b031690565b600b546001600160a01b03163314611cdf5760405162461bcd60e51b8152600401610c5c9061565e565b611ce96000613598565b565b6000611cf6336135ea565b601654831115611d185760405162461bcd60e51b8152600401610c5c90615575565b611d23848484613653565b949350505050565b6000611d3682611a4a565b60008381526011602052604090205490915033906001600160a01b03168114611da15760405162461bcd60e51b815260206004820152601e60248201527f53656e646572206973206e6f742074686520746f6b656e206c6f616e657200006044820152606401610c5c565b600083815260116020908152604080832080546001600160a01b031916905580519182019052908152611dd990839083908690612e6a565b82816001600160a01b0316836001600160a01b03167f484cfdc469392f506ef19931236d4aa91abbd5e8e704f155c0a971ee8908bd5f60405160405180910390a4505050565b611e28336135ea565b6000611e358484846136a0565b6000818152601360205260409020805460ff191660011790559050611e573390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf782604051611e9191815260200190565b60405180910390a250505050565b6000611eaa336135ea565b611eb786868686866136b0565b9695505050505050565b60155484611ecd61224f565b611ed7919061555d565b1115611f1f5760405162461bcd60e51b815260206004820152601760248201527613dd995c881d1bdad95b881cdd5c1c1b1e481b1a5b5a5d604a1b6044820152606401610c5c565b83611f605760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a5908189d5e505b5bdd5b9d607a1b6044820152606401610c5c565b84841480611f6c575084155b611fb05760405162461bcd60e51b815260206004820152601560248201527413dd995c881cda59db985d1d5c9948185b5bdd5b9d605a1b6044820152606401610c5c565b601654841115611fd25760405162461bcd60e51b8152600401610c5c90615575565b60126000611fe8600b546001600160a01b031690565b6001600160a01b03166001600160a01b031681526020019081526020016000205486146120495760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103b32b939b4b7b760891b6044820152606401610c5c565b612052336112e9565b1561209b5760405162461bcd60e51b815260206004820152601960248201527810d85b9b9bdd081b5a5b9d08199c9bdb4818dbdb9d1c9858dd603a1b6044820152606401610c5c565b60006120a684612b75565b905060006120b482876155a5565b9050803410156120fc5760405162461bcd60e51b8152602060048201526013602482015272135cd9c81d985b1d59481d1bdbc81cdb585b1b606a1b6044820152606401610c5c565b60006121098989886136a0565b905061212881612121600b546001600160a01b031690565b8787612d29565b6121323388613083565b6040805188815260208101859052808201839052905133917fb843254f335bad03d960d4a0f988ebaae823a93f1bf5f61b6e8702d95d6ee311919081900360600190a233610def565b606060018054610e8e90615522565b6001600160a01b0382163314156121e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c5c565b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60055460009060ff1615612264575060025490565b5060045490565b3360008181526012602090815260409182902084905590518381527f40c93307f56fc72b7eaf9af01e59f7a78540e7dc1a79dd0a73854fedbb6e7867910160405180910390a250565b600b546001600160a01b031633146122de5760405162461bcd60e51b8152600401610c5c9061565e565b6103e88111156123005760405162461bcd60e51b8152600401610c5c90615703565b6010805467ffffffffffffffff19166001600160401b0383161790556040518181527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b390602001611910565b6123598585858585613733565b5050505050565b612369336135ea565b60006123788686868686613071565b6000818152601360205260409020805460ff19166001179055905061239a3390565b6001600160a01b03167fea5ab772b9c02a538d11e47d094496a6e24123ee5d26c1ec94db232afada1cf7826040516123d491815260200190565b60405180910390a2505050505050565b60006123ef83611a4a565b90506123fc338483613153565b6124185760405162461bcd60e51b8152600401610c5c906155c4565b846001600160a01b0316816001600160a01b0316146124495760405162461bcd60e51b8152600401610c5c90615615565b6123598585858561394c565b600061246083611a4a565b6001600160a01b0316336001600160a01b0316146124c05760405162461bcd60e51b815260206004820152601a60248201527f4e6f7420746865206f776e6572206f662074686520746f6b656e0000000000006044820152606401610c5c565b6124cd3386868686613957565b95945050505050565b60055460609060ff1661252d57604080518082019091526007815266697066733a2f2f60c81b6020820152633b9aca196040516020016125179291906157ba565b6040516020818303038152906040529050919050565b61253682612fa5565b6125825760405162461bcd60e51b815260206004820152601f60248201527f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e006044820152606401610c5c565b600060155460185484612595919061555d565b61259f91906157d8565b90506125c5604080518082019091526007815266697066733a2f2f60c81b602082015290565b633b9aca196125d383613976565b6040516020016125e5939291906157ec565b604051602081830303815290604052915050919050565b600b543390600160a01b900460ff1661264a5760405162461bcd60e51b815260206004820152601060248201526f4c6f616e73206e6f742061637469766560801b6044820152606401610c5c565b61266581838560405180602001604052806000815250612e6a565b60008381526011602052604080822080546001600160a01b0319166001600160a01b038581169182179092559151869391861692917f4d699c2a3f40be9f50773ce2da5d80769decfefe6c4d557178af6e4a412d29a791a4505050565b600b546001600160a01b031633146126ec5760405162461bcd60e51b8152600401610c5c9061565e565b60148054821515620100000262ff0000199091161790556040517f554a79345f98adca121897124094b27f98f92832c0fd23c2f8aaba39471063dc9061191090831515815260200190565b478111156127425750475b6000612750612710836156d8565b601054909150600160801b90046001600160401b0316156127c557600e546010546001600160a01b03909116906108fc9061279b90600160801b90046001600160401b0316846155a5565b6040518115909202916000818181858888f193505050501580156127c3573d6000803e3d6000fd5b505b601054600160c01b900463ffffffff161561283157600c546010546001600160a01b03909116906108fc9061280790600160c01b900463ffffffff16846155a5565b6040518115909202916000818181858888f1935050505015801561282f573d6000803e3d6000fd5b505b601054600160e01b900463ffffffff161561289d57600d546010546001600160a01b03909116906108fc9061287390600160e01b900463ffffffff16846155a5565b6040518115909202916000818181858888f1935050505015801561289b573d6000803e3d6000fd5b505b60105473a95850bb73459adb9587a97f103a4a7cce59b56e906108fc906128d490600160401b90046001600160401b0316846155a5565b6040518115909202916000818181858888f193505050501580156128fc573d6000803e3d6000fd5b506010546000906001600160401b03600160401b820481169163ffffffff600160c01b820481169261294092600160e01b810490921691600160801b900416615833565b61294a9190615833565b6129549190615833565b612967906001600160401b0316836155a5565b612971908461550b565b9050612985600b546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156129bd573d6000803e3d6000fd5b506040518381527f39f8b889424a1684bd36857c25ab79691ed71adf60bbeca32820cb4de3c5884c906020016116ef565b600b546001600160a01b03163314612a185760405162461bcd60e51b8152600401610c5c9061565e565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f49b0b4a863b68b1adb4ae68ebb653df823103c105582bb73e2507b1b9e10d2be90602001611910565b600b546001600160a01b03163314612a905760405162461bcd60e51b8152600401610c5c9061565e565b6001600160a01b038116612af55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c5c565b6117d281613598565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6000806000612b608585613a73565b91509150612b6d81613ae0565b509392505050565b80516020820151604083015160608401516000939291904282811015612bd35760405162461bcd60e51b815260206004820152601360248201527212185cc81b9bdd081cdd185c9d1959081e595d606a1b6044820152606401610c5c565b818310612c225760405162461bcd60e51b815260206004820152601860248201527f4d75737420656e642061667465722069742073746172747300000000000000006044820152606401610c5c565b83851015612c725760405162461bcd60e51b815260206004820152601d60248201527f456e64696e672070726963652063616e6e6f74206265206269676765720000006044820152606401610c5c565b83851480612c7f57508181115b15612c8f57509195945050505050565b6000612c9b858761550b565b9050600061012c612cac868561550b565b612cb691906156d8565b905080612cca575094979650505050505050565b600061012c612cd9878761550b565b612ce391906156d8565b905081612cf082856156d8565b612cfa91906155a5565b612d04908961550b565b9a9950505050505050505050565b6000611eb7612d248787878787613957565b612afe565b60008481526013602052604090205460ff1615612d805760405162461bcd60e51b815260206004820152601560248201527453616c65206e6f206c6f6e6765722061637469766560581b6044820152606401610c5c565b6001600160a01b038316612d948584612b51565b6001600160a01b031614612dea5760405162461bcd60e51b815260206004820152601b60248201527f4e6f74207369676e65642062792063757272656e74206f776e657200000000006044820152606401610c5c565b600f546001600160a01b03161580612e1e5750600f546001600160a01b0316612e138583612b51565b6001600160a01b0316145b6115da5760405162461bcd60e51b815260206004820152601960248201527f4e6f74207369676e6564206279206475616c207369676e6572000000000000006044820152606401610c5c565b612e75848484613c9b565b612e8184848484613cdf565b6115da5760405162461bcd60e51b8152600401610c5c90615874565b60408051600180825281830190925260609160009190602080830190803683375050600b54919250506001600160a01b031681600081518110612ee257612ee261585e565b6001600160a01b0390921660209283029190910190910152919050565b6040805160018082528183019092526060916000919060208083019080368337505060105482519293506001600160401b031691839150600090612f4557612f4561585e565b6020908102919091010152919050565b60006001600160e01b031982166380ac58cd60e01b1480612f8657506001600160e01b03198216635b5e139f60e01b145b80610e7957506301ffc9a760e01b6001600160e01b0319831614610e79565b60008181526007602052604081205460ff1615612fc457506000919050565b600454821015612fd657506001919050565b506000908152600660205260409020546001600160a01b0316151590565b6000828152600960205260409020546001600160a01b038481169116146110ab5760008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611eb7612d2487878787876136b0565b60175415806130c757506017546001600160a01b0383166000908152600860205260409020546130c4908390600160801b90046001600160801b031661555d565b11155b6131135760405162461bcd60e51b815260206004820152601760248201527f4275796572206f766572206d696e74206d6178696d756d0000000000000000006044820152606401610c5c565b60055460ff1615613145576131288282613de9565b806002600082825461313a919061555d565b9091555061314f9050565b61314f8282613fa7565b5050565b600061315e83612fa5565b6131bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610c5c565b816001600160a01b0316846001600160a01b031614806131f85750836001600160a01b03166131ed84610f11565b6001600160a01b0316145b80611d2357506001600160a01b038083166000908152600a602090815260408083209388168352929052205460ff16611d23565b6001600160a01b03821661328e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610c5c565b6132998383836141e4565b6132a560008285612ff4565b6001600160a01b03831660009081526008602052604081208054600192906132d79084906001600160801b03166158c6565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03841660009081526008602052604081208054600194509092613323918591166158ee565b82546101009290920a6001600160801b0381810219909316919092169190910217905550600081815260066020526040812080546001600160a01b0319166001600160a01b03851617905561337982600161555d565b90506004548110156133c9576000818152600660205260409020546001600160a01b03166133c957600081815260066020526040902080546001600160a01b0319166001600160a01b0386161790555b81836001600160a01b0316856001600160a01b0316600080516020615ace83398151915260405160405180910390a450505050565b60008161340d57506000919050565b600033444261341d60014361550b565b604080516001600160a01b039095166020860152840192909252606083015240608082015260a00160408051601f198184030181529190528051602090910120905061346983826157d8565b9392505050565b600061347b82611a4a565b90506134863361157b565b6134d25760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610c5c565b6134de816000846141e4565b6134ea60008383612ff4565b6001600160a01b038116600090815260086020526040812080546001929061351c9084906001600160801b03166158c6565b92506101000a8154816001600160801b0302191690836001600160801b03160217905550600160036000828254613553919061555d565b9091555050600082815260076020526040808220805460ff19166001179055518391906001600160a01b03841690600080516020615ace833981519152908390a45050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b03828116911614806136135750600f546001600160a01b038281169116145b6117d25760405162461bcd60e51b81526020600482015260116024820152702737ba103b30b634b21039b4b3b732b91760791b6044820152606401610c5c565b60003046613669600b546001600160a01b031690565b85858860405160200161368196959493929190615933565b6040516020818303038152906040528051906020012090509392505050565b6000611d23612d24858585613653565b600030466136c6600b546001600160a01b031690565b604080516001600160a01b0394851660208201529081019290925282166060820152908716608082015260a0810186905260c0810185905260e081018490526101008101839052610120015b60405160208183030381529060405280519060200120905095945050505050565b6014546301000000900460ff161561378d5760405162461bcd60e51b815260206004820152601860248201527f416c72656164792068617320626520696e6974696174656400000000000000006044820152606401610c5c565b601480548651630100000063ff0000ff19909216901515171790556020808601516005805460ff1916911515919091179055600b8054336001600160a01b031990911681179091558551868301516040808901518851958901519189015160608a015160808b01516138049893949291908a614249565b6060840151600f80546001600160a01b0319166001600160a01b0390921691909117905560a08301516015819055633b9aca001161387c5760405162461bcd60e51b8152602060048201526015602482015274436f6c6c656374696f6e20697320746f6f2062696760581b6044820152606401610c5c565b60c08301511580613893575060c08301516101f411155b156138a3576101f46016556138ac565b60c08301516016555b60e0830151601755815180516138ca91600091602090910190614a44565b5060208083015180516138e1926001920190614a44565b50604082015180516138fe91633b9aca1991602090910190614a44565b5060055460ff1615612359577f9e7bf1ba367b3cedbb30aa087793835272865fe2ad4c6de17056568485c063f1633b9aca1960405161393d9190615979565b60405180910390a15050505050565b612e7584848461322c565b60003046878787878760405160200161371297969594939291906159fe565b60608161399a5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156139c457806139ae81615a4c565b91506139bd9050600a836156d8565b915061399e565b6000816001600160401b038111156139de576139de614ae9565b6040519080825280601f01601f191660200182016040528015613a08576020820181803683370190505b5090505b8415611d2357613a1d60018361550b565b9150613a2a600a866157d8565b613a3590603061555d565b60f81b818381518110613a4a57613a4a61585e565b60200101906001600160f81b031916908160001a905350613a6c600a866156d8565b9450613a0c565b600080825160411415613aaa5760208301516040840151606085015160001a613a9e8782858561470b565b94509450505050611740565b825160401415613ad45760208301516040840151613ac98683836147f8565b935093505050611740565b50600090506002611740565b6000816004811115613af457613af4615a67565b1415613afd5750565b6001816004811115613b1157613b11615a67565b1415613b5f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610c5c565b6002816004811115613b7357613b73615a67565b1415613bc15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610c5c565b6003816004811115613bd557613bd5615a67565b1415613c2e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610c5c565b6004816004811115613c4257613c42615a67565b14156117d25760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610c5c565b826001600160a01b0316613cae82611a4a565b6001600160a01b031614613cd45760405162461bcd60e51b8152600401610c5c90615615565b6110ab83838361322c565b60006001600160a01b0384163b15613de157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613d23903390899088908890600401615a7d565b602060405180830381600087803b158015613d3d57600080fd5b505af1925050508015613d6d575060408051601f3d908101601f19168201909252613d6a91810190615ab0565b60015b613dc7573d808015613d9b576040519150601f19603f3d011682016040523d82523d6000602084013e613da0565b606091505b508051613dbf5760405162461bcd60e51b8152600401610c5c90615874565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d23565b506001611d23565b6000600254601554613dfb919061550b565b905060005b82811015613eea576000613e13836133fe565b90506000601982633b9aca008110613e2d57613e2d61585e565b01549050600081613e3f575081613e42565b50805b60006019613e5160018861550b565b633b9aca008110613e6457613e6461585e565b0154905080613e9557613e7860018761550b565b601985633b9aca008110613e8e57613e8e61585e565b0155613eaf565b80601985633b9aca008110613eac57613eac61585e565b01555b613ec68860045484613ec1919061555d565b614827565b85613ed0816156ec565b965050505050508080613ee290615a4c565b915050613e00565b506040805180820182526001600160a01b0385166000908152600860205291909120548190613f239085906001600160801b03166158ee565b6001600160801b0390811682526001600160a01b038616600090815260086020908152604090912054920191613f62918691600160801b9004166158ee565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b0291909416179092555050565b60055460ff1615613ffa5760405162461bcd60e51b815260206004820181905260248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652066616c73656044820152606401610c5c565b6001600160a01b0382166140505760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c5c565b600081600454614060919061555d565b6004549091505b818110156140a857600081815260066020526040902080546001600160a01b0319166001600160a01b0386161790556140a160058261555d565b9050614067565b506004545b81811015614125576140d16000858360405180602001604052806000815250613cdf565b6140ed5760405162461bcd60e51b8152600401610c5c90615874565b60405181906001600160a01b03861690600090600080516020615ace833981519152908290a48061411d81615a4c565b9150506140ad565b506040805180820182526001600160a01b038516600090815260086020529190912054819061415e9085906001600160801b03166158ee565b6001600160801b0390811682526001600160a01b03861660009081526008602090815260409091205492019161419d918691600160801b9004166158ee565b6001600160801b039081169091526001600160a01b039094166000908152600860209081526040909120825192909101518516600160801b02919094161790925550600455565b6000818152601160205260409020546001600160a01b0316156110ab5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f6b656e206f6e206c6f616e0000006044820152606401610c5c565b600e80546001600160a01b0319166001600160a01b038b161790556103e88511156142865760405162461bcd60e51b8152600401610c5c90615703565b6020810151516143b45761271061429f856101f461555d565b11156142e35760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b6044820152606401610c5c565b6040805160a0810182526001600160401b038781168083526101f46020808501829052928916848601819052600060608087018290526080968701829052601080546001600160801b0319169095176901f40000000000000000176001600160801b0316600160801b9093026001600160c01b03169290921790935585519182529281018990529384018190529083018190529182916001600160a01b038d16917f3cb99bbd0146206440c4e4974b1b43f49bbdcdc6d3dee05326e20fc75c945fec910160405180910390a46146cc565b61271084836143c3868a61555d565b6143cd919061555d565b6143d7919061555d565b111561441b5760405162461bcd60e51b8152602060048201526013602482015272084a0a640e6e0d8d2e8e640e8dede40d0d2ced606b1b6044820152606401610c5c565b604080516101206020820181905260106101408301526f496e697469616c697a6553706c69747360801b6101608301526001600160a01b03808e1693830193909352828c166060830152828b16608083015291891660a082015260c0810188905260e08101869052610100810185905290810183905260009061018001604051602081830303815290604052905060006144bb8280519060200120612afe565b90506001600160a01b038c166144da8460005b60200201518390612b51565b6001600160a01b0316146145285760405162461bcd60e51b81526020600482015260156024820152742737ba1039b4b3b732b210313c9031b932b0ba37b960591b6044820152606401610c5c565b731baad9bfa20eb279d2e3f3e859e3ae9dde666c526145488460016144ce565b6001600160a01b03161461459e5760405162461bcd60e51b815260206004820152601e60248201527f4e6f74207369676e6564206279207665726966696564206164647265737300006044820152606401610c5c565b600c80546001600160a01b03199081166001600160a01b038d8116918217909355600d80549092168c84169081179092556040805160a0810182526001600160401b038c81168083528e82166020808501829052928e1684860181905263ffffffff8e81166060808801829052918f166080978801819052601080546001600160801b031916909617600160401b909502949094176bffffffffffffffffffffffff60801b1916600160801b90930263ffffffff60c01b191692909217600160c01b909202919091176001600160e01b0316600160e01b9092029190911790915583518f81529182018d90529281018b905291820189905292939192918f16917f3cb99bbd0146206440c4e4974b1b43f49bbdcdc6d3dee05326e20fc75c945fec910160405180910390a450505b6040518581527f244ea8d7627f5a08f4299862bd5a45752842c183aee5b0fb0d1e4887bfa605b39060200160405180910390a150505050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561474257506000905060036147ef565b8460ff16601b1415801561475a57508460ff16601c14155b1561476b57506000905060046147ef565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156147bf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147e8576000600192509250506147ef565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016148198782888561470b565b935093505050935093915050565b61314f828260405180602001604052806000815250614846838361486f565b6148536000848484613cdf565b6110ab5760405162461bcd60e51b8152600401610c5c90615874565b60055460ff166148c15760405162461bcd60e51b815260206004820152601f60248201527f5f6e6f7453657175656e7469616c4d696e74206d7573742062652074727565006044820152606401610c5c565b6001600160a01b0382166149175760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c5c565b61492081612fa5565b1561496d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c5c565b614979600083836141e4565b60008181526006602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020615ace833981519152908290a45050565b8280546149cc90615522565b90600052602060002090601f0160209004810192826149ee5760008555614a34565b82601f10614a075782800160ff19823516178555614a34565b82800160010185558215614a34579182015b82811115614a34578235825591602001919060010190614a19565b50614a40929150614ab8565b5090565b828054614a5090615522565b90600052602060002090601f016020900481019282614a725760008555614a34565b82601f10614a8b57805160ff1916838001178555614a34565b82800160010185558215614a34579182015b82811115614a34578251825591602001919060010190614a9d565b5b80821115614a405760008155600101614ab9565b80356001600160a01b0381168114614ae457600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715614b2157614b21614ae9565b60405290565b604080519081016001600160401b0381118282101715614b2157614b21614ae9565b600082601f830112614b5a57600080fd5b614b62614aff565b806080840185811115614b7457600080fd5b845b81811015614b8e578035845260209384019301614b76565b509095945050505050565b60006001600160401b0380841115614bb357614bb3614ae9565b604051601f8501601f19908116603f01168101908282118183101715614bdb57614bdb614ae9565b81604052809350858152868686011115614bf457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112614c1f57600080fd5b61346983833560208501614b99565b6000806000806000806000610140888a031215614c4a57600080fd5b614c5388614acd565b9650602088013595506040880135945060608801359350614c778960808a01614b49565b92506101008801356001600160401b0380821115614c9457600080fd5b614ca08b838c01614c0e565b93506101208a0135915080821115614cb757600080fd5b50614cc48a828b01614c0e565b91505092959891949750929550565b6001600160e01b0319811681146117d257600080fd5b600060208284031215614cfb57600080fd5b813561346981614cd3565b60005b83811015614d21578181015183820152602001614d09565b838111156115da5750506000910152565b60008151808452614d4a816020860160208601614d06565b601f01601f19169290920160200192915050565b6020815260006134696020830184614d32565b600060208284031215614d8357600080fd5b5035919050565b60008060408385031215614d9d57600080fd5b614da683614acd565b946020939093013593505050565b60008060008060e08587031215614dca57600080fd5b843593506020850135925060408501359150614de98660608701614b49565b905092959194509250565b600080600080600080600080610100898b031215614e1157600080fd5b614e1a89614acd565b97506020890135965060408901359550606089013594506080890135935060a0890135925060c08901356001600160401b0380821115614e5957600080fd5b614e658c838d01614c0e565b935060e08b0135915080821115614e7b57600080fd5b50614e888b828c01614c0e565b9150509295985092959890939650565b600080600060608486031215614ead57600080fd5b614eb684614acd565b9250614ec460208501614acd565b9150604084013590509250925092565b80358015158114614ae457600080fd5b600080600060408486031215614ef957600080fd5b83356001600160401b0380821115614f1057600080fd5b818601915086601f830112614f2457600080fd5b813581811115614f3357600080fd5b876020828501011115614f4557600080fd5b602092830195509350614f5b9186019050614ed4565b90509250925092565b60008060408385031215614f7757600080fd5b50508035926020909101359150565b600060208284031215614f9857600080fd5b61346982614ed4565b600060808284031215614fb357600080fd5b6134698383614b49565b600060208284031215614fcf57600080fd5b61346982614acd565b600080600060c08486031215614fed57600080fd5b8335925060208401359150614f5b8560408601614b49565b600080600080600060a0868803121561501d57600080fd5b61502686614acd565b97602087013597506040870135966060810135965060800135945092505050565b600080600080600080610120878903121561506157600080fd5b8635955060208701359450604087013593506150808860608901614b49565b925060e08701356001600160401b038082111561509c57600080fd5b6150a88a838b01614c0e565b93506101008901359150808211156150bf57600080fd5b506150cc89828a01614c0e565b9150509295509295509295565b600080604083850312156150ec57600080fd5b6150f583614acd565b915061510360208401614ed4565b90509250929050565b600082601f83011261511d57600080fd5b615125614aff565b80608084018581111561513757600080fd5b845b81811015614b8e5761514a81614acd565b845260209384019301615139565b600082601f83011261516957600080fd5b6040516101008082018281106001600160401b038211171561518d5761518d614ae9565b604052830181858211156151a057600080fd5b845b828110156151ba5780358252602091820191016151a2565b509195945050505050565b6000601f83818401126151d757600080fd5b604051606081016001600160401b0382821081831117156151fa576151fa614ae9565b81604052829150606086018781111561521257600080fd5b865b8181101561525c5780358381111561522c5760008081fd5b88018681018a1361523d5760008081fd5b602061524d8b8335838501614b99565b86529094019350602001615214565b5092979650505050505050565b600082601f83011261527a57600080fd5b615282614b27565b80604084018581111561529457600080fd5b845b81811015614b8e5780356001600160401b038111156152b55760008081fd5b6152c188828901614c0e565b85525060209384019301615296565b600080600080600061020086880312156152e957600080fd5b86601f8701126152f857600080fd5b615300614b27565b80604088018981111561531257600080fd5b885b818110156153335761532581614ed4565b845260209384019301615314565b508197506153418a8261510c565b96505050506153538760c08801615158565b92506101c08601356001600160401b038082111561537057600080fd5b61537c89838a016151c5565b93506101e088013591508082111561539357600080fd5b506153a088828901615269565b9150509295509295909350565b600080600080608085870312156153c357600080fd5b6153cc85614acd565b93506153da60208601614acd565b92506040850135915060608501356001600160401b038111156153fc57600080fd5b61540887828801614c0e565b91505092959194509250565b6000806040838503121561542757600080fd5b8235915061510360208401614acd565b6000806040838503121561544a57600080fd5b61545383614acd565b915061510360208401614acd565b6001600160a01b038481168252606060208084018290528551918401829052600092868201929091906080860190855b818110156154af578551851683529483019491830191600101615491565b5050858103604087015286518082529082019350915080860160005b838110156154e7578151855293820193908201906001016154cb565b509298975050505050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561551d5761551d6154f5565b500390565b600181811c9082168061553657607f821691505b6020821081141561555757634e487b7160e01b600052602260045260246000fd5b50919050565b60008219821115615570576155706154f5565b500190565b60208082526016908201527513dd995c881d1c985b9cd858dd1a5bdb881b1a5b5a5d60521b604082015260600190565b60008160001904831182151516156155bf576155bf6154f5565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052601260045260246000fd5b6000826156e7576156e76156c2565b500490565b6000816156fb576156fb6154f5565b506000190190565b60208082526028908201527f43616e6e6f742074616b65206d6f7265207468616e20313025206f66207365636040820152676f6e64617269657360c01b606082015260800190565b6000815461575881615522565b600182811680156157705760018114615781576157b0565b60ff198416875282870194506157b0565b8560005260208060002060005b858110156157a75781548a82015290840190820161578e565b50505082870194505b5050505092915050565b600083516157cc818460208801614d06565b6124cd8184018561574b565b6000826157e7576157e76156c2565b500690565b600084516157fe818460208901614d06565b61580a8184018661574b565b9050602f60f81b81528351615826816001840160208801614d06565b0160010195945050505050565b60006001600160401b03808316818516808303821115615855576158556154f5565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001600160801b03838116908316818110156158e6576158e66154f5565b039392505050565b60006001600160801b03808316818516808303821115615855576158556154f5565b8060005b60048110156115da578151845260209384019390910190600101615914565b6001600160a01b03878116825260208201879052851660408201526060810184905261012081016159676080830185615910565b82610100830152979650505050505050565b600060208083526000845461598d81615522565b808487015260406001808416600081146159ae57600181146159c2576159f0565b60ff198516898401526060890195506159f0565b896000528660002060005b858110156159e85781548b82018601529083019088016159cd565b8a0184019650505b509398975050505050505050565b6001600160a01b0388811682526020820188905286166040820152606081018590526080810184905260a081018390526101408101615a4060c0830184615910565b98975050505050505050565b6000600019821415615a6057615a606154f5565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611eb790830184614d32565b600060208284031215615ac257600080fd5b815161346981614cd356feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201263082eb313ef68798ab10f972f5416757494cedeccd33b017d049659d2a45664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000006456173656c7900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004454153450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : bools (bool[2]): False,False
Arg [1] : addresses (address[4]): 0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000,0x0000000000000000000000000000000000000000
Arg [2] : uints (uint256[8]): 0,0,0,0,0,100,1,1
Arg [3] : strings (string[3]): Easely,EASE,
Arg [4] : signatures (bytes[2]): System.Byte[],System.Byte[]
-----Encoded View---------------
28 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000300
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [17] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [18] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [20] : 456173656c790000000000000000000000000000000000000000000000000000
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [22] : 4541534500000000000000000000000000000000000000000000000000000000
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
83528:19165:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81454:1254;;;;;;:::i;:::-;;:::i;:::-;;68892:331;;;;;;;;;;-1:-1:-1;68892:331:0;;;;;:::i;:::-;;:::i;:::-;;;3696:14:1;;3689:22;3671:41;;3659:2;3644:18;68892:331:0;;;;;;;;31258:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33938:308::-;;;;;;;;;;-1:-1:-1;33938:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4823:32:1;;;4805:51;;4793:2;4778:18;33938:308:0;4659:203:1;33461:411:0;;;;;;;;;;-1:-1:-1;33461:411:0;;;;;:::i;:::-;;:::i;80674:448::-;;;;;;;;;;-1:-1:-1;80674:448:0;;;;;:::i;:::-;;:::i;62482:30::-;;;;;;;;;;-1:-1:-1;62482:30:0;;;;-1:-1:-1;;;;;62482:30:0;;;31792:115;;;;;;;;;;;;;:::i;:::-;;;5717:25:1;;;5705:2;5690:18;31792:115:0;5571:177:1;94307:1758:0;;;;;;:::i;:::-;;:::i;34997:460::-;;;;;;;;;;-1:-1:-1;34997:460:0;;;;;:::i;:::-;;:::i;89183:479::-;;;;;;;;;;-1:-1:-1;89183:479:0;;;;;:::i;:::-;;:::i;69295:277::-;;;;;;;;;;-1:-1:-1;69295:277:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8330:32:1;;;8312:51;;8394:2;8379:18;;8372:34;;;;8285:18;69295:277:0;8138:274:1;61814:41:0;;;;;;;;;;;;61850:5;61814:41;;35528:185;;;;;;;;;;-1:-1:-1;35528:185:0;;;;;:::i;:::-;;:::i;88284:149::-;;;;;;;;;;-1:-1:-1;88284:149:0;;;;;:::i;:::-;;:::i;90436:274::-;;;;;;;;;;;;;:::i;72979:158::-;;;;;;;;;;-1:-1:-1;72979:158:0;;;;;:::i;:::-;;:::i;73217:193::-;;;;;;;;;;-1:-1:-1;73217:193:0;;;;;:::i;:::-;;:::i;61477:25::-;;;;;;;;;;-1:-1:-1;61477:25:0;;;;-1:-1:-1;;;61477:25:0;;;;;;89933:171;;;;;;;;;;;;;:::i;84515:48::-;;;;;;;;;;;;84558:5;84515:48;;30420:771;;;;;;;;;;-1:-1:-1;30420:771:0;;;;;:::i;:::-;;:::i;84677:28::-;;;;;;;;;;;;;:::i;69631:188::-;;;;;;;;;;-1:-1:-1;69631:188:0;;;;;:::i;:::-;;:::i;62922:32::-;;;;;;;;;;-1:-1:-1;62922:32:0;;;;-1:-1:-1;;;;;62922:32:0;;;63947:28;;;;;;;;;;-1:-1:-1;63947:28:0;;;;-1:-1:-1;;;;;63947:28:0;;;;-1:-1:-1;;;63947:28:0;;;;;-1:-1:-1;;;63947:28:0;;;;;-1:-1:-1;;;63947:28:0;;;;;-1:-1:-1;;;63947:28:0;;;;;;;;;-1:-1:-1;;;;;9147:15:1;;;9129:34;;9199:15;;;9194:2;9179:18;;9172:43;9251:15;;;;9231:18;;;9224:43;;;;9286:10;9332:15;;;9327:2;9312:18;;9305:43;9385:15;;;9379:3;9364:19;;9357:44;9079:3;9064:19;63947:28:0;8843:564:1;30055:303:0;;;;;;;;;;-1:-1:-1;30055:303:0;;;;;:::i;:::-;;:::i;15527:94::-;;;;;;;;;;;;;:::i;97326:353::-;;;;;;;;;;-1:-1:-1;97326:353:0;;;;;:::i;:::-;;:::i;84356:22::-;;;;;;;;;;;;;;;;74081:557;;;;;;;;;;-1:-1:-1;74081:557:0;;;;;:::i;:::-;;:::i;97807:417::-;;;;;;;;;;-1:-1:-1;97807:417:0;;;;;:::i;:::-;;:::i;93030:335::-;;;;;;;;;;-1:-1:-1;93030:335:0;;;;;:::i;:::-;;:::i;98399:1312::-;;;;;;:::i;:::-;;:::i;14876:87::-;;;;;;;;;;-1:-1:-1;14949:6:0;;-1:-1:-1;;;;;14949:6:0;14876:87;;62823:34;;;;;;;;;;-1:-1:-1;62823:34:0;;;;-1:-1:-1;;;;;62823:34:0;;;31427:104;;;;;;;;;;;;;:::i;83657:20::-;;;;;;;;;;-1:-1:-1;83657:20:0;;;;;;;;34318:327;;;;;;;;;;-1:-1:-1;34318:327:0;;;;;:::i;:::-;;:::i;32167:184::-;;;;;;;;;;;;;:::i;83753:20::-;;;;;;;;;;-1:-1:-1;83753:20:0;;;;;;;;;;;72690:168;;;;;;;;;;-1:-1:-1;72690:168:0;;;;;:::i;:::-;;:::i;72157:284::-;;;;;;;;;;-1:-1:-1;72157:284:0;;;;;:::i;:::-;;:::i;85425:275::-;;;;;;;;;;-1:-1:-1;85425:275:0;;;;;:::i;:::-;;:::i;93498:495::-;;;;;;;;;;-1:-1:-1;93498:495:0;;;;;:::i;:::-;;:::i;61943:48::-;;;;;;;;;;;;61987:4;61943:48;;35952:504;;;;;;;;;;-1:-1:-1;35952:504:0;;;;;:::i;:::-;;:::i;61551:101::-;;;;;;;;;;;;61610:42;61551:101;;80085:487;;;;;;;;;;-1:-1:-1;80085:487:0;;;;;:::i;:::-;;:::i;90878:646::-;;;;;;;;;;-1:-1:-1;90878:646:0;;;;;:::i;:::-;;:::i;73504:483::-;;;;;;;;;;-1:-1:-1;73504:483:0;;;;;:::i;:::-;;:::i;87859:172::-;;;;;;;;;;-1:-1:-1;87859:172:0;;;;;:::i;:::-;;:::i;62695:33::-;;;;;;;;;;-1:-1:-1;62695:33:0;;;;-1:-1:-1;;;;;62695:33:0;;;84430:21;;;;;;;;;;;;;;;;84167:24;;;;;;;;;;;;;;;;84252:29;;;;;;;;;;;;;;;;70703:1171;;;;;;;;;;-1:-1:-1;70703:1171:0;;;;;:::i;:::-;;:::i;34716:214::-;;;;;;;;;;-1:-1:-1;34716:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;34887:25:0;;;34858:4;34887:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34716:214;32444:119;;;;;;;;;;-1:-1:-1;32444:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;32527:15:0;32500:7;32527:15;;;:9;:15;;;;;:28;-1:-1:-1;;;32527:28:0;;-1:-1:-1;;;;;32527:28:0;;32444:119;71963:135;;;;;;;;;;-1:-1:-1;71963:135:0;;;;;:::i;:::-;;:::i;15776:229::-;;;;;;;;;;-1:-1:-1;15776:229:0;;;;;:::i;:::-;;:::i;70002:167::-;;;;;;;;;;-1:-1:-1;70002:167:0;;;;;:::i;:::-;-1:-1:-1;;;;;70128:33:0;70096:7;70128:33;;;:23;:33;;;;;;;70002:167;81454:1254;81726:20;81749:34;81763:19;81749:13;:34::i;:::-;-1:-1:-1;;;;;81818:31:0;;;;;;:23;:31;;;;;;81726:57;;-1:-1:-1;81818:42:0;;81796:119;;;;-1:-1:-1;;;81796:119:0;;17315:2:1;81796:119:0;;;17297:21:1;17354:2;17334:18;;;17327:30;17393:29;17373:18;;;17366:57;17440:18;;81796:119:0;;;;;;;;;81947:12;81934:9;:25;;81926:59;;;;-1:-1:-1;;;81926:59:0;;17671:2:1;81926:59:0;;;17653:21:1;17710:2;17690:18;;;17683:30;-1:-1:-1;;;17729:18:1;;;17722:51;17790:18;;81926:59:0;17469:345:1;81926:59:0;81998:12;82013:149;82047:6;82068:7;82090:5;82110:7;82132:19;82013;:149::i;:::-;81998:164;;82173:63;82197:4;82203:6;82211:9;82222:13;82173:23;:63::i;:::-;82247:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;82247:39:0;82282:4;82247:39;;;82340:7;82326:12;13806:10;;13726:98;82326:12;-1:-1:-1;;;;;82304:64:0;82318:6;-1:-1:-1;;;;;82304:64:0;;82349:12;82363:4;82304:64;;;;;;17993:25:1;;;18049:2;18034:18;;18027:34;17981:2;17966:18;;17819:248;82304:64:0;;;;;;;;82379:48;82393:6;13806:10;82415:7;82379:48;;;;;;;;;;;;:13;:48::i;:::-;14949:6;;-1:-1:-1;;;;;82444:17:0;;;14949:6;;82444:17;82440:194;;61610:42;82478:51;82555:12;82583:6;82591:17;:15;:17::i;:::-;82610:11;:9;:11::i;:::-;82478:144;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82440:194;13806:10;82652:12;-1:-1:-1;;;;;82644:30:0;:56;82675:24;82687:12;82675:9;:24;:::i;:::-;82644:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81715:993;;81454:1254;;;;;;;:::o;68892:331::-;69022:4;-1:-1:-1;;;;;;69064:40:0;;-1:-1:-1;;;69064:40:0;;:98;;-1:-1:-1;;;;;;;69121:41:0;;-1:-1:-1;;;69121:41:0;69064:98;:151;;;;69179:36;69203:11;69179:23;:36::i;:::-;69044:171;68892:331;-1:-1:-1;;68892:331:0:o;31258:100::-;31312:13;31345:5;31338:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31258:100;:::o;33938:308::-;34059:7;34106:16;34114:7;34106;:16::i;:::-;34084:110;;;;-1:-1:-1;;;34084:110:0;;20204:2:1;34084:110:0;;;20186:21:1;20243:2;20223:18;;;20216:30;20282:34;20262:18;;;20255:62;-1:-1:-1;;;20333:18:1;;;20326:42;20385:19;;34084:110:0;20002:408:1;34084:110:0;-1:-1:-1;34214:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34214:24:0;;33938:308::o;33461:411::-;33542:13;33558:16;33566:7;33558;:16::i;:::-;33542:32;;33599:5;-1:-1:-1;;;;;33593:11:0;:2;-1:-1:-1;;;;;33593:11:0;;;33585:57;;;;-1:-1:-1;;;33585:57:0;;20617:2:1;33585:57:0;;;20599:21:1;20656:2;20636:18;;;20629:30;20695:34;20675:18;;;20668:62;-1:-1:-1;;;20746:18:1;;;20739:31;20787:19;;33585:57:0;20415:397:1;33585:57:0;13806:10;-1:-1:-1;;;;;33677:21:0;;;;:62;;-1:-1:-1;33702:37:0;33719:5;13806:10;34716:214;:::i;33702:37::-;33655:168;;;;-1:-1:-1;;;33655:168:0;;21019:2:1;33655:168:0;;;21001:21:1;21058:2;21038:18;;;21031:30;21097:34;21077:18;;;21070:62;21168:26;21148:18;;;21141:54;21212:19;;33655:168:0;20817:420:1;33655:168:0;33836:28;33845:2;33849:7;33858:5;33836:8;:28::i;:::-;33531:341;33461:411;;:::o;80674:448::-;80845:12;80860:155;13806:10;80921:7;80943:5;80963:7;80985:19;80860;:155::i;:::-;81026:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;81026:39:0;81061:4;81026:39;;;80845:170;-1:-1:-1;81095:12:0;13806:10;;13726:98;81095:12;-1:-1:-1;;;;;81081:33:0;;81109:4;81081:33;;;;5717:25:1;;5705:2;5690:18;;5571:177;81081:33:0;;;;;;;;80834:288;80674:448;;;;:::o;31792:115::-;31844:7;31887:12;;31871:13;:11;:13::i;:::-;:28;;;;:::i;:::-;31864:35;;31792:115;:::o;94307:1758::-;94642:9;;94629;94613:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;94591:111;;;;-1:-1:-1;;;94591:111:0;;21577:2:1;94591:111:0;;;21559:21:1;21616:2;21596:18;;;21589:30;-1:-1:-1;;;21635:18:1;;;21628:53;21698:18;;94591:111:0;21375:347:1;94591:111:0;94734:6;94721:9;:19;;:36;;;;;94756:1;94744:9;:13;94721:36;94713:66;;;;-1:-1:-1;;;94713:66:0;;21929:2:1;94713:66:0;;;21911:21:1;21968:2;21948:18;;;21941:30;-1:-1:-1;;;21987:18:1;;;21980:47;22044:18;;94713:66:0;21727:341:1;94713:66:0;94811:14;;94798:9;:27;;94790:62;;;;-1:-1:-1;;;94790:62:0;;;;;;;:::i;:::-;94896:23;:32;94920:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;94920:7;-1:-1:-1;;;;;94896:32:0;-1:-1:-1;;;;;94896:32:0;;;;;;;;;;;;;94885:7;:43;94863:125;;;;-1:-1:-1;;;94863:125:0;;22626:2:1;94863:125:0;;;22608:21:1;;;22645:18;;;22638:30;22704:34;22684:18;;;22677:62;22756:18;;94863:125:0;22424:356:1;94863:125:0;-1:-1:-1;;;;;95007:30:0;;13806:10;95007:30;94999:57;;;;-1:-1:-1;;;94999:57:0;;22987:2:1;94999:57:0;;;22969:21:1;23026:2;23006:18;;;22999:30;-1:-1:-1;;;23045:18:1;;;23038:44;23099:18;;94999:57:0;22785:338:1;94999:57:0;95076:32;13806:10;95095:12;17197:20;17245:8;;;16874:387;95076:32;95075:33;95067:71;;;;-1:-1:-1;;;95067:71:0;;23330:2:1;95067:71:0;;;23312:21:1;23369:2;23349:18;;;23342:30;-1:-1:-1;;;23388:18:1;;;23381:55;23453:18;;95067:71:0;23128:349:1;95067:71:0;95151:18;95172:17;95180:9;95172:5;:17;:::i;:::-;95151:38;;95221:10;95208:9;:23;;95200:55;;;;-1:-1:-1;;;95200:55:0;;23857:2:1;95200:55:0;;;23839:21:1;23896:2;23876:18;;;23869:30;-1:-1:-1;;;23915:18:1;;;23908:49;23974:18;;95200:55:0;23655:343:1;95200:55:0;95268:12;95283:147;95322:14;95351:7;95373:5;95393;95413:6;95283:24;:147::i;:::-;95450:32;;;;:26;:32;;;;;;95268:162;;-1:-1:-1;95450:32:0;;95449:33;95441:66;;;;-1:-1:-1;;;95441:66:0;;24205:2:1;95441:66:0;;;24187:21:1;24244:2;24224:18;;;24217:30;-1:-1:-1;;;24263:18:1;;;24256:50;24323:18;;95441:66:0;24003:344:1;95441:66:0;14949:6;;-1:-1:-1;;;;;14949:6:0;95522:23;:4;95535:9;95522:12;:23::i;:::-;-1:-1:-1;;;;;95522:34:0;;95518:316;;95600:23;;;;;;;95599:24;:80;;;;-1:-1:-1;95648:17:0;;-1:-1:-1;;;;;95648:17:0;:31;;95599:80;:153;;;;-1:-1:-1;95735:17:0;;-1:-1:-1;;;;;95735:17:0;95704:27;:4;95717:13;95704:12;:27::i;:::-;-1:-1:-1;;;;;95704:48:0;;95599:153;95573:249;;;;-1:-1:-1;;;95573:249:0;;24554:2:1;95573:249:0;;;24536:21:1;24593:2;24573:18;;;24566:30;24632:34;24612:18;;;24605:62;-1:-1:-1;;;24683:18:1;;;24676:32;24725:19;;95573:249:0;24352:398:1;95573:249:0;95844:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;95844:39:0;95879:4;95844:39;;;95896:36;95908:12;13806:10;;13726:98;95908:12;95922:9;95896:11;:36::i;:::-;95948:44;;;24957:25:1;;;25013:2;24998:18;;24991:34;;;25041:18;;;25034:34;;;95948:44:0;;13806:10;;95948:44;;;;;;24945:2:1;95948:44:0;;;13806:10;96003:54;96034:22;96046:10;96034:9;:22;:::i;:::-;96003:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94580:1485;;94307:1758;;;;;;;;:::o;34997:460::-;35131:13;35147:16;35155:7;35147;:16::i;:::-;35131:32;-1:-1:-1;35196:48:0;13806:10;35215:12;35229:7;35238:5;35196:18;:48::i;:::-;35174:147;;;;-1:-1:-1;;;35174:147:0;;;;;;;:::i;:::-;35349:4;-1:-1:-1;;;;;35340:13:0;:5;-1:-1:-1;;;;;35340:13:0;;35332:67;;;;-1:-1:-1;;;35332:67:0;;;;;;;:::i;:::-;35410:39;35431:4;35437:2;35441:7;35410:20;:39::i;:::-;35120:337;34997:460;;;:::o;89183:479::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;89328:8:::1;::::0;::::1;::::0;::::1;;;89327:9;89319:51;;;::::0;-1:-1:-1;;;89319:51:0;;26470:2:1;89319:51:0::1;::::0;::::1;26452:21:1::0;26509:2;26489:18;;;26482:30;26548:31;26528:18;;;26521:59;26597:18;;89319:51:0::1;26268:353:1::0;89319:51:0::1;89385:12;:27;;;;-1:-1:-1::0;89401:6:0::1;::::0;:11;89385:27:::1;89381:95;;;89438:22;89458:1;89446:9;;:13;;;;:::i;:::-;89438:7;:22::i;:::-;:26;::::0;89463:1:::1;89438:26;:::i;:::-;89429:6;:35:::0;89381:95:::1;89486:37;:14;89503:20:::0;;89486:37:::1;:::i;:::-;-1:-1:-1::0;89534:18:0::1;:25:::0;;-1:-1:-1;;89534:25:0::1;89555:4;89534:25;::::0;;89587:15:::1;::::0;89572:12:::1;:30:::0;89618:36:::1;::::0;::::1;::::0;::::1;::::0;89633:20;;;;89618:36:::1;:::i;:::-;;;;;;;;89183:479:::0;;;:::o;69295:277::-;69493:6;:22;69404:16;;;;;;61850:5;;69480:35;;-1:-1:-1;;;;;69493:22:0;69480:10;:35;:::i;:::-;69479:49;;;;:::i;:::-;69461:67;;69547:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;69547:7;69539:25;-1:-1:-1;69556:7:0;-1:-1:-1;69295:277:0;;;;;;:::o;35528:185::-;35666:39;35683:4;35689:2;35693:7;35666:39;;;;;;;;;;;;:16;:39::i;88284:149::-;88343:8;;;;88335:65;;;;-1:-1:-1;;;88335:65:0;;27480:2:1;88335:65:0;;;27462:21:1;27519:2;27499:18;;;27492:30;27558:34;27538:18;;;27531:62;-1:-1:-1;;;27609:18:1;;;27602:42;27661:19;;88335:65:0;27278:408:1;88335:65:0;88411:14;88417:7;88411:5;:14::i;:::-;88284:149;:::o;90436:274::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;90501:18:::1;::::0;::::1;;90493:65;;;::::0;-1:-1:-1;;;90493:65:0;;27893:2:1;90493:65:0::1;::::0;::::1;27875:21:1::0;27932:2;27912:18;;;27905:30;27971:34;27951:18;;;27944:62;-1:-1:-1;;;28022:18:1;;;28015:32;28064:19;;90493:65:0::1;27691:398:1::0;90493:65:0::1;90643:12;::::0;90631:9:::1;:24:::0;;;90671:31:::1;::::0;5717:25:1;;;90671:31:0::1;::::0;5705:2:1;5690:18;90671:31:0::1;;;;;;;90436:274::o:0;72979:158::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;73054:13:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;73054:30:0::1;-1:-1:-1::0;;;;73054:30:0;;::::1;;::::0;;73100:29:::1;::::0;::::1;::::0;::::1;::::0;73070:14;3696::1;3689:22;3671:41;;3659:2;3644:18;;3531:187;73100:29:0::1;;;;;;;;72979:158:::0;:::o;73217:193::-;73283:7;73311:16;73319:7;73311;:16::i;:::-;73303:54;;;;-1:-1:-1;;;73303:54:0;;28296:2:1;73303:54:0;;;28278:21:1;28335:2;28315:18;;;28308:30;28374:27;28354:18;;;28347:55;28419:18;;73303:54:0;28094:349:1;73303:54:0;-1:-1:-1;73375:27:0;;;;:18;:27;;;;;;-1:-1:-1;;;;;73375:27:0;;73217:193::o;89933:171::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;89996:8:::1;::::0;::::1;::::0;::::1;;;89995:9;89987:45;;;::::0;-1:-1:-1;;;89987:45:0;;28650:2:1;89987:45:0::1;::::0;::::1;28632:21:1::0;28689:2;28669:18;;;28662:30;28728:25;28708:18;;;28701:53;28771:18;;89987:45:0::1;28448:347:1::0;89987:45:0::1;90043:8;:15:::0;;-1:-1:-1;;90043:15:0::1;;;::::0;;90074:22:::1;::::0;::::1;::::0;90043:15;;90074:22:::1;89933:171::o:0;30420:771::-;30537:7;30570:16;30578:7;30570;:16::i;:::-;30562:70;;;;-1:-1:-1;;;30562:70:0;;29002:2:1;30562:70:0;;;28984:21:1;29041:2;29021:18;;;29014:30;29080:34;29060:18;;;29053:62;-1:-1:-1;;;29131:18:1;;;29124:39;29180:19;;30562:70:0;28800:405:1;30562:70:0;30677:1;30649:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30649:16:0;:30;30645:86;;-1:-1:-1;30703:16:0;;;;:7;:16;;;;;;-1:-1:-1;;;;;30703:16:0;;30420:771::o;30645:86::-;30757:15;;30747:7;:25;30743:411;;;30789:26;28515:1;30834:7;:25;30830:115;;30901:24;28515:1;30901:7;:24;:::i;:::-;:28;;30928:1;30901:28;:::i;:::-;30880:49;;30830:115;30964:9;30976:11;30986:1;30976:7;:11;:::i;:::-;30964:23;;30959:184;30994:18;30989:1;:23;30959:184;;31064:1;31042:10;;;:7;:10;;;;;;-1:-1:-1;;;;;31042:10:0;:24;31038:90;;31098:10;;;;:7;:10;;;;;;-1:-1:-1;;;;;31098:10:0;;30420:771;-1:-1:-1;;;30420:771:0:o;31038:90::-;31014:3;;;;:::i;:::-;;;;30959:184;;;;30774:380;30743:411;-1:-1:-1;31181:1:0;;30420:771;-1:-1:-1;30420:771:0:o;84677:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69631:188::-;69745:7;69777:34;69791:19;69777:13;:34::i;30055:303::-;30172:7;-1:-1:-1;;;;;30219:19:0;;30197:111;;;;-1:-1:-1;;;30197:111:0;;29553:2:1;30197:111:0;;;29535:21:1;29592:2;29572:18;;;29565:30;29631:34;29611:18;;;29604:62;-1:-1:-1;;;29682:18:1;;;29675:40;29732:19;;30197:111:0;29351:406:1;30197:111:0;-1:-1:-1;;;;;;30326:16:0;;;;;:9;:16;;;;;:24;-1:-1:-1;;;;;30326:24:0;;30055:303::o;15527:94::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;15592:21:::1;15610:1;15592:9;:21::i;:::-;15527:94::o:0;97326:353::-;97482:7;97502:31;13806:10;97502:17;:31::i;:::-;97562:14;;97552:6;:24;;97544:59;;;;-1:-1:-1;;;97544:59:0;;;;;;;:::i;:::-;97621:50;97634:7;97643:6;97651:19;97621:12;:50::i;:::-;97614:57;97326:353;-1:-1:-1;;;;97326:353:0:o;74081:557::-;74140:23;74166:16;74174:7;74166;:16::i;:::-;74193:17;74256:27;;;:18;:27;;;;;;74140:42;;-1:-1:-1;74213:10:0;;-1:-1:-1;;;;;74256:27:0;:40;;74234:120;;;;-1:-1:-1;;;74234:120:0;;29964:2:1;74234:120:0;;;29946:21:1;30003:2;29983:18;;;29976:30;30042:32;30022:18;;;30015:60;30092:18;;74234:120:0;29762:354:1;74234:120:0;74432:27;;;;:18;:27;;;;;;;;74425:34;;-1:-1:-1;;;;;;74425:34:0;;;74508:54;;;;;;;;;;;;74522:15;;74539:9;;74451:7;;74508:13;:54::i;:::-;74622:7;74611:9;-1:-1:-1;;;;;74580:50:0;74594:15;-1:-1:-1;;;;;74580:50:0;;;;;;;;;;;74129:509;;74081:557;:::o;97807:417::-;97953:31;13806:10;97502:17;:31::i;97953:::-;97995:12;98010:107;98044:7;98066:6;98087:19;98010;:107::i;:::-;98128:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;98128:39:0;98163:4;98128:39;;;97995:122;-1:-1:-1;98197:12:0;13806:10;;13726:98;98197:12;-1:-1:-1;;;;;98183:33:0;;98211:4;98183:33;;;;5717:25:1;;5705:2;5690:18;;5571:177;98183:33:0;;;;;;;;97942:282;97807:417;;;:::o;93030:335::-;93224:7;93244:31;13806:10;97502:17;:31::i;93244:::-;93293:64;93311:14;93327:7;93336:5;93343;93350:6;93293:17;:64::i;:::-;93286:71;93030:335;-1:-1:-1;;;;;;93030:335:0:o;98399:1312::-;98696:9;;98683;98667:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;98645:111;;;;-1:-1:-1;;;98645:111:0;;21577:2:1;98645:111:0;;;21559:21:1;21616:2;21596:18;;;21589:30;-1:-1:-1;;;21635:18:1;;;21628:53;21698:18;;98645:111:0;21375:347:1;98645:111:0;98775:14;98767:44;;;;-1:-1:-1;;;98767:44:0;;21929:2:1;98767:44:0;;;21911:21:1;21968:2;21948:18;;;21941:30;-1:-1:-1;;;21987:18:1;;;21980:47;22044:18;;98767:44:0;21727:341:1;98767:44:0;98843:6;98830:9;:19;:34;;;-1:-1:-1;98853:11:0;;98830:34;98822:68;;;;-1:-1:-1;;;98822:68:0;;30323:2:1;98822:68:0;;;30305:21:1;30362:2;30342:18;;;30335:30;-1:-1:-1;;;30381:18:1;;;30374:51;30442:18;;98822:68:0;30121:345:1;98822:68:0;98922:14;;98909:9;:27;;98901:62;;;;-1:-1:-1;;;98901:62:0;;;;;;;:::i;:::-;98993:23;:32;99017:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;99017:7;-1:-1:-1;;;;;98993:32:0;-1:-1:-1;;;;;98993:32:0;;;;;;;;;;;;;98982:7;:43;98974:71;;;;-1:-1:-1;;;98974:71:0;;30673:2:1;98974:71:0;;;30655:21:1;30712:2;30692:18;;;30685:30;-1:-1:-1;;;30731:18:1;;;30724:45;30786:18;;98974:71:0;30471:339:1;98974:71:0;99065:32;13806:10;99084:12;13726:98;99065:32;99064:33;99056:71;;;;-1:-1:-1;;;99056:71:0;;23330:2:1;99056:71:0;;;23312:21:1;23369:2;23349:18;;;23342:30;-1:-1:-1;;;23388:18:1;;;23381:55;23453:18;;99056:71:0;23128:349:1;99056:71:0;99140:17;99160:34;99174:19;99160:13;:34::i;:::-;99140:54;-1:-1:-1;99205:18:0;99226:21;99140:54;99226:9;:21;:::i;:::-;99205:42;;99279:10;99266:9;:23;;99258:55;;;;-1:-1:-1;;;99258:55:0;;23857:2:1;99258:55:0;;;23839:21:1;23896:2;23876:18;;;23869:30;-1:-1:-1;;;23915:18:1;;;23908:49;23974:18;;99258:55:0;23655:343:1;99258:55:0;99326:12;99341:107;99375:7;99397:6;99418:19;99341;:107::i;:::-;99326:122;;99459:64;99483:4;99489:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;99489:7;99498:9;99509:13;99459:23;:64::i;:::-;99536:36;13806:10;99562:9;99536:11;:36::i;:::-;99588:48;;;24957:25:1;;;25013:2;24998:18;;24991:34;;;25041:18;;;25034:34;;;99588:48:0;;13806:10;;99588:48;;;;;;24945:2:1;99588:48:0;;;13806:10;99657:12;13726:98;31427:104;31483:13;31516:7;31509:14;;;;;:::i;34318:327::-;-1:-1:-1;;;;;34453:24:0;;13806:10;34453:24;;34445:62;;;;-1:-1:-1;;;34445:62:0;;31017:2:1;34445:62:0;;;30999:21:1;31056:2;31036:18;;;31029:30;31095:27;31075:18;;;31068:55;31140:18;;34445:62:0;30815:349:1;34445:62:0;13806:10;34520:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34520:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34520:53:0;;;;;;;;;;34589:48;;3671:41:1;;;34520:42:0;;13806:10;34589:48;;3644:18:1;34589:48:0;;;;;;;34318:327;;:::o;32167:184::-;32243:18;;32219:7;;32243:18;;32239:70;;;-1:-1:-1;32285:12:0;;;32167:184::o;32239:70::-;-1:-1:-1;32328:15:0;;;32167:184::o;72690:168::-;13806:10;72750:37;;;;:23;:37;;;;;;;;;:47;;;72813:37;;5717:25:1;;;72813:37:0;;5690:18:1;72813:37:0;;;;;;;72690:168;:::o;72157:284::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;61987:4:::1;72250:6;:27;;72228:117;;;;-1:-1:-1::0;;;72228:117:0::1;;;;;;;:::i;:::-;72356:6;:39:::0;;-1:-1:-1;;72356:39:0::1;-1:-1:-1::0;;;;;72356:39:0;::::1;;::::0;;72411:22:::1;::::0;5717:25:1;;;72411:22:0::1;::::0;5705:2:1;5690:18;72411:22:0::1;5571:177:1::0;85425:275:0;85641:51;85647:5;85654:9;85665:5;85672:7;85681:10;85641:5;:51::i;:::-;85425:275;;;;;:::o;93498:495::-;93682:31;13806:10;97502:17;:31::i;93682:::-;93724:12;93739:147;93778:14;93807:7;93829:5;93849;93869:6;93739:24;:147::i;:::-;93897:32;;;;:26;:32;;;;;:39;;-1:-1:-1;;93897:39:0;93932:4;93897:39;;;93724:162;-1:-1:-1;93966:12:0;13806:10;;13726:98;93966:12;-1:-1:-1;;;;;93952:33:0;;93980:4;93952:33;;;;5717:25:1;;5705:2;5690:18;;5571:177;93952:33:0;;;;;;;;93671:322;93498:495;;;;;:::o;35952:504::-;36119:13;36135:16;36143:7;36135;:16::i;:::-;36119:32;-1:-1:-1;36184:48:0;13806:10;36217:7;36226:5;36184:18;:48::i;:::-;36162:147;;;;-1:-1:-1;;;36162:147:0;;;;;;;:::i;:::-;36337:4;-1:-1:-1;;;;;36328:13:0;:5;-1:-1:-1;;;;;36328:13:0;;36320:67;;;;-1:-1:-1;;;36320:67:0;;;;;;;:::i;:::-;36398:50;36423:4;36429:2;36433:7;36442:5;36398:24;:50::i;80085:487::-;80270:7;80314:16;80322:7;80314;:16::i;:::-;-1:-1:-1;;;;;80298:32:0;13806:10;-1:-1:-1;;;;;80298:32:0;;80290:71;;;;-1:-1:-1;;;80290:71:0;;31780:2:1;80290:71:0;;;31762:21:1;31819:2;31799:18;;;31792:30;31858:28;31838:18;;;31831:56;31904:18;;80290:71:0;31578:350:1;80290:71:0;80392:172;13806:10;80454:7;80480:5;80504:7;80530:19;80392:12;:172::i;:::-;80372:192;80085:487;-1:-1:-1;;;;;80085:487:0:o;90878:646::-;91032:18;;90996:13;;91032:18;;91027:111;;87504:16;;;;;;;;;;;;-1:-1:-1;;;87504:16:0;;;;91110:14;91081:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91067:59;;90878:646;;;:::o;91027:111::-;91158:16;91166:7;91158;:16::i;:::-;91150:60;;;;-1:-1:-1;;;91150:60:0;;33194:2:1;91150:60:0;;;33176:21:1;33233:2;33213:18;;;33206:30;33272:33;33252:18;;;33245:61;33323:18;;91150:60:0;32992:355:1;91150:60:0;91223:16;91263:9;;91253:6;;91243:7;:16;;;;:::i;:::-;91242:30;;;;:::i;:::-;91223:49;;91367:10;87504:16;;;;;;;;;;;;-1:-1:-1;;;87504:16:0;;;;;87418:110;91367:10;91400:14;91463:19;:8;:17;:19::i;:::-;91328:173;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;91283:233;;;90878:646;;;:::o;73504:483::-;73622:13;;73593:10;;-1:-1:-1;;;73622:13:0;;;;73614:42;;;;-1:-1:-1;;;73614:42:0;;34358:2:1;73614:42:0;;;34340:21:1;34397:2;34377:18;;;34370:30;-1:-1:-1;;;34416:18:1;;;34409:46;34472:18;;73614:42:0;34156:340:1;73614:42:0;73766:47;73780:9;73791:8;73801:7;73766:47;;;;;;;;;;;;:13;:47::i;:::-;73888:27;;;;:18;:27;;;;;;:39;;-1:-1:-1;;;;;;73888:39:0;-1:-1:-1;;;;;73888:39:0;;;;;;;;;73945:34;;73888:27;;73945:34;;;;73888:39;73945:34;;;73562:425;73504:483;;:::o;87859:172::-;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;87940:23:::1;:34:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;87940:34:0;;::::1;;::::0;;87990:33:::1;::::0;::::1;::::0;::::1;::::0;87966:8;3696:14:1;3689:22;3671:41;;3659:2;3644:18;;3531:187;70703:1171:0;70793:21;70776:14;:38;70772:109;;;-1:-1:-1;70848:21:0;70772:109;70893:19;70915:26;61850:5;70915:14;:26;:::i;:::-;70956:6;:22;70893:48;;-1:-1:-1;;;;70956:22:0;;-1:-1:-1;;;;;70956:22:0;:26;70952:166;;71007:19;;71069:6;:22;-1:-1:-1;;;;;71007:19:0;;;;70999:107;;71055:36;;-1:-1:-1;;;71069:22:0;;-1:-1:-1;;;;;71069:22:0;71055:11;:36;:::i;:::-;70999:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70952:166;71132:6;:18;-1:-1:-1;;;71132:18:0;;;;:22;71128:122;;71179:15;;71219:6;:18;-1:-1:-1;;;;;71179:15:0;;;;71171:67;;71205:32;;-1:-1:-1;;;71219:18:0;;;;71205:11;:32;:::i;:::-;71171:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71128:122;71264:6;:21;-1:-1:-1;;;71264:21:0;;;;:25;71260:163;;71314:18;;71375:6;:21;-1:-1:-1;;;;;71314:18:0;;;;71306:105;;71361:35;;-1:-1:-1;;;71375:21:0;;;;71361:11;:35;:::i;:::-;71306:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71260:163;71503:6;:16;61610:42;;71433:97;;71489:30;;-1:-1:-1;;;71503:16:0;;-1:-1:-1;;;;;71503:16:0;71489:11;:30;:::i;:::-;71433:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71748:6:0;:16;71543:23;;-1:-1:-1;;;;;;;;71748:16:0;;;;;71710:18;-1:-1:-1;;;71710:18:0;;;;;71627:63;;-1:-1:-1;;;71669:21:0;;;;;;-1:-1:-1;;;71627:22:0;;;:63;:::i;:::-;:101;;;;:::i;:::-;:137;;;;:::i;:::-;71599:166;;-1:-1:-1;;;;;71599:166:0;:11;:166;:::i;:::-;71569:196;;:14;:196;:::i;:::-;71543:222;;71784:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;71784:7;-1:-1:-1;;;;;71776:25:0;:42;71802:15;71776:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71834:32:0;;5717:25:1;;;71834:32:0;;5705:2:1;5690:18;71834:32:0;5571:177:1;71963:135:0;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;72029:17:::1;:23:::0;;-1:-1:-1;;;;;;72029:23:0::1;-1:-1:-1::0;;;;;72029:23:0;::::1;::::0;;::::1;::::0;;;72068:22:::1;::::0;4805:51:1;;;72068:22:0::1;::::0;4793:2:1;4778:18;72068:22:0::1;4659:203:1::0;15776:229:0;14949:6;;-1:-1:-1;;;;;14949:6:0;13806:10;15096:23;15088:68;;;;-1:-1:-1;;;15088:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15879:22:0;::::1;15857:110;;;::::0;-1:-1:-1;;;15857:110:0;;34944:2:1;15857:110:0::1;::::0;::::1;34926:21:1::0;34983:2;34963:18;;;34956:30;35022:34;35002:18;;;34995:62;-1:-1:-1;;;35073:18:1;;;35066:36;35119:19;;15857:110:0::1;34742:402:1::0;15857:110:0::1;15978:19;15988:8;15978:9;:19::i;57688:346::-:0;57953:58;;35391:66:1;57953:58:0;;;35379:79:1;35474:12;;;35467:28;;;57784:7:0;;35511:12:1;;57953:58:0;;;;;;;;;;;;57925:101;;;;;;57905:121;;57688:346;;;:::o;53721:263::-;53826:7;53852:17;53871:18;53893:27;53904:4;53910:9;53893:10;:27::i;:::-;53851:69;;;;53931:18;53943:5;53931:11;:18::i;:::-;-1:-1:-1;53967:9:0;53721:263;-1:-1:-1;;;53721:263:0:o;77775:1310::-;77936:22;;;77991;;;78052;;;;78111;;;;77887:7;;77936:22;77991;78052;78165:15;78199:29;;;;78191:61;;;;-1:-1:-1;;;78191:61:0;;35868:2:1;78191:61:0;;;35850:21:1;35907:2;35887:18;;;35880:30;-1:-1:-1;;;35926:18:1;;;35919:49;35985:18;;78191:61:0;35666:343:1;78191:61:0;78305:15;78285:17;:35;78263:109;;;;-1:-1:-1;;;78263:109:0;;36216:2:1;78263:109:0;;;36198:21:1;36255:2;36235:18;;;36228:30;36294:26;36274:18;;;36267:54;36338:18;;78263:109:0;36014:348:1;78263:109:0;78408:11;78391:13;:28;;78383:70;;;;-1:-1:-1;;;78383:70:0;;36569:2:1;78383:70:0;;;36551:21:1;36608:2;36588:18;;;36581:30;36647:31;36627:18;;;36620:59;36696:18;;78383:70:0;36367:353:1;78383:70:0;78487:11;78470:13;:28;:58;;;;78513:15;78502:8;:26;78470:58;78466:109;;;-1:-1:-1;78552:11:0;;77775:1310;-1:-1:-1;;;;;77775:1310:0:o;78466:109::-;78587:12;78602:27;78618:11;78602:13;:27;:::i;:::-;78587:42;-1:-1:-1;78640:18:0;61705:3;78662:28;78673:17;78662:8;:28;:::i;:::-;78661:64;;;;:::i;:::-;78640:85;-1:-1:-1;78740:15:0;78736:68;;-1:-1:-1;78779:13:0;;77775:1310;-1:-1:-1;;;;;;;77775:1310:0:o;78736:68::-;78907:23;61705:3;78934:35;78952:17;78934:15;:35;:::i;:::-;78933:71;;;;:::i;:::-;78907:97;-1:-1:-1;79067:10:0;79041:22;78907:97;79041:4;:22;:::i;:::-;79040:37;;;;:::i;:::-;79024:53;;:13;:53;:::i;:::-;79017:60;77775:1310;-1:-1:-1;;;;;;;;;;77775:1310:0:o;76973:506::-;77180:7;77220:251;77267:189;77302:5;77330:7;77360:5;77388:7;77418:19;77267:12;:189::i;:::-;77220:28;:251::i;79264:565::-;79456:32;;;;:26;:32;;;;;;;;79455:33;79447:67;;;;-1:-1:-1;;;79447:67:0;;36927:2:1;79447:67:0;;;36909:21:1;36966:2;36946:18;;;36939:30;-1:-1:-1;;;36985:18:1;;;36978:51;37046:18;;79447:67:0;36725:345:1;79447:67:0;-1:-1:-1;;;;;79547:33:0;;:23;:4;79560:9;79547:12;:23::i;:::-;-1:-1:-1;;;;;79547:33:0;;79525:110;;;;-1:-1:-1;;;79525:110:0;;37277:2:1;79525:110:0;;;37259:21:1;37316:2;37296:18;;;37289:30;37355:29;37335:18;;;37328:57;37402:18;;79525:110:0;37075:351:1;79525:110:0;79668:17;;-1:-1:-1;;;;;79668:17:0;:31;;:100;;-1:-1:-1;79751:17:0;;-1:-1:-1;;;;;79751:17:0;79720:27;:4;79733:13;79720:12;:27::i;:::-;-1:-1:-1;;;;;79720:48:0;;79668:100;79646:175;;;;-1:-1:-1;;;79646:175:0;;37633:2:1;79646:175:0;;;37615:21:1;37672:2;37652:18;;;37645:30;37711:27;37691:18;;;37684:55;37756:18;;79646:175:0;37431:349:1;37338:352:0;37495:28;37505:4;37511:2;37515:7;37495:9;:28::i;:::-;37556:48;37579:4;37585:2;37589:7;37598:5;37556:22;:48::i;:::-;37534:148;;;;-1:-1:-1;;;37534:148:0;;;;;;;:::i;74729:207::-;74842:16;;;74856:1;74842:16;;;;;;;;;74779;;74808:31;;74842:16;;;;;;;;;;-1:-1:-1;;14949:6:0;;74808:50;;-1:-1:-1;;;;;;;14949:6:0;74869:14;74884:1;74869:17;;;;;;;;:::i;:::-;-1:-1:-1;;;;;74869:27:0;;;:17;;;;;;;;;;;:27;74914:14;74729:207;-1:-1:-1;74729:207:0:o;75023:198::-;75124:16;;;75138:1;75124:16;;;;;;;;;75067;;75096:25;;75124:16;;;;;;;;;;-1:-1:-1;;75165:6:0;:22;75151:11;;;;-1:-1:-1;;;;;;75165:22:0;;75151:11;;-1:-1:-1;75165:22:0;;75151:11;;;;:::i;:::-;;;;;;;;;;:36;75205:8;75023:198;-1:-1:-1;75023:198:0:o;29636:355::-;29783:4;-1:-1:-1;;;;;;29825:40:0;;-1:-1:-1;;;29825:40:0;;:105;;-1:-1:-1;;;;;;;29882:48:0;;-1:-1:-1;;;29882:48:0;29825:105;:158;;;-1:-1:-1;;;;;;;;;;6786:40:0;;;29947:36;6627:207;38882:281;38947:4;38968:16;;;:7;:16;;;;;;;;38964:61;;;-1:-1:-1;39008:5:0;;38882:281;-1:-1:-1;38882:281:0:o;38964:61::-;39051:15;;39041:7;:25;39037:69;;;-1:-1:-1;39090:4:0;;38882:281;-1:-1:-1;38882:281:0:o;39037:69::-;-1:-1:-1;39153:1:0;39125:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39125:16:0;:30;;;38882:281::o;46929:271::-;47057:24;;;;:15;:24;;;;;;-1:-1:-1;;;;;47057:30:0;;;:24;;:30;47053:140;;47104:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;47104:29:0;-1:-1:-1;;;;;47104:29:0;;;;;;;;;47153:28;;47104:24;;47153:28;;;;;;;46929:271;;;:::o;92481:370::-;92677:7;92717:126;92764:64;92782:14;92798:5;92805:7;92814:5;92821:6;92764:17;:64::i;102276:414::-;102370:7;;:12;;:65;;-1:-1:-1;102428:7:0;;-1:-1:-1;;;;;102386:16:0;;;;;;:9;:16;;;;;:29;:38;;102418:6;;-1:-1:-1;;;102386:29:0;;-1:-1:-1;;;;;102386:29:0;:38;:::i;:::-;:49;;102370:65;102348:138;;;;-1:-1:-1;;;102348:138:0;;38406:2:1;102348:138:0;;;38388:21:1;38445:2;38425:18;;;38418:30;38484:25;38464:18;;;38457:53;38527:18;;102348:138:0;38204:347:1;102348:138:0;102501:18;;;;102497:186;;;102536:31;102553:5;102560:6;102536:16;:31::i;:::-;102598:6;102582:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;102497:186:0;;-1:-1:-1;102497:186:0;;102637:34;102657:5;102664:6;102637:19;:34::i;:::-;102276:414;;:::o;39518:406::-;39659:4;39698:16;39706:7;39698;:16::i;:::-;39676:110;;;;-1:-1:-1;;;39676:110:0;;38758:2:1;39676:110:0;;;38740:21:1;38797:2;38777:18;;;38770:30;38836:34;38816:18;;;38809:62;-1:-1:-1;;;38887:18:1;;;38880:42;38939:19;;39676:110:0;38556:408:1;39676:110:0;39815:5;-1:-1:-1;;;;;39805:15:0;:6;-1:-1:-1;;;;;39805:15:0;;:62;;;;39861:6;-1:-1:-1;;;;;39837:30:0;:20;39849:7;39837:11;:20::i;:::-;-1:-1:-1;;;;;39837:30:0;;39805:62;:110;;;-1:-1:-1;;;;;;34887:25:0;;;34858:4;34887:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;39884:31;34716:214;46079:732;-1:-1:-1;;;;;46222:16:0;;46214:65;;;;-1:-1:-1;;;46214:65:0;;39171:2:1;46214:65:0;;;39153:21:1;39210:2;39190:18;;;39183:30;39249:34;39229:18;;;39222:62;-1:-1:-1;;;39300:18:1;;;39293:34;39344:19;;46214:65:0;38969:400:1;46214:65:0;46290:39;46311:4;46317:2;46321:7;46290:20;:39::i;:::-;46394:35;46411:1;46415:7;46424:4;46394:8;:35::i;:::-;-1:-1:-1;;;;;46442:15:0;;;;;;:9;:15;;;;;:28;;46469:1;;46442:15;:28;;46469:1;;-1:-1:-1;;;;;46442:28:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;46442:28:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;46481:13:0;;-1:-1:-1;46481:13:0;;;:9;:13;;;;;:26;;-1:-1:-1;;;46481:13:0;;:26;;-1:-1:-1;;46481:26:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;46481:26:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;46518:16:0;;;:7;:16;;;;;:21;;-1:-1:-1;;;;;;46518:21:0;-1:-1:-1;;;;;46518:21:0;;;;;46574:11;46518:16;-1:-1:-1;46574:11:0;:::i;:::-;46552:33;;46614:15;;46600:11;:29;46596:163;;;46682:1;46650:20;;;:7;:20;;;;;;-1:-1:-1;;;;;46650:20:0;46646:102;;46705:20;;;;:7;:20;;;;;:27;;-1:-1:-1;;;;;;46705:27:0;-1:-1:-1;;;;;46705:27:0;;;;;46646:102;46795:7;46791:2;-1:-1:-1;;;;;46776:27:0;46785:4;-1:-1:-1;;;;;46776:27:0;-1:-1:-1;;;;;;;;;;;46776:27:0;;;;;;;;;46203:608;46079:732;;;:::o;101622:450::-;101675:7;101699:8;101695:49;;-1:-1:-1;101731:1:0;;101622:450;-1:-1:-1;101622:450:0:o;101695:49::-;101756:12;101854:10;101887:16;101926:15;101974:16;101989:1;101974:12;:16;:::i;:::-;101821:189;;;-1:-1:-1;;;;;40132:32:1;;;101821:189:0;;;40114:51:1;40181:18;;40174:34;;;;40224:18;;;40217:34;101964:27:0;40267:18:1;;;40260:34;40086:19;;101821:189:0;;;-1:-1:-1;;101821:189:0;;;;;;;;;101793:232;;101821:189;101793:232;;;;;-1:-1:-1;102054:10:0;102061:3;101793:232;102054:10;:::i;:::-;102047:17;101622:450;-1:-1:-1;;;101622:450:0:o;44403:537::-;44463:13;44479:16;44487:7;44479;:16::i;:::-;44463:32;-1:-1:-1;44528:48:0;13806:10;44547:12;13726:98;44528:48;44506:130;;;;-1:-1:-1;;;44506:130:0;;40507:2:1;44506:130:0;;;40489:21:1;;;40526:18;;;40519:30;40585:34;40565:18;;;40558:62;40637:18;;44506:130:0;40305:356:1;44506:130:0;44649:48;44670:5;44685:1;44689:7;44649:20;:48::i;:::-;44738:36;44755:1;44759:7;44768:5;44738:8;:36::i;:::-;-1:-1:-1;;;;;44787:16:0;;;;;;:9;:16;;;;;:29;;44815:1;;44787:16;:29;;44815:1;;-1:-1:-1;;;;;44787:29:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;44787:29:0;;;;;-1:-1:-1;;;;;44787:29:0;;;;;;44843:1;44827:12;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;44855:16:0;;;;:7;:16;;;;;;:23;;-1:-1:-1;;44855:23:0;44874:4;44855:23;;;44896:36;44863:7;;44855:16;-1:-1:-1;;;;;44896:36:0;;;-1:-1:-1;;;;;;;;;;;44896:36:0;44855:16;;44896:36;44452:488;44403:537;:::o;16013:173::-;16088:6;;;-1:-1:-1;;;;;16105:17:0;;;-1:-1:-1;;;;;;16105:17:0;;;;;;;16138:40;;16088:6;;;16105:17;16088:6;;16138:40;;16069:16;;16138:40;16058:128;16013:173;:::o;75812:191::-;14949:6;;-1:-1:-1;;;;;75902:17:0;;;14949:6;;75902:17;;:48;;-1:-1:-1;75933:17:0;;-1:-1:-1;;;;;75923:27:0;;;75933:17;;75923:27;75902:48;75880:115;;;;-1:-1:-1;;;75880:115:0;;40868:2:1;75880:115:0;;;40850:21:1;40907:2;40887:18;;;40880:30;-1:-1:-1;;;40926:18:1;;;40919:47;40983:18;;75880:115:0;40666:341:1;96185:474:0;96336:7;96445:4;96473:13;96509:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;96509:7;96539:6;96568:19;96610:7;96404:232;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;96376:275;;;;;;96356:295;;96185:474;;;;;:::o;96850:318::-;97008:7;97048:112;97095:50;97108:7;97117:6;97125:19;97095:12;:50::i;91722:563::-;91911:7;92020:4;92048:13;92084:7;14949:6;;-1:-1:-1;;;;;14949:6:0;;14876:87;92084:7;91979:283;;;-1:-1:-1;;;;;42402:15:1;;;91979:283:0;;;42384:34:1;42434:18;;;42427:34;;;;42497:15;;42477:18;;;42470:43;42549:15;;;42529:18;;;42522:43;42581:19;;;42574:35;;;42625:19;;;42618:35;;;42669:19;;;42662:35;;;42713:19;;;42706:35;;;42318:19;;91979:283:0;;;;;;;;;;;;;91951:326;;;;;;91931:346;;91722:563;;;;;;;:::o;85708:1462::-;85934:7;;;;;;;85933:8;85925:45;;;;-1:-1:-1;;;85925:45:0;;42954:2:1;85925:45:0;;;42936:21:1;42993:2;42973:18;;;42966:30;43032:26;43012:18;;;43005:54;43076:18;;85925:45:0;42752:348:1;85925:45:0;85981:7;:14;;86019:8;;85981:14;-1:-1:-1;;86008:19:0;;;;;;;;;;86019:8;86059;;;;86038:18;:29;;-1:-1:-1;;86038:29:0;;;;;;;;;;86080:6;:19;;86089:10;-1:-1:-1;;;;;;86080:19:0;;;;;;;;86165:12;;86217;;;;86264;;;;;86314:8;;86351;;;;86397;;;;86441;;;;86480;;;;86110:433;;86264:12;;86351:8;86397;86441;86522:10;86110:19;:433::i;:::-;86574:12;;;;86554:17;:32;;-1:-1:-1;;;;;;86554:32:0;-1:-1:-1;;;;;86554:32:0;;;;;;;;;86609:8;;;;86597:9;:20;;;84558:5;-1:-1:-1;86628:62:0;;;;-1:-1:-1;;;86628:62:0;;43307:2:1;86628:62:0;;;43289:21:1;43346:2;43326:18;;;43319:30;-1:-1:-1;;;43365:18:1;;;43358:51;43426:18;;86628:62:0;43105:345:1;86628:62:0;86799:8;;;;:13;;:32;;-1:-1:-1;86816:8:0;;;;86828:3;-1:-1:-1;86816:15:0;86799:32;86795:143;;;86865:3;86848:14;:20;86795:143;;;86918:8;;;;86901:14;:25;86795:143;86958:8;;;;86948:7;:18;86987:10;;86979:18;;;;86995:1;;86958:8;86979:18;;;;;:::i;:::-;-1:-1:-1;87018:10:0;;;;;87008:20;;;;87026:1;;87008:20;;;:::i;:::-;-1:-1:-1;87056:10:0;;;;87039:27;;;;:14;;87056:10;87039:27;;;;;:::i;:::-;-1:-1:-1;87081:18:0;;;;87077:86;;;87121:30;87136:14;87121:30;;;;;;:::i;:::-;;;;;;;;85708:1462;;;;;:::o;38195:374::-;38363:39;38384:4;38390:2;38394:7;38363:20;:39::i;76213:550::-;76413:7;76522:4;76550:13;76586:5;76614:7;76644:5;76672:7;76702:19;76481:259;;;;;;;;;;;;;;:::i;24898:723::-;24954:13;25175:10;25171:53;;-1:-1:-1;;25202:10:0;;;;;;;;;;;;-1:-1:-1;;;25202:10:0;;;;;24898:723::o;25171:53::-;25249:5;25234:12;25290:78;25297:9;;25290:78;;25323:8;;;;:::i;:::-;;-1:-1:-1;25346:10:0;;-1:-1:-1;25354:2:0;25346:10;;:::i;:::-;;;25290:78;;;25378:19;25410:6;-1:-1:-1;;;;;25400:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25400:17:0;;25378:39;;25428:154;25435:10;;25428:154;;25462:11;25472:1;25462:11;;:::i;:::-;;-1:-1:-1;25531:10:0;25539:2;25531:5;:10;:::i;:::-;25518:24;;:2;:24;:::i;:::-;25505:39;;25488:6;25495;25488:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;25488:56:0;;;;;;;;-1:-1:-1;25559:11:0;25568:2;25559:11;;:::i;:::-;;;25428:154;;51579:1340;51687:7;51696:12;51926:9;:16;51946:2;51926:22;51922:990;;;52222:4;52207:20;;52201:27;52272:4;52257:20;;52251:27;52330:4;52315:20;;52309:27;51965:9;52301:36;52373:25;52384:4;52301:36;52201:27;52251;52373:10;:25::i;:::-;52366:32;;;;;;;;;51922:990;52420:9;:16;52440:2;52420:22;52416:496;;;52695:4;52680:20;;52674:27;52746:4;52731:20;;52725:27;52788:23;52799:4;52674:27;52725;52788:10;:23::i;:::-;52781:30;;;;;;;;52416:496;-1:-1:-1;52860:1:0;;-1:-1:-1;52864:35:0;52844:56;;49850:643;49928:20;49919:5;:29;;;;;;;;:::i;:::-;;49915:571;;;49850:643;:::o;49915:571::-;50026:29;50017:5;:38;;;;;;;;:::i;:::-;;50013:473;;;50072:34;;-1:-1:-1;;;50072:34:0;;45592:2:1;50072:34:0;;;45574:21:1;45631:2;45611:18;;;45604:30;45670:26;45650:18;;;45643:54;45714:18;;50072:34:0;45390:348:1;50013:473:0;50137:35;50128:5;:44;;;;;;;;:::i;:::-;;50124:362;;;50189:41;;-1:-1:-1;;;50189:41:0;;45945:2:1;50189:41:0;;;45927:21:1;45984:2;45964:18;;;45957:30;46023:33;46003:18;;;45996:61;46074:18;;50189:41:0;45743:355:1;50124:362:0;50261:30;50252:5;:39;;;;;;;;:::i;:::-;;50248:238;;;50308:44;;-1:-1:-1;;;50308:44:0;;46305:2:1;50308:44:0;;;46287:21:1;46344:2;46324:18;;;46317:30;46383:34;46363:18;;;46356:62;-1:-1:-1;;;46434:18:1;;;46427:32;46476:19;;50308:44:0;46103:398:1;50248:238:0;50383:30;50374:5;:39;;;;;;;;:::i;:::-;;50370:116;;;50430:44;;-1:-1:-1;;;50430:44:0;;46708:2:1;50430:44:0;;;46690:21:1;46747:2;46727:18;;;46720:30;46786:34;46766:18;;;46759:62;-1:-1:-1;;;46837:18:1;;;46830:32;46879:19;;50430:44:0;46506:398:1;45277:297:0;45443:4;-1:-1:-1;;;;;45423:24:0;:16;45431:7;45423;:16::i;:::-;-1:-1:-1;;;;;45423:24:0;;45401:115;;;;-1:-1:-1;;;45401:115:0;;;;;;;:::i;:::-;45527:39;45548:4;45554:2;45558:7;45527:20;:39::i;47765:980::-;47920:4;-1:-1:-1;;;;;47941:13:0;;17197:20;17245:8;47937:801;;47994:175;;-1:-1:-1;;;47994:175:0;;-1:-1:-1;;;;;47994:36:0;;;;;:175;;13806:10;;48088:4;;48115:7;;48145:5;;47994:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47994:175:0;;;;;;;;-1:-1:-1;;47994:175:0;;;;;;;;;;;;:::i;:::-;;;47973:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48352:13:0;;48348:320;;48395:108;;-1:-1:-1;;;48395:108:0;;;;;;;:::i;48348:320::-;48618:6;48612:13;48603:6;48599:2;48595:15;48588:38;47973:710;-1:-1:-1;;;;;;48233:51:0;-1:-1:-1;;;48233:51:0;;-1:-1:-1;48226:58:0;;47937:801;-1:-1:-1;48722:4:0;48715:11;;99812:1605;99934:18;99967:12;;99955:9;;:24;;;;:::i;:::-;99934:45;;99997:9;99992:1245;100016:6;100012:1;:10;99992:1245;;;100084:13;100100:19;100108:10;100100:7;:19::i;:::-;100084:35;;100134:20;100157:7;100165:5;100157:14;;;;;;;:::i;:::-;;;;-1:-1:-1;100188:15:0;100281:17;100277:264;;-1:-1:-1;100385:5:0;100277:264;;;-1:-1:-1;100513:12:0;100277:264;100619:26;100648:7;100656:14;100669:1;100656:10;:14;:::i;:::-;100648:23;;;;;;;:::i;:::-;;;;-1:-1:-1;100837:23:0;100833:306;;100955:14;100968:1;100955:10;:14;:::i;:::-;100938:7;100946:5;100938:14;;;;;;;:::i;:::-;;:31;100833:306;;;101105:18;101088:7;101096:5;101088:14;;;;;;;:::i;:::-;;:35;100833:306;101155:43;101165:5;101182:15;;101172:7;:25;;;;:::i;:::-;101155:9;:43::i;:::-;101213:12;;;;:::i;:::-;;;;100029:1208;;;;100024:3;;;;;:::i;:::-;;;;99992:1245;;;-1:-1:-1;101268:141:0;;;;;;;;-1:-1:-1;;;;;101294:16:0;;-1:-1:-1;101294:16:0;;;:9;:16;;;;;;:24;101268:141;;101294:42;;101329:6;;-1:-1:-1;;;;;101294:24:0;:42;:::i;:::-;-1:-1:-1;;;;;101268:141:0;;;;;-1:-1:-1;;;;;101351:16:0;;;;;;:9;101268:141;101351:16;;;;;;;:29;101268:141;;;101351:47;;101391:6;;-1:-1:-1;;;101351:29:0;;;:47;:::i;:::-;-1:-1:-1;;;;;101268:141:0;;;;;;-1:-1:-1;;;;;101249:16:0;;;;;;;:9;:16;;;;;;;;:160;;;;;;;;;-1:-1:-1;;;101249:160:0;;;;;;;;;-1:-1:-1;;99812:1605:0:o;42905:1142::-;43024:18;;;;43023:19;43015:64;;;;-1:-1:-1;;;43015:64:0;;47859:2:1;43015:64:0;;;47841:21:1;;;47878:18;;;47871:30;47937:34;47917:18;;;47910:62;47989:18;;43015:64:0;47657:356:1;43015:64:0;-1:-1:-1;;;;;43098:16:0;;43090:61;;;;-1:-1:-1;;;43090:61:0;;48220:2:1;43090:61:0;;;48202:21:1;;;48239:18;;;48232:30;48298:34;48278:18;;;48271:62;48350:18;;43090:61:0;48018:356:1;43090:61:0;43229:15;43265:8;43247:15;;:26;;;;:::i;:::-;43390:15;;43229:44;;-1:-1:-1;43373:110:0;43411:7;43407:1;:11;43373:110;;;43456:10;;;;:7;:10;;;;;:15;;-1:-1:-1;;;;;;43456:15:0;-1:-1:-1;;;;;43456:15:0;;;;;43420:19;28515:1;43456:10;43420:19;:::i;:::-;;;43373:110;;;-1:-1:-1;43570:15:0;;43553:283;43591:7;43587:1;:11;43553:283;;;43646:45;43677:1;43681:2;43685:1;43646:45;;;;;;;;;;;;:22;:45::i;:::-;43620:157;;;;-1:-1:-1;;;43620:157:0;;;;;;;:::i;:::-;43797:27;;43822:1;;-1:-1:-1;;;;;43797:27:0;;;43814:1;;-1:-1:-1;;;;;;;;;;;43797:27:0;43814:1;;43797:27;43600:3;;;;:::i;:::-;;;;43553:283;;;-1:-1:-1;43864:139:0;;;;;;;;-1:-1:-1;;;;;43890:13:0;;-1:-1:-1;43890:13:0;;;:9;:13;;;;;;:21;43864:139;;43890:41;;43922:8;;-1:-1:-1;;;;;43890:21:0;:41;:::i;:::-;-1:-1:-1;;;;;43864:139:0;;;;;-1:-1:-1;;;;;43946:13:0;;;;;;:9;43864:139;43946:13;;;;;;;:26;43864:139;;;43946:46;;43983:8;;-1:-1:-1;;;43946:26:0;;;:46;:::i;:::-;-1:-1:-1;;;;;43864:139:0;;;;;;-1:-1:-1;;;;;43848:13:0;;;;;;;:9;:13;;;;;;;;:155;;;;;;;;;-1:-1:-1;;;43848:155:0;;;;;;;;;-1:-1:-1;44014:15:0;:25;42905:1142::o;75358:339::-;75630:1;75591:27;;;:18;:27;;;;;;-1:-1:-1;;;;;75591:27:0;:41;75569:120;;;;-1:-1:-1;;;75569:120:0;;48581:2:1;75569:120:0;;;48563:21:1;48620:2;48600:18;;;48593:30;48659:31;48639:18;;;48632:59;48708:18;;75569:120:0;48379:353:1;65808:3012:0;66212:19;:42;;-1:-1:-1;;;;;;66212:42:0;-1:-1:-1;;;;;66212:42:0;;;;;61987:4;66287:37;;;66265:127;;;;-1:-1:-1;;;66265:127:0;;;;;;;:::i;:::-;66407:13;;;;:20;66403:2362;;61850:5;66475:37;66496:16;62107:3;66475:37;:::i;:::-;:50;;66449:131;;;;-1:-1:-1;;;66449:131:0;;48939:2:1;66449:131:0;;;48921:21:1;48978:2;48958:18;;;48951:30;-1:-1:-1;;;48997:18:1;;;48990:49;49056:18;;66449:131:0;48737:343:1;66449:131:0;66604:216;;;;;;;;-1:-1:-1;;;;;66604:216:0;;;;;;62107:3;66604:216;;;;;;;;;;;;;;;;-1:-1:-1;66604:216:0;;;;;;;;;;;;;;66595:6;:225;;-1:-1:-1;;;;;;66595:225:0;;;;;;-1:-1:-1;;;;;66595:225:0;-1:-1:-1;;;66595:225:0;;;-1:-1:-1;;;;;66595:225:0;;;;;;;;66840:241;;49332:25:1;;;49373:18;;;49366:34;;;49416:18;;;49409:34;;;49459:18;;;49452:34;;;-1:-1:-1;;;;;;;;66840:241:0;;;;;49304:19:1;66840:241:0;;;;;;;66403:2362;;;61850:5;67249:16;67210:15;67140:46;67174:12;67140:10;:46;:::i;:::-;:85;;;;:::i;:::-;:125;;;;:::i;:::-;:159;;67114:240;;;;-1:-1:-1;;;67114:240:0;;48939:2:1;67114:240:0;;;48921:21:1;48978:2;48958:18;;;48951:30;-1:-1:-1;;;48997:18:1;;;48990:49;49056:18;;67114:240:0;48737:343:1;67114:240:0;67392:330;;;49915:3:1;67392:330:0;;;49927:21:1;;;49984:2;49964:18;;;49957:30;-1:-1:-1;;;50003:19:1;;;49996:47;-1:-1:-1;;;;;50155:15:1;;;50133:20;;;50126:45;;;;50207:15;;;50187:18;;;50180:43;50259:15;;;50239:18;;;50232:43;50312:15;;;50291:19;;;50284:44;-1:-1:-1;50344:19:1;;50337:35;;;-1:-1:-1;50388:19:1;;50381:35;;;-1:-1:-1;50432:19:1;;50425:35;;;50476:19;;;50469:35;;;67369:20:0;;50060:19:1;;67392:330:0;;;;;;;;;;;;67369:353;;67737:12;67752:48;67791:7;67781:18;;;;;;67752:28;:48::i;:::-;67737:63;-1:-1:-1;;;;;;67841:39:0;;:27;67854:10;67865:1;67854:13;;;;;67841:4;;:12;:27::i;:::-;-1:-1:-1;;;;;67841:39:0;;67815:122;;;;-1:-1:-1;;;67815:122:0;;50717:2:1;67815:122:0;;;50699:21:1;50756:2;50736:18;;;50729:30;-1:-1:-1;;;50775:18:1;;;50768:51;50836:18;;67815:122:0;50515:345:1;67815:122:0;62270:42;67978:27;67991:10;68002:1;67991:13;;67978:27;-1:-1:-1;;;;;67978:55:0;;67952:147;;;;-1:-1:-1;;;67952:147:0;;51067:2:1;67952:147:0;;;51049:21:1;51106:2;51086:18;;;51079:30;51145:32;51125:18;;;51118:60;51195:18;;67952:147:0;50865:354:1;67952:147:0;68114:15;:34;;-1:-1:-1;;;;;;68114:34:0;;;-1:-1:-1;;;;;68114:34:0;;;;;;;;;68163:18;:40;;;;;;;;;;;;;;68227:233;;;;;;;;-1:-1:-1;;;;;68227:233:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68218:6;:242;;-1:-1:-1;;;;;;68218:242:0;;;;-1:-1:-1;;;68218:242:0;;;;;;;-1:-1:-1;;;;68218:242:0;-1:-1:-1;;;68218:242:0;;;-1:-1:-1;;;;68218:242:0;;;;;-1:-1:-1;;;68218:242:0;;;;;;;-1:-1:-1;;;;;68218:242:0;-1:-1:-1;;;68218:242:0;;;;;;;;;;68480:273;;49332:25:1;;;49373:18;;;49366:34;;;49416:18;;;49409:34;;;49459:18;;;49452:34;;;68163:40:0;;68114:34;;68480:273;;;;;;49304:19:1;68480:273:0;;;;;;;67099:1666;;66403:2362;68780:32;;5717:25:1;;;68780:32:0;;5705:2:1;5690:18;68780:32:0;;;;;;;65808:3012;;;;;;;;;;:::o;55301:1669::-;55432:7;;56393:66;56367:92;;56349:200;;;-1:-1:-1;56502:1:0;;-1:-1:-1;56506:30:0;56486:51;;56349:200;56563:1;:7;;56568:2;56563:7;;:18;;;;;56574:1;:7;;56579:2;56574:7;;56563:18;56559:102;;;-1:-1:-1;56614:1:0;;-1:-1:-1;56618:30:0;56598:51;;56559:102;56775:24;;;56758:14;56775:24;;;;;;;;;51847:25:1;;;51920:4;51908:17;;51888:18;;;51881:45;;;;51942:18;;;51935:34;;;51985:18;;;51978:34;;;56775:24:0;;51819:19:1;;56775:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56775:24:0;;-1:-1:-1;;56775:24:0;;;-1:-1:-1;;;;;;;56814:20:0;;56810:103;;56867:1;56871:29;56851:50;;;;;;;56810:103;56933:6;-1:-1:-1;56941:20:0;;-1:-1:-1;55301:1669:0;;;;;;;;:::o;54247:440::-;54361:7;;-1:-1:-1;;;;;54462:124:0;;54613:3;54609:12;;;54623:2;54605:21;54654:25;54665:4;54605:21;54674:1;54462:124;54654:10;:25::i;:::-;54647:32;;;;;;54247:440;;;;;;:::o;40442:110::-;40518:26;40528:2;40532:7;40518:26;;;;;;;;;;;;41071:18;41077:2;41081:7;41071:5;:18::i;:::-;41122:54;41153:1;41157:2;41161:7;41170:5;41122:22;:54::i;:::-;41100:154;;;;-1:-1:-1;;;41100:154:0;;;;;;;:::i;41787:426::-;41867:18;;;;41859:62;;;;-1:-1:-1;;;41859:62:0;;52225:2:1;41859:62:0;;;52207:21:1;52264:2;52244:18;;;52237:30;52303:33;52283:18;;;52276:61;52354:18;;41859:62:0;52023:355:1;41859:62:0;-1:-1:-1;;;;;41940:16:0;;41932:61;;;;-1:-1:-1;;;41932:61:0;;48220:2:1;41932:61:0;;;48202:21:1;;;48239:18;;;48232:30;48298:34;48278:18;;;48271:62;48350:18;;41932:61:0;48018:356:1;41932:61:0;42013:16;42021:7;42013;:16::i;:::-;42012:17;42004:58;;;;-1:-1:-1;;;42004:58:0;;52585:2:1;42004:58:0;;;52567:21:1;52624:2;52604:18;;;52597:30;52663;52643:18;;;52636:58;52711:18;;42004:58:0;52383:352:1;42004:58:0;42075:45;42104:1;42108:2;42112:7;42075:20;:45::i;:::-;42133:16;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;42133:21:0;-1:-1:-1;;;;;42133:21:0;;;;;;;;42172:33;;42133:16;;;-1:-1:-1;;;;;;;;;;;42172:33:0;42133:16;;42172:33;41787:426;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:127::-;253:10;248:3;244:20;241:1;234:31;284:4;281:1;274:15;308:4;305:1;298:15;324:253;397:2;391:9;439:3;427:16;;-1:-1:-1;;;;;458:34:1;;494:22;;;455:62;452:88;;;520:18;;:::i;:::-;556:2;549:22;324:253;:::o;582:246::-;649:2;643:9;;;679:15;;-1:-1:-1;;;;;709:34:1;;745:22;;;706:62;703:88;;;771:18;;:::i;833:497::-;894:5;947:3;940:4;932:6;928:17;924:27;914:55;;965:1;962;955:12;914:55;989:23;;:::i;:::-;1034:3;1072;1064:6;1060:16;1099:3;1091:6;1088:15;1085:35;;;1116:1;1113;1106:12;1085:35;1140:6;1155:146;1171:6;1166:3;1163:15;1155:146;;;1239:17;;1227:30;;1286:4;1277:14;;;;1188;1155:146;;;-1:-1:-1;1319:5:1;;833:497;-1:-1:-1;;;;;833:497:1:o;1335:631::-;1399:5;-1:-1:-1;;;;;1470:2:1;1462:6;1459:14;1456:40;;;1476:18;;:::i;:::-;1551:2;1545:9;1519:2;1605:15;;-1:-1:-1;;1601:24:1;;;1627:2;1597:33;1593:42;1581:55;;;1651:18;;;1671:22;;;1648:46;1645:72;;;1697:18;;:::i;:::-;1737:10;1733:2;1726:22;1766:6;1757:15;;1796:6;1788;1781:22;1836:3;1827:6;1822:3;1818:16;1815:25;1812:45;;;1853:1;1850;1843:12;1812:45;1903:6;1898:3;1891:4;1883:6;1879:17;1866:44;1958:1;1951:4;1942:6;1934;1930:19;1926:30;1919:41;;;;1335:631;;;;;:::o;1971:220::-;2013:5;2066:3;2059:4;2051:6;2047:17;2043:27;2033:55;;2084:1;2081;2074:12;2033:55;2106:79;2181:3;2172:6;2159:20;2152:4;2144:6;2140:17;2106:79;:::i;2196:944::-;2350:6;2358;2366;2374;2382;2390;2398;2451:3;2439:9;2430:7;2426:23;2422:33;2419:53;;;2468:1;2465;2458:12;2419:53;2491:29;2510:9;2491:29;:::i;:::-;2481:39;;2567:2;2556:9;2552:18;2539:32;2529:42;;2618:2;2607:9;2603:18;2590:32;2580:42;;2669:2;2658:9;2654:18;2641:32;2631:42;;2692:65;2749:7;2743:3;2732:9;2728:19;2692:65;:::i;:::-;2682:75;;2808:3;2797:9;2793:19;2780:33;-1:-1:-1;;;;;2873:2:1;2865:6;2862:14;2859:34;;;2889:1;2886;2879:12;2859:34;2912:49;2953:7;2944:6;2933:9;2929:22;2912:49;:::i;:::-;2902:59;;3014:3;3003:9;2999:19;2986:33;2970:49;;3044:2;3034:8;3031:16;3028:36;;;3060:1;3057;3050:12;3028:36;;3083:51;3126:7;3115:8;3104:9;3100:24;3083:51;:::i;:::-;3073:61;;;2196:944;;;;;;;;;;:::o;3145:131::-;-1:-1:-1;;;;;;3219:32:1;;3209:43;;3199:71;;3266:1;3263;3256:12;3281:245;3339:6;3392:2;3380:9;3371:7;3367:23;3363:32;3360:52;;;3408:1;3405;3398:12;3360:52;3447:9;3434:23;3466:30;3490:5;3466:30;:::i;3723:258::-;3795:1;3805:113;3819:6;3816:1;3813:13;3805:113;;;3895:11;;;3889:18;3876:11;;;3869:39;3841:2;3834:10;3805:113;;;3936:6;3933:1;3930:13;3927:48;;;-1:-1:-1;;3971:1:1;3953:16;;3946:27;3723:258::o;3986:::-;4028:3;4066:5;4060:12;4093:6;4088:3;4081:19;4109:63;4165:6;4158:4;4153:3;4149:14;4142:4;4135:5;4131:16;4109:63;:::i;:::-;4226:2;4205:15;-1:-1:-1;;4201:29:1;4192:39;;;;4233:4;4188:50;;3986:258;-1:-1:-1;;3986:258:1:o;4249:220::-;4398:2;4387:9;4380:21;4361:4;4418:45;4459:2;4448:9;4444:18;4436:6;4418:45;:::i;4474:180::-;4533:6;4586:2;4574:9;4565:7;4561:23;4557:32;4554:52;;;4602:1;4599;4592:12;4554:52;-1:-1:-1;4625:23:1;;4474:180;-1:-1:-1;4474:180:1:o;4867:254::-;4935:6;4943;4996:2;4984:9;4975:7;4971:23;4967:32;4964:52;;;5012:1;5009;5002:12;4964:52;5035:29;5054:9;5035:29;:::i;:::-;5025:39;5111:2;5096:18;;;;5083:32;;-1:-1:-1;;;4867:254:1:o;5126:440::-;5235:6;5243;5251;5259;5312:3;5300:9;5291:7;5287:23;5283:33;5280:53;;;5329:1;5326;5319:12;5280:53;5365:9;5352:23;5342:33;;5422:2;5411:9;5407:18;5394:32;5384:42;;5473:2;5462:9;5458:18;5445:32;5435:42;;5496:64;5552:7;5547:2;5536:9;5532:18;5496:64;:::i;:::-;5486:74;;5126:440;;;;;;;:::o;5753:958::-;5893:6;5901;5909;5917;5925;5933;5941;5949;6002:3;5990:9;5981:7;5977:23;5973:33;5970:53;;;6019:1;6016;6009:12;5970:53;6042:29;6061:9;6042:29;:::i;:::-;6032:39;;6118:2;6107:9;6103:18;6090:32;6080:42;;6169:2;6158:9;6154:18;6141:32;6131:42;;6220:2;6209:9;6205:18;6192:32;6182:42;;6271:3;6260:9;6256:19;6243:33;6233:43;;6323:3;6312:9;6308:19;6295:33;6285:43;;6379:3;6368:9;6364:19;6351:33;-1:-1:-1;;;;;6444:2:1;6436:6;6433:14;6430:34;;;6460:1;6457;6450:12;6430:34;6483:49;6524:7;6515:6;6504:9;6500:22;6483:49;:::i;:::-;6473:59;;6585:3;6574:9;6570:19;6557:33;6541:49;;6615:2;6605:8;6602:16;6599:36;;;6631:1;6628;6621:12;6599:36;;6654:51;6697:7;6686:8;6675:9;6671:24;6654:51;:::i;:::-;6644:61;;;5753:958;;;;;;;;;;;:::o;6716:328::-;6793:6;6801;6809;6862:2;6850:9;6841:7;6837:23;6833:32;6830:52;;;6878:1;6875;6868:12;6830:52;6901:29;6920:9;6901:29;:::i;:::-;6891:39;;6949:38;6983:2;6972:9;6968:18;6949:38;:::i;:::-;6939:48;;7034:2;7023:9;7019:18;7006:32;6996:42;;6716:328;;;;;:::o;7049:160::-;7114:20;;7170:13;;7163:21;7153:32;;7143:60;;7199:1;7196;7189:12;7214:666;7291:6;7299;7307;7360:2;7348:9;7339:7;7335:23;7331:32;7328:52;;;7376:1;7373;7366:12;7328:52;7416:9;7403:23;-1:-1:-1;;;;;7486:2:1;7478:6;7475:14;7472:34;;;7502:1;7499;7492:12;7472:34;7540:6;7529:9;7525:22;7515:32;;7585:7;7578:4;7574:2;7570:13;7566:27;7556:55;;7607:1;7604;7597:12;7556:55;7647:2;7634:16;7673:2;7665:6;7662:14;7659:34;;;7689:1;7686;7679:12;7659:34;7736:7;7729:4;7720:6;7716:2;7712:15;7708:26;7705:39;7702:59;;;7757:1;7754;7747:12;7702:59;7788:4;7780:13;;;;-1:-1:-1;7812:6:1;-1:-1:-1;7837:37:1;;7853:20;;;-1:-1:-1;7837:37:1;:::i;:::-;7827:47;;7214:666;;;;;:::o;7885:248::-;7953:6;7961;8014:2;8002:9;7993:7;7989:23;7985:32;7982:52;;;8030:1;8027;8020:12;7982:52;-1:-1:-1;;8053:23:1;;;8123:2;8108:18;;;8095:32;;-1:-1:-1;7885:248:1:o;8417:180::-;8473:6;8526:2;8514:9;8505:7;8501:23;8497:32;8494:52;;;8542:1;8539;8532:12;8494:52;8565:26;8581:9;8565:26;:::i;8602:236::-;8684:6;8737:3;8725:9;8716:7;8712:23;8708:33;8705:53;;;8754:1;8751;8744:12;8705:53;8777:55;8824:7;8813:9;8777:55;:::i;9412:186::-;9471:6;9524:2;9512:9;9503:7;9499:23;9495:32;9492:52;;;9540:1;9537;9530:12;9492:52;9563:29;9582:9;9563:29;:::i;9603:372::-;9703:6;9711;9719;9772:3;9760:9;9751:7;9747:23;9743:33;9740:53;;;9789:1;9786;9779:12;9740:53;9825:9;9812:23;9802:33;;9882:2;9871:9;9867:18;9854:32;9844:42;;9905:64;9961:7;9956:2;9945:9;9941:18;9905:64;:::i;10162:460::-;10257:6;10265;10273;10281;10289;10342:3;10330:9;10321:7;10317:23;10313:33;10310:53;;;10359:1;10356;10349:12;10310:53;10382:29;10401:9;10382:29;:::i;:::-;10372:39;10458:2;10443:18;;10430:32;;-1:-1:-1;10509:2:1;10494:18;;10481:32;;10560:2;10545:18;;10532:32;;-1:-1:-1;10611:3:1;10596:19;10583:33;;-1:-1:-1;10162:460:1;-1:-1:-1;;;10162:460:1:o;10627:869::-;10772:6;10780;10788;10796;10804;10812;10865:3;10853:9;10844:7;10840:23;10836:33;10833:53;;;10882:1;10879;10872:12;10833:53;10918:9;10905:23;10895:33;;10975:2;10964:9;10960:18;10947:32;10937:42;;11026:2;11015:9;11011:18;10998:32;10988:42;;11049:64;11105:7;11100:2;11089:9;11085:18;11049:64;:::i;:::-;11039:74;;11164:3;11153:9;11149:19;11136:33;-1:-1:-1;;;;;11229:2:1;11221:6;11218:14;11215:34;;;11245:1;11242;11235:12;11215:34;11268:49;11309:7;11300:6;11289:9;11285:22;11268:49;:::i;:::-;11258:59;;11370:3;11359:9;11355:19;11342:33;11326:49;;11400:2;11390:8;11387:16;11384:36;;;11416:1;11413;11406:12;11384:36;;11439:51;11482:7;11471:8;11460:9;11456:24;11439:51;:::i;:::-;11429:61;;;10627:869;;;;;;;;:::o;11501:254::-;11566:6;11574;11627:2;11615:9;11606:7;11602:23;11598:32;11595:52;;;11643:1;11640;11633:12;11595:52;11666:29;11685:9;11666:29;:::i;:::-;11656:39;;11714:35;11745:2;11734:9;11730:18;11714:35;:::i;:::-;11704:45;;11501:254;;;;;:::o;11760:492::-;11810:5;11863:3;11856:4;11848:6;11844:17;11840:27;11830:55;;11881:1;11878;11871:12;11830:55;11905:23;;:::i;:::-;11950:3;11988;11980:6;11976:16;12015:3;12007:6;12004:15;12001:35;;;12032:1;12029;12022:12;12001:35;12056:6;12071:152;12087:6;12082:3;12079:15;12071:152;;;12155:23;12174:3;12155:23;:::i;:::-;12143:36;;12208:4;12199:14;;;;12104;12071:152;;12257:668;12307:5;12360:3;12353:4;12345:6;12341:17;12337:27;12327:55;;12378:1;12375;12368:12;12327:55;12411:2;12405:9;12433:3;12475:2;12467:6;12463:15;12544:6;12532:10;12529:22;-1:-1:-1;;;;;12496:10:1;12493:34;12490:62;12487:88;;;12555:18;;:::i;:::-;12591:2;12584:22;12655:15;;12626:6;12682:15;;;12679:35;;;12710:1;12707;12700:12;12679:35;12734:6;12749:146;12765:6;12760:3;12757:15;12749:146;;;12833:17;;12821:30;;12880:4;12871:14;;;;12782;12749:146;;;-1:-1:-1;12913:6:1;;12257:668;-1:-1:-1;;;;;12257:668:1:o;12930:1114::-;12979:5;13009:4;13053:3;13048:2;13040:6;13036:15;13032:25;13022:53;;13071:1;13068;13061:12;13022:53;13104:2;13098:9;13146:2;13138:6;13134:15;-1:-1:-1;;;;;13236:6:1;13224:10;13221:22;13216:2;13204:10;13201:18;13198:46;13195:72;;;13247:18;;:::i;:::-;13287:10;13283:2;13276:22;13318:6;13307:17;;13359:2;13351:6;13347:15;13385:3;13377:6;13374:15;13371:35;;;13402:1;13399;13392:12;13371:35;13426:6;13441:573;13457:6;13452:3;13449:15;13441:573;;;13545:3;13532:17;13581:2;13568:11;13565:19;13562:109;;;13625:1;13654:2;13650;13643:14;13562:109;13694:24;;13745:11;;;13741:21;-1:-1:-1;13731:119:1;;13804:1;13833:2;13829;13822:14;13731:119;13873:4;13902:69;13967:3;13962:2;13949:16;13944:2;13940;13936:11;13902:69;:::i;:::-;13890:82;;13992:12;;;;-1:-1:-1;13483:4:1;13474:14;13441:573;;;-1:-1:-1;14032:6:1;;12930:1114;-1:-1:-1;;;;;;;12930:1114:1:o;14049:694::-;14097:5;14150:3;14143:4;14135:6;14131:17;14127:27;14117:55;;14168:1;14165;14158:12;14117:55;14192:17;;:::i;:::-;14231:3;14269:2;14261:6;14257:15;14295:3;14287:6;14284:15;14281:35;;;14312:1;14309;14302:12;14281:35;14336:6;14351:363;14367:6;14362:3;14359:15;14351:363;;;14455:3;14442:17;-1:-1:-1;;;;;14478:11:1;14475:35;14472:125;;;14551:1;14580:2;14576;14569:14;14472:125;14622:47;14665:3;14651:11;14643:6;14639:24;14622:47;:::i;:::-;14610:60;;-1:-1:-1;14699:4:1;14690:14;;;;14384;14351:363;;14748:1294;14974:6;14982;14990;14998;15006;15059:3;15047:9;15038:7;15034:23;15030:33;15027:53;;;15076:1;15073;15066:12;15027:53;15125:7;15118:4;15107:9;15103:20;15099:34;15089:62;;15147:1;15144;15137:12;15089:62;15171:17;;:::i;:::-;15210:3;15251:2;15240:9;15236:18;15277:7;15269:6;15266:19;15263:39;;;15298:1;15295;15288:12;15263:39;15322:9;15340:149;15356:6;15351:3;15348:15;15340:149;;;15424:20;15440:3;15424:20;:::i;:::-;15412:33;;15474:4;15465:14;;;;15373;15340:149;;;15344:3;15508:5;15498:15;;15532:41;15565:7;15557:6;15532:41;:::i;:::-;15522:51;;;;;15592:54;15638:7;15632:3;15621:9;15617:19;15592:54;:::i;:::-;15582:64;;15697:3;15686:9;15682:19;15669:33;-1:-1:-1;;;;;15762:2:1;15754:6;15751:14;15748:34;;;15778:1;15775;15768:12;15748:34;15801:56;15849:7;15840:6;15829:9;15825:22;15801:56;:::i;:::-;15791:66;;15910:3;15899:9;15895:19;15882:33;15866:49;;15940:2;15930:8;15927:16;15924:36;;;15956:1;15953;15946:12;15924:36;;15979:57;16028:7;16017:8;16006:9;16002:24;15979:57;:::i;:::-;15969:67;;;14748:1294;;;;;;;;:::o;16047:537::-;16142:6;16150;16158;16166;16219:3;16207:9;16198:7;16194:23;16190:33;16187:53;;;16236:1;16233;16226:12;16187:53;16259:29;16278:9;16259:29;:::i;:::-;16249:39;;16307:38;16341:2;16330:9;16326:18;16307:38;:::i;:::-;16297:48;;16392:2;16381:9;16377:18;16364:32;16354:42;;16447:2;16436:9;16432:18;16419:32;-1:-1:-1;;;;;16466:6:1;16463:30;16460:50;;;16506:1;16503;16496:12;16460:50;16529:49;16570:7;16561:6;16550:9;16546:22;16529:49;:::i;:::-;16519:59;;;16047:537;;;;;;;:::o;16589:254::-;16657:6;16665;16718:2;16706:9;16697:7;16693:23;16689:32;16686:52;;;16734:1;16731;16724:12;16686:52;16770:9;16757:23;16747:33;;16799:38;16833:2;16822:9;16818:18;16799:38;:::i;16848:260::-;16916:6;16924;16977:2;16965:9;16956:7;16952:23;16948:32;16945:52;;;16993:1;16990;16983:12;16945:52;17016:29;17035:9;17016:29;:::i;:::-;17006:39;;17064:38;17098:2;17087:9;17083:18;17064:38;:::i;18072:1278::-;-1:-1:-1;;;;;18436:15:1;;;18418:34;;18368:2;18471;18489:18;;;18482:30;;;18561:13;;18353:18;;;18583:22;;;18320:4;;18663:15;;;;18390:19;;18471:2;18636:3;18621:19;;;18320:4;18706:178;18720:6;18717:1;18714:13;18706:178;;;18785:13;;18781:22;;18769:35;;18859:15;;;;18824:12;;;;18742:1;18735:9;18706:178;;;-1:-1:-1;;18920:19:1;;;18915:2;18900:18;;18893:47;18990:13;;19012:21;;;19051:12;;;;-1:-1:-1;18990:13:1;-1:-1:-1;19088:15:1;;;19123:1;19133:189;19149:8;19144:3;19141:17;19133:189;;;19218:15;;19204:30;;19256:14;;;;19295:17;;;;19177:1;19168:11;19133:189;;;-1:-1:-1;19339:5:1;;18072:1278;-1:-1:-1;;;;;;;;18072:1278:1:o;19355:127::-;19416:10;19411:3;19407:20;19404:1;19397:31;19447:4;19444:1;19437:15;19471:4;19468:1;19461:15;19487:125;19527:4;19555:1;19552;19549:8;19546:34;;;19560:18;;:::i;:::-;-1:-1:-1;19597:9:1;;19487:125::o;19617:380::-;19696:1;19692:12;;;;19739;;;19760:61;;19814:4;19806:6;19802:17;19792:27;;19760:61;19867:2;19859:6;19856:14;19836:18;19833:38;19830:161;;;19913:10;19908:3;19904:20;19901:1;19894:31;19948:4;19945:1;19938:15;19976:4;19973:1;19966:15;19830:161;;19617:380;;;:::o;21242:128::-;21282:3;21313:1;21309:6;21306:1;21303:13;21300:39;;;21319:18;;:::i;:::-;-1:-1:-1;21355:9:1;;21242:128::o;22073:346::-;22275:2;22257:21;;;22314:2;22294:18;;;22287:30;-1:-1:-1;;;22348:2:1;22333:18;;22326:52;22410:2;22395:18;;22073:346::o;23482:168::-;23522:7;23588:1;23584;23580:6;23576:14;23573:1;23570:21;23565:1;23558:9;23551:17;23547:45;23544:71;;;23595:18;;:::i;:::-;-1:-1:-1;23635:9:1;;23482:168::o;25079:413::-;25281:2;25263:21;;;25320:2;25300:18;;;25293:30;25359:34;25354:2;25339:18;;25332:62;-1:-1:-1;;;25425:2:1;25410:18;;25403:47;25482:3;25467:19;;25079:413::o;25497:405::-;25699:2;25681:21;;;25738:2;25718:18;;;25711:30;25777:34;25772:2;25757:18;;25750:62;-1:-1:-1;;;25843:2:1;25828:18;;25821:39;25892:3;25877:19;;25497:405::o;25907:356::-;26109:2;26091:21;;;26128:18;;;26121:30;26187:34;26182:2;26167:18;;26160:62;26254:2;26239:18;;25907:356::o;26626:390::-;26785:2;26774:9;26767:21;26824:6;26819:2;26808:9;26804:18;26797:34;26881:6;26873;26868:2;26857:9;26853:18;26840:48;26937:1;26908:22;;;26932:2;26904:31;;;26897:42;;;;27000:2;26979:15;;;-1:-1:-1;;26975:29:1;26960:45;26956:54;;26626:390;-1:-1:-1;26626:390:1:o;27021:127::-;27082:10;27077:3;27073:20;27070:1;27063:31;27113:4;27110:1;27103:15;27137:4;27134:1;27127:15;27153:120;27193:1;27219;27209:35;;27224:18;;:::i;:::-;-1:-1:-1;27258:9:1;;27153:120::o;29210:136::-;29249:3;29277:5;29267:39;;29286:18;;:::i;:::-;-1:-1:-1;;;29322:18:1;;29210:136::o;31169:404::-;31371:2;31353:21;;;31410:2;31390:18;;;31383:30;31449:34;31444:2;31429:18;;31422:62;-1:-1:-1;;;31515:2:1;31500:18;;31493:38;31563:3;31548:19;;31169:404::o;31933:693::-;31983:3;32024:5;32018:12;32053:36;32079:9;32053:36;:::i;:::-;32108:1;32125:18;;;32152:104;;;;32270:1;32265:355;;;;32118:502;;32152:104;-1:-1:-1;;32185:24:1;;32173:37;;32230:16;;;;-1:-1:-1;32152:104:1;;32265:355;32296:5;32293:1;32286:16;32325:4;32370:2;32367:1;32357:16;32395:1;32409:165;32423:6;32420:1;32417:13;32409:165;;;32501:14;;32488:11;;;32481:35;32544:16;;;;32438:10;;32409:165;;;32413:3;;;32603:6;32598:3;32594:16;32587:23;;32118:502;;;;;31933:693;;;;:::o;32631:356::-;32807:3;32845:6;32839:13;32861:53;32907:6;32902:3;32895:4;32887:6;32883:17;32861:53;:::i;:::-;32930:51;32973:6;32968:3;32964:16;32956:6;32930:51;:::i;33352:112::-;33384:1;33410;33400:35;;33415:18;;:::i;:::-;-1:-1:-1;33449:9:1;;33352:112::o;33469:682::-;33794:3;33832:6;33826:13;33848:53;33894:6;33889:3;33882:4;33874:6;33870:17;33848:53;:::i;:::-;33920:51;33963:6;33958:3;33954:16;33946:6;33920:51;:::i;:::-;33910:61;;-1:-1:-1;;;33987:2:1;33980:15;34026:6;34020:13;34042:62;34095:8;34091:1;34087:2;34083:10;34076:4;34068:6;34064:17;34042:62;:::i;:::-;34124:17;34143:1;34120:25;;33469:682;-1:-1:-1;;;;;33469:682:1:o;34501:236::-;34540:3;-1:-1:-1;;;;;34613:2:1;34610:1;34606:10;34643:2;34640:1;34636:10;34674:3;34670:2;34666:12;34661:3;34658:21;34655:47;;;34682:18;;:::i;:::-;34718:13;;34501:236;-1:-1:-1;;;;34501:236:1:o;35534:127::-;35595:10;35590:3;35586:20;35583:1;35576:31;35626:4;35623:1;35616:15;35650:4;35647:1;35640:15;37785:414;37987:2;37969:21;;;38026:2;38006:18;;;37999:30;38065:34;38060:2;38045:18;;38038:62;-1:-1:-1;;;38131:2:1;38116:18;;38109:48;38189:3;38174:19;;37785:414::o;39374:246::-;39414:4;-1:-1:-1;;;;;39527:10:1;;;;39497;;39549:12;;;39546:38;;;39564:18;;:::i;:::-;39601:13;;39374:246;-1:-1:-1;;;39374:246:1:o;39625:253::-;39665:3;-1:-1:-1;;;;;39754:2:1;39751:1;39747:10;39784:2;39781:1;39777:10;39815:3;39811:2;39807:12;39802:3;39799:21;39796:47;;;39823:18;;:::i;41012:326::-;41105:5;41128:1;41138:194;41152:4;41149:1;41146:11;41138:194;;;41211:13;;41199:26;;41248:4;41272:12;;;;41307:15;;;;41172:1;41165:9;41138:194;;41343:655;-1:-1:-1;;;;;41732:15:1;;;41714:34;;41779:2;41764:18;;41757:34;;;41827:15;;41822:2;41807:18;;41800:43;41874:2;41859:18;;41852:34;;;41663:3;41648:19;;41895:53;41943:3;41928:19;;41920:6;41895:53;:::i;:::-;41985:6;41979:3;41968:9;41964:19;41957:35;41343:655;;;;;;;;;:::o;43455:926::-;43564:4;43593:2;43622;43611:9;43604:21;43645:1;43678:6;43672:13;43708:36;43734:9;43708:36;:::i;:::-;43780:6;43775:2;43764:9;43760:18;43753:34;43806:2;43827:1;43859:2;43848:9;43844:18;43876:1;43871:121;;;;44006:1;44001:354;;;;43837:518;;43871:121;-1:-1:-1;;43919:24:1;;43899:18;;;43892:52;43979:2;43964:18;;;-1:-1:-1;43871:121:1;;44001:354;44032:6;44029:1;44022:17;44080:2;44077:1;44067:16;44105:1;44119:180;44133:6;44130:1;44127:13;44119:180;;;44226:14;;44202:17;;;44198:26;;44191:50;44269:16;;;;44148:10;;44119:180;;;44323:17;;44319:26;;;-1:-1:-1;;43837:518:1;-1:-1:-1;44372:3:1;;43455:926;-1:-1:-1;;;;;;;;43455:926:1:o;44386:727::-;-1:-1:-1;;;;;44803:15:1;;;44785:34;;44850:2;44835:18;;44828:34;;;44898:15;;44893:2;44878:18;;44871:43;44945:2;44930:18;;44923:34;;;44988:3;44973:19;;44966:35;;;44765:3;45017:19;;45010:35;;;44734:3;44719:19;;45054:53;45102:3;45087:19;;45079:6;45054:53;:::i;:::-;44386:727;;;;;;;;;;:::o;45118:135::-;45157:3;-1:-1:-1;;45178:17:1;;45175:43;;;45198:18;;:::i;:::-;-1:-1:-1;45245:1:1;45234:13;;45118:135::o;45258:127::-;45319:10;45314:3;45310:20;45307:1;45300:31;45350:4;45347:1;45340:15;45374:4;45371:1;45364:15;46909:489;-1:-1:-1;;;;;47178:15:1;;;47160:34;;47230:15;;47225:2;47210:18;;47203:43;47277:2;47262:18;;47255:34;;;47325:3;47320:2;47305:18;;47298:31;;;47103:4;;47346:46;;47372:19;;47364:6;47346:46;:::i;47403:249::-;47472:6;47525:2;47513:9;47504:7;47500:23;47496:32;47493:52;;;47541:1;47538;47531:12;47493:52;47573:9;47567:16;47592:30;47616:5;47592:30;:::i
Swarm Source
ipfs://1263082eb313ef68798ab10f972f5416757494cedeccd33b017d049659d2a456
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.