Token Primapes
Overview ERC-721
Total Supply:
1,007 PRIMAPES
Holders:
602 addresses
Contract:
Balance
0 PRIMAPES
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Primapes
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-12-02 */ pragma solidity ^0.8.9; // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.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); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } function owner() public view virtual returns (address) { return _owner; } modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // Creator: Chiru Labs /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Does not support burning tokens to address(0). * * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply */ abstract contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function totalSupply() public view override returns (uint256) { return currentIndex; } function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), 'ERC721A: global index out of bounds'); return index; } function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), 'ERC721A: owner index out of bounds'); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert('ERC721A: unable to get token of owner by index'); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), 'ERC721A: balance query for the zero address'); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require(owner != address(0), 'ERC721A: number minted query for the zero address'); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), 'ERC721A: owner query for nonexistent token'); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert('ERC721A: unable to determine the owner of token'); } function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } 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())) : ''; } function _baseURI() internal view virtual returns (string memory) { return ''; } function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, 'ERC721A: approval to current owner'); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), 'ERC721A: approve caller is not owner nor approved for all' ); _approve(to, tokenId, owner); } function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), 'ERC721A: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), 'ERC721A: approve to caller'); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), 'ERC721A: mint to the zero address'); require(quantity != 0, 'ERC721A: quantity must be greater than 0'); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received(address(0), to, updatedIndex, _data), 'ERC721A: transfer to non ERC721Receiver implementer' ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved'); require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner'); require(to != address(0), 'ERC721A: transfer to the zero address'); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert('ERC721A: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } contract Primapes is ERC721A, Ownable { using Strings for uint256; uint256 public constant maxSupply = 3333; uint256 public priceWL = 0.025 ether; uint256 public price = 0.033 ether; bool public bWL = false; bool public bOpen = false; bool public bPaused = true; uint256 public mintedOGAmt = 0; uint256 public mintedWLAmt = 0; uint256 public mintedAmt = 0; uint256 public maxPerMint = 5; uint256 public maxPerWLMint = 2; mapping(address => uint256) public minted; mapping(address => uint256) public mintedWL; mapping(address => uint256) public mintedOG; bytes32 public merkleRootWL; bytes32 public merkleRootOG; string private _bURIExt = ""; constructor() ERC721A("Primapes", "PRIMAPES") {} function setPaused(bool b) external onlyOwner { bPaused = b; } function setPublic(bool b) external onlyOwner { bOpen = b; } function setWL(bool b) external onlyOwner { bWL = b; } function tokenURI(uint256 token) public view virtual override returns (string memory) { require(token >= 0 && token < totalSupply(),"nonexistent token"); return string(abi.encodePacked(_bURIExt, (token+1).toString())); } function setPrice(uint256 a) external onlyOwner { price = a; } function setWLPrice(uint256 a) external onlyOwner { priceWL = a; } function setmaxPerMint(uint256 a) external onlyOwner { maxPerMint = a; } function setmaxPerWLMint(uint256 a) external onlyOwner { maxPerWLMint = a; } function setBaseURI(string memory u) external onlyOwner { _bURIExt = u; } function _baseURI() internal view virtual override returns (string memory) { return _bURIExt; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; Address.sendValue(payable(msg.sender), balance); } function setmerkleRootWL(bytes32 data) external onlyOwner { merkleRootWL = data; } function setmerkleRootOG(bytes32 data) external onlyOwner { merkleRootOG = data; } function devMint(uint amount) external onlyOwner { uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt; require(avail > 0, "Sold out!"); uint256 mAmt = Math.min(amount, avail); require(mAmt > 0, "Sold out!"); mintedAmt += mAmt; minted[msg.sender] += mAmt; _safeMint(msg.sender, mAmt); } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function claimOGApe(bytes32[] calldata merkleProof) external { require(!bPaused, "Contract paused"); require(mintedOG[msg.sender] < 1, "OG Wallet limit reached"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(merkleProof, merkleRootOG, leaf), "Invalid OG proof"); uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt; require(avail > 0, "Sold out!"); mintedOGAmt += 1; mintedOG[msg.sender] += 1; minted[msg.sender] += 1; _safeMint(msg.sender, 1); } function claimWLApe(uint256 amount, bytes32[] calldata merkleProof) external payable { require(!bPaused, "Contract paused."); require(bWL, "WL mint is closed."); require(amount <= maxPerWLMint, "Exceeded max mint per tx"); require(mintedWL[msg.sender] < 2, "WL Wallet limit reached"); bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(merkleProof, merkleRootWL, leaf), "Invalid WL proof"); uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt; require(avail > 0, "Sold out!"); uint256 mAmt = Math.min(amount, avail); require(mAmt > 0, "Sold out!"); uint256 tCost = mAmt * priceWL; require(msg.value >= tCost, "Not enough ETH sent"); mintedWLAmt += mAmt; mintedWL[msg.sender] += mAmt; minted[msg.sender] += mAmt; _safeMint(msg.sender, mAmt); uint256 d = msg.value - tCost; if (d != 0) { Address.sendValue(payable(msg.sender), d); } } function mintApe(uint amount) external payable { require(!bPaused, "Contract paused."); require(bOpen, "Public mint is closed."); require(amount <= maxPerMint, "Exceeded max mint per tx"); uint256 avail = maxSupply - mintedOGAmt - mintedWLAmt - mintedAmt; require(avail > 0, "Sold out!"); uint256 mAmt = Math.min(amount, avail); require(mAmt > 0, "Sold out!"); uint256 tCost = mAmt * price; require(msg.value >= tCost, "Not enough ETH sent"); mintedAmt += mAmt; minted[msg.sender] += mAmt; _safeMint(msg.sender, mAmt); uint256 d = msg.value - tCost; if (d != 0) { Address.sendValue(payable(msg.sender), d); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bWL","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimOGApe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claimWLApe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"maxPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWLMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootOG","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRootWL","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintApe","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedOGAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedWLAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"u","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"b","type":"bool"}],"name":"setWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setWLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"}],"name":"setmaxPerWLMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setmerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"data","type":"bytes32"}],"name":"setmerkleRootWL","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":"token","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526658d15e1762800060085566753d533d9680006009556000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055506001600a60026101000a81548160ff0219169083151502179055506000600b556000600c556000600d556005600e556002600f556040518060200160405280600081525060159080519060200190620000ab9291906200024e565b50348015620000b957600080fd5b506040518060400160405280600881526020017f5072696d617065730000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f5052494d4150455300000000000000000000000000000000000000000000000081525081600190805190602001906200013e9291906200024e565b508060029080519060200190620001579291906200024e565b5050506200017a6200016e6200018060201b60201c565b6200018860201b60201c565b62000363565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025c906200032d565b90600052602060002090601f016020900481019282620002805760008555620002cc565b82601f106200029b57805160ff1916838001178555620002cc565b82800160010185558215620002cc579182015b82811115620002cb578251825591602001919060010190620002ae565b5b509050620002db9190620002df565b5090565b5b80821115620002fa576000816000905550600101620002e0565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034657607f821691505b602082108114156200035d576200035c620002fe565b5b50919050565b615c0b80620003736000396000f3fe6080604052600436106102e45760003560e01c806389cfa36411610190578063c87b56dd116100dc578063e985e9c511610095578063fa29be8b1161006f578063fa29be8b14610b2c578063ff260b5914610b57578063ff4bd12414610b94578063ff91b28f14610bbd576102e4565b8063e985e9c514610a9d578063f2fde38b14610ada578063f6a5b8e614610b03576102e4565b8063c87b56dd1461099a578063d5abeb01146109d7578063d6492d8114610a02578063db3923d114610a2d578063dc279d3c14610a56578063dfc5f93014610a72576102e4565b8063a035b1fe11610149578063ad055c5811610123578063ad055c58146108f2578063ad6cb3191461091d578063b88d4fde14610948578063bd986a2c14610971576102e4565b8063a035b1fe14610882578063a22cb465146108ad578063a723533e146108d6576102e4565b806389cfa364146107845780638da5cb5b146107af57806391b7f5ed146107da57806395d89b41146108035780639aa5d57f1461082e5780639b68a6c614610859576102e4565b8063375a069a1161024f578063507e094f116102085780636352211e116101e25780636352211e146106b657806370a08231146106f3578063715018a6146107305780638462151c14610747576102e4565b8063507e094f1461063957806355f804b3146106645780635cbcec4e1461068d576102e4565b8063375a069a1461052d5780633ccfd60b146105565780634097aa391461056d57806342842e0e146105aa5780634f6ccce7146105d35780634ff0f9cb14610610576102e4565b806318160ddd116102a157806318160ddd1461040b5780631adb068a146104365780631e7269c51461046157806323b872dd1461049e5780632f745c59146104c75780633001ed4314610504576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806311319b1e146103b757806316c38b3c146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613dea565b610be8565b60405161031d9190613e32565b60405180910390f35b34801561033257600080fd5b5061033b610d32565b6040516103489190613ee6565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613f3e565b610dc4565b6040516103859190613fac565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613ff3565b610e49565b005b3480156103c357600080fd5b506103cc610f62565b6040516103d99190613e32565b60405180910390f35b3480156103ee57600080fd5b506104096004803603810190610404919061405f565b610f75565b005b34801561041757600080fd5b5061042061100e565b60405161042d919061409b565b60405180910390f35b34801561044257600080fd5b5061044b611017565b604051610458919061409b565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906140b6565b61101d565b604051610495919061409b565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c091906140e3565b611035565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613ff3565b611045565b6040516104fb919061409b565b60405180910390f35b34801561051057600080fd5b5061052b6004803603810190610526919061419b565b611237565b005b34801561053957600080fd5b50610554600480360381019061054f9190613f3e565b61150b565b005b34801561056257600080fd5b5061056b6116c7565b005b34801561057957600080fd5b50610594600480360381019061058f91906140b6565b611755565b6040516105a1919061409b565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc91906140e3565b61176d565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613f3e565b61178d565b604051610607919061409b565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613f3e565b6117e0565b005b34801561064557600080fd5b5061064e611866565b60405161065b919061409b565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190614318565b61186c565b005b34801561069957600080fd5b506106b460048036038101906106af919061405f565b611902565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613f3e565b61199b565b6040516106ea9190613fac565b60405180910390f35b3480156106ff57600080fd5b5061071a600480360381019061071591906140b6565b6119b1565b604051610727919061409b565b60405180910390f35b34801561073c57600080fd5b50610745611a9a565b005b34801561075357600080fd5b5061076e600480360381019061076991906140b6565b611b22565b60405161077b919061441f565b60405180910390f35b34801561079057600080fd5b50610799611c2c565b6040516107a6919061409b565b60405180910390f35b3480156107bb57600080fd5b506107c4611c32565b6040516107d19190613fac565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613f3e565b611c5c565b005b34801561080f57600080fd5b50610818611ce2565b6040516108259190613ee6565b60405180910390f35b34801561083a57600080fd5b50610843611d74565b6040516108509190613e32565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613f3e565b611d87565b005b34801561088e57600080fd5b50610897611e0d565b6040516108a4919061409b565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190614441565b611e13565b005b6108f060048036038101906108eb9190613f3e565b611f94565b005b3480156108fe57600080fd5b50610907612232565b604051610914919061409b565b60405180910390f35b34801561092957600080fd5b50610932612238565b60405161093f919061449a565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190614556565b61223e565b005b34801561097d57600080fd5b506109986004803603810190610993919061405f565b61229a565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190613f3e565b612333565b6040516109ce9190613ee6565b60405180910390f35b3480156109e357600080fd5b506109ec6123c9565b6040516109f9919061409b565b60405180910390f35b348015610a0e57600080fd5b50610a176123cf565b604051610a24919061449a565b60405180910390f35b348015610a3957600080fd5b50610a546004803603810190610a4f9190614605565b6123d5565b005b610a706004803603810190610a6b9190614632565b61245b565b005b348015610a7e57600080fd5b50610a8761288c565b604051610a94919061409b565b60405180910390f35b348015610aa957600080fd5b50610ac46004803603810190610abf9190614692565b612892565b604051610ad19190613e32565b60405180910390f35b348015610ae657600080fd5b50610b016004803603810190610afc91906140b6565b612926565b005b348015610b0f57600080fd5b50610b2a6004803603810190610b259190613f3e565b612a1e565b005b348015610b3857600080fd5b50610b41612aa4565b604051610b4e9190613e32565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b7991906140b6565b612ab7565b604051610b8b919061409b565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614605565b612acf565b005b348015610bc957600080fd5b50610bd2612b55565b604051610bdf919061409b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d2b5750610d2a82612b5b565b5b9050919050565b606060018054610d4190614701565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6d90614701565b8015610dba5780601f10610d8f57610100808354040283529160200191610dba565b820191906000526020600020905b815481529060010190602001808311610d9d57829003601f168201915b5050505050905090565b6000610dcf82612bc5565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906147a5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e548261199b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90614837565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ee4612bd2565b73ffffffffffffffffffffffffffffffffffffffff161480610f135750610f1281610f0d612bd2565b612892565b5b610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f49906148c9565b60405180910390fd5b610f5d838383612bda565b505050565b600a60029054906101000a900460ff1681565b610f7d612bd2565b73ffffffffffffffffffffffffffffffffffffffff16610f9b611c32565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890614935565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b60008054905090565b600d5481565b60106020528060005260406000206000915090505481565b611040838383612c8c565b505050565b6000611050836119b1565b8210611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906149c7565b60405180910390fd5b600061109b61100e565b905060008060005b838110156111f5576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111e757868414156111de578195505050505050611231565b83806001019450505b5080806001019150506110a3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614a59565b60405180910390fd5b92915050565b600a60029054906101000a900460ff1615611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90614ac5565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614b31565b60405180910390fd5b60003360405160200161131c9190614b99565b604051602081830303815290604052805190602001209050611382838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836131cc565b6113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614c00565b60405180910390fd5b6000600d54600c54600b54610d056113d99190614c4f565b6113e39190614c4f565b6113ed9190614c4f565b905060008111611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614ccf565b60405180910390fd5b6001600b60008282546114459190614cef565b925050819055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149c9190614cef565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f39190614cef565b925050819055506115053360016131e3565b50505050565b611513612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611531611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614935565b60405180910390fd5b6000600d54600c54600b54610d0561159f9190614c4f565b6115a99190614c4f565b6115b39190614c4f565b9050600081116115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614ccf565b60405180910390fd5b60006116048383613201565b905060008111611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614ccf565b60405180910390fd5b80600d600082825461165b9190614cef565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b19190614cef565b925050819055506116c233826131e3565b505050565b6116cf612bd2565b73ffffffffffffffffffffffffffffffffffffffff166116ed611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614935565b60405180910390fd5b6000479050611752338261321a565b50565b60126020528060005260406000206000915090505481565b6117888383836040518060200160405280600081525061223e565b505050565b600061179761100e565b82106117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614db7565b60405180910390fd5b819050919050565b6117e8612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611806611c32565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390614935565b60405180910390fd5b80600f8190555050565b600e5481565b611874612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611892611c32565b73ffffffffffffffffffffffffffffffffffffffff16146118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df90614935565b60405180910390fd5b80601590805190602001906118fe929190613ca1565b5050565b61190a612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611928611c32565b73ffffffffffffffffffffffffffffffffffffffff161461197e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197590614935565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60006119a68261330e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1990614e49565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611aa2612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611ac0611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90614935565b60405180910390fd5b611b2060006134a8565b565b60606000611b2f836119b1565b90506000811415611b8c57600067ffffffffffffffff811115611b5557611b546141ed565b5b604051908082528060200260200182016040528015611b835781602001602082028036833780820191505090505b50915050611c27565b60008167ffffffffffffffff811115611ba857611ba76141ed565b5b604051908082528060200260200182016040528015611bd65781602001602082028036833780820191505090505b50905060005b82811015611c2057611bee8582611045565b828281518110611c0157611c00614e69565b5b6020026020010181815250508080611c1890614e98565b915050611bdc565b8193505050505b919050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c64612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611c82611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614935565b60405180910390fd5b8060098190555050565b606060028054611cf190614701565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1d90614701565b8015611d6a5780601f10611d3f57610100808354040283529160200191611d6a565b820191906000526020600020905b815481529060010190602001808311611d4d57829003601f168201915b5050505050905090565b600a60019054906101000a900460ff1681565b611d8f612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611dad611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90614935565b60405180910390fd5b80600e8190555050565b60095481565b611e1b612bd2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090614f2d565b60405180910390fd5b8060066000611e96612bd2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f43612bd2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f889190613e32565b60405180910390a35050565b600a60029054906101000a900460ff1615611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614f99565b60405180910390fd5b600a60019054906101000a900460ff16612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90615005565b60405180910390fd5b600e54811115612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90615071565b60405180910390fd5b6000600d54600c54600b54610d056120909190614c4f565b61209a9190614c4f565b6120a49190614c4f565b9050600081116120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090614ccf565b60405180910390fd5b60006120f58383613201565b90506000811161213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614ccf565b60405180910390fd5b60006009548261214a9190615091565b90508034101561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690615137565b60405180910390fd5b81600d60008282546121a19190614cef565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f79190614cef565b9250508190555061220833836131e3565b600081346122169190614c4f565b90506000811461222b5761222a338261321a565b5b5050505050565b600f5481565b60145481565b612249848484612c8c565b6122558484848461356e565b612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b906151c9565b60405180910390fd5b50505050565b6122a2612bd2565b73ffffffffffffffffffffffffffffffffffffffff166122c0611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614935565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b60606000821015801561234c575061234961100e565b82105b61238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290615235565b60405180910390fd5b60156123a260018461239d9190614cef565b613705565b6040516020016123b3929190615325565b6040516020818303038152906040529050919050565b610d0581565b60135481565b6123dd612bd2565b73ffffffffffffffffffffffffffffffffffffffff166123fb611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614935565b60405180910390fd5b8060148190555050565b600a60029054906101000a900460ff16156124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614f99565b60405180910390fd5b600a60009054906101000a900460ff166124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190615395565b60405180910390fd5b600f5483111561253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690615071565b60405180910390fd5b6002601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b890615401565b60405180910390fd5b6000336040516020016125d49190614b99565b60405160208183030381529060405280519060200120905061263a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354836131cc565b612679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126709061546d565b60405180910390fd5b6000600d54600c54600b54610d056126919190614c4f565b61269b9190614c4f565b6126a59190614c4f565b9050600081116126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190614ccf565b60405180910390fd5b60006126f68683613201565b90506000811161273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290614ccf565b60405180910390fd5b60006008548261274b9190615091565b905080341015612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790615137565b60405180910390fd5b81600c60008282546127a29190614cef565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f89190614cef565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284e9190614cef565b9250508190555061285f33836131e3565b6000813461286d9190614c4f565b90506000811461288257612881338261321a565b5b5050505050505050565b60085481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61292e612bd2565b73ffffffffffffffffffffffffffffffffffffffff1661294c611c32565b73ffffffffffffffffffffffffffffffffffffffff16146129a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299990614935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a09906154ff565b60405180910390fd5b612a1b816134a8565b50565b612a26612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612a44611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614935565b60405180910390fd5b8060088190555050565b600a60009054906101000a900460ff1681565b60116020528060005260406000206000915090505481565b612ad7612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612af5611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614935565b60405180910390fd5b8060138190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612c978261330e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cbe612bd2565b73ffffffffffffffffffffffffffffffffffffffff161480612d1a5750612ce3612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612d0284610dc4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d365750612d358260000151612d30612bd2565b612892565b5b905080612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f90615591565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190615623565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e51906156b5565b60405180910390fd5b612e678585856001613866565b612e776000848460000151612bda565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561315c576130bb81612bc5565b1561315b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131c5858585600161386c565b5050505050565b6000826131d98584613872565b1490509392505050565b6131fd8282604051806020016040528060008152506138e7565b5050565b60008183106132105781613212565b825b905092915050565b8047101561325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615721565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161328390615772565b60006040518083038185875af1925050503d80600081146132c0576040519150601f19603f3d011682016040523d82523d6000602084013e6132c5565b606091505b5050905080613309576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613300906157f9565b60405180910390fd5b505050565b613316613d27565b61331f82612bc5565b61335e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133559061588b565b60405180910390fd5b60008290505b60008110613467576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134585780925050506134a3565b50808060019003915050613364565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349a9061591d565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061358f8473ffffffffffffffffffffffffffffffffffffffff166138f9565b156136f8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135b8612bd2565b8786866040518563ffffffff1660e01b81526004016135da9493929190615992565b602060405180830381600087803b1580156135f457600080fd5b505af192505050801561362557506040513d601f19601f8201168201806040525081019061362291906159f3565b60015b6136a8573d8060008114613655576040519150601f19603f3d011682016040523d82523d6000602084013e61365a565b606091505b506000815114156136a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613697906151c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136fd565b600190505b949350505050565b6060600082141561374d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613861565b600082905060005b6000821461377f57808061376890614e98565b915050600a826137789190615a4f565b9150613755565b60008167ffffffffffffffff81111561379b5761379a6141ed565b5b6040519080825280601f01601f1916602001820160405280156137cd5781602001600182028036833780820191505090505b5090505b6000851461385a576001826137e69190614c4f565b9150600a856137f59190615a80565b60306138019190614cef565b60f81b81838151811061381757613816614e69565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138539190615a4f565b94506137d1565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156138dc57600085828151811061389957613898614e69565b5b602002602001015190508083116138bb576138b4838261390c565b92506138c8565b6138c5818461390c565b92505b5080806138d490614e98565b91505061387b565b508091505092915050565b6138f48383836001613923565b505050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399090615b23565b60405180910390fd5b60008414156139dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d490615bb5565b60405180910390fd5b6139ea6000868387613866565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613c8457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613c6f57613c2f600088848861356e565b613c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c65906151c9565b60405180910390fd5b5b81806001019250508080600101915050613bb8565b508060008190555050613c9a600086838761386c565b5050505050565b828054613cad90614701565b90600052602060002090601f016020900481019282613ccf5760008555613d16565b82601f10613ce857805160ff1916838001178555613d16565b82800160010185558215613d16579182015b82811115613d15578251825591602001919060010190613cfa565b5b509050613d239190613d61565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613d7a576000816000905550600101613d62565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc781613d92565b8114613dd257600080fd5b50565b600081359050613de481613dbe565b92915050565b600060208284031215613e0057613dff613d88565b5b6000613e0e84828501613dd5565b91505092915050565b60008115159050919050565b613e2c81613e17565b82525050565b6000602082019050613e476000830184613e23565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e87578082015181840152602081019050613e6c565b83811115613e96576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb882613e4d565b613ec28185613e58565b9350613ed2818560208601613e69565b613edb81613e9c565b840191505092915050565b60006020820190508181036000830152613f008184613ead565b905092915050565b6000819050919050565b613f1b81613f08565b8114613f2657600080fd5b50565b600081359050613f3881613f12565b92915050565b600060208284031215613f5457613f53613d88565b5b6000613f6284828501613f29565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f9682613f6b565b9050919050565b613fa681613f8b565b82525050565b6000602082019050613fc16000830184613f9d565b92915050565b613fd081613f8b565b8114613fdb57600080fd5b50565b600081359050613fed81613fc7565b92915050565b6000806040838503121561400a57614009613d88565b5b600061401885828601613fde565b925050602061402985828601613f29565b9150509250929050565b61403c81613e17565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b60006020828403121561407557614074613d88565b5b60006140838482850161404a565b91505092915050565b61409581613f08565b82525050565b60006020820190506140b0600083018461408c565b92915050565b6000602082840312156140cc576140cb613d88565b5b60006140da84828501613fde565b91505092915050565b6000806000606084860312156140fc576140fb613d88565b5b600061410a86828701613fde565b935050602061411b86828701613fde565b925050604061412c86828701613f29565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261415b5761415a614136565b5b8235905067ffffffffffffffff8111156141785761417761413b565b5b60208301915083602082028301111561419457614193614140565b5b9250929050565b600080602083850312156141b2576141b1613d88565b5b600083013567ffffffffffffffff8111156141d0576141cf613d8d565b5b6141dc85828601614145565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422582613e9c565b810181811067ffffffffffffffff82111715614244576142436141ed565b5b80604052505050565b6000614257613d7e565b9050614263828261421c565b919050565b600067ffffffffffffffff821115614283576142826141ed565b5b61428c82613e9c565b9050602081019050919050565b82818337600083830152505050565b60006142bb6142b684614268565b61424d565b9050828152602081018484840111156142d7576142d66141e8565b5b6142e2848285614299565b509392505050565b600082601f8301126142ff576142fe614136565b5b813561430f8482602086016142a8565b91505092915050565b60006020828403121561432e5761432d613d88565b5b600082013567ffffffffffffffff81111561434c5761434b613d8d565b5b614358848285016142ea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61439681613f08565b82525050565b60006143a8838361438d565b60208301905092915050565b6000602082019050919050565b60006143cc82614361565b6143d6818561436c565b93506143e18361437d565b8060005b838110156144125781516143f9888261439c565b9750614404836143b4565b9250506001810190506143e5565b5085935050505092915050565b6000602082019050818103600083015261443981846143c1565b905092915050565b6000806040838503121561445857614457613d88565b5b600061446685828601613fde565b92505060206144778582860161404a565b9150509250929050565b6000819050919050565b61449481614481565b82525050565b60006020820190506144af600083018461448b565b92915050565b600067ffffffffffffffff8211156144d0576144cf6141ed565b5b6144d982613e9c565b9050602081019050919050565b60006144f96144f4846144b5565b61424d565b905082815260208101848484011115614515576145146141e8565b5b614520848285614299565b509392505050565b600082601f83011261453d5761453c614136565b5b813561454d8482602086016144e6565b91505092915050565b600080600080608085870312156145705761456f613d88565b5b600061457e87828801613fde565b945050602061458f87828801613fde565b93505060406145a087828801613f29565b925050606085013567ffffffffffffffff8111156145c1576145c0613d8d565b5b6145cd87828801614528565b91505092959194509250565b6145e281614481565b81146145ed57600080fd5b50565b6000813590506145ff816145d9565b92915050565b60006020828403121561461b5761461a613d88565b5b6000614629848285016145f0565b91505092915050565b60008060006040848603121561464b5761464a613d88565b5b600061465986828701613f29565b935050602084013567ffffffffffffffff81111561467a57614679613d8d565b5b61468686828701614145565b92509250509250925092565b600080604083850312156146a9576146a8613d88565b5b60006146b785828601613fde565b92505060206146c885828601613fde565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061471957607f821691505b6020821081141561472d5761472c6146d2565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061478f602d83613e58565b915061479a82614733565b604082019050919050565b600060208201905081810360008301526147be81614782565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614821602283613e58565b915061482c826147c5565b604082019050919050565b6000602082019050818103600083015261485081614814565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006148b3603983613e58565b91506148be82614857565b604082019050919050565b600060208201905081810360008301526148e2816148a6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061491f602083613e58565b915061492a826148e9565b602082019050919050565b6000602082019050818103600083015261494e81614912565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006149b1602283613e58565b91506149bc82614955565b604082019050919050565b600060208201905081810360008301526149e0816149a4565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614a43602e83613e58565b9150614a4e826149e7565b604082019050919050565b60006020820190508181036000830152614a7281614a36565b9050919050565b7f436f6e7472616374207061757365640000000000000000000000000000000000600082015250565b6000614aaf600f83613e58565b9150614aba82614a79565b602082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f4f472057616c6c6574206c696d69742072656163686564000000000000000000600082015250565b6000614b1b601783613e58565b9150614b2682614ae5565b602082019050919050565b60006020820190508181036000830152614b4a81614b0e565b9050919050565b60008160601b9050919050565b6000614b6982614b51565b9050919050565b6000614b7b82614b5e565b9050919050565b614b93614b8e82613f8b565b614b70565b82525050565b6000614ba58284614b82565b60148201915081905092915050565b7f496e76616c6964204f472070726f6f6600000000000000000000000000000000600082015250565b6000614bea601083613e58565b9150614bf582614bb4565b602082019050919050565b60006020820190508181036000830152614c1981614bdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c5a82613f08565b9150614c6583613f08565b925082821015614c7857614c77614c20565b5b828203905092915050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b6000614cb9600983613e58565b9150614cc482614c83565b602082019050919050565b60006020820190508181036000830152614ce881614cac565b9050919050565b6000614cfa82613f08565b9150614d0583613f08565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3a57614d39614c20565b5b828201905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614da1602383613e58565b9150614dac82614d45565b604082019050919050565b60006020820190508181036000830152614dd081614d94565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614e33602b83613e58565b9150614e3e82614dd7565b604082019050919050565b60006020820190508181036000830152614e6281614e26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ea382613f08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ed657614ed5614c20565b5b600182019050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f17601a83613e58565b9150614f2282614ee1565b602082019050919050565b60006020820190508181036000830152614f4681614f0a565b9050919050565b7f436f6e7472616374207061757365642e00000000000000000000000000000000600082015250565b6000614f83601083613e58565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b7f5075626c6963206d696e7420697320636c6f7365642e00000000000000000000600082015250565b6000614fef601683613e58565b9150614ffa82614fb9565b602082019050919050565b6000602082019050818103600083015261501e81614fe2565b9050919050565b7f4578636565646564206d6178206d696e74207065722074780000000000000000600082015250565b600061505b601883613e58565b915061506682615025565b602082019050919050565b6000602082019050818103600083015261508a8161504e565b9050919050565b600061509c82613f08565b91506150a783613f08565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150e0576150df614c20565b5b828202905092915050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000615121601383613e58565b915061512c826150eb565b602082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006151b3603383613e58565b91506151be82615157565b604082019050919050565b600060208201905081810360008301526151e2816151a6565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061521f601183613e58565b915061522a826151e9565b602082019050919050565b6000602082019050818103600083015261524e81615212565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461528281614701565b61528c8186615255565b945060018216600081146152a757600181146152b8576152eb565b60ff198316865281860193506152eb565b6152c185615260565b60005b838110156152e3578154818901526001820191506020810190506152c4565b838801955050505b50505092915050565b60006152ff82613e4d565b6153098185615255565b9350615319818560208601613e69565b80840191505092915050565b60006153318285615275565b915061533d82846152f4565b91508190509392505050565b7f574c206d696e7420697320636c6f7365642e0000000000000000000000000000600082015250565b600061537f601283613e58565b915061538a82615349565b602082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b7f574c2057616c6c6574206c696d69742072656163686564000000000000000000600082015250565b60006153eb601783613e58565b91506153f6826153b5565b602082019050919050565b6000602082019050818103600083015261541a816153de565b9050919050565b7f496e76616c696420574c2070726f6f6600000000000000000000000000000000600082015250565b6000615457601083613e58565b915061546282615421565b602082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154e9602683613e58565b91506154f48261548d565b604082019050919050565b60006020820190508181036000830152615518816154dc565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061557b603283613e58565b91506155868261551f565b604082019050919050565b600060208201905081810360008301526155aa8161556e565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061560d602683613e58565b9150615618826155b1565b604082019050919050565b6000602082019050818103600083015261563c81615600565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061569f602583613e58565b91506156aa82615643565b604082019050919050565b600060208201905081810360008301526156ce81615692565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061570b601d83613e58565b9150615716826156d5565b602082019050919050565b6000602082019050818103600083015261573a816156fe565b9050919050565b600081905092915050565b50565b600061575c600083615741565b91506157678261574c565b600082019050919050565b600061577d8261574f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006157e3603a83613e58565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615875602a83613e58565b915061588082615819565b604082019050919050565b600060208201905081810360008301526158a481615868565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615907602f83613e58565b9150615912826158ab565b604082019050919050565b60006020820190508181036000830152615936816158fa565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159648261593d565b61596e8185615948565b935061597e818560208601613e69565b61598781613e9c565b840191505092915050565b60006080820190506159a76000830187613f9d565b6159b46020830186613f9d565b6159c1604083018561408c565b81810360608301526159d38184615959565b905095945050505050565b6000815190506159ed81613dbe565b92915050565b600060208284031215615a0957615a08613d88565b5b6000615a17848285016159de565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a5a82613f08565b9150615a6583613f08565b925082615a7557615a74615a20565b5b828204905092915050565b6000615a8b82613f08565b9150615a9683613f08565b925082615aa657615aa5615a20565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b0d602183613e58565b9150615b1882615ab1565b604082019050919050565b60006020820190508181036000830152615b3c81615b00565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615b9f602883613e58565b9150615baa82615b43565b604082019050919050565b60006020820190508181036000830152615bce81615b92565b905091905056fea2646970667358221220e71109be39b394d868371b15413d5ed2fa97a210e683e827d32889ac83317b1364736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102e45760003560e01c806389cfa36411610190578063c87b56dd116100dc578063e985e9c511610095578063fa29be8b1161006f578063fa29be8b14610b2c578063ff260b5914610b57578063ff4bd12414610b94578063ff91b28f14610bbd576102e4565b8063e985e9c514610a9d578063f2fde38b14610ada578063f6a5b8e614610b03576102e4565b8063c87b56dd1461099a578063d5abeb01146109d7578063d6492d8114610a02578063db3923d114610a2d578063dc279d3c14610a56578063dfc5f93014610a72576102e4565b8063a035b1fe11610149578063ad055c5811610123578063ad055c58146108f2578063ad6cb3191461091d578063b88d4fde14610948578063bd986a2c14610971576102e4565b8063a035b1fe14610882578063a22cb465146108ad578063a723533e146108d6576102e4565b806389cfa364146107845780638da5cb5b146107af57806391b7f5ed146107da57806395d89b41146108035780639aa5d57f1461082e5780639b68a6c614610859576102e4565b8063375a069a1161024f578063507e094f116102085780636352211e116101e25780636352211e146106b657806370a08231146106f3578063715018a6146107305780638462151c14610747576102e4565b8063507e094f1461063957806355f804b3146106645780635cbcec4e1461068d576102e4565b8063375a069a1461052d5780633ccfd60b146105565780634097aa391461056d57806342842e0e146105aa5780634f6ccce7146105d35780634ff0f9cb14610610576102e4565b806318160ddd116102a157806318160ddd1461040b5780631adb068a146104365780631e7269c51461046157806323b872dd1461049e5780632f745c59146104c75780633001ed4314610504576102e4565b806301ffc9a7146102e957806306fdde0314610326578063081812fc14610351578063095ea7b31461038e57806311319b1e146103b757806316c38b3c146103e2575b600080fd5b3480156102f557600080fd5b50610310600480360381019061030b9190613dea565b610be8565b60405161031d9190613e32565b60405180910390f35b34801561033257600080fd5b5061033b610d32565b6040516103489190613ee6565b60405180910390f35b34801561035d57600080fd5b5061037860048036038101906103739190613f3e565b610dc4565b6040516103859190613fac565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190613ff3565b610e49565b005b3480156103c357600080fd5b506103cc610f62565b6040516103d99190613e32565b60405180910390f35b3480156103ee57600080fd5b506104096004803603810190610404919061405f565b610f75565b005b34801561041757600080fd5b5061042061100e565b60405161042d919061409b565b60405180910390f35b34801561044257600080fd5b5061044b611017565b604051610458919061409b565b60405180910390f35b34801561046d57600080fd5b50610488600480360381019061048391906140b6565b61101d565b604051610495919061409b565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c091906140e3565b611035565b005b3480156104d357600080fd5b506104ee60048036038101906104e99190613ff3565b611045565b6040516104fb919061409b565b60405180910390f35b34801561051057600080fd5b5061052b6004803603810190610526919061419b565b611237565b005b34801561053957600080fd5b50610554600480360381019061054f9190613f3e565b61150b565b005b34801561056257600080fd5b5061056b6116c7565b005b34801561057957600080fd5b50610594600480360381019061058f91906140b6565b611755565b6040516105a1919061409b565b60405180910390f35b3480156105b657600080fd5b506105d160048036038101906105cc91906140e3565b61176d565b005b3480156105df57600080fd5b506105fa60048036038101906105f59190613f3e565b61178d565b604051610607919061409b565b60405180910390f35b34801561061c57600080fd5b5061063760048036038101906106329190613f3e565b6117e0565b005b34801561064557600080fd5b5061064e611866565b60405161065b919061409b565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190614318565b61186c565b005b34801561069957600080fd5b506106b460048036038101906106af919061405f565b611902565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190613f3e565b61199b565b6040516106ea9190613fac565b60405180910390f35b3480156106ff57600080fd5b5061071a600480360381019061071591906140b6565b6119b1565b604051610727919061409b565b60405180910390f35b34801561073c57600080fd5b50610745611a9a565b005b34801561075357600080fd5b5061076e600480360381019061076991906140b6565b611b22565b60405161077b919061441f565b60405180910390f35b34801561079057600080fd5b50610799611c2c565b6040516107a6919061409b565b60405180910390f35b3480156107bb57600080fd5b506107c4611c32565b6040516107d19190613fac565b60405180910390f35b3480156107e657600080fd5b5061080160048036038101906107fc9190613f3e565b611c5c565b005b34801561080f57600080fd5b50610818611ce2565b6040516108259190613ee6565b60405180910390f35b34801561083a57600080fd5b50610843611d74565b6040516108509190613e32565b60405180910390f35b34801561086557600080fd5b50610880600480360381019061087b9190613f3e565b611d87565b005b34801561088e57600080fd5b50610897611e0d565b6040516108a4919061409b565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190614441565b611e13565b005b6108f060048036038101906108eb9190613f3e565b611f94565b005b3480156108fe57600080fd5b50610907612232565b604051610914919061409b565b60405180910390f35b34801561092957600080fd5b50610932612238565b60405161093f919061449a565b60405180910390f35b34801561095457600080fd5b5061096f600480360381019061096a9190614556565b61223e565b005b34801561097d57600080fd5b506109986004803603810190610993919061405f565b61229a565b005b3480156109a657600080fd5b506109c160048036038101906109bc9190613f3e565b612333565b6040516109ce9190613ee6565b60405180910390f35b3480156109e357600080fd5b506109ec6123c9565b6040516109f9919061409b565b60405180910390f35b348015610a0e57600080fd5b50610a176123cf565b604051610a24919061449a565b60405180910390f35b348015610a3957600080fd5b50610a546004803603810190610a4f9190614605565b6123d5565b005b610a706004803603810190610a6b9190614632565b61245b565b005b348015610a7e57600080fd5b50610a8761288c565b604051610a94919061409b565b60405180910390f35b348015610aa957600080fd5b50610ac46004803603810190610abf9190614692565b612892565b604051610ad19190613e32565b60405180910390f35b348015610ae657600080fd5b50610b016004803603810190610afc91906140b6565b612926565b005b348015610b0f57600080fd5b50610b2a6004803603810190610b259190613f3e565b612a1e565b005b348015610b3857600080fd5b50610b41612aa4565b604051610b4e9190613e32565b60405180910390f35b348015610b6357600080fd5b50610b7e6004803603810190610b7991906140b6565b612ab7565b604051610b8b919061409b565b60405180910390f35b348015610ba057600080fd5b50610bbb6004803603810190610bb69190614605565b612acf565b005b348015610bc957600080fd5b50610bd2612b55565b604051610bdf919061409b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cb357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1b57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d2b5750610d2a82612b5b565b5b9050919050565b606060018054610d4190614701565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6d90614701565b8015610dba5780601f10610d8f57610100808354040283529160200191610dba565b820191906000526020600020905b815481529060010190602001808311610d9d57829003601f168201915b5050505050905090565b6000610dcf82612bc5565b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906147a5565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e548261199b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc90614837565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ee4612bd2565b73ffffffffffffffffffffffffffffffffffffffff161480610f135750610f1281610f0d612bd2565b612892565b5b610f52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f49906148c9565b60405180910390fd5b610f5d838383612bda565b505050565b600a60029054906101000a900460ff1681565b610f7d612bd2565b73ffffffffffffffffffffffffffffffffffffffff16610f9b611c32565b73ffffffffffffffffffffffffffffffffffffffff1614610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890614935565b60405180910390fd5b80600a60026101000a81548160ff02191690831515021790555050565b60008054905090565b600d5481565b60106020528060005260406000206000915090505481565b611040838383612c8c565b505050565b6000611050836119b1565b8210611091576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611088906149c7565b60405180910390fd5b600061109b61100e565b905060008060005b838110156111f5576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119557806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111e757868414156111de578195505050505050611231565b83806001019450505b5080806001019150506110a3565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890614a59565b60405180910390fd5b92915050565b600a60029054906101000a900460ff1615611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90614ac5565b60405180910390fd5b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614b31565b60405180910390fd5b60003360405160200161131c9190614b99565b604051602081830303815290604052805190602001209050611382838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836131cc565b6113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614c00565b60405180910390fd5b6000600d54600c54600b54610d056113d99190614c4f565b6113e39190614c4f565b6113ed9190614c4f565b905060008111611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990614ccf565b60405180910390fd5b6001600b60008282546114459190614cef565b925050819055506001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149c9190614cef565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f39190614cef565b925050819055506115053360016131e3565b50505050565b611513612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611531611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157e90614935565b60405180910390fd5b6000600d54600c54600b54610d0561159f9190614c4f565b6115a99190614c4f565b6115b39190614c4f565b9050600081116115f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ef90614ccf565b60405180910390fd5b60006116048383613201565b905060008111611649576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164090614ccf565b60405180910390fd5b80600d600082825461165b9190614cef565b9250508190555080601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b19190614cef565b925050819055506116c233826131e3565b505050565b6116cf612bd2565b73ffffffffffffffffffffffffffffffffffffffff166116ed611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614935565b60405180910390fd5b6000479050611752338261321a565b50565b60126020528060005260406000206000915090505481565b6117888383836040518060200160405280600081525061223e565b505050565b600061179761100e565b82106117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90614db7565b60405180910390fd5b819050919050565b6117e8612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611806611c32565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185390614935565b60405180910390fd5b80600f8190555050565b600e5481565b611874612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611892611c32565b73ffffffffffffffffffffffffffffffffffffffff16146118e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118df90614935565b60405180910390fd5b80601590805190602001906118fe929190613ca1565b5050565b61190a612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611928611c32565b73ffffffffffffffffffffffffffffffffffffffff161461197e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197590614935565b60405180910390fd5b80600a60016101000a81548160ff02191690831515021790555050565b60006119a68261330e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1990614e49565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611aa2612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611ac0611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0d90614935565b60405180910390fd5b611b2060006134a8565b565b60606000611b2f836119b1565b90506000811415611b8c57600067ffffffffffffffff811115611b5557611b546141ed565b5b604051908082528060200260200182016040528015611b835781602001602082028036833780820191505090505b50915050611c27565b60008167ffffffffffffffff811115611ba857611ba76141ed565b5b604051908082528060200260200182016040528015611bd65781602001602082028036833780820191505090505b50905060005b82811015611c2057611bee8582611045565b828281518110611c0157611c00614e69565b5b6020026020010181815250508080611c1890614e98565b915050611bdc565b8193505050505b919050565b600c5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c64612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611c82611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf90614935565b60405180910390fd5b8060098190555050565b606060028054611cf190614701565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1d90614701565b8015611d6a5780601f10611d3f57610100808354040283529160200191611d6a565b820191906000526020600020905b815481529060010190602001808311611d4d57829003601f168201915b5050505050905090565b600a60019054906101000a900460ff1681565b611d8f612bd2565b73ffffffffffffffffffffffffffffffffffffffff16611dad611c32565b73ffffffffffffffffffffffffffffffffffffffff1614611e03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfa90614935565b60405180910390fd5b80600e8190555050565b60095481565b611e1b612bd2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090614f2d565b60405180910390fd5b8060066000611e96612bd2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611f43612bd2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f889190613e32565b60405180910390a35050565b600a60029054906101000a900460ff1615611fe4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdb90614f99565b60405180910390fd5b600a60019054906101000a900460ff16612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202a90615005565b60405180910390fd5b600e54811115612078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206f90615071565b60405180910390fd5b6000600d54600c54600b54610d056120909190614c4f565b61209a9190614c4f565b6120a49190614c4f565b9050600081116120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090614ccf565b60405180910390fd5b60006120f58383613201565b90506000811161213a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213190614ccf565b60405180910390fd5b60006009548261214a9190615091565b90508034101561218f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218690615137565b60405180910390fd5b81600d60008282546121a19190614cef565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121f79190614cef565b9250508190555061220833836131e3565b600081346122169190614c4f565b90506000811461222b5761222a338261321a565b5b5050505050565b600f5481565b60145481565b612249848484612c8c565b6122558484848461356e565b612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b906151c9565b60405180910390fd5b50505050565b6122a2612bd2565b73ffffffffffffffffffffffffffffffffffffffff166122c0611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230d90614935565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b60606000821015801561234c575061234961100e565b82105b61238b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238290615235565b60405180910390fd5b60156123a260018461239d9190614cef565b613705565b6040516020016123b3929190615325565b6040516020818303038152906040529050919050565b610d0581565b60135481565b6123dd612bd2565b73ffffffffffffffffffffffffffffffffffffffff166123fb611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244890614935565b60405180910390fd5b8060148190555050565b600a60029054906101000a900460ff16156124ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a290614f99565b60405180910390fd5b600a60009054906101000a900460ff166124fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f190615395565b60405180910390fd5b600f5483111561253f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253690615071565b60405180910390fd5b6002601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106125c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b890615401565b60405180910390fd5b6000336040516020016125d49190614b99565b60405160208183030381529060405280519060200120905061263a838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601354836131cc565b612679576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126709061546d565b60405180910390fd5b6000600d54600c54600b54610d056126919190614c4f565b61269b9190614c4f565b6126a59190614c4f565b9050600081116126ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e190614ccf565b60405180910390fd5b60006126f68683613201565b90506000811161273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290614ccf565b60405180910390fd5b60006008548261274b9190615091565b905080341015612790576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278790615137565b60405180910390fd5b81600c60008282546127a29190614cef565b9250508190555081601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127f89190614cef565b9250508190555081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461284e9190614cef565b9250508190555061285f33836131e3565b6000813461286d9190614c4f565b90506000811461288257612881338261321a565b5b5050505050505050565b60085481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61292e612bd2565b73ffffffffffffffffffffffffffffffffffffffff1661294c611c32565b73ffffffffffffffffffffffffffffffffffffffff16146129a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299990614935565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a09906154ff565b60405180910390fd5b612a1b816134a8565b50565b612a26612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612a44611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9190614935565b60405180910390fd5b8060088190555050565b600a60009054906101000a900460ff1681565b60116020528060005260406000206000915090505481565b612ad7612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612af5611c32565b73ffffffffffffffffffffffffffffffffffffffff1614612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614935565b60405180910390fd5b8060138190555050565b600b5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000612c978261330e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612cbe612bd2565b73ffffffffffffffffffffffffffffffffffffffff161480612d1a5750612ce3612bd2565b73ffffffffffffffffffffffffffffffffffffffff16612d0284610dc4565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d365750612d358260000151612d30612bd2565b612892565b5b905080612d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6f90615591565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190615623565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e51906156b5565b60405180910390fd5b612e678585856001613866565b612e776000848460000151612bda565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561315c576130bb81612bc5565b1561315b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131c5858585600161386c565b5050505050565b6000826131d98584613872565b1490509392505050565b6131fd8282604051806020016040528060008152506138e7565b5050565b60008183106132105781613212565b825b905092915050565b8047101561325d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325490615721565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161328390615772565b60006040518083038185875af1925050503d80600081146132c0576040519150601f19603f3d011682016040523d82523d6000602084013e6132c5565b606091505b5050905080613309576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613300906157f9565b60405180910390fd5b505050565b613316613d27565b61331f82612bc5565b61335e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133559061588b565b60405180910390fd5b60008290505b60008110613467576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146134585780925050506134a3565b50808060019003915050613364565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349a9061591d565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061358f8473ffffffffffffffffffffffffffffffffffffffff166138f9565b156136f8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135b8612bd2565b8786866040518563ffffffff1660e01b81526004016135da9493929190615992565b602060405180830381600087803b1580156135f457600080fd5b505af192505050801561362557506040513d601f19601f8201168201806040525081019061362291906159f3565b60015b6136a8573d8060008114613655576040519150601f19603f3d011682016040523d82523d6000602084013e61365a565b606091505b506000815114156136a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613697906151c9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136fd565b600190505b949350505050565b6060600082141561374d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613861565b600082905060005b6000821461377f57808061376890614e98565b915050600a826137789190615a4f565b9150613755565b60008167ffffffffffffffff81111561379b5761379a6141ed565b5b6040519080825280601f01601f1916602001820160405280156137cd5781602001600182028036833780820191505090505b5090505b6000851461385a576001826137e69190614c4f565b9150600a856137f59190615a80565b60306138019190614cef565b60f81b81838151811061381757613816614e69565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138539190615a4f565b94506137d1565b8093505050505b919050565b50505050565b50505050565b60008082905060005b84518110156138dc57600085828151811061389957613898614e69565b5b602002602001015190508083116138bb576138b4838261390c565b92506138c8565b6138c5818461390c565b92505b5080806138d490614e98565b91505061387b565b508091505092915050565b6138f48383836001613923565b505050565b600080823b905060008111915050919050565b600082600052816020526040600020905092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399090615b23565b60405180910390fd5b60008414156139dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d490615bb5565b60405180910390fd5b6139ea6000868387613866565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015613c8457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315613c6f57613c2f600088848861356e565b613c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c65906151c9565b60405180910390fd5b5b81806001019250508080600101915050613bb8565b508060008190555050613c9a600086838761386c565b5050505050565b828054613cad90614701565b90600052602060002090601f016020900481019282613ccf5760008555613d16565b82601f10613ce857805160ff1916838001178555613d16565b82800160010185558215613d16579182015b82811115613d15578251825591602001919060010190613cfa565b5b509050613d239190613d61565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b80821115613d7a576000816000905550600101613d62565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613dc781613d92565b8114613dd257600080fd5b50565b600081359050613de481613dbe565b92915050565b600060208284031215613e0057613dff613d88565b5b6000613e0e84828501613dd5565b91505092915050565b60008115159050919050565b613e2c81613e17565b82525050565b6000602082019050613e476000830184613e23565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613e87578082015181840152602081019050613e6c565b83811115613e96576000848401525b50505050565b6000601f19601f8301169050919050565b6000613eb882613e4d565b613ec28185613e58565b9350613ed2818560208601613e69565b613edb81613e9c565b840191505092915050565b60006020820190508181036000830152613f008184613ead565b905092915050565b6000819050919050565b613f1b81613f08565b8114613f2657600080fd5b50565b600081359050613f3881613f12565b92915050565b600060208284031215613f5457613f53613d88565b5b6000613f6284828501613f29565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613f9682613f6b565b9050919050565b613fa681613f8b565b82525050565b6000602082019050613fc16000830184613f9d565b92915050565b613fd081613f8b565b8114613fdb57600080fd5b50565b600081359050613fed81613fc7565b92915050565b6000806040838503121561400a57614009613d88565b5b600061401885828601613fde565b925050602061402985828601613f29565b9150509250929050565b61403c81613e17565b811461404757600080fd5b50565b60008135905061405981614033565b92915050565b60006020828403121561407557614074613d88565b5b60006140838482850161404a565b91505092915050565b61409581613f08565b82525050565b60006020820190506140b0600083018461408c565b92915050565b6000602082840312156140cc576140cb613d88565b5b60006140da84828501613fde565b91505092915050565b6000806000606084860312156140fc576140fb613d88565b5b600061410a86828701613fde565b935050602061411b86828701613fde565b925050604061412c86828701613f29565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261415b5761415a614136565b5b8235905067ffffffffffffffff8111156141785761417761413b565b5b60208301915083602082028301111561419457614193614140565b5b9250929050565b600080602083850312156141b2576141b1613d88565b5b600083013567ffffffffffffffff8111156141d0576141cf613d8d565b5b6141dc85828601614145565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61422582613e9c565b810181811067ffffffffffffffff82111715614244576142436141ed565b5b80604052505050565b6000614257613d7e565b9050614263828261421c565b919050565b600067ffffffffffffffff821115614283576142826141ed565b5b61428c82613e9c565b9050602081019050919050565b82818337600083830152505050565b60006142bb6142b684614268565b61424d565b9050828152602081018484840111156142d7576142d66141e8565b5b6142e2848285614299565b509392505050565b600082601f8301126142ff576142fe614136565b5b813561430f8482602086016142a8565b91505092915050565b60006020828403121561432e5761432d613d88565b5b600082013567ffffffffffffffff81111561434c5761434b613d8d565b5b614358848285016142ea565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61439681613f08565b82525050565b60006143a8838361438d565b60208301905092915050565b6000602082019050919050565b60006143cc82614361565b6143d6818561436c565b93506143e18361437d565b8060005b838110156144125781516143f9888261439c565b9750614404836143b4565b9250506001810190506143e5565b5085935050505092915050565b6000602082019050818103600083015261443981846143c1565b905092915050565b6000806040838503121561445857614457613d88565b5b600061446685828601613fde565b92505060206144778582860161404a565b9150509250929050565b6000819050919050565b61449481614481565b82525050565b60006020820190506144af600083018461448b565b92915050565b600067ffffffffffffffff8211156144d0576144cf6141ed565b5b6144d982613e9c565b9050602081019050919050565b60006144f96144f4846144b5565b61424d565b905082815260208101848484011115614515576145146141e8565b5b614520848285614299565b509392505050565b600082601f83011261453d5761453c614136565b5b813561454d8482602086016144e6565b91505092915050565b600080600080608085870312156145705761456f613d88565b5b600061457e87828801613fde565b945050602061458f87828801613fde565b93505060406145a087828801613f29565b925050606085013567ffffffffffffffff8111156145c1576145c0613d8d565b5b6145cd87828801614528565b91505092959194509250565b6145e281614481565b81146145ed57600080fd5b50565b6000813590506145ff816145d9565b92915050565b60006020828403121561461b5761461a613d88565b5b6000614629848285016145f0565b91505092915050565b60008060006040848603121561464b5761464a613d88565b5b600061465986828701613f29565b935050602084013567ffffffffffffffff81111561467a57614679613d8d565b5b61468686828701614145565b92509250509250925092565b600080604083850312156146a9576146a8613d88565b5b60006146b785828601613fde565b92505060206146c885828601613fde565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061471957607f821691505b6020821081141561472d5761472c6146d2565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061478f602d83613e58565b915061479a82614733565b604082019050919050565b600060208201905081810360008301526147be81614782565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614821602283613e58565b915061482c826147c5565b604082019050919050565b6000602082019050818103600083015261485081614814565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006148b3603983613e58565b91506148be82614857565b604082019050919050565b600060208201905081810360008301526148e2816148a6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061491f602083613e58565b915061492a826148e9565b602082019050919050565b6000602082019050818103600083015261494e81614912565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b60006149b1602283613e58565b91506149bc82614955565b604082019050919050565b600060208201905081810360008301526149e0816149a4565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000614a43602e83613e58565b9150614a4e826149e7565b604082019050919050565b60006020820190508181036000830152614a7281614a36565b9050919050565b7f436f6e7472616374207061757365640000000000000000000000000000000000600082015250565b6000614aaf600f83613e58565b9150614aba82614a79565b602082019050919050565b60006020820190508181036000830152614ade81614aa2565b9050919050565b7f4f472057616c6c6574206c696d69742072656163686564000000000000000000600082015250565b6000614b1b601783613e58565b9150614b2682614ae5565b602082019050919050565b60006020820190508181036000830152614b4a81614b0e565b9050919050565b60008160601b9050919050565b6000614b6982614b51565b9050919050565b6000614b7b82614b5e565b9050919050565b614b93614b8e82613f8b565b614b70565b82525050565b6000614ba58284614b82565b60148201915081905092915050565b7f496e76616c6964204f472070726f6f6600000000000000000000000000000000600082015250565b6000614bea601083613e58565b9150614bf582614bb4565b602082019050919050565b60006020820190508181036000830152614c1981614bdd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c5a82613f08565b9150614c6583613f08565b925082821015614c7857614c77614c20565b5b828203905092915050565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b6000614cb9600983613e58565b9150614cc482614c83565b602082019050919050565b60006020820190508181036000830152614ce881614cac565b9050919050565b6000614cfa82613f08565b9150614d0583613f08565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d3a57614d39614c20565b5b828201905092915050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614da1602383613e58565b9150614dac82614d45565b604082019050919050565b60006020820190508181036000830152614dd081614d94565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614e33602b83613e58565b9150614e3e82614dd7565b604082019050919050565b60006020820190508181036000830152614e6281614e26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614ea382613f08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614ed657614ed5614c20565b5b600182019050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614f17601a83613e58565b9150614f2282614ee1565b602082019050919050565b60006020820190508181036000830152614f4681614f0a565b9050919050565b7f436f6e7472616374207061757365642e00000000000000000000000000000000600082015250565b6000614f83601083613e58565b9150614f8e82614f4d565b602082019050919050565b60006020820190508181036000830152614fb281614f76565b9050919050565b7f5075626c6963206d696e7420697320636c6f7365642e00000000000000000000600082015250565b6000614fef601683613e58565b9150614ffa82614fb9565b602082019050919050565b6000602082019050818103600083015261501e81614fe2565b9050919050565b7f4578636565646564206d6178206d696e74207065722074780000000000000000600082015250565b600061505b601883613e58565b915061506682615025565b602082019050919050565b6000602082019050818103600083015261508a8161504e565b9050919050565b600061509c82613f08565b91506150a783613f08565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150e0576150df614c20565b5b828202905092915050565b7f4e6f7420656e6f756768204554482073656e7400000000000000000000000000600082015250565b6000615121601383613e58565b915061512c826150eb565b602082019050919050565b6000602082019050818103600083015261515081615114565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b60006151b3603383613e58565b91506151be82615157565b604082019050919050565b600060208201905081810360008301526151e2816151a6565b9050919050565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b600061521f601183613e58565b915061522a826151e9565b602082019050919050565b6000602082019050818103600083015261524e81615212565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461528281614701565b61528c8186615255565b945060018216600081146152a757600181146152b8576152eb565b60ff198316865281860193506152eb565b6152c185615260565b60005b838110156152e3578154818901526001820191506020810190506152c4565b838801955050505b50505092915050565b60006152ff82613e4d565b6153098185615255565b9350615319818560208601613e69565b80840191505092915050565b60006153318285615275565b915061533d82846152f4565b91508190509392505050565b7f574c206d696e7420697320636c6f7365642e0000000000000000000000000000600082015250565b600061537f601283613e58565b915061538a82615349565b602082019050919050565b600060208201905081810360008301526153ae81615372565b9050919050565b7f574c2057616c6c6574206c696d69742072656163686564000000000000000000600082015250565b60006153eb601783613e58565b91506153f6826153b5565b602082019050919050565b6000602082019050818103600083015261541a816153de565b9050919050565b7f496e76616c696420574c2070726f6f6600000000000000000000000000000000600082015250565b6000615457601083613e58565b915061546282615421565b602082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006154e9602683613e58565b91506154f48261548d565b604082019050919050565b60006020820190508181036000830152615518816154dc565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b600061557b603283613e58565b91506155868261551f565b604082019050919050565b600060208201905081810360008301526155aa8161556e565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b600061560d602683613e58565b9150615618826155b1565b604082019050919050565b6000602082019050818103600083015261563c81615600565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061569f602583613e58565b91506156aa82615643565b604082019050919050565b600060208201905081810360008301526156ce81615692565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061570b601d83613e58565b9150615716826156d5565b602082019050919050565b6000602082019050818103600083015261573a816156fe565b9050919050565b600081905092915050565b50565b600061575c600083615741565b91506157678261574c565b600082019050919050565b600061577d8261574f565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006157e3603a83613e58565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000615875602a83613e58565b915061588082615819565b604082019050919050565b600060208201905081810360008301526158a481615868565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000615907602f83613e58565b9150615912826158ab565b604082019050919050565b60006020820190508181036000830152615936816158fa565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006159648261593d565b61596e8185615948565b935061597e818560208601613e69565b61598781613e9c565b840191505092915050565b60006080820190506159a76000830187613f9d565b6159b46020830186613f9d565b6159c1604083018561408c565b81810360608301526159d38184615959565b905095945050505050565b6000815190506159ed81613dbe565b92915050565b600060208284031215615a0957615a08613d88565b5b6000615a17848285016159de565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615a5a82613f08565b9150615a6583613f08565b925082615a7557615a74615a20565b5b828204905092915050565b6000615a8b82613f08565b9150615a9683613f08565b925082615aa657615aa5615a20565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b0d602183613e58565b9150615b1882615ab1565b604082019050919050565b60006020820190508181036000830152615b3c81615b00565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615b9f602883613e58565b9150615baa82615b43565b604082019050919050565b60006020820190508181036000830152615bce81615b92565b905091905056fea2646970667358221220e71109be39b394d868371b15413d5ed2fa97a210e683e827d32889ac83317b1364736f6c63430008090033
Deployed ByteCode Sourcemap
37044:5626:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25808:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27331:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28417:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27996:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37318:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37851:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24490:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37427:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37540:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29107:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24793:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40181:602;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39291:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38920:155;;;;;;;;;;;;;:::i;:::-;;37638:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29277:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24598:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38610:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37464:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38708:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37935:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27199:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26188:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22299:103;;;;;;;;;;;;;:::i;:::-;;39671:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37390:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22076:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38344:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27439:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37286:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38516:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37213:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28639:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41891:776;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37500:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37724:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29462:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38017:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38093:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37121:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37690:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39187:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40791:1088;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37170:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28935:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22410:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38428:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37256:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37588:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39083:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37353:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25808:372;25910:4;25962:25;25947:40;;;:11;:40;;;;:105;;;;26019:33;26004:48;;;:11;:48;;;;25947:105;:172;;;;26084:35;26069:50;;;:11;:50;;;;25947:172;:225;;;;26136:36;26160:11;26136:23;:36::i;:::-;25947:225;25927:245;;25808:372;;;:::o;27331:100::-;27385:13;27418:5;27411:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27331:100;:::o;28417:214::-;28485:7;28513:16;28521:7;28513;:16::i;:::-;28505:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28599:15;:24;28615:7;28599:24;;;;;;;;;;;;;;;;;;;;;28592:31;;28417:214;;;:::o;27996:413::-;28069:13;28085:24;28101:7;28085:15;:24::i;:::-;28069:40;;28134:5;28128:11;;:2;:11;;;;28120:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28229:5;28213:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28238:37;28255:5;28262:12;:10;:12::i;:::-;28238:16;:37::i;:::-;28213:62;28191:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;28373:28;28382:2;28386:7;28395:5;28373:8;:28::i;:::-;28058:351;27996:413;;:::o;37318:26::-;;;;;;;;;;;;;:::o;37851:76::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37918:1:::1;37908:7;;:11;;;;;;;;;;;;;;;;;;37851:76:::0;:::o;24490:100::-;24543:7;24570:12;;24563:19;;24490:100;:::o;37427:28::-;;;;:::o;37540:41::-;;;;;;;;;;;;;;;;;:::o;29107:162::-;29233:28;29243:4;29249:2;29253:7;29233:9;:28::i;:::-;29107:162;;;:::o;24793:1007::-;24882:7;24918:16;24928:5;24918:9;:16::i;:::-;24910:5;:24;24902:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24984:22;25009:13;:11;:13::i;:::-;24984:38;;25033:19;25063:25;25252:9;25247:466;25267:14;25263:1;:18;25247:466;;;25307:31;25341:11;:14;25353:1;25341:14;;;;;;;;;;;25307:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25404:1;25378:28;;:9;:14;;;:28;;;25374:111;;25451:9;:14;;;25431:34;;25374:111;25528:5;25507:26;;:17;:26;;;25503:195;;;25577:5;25562:11;:20;25558:85;;;25618:1;25611:8;;;;;;;;;25558:85;25665:13;;;;;;;25503:195;25288:425;25283:3;;;;;;;25247:466;;;;25736:56;;;;;;;;;;:::i;:::-;;;;;;;;24793:1007;;;;;:::o;40181:602::-;40262:7;;;;;;;;;;;40261:8;40253:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40331:1;40308:8;:20;40317:10;40308:20;;;;;;;;;;;;;;;;:24;40300:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40373:12;40415:10;40398:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;40388:39;;;;;;40373:54;;40446:51;40465:11;;40446:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40478:12;;40492:4;40446:18;:51::i;:::-;40438:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;40531:13;40587:9;;40573:11;;40559;;37157:4;40547:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;40531:65;;40623:1;40615:5;:9;40607:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;40667:1;40652:11;;:16;;;;;;;:::i;:::-;;;;;;;;40703:1;40679:8;:20;40688:10;40679:20;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;40737:1;40715:6;:18;40722:10;40715:18;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;40751:24;40761:10;40773:1;40751:9;:24::i;:::-;40242:541;;40181:602;;:::o;39291:372::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39351:13:::1;39407:9;;39393:11;;39379;;37157:4;39367:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;39351:65;;39443:1;39435:5;:9;39427:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;39471:12;39486:23;39495:6;39503:5;39486:8;:23::i;:::-;39471:38;;39535:1;39528:4;:8;39520:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;39576:4;39563:9;;:17;;;;;;;:::i;:::-;;;;;;;;39613:4;39591:6;:18;39598:10;39591:18;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;39628:27;39638:10;39650:4;39628:9;:27::i;:::-;39340:323;;39291:372:::0;:::o;38920:155::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38970:15:::1;38988:21;38970:39;;39020:47;39046:10;39059:7;39020:17;:47::i;:::-;38959:116;38920:155::o:0;37638:43::-;;;;;;;;;;;;;;;;;:::o;29277:177::-;29407:39;29424:4;29430:2;29434:7;29407:39;;;;;;;;;;;;:16;:39::i;:::-;29277:177;;;:::o;24598:187::-;24665:7;24701:13;:11;:13::i;:::-;24693:5;:21;24685:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24772:5;24765:12;;24598:187;;;:::o;38610:90::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38691:1:::1;38676:12;:16;;;;38610:90:::0;:::o;37464:29::-;;;;:::o;38708:87::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38786:1:::1;38775:8;:12;;;;;;;;;;;;:::i;:::-;;38708:87:::0;:::o;37935:74::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38000:1:::1;37992:5;;:9;;;;;;;;;;;;;;;;;;37935:74:::0;:::o;27199:124::-;27263:7;27290:20;27302:7;27290:11;:20::i;:::-;:25;;;27283:32;;27199:124;;;:::o;26188:221::-;26252:7;26297:1;26280:19;;:5;:19;;;;26272:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26373:12;:19;26386:5;26373:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26365:36;;26358:43;;26188:221;;;:::o;22299:103::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22364:30:::1;22391:1;22364:18;:30::i;:::-;22299:103::o:0;39671:502::-;39733:16;39762:18;39783:17;39793:6;39783:9;:17::i;:::-;39762:38;;39829:1;39815:10;:15;39811:355;;;39868:1;39854:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39847:23;;;;;39811:355;39903:23;39943:10;39929:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39903:51;;39969:13;39997:130;40021:10;40013:5;:18;39997:130;;;40077:34;40097:6;40105:5;40077:19;:34::i;:::-;40061:6;40068:5;40061:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;40033:7;;;;;:::i;:::-;;;;39997:130;;;40148:6;40141:13;;;;;39671:502;;;;:::o;37390:30::-;;;;:::o;22076:87::-;22122:7;22149:6;;;;;;;;;;;22142:13;;22076:87;:::o;38344:76::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38411:1:::1;38403:5;:9;;;;38344:76:::0;:::o;27439:104::-;27495:13;27528:7;27521:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27439:104;:::o;37286:25::-;;;;;;;;;;;;;:::o;38516:86::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38593:1:::1;38580:10;:14;;;;38516:86:::0;:::o;37213:34::-;;;;:::o;28639:288::-;28746:12;:10;:12::i;:::-;28734:24;;:8;:24;;;;28726:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;28847:8;28802:18;:32;28821:12;:10;:12::i;:::-;28802:32;;;;;;;;;;;;;;;:42;28835:8;28802:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28900:8;28871:48;;28886:12;:10;:12::i;:::-;28871:48;;;28910:8;28871:48;;;;;;:::i;:::-;;;;;;;;28639:288;;:::o;41891:776::-;41958:7;;;;;;;;;;;41957:8;41949:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;42005:5;;;;;;;;;;;41997:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;42066:10;;42056:6;:20;;42048:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;42118:13;42174:9;;42160:11;;42146;;37157:4;42134:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;42118:65;;42210:1;42202:5;:9;42194:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;42238:12;42253:23;42262:6;42270:5;42253:8;:23::i;:::-;42238:38;;42302:1;42295:4;:8;42287:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;42328:13;42351:5;;42344:4;:12;;;;:::i;:::-;42328:28;;42388:5;42375:9;:18;;42367:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;42444:4;42431:9;;:17;;;;;;;:::i;:::-;;;;;;;;42481:4;42459:6;:18;42466:10;42459:18;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;42498:27;42508:10;42520:4;42498:9;:27::i;:::-;42538:9;42562:5;42550:9;:17;;;;:::i;:::-;42538:29;;42587:1;42582;:6;42578:80;;42605:41;42631:10;42644:1;42605:17;:41::i;:::-;42578:80;41938:729;;;;41891:776;:::o;37500:31::-;;;;:::o;37724:27::-;;;;:::o;29462:355::-;29621:28;29631:4;29637:2;29641:7;29621:9;:28::i;:::-;29682:48;29705:4;29711:2;29715:7;29724:5;29682:22;:48::i;:::-;29660:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;29462:355;;;;:::o;38017:68::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38076:1:::1;38070:3;;:7;;;;;;;;;;;;;;;;;;38017:68:::0;:::o;38093:243::-;38164:13;38207:1;38198:5;:10;;:35;;;;;38220:13;:11;:13::i;:::-;38212:5;:21;38198:35;38190:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;38296:8;38306:20;38313:1;38307:5;:7;;;;:::i;:::-;38306:18;:20::i;:::-;38279:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38265:63;;38093:243;;;:::o;37121:40::-;37157:4;37121:40;:::o;37690:27::-;;;;:::o;39187:96::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39271:4:::1;39256:12;:19;;;;39187:96:::0;:::o;40791:1088::-;40896:7;;;;;;;;;;;40895:8;40887:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;40943:3;;;;;;;;;;;40935:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;40998:12;;40988:6;:22;;40980:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;41081:1;41058:8;:20;41067:10;41058:20;;;;;;;;;;;;;;;;:24;41050:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41131:12;41173:10;41156:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;41146:39;;;;;;41131:54;;41204:51;41223:11;;41204:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41236:12;;41250:4;41204:18;:51::i;:::-;41196:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;41289:13;41345:9;;41331:11;;41317;;37157:4;41305:23;;;;:::i;:::-;:37;;;;:::i;:::-;:49;;;;:::i;:::-;41289:65;;41381:1;41373:5;:9;41365:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;41409:12;41424:23;41433:6;41441:5;41424:8;:23::i;:::-;41409:38;;41473:1;41466:4;:8;41458:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;41499:13;41522:7;;41515:4;:14;;;;:::i;:::-;41499:30;;41561:5;41548:9;:18;;41540:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;41619:4;41604:11;;:19;;;;;;;:::i;:::-;;;;;;;;41658:4;41634:8;:20;41643:10;41634:20;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;41695:4;41673:6;:18;41680:10;41673:18;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;41712:27;41722:10;41734:4;41712:9;:27::i;:::-;41752:9;41776:5;41764:9;:17;;;;:::i;:::-;41752:29;;41801:1;41796;:6;41792:80;;41819:41;41845:10;41858:1;41819:17;:41::i;:::-;41792:80;40876:1003;;;;;40791:1088;;;:::o;37170:36::-;;;;:::o;28935:164::-;29032:4;29056:18;:25;29075:5;29056:25;;;;;;;;;;;;;;;:35;29082:8;29056:35;;;;;;;;;;;;;;;;;;;;;;;;;29049:42;;28935:164;;;;:::o;22410:201::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22519:1:::1;22499:22;;:8;:22;;;;22491:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22575:28;22594:8;22575:18;:28::i;:::-;22410:201:::0;:::o;38428:80::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38499:1:::1;38489:7;:11;;;;38428:80:::0;:::o;37256:23::-;;;;;;;;;;;;;:::o;37588:43::-;;;;;;;;;;;;;;;;;:::o;39083:96::-;22222:12;:10;:12::i;:::-;22211:23;;:7;:5;:7::i;:::-;:23;;;22203:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39167:4:::1;39152:12;:19;;;;39083:96:::0;:::o;37353:30::-;;;;:::o;1645:157::-;1730:4;1769:25;1754:40;;;:11;:40;;;;1747:47;;1645:157;;;:::o;29825:111::-;29882:4;29916:12;;29906:7;:22;29899:29;;29825:111;;;:::o;4442:98::-;4495:7;4522:10;4515:17;;4442:98;:::o;33783:196::-;33925:2;33898:15;:24;33914:7;33898:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33963:7;33959:2;33943:28;;33952:5;33943:28;;;;;;;;;;;;33783:196;;;:::o;31773:2002::-;31888:35;31926:20;31938:7;31926:11;:20::i;:::-;31888:58;;31959:22;32001:13;:18;;;31985:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;32060:12;:10;:12::i;:::-;32036:36;;:20;32048:7;32036:11;:20::i;:::-;:36;;;31985:87;:154;;;;32089:50;32106:13;:18;;;32126:12;:10;:12::i;:::-;32089:16;:50::i;:::-;31985:154;31959:181;;32161:17;32153:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;32276:4;32254:26;;:13;:18;;;:26;;;32246:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;32356:1;32342:16;;:2;:16;;;;32334:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32413:43;32435:4;32441:2;32445:7;32454:1;32413:21;:43::i;:::-;32521:49;32538:1;32542:7;32551:13;:18;;;32521:8;:49::i;:::-;32896:1;32866:12;:18;32879:4;32866:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32940:1;32912:12;:16;32925:2;32912:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32986:2;32958:11;:20;32970:7;32958:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;33048:15;33003:11;:20;33015:7;33003:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;33316:19;33348:1;33338:7;:11;33316:33;;33409:1;33368:43;;:11;:24;33380:11;33368:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;33364:295;;;33436:20;33444:11;33436:7;:20::i;:::-;33432:212;;;33513:13;:18;;;33481:11;:24;33493:11;33481:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;33596:13;:28;;;33554:11;:24;33566:11;33554:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;33432:212;33364:295;32841:829;33706:7;33702:2;33687:27;;33696:4;33687:27;;;;;;;;;;;;33725:42;33746:4;33752:2;33756:7;33765:1;33725:20;:42::i;:::-;31877:1898;;31773:2002;;;:::o;35578:190::-;35703:4;35756;35727:25;35740:5;35747:4;35727:12;:25::i;:::-;:33;35720:40;;35578:190;;;;;:::o;29944:104::-;30013:27;30023:2;30027:8;30013:27;;;;;;;;;;;;:9;:27::i;:::-;29944:104;;:::o;20482:106::-;20540:7;20571:1;20567;:5;:13;;20579:1;20567:13;;;20575:1;20567:13;20560:20;;20482:106;;;;:::o;6713:317::-;6828:6;6803:21;:31;;6795:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6882:12;6900:9;:14;;6922:6;6900:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6881:52;;;6952:7;6944:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;6784:246;6713:317;;:::o;26654:537::-;26715:21;;:::i;:::-;26757:16;26765:7;26757;:16::i;:::-;26749:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26863:12;26878:7;26863:22;;26858:245;26895:1;26887:4;:9;26858:245;;26925:31;26959:11;:17;26971:4;26959:17;;;;;;;;;;;26925:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27025:1;26999:28;;:9;:14;;;:28;;;26995:93;;27059:9;27052:16;;;;;;26995:93;26906:197;26898:6;;;;;;;;26858:245;;;;27126:57;;;;;;;;;;:::i;:::-;;;;;;;;26654:537;;;;:::o;22619:191::-;22693:16;22712:6;;;;;;;;;;;22693:25;;22738:8;22729:6;;:17;;;;;;;;;;;;;;;;;;22793:8;22762:40;;22783:8;22762:40;;;;;;;;;;;;22682:128;22619:191;:::o;33987:804::-;34142:4;34163:15;:2;:13;;;:15::i;:::-;34159:625;;;34215:2;34199:36;;;34236:12;:10;:12::i;:::-;34250:4;34256:7;34265:5;34199:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34195:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34462:1;34445:6;:13;:18;34441:273;;;34488:61;;;;;;;;;;:::i;:::-;;;;;;;;34441:273;34664:6;34658:13;34649:6;34645:2;34641:15;34634:38;34195:534;34332:45;;;34322:55;;;:6;:55;;;;34315:62;;;;;34159:625;34768:4;34761:11;;33987:804;;;;;;;:::o;2089:723::-;2145:13;2375:1;2366:5;:10;2362:53;;;2393:10;;;;;;;;;;;;;;;;;;;;;2362:53;2425:12;2440:5;2425:20;;2456:14;2481:78;2496:1;2488:4;:9;2481:78;;2514:8;;;;;:::i;:::-;;;;2545:2;2537:10;;;;;:::i;:::-;;;2481:78;;;2569:19;2601:6;2591:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2569:39;;2619:154;2635:1;2626:5;:10;2619:154;;2663:1;2653:11;;;;;:::i;:::-;;;2730:2;2722:5;:10;;;;:::i;:::-;2709:2;:24;;;;:::i;:::-;2696:39;;2679:6;2686;2679:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2759:2;2750:11;;;;;:::i;:::-;;;2619:154;;;2797:6;2783:21;;;;;2089:723;;;;:::o;34799:159::-;;;;;:::o;34966:158::-;;;;;:::o;36130:675::-;36213:7;36233:20;36256:4;36233:27;;36276:9;36271:497;36295:5;:12;36291:1;:16;36271:497;;;36329:20;36352:5;36358:1;36352:8;;;;;;;;:::i;:::-;;;;;;;;36329:31;;36395:12;36379;:28;36375:382;;36522:42;36537:12;36551;36522:14;:42::i;:::-;36507:57;;36375:382;;;36699:42;36714:12;36728;36699:14;:42::i;:::-;36684:57;;36375:382;36314:454;36309:3;;;;;:::i;:::-;;;;36271:497;;;;36785:12;36778:19;;;36130:675;;;;:::o;30056:163::-;30179:32;30185:2;30189:8;30199:5;30206:4;30179:5;:32::i;:::-;30056:163;;;:::o;5391:387::-;5451:4;5659:12;5726:7;5714:20;5706:28;;5769:1;5762:4;:8;5755:15;;;5391:387;;;:::o;36813:224::-;36881:13;36944:1;36938:4;36931:15;36973:1;36967:4;36960:15;37014:4;37008;36998:21;36989:30;;36813:224;;;;:::o;30227:1538::-;30366:20;30389:12;;30366:35;;30434:1;30420:16;;:2;:16;;;;30412:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30505:1;30493:8;:13;;30485:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;30564:61;30594:1;30598:2;30602:12;30616:8;30564:21;:61::i;:::-;30939:8;30903:12;:16;30916:2;30903:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31004:8;30963:12;:16;30976:2;30963:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31063:2;31030:11;:25;31042:12;31030:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31130:15;31080:11;:25;31092:12;31080:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;31163:20;31186:12;31163:35;;31220:9;31215:415;31235:8;31231:1;:12;31215:415;;;31299:12;31295:2;31274:38;;31291:1;31274:38;;;;;;;;;;;;31335:4;31331:249;;;31398:59;31429:1;31433:2;31437:12;31451:5;31398:22;:59::i;:::-;31364:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;31331:249;31600:14;;;;;;;31245:3;;;;;;;31215:415;;;;31661:12;31646;:27;;;;30878:807;31697:60;31726:1;31730:2;31734:12;31748:8;31697:20;:60::i;:::-;30355:1410;30227:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:116::-;5008:21;5023:5;5008:21;:::i;:::-;5001:5;4998:32;4988:60;;5044:1;5041;5034:12;4988:60;4938:116;:::o;5060:133::-;5103:5;5141:6;5128:20;5119:29;;5157:30;5181:5;5157:30;:::i;:::-;5060:133;;;;:::o;5199:323::-;5255:6;5304:2;5292:9;5283:7;5279:23;5275:32;5272:119;;;5310:79;;:::i;:::-;5272:119;5430:1;5455:50;5497:7;5488:6;5477:9;5473:22;5455:50;:::i;:::-;5445:60;;5401:114;5199:323;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:329::-;5939:6;5988:2;5976:9;5967:7;5963:23;5959:32;5956:119;;;5994:79;;:::i;:::-;5956:119;6114:1;6139:53;6184:7;6175:6;6164:9;6160:22;6139:53;:::i;:::-;6129:63;;6085:117;5880:329;;;;:::o;6215:619::-;6292:6;6300;6308;6357:2;6345:9;6336:7;6332:23;6328:32;6325:119;;;6363:79;;:::i;:::-;6325:119;6483:1;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6454:117;6610:2;6636:53;6681:7;6672:6;6661:9;6657:22;6636:53;:::i;:::-;6626:63;;6581:118;6738:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6709:118;6215:619;;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:117;7072:1;7069;7062:12;7086:117;7195:1;7192;7185:12;7226:568;7299:8;7309:6;7359:3;7352:4;7344:6;7340:17;7336:27;7326:122;;7367:79;;:::i;:::-;7326:122;7480:6;7467:20;7457:30;;7510:18;7502:6;7499:30;7496:117;;;7532:79;;:::i;:::-;7496:117;7646:4;7638:6;7634:17;7622:29;;7700:3;7692:4;7684:6;7680:17;7670:8;7666:32;7663:41;7660:128;;;7707:79;;:::i;:::-;7660:128;7226:568;;;;;:::o;7800:559::-;7886:6;7894;7943:2;7931:9;7922:7;7918:23;7914:32;7911:119;;;7949:79;;:::i;:::-;7911:119;8097:1;8086:9;8082:17;8069:31;8127:18;8119:6;8116:30;8113:117;;;8149:79;;:::i;:::-;8113:117;8262:80;8334:7;8325:6;8314:9;8310:22;8262:80;:::i;:::-;8244:98;;;;8040:312;7800:559;;;;;:::o;8365:117::-;8474:1;8471;8464:12;8488:180;8536:77;8533:1;8526:88;8633:4;8630:1;8623:15;8657:4;8654:1;8647:15;8674:281;8757:27;8779:4;8757:27;:::i;:::-;8749:6;8745:40;8887:6;8875:10;8872:22;8851:18;8839:10;8836:34;8833:62;8830:88;;;8898:18;;:::i;:::-;8830:88;8938:10;8934:2;8927:22;8717:238;8674:281;;:::o;8961:129::-;8995:6;9022:20;;:::i;:::-;9012:30;;9051:33;9079:4;9071:6;9051:33;:::i;:::-;8961:129;;;:::o;9096:308::-;9158:4;9248:18;9240:6;9237:30;9234:56;;;9270:18;;:::i;:::-;9234:56;9308:29;9330:6;9308:29;:::i;:::-;9300:37;;9392:4;9386;9382:15;9374:23;;9096:308;;;:::o;9410:154::-;9494:6;9489:3;9484;9471:30;9556:1;9547:6;9542:3;9538:16;9531:27;9410:154;;;:::o;9570:412::-;9648:5;9673:66;9689:49;9731:6;9689:49;:::i;:::-;9673:66;:::i;:::-;9664:75;;9762:6;9755:5;9748:21;9800:4;9793:5;9789:16;9838:3;9829:6;9824:3;9820:16;9817:25;9814:112;;;9845:79;;:::i;:::-;9814:112;9935:41;9969:6;9964:3;9959;9935:41;:::i;:::-;9654:328;9570:412;;;;;:::o;10002:340::-;10058:5;10107:3;10100:4;10092:6;10088:17;10084:27;10074:122;;10115:79;;:::i;:::-;10074:122;10232:6;10219:20;10257:79;10332:3;10324:6;10317:4;10309:6;10305:17;10257:79;:::i;:::-;10248:88;;10064:278;10002:340;;;;:::o;10348:509::-;10417:6;10466:2;10454:9;10445:7;10441:23;10437:32;10434:119;;;10472:79;;:::i;:::-;10434:119;10620:1;10609:9;10605:17;10592:31;10650:18;10642:6;10639:30;10636:117;;;10672:79;;:::i;:::-;10636:117;10777:63;10832:7;10823:6;10812:9;10808:22;10777:63;:::i;:::-;10767:73;;10563:287;10348:509;;;;:::o;10863:114::-;10930:6;10964:5;10958:12;10948:22;;10863:114;;;:::o;10983:184::-;11082:11;11116:6;11111:3;11104:19;11156:4;11151:3;11147:14;11132:29;;10983:184;;;;:::o;11173:132::-;11240:4;11263:3;11255:11;;11293:4;11288:3;11284:14;11276:22;;11173:132;;;:::o;11311:108::-;11388:24;11406:5;11388:24;:::i;:::-;11383:3;11376:37;11311:108;;:::o;11425:179::-;11494:10;11515:46;11557:3;11549:6;11515:46;:::i;:::-;11593:4;11588:3;11584:14;11570:28;;11425:179;;;;:::o;11610:113::-;11680:4;11712;11707:3;11703:14;11695:22;;11610:113;;;:::o;11759:732::-;11878:3;11907:54;11955:5;11907:54;:::i;:::-;11977:86;12056:6;12051:3;11977:86;:::i;:::-;11970:93;;12087:56;12137:5;12087:56;:::i;:::-;12166:7;12197:1;12182:284;12207:6;12204:1;12201:13;12182:284;;;12283:6;12277:13;12310:63;12369:3;12354:13;12310:63;:::i;:::-;12303:70;;12396:60;12449:6;12396:60;:::i;:::-;12386:70;;12242:224;12229:1;12226;12222:9;12217:14;;12182:284;;;12186:14;12482:3;12475:10;;11883:608;;;11759:732;;;;:::o;12497:373::-;12640:4;12678:2;12667:9;12663:18;12655:26;;12727:9;12721:4;12717:20;12713:1;12702:9;12698:17;12691:47;12755:108;12858:4;12849:6;12755:108;:::i;:::-;12747:116;;12497:373;;;;:::o;12876:468::-;12941:6;12949;12998:2;12986:9;12977:7;12973:23;12969:32;12966:119;;;13004:79;;:::i;:::-;12966:119;13124:1;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13095:117;13251:2;13277:50;13319:7;13310:6;13299:9;13295:22;13277:50;:::i;:::-;13267:60;;13222:115;12876:468;;;;;:::o;13350:77::-;13387:7;13416:5;13405:16;;13350:77;;;:::o;13433:118::-;13520:24;13538:5;13520:24;:::i;:::-;13515:3;13508:37;13433:118;;:::o;13557:222::-;13650:4;13688:2;13677:9;13673:18;13665:26;;13701:71;13769:1;13758:9;13754:17;13745:6;13701:71;:::i;:::-;13557:222;;;;:::o;13785:307::-;13846:4;13936:18;13928:6;13925:30;13922:56;;;13958:18;;:::i;:::-;13922:56;13996:29;14018:6;13996:29;:::i;:::-;13988:37;;14080:4;14074;14070:15;14062:23;;13785:307;;;:::o;14098:410::-;14175:5;14200:65;14216:48;14257:6;14216:48;:::i;:::-;14200:65;:::i;:::-;14191:74;;14288:6;14281:5;14274:21;14326:4;14319:5;14315:16;14364:3;14355:6;14350:3;14346:16;14343:25;14340:112;;;14371:79;;:::i;:::-;14340:112;14461:41;14495:6;14490:3;14485;14461:41;:::i;:::-;14181:327;14098:410;;;;;:::o;14527:338::-;14582:5;14631:3;14624:4;14616:6;14612:17;14608:27;14598:122;;14639:79;;:::i;:::-;14598:122;14756:6;14743:20;14781:78;14855:3;14847:6;14840:4;14832:6;14828:17;14781:78;:::i;:::-;14772:87;;14588:277;14527:338;;;;:::o;14871:943::-;14966:6;14974;14982;14990;15039:3;15027:9;15018:7;15014:23;15010:33;15007:120;;;15046:79;;:::i;:::-;15007:120;15166:1;15191:53;15236:7;15227:6;15216:9;15212:22;15191:53;:::i;:::-;15181:63;;15137:117;15293:2;15319:53;15364:7;15355:6;15344:9;15340:22;15319:53;:::i;:::-;15309:63;;15264:118;15421:2;15447:53;15492:7;15483:6;15472:9;15468:22;15447:53;:::i;:::-;15437:63;;15392:118;15577:2;15566:9;15562:18;15549:32;15608:18;15600:6;15597:30;15594:117;;;15630:79;;:::i;:::-;15594:117;15735:62;15789:7;15780:6;15769:9;15765:22;15735:62;:::i;:::-;15725:72;;15520:287;14871:943;;;;;;;:::o;15820:122::-;15893:24;15911:5;15893:24;:::i;:::-;15886:5;15883:35;15873:63;;15932:1;15929;15922:12;15873:63;15820:122;:::o;15948:139::-;15994:5;16032:6;16019:20;16010:29;;16048:33;16075:5;16048:33;:::i;:::-;15948:139;;;;:::o;16093:329::-;16152:6;16201:2;16189:9;16180:7;16176:23;16172:32;16169:119;;;16207:79;;:::i;:::-;16169:119;16327:1;16352:53;16397:7;16388:6;16377:9;16373:22;16352:53;:::i;:::-;16342:63;;16298:117;16093:329;;;;:::o;16428:704::-;16523:6;16531;16539;16588:2;16576:9;16567:7;16563:23;16559:32;16556:119;;;16594:79;;:::i;:::-;16556:119;16714:1;16739:53;16784:7;16775:6;16764:9;16760:22;16739:53;:::i;:::-;16729:63;;16685:117;16869:2;16858:9;16854:18;16841:32;16900:18;16892:6;16889:30;16886:117;;;16922:79;;:::i;:::-;16886:117;17035:80;17107:7;17098:6;17087:9;17083:22;17035:80;:::i;:::-;17017:98;;;;16812:313;16428:704;;;;;:::o;17138:474::-;17206:6;17214;17263:2;17251:9;17242:7;17238:23;17234:32;17231:119;;;17269:79;;:::i;:::-;17231:119;17389:1;17414:53;17459:7;17450:6;17439:9;17435:22;17414:53;:::i;:::-;17404:63;;17360:117;17516:2;17542:53;17587:7;17578:6;17567:9;17563:22;17542:53;:::i;:::-;17532:63;;17487:118;17138:474;;;;;:::o;17618:180::-;17666:77;17663:1;17656:88;17763:4;17760:1;17753:15;17787:4;17784:1;17777:15;17804:320;17848:6;17885:1;17879:4;17875:12;17865:22;;17932:1;17926:4;17922:12;17953:18;17943:81;;18009:4;18001:6;17997:17;17987:27;;17943:81;18071:2;18063:6;18060:14;18040:18;18037:38;18034:84;;;18090:18;;:::i;:::-;18034:84;17855:269;17804:320;;;:::o;18130:232::-;18270:34;18266:1;18258:6;18254:14;18247:58;18339:15;18334:2;18326:6;18322:15;18315:40;18130:232;:::o;18368:366::-;18510:3;18531:67;18595:2;18590:3;18531:67;:::i;:::-;18524:74;;18607:93;18696:3;18607:93;:::i;:::-;18725:2;18720:3;18716:12;18709:19;;18368:366;;;:::o;18740:419::-;18906:4;18944:2;18933:9;18929:18;18921:26;;18993:9;18987:4;18983:20;18979:1;18968:9;18964:17;18957:47;19021:131;19147:4;19021:131;:::i;:::-;19013:139;;18740:419;;;:::o;19165:221::-;19305:34;19301:1;19293:6;19289:14;19282:58;19374:4;19369:2;19361:6;19357:15;19350:29;19165:221;:::o;19392:366::-;19534:3;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19631:93;19720:3;19631:93;:::i;:::-;19749:2;19744:3;19740:12;19733:19;;19392:366;;;:::o;19764:419::-;19930:4;19968:2;19957:9;19953:18;19945:26;;20017:9;20011:4;20007:20;20003:1;19992:9;19988:17;19981:47;20045:131;20171:4;20045:131;:::i;:::-;20037:139;;19764:419;;;:::o;20189:244::-;20329:34;20325:1;20317:6;20313:14;20306:58;20398:27;20393:2;20385:6;20381:15;20374:52;20189:244;:::o;20439:366::-;20581:3;20602:67;20666:2;20661:3;20602:67;:::i;:::-;20595:74;;20678:93;20767:3;20678:93;:::i;:::-;20796:2;20791:3;20787:12;20780:19;;20439:366;;;:::o;20811:419::-;20977:4;21015:2;21004:9;21000:18;20992:26;;21064:9;21058:4;21054:20;21050:1;21039:9;21035:17;21028:47;21092:131;21218:4;21092:131;:::i;:::-;21084:139;;20811:419;;;:::o;21236:182::-;21376:34;21372:1;21364:6;21360:14;21353:58;21236:182;:::o;21424:366::-;21566:3;21587:67;21651:2;21646:3;21587:67;:::i;:::-;21580:74;;21663:93;21752:3;21663:93;:::i;:::-;21781:2;21776:3;21772:12;21765:19;;21424:366;;;:::o;21796:419::-;21962:4;22000:2;21989:9;21985:18;21977:26;;22049:9;22043:4;22039:20;22035:1;22024:9;22020:17;22013:47;22077:131;22203:4;22077:131;:::i;:::-;22069:139;;21796:419;;;:::o;22221:221::-;22361:34;22357:1;22349:6;22345:14;22338:58;22430:4;22425:2;22417:6;22413:15;22406:29;22221:221;:::o;22448:366::-;22590:3;22611:67;22675:2;22670:3;22611:67;:::i;:::-;22604:74;;22687:93;22776:3;22687:93;:::i;:::-;22805:2;22800:3;22796:12;22789:19;;22448:366;;;:::o;22820:419::-;22986:4;23024:2;23013:9;23009:18;23001:26;;23073:9;23067:4;23063:20;23059:1;23048:9;23044:17;23037:47;23101:131;23227:4;23101:131;:::i;:::-;23093:139;;22820:419;;;:::o;23245:233::-;23385:34;23381:1;23373:6;23369:14;23362:58;23454:16;23449:2;23441:6;23437:15;23430:41;23245:233;:::o;23484:366::-;23626:3;23647:67;23711:2;23706:3;23647:67;:::i;:::-;23640:74;;23723:93;23812:3;23723:93;:::i;:::-;23841:2;23836:3;23832:12;23825:19;;23484:366;;;:::o;23856:419::-;24022:4;24060:2;24049:9;24045:18;24037:26;;24109:9;24103:4;24099:20;24095:1;24084:9;24080:17;24073:47;24137:131;24263:4;24137:131;:::i;:::-;24129:139;;23856:419;;;:::o;24281:165::-;24421:17;24417:1;24409:6;24405:14;24398:41;24281:165;:::o;24452:366::-;24594:3;24615:67;24679:2;24674:3;24615:67;:::i;:::-;24608:74;;24691:93;24780:3;24691:93;:::i;:::-;24809:2;24804:3;24800:12;24793:19;;24452:366;;;:::o;24824:419::-;24990:4;25028:2;25017:9;25013:18;25005:26;;25077:9;25071:4;25067:20;25063:1;25052:9;25048:17;25041:47;25105:131;25231:4;25105:131;:::i;:::-;25097:139;;24824:419;;;:::o;25249:173::-;25389:25;25385:1;25377:6;25373:14;25366:49;25249:173;:::o;25428:366::-;25570:3;25591:67;25655:2;25650:3;25591:67;:::i;:::-;25584:74;;25667:93;25756:3;25667:93;:::i;:::-;25785:2;25780:3;25776:12;25769:19;;25428:366;;;:::o;25800:419::-;25966:4;26004:2;25993:9;25989:18;25981:26;;26053:9;26047:4;26043:20;26039:1;26028:9;26024:17;26017:47;26081:131;26207:4;26081:131;:::i;:::-;26073:139;;25800:419;;;:::o;26225:94::-;26258:8;26306:5;26302:2;26298:14;26277:35;;26225:94;;;:::o;26325:::-;26364:7;26393:20;26407:5;26393:20;:::i;:::-;26382:31;;26325:94;;;:::o;26425:100::-;26464:7;26493:26;26513:5;26493:26;:::i;:::-;26482:37;;26425:100;;;:::o;26531:157::-;26636:45;26656:24;26674:5;26656:24;:::i;:::-;26636:45;:::i;:::-;26631:3;26624:58;26531:157;;:::o;26694:256::-;26806:3;26821:75;26892:3;26883:6;26821:75;:::i;:::-;26921:2;26916:3;26912:12;26905:19;;26941:3;26934:10;;26694:256;;;;:::o;26956:166::-;27096:18;27092:1;27084:6;27080:14;27073:42;26956:166;:::o;27128:366::-;27270:3;27291:67;27355:2;27350:3;27291:67;:::i;:::-;27284:74;;27367:93;27456:3;27367:93;:::i;:::-;27485:2;27480:3;27476:12;27469:19;;27128:366;;;:::o;27500:419::-;27666:4;27704:2;27693:9;27689:18;27681:26;;27753:9;27747:4;27743:20;27739:1;27728:9;27724:17;27717:47;27781:131;27907:4;27781:131;:::i;:::-;27773:139;;27500:419;;;:::o;27925:180::-;27973:77;27970:1;27963:88;28070:4;28067:1;28060:15;28094:4;28091:1;28084:15;28111:191;28151:4;28171:20;28189:1;28171:20;:::i;:::-;28166:25;;28205:20;28223:1;28205:20;:::i;:::-;28200:25;;28244:1;28241;28238:8;28235:34;;;28249:18;;:::i;:::-;28235:34;28294:1;28291;28287:9;28279:17;;28111:191;;;;:::o;28308:159::-;28448:11;28444:1;28436:6;28432:14;28425:35;28308:159;:::o;28473:365::-;28615:3;28636:66;28700:1;28695:3;28636:66;:::i;:::-;28629:73;;28711:93;28800:3;28711:93;:::i;:::-;28829:2;28824:3;28820:12;28813:19;;28473:365;;;:::o;28844:419::-;29010:4;29048:2;29037:9;29033:18;29025:26;;29097:9;29091:4;29087:20;29083:1;29072:9;29068:17;29061:47;29125:131;29251:4;29125:131;:::i;:::-;29117:139;;28844:419;;;:::o;29269:305::-;29309:3;29328:20;29346:1;29328:20;:::i;:::-;29323:25;;29362:20;29380:1;29362:20;:::i;:::-;29357:25;;29516:1;29448:66;29444:74;29441:1;29438:81;29435:107;;;29522:18;;:::i;:::-;29435:107;29566:1;29563;29559:9;29552:16;;29269:305;;;;:::o;29580:222::-;29720:34;29716:1;29708:6;29704:14;29697:58;29789:5;29784:2;29776:6;29772:15;29765:30;29580:222;:::o;29808:366::-;29950:3;29971:67;30035:2;30030:3;29971:67;:::i;:::-;29964:74;;30047:93;30136:3;30047:93;:::i;:::-;30165:2;30160:3;30156:12;30149:19;;29808:366;;;:::o;30180:419::-;30346:4;30384:2;30373:9;30369:18;30361:26;;30433:9;30427:4;30423:20;30419:1;30408:9;30404:17;30397:47;30461:131;30587:4;30461:131;:::i;:::-;30453:139;;30180:419;;;:::o;30605:230::-;30745:34;30741:1;30733:6;30729:14;30722:58;30814:13;30809:2;30801:6;30797:15;30790:38;30605:230;:::o;30841:366::-;30983:3;31004:67;31068:2;31063:3;31004:67;:::i;:::-;30997:74;;31080:93;31169:3;31080:93;:::i;:::-;31198:2;31193:3;31189:12;31182:19;;30841:366;;;:::o;31213:419::-;31379:4;31417:2;31406:9;31402:18;31394:26;;31466:9;31460:4;31456:20;31452:1;31441:9;31437:17;31430:47;31494:131;31620:4;31494:131;:::i;:::-;31486:139;;31213:419;;;:::o;31638:180::-;31686:77;31683:1;31676:88;31783:4;31780:1;31773:15;31807:4;31804:1;31797:15;31824:233;31863:3;31886:24;31904:5;31886:24;:::i;:::-;31877:33;;31932:66;31925:5;31922:77;31919:103;;;32002:18;;:::i;:::-;31919:103;32049:1;32042:5;32038:13;32031:20;;31824:233;;;:::o;32063:176::-;32203:28;32199:1;32191:6;32187:14;32180:52;32063:176;:::o;32245:366::-;32387:3;32408:67;32472:2;32467:3;32408:67;:::i;:::-;32401:74;;32484:93;32573:3;32484:93;:::i;:::-;32602:2;32597:3;32593:12;32586:19;;32245:366;;;:::o;32617:419::-;32783:4;32821:2;32810:9;32806:18;32798:26;;32870:9;32864:4;32860:20;32856:1;32845:9;32841:17;32834:47;32898:131;33024:4;32898:131;:::i;:::-;32890:139;;32617:419;;;:::o;33042:166::-;33182:18;33178:1;33170:6;33166:14;33159:42;33042:166;:::o;33214:366::-;33356:3;33377:67;33441:2;33436:3;33377:67;:::i;:::-;33370:74;;33453:93;33542:3;33453:93;:::i;:::-;33571:2;33566:3;33562:12;33555:19;;33214:366;;;:::o;33586:419::-;33752:4;33790:2;33779:9;33775:18;33767:26;;33839:9;33833:4;33829:20;33825:1;33814:9;33810:17;33803:47;33867:131;33993:4;33867:131;:::i;:::-;33859:139;;33586:419;;;:::o;34011:172::-;34151:24;34147:1;34139:6;34135:14;34128:48;34011:172;:::o;34189:366::-;34331:3;34352:67;34416:2;34411:3;34352:67;:::i;:::-;34345:74;;34428:93;34517:3;34428:93;:::i;:::-;34546:2;34541:3;34537:12;34530:19;;34189:366;;;:::o;34561:419::-;34727:4;34765:2;34754:9;34750:18;34742:26;;34814:9;34808:4;34804:20;34800:1;34789:9;34785:17;34778:47;34842:131;34968:4;34842:131;:::i;:::-;34834:139;;34561:419;;;:::o;34986:174::-;35126:26;35122:1;35114:6;35110:14;35103:50;34986:174;:::o;35166:366::-;35308:3;35329:67;35393:2;35388:3;35329:67;:::i;:::-;35322:74;;35405:93;35494:3;35405:93;:::i;:::-;35523:2;35518:3;35514:12;35507:19;;35166:366;;;:::o;35538:419::-;35704:4;35742:2;35731:9;35727:18;35719:26;;35791:9;35785:4;35781:20;35777:1;35766:9;35762:17;35755:47;35819:131;35945:4;35819:131;:::i;:::-;35811:139;;35538:419;;;:::o;35963:348::-;36003:7;36026:20;36044:1;36026:20;:::i;:::-;36021:25;;36060:20;36078:1;36060:20;:::i;:::-;36055:25;;36248:1;36180:66;36176:74;36173:1;36170:81;36165:1;36158:9;36151:17;36147:105;36144:131;;;36255:18;;:::i;:::-;36144:131;36303:1;36300;36296:9;36285:20;;35963:348;;;;:::o;36317:169::-;36457:21;36453:1;36445:6;36441:14;36434:45;36317:169;:::o;36492:366::-;36634:3;36655:67;36719:2;36714:3;36655:67;:::i;:::-;36648:74;;36731:93;36820:3;36731:93;:::i;:::-;36849:2;36844:3;36840:12;36833:19;;36492:366;;;:::o;36864:419::-;37030:4;37068:2;37057:9;37053:18;37045:26;;37117:9;37111:4;37107:20;37103:1;37092:9;37088:17;37081:47;37145:131;37271:4;37145:131;:::i;:::-;37137:139;;36864:419;;;:::o;37289:238::-;37429:34;37425:1;37417:6;37413:14;37406:58;37498:21;37493:2;37485:6;37481:15;37474:46;37289:238;:::o;37533:366::-;37675:3;37696:67;37760:2;37755:3;37696:67;:::i;:::-;37689:74;;37772:93;37861:3;37772:93;:::i;:::-;37890:2;37885:3;37881:12;37874:19;;37533:366;;;:::o;37905:419::-;38071:4;38109:2;38098:9;38094:18;38086:26;;38158:9;38152:4;38148:20;38144:1;38133:9;38129:17;38122:47;38186:131;38312:4;38186:131;:::i;:::-;38178:139;;37905:419;;;:::o;38330:167::-;38470:19;38466:1;38458:6;38454:14;38447:43;38330:167;:::o;38503:366::-;38645:3;38666:67;38730:2;38725:3;38666:67;:::i;:::-;38659:74;;38742:93;38831:3;38742:93;:::i;:::-;38860:2;38855:3;38851:12;38844:19;;38503:366;;;:::o;38875:419::-;39041:4;39079:2;39068:9;39064:18;39056:26;;39128:9;39122:4;39118:20;39114:1;39103:9;39099:17;39092:47;39156:131;39282:4;39156:131;:::i;:::-;39148:139;;38875:419;;;:::o;39300:148::-;39402:11;39439:3;39424:18;;39300:148;;;;:::o;39454:141::-;39503:4;39526:3;39518:11;;39549:3;39546:1;39539:14;39583:4;39580:1;39570:18;39562:26;;39454:141;;;:::o;39625:845::-;39728:3;39765:5;39759:12;39794:36;39820:9;39794:36;:::i;:::-;39846:89;39928:6;39923:3;39846:89;:::i;:::-;39839:96;;39966:1;39955:9;39951:17;39982:1;39977:137;;;;40128:1;40123:341;;;;39944:520;;39977:137;40061:4;40057:9;40046;40042:25;40037:3;40030:38;40097:6;40092:3;40088:16;40081:23;;39977:137;;40123:341;40190:38;40222:5;40190:38;:::i;:::-;40250:1;40264:154;40278:6;40275:1;40272:13;40264:154;;;40352:7;40346:14;40342:1;40337:3;40333:11;40326:35;40402:1;40393:7;40389:15;40378:26;;40300:4;40297:1;40293:12;40288:17;;40264:154;;;40447:6;40442:3;40438:16;40431:23;;40130:334;;39944:520;;39732:738;;39625:845;;;;:::o;40476:377::-;40582:3;40610:39;40643:5;40610:39;:::i;:::-;40665:89;40747:6;40742:3;40665:89;:::i;:::-;40658:96;;40763:52;40808:6;40803:3;40796:4;40789:5;40785:16;40763:52;:::i;:::-;40840:6;40835:3;40831:16;40824:23;;40586:267;40476:377;;;;:::o;40859:429::-;41036:3;41058:92;41146:3;41137:6;41058:92;:::i;:::-;41051:99;;41167:95;41258:3;41249:6;41167:95;:::i;:::-;41160:102;;41279:3;41272:10;;40859:429;;;;;:::o;41294:168::-;41434:20;41430:1;41422:6;41418:14;41411:44;41294:168;:::o;41468:366::-;41610:3;41631:67;41695:2;41690:3;41631:67;:::i;:::-;41624:74;;41707:93;41796:3;41707:93;:::i;:::-;41825:2;41820:3;41816:12;41809:19;;41468:366;;;:::o;41840:419::-;42006:4;42044:2;42033:9;42029:18;42021:26;;42093:9;42087:4;42083:20;42079:1;42068:9;42064:17;42057:47;42121:131;42247:4;42121:131;:::i;:::-;42113:139;;41840:419;;;:::o;42265:173::-;42405:25;42401:1;42393:6;42389:14;42382:49;42265:173;:::o;42444:366::-;42586:3;42607:67;42671:2;42666:3;42607:67;:::i;:::-;42600:74;;42683:93;42772:3;42683:93;:::i;:::-;42801:2;42796:3;42792:12;42785:19;;42444:366;;;:::o;42816:419::-;42982:4;43020:2;43009:9;43005:18;42997:26;;43069:9;43063:4;43059:20;43055:1;43044:9;43040:17;43033:47;43097:131;43223:4;43097:131;:::i;:::-;43089:139;;42816:419;;;:::o;43241:166::-;43381:18;43377:1;43369:6;43365:14;43358:42;43241:166;:::o;43413:366::-;43555:3;43576:67;43640:2;43635:3;43576:67;:::i;:::-;43569:74;;43652:93;43741:3;43652:93;:::i;:::-;43770:2;43765:3;43761:12;43754:19;;43413:366;;;:::o;43785:419::-;43951:4;43989:2;43978:9;43974:18;43966:26;;44038:9;44032:4;44028:20;44024:1;44013:9;44009:17;44002:47;44066:131;44192:4;44066:131;:::i;:::-;44058:139;;43785:419;;;:::o;44210:225::-;44350:34;44346:1;44338:6;44334:14;44327:58;44419:8;44414:2;44406:6;44402:15;44395:33;44210:225;:::o;44441:366::-;44583:3;44604:67;44668:2;44663:3;44604:67;:::i;:::-;44597:74;;44680:93;44769:3;44680:93;:::i;:::-;44798:2;44793:3;44789:12;44782:19;;44441:366;;;:::o;44813:419::-;44979:4;45017:2;45006:9;45002:18;44994:26;;45066:9;45060:4;45056:20;45052:1;45041:9;45037:17;45030:47;45094:131;45220:4;45094:131;:::i;:::-;45086:139;;44813:419;;;:::o;45238:237::-;45378:34;45374:1;45366:6;45362:14;45355:58;45447:20;45442:2;45434:6;45430:15;45423:45;45238:237;:::o;45481:366::-;45623:3;45644:67;45708:2;45703:3;45644:67;:::i;:::-;45637:74;;45720:93;45809:3;45720:93;:::i;:::-;45838:2;45833:3;45829:12;45822:19;;45481:366;;;:::o;45853:419::-;46019:4;46057:2;46046:9;46042:18;46034:26;;46106:9;46100:4;46096:20;46092:1;46081:9;46077:17;46070:47;46134:131;46260:4;46134:131;:::i;:::-;46126:139;;45853:419;;;:::o;46278:225::-;46418:34;46414:1;46406:6;46402:14;46395:58;46487:8;46482:2;46474:6;46470:15;46463:33;46278:225;:::o;46509:366::-;46651:3;46672:67;46736:2;46731:3;46672:67;:::i;:::-;46665:74;;46748:93;46837:3;46748:93;:::i;:::-;46866:2;46861:3;46857:12;46850:19;;46509:366;;;:::o;46881:419::-;47047:4;47085:2;47074:9;47070:18;47062:26;;47134:9;47128:4;47124:20;47120:1;47109:9;47105:17;47098:47;47162:131;47288:4;47162:131;:::i;:::-;47154:139;;46881:419;;;:::o;47306:224::-;47446:34;47442:1;47434:6;47430:14;47423:58;47515:7;47510:2;47502:6;47498:15;47491:32;47306:224;:::o;47536:366::-;47678:3;47699:67;47763:2;47758:3;47699:67;:::i;:::-;47692:74;;47775:93;47864:3;47775:93;:::i;:::-;47893:2;47888:3;47884:12;47877:19;;47536:366;;;:::o;47908:419::-;48074:4;48112:2;48101:9;48097:18;48089:26;;48161:9;48155:4;48151:20;48147:1;48136:9;48132:17;48125:47;48189:131;48315:4;48189:131;:::i;:::-;48181:139;;47908:419;;;:::o;48333:179::-;48473:31;48469:1;48461:6;48457:14;48450:55;48333:179;:::o;48518:366::-;48660:3;48681:67;48745:2;48740:3;48681:67;:::i;:::-;48674:74;;48757:93;48846:3;48757:93;:::i;:::-;48875:2;48870:3;48866:12;48859:19;;48518:366;;;:::o;48890:419::-;49056:4;49094:2;49083:9;49079:18;49071:26;;49143:9;49137:4;49133:20;49129:1;49118:9;49114:17;49107:47;49171:131;49297:4;49171:131;:::i;:::-;49163:139;;48890:419;;;:::o;49315:147::-;49416:11;49453:3;49438:18;;49315:147;;;;:::o;49468:114::-;;:::o;49588:398::-;49747:3;49768:83;49849:1;49844:3;49768:83;:::i;:::-;49761:90;;49860:93;49949:3;49860:93;:::i;:::-;49978:1;49973:3;49969:11;49962:18;;49588:398;;;:::o;49992:379::-;50176:3;50198:147;50341:3;50198:147;:::i;:::-;50191:154;;50362:3;50355:10;;49992:379;;;:::o;50377:245::-;50517:34;50513:1;50505:6;50501:14;50494:58;50586:28;50581:2;50573:6;50569:15;50562:53;50377:245;:::o;50628:366::-;50770:3;50791:67;50855:2;50850:3;50791:67;:::i;:::-;50784:74;;50867:93;50956:3;50867:93;:::i;:::-;50985:2;50980:3;50976:12;50969:19;;50628:366;;;:::o;51000:419::-;51166:4;51204:2;51193:9;51189:18;51181:26;;51253:9;51247:4;51243:20;51239:1;51228:9;51224:17;51217:47;51281:131;51407:4;51281:131;:::i;:::-;51273:139;;51000:419;;;:::o;51425:229::-;51565:34;51561:1;51553:6;51549:14;51542:58;51634:12;51629:2;51621:6;51617:15;51610:37;51425:229;:::o;51660:366::-;51802:3;51823:67;51887:2;51882:3;51823:67;:::i;:::-;51816:74;;51899:93;51988:3;51899:93;:::i;:::-;52017:2;52012:3;52008:12;52001:19;;51660:366;;;:::o;52032:419::-;52198:4;52236:2;52225:9;52221:18;52213:26;;52285:9;52279:4;52275:20;52271:1;52260:9;52256:17;52249:47;52313:131;52439:4;52313:131;:::i;:::-;52305:139;;52032:419;;;:::o;52457:234::-;52597:34;52593:1;52585:6;52581:14;52574:58;52666:17;52661:2;52653:6;52649:15;52642:42;52457:234;:::o;52697:366::-;52839:3;52860:67;52924:2;52919:3;52860:67;:::i;:::-;52853:74;;52936:93;53025:3;52936:93;:::i;:::-;53054:2;53049:3;53045:12;53038:19;;52697:366;;;:::o;53069:419::-;53235:4;53273:2;53262:9;53258:18;53250:26;;53322:9;53316:4;53312:20;53308:1;53297:9;53293:17;53286:47;53350:131;53476:4;53350:131;:::i;:::-;53342:139;;53069:419;;;:::o;53494:98::-;53545:6;53579:5;53573:12;53563:22;;53494:98;;;:::o;53598:168::-;53681:11;53715:6;53710:3;53703:19;53755:4;53750:3;53746:14;53731:29;;53598:168;;;;:::o;53772:360::-;53858:3;53886:38;53918:5;53886:38;:::i;:::-;53940:70;54003:6;53998:3;53940:70;:::i;:::-;53933:77;;54019:52;54064:6;54059:3;54052:4;54045:5;54041:16;54019:52;:::i;:::-;54096:29;54118:6;54096:29;:::i;:::-;54091:3;54087:39;54080:46;;53862:270;53772:360;;;;:::o;54138:640::-;54333:4;54371:3;54360:9;54356:19;54348:27;;54385:71;54453:1;54442:9;54438:17;54429:6;54385:71;:::i;:::-;54466:72;54534:2;54523:9;54519:18;54510:6;54466:72;:::i;:::-;54548;54616:2;54605:9;54601:18;54592:6;54548:72;:::i;:::-;54667:9;54661:4;54657:20;54652:2;54641:9;54637:18;54630:48;54695:76;54766:4;54757:6;54695:76;:::i;:::-;54687:84;;54138:640;;;;;;;:::o;54784:141::-;54840:5;54871:6;54865:13;54856:22;;54887:32;54913:5;54887:32;:::i;:::-;54784:141;;;;:::o;54931:349::-;55000:6;55049:2;55037:9;55028:7;55024:23;55020:32;55017:119;;;55055:79;;:::i;:::-;55017:119;55175:1;55200:63;55255:7;55246:6;55235:9;55231:22;55200:63;:::i;:::-;55190:73;;55146:127;54931:349;;;;:::o;55286:180::-;55334:77;55331:1;55324:88;55431:4;55428:1;55421:15;55455:4;55452:1;55445:15;55472:185;55512:1;55529:20;55547:1;55529:20;:::i;:::-;55524:25;;55563:20;55581:1;55563:20;:::i;:::-;55558:25;;55602:1;55592:35;;55607:18;;:::i;:::-;55592:35;55649:1;55646;55642:9;55637:14;;55472:185;;;;:::o;55663:176::-;55695:1;55712:20;55730:1;55712:20;:::i;:::-;55707:25;;55746:20;55764:1;55746:20;:::i;:::-;55741:25;;55785:1;55775:35;;55790:18;;:::i;:::-;55775:35;55831:1;55828;55824:9;55819:14;;55663:176;;;;:::o;55845:220::-;55985:34;55981:1;55973:6;55969:14;55962:58;56054:3;56049:2;56041:6;56037:15;56030:28;55845:220;:::o;56071:366::-;56213:3;56234:67;56298:2;56293:3;56234:67;:::i;:::-;56227:74;;56310:93;56399:3;56310:93;:::i;:::-;56428:2;56423:3;56419:12;56412:19;;56071:366;;;:::o;56443:419::-;56609:4;56647:2;56636:9;56632:18;56624:26;;56696:9;56690:4;56686:20;56682:1;56671:9;56667:17;56660:47;56724:131;56850:4;56724:131;:::i;:::-;56716:139;;56443:419;;;:::o;56868:227::-;57008:34;57004:1;56996:6;56992:14;56985:58;57077:10;57072:2;57064:6;57060:15;57053:35;56868:227;:::o;57101:366::-;57243:3;57264:67;57328:2;57323:3;57264:67;:::i;:::-;57257:74;;57340:93;57429:3;57340:93;:::i;:::-;57458:2;57453:3;57449:12;57442:19;;57101:366;;;:::o;57473:419::-;57639:4;57677:2;57666:9;57662:18;57654:26;;57726:9;57720:4;57716:20;57712:1;57701:9;57697:17;57690:47;57754:131;57880:4;57754:131;:::i;:::-;57746:139;;57473:419;;;:::o
Metadata Hash
ipfs://e71109be39b394d868371b15413d5ed2fa97a210e683e827d32889ac83317b13