ERC-721
Overview
Max Total Supply
256 GITTREES
Holders
133
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 GITTREESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
gittrees
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // contract inheritance import "./ERC721Enumerable.sol"; import "./IERC721.sol"; import "./Ownable.sol"; contract gittrees is ERC721Enumerable, Ownable { uint public mintingCost = 0.2 ether; uint public constant maxTokens = 256; uint public constant maxReservedTokens = 24; uint public constant maxGlyphTokens = 8; uint public availableTokens = 0; uint public normalTokensMinted = 0; uint public reservedTokensMinted = 0; uint public glyphTokensMinted = 0; bool public mintingEnabled = false; bool public claimingEnabled = false; string private baseTokenURI; address autoglyphsAddress = 0xd4e4078ca3495DE5B1d4dB434BEbc5a986197782; mapping(uint => uint) public glyphUsedForMint; event Mint(address indexed to, uint indexed tokenId); event MintWithGlyph(address indexed to, uint indexed tokenId, uint indexed GlyphId); constructor() payable ERC721("GitTrees", "GITTREES") {} modifier onlySender() { require(msg.sender == tx.origin, "Sender must be origin!"); _; } modifier publicMinting() { require(mintingEnabled == true, "Public Minting is not available."); _; } modifier publicClaiming() { require(claimingEnabled == true, "Public Claiming is not available."); _; } // funds withdrawals function withdrawEther() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } // internal workers function addReservedTokensMinted() internal { reservedTokensMinted++; } function getReservedMintId() internal view returns (uint) { return reservedTokensMinted; } function addGlyphTokensMinted() internal { glyphTokensMinted++; } function getGlyphMintId() internal view returns (uint) { return glyphTokensMinted + maxReservedTokens; } function addNormalTokensMinted() internal { normalTokensMinted++; } function getNormalMintId() internal view returns (uint) { return normalTokensMinted + maxReservedTokens + maxGlyphTokens; } function getPublicMintableTokens() internal view returns (uint) { return availableTokens - normalTokensMinted; } function hasGlyphBeenUsedForMinting(uint glyphId_) internal view returns (bool) { return glyphUsedForMint[glyphId_] == 1; } // contract administration function setMintingQuota(uint quotaAmount_) external onlyOwner { require (quotaAmount_ <= (maxTokens - maxReservedTokens - maxGlyphTokens), "Quota over limit!" ); availableTokens = quotaAmount_; } function addMintingQuota(uint quotaAmount_) external onlyOwner { require (availableTokens + quotaAmount_ <= (maxTokens - maxReservedTokens - maxGlyphTokens), "Quota over limit!" ); availableTokens = availableTokens + quotaAmount_; } function setMintingCost(uint mintingCost_) external onlyOwner { mintingCost = mintingCost_; } function setBaseTokenURI(string memory uri_) external onlyOwner { baseTokenURI = uri_; } function setPublicMinting(bool status_) external onlyOwner { mintingEnabled = status_; } function setPublicClaiming(bool status_) external onlyOwner { claimingEnabled = status_; } function setAutoglyphsAddress(address address_) external onlyOwner { autoglyphsAddress = address_; } // view functions function tokenURI(uint tokenId_) public view override returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId_))); } function getTokensOfAddress(address address_) public view returns (uint[] memory) { uint _tokenBalance = balanceOf(address_); uint[] memory _tokenIds = new uint[](_tokenBalance); for (uint i = 0; i < _tokenBalance; i++) { _tokenIds[i] = tokenOfOwnerByIndex(address_, i); } return _tokenIds; } function getAvailableSeeds() public view returns (uint) { return availableTokens - normalTokensMinted; } function getRemainingGlyphMints() public view returns (uint) { return maxGlyphTokens - glyphTokensMinted; } // minting functions (owner only) function ownerMintReservedTokens() external onlyOwner { require(reservedTokensMinted + 1 <= maxReservedTokens, "Over Maximum Reserved Tokens!"); uint _mintId = getReservedMintId(); addReservedTokensMinted(); _mint(msg.sender, _mintId); emit Mint(msg.sender, _mintId); } function ownerMintNormalTokens() external onlyOwner { require(normalTokensMinted + 1 <= availableTokens, "No available tokens remaining!"); uint _mintId = getNormalMintId(); addNormalTokensMinted(); _mint(msg.sender, _mintId); emit Mint(msg.sender, _mintId); } function ownerMintWithGlyph() external onlyOwner { require(glyphTokensMinted + 1 <= maxGlyphTokens, "No Glyph tokens remaining!"); uint _mintId = getGlyphMintId(); addGlyphTokensMinted(); _mint(msg.sender, _mintId); emit Mint(msg.sender, _mintId); } // minting functions (normal) function normalMint() payable external onlySender publicMinting { require(msg.value == mintingCost, "Wrong Cost!"); require(normalTokensMinted + 1 <= availableTokens, "No available tokens remaining!"); uint _mintId = getNormalMintId(); addNormalTokensMinted(); _mint(msg.sender, _mintId); emit Mint(msg.sender, _mintId); } function mintWithGlyph(uint glyphId_) external onlySender publicClaiming { require(msg.sender == IERC721(autoglyphsAddress).ownerOf(glyphId_), "You do not own this Autoglyph!"); require(hasGlyphBeenUsedForMinting(glyphId_) == false, "Glyph already used for minting!"); require(glyphTokensMinted + 1 <= maxGlyphTokens, "No Glyph tokens remaining!"); uint _mintId = getGlyphMintId(); glyphUsedForMint[glyphId_]++; addGlyphTokensMinted(); _mint(msg.sender, _mintId); emit MintWithGlyph(msg.sender, _mintId, glyphId_); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { 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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","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":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"GlyphId","type":"uint256"}],"name":"MintWithGlyph","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quotaAmount_","type":"uint256"}],"name":"addMintingQuota","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableSeeds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingGlyphMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"getTokensOfAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"glyphTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"glyphUsedForMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGlyphTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"glyphId_","type":"uint256"}],"name":"mintWithGlyph","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"normalTokensMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerMintNormalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerMintReservedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerMintWithGlyph","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokensMinted","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":"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":"address_","type":"address"}],"name":"setAutoglyphsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintingCost_","type":"uint256"}],"name":"setMintingCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quotaAmount_","type":"uint256"}],"name":"setMintingQuota","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status_","type":"bool"}],"name":"setPublicClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status_","type":"bool"}],"name":"setPublicMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526702c68af0bb140000600b556000600c556000600d556000600e556000600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff02191690831515021790555073d4e4078ca3495de5b1d4db434bebc5a986197782601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600881526020017f47697454726565730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f474954545245455300000000000000000000000000000000000000000000000081525081600090805190602001906200013392919062000243565b5080600190805190602001906200014c92919062000243565b5050506200016f620001636200017560201b60201c565b6200017d60201b60201c565b62000358565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025190620002f3565b90600052602060002090601f016020900481019282620002755760008555620002c1565b82601f106200029057805160ff1916838001178555620002c1565b82800160010185558215620002c1579182015b82811115620002c0578251825591602001919060010190620002a3565b5b509050620002d09190620002d4565b5090565b5b80821115620002ef576000816000905550600101620002d5565b5090565b600060028204905060018216806200030c57607f821691505b6020821081141562000323576200032262000329565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f4080620003686000396000f3fe60806040526004361061027d5760003560e01c8063666461ec1161014f578063a96fccb9116100c1578063e985e9c51161007a578063e985e9c514610941578063e9a4ed9d1461097e578063ebf98abf146109a7578063ee0b4c35146109d2578063f2fde38b146109fb578063f3e3882114610a245761027d565b8063a96fccb914610831578063a9ac27821461085c578063b88d4fde14610887578063c87b56dd146108b0578063d45d2131146108ed578063e8315742146109165761027d565b80637fcf05ee116101135780637fcf05ee1461074557806387a6179f146107705780638da5cb5b1461078757806395d89b41146107b25780639fd6db12146107dd578063a22cb465146108085761027d565b8063666461ec1461068457806369bb4dc2146106af57806370a08231146106da578063715018a6146107175780637362377b1461072e5761027d565b80632abadeca116101f357806342842e0e116101ac57806342842e0e14610576578063459eed881461059f5780634b6a9a78146105b65780634f6ccce7146105df5780635eedbe331461061c5780636352211e146106475761027d565b80632abadeca146104875780632f745c591461049157806330176e13146104ce57806339b40bdc146104f75780633d303af114610534578063420968771461055f5761027d565b80630e141a9b116102455780630e141a9b1461037957806314de3919146103a457806318160ddd146103e157806323b872dd1461040c57806324d781b614610435578063254a47371461045e5761027d565b806301ffc9a71461028257806303286317146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906138e8565b610a4f565b6040516102b69190613fea565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061398b565b610ac9565b005b3480156102f457600080fd5b506102fd610bc6565b60405161030a9190614005565b60405180910390f35b34801561031f57600080fd5b5061033a6004803603810190610335919061398b565b610c58565b6040516103479190613f61565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061387b565b610cdd565b005b34801561038557600080fd5b5061038e610df5565b60405161039b9190613fea565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906136cb565b610e08565b6040516103d89190613fc8565b60405180910390f35b3480156103ed57600080fd5b506103f6610eb6565b6040516104039190614387565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190613765565b610ec3565b005b34801561044157600080fd5b5061045c6004803603810190610457919061398b565b610f23565b005b34801561046a57600080fd5b50610485600480360381019061048091906138bb565b611006565b005b61048f61109f565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061387b565b61125f565b6040516104c59190614387565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613942565b611304565b005b34801561050357600080fd5b5061051e6004803603810190610519919061398b565b61139a565b60405161052b9190614387565b60405180910390f35b34801561054057600080fd5b506105496113b2565b6040516105569190614387565b60405180910390f35b34801561056b57600080fd5b506105746113b8565b005b34801561058257600080fd5b5061059d60048036038101906105989190613765565b6114eb565b005b3480156105ab57600080fd5b506105b461150b565b005b3480156105c257600080fd5b506105dd60048036038101906105d891906136cb565b61163e565b005b3480156105eb57600080fd5b506106066004803603810190610601919061398b565b6116fe565b6040516106139190614387565b60405180910390f35b34801561062857600080fd5b5061063161176f565b60405161063e9190614387565b60405180910390f35b34801561065357600080fd5b5061066e6004803603810190610669919061398b565b611775565b60405161067b9190613f61565b60405180910390f35b34801561069057600080fd5b50610699611827565b6040516106a69190614387565b60405180910390f35b3480156106bb57600080fd5b506106c461182c565b6040516106d19190614387565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc91906136cb565b611832565b60405161070e9190614387565b60405180910390f35b34801561072357600080fd5b5061072c6118ea565b005b34801561073a57600080fd5b50610743611972565b005b34801561075157600080fd5b5061075a611a37565b6040516107679190614387565b60405180910390f35b34801561077c57600080fd5b50610785611a3c565b005b34801561079357600080fd5b5061079c611b70565b6040516107a99190613f61565b60405180910390f35b3480156107be57600080fd5b506107c7611b9a565b6040516107d49190614005565b60405180910390f35b3480156107e957600080fd5b506107f2611c2c565b6040516107ff9190613fea565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a919061383b565b611c3f565b005b34801561083d57600080fd5b50610846611dc0565b6040516108539190614387565b60405180910390f35b34801561086857600080fd5b50610871611dd7565b60405161087e9190614387565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906137b8565b611ded565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061398b565b611e4f565b6040516108e49190614005565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f919061398b565b611e83565b005b34801561092257600080fd5b5061092b612190565b6040516109389190614387565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613725565b612196565b6040516109759190613fea565b60405180910390f35b34801561098a57600080fd5b506109a560048036038101906109a091906138bb565b61222a565b005b3480156109b357600080fd5b506109bc6122c3565b6040516109c99190614387565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f4919061398b565b6122c9565b005b348015610a0757600080fd5b50610a226004803603810190610a1d91906136cb565b61234f565b005b348015610a3057600080fd5b50610a39612447565b604051610a469190614387565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac25750610ac18261244d565b5b9050919050565b610ad161252f565b73ffffffffffffffffffffffffffffffffffffffff16610aef611b70565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90614287565b60405180910390fd5b60086018610100610b569190614541565b610b609190614541565b81600c54610b6e91906144ba565b1115610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690614047565b60405180910390fd5b80600c54610bbd91906144ba565b600c8190555050565b606060008054610bd59061462b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c019061462b565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b5050505050905090565b6000610c6382612537565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614267565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce882611775565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906142e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7861252f565b73ffffffffffffffffffffffffffffffffffffffff161480610da75750610da681610da161252f565b612196565b5b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906141c7565b60405180910390fd5b610df083836125a3565b505050565b601060019054906101000a900460ff1681565b60606000610e1583611832565b905060008167ffffffffffffffff811115610e3357610e326147f3565b5b604051908082528060200260200182016040528015610e615781602001602082028036833780820191505090505b50905060005b82811015610eab57610e79858261125f565b828281518110610e8c57610e8b6147c4565b5b6020026020010181815250508080610ea39061468e565b915050610e67565b508092505050919050565b6000600880549050905090565b610ed4610ece61252f565b8261265c565b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90614327565b60405180910390fd5b610f1e83838361273a565b505050565b610f2b61252f565b73ffffffffffffffffffffffffffffffffffffffff16610f49611b70565b73ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614287565b60405180910390fd5b60086018610100610fb09190614541565b610fba9190614541565b811115610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614047565b60405180910390fd5b80600c8190555050565b61100e61252f565b73ffffffffffffffffffffffffffffffffffffffff1661102c611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990614287565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490614227565b60405180910390fd5b60011515601060009054906101000a900460ff16151514611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90614127565b60405180910390fd5b600b5434146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906140c7565b60405180910390fd5b600c546001600d546111b991906144ba565b11156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614027565b60405180910390fd5b6000611204612996565b905061120e6129b8565b61121833826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b600061126a83611832565b82106112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614067565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61130c61252f565b73ffffffffffffffffffffffffffffffffffffffff1661132a611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790614287565b60405180910390fd5b80601190805190602001906113969291906134ca565b5050565b60136020528060005260406000206000915090505481565b600f5481565b6113c061252f565b73ffffffffffffffffffffffffffffffffffffffff166113de611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614287565b60405180910390fd5b60086001600f5461144591906144ba565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906142a7565b60405180910390fd5b6000611490612ba0565b905061149a612bb6565b6114a433826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b61150683838360405180602001604052806000815250611ded565b505050565b61151361252f565b73ffffffffffffffffffffffffffffffffffffffff16611531611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614287565b60405180910390fd5b60186001600e5461159891906144ba565b11156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090614147565b60405180910390fd5b60006115e3612bd0565b90506115ed612bda565b6115f733826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b61164661252f565b73ffffffffffffffffffffffffffffffffffffffff16611664611b70565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614287565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611708610eb6565b8210611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614367565b60405180910390fd5b6008828154811061175d5761175c6147c4565b5b90600052602060002001549050919050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614207565b60405180910390fd5b80915050919050565b600881565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a906141e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f261252f565b73ffffffffffffffffffffffffffffffffffffffff16611910611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614287565b60405180910390fd5b6119706000612bf4565b565b61197a61252f565b73ffffffffffffffffffffffffffffffffffffffff16611998611b70565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614287565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611a34573d6000803e3d6000fd5b50565b601881565b611a4461252f565b73ffffffffffffffffffffffffffffffffffffffff16611a62611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90614287565b60405180910390fd5b600c546001600d54611aca91906144ba565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290614027565b60405180910390fd5b6000611b15612996565b9050611b1f6129b8565b611b2933826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ba99061462b565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd59061462b565b8015611c225780601f10611bf757610100808354040283529160200191611c22565b820191906000526020600020905b815481529060010190602001808311611c0557829003601f168201915b5050505050905090565b601060009054906101000a900460ff1681565b611c4761252f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90614187565b60405180910390fd5b8060056000611cc261252f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d6f61252f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db49190613fea565b60405180910390a35050565b6000600d54600c54611dd29190614541565b905090565b6000600f546008611de89190614541565b905090565b611dfe611df861252f565b8361265c565b611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490614327565b60405180910390fd5b611e4984848484612cba565b50505050565b60606011611e5c83612d16565b604051602001611e6d929190613f3d565b6040516020818303038152906040529050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614227565b60405180910390fd5b60011515601060019054906101000a900460ff16151514611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e906140a7565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401611fa29190614387565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906136f8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690614307565b60405180910390fd5b6000151561206c82612e77565b1515146120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590614347565b60405180910390fd5b60086001600f546120bf91906144ba565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f7906142a7565b60405180910390fd5b600061210a612ba0565b90506013600083815260200190815260200160002060008154809291906121309061468e565b919050555061213d612bb6565b61214733826129d2565b81813373ffffffffffffffffffffffffffffffffffffffff167f7e72b3dd12a69b3994bd405c1f433ec7c8a0c5abf065742278ca89ecd8c3419f60405160405180910390a45050565b61010081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223261252f565b73ffffffffffffffffffffffffffffffffffffffff16612250611b70565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614287565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b600b5481565b6122d161252f565b73ffffffffffffffffffffffffffffffffffffffff166122ef611b70565b73ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614287565b60405180910390fd5b80600b8190555050565b61235761252f565b73ffffffffffffffffffffffffffffffffffffffff16612375611b70565b73ffffffffffffffffffffffffffffffffffffffff16146123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906140e7565b60405180910390fd5b61244481612bf4565b50565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612528575061252782612e97565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261683611775565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061266782612537565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d906141a7565b60405180910390fd5b60006126b183611775565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff1661270884610c58565b73ffffffffffffffffffffffffffffffffffffffff16145b8061273157506127308185612196565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a82611775565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a7906142c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614167565b60405180910390fd5b61282b838383612f01565b6128366000826125a3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128869190614541565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd91906144ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600060086018600d546129a991906144ba565b6129b391906144ba565b905090565b600d60008154809291906129cb9061468e565b9190505550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614247565b60405180910390fd5b612a4b81612537565b15612a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8290614107565b60405180910390fd5b612a9760008383612f01565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae791906144ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006018600f54612bb191906144ba565b905090565b600f6000815480929190612bc99061468e565b9190505550565b6000600e54905090565b600e6000815480929190612bed9061468e565b9190505550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cc584848461273a565b612cd184848484613015565b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614087565b60405180910390fd5b50505050565b60606000821415612d5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e72565b600082905060005b60008214612d90578080612d799061468e565b915050600a82612d899190614510565b9150612d66565b60008167ffffffffffffffff811115612dac57612dab6147f3565b5b6040519080825280601f01601f191660200182016040528015612dde5781602001600182028036833780820191505090505b5090505b60008514612e6b57600182612df79190614541565b9150600a85612e0691906146d7565b6030612e1291906144ba565b60f81b818381518110612e2857612e276147c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e649190614510565b9450612de2565b8093505050505b919050565b600060016013600084815260200190815260200160002054149050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f0c8383836131ac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f4f57612f4a816131b1565b612f8e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f8d57612f8c83826131fa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fd157612fcc81613367565b613010565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461300f5761300e8282613438565b5b5b505050565b60006130368473ffffffffffffffffffffffffffffffffffffffff166134b7565b1561319f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261305f61252f565b8786866040518563ffffffff1660e01b81526004016130819493929190613f7c565b602060405180830381600087803b15801561309b57600080fd5b505af19250505080156130cc57506040513d601f19601f820116820180604052508101906130c99190613915565b60015b61314f573d80600081146130fc576040519150601f19603f3d011682016040523d82523d6000602084013e613101565b606091505b50600081511415613147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313e90614087565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161320784611832565b6132119190614541565b90506000600760008481526020019081526020016000205490508181146132f6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061337b9190614541565b90506000600960008481526020019081526020016000205490506000600883815481106133ab576133aa6147c4565b5b9060005260206000200154905080600883815481106133cd576133cc6147c4565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061341c5761341b614795565b5b6001900381819060005260206000200160009055905550505050565b600061344383611832565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546134d69061462b565b90600052602060002090601f0160209004810192826134f8576000855561353f565b82601f1061351157805160ff191683800117855561353f565b8280016001018555821561353f579182015b8281111561353e578251825591602001919060010190613523565b5b50905061354c9190613550565b5090565b5b80821115613569576000816000905550600101613551565b5090565b600061358061357b846143c7565b6143a2565b90508281526020810184848401111561359c5761359b614827565b5b6135a78482856145e9565b509392505050565b60006135c26135bd846143f8565b6143a2565b9050828152602081018484840111156135de576135dd614827565b5b6135e98482856145e9565b509392505050565b60008135905061360081614eae565b92915050565b60008151905061361581614eae565b92915050565b60008135905061362a81614ec5565b92915050565b60008135905061363f81614edc565b92915050565b60008151905061365481614edc565b92915050565b600082601f83011261366f5761366e614822565b5b813561367f84826020860161356d565b91505092915050565b600082601f83011261369d5761369c614822565b5b81356136ad8482602086016135af565b91505092915050565b6000813590506136c581614ef3565b92915050565b6000602082840312156136e1576136e0614831565b5b60006136ef848285016135f1565b91505092915050565b60006020828403121561370e5761370d614831565b5b600061371c84828501613606565b91505092915050565b6000806040838503121561373c5761373b614831565b5b600061374a858286016135f1565b925050602061375b858286016135f1565b9150509250929050565b60008060006060848603121561377e5761377d614831565b5b600061378c868287016135f1565b935050602061379d868287016135f1565b92505060406137ae868287016136b6565b9150509250925092565b600080600080608085870312156137d2576137d1614831565b5b60006137e0878288016135f1565b94505060206137f1878288016135f1565b9350506040613802878288016136b6565b925050606085013567ffffffffffffffff8111156138235761382261482c565b5b61382f8782880161365a565b91505092959194509250565b6000806040838503121561385257613851614831565b5b6000613860858286016135f1565b92505060206138718582860161361b565b9150509250929050565b6000806040838503121561389257613891614831565b5b60006138a0858286016135f1565b92505060206138b1858286016136b6565b9150509250929050565b6000602082840312156138d1576138d0614831565b5b60006138df8482850161361b565b91505092915050565b6000602082840312156138fe576138fd614831565b5b600061390c84828501613630565b91505092915050565b60006020828403121561392b5761392a614831565b5b600061393984828501613645565b91505092915050565b60006020828403121561395857613957614831565b5b600082013567ffffffffffffffff8111156139765761397561482c565b5b61398284828501613688565b91505092915050565b6000602082840312156139a1576139a0614831565b5b60006139af848285016136b6565b91505092915050565b60006139c48383613f1f565b60208301905092915050565b6139d981614575565b82525050565b60006139ea8261444e565b6139f4818561447c565b93506139ff83614429565b8060005b83811015613a30578151613a1788826139b8565b9750613a228361446f565b925050600181019050613a03565b5085935050505092915050565b613a4681614587565b82525050565b6000613a5782614459565b613a61818561448d565b9350613a718185602086016145f8565b613a7a81614836565b840191505092915050565b6000613a9082614464565b613a9a818561449e565b9350613aaa8185602086016145f8565b613ab381614836565b840191505092915050565b6000613ac982614464565b613ad381856144af565b9350613ae38185602086016145f8565b80840191505092915050565b60008154613afc8161462b565b613b0681866144af565b94506001821660008114613b215760018114613b3257613b65565b60ff19831686528186019350613b65565b613b3b85614439565b60005b83811015613b5d57815481890152600182019150602081019050613b3e565b838801955050505b50505092915050565b6000613b7b601e8361449e565b9150613b8682614847565b602082019050919050565b6000613b9e60118361449e565b9150613ba982614870565b602082019050919050565b6000613bc1602b8361449e565b9150613bcc82614899565b604082019050919050565b6000613be460328361449e565b9150613bef826148e8565b604082019050919050565b6000613c0760218361449e565b9150613c1282614937565b604082019050919050565b6000613c2a600b8361449e565b9150613c3582614986565b602082019050919050565b6000613c4d60268361449e565b9150613c58826149af565b604082019050919050565b6000613c70601c8361449e565b9150613c7b826149fe565b602082019050919050565b6000613c9360208361449e565b9150613c9e82614a27565b602082019050919050565b6000613cb6601d8361449e565b9150613cc182614a50565b602082019050919050565b6000613cd960248361449e565b9150613ce482614a79565b604082019050919050565b6000613cfc60198361449e565b9150613d0782614ac8565b602082019050919050565b6000613d1f602c8361449e565b9150613d2a82614af1565b604082019050919050565b6000613d4260388361449e565b9150613d4d82614b40565b604082019050919050565b6000613d65602a8361449e565b9150613d7082614b8f565b604082019050919050565b6000613d8860298361449e565b9150613d9382614bde565b604082019050919050565b6000613dab60168361449e565b9150613db682614c2d565b602082019050919050565b6000613dce60208361449e565b9150613dd982614c56565b602082019050919050565b6000613df1602c8361449e565b9150613dfc82614c7f565b604082019050919050565b6000613e1460208361449e565b9150613e1f82614cce565b602082019050919050565b6000613e37601a8361449e565b9150613e4282614cf7565b602082019050919050565b6000613e5a60298361449e565b9150613e6582614d20565b604082019050919050565b6000613e7d60218361449e565b9150613e8882614d6f565b604082019050919050565b6000613ea0601e8361449e565b9150613eab82614dbe565b602082019050919050565b6000613ec360318361449e565b9150613ece82614de7565b604082019050919050565b6000613ee6601f8361449e565b9150613ef182614e36565b602082019050919050565b6000613f09602c8361449e565b9150613f1482614e5f565b604082019050919050565b613f28816145df565b82525050565b613f37816145df565b82525050565b6000613f498285613aef565b9150613f558284613abe565b91508190509392505050565b6000602082019050613f7660008301846139d0565b92915050565b6000608082019050613f9160008301876139d0565b613f9e60208301866139d0565b613fab6040830185613f2e565b8181036060830152613fbd8184613a4c565b905095945050505050565b60006020820190508181036000830152613fe281846139df565b905092915050565b6000602082019050613fff6000830184613a3d565b92915050565b6000602082019050818103600083015261401f8184613a85565b905092915050565b6000602082019050818103600083015261404081613b6e565b9050919050565b6000602082019050818103600083015261406081613b91565b9050919050565b6000602082019050818103600083015261408081613bb4565b9050919050565b600060208201905081810360008301526140a081613bd7565b9050919050565b600060208201905081810360008301526140c081613bfa565b9050919050565b600060208201905081810360008301526140e081613c1d565b9050919050565b6000602082019050818103600083015261410081613c40565b9050919050565b6000602082019050818103600083015261412081613c63565b9050919050565b6000602082019050818103600083015261414081613c86565b9050919050565b6000602082019050818103600083015261416081613ca9565b9050919050565b6000602082019050818103600083015261418081613ccc565b9050919050565b600060208201905081810360008301526141a081613cef565b9050919050565b600060208201905081810360008301526141c081613d12565b9050919050565b600060208201905081810360008301526141e081613d35565b9050919050565b6000602082019050818103600083015261420081613d58565b9050919050565b6000602082019050818103600083015261422081613d7b565b9050919050565b6000602082019050818103600083015261424081613d9e565b9050919050565b6000602082019050818103600083015261426081613dc1565b9050919050565b6000602082019050818103600083015261428081613de4565b9050919050565b600060208201905081810360008301526142a081613e07565b9050919050565b600060208201905081810360008301526142c081613e2a565b9050919050565b600060208201905081810360008301526142e081613e4d565b9050919050565b6000602082019050818103600083015261430081613e70565b9050919050565b6000602082019050818103600083015261432081613e93565b9050919050565b6000602082019050818103600083015261434081613eb6565b9050919050565b6000602082019050818103600083015261436081613ed9565b9050919050565b6000602082019050818103600083015261438081613efc565b9050919050565b600060208201905061439c6000830184613f2e565b92915050565b60006143ac6143bd565b90506143b8828261465d565b919050565b6000604051905090565b600067ffffffffffffffff8211156143e2576143e16147f3565b5b6143eb82614836565b9050602081019050919050565b600067ffffffffffffffff821115614413576144126147f3565b5b61441c82614836565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144c5826145df565b91506144d0836145df565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450557614504614708565b5b828201905092915050565b600061451b826145df565b9150614526836145df565b92508261453657614535614737565b5b828204905092915050565b600061454c826145df565b9150614557836145df565b92508282101561456a57614569614708565b5b828203905092915050565b6000614580826145bf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146165780820151818401526020810190506145fb565b83811115614625576000848401525b50505050565b6000600282049050600182168061464357607f821691505b6020821081141561465757614656614766565b5b50919050565b61466682614836565b810181811067ffffffffffffffff82111715614685576146846147f3565b5b80604052505050565b6000614699826145df565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cc576146cb614708565b5b600182019050919050565b60006146e2826145df565b91506146ed836145df565b9250826146fd576146fc614737565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f20617661696c61626c6520746f6b656e732072656d61696e696e67210000600082015250565b7f51756f7461206f766572206c696d697421000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f5075626c696320436c61696d696e67206973206e6f7420617661696c61626c6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f57726f6e6720436f737421000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963204d696e74696e67206973206e6f7420617661696c61626c652e600082015250565b7f4f766572204d6178696d756d20526573657276656420546f6b656e7321000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e646572206d757374206265206f726967696e2100000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f20476c79706820746f6b656e732072656d61696e696e6721000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e2074686973204175746f676c797068210000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f476c79706820616c7265616479207573656420666f72206d696e74696e672100600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614eb781614575565b8114614ec257600080fd5b50565b614ece81614587565b8114614ed957600080fd5b50565b614ee581614593565b8114614ef057600080fd5b50565b614efc816145df565b8114614f0757600080fd5b5056fea264697066735822122018954597af778337b8882d99155a0fb6ca528b837b5292f7f2d26bbe05f9a04f64736f6c63430008060033
Deployed Bytecode
0x60806040526004361061027d5760003560e01c8063666461ec1161014f578063a96fccb9116100c1578063e985e9c51161007a578063e985e9c514610941578063e9a4ed9d1461097e578063ebf98abf146109a7578063ee0b4c35146109d2578063f2fde38b146109fb578063f3e3882114610a245761027d565b8063a96fccb914610831578063a9ac27821461085c578063b88d4fde14610887578063c87b56dd146108b0578063d45d2131146108ed578063e8315742146109165761027d565b80637fcf05ee116101135780637fcf05ee1461074557806387a6179f146107705780638da5cb5b1461078757806395d89b41146107b25780639fd6db12146107dd578063a22cb465146108085761027d565b8063666461ec1461068457806369bb4dc2146106af57806370a08231146106da578063715018a6146107175780637362377b1461072e5761027d565b80632abadeca116101f357806342842e0e116101ac57806342842e0e14610576578063459eed881461059f5780634b6a9a78146105b65780634f6ccce7146105df5780635eedbe331461061c5780636352211e146106475761027d565b80632abadeca146104875780632f745c591461049157806330176e13146104ce57806339b40bdc146104f75780633d303af114610534578063420968771461055f5761027d565b80630e141a9b116102455780630e141a9b1461037957806314de3919146103a457806318160ddd146103e157806323b872dd1461040c57806324d781b614610435578063254a47371461045e5761027d565b806301ffc9a71461028257806303286317146102bf57806306fdde03146102e8578063081812fc14610313578063095ea7b314610350575b600080fd5b34801561028e57600080fd5b506102a960048036038101906102a491906138e8565b610a4f565b6040516102b69190613fea565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e1919061398b565b610ac9565b005b3480156102f457600080fd5b506102fd610bc6565b60405161030a9190614005565b60405180910390f35b34801561031f57600080fd5b5061033a6004803603810190610335919061398b565b610c58565b6040516103479190613f61565b60405180910390f35b34801561035c57600080fd5b506103776004803603810190610372919061387b565b610cdd565b005b34801561038557600080fd5b5061038e610df5565b60405161039b9190613fea565b60405180910390f35b3480156103b057600080fd5b506103cb60048036038101906103c691906136cb565b610e08565b6040516103d89190613fc8565b60405180910390f35b3480156103ed57600080fd5b506103f6610eb6565b6040516104039190614387565b60405180910390f35b34801561041857600080fd5b50610433600480360381019061042e9190613765565b610ec3565b005b34801561044157600080fd5b5061045c6004803603810190610457919061398b565b610f23565b005b34801561046a57600080fd5b50610485600480360381019061048091906138bb565b611006565b005b61048f61109f565b005b34801561049d57600080fd5b506104b860048036038101906104b3919061387b565b61125f565b6040516104c59190614387565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613942565b611304565b005b34801561050357600080fd5b5061051e6004803603810190610519919061398b565b61139a565b60405161052b9190614387565b60405180910390f35b34801561054057600080fd5b506105496113b2565b6040516105569190614387565b60405180910390f35b34801561056b57600080fd5b506105746113b8565b005b34801561058257600080fd5b5061059d60048036038101906105989190613765565b6114eb565b005b3480156105ab57600080fd5b506105b461150b565b005b3480156105c257600080fd5b506105dd60048036038101906105d891906136cb565b61163e565b005b3480156105eb57600080fd5b506106066004803603810190610601919061398b565b6116fe565b6040516106139190614387565b60405180910390f35b34801561062857600080fd5b5061063161176f565b60405161063e9190614387565b60405180910390f35b34801561065357600080fd5b5061066e6004803603810190610669919061398b565b611775565b60405161067b9190613f61565b60405180910390f35b34801561069057600080fd5b50610699611827565b6040516106a69190614387565b60405180910390f35b3480156106bb57600080fd5b506106c461182c565b6040516106d19190614387565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc91906136cb565b611832565b60405161070e9190614387565b60405180910390f35b34801561072357600080fd5b5061072c6118ea565b005b34801561073a57600080fd5b50610743611972565b005b34801561075157600080fd5b5061075a611a37565b6040516107679190614387565b60405180910390f35b34801561077c57600080fd5b50610785611a3c565b005b34801561079357600080fd5b5061079c611b70565b6040516107a99190613f61565b60405180910390f35b3480156107be57600080fd5b506107c7611b9a565b6040516107d49190614005565b60405180910390f35b3480156107e957600080fd5b506107f2611c2c565b6040516107ff9190613fea565b60405180910390f35b34801561081457600080fd5b5061082f600480360381019061082a919061383b565b611c3f565b005b34801561083d57600080fd5b50610846611dc0565b6040516108539190614387565b60405180910390f35b34801561086857600080fd5b50610871611dd7565b60405161087e9190614387565b60405180910390f35b34801561089357600080fd5b506108ae60048036038101906108a991906137b8565b611ded565b005b3480156108bc57600080fd5b506108d760048036038101906108d2919061398b565b611e4f565b6040516108e49190614005565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f919061398b565b611e83565b005b34801561092257600080fd5b5061092b612190565b6040516109389190614387565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190613725565b612196565b6040516109759190613fea565b60405180910390f35b34801561098a57600080fd5b506109a560048036038101906109a091906138bb565b61222a565b005b3480156109b357600080fd5b506109bc6122c3565b6040516109c99190614387565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f4919061398b565b6122c9565b005b348015610a0757600080fd5b50610a226004803603810190610a1d91906136cb565b61234f565b005b348015610a3057600080fd5b50610a39612447565b604051610a469190614387565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ac25750610ac18261244d565b5b9050919050565b610ad161252f565b73ffffffffffffffffffffffffffffffffffffffff16610aef611b70565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90614287565b60405180910390fd5b60086018610100610b569190614541565b610b609190614541565b81600c54610b6e91906144ba565b1115610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690614047565b60405180910390fd5b80600c54610bbd91906144ba565b600c8190555050565b606060008054610bd59061462b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c019061462b565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b5050505050905090565b6000610c6382612537565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614267565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ce882611775565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d50906142e7565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d7861252f565b73ffffffffffffffffffffffffffffffffffffffff161480610da75750610da681610da161252f565b612196565b5b610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd906141c7565b60405180910390fd5b610df083836125a3565b505050565b601060019054906101000a900460ff1681565b60606000610e1583611832565b905060008167ffffffffffffffff811115610e3357610e326147f3565b5b604051908082528060200260200182016040528015610e615781602001602082028036833780820191505090505b50905060005b82811015610eab57610e79858261125f565b828281518110610e8c57610e8b6147c4565b5b6020026020010181815250508080610ea39061468e565b915050610e67565b508092505050919050565b6000600880549050905090565b610ed4610ece61252f565b8261265c565b610f13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0a90614327565b60405180910390fd5b610f1e83838361273a565b505050565b610f2b61252f565b73ffffffffffffffffffffffffffffffffffffffff16610f49611b70565b73ffffffffffffffffffffffffffffffffffffffff1614610f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9690614287565b60405180910390fd5b60086018610100610fb09190614541565b610fba9190614541565b811115610ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff390614047565b60405180910390fd5b80600c8190555050565b61100e61252f565b73ffffffffffffffffffffffffffffffffffffffff1661102c611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107990614287565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110490614227565b60405180910390fd5b60011515601060009054906101000a900460ff16151514611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a90614127565b60405180910390fd5b600b5434146111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e906140c7565b60405180910390fd5b600c546001600d546111b991906144ba565b11156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f190614027565b60405180910390fd5b6000611204612996565b905061120e6129b8565b61121833826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b600061126a83611832565b82106112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a290614067565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b61130c61252f565b73ffffffffffffffffffffffffffffffffffffffff1661132a611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611380576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137790614287565b60405180910390fd5b80601190805190602001906113969291906134ca565b5050565b60136020528060005260406000206000915090505481565b600f5481565b6113c061252f565b73ffffffffffffffffffffffffffffffffffffffff166113de611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142b90614287565b60405180910390fd5b60086001600f5461144591906144ba565b1115611486576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147d906142a7565b60405180910390fd5b6000611490612ba0565b905061149a612bb6565b6114a433826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b61150683838360405180602001604052806000815250611ded565b505050565b61151361252f565b73ffffffffffffffffffffffffffffffffffffffff16611531611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614287565b60405180910390fd5b60186001600e5461159891906144ba565b11156115d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d090614147565b60405180910390fd5b60006115e3612bd0565b90506115ed612bda565b6115f733826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b61164661252f565b73ffffffffffffffffffffffffffffffffffffffff16611664611b70565b73ffffffffffffffffffffffffffffffffffffffff16146116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190614287565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611708610eb6565b8210611749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174090614367565b60405180910390fd5b6008828154811061175d5761175c6147c4565b5b90600052602060002001549050919050565b600d5481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614207565b60405180910390fd5b80915050919050565b600881565b600c5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189a906141e7565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118f261252f565b73ffffffffffffffffffffffffffffffffffffffff16611910611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614287565b60405180910390fd5b6119706000612bf4565b565b61197a61252f565b73ffffffffffffffffffffffffffffffffffffffff16611998611b70565b73ffffffffffffffffffffffffffffffffffffffff16146119ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e590614287565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611a34573d6000803e3d6000fd5b50565b601881565b611a4461252f565b73ffffffffffffffffffffffffffffffffffffffff16611a62611b70565b73ffffffffffffffffffffffffffffffffffffffff1614611ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaf90614287565b60405180910390fd5b600c546001600d54611aca91906144ba565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0290614027565b60405180910390fd5b6000611b15612996565b9050611b1f6129b8565b611b2933826129d2565b803373ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688560405160405180910390a350565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611ba99061462b565b80601f0160208091040260200160405190810160405280929190818152602001828054611bd59061462b565b8015611c225780601f10611bf757610100808354040283529160200191611c22565b820191906000526020600020905b815481529060010190602001808311611c0557829003601f168201915b5050505050905090565b601060009054906101000a900460ff1681565b611c4761252f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cac90614187565b60405180910390fd5b8060056000611cc261252f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d6f61252f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611db49190613fea565b60405180910390a35050565b6000600d54600c54611dd29190614541565b905090565b6000600f546008611de89190614541565b905090565b611dfe611df861252f565b8361265c565b611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490614327565b60405180910390fd5b611e4984848484612cba565b50505050565b60606011611e5c83612d16565b604051602001611e6d929190613f3d565b6040516020818303038152906040529050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee890614227565b60405180910390fd5b60011515601060019054906101000a900460ff16151514611f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3e906140a7565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401611fa29190614387565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906136f8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461205f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205690614307565b60405180910390fd5b6000151561206c82612e77565b1515146120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590614347565b60405180910390fd5b60086001600f546120bf91906144ba565b1115612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f7906142a7565b60405180910390fd5b600061210a612ba0565b90506013600083815260200190815260200160002060008154809291906121309061468e565b919050555061213d612bb6565b61214733826129d2565b81813373ffffffffffffffffffffffffffffffffffffffff167f7e72b3dd12a69b3994bd405c1f433ec7c8a0c5abf065742278ca89ecd8c3419f60405160405180910390a45050565b61010081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223261252f565b73ffffffffffffffffffffffffffffffffffffffff16612250611b70565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d90614287565b60405180910390fd5b80601060016101000a81548160ff02191690831515021790555050565b600b5481565b6122d161252f565b73ffffffffffffffffffffffffffffffffffffffff166122ef611b70565b73ffffffffffffffffffffffffffffffffffffffff1614612345576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233c90614287565b60405180910390fd5b80600b8190555050565b61235761252f565b73ffffffffffffffffffffffffffffffffffffffff16612375611b70565b73ffffffffffffffffffffffffffffffffffffffff16146123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c290614287565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906140e7565b60405180910390fd5b61244481612bf4565b50565b600e5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061251857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612528575061252782612e97565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661261683611775565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061266782612537565b6126a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d906141a7565b60405180910390fd5b60006126b183611775565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061272057508373ffffffffffffffffffffffffffffffffffffffff1661270884610c58565b73ffffffffffffffffffffffffffffffffffffffff16145b8061273157506127308185612196565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661275a82611775565b73ffffffffffffffffffffffffffffffffffffffff16146127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a7906142c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614167565b60405180910390fd5b61282b838383612f01565b6128366000826125a3565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128869190614541565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128dd91906144ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600060086018600d546129a991906144ba565b6129b391906144ba565b905090565b600d60008154809291906129cb9061468e565b9190505550565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3990614247565b60405180910390fd5b612a4b81612537565b15612a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8290614107565b60405180910390fd5b612a9760008383612f01565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ae791906144ba565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006018600f54612bb191906144ba565b905090565b600f6000815480929190612bc99061468e565b9190505550565b6000600e54905090565b600e6000815480929190612bed9061468e565b9190505550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612cc584848461273a565b612cd184848484613015565b612d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0790614087565b60405180910390fd5b50505050565b60606000821415612d5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e72565b600082905060005b60008214612d90578080612d799061468e565b915050600a82612d899190614510565b9150612d66565b60008167ffffffffffffffff811115612dac57612dab6147f3565b5b6040519080825280601f01601f191660200182016040528015612dde5781602001600182028036833780820191505090505b5090505b60008514612e6b57600182612df79190614541565b9150600a85612e0691906146d7565b6030612e1291906144ba565b60f81b818381518110612e2857612e276147c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e649190614510565b9450612de2565b8093505050505b919050565b600060016013600084815260200190815260200160002054149050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612f0c8383836131ac565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f4f57612f4a816131b1565b612f8e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612f8d57612f8c83826131fa565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fd157612fcc81613367565b613010565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461300f5761300e8282613438565b5b5b505050565b60006130368473ffffffffffffffffffffffffffffffffffffffff166134b7565b1561319f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261305f61252f565b8786866040518563ffffffff1660e01b81526004016130819493929190613f7c565b602060405180830381600087803b15801561309b57600080fd5b505af19250505080156130cc57506040513d601f19601f820116820180604052508101906130c99190613915565b60015b61314f573d80600081146130fc576040519150601f19603f3d011682016040523d82523d6000602084013e613101565b606091505b50600081511415613147576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313e90614087565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131a4565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161320784611832565b6132119190614541565b90506000600760008481526020019081526020016000205490508181146132f6576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061337b9190614541565b90506000600960008481526020019081526020016000205490506000600883815481106133ab576133aa6147c4565b5b9060005260206000200154905080600883815481106133cd576133cc6147c4565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061341c5761341b614795565b5b6001900381819060005260206000200160009055905550505050565b600061344383611832565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546134d69061462b565b90600052602060002090601f0160209004810192826134f8576000855561353f565b82601f1061351157805160ff191683800117855561353f565b8280016001018555821561353f579182015b8281111561353e578251825591602001919060010190613523565b5b50905061354c9190613550565b5090565b5b80821115613569576000816000905550600101613551565b5090565b600061358061357b846143c7565b6143a2565b90508281526020810184848401111561359c5761359b614827565b5b6135a78482856145e9565b509392505050565b60006135c26135bd846143f8565b6143a2565b9050828152602081018484840111156135de576135dd614827565b5b6135e98482856145e9565b509392505050565b60008135905061360081614eae565b92915050565b60008151905061361581614eae565b92915050565b60008135905061362a81614ec5565b92915050565b60008135905061363f81614edc565b92915050565b60008151905061365481614edc565b92915050565b600082601f83011261366f5761366e614822565b5b813561367f84826020860161356d565b91505092915050565b600082601f83011261369d5761369c614822565b5b81356136ad8482602086016135af565b91505092915050565b6000813590506136c581614ef3565b92915050565b6000602082840312156136e1576136e0614831565b5b60006136ef848285016135f1565b91505092915050565b60006020828403121561370e5761370d614831565b5b600061371c84828501613606565b91505092915050565b6000806040838503121561373c5761373b614831565b5b600061374a858286016135f1565b925050602061375b858286016135f1565b9150509250929050565b60008060006060848603121561377e5761377d614831565b5b600061378c868287016135f1565b935050602061379d868287016135f1565b92505060406137ae868287016136b6565b9150509250925092565b600080600080608085870312156137d2576137d1614831565b5b60006137e0878288016135f1565b94505060206137f1878288016135f1565b9350506040613802878288016136b6565b925050606085013567ffffffffffffffff8111156138235761382261482c565b5b61382f8782880161365a565b91505092959194509250565b6000806040838503121561385257613851614831565b5b6000613860858286016135f1565b92505060206138718582860161361b565b9150509250929050565b6000806040838503121561389257613891614831565b5b60006138a0858286016135f1565b92505060206138b1858286016136b6565b9150509250929050565b6000602082840312156138d1576138d0614831565b5b60006138df8482850161361b565b91505092915050565b6000602082840312156138fe576138fd614831565b5b600061390c84828501613630565b91505092915050565b60006020828403121561392b5761392a614831565b5b600061393984828501613645565b91505092915050565b60006020828403121561395857613957614831565b5b600082013567ffffffffffffffff8111156139765761397561482c565b5b61398284828501613688565b91505092915050565b6000602082840312156139a1576139a0614831565b5b60006139af848285016136b6565b91505092915050565b60006139c48383613f1f565b60208301905092915050565b6139d981614575565b82525050565b60006139ea8261444e565b6139f4818561447c565b93506139ff83614429565b8060005b83811015613a30578151613a1788826139b8565b9750613a228361446f565b925050600181019050613a03565b5085935050505092915050565b613a4681614587565b82525050565b6000613a5782614459565b613a61818561448d565b9350613a718185602086016145f8565b613a7a81614836565b840191505092915050565b6000613a9082614464565b613a9a818561449e565b9350613aaa8185602086016145f8565b613ab381614836565b840191505092915050565b6000613ac982614464565b613ad381856144af565b9350613ae38185602086016145f8565b80840191505092915050565b60008154613afc8161462b565b613b0681866144af565b94506001821660008114613b215760018114613b3257613b65565b60ff19831686528186019350613b65565b613b3b85614439565b60005b83811015613b5d57815481890152600182019150602081019050613b3e565b838801955050505b50505092915050565b6000613b7b601e8361449e565b9150613b8682614847565b602082019050919050565b6000613b9e60118361449e565b9150613ba982614870565b602082019050919050565b6000613bc1602b8361449e565b9150613bcc82614899565b604082019050919050565b6000613be460328361449e565b9150613bef826148e8565b604082019050919050565b6000613c0760218361449e565b9150613c1282614937565b604082019050919050565b6000613c2a600b8361449e565b9150613c3582614986565b602082019050919050565b6000613c4d60268361449e565b9150613c58826149af565b604082019050919050565b6000613c70601c8361449e565b9150613c7b826149fe565b602082019050919050565b6000613c9360208361449e565b9150613c9e82614a27565b602082019050919050565b6000613cb6601d8361449e565b9150613cc182614a50565b602082019050919050565b6000613cd960248361449e565b9150613ce482614a79565b604082019050919050565b6000613cfc60198361449e565b9150613d0782614ac8565b602082019050919050565b6000613d1f602c8361449e565b9150613d2a82614af1565b604082019050919050565b6000613d4260388361449e565b9150613d4d82614b40565b604082019050919050565b6000613d65602a8361449e565b9150613d7082614b8f565b604082019050919050565b6000613d8860298361449e565b9150613d9382614bde565b604082019050919050565b6000613dab60168361449e565b9150613db682614c2d565b602082019050919050565b6000613dce60208361449e565b9150613dd982614c56565b602082019050919050565b6000613df1602c8361449e565b9150613dfc82614c7f565b604082019050919050565b6000613e1460208361449e565b9150613e1f82614cce565b602082019050919050565b6000613e37601a8361449e565b9150613e4282614cf7565b602082019050919050565b6000613e5a60298361449e565b9150613e6582614d20565b604082019050919050565b6000613e7d60218361449e565b9150613e8882614d6f565b604082019050919050565b6000613ea0601e8361449e565b9150613eab82614dbe565b602082019050919050565b6000613ec360318361449e565b9150613ece82614de7565b604082019050919050565b6000613ee6601f8361449e565b9150613ef182614e36565b602082019050919050565b6000613f09602c8361449e565b9150613f1482614e5f565b604082019050919050565b613f28816145df565b82525050565b613f37816145df565b82525050565b6000613f498285613aef565b9150613f558284613abe565b91508190509392505050565b6000602082019050613f7660008301846139d0565b92915050565b6000608082019050613f9160008301876139d0565b613f9e60208301866139d0565b613fab6040830185613f2e565b8181036060830152613fbd8184613a4c565b905095945050505050565b60006020820190508181036000830152613fe281846139df565b905092915050565b6000602082019050613fff6000830184613a3d565b92915050565b6000602082019050818103600083015261401f8184613a85565b905092915050565b6000602082019050818103600083015261404081613b6e565b9050919050565b6000602082019050818103600083015261406081613b91565b9050919050565b6000602082019050818103600083015261408081613bb4565b9050919050565b600060208201905081810360008301526140a081613bd7565b9050919050565b600060208201905081810360008301526140c081613bfa565b9050919050565b600060208201905081810360008301526140e081613c1d565b9050919050565b6000602082019050818103600083015261410081613c40565b9050919050565b6000602082019050818103600083015261412081613c63565b9050919050565b6000602082019050818103600083015261414081613c86565b9050919050565b6000602082019050818103600083015261416081613ca9565b9050919050565b6000602082019050818103600083015261418081613ccc565b9050919050565b600060208201905081810360008301526141a081613cef565b9050919050565b600060208201905081810360008301526141c081613d12565b9050919050565b600060208201905081810360008301526141e081613d35565b9050919050565b6000602082019050818103600083015261420081613d58565b9050919050565b6000602082019050818103600083015261422081613d7b565b9050919050565b6000602082019050818103600083015261424081613d9e565b9050919050565b6000602082019050818103600083015261426081613dc1565b9050919050565b6000602082019050818103600083015261428081613de4565b9050919050565b600060208201905081810360008301526142a081613e07565b9050919050565b600060208201905081810360008301526142c081613e2a565b9050919050565b600060208201905081810360008301526142e081613e4d565b9050919050565b6000602082019050818103600083015261430081613e70565b9050919050565b6000602082019050818103600083015261432081613e93565b9050919050565b6000602082019050818103600083015261434081613eb6565b9050919050565b6000602082019050818103600083015261436081613ed9565b9050919050565b6000602082019050818103600083015261438081613efc565b9050919050565b600060208201905061439c6000830184613f2e565b92915050565b60006143ac6143bd565b90506143b8828261465d565b919050565b6000604051905090565b600067ffffffffffffffff8211156143e2576143e16147f3565b5b6143eb82614836565b9050602081019050919050565b600067ffffffffffffffff821115614413576144126147f3565b5b61441c82614836565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006144c5826145df565b91506144d0836145df565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561450557614504614708565b5b828201905092915050565b600061451b826145df565b9150614526836145df565b92508261453657614535614737565b5b828204905092915050565b600061454c826145df565b9150614557836145df565b92508282101561456a57614569614708565b5b828203905092915050565b6000614580826145bf565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146165780820151818401526020810190506145fb565b83811115614625576000848401525b50505050565b6000600282049050600182168061464357607f821691505b6020821081141561465757614656614766565b5b50919050565b61466682614836565b810181811067ffffffffffffffff82111715614685576146846147f3565b5b80604052505050565b6000614699826145df565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146cc576146cb614708565b5b600182019050919050565b60006146e2826145df565b91506146ed836145df565b9250826146fd576146fc614737565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f20617661696c61626c6520746f6b656e732072656d61696e696e67210000600082015250565b7f51756f7461206f766572206c696d697421000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f5075626c696320436c61696d696e67206973206e6f7420617661696c61626c6560008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f57726f6e6720436f737421000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5075626c6963204d696e74696e67206973206e6f7420617661696c61626c652e600082015250565b7f4f766572204d6178696d756d20526573657276656420546f6b656e7321000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e646572206d757374206265206f726967696e2100000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f20476c79706820746f6b656e732072656d61696e696e6721000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e2074686973204175746f676c797068210000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f476c79706820616c7265616479207573656420666f72206d696e74696e672100600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b614eb781614575565b8114614ec257600080fd5b50565b614ece81614587565b8114614ed957600080fd5b50565b614ee581614593565b8114614ef057600080fd5b50565b614efc816145df565b8114614f0757600080fd5b5056fea264697066735822122018954597af778337b8882d99155a0fb6ca528b837b5292f7f2d26bbe05f9a04f64736f6c63430008060033
Deployed Bytecode Sourcemap
171:6245:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2770:255:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;618:35:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3791:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1534:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2545:219:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3252:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5431:381;;;:::i;:::-;;1210:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3144:102:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;775:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;535:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5089:299;;;;;;;;;;;;;:::i;:::-;;5120:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4444:319:12;;;;;;;;;;;;;:::i;:::-;;3470:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;451:34:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2052:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;365:39:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;411:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1790:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:10;;;;;;;;;;;;;:::i;:::-;;1449:114:12;;;;;;;;;;;;;:::i;:::-;;315:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4771:310;;;;;;;;;;;;;:::i;:::-;;966:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2511:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;577:34:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4144:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4152:118:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4276:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5365:320:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3615:170:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5820:593;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;272:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3360:104:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;228:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3031:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1839:189:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;492:36:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;909:222:4;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;2770:255:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;403:1:12::1;356:2;305:3;2888:29;;;;:::i;:::-;:46;;;;:::i;:::-;2871:12;2853:15;;:30;;;;:::i;:::-;:82;;2844:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;3005:12;2987:15;;:30;;;;:::i;:::-;2969:15;:48;;;;2770:255:::0;:::o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3468:331;3398:401;;:::o;618:35:12:-;;;;;;;;;;;;;:::o;3791:355::-;3858:13;3884:18;3905:19;3915:8;3905:9;:19::i;:::-;3884:40;;3935:23;3972:13;3961:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3935:51;;4002:6;3997:115;4018:13;4014:1;:17;3997:115;;;4068:32;4088:8;4098:1;4068:19;:32::i;:::-;4053:9;4063:1;4053:12;;;;;;;;:::i;:::-;;;;;;;:47;;;;;4033:3;;;;;:::i;:::-;;;;3997:115;;;;4129:9;4122:16;;;;3791:355;;;:::o;1534:111:4:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;4724:330:3:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;2545:219:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;403:1:12::1;356:2;305:3;2645:29;;;;:::i;:::-;:46;;;;:::i;:::-;2628:12;:64;;2619:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;2744:12;2726:15;:30;;;;2545:219:::0;:::o;3252:102::-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3339:7:12::1;3322:14;;:24;;;;;;;;;;;;;;;;;;3252:102:::0;:::o;5431:381::-;1098:9;1084:23;;:10;:23;;;1076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1222:4:::1;1204:22;;:14;;;;;;;;;;;:22;;;1196:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5527:11:::2;;5514:9;:24;5506:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;5599:15;;5594:1;5573:18;;:22;;;;:::i;:::-;:41;;5565:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;5660:12;5675:17;:15;:17::i;:::-;5660:32;;5703:23;:21;:23::i;:::-;5737:26;5743:10;5755:7;5737:5;:26::i;:::-;5796:7;5784:10;5779:25;;;;;;;;;;;;5495:317;5431:381::o:0;1210:253:4:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;3144:102:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3234:4:12::1;3219:12;:19;;;;;;;;;;;;:::i;:::-;;3144:102:::0;:::o;775:45::-;;;;;;;;;;;;;;;;;:::o;535:33::-;;;;:::o;5089:299::-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;403:1:12::1;5177;5157:17;;:21;;;;:::i;:::-;:39;;5149:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5238:12;5253:16;:14;:16::i;:::-;5238:31;;5280:22;:20;:22::i;:::-;5313:26;5319:10;5331:7;5313:5;:26::i;:::-;5372:7;5360:10;5355:25;;;;;;;;;;;;5138:250;5089:299::o:0;5120:179:3:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;4444:319:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;356:2:12::1;4540:1;4517:20;;:24;;;;:::i;:::-;:45;;4509:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;4607:12;4622:19;:17;:19::i;:::-;4607:34;;4652:25;:23;:25::i;:::-;4688:26;4694:10;4706:7;4688:5;:26::i;:::-;4747:7;4735:10;4730:25;;;;;;;;;;;;4498:265;4444:319::o:0;3470:114::-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3568:8:12::1;3548:17;;:28;;;;;;;;;;;;;;;;;;3470:114:::0;:::o;1717:230:4:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;:::i;:::-;;;;;;;;;;1916:24;;1717:230;;;:::o;451:34:12:-;;;;:::o;2052:235:3:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;365:39:12:-;403:1;365:39;:::o;411:31::-;;;;:::o;1790:205:3:-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:10:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;1449:114:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1512:10:12::1;1504:28;;:51;1533:21;1504:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1449:114::o:0;315:43::-;356:2;315:43;:::o;4771:310::-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4868:15:12::1;;4863:1;4842:18;;:22;;;;:::i;:::-;:41;;4834:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4929:12;4944:17;:15;:17::i;:::-;4929:32;;4972:23;:21;:23::i;:::-;5006:26;5012:10;5024:7;5006:5;:26::i;:::-;5065:7;5053:10;5048:25;;;;;;;;;;;;4823:258;4771:310::o:0;966:85:10:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;577:34:12:-;;;;;;;;;;;;;:::o;4144:290:3:-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;4152:118:12:-;4202:4;4244:18;;4226:15;;:36;;;;:::i;:::-;4219:43;;4152:118;:::o;4276:121::-;4331:4;4372:17;;403:1;4355:34;;;;:::i;:::-;4348:41;;4276:121;:::o;5365:320:3:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;3615:170:12:-;3678:13;3735:12;3749:26;3766:8;3749:16;:26::i;:::-;3718:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3704:73;;3615:170;;;:::o;5820:593::-;1098:9;1084:23;;:10;:23;;;1076:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;1353:4:::1;1334:23;;:15;;;;;;;;;;;:23;;;1326:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;5934:17:::2;;;;;;;;;;;5926:34;;;5961:8;5926:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5912:58;;:10;:58;;;5904:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;6064:5;6024:45;;:36;6051:8;6024:26;:36::i;:::-;:45;;;6016:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;403:1;6144;6124:17;;:21;;;;:::i;:::-;:39;;6116:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;6205:12;6220:16;:14;:16::i;:::-;6205:31;;6247:16;:26;6264:8;6247:26;;;;;;;;;;;;:28;;;;;;;;;:::i;:::-;;;;;;6286:22;:20;:22::i;:::-;6319:26;6325:10;6337:7;6319:5;:26::i;:::-;6396:8;6387:7;6375:10;6361:44;;;;;;;;;;;;5893:520;5820:593:::0;:::o;272:36::-;305:3;272:36;:::o;4500:162:3:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;3360:104:12:-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3449:7:12::1;3431:15;;:25;;;;;;;;;;;;;;;;;;3360:104:::0;:::o;228:35::-;;;;:::o;3031:107::-;1189:12:10;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3118:12:12::1;3104:11;:26;;;;3031:107:::0;:::o;1839:189:10:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;492:36:12:-;;;;:::o;1431:300:3:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;7157:125:3:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;11008:171::-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;7440:344::-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;2093:137:12:-;2143:4;403:1;356:2;2167:18;;:38;;;;:::i;:::-;:55;;;;:::i;:::-;2160:62;;2093:137;:::o;2006:81::-;2059:18;;:20;;;;;;;;;:::i;:::-;;;;;;2006:81::o;9076:372:3:-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;1882:118:12:-;1931:4;356:2;1955:17;;:37;;;;:::i;:::-;1948:44;;1882:118;:::o;1797:79::-;1849:17;;:19;;;;;;;;;:::i;:::-;;;;;;1797:79::o;1687:104::-;1739:4;1763:20;;1756:27;;1687:104;:::o;1596:85::-;1651:20;;:22;;;;;;;;;:::i;:::-;;;;;;1596:85::o;2034:169:10:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2079:124;2034:169;:::o;6547:307:3:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;275:703:11:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;2368:137:12:-;2442:4;2496:1;2466:16;:26;2483:8;2466:26;;;;;;;;;;;;:31;2459:38;;2368:137;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2543:572:4:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;11732:778:3:-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;13066:122::-;;;;:::o;3821:161:4:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5103:289;5069:323;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4680:889;;4599:970;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;:::i;:::-;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5928:990;;;5857:1061;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3483:143;3409:217;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;1049:80;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1184:84;;;;:::o;1274:137::-;1319:5;1357:6;1344:20;1335:29;;1373:32;1399:5;1373:32;:::i;:::-;1325:86;;;;:::o;1417:141::-;1473:5;1504:6;1498:13;1489:22;;1520:32;1546:5;1520:32;:::i;:::-;1479:79;;;;:::o;1577:338::-;1632:5;1681:3;1674:4;1666:6;1662:17;1658:27;1648:2;;1689:79;;:::i;:::-;1648:2;1806:6;1793:20;1831:78;1905:3;1897:6;1890:4;1882:6;1878:17;1831:78;:::i;:::-;1822:87;;1638:277;;;;;:::o;1935:340::-;1991:5;2040:3;2033:4;2025:6;2021:17;2017:27;2007:2;;2048:79;;:::i;:::-;2007:2;2165:6;2152:20;2190:79;2265:3;2257:6;2250:4;2242:6;2238:17;2190:79;:::i;:::-;2181:88;;1997:278;;;;;:::o;2281:139::-;2327:5;2365:6;2352:20;2343:29;;2381:33;2408:5;2381:33;:::i;:::-;2333:87;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:2;;;2540:79;;:::i;:::-;2502:2;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2492:263;;;;:::o;2761:351::-;2831:6;2880:2;2868:9;2859:7;2855:23;2851:32;2848:2;;;2886:79;;:::i;:::-;2848:2;3006:1;3031:64;3087:7;3078:6;3067:9;3063:22;3031:64;:::i;:::-;3021:74;;2977:128;2838:274;;;;:::o;3118:474::-;3186:6;3194;3243:2;3231:9;3222:7;3218:23;3214:32;3211:2;;;3249:79;;:::i;:::-;3211:2;3369:1;3394:53;3439:7;3430:6;3419:9;3415:22;3394:53;:::i;:::-;3384:63;;3340:117;3496:2;3522:53;3567:7;3558:6;3547:9;3543:22;3522:53;:::i;:::-;3512:63;;3467:118;3201:391;;;;;:::o;3598:619::-;3675:6;3683;3691;3740:2;3728:9;3719:7;3715:23;3711:32;3708:2;;;3746:79;;:::i;:::-;3708:2;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;3698:519;;;;;:::o;4223:943::-;4318:6;4326;4334;4342;4391:3;4379:9;4370:7;4366:23;4362:33;4359:2;;;4398:79;;:::i;:::-;4359:2;4518:1;4543:53;4588:7;4579:6;4568:9;4564:22;4543:53;:::i;:::-;4533:63;;4489:117;4645:2;4671:53;4716:7;4707:6;4696:9;4692:22;4671:53;:::i;:::-;4661:63;;4616:118;4773:2;4799:53;4844:7;4835:6;4824:9;4820:22;4799:53;:::i;:::-;4789:63;;4744:118;4929:2;4918:9;4914:18;4901:32;4960:18;4952:6;4949:30;4946:2;;;4982:79;;:::i;:::-;4946:2;5087:62;5141:7;5132:6;5121:9;5117:22;5087:62;:::i;:::-;5077:72;;4872:287;4349:817;;;;;;;:::o;5172:468::-;5237:6;5245;5294:2;5282:9;5273:7;5269:23;5265:32;5262:2;;;5300:79;;:::i;:::-;5262:2;5420:1;5445:53;5490:7;5481:6;5470:9;5466:22;5445:53;:::i;:::-;5435:63;;5391:117;5547:2;5573:50;5615:7;5606:6;5595:9;5591:22;5573:50;:::i;:::-;5563:60;;5518:115;5252:388;;;;;:::o;5646:474::-;5714:6;5722;5771:2;5759:9;5750:7;5746:23;5742:32;5739:2;;;5777:79;;:::i;:::-;5739:2;5897:1;5922:53;5967:7;5958:6;5947:9;5943:22;5922:53;:::i;:::-;5912:63;;5868:117;6024:2;6050:53;6095:7;6086:6;6075:9;6071:22;6050:53;:::i;:::-;6040:63;;5995:118;5729:391;;;;;:::o;6126:323::-;6182:6;6231:2;6219:9;6210:7;6206:23;6202:32;6199:2;;;6237:79;;:::i;:::-;6199:2;6357:1;6382:50;6424:7;6415:6;6404:9;6400:22;6382:50;:::i;:::-;6372:60;;6328:114;6189:260;;;;:::o;6455:327::-;6513:6;6562:2;6550:9;6541:7;6537:23;6533:32;6530:2;;;6568:79;;:::i;:::-;6530:2;6688:1;6713:52;6757:7;6748:6;6737:9;6733:22;6713:52;:::i;:::-;6703:62;;6659:116;6520:262;;;;:::o;6788:349::-;6857:6;6906:2;6894:9;6885:7;6881:23;6877:32;6874:2;;;6912:79;;:::i;:::-;6874:2;7032:1;7057:63;7112:7;7103:6;7092:9;7088:22;7057:63;:::i;:::-;7047:73;;7003:127;6864:273;;;;:::o;7143:509::-;7212:6;7261:2;7249:9;7240:7;7236:23;7232:32;7229:2;;;7267:79;;:::i;:::-;7229:2;7415:1;7404:9;7400:17;7387:31;7445:18;7437:6;7434:30;7431:2;;;7467:79;;:::i;:::-;7431:2;7572:63;7627:7;7618:6;7607:9;7603:22;7572:63;:::i;:::-;7562:73;;7358:287;7219:433;;;;:::o;7658:329::-;7717:6;7766:2;7754:9;7745:7;7741:23;7737:32;7734:2;;;7772:79;;:::i;:::-;7734:2;7892:1;7917:53;7962:7;7953:6;7942:9;7938:22;7917:53;:::i;:::-;7907:63;;7863:117;7724:263;;;;:::o;7993:179::-;8062:10;8083:46;8125:3;8117:6;8083:46;:::i;:::-;8161:4;8156:3;8152:14;8138:28;;8073:99;;;;:::o;8178:118::-;8265:24;8283:5;8265:24;:::i;:::-;8260:3;8253:37;8243:53;;:::o;8332:732::-;8451:3;8480:54;8528:5;8480:54;:::i;:::-;8550:86;8629:6;8624:3;8550:86;:::i;:::-;8543:93;;8660:56;8710:5;8660:56;:::i;:::-;8739:7;8770:1;8755:284;8780:6;8777:1;8774:13;8755:284;;;8856:6;8850:13;8883:63;8942:3;8927:13;8883:63;:::i;:::-;8876:70;;8969:60;9022:6;8969:60;:::i;:::-;8959:70;;8815:224;8802:1;8799;8795:9;8790:14;;8755:284;;;8759:14;9055:3;9048:10;;8456:608;;;;;;;:::o;9070:109::-;9151:21;9166:5;9151:21;:::i;:::-;9146:3;9139:34;9129:50;;:::o;9185:360::-;9271:3;9299:38;9331:5;9299:38;:::i;:::-;9353:70;9416:6;9411:3;9353:70;:::i;:::-;9346:77;;9432:52;9477:6;9472:3;9465:4;9458:5;9454:16;9432:52;:::i;:::-;9509:29;9531:6;9509:29;:::i;:::-;9504:3;9500:39;9493:46;;9275:270;;;;;:::o;9551:364::-;9639:3;9667:39;9700:5;9667:39;:::i;:::-;9722:71;9786:6;9781:3;9722:71;:::i;:::-;9715:78;;9802:52;9847:6;9842:3;9835:4;9828:5;9824:16;9802:52;:::i;:::-;9879:29;9901:6;9879:29;:::i;:::-;9874:3;9870:39;9863:46;;9643:272;;;;;:::o;9921:377::-;10027:3;10055:39;10088:5;10055:39;:::i;:::-;10110:89;10192:6;10187:3;10110:89;:::i;:::-;10103:96;;10208:52;10253:6;10248:3;10241:4;10234:5;10230:16;10208:52;:::i;:::-;10285:6;10280:3;10276:16;10269:23;;10031:267;;;;;:::o;10328:845::-;10431:3;10468:5;10462:12;10497:36;10523:9;10497:36;:::i;:::-;10549:89;10631:6;10626:3;10549:89;:::i;:::-;10542:96;;10669:1;10658:9;10654:17;10685:1;10680:137;;;;10831:1;10826:341;;;;10647:520;;10680:137;10764:4;10760:9;10749;10745:25;10740:3;10733:38;10800:6;10795:3;10791:16;10784:23;;10680:137;;10826:341;10893:38;10925:5;10893:38;:::i;:::-;10953:1;10967:154;10981:6;10978:1;10975:13;10967:154;;;11055:7;11049:14;11045:1;11040:3;11036:11;11029:35;11105:1;11096:7;11092:15;11081:26;;11003:4;11000:1;10996:12;10991:17;;10967:154;;;11150:6;11145:3;11141:16;11134:23;;10833:334;;10647:520;;10435:738;;;;;;:::o;11179:366::-;11321:3;11342:67;11406:2;11401:3;11342:67;:::i;:::-;11335:74;;11418:93;11507:3;11418:93;:::i;:::-;11536:2;11531:3;11527:12;11520:19;;11325:220;;;:::o;11551:366::-;11693:3;11714:67;11778:2;11773:3;11714:67;:::i;:::-;11707:74;;11790:93;11879:3;11790:93;:::i;:::-;11908:2;11903:3;11899:12;11892:19;;11697:220;;;:::o;11923:366::-;12065:3;12086:67;12150:2;12145:3;12086:67;:::i;:::-;12079:74;;12162:93;12251:3;12162:93;:::i;:::-;12280:2;12275:3;12271:12;12264:19;;12069:220;;;:::o;12295:366::-;12437:3;12458:67;12522:2;12517:3;12458:67;:::i;:::-;12451:74;;12534:93;12623:3;12534:93;:::i;:::-;12652:2;12647:3;12643:12;12636:19;;12441:220;;;:::o;12667:366::-;12809:3;12830:67;12894:2;12889:3;12830:67;:::i;:::-;12823:74;;12906:93;12995:3;12906:93;:::i;:::-;13024:2;13019:3;13015:12;13008:19;;12813:220;;;:::o;13039:366::-;13181:3;13202:67;13266:2;13261:3;13202:67;:::i;:::-;13195:74;;13278:93;13367:3;13278:93;:::i;:::-;13396:2;13391:3;13387:12;13380:19;;13185:220;;;:::o;13411:366::-;13553:3;13574:67;13638:2;13633:3;13574:67;:::i;:::-;13567:74;;13650:93;13739:3;13650:93;:::i;:::-;13768:2;13763:3;13759:12;13752:19;;13557:220;;;:::o;13783:366::-;13925:3;13946:67;14010:2;14005:3;13946:67;:::i;:::-;13939:74;;14022:93;14111:3;14022:93;:::i;:::-;14140:2;14135:3;14131:12;14124:19;;13929:220;;;:::o;14155:366::-;14297:3;14318:67;14382:2;14377:3;14318:67;:::i;:::-;14311:74;;14394:93;14483:3;14394:93;:::i;:::-;14512:2;14507:3;14503:12;14496:19;;14301:220;;;:::o;14527:366::-;14669:3;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14766:93;14855:3;14766:93;:::i;:::-;14884:2;14879:3;14875:12;14868:19;;14673:220;;;:::o;14899:366::-;15041:3;15062:67;15126:2;15121:3;15062:67;:::i;:::-;15055:74;;15138:93;15227:3;15138:93;:::i;:::-;15256:2;15251:3;15247:12;15240:19;;15045:220;;;:::o;15271:366::-;15413:3;15434:67;15498:2;15493:3;15434:67;:::i;:::-;15427:74;;15510:93;15599:3;15510:93;:::i;:::-;15628:2;15623:3;15619:12;15612:19;;15417:220;;;:::o;15643:366::-;15785:3;15806:67;15870:2;15865:3;15806:67;:::i;:::-;15799:74;;15882:93;15971:3;15882:93;:::i;:::-;16000:2;15995:3;15991:12;15984:19;;15789:220;;;:::o;16015:366::-;16157:3;16178:67;16242:2;16237:3;16178:67;:::i;:::-;16171:74;;16254:93;16343:3;16254:93;:::i;:::-;16372:2;16367:3;16363:12;16356:19;;16161:220;;;:::o;16387:366::-;16529:3;16550:67;16614:2;16609:3;16550:67;:::i;:::-;16543:74;;16626:93;16715:3;16626:93;:::i;:::-;16744:2;16739:3;16735:12;16728:19;;16533:220;;;:::o;16759:366::-;16901:3;16922:67;16986:2;16981:3;16922:67;:::i;:::-;16915:74;;16998:93;17087:3;16998:93;:::i;:::-;17116:2;17111:3;17107:12;17100:19;;16905:220;;;:::o;17131:366::-;17273:3;17294:67;17358:2;17353:3;17294:67;:::i;:::-;17287:74;;17370:93;17459:3;17370:93;:::i;:::-;17488:2;17483:3;17479:12;17472:19;;17277:220;;;:::o;17503:366::-;17645:3;17666:67;17730:2;17725:3;17666:67;:::i;:::-;17659:74;;17742:93;17831:3;17742:93;:::i;:::-;17860:2;17855:3;17851:12;17844:19;;17649:220;;;:::o;17875:366::-;18017:3;18038:67;18102:2;18097:3;18038:67;:::i;:::-;18031:74;;18114:93;18203:3;18114:93;:::i;:::-;18232:2;18227:3;18223:12;18216:19;;18021:220;;;:::o;18247:366::-;18389:3;18410:67;18474:2;18469:3;18410:67;:::i;:::-;18403:74;;18486:93;18575:3;18486:93;:::i;:::-;18604:2;18599:3;18595:12;18588:19;;18393:220;;;:::o;18619:366::-;18761:3;18782:67;18846:2;18841:3;18782:67;:::i;:::-;18775:74;;18858:93;18947:3;18858:93;:::i;:::-;18976:2;18971:3;18967:12;18960:19;;18765:220;;;:::o;18991:366::-;19133:3;19154:67;19218:2;19213:3;19154:67;:::i;:::-;19147:74;;19230:93;19319:3;19230:93;:::i;:::-;19348:2;19343:3;19339:12;19332:19;;19137:220;;;:::o;19363:366::-;19505:3;19526:67;19590:2;19585:3;19526:67;:::i;:::-;19519:74;;19602:93;19691:3;19602:93;:::i;:::-;19720:2;19715:3;19711:12;19704:19;;19509:220;;;:::o;19735:366::-;19877:3;19898:67;19962:2;19957:3;19898:67;:::i;:::-;19891:74;;19974:93;20063:3;19974:93;:::i;:::-;20092:2;20087:3;20083:12;20076:19;;19881:220;;;:::o;20107:366::-;20249:3;20270:67;20334:2;20329:3;20270:67;:::i;:::-;20263:74;;20346:93;20435:3;20346:93;:::i;:::-;20464:2;20459:3;20455:12;20448:19;;20253:220;;;:::o;20479:366::-;20621:3;20642:67;20706:2;20701:3;20642:67;:::i;:::-;20635:74;;20718:93;20807:3;20718:93;:::i;:::-;20836:2;20831:3;20827:12;20820:19;;20625:220;;;:::o;20851:366::-;20993:3;21014:67;21078:2;21073:3;21014:67;:::i;:::-;21007:74;;21090:93;21179:3;21090:93;:::i;:::-;21208:2;21203:3;21199:12;21192:19;;20997:220;;;:::o;21223:108::-;21300:24;21318:5;21300:24;:::i;:::-;21295:3;21288:37;21278:53;;:::o;21337:118::-;21424:24;21442:5;21424:24;:::i;:::-;21419:3;21412:37;21402:53;;:::o;21461:429::-;21638:3;21660:92;21748:3;21739:6;21660:92;:::i;:::-;21653:99;;21769:95;21860:3;21851:6;21769:95;:::i;:::-;21762:102;;21881:3;21874:10;;21642:248;;;;;:::o;21896:222::-;21989:4;22027:2;22016:9;22012:18;22004:26;;22040:71;22108:1;22097:9;22093:17;22084:6;22040:71;:::i;:::-;21994:124;;;;:::o;22124:640::-;22319:4;22357:3;22346:9;22342:19;22334:27;;22371:71;22439:1;22428:9;22424:17;22415:6;22371:71;:::i;:::-;22452:72;22520:2;22509:9;22505:18;22496:6;22452:72;:::i;:::-;22534;22602:2;22591:9;22587:18;22578:6;22534:72;:::i;:::-;22653:9;22647:4;22643:20;22638:2;22627:9;22623:18;22616:48;22681:76;22752:4;22743:6;22681:76;:::i;:::-;22673:84;;22324:440;;;;;;;:::o;22770:373::-;22913:4;22951:2;22940:9;22936:18;22928:26;;23000:9;22994:4;22990:20;22986:1;22975:9;22971:17;22964:47;23028:108;23131:4;23122:6;23028:108;:::i;:::-;23020:116;;22918:225;;;;:::o;23149:210::-;23236:4;23274:2;23263:9;23259:18;23251:26;;23287:65;23349:1;23338:9;23334:17;23325:6;23287:65;:::i;:::-;23241:118;;;;:::o;23365:313::-;23478:4;23516:2;23505:9;23501:18;23493:26;;23565:9;23559:4;23555:20;23551:1;23540:9;23536:17;23529:47;23593:78;23666:4;23657:6;23593:78;:::i;:::-;23585:86;;23483:195;;;;:::o;23684:419::-;23850:4;23888:2;23877:9;23873:18;23865:26;;23937:9;23931:4;23927:20;23923:1;23912:9;23908:17;23901:47;23965:131;24091:4;23965:131;:::i;:::-;23957:139;;23855:248;;;:::o;24109:419::-;24275:4;24313:2;24302:9;24298:18;24290:26;;24362:9;24356:4;24352:20;24348:1;24337:9;24333:17;24326:47;24390:131;24516:4;24390:131;:::i;:::-;24382:139;;24280:248;;;:::o;24534:419::-;24700:4;24738:2;24727:9;24723:18;24715:26;;24787:9;24781:4;24777:20;24773:1;24762:9;24758:17;24751:47;24815:131;24941:4;24815:131;:::i;:::-;24807:139;;24705:248;;;:::o;24959:419::-;25125:4;25163:2;25152:9;25148:18;25140:26;;25212:9;25206:4;25202:20;25198:1;25187:9;25183:17;25176:47;25240:131;25366:4;25240:131;:::i;:::-;25232:139;;25130:248;;;:::o;25384:419::-;25550:4;25588:2;25577:9;25573:18;25565:26;;25637:9;25631:4;25627:20;25623:1;25612:9;25608:17;25601:47;25665:131;25791:4;25665:131;:::i;:::-;25657:139;;25555:248;;;:::o;25809:419::-;25975:4;26013:2;26002:9;25998:18;25990:26;;26062:9;26056:4;26052:20;26048:1;26037:9;26033:17;26026:47;26090:131;26216:4;26090:131;:::i;:::-;26082:139;;25980:248;;;:::o;26234:419::-;26400:4;26438:2;26427:9;26423:18;26415:26;;26487:9;26481:4;26477:20;26473:1;26462:9;26458:17;26451:47;26515:131;26641:4;26515:131;:::i;:::-;26507:139;;26405:248;;;:::o;26659:419::-;26825:4;26863:2;26852:9;26848:18;26840:26;;26912:9;26906:4;26902:20;26898:1;26887:9;26883:17;26876:47;26940:131;27066:4;26940:131;:::i;:::-;26932:139;;26830:248;;;:::o;27084:419::-;27250:4;27288:2;27277:9;27273:18;27265:26;;27337:9;27331:4;27327:20;27323:1;27312:9;27308:17;27301:47;27365:131;27491:4;27365:131;:::i;:::-;27357:139;;27255:248;;;:::o;27509:419::-;27675:4;27713:2;27702:9;27698:18;27690:26;;27762:9;27756:4;27752:20;27748:1;27737:9;27733:17;27726:47;27790:131;27916:4;27790:131;:::i;:::-;27782:139;;27680:248;;;:::o;27934:419::-;28100:4;28138:2;28127:9;28123:18;28115:26;;28187:9;28181:4;28177:20;28173:1;28162:9;28158:17;28151:47;28215:131;28341:4;28215:131;:::i;:::-;28207:139;;28105:248;;;:::o;28359:419::-;28525:4;28563:2;28552:9;28548:18;28540:26;;28612:9;28606:4;28602:20;28598:1;28587:9;28583:17;28576:47;28640:131;28766:4;28640:131;:::i;:::-;28632:139;;28530:248;;;:::o;28784:419::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29037:9;29031:4;29027:20;29023:1;29012:9;29008:17;29001:47;29065:131;29191:4;29065:131;:::i;:::-;29057:139;;28955:248;;;:::o;29209:419::-;29375:4;29413:2;29402:9;29398:18;29390:26;;29462:9;29456:4;29452:20;29448:1;29437:9;29433:17;29426:47;29490:131;29616:4;29490:131;:::i;:::-;29482:139;;29380:248;;;:::o;29634:419::-;29800:4;29838:2;29827:9;29823:18;29815:26;;29887:9;29881:4;29877:20;29873:1;29862:9;29858:17;29851:47;29915:131;30041:4;29915:131;:::i;:::-;29907:139;;29805:248;;;:::o;30059:419::-;30225:4;30263:2;30252:9;30248:18;30240:26;;30312:9;30306:4;30302:20;30298:1;30287:9;30283:17;30276:47;30340:131;30466:4;30340:131;:::i;:::-;30332:139;;30230:248;;;:::o;30484:419::-;30650:4;30688:2;30677:9;30673:18;30665:26;;30737:9;30731:4;30727:20;30723:1;30712:9;30708:17;30701:47;30765:131;30891:4;30765:131;:::i;:::-;30757:139;;30655:248;;;:::o;30909:419::-;31075:4;31113:2;31102:9;31098:18;31090:26;;31162:9;31156:4;31152:20;31148:1;31137:9;31133:17;31126:47;31190:131;31316:4;31190:131;:::i;:::-;31182:139;;31080:248;;;:::o;31334:419::-;31500:4;31538:2;31527:9;31523:18;31515:26;;31587:9;31581:4;31577:20;31573:1;31562:9;31558:17;31551:47;31615:131;31741:4;31615:131;:::i;:::-;31607:139;;31505:248;;;:::o;31759:419::-;31925:4;31963:2;31952:9;31948:18;31940:26;;32012:9;32006:4;32002:20;31998:1;31987:9;31983:17;31976:47;32040:131;32166:4;32040:131;:::i;:::-;32032:139;;31930:248;;;:::o;32184:419::-;32350:4;32388:2;32377:9;32373:18;32365:26;;32437:9;32431:4;32427:20;32423:1;32412:9;32408:17;32401:47;32465:131;32591:4;32465:131;:::i;:::-;32457:139;;32355:248;;;:::o;32609:419::-;32775:4;32813:2;32802:9;32798:18;32790:26;;32862:9;32856:4;32852:20;32848:1;32837:9;32833:17;32826:47;32890:131;33016:4;32890:131;:::i;:::-;32882:139;;32780:248;;;:::o;33034:419::-;33200:4;33238:2;33227:9;33223:18;33215:26;;33287:9;33281:4;33277:20;33273:1;33262:9;33258:17;33251:47;33315:131;33441:4;33315:131;:::i;:::-;33307:139;;33205:248;;;:::o;33459:419::-;33625:4;33663:2;33652:9;33648:18;33640:26;;33712:9;33706:4;33702:20;33698:1;33687:9;33683:17;33676:47;33740:131;33866:4;33740:131;:::i;:::-;33732:139;;33630:248;;;:::o;33884:419::-;34050:4;34088:2;34077:9;34073:18;34065:26;;34137:9;34131:4;34127:20;34123:1;34112:9;34108:17;34101:47;34165:131;34291:4;34165:131;:::i;:::-;34157:139;;34055:248;;;:::o;34309:419::-;34475:4;34513:2;34502:9;34498:18;34490:26;;34562:9;34556:4;34552:20;34548:1;34537:9;34533:17;34526:47;34590:131;34716:4;34590:131;:::i;:::-;34582:139;;34480:248;;;:::o;34734:419::-;34900:4;34938:2;34927:9;34923:18;34915:26;;34987:9;34981:4;34977:20;34973:1;34962:9;34958:17;34951:47;35015:131;35141:4;35015:131;:::i;:::-;35007:139;;34905:248;;;:::o;35159:222::-;35252:4;35290:2;35279:9;35275:18;35267:26;;35303:71;35371:1;35360:9;35356:17;35347:6;35303:71;:::i;:::-;35257:124;;;;:::o;35387:129::-;35421:6;35448:20;;:::i;:::-;35438:30;;35477:33;35505:4;35497:6;35477:33;:::i;:::-;35428:88;;;:::o;35522:75::-;35555:6;35588:2;35582:9;35572:19;;35562:35;:::o;35603:307::-;35664:4;35754:18;35746:6;35743:30;35740:2;;;35776:18;;:::i;:::-;35740:2;35814:29;35836:6;35814:29;:::i;:::-;35806:37;;35898:4;35892;35888:15;35880:23;;35669:241;;;:::o;35916:308::-;35978:4;36068:18;36060:6;36057:30;36054:2;;;36090:18;;:::i;:::-;36054:2;36128:29;36150:6;36128:29;:::i;:::-;36120:37;;36212:4;36206;36202:15;36194:23;;35983:241;;;:::o;36230:132::-;36297:4;36320:3;36312:11;;36350:4;36345:3;36341:14;36333:22;;36302:60;;;:::o;36368:141::-;36417:4;36440:3;36432:11;;36463:3;36460:1;36453:14;36497:4;36494:1;36484:18;36476:26;;36422:87;;;:::o;36515:114::-;36582:6;36616:5;36610:12;36600:22;;36589:40;;;:::o;36635:98::-;36686:6;36720:5;36714:12;36704:22;;36693:40;;;:::o;36739:99::-;36791:6;36825:5;36819:12;36809:22;;36798:40;;;:::o;36844:113::-;36914:4;36946;36941:3;36937:14;36929:22;;36919:38;;;:::o;36963:184::-;37062:11;37096:6;37091:3;37084:19;37136:4;37131:3;37127:14;37112:29;;37074:73;;;;:::o;37153:168::-;37236:11;37270:6;37265:3;37258:19;37310:4;37305:3;37301:14;37286:29;;37248:73;;;;:::o;37327:169::-;37411:11;37445:6;37440:3;37433:19;37485:4;37480:3;37476:14;37461:29;;37423:73;;;;:::o;37502:148::-;37604:11;37641:3;37626:18;;37616:34;;;;:::o;37656:305::-;37696:3;37715:20;37733:1;37715:20;:::i;:::-;37710:25;;37749:20;37767:1;37749:20;:::i;:::-;37744:25;;37903:1;37835:66;37831:74;37828:1;37825:81;37822:2;;;37909:18;;:::i;:::-;37822:2;37953:1;37950;37946:9;37939:16;;37700:261;;;;:::o;37967:185::-;38007:1;38024:20;38042:1;38024:20;:::i;:::-;38019:25;;38058:20;38076:1;38058:20;:::i;:::-;38053:25;;38097:1;38087:2;;38102:18;;:::i;:::-;38087:2;38144:1;38141;38137:9;38132:14;;38009:143;;;;:::o;38158:191::-;38198:4;38218:20;38236:1;38218:20;:::i;:::-;38213:25;;38252:20;38270:1;38252:20;:::i;:::-;38247:25;;38291:1;38288;38285:8;38282:2;;;38296:18;;:::i;:::-;38282:2;38341:1;38338;38334:9;38326:17;;38203:146;;;;:::o;38355:96::-;38392:7;38421:24;38439:5;38421:24;:::i;:::-;38410:35;;38400:51;;;:::o;38457:90::-;38491:7;38534:5;38527:13;38520:21;38509:32;;38499:48;;;:::o;38553:149::-;38589:7;38629:66;38622:5;38618:78;38607:89;;38597:105;;;:::o;38708:126::-;38745:7;38785:42;38778:5;38774:54;38763:65;;38753:81;;;:::o;38840:77::-;38877:7;38906:5;38895:16;;38885:32;;;:::o;38923:154::-;39007:6;39002:3;38997;38984:30;39069:1;39060:6;39055:3;39051:16;39044:27;38974:103;;;:::o;39083:307::-;39151:1;39161:113;39175:6;39172:1;39169:13;39161:113;;;39260:1;39255:3;39251:11;39245:18;39241:1;39236:3;39232:11;39225:39;39197:2;39194:1;39190:10;39185:15;;39161:113;;;39292:6;39289:1;39286:13;39283:2;;;39372:1;39363:6;39358:3;39354:16;39347:27;39283:2;39132:258;;;;:::o;39396:320::-;39440:6;39477:1;39471:4;39467:12;39457:22;;39524:1;39518:4;39514:12;39545:18;39535:2;;39601:4;39593:6;39589:17;39579:27;;39535:2;39663;39655:6;39652:14;39632:18;39629:38;39626:2;;;39682:18;;:::i;:::-;39626:2;39447:269;;;;:::o;39722:281::-;39805:27;39827:4;39805:27;:::i;:::-;39797:6;39793:40;39935:6;39923:10;39920:22;39899:18;39887:10;39884:34;39881:62;39878:2;;;39946:18;;:::i;:::-;39878:2;39986:10;39982:2;39975:22;39765:238;;;:::o;40009:233::-;40048:3;40071:24;40089:5;40071:24;:::i;:::-;40062:33;;40117:66;40110:5;40107:77;40104:2;;;40187:18;;:::i;:::-;40104:2;40234:1;40227:5;40223:13;40216:20;;40052:190;;;:::o;40248:176::-;40280:1;40297:20;40315:1;40297:20;:::i;:::-;40292:25;;40331:20;40349:1;40331:20;:::i;:::-;40326:25;;40370:1;40360:2;;40375:18;;:::i;:::-;40360:2;40416:1;40413;40409:9;40404:14;;40282:142;;;;:::o;40430:180::-;40478:77;40475:1;40468:88;40575:4;40572:1;40565:15;40599:4;40596:1;40589:15;40616:180;40664:77;40661:1;40654:88;40761:4;40758:1;40751:15;40785:4;40782:1;40775:15;40802:180;40850:77;40847:1;40840:88;40947:4;40944:1;40937:15;40971:4;40968:1;40961:15;40988:180;41036:77;41033:1;41026:88;41133:4;41130:1;41123:15;41157:4;41154:1;41147:15;41174:180;41222:77;41219:1;41212:88;41319:4;41316:1;41309:15;41343:4;41340:1;41333:15;41360:180;41408:77;41405:1;41398:88;41505:4;41502:1;41495:15;41529:4;41526:1;41519:15;41546:117;41655:1;41652;41645:12;41669:117;41778:1;41775;41768:12;41792:117;41901:1;41898;41891:12;41915:117;42024:1;42021;42014:12;42038:102;42079:6;42130:2;42126:7;42121:2;42114:5;42110:14;42106:28;42096:38;;42086:54;;;:::o;42146:180::-;42286:32;42282:1;42274:6;42270:14;42263:56;42252:74;:::o;42332:167::-;42472:19;42468:1;42460:6;42456:14;42449:43;42438:61;:::o;42505:230::-;42645:34;42641:1;42633:6;42629:14;42622:58;42714:13;42709:2;42701:6;42697:15;42690:38;42611:124;:::o;42741:237::-;42881:34;42877:1;42869:6;42865:14;42858:58;42950:20;42945:2;42937:6;42933:15;42926:45;42847:131;:::o;42984:220::-;43124:34;43120:1;43112:6;43108:14;43101:58;43193:3;43188:2;43180:6;43176:15;43169:28;43090:114;:::o;43210:161::-;43350:13;43346:1;43338:6;43334:14;43327:37;43316:55;:::o;43377:225::-;43517:34;43513:1;43505:6;43501:14;43494:58;43586:8;43581:2;43573:6;43569:15;43562:33;43483:119;:::o;43608:178::-;43748:30;43744:1;43736:6;43732:14;43725:54;43714:72;:::o;43792:182::-;43932:34;43928:1;43920:6;43916:14;43909:58;43898:76;:::o;43980:179::-;44120:31;44116:1;44108:6;44104:14;44097:55;44086:73;:::o;44165:223::-;44305:34;44301:1;44293:6;44289:14;44282:58;44374:6;44369:2;44361:6;44357:15;44350:31;44271:117;:::o;44394:175::-;44534:27;44530:1;44522:6;44518:14;44511:51;44500:69;:::o;44575:231::-;44715:34;44711:1;44703:6;44699:14;44692:58;44784:14;44779:2;44771:6;44767:15;44760:39;44681:125;:::o;44812:243::-;44952:34;44948:1;44940:6;44936:14;44929:58;45021:26;45016:2;45008:6;45004:15;44997:51;44918:137;:::o;45061:229::-;45201:34;45197:1;45189:6;45185:14;45178:58;45270:12;45265:2;45257:6;45253:15;45246:37;45167:123;:::o;45296:228::-;45436:34;45432:1;45424:6;45420:14;45413:58;45505:11;45500:2;45492:6;45488:15;45481:36;45402:122;:::o;45530:172::-;45670:24;45666:1;45658:6;45654:14;45647:48;45636:66;:::o;45708:182::-;45848:34;45844:1;45836:6;45832:14;45825:58;45814:76;:::o;45896:231::-;46036:34;46032:1;46024:6;46020:14;46013:58;46105:14;46100:2;46092:6;46088:15;46081:39;46002:125;:::o;46133:182::-;46273:34;46269:1;46261:6;46257:14;46250:58;46239:76;:::o;46321:176::-;46461:28;46457:1;46449:6;46445:14;46438:52;46427:70;:::o;46503:228::-;46643:34;46639:1;46631:6;46627:14;46620:58;46712:11;46707:2;46699:6;46695:15;46688:36;46609:122;:::o;46737:220::-;46877:34;46873:1;46865:6;46861:14;46854:58;46946:3;46941:2;46933:6;46929:15;46922:28;46843:114;:::o;46963:180::-;47103:32;47099:1;47091:6;47087:14;47080:56;47069:74;:::o;47149:236::-;47289:34;47285:1;47277:6;47273:14;47266:58;47358:19;47353:2;47345:6;47341:15;47334:44;47255:130;:::o;47391:181::-;47531:33;47527:1;47519:6;47515:14;47508:57;47497:75;:::o;47578:231::-;47718:34;47714:1;47706:6;47702:14;47695:58;47787:14;47782:2;47774:6;47770:15;47763:39;47684:125;:::o;47815:122::-;47888:24;47906:5;47888:24;:::i;:::-;47881:5;47878:35;47868:2;;47927:1;47924;47917:12;47868:2;47858:79;:::o;47943:116::-;48013:21;48028:5;48013:21;:::i;:::-;48006:5;48003:32;47993:2;;48049:1;48046;48039:12;47993:2;47983:76;:::o;48065:120::-;48137:23;48154:5;48137:23;:::i;:::-;48130:5;48127:34;48117:2;;48175:1;48172;48165:12;48117:2;48107:78;:::o;48191:122::-;48264:24;48282:5;48264:24;:::i;:::-;48257:5;48254:35;48244:2;;48303:1;48300;48293:12;48244:2;48234:79;:::o
Swarm Source
ipfs://18954597af778337b8882d99155a0fb6ca528b837b5292f7f2d26bbe05f9a04f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.