More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 11595895 | 4 mins ago | IN | 0 S | 0.00399423 | ||||
Deposit | 11590519 | 42 mins ago | IN | 0 S | 0.0063514 | ||||
Redeem | 11573488 | 2 hrs ago | IN | 0 S | 0.00379027 | ||||
Redeem | 11554508 | 5 hrs ago | IN | 0 S | 0.00399423 | ||||
Deposit | 11526457 | 8 hrs ago | IN | 0 S | 0.01453237 | ||||
Deposit | 11521651 | 8 hrs ago | IN | 0 S | 0.01529852 | ||||
Deposit | 11482074 | 13 hrs ago | IN | 0 S | 0.01556109 | ||||
Deposit | 11449651 | 16 hrs ago | IN | 0 S | 0.01506037 | ||||
Deposit | 11445202 | 16 hrs ago | IN | 0 S | 0.01589924 | ||||
Deposit | 11443008 | 17 hrs ago | IN | 0 S | 0.0220741 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-03 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC 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); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Collection of common custom errors used in multiple contracts * * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library. * It is recommended to avoid relying on the error API for critical functionality. * * _Available since v5.1._ */ library Errors { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error InsufficientBalance(uint256 balance, uint256 needed); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedCall(); /** * @dev The deployment failed. */ error FailedDeployment(); /** * @dev A necessary precompile is missing. */ error MissingPrecompile(address); } pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert Errors.InsufficientBalance(address(this).balance, amount); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert Errors.FailedCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {Errors.FailedCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert Errors.InsufficientBalance(address(this).balance, value); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {Errors.FailedCall}) in case * of an unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {Errors.FailedCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {Errors.FailedCall}. */ function _revert(bytes memory returndata) private pure { // 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 ("memory-safe") { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert Errors.FailedCall(); } } } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 initialAmount; //Total initial amount of the bond uint256 amountOwed; //amount of tokens still owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); // Transfer payout tokens IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: (_terms[2] * 10 ** 18) / 1000, maxDebt: _terms[3] * 10**payoutDecimals, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); Terms storage term = terms[_id]; require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); require(amount >= minimumDeposit, "Deposit below minimum threshold"); _tune(_id); _decayDebt(_id); uint256 price = _marketPrice(_id); uint256 payout = (amount * 1e18) / price; uint256 maxPayout = ((term.maxDebt - term.totalDebt) * 1800) / 10000; require(payout <= maxPayout, "Deposit exceeds maximum allowed"); require(term.totalDebt + payout <= term.maxDebt, "Exceeds maximum bond debt"); IERC20 quoteToken = IERC20(term.quoteToken); uint256 balanceBefore = quoteToken.balanceOf(address(this)); quoteToken.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = quoteToken.balanceOf(address(this)); require(balanceAfter - balanceBefore == amount, "Incorrect transfer amount"); terms[_id].quoteTokensRaised += amount; terms[_id].totalDebt += payout; bondInfo[user].push(Bond({ tokenBonded: term.payoutToken, initialAmount: payout, amountOwed: payout, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); emit BondDeposited(user, _id, amount, payout, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; // First pass: calculate total amount to redeem for (uint256 i = 0; i < length; i++) { Bond memory currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { totalRedeemed += amount; } } } if (totalRedeemed == 0) return 0; // Transfer total amount IERC20(terms[_id].payoutToken).safeTransfer(user, totalRedeemed); // Second pass: update bond records // We iterate backwards to safely remove items from array for (uint256 i = length; i > 0;) { i--; Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { currentBond.amountOwed -= amount; // If bond is fully redeemed, remove it if (currentBond.amountOwed == 0) { // Move the last item to this position and remove the last item if (i != bondInfo[user].length - 1) { bondInfo[user][i] = bondInfo[user][bondInfo[user].length - 1]; } bondInfo[user].pop(); } } } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function currentMaxPayout(uint256 _id) public view returns (uint256) { Terms memory term = terms[_id]; uint256 remainingDebt = term.maxDebt - term.totalDebt; return (remainingDebt * 1800) / 10000; // 18% of remaining } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; // No payout if bond doesn't exist or nothing is owed if (bond.amountOwed == 0) return 0; // If bond is fully matured, return all remaining owed amount if (block.timestamp >= bond.endTime) { return bond.amountOwed; } // For active bonds, calculate linear vesting // Calculate what percentage of time has elapsed (in 1e18 precision) uint256 totalVestingDuration = bond.endTime - bond.startTime; uint256 timeElapsed = block.timestamp - bond.startTime; // Calculate what percentage is vested so far (with 1e18 precision) uint256 percentVested = (timeElapsed * 1e18) / totalVestingDuration; // Calculate total amount that should be vested by now uint256 totalAmountEarned = (percentVested * (bond.initialAmount)) / 1e18; // Calculate amount already claimed uint256 alreadyClaimed = bond.initialAmount - bond.amountOwed; // Calculate what can be claimed now if (totalAmountEarned > alreadyClaimed) { return totalAmountEarned - alreadyClaimed; } return 0; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: currentMaxPayout(marketId), vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; // Calculate decay as a proportion of time elapsed relative to vesting term // Scale by 1% to ensure reasonable decay rate (100 = 1% constant) uint256 decayRate = 100; // 1% coefficient for controlled decay uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * decayRate); // Ensure we don't decay more than current debt term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; // Get decimals for both tokens for precise calculations uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); // Get current control variable and debt ratio uint256 currentCV = _currentControlVariable(_id); uint256 debtRatio = _debtRatio(_id); // Early check for potential overflow if (currentCV > type(uint256).max / debtRatio) { return term.minimumPrice; } // Calculate base price with proper scaling uint256 rawPrice = currentCV * debtRatio; // Apply decimal adjustments int8 decimalAdjustment = int8(36) - int8(payoutDecimals) - int8(quoteDecimals); if (decimalAdjustment > 0) { // Scale up if needed rawPrice = rawPrice * (10 ** uint8(decimalAdjustment)); } // Divide by 1e18 twice due to debtRatio scaling price = rawPrice / 1e18 / 1e18; // Apply minimum price floor if (price < term.minimumPrice) { price = term.minimumPrice; } // Final overflow guard if (price > type(uint256).max / 1e18) { price = type(uint256).max / 1e18; } return price; } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; // Get decimals for precise calculation uint8 quoteDecimals = uint8(IERC20Metadata(address(term.quoteToken)).decimals()); uint8 payoutDecimals = uint8(IERC20Metadata(address(term.payoutToken)).decimals()); // Normalize totalDebt to 18 decimals (totalDebt is in payoutToken) uint256 totalDebt = term.totalDebt * (10**(18 - payoutDecimals)); // Normalize quote tokens raised to 18 decimals uint256 quoteBalance = term.quoteTokensRaised * (10 ** (18 - quoteDecimals)); // Prevent division by zero if (quoteBalance == 0) { return 1e18; } // Calculate debt ratio with high precision // Result is scaled to 1e18 uint256 debtRatio = (totalDebt * 1e18) / quoteBalance; return debtRatio; } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Base control variable uint256 baseCV = term.controlVariable; // Market-adaptive decay calculation uint256 currentDebtRatio = _debtRatio(_id); uint256 timeSinceBondStart = block.timestamp > term.bondEnds ? block.timestamp - term.bondEnds : 0; // Adaptive decay rate based on debt ratio // Higher debt ratio accelerates decay uint256 adaptiveDecayRate = (currentDebtRatio * 1e18) / term.maxDebt; // Calculate decay amount uint256 decayAmount = (baseCV * adaptiveDecayRate) / (timeSinceBondStart + 1); // Apply ongoing adjustment if within adjustment window if (block.timestamp <= adjustment.lastBlock + adjustment.buffer) { if (adjustment.add) { // Increasing control variable baseCV += adjustment.rate; // Cap at target if exceeded if (baseCV > adjustment.target) { baseCV = adjustment.target; } } else { // Decreasing control variable baseCV -= adjustment.rate; // Floor at target if fallen below if (baseCV < adjustment.target) { baseCV = adjustment.target; } } } // Apply decay if (baseCV > decayAmount) { return baseCV - decayAmount; } return 0; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return amount * price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b506040516146bf3803806146bf83398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b60805161444361027c5f395f81816107bc0152611ff701526144435ff3fe608060405234801561000f575f5ffd5b50600436106102b8575f3560e01c806391de4d0711610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f1461074d578063d627d25e14610760578063d918a16e14610773578063ddb292471461077c578063ea5e0c601461078f578063ed421a9c146107b7578063f9a64664146107de575f5ffd5b8063c8558f1b146106da578063ca15c873146106ed578063cfe9232b14610700578063d04cffeb14610714578063d1af1fbc14610727578063d382fe921461073a575f5ffd5b8063b33712c511610131578063b33712c5146105ac578063bc063e1a146105b4578063bc3b2b12146105bd578063be32ee2614610627578063c0680e201461063a578063c0aa0e8a1461064d578063c5f0d05c146106c7575f5ffd5b806391de4d07146105395780639b299d9a1461054c5780639cd85b5b1461055f578063a217fddf14610572578063a3246ad314610579578063b2f5de9414610599575f5ffd5b806336568abe116102245780637b30564e116101de5780637b30564e146104535780637bde82f2146104665780638ad59c70146104795780638dbdbe6d146104d45780639010d07c146104e7578063909b2bb81461051257806391d1485414610526575f5ffd5b806336568abe146103f1578063439766ce146104045780635c975abb1461040c5780636247f6f2146104195780636e76fc8f1461042c578063725dafe014610440575f5ffd5b8063172c44ec11610275578063172c44ec1461037a5780631b014e851461038d57806324760807146103a0578063248a9ca3146103a957806327507458146103cb5780632f2ff15d146103de575f5ffd5b806301ffc9a7146102bc57806306b40ea3146102e45780630868335e146103055780630fb81eb4146103255780631227b4021461033a578063154347b51461035a575b5f5ffd5b6102cf6102ca366004613cbd565b6107f1565b60405190151581526020015b60405180910390f35b6102f76102f2366004613cf8565b61081b565b6040519081526020016102db565b610318610313366004613d22565b610846565b6040516102db9190613e29565b610338610333366004613e77565b6108f6565b005b61034d610348366004613e77565b610a8b565b6040516102db9190613e8e565b61036d610368366004613e9d565b610b77565b6040516102db9190613eb8565b6102f7610388366004613e77565b610be0565b61036d61039b366004613e9d565b610bea565b6102f760045481565b6102f76103b7366004613e77565b5f9081526020819052604090206001015490565b6102cf6103d9366004613e77565b610c51565b6103386103ec366004613eef565b610cd5565b6103386103ff366004613eef565b610cff565b610338610d37565b6003546102cf9060ff1681565b610338610427366004613e9d565b610d88565b6102f75f5160206143ee5f395f51905f5281565b61033861044e366004613eef565b610f5b565b6102cf610461366004613cf8565b61107a565b6102f7610474366004613eef565b611128565b61048c610487366004613cf8565b6114b0565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e0016102db565b6103386104e2366004613f1d565b61151b565b6104fa6104f5366004613f53565b611b91565b6040516001600160a01b0390911681526020016102db565b6102f75f5160206143ce5f395f51905f5281565b6102cf610534366004613eef565b611baf565b6102cf610547366004613f73565b611bd7565b61033861055a366004613e9d565b611cd3565b6102cf61056d366004613e9d565b611e05565b6102f75f81565b61058c610587366004613e77565b611e1d565b6040516102db9190613f9f565b6103386105a7366004613e77565b611e36565b610338612060565b6102f76103e881565b6105fd6105cb366004613e77565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102db565b610338610635366004613e9d565b6120ae565b6102f7610648366004613cf8565b61212b565b61066061065b366004613e77565b612144565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102db565b6103386106d5366004613ff7565b6121c4565b6102f76106e8366004613cf8565b612265565b6102f76106fb366004613e77565b6123f3565b6102f75f5160206143ae5f395f51905f5281565b61036d610722366004613e9d565b612409565b6104fa610735366004613e77565b6124ef565b6102f7610748366004613e77565b612517565b61033861075b366004613eef565b612601565b61033861076e366004613e9d565b612625565b6102f7600e5481565b6102f761078a3660046140ac565b6126eb565b6104fa61079d366004613e77565b600a6020525f90815260409020546001600160a01b031681565b6104fa7f000000000000000000000000000000000000000000000000000000000000000081565b6102f76107ec366004613cf8565b612e7c565b5f6001600160e01b03198216635a05180f60e01b1480610815575061081582612e87565b92915050565b600c602052815f5260405f208181548110610834575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff81111561086257610862614010565b60405190808252806020026020018201604052801561089b57816020015b610888613c57565b8152602001906001900390816108805790505b5090505f5b838110156108ee576108c98585838181106108bd576108bd61413f565b90506020020135610a8b565b8282815181106108db576108db61413f565b60209081029190910101526001016108a0565b509392505050565b5f5160206143ae5f395f51905f5261090d81612ebb565b60035460ff16156109395760405162461bcd60e51b815260040161093090614153565b60405180910390fd5b5f828152600a60205260409020546001600160a01b0316331461098e5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610930565b42600683815481106109a2576109a261413f565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109e2576109e261413f565b905f5260205f2090600a02016003015460068481548110610a0557610a0561413f565b905f5260205f2090600a020160020154610a1f9190614193565b9050610a5c338260068681548110610a3957610a3961413f565b5f91825260209091206001600a9092020101546001600160a01b03169190612ec8565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a93613c57565b5f60068381548110610aa757610aa761413f565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610aef85612f27565b8152602001610afd85612517565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b4e85610c51565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bd457602002820191905f5260205f20905b815481526020019060010190808311610bc0575b50505050509050919050565b5f61081582612f27565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bd457602002820191905f5260205f2090815481526020019060010190808311610bc05750505050509050919050565b5f60068281548110610c6557610c6561413f565b5f91825260209091206009600a90920201015463ffffffff164211801590610815575060068281548110610c9b57610c9b61413f565b905f5260205f2090600a02016006015460068381548110610cbe57610cbe61413f565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cef81612ebb565b610cf98383612f31565b50505050565b6001600160a01b0381163314610d285760405163334bd91960e11b815260040160405180910390fd5b610d328282612f5c565b505050565b5f5160206143ee5f395f51905f52610d4e81612ebb565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f5160206143ce5f395f51905f52610d9f81612ebb565b6001600160a01b038216610ded5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610930565b6001600160a01b0382165f9081526009602052604090205460ff1615610e555760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610930565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eaf575060408051601f3d908101601f19168201909252610eac918101906141a6565b60015b610ef15760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610930565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb35760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610930565b610fca5f5160206143ae5f395f51905f5282611baf565b6110075760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610930565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110a6576110a661413f565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f611131612f87565b6001600160a01b0382165f908152600d602052604081205490805b82811015611226576001600160a01b0385165f908152600d6020526040812080548390811061117d5761117d61413f565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260059092015463ffffffff80821660a0840152600160201b9091041660c0820152915087900361121d575f6112068784612265565b9050801561121b5761121881856141c6565b93505b505b5060010161114c565b50805f03611238575f925050506114a6565b611250848260068881548110610a3957610a3961413f565b815b80156114a15780611262816141d9565b6001600160a01b0387165f908152600d60205260408120805492945090925090839081106112925761129261413f565b905f5260205f20906006020190508681600401540361149b575f6112b68784612265565b905080156114995780826002015f8282546112d19190614193565b909155505060028201545f03611499576001600160a01b0387165f908152600d602052604090205461130590600190614193565b8314611420576001600160a01b0387165f908152600d60205260409020805461133090600190614193565b815481106113405761134061413f565b905f5260205f209060060201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f2084815481106113805761138061413f565b5f9182526020909120825460069092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d60205260409020805480611446576114466141ee565b5f8281526020812060065f199093019283020180546001600160a01b03191681556001810182905560028101829055600381018290556004810191909155600501805467ffffffffffffffff1916905590555b505b50611252565b509150505b6108156001600255565b600d602052815f5260405f2081815481106114c9575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b611523612f87565b6001600160a01b0381166115705760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610930565b60065483106115b55760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610930565b5f600684815481106115c9576115c961413f565b5f9182526020909120600a90910201600981015490915063ffffffff164211156116265760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610930565b806006015481600301541061167d5760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610930565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156116c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e791906141a6565b90505f6116f382612fde565b9050808510156117455760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610930565b61174e86613009565b6117578661314b565b5f6117618761320d565b90505f8161177788670de0b6b3a7640000614202565b6117819190614219565b90505f6127108660030154876006015461179b9190614193565b6117a790610708614202565b6117b19190614219565b9050808211156118035760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610930565b856006015482876003015461181891906141c6565b11156118665760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610930565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa1580156118af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d39190614238565b90506118ea6001600160a01b03831633308d613474565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561192e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119529190614238565b90508a61195f8383614193565b146119ac5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610930565b8a60068d815481106119c0576119c061413f565b905f5260205f2090600a02016007015f8282546119dd91906141c6565b925050819055508460068d815481106119f8576119f861413f565b905f5260205f2090600a02016003015f828254611a1591906141c6565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611a8f9291600160201b9004166141c6565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611b76908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d326001600255565b5f828152600160205260408120611ba890836134ad565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b509394505f93505050505b8151811015611cc957846001600160a01b0316600a5f848481518110611c6457611c6461413f565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611cb15750611cb1828281518110611ca457611ca461413f565b6020026020010151610c51565b15611cc157600192505050610815565b600101611c3c565b505f949350505050565b5f611cdd81612ebb565b6001600160a01b038216611d335760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610930565b611d4a5f5160206143ae5f395f51905f5283611baf565b15611d8f5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610930565b611da65f5160206143ae5f395f51905f5283612f31565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206143ae5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108155f5160206143ae5f395f51905f5283611baf565b5f818152600160205260409020606090610815906134b8565b5f5160206143ae5f395f51905f52611e4d81612ebb565b60035460ff1615611e705760405162461bcd60e51b815260040161093090614153565b5f828152600a60205260409020546001600160a01b03163314611ecf5760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b6044820152606401610930565b60068281548110611ee257611ee261413f565b5f91825260209091206009600a90920201015463ffffffff164211611f425760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610930565b5f60068381548110611f5657611f5661413f565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611f8757611f8761413f565b5f918252602082206007600a909202010154600e5490925015611fce57612710600e5483611fb59190614202565b611fbf9190614219565b9050611fcb8183614193565b91505b611fe26001600160a01b0384163384612ec8565b801561201c5761201c6001600160a01b0384167f000000000000000000000000000000000000000000000000000000000000000083612ec8565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f5160206143ee5f395f51905f5261207781612ebb565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6120b881612ebb565b6120cf5f5160206143ae5f395f51905f5283612f5c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206143ae5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610834575f80fd5b60068181548110612153575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6121ce81612ebb565b6103e88263ffffffff1611156122155760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610930565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d602052604081208054829190849081106122915761229161413f565b5f91825260208083206040805160e081018252600690940290910180546001600160a01b031684526001810154928401929092526002820154908301819052600382015460608401526004820154608084015260059091015463ffffffff80821660a0850152600160201b9091041660c08301529092509003612317575f915050610815565b8060c0015163ffffffff16421061233357604001519050610815565b5f8160a001518260c00151612348919061424f565b63ffffffff1690505f8260a0015163ffffffff16426123679190614193565b90505f8261237d83670de0b6b3a7640000614202565b6123879190614219565b90505f670de0b6b3a76400008560200151836123a39190614202565b6123ad9190614219565b90505f856040015186602001516123c49190614193565b9050808211156123e5576123d88183614193565b9650505050505050610815565b505f98975050505050505050565b5f818152600160205260408120610815906134c4565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561243d5761243d614010565b604051908082528060200260200182016040528015612466578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156124e8576001600160a01b0384165f908152600d602052604090208054829081106124b3576124b361413f565b905f5260205f209060060201600401548282815181106124d5576124d561413f565b602090810291909101015260010161246b565b5092915050565b600581815481106124fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061252c5761252c61413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506125de9190614193565b90506127106125ef82610708614202565b6125f99190614219565b949350505050565b5f8281526020819052604090206001015461261b81612ebb565b610cf98383612f5c565b5f5160206143ce5f395f51905f5261263c81612ebb565b6001600160a01b0382165f9081526009602052604090205460ff1661269b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610930565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a061910161106e565b5f5f5160206143ae5f395f51905f5261270381612ebb565b60035460ff16156127265760405162461bcd60e51b815260040161093090614153565b6001600160a01b0386166127735760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610930565b6001600160a01b0385166127bf5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610930565b856001600160a01b0316856001600160a01b03160361281b5760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b6044820152606401610930565b6001600160a01b0386165f9081526009602052604090205460ff1661287a5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610930565b6128843386611bd7565b156128dc5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610930565b82514263ffffffff909116116129295760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610930565b835161296c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610930565b60208401516129bd5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610930565b6040840151612a0e5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610930565b6060840151612a565760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610930565b82515f90612a6b90429063ffffffff16614193565b90505f8111612ab55760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610930565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612af2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1691906141a6565b9050612b463330612b2884600a61434e565b8951612b349190614202565b6001600160a01b038c16929190613474565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612b7584600a61434e565b8951612b819190614202565b81525f60208083019190915289015160408201526060016103e88960026020020151612bb590670de0b6b3a7640000614202565b612bbf9190614219565b8152602001612bcf84600a61434e565b60608a0151612bde9190614202565b81526020015f8152602001428152602001875f60028110612c0157612c0161413f565b602002015163ffffffff16815260200187600160028110612c2457612c2461413f565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612e1d9061435c565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a60016020020151604051612e6891815260200190565b60405180910390a498975050505050505050565b5f611ba88383612265565b5f6001600160e01b03198216637965db0b60e01b148061081557506301ffc9a760e01b6001600160e01b0319831614610815565b612ec581336134cd565b50565b6040516001600160a01b03838116602483015260448201839052610d3291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613506565b5f6108158261320d565b5f5f612f3d8484613572565b90508015611ba8575f8481526001602052604090206108ee9084613601565b5f5f612f688484613615565b90508015611ba8575f8481526001602052604090206108ee908461367e565b6002805403612fd85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610930565b60028055565b5f60028260ff16111561300157612ff6600283614374565b61081590600a61434e565b506001919050565b5f818152600760205260409020600381015460049091015461302b91906141c6565b421115612ec5575f600682815481106130465761304661413f565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156130d1575f82815260076020526040812060010154600483018054919290916130959084906141c6565b90915550505f828152600760205260409020600201546004820154106130cc575f8281526007602052604090206002015460048201555b61312e565b5f82815260076020526040812060010154600483018054919290916130f7908490614193565b90915550505f8281526007602052604090206002015460048201541161312e575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061315f5761315f61413f565b905f5260205f2090600a020190505f81600301549050805f0361318157505050565b5f8260080154426131929190614193565b9050805f036131a15750505050565b60098301546064905f906131c3908390600160201b900463ffffffff16614202565b6131cd8486614202565b6131d79190614219565b90508381116131ef576131ea8185614193565b6131f1565b5f5b600386015550505063ffffffff42166008909201919091555050565b5f5f600683815481106132225761322261413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156132f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331d91906141a6565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061338391906141a6565b90505f61338f86613692565b90505f61339b876138a3565b90506133a8815f19614219565b8211156133bd575050505060a0015192915050565b5f6133c88284614202565b90505f846133d787602461438d565b6133e1919061438d565b90505f815f0b1315613405576133f881600a61434e565b6134029083614202565b91505b670de0b6b3a76400006134188184614219565b6134229190614219565b97508660a00151881015613438578660a0015197505b61344b670de0b6b3a76400005f19614219565b88111561346857613465670de0b6b3a76400005f19614219565b97505b50505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610cf99186918216906323b872dd90608401612ef5565b5f611ba88383613ab2565b60605f611ba883613ad8565b5f610815825490565b6134d78282611baf565b610f575760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610930565b5f5f60205f8451602086015f885af180613525576040513d5f823e3d81fd5b50505f513d9150811561353c578060011415613549565b6001600160a01b0384163b155b15610cf957604051635274afe760e01b81526001600160a01b0385166004820152602401610930565b5f61357d8383611baf565b6135fa575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556135b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610815565b505f610815565b5f611ba8836001600160a01b038416613b2f565b5f6136208383611baf565b156135fa575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610815565b5f611ba8836001600160a01b038416613b74565b5f5f600683815481106136a7576136a761413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff16151589529687015499880199909952938501549686019690965290830154908401529201549281019290925251919350916137a6866138a3565b90505f84610120015163ffffffff1642116137c1575f6137d7565b6101208501516137d79063ffffffff1642614193565b90505f8560c0015183670de0b6b3a76400006137f39190614202565b6137fd9190614219565b90505f61380b8360016141c6565b6138158387614202565b61381f9190614219565b90508560600151866080015161383591906141c6565b42116138915785511561386c57602086015161385190866141c6565b9450856040015185111561386757856040015194505b613891565b602086015161387b9086614193565b9450856040015185101561389157856040015194505b808511156123e5576134658186614193565b5f5f600683815481106138b8576138b861413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613990573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b491906141a6565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1b91906141a6565b90505f613a29826012614374565b613a3490600a61434e565b8460600151613a439190614202565b90505f613a51846012614374565b613a5c90600a61434e565b8560e00151613a6b9190614202565b9050805f03613a885750670de0b6b3a76400009695505050505050565b5f81613a9c84670de0b6b3a7640000614202565b613aa69190614219565b98975050505050505050565b5f825f018281548110613ac757613ac761413f565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bd457602002820191905f5260205f2090815481526020019060010190808311610bc05750505050509050919050565b5f8181526001830160205260408120546135fa57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610815565b5f8181526001830160205260408120548015613c4e575f613b96600183614193565b85549091505f90613ba990600190614193565b9050808214613c08575f865f018281548110613bc757613bc761413f565b905f5260205f200154905080875f018481548110613be757613be761413f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c1957613c196141ee565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610815565b5f915050610815565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613ccd575f5ffd5b81356001600160e01b031981168114611ba8575f5ffd5b6001600160a01b0381168114612ec5575f5ffd5b5f5f60408385031215613d09575f5ffd5b8235613d1481613ce4565b946020939093013593505050565b5f5f60208385031215613d33575f5ffd5b823567ffffffffffffffff811115613d49575f5ffd5b8301601f81018513613d59575f5ffd5b803567ffffffffffffffff811115613d6f575f5ffd5b8560208260051b8401011115613d83575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613dba60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613dfd60c08401826001600160a01b03169052565b5060e0810151613e1160e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613e6c57613e55838551613d93565b602093909301926101409290920191600101613e42565b509095945050505050565b5f60208284031215613e87575f5ffd5b5035919050565b61014081016108158284613d93565b5f60208284031215613ead575f5ffd5b8135611ba881613ce4565b602080825282518282018190525f918401906040840190835b81811015613e6c578351835260209384019390920191600101613ed1565b5f5f60408385031215613f00575f5ffd5b823591506020830135613f1281613ce4565b809150509250929050565b5f5f5f60608486031215613f2f575f5ffd5b83359250602084013591506040840135613f4881613ce4565b809150509250925092565b5f5f60408385031215613f64575f5ffd5b50508035926020909101359150565b5f5f60408385031215613f84575f5ffd5b8235613f8f81613ce4565b91506020830135613f1281613ce4565b602080825282518282018190525f918401906040840190835b81811015613e6c5783516001600160a01b0316835260209384019390920191600101613fb8565b803563ffffffff81168114613ff2575f5ffd5b919050565b5f60208284031215614007575f5ffd5b611ba882613fdf565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561405957634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112614070575f5ffd5b61407a6040614024565b80604084018581111561408b575f5ffd5b845b81811015613e6c5761409e81613fdf565b84526020938401930161408d565b5f5f5f5f61010085870312156140c0575f5ffd5b84356140cb81613ce4565b935060208501356140db81613ce4565b9250605f850186136140eb575f5ffd5b6140f56080614024565b8060c0870188811115614106575f5ffd5b604088015b8181101561412357803584526020938401930161410b565b508194506141318982614061565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108155761081561417f565b5f602082840312156141b6575f5ffd5b815160ff81168114611ba8575f5ffd5b808201808211156108155761081561417f565b5f816141e7576141e761417f565b505f190190565b634e487b7160e01b5f52603160045260245ffd5b80820281158282048414176108155761081561417f565b5f8261423357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614248575f5ffd5b5051919050565b63ffffffff82811682821603908111156108155761081561417f565b6001815b60018411156142a65780850481111561428a5761428a61417f565b600184161561429857908102905b60019390931c92800261426f565b935093915050565b5f826142bc57506001610815565b816142c857505f610815565b81600181146142de57600281146142e857614304565b6001915050610815565b60ff8411156142f9576142f961417f565b50506001821b610815565b5060208310610133831016604e8410600b8410161715614327575081810a610815565b6143335f19848461426b565b805f19048211156143465761434661417f565b029392505050565b5f611ba860ff8416836142ae565b5f6001820161436d5761436d61417f565b5060010190565b60ff82811682821603908111156108155761081561417f565b5f82810b9082900b03607f198112607f821317156108155761081561417f56fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220e514c4ba12b7475ee8eaf6e6368ace102c3956532ccc01615954b80d91892db064736f6c634300081b00330000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102b8575f3560e01c806391de4d0711610177578063c8558f1b116100d5578063d547741f1161008f578063d547741f1461074d578063d627d25e14610760578063d918a16e14610773578063ddb292471461077c578063ea5e0c601461078f578063ed421a9c146107b7578063f9a64664146107de575f5ffd5b8063c8558f1b146106da578063ca15c873146106ed578063cfe9232b14610700578063d04cffeb14610714578063d1af1fbc14610727578063d382fe921461073a575f5ffd5b8063b33712c511610131578063b33712c5146105ac578063bc063e1a146105b4578063bc3b2b12146105bd578063be32ee2614610627578063c0680e201461063a578063c0aa0e8a1461064d578063c5f0d05c146106c7575f5ffd5b806391de4d07146105395780639b299d9a1461054c5780639cd85b5b1461055f578063a217fddf14610572578063a3246ad314610579578063b2f5de9414610599575f5ffd5b806336568abe116102245780637b30564e116101de5780637b30564e146104535780637bde82f2146104665780638ad59c70146104795780638dbdbe6d146104d45780639010d07c146104e7578063909b2bb81461051257806391d1485414610526575f5ffd5b806336568abe146103f1578063439766ce146104045780635c975abb1461040c5780636247f6f2146104195780636e76fc8f1461042c578063725dafe014610440575f5ffd5b8063172c44ec11610275578063172c44ec1461037a5780631b014e851461038d57806324760807146103a0578063248a9ca3146103a957806327507458146103cb5780632f2ff15d146103de575f5ffd5b806301ffc9a7146102bc57806306b40ea3146102e45780630868335e146103055780630fb81eb4146103255780631227b4021461033a578063154347b51461035a575b5f5ffd5b6102cf6102ca366004613cbd565b6107f1565b60405190151581526020015b60405180910390f35b6102f76102f2366004613cf8565b61081b565b6040519081526020016102db565b610318610313366004613d22565b610846565b6040516102db9190613e29565b610338610333366004613e77565b6108f6565b005b61034d610348366004613e77565b610a8b565b6040516102db9190613e8e565b61036d610368366004613e9d565b610b77565b6040516102db9190613eb8565b6102f7610388366004613e77565b610be0565b61036d61039b366004613e9d565b610bea565b6102f760045481565b6102f76103b7366004613e77565b5f9081526020819052604090206001015490565b6102cf6103d9366004613e77565b610c51565b6103386103ec366004613eef565b610cd5565b6103386103ff366004613eef565b610cff565b610338610d37565b6003546102cf9060ff1681565b610338610427366004613e9d565b610d88565b6102f75f5160206143ee5f395f51905f5281565b61033861044e366004613eef565b610f5b565b6102cf610461366004613cf8565b61107a565b6102f7610474366004613eef565b611128565b61048c610487366004613cf8565b6114b0565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e0016102db565b6103386104e2366004613f1d565b61151b565b6104fa6104f5366004613f53565b611b91565b6040516001600160a01b0390911681526020016102db565b6102f75f5160206143ce5f395f51905f5281565b6102cf610534366004613eef565b611baf565b6102cf610547366004613f73565b611bd7565b61033861055a366004613e9d565b611cd3565b6102cf61056d366004613e9d565b611e05565b6102f75f81565b61058c610587366004613e77565b611e1d565b6040516102db9190613f9f565b6103386105a7366004613e77565b611e36565b610338612060565b6102f76103e881565b6105fd6105cb366004613e77565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102db565b610338610635366004613e9d565b6120ae565b6102f7610648366004613cf8565b61212b565b61066061065b366004613e77565b612144565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff90811661012084015216610140820152610160016102db565b6103386106d5366004613ff7565b6121c4565b6102f76106e8366004613cf8565b612265565b6102f76106fb366004613e77565b6123f3565b6102f75f5160206143ae5f395f51905f5281565b61036d610722366004613e9d565b612409565b6104fa610735366004613e77565b6124ef565b6102f7610748366004613e77565b612517565b61033861075b366004613eef565b612601565b61033861076e366004613e9d565b612625565b6102f7600e5481565b6102f761078a3660046140ac565b6126eb565b6104fa61079d366004613e77565b600a6020525f90815260409020546001600160a01b031681565b6104fa7f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a581565b6102f76107ec366004613cf8565b612e7c565b5f6001600160e01b03198216635a05180f60e01b1480610815575061081582612e87565b92915050565b600c602052815f5260405f208181548110610834575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff81111561086257610862614010565b60405190808252806020026020018201604052801561089b57816020015b610888613c57565b8152602001906001900390816108805790505b5090505f5b838110156108ee576108c98585838181106108bd576108bd61413f565b90506020020135610a8b565b8282815181106108db576108db61413f565b60209081029190910101526001016108a0565b509392505050565b5f5160206143ae5f395f51905f5261090d81612ebb565b60035460ff16156109395760405162461bcd60e51b815260040161093090614153565b60405180910390fd5b5f828152600a60205260409020546001600160a01b0316331461098e5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610930565b42600683815481106109a2576109a261413f565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f600683815481106109e2576109e261413f565b905f5260205f2090600a02016003015460068481548110610a0557610a0561413f565b905f5260205f2090600a020160020154610a1f9190614193565b9050610a5c338260068681548110610a3957610a3961413f565b5f91825260209091206001600a9092020101546001600160a01b03169190612ec8565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610a93613c57565b5f60068381548110610aa757610aa761413f565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610aef85612f27565b8152602001610afd85612517565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610b4e85610c51565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610bd457602002820191905f5260205f20905b815481526020019060010190808311610bc0575b50505050509050919050565b5f61081582612f27565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610bd457602002820191905f5260205f2090815481526020019060010190808311610bc05750505050509050919050565b5f60068281548110610c6557610c6561413f565b5f91825260209091206009600a90920201015463ffffffff164211801590610815575060068281548110610c9b57610c9b61413f565b905f5260205f2090600a02016006015460068381548110610cbe57610cbe61413f565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610cef81612ebb565b610cf98383612f31565b50505050565b6001600160a01b0381163314610d285760405163334bd91960e11b815260040160405180910390fd5b610d328282612f5c565b505050565b5f5160206143ee5f395f51905f52610d4e81612ebb565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b5f5160206143ce5f395f51905f52610d9f81612ebb565b6001600160a01b038216610ded5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610930565b6001600160a01b0382165f9081526009602052604090205460ff1615610e555760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610930565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610eaf575060408051601f3d908101601f19168201909252610eac918101906141a6565b60015b610ef15760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610930565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b03163314610fb35760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610930565b610fca5f5160206143ae5f395f51905f5282611baf565b6110075760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610930565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d602052604081208054829190849081106110a6576110a661413f565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f611131612f87565b6001600160a01b0382165f908152600d602052604081205490805b82811015611226576001600160a01b0385165f908152600d6020526040812080548390811061117d5761117d61413f565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260048201546080820181905260059092015463ffffffff80821660a0840152600160201b9091041660c0820152915087900361121d575f6112068784612265565b9050801561121b5761121881856141c6565b93505b505b5060010161114c565b50805f03611238575f925050506114a6565b611250848260068881548110610a3957610a3961413f565b815b80156114a15780611262816141d9565b6001600160a01b0387165f908152600d60205260408120805492945090925090839081106112925761129261413f565b905f5260205f20906006020190508681600401540361149b575f6112b68784612265565b905080156114995780826002015f8282546112d19190614193565b909155505060028201545f03611499576001600160a01b0387165f908152600d602052604090205461130590600190614193565b8314611420576001600160a01b0387165f908152600d60205260409020805461133090600190614193565b815481106113405761134061413f565b905f5260205f209060060201600d5f896001600160a01b03166001600160a01b031681526020019081526020015f2084815481106113805761138061413f565b5f9182526020909120825460069092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154908201556002808301549082015560038083015490820155600480830154908201556005918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0387165f908152600d60205260409020805480611446576114466141ee565b5f8281526020812060065f199093019283020180546001600160a01b03191681556001810182905560028101829055600381018290556004810191909155600501805467ffffffffffffffff1916905590555b505b50611252565b509150505b6108156001600255565b600d602052815f5260405f2081815481106114c9575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b611523612f87565b6001600160a01b0381166115705760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610930565b60065483106115b55760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610930565b5f600684815481106115c9576115c961413f565b5f9182526020909120600a90910201600981015490915063ffffffff164211156116265760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610930565b806006015481600301541061167d5760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610930565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa1580156116c3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e791906141a6565b90505f6116f382612fde565b9050808510156117455760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610930565b61174e86613009565b6117578661314b565b5f6117618761320d565b90505f8161177788670de0b6b3a7640000614202565b6117819190614219565b90505f6127108660030154876006015461179b9190614193565b6117a790610708614202565b6117b19190614219565b9050808211156118035760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610930565b856006015482876003015461181891906141c6565b11156118665760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610930565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa1580156118af573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d39190614238565b90506118ea6001600160a01b03831633308d613474565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa15801561192e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119529190614238565b90508a61195f8383614193565b146119ac5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610930565b8a60068d815481106119c0576119c061413f565b905f5260205f2090600a02016007015f8282546119dd91906141c6565b925050819055508460068d815481106119f8576119f861413f565b905f5260205f2090600a02016003015f828254611a1591906141c6565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611a8f9291600160201b9004166141c6565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611b76908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610d326001600255565b5f828152600160205260408120611ba890836134ad565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611c3157602002820191905f5260205f20905b815481526020019060010190808311611c1d575b509394505f93505050505b8151811015611cc957846001600160a01b0316600a5f848481518110611c6457611c6461413f565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611cb15750611cb1828281518110611ca457611ca461413f565b6020026020010151610c51565b15611cc157600192505050610815565b600101611c3c565b505f949350505050565b5f611cdd81612ebb565b6001600160a01b038216611d335760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610930565b611d4a5f5160206143ae5f395f51905f5283611baf565b15611d8f5760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610930565b611da65f5160206143ae5f395f51905f5283612f31565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206143ae5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108155f5160206143ae5f395f51905f5283611baf565b5f818152600160205260409020606090610815906134b8565b5f5160206143ae5f395f51905f52611e4d81612ebb565b60035460ff1615611e705760405162461bcd60e51b815260040161093090614153565b5f828152600a60205260409020546001600160a01b03163314611ecf5760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b6044820152606401610930565b60068281548110611ee257611ee261413f565b5f91825260209091206009600a90920201015463ffffffff164211611f425760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610930565b5f60068381548110611f5657611f5661413f565b5f91825260208220600a9091020154600680546001600160a01b0390921693509085908110611f8757611f8761413f565b5f918252602082206007600a909202010154600e5490925015611fce57612710600e5483611fb59190614202565b611fbf9190614219565b9050611fcb8183614193565b91505b611fe26001600160a01b0384163384612ec8565b801561201c5761201c6001600160a01b0384167f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a583612ec8565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b5f5160206143ee5f395f51905f5261207781612ebb565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f6120b881612ebb565b6120cf5f5160206143ae5f395f51905f5283612f5c565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206143ae5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610834575f80fd5b60068181548110612153575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f6121ce81612ebb565b6103e88263ffffffff1611156122155760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610930565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d602052604081208054829190849081106122915761229161413f565b5f91825260208083206040805160e081018252600690940290910180546001600160a01b031684526001810154928401929092526002820154908301819052600382015460608401526004820154608084015260059091015463ffffffff80821660a0850152600160201b9091041660c08301529092509003612317575f915050610815565b8060c0015163ffffffff16421061233357604001519050610815565b5f8160a001518260c00151612348919061424f565b63ffffffff1690505f8260a0015163ffffffff16426123679190614193565b90505f8261237d83670de0b6b3a7640000614202565b6123879190614219565b90505f670de0b6b3a76400008560200151836123a39190614202565b6123ad9190614219565b90505f856040015186602001516123c49190614193565b9050808211156123e5576123d88183614193565b9650505050505050610815565b505f98975050505050505050565b5f818152600160205260408120610815906134c4565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561243d5761243d614010565b604051908082528060200260200182016040528015612466578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d60205260409020548110156124e8576001600160a01b0384165f908152600d602052604090208054829081106124b3576124b361413f565b905f5260205f209060060201600401548282815181106124d5576124d561413f565b602090810291909101015260010161246b565b5092915050565b600581815481106124fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061252c5761252c61413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b909104166101408401529193506125de9190614193565b90506127106125ef82610708614202565b6125f99190614219565b949350505050565b5f8281526020819052604090206001015461261b81612ebb565b610cf98383612f5c565b5f5160206143ce5f395f51905f5261263c81612ebb565b6001600160a01b0382165f9081526009602052604090205460ff1661269b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610930565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a061910161106e565b5f5f5160206143ae5f395f51905f5261270381612ebb565b60035460ff16156127265760405162461bcd60e51b815260040161093090614153565b6001600160a01b0386166127735760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610930565b6001600160a01b0385166127bf5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610930565b856001600160a01b0316856001600160a01b03160361281b5760405162461bcd60e51b8152602060048201526018602482015277151bdad95b9cc81b5d5cdd08189948191a5999995c995b9d60421b6044820152606401610930565b6001600160a01b0386165f9081526009602052604090205460ff1661287a5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610930565b6128843386611bd7565b156128dc5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610930565b82514263ffffffff909116116129295760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610930565b835161296c5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610930565b60208401516129bd5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610930565b6040840151612a0e5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610930565b6060840151612a565760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610930565b82515f90612a6b90429063ffffffff16614193565b90505f8111612ab55760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610930565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612af2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b1691906141a6565b9050612b463330612b2884600a61434e565b8951612b349190614202565b6001600160a01b038c16929190613474565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612b7584600a61434e565b8951612b819190614202565b81525f60208083019190915289015160408201526060016103e88960026020020151612bb590670de0b6b3a7640000614202565b612bbf9190614219565b8152602001612bcf84600a61434e565b60608a0151612bde9190614202565b81526020015f8152602001428152602001875f60028110612c0157612c0161413f565b602002015163ffffffff16815260200187600160028110612c2457612c2461413f565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612e1d9061435c565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a60016020020151604051612e6891815260200190565b60405180910390a498975050505050505050565b5f611ba88383612265565b5f6001600160e01b03198216637965db0b60e01b148061081557506301ffc9a760e01b6001600160e01b0319831614610815565b612ec581336134cd565b50565b6040516001600160a01b03838116602483015260448201839052610d3291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613506565b5f6108158261320d565b5f5f612f3d8484613572565b90508015611ba8575f8481526001602052604090206108ee9084613601565b5f5f612f688484613615565b90508015611ba8575f8481526001602052604090206108ee908461367e565b6002805403612fd85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610930565b60028055565b5f60028260ff16111561300157612ff6600283614374565b61081590600a61434e565b506001919050565b5f818152600760205260409020600381015460049091015461302b91906141c6565b421115612ec5575f600682815481106130465761304661413f565b5f91825260208083208584526007909152604090922054600a909102909101915060ff16156130d1575f82815260076020526040812060010154600483018054919290916130959084906141c6565b90915550505f828152600760205260409020600201546004820154106130cc575f8281526007602052604090206002015460048201555b61312e565b5f82815260076020526040812060010154600483018054919290916130f7908490614193565b90915550505f8281526007602052604090206002015460048201541161312e575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061315f5761315f61413f565b905f5260205f2090600a020190505f81600301549050805f0361318157505050565b5f8260080154426131929190614193565b9050805f036131a15750505050565b60098301546064905f906131c3908390600160201b900463ffffffff16614202565b6131cd8486614202565b6131d79190614219565b90508381116131ef576131ea8185614193565b6131f1565b5f5b600386015550505063ffffffff42166008909201919091555050565b5f5f600683815481106132225761322261413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa1580156132f9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331d91906141a6565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561335f573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061338391906141a6565b90505f61338f86613692565b90505f61339b876138a3565b90506133a8815f19614219565b8211156133bd575050505060a0015192915050565b5f6133c88284614202565b90505f846133d787602461438d565b6133e1919061438d565b90505f815f0b1315613405576133f881600a61434e565b6134029083614202565b91505b670de0b6b3a76400006134188184614219565b6134229190614219565b97508660a00151881015613438578660a0015197505b61344b670de0b6b3a76400005f19614219565b88111561346857613465670de0b6b3a76400005f19614219565b97505b50505050505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610cf99186918216906323b872dd90608401612ef5565b5f611ba88383613ab2565b60605f611ba883613ad8565b5f610815825490565b6134d78282611baf565b610f575760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610930565b5f5f60205f8451602086015f885af180613525576040513d5f823e3d81fd5b50505f513d9150811561353c578060011415613549565b6001600160a01b0384163b155b15610cf957604051635274afe760e01b81526001600160a01b0385166004820152602401610930565b5f61357d8383611baf565b6135fa575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556135b23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610815565b505f610815565b5f611ba8836001600160a01b038416613b2f565b5f6136208383611baf565b156135fa575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610815565b5f611ba8836001600160a01b038416613b74565b5f5f600683815481106136a7576136a761413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a52888c2089519889018a52805460ff16151589529687015499880199909952938501549686019690965290830154908401529201549281019290925251919350916137a6866138a3565b90505f84610120015163ffffffff1642116137c1575f6137d7565b6101208501516137d79063ffffffff1642614193565b90505f8560c0015183670de0b6b3a76400006137f39190614202565b6137fd9190614219565b90505f61380b8360016141c6565b6138158387614202565b61381f9190614219565b90508560600151866080015161383591906141c6565b42116138915785511561386c57602086015161385190866141c6565b9450856040015185111561386757856040015194505b613891565b602086015161387b9086614193565b9450856040015185101561389157856040015194505b808511156123e5576134658186614193565b5f5f600683815481106138b8576138b861413f565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613990573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b491906141a6565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139f7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a1b91906141a6565b90505f613a29826012614374565b613a3490600a61434e565b8460600151613a439190614202565b90505f613a51846012614374565b613a5c90600a61434e565b8560e00151613a6b9190614202565b9050805f03613a885750670de0b6b3a76400009695505050505050565b5f81613a9c84670de0b6b3a7640000614202565b613aa69190614219565b98975050505050505050565b5f825f018281548110613ac757613ac761413f565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610bd457602002820191905f5260205f2090815481526020019060010190808311610bc05750505050509050919050565b5f8181526001830160205260408120546135fa57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610815565b5f8181526001830160205260408120548015613c4e575f613b96600183614193565b85549091505f90613ba990600190614193565b9050808214613c08575f865f018281548110613bc757613bc761413f565b905f5260205f200154905080875f018481548110613be757613be761413f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c1957613c196141ee565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610815565b5f915050610815565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613ccd575f5ffd5b81356001600160e01b031981168114611ba8575f5ffd5b6001600160a01b0381168114612ec5575f5ffd5b5f5f60408385031215613d09575f5ffd5b8235613d1481613ce4565b946020939093013593505050565b5f5f60208385031215613d33575f5ffd5b823567ffffffffffffffff811115613d49575f5ffd5b8301601f81018513613d59575f5ffd5b803567ffffffffffffffff811115613d6f575f5ffd5b8560208260051b8401011115613d83575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613dba60208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613dfd60c08401826001600160a01b03169052565b5060e0810151613e1160e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613e6c57613e55838551613d93565b602093909301926101409290920191600101613e42565b509095945050505050565b5f60208284031215613e87575f5ffd5b5035919050565b61014081016108158284613d93565b5f60208284031215613ead575f5ffd5b8135611ba881613ce4565b602080825282518282018190525f918401906040840190835b81811015613e6c578351835260209384019390920191600101613ed1565b5f5f60408385031215613f00575f5ffd5b823591506020830135613f1281613ce4565b809150509250929050565b5f5f5f60608486031215613f2f575f5ffd5b83359250602084013591506040840135613f4881613ce4565b809150509250925092565b5f5f60408385031215613f64575f5ffd5b50508035926020909101359150565b5f5f60408385031215613f84575f5ffd5b8235613f8f81613ce4565b91506020830135613f1281613ce4565b602080825282518282018190525f918401906040840190835b81811015613e6c5783516001600160a01b0316835260209384019390920191600101613fb8565b803563ffffffff81168114613ff2575f5ffd5b919050565b5f60208284031215614007575f5ffd5b611ba882613fdf565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561405957634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112614070575f5ffd5b61407a6040614024565b80604084018581111561408b575f5ffd5b845b81811015613e6c5761409e81613fdf565b84526020938401930161408d565b5f5f5f5f61010085870312156140c0575f5ffd5b84356140cb81613ce4565b935060208501356140db81613ce4565b9250605f850186136140eb575f5ffd5b6140f56080614024565b8060c0870188811115614106575f5ffd5b604088015b8181101561412357803584526020938401930161410b565b508194506141318982614061565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108155761081561417f565b5f602082840312156141b6575f5ffd5b815160ff81168114611ba8575f5ffd5b808201808211156108155761081561417f565b5f816141e7576141e761417f565b505f190190565b634e487b7160e01b5f52603160045260245ffd5b80820281158282048414176108155761081561417f565b5f8261423357634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614248575f5ffd5b5051919050565b63ffffffff82811682821603908111156108155761081561417f565b6001815b60018411156142a65780850481111561428a5761428a61417f565b600184161561429857908102905b60019390931c92800261426f565b935093915050565b5f826142bc57506001610815565b816142c857505f610815565b81600181146142de57600281146142e857614304565b6001915050610815565b60ff8411156142f9576142f961417f565b50506001821b610815565b5060208310610133831016604e8410600b8410161715614327575081810a610815565b6143335f19848461426b565b805f19048211156143465761434661417f565b029392505050565b5f611ba860ff8416836142ae565b5f6001820161436d5761436d61417f565b5060010190565b60ff82811682821603908111156108155761081561417f565b5f82810b9082900b03607f198112607f821317156108155761081561417f56fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891d5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63a2646970667358221220e514c4ba12b7475ee8eaf6e6368ace102c3956532ccc01615954b80d91892db064736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5B14Cc6b2a36a7c36dE709775252855d0563E0A5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode Sourcemap
57377:24838:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50913:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;50913:214:0;;;;;;;;59041:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;59041:53:0;1101:177:1;74687:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63905:393::-;;;;;;:::i;:::-;;:::i;:::-;;74031:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;71330:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;72387:107::-;;;;;;:::i;:::-;;:::i;71480:138::-;;;;;;:::i;:::-;;:::i;58663:28::-;;;;;;33986:122;;;;;;:::i;:::-;34051:7;34078:12;;;;;;;;;;:22;;;;33986:122;71955:162;;;;;;:::i;:::-;;:::i;34418:138::-;;;;;;:::i;:::-;;:::i;35555:251::-;;;;;;:::i;:::-;;:::i;70617:165::-;;;:::i;57742:18::-;;;;;;;;;69837:525;;;;;;:::i;:::-;;:::i;57653:80::-;;-1:-1:-1;;;;;;;;;;;57653:80:0;;65026:350;;;;;;:::i;:::-;;:::i;75183:174::-;;;;;;:::i;:::-;;:::i;67274:1619::-;;;;;;:::i;:::-;;:::i;59101:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6367:32:1;;;6349:51;;6431:2;6416:18;;6409:34;;;;6459:18;;;6452:34;;;;6517:2;6502:18;;6495:34;;;;6560:3;6545:19;;6538:35;6622:10;6610:23;;;6387:3;6589:19;;6582:52;6671:23;6665:3;6650:19;;6643:52;6336:3;6321:19;59101:43:0;6038:663:1;65503:1763:0;;;;;;:::i;:::-;;:::i;51726:144::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7713:32:1;;;7695:51;;7683:2;7668:18;51726:144:0;7549:203:1;57562:84:0;;-1:-1:-1;;;;;;;;;;;57562:84:0;;33002:138;;;;;;:::i;:::-;;:::i;81726:375::-;;;;;;:::i;:::-;;:::i;69033:489::-;;;;;;:::i;:::-;;:::i;72506:127::-;;;;;;:::i;:::-;;:::i;32314:49::-;;32359:4;32314:49;;52730:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;64304:710::-;;;;;;:::i;:::-;;:::i;70790:170::-;;;:::i;59218:38::-;;59252:4;59218:38;;58763:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9070:14:1;;9063:22;9045:41;;9117:2;9102:18;;9095:34;;;;9145:18;;;9138:34;;;;9203:2;9188:18;;9181:34;9246:3;9231:19;;9224:35;9032:3;9017:19;58763:45:0;8792:473:1;69530:298:0;;;;;;:::i;:::-;;:::i;58982:52::-;;;;;;:::i;:::-;;:::i;58736:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9712:32:1;;;9694:51;;9781:32;;;;9776:2;9761:18;;9754:60;9830:18;;;9823:34;;;;9888:2;9873:18;;9866:34;;;;9931:3;9916:19;;9909:35;;;;9732:3;9960:19;;9953:35;;;;10019:3;10004:19;;9997:35;10063:3;10048:19;;10041:35;10107:3;10092:19;;10085:35;10169:10;10157:23;;;10151:3;10136:19;;10129:52;10218:24;10212:3;10197:19;;10190:53;9681:3;9666:19;58736:20:0;9270:979:1;70967:237:0;;;;;;:::i;:::-;;:::i;72641:1380::-;;;;;;:::i;:::-;;:::i;52044:133::-;;;;;;:::i;:::-;;:::i;57485:70::-;;-1:-1:-1;;;;;;;;;;;57485:70:0;;71626:316;;;;;;:::i;:::-;;:::i;58698:31::-;;;;;;:::i;:::-;;:::i;72131:244::-;;;;;;:::i;:::-;;:::i;34849:140::-;;;;;;:::i;:::-;;:::i;70370:232::-;;;;;;:::i;:::-;;:::i;59188:23::-;;;;;;61519:2377;;;;;;:::i;:::-;;:::i;58920:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;58920:55:0;;;59152:29;;;;;75035:141;;;;;;:::i;:::-;;:::i;50913:214::-;50998:4;-1:-1:-1;;;;;;51022:57:0;;-1:-1:-1;;;51022:57:0;;:97;;;51083:36;51107:11;51083:23;:36::i;:::-;51015:104;50913:214;-1:-1:-1;;50913:214:0:o;59041:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;74687:342::-;74772:23;74804:31;74859:9;74838:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;74804:72:0;-1:-1:-1;74894:9:0;74889:110;74909:20;;;74889:110;;;74960:31;74978:9;;74988:1;74978:12;;;;;;;:::i;:::-;;;;;;;74960:17;:31::i;:::-;74947:7;74955:1;74947:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;74931:3;;74889:110;;;-1:-1:-1;75018:7:0;74687:342;-1:-1:-1;;;74687:342:0:o;63905:393::-;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;82160:6:::1;::::0;::::1;;82159:7;82151:38;;;;-1:-1:-1::0;;;82151:38:0::1;;;;;;;:::i;:::-;;;;;;;;;63997:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;63997:25:0::2;64026:10;63997:39;63993:69;;64038:24;::::0;-1:-1:-1;;;64038:24:0;;13492:2:1;64038:24:0::2;::::0;::::2;13474:21:1::0;13531:2;13511:18;;;13504:30;-1:-1:-1;;;13550:18:1;;;13543:43;13603:18;;64038:24:0::2;13290:337:1::0;63993:69:0::2;64098:15;64069:5;64075:3;64069:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;64123:18;64170:5;64176:3;64170:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;64144:5;64150:3;64144:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;64123:67;;64199;64243:10;64255;64206:5;64212:3;64206:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;64206:22:0::2;::::0;64199:67;:43:::2;:67::i;:::-;64280:14;::::0;64290:3;;64280:14:::2;::::0;;;::::2;63986:312;63905:393:::0;;:::o;74031:648::-;74097:21;;:::i;:::-;74131:18;74152:5;74158:8;74152:15;;;;;;;;:::i;:::-;;;;;;;;;;74195:476;;;;;;;;74152:15;;;;;;;74237;;-1:-1:-1;;;;;74237:15:0;;;74195:476;;74237:15;74280:16;;;;74195:476;;;;;;;74152:15;;-1:-1:-1;74195:476:0;;;74318:24;74333:8;74318:14;:24::i;:::-;74195:476;;;;74368:26;74385:8;74368:16;:26::i;:::-;74195:476;;74422:16;;;;-1:-1:-1;;;74422:16:0;;;;74195:476;;;;;;;;74468:17;;;;74195:476;;;;;;;;-1:-1:-1;74512:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;74512:30:0;74195:476;;;;;;74565:16;74512:30;74565:6;:16::i;:::-;74195:476;;;;74607:14;;;;74195:476;;;;74646:13;;;;;;;74195:476;;;;;;;;74188:483;74031:648;-1:-1:-1;;74031:648:0:o;71330:142::-;-1:-1:-1;;;;;71437:27:0;;;;;;:15;:27;;;;;;;;;71430:34;;;;;;;;;;;;;;;;;71400:16;;71430:34;;;71437:27;71430:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71330:142;;;:::o;72387:107::-;72439:7;72467:19;72482:3;72467:14;:19::i;71480:138::-;-1:-1:-1;;;;;71586:24:0;;;;;;:16;:24;;;;;;;;;71579:31;;;;;;;;;;;;;;;;;71547:16;;71579:31;;;71586:24;71579:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71480:138;;;:::o;71955:162::-;72005:4;72049:5;72055:3;72049:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;72030:15;:38;;;;:83;;;72095:5;72101:3;72095:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;72072:5;72078:3;72072:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;72023:90;71955:162;-1:-1:-1;;71955:162:0:o;34418:138::-;34051:7;34078:12;;;;;;;;;;:22;;;32598:16;32609:4;32598:10;:16::i;:::-;34523:25:::1;34534:4;34540:7;34523:10;:25::i;:::-;;34418:138:::0;;;:::o;35555:251::-;-1:-1:-1;;;;;35649:34:0;;29305:10;35649:34;35645:104;;35707:30;;-1:-1:-1;;;35707:30:0;;;;;;;;;;;35645:104;35761:37;35773:4;35779:18;35761:11;:37::i;:::-;;35555:251;;:::o;70617:165::-;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;70719:6:::1;:13:::0;;-1:-1:-1;;70719:13:0::1;70728:4;70719:13;::::0;;70748:26:::1;::::0;70763:10:::1;::::0;70748:26:::1;::::0;70719:6:::1;::::0;70748:26:::1;70617:165:::0;:::o;69837:525::-;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;-1:-1:-1;;;;;69964:20:0;::::1;69956:54;;;::::0;-1:-1:-1;;;69956:54:0;;14099:2:1;69956:54:0::1;::::0;::::1;14081:21:1::0;14138:2;14118:18;;;14111:30;-1:-1:-1;;;14157:18:1;;;14150:51;14218:18;;69956:54:0::1;13897:345:1::0;69956:54:0::1;-1:-1:-1::0;;;;;70030:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;70029:26;70021:64;;;::::0;-1:-1:-1;;;70021:64:0;;14449:2:1;70021:64:0::1;::::0;::::1;14431:21:1::0;14488:2;14468:18;;;14461:30;14527:27;14507:18;;;14500:55;14572:18;;70021:64:0::1;14247:349:1::0;70021:64:0::1;70157:6;-1:-1:-1::0;;;;;70142:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;70142:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;70142:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;70138:217;;70314:29;::::0;-1:-1:-1;;;70314:29:0;;15081:2:1;70314:29:0::1;::::0;::::1;15063:21:1::0;15120:2;15100:18;;;15093:30;-1:-1:-1;;;15139:18:1;;;15132:49;15198:18;;70314:29:0::1;14879:343:1::0;70138:217:0::1;-1:-1:-1::0;;;;;;70207:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;70207:32:0::1;70235:4;70207:32:::0;;::::1;::::0;;;70254:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;70254:26:0::1;::::0;;::::1;::::0;;70138:217:::1;69837:525:::0;;:::o;65026:350::-;65115:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;65115:30:0;65149:10;65115:44;65107:73;;;;-1:-1:-1;;;65107:73:0;;15429:2:1;65107:73:0;;;15411:21:1;15468:2;15448:18;;;15441:30;-1:-1:-1;;;15487:18:1;;;15480:46;15543:18;;65107:73:0;15227:340:1;65107:73:0;65195:39;-1:-1:-1;;;;;;;;;;;65220:13:0;65195:7;:39::i;:::-;65187:66;;;;-1:-1:-1;;;65187:66:0;;15774:2:1;65187:66:0;;;15756:21:1;15813:2;15793:18;;;15786:30;-1:-1:-1;;;15832:18:1;;;15825:44;15886:18;;65187:66:0;15572:338:1;65187:66:0;65260:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;65260:46:0;-1:-1:-1;;;;;65260:46:0;;;;;;;;65318:54;;16117:25:1;;;65346:10:0;16158:18:1;;;16151:60;;;;16227:18;;;16220:60;;;;65318:54:0;;16105:2:1;16090:18;65318:54:0;;;;;;;;65026:350;;:::o;75183:174::-;-1:-1:-1;;;;;75285:14:0;;75253:4;75285:14;;;:8;:14;;;;;:23;;75253:4;;75285:14;75300:7;;75285:23;;;;;;:::i;:::-;;;;;;;;;;75266:42;;;;;;;;75285:23;;;;;;;75266:42;;-1:-1:-1;;;;;75266:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;75266:42:0;;;;;;;;;;;75322:15;:31;;;-1:-1:-1;;75183:174:0;;;;:::o;67274:1619::-;67348:22;55819:21;:19;:21::i;:::-;-1:-1:-1;;;;;67396:14:0;::::1;67379;67396::::0;;;:8:::1;:14;::::0;;;;:21;;67379:14;67517:304:::1;67541:6;67537:1;:10;67517:304;;;-1:-1:-1::0;;;;;67591:14:0;::::1;67565:23;67591:14:::0;;;:8:::1;:14;::::0;;;;:17;;67606:1;;67591:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;67565:43:::1;::::0;;::::1;::::0;::::1;::::0;;67591:17:::1;::::0;;::::1;::::0;;::::1;67565:43:::0;;-1:-1:-1;;;;;67565:43:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;67565:43:0;;::::1;;::::0;;;;;-1:-1:-1;67623:27:0;;;67619:195:::1;;67667:14;67684:30;67706:4;67712:1;67684:21;:30::i;:::-;67667:47:::0;-1:-1:-1;67733:10:0;;67729:74:::1;;67764:23;67781:6:::0;67764:23;::::1;:::i;:::-;;;67729:74;67652:162;67619:195;-1:-1:-1::0;67549:3:0::1;;67517:304;;;;67837:13;67854:1;67837:18:::0;67833:32:::1;;67864:1;67857:8;;;;;;67833:32;67908:64;67952:4;67958:13;67915:5;67921:3;67915:10;;;;;;;;:::i;67908:64::-;68106:6:::0;68089:768:::1;68114:5:::0;;68089:768:::1;;68133:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;68174:14:0;::::1;68147:24;68174:14:::0;;;:8:::1;:14;::::0;;;;:17;;68133:3;;-1:-1:-1;68147:24:0;;-1:-1:-1;68174:14:0;68133:3;;68174:17;::::1;;;;;:::i;:::-;;;;;;;;;;;68147:44;;68230:3;68206:11;:20;;;:27:::0;68202:648:::1;;68250:14;68267:30;68289:4;68295:1;68267:21;:30::i;:::-;68250:47:::0;-1:-1:-1;68316:10:0;;68312:527:::1;;68373:6;68347:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;68477:22:0::1;::::0;::::1;::::0;68503:1:::1;68477:27:::0;68473:351:::1;;-1:-1:-1::0;;;;;68623:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;68647:1:::1;::::0;68623:25:::1;:::i;:::-;68618:1;:30;68614:148;;-1:-1:-1::0;;;;;68697:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;68712:21;;:25:::1;::::0;68736:1:::1;::::0;68712:25:::1;:::i;:::-;68697:41;;;;;;;;:::i;:::-;;;;;;;;;;;68677:8;:14;68686:4;-1:-1:-1::0;;;;;68677:14:0::1;-1:-1:-1::0;;;;;68677:14:0::1;;;;;;;;;;;;68692:1;68677:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;68677:61:0::1;-1:-1:-1::0;;;;;68677:61:0;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;68677:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;68677:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;68677:61:0;;;;;;;;;::::1;::::0;;68614:148:::1;-1:-1:-1::0;;;;;68784:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;68784:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;68784:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;68784:20:0;;;;;68473:351:::1;68235:615;68202:648;68122:735;68089:768;;;-1:-1:-1::0;68876:13:0;-1:-1:-1;;55851:1:0::1;55863:20:::0;55257:1;56383:7;:22;56200:213;59101:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59101:43:0;;;;-1:-1:-1;59101:43:0;;-1:-1:-1;59101:43:0;;;;;;;;-1:-1:-1;;;59101:43:0;;;;:::o;65503:1763::-;55819:21;:19;:21::i;:::-;-1:-1:-1;;;;;65598:18:0;::::1;65590:51;;;::::0;-1:-1:-1;;;65590:51:0;;16896:2:1;65590:51:0::1;::::0;::::1;16878:21:1::0;16935:2;16915:18;;;16908:30;-1:-1:-1;;;16954:18:1;;;16947:50;17014:18;;65590:51:0::1;16694:344:1::0;65590:51:0::1;65662:5;:12:::0;65656:18;::::1;65648:48;;;::::0;-1:-1:-1;;;65648:48:0;;17245:2:1;65648:48:0::1;::::0;::::1;17227:21:1::0;17284:2;17264:18;;;17257:30;-1:-1:-1;;;17303:18:1;;;17296:47;17360:18;;65648:48:0::1;17043:341:1::0;65648:48:0::1;65703:18;65724:5;65730:3;65724:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;65768:13;::::0;::::1;::::0;65724:10;;-1:-1:-1;65768:13:0::1;;65749:15;:32;;65741:59;;;::::0;-1:-1:-1;;;65741:59:0;;17591:2:1;65741:59:0::1;::::0;::::1;17573:21:1::0;17630:2;17610:18;;;17603:30;-1:-1:-1;;;17649:18:1;;;17642:44;17703:18;;65741:59:0::1;17389:338:1::0;65741:59:0::1;65832:4;:12;;;65815:4;:14;;;:29;65807:71;;;::::0;-1:-1:-1;;;65807:71:0;;17934:2:1;65807:71:0::1;::::0;::::1;17916:21:1::0;17973:2;17953:18;;;17946:30;18012:31;17992:18;;;17985:59;18061:18;;65807:71:0::1;17732:353:1::0;65807:71:0::1;65932:15:::0;;65909:51:::1;::::0;;-1:-1:-1;;;65909:51:0;;;;65887:19:::1;::::0;-1:-1:-1;;;;;65932:15:0::1;::::0;65909:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;65932:15;65909:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65887:73;;65967:22;65992:38;66016:13;65992:23;:38::i;:::-;65967:63;;66055:14;66045:6;:24;;66037:68;;;::::0;-1:-1:-1;;;66037:68:0;;18292:2:1;66037:68:0::1;::::0;::::1;18274:21:1::0;18331:2;18311:18;;;18304:30;18370:33;18350:18;;;18343:61;18421:18;;66037:68:0::1;18090:355:1::0;66037:68:0::1;66114:10;66120:3;66114:5;:10::i;:::-;66131:15;66142:3;66131:10;:15::i;:::-;66155:13;66171:17;66184:3;66171:12;:17::i;:::-;66155:33:::0;-1:-1:-1;66195:14:0::1;66155:33:::0;66213:13:::1;:6:::0;66222:4:::1;66213:13;:::i;:::-;66212:23;;;;:::i;:::-;66195:40;;66242:17;66305:5;66279:4;:14;;;66264:4;:12;;;:29;;;;:::i;:::-;66263:38;::::0;66297:4:::1;66263:38;:::i;:::-;66262:48;;;;:::i;:::-;66242:68;;66341:9;66331:6;:19;;66323:63;;;::::0;-1:-1:-1;;;66323:63:0;;19047:2:1;66323:63:0::1;::::0;::::1;19029:21:1::0;19086:2;19066:18;;;19059:30;19125:33;19105:18;;;19098:61;19176:18;;66323:63:0::1;18845:355:1::0;66323:63:0::1;66428:4;:12;;;66418:6;66401:4;:14;;;:23;;;;:::i;:::-;:39;;66393:77;;;::::0;-1:-1:-1;;;66393:77:0;;19407:2:1;66393:77:0::1;::::0;::::1;19389:21:1::0;19446:2;19426:18;;;19419:30;19485:27;19465:18;;;19458:55;19530:18;;66393:77:0::1;19205:349:1::0;66393:77:0::1;66506:15:::0;;66553:35:::1;::::0;-1:-1:-1;;;66553:35:0;;66582:4:::1;66553:35;::::0;::::1;7695:51:1::0;-1:-1:-1;;;;;66506:15:0;;::::1;::::0;66479:17:::1;::::0;66506:15;;66553:20:::1;::::0;7668:18:1;;66553:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66529:59:::0;-1:-1:-1;66595:62:0::1;-1:-1:-1::0;;;;;66595:27:0;::::1;66623:10;66643:4;66650:6:::0;66595:27:::1;:62::i;:::-;66687:35;::::0;-1:-1:-1;;;66687:35:0;;66716:4:::1;66687:35;::::0;::::1;7695:51:1::0;66664:20:0::1;::::0;-1:-1:-1;;;;;66687:20:0;::::1;::::0;::::1;::::0;7668:18:1;;66687:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66664:58:::0;-1:-1:-1;66769:6:0;66737:28:::1;66752:13:::0;66664:58;66737:28:::1;:::i;:::-;:38;66729:76;;;::::0;-1:-1:-1;;;66729:76:0;;19950:2:1;66729:76:0::1;::::0;::::1;19932:21:1::0;19989:2;19969:18;;;19962:30;20028:27;20008:18;;;20001:55;20073:18;;66729:76:0::1;19748:349:1::0;66729:76:0::1;66850:6;66818:5;66824:3;66818:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;66887:6;66863:5;66869:3;66863:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;66902:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;66922:272;;::::1;::::0;::::1;::::0;;66951:16:::1;::::0;::::1;::::0;;;::::1;66922:272:::0;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;::::1;67108:15;66922:272:::0;;::::1;::::0;;;;67151:16:::1;::::0;::::1;::::0;66902:14;;66922:272;;;;;67151:34:::1;::::0;67108:15;-1:-1:-1;;;67151:16:0;::::1;;:34;:::i;:::-;66922:272;::::0;;::::1;::::0;;;66902:293;;::::1;::::0;;::::1;::::0;;-1:-1:-1;66902:293:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;66902:293:0;;::::1;-1:-1:-1::0;;;;;;66902:293:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;66902:293:0::1;-1:-1:-1::0;;66902:293:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;67211:47;;67231:3;;67211:47;::::1;::::0;::::1;::::0;::::1;::::0;67236:6;;67244;;67252:5;;20304:25:1;;;20360:2;20345:18;;20338:34;;;;20403:2;20388:18;;20381:34;20292:2;20277:18;;20102:319;67211:47:0::1;;;;;;;;65583:1683;;;;;;;;;55863:20:::0;55257:1;56383:7;:22;56200:213;51726:144;51807:7;51834:18;;;:12;:18;;;;;:28;;51856:5;51834:21;:28::i;:::-;51827:35;51726:144;-1:-1:-1;;;51726:144:0:o;33002:138::-;33079:4;33103:12;;;;;;;;;;;-1:-1:-1;;;;;33103:29:0;;;;;;;;;;;;;;;33002:138::o;81726:375::-;-1:-1:-1;;;;;81864:27:0;;81824:4;81864:27;;;:15;:27;;;;;;;;81837:54;;;;;;;;;;;;;;;;;81824:4;;81837:54;;81864:27;81837:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81837:54:0;;-1:-1:-1;81902:9:0;;-1:-1:-1;;;;81898:181:0;81921:7;:14;81917:1;:18;81898:181;;;81991:10;-1:-1:-1;;;;;81955:46:0;:20;:32;81976:7;81984:1;81976:10;;;;;;;;:::i;:::-;;;;;;;;;;;;81955:32;;;;;;;;;;-1:-1:-1;81955:32:0;;-1:-1:-1;;;;;81955:32:0;:46;:68;;;;;82005:18;82012:7;82020:1;82012:10;;;;;;;;:::i;:::-;;;;;;;82005:6;:18::i;:::-;81952:120;;;82056:4;82049:11;;;;;;81952:120;81937:3;;81898:181;;;-1:-1:-1;82092:5:0;;81726:375;-1:-1:-1;;;;81726:375:0:o;69033:489::-;32359:4;32598:16;32359:4;32598:10;:16::i;:::-;-1:-1:-1;;;;;69200:25:0;::::1;69192:64;;;::::0;-1:-1:-1;;;69192:64:0;;20628:2:1;69192:64:0::1;::::0;::::1;20610:21:1::0;20667:2;20647:18;;;20640:30;20706:28;20686:18;;;20679:56;20752:18;;69192:64:0::1;20426:350:1::0;69192:64:0::1;69276:37;-1:-1:-1::0;;;;;;;;;;;69301:11:0::1;69276:7;:37::i;:::-;69275:38;69267:72;;;::::0;-1:-1:-1;;;69267:72:0;;20983:2:1;69267:72:0::1;::::0;::::1;20965:21:1::0;21022:2;21002:18;;;20995:30;-1:-1:-1;;;21041:18:1;;;21034:51;21102:18;;69267:72:0::1;20781:345:1::0;69267:72:0::1;69352:40;-1:-1:-1::0;;;;;;;;;;;69380:11:0::1;69352:10;:40::i;:::-;-1:-1:-1::0;;;;;;69403:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;69403:42:0::1;69441:4;69403:42;::::0;;69461:53;69503:10:::1;::::0;69403:35;-1:-1:-1;;;;;;;;;;;57527:28:0;69461:53:::1;::::0;69403:35;69461:53:::1;69033:489:::0;;:::o;72506:127::-;72568:4;72592:33;-1:-1:-1;;;;;;;;;;;72617:7:0;72592;:33::i;52730:138::-;52833:18;;;;:12;:18;;;;;52797:16;;52833:27;;:25;:27::i;64304:710::-;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;82160:6:::1;::::0;::::1;;82159:7;82151:38;;;;-1:-1:-1::0;;;82151:38:0::1;;;;;;;:::i;:::-;64410:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;64410:25:0::2;64439:10;64410:39;64402:75;;;::::0;-1:-1:-1;;;64402:75:0;;21333:2:1;64402:75:0::2;::::0;::::2;21315:21:1::0;21372:2;21352:18;;;21345:30;-1:-1:-1;;;21391:18:1;;;21384:53;21454:18;;64402:75:0::2;21131:347:1::0;64402:75:0::2;64510:5;64516:3;64510:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;64492:15;:37;64484:72;;;::::0;-1:-1:-1;;;64484:72:0;;21685:2:1;64484:72:0::2;::::0;::::2;21667:21:1::0;21724:2;21704:18;;;21697:30;-1:-1:-1;;;21743:18:1;;;21736:52;21805:18;;64484:72:0::2;21483:346:1::0;64484:72:0::2;64565:18;64586:5;64592:3;64586:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;64632:5:::2;:10:::0;;-1:-1:-1;;;;;64586:21:0;;::::2;::::0;-1:-1:-1;64632:5:0;64638:3;;64632:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;64698:8:::2;::::0;64632:28;;-1:-1:-1;64698:12:0;64694:102:::2;;64755:5;64743:8;;64733:7;:18;;;;:::i;:::-;64732:28;;;;:::i;:::-;64723:37:::0;-1:-1:-1;64771:17:0::2;64723:37:::0;64771:17;::::2;:::i;:::-;;;64694:102;64804:52;-1:-1:-1::0;;;;;64804:31:0;::::2;64836:10;64848:7:::0;64804:31:::2;:52::i;:::-;64867:10:::0;;64863:80:::2;;64890:45;-1:-1:-1::0;;;;;64890:31:0;::::2;64922:4;64928:6:::0;64890:31:::2;:45::i;:::-;64956:54;::::0;;22008:25:1;;;22064:2;22049:18;;22042:34;;;64982:10:0::2;::::0;64977:3;;64956:54:::2;::::0;21981:18:1;64956:54:0::2;;;;;;;64395:619;;;64304:710:::0;;:::o;70790:170::-;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;70894:6:::1;:14:::0;;-1:-1:-1;;70894:14:0::1;::::0;;70924:28:::1;::::0;70941:10:::1;::::0;70924:28:::1;::::0;70903:5:::1;::::0;70924:28:::1;70790:170:::0;:::o;69530:298::-;32359:4;32598:16;32359:4;32598:10;:16::i;:::-;69656:41:::1;-1:-1:-1::0;;;;;;;;;;;69685:11:0::1;69656;:41::i;:::-;-1:-1:-1::0;;;;;;69708:35:0;::::1;69746:5;69708:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;69708:43:0::1;::::0;;69767:53;69809:10:::1;::::0;69708:35;-1:-1:-1;;;;;;;;;;;57527:28:0;69767:53:::1;::::0;69746:5;69767:53:::1;69530:298:::0;;:::o;58982:52::-;;;;;;;;;;;;;;;;;;;;58736:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58736:20:0;;;;-1:-1:-1;58736:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58736:20:0;;;;:::o;70967:237::-;32359:4;32598:16;32359:4;32598:10;:16::i;:::-;59252:4:::1;71060:10;:21;;;;71052:46;;;::::0;-1:-1:-1;;;71052:46:0;;22289:2:1;71052:46:0::1;::::0;::::1;22271:21:1::0;22328:2;22308:18;;;22301:30;-1:-1:-1;;;22347:18:1;;;22340:42;22399:18;;71052:46:0::1;22087:336:1::0;71052:46:0::1;71122:8;::::0;;71137:21:::1;::::0;::::1;::::0;;;;71170:30:::1;::::0;;22601:25:1;;;22657:2;22642:18;;22635:51;;;;71122:8:0;;71170:30:::1;::::0;22574:18:1;71170:30:0::1;;;;;;;71045:159;70967:237:::0;;:::o;72641:1380::-;-1:-1:-1;;;;;72763:14:0;;72724:7;72763:14;;;:8;:14;;;;;:23;;72724:7;;72763:14;72778:7;;72763:23;;;;;;:::i;:::-;;;;;;;;;72744:42;;;;;;;;72763:23;;;;;;;72744:42;;-1:-1:-1;;;;;72744:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72744:42:0;;;;;;;;;;-1:-1:-1;72874:20:0;;72870:34;;72903:1;72896:8;;;;;72870:34;73019:4;:12;;;73000:31;;:15;:31;72996:86;;73055:15;;;;-1:-1:-1;73048:22:0;;72996:86;73235:28;73281:4;:14;;;73266:4;:12;;;:29;;;;:::i;:::-;73235:60;;;;73306:19;73346:4;:14;;;73328:32;;:15;:32;;;;:::i;:::-;73306:54;-1:-1:-1;73458:21:0;73505:20;73483:18;73306:54;73497:4;73483:18;:::i;:::-;73482:43;;;;:::i;:::-;73458:67;;73610:25;73679:4;73656;:18;;;73639:13;:36;;;;:::i;:::-;73638:45;;;;:::i;:::-;73610:73;;73749:22;73795:4;:15;;;73774:4;:18;;;:36;;;;:::i;:::-;73749:61;;73901:14;73881:17;:34;73877:108;;;73939:34;73959:14;73939:17;:34;:::i;:::-;73932:41;;;;;;;;;;73877:108;-1:-1:-1;74012:1:0;;72641:1380;-1:-1:-1;;;;;;;;72641:1380:0:o;52044:133::-;52115:7;52142:18;;;:12;:18;;;;;:27;;:25;:27::i;71626:316::-;-1:-1:-1;;;;;71767:14:0;;71722:28;71767:14;;;:8;:14;;;;;:21;71689:16;;71722:28;71753:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71753:36:0;-1:-1:-1;71722:67:0;-1:-1:-1;71801:9:0;71796:114;-1:-1:-1;;;;;71820:14:0;;;;;;:8;:14;;;;;:21;71816:25;;71796:114;;;-1:-1:-1;;;;;71876:14:0;;;;;;:8;:14;;;;;:17;;71891:1;;71876:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;71859:11;71871:1;71859:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;71843:3;;71796:114;;;-1:-1:-1;71923:11:0;71626:316;-1:-1:-1;;71626:316:0:o;58698:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58698:31:0;;-1:-1:-1;58698:31:0;:::o;72131:244::-;72191:7;72210:17;72230:5;72236:3;72230:10;;;;;;;;:::i;:::-;;;;;;;;;72210:30;;;;;;;;72230:10;;;;;;;72210:30;;-1:-1:-1;;;;;72210:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72210:30:0;;;;;;;;;;-1:-1:-1;72274:29:0;;72210:30;72274:29;:::i;:::-;72250:53;-1:-1:-1;72345:5:0;72321:20;72250:53;72337:4;72321:20;:::i;:::-;72320:30;;;;:::i;:::-;72313:37;72131:244;-1:-1:-1;;;;72131:244:0:o;34849:140::-;34051:7;34078:12;;;;;;;;;;:22;;;32598:16;32609:4;32598:10;:16::i;:::-;34955:26:::1;34967:4;34973:7;34955:11;:26::i;70370:232::-:0;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;-1:-1:-1;;;;;70469:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;70461:59;;;::::0;-1:-1:-1;;;70461:59:0;;23074:2:1;70461:59:0::1;::::0;::::1;23056:21:1::0;23113:2;23093:18;;;23086:30;-1:-1:-1;;;23132:18:1;;;23125:51;23193:18;;70461:59:0::1;22872:345:1::0;70461:59:0::1;-1:-1:-1::0;;;;;70527:25:0;::::1;70555:5;70527:25:::0;;;:17:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;70527:33:0::1;::::0;;70572:26;;7695:51:1;;;70572:26:0::1;::::0;7668:18:1;70572:26:0::1;7549:203:1::0;61519:2377:0;61808:16;-1:-1:-1;;;;;;;;;;;32598:16:0;32609:4;32598:10;:16::i;:::-;82160:6:::1;::::0;::::1;;82159:7;82151:38;;;;-1:-1:-1::0;;;82151:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;61869:26:0;::::2;61861:59;;;::::0;-1:-1:-1;;;61861:59:0;;23424:2:1;61861:59:0::2;::::0;::::2;23406:21:1::0;23463:2;23443:18;;;23436:30;-1:-1:-1;;;23482:18:1;;;23475:50;23542:18;;61861:59:0::2;23222:344:1::0;61861:59:0::2;-1:-1:-1::0;;;;;61935:34:0;::::2;61927:66;;;::::0;-1:-1:-1;;;61927:66:0;;23773:2:1;61927:66:0::2;::::0;::::2;23755:21:1::0;23812:2;23792:18;;;23785:30;-1:-1:-1;;;23831:18:1;;;23824:49;23890:18;;61927:66:0::2;23571:343:1::0;61927:66:0::2;62032:12;-1:-1:-1::0;;;;;62008:36:0::2;62016:11;-1:-1:-1::0;;;;;62008:36:0::2;::::0;62000:73:::2;;;::::0;-1:-1:-1;;;62000:73:0;;24121:2:1;62000:73:0::2;::::0;::::2;24103:21:1::0;24160:2;24140:18;;;24133:30;-1:-1:-1;;;24179:18:1;;;24172:54;24243:18;;62000:73:0::2;23919:348:1::0;62000:73:0::2;-1:-1:-1::0;;;;;62088:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;62080:65;;;::::0;-1:-1:-1;;;62080:65:0;;23074:2:1;62080:65:0::2;::::0;::::2;23056:21:1::0;23113:2;23093:18;;;23086:30;-1:-1:-1;;;23132:18:1;;;23125:51;23193:18;;62080:65:0::2;22872:345:1::0;62080:65:0::2;62161:61;62189:10;62209:11;62161:27;:61::i;:::-;62160:62;62152:109;;;::::0;-1:-1:-1;;;62152:109:0;;24474:2:1;62152:109:0::2;::::0;::::2;24456:21:1::0;24513:2;24493:18;;;24486:30;24552:34;24532:18;;;24525:62;-1:-1:-1;;;24603:18:1;;;24596:32;24645:19;;62152:109:0::2;24272:398:1::0;62152:109:0::2;62307:16:::0;;62326:15:::2;62307:34;::::0;;::::2;;62299:65;;;::::0;-1:-1:-1;;;62299:65:0;;24877:2:1;62299:65:0::2;::::0;::::2;24859:21:1::0;24916:2;24896:18;;;24889:30;-1:-1:-1;;;24935:18:1;;;24928:48;24993:18;;62299:65:0::2;24675:342:1::0;62299:65:0::2;62410:9:::0;;62402:44:::2;;;::::0;-1:-1:-1;;;62402:44:0;;25224:2:1;62402:44:0::2;::::0;::::2;25206:21:1::0;25263:2;25243:18;;;25236:30;-1:-1:-1;;;25282:18:1;;;25275:48;25340:18;;62402:44:0::2;25022:342:1::0;62402:44:0::2;62461:9;::::0;::::2;::::0;62453:54:::2;;;::::0;-1:-1:-1;;;62453:54:0;;25571:2:1;62453:54:0::2;::::0;::::2;25553:21:1::0;25610:2;25590:18;;;25583:30;25649;25629:18;;;25622:58;25697:18;;62453:54:0::2;25369:352:1::0;62453:54:0::2;62522:9:::0;;::::2;::::0;62514:51:::2;;;::::0;-1:-1:-1;;;62514:51:0;;25928:2:1;62514:51:0::2;::::0;::::2;25910:21:1::0;25967:2;25947:18;;;25940:30;26006:27;25986:18;;;25979:55;26051:18;;62514:51:0::2;25726:349:1::0;62514:51:0::2;62580:9:::0;;::::2;::::0;62572:46:::2;;;::::0;-1:-1:-1;;;62572:46:0;;26282:2:1;62572:46:0::2;::::0;::::2;26264:21:1::0;26321:2;26301:18;;;26294:30;-1:-1:-1;;;26340:18:1;;;26333:50;26400:18;;62572:46:0::2;26080:344:1::0;62572:46:0::2;62661:16:::0;;62631:27:::2;::::0;62661:34:::2;::::0;62680:15:::2;::::0;62661:34:::2;;;:::i;:::-;62631:64;;62732:1;62710:19;:23;62702:58;;;::::0;-1:-1:-1;;;62702:58:0;;26631:2:1;62702:58:0::2;::::0;::::2;26613:21:1::0;26670:2;26650:18;;;26643:30;-1:-1:-1;;;26689:18:1;;;26682:52;26751:18;;62702:58:0::2;26429:346:1::0;62702:58:0::2;62823:20;62861:12;-1:-1:-1::0;;;;;62846:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62823:62:::0;-1:-1:-1;62929:96:0::2;62967:10;62987:4;63006:18;62823:62:::0;63006:2:::2;:18;:::i;:::-;62994:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;62929:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;63072:450;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;63072:450:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;63061:5:::2;::::0;63072:450;;63191:18:::2;63195:14:::0;63191:2:::2;:18;:::i;:::-;63179:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;63072:450:::0;;63513:1:::2;63072:450;::::0;;::::2;::::0;;;;63238:9;::::2;::::0;63072:450;;;;;;63296:4:::2;63238:6:::0;63279:1:::2;63272:9;;;::::0;:20:::2;::::0;63284:8:::2;63272:20;:::i;:::-;63271:29;;;;:::i;:::-;63072:450:::0;;::::2;;63331:18;63335:14:::0;63331:2:::2;:18;:::i;:::-;63319:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;63072:450;;;;63380:1;63072:450;;;;63402:15;63072:450;;;;63437:13;63451:1;63437:16;;;;;;;:::i;:::-;;;;;63072:450;;;;;;63476:13;63490:1;63476:16;;;;;;;:::i;:::-;;;;;63072:450;;;;::::0;63061:462:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;63061:462:0::2;;;;;-1:-1:-1::0;;;;;63061:462:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;63061:462:0::2;;;;;-1:-1:-1::0;;;;;63061:462:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63560:16;63579:13;;63560:32;;63599:16;:30;63616:12;-1:-1:-1::0;;;;;63599:30:0::2;-1:-1:-1::0;;;;;63599:30:0::2;;;;;;;;;;;;63635:8;63599:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63651:15;:37;63675:11;-1:-1:-1::0;;;;;63651:37:0::2;-1:-1:-1::0;;;;;63651:37:0::2;;;;;;;;;;;;63694:8;63651:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63743:10;63710:20;:30;63731:8;63710:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;63710:43:0::2;;;;;-1:-1:-1::0;;;;;63710:43:0::2;;;;;;63768:13;;63766:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;63793:71:0;;::::2;::::0;;::::2;63808:8:::0;63793:71:::2;63854:6:::0;63861:1:::2;63854:9;;;;63793:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;63793:71:0::2;;;;;;;;63884:8:::0;61519:2377;-1:-1:-1;;;;;;;;61519:2377:0:o;75035:141::-;75106:14;75136:36;75158:4;75164:7;75136:21;:36::i;32706:204::-;32791:4;-1:-1:-1;;;;;;32815:47:0;;-1:-1:-1;;;32815:47:0;;:87;;-1:-1:-1;;;;;;;;;;30279:40:0;;;32866:36;30179:148;33355:105;33422:30;33433:4;29305:10;33422;:30::i;:::-;33355:105;:::o;15850:162::-;15960:43;;-1:-1:-1;;;;;28544:32:1;;;15960:43:0;;;28526:51:1;28593:18;;;28586:34;;;15933:71:0;;15953:5;;15975:14;;;;;28499:18:1;;15960:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15960:43:0;;;;;;;;;;;15933:19;:71::i;78471:139::-;78530:13;78581:17;78594:3;78581:12;:17::i;52975:263::-;53061:4;53078:12;53093:31;53110:4;53116:7;53093:16;:31::i;:::-;53078:46;;53139:7;53135:71;;;53163:18;;;;:12;:18;;;;;:31;;53186:7;53163:22;:31::i;53346:268::-;53433:4;53450:12;53465:32;53483:4;53489:7;53465:17;:32::i;:::-;53450:47;;53512:7;53508:74;;;53536:18;;;;:12;:18;;;;;:34;;53562:7;53536:25;:34::i;55899:293::-;55301:1;56033:7;;:19;56025:63;;;;-1:-1:-1;;;56025:63:0;;28833:2:1;56025:63:0;;;28815:21:1;28872:2;28852:18;;;28845:30;28911:33;28891:18;;;28884:61;28962:18;;56025:63:0;28631:355:1;56025:63:0;55301:1;56166:18;;55899:293::o;81178:340::-;81250:7;81368:1;81357:8;:12;;;81353:96;;;81398:12;81409:1;81398:8;:12;:::i;:::-;81391:20;;:2;:20;:::i;81353:96::-;-1:-1:-1;81466:1:0;;81178:340;-1:-1:-1;81178:340:0:o;76271:783::-;76373:16;;;;:11;:16;;;;;:23;;;;76344:26;;;;;:52;;76373:23;76344:52;:::i;:::-;76326:15;:70;76322:719;;;76409:18;76430:5;76436:3;76430:10;;;;;;;;:::i;:::-;;;;;;;;;76465:16;;;:11;:16;;;;;;;:20;76430:10;;;;;;;;-1:-1:-1;76465:20:0;;76461:500;;;76526:16;;;;:11;:16;;;;;:21;;;76502:20;;;:45;;76526:21;;76502:20;;:45;;76526:21;;76502:45;:::i;:::-;;;;-1:-1:-1;;76604:16:0;;;;:11;:16;;;;;:23;;;76580:20;;;;:47;76576:134;;76671:16;;;;:11;:16;;;;;:23;;;76648:20;;;:46;76576:134;76461:500;;;76766:16;;;;:11;:16;;;;;:21;;;76742:20;;;:45;;76766:21;;76742:20;;:45;;76766:21;;76742:45;:::i;:::-;;;;-1:-1:-1;;76844:16:0;;;;:11;:16;;;;;:23;;;76820:20;;;;:47;76816:134;;76911:16;;;;:11;:16;;;;;:23;;;76888:20;;;:46;76816:134;-1:-1:-1;76981:16:0;;;;:11;:16;;;;;77017:15;76981:52;;:26;;;;:52;76271:783::o;75487:770::-;75536:18;75557:5;75563:3;75557:10;;;;;;;;:::i;:::-;;;;;;;;;;;75536:31;;75580:19;75602:4;:14;;;75580:36;;75627:11;75642:1;75627:16;75623:29;;75645:7;;75487:770;:::o;75623:29::-;75660:26;75707:4;:14;;;75689:15;:32;;;;:::i;:::-;75660:61;;75732:18;75754:1;75732:23;75728:36;;75757:7;;;75487:770;:::o;75728:36::-;76048:16;;;;75945:3;;75925:17;;76048:28;;75945:3;;-1:-1:-1;;;76048:16:0;;;;:28;:::i;:::-;76011:32;76025:18;76011:11;:32;:::i;:::-;76010:67;;;;:::i;:::-;75994:83;;76169:11;76161:5;:19;:45;;76187:19;76201:5;76187:11;:19;:::i;:::-;76161:45;;;76183:1;76161:45;76144:14;;;:62;-1:-1:-1;;;76213:40:0;76237:15;76213:40;:14;;;;:40;;;;-1:-1:-1;;75487:770:0:o;77062:1387::-;77120:13;77142:17;77162:5;77168:3;77162:10;;;;;;;;:::i;:::-;;;;;;;;;77142:30;;;;;;;;77162:10;;;;;;;77142:30;;-1:-1:-1;;;;;77142:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77142:30:0;;;;;;;;77270:52;;-1:-1:-1;;;77270:52:0;;;;77142:30;;-1:-1:-1;77142:30:0;77270:50;;:52;;;;77162:10;;77270:52;;;;;;77142:30;77270:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77247:75;;77329:19;77374:4;:15;;;-1:-1:-1;;;;;77351:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77329:73;;77467:17;77487:28;77511:3;77487:23;:28::i;:::-;77467:48;;77522:17;77542:15;77553:3;77542:10;:15::i;:::-;77522:35;-1:-1:-1;77629:29:0;77522:35;-1:-1:-1;;77629:29:0;:::i;:::-;77617:9;:41;77613:90;;;-1:-1:-1;;;;77678:17:0;;;;;-1:-1:-1;;77062:1387:0:o;77613:90::-;77764:16;77783:21;77795:9;77783;:21;:::i;:::-;77764:40;-1:-1:-1;77851:22:0;77915:13;77876:31;77892:14;77881:2;77876:31;:::i;:::-;:53;;;;:::i;:::-;77851:78;;77966:1;77946:17;:21;;;77942:131;;;78034:30;78046:17;78034:2;:30;:::i;:::-;78022:43;;:8;:43;:::i;:::-;78011:54;;77942:131;78165:4;78147:15;78165:4;78147:8;:15;:::i;:::-;:22;;;;:::i;:::-;78139:30;;78228:4;:17;;;78220:5;:25;78216:75;;;78266:4;:17;;;78258:25;;78216:75;78344:24;78364:4;-1:-1:-1;;78344:24:0;:::i;:::-;78336:5;:32;78332:89;;;78389:24;78409:4;-1:-1:-1;;78389:24:0;:::i;:::-;78381:32;;78332:89;78433:12;;;;;;;77062:1387;;;:::o;16257:190::-;16385:53;;-1:-1:-1;;;;;29556:32:1;;;16385:53:0;;;29538:51:1;29625:32;;;29605:18;;;29598:60;29674:18;;;29667:34;;;16358:81:0;;16378:5;;16400:18;;;;;29511::1;;16385:53:0;29336:371:1;47044:158:0;47118:7;47169:22;47173:3;47185:5;47169:3;:22::i;47752:282::-;47815:16;47844:22;47869:19;47877:3;47869:7;:19::i;46573:117::-;46636:7;46663:19;46671:3;41901:18;;41818:109;33596:201;33685:22;33693:4;33699:7;33685;:22::i;:::-;33680:110;;33731:47;;-1:-1:-1;;;33731:47:0;;-1:-1:-1;;;;;28544:32:1;;33731:47:0;;;28526:51:1;28593:18;;;28586:34;;;28499:18;;33731:47:0;28352:274:1;22443:738:0;22524:18;22553:19;22693:4;22690:1;22683:4;22677:11;22670:4;22664;22660:15;22657:1;22650:5;22643;22638:60;22752:7;22742:180;;22797:4;22791:11;22843:16;22840:1;22835:3;22820:40;22890:16;22885:3;22878:29;22742:180;-1:-1:-1;;23001:1:0;22995:8;22950:16;;-1:-1:-1;23030:15:0;;:68;;23082:11;23097:1;23082:16;;23030:68;;;-1:-1:-1;;;;;23048:26:0;;;:31;23030:68;23026:148;;;23122:40;;-1:-1:-1;;;23122:40:0;;-1:-1:-1;;;;;7713:32:1;;23122:40:0;;;7695:51:1;7668:18;;23122:40:0;7549:203:1;36432:324:0;36509:4;36531:22;36539:4;36545:7;36531;:22::i;:::-;36526:223;;36570:6;:12;;;;;;;;;;;-1:-1:-1;;;;;36570:29:0;;;;;;;;;:36;;-1:-1:-1;;36570:36:0;36602:4;36570:36;;;36653:12;29305:10;;29225:98;36653:12;-1:-1:-1;;;;;36626:40:0;36644:7;-1:-1:-1;;;;;36626:40:0;36638:4;36626:40;;;;;;;;;;-1:-1:-1;36688:4:0;36681:11;;36526:223;-1:-1:-1;36732:5:0;36725:12;;45748:152;45818:4;45842:50;45847:3;-1:-1:-1;;;;;45867:23:0;;45842:4;:50::i;37000:325::-;37078:4;37099:22;37107:4;37113:7;37099;:22::i;:::-;37095:223;;;37170:5;37138:12;;;;;;;;;;;-1:-1:-1;;;;;37138:29:0;;;;;;;;;;:37;;-1:-1:-1;;37138:37:0;;;37195:40;29305:10;;37138:12;;37195:40;;37170:5;37195:40;-1:-1:-1;37257:4:0;37250:11;;46076:158;46149:4;46173:53;46181:3;-1:-1:-1;;;;;46201:23:0;;46173:7;:53::i;79530:1580::-;79599:7;79615:17;79635:5;79641:3;79635:10;;;;;;;;:::i;:::-;;;;;;;;;79615:30;;;;;;;;79635:10;;;;;;;79615:30;;-1:-1:-1;;;;;79615:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;79615:30:0;;;;;;;;79679:16;;;;;;;;;79652:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79751:20;79615:30;;-1:-1:-1;79652:43:0;79849:15;79691:3;79849:10;:15::i;:::-;79822:42;;79871:26;79918:4;:13;;;79900:31;;:15;:31;:89;;79988:1;79900:89;;;79962:13;;;;79944:31;;;;:15;:31;:::i;:::-;79871:118;;80094:25;80150:4;:12;;;80123:16;80142:4;80123:23;;;;:::i;:::-;80122:40;;;;:::i;:::-;80094:68;-1:-1:-1;80206:19:0;80260:22;:18;80281:1;80260:22;:::i;:::-;80229:26;80238:17;80229:6;:26;:::i;:::-;80228:55;;;;:::i;:::-;80206:77;;80399:10;:17;;;80376:10;:20;;;:40;;;;:::i;:::-;80357:15;:59;80353:633;;80433:14;;80429:550;;;80518:15;;;;80508:25;;;;:::i;:::-;;;80617:10;:17;;;80608:6;:26;80604:93;;;80664:10;:17;;;80655:26;;80604:93;80429:550;;;80783:15;;;;80773:25;;;;:::i;:::-;;;80888:10;:17;;;80879:6;:26;80875:93;;;80935:10;:17;;;80926:26;;80875:93;81027:11;81018:6;:20;81014:72;;;81058:20;81067:11;81058:6;:20;:::i;78619:898::-;78675:7;78695:17;78715:5;78721:3;78715:10;;;;;;;;:::i;:::-;;;;;;;;;78695:30;;;;;;;;78715:10;;;;;;;78695:30;;-1:-1:-1;;;;;78695:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;78695:30:0;;;;;;;;78811:51;;-1:-1:-1;;;78811:51:0;;;;78695:30;;-1:-1:-1;78695:30:0;78811:49;;:51;;;;78715:10;;78811:51;;;;;;78695:30;78811:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78783:80;;78870:20;78922:4;:16;;;-1:-1:-1;;;;;78899:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;78870:82;-1:-1:-1;79034:17:0;79077:19;78870:82;79077:2;:19;:::i;:::-;79072:25;;:2;:25;:::i;:::-;79054:4;:14;;;:44;;;;:::i;:::-;79034:64;-1:-1:-1;79164:20:0;79220:18;79225:13;79220:2;:18;:::i;:::-;79213:26;;:2;:26;:::i;:::-;79187:4;:22;;;:53;;;;:::i;:::-;79164:76;;79290:12;79306:1;79290:17;79286:55;;-1:-1:-1;79328:4:0;;78619:898;-1:-1:-1;;;;;;78619:898:0:o;79286:55::-;79431:17;79472:12;79452:16;:9;79464:4;79452:16;:::i;:::-;79451:33;;;;:::i;:::-;79431:53;78619:898;-1:-1:-1;;;;;;;;78619:898:0:o;42281:120::-;42348:7;42375:3;:11;;42387:5;42375:18;;;;;;;;:::i;:::-;;;;;;;;;42368:25;;42281:120;;;;:::o;42951:111::-;43007:16;43043:3;:11;;43036:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42951:111;;;:::o;39523:416::-;39586:4;41698:21;;;:14;;;:21;;;;;;39603:329;;-1:-1:-1;39646:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;39831:18;;39807:21;;;:14;;;:21;;;;;;:42;;;;39864:11;;40115:1400;40181:4;40312:21;;;:14;;;:21;;;;;;40350:13;;40346:1162;;40723:18;40744:12;40755:1;40744:8;:12;:::i;:::-;40791:18;;40723:33;;-1:-1:-1;40771:17:0;;40791:22;;40812:1;;40791:22;:::i;:::-;40771:42;;40848:9;40834:10;:23;40830:385;;40878:17;40898:3;:11;;40910:9;40898:22;;;;;;;;:::i;:::-;;;;;;;;;40878:42;;41048:9;41022:3;:11;;41034:10;41022:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;41163:25;;;:14;;;:25;;;;;:36;;;40830:385;41296:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41402:3;:14;;:21;41417:5;41402:21;;;;;;;;;;;41395:28;;;41447:4;41440:11;;;;;;;40346:1162;41491:5;41484:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;1519:18;1511:6;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;1722:18;1714:6;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;;-1:-1:-1;3495:3:1;;2799:705;-1:-1:-1;;;;;2799:705:1:o;3509:226::-;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6706:487::-;6783:6;6791;6799;6852:2;6840:9;6831:7;6827:23;6823:32;6820:52;;;6868:1;6865;6858:12;6820:52;6913:23;;;-1:-1:-1;7033:2:1;7018:18;;7005:32;;-1:-1:-1;7115:2:1;7100:18;;7087:32;7128:33;7087:32;7128:33;:::i;:::-;7180:7;7170:17;;;6706:487;;;;;:::o;7198:346::-;7266:6;7274;7327:2;7315:9;7306:7;7302:23;7298:32;7295:52;;;7343:1;7340;7333:12;7295:52;-1:-1:-1;;7388:23:1;;;7508:2;7493:18;;;7480:32;;-1:-1:-1;7198:346:1:o;7757:388::-;7825:6;7833;7886:2;7874:9;7865:7;7861:23;7857:32;7854:52;;;7902:1;7899;7892:12;7854:52;7941:9;7928:23;7960:31;7985:5;7960:31;:::i;:::-;8010:5;-1:-1:-1;8067:2:1;8052:18;;8039:32;8080:33;8039:32;8080:33;:::i;8150:637::-;8340:2;8352:21;;;8422:13;;8325:18;;;8444:22;;;8292:4;;8523:15;;;8497:2;8482:18;;;8292:4;8566:195;8580:6;8577:1;8574:13;8566:195;;;8645:13;;-1:-1:-1;;;;;8641:39:1;8629:52;;8710:2;8736:15;;;;8701:12;;;;8677:1;8595:9;8566:195;;10254:163;10321:20;;10381:10;10370:22;;10360:33;;10350:61;;10407:1;10404;10397:12;10350:61;10254:163;;;:::o;10422:184::-;10480:6;10533:2;10521:9;10512:7;10508:23;10504:32;10501:52;;;10549:1;10546;10539:12;10501:52;10572:28;10590:9;10572:28;:::i;10611:127::-;10672:10;10667:3;10663:20;10660:1;10653:31;10703:4;10700:1;10693:15;10727:4;10724:1;10717:15;10743:372;10814:2;10808:9;10879:2;10860:13;;-1:-1:-1;;10856:27:1;10844:40;;10914:18;10899:34;;10935:22;;;10896:62;10893:185;;;11000:10;10995:3;10991:20;10988:1;10981:31;11035:4;11032:1;11025:15;11063:4;11060:1;11053:15;10893:185;11094:2;11087:22;10743:372;;-1:-1:-1;10743:372:1:o;11120:566::-;11169:5;11222:3;11215:4;11207:6;11203:17;11199:27;11189:55;;11240:1;11237;11230:12;11189:55;11341:19;11319:2;11341:19;:::i;:::-;11384:3;11422:2;11414:6;11410:15;11448:3;11440:6;11437:15;11434:35;;;11465:1;11462;11455:12;11434:35;11489:6;11504:151;11520:6;11515:3;11512:15;11504:151;;;11588:22;11606:3;11588:22;:::i;:::-;11576:35;;11640:4;11631:14;;;;11537;11504:151;;11691:1115;11835:6;11843;11851;11859;11912:3;11900:9;11891:7;11887:23;11883:33;11880:53;;;11929:1;11926;11919:12;11880:53;11968:9;11955:23;11987:31;12012:5;11987:31;:::i;:::-;12037:5;-1:-1:-1;12094:2:1;12079:18;;12066:32;12107:33;12066:32;12107:33;:::i;:::-;12159:7;-1:-1:-1;12204:2:1;12189:18;;12185:32;-1:-1:-1;12175:60:1;;12231:1;12228;12221:12;12175:60;12333:20;12310:3;12333:20;:::i;:::-;12375:3;12416;12405:9;12401:19;12443:7;12435:6;12432:19;12429:39;;;12464:1;12461;12454:12;12429:39;12503:2;12492:9;12488:18;12515:202;12531:6;12526:3;12523:15;12515:202;;;12625:17;;12655:20;;12704:2;12695:12;;;;12548;12515:202;;;12519:3;12736:5;12726:15;;12760:40;12792:7;12784:6;12760:40;:::i;:::-;12750:50;;;;;11691:1115;;;;;;;:::o;12811:127::-;12872:10;12867:3;12863:20;12860:1;12853:31;12903:4;12900:1;12893:15;12927:4;12924:1;12917:15;12943:342;13145:2;13127:21;;;13184:2;13164:18;;;13157:30;-1:-1:-1;;;13218:2:1;13203:18;;13196:48;13276:2;13261:18;;12943:342::o;13632:127::-;13693:10;13688:3;13684:20;13681:1;13674:31;13724:4;13721:1;13714:15;13748:4;13745:1;13738:15;13764:128;13831:9;;;13852:11;;;13849:37;;;13866:18;;:::i;14601:273::-;14669:6;14722:2;14710:9;14701:7;14697:23;14693:32;14690:52;;;14738:1;14735;14728:12;14690:52;14770:9;14764:16;14820:4;14813:5;14809:16;14802:5;14799:27;14789:55;;14840:1;14837;14830:12;16291:125;16356:9;;;16377:10;;;16374:36;;;16390:18;;:::i;16421:136::-;16460:3;16488:5;16478:39;;16497:18;;:::i;:::-;-1:-1:-1;;;16533:18:1;;16421:136::o;16562:127::-;16623:10;16618:3;16614:20;16611:1;16604:31;16654:4;16651:1;16644:15;16678:4;16675:1;16668:15;18450:168;18523:9;;;18554;;18571:15;;;18565:22;;18551:37;18541:71;;18592:18;;:::i;18623:217::-;18663:1;18689;18679:132;;18733:10;18728:3;18724:20;18721:1;18714:31;18768:4;18765:1;18758:15;18796:4;18793:1;18786:15;18679:132;-1:-1:-1;18825:9:1;;18623:217::o;19559:184::-;19629:6;19682:2;19670:9;19661:7;19657:23;19653:32;19650:52;;;19698:1;19695;19688:12;19650:52;-1:-1:-1;19721:16:1;;19559:184;-1:-1:-1;19559:184:1:o;22697:170::-;22794:10;22787:18;;;22767;;;22763:43;;22818:20;;22815:46;;;22841:18;;:::i;26780:375::-;26868:1;26886:5;26900:249;26921:1;26911:8;26908:15;26900:249;;;26971:4;26966:3;26962:14;26956:4;26953:24;26950:50;;;26980:18;;:::i;:::-;27030:1;27020:8;27016:16;27013:49;;;27044:16;;;;27013:49;27127:1;27123:16;;;;;27083:15;;26900:249;;;26780:375;;;;;;:::o;27160:902::-;27209:5;27239:8;27229:80;;-1:-1:-1;27280:1:1;27294:5;;27229:80;27328:4;27318:76;;-1:-1:-1;27365:1:1;27379:5;;27318:76;27410:4;27428:1;27423:59;;;;27496:1;27491:174;;;;27403:262;;27423:59;27453:1;27444:10;;27467:5;;;27491:174;27528:3;27518:8;27515:17;27512:43;;;27535:18;;:::i;:::-;-1:-1:-1;;27591:1:1;27577:16;;27650:5;;27403:262;;27749:2;27739:8;27736:16;27730:3;27724:4;27721:13;27717:36;27711:2;27701:8;27698:16;27693:2;27687:4;27684:12;27680:35;27677:77;27674:203;;;-1:-1:-1;27786:19:1;;;27862:5;;27674:203;27909:42;-1:-1:-1;;27934:8:1;27928:4;27909:42;:::i;:::-;27987:6;27983:1;27979:6;27975:19;27966:7;27963:32;27960:58;;;27998:18;;:::i;:::-;28036:20;;27160:902;-1:-1:-1;;;27160:902:1:o;28067:140::-;28125:5;28154:47;28195:4;28185:8;28181:19;28175:4;28154:47;:::i;28212:135::-;28251:3;28272:17;;;28269:43;;28292:18;;:::i;:::-;-1:-1:-1;28339:1:1;28328:13;;28212:135::o;28991:151::-;29081:4;29074:12;;;29060;;;29056:31;;29099:14;;29096:40;;;29116:18;;:::i;29147:184::-;29184:4;29233:16;;;29215;;;;29211:39;-1:-1:-1;;29265:19:1;;29296:4;29286:15;;29262:40;29259:66;;;29305:18;;:::i
Swarm Source
ipfs://e514c4ba12b7475ee8eaf6e6368ace102c3956532ccc01615954b80d91892db0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.