More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,098 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Bridge Tokens | 15433628 | 17 days ago | IN | 10.1 CRO | 0.31174487 | ||||
Bridge Tokens | 15429667 | 18 days ago | IN | 10.1 CRO | 0.31162371 | ||||
Update Chain Fee... | 15186302 | 34 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15186095 | 34 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15185992 | 34 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15185939 | 34 days ago | IN | 0 CRO | 0.707413 | ||||
Update Chain Fee... | 15185785 | 34 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15185630 | 34 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15154735 | 36 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 15154322 | 36 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14973012 | 48 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14972639 | 48 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14926840 | 51 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14926522 | 51 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14924875 | 51 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14924766 | 51 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14910330 | 52 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14910116 | 52 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14909424 | 52 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14909162 | 52 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14881885 | 54 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14881570 | 54 days ago | IN | 0 CRO | 0.707 | ||||
Bridge Tokens | 14713100 | 65 days ago | IN | 19.1 CRO | 0.31174487 | ||||
Update Chain Fee... | 14695083 | 66 days ago | IN | 0 CRO | 0.707 | ||||
Update Chain Fee... | 14694370 | 66 days ago | IN | 0 CRO | 0.707 |
Loading...
Loading
Contract Name:
MagicverseBridge
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2023-11-29 */ // SPDX-License-Identifier: MIT /* ███╗░░░███╗░█████╗░░██████╗░██╗░█████╗░██╗░░░██╗███████╗██████╗░░██████╗███████╗ ████╗░████║██╔══██╗██╔════╝░██║██╔══██╗██║░░░██║██╔════╝██╔══██╗██╔════╝██╔════╝ ██╔████╔██║███████║██║░░██╗░██║██║░░╚═╝╚██╗░██╔╝█████╗░░██████╔╝╚█████╗░█████╗░░ ██║╚██╔╝██║██╔══██║██║░░╚██╗██║██║░░██╗░╚████╔╝░██╔══╝░░██╔══██╗░╚═══██╗██╔══╝░░ ██║░╚═╝░██║██║░░██║╚██████╔╝██║╚█████╔╝░░╚██╔╝░░███████╗██║░░██║██████╔╝███████╗ ╚═╝░░░░░╚═╝╚═╝░░╚═╝░╚═════╝░╚═╝░╚════╝░░░░╚═╝░░░╚══════╝╚═╝░░╚═╝╚═════╝░╚══════╝ */ pragma solidity ^0.8.18; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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 amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` 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 amount) external returns (bool); } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @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). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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. * * _Available since v3.1._ */ 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, an admin role * bearer except when using {AccessControl-_setupRole}. */ 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 `account`. */ function renounceRole(bytes32 role, address account) external; } /** * @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: * * ``` * 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}: * * ``` * 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. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ 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 override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @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 override 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. */ function grantRole(bytes32 role, address account) public virtual override 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. */ function revokeRole(bytes32 role, address account) public virtual override 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 `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @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 Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } interface IOrb { function bridgeMint(address to, uint256 amount) external ; function bridgeBurn(address from, uint256 amount) external ; } interface IMagicAssets { function mintMagicAssets(address account, uint256 id, uint256 amount) external; function mintMagicAssetsBanch(address account, uint256[] memory ids, uint256[] memory amounts) external; function burnMagicAssetsBanch(address account, uint256[] memory ids, uint256[] memory amounts) external; } interface IElementalPhoenixes { function mintPhoenix(address account, uint256 id, uint256 amount) external; function mintPhoenixBanch(address account, uint256[] memory ids, uint256[] memory amounts) external; function burnPhoenixBanch(address account, uint256[] memory ids, uint256[] memory amounts) external; } contract MagicverseBridge is AccessControl,ReentrancyGuard { bytes32 public constant BRIDGE_OPERATOR1 = keccak256("BRIDGE_OPERATOR1"); bytes32 public constant BRIDGE_OPERATOR2 = keccak256("BRIDGE_OPERATOR2"); bytes32 public constant BRIDGE_OPERATOR3 = keccak256("BRIDGE_OPERATOR3"); using SafeERC20 for IERC20; IERC20 public Orb; IOrb public xOrb; IMagicAssets public MagicAssets; IERC1155 public MAssets; IElementalPhoenixes public ElementalPhoenixes; IERC1155 public EPhoenixes; uint256 public ChainFunds; struct TargetedChain { uint256 BridgeFee; uint256 MultiplierForOrb; uint256 MultiplierForNFT; uint256 MultiplierForFunds; } mapping(uint256=>TargetedChain) public TargetedChains; struct OrbTransaction { bool Executed; address payable requester; uint256 orbAmount; bool includeChainFunds; } mapping(bytes32 => OrbTransaction) public OrbTransactions; struct NFTMATransaction { bool Executed; uint256 id0; uint256 id1; uint256 id2; uint256 id3; uint256 id4; uint256 id5; address payable requester; bool includeChainFunds; } mapping(bytes32 => NFTMATransaction) public NFTMATransactions; struct NFTEPTransaction { bool Executed; uint256 id0; uint256 id1; address payable requester; bool includeChainFunds; } mapping(bytes32 => NFTEPTransaction) public NFTEPTransactions; receive() external payable {} function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4) { return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")); } function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4){ return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")); } event TransactionInitialized( uint256 indexed fromChain, uint Type, bytes32 TxHash, uint256 timestamp ); event BridgeTokensRequested( uint256 targetChainId, address indexed to, uint256 orbAmount, bool FeefundsForChain, uint256 timestamp ); event BridgeTokensExecuted( uint256 FromChain, address indexed to, uint256 orbAmount, uint256 coinAmount, uint256 timestamp ); event BridgeMANFTRequested( uint256 targetChainId, address indexed to, uint256 [] ids, uint256 [] amounts, bool FeefundsForChain, uint256 timestamp ); event BridgeEPNFTRequested( uint256 targetChainId, address indexed to, uint256 [] ids, uint256 [] amounts, bool FeefundsForChain, uint256 timestamp ); event BridgeMANFTExecuted( uint256 FromChain, address indexed to, uint256 [] NFTid, uint256 [] amounts, uint256 coinAmount, uint256 timestamp ); event BridgeEPNFTExecuted( uint256 FromChain, address indexed to, uint256 [] NFTid, uint256 [] amounts, uint256 coinAmount, uint256 timestamp ); constructor (address _Orb,address _MagicAssets,address _ElementalPhoenixes) { MagicAssets = IMagicAssets(_MagicAssets); MAssets = IERC1155(_MagicAssets); ElementalPhoenixes = IElementalPhoenixes(_ElementalPhoenixes); EPhoenixes = IERC1155(_ElementalPhoenixes); Orb = IERC20(_Orb); xOrb = IOrb(_Orb); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(BRIDGE_OPERATOR3, msg.sender); } function addSupportedChain(uint256 _chainId,uint256 _BridgeFee,uint _MultiplierForOrb_x100,uint _MultiplierForNFT_x100,uint _MultiplierForFunds_x100) external onlyRole(DEFAULT_ADMIN_ROLE) { TargetedChains[_chainId] = TargetedChain(_BridgeFee,_MultiplierForOrb_x100,_MultiplierForNFT_x100,_MultiplierForFunds_x100); } function updateChainMultipliers (uint256 chainId,uint _MultiplierForOrb_x100,uint _MultiplierForNFT_x100,uint _MultiplierForFunds_x100) external onlyRole(BRIDGE_OPERATOR3) { TargetedChain storage targetedChain = TargetedChains[chainId]; targetedChain.MultiplierForOrb = _MultiplierForOrb_x100; targetedChain.MultiplierForNFT = _MultiplierForNFT_x100; targetedChain.MultiplierForFunds = _MultiplierForFunds_x100; } function updateChainFundFees(uint256 _ChainFunds) external onlyRole(BRIDGE_OPERATOR3) { ChainFunds = _ChainFunds; } function updateChainFees(uint256 chainId,uint256 _ChainFee) external onlyRole(BRIDGE_OPERATOR3) { TargetedChain storage targetedChain = TargetedChains[chainId]; targetedChain.BridgeFee = _ChainFee; } function BridgeTokens (uint256 _targetChainId,address _requester, uint256 _orbAmount, bool _includeChainFunds) nonReentrant payable external { require(Orb.balanceOf(msg.sender)>=_orbAmount); TargetedChain memory targetedChain = TargetedChains[_targetChainId]; require(targetedChain.BridgeFee>0 && targetedChain.MultiplierForOrb>0,"chain Not Supported"); uint256 TotalFees = targetedChain.BridgeFee*targetedChain.MultiplierForOrb/100; if (_includeChainFunds) { require(targetedChain.MultiplierForFunds>0); TotalFees = TotalFees + (targetedChain.BridgeFee*targetedChain.MultiplierForFunds/100); } require(msg.value >= TotalFees, "not enough fee funds"); xOrb.bridgeBurn(msg.sender, _orbAmount); emit BridgeTokensRequested(_targetChainId, _requester,_orbAmount,_includeChainFunds,block.timestamp); } function Initialize_TokenTransaction (uint256 _FromChain, bytes32 TxHash, address payable _requester, uint256 _orbAmount, bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR1) nonReentrant external { OrbTransaction storage orbTransaction = OrbTransactions[TxHash]; require(!orbTransaction.Executed); orbTransaction.requester = _requester; orbTransaction.orbAmount = _orbAmount; orbTransaction.includeChainFunds = _includeChainFunds; emit TransactionInitialized(_FromChain,1,TxHash,block.timestamp); } function Finalize_TokenTransaction (uint256 _FromChain, bytes32 TxHash, address payable _requester, uint256 _orbAmount, bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR2) nonReentrant external { OrbTransaction storage orbTransaction = OrbTransactions[TxHash]; require( !orbTransaction.Executed && orbTransaction.requester == _requester && orbTransaction.orbAmount == _orbAmount && orbTransaction.includeChainFunds == _includeChainFunds ); orbTransaction.Executed = true; xOrb.bridgeMint(_requester, _orbAmount); uint256 coinAmount; if(_includeChainFunds){ coinAmount = ChainFunds; _requester.transfer(ChainFunds); } emit BridgeTokensExecuted(_FromChain, _requester, _orbAmount, coinAmount, block.timestamp); } function BridgeMANFT (uint256 _targetChainId,address _requester, uint256 [] memory _ids,uint256 [] memory _idAmounts,bool _includeChainFunds) nonReentrant payable external { TargetedChain memory targetedChain = TargetedChains[_targetChainId]; require(targetedChain.BridgeFee>0 && targetedChain.MultiplierForNFT>0,"chain Not Supported"); uint256 TotalFees = targetedChain.BridgeFee*targetedChain.MultiplierForNFT/100; for (uint i=0;i<_ids.length;i++){ require(_idAmounts[i]>0); require(MAssets.balanceOf(msg.sender,_ids[i]) >= _idAmounts[i]); if (i>0){ TotalFees = TotalFees + ((targetedChain.BridgeFee*targetedChain.MultiplierForNFT/100)/4); } } if (_includeChainFunds) { require(targetedChain.MultiplierForFunds>0); TotalFees = TotalFees + (targetedChain.BridgeFee*targetedChain.MultiplierForFunds/100); } require(msg.value >= TotalFees, "not enough fee funds"); MagicAssets.burnMagicAssetsBanch(msg.sender,_ids,_idAmounts); emit BridgeMANFTRequested(_targetChainId, _requester, _ids, _idAmounts, _includeChainFunds, block.timestamp); } function Initialize_MANFTTransaction (uint256 _FromChain,bytes32 TxHash, address payable _requester, uint256 [] memory _ids,uint256 [] memory _idamounts,bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR1) nonReentrant external { NFTMATransaction storage nftTransaction = NFTMATransactions[TxHash]; require(!nftTransaction.Executed); nftTransaction.requester = _requester; nftTransaction.includeChainFunds = _includeChainFunds; require(_ids.length == _idamounts.length); for (uint i = 0; i<_ids.length; i++){ require(_ids[i]<6); _ids[i] == 0 ? nftTransaction.id0 = _idamounts[i] : _ids[i] == 1 ? nftTransaction.id1 = _idamounts[i] : _ids[i] == 2 ? nftTransaction.id2 = _idamounts[i] : _ids[i] == 3 ? nftTransaction.id3 = _idamounts[i] : _ids[i] == 4 ? nftTransaction.id4 = _idamounts[i] : nftTransaction.id5 = _idamounts[i]; } emit TransactionInitialized(_FromChain,2,TxHash,block.timestamp); } function Finalize_MANFTTransaction (uint _FromChain,bytes32 TxHash, address payable _requester, uint256 [] memory _ids,uint256 [] memory _idAmounts,bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR2) nonReentrant external { NFTMATransaction storage nftTransaction = NFTMATransactions[TxHash]; require( !nftTransaction.Executed && nftTransaction.requester == _requester && nftTransaction.includeChainFunds == _includeChainFunds ); for (uint i = 0; i<_ids.length; i++){ require(_ids[i]<6); _ids[i] == 0 ? require(nftTransaction.id0 == _idAmounts[i]) : _ids[i] == 1 ? require(nftTransaction.id1 == _idAmounts[i]) : _ids[i] == 2 ? require(nftTransaction.id2 == _idAmounts[i]) : _ids[i] == 3 ? require(nftTransaction.id3 == _idAmounts[i]) : _ids[i] == 4 ? require(nftTransaction.id4 == _idAmounts[i]) : require(nftTransaction.id5 == _idAmounts[i]); } nftTransaction.Executed = true; MagicAssets.mintMagicAssetsBanch(_requester, _ids,_idAmounts); uint256 coinAmount; if(_includeChainFunds){ coinAmount = ChainFunds; _requester.transfer(ChainFunds); } emit BridgeMANFTExecuted(_FromChain, _requester, _ids, _idAmounts, coinAmount, block.timestamp); } function BridgeEPNFT (uint256 _targetChainId,address _requester, uint256 [] memory _ids,uint256 [] memory _idAmounts,bool _includeChainFunds) nonReentrant payable external { TargetedChain memory targetedChain = TargetedChains[_targetChainId]; require(targetedChain.BridgeFee>0 && targetedChain.MultiplierForNFT>0,"chain Not Supported"); uint256 TotalFees = targetedChain.BridgeFee*targetedChain.MultiplierForNFT/100; for (uint i=0;i<_ids.length;i++){ require(_idAmounts[i]>0); require(EPhoenixes.balanceOf(msg.sender,_ids[i]) >= _idAmounts[i]); if (i>0){ TotalFees = TotalFees + ((targetedChain.BridgeFee*targetedChain.MultiplierForNFT/100)/4); } } if (_includeChainFunds) { require(targetedChain.MultiplierForFunds>0); TotalFees = TotalFees + (targetedChain.BridgeFee*targetedChain.MultiplierForFunds/100); } require(msg.value >= TotalFees, "not enough fee funds"); ElementalPhoenixes.burnPhoenixBanch(msg.sender,_ids,_idAmounts); emit BridgeEPNFTRequested(_targetChainId, _requester, _ids, _idAmounts, _includeChainFunds, block.timestamp); } function Initialize_EPNFTTransaction (uint256 _FromChain, bytes32 TxHash, address payable _requester, uint256 [] memory _ids,uint256 [] memory _idamounts,bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR1) nonReentrant external { NFTEPTransaction storage nftTransaction = NFTEPTransactions[TxHash]; require(!nftTransaction.Executed); nftTransaction.requester = _requester; nftTransaction.includeChainFunds = _includeChainFunds; require(_ids.length == _idamounts.length); for (uint i = 0; i<_ids.length; i++){ require(_ids[i]<2); _ids[i] == 0 ? nftTransaction.id0 = _idamounts[i] : nftTransaction.id1 = _idamounts[i]; } emit TransactionInitialized(_FromChain,3,TxHash,block.timestamp); } function Finalize_EPNFTTransaction (uint _FromChain, bytes32 TxHash, address payable _requester, uint256 [] memory _ids,uint256 [] memory _idAmounts,bool _includeChainFunds) onlyRole(BRIDGE_OPERATOR2) nonReentrant external { NFTEPTransaction storage nftTransaction = NFTEPTransactions[TxHash]; require( !nftTransaction.Executed && nftTransaction.requester == _requester && nftTransaction.includeChainFunds == _includeChainFunds ); for (uint i = 0; i<_ids.length; i++){ require(_ids[i]<2); _ids[i] == 0 ? require(nftTransaction.id0 == _idAmounts[i]) : require(nftTransaction.id1 == _idAmounts[i]); } nftTransaction.Executed = true; ElementalPhoenixes.mintPhoenixBanch(_requester, _ids,_idAmounts); uint256 coinAmount; if(_includeChainFunds){ coinAmount = ChainFunds; _requester.transfer(ChainFunds); } emit BridgeEPNFTExecuted(_FromChain, _requester, _ids, _idAmounts, coinAmount, block.timestamp); } function withdrawCurrency(uint256 Amount) public payable onlyRole(DEFAULT_ADMIN_ROLE) { address payable admin = payable(msg.sender); admin.transfer(Amount); } function withdrawRandomToken(address random_Token_Address, uint256 _amount) external onlyRole(DEFAULT_ADMIN_ROLE) { require(random_Token_Address != address(Orb), "Can not remove native token"); IERC20(random_Token_Address).transfer(msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_Orb","type":"address"},{"internalType":"address","name":"_MagicAssets","type":"address"},{"internalType":"address","name":"_ElementalPhoenixes","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"FromChain","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"NFTid","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"coinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeEPNFTExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"targetChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bool","name":"FeefundsForChain","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeEPNFTRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"FromChain","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"NFTid","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"coinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeMANFTExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"targetChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bool","name":"FeefundsForChain","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeMANFTRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"FromChain","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"orbAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"coinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeTokensExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"targetChainId","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"orbAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"FeefundsForChain","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BridgeTokensRequested","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":true,"internalType":"uint256","name":"fromChain","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"Type","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TransactionInitialized","type":"event"},{"inputs":[],"name":"BRIDGE_OPERATOR1","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BRIDGE_OPERATOR2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BRIDGE_OPERATOR3","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetChainId","type":"uint256"},{"internalType":"address","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idAmounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"BridgeEPNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetChainId","type":"uint256"},{"internalType":"address","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idAmounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"BridgeMANFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetChainId","type":"uint256"},{"internalType":"address","name":"_requester","type":"address"},{"internalType":"uint256","name":"_orbAmount","type":"uint256"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"BridgeTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ChainFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EPhoenixes","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ElementalPhoenixes","outputs":[{"internalType":"contract IElementalPhoenixes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idAmounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Finalize_EPNFTTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idAmounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Finalize_MANFTTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256","name":"_orbAmount","type":"uint256"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Finalize_TokenTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idamounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Initialize_EPNFTTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_idamounts","type":"uint256[]"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Initialize_MANFTTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FromChain","type":"uint256"},{"internalType":"bytes32","name":"TxHash","type":"bytes32"},{"internalType":"address payable","name":"_requester","type":"address"},{"internalType":"uint256","name":"_orbAmount","type":"uint256"},{"internalType":"bool","name":"_includeChainFunds","type":"bool"}],"name":"Initialize_TokenTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAssets","outputs":[{"internalType":"contract IERC1155","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MagicAssets","outputs":[{"internalType":"contract IMagicAssets","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"NFTEPTransactions","outputs":[{"internalType":"bool","name":"Executed","type":"bool"},{"internalType":"uint256","name":"id0","type":"uint256"},{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"address payable","name":"requester","type":"address"},{"internalType":"bool","name":"includeChainFunds","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"NFTMATransactions","outputs":[{"internalType":"bool","name":"Executed","type":"bool"},{"internalType":"uint256","name":"id0","type":"uint256"},{"internalType":"uint256","name":"id1","type":"uint256"},{"internalType":"uint256","name":"id2","type":"uint256"},{"internalType":"uint256","name":"id3","type":"uint256"},{"internalType":"uint256","name":"id4","type":"uint256"},{"internalType":"uint256","name":"id5","type":"uint256"},{"internalType":"address payable","name":"requester","type":"address"},{"internalType":"bool","name":"includeChainFunds","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Orb","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"OrbTransactions","outputs":[{"internalType":"bool","name":"Executed","type":"bool"},{"internalType":"address payable","name":"requester","type":"address"},{"internalType":"uint256","name":"orbAmount","type":"uint256"},{"internalType":"bool","name":"includeChainFunds","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TargetedChains","outputs":[{"internalType":"uint256","name":"BridgeFee","type":"uint256"},{"internalType":"uint256","name":"MultiplierForOrb","type":"uint256"},{"internalType":"uint256","name":"MultiplierForNFT","type":"uint256"},{"internalType":"uint256","name":"MultiplierForFunds","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"uint256","name":"_BridgeFee","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForOrb_x100","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForNFT_x100","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForFunds_x100","type":"uint256"}],"name":"addSupportedChain","outputs":[],"stateMutability":"nonpayable","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":"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":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"_ChainFee","type":"uint256"}],"name":"updateChainFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ChainFunds","type":"uint256"}],"name":"updateChainFundFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForOrb_x100","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForNFT_x100","type":"uint256"},{"internalType":"uint256","name":"_MultiplierForFunds_x100","type":"uint256"}],"name":"updateChainMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"Amount","type":"uint256"}],"name":"withdrawCurrency","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"random_Token_Address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawRandomToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"xOrb","outputs":[{"internalType":"contract IOrb","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002fa538038062002fa5833981016040819052620000349162000198565b60018055600480546001600160a01b038085166001600160a01b0319928316811790935560058054831690931790925560068054848416908316811790915560078054831690911790556002805492861692821683179055600380549091169091179055620000a5600033620000da565b620000d17f9ee27765e8a07d3e7921fed181db3fc935a03af4314f53d2e9df1e308b20260233620000da565b505050620001e2565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1662000177576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620001363390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80516001600160a01b03811681146200019357600080fd5b919050565b600080600060608486031215620001ae57600080fd5b620001b9846200017b565b9250620001c9602085016200017b565b9150620001d9604085016200017b565b90509250925092565b612db380620001f26000396000f3fe6080604052600436106102285760003560e01c80636556d71411610123578063a217fddf116100ab578063e532597a1161006f578063e532597a14610810578063f23a6e6114610830578063f5685cc614610876578063fb0e193714610896578063fba8965f146108f857600080fd5b8063a217fddf1461073a578063ba1bb0741461074f578063bc197c811461076f578063c7e17087146107d0578063d547741f146107f057600080fd5b806376821578116100f257806376821578146105fc57806383382b91146106125780638389aae9146106d85780638bbb9153146106f857806391d148541461071a57600080fd5b80636556d7141461058957806365c12d561461059c5780636f411535146105bc57806376199c3e146105dc57600080fd5b806331855ef4116101b15780633f5c8f53116101755780633f5c8f53146104e9578063409cc07d1461050957806345e778f41461052957806358c0e65c146105495780635e2f52f61461056957600080fd5b806331855ef41461046157806336568abe146104835780633c00a36c146104a35780633c688a39146104b65780633cf41a51146104c957600080fd5b806320bf1066116101f857806320bf1066146103a4578063234fcbba146103c6578063248a9ca3146103fe57806327b9f2ce1461042e5780632f2ff15d1461044157600080fd5b8062f1ed671461023457806301ffc9a7146102b65780631366e2b2146102e65780631eb761b31461031657600080fd5b3661022f57005b600080fd5b34801561024057600080fd5b5061028561024f366004612457565b600a6020526000908152604090208054600182015460029092015460ff808316936101009093046001600160a01b031692911684565b6040805194151585526001600160a01b03909316602085015291830152151560608201526080015b60405180910390f35b3480156102c257600080fd5b506102d66102d1366004612470565b610918565b60405190151581526020016102ad565b3480156102f257600080fd5b50610308600080516020612d1e83398151915281565b6040519081526020016102ad565b34801561032257600080fd5b5061036f610331366004612457565b600c60205260009081526040902080546001820154600283015460039093015460ff9283169391926001600160a01b03821691600160a01b90041685565b6040805195151586526020860194909452928401919091526001600160a01b031660608301521515608082015260a0016102ad565b3480156103b057600080fd5b506103c46103bf36600461249a565b61094f565b005b3480156103d257600080fd5b506004546103e6906001600160a01b031681565b6040516001600160a01b0390911681526020016102ad565b34801561040a57600080fd5b50610308610419366004612457565b60009081526020819052604090206001015490565b6103c461043c3660046124ef565b61098a565b34801561044d57600080fd5b506103c461045c366004612539565b610be7565b34801561046d57600080fd5b50610308600080516020612d5e83398151915281565b34801561048f57600080fd5b506103c461049e366004612539565b610c11565b6103c46104b1366004612457565b610c8f565b6103c46104c436600461261a565b610ccf565b3480156104d557600080fd5b506005546103e6906001600160a01b031681565b3480156104f557600080fd5b506103c46105043660046126af565b611000565b34801561051557600080fd5b506103c46105243660046126f7565b6110d1565b34801561053557600080fd5b506007546103e6906001600160a01b031681565b34801561055557600080fd5b506103c4610564366004612794565b611384565b34801561057557600080fd5b506103c46105843660046126f7565b6113af565b6103c461059736600461261a565b61160e565b3480156105a857600080fd5b506103c46105b73660046126f7565b611929565b3480156105c857600080fd5b506002546103e6906001600160a01b031681565b3480156105e857600080fd5b506006546103e6906001600160a01b031681565b34801561060857600080fd5b5061030860085481565b34801561061e57600080fd5b5061068761062d366004612457565b600b602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff96871697959694959394929391926001600160a01b03821691600160a01b90041689565b604080519915158a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401526001600160a01b031660e08301521515610100820152610120016102ad565b3480156106e457600080fd5b506103c46106f33660046127b6565b611c98565b34801561070457600080fd5b50610308600080516020612d3e83398151915281565b34801561072657600080fd5b506102d6610735366004612539565b611d72565b34801561074657600080fd5b50610308600081565b34801561075b57600080fd5b506103c461076a3660046126f7565b611d9b565b34801561077b57600080fd5b506107b761078a366004612870565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b6040516001600160e01b031990911681526020016102ad565b3480156107dc57600080fd5b506103c46107eb36600461292f565b611f20565b3480156107fc57600080fd5b506103c461080b366004612539565b611f75565b34801561081c57600080fd5b506003546103e6906001600160a01b031681565b34801561083c57600080fd5b506107b761084b36600461296a565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561088257600080fd5b506103c4610891366004612457565b611f9a565b3480156108a257600080fd5b506108d86108b1366004612457565b60096020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ad565b34801561090457600080fd5b506103c46109133660046126af565b611fb8565b60006001600160e01b03198216637965db0b60e01b148061094957506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020612d1e8339815191526109678161215a565b506000938452600960205260409093206001810192909255600282015560030155565b6002600154036109b55760405162461bcd60e51b81526004016109ac906129e6565b60405180910390fd5b60026001819055546040516370a0823160e01b815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a269190612a1d565b1015610a3157600080fd5b6000848152600960209081526040918290208251608081018452815480825260018301549382019390935260028201549381019390935260030154606083015215801590610a83575060008160200151115b610a9f5760405162461bcd60e51b81526004016109ac90612a36565b6000606482602001518360000151610ab79190612a79565b610ac19190612a90565b90508215610b04576000826060015111610ada57600080fd5b60608201518251606491610aed91612a79565b610af79190612a90565b610b019082612ab2565b90505b80341015610b245760405162461bcd60e51b81526004016109ac90612ac5565b6003546040516374f4f54760e01b8152336004820152602481018690526001600160a01b03909116906374f4f54790604401600060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505060408051898152602081018890528615158183015242606082015290516001600160a01b03891693507ff6aa1bb1d7f67b2f42c1bd5a2e10354b1da0ead20cc073918c5d698b38810a4a92509081900360800190a250506001805550505050565b600082815260208190526040902060010154610c028161215a565b610c0c8383612167565b505050565b6001600160a01b0381163314610c815760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ac565b610c8b82826121eb565b5050565b6000610c9a8161215a565b6040513390819084156108fc029085906000818181858888f19350505050158015610cc9573d6000803e3d6000fd5b50505050565b600260015403610cf15760405162461bcd60e51b81526004016109ac906129e6565b600260018181556000878152600960209081526040918290208251608081018452815480825294820154928101929092529384015491810191909152600390920154606083015215801590610d4a575060008160400151115b610d665760405162461bcd60e51b81526004016109ac90612a36565b6000606482604001518360000151610d7e9190612a79565b610d889190612a90565b905060005b8551811015610ee2576000858281518110610daa57610daa612af3565b602002602001015111610dbc57600080fd5b848181518110610dce57610dce612af3565b6020026020010151600760009054906101000a90046001600160a01b03166001600160a01b031662fdd58e33898581518110610e0c57610e0c612af3565b60200260200101516040518363ffffffff1660e01b8152600401610e459291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612a1d565b1015610e9157600080fd5b8015610ed0576004606484604001518560000151610eaf9190612a79565b610eb99190612a90565b610ec39190612a90565b610ecd9083612ab2565b91505b80610eda81612b09565b915050610d8d565b508215610f24576000826060015111610efa57600080fd5b60608201518251606491610f0d91612a79565b610f179190612a90565b610f219082612ab2565b90505b80341015610f445760405162461bcd60e51b81526004016109ac90612ac5565b60065460405163efe8f19160e01b81526001600160a01b039091169063efe8f19190610f7890339089908990600401612b5d565b600060405180830381600087803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b50505050856001600160a01b03167fa57261a9621db049b2b8d6e354ca3e80356639164a134b0ea0788af9dd80a3d88887878742604051610feb959493929190612b9d565b60405180910390a25050600180555050505050565b600080516020612d3e8339815191526110188161215a565b60026001540361103a5760405162461bcd60e51b81526004016109ac906129e6565b60026001556000858152600a60205260409020805460ff161561105c57600080fd5b8054610100600160a81b0319166101006001600160a01b03871602178155600180820185905560028201805460ff19168515151790556040805191825260208201889052429082015287907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c90606001610feb565b600080516020612d3e8339815191526110e98161215a565b60026001540361110b5760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600b60205260409020805460ff161561112d57600080fd5b600781018054841515600160a01b026001600160a81b03199091166001600160a01b03891617179055835185511461116457600080fd5b60005b855181101561132e57600686828151811061118457611184612af3565b60200260200101511061119657600080fd5b8581815181106111a8576111a8612af3565b60200260200101516000146112f9578581815181106111c9576111c9612af3565b60200260200101516001146112d3578581815181106111ea576111ea612af3565b60200260200101516002146112ad5785818151811061120b5761120b612af3565b60200260200101516003146112875785818151811061122c5761122c612af3565b60200260200101516004146112615784818151811061124d5761124d612af3565b60200260200101518260060181905561131b565b84818151811061127357611273612af3565b60200260200101518260050181905561131b565b84818151811061129957611299612af3565b60200260200101518260040181905561131b565b8481815181106112bf576112bf612af3565b60200260200101518260030181905561131b565b8481815181106112e5576112e5612af3565b60200260200101518260020181905561131b565b84818151811061130b5761130b612af3565b6020026020010151826001018190555b508061132681612b09565b915050611167565b50604080516002815260208101899052429181019190915288907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c906060015b60405180910390a2505060018055505050505050565b600080516020612d1e83398151915261139c8161215a565b5060009182526009602052604090912055565b600080516020612d5e8339815191526113c78161215a565b6002600154036113e95760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600c60205260409020805460ff1615801561141d575060038101546001600160a01b038781169116145b801561143b5750600381015460ff600160a01b909104161515831515145b61144457600080fd5b60005b855181101561150057600286828151811061146457611464612af3565b60200260200101511061147657600080fd5b85818151811061148857611488612af3565b60200260200101516000146114c5578481815181106114a9576114a9612af3565b60200260200101518260020154146114c057600080fd5b6114ee565b8481815181106114d7576114d7612af3565b60200260200101518260010154146114ee57600080fd5b806114f881612b09565b915050611447565b50805460ff191660011781556006546040516375c3cc0d60e01b81526001600160a01b03909116906375c3cc0d9061154090899089908990600401612b5d565b600060405180830381600087803b15801561155a57600080fd5b505af115801561156e573d6000803e3d6000fd5b50505050600083156115b657506008546040516001600160a01b0388169082156108fc029083906000818181858888f193505050501580156115b4573d6000803e3d6000fd5b505b866001600160a01b03167f8d751f7f3295354822fd97ecc6148de2e2912f69a67d8fc5ffba45a66c437a098a888885426040516115f7959493929190612bdd565b60405180910390a250506001805550505050505050565b6002600154036116305760405162461bcd60e51b81526004016109ac906129e6565b600260018181556000878152600960209081526040918290208251608081018452815480825294820154928101929092529384015491810191909152600390920154606083015215801590611689575060008160400151115b6116a55760405162461bcd60e51b81526004016109ac90612a36565b60006064826040015183600001516116bd9190612a79565b6116c79190612a90565b905060005b85518110156118215760008582815181106116e9576116e9612af3565b6020026020010151116116fb57600080fd5b84818151811061170d5761170d612af3565b6020026020010151600560009054906101000a90046001600160a01b03166001600160a01b031662fdd58e3389858151811061174b5761174b612af3565b60200260200101516040518363ffffffff1660e01b81526004016117849291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156117a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c59190612a1d565b10156117d057600080fd5b801561180f5760046064846040015185600001516117ee9190612a79565b6117f89190612a90565b6118029190612a90565b61180c9083612ab2565b91505b8061181981612b09565b9150506116cc565b50821561186357600082606001511161183957600080fd5b6060820151825160649161184c91612a79565b6118569190612a90565b6118609082612ab2565b90505b803410156118835760405162461bcd60e51b81526004016109ac90612ac5565b600480546040516381ce663760e01b81526001600160a01b03909116916381ce6637916118b69133918a918a9101612b5d565b600060405180830381600087803b1580156118d057600080fd5b505af11580156118e4573d6000803e3d6000fd5b50505050856001600160a01b03167f8c4bd281ea18dcf7805972d2b1714a5b325faeab8c554c7bc9c084c6816d3dab8887878742604051610feb959493929190612b9d565b600080516020612d5e8339815191526119418161215a565b6002600154036119635760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600b60205260409020805460ff16158015611997575060078101546001600160a01b038781169116145b80156119b55750600781015460ff600160a01b909104161515831515145b6119be57600080fd5b60005b8551811015611ba25760068682815181106119de576119de612af3565b6020026020010151106119f057600080fd5b858181518110611a0257611a02612af3565b6020026020010151600014611b6757858181518110611a2357611a23612af3565b6020026020010151600114611b3e57858181518110611a4457611a44612af3565b6020026020010151600214611b1557858181518110611a6557611a65612af3565b6020026020010151600314611aec57858181518110611a8657611a86612af3565b6020026020010151600414611ac357848181518110611aa757611aa7612af3565b6020026020010151826006015414611abe57600080fd5b611b90565b848181518110611ad557611ad5612af3565b6020026020010151826005015414611abe57600080fd5b848181518110611afe57611afe612af3565b6020026020010151826004015414611abe57600080fd5b848181518110611b2757611b27612af3565b6020026020010151826003015414611abe57600080fd5b848181518110611b5057611b50612af3565b6020026020010151826002015414611abe57600080fd5b848181518110611b7957611b79612af3565b6020026020010151826001015414611b9057600080fd5b80611b9a81612b09565b9150506119c1565b50805460ff191660011781556004805460405163ce3e949360e01b81526001600160a01b039091169163ce3e949391611be1918a918a918a9101612b5d565b600060405180830381600087803b158015611bfb57600080fd5b505af1158015611c0f573d6000803e3d6000fd5b5050505060008315611c5757506008546040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015611c55573d6000803e3d6000fd5b505b866001600160a01b03167f958caec9c3eafba8f62625a2b94ae40a4c8823d549723e0c0870cfa4761815408a888885426040516115f7959493929190612bdd565b6000611ca38161215a565b6002546001600160a01b0390811690841603611d015760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f742072656d6f7665206e617469766520746f6b656e000000000060448201526064016109ac565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc99190612c1d565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020612d3e833981519152611db38161215a565b600260015403611dd55760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600c60205260409020805460ff1615611df757600080fd5b600381018054841515600160a01b026001600160a81b03199091166001600160a01b038916171790558351855114611e2e57600080fd5b60005b8551811015611edc576002868281518110611e4e57611e4e612af3565b602002602001015110611e6057600080fd5b858181518110611e7257611e72612af3565b6020026020010151600014611ea757848181518110611e9357611e93612af3565b602002602001015182600201819055611ec9565b848181518110611eb957611eb9612af3565b6020026020010151826001018190555b5080611ed481612b09565b915050611e31565b50604080516003815260208101899052429181019190915288907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c9060600161136e565b6000611f2b8161215a565b506040805160808101825294855260208086019485528582019384526060860192835260009687526009905290942092518355905160018301555160028201559051600390910155565b600082815260208190526040902060010154611f908161215a565b610c0c83836121eb565b600080516020612d1e833981519152611fb28161215a565b50600855565b600080516020612d5e833981519152611fd08161215a565b600260015403611ff25760405162461bcd60e51b81526004016109ac906129e6565b60026001556000858152600a60205260409020805460ff16158015612028575080546001600160a01b0386811661010090920416145b80156120375750838160010154145b801561204d5750600281015460ff161515831515145b61205657600080fd5b805460ff191660011781556003546040516346154c9f60e11b81526001600160a01b0387811660048301526024820187905290911690638c2a993e90604401600060405180830381600087803b1580156120af57600080fd5b505af11580156120c3573d6000803e3d6000fd5b505050506000831561210b57506008546040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015612109573d6000803e3d6000fd5b505b60408051898152602081018790529081018290524260608201526001600160a01b038716907fdb20eb4bba677b9c079cd65be75ed7c5f2bf899532ff4fe1f6641bd7124fd1489060800161136e565b6121648133612250565b50565b6121718282611d72565b610c8b576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556121a73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121f58282611d72565b15610c8b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61225a8282611d72565b610c8b57612272816001600160a01b031660146122b4565b61227d8360206122b4565b60405160200161228e929190612c5e565b60408051601f198184030181529082905262461bcd60e51b82526109ac91600401612cd3565b606060006122c3836002612a79565b6122ce906002612ab2565b67ffffffffffffffff8111156122e6576122e6612569565b6040519080825280601f01601f191660200182016040528015612310576020820181803683370190505b509050600360fc1b8160008151811061232b5761232b612af3565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061235a5761235a612af3565b60200101906001600160f81b031916908160001a905350600061237e846002612a79565b612389906001612ab2565b90505b6001811115612401576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106123bd576123bd612af3565b1a60f81b8282815181106123d3576123d3612af3565b60200101906001600160f81b031916908160001a90535060049490941c936123fa81612d06565b905061238c565b5083156124505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ac565b9392505050565b60006020828403121561246957600080fd5b5035919050565b60006020828403121561248257600080fd5b81356001600160e01b03198116811461245057600080fd5b600080600080608085870312156124b057600080fd5b5050823594602084013594506040840135936060013592509050565b6001600160a01b038116811461216457600080fd5b801515811461216457600080fd5b6000806000806080858703121561250557600080fd5b843593506020850135612517816124cc565b925060408501359150606085013561252e816124e1565b939692955090935050565b6000806040838503121561254c57600080fd5b82359150602083013561255e816124cc565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261259057600080fd5b8135602067ffffffffffffffff808311156125ad576125ad612569565b8260051b604051601f19603f830116810181811084821117156125d2576125d2612569565b6040529384528581018301938381019250878511156125f057600080fd5b83870191505b8482101561260f578135835291830191908301906125f6565b979650505050505050565b600080600080600060a0868803121561263257600080fd5b853594506020860135612644816124cc565b9350604086013567ffffffffffffffff8082111561266157600080fd5b61266d89838a0161257f565b9450606088013591508082111561268357600080fd5b506126908882890161257f565b92505060808601356126a1816124e1565b809150509295509295909350565b600080600080600060a086880312156126c757600080fd5b853594506020860135935060408601356126e0816124cc565b92506060860135915060808601356126a1816124e1565b60008060008060008060c0878903121561271057600080fd5b86359550602087013594506040870135612729816124cc565b9350606087013567ffffffffffffffff8082111561274657600080fd5b6127528a838b0161257f565b9450608089013591508082111561276857600080fd5b5061277589828a0161257f565b92505060a0870135612786816124e1565b809150509295509295509295565b600080604083850312156127a757600080fd5b50508035926020909101359150565b600080604083850312156127c957600080fd5b82356127d4816124cc565b946020939093013593505050565b60008083601f8401126127f457600080fd5b50813567ffffffffffffffff81111561280c57600080fd5b6020830191508360208260051b850101111561282757600080fd5b9250929050565b60008083601f84011261284057600080fd5b50813567ffffffffffffffff81111561285857600080fd5b60208301915083602082850101111561282757600080fd5b60008060008060008060008060a0898b03121561288c57600080fd5b8835612897816124cc565b975060208901356128a7816124cc565b9650604089013567ffffffffffffffff808211156128c457600080fd5b6128d08c838d016127e2565b909850965060608b01359150808211156128e957600080fd5b6128f58c838d016127e2565b909650945060808b013591508082111561290e57600080fd5b5061291b8b828c0161282e565b999c989b5096995094979396929594505050565b600080600080600060a0868803121561294757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060a0878903121561298357600080fd5b863561298e816124cc565b9550602087013561299e816124cc565b94506040870135935060608701359250608087013567ffffffffffffffff8111156129c857600080fd5b6129d489828a0161282e565b979a9699509497509295939492505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215612a2f57600080fd5b5051919050565b60208082526013908201527218da185a5b88139bdd0814dd5c1c1bdc9d1959606a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761094957610949612a63565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561094957610949612a63565b6020808252601490820152736e6f7420656e6f756768206665652066756e647360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612b1b57612b1b612a63565b5060010190565b600081518084526020808501945080840160005b83811015612b5257815187529582019590820190600101612b36565b509495945050505050565b6001600160a01b0384168152606060208201819052600090612b8190830185612b22565b8281036040840152612b938185612b22565b9695505050505050565b85815260a060208201526000612bb660a0830187612b22565b8281036040840152612bc88187612b22565b94151560608401525050608001529392505050565b85815260a060208201526000612bf660a0830187612b22565b8281036040840152612c088187612b22565b60608401959095525050608001529392505050565b600060208284031215612c2f57600080fd5b8151612450816124e1565b60005b83811015612c55578181015183820152602001612c3d565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612c96816017850160208801612c3a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612cc7816028840160208801612c3a565b01602801949350505050565b6020815260008251806020840152612cf2816040850160208701612c3a565b601f01601f19169190910160400192915050565b600081612d1557612d15612a63565b50600019019056fe9ee27765e8a07d3e7921fed181db3fc935a03af4314f53d2e9df1e308b202602b63d7c91bc8040c1f8b78860f095264fa4f9ef8afb38afa61cf5c934d525d46abbd8ba7feb92fff6d3c1ff0cc5fba8bba10a84ac434254d8192083c703b22f4aa2646970667358221220af2652951e591ea56b59855dbb07cb6f06dca1a6c98c91f65c128e8c2f1bb0a464736f6c63430008120033000000000000000000000000f06dfed9aa6d4206ebbc0ef2a93567e794592364000000000000000000000000c6a22eef316a4aa3ae596f2fe0912b360805587a00000000000000000000000042e4bd0a367adaf84e75dee4467f8d94cad3dfbe
Deployed Bytecode
0x6080604052600436106102285760003560e01c80636556d71411610123578063a217fddf116100ab578063e532597a1161006f578063e532597a14610810578063f23a6e6114610830578063f5685cc614610876578063fb0e193714610896578063fba8965f146108f857600080fd5b8063a217fddf1461073a578063ba1bb0741461074f578063bc197c811461076f578063c7e17087146107d0578063d547741f146107f057600080fd5b806376821578116100f257806376821578146105fc57806383382b91146106125780638389aae9146106d85780638bbb9153146106f857806391d148541461071a57600080fd5b80636556d7141461058957806365c12d561461059c5780636f411535146105bc57806376199c3e146105dc57600080fd5b806331855ef4116101b15780633f5c8f53116101755780633f5c8f53146104e9578063409cc07d1461050957806345e778f41461052957806358c0e65c146105495780635e2f52f61461056957600080fd5b806331855ef41461046157806336568abe146104835780633c00a36c146104a35780633c688a39146104b65780633cf41a51146104c957600080fd5b806320bf1066116101f857806320bf1066146103a4578063234fcbba146103c6578063248a9ca3146103fe57806327b9f2ce1461042e5780632f2ff15d1461044157600080fd5b8062f1ed671461023457806301ffc9a7146102b65780631366e2b2146102e65780631eb761b31461031657600080fd5b3661022f57005b600080fd5b34801561024057600080fd5b5061028561024f366004612457565b600a6020526000908152604090208054600182015460029092015460ff808316936101009093046001600160a01b031692911684565b6040805194151585526001600160a01b03909316602085015291830152151560608201526080015b60405180910390f35b3480156102c257600080fd5b506102d66102d1366004612470565b610918565b60405190151581526020016102ad565b3480156102f257600080fd5b50610308600080516020612d1e83398151915281565b6040519081526020016102ad565b34801561032257600080fd5b5061036f610331366004612457565b600c60205260009081526040902080546001820154600283015460039093015460ff9283169391926001600160a01b03821691600160a01b90041685565b6040805195151586526020860194909452928401919091526001600160a01b031660608301521515608082015260a0016102ad565b3480156103b057600080fd5b506103c46103bf36600461249a565b61094f565b005b3480156103d257600080fd5b506004546103e6906001600160a01b031681565b6040516001600160a01b0390911681526020016102ad565b34801561040a57600080fd5b50610308610419366004612457565b60009081526020819052604090206001015490565b6103c461043c3660046124ef565b61098a565b34801561044d57600080fd5b506103c461045c366004612539565b610be7565b34801561046d57600080fd5b50610308600080516020612d5e83398151915281565b34801561048f57600080fd5b506103c461049e366004612539565b610c11565b6103c46104b1366004612457565b610c8f565b6103c46104c436600461261a565b610ccf565b3480156104d557600080fd5b506005546103e6906001600160a01b031681565b3480156104f557600080fd5b506103c46105043660046126af565b611000565b34801561051557600080fd5b506103c46105243660046126f7565b6110d1565b34801561053557600080fd5b506007546103e6906001600160a01b031681565b34801561055557600080fd5b506103c4610564366004612794565b611384565b34801561057557600080fd5b506103c46105843660046126f7565b6113af565b6103c461059736600461261a565b61160e565b3480156105a857600080fd5b506103c46105b73660046126f7565b611929565b3480156105c857600080fd5b506002546103e6906001600160a01b031681565b3480156105e857600080fd5b506006546103e6906001600160a01b031681565b34801561060857600080fd5b5061030860085481565b34801561061e57600080fd5b5061068761062d366004612457565b600b602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff96871697959694959394929391926001600160a01b03821691600160a01b90041689565b604080519915158a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c08401526001600160a01b031660e08301521515610100820152610120016102ad565b3480156106e457600080fd5b506103c46106f33660046127b6565b611c98565b34801561070457600080fd5b50610308600080516020612d3e83398151915281565b34801561072657600080fd5b506102d6610735366004612539565b611d72565b34801561074657600080fd5b50610308600081565b34801561075b57600080fd5b506103c461076a3660046126f7565b611d9b565b34801561077b57600080fd5b506107b761078a366004612870565b7fbc197c819b3e337a6f9652dd10becd7eef83032af3b9d958d3d42f669414662198975050505050505050565b6040516001600160e01b031990911681526020016102ad565b3480156107dc57600080fd5b506103c46107eb36600461292f565b611f20565b3480156107fc57600080fd5b506103c461080b366004612539565b611f75565b34801561081c57600080fd5b506003546103e6906001600160a01b031681565b34801561083c57600080fd5b506107b761084b36600461296a565b7ff23a6e612e1ff4830e658fe43f4e3cb4a5f8170bd5d9e69fb5d7a7fa9e4fdf979695505050505050565b34801561088257600080fd5b506103c4610891366004612457565b611f9a565b3480156108a257600080fd5b506108d86108b1366004612457565b60096020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102ad565b34801561090457600080fd5b506103c46109133660046126af565b611fb8565b60006001600160e01b03198216637965db0b60e01b148061094957506301ffc9a760e01b6001600160e01b03198316145b92915050565b600080516020612d1e8339815191526109678161215a565b506000938452600960205260409093206001810192909255600282015560030155565b6002600154036109b55760405162461bcd60e51b81526004016109ac906129e6565b60405180910390fd5b60026001819055546040516370a0823160e01b815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a269190612a1d565b1015610a3157600080fd5b6000848152600960209081526040918290208251608081018452815480825260018301549382019390935260028201549381019390935260030154606083015215801590610a83575060008160200151115b610a9f5760405162461bcd60e51b81526004016109ac90612a36565b6000606482602001518360000151610ab79190612a79565b610ac19190612a90565b90508215610b04576000826060015111610ada57600080fd5b60608201518251606491610aed91612a79565b610af79190612a90565b610b019082612ab2565b90505b80341015610b245760405162461bcd60e51b81526004016109ac90612ac5565b6003546040516374f4f54760e01b8152336004820152602481018690526001600160a01b03909116906374f4f54790604401600060405180830381600087803b158015610b7057600080fd5b505af1158015610b84573d6000803e3d6000fd5b505060408051898152602081018890528615158183015242606082015290516001600160a01b03891693507ff6aa1bb1d7f67b2f42c1bd5a2e10354b1da0ead20cc073918c5d698b38810a4a92509081900360800190a250506001805550505050565b600082815260208190526040902060010154610c028161215a565b610c0c8383612167565b505050565b6001600160a01b0381163314610c815760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016109ac565b610c8b82826121eb565b5050565b6000610c9a8161215a565b6040513390819084156108fc029085906000818181858888f19350505050158015610cc9573d6000803e3d6000fd5b50505050565b600260015403610cf15760405162461bcd60e51b81526004016109ac906129e6565b600260018181556000878152600960209081526040918290208251608081018452815480825294820154928101929092529384015491810191909152600390920154606083015215801590610d4a575060008160400151115b610d665760405162461bcd60e51b81526004016109ac90612a36565b6000606482604001518360000151610d7e9190612a79565b610d889190612a90565b905060005b8551811015610ee2576000858281518110610daa57610daa612af3565b602002602001015111610dbc57600080fd5b848181518110610dce57610dce612af3565b6020026020010151600760009054906101000a90046001600160a01b03166001600160a01b031662fdd58e33898581518110610e0c57610e0c612af3565b60200260200101516040518363ffffffff1660e01b8152600401610e459291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015610e62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e869190612a1d565b1015610e9157600080fd5b8015610ed0576004606484604001518560000151610eaf9190612a79565b610eb99190612a90565b610ec39190612a90565b610ecd9083612ab2565b91505b80610eda81612b09565b915050610d8d565b508215610f24576000826060015111610efa57600080fd5b60608201518251606491610f0d91612a79565b610f179190612a90565b610f219082612ab2565b90505b80341015610f445760405162461bcd60e51b81526004016109ac90612ac5565b60065460405163efe8f19160e01b81526001600160a01b039091169063efe8f19190610f7890339089908990600401612b5d565b600060405180830381600087803b158015610f9257600080fd5b505af1158015610fa6573d6000803e3d6000fd5b50505050856001600160a01b03167fa57261a9621db049b2b8d6e354ca3e80356639164a134b0ea0788af9dd80a3d88887878742604051610feb959493929190612b9d565b60405180910390a25050600180555050505050565b600080516020612d3e8339815191526110188161215a565b60026001540361103a5760405162461bcd60e51b81526004016109ac906129e6565b60026001556000858152600a60205260409020805460ff161561105c57600080fd5b8054610100600160a81b0319166101006001600160a01b03871602178155600180820185905560028201805460ff19168515151790556040805191825260208201889052429082015287907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c90606001610feb565b600080516020612d3e8339815191526110e98161215a565b60026001540361110b5760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600b60205260409020805460ff161561112d57600080fd5b600781018054841515600160a01b026001600160a81b03199091166001600160a01b03891617179055835185511461116457600080fd5b60005b855181101561132e57600686828151811061118457611184612af3565b60200260200101511061119657600080fd5b8581815181106111a8576111a8612af3565b60200260200101516000146112f9578581815181106111c9576111c9612af3565b60200260200101516001146112d3578581815181106111ea576111ea612af3565b60200260200101516002146112ad5785818151811061120b5761120b612af3565b60200260200101516003146112875785818151811061122c5761122c612af3565b60200260200101516004146112615784818151811061124d5761124d612af3565b60200260200101518260060181905561131b565b84818151811061127357611273612af3565b60200260200101518260050181905561131b565b84818151811061129957611299612af3565b60200260200101518260040181905561131b565b8481815181106112bf576112bf612af3565b60200260200101518260030181905561131b565b8481815181106112e5576112e5612af3565b60200260200101518260020181905561131b565b84818151811061130b5761130b612af3565b6020026020010151826001018190555b508061132681612b09565b915050611167565b50604080516002815260208101899052429181019190915288907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c906060015b60405180910390a2505060018055505050505050565b600080516020612d1e83398151915261139c8161215a565b5060009182526009602052604090912055565b600080516020612d5e8339815191526113c78161215a565b6002600154036113e95760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600c60205260409020805460ff1615801561141d575060038101546001600160a01b038781169116145b801561143b5750600381015460ff600160a01b909104161515831515145b61144457600080fd5b60005b855181101561150057600286828151811061146457611464612af3565b60200260200101511061147657600080fd5b85818151811061148857611488612af3565b60200260200101516000146114c5578481815181106114a9576114a9612af3565b60200260200101518260020154146114c057600080fd5b6114ee565b8481815181106114d7576114d7612af3565b60200260200101518260010154146114ee57600080fd5b806114f881612b09565b915050611447565b50805460ff191660011781556006546040516375c3cc0d60e01b81526001600160a01b03909116906375c3cc0d9061154090899089908990600401612b5d565b600060405180830381600087803b15801561155a57600080fd5b505af115801561156e573d6000803e3d6000fd5b50505050600083156115b657506008546040516001600160a01b0388169082156108fc029083906000818181858888f193505050501580156115b4573d6000803e3d6000fd5b505b866001600160a01b03167f8d751f7f3295354822fd97ecc6148de2e2912f69a67d8fc5ffba45a66c437a098a888885426040516115f7959493929190612bdd565b60405180910390a250506001805550505050505050565b6002600154036116305760405162461bcd60e51b81526004016109ac906129e6565b600260018181556000878152600960209081526040918290208251608081018452815480825294820154928101929092529384015491810191909152600390920154606083015215801590611689575060008160400151115b6116a55760405162461bcd60e51b81526004016109ac90612a36565b60006064826040015183600001516116bd9190612a79565b6116c79190612a90565b905060005b85518110156118215760008582815181106116e9576116e9612af3565b6020026020010151116116fb57600080fd5b84818151811061170d5761170d612af3565b6020026020010151600560009054906101000a90046001600160a01b03166001600160a01b031662fdd58e3389858151811061174b5761174b612af3565b60200260200101516040518363ffffffff1660e01b81526004016117849291906001600160a01b03929092168252602082015260400190565b602060405180830381865afa1580156117a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c59190612a1d565b10156117d057600080fd5b801561180f5760046064846040015185600001516117ee9190612a79565b6117f89190612a90565b6118029190612a90565b61180c9083612ab2565b91505b8061181981612b09565b9150506116cc565b50821561186357600082606001511161183957600080fd5b6060820151825160649161184c91612a79565b6118569190612a90565b6118609082612ab2565b90505b803410156118835760405162461bcd60e51b81526004016109ac90612ac5565b600480546040516381ce663760e01b81526001600160a01b03909116916381ce6637916118b69133918a918a9101612b5d565b600060405180830381600087803b1580156118d057600080fd5b505af11580156118e4573d6000803e3d6000fd5b50505050856001600160a01b03167f8c4bd281ea18dcf7805972d2b1714a5b325faeab8c554c7bc9c084c6816d3dab8887878742604051610feb959493929190612b9d565b600080516020612d5e8339815191526119418161215a565b6002600154036119635760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600b60205260409020805460ff16158015611997575060078101546001600160a01b038781169116145b80156119b55750600781015460ff600160a01b909104161515831515145b6119be57600080fd5b60005b8551811015611ba25760068682815181106119de576119de612af3565b6020026020010151106119f057600080fd5b858181518110611a0257611a02612af3565b6020026020010151600014611b6757858181518110611a2357611a23612af3565b6020026020010151600114611b3e57858181518110611a4457611a44612af3565b6020026020010151600214611b1557858181518110611a6557611a65612af3565b6020026020010151600314611aec57858181518110611a8657611a86612af3565b6020026020010151600414611ac357848181518110611aa757611aa7612af3565b6020026020010151826006015414611abe57600080fd5b611b90565b848181518110611ad557611ad5612af3565b6020026020010151826005015414611abe57600080fd5b848181518110611afe57611afe612af3565b6020026020010151826004015414611abe57600080fd5b848181518110611b2757611b27612af3565b6020026020010151826003015414611abe57600080fd5b848181518110611b5057611b50612af3565b6020026020010151826002015414611abe57600080fd5b848181518110611b7957611b79612af3565b6020026020010151826001015414611b9057600080fd5b80611b9a81612b09565b9150506119c1565b50805460ff191660011781556004805460405163ce3e949360e01b81526001600160a01b039091169163ce3e949391611be1918a918a918a9101612b5d565b600060405180830381600087803b158015611bfb57600080fd5b505af1158015611c0f573d6000803e3d6000fd5b5050505060008315611c5757506008546040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015611c55573d6000803e3d6000fd5b505b866001600160a01b03167f958caec9c3eafba8f62625a2b94ae40a4c8823d549723e0c0870cfa4761815408a888885426040516115f7959493929190612bdd565b6000611ca38161215a565b6002546001600160a01b0390811690841603611d015760405162461bcd60e51b815260206004820152601b60248201527f43616e206e6f742072656d6f7665206e617469766520746f6b656e000000000060448201526064016109ac565b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611d4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc99190612c1d565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020612d3e833981519152611db38161215a565b600260015403611dd55760405162461bcd60e51b81526004016109ac906129e6565b60026001556000868152600c60205260409020805460ff1615611df757600080fd5b600381018054841515600160a01b026001600160a81b03199091166001600160a01b038916171790558351855114611e2e57600080fd5b60005b8551811015611edc576002868281518110611e4e57611e4e612af3565b602002602001015110611e6057600080fd5b858181518110611e7257611e72612af3565b6020026020010151600014611ea757848181518110611e9357611e93612af3565b602002602001015182600201819055611ec9565b848181518110611eb957611eb9612af3565b6020026020010151826001018190555b5080611ed481612b09565b915050611e31565b50604080516003815260208101899052429181019190915288907f93e619e6bb96a1749d6da22436cd526cf7b6758368cbf7679ae32813ce76510c9060600161136e565b6000611f2b8161215a565b506040805160808101825294855260208086019485528582019384526060860192835260009687526009905290942092518355905160018301555160028201559051600390910155565b600082815260208190526040902060010154611f908161215a565b610c0c83836121eb565b600080516020612d1e833981519152611fb28161215a565b50600855565b600080516020612d5e833981519152611fd08161215a565b600260015403611ff25760405162461bcd60e51b81526004016109ac906129e6565b60026001556000858152600a60205260409020805460ff16158015612028575080546001600160a01b0386811661010090920416145b80156120375750838160010154145b801561204d5750600281015460ff161515831515145b61205657600080fd5b805460ff191660011781556003546040516346154c9f60e11b81526001600160a01b0387811660048301526024820187905290911690638c2a993e90604401600060405180830381600087803b1580156120af57600080fd5b505af11580156120c3573d6000803e3d6000fd5b505050506000831561210b57506008546040516001600160a01b0387169082156108fc029083906000818181858888f19350505050158015612109573d6000803e3d6000fd5b505b60408051898152602081018790529081018290524260608201526001600160a01b038716907fdb20eb4bba677b9c079cd65be75ed7c5f2bf899532ff4fe1f6641bd7124fd1489060800161136e565b6121648133612250565b50565b6121718282611d72565b610c8b576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556121a73390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6121f58282611d72565b15610c8b576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61225a8282611d72565b610c8b57612272816001600160a01b031660146122b4565b61227d8360206122b4565b60405160200161228e929190612c5e565b60408051601f198184030181529082905262461bcd60e51b82526109ac91600401612cd3565b606060006122c3836002612a79565b6122ce906002612ab2565b67ffffffffffffffff8111156122e6576122e6612569565b6040519080825280601f01601f191660200182016040528015612310576020820181803683370190505b509050600360fc1b8160008151811061232b5761232b612af3565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061235a5761235a612af3565b60200101906001600160f81b031916908160001a905350600061237e846002612a79565b612389906001612ab2565b90505b6001811115612401576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106123bd576123bd612af3565b1a60f81b8282815181106123d3576123d3612af3565b60200101906001600160f81b031916908160001a90535060049490941c936123fa81612d06565b905061238c565b5083156124505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016109ac565b9392505050565b60006020828403121561246957600080fd5b5035919050565b60006020828403121561248257600080fd5b81356001600160e01b03198116811461245057600080fd5b600080600080608085870312156124b057600080fd5b5050823594602084013594506040840135936060013592509050565b6001600160a01b038116811461216457600080fd5b801515811461216457600080fd5b6000806000806080858703121561250557600080fd5b843593506020850135612517816124cc565b925060408501359150606085013561252e816124e1565b939692955090935050565b6000806040838503121561254c57600080fd5b82359150602083013561255e816124cc565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261259057600080fd5b8135602067ffffffffffffffff808311156125ad576125ad612569565b8260051b604051601f19603f830116810181811084821117156125d2576125d2612569565b6040529384528581018301938381019250878511156125f057600080fd5b83870191505b8482101561260f578135835291830191908301906125f6565b979650505050505050565b600080600080600060a0868803121561263257600080fd5b853594506020860135612644816124cc565b9350604086013567ffffffffffffffff8082111561266157600080fd5b61266d89838a0161257f565b9450606088013591508082111561268357600080fd5b506126908882890161257f565b92505060808601356126a1816124e1565b809150509295509295909350565b600080600080600060a086880312156126c757600080fd5b853594506020860135935060408601356126e0816124cc565b92506060860135915060808601356126a1816124e1565b60008060008060008060c0878903121561271057600080fd5b86359550602087013594506040870135612729816124cc565b9350606087013567ffffffffffffffff8082111561274657600080fd5b6127528a838b0161257f565b9450608089013591508082111561276857600080fd5b5061277589828a0161257f565b92505060a0870135612786816124e1565b809150509295509295509295565b600080604083850312156127a757600080fd5b50508035926020909101359150565b600080604083850312156127c957600080fd5b82356127d4816124cc565b946020939093013593505050565b60008083601f8401126127f457600080fd5b50813567ffffffffffffffff81111561280c57600080fd5b6020830191508360208260051b850101111561282757600080fd5b9250929050565b60008083601f84011261284057600080fd5b50813567ffffffffffffffff81111561285857600080fd5b60208301915083602082850101111561282757600080fd5b60008060008060008060008060a0898b03121561288c57600080fd5b8835612897816124cc565b975060208901356128a7816124cc565b9650604089013567ffffffffffffffff808211156128c457600080fd5b6128d08c838d016127e2565b909850965060608b01359150808211156128e957600080fd5b6128f58c838d016127e2565b909650945060808b013591508082111561290e57600080fd5b5061291b8b828c0161282e565b999c989b5096995094979396929594505050565b600080600080600060a0868803121561294757600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b60008060008060008060a0878903121561298357600080fd5b863561298e816124cc565b9550602087013561299e816124cc565b94506040870135935060608701359250608087013567ffffffffffffffff8111156129c857600080fd5b6129d489828a0161282e565b979a9699509497509295939492505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600060208284031215612a2f57600080fd5b5051919050565b60208082526013908201527218da185a5b88139bdd0814dd5c1c1bdc9d1959606a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761094957610949612a63565b600082612aad57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561094957610949612a63565b6020808252601490820152736e6f7420656e6f756768206665652066756e647360601b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201612b1b57612b1b612a63565b5060010190565b600081518084526020808501945080840160005b83811015612b5257815187529582019590820190600101612b36565b509495945050505050565b6001600160a01b0384168152606060208201819052600090612b8190830185612b22565b8281036040840152612b938185612b22565b9695505050505050565b85815260a060208201526000612bb660a0830187612b22565b8281036040840152612bc88187612b22565b94151560608401525050608001529392505050565b85815260a060208201526000612bf660a0830187612b22565b8281036040840152612c088187612b22565b60608401959095525050608001529392505050565b600060208284031215612c2f57600080fd5b8151612450816124e1565b60005b83811015612c55578181015183820152602001612c3d565b50506000910152565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612c96816017850160208801612c3a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612cc7816028840160208801612c3a565b01602801949350505050565b6020815260008251806020840152612cf2816040850160208701612c3a565b601f01601f19169190910160400192915050565b600081612d1557612d15612a63565b50600019019056fe9ee27765e8a07d3e7921fed181db3fc935a03af4314f53d2e9df1e308b202602b63d7c91bc8040c1f8b78860f095264fa4f9ef8afb38afa61cf5c934d525d46abbd8ba7feb92fff6d3c1ff0cc5fba8bba10a84ac434254d8192083c703b22f4aa2646970667358221220af2652951e591ea56b59855dbb07cb6f06dca1a6c98c91f65c128e8c2f1bb0a464736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f06dfed9aa6d4206ebbc0ef2a93567e794592364000000000000000000000000c6a22eef316a4aa3ae596f2fe0912b360805587a00000000000000000000000042e4bd0a367adaf84e75dee4467f8d94cad3dfbe
-----Decoded View---------------
Arg [0] : _Orb (address): 0xf06DFed9aA6D4206EBBC0eF2a93567e794592364
Arg [1] : _MagicAssets (address): 0xC6a22Eef316a4aa3ae596f2FE0912b360805587a
Arg [2] : _ElementalPhoenixes (address): 0x42E4bD0a367ADAf84E75DEE4467F8d94caD3dfbE
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f06dfed9aa6d4206ebbc0ef2a93567e794592364
Arg [1] : 000000000000000000000000c6a22eef316a4aa3ae596f2fe0912b360805587a
Arg [2] : 00000000000000000000000042e4bd0a367adaf84e75dee4467f8d94cad3dfbe
Deployed Bytecode Sourcemap
39962:14985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40905:57;;;;;;;;;;-1:-1:-1;40905:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40905:57:0;;;;;;;;;;459:14:1;;452:22;434:41;;-1:-1:-1;;;;;511:32:1;;;506:2;491:18;;484:60;560:18;;;553:34;630:14;623:22;618:2;603:18;;596:50;421:3;406:19;40905:57:0;;;;;;;;27385:204;;;;;;;;;;-1:-1:-1;27385:204:0;;;;;:::i;:::-;;:::i;:::-;;;1113:14:1;;1106:22;1088:41;;1076:2;1061:18;27385:204:0;948:187:1;40186:72:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40186:72:0;;;;;1286:25:1;;;1274:2;1259:18;40186:72:0;1140:177:1;41439:61:0;;;;;;;;;;-1:-1:-1;41439:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41439:61:0;;;-1:-1:-1;;;41439:61:0;;;;;;;;;1610:14:1;;1603:22;1585:41;;1657:2;1642:18;;1635:34;;;;1685:18;;;1678:34;;;;-1:-1:-1;;;;;1748:32:1;1743:2;1728:18;;1721:60;1825:14;1818:22;1812:3;1797:19;;1790:51;1572:3;1557:19;41439:61:0;1322:525:1;44251:450:0;;;;;;;;;;-1:-1:-1;44251:450:0;;;;;:::i;:::-;;:::i;:::-;;40345:31;;;;;;;;;;-1:-1:-1;40345:31:0;;;;-1:-1:-1;;;;;40345:31:0;;;;;;-1:-1:-1;;;;;2427:32:1;;;2409:51;;2397:2;2382:18;40345:31:0;2242:224:1;29221:131:0;;;;;;;;;;-1:-1:-1;29221:131:0;;;;;:::i;:::-;29295:7;29322:12;;;;;;;;;;:22;;;;29221:131;45094:911;;;;;;:::i;:::-;;:::i;29614:147::-;;;;;;;;;;-1:-1:-1;29614:147:0;;;;;:::i;:::-;;:::i;40107:72::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40107:72:0;;30662:218;;;;;;;;;;-1:-1:-1;30662:218:0;;;;;:::i;:::-;;:::i;54472:179::-;;;;;;:::i;:::-;;:::i;51246:1267::-;;;;;;:::i;:::-;;:::i;40383:23::-;;;;;;;;;;-1:-1:-1;40383:23:0;;;;-1:-1:-1;;;;;40383:23:0;;;46017:570;;;;;;;;;;-1:-1:-1;46017:570:0;;;;;:::i;:::-;;:::i;48760:1081::-;;;;;;;;;;-1:-1:-1;48760:1081:0;;;;;:::i;:::-;;:::i;40465:26::-;;;;;;;;;;-1:-1:-1;40465:26:0;;;;-1:-1:-1;;;;;40465:26:0;;;44851:229;;;;;;;;;;-1:-1:-1;44851:229:0;;;;;:::i;:::-;;:::i;53356:1105::-;;;;;;;;;;-1:-1:-1;53356:1105:0;;;;;:::i;:::-;;:::i;47482:1265::-;;;;;;:::i;:::-;;:::i;49849:1385::-;;;;;;;;;;-1:-1:-1;49849:1385:0;;;;;:::i;:::-;;:::i;40298:17::-;;;;;;;;;;-1:-1:-1;40298:17:0;;;;-1:-1:-1;;;;;40298:17:0;;;40413:45;;;;;;;;;;-1:-1:-1;40413:45:0;;;;-1:-1:-1;;;;;40413:45:0;;;40498:25;;;;;;;;;;;;;;;;41206:61;;;;;;;;;;-1:-1:-1;41206:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41206:61:0;;;-1:-1:-1;;;41206:61:0;;;;;;;;;8873:14:1;;8866:22;8848:41;;8920:2;8905:18;;8898:34;;;;8948:18;;;8941:34;;;;9006:2;8991:18;;8984:34;;;;9049:3;9034:19;;9027:35;;;;9093:3;9078:19;;9071:35;9137:3;9122:19;;9115:35;-1:-1:-1;;;;;9187:32:1;9181:3;9166:19;;9159:61;9264:14;9257:22;9251:3;9236:19;;9229:51;8835:3;8820:19;41206:61:0;8473:813:1;54664:274:0;;;;;;;;;;-1:-1:-1;54664:274:0;;;;;:::i;:::-;;:::i;40028:72::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40028:72:0;;27681:147;;;;;;;;;;-1:-1:-1;27681:147:0;;;;;:::i;:::-;;:::i;26786:49::-;;;;;;;;;;-1:-1:-1;26786:49:0;26831:4;26786:49;;52521:827;;;;;;;;;;-1:-1:-1;52521:827:0;;;;;:::i;:::-;;:::i;41849:325::-;;;;;;;;;;-1:-1:-1;41849:325:0;;;;;:::i;:::-;42087:78;41849:325;;;;;;;;;;;;;;-1:-1:-1;;;;;;11840:33:1;;;11822:52;;11810:2;11795:18;41849:325:0;11678:202:1;43903:334:0;;;;;;;;;;-1:-1:-1;43903:334:0;;;;;:::i;:::-;;:::i;30006:149::-;;;;;;;;;;-1:-1:-1;30006:149:0;;;;;:::i;:::-;;:::i;40322:16::-;;;;;;;;;;-1:-1:-1;40322:16:0;;;;-1:-1:-1;;;;;40322:16:0;;;41550:288;;;;;;;;;;-1:-1:-1;41550:288:0;;;;;:::i;:::-;41760:69;41550:288;;;;;;;;;44711:131;;;;;;;;;;-1:-1:-1;44711:131:0;;;;;:::i;:::-;;:::i;40692:53::-;;;;;;;;;;-1:-1:-1;40692:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13624:25:1;;;13680:2;13665:18;;13658:34;;;;13708:18;;;13701:34;13766:2;13751:18;;13744:34;13611:3;13596:19;40692:53:0;13393:391:1;46603:867:0;;;;;;;;;;-1:-1:-1;46603:867:0;;;;;:::i;:::-;;:::i;27385:204::-;27470:4;-1:-1:-1;;;;;;27494:47:0;;-1:-1:-1;;;27494:47:0;;:87;;-1:-1:-1;;;;;;;;;;22045:40:0;;;27545:36;27487:94;27385:204;-1:-1:-1;;27385:204:0:o;44251:450::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;-1:-1:-1;44432:35:0::1;44470:23:::0;;;:14:::1;:23;::::0;;;;;44506:30:::1;::::0;::::1;:55:::0;;;;44570:30:::1;::::0;::::1;:55:::0;44634:32:::1;;:59:::0;44251:450::o;45094:911::-;19537:1;20135:7;;:19;20127:63;;;;-1:-1:-1;;;20127:63:0;;;;;;;:::i;:::-;;;;;;;;;19537:1;20268:7;:18;;;45254:3;:25:::1;::::0;-1:-1:-1;;;45254:25:0;;45268:10:::1;45254:25;::::0;::::1;2409:51:1::0;45281:10:0;;-1:-1:-1;;;;;45254:3:0::1;::::0;:13:::1;::::0;2382:18:1;;45254:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;45246:46;;;::::0;::::1;;45303:34;45340:30:::0;;;:14:::1;:30;::::0;;;;;;;;45303:67;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;::::1;;::::0;;;;;45389:25;;;;:61:::1;;;45449:1;45418:13;:30;;;:32;45389:61;45381:92;;;;-1:-1:-1::0;;;45381:92:0::1;;;;;;;:::i;:::-;45484:17;45559:3;45528:13;:30;;;45504:13;:23;;;:54;;;;:::i;:::-;:58;;;;:::i;:::-;45484:78;;45577:18;45573:195;;;45653:1;45620:13;:32;;;:34;45612:43;;;::::0;::::1;;45719:32;::::0;::::1;::::0;45695:23;;45752:3:::1;::::0;45695:56:::1;::::0;::::1;:::i;:::-;:60;;;;:::i;:::-;45682:74;::::0;:9;:74:::1;:::i;:::-;45670:86;;45573:195;45799:9;45786;:22;;45778:55;;;;-1:-1:-1::0;;;45778:55:0::1;;;;;;;:::i;:::-;45847:4;::::0;:39:::1;::::0;-1:-1:-1;;;45847:39:0;;45863:10:::1;45847:39;::::0;::::1;16074:51:1::0;16141:18;;;16134:34;;;-1:-1:-1;;;;;45847:4:0;;::::1;::::0;:15:::1;::::0;16047:18:1;;45847:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;45902:95:0::1;::::0;;16404:25:1;;;16460:2;16445:18;;16438:34;;;16515:14;;16508:22;16488:18;;;16481:50;45981:15:0::1;16562:2:1::0;16547:18;;16540:34;45902:95:0;;-1:-1:-1;;;;;45902:95:0;::::1;::::0;-1:-1:-1;45902:95:0::1;::::0;-1:-1:-1;45902:95:0;;;;16391:3:1;45902:95:0;;::::1;-1:-1:-1::0;;19493:1:0;20447:22;;-1:-1:-1;;;;45094:911:0:o;29614:147::-;29295:7;29322:12;;;;;;;;;;:22;;;27277:16;27288:4;27277:10;:16::i;:::-;29728:25:::1;29739:4;29745:7;29728:10;:25::i;:::-;29614:147:::0;;;:::o;30662:218::-;-1:-1:-1;;;;;30758:23:0;;2149:10;30758:23;30750:83;;;;-1:-1:-1;;;30750:83:0;;16787:2:1;30750:83:0;;;16769:21:1;16826:2;16806:18;;;16799:30;16865:34;16845:18;;;16838:62;-1:-1:-1;;;16916:18:1;;;16909:45;16971:19;;30750:83:0;16585:411:1;30750:83:0;30846:26;30858:4;30864:7;30846:11;:26::i;:::-;30662:218;;:::o;54472:179::-;26831:4;27277:16;26831:4;27277:10;:16::i;:::-;54621:22:::1;::::0;54600:10:::1;::::0;;;54621:22;::::1;;;::::0;54636:6;;54568:21:::1;54621:22:::0;54568:21;54621:22;54636:6;54600:10;54621:22;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54558:93;54472:179:::0;;:::o;51246:1267::-;19537:1;20135:7;;:19;20127:63;;;;-1:-1:-1;;;20127:63:0;;;;;;;:::i;:::-;19537:1;20268:7;:18;;;51429:34:::1;51466:30:::0;;;:14:::1;:30;::::0;;;;;;;;51429:67;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;51515:25;;;;:61:::1;;;51575:1;51544:13;:30;;;:32;51515:61;51507:92;;;;-1:-1:-1::0;;;51507:92:0::1;;;;;;;:::i;:::-;51610:17;51685:3;51654:13;:30;;;51630:13;:23;;;:54;;;;:::i;:::-;:58;;;;:::i;:::-;51610:78;;51714:6;51709:322;51725:4;:11;51723:1;:13;51709:322;;;51778:1;51764:10;51775:1;51764:13;;;;;;;;:::i;:::-;;;;;;;:15;51756:24;;;::::0;::::1;;51851:10;51862:1;51851:13;;;;;;;;:::i;:::-;;;;;;;51807:10;;;;;;;;;-1:-1:-1::0;;;;;51807:10:0::1;-1:-1:-1::0;;;;;51807:20:0::1;;51828:10;51839:4;51844:1;51839:7;;;;;;;;:::i;:::-;;;;;;;51807:40;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16092:32:1;;;;16074:51;;16156:2;16141:18;;16134:34;16062:2;16047:18;;15900:274;51807:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;51799:66;;;::::0;::::1;;51884:3:::0;;51880:136:::1;;51998:1;51993:3;51962:13;:30;;;51938:13;:23;;;:54;;;;:::i;:::-;:58;;;;:::i;:::-;51937:62;;;;:::i;:::-;51924:76;::::0;:9;:76:::1;:::i;:::-;51912:88;;51880:136;51737:3:::0;::::1;::::0;::::1;:::i;:::-;;;;51709:322;;;;52049:18;52045:195;;;52125:1;52092:13;:32;;;:34;52084:43;;;::::0;::::1;;52191:32;::::0;::::1;::::0;52167:23;;52224:3:::1;::::0;52167:56:::1;::::0;::::1;:::i;:::-;:60;;;;:::i;:::-;52154:74;::::0;:9;:74:::1;:::i;:::-;52142:86;;52045:195;52272:9;52259;:22;;52251:55;;;;-1:-1:-1::0;;;52251:55:0::1;;;;;;;:::i;:::-;52317:18;::::0;:63:::1;::::0;-1:-1:-1;;;52317:63:0;;-1:-1:-1;;;;;52317:18:0;;::::1;::::0;:35:::1;::::0;:63:::1;::::0;52353:10:::1;::::0;52364:4;;52369:10;;52317:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52435:10;-1:-1:-1::0;;;;;52398:103:0::1;;52419:14;52447:4;52453:10;52465:18;52485:15;52398:103;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;19493:1:0;20447:22;;-1:-1:-1;;;;;51246:1267:0:o;46017:570::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;46227:37:::2;46267:23:::0;;;:15:::2;:23;::::0;;;;46312;;::::2;;46311:24;46303:33;;;::::0;::::2;;46349:37:::0;;-1:-1:-1;;;;;;46349:37:0::2;;-1:-1:-1::0;;;;;46349:37:0;::::2;;;::::0;;-1:-1:-1;46399:24:0;;::::2;:37:::0;;;46449:32:::2;::::0;::::2;:53:::0;;-1:-1:-1;;46449:53:0::2;::::0;::::2;;;::::0;;46520:59:::2;::::0;;19186:25:1;;;19242:2;19227:18;;19220:34;;;46563:15:0::2;19270:18:1::0;;;19263:34;46543:10:0;;46520:59:::2;::::0;19174:2:1;19159:18;46520:59:0::2;18976:327:1::0;48760:1081:0;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;49001:39:::2;49043:25:::0;;;:17:::2;:25;::::0;;;;49090:23;;::::2;;49089:24;49081:33;;;::::0;::::2;;49127:24;::::0;::::2;:37:::0;;49177:53;::::2;;-1:-1:-1::0;;;49177:53:0::2;-1:-1:-1::0;;;;;;49177:53:0;;;-1:-1:-1;;;;;49127:37:0;::::2;49177:53:::0;::::2;::::0;;49266:17;;49251:11;;:32:::2;49243:41;;;::::0;::::2;;49302:6;49297:458;49316:4;:11;49314:1;:13;49297:458;;;49366:1;49358:4;49363:1;49358:7;;;;;;;;:::i;:::-;;;;;;;:9;49350:18;;;::::0;::::2;;49384:4;49389:1;49384:7;;;;;;;;:::i;:::-;;;;;;;49395:1;49384:12;:355;;49448:4;49453:1;49448:7;;;;;;;;:::i;:::-;;;;;;;49459:1;49448:12;:291;;49512:4;49517:1;49512:7;;;;;;;;:::i;:::-;;;;;;;49523:1;49512:12;:227;;49576:4;49581:1;49576:7;;;;;;;;:::i;:::-;;;;;;;49587:1;49576:12;:163;;49640:4;49645:1;49640:7;;;;;;;;:::i;:::-;;;;;;;49651:1;49640:12;:99;;49726:10;49737:1;49726:13;;;;;;;;:::i;:::-;;;;;;;49705:14;:18;;:34;;;49384:355;;49640:99;49676:10;49687:1;49676:13;;;;;;;;:::i;:::-;;;;;;;49655:14;:18;;:34;;;49384:355;;49576:163;49612:10;49623:1;49612:13;;;;;;;;:::i;:::-;;;;;;;49591:14;:18;;:34;;;49384:355;;49512:227;49548:10;49559:1;49548:13;;;;;;;;:::i;:::-;;;;;;;49527:14;:18;;:34;;;49384:355;;49448:291;49484:10;49495:1;49484:13;;;;;;;;:::i;:::-;;;;;;;49463:14;:18;;:34;;;49384:355;;;49420:10;49431:1;49420:13;;;;;;;;:::i;:::-;;;;;;;49399:14;:18;;:34;;;49384:355;-1:-1:-1::0;49329:3:0;::::2;::::0;::::2;:::i;:::-;;;;49297:458;;;-1:-1:-1::0;49774:59:0::2;::::0;;49808:1:::2;19186:25:1::0;;19242:2;19227:18;;19220:34;;;49817:15:0::2;19270:18:1::0;;;19263:34;;;;49797:10:0;;49774:59:::2;::::0;19174:2:1;19159:18;49774:59:0::2;;;;;;;;-1:-1:-1::0;;19493:1:0::1;20447:22:::0;;-1:-1:-1;;;;;;48760:1081:0:o;44851:229::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;-1:-1:-1;44957:35:0::1;44995:23:::0;;;:14:::1;:23;::::0;;;;;45031:35;44851:229::o;53356:1105::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;53589:39:::2;53631:25:::0;;;:17:::2;:25;::::0;;;;53687:23;;::::2;;53686:24;:74:::0;::::2;;;-1:-1:-1::0;53722:24:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;53722:38:0;;::::2;:24:::0;::::2;:38;53686:74;:141;;;;-1:-1:-1::0;53773:32:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;53773:32:0;;::::2;;:54;;::::0;::::2;;;53686:141;53666:171;;;::::0;::::2;;53861:6;53856:219;53875:4;:11;53873:1;:13;53856:219;;;53930:1;53922:4;53927:1;53922:7;;;;;;;;:::i;:::-;;;;;;;:9;53914:18;;;::::0;::::2;;53947:4;53952:1;53947:7;;;;;;;;:::i;:::-;;;;;;;53958:1;53947:12;:115;;54048:10;54059:1;54048:13;;;;;;;;:::i;:::-;;;;;;;54026:14;:18;;;:35;54018:44;;;::::0;::::2;;53947:115;;;53992:10;54003:1;53992:13;;;;;;;;:::i;:::-;;;;;;;53970:14;:18;;;:35;53962:44;;;::::0;::::2;;53888:3:::0;::::2;::::0;::::2;:::i;:::-;;;;53856:219;;;-1:-1:-1::0;54086:30:0;;-1:-1:-1;;54086:30:0::2;54112:4;54086:30;::::0;;54129:18:::2;::::0;:64:::2;::::0;-1:-1:-1;;;54129:64:0;;-1:-1:-1;;;;;54129:18:0;;::::2;::::0;:35:::2;::::0;:64:::2;::::0;54165:10;;54177:4;;54182:10;;54129:64:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;54205:18;54238;54235:110;;;-1:-1:-1::0;54282:10:0::2;::::0;54303:31:::2;::::0;-1:-1:-1;;;;;54303:19:0;::::2;::::0;:31;::::2;;;::::0;54282:10;;54303:31:::2;::::0;;;54282:10;54303:19;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;54235:110;54393:10;-1:-1:-1::0;;;;;54361:90:0::2;;54381:10;54405:4;54411:10;54423;54435:15;54361:90;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;19493:1:0::1;20447:22:::0;;-1:-1:-1;;;;;;;53356:1105:0:o;47482:1265::-;19537:1;20135:7;;:19;20127:63;;;;-1:-1:-1;;;20127:63:0;;;;;;;:::i;:::-;19537:1;20268:7;:18;;;47665:34:::1;47702:30:::0;;;:14:::1;:30;::::0;;;;;;;;47665:67;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;;;47751:25;;;;:61:::1;;;47811:1;47780:13;:30;;;:32;47751:61;47743:92;;;;-1:-1:-1::0;;;47743:92:0::1;;;;;;;:::i;:::-;47846:17;47921:3;47890:13;:30;;;47866:13;:23;;;:54;;;;:::i;:::-;:58;;;;:::i;:::-;47846:78;;47949:6;47944:321;47960:4;:11;47958:1;:13;47944:321;;;48013:1;47999:10;48010:1;47999:13;;;;;;;;:::i;:::-;;;;;;;:15;47991:24;;;::::0;::::1;;48083:10;48094:1;48083:13;;;;;;;;:::i;:::-;;;;;;;48042:7;;;;;;;;;-1:-1:-1::0;;;;;48042:7:0::1;-1:-1:-1::0;;;;;48042:17:0::1;;48060:10;48071:4;48076:1;48071:7;;;;;;;;:::i;:::-;;;;;;;48042:37;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16092:32:1;;;;16074:51;;16156:2;16141:18;;16134:34;16062:2;16047:18;;15900:274;48042:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;48034:63;;;::::0;::::1;;48118:3:::0;;48114:136:::1;;48230:1;48225:3;48194:13;:30;;;48170:13;:23;;;:54;;;;:::i;:::-;:58;;;;:::i;:::-;48169:62;;;;:::i;:::-;48156:76;::::0;:9;:76:::1;:::i;:::-;48144:88;;48114:136;47972:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47944:321;;;;48283:18;48279:198;;;48359:1;48326:13;:32;;;:34;48318:43;;;::::0;::::1;;48425:32;::::0;::::1;::::0;48401:23;;48458:3:::1;::::0;48401:56:::1;::::0;::::1;:::i;:::-;:60;;;;:::i;:::-;48388:74;::::0;:9;:74:::1;:::i;:::-;48376:86;;48279:198;48509:9;48496;:22;;48488:55;;;;-1:-1:-1::0;;;48488:55:0::1;;;;;;;:::i;:::-;48554:11;::::0;;:60:::1;::::0;-1:-1:-1;;;48554:60:0;;-1:-1:-1;;;;;48554:11:0;;::::1;::::0;:32:::1;::::0;:60:::1;::::0;48587:10:::1;::::0;48598:4;;48603:10;;48554:60:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48669:10;-1:-1:-1::0;;;;;48632:103:0::1;;48653:14;48681:4;48687:10;48699:18;48719:15;48632:103;;;;;;;;;;:::i;49849:1385::-:0;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;50081:39:::2;50123:25:::0;;;:17:::2;:25;::::0;;;;50179:23;;::::2;;50178:24;:74:::0;::::2;;;-1:-1:-1::0;50214:24:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;50214:38:0;;::::2;:24:::0;::::2;:38;50178:74;:141;;;;-1:-1:-1::0;50265:32:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;50265:32:0;;::::2;;:54;;::::0;::::2;;;50178:141;50158:171;;;::::0;::::2;;50353:6;50348:495;50367:4;:11;50365:1;:13;50348:495;;;50414:1;50406:4;50411:1;50406:7;;;;;;;;:::i;:::-;;;;;;;:9;50398:18;;;::::0;::::2;;50429:4;50434:1;50429:7;;;;;;;;:::i;:::-;;;;;;;50440:1;50429:12;:399;;50500:4;50505:1;50500:7;;;;;;;;:::i;:::-;;;;;;;50511:1;50500:12;:328;;50571:4;50576:1;50571:7;;;;;;;;:::i;:::-;;;;;;;50582:1;50571:12;:257;;50642:4;50647:1;50642:7;;;;;;;;:::i;:::-;;;;;;;50653:1;50642:12;:186;;50713:4;50718:1;50713:7;;;;;;;;:::i;:::-;;;;;;;50724:1;50713:12;:115;;50814:10;50825:1;50814:13;;;;;;;;:::i;:::-;;;;;;;50792:14;:18;;;:35;50784:44;;;::::0;::::2;;50429:399;;50713:115;50758:10;50769:1;50758:13;;;;;;;;:::i;:::-;;;;;;;50736:14;:18;;;:35;50728:44;;;::::0;::::2;50642:186;50687:10;50698:1;50687:13;;;;;;;;:::i;:::-;;;;;;;50665:14;:18;;;:35;50657:44;;;::::0;::::2;50571:257;50616:10;50627:1;50616:13;;;;;;;;:::i;:::-;;;;;;;50594:14;:18;;;:35;50586:44;;;::::0;::::2;50500:328;50545:10;50556:1;50545:13;;;;;;;;:::i;:::-;;;;;;;50523:14;:18;;;:35;50515:44;;;::::0;::::2;50429:399;50474:10;50485:1;50474:13;;;;;;;;:::i;:::-;;;;;;;50452:14;:18;;;:35;50444:44;;;::::0;::::2;;50380:3:::0;::::2;::::0;::::2;:::i;:::-;;;;50348:495;;;-1:-1:-1::0;50854:30:0;;-1:-1:-1;;50854:30:0::2;50880:4;50854:30;::::0;;50904:11:::2;::::0;;:61:::2;::::0;-1:-1:-1;;;50904:61:0;;-1:-1:-1;;;;;50904:11:0;;::::2;::::0;:32:::2;::::0;:61:::2;::::0;50937:10;;50949:4;;50954:10;;50904:61:::2;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;50978:18;51011;51008:110;;;-1:-1:-1::0;51055:10:0::2;::::0;51076:31:::2;::::0;-1:-1:-1;;;;;51076:19:0;::::2;::::0;:31;::::2;;;::::0;51055:10;;51076:31:::2;::::0;;;51055:10;51076:19;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;51008:110;51166:10;-1:-1:-1::0;;;;;51134:90:0::2;;51154:10;51178:4;51184:10;51196;51208:15;51134:90;;;;;;;;;;:::i;54664:274::-:0;26831:4;27277:16;26831:4;27277:10;:16::i;:::-;54827:3:::1;::::0;-1:-1:-1;;;;;54827:3:0;;::::1;54795:36:::0;;::::1;::::0;54787:76:::1;;;::::0;-1:-1:-1;;;54787:76:0;;21103:2:1;54787:76:0::1;::::0;::::1;21085:21:1::0;21142:2;21122:18;;;21115:30;21181:29;21161:18;;;21154:57;21228:18;;54787:76:0::1;20901:351:1::0;54787:76:0::1;54872:58;::::0;-1:-1:-1;;;54872:58:0;;54910:10:::1;54872:58;::::0;::::1;16074:51:1::0;16141:18;;;16134:34;;;-1:-1:-1;;;;;54872:37:0;::::1;::::0;::::1;::::0;16047:18:1;;54872:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27681:147::-:0;27767:4;27791:12;;;;;;;;;;;-1:-1:-1;;;;;27791:29:0;;;;;;;;;;;;;;;27681:147::o;52521:827::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;52763:39:::2;52805:25:::0;;;:17:::2;:25;::::0;;;;52852:23;;::::2;;52851:24;52843:33;;;::::0;::::2;;52889:24;::::0;::::2;:37:::0;;52939:53;::::2;;-1:-1:-1::0;;;52939:53:0::2;-1:-1:-1::0;;;;;;52939:53:0;;;-1:-1:-1;;;;;52889:37:0;::::2;52939:53:::0;::::2;::::0;;53028:17;;53013:11;;:32:::2;53005:41;;;::::0;::::2;;53064:6;53059:203;53078:4;:11;53076:1;:13;53059:203;;;53127:1;53119:4;53124:1;53119:7;;;;;;;;:::i;:::-;;;;;;;:9;53111:18;;;::::0;::::2;;53148:4;53153:1;53148:7;;;;;;;;:::i;:::-;;;;;;;53159:1;53148:12;:98;;53233:10;53244:1;53233:13;;;;;;;;:::i;:::-;;;;;;;53212:14;:18;;:34;;;53148:98;;;53184:10;53195:1;53184:13;;;;;;;;:::i;:::-;;;;;;;53163:14;:18;;:34;;;53148:98;-1:-1:-1::0;53091:3:0;::::2;::::0;::::2;:::i;:::-;;;;53059:203;;;-1:-1:-1::0;53281:59:0::2;::::0;;53315:1:::2;19186:25:1::0;;19242:2;19227:18;;19220:34;;;53324:15:0::2;19270:18:1::0;;;19263:34;;;;53304:10:0;;53281:59:::2;::::0;19174:2:1;19159:18;53281:59:0::2;18976:327:1::0;43903:334:0;26831:4;27277:16;26831:4;27277:10;:16::i;:::-;-1:-1:-1;44129:96:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;44102:24:0;;;:14:::1;:24:::0;;;;;:123;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;43903:334::o;30006:149::-;29295:7;29322:12;;;;;;;;;;:22;;;27277:16;27288:4;27277:10;:16::i;:::-;30121:26:::1;30133:4;30139:7;30121:11;:26::i;44711:131::-:0;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;-1:-1:-1;44809:10:0::1;:24:::0;44711:131::o;46603:867::-;-1:-1:-1;;;;;;;;;;;27277:16:0;27288:4;27277:10;:16::i;:::-;19537:1:::1;20135:7;;:19:::0;20127:63:::1;;;;-1:-1:-1::0;;;20127:63:0::1;;;;;;;:::i;:::-;19537:1;20268:7;:18:::0;46807:37:::2;46847:23:::0;;;:15:::2;:23;::::0;;;;46901;;::::2;;46900:24;:74:::0;::::2;;;-1:-1:-1::0;46936:24:0;;-1:-1:-1;;;;;46936:38:0;;::::2;:24;::::0;;::::2;;:38;46900:74;:125;;;;;47015:10;46987:14;:24;;;:38;46900:125;:192;;;;-1:-1:-1::0;47038:32:0::2;::::0;::::2;::::0;::::2;;:54;;::::0;::::2;;;46900:192;46880:222;;;::::0;::::2;;47114:30:::0;;-1:-1:-1;;47114:30:0::2;47140:4;47114:30;::::0;;47163:4:::2;::::0;:39:::2;::::0;-1:-1:-1;;;47163:39:0;;-1:-1:-1;;;;;16092:32:1;;;47163:39:0::2;::::0;::::2;16074:51:1::0;16141:18;;;16134:34;;;47163:4:0;;::::2;::::0;:15:::2;::::0;16047:18:1;;47163:39:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;47221:18;47252;47249:110;;;-1:-1:-1::0;47296:10:0::2;::::0;47317:31:::2;::::0;-1:-1:-1;;;;;47317:19:0;::::2;::::0;:31;::::2;;;::::0;47296:10;;47317:31:::2;::::0;;;47296:10;47317:19;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;47249:110;47375:85;::::0;;13624:25:1;;;13680:2;13665:18;;13658:34;;;13708:18;;;13701:34;;;47444:15:0::2;13766:2:1::0;13751:18;;13744:34;-1:-1:-1;;;;;47375:85:0;::::2;::::0;::::2;::::0;13611:3:1;13596:19;47375:85:0::2;13393:391:1::0;28132:105:0;28199:30;28210:4;2149:10;28199;:30::i;:::-;28132:105;:::o;32163:238::-;32247:22;32255:4;32261:7;32247;:22::i;:::-;32242:152;;32286:6;:12;;;;;;;;;;;-1:-1:-1;;;;;32286:29:0;;;;;;;;;:36;;-1:-1:-1;;32286:36:0;32318:4;32286:36;;;32369:12;2149:10;;2069:98;32369:12;-1:-1:-1;;;;;32342:40:0;32360:7;-1:-1:-1;;;;;32342:40:0;32354:4;32342:40;;;;;;;;;;32163:238;;:::o;32533:239::-;32617:22;32625:4;32631:7;32617;:22::i;:::-;32613:152;;;32688:5;32656:12;;;;;;;;;;;-1:-1:-1;;;;;32656:29:0;;;;;;;;;;:37;;-1:-1:-1;;32656:37:0;;;32713:40;2149:10;;32656:12;;32713:40;;32688:5;32713:40;32533:239;;:::o;28527:505::-;28616:22;28624:4;28630:7;28616;:22::i;:::-;28611:414;;28804:41;28832:7;-1:-1:-1;;;;;28804:41:0;28842:2;28804:19;:41::i;:::-;28918:38;28946:4;28953:2;28918:19;:38::i;:::-;28709:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;28709:270:0;;;;;;;;;;-1:-1:-1;;;28655:358:0;;;;;;;:::i;9846:451::-;9921:13;9947:19;9979:10;9983:6;9979:1;:10;:::i;:::-;:14;;9992:1;9979:14;:::i;:::-;9969:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9969:25:0;;9947:47;;-1:-1:-1;;;10005:6:0;10012:1;10005:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;10005:15:0;;;;;;;;;-1:-1:-1;;;10031:6:0;10038:1;10031:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;10031:15:0;;;;;;;;-1:-1:-1;10062:9:0;10074:10;10078:6;10074:1;:10;:::i;:::-;:14;;10087:1;10074:14;:::i;:::-;10062:26;;10057:135;10094:1;10090;:5;10057:135;;;-1:-1:-1;;;10142:5:0;10150:3;10142:11;10129:25;;;;;;;:::i;:::-;;;;10117:6;10124:1;10117:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;10117:37:0;;;;;;;;-1:-1:-1;10179:1:0;10169:11;;;;;10097:3;;;:::i;:::-;;;10057:135;;;-1:-1:-1;10210:10:0;;10202:55;;;;-1:-1:-1;;;10202:55:0;;23942:2:1;10202:55:0;;;23924:21:1;;;23961:18;;;23954:30;24020:34;24000:18;;;23993:62;24072:18;;10202:55:0;23740:356:1;10202:55:0;10282:6;9846:451;-1:-1:-1;;;9846:451:0:o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;657:286::-;715:6;768:2;756:9;747:7;743:23;739:32;736:52;;;784:1;781;774:12;736:52;810:23;;-1:-1:-1;;;;;;862:32:1;;852:43;;842:71;;909:1;906;899:12;1852:385;1938:6;1946;1954;1962;2015:3;2003:9;1994:7;1990:23;1986:33;1983:53;;;2032:1;2029;2022:12;1983:53;-1:-1:-1;;2055:23:1;;;2125:2;2110:18;;2097:32;;-1:-1:-1;2176:2:1;2161:18;;2148:32;;2227:2;2212:18;2199:32;;-1:-1:-1;1852:385:1;-1:-1:-1;1852:385:1:o;2471:131::-;-1:-1:-1;;;;;2546:31:1;;2536:42;;2526:70;;2592:1;2589;2582:12;2607:118;2693:5;2686:13;2679:21;2672:5;2669:32;2659:60;;2715:1;2712;2705:12;2730:519;2813:6;2821;2829;2837;2890:3;2878:9;2869:7;2865:23;2861:33;2858:53;;;2907:1;2904;2897:12;2858:53;2943:9;2930:23;2920:33;;3003:2;2992:9;2988:18;2975:32;3016:31;3041:5;3016:31;:::i;:::-;3066:5;-1:-1:-1;3118:2:1;3103:18;;3090:32;;-1:-1:-1;3174:2:1;3159:18;;3146:32;3187:30;3146:32;3187:30;:::i;:::-;2730:519;;;;-1:-1:-1;2730:519:1;;-1:-1:-1;;2730:519:1:o;3254:315::-;3322:6;3330;3383:2;3371:9;3362:7;3358:23;3354:32;3351:52;;;3399:1;3396;3389:12;3351:52;3435:9;3422:23;3412:33;;3495:2;3484:9;3480:18;3467:32;3508:31;3533:5;3508:31;:::i;:::-;3558:5;3548:15;;;3254:315;;;;;:::o;3759:127::-;3820:10;3815:3;3811:20;3808:1;3801:31;3851:4;3848:1;3841:15;3875:4;3872:1;3865:15;3891:902;3945:5;3998:3;3991:4;3983:6;3979:17;3975:27;3965:55;;4016:1;4013;4006:12;3965:55;4052:6;4039:20;4078:4;4101:18;4138:2;4134;4131:10;4128:36;;;4144:18;;:::i;:::-;4190:2;4187:1;4183:10;4222:2;4216:9;4285:2;4281:7;4276:2;4272;4268:11;4264:25;4256:6;4252:38;4340:6;4328:10;4325:22;4320:2;4308:10;4305:18;4302:46;4299:72;;;4351:18;;:::i;:::-;4387:2;4380:22;4437:18;;;4513:15;;;4509:24;;;4471:15;;;;-1:-1:-1;4545:15:1;;;4542:35;;;4573:1;4570;4563:12;4542:35;4609:2;4601:6;4597:15;4586:26;;4621:142;4637:6;4632:3;4629:15;4621:142;;;4703:17;;4691:30;;4741:12;;;;4654;;;;4621:142;;;4781:6;3891:902;-1:-1:-1;;;;;;;3891:902:1:o;4798:935::-;4940:6;4948;4956;4964;4972;5025:3;5013:9;5004:7;5000:23;4996:33;4993:53;;;5042:1;5039;5032:12;4993:53;5078:9;5065:23;5055:33;;5138:2;5127:9;5123:18;5110:32;5151:31;5176:5;5151:31;:::i;:::-;5201:5;-1:-1:-1;5257:2:1;5242:18;;5229:32;5280:18;5310:14;;;5307:34;;;5337:1;5334;5327:12;5307:34;5360:61;5413:7;5404:6;5393:9;5389:22;5360:61;:::i;:::-;5350:71;;5474:2;5463:9;5459:18;5446:32;5430:48;;5503:2;5493:8;5490:16;5487:36;;;5519:1;5516;5509:12;5487:36;;5542:63;5597:7;5586:8;5575:9;5571:24;5542:63;:::i;:::-;5532:73;;;5657:3;5646:9;5642:19;5629:33;5671:30;5693:7;5671:30;:::i;:::-;5720:7;5710:17;;;4798:935;;;;;;;;:::o;5963:596::-;6063:6;6071;6079;6087;6095;6148:3;6136:9;6127:7;6123:23;6119:33;6116:53;;;6165:1;6162;6155:12;6116:53;6201:9;6188:23;6178:33;;6258:2;6247:9;6243:18;6230:32;6220:42;;6312:2;6301:9;6297:18;6284:32;6325:31;6350:5;6325:31;:::i;:::-;6375:5;-1:-1:-1;6427:2:1;6412:18;;6399:32;;-1:-1:-1;6483:3:1;6468:19;;6455:33;6497:30;6455:33;6497:30;:::i;6564:1012::-;6723:6;6731;6739;6747;6755;6763;6816:3;6804:9;6795:7;6791:23;6787:33;6784:53;;;6833:1;6830;6823:12;6784:53;6869:9;6856:23;6846:33;;6926:2;6915:9;6911:18;6898:32;6888:42;;6980:2;6969:9;6965:18;6952:32;6993:31;7018:5;6993:31;:::i;:::-;7043:5;-1:-1:-1;7099:2:1;7084:18;;7071:32;7122:18;7152:14;;;7149:34;;;7179:1;7176;7169:12;7149:34;7202:61;7255:7;7246:6;7235:9;7231:22;7202:61;:::i;:::-;7192:71;;7316:3;7305:9;7301:19;7288:33;7272:49;;7346:2;7336:8;7333:16;7330:36;;;7362:1;7359;7352:12;7330:36;;7385:63;7440:7;7429:8;7418:9;7414:24;7385:63;:::i;:::-;7375:73;;;7500:3;7489:9;7485:19;7472:33;7514:30;7536:7;7514:30;:::i;:::-;7563:7;7553:17;;;6564:1012;;;;;;;;:::o;7581:248::-;7649:6;7657;7710:2;7698:9;7689:7;7685:23;7681:32;7678:52;;;7726:1;7723;7716:12;7678:52;-1:-1:-1;;7749:23:1;;;7819:2;7804:18;;;7791:32;;-1:-1:-1;7581:248:1:o;9291:315::-;9359:6;9367;9420:2;9408:9;9399:7;9395:23;9391:32;9388:52;;;9436:1;9433;9426:12;9388:52;9475:9;9462:23;9494:31;9519:5;9494:31;:::i;:::-;9544:5;9596:2;9581:18;;;;9568:32;;-1:-1:-1;;;9291:315:1:o;9611:367::-;9674:8;9684:6;9738:3;9731:4;9723:6;9719:17;9715:27;9705:55;;9756:1;9753;9746:12;9705:55;-1:-1:-1;9779:20:1;;9822:18;9811:30;;9808:50;;;9854:1;9851;9844:12;9808:50;9891:4;9883:6;9879:17;9867:29;;9951:3;9944:4;9934:6;9931:1;9927:14;9919:6;9915:27;9911:38;9908:47;9905:67;;;9968:1;9965;9958:12;9905:67;9611:367;;;;;:::o;9983:347::-;10034:8;10044:6;10098:3;10091:4;10083:6;10079:17;10075:27;10065:55;;10116:1;10113;10106:12;10065:55;-1:-1:-1;10139:20:1;;10182:18;10171:30;;10168:50;;;10214:1;10211;10204:12;10168:50;10251:4;10243:6;10239:17;10227:29;;10303:3;10296:4;10287:6;10279;10275:19;10271:30;10268:39;10265:59;;;10320:1;10317;10310:12;10335:1338;10495:6;10503;10511;10519;10527;10535;10543;10551;10604:3;10592:9;10583:7;10579:23;10575:33;10572:53;;;10621:1;10618;10611:12;10572:53;10660:9;10647:23;10679:31;10704:5;10679:31;:::i;:::-;10729:5;-1:-1:-1;10786:2:1;10771:18;;10758:32;10799:33;10758:32;10799:33;:::i;:::-;10851:7;-1:-1:-1;10909:2:1;10894:18;;10881:32;10932:18;10962:14;;;10959:34;;;10989:1;10986;10979:12;10959:34;11028:70;11090:7;11081:6;11070:9;11066:22;11028:70;:::i;:::-;11117:8;;-1:-1:-1;11002:96:1;-1:-1:-1;11205:2:1;11190:18;;11177:32;;-1:-1:-1;11221:16:1;;;11218:36;;;11250:1;11247;11240:12;11218:36;11289:72;11353:7;11342:8;11331:9;11327:24;11289:72;:::i;:::-;11380:8;;-1:-1:-1;11263:98:1;-1:-1:-1;11468:3:1;11453:19;;11440:33;;-1:-1:-1;11485:16:1;;;11482:36;;;11514:1;11511;11504:12;11482:36;;11553:60;11605:7;11594:8;11583:9;11579:24;11553:60;:::i;:::-;10335:1338;;;;-1:-1:-1;10335:1338:1;;-1:-1:-1;10335:1338:1;;;;;;11632:8;-1:-1:-1;;;10335:1338:1:o;11885:454::-;11980:6;11988;11996;12004;12012;12065:3;12053:9;12044:7;12040:23;12036:33;12033:53;;;12082:1;12079;12072:12;12033:53;-1:-1:-1;;12105:23:1;;;12175:2;12160:18;;12147:32;;-1:-1:-1;12226:2:1;12211:18;;12198:32;;12277:2;12262:18;;12249:32;;-1:-1:-1;12328:3:1;12313:19;12300:33;;-1:-1:-1;11885:454:1;-1:-1:-1;11885:454:1:o;12565:823::-;12671:6;12679;12687;12695;12703;12711;12764:3;12752:9;12743:7;12739:23;12735:33;12732:53;;;12781:1;12778;12771:12;12732:53;12820:9;12807:23;12839:31;12864:5;12839:31;:::i;:::-;12889:5;-1:-1:-1;12946:2:1;12931:18;;12918:32;12959:33;12918:32;12959:33;:::i;:::-;13011:7;-1:-1:-1;13065:2:1;13050:18;;13037:32;;-1:-1:-1;13116:2:1;13101:18;;13088:32;;-1:-1:-1;13171:3:1;13156:19;;13143:33;13199:18;13188:30;;13185:50;;;13231:1;13228;13221:12;13185:50;13270:58;13320:7;13311:6;13300:9;13296:22;13270:58;:::i;:::-;12565:823;;;;-1:-1:-1;12565:823:1;;-1:-1:-1;12565:823:1;;13347:8;;12565:823;-1:-1:-1;;;12565:823:1:o;13789:355::-;13991:2;13973:21;;;14030:2;14010:18;;;14003:30;14069:33;14064:2;14049:18;;14042:61;14135:2;14120:18;;13789:355::o;14357:184::-;14427:6;14480:2;14468:9;14459:7;14455:23;14451:32;14448:52;;;14496:1;14493;14486:12;14448:52;-1:-1:-1;14519:16:1;;14357:184;-1:-1:-1;14357:184:1:o;14546:343::-;14748:2;14730:21;;;14787:2;14767:18;;;14760:30;-1:-1:-1;;;14821:2:1;14806:18;;14799:49;14880:2;14865:18;;14546:343::o;14894:127::-;14955:10;14950:3;14946:20;14943:1;14936:31;14986:4;14983:1;14976:15;15010:4;15007:1;15000:15;15026:168;15099:9;;;15130;;15147:15;;;15141:22;;15127:37;15117:71;;15168:18;;:::i;15199:217::-;15239:1;15265;15255:132;;15309:10;15304:3;15300:20;15297:1;15290:31;15344:4;15341:1;15334:15;15372:4;15369:1;15362:15;15255:132;-1:-1:-1;15401:9:1;;15199:217::o;15421:125::-;15486:9;;;15507:10;;;15504:36;;;15520:18;;:::i;15551:344::-;15753:2;15735:21;;;15792:2;15772:18;;;15765:30;-1:-1:-1;;;15826:2:1;15811:18;;15804:50;15886:2;15871:18;;15551:344::o;17001:127::-;17062:10;17057:3;17053:20;17050:1;17043:31;17093:4;17090:1;17083:15;17117:4;17114:1;17107:15;17133:135;17172:3;17193:17;;;17190:43;;17213:18;;:::i;:::-;-1:-1:-1;17260:1:1;17249:13;;17133:135::o;17273:435::-;17326:3;17364:5;17358:12;17391:6;17386:3;17379:19;17417:4;17446:2;17441:3;17437:12;17430:19;;17483:2;17476:5;17472:14;17504:1;17514:169;17528:6;17525:1;17522:13;17514:169;;;17589:13;;17577:26;;17623:12;;;;17658:15;;;;17550:1;17543:9;17514:169;;;-1:-1:-1;17699:3:1;;17273:435;-1:-1:-1;;;;;17273:435:1:o;17713:562::-;-1:-1:-1;;;;;17998:32:1;;17980:51;;18067:2;18062;18047:18;;18040:30;;;-1:-1:-1;;18093:56:1;;18130:18;;18122:6;18093:56;:::i;:::-;18197:9;18189:6;18185:22;18180:2;18169:9;18165:18;18158:50;18225:44;18262:6;18254;18225:44;:::i;:::-;18217:52;17713:562;-1:-1:-1;;;;;;17713:562:1:o;18280:691::-;18615:6;18604:9;18597:25;18658:3;18653:2;18642:9;18638:18;18631:31;18578:4;18685:57;18737:3;18726:9;18722:19;18714:6;18685:57;:::i;:::-;18790:9;18782:6;18778:22;18773:2;18762:9;18758:18;18751:50;18818:44;18855:6;18847;18818:44;:::i;:::-;18905:14;;18898:22;18893:2;18878:18;;18871:50;-1:-1:-1;;18952:3:1;18937:19;18930:35;18810:52;18280:691;-1:-1:-1;;;18280:691:1:o;20215:681::-;20556:6;20545:9;20538:25;20599:3;20594:2;20583:9;20579:18;20572:31;20519:4;20626:57;20678:3;20667:9;20663:19;20655:6;20626:57;:::i;:::-;20731:9;20723:6;20719:22;20714:2;20703:9;20699:18;20692:50;20759:44;20796:6;20788;20759:44;:::i;:::-;20834:2;20819:18;;20812:34;;;;-1:-1:-1;;20877:3:1;20862:19;20855:35;20751:52;20215:681;-1:-1:-1;;;20215:681:1:o;21257:245::-;21324:6;21377:2;21365:9;21356:7;21352:23;21348:32;21345:52;;;21393:1;21390;21383:12;21345:52;21425:9;21419:16;21444:28;21466:5;21444:28;:::i;22126:250::-;22211:1;22221:113;22235:6;22232:1;22229:13;22221:113;;;22311:11;;;22305:18;22292:11;;;22285:39;22257:2;22250:10;22221:113;;;-1:-1:-1;;22368:1:1;22350:16;;22343:27;22126:250::o;22381:812::-;22792:25;22787:3;22780:38;22762:3;22847:6;22841:13;22863:75;22931:6;22926:2;22921:3;22917:12;22910:4;22902:6;22898:17;22863:75;:::i;:::-;-1:-1:-1;;;22997:2:1;22957:16;;;22989:11;;;22982:40;23047:13;;23069:76;23047:13;23131:2;23123:11;;23116:4;23104:17;;23069:76;:::i;:::-;23165:17;23184:2;23161:26;;22381:812;-1:-1:-1;;;;22381:812:1:o;23198:396::-;23347:2;23336:9;23329:21;23310:4;23379:6;23373:13;23422:6;23417:2;23406:9;23402:18;23395:34;23438:79;23510:6;23505:2;23494:9;23490:18;23485:2;23477:6;23473:15;23438:79;:::i;:::-;23578:2;23557:15;-1:-1:-1;;23553:29:1;23538:45;;;;23585:2;23534:54;;23198:396;-1:-1:-1;;23198:396:1:o;23599:136::-;23638:3;23666:5;23656:39;;23675:18;;:::i;:::-;-1:-1:-1;;;23711:18:1;;23599:136::o
Swarm Source
ipfs://af2652951e591ea56b59855dbb07cb6f06dca1a6c98c91f65c128e8c2f1bb0a4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.